provided&nbsp;promiscuous/allmulticast&nbsp;ops.<br />
<br />Signed-off-by:&nbsp;Junlong&nbsp;Wang&nbsp;&lt;wang.junlong1@zte.com.cn&gt;
<br />---<br />&nbsp;doc/guides/nics/features/zxdh.ini&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;2&nbsp;+<br />&nbsp;doc/guides/nics/zxdh.rst&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;2&nbsp;+<br />&nbsp;drivers/net/zxdh/zxdh_ethdev.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;21&nbsp;++-<br />&nbsp;drivers/net/zxdh/zxdh_ethdev.h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;2&nbsp;+<br />&nbsp;drivers/net/zxdh/zxdh_ethdev_ops.c&nbsp;|&nbsp;132&nbsp;+++++++++++++++++<br />&nbsp;drivers/net/zxdh/zxdh_ethdev_ops.h&nbsp;|&nbsp;&nbsp;&nbsp;4&nbsp;+<br />&nbsp;drivers/net/zxdh/zxdh_msg.h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;10&nbsp;++<br />&nbsp;drivers/net/zxdh/zxdh_tables.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;223&nbsp;+++++++++++++++++++++++++++++<br />&nbsp;drivers/net/zxdh/zxdh_tables.h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;22&nbsp;+++<br />&nbsp;9&nbsp;files&nbsp;changed,&nbsp;417&nbsp;insertions(+),&nbsp;1&nbsp;deletion(-)<br />
<br />diff&nbsp;--git&nbsp;a/doc/guides/nics/features/zxdh.ini&nbsp;b/doc/guides/nics/features/zxdh.ini<br />index&nbsp;dc09fe3453..e9b237e102&nbsp;100644<br />---&nbsp;a/doc/guides/nics/features/zxdh.ini<br />+++&nbsp;b/doc/guides/nics/features/zxdh.ini<br />@@&nbsp;-14,3&nbsp;+14,5&nbsp;@@&nbsp;Link&nbsp;status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;Y<br />&nbsp;Link&nbsp;status&nbsp;event&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;Y<br />&nbsp;Unicast&nbsp;MAC&nbsp;filter&nbsp;&nbsp;&nbsp;=&nbsp;Y<br />&nbsp;Multicast&nbsp;MAC&nbsp;filter&nbsp;=&nbsp;Y<br />+Promiscuous&nbsp;mode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;Y<br />+Allmulticast&nbsp;mode&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;Y<br />diff&nbsp;--git&nbsp;a/doc/guides/nics/zxdh.rst&nbsp;b/doc/guides/nics/zxdh.rst<br />index&nbsp;e0b0776aca..0399df1302&nbsp;100644<br />---&nbsp;a/doc/guides/nics/zxdh.rst<br />+++&nbsp;b/doc/guides/nics/zxdh.rst<br />@@&nbsp;-26,6&nbsp;+26,8&nbsp;@@&nbsp;Features&nbsp;of&nbsp;the&nbsp;ZXDH&nbsp;PMD&nbsp;are:<br />&nbsp;-&nbsp;Set&nbsp;Link&nbsp;down&nbsp;or&nbsp;up<br />&nbsp;-&nbsp;Unicast&nbsp;MAC&nbsp;filter<br />&nbsp;-&nbsp;Multicast&nbsp;MAC&nbsp;filter<br />+-&nbsp;Promiscuous&nbsp;mode<br />+-&nbsp;Multicast&nbsp;mode<br />&nbsp;
<br />&nbsp;
<br />&nbsp;Driver&nbsp;compilation&nbsp;and&nbsp;testing<br />diff&nbsp;--git&nbsp;a/drivers/net/zxdh/zxdh_ethdev.c&nbsp;b/drivers/net/zxdh/zxdh_ethdev.c<br />index&nbsp;85ada87cdc..1d64b877c1&nbsp;100644<br />---&nbsp;a/drivers/net/zxdh/zxdh_ethdev.c<br />+++&nbsp;b/drivers/net/zxdh/zxdh_ethdev.c<br />@@&nbsp;-901,8&nbsp;+901,16&nbsp;@@&nbsp;zxdh_tables_uninit(struct&nbsp;rte_eth_dev&nbsp;*dev)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ret;<br />&nbsp;
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_port_attr_uninit(dev);<br />-&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;zxdh_port_attr_uninit&nbsp;failed&quot;);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_promisc_table_uninit(dev);<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;uninit&nbsp;promisc_table&nbsp;failed&quot;);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />&nbsp;}<br />@@&nbsp;-1055,6&nbsp;+1063,10&nbsp;@@&nbsp;static&nbsp;const&nbsp;struct&nbsp;eth_dev_ops&nbsp;zxdh_eth_dev_ops&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.mac_addr_add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;zxdh_dev_mac_addr_add,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.mac_addr_remove&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;zxdh_dev_mac_addr_remove,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.mac_addr_set&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;zxdh_dev_mac_addr_set,<br />+&nbsp;&nbsp;&nbsp;&nbsp;.promiscuous_enable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;zxdh_dev_promiscuous_enable,<br />+&nbsp;&nbsp;&nbsp;&nbsp;.promiscuous_disable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;zxdh_dev_promiscuous_disable,<br />+&nbsp;&nbsp;&nbsp;&nbsp;.allmulticast_enable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;zxdh_dev_allmulticast_enable,<br />+&nbsp;&nbsp;&nbsp;&nbsp;.allmulticast_disable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;zxdh_dev_allmulticast_disable,<br />&nbsp;};<br />&nbsp;
<br />&nbsp;static&nbsp;int32_t<br />@@&nbsp;-1306,6&nbsp;+1318,13&nbsp;@@&nbsp;zxdh_tables_init(struct&nbsp;rte_eth_dev&nbsp;*dev)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;&nbsp;panel&nbsp;table&nbsp;init&nbsp;failed&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_promisc_table_init(dev);<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;promisc_table_init&nbsp;failed&quot;);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />&nbsp;}<br />&nbsp;
<br />diff&nbsp;--git&nbsp;a/drivers/net/zxdh/zxdh_ethdev.h&nbsp;b/drivers/net/zxdh/zxdh_ethdev.h<br />index&nbsp;5b95cb1c2a..3cdac5de73&nbsp;100644<br />---&nbsp;a/drivers/net/zxdh/zxdh_ethdev.h<br />+++&nbsp;b/drivers/net/zxdh/zxdh_ethdev.h<br />@@&nbsp;-98,6&nbsp;+98,8&nbsp;@@&nbsp;struct&nbsp;zxdh_hw&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;has_tx_offload;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;has_rx_offload;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;admin_status;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;promisc_status;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;allmulti_status;<br />&nbsp;};<br />&nbsp;
<br />&nbsp;struct&nbsp;zxdh_dtb_shared_data&nbsp;{<br />diff&nbsp;--git&nbsp;a/drivers/net/zxdh/zxdh_ethdev_ops.c&nbsp;b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />index&nbsp;751f80e9b4..aed4e6410c&nbsp;100644<br />---&nbsp;a/drivers/net/zxdh/zxdh_ethdev_ops.c<br />+++&nbsp;b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />@@&nbsp;-397,3&nbsp;+397,135&nbsp;@@&nbsp;void&nbsp;zxdh_dev_mac_addr_remove(struct&nbsp;rte_eth_dev&nbsp;*dev&nbsp;__rte_unused,&nbsp;uint32_t&nbsp;ind<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(&amp;dev-&gt;data-&gt;mac_addrs[index],&nbsp;0,&nbsp;sizeof(struct&nbsp;rte_ether_addr));<br />&nbsp;}<br />+<br />+int&nbsp;zxdh_dev_promiscuous_enable(struct&nbsp;rte_eth_dev&nbsp;*dev)<br />+{<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_hw&nbsp;*hw&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;dev-&gt;data-&gt;dev_private;<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_msg_info&nbsp;msg_info&nbsp;=&nbsp;{0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;int16_t&nbsp;ret&nbsp;=&nbsp;0;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hw-&gt;promisc_status&nbsp;==&nbsp;0)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hw-&gt;is_pf)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_dev_unicast_table_set(hw,&nbsp;hw-&gt;vport.vport,&nbsp;true);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hw-&gt;allmulti_status&nbsp;==&nbsp;0)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_dev_multicast_table_set(hw,&nbsp;hw-&gt;vport.vport,&nbsp;true);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_port_promisc_msg&nbsp;*promisc_msg&nbsp;=&nbsp;&amp;msg_info.data.port_promisc_msg;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_msg_head_build(hw,&nbsp;ZXDH_PORT_PROMISC_SET,&nbsp;&amp;msg_info);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;promisc_msg-&gt;mode&nbsp;=&nbsp;ZXDH_PROMISC_MODE;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;promisc_msg-&gt;value&nbsp;=&nbsp;true;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hw-&gt;allmulti_status&nbsp;==&nbsp;0)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;promisc_msg-&gt;mc_follow&nbsp;=&nbsp;true;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_vf_send_msg_to_pf(dev,&nbsp;&amp;msg_info,&nbsp;sizeof(msg_info),&nbsp;NULL,&nbsp;0);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;Failed&nbsp;to&nbsp;send&nbsp;msg:&nbsp;port&nbsp;0x%x&nbsp;msg&nbsp;type&nbsp;%d&quot;,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hw-&gt;vport.vport,&nbsp;ZXDH_PROMISC_MODE);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hw-&gt;promisc_status&nbsp;=&nbsp;1;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+}<br />+/**<br />+&nbsp;*&nbsp;Fun:<br />+&nbsp;*/<br />+int&nbsp;zxdh_dev_promiscuous_disable(struct&nbsp;rte_eth_dev&nbsp;*dev)<br />+{<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_hw&nbsp;*hw&nbsp;=&nbsp;dev-&gt;data-&gt;dev_private;<br />+&nbsp;&nbsp;&nbsp;&nbsp;int16_t&nbsp;ret&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_msg_info&nbsp;msg_info&nbsp;=&nbsp;{0};<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hw-&gt;promisc_status&nbsp;==&nbsp;1)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hw-&gt;is_pf)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_dev_unicast_table_set(hw,&nbsp;hw-&gt;vport.vport,&nbsp;false);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hw-&gt;allmulti_status&nbsp;==&nbsp;0)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_dev_multicast_table_set(hw,&nbsp;hw-&gt;vport.vport,&nbsp;false);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_port_promisc_msg&nbsp;*promisc_msg&nbsp;=&nbsp;&amp;msg_info.data.port_promisc_msg;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_msg_head_build(hw,&nbsp;ZXDH_PORT_PROMISC_SET,&nbsp;&amp;msg_info);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;promisc_msg-&gt;mode&nbsp;=&nbsp;ZXDH_PROMISC_MODE;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;promisc_msg-&gt;value&nbsp;=&nbsp;false;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hw-&gt;allmulti_status&nbsp;==&nbsp;0)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;promisc_msg-&gt;mc_follow&nbsp;=&nbsp;true;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_vf_send_msg_to_pf(dev,&nbsp;&amp;msg_info,&nbsp;sizeof(msg_info),&nbsp;NULL,&nbsp;0);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;Failed&nbsp;to&nbsp;send&nbsp;msg:&nbsp;port&nbsp;0x%x&nbsp;msg&nbsp;type&nbsp;%d&quot;,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hw-&gt;vport.vport,&nbsp;ZXDH_PROMISC_MODE);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hw-&gt;promisc_status&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+}<br />+/**<br />+&nbsp;*&nbsp;Fun:<br />+&nbsp;*/<br />+int&nbsp;zxdh_dev_allmulticast_enable(struct&nbsp;rte_eth_dev&nbsp;*dev)<br />+{<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_hw&nbsp;*hw&nbsp;=&nbsp;dev-&gt;data-&gt;dev_private;<br />+&nbsp;&nbsp;&nbsp;&nbsp;int16_t&nbsp;ret&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_msg_info&nbsp;msg_info&nbsp;=&nbsp;{0};<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hw-&gt;allmulti_status&nbsp;==&nbsp;0)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hw-&gt;is_pf)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_dev_multicast_table_set(hw,&nbsp;hw-&gt;vport.vport,&nbsp;true);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_port_promisc_msg&nbsp;*promisc_msg&nbsp;=&nbsp;&amp;msg_info.data.port_promisc_msg;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_msg_head_build(hw,&nbsp;ZXDH_PORT_PROMISC_SET,&nbsp;&amp;msg_info);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;promisc_msg-&gt;mode&nbsp;=&nbsp;ZXDH_ALLMULTI_MODE;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;promisc_msg-&gt;value&nbsp;=&nbsp;true;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_vf_send_msg_to_pf(dev,&nbsp;&amp;msg_info,&nbsp;sizeof(msg_info),&nbsp;NULL,&nbsp;0);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;Failed&nbsp;to&nbsp;send&nbsp;msg:&nbsp;port&nbsp;0x%x&nbsp;msg&nbsp;type&nbsp;%d&quot;,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hw-&gt;vport.vport,&nbsp;ZXDH_ALLMULTI_MODE);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hw-&gt;allmulti_status&nbsp;=&nbsp;1;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+}<br />+<br />+int&nbsp;zxdh_dev_allmulticast_disable(struct&nbsp;rte_eth_dev&nbsp;*dev)<br />+{<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_hw&nbsp;*hw&nbsp;=&nbsp;dev-&gt;data-&gt;dev_private;<br />+&nbsp;&nbsp;&nbsp;&nbsp;int16_t&nbsp;ret&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_msg_info&nbsp;msg_info&nbsp;=&nbsp;{0};<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hw-&gt;allmulti_status&nbsp;==&nbsp;1)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hw-&gt;is_pf)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hw-&gt;promisc_status&nbsp;==&nbsp;1)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;end;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_dev_multicast_table_set(hw,&nbsp;hw-&gt;vport.vport,&nbsp;false);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_port_promisc_msg&nbsp;*promisc_msg&nbsp;=&nbsp;&amp;msg_info.data.port_promisc_msg;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_msg_head_build(hw,&nbsp;ZXDH_PORT_PROMISC_SET,&nbsp;&amp;msg_info);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hw-&gt;promisc_status&nbsp;==&nbsp;1)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;end;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;promisc_msg-&gt;mode&nbsp;=&nbsp;ZXDH_ALLMULTI_MODE;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;promisc_msg-&gt;value&nbsp;=&nbsp;false;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_vf_send_msg_to_pf(dev,&nbsp;&amp;msg_info,&nbsp;sizeof(msg_info),&nbsp;NULL,&nbsp;0);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;Failed&nbsp;to&nbsp;send&nbsp;msg:&nbsp;port&nbsp;0x%x&nbsp;msg&nbsp;type&nbsp;%d&quot;,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hw-&gt;vport.vport,&nbsp;ZXDH_ALLMULTI_MODE);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hw-&gt;allmulti_status&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+end:<br />+&nbsp;&nbsp;&nbsp;&nbsp;hw-&gt;allmulti_status&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+}<br />diff&nbsp;--git&nbsp;a/drivers/net/zxdh/zxdh_ethdev_ops.h&nbsp;b/drivers/net/zxdh/zxdh_ethdev_ops.h<br />index&nbsp;4630bb70db..394ddedc0e&nbsp;100644<br />---&nbsp;a/drivers/net/zxdh/zxdh_ethdev_ops.h<br />+++&nbsp;b/drivers/net/zxdh/zxdh_ethdev_ops.h<br />@@&nbsp;-14,5&nbsp;+14,9&nbsp;@@&nbsp;int&nbsp;zxdh_dev_mac_addr_add(struct&nbsp;rte_eth_dev&nbsp;*dev,&nbsp;struct&nbsp;rte_ether_addr&nbsp;*mac_ad<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;index,&nbsp;uint32_t&nbsp;vmdq);<br />&nbsp;int&nbsp;zxdh_dev_mac_addr_set(struct&nbsp;rte_eth_dev&nbsp;*dev,&nbsp;struct&nbsp;rte_ether_addr&nbsp;*mac_addr);<br />&nbsp;void&nbsp;zxdh_dev_mac_addr_remove(struct&nbsp;rte_eth_dev&nbsp;*dev,&nbsp;uint32_t&nbsp;index);<br />+int&nbsp;zxdh_dev_promiscuous_enable(struct&nbsp;rte_eth_dev&nbsp;*dev);<br />+int&nbsp;zxdh_dev_promiscuous_disable(struct&nbsp;rte_eth_dev&nbsp;*dev);<br />+int&nbsp;zxdh_dev_allmulticast_enable(struct&nbsp;rte_eth_dev&nbsp;*dev);<br />+int&nbsp;zxdh_dev_allmulticast_disable(struct&nbsp;rte_eth_dev&nbsp;*dev);<br />&nbsp;
<br />&nbsp;#endif&nbsp;/*&nbsp;ZXDH_ETHDEV_OPS_H&nbsp;*/<br />diff&nbsp;--git&nbsp;a/drivers/net/zxdh/zxdh_msg.h&nbsp;b/drivers/net/zxdh/zxdh_msg.h<br />index&nbsp;44ce5d1b7f..2abf579a80&nbsp;100644<br />---&nbsp;a/drivers/net/zxdh/zxdh_msg.h<br />+++&nbsp;b/drivers/net/zxdh/zxdh_msg.h<br />@@&nbsp;-48,6&nbsp;+48,8&nbsp;@@<br />&nbsp;
<br />&nbsp;#define&nbsp;ZXDH_MAC_FILTER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xaa<br />&nbsp;#define&nbsp;ZXDH_MAC_UNFILTER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xff<br />+#define&nbsp;ZXDH_PROMISC_MODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1<br />+#define&nbsp;ZXDH_ALLMULTI_MODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2<br />&nbsp;
<br />&nbsp;enum&nbsp;ZXDH_DRIVER_TYPE&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_MSG_CHAN_END_MPF&nbsp;=&nbsp;0,<br />@@&nbsp;-180,6&nbsp;+182,7&nbsp;@@&nbsp;enum&nbsp;zxdh_msg_type&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_MAC_DEL&nbsp;=&nbsp;4,<br />&nbsp;
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_PORT_ATTRS_SET&nbsp;=&nbsp;25,<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_PORT_PROMISC_SET&nbsp;=&nbsp;26,<br />&nbsp;
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_MSG_TYPE_END,<br />&nbsp;};<br />@@&nbsp;-325,6&nbsp;+328,12&nbsp;@@&nbsp;struct&nbsp;zxdh_mac_filter&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;rte_ether_addr&nbsp;mac;<br />&nbsp;}&nbsp;__rte_packed;<br />&nbsp;
<br />+struct&nbsp;zxdh_port_promisc_msg&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;mode;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;value;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;mc_follow;<br />+}&nbsp;__rte_packed;<br />+<br />&nbsp;struct&nbsp;zxdh_msg_head&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enum&nbsp;zxdh_msg_type&nbsp;msg_type;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint16_t&nbsp;&nbsp;vport;<br />@@&nbsp;-353,6&nbsp;+362,7&nbsp;@@&nbsp;struct&nbsp;zxdh_msg_info&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_port_attr_set_msg&nbsp;port_attr_msg;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_link_info_msg&nbsp;link_msg;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_mac_filter&nbsp;mac_filter_msg;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_port_promisc_msg&nbsp;port_promisc_msg;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;__rte_packed&nbsp;data;<br />&nbsp;}&nbsp;__rte_packed;<br />&nbsp;
<br />diff&nbsp;--git&nbsp;a/drivers/net/zxdh/zxdh_tables.c&nbsp;b/drivers/net/zxdh/zxdh_tables.c<br />index&nbsp;f5b607584d..45aeb3e3e4&nbsp;100644<br />---&nbsp;a/drivers/net/zxdh/zxdh_tables.c<br />+++&nbsp;b/drivers/net/zxdh/zxdh_tables.c<br />@@&nbsp;-10,10&nbsp;+10,15&nbsp;@@<br />&nbsp;
<br />&nbsp;#define&nbsp;ZXDH_SDT_VPORT_ATT_TABLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1<br />&nbsp;#define&nbsp;ZXDH_SDT_PANEL_ATT_TABLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2<br />+#define&nbsp;ZXDH_SDT_BROCAST_ATT_TABLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6<br />+#define&nbsp;ZXDH_SDT_UNICAST_ATT_TABLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10<br />+#define&nbsp;ZXDH_SDT_MULTICAST_ATT_TABLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11<br />&nbsp;
<br />&nbsp;#define&nbsp;ZXDH_MAC_HASH_INDEX_BASE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;64<br />&nbsp;#define&nbsp;ZXDH_MAC_HASH_INDEX(index)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ZXDH_MAC_HASH_INDEX_BASE&nbsp;+&nbsp;(index))<br />&nbsp;#define&nbsp;ZXDH_MC_GROUP_NUM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4<br />+#define&nbsp;ZXDH_BASE_VFID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1152<br />+#define&nbsp;ZXDH_TABLE_HIT_FLAG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;128<br />&nbsp;
<br />&nbsp;int<br />&nbsp;zxdh_set_port_attr(uint16_t&nbsp;vfid,&nbsp;struct&nbsp;zxdh_port_attr_table&nbsp;*port_attr)<br />@@&nbsp;-346,3&nbsp;+351,221&nbsp;@@&nbsp;zxdh_del_mac_table(uint16_t&nbsp;vport,&nbsp;struct&nbsp;rte_ether_addr&nbsp;*addr,&nbsp;&nbsp;uint8_t&nbsp;hash_se<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;}<br />+<br />+int<br />+zxdh_promisc_table_init(struct&nbsp;rte_eth_dev&nbsp;*dev)<br />+{<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_hw&nbsp;*hw&nbsp;=&nbsp;dev-&gt;data-&gt;dev_private;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;ret,&nbsp;vf_group_id&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_brocast_table&nbsp;brocast_table&nbsp;=&nbsp;{0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_unitcast_table&nbsp;uc_table&nbsp;=&nbsp;{0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_multicast_table&nbsp;mc_table&nbsp;=&nbsp;{0};<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!hw-&gt;is_pf)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(;&nbsp;vf_group_id&nbsp;&lt;&nbsp;4;&nbsp;vf_group_id++)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;brocast_table.flag&nbsp;=&nbsp;rte_be_to_cpu_32(ZXDH_TABLE_HIT_FLAG);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_ERAM_ENTRY_INFO_T&nbsp;eram_brocast_entry&nbsp;=&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.index&nbsp;=&nbsp;((hw-&gt;vfid&nbsp;-&nbsp;ZXDH_BASE_VFID)&nbsp;&lt;&lt;&nbsp;2)&nbsp;+&nbsp;vf_group_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.p_data&nbsp;=&nbsp;(uint32_t&nbsp;*)&amp;brocast_table<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_USER_ENTRY_T&nbsp;entry_brocast&nbsp;=&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.sdt_no&nbsp;=&nbsp;ZXDH_SDT_BROCAST_ATT_TABLE,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.p_entry_data&nbsp;=&nbsp;(void&nbsp;*)&amp;eram_brocast_entry<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_dtb_data.queueid,&nbsp;1,&nbsp;&amp;entry_brocast);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;write&nbsp;brocast&nbsp;table&nbsp;failed&quot;);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uc_table.uc_flood_pf_enable&nbsp;=&nbsp;rte_be_to_cpu_32(ZXDH_TABLE_HIT_FLAG);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_ERAM_ENTRY_INFO_T&nbsp;eram_uc_entry&nbsp;=&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.index&nbsp;=&nbsp;((hw-&gt;vfid&nbsp;-&nbsp;ZXDH_BASE_VFID)&nbsp;&lt;&lt;&nbsp;2)&nbsp;+&nbsp;vf_group_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.p_data&nbsp;=&nbsp;(uint32_t&nbsp;*)&amp;uc_table<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_USER_ENTRY_T&nbsp;entry_unicast&nbsp;=&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.sdt_no&nbsp;=&nbsp;ZXDH_SDT_UNICAST_ATT_TABLE,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.p_entry_data&nbsp;=&nbsp;(void&nbsp;*)&amp;eram_uc_entry<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_dtb_data.queueid,&nbsp;1,&nbsp;&amp;entry_unicast);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;write&nbsp;unicast&nbsp;table&nbsp;failed&quot;);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mc_table.mc_flood_pf_enable&nbsp;=&nbsp;rte_be_to_cpu_32(ZXDH_TABLE_HIT_FLAG);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_ERAM_ENTRY_INFO_T&nbsp;eram_mc_entry&nbsp;=&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.index&nbsp;=&nbsp;((hw-&gt;vfid&nbsp;-&nbsp;ZXDH_BASE_VFID)&nbsp;&lt;&lt;&nbsp;2)&nbsp;+&nbsp;vf_group_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.p_data&nbsp;=&nbsp;(uint32_t&nbsp;*)&amp;mc_table<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_USER_ENTRY_T&nbsp;entry_multicast&nbsp;=&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.sdt_no&nbsp;=&nbsp;ZXDH_SDT_MULTICAST_ATT_TABLE,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.p_entry_data&nbsp;=&nbsp;(void&nbsp;*)&amp;eram_mc_entry<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO,&nbsp;g_dtb_data.queueid,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&amp;entry_multicast);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;write&nbsp;multicast&nbsp;table&nbsp;failed&quot;);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+}<br />+<br />+int<br />+zxdh_promisc_table_uninit(struct&nbsp;rte_eth_dev&nbsp;*dev)<br />+{<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_hw&nbsp;*hw&nbsp;=&nbsp;dev-&gt;data-&gt;dev_private;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;ret,&nbsp;vf_group_id&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_brocast_table&nbsp;brocast_table&nbsp;=&nbsp;{0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_unitcast_table&nbsp;uc_table&nbsp;=&nbsp;{0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_multicast_table&nbsp;mc_table&nbsp;=&nbsp;{0};<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!hw-&gt;is_pf)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(;&nbsp;vf_group_id&nbsp;&lt;&nbsp;4;&nbsp;vf_group_id++)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;brocast_table.flag&nbsp;=&nbsp;rte_be_to_cpu_32(ZXDH_TABLE_HIT_FLAG);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_ERAM_ENTRY_INFO_T&nbsp;eram_brocast_entry&nbsp;=&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.index&nbsp;=&nbsp;((hw-&gt;vfid&nbsp;-&nbsp;ZXDH_BASE_VFID)&nbsp;&lt;&lt;&nbsp;2)&nbsp;+&nbsp;vf_group_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.p_data&nbsp;=&nbsp;(uint32_t&nbsp;*)&amp;brocast_table<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_USER_ENTRY_T&nbsp;entry_brocast&nbsp;=&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.sdt_no&nbsp;=&nbsp;ZXDH_SDT_BROCAST_ATT_TABLE,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.p_entry_data&nbsp;=&nbsp;(void&nbsp;*)&amp;eram_brocast_entry<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_np_dtb_table_entry_delete(ZXDH_DEVICE_NO,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_dtb_data.queueid,&nbsp;1,&nbsp;&amp;entry_brocast);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;write&nbsp;brocast&nbsp;table&nbsp;failed&quot;);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uc_table.uc_flood_pf_enable&nbsp;=&nbsp;rte_be_to_cpu_32(ZXDH_TABLE_HIT_FLAG);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_ERAM_ENTRY_INFO_T&nbsp;eram_uc_entry&nbsp;=&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.index&nbsp;=&nbsp;((hw-&gt;vfid&nbsp;-&nbsp;ZXDH_BASE_VFID)&nbsp;&lt;&lt;&nbsp;2)&nbsp;+&nbsp;vf_group_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.p_data&nbsp;=&nbsp;(uint32_t&nbsp;*)&amp;uc_table<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_USER_ENTRY_T&nbsp;entry_unicast&nbsp;=&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.sdt_no&nbsp;=&nbsp;ZXDH_SDT_UNICAST_ATT_TABLE,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.p_entry_data&nbsp;=&nbsp;(void&nbsp;*)&amp;eram_uc_entry<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_np_dtb_table_entry_delete(ZXDH_DEVICE_NO,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_dtb_data.queueid,&nbsp;1,&nbsp;&amp;entry_unicast);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;write&nbsp;unicast&nbsp;table&nbsp;failed&quot;);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mc_table.mc_flood_pf_enable&nbsp;=&nbsp;rte_be_to_cpu_32(ZXDH_TABLE_HIT_FLAG);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_ERAM_ENTRY_INFO_T&nbsp;eram_mc_entry&nbsp;=&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.index&nbsp;=&nbsp;((hw-&gt;vfid&nbsp;-&nbsp;ZXDH_BASE_VFID)&nbsp;&lt;&lt;&nbsp;2)&nbsp;+&nbsp;vf_group_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.p_data&nbsp;=&nbsp;(uint32_t&nbsp;*)&amp;mc_table<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_USER_ENTRY_T&nbsp;entry_multicast&nbsp;=&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.sdt_no&nbsp;=&nbsp;ZXDH_SDT_MULTICAST_ATT_TABLE,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.p_entry_data&nbsp;=&nbsp;(void&nbsp;*)&amp;eram_mc_entry<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_np_dtb_table_entry_delete(ZXDH_DEVICE_NO,&nbsp;g_dtb_data.queueid,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&amp;entry_multicast);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;write&nbsp;multicast&nbsp;table&nbsp;failed&quot;);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+}<br />+<br />+int<br />+zxdh_dev_unicast_table_set(struct&nbsp;zxdh_hw&nbsp;*hw,&nbsp;uint16_t&nbsp;vport,&nbsp;bool&nbsp;enable)<br />+{<br />+&nbsp;&nbsp;&nbsp;&nbsp;int16_t&nbsp;ret&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_unitcast_table&nbsp;uc_table&nbsp;=&nbsp;{0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;union&nbsp;zxdh_virport_num&nbsp;vport_num&nbsp;=&nbsp;(union&nbsp;zxdh_virport_num)vport;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_ERAM_ENTRY_INFO_T&nbsp;uc_table_entry&nbsp;=&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.index&nbsp;=&nbsp;((hw-&gt;vfid&nbsp;-&nbsp;ZXDH_BASE_VFID)&nbsp;&lt;&lt;&nbsp;2)&nbsp;+&nbsp;vport_num.vfid&nbsp;/&nbsp;64,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.p_data&nbsp;=&nbsp;(uint32_t&nbsp;*)&amp;uc_table<br />+&nbsp;&nbsp;&nbsp;&nbsp;};<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_USER_ENTRY_T&nbsp;entry&nbsp;=&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.sdt_no&nbsp;=&nbsp;ZXDH_SDT_UNICAST_ATT_TABLE,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.p_entry_data&nbsp;=&nbsp;(void&nbsp;*)&amp;uc_table_entry<br />+&nbsp;&nbsp;&nbsp;&nbsp;};<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_np_dtb_table_entry_get(ZXDH_DEVICE_NO,&nbsp;g_dtb_data.queueid,&nbsp;&amp;entry,&nbsp;1);<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;unicast_table_get_failed:%d&quot;,&nbsp;hw-&gt;vfid);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-ret;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(vport_num.vf_flag)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(enable)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uc_table.bitmap[(vport_num.vfid&nbsp;%&nbsp;64)&nbsp;/&nbsp;32]&nbsp;|=<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UINT32_C(1)&nbsp;&lt;&lt;&nbsp;(31&nbsp;-&nbsp;(vport_num.vfid&nbsp;%&nbsp;64)&nbsp;%&nbsp;32);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uc_table.bitmap[(vport_num.vfid&nbsp;%&nbsp;64)&nbsp;/&nbsp;32]&nbsp;&amp;=<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~(UINT32_C(1)&nbsp;&lt;&lt;&nbsp;(31&nbsp;-&nbsp;(vport_num.vfid&nbsp;%&nbsp;64)&nbsp;%&nbsp;32));<br />+&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uc_table.uc_flood_pf_enable&nbsp;=&nbsp;rte_be_to_cpu_32(ZXDH_TABLE_HIT_FLAG&nbsp;+&nbsp;(enable&nbsp;&lt;&lt;&nbsp;6));<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO,&nbsp;g_dtb_data.queueid,&nbsp;1,&nbsp;&amp;entry);<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;unicast_table_set_failed:%d&quot;,&nbsp;&nbsp;hw-&gt;vfid);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-ret;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />+}<br />+<br />+int<br />+zxdh_dev_multicast_table_set(struct&nbsp;zxdh_hw&nbsp;*hw,&nbsp;uint16_t&nbsp;vport,&nbsp;bool&nbsp;enable)<br />+{<br />+&nbsp;&nbsp;&nbsp;&nbsp;int16_t&nbsp;ret&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_multicast_table&nbsp;mc_table&nbsp;=&nbsp;{0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;union&nbsp;zxdh_virport_num&nbsp;vport_num&nbsp;=&nbsp;(union&nbsp;zxdh_virport_num)vport;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_ERAM_ENTRY_INFO_T&nbsp;mc_table_entry&nbsp;=&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.index&nbsp;=&nbsp;((hw-&gt;vfid&nbsp;-&nbsp;ZXDH_BASE_VFID)&nbsp;&lt;&lt;&nbsp;2)&nbsp;+&nbsp;vport_num.vfid&nbsp;/&nbsp;64,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.p_data&nbsp;=&nbsp;(uint32_t&nbsp;*)&amp;mc_table<br />+&nbsp;&nbsp;&nbsp;&nbsp;};<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_USER_ENTRY_T&nbsp;entry&nbsp;=&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.sdt_no&nbsp;=&nbsp;ZXDH_SDT_MULTICAST_ATT_TABLE,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.p_entry_data&nbsp;=&nbsp;(void&nbsp;*)&amp;mc_table_entry<br />+&nbsp;&nbsp;&nbsp;&nbsp;};<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_np_dtb_table_entry_get(ZXDH_DEVICE_NO,&nbsp;g_dtb_data.queueid,&nbsp;&amp;entry,&nbsp;1);<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;allmulti_table_get_failed:%d&quot;,&nbsp;hw-&gt;vfid);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-ret;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(vport_num.vf_flag)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(enable)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mc_table.bitmap[(vport_num.vfid&nbsp;%&nbsp;64)&nbsp;/&nbsp;32]&nbsp;|=<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UINT32_C(1)&nbsp;&lt;&lt;&nbsp;(31&nbsp;-&nbsp;(vport_num.vfid&nbsp;%&nbsp;64)&nbsp;%&nbsp;32);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mc_table.bitmap[(vport_num.vfid&nbsp;%&nbsp;64)&nbsp;/&nbsp;32]&nbsp;&amp;=<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~(UINT32_C(1)&nbsp;&lt;&lt;&nbsp;(31&nbsp;-&nbsp;(vport_num.vfid&nbsp;%&nbsp;64)&nbsp;%&nbsp;32));<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mc_table.mc_flood_pf_enable&nbsp;=&nbsp;rte_be_to_cpu_32(ZXDH_TABLE_HIT_FLAG&nbsp;+&nbsp;(enable&nbsp;&lt;&lt;&nbsp;6));<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO,&nbsp;g_dtb_data.queueid,&nbsp;1,&nbsp;&amp;entry);<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;allmulti_table_set_failed:%d&quot;,&nbsp;hw-&gt;vfid);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-ret;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />+}<br />diff&nbsp;--git&nbsp;a/drivers/net/zxdh/zxdh_tables.h&nbsp;b/drivers/net/zxdh/zxdh_tables.h<br />index&nbsp;f16c4923ef..0a1ddf7d9e&nbsp;100644<br />---&nbsp;a/drivers/net/zxdh/zxdh_tables.h<br />+++&nbsp;b/drivers/net/zxdh/zxdh_tables.h<br />@@&nbsp;-176,12&nbsp;+176,34&nbsp;@@&nbsp;struct&nbsp;zxdh_mac_multicast_table&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_mac_multicast_entry&nbsp;entry;<br />&nbsp;};<br />&nbsp;
<br />+struct&nbsp;zxdh_brocast_table&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;flag;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;rsv;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;bitmap[2];<br />+};<br />+<br />+struct&nbsp;zxdh_unitcast_table&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;uc_flood_pf_enable;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;rsv;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;bitmap[2];<br />+};<br />+<br />+struct&nbsp;zxdh_multicast_table&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;mc_flood_pf_enable;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;rsv;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;bitmap[2];<br />+};<br />+<br />&nbsp;int&nbsp;zxdh_port_attr_init(struct&nbsp;rte_eth_dev&nbsp;*dev);<br />&nbsp;int&nbsp;zxdh_panel_table_init(struct&nbsp;rte_eth_dev&nbsp;*dev);<br />&nbsp;int&nbsp;zxdh_set_port_attr(uint16_t&nbsp;vfid,&nbsp;struct&nbsp;zxdh_port_attr_table&nbsp;*port_attr);<br />&nbsp;int&nbsp;zxdh_port_attr_uninit(struct&nbsp;rte_eth_dev&nbsp;*dev);<br />+int&nbsp;zxdh_promisc_table_init(struct&nbsp;rte_eth_dev&nbsp;*dev);<br />+int&nbsp;zxdh_promisc_table_uninit(struct&nbsp;rte_eth_dev&nbsp;*dev);<br />&nbsp;int&nbsp;zxdh_get_port_attr(uint16_t&nbsp;vfid,&nbsp;struct&nbsp;zxdh_port_attr_table&nbsp;*port_attr);<br />&nbsp;int&nbsp;zxdh_set_mac_table(uint16_t&nbsp;vport,&nbsp;struct&nbsp;rte_ether_addr&nbsp;*addr,&nbsp;&nbsp;uint8_t&nbsp;hash_search_idx);<br />&nbsp;int&nbsp;zxdh_del_mac_table(uint16_t&nbsp;vport,&nbsp;struct&nbsp;rte_ether_addr&nbsp;*addr,&nbsp;&nbsp;uint8_t&nbsp;hash_search_idx);<br />+int&nbsp;zxdh_dev_unicast_table_set(struct&nbsp;zxdh_hw&nbsp;*hw,&nbsp;uint16_t&nbsp;vport,&nbsp;bool&nbsp;enable);<br />+int&nbsp;zxdh_dev_multicast_table_set(struct&nbsp;zxdh_hw&nbsp;*hw,&nbsp;uint16_t&nbsp;vport,&nbsp;bool&nbsp;enable);<br />&nbsp;
<br />&nbsp;#endif&nbsp;/*&nbsp;ZXDH_TABLES_H&nbsp;*/<br />--&nbsp;
<br />2.27.0<br />