basic&nbsp;stats&nbsp;ops&nbsp;implementations.<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;1&nbsp;+<br />&nbsp;drivers/net/zxdh/zxdh_ethdev.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;2&nbsp;+<br />&nbsp;drivers/net/zxdh/zxdh_ethdev_ops.c&nbsp;|&nbsp;353&nbsp;+++++++++++++++++++++++++++++<br />&nbsp;drivers/net/zxdh/zxdh_ethdev_ops.h&nbsp;|&nbsp;&nbsp;27&nbsp;+++<br />&nbsp;drivers/net/zxdh/zxdh_msg.h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;16&nbsp;++<br />&nbsp;drivers/net/zxdh/zxdh_np.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;341&nbsp;++++++++++++++++++++++++++++<br />&nbsp;drivers/net/zxdh/zxdh_np.h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;30&nbsp;+++<br />&nbsp;drivers/net/zxdh/zxdh_queue.h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;2&nbsp;+<br />&nbsp;drivers/net/zxdh/zxdh_rxtx.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;83&nbsp;++++++-<br />&nbsp;drivers/net/zxdh/zxdh_tables.h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;5&nbsp;+<br />&nbsp;11&nbsp;files&nbsp;changed,&nbsp;859&nbsp;insertions(+),&nbsp;3&nbsp;deletions(-)<br />
<br />diff&nbsp;--git&nbsp;a/doc/guides/nics/features/zxdh.ini&nbsp;b/doc/guides/nics/features/zxdh.ini<br />index&nbsp;415ca547d0..98c141cf95&nbsp;100644<br />---&nbsp;a/doc/guides/nics/features/zxdh.ini<br />+++&nbsp;b/doc/guides/nics/features/zxdh.ini<br />@@&nbsp;-22,3&nbsp;+22,5&nbsp;@@&nbsp;QinQ&nbsp;offload&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;Y<br />&nbsp;RSS&nbsp;hash&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;Y<br />&nbsp;RSS&nbsp;reta&nbsp;update&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;Y<br />&nbsp;Inner&nbsp;RSS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;Y<br />+Basic&nbsp;stats&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;Y<br />+Stats&nbsp;per&nbsp;queue&nbsp;&nbsp;&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;3cc6a1d348..c8a52b587c&nbsp;100644<br />---&nbsp;a/doc/guides/nics/zxdh.rst<br />+++&nbsp;b/doc/guides/nics/zxdh.rst<br />@@&nbsp;-32,6&nbsp;+32,7&nbsp;@@&nbsp;Features&nbsp;of&nbsp;the&nbsp;ZXDH&nbsp;PMD&nbsp;are:<br />&nbsp;-&nbsp;VLAN&nbsp;stripping&nbsp;and&nbsp;inserting<br />&nbsp;-&nbsp;QINQ&nbsp;stripping&nbsp;and&nbsp;inserting<br />&nbsp;-&nbsp;Receive&nbsp;Side&nbsp;Scaling&nbsp;(RSS)<br />+-&nbsp;Port&nbsp;hardware&nbsp;statistics<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;1c04719cd4..d87ad15824&nbsp;100644<br />---&nbsp;a/drivers/net/zxdh/zxdh_ethdev.c<br />+++&nbsp;b/drivers/net/zxdh/zxdh_ethdev.c<br />@@&nbsp;-1171,6&nbsp;+1171,8&nbsp;@@&nbsp;static&nbsp;const&nbsp;struct&nbsp;eth_dev_ops&nbsp;zxdh_eth_dev_ops&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.reta_query&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;zxdh_dev_rss_reta_query,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.rss_hash_update&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;zxdh_rss_hash_update,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.rss_hash_conf_get&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;zxdh_rss_hash_conf_get,<br />+&nbsp;&nbsp;&nbsp;&nbsp;.stats_get&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;zxdh_dev_stats_get,<br />+&nbsp;&nbsp;&nbsp;&nbsp;.stats_reset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;zxdh_dev_stats_reset,<br />&nbsp;};<br />&nbsp;
<br />&nbsp;static&nbsp;int32_t<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;d333717e87..1b219bd26d&nbsp;100644<br />---&nbsp;a/drivers/net/zxdh/zxdh_ethdev_ops.c<br />+++&nbsp;b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />@@&nbsp;-11,6&nbsp;+11,8&nbsp;@@<br />&nbsp;#include&nbsp;&quot;zxdh_ethdev_ops.h&quot;
<br />&nbsp;#include&nbsp;&quot;zxdh_tables.h&quot;
<br />&nbsp;#include&nbsp;&quot;zxdh_logs.h&quot;
<br />+#include&nbsp;&quot;zxdh_rxtx.h&quot;
<br />+#include&nbsp;&quot;zxdh_np.h&quot;
<br />&nbsp;
<br />&nbsp;#define&nbsp;ZXDH_VLAN_FILTER_GROUPS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;64<br />&nbsp;#define&nbsp;ZXDH_INVALID_LOGIC_QID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xFFFFU<br />@@&nbsp;-22,6&nbsp;+24,108&nbsp;@@<br />&nbsp;#define&nbsp;ZXDH_HF_MAC_VLAN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4<br />&nbsp;#define&nbsp;ZXDH_HF_ALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;
<br />+struct&nbsp;zxdh_hw_mac_stats&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_total;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_pause;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_unicast;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_multicast;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_broadcast;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_vlan;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_size_64;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_size_65_127;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_size_128_255;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_size_256_511;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_size_512_1023;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_size_1024_1518;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_size_1519_mru;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_undersize;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_oversize;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_fragment;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_jabber;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_control;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_eee;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_total;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_pause;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_unicast;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_multicast;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_broadcast;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_vlan;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_size_64;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_size_65_127;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_size_128_255;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_size_256_511;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_size_512_1023;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_size_1024_1518;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_size_1519_mtu;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_undersize;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_oversize;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_fragment;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_jabber;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_control;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_eee;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_error;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_fcs_error;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_drop;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_error;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_fcs_error;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_drop;<br />+<br />+}&nbsp;__rte_packed;<br />+<br />+struct&nbsp;zxdh_hw_mac_bytes&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_total_bytes;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_good_bytes;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_total_bytes;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_good_bytes;<br />+}&nbsp;__rte_packed;<br />+<br />+struct&nbsp;zxdh_np_stats_data&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;n_pkts_dropped;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;n_bytes_dropped;<br />+};<br />+<br />+struct&nbsp;zxdh_xstats_name_off&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;name[RTE_ETH_XSTATS_NAME_SIZE];<br />+&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;offset;<br />+};<br />+<br />+static&nbsp;const&nbsp;struct&nbsp;zxdh_xstats_name_off&nbsp;zxdh_rxq_stat_strings[]&nbsp;=&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;good_packets&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_rx,&nbsp;stats.packets)},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;good_bytes&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_rx,&nbsp;stats.bytes)},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;errors&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_rx,&nbsp;stats.errors)},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;multicast_packets&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_rx,&nbsp;stats.multicast)},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;broadcast_packets&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_rx,&nbsp;stats.broadcast)},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;truncated_err&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_rx,&nbsp;stats.truncated_err)},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;undersize_packets&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_rx,&nbsp;stats.size_bins[0])},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;size_64_packets&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_rx,&nbsp;stats.size_bins[1])},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;size_65_127_packets&quot;,&nbsp;&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_rx,&nbsp;stats.size_bins[2])},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;size_128_255_packets&quot;,&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_rx,&nbsp;stats.size_bins[3])},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;size_256_511_packets&quot;,&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_rx,&nbsp;stats.size_bins[4])},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;size_512_1023_packets&quot;,&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_rx,&nbsp;stats.size_bins[5])},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;size_1024_1518_packets&quot;,&nbsp;offsetof(struct&nbsp;zxdh_virtnet_rx,&nbsp;stats.size_bins[6])},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;size_1519_max_packets&quot;,&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_rx,&nbsp;stats.size_bins[7])},<br />+};<br />+<br />+static&nbsp;const&nbsp;struct&nbsp;zxdh_xstats_name_off&nbsp;zxdh_txq_stat_strings[]&nbsp;=&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;good_packets&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_tx,&nbsp;stats.packets)},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;good_bytes&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_tx,&nbsp;stats.bytes)},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;errors&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_tx,&nbsp;stats.errors)},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;multicast_packets&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_tx,&nbsp;stats.multicast)},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;broadcast_packets&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_tx,&nbsp;stats.broadcast)},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;truncated_err&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_tx,&nbsp;stats.truncated_err)},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;undersize_packets&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_tx,&nbsp;stats.size_bins[0])},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;size_64_packets&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_tx,&nbsp;stats.size_bins[1])},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;size_65_127_packets&quot;,&nbsp;&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_tx,&nbsp;stats.size_bins[2])},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;size_128_255_packets&quot;,&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_tx,&nbsp;stats.size_bins[3])},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;size_256_511_packets&quot;,&nbsp;&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_tx,&nbsp;stats.size_bins[4])},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;size_512_1023_packets&quot;,&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_tx,&nbsp;stats.size_bins[5])},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;size_1024_1518_packets&quot;,&nbsp;offsetof(struct&nbsp;zxdh_virtnet_tx,&nbsp;stats.size_bins[6])},<br />+&nbsp;&nbsp;&nbsp;&nbsp;{&quot;size_1519_max_packets&quot;,&nbsp;&nbsp;offsetof(struct&nbsp;zxdh_virtnet_tx,&nbsp;stats.size_bins[7])},<br />+};<br />+<br />&nbsp;static&nbsp;int32_t&nbsp;zxdh_config_port_status(struct&nbsp;rte_eth_dev&nbsp;*dev,&nbsp;uint16_t&nbsp;link_status)<br />&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_hw&nbsp;*hw&nbsp;=&nbsp;dev-&gt;data-&gt;dev_private;<br />@@&nbsp;-1153,3&nbsp;+1257,252&nbsp;@@&nbsp;zxdh_rss_configure(struct&nbsp;rte_eth_dev&nbsp;*dev)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;}<br />+<br />+static&nbsp;int32_t<br />+zxdh_hw_vqm_stats_get(struct&nbsp;rte_eth_dev&nbsp;*dev,&nbsp;enum&nbsp;zxdh_agent_msg_type&nbsp;opcode,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_hw_vqm_stats&nbsp;*hw_stats)<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;struct&nbsp;zxdh_msg_info&nbsp;msg_info&nbsp;=&nbsp;{0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_msg_reply_info&nbsp;reply_info&nbsp;=&nbsp;{0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;enum&nbsp;ZXDH_BAR_MODULE_ID&nbsp;module_id;<br />+&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ret&nbsp;=&nbsp;0;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(opcode)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;ZXDH_VQM_DEV_STATS_GET:<br />+&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;ZXDH_VQM_QUEUE_STATS_GET:<br />+&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;ZXDH_VQM_QUEUE_STATS_RESET:<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;module_id&nbsp;=&nbsp;ZXDH_BAR_MODULE_VQM;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />+&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;ZXDH_MAC_STATS_GET:<br />+&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;ZXDH_MAC_STATS_RESET:<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;module_id&nbsp;=&nbsp;ZXDH_BAR_MODULE_MAC;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />+&nbsp;&nbsp;&nbsp;&nbsp;default:<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;invalid&nbsp;opcode&nbsp;%u&quot;,&nbsp;opcode);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;zxdh_agent_msg_build(hw,&nbsp;opcode,&nbsp;&amp;msg_info);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_send_msg_to_riscv(dev,&nbsp;&amp;msg_info,&nbsp;sizeof(struct&nbsp;zxdh_msg_info),<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;reply_info,&nbsp;sizeof(struct&nbsp;zxdh_msg_reply_info),&nbsp;module_id);<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;Failed&nbsp;to&nbsp;get&nbsp;hw&nbsp;stats&quot;);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_msg_reply_body&nbsp;*reply_body&nbsp;=&nbsp;&amp;reply_info.reply_body;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;rte_memcpy(hw_stats,&nbsp;&amp;reply_body-&gt;vqm_stats,&nbsp;sizeof(struct&nbsp;zxdh_hw_vqm_stats));<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />+}<br />+<br />+static&nbsp;int&nbsp;zxdh_hw_mac_stats_get(struct&nbsp;rte_eth_dev&nbsp;*dev,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_hw_mac_stats&nbsp;*mac_stats,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_hw_mac_bytes&nbsp;*mac_bytes)<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;uint64_t&nbsp;virt_addr&nbsp;=&nbsp;(uint64_t)(hw-&gt;bar_addr[ZXDH_BAR0_INDEX]&nbsp;+&nbsp;ZXDH_MAC_OFFSET);<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;stats_addr&nbsp;=&nbsp;&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;bytes_addr&nbsp;=&nbsp;&nbsp;0;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hw-&gt;speed&nbsp;&lt;=&nbsp;RTE_ETH_SPEED_NUM_25G)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats_addr&nbsp;=&nbsp;virt_addr&nbsp;+&nbsp;ZXDH_MAC_STATS_OFFSET&nbsp;+&nbsp;352&nbsp;*&nbsp;(hw-&gt;phyport&nbsp;%&nbsp;4);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytes_addr&nbsp;=&nbsp;virt_addr&nbsp;+&nbsp;ZXDH_MAC_BYTES_OFFSET&nbsp;+&nbsp;32&nbsp;*&nbsp;(hw-&gt;phyport&nbsp;%&nbsp;4);<br />+&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats_addr&nbsp;=&nbsp;virt_addr&nbsp;+&nbsp;ZXDH_MAC_STATS_OFFSET&nbsp;+&nbsp;352&nbsp;*&nbsp;4;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytes_addr&nbsp;=&nbsp;virt_addr&nbsp;+&nbsp;ZXDH_MAC_BYTES_OFFSET&nbsp;+&nbsp;32&nbsp;*&nbsp;4;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;rte_memcpy(mac_stats,&nbsp;(void&nbsp;*)stats_addr,&nbsp;sizeof(struct&nbsp;zxdh_hw_mac_stats));<br />+&nbsp;&nbsp;&nbsp;&nbsp;rte_memcpy(mac_bytes,&nbsp;(void&nbsp;*)bytes_addr,&nbsp;sizeof(struct&nbsp;zxdh_hw_mac_bytes));<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />+}<br />+<br />+static&nbsp;void&nbsp;zxdh_data_hi_to_lo(uint64_t&nbsp;*data)<br />+{<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;n_data_hi;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;n_data_lo;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;n_data_lo&nbsp;=&nbsp;*data&nbsp;&gt;&gt;&nbsp;32;<br />+&nbsp;&nbsp;&nbsp;&nbsp;n_data_hi&nbsp;=&nbsp;*data;<br />+&nbsp;&nbsp;&nbsp;&nbsp;*data&nbsp;=&nbsp;&nbsp;(uint64_t)(rte_le_to_cpu_32(n_data_hi))&nbsp;&lt;&lt;&nbsp;32&nbsp;|<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rte_le_to_cpu_32(n_data_lo);<br />+}<br />+<br />+static&nbsp;int&nbsp;zxdh_np_stats_get(struct&nbsp;rte_eth_dev&nbsp;*dev,&nbsp;struct&nbsp;zxdh_hw_np_stats&nbsp;*np_stats)<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;struct&nbsp;zxdh_np_stats_data&nbsp;stats_data;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;stats_id&nbsp;=&nbsp;zxdh_vport_to_vfid(hw-&gt;vport);<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;idx&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ret&nbsp;=&nbsp;0;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;idx&nbsp;=&nbsp;stats_id&nbsp;+&nbsp;ZXDH_BROAD_STATS_EGRESS_BASE;<br />+&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_np_dtb_stats_get(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;0,&nbsp;idx,&nbsp;(uint32_t&nbsp;*)&amp;np_stats-&gt;np_tx_broadcast);<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+&nbsp;&nbsp;&nbsp;&nbsp;zxdh_data_hi_to_lo(&amp;np_stats-&gt;np_tx_broadcast);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;idx&nbsp;=&nbsp;stats_id&nbsp;+&nbsp;ZXDH_BROAD_STATS_INGRESS_BASE;<br />+&nbsp;&nbsp;&nbsp;&nbsp;memset(&amp;stats_data,&nbsp;0,&nbsp;sizeof(stats_data));<br />+&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_np_dtb_stats_get(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;0,&nbsp;idx,&nbsp;(uint32_t&nbsp;*)&amp;np_stats-&gt;np_rx_broadcast);<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+&nbsp;&nbsp;&nbsp;&nbsp;zxdh_data_hi_to_lo(&amp;np_stats-&gt;np_rx_broadcast);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;idx&nbsp;=&nbsp;stats_id&nbsp;+&nbsp;ZXDH_MTU_STATS_EGRESS_BASE;<br />+&nbsp;&nbsp;&nbsp;&nbsp;memset(&amp;stats_data,&nbsp;0,&nbsp;sizeof(stats_data));<br />+&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_np_dtb_stats_get(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;1,&nbsp;idx,&nbsp;(uint32_t&nbsp;*)&amp;stats_data);<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;np_stats-&gt;np_tx_mtu_drop_pkts&nbsp;=&nbsp;stats_data.n_pkts_dropped;<br />+&nbsp;&nbsp;&nbsp;&nbsp;np_stats-&gt;np_tx_mtu_drop_bytes&nbsp;=&nbsp;stats_data.n_bytes_dropped;<br />+&nbsp;&nbsp;&nbsp;&nbsp;zxdh_data_hi_to_lo(&amp;np_stats-&gt;np_tx_mtu_drop_pkts);<br />+&nbsp;&nbsp;&nbsp;&nbsp;zxdh_data_hi_to_lo(&amp;np_stats-&gt;np_tx_mtu_drop_bytes);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;idx&nbsp;=&nbsp;stats_id&nbsp;+&nbsp;ZXDH_MTU_STATS_INGRESS_BASE;<br />+&nbsp;&nbsp;&nbsp;&nbsp;memset(&amp;stats_data,&nbsp;0,&nbsp;sizeof(stats_data));<br />+&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_np_dtb_stats_get(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;1,&nbsp;idx,&nbsp;(uint32_t&nbsp;*)&amp;stats_data);<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+&nbsp;&nbsp;&nbsp;&nbsp;np_stats-&gt;np_rx_mtu_drop_pkts&nbsp;=&nbsp;stats_data.n_pkts_dropped;<br />+&nbsp;&nbsp;&nbsp;&nbsp;np_stats-&gt;np_rx_mtu_drop_bytes&nbsp;=&nbsp;stats_data.n_bytes_dropped;<br />+&nbsp;&nbsp;&nbsp;&nbsp;zxdh_data_hi_to_lo(&amp;np_stats-&gt;np_rx_mtu_drop_pkts);<br />+&nbsp;&nbsp;&nbsp;&nbsp;zxdh_data_hi_to_lo(&amp;np_stats-&gt;np_rx_mtu_drop_bytes);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />+}<br />+<br />+static&nbsp;int<br />+zxdh_hw_np_stats_get(struct&nbsp;rte_eth_dev&nbsp;*dev,&nbsp;&nbsp;struct&nbsp;zxdh_hw_np_stats&nbsp;*np_stats)<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;struct&nbsp;zxdh_msg_info&nbsp;msg_info&nbsp;=&nbsp;{0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_msg_reply_info&nbsp;reply_info&nbsp;=&nbsp;{0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ret&nbsp;=&nbsp;0;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hw-&gt;is_pf)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_np_stats_get(dev,&nbsp;np_stats);<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;get&nbsp;np&nbsp;stats&nbsp;failed&quot;);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_msg_head_build(hw,&nbsp;ZXDH_GET_NP_STATS,&nbsp;&amp;msg_info);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_vf_send_msg_to_pf(dev,&nbsp;&amp;msg_info,&nbsp;sizeof(struct&nbsp;zxdh_msg_info),<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;reply_info,&nbsp;sizeof(struct&nbsp;zxdh_msg_reply_info));<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,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Failed&nbsp;to&nbsp;send&nbsp;msg:&nbsp;port&nbsp;0x%x&nbsp;msg&nbsp;type&nbsp;ZXDH_PORT_METER_STAT_GET&quot;,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hw-&gt;vport.vport);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(np_stats,&nbsp;&amp;reply_info.reply_body.np_stats,&nbsp;sizeof(struct&nbsp;zxdh_hw_np_stats));<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />+}<br />+<br />+int<br />+zxdh_dev_stats_get(struct&nbsp;rte_eth_dev&nbsp;*dev,&nbsp;struct&nbsp;rte_eth_stats&nbsp;*stats)<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;struct&nbsp;zxdh_hw_vqm_stats&nbsp;vqm_stats&nbsp;=&nbsp;{0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_hw_np_stats&nbsp;np_stats&nbsp;=&nbsp;{0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_hw_mac_stats&nbsp;mac_stats&nbsp;=&nbsp;{0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_hw_mac_bytes&nbsp;mac_bytes&nbsp;=&nbsp;{0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;i&nbsp;=&nbsp;0;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;zxdh_hw_vqm_stats_get(dev,&nbsp;ZXDH_VQM_DEV_STATS_GET,&nbsp;&nbsp;&amp;vqm_stats);<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hw-&gt;is_pf)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_hw_mac_stats_get(dev,&nbsp;&amp;mac_stats,&nbsp;&amp;mac_bytes);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;zxdh_hw_np_stats_get(dev,&nbsp;&amp;np_stats);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;ipackets&nbsp;=&nbsp;vqm_stats.rx_total;<br />+&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;opackets&nbsp;=&nbsp;vqm_stats.tx_total;<br />+&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;ibytes&nbsp;=&nbsp;vqm_stats.rx_bytes;<br />+&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;obytes&nbsp;=&nbsp;vqm_stats.tx_bytes;<br />+&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;imissed&nbsp;=&nbsp;vqm_stats.rx_drop&nbsp;+&nbsp;mac_stats.rx_drop;<br />+&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;ierrors&nbsp;=&nbsp;vqm_stats.rx_error&nbsp;+&nbsp;mac_stats.rx_error&nbsp;+&nbsp;np_stats.np_rx_mtu_drop_pkts;<br />+&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;oerrors&nbsp;=&nbsp;vqm_stats.tx_error&nbsp;+&nbsp;mac_stats.tx_error&nbsp;+&nbsp;np_stats.np_tx_mtu_drop_pkts;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;rx_nombuf&nbsp;=&nbsp;dev-&gt;data-&gt;rx_mbuf_alloc_failed;<br />+&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;(i&nbsp;&lt;&nbsp;dev-&gt;data-&gt;nb_rx_queues)&nbsp;&amp;&amp;&nbsp;(i&nbsp;&lt;&nbsp;RTE_ETHDEV_QUEUE_STAT_CNTRS);&nbsp;i++)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_virtnet_rx&nbsp;*rxvq&nbsp;=&nbsp;dev-&gt;data-&gt;rx_queues[i];<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rxvq&nbsp;==&nbsp;NULL)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;q_ipackets[i]&nbsp;=&nbsp;*(uint64_t&nbsp;*)(((char&nbsp;*)rxvq)&nbsp;+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_rxq_stat_strings[0].offset);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;q_ibytes[i]&nbsp;=&nbsp;*(uint64_t&nbsp;*)(((char&nbsp;*)rxvq)&nbsp;+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_rxq_stat_strings[1].offset);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;q_errors[i]&nbsp;=&nbsp;*(uint64_t&nbsp;*)(((char&nbsp;*)rxvq)&nbsp;+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_rxq_stat_strings[2].offset);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;q_errors[i]&nbsp;+=&nbsp;*(uint64_t&nbsp;*)(((char&nbsp;*)rxvq)&nbsp;+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_rxq_stat_strings[5].offset);<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;(i&nbsp;&lt;&nbsp;dev-&gt;data-&gt;nb_tx_queues)&nbsp;&amp;&amp;&nbsp;(i&nbsp;&lt;&nbsp;RTE_ETHDEV_QUEUE_STAT_CNTRS);&nbsp;i++)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_virtnet_tx&nbsp;*txvq&nbsp;=&nbsp;dev-&gt;data-&gt;tx_queues[i];<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(txvq&nbsp;==&nbsp;NULL)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;q_opackets[i]&nbsp;=&nbsp;*(uint64_t&nbsp;*)(((char&nbsp;*)txvq)&nbsp;+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_txq_stat_strings[0].offset);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;q_obytes[i]&nbsp;=&nbsp;*(uint64_t&nbsp;*)(((char&nbsp;*)txvq)&nbsp;+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_txq_stat_strings[1].offset);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;q_errors[i]&nbsp;+=&nbsp;*(uint64_t&nbsp;*)(((char&nbsp;*)txvq)&nbsp;+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_txq_stat_strings[2].offset);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;q_errors[i]&nbsp;+=&nbsp;*(uint64_t&nbsp;*)(((char&nbsp;*)txvq)&nbsp;+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_txq_stat_strings[5].offset);<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />+}<br />+<br />+static&nbsp;int&nbsp;zxdh_hw_stats_reset(struct&nbsp;rte_eth_dev&nbsp;*dev,&nbsp;enum&nbsp;zxdh_agent_msg_type&nbsp;opcode)<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;struct&nbsp;zxdh_msg_info&nbsp;msg_info&nbsp;=&nbsp;{0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_msg_reply_info&nbsp;reply_info&nbsp;=&nbsp;{0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;enum&nbsp;ZXDH_BAR_MODULE_ID&nbsp;module_id;<br />+&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ret&nbsp;=&nbsp;0;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(opcode)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;ZXDH_VQM_DEV_STATS_RESET:<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;module_id&nbsp;=&nbsp;ZXDH_BAR_MODULE_VQM;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />+&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;ZXDH_MAC_STATS_RESET:<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;module_id&nbsp;=&nbsp;ZXDH_BAR_MODULE_MAC;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />+&nbsp;&nbsp;&nbsp;&nbsp;default:<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;invalid&nbsp;opcode&nbsp;%u&quot;,&nbsp;opcode);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;zxdh_agent_msg_build(hw,&nbsp;opcode,&nbsp;&amp;msg_info);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;zxdh_send_msg_to_riscv(dev,&nbsp;&amp;msg_info,&nbsp;sizeof(struct&nbsp;zxdh_msg_info),<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;reply_info,&nbsp;sizeof(struct&nbsp;zxdh_msg_reply_info),&nbsp;module_id);<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;Failed&nbsp;to&nbsp;reset&nbsp;hw&nbsp;stats&quot;);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />+}<br />+<br />+int&nbsp;zxdh_dev_stats_reset(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 />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;zxdh_hw_stats_reset(dev,&nbsp;ZXDH_VQM_DEV_STATS_RESET);<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hw-&gt;is_pf)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_hw_stats_reset(dev,&nbsp;ZXDH_MAC_STATS_RESET);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<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;860716d079..f35378e691&nbsp;100644<br />---&nbsp;a/drivers/net/zxdh/zxdh_ethdev_ops.h<br />+++&nbsp;b/drivers/net/zxdh/zxdh_ethdev_ops.h<br />@@&nbsp;-5,6&nbsp;+5,8&nbsp;@@<br />&nbsp;#ifndef&nbsp;ZXDH_ETHDEV_OPS_H<br />&nbsp;#define&nbsp;ZXDH_ETHDEV_OPS_H<br />&nbsp;
<br />+#include&nbsp;&lt;stdint.h&gt;
<br />+<br />&nbsp;#include&nbsp;&lt;rte_ether.h&gt;
<br />&nbsp;
<br />&nbsp;#include&nbsp;&quot;zxdh_ethdev.h&quot;
<br />@@&nbsp;-24,6&nbsp;+26,29&nbsp;@@<br />&nbsp;#define&nbsp;ZXDH_HF_MAC_VLAN_ETH&nbsp;&nbsp;ZXDH_ETH_RSS_L2<br />&nbsp;#define&nbsp;ZXDH_RSS_HF&nbsp;&nbsp;((ZXDH_HF_MAC_VLAN_ETH&nbsp;|&nbsp;ZXDH_HF_F3_ETH&nbsp;|&nbsp;ZXDH_HF_F5_ETH))<br />&nbsp;
<br />+struct&nbsp;zxdh_hw_vqm_stats&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_total;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_total;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_bytes;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_bytes;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_error;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;tx_error;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;rx_drop;<br />+}&nbsp;__rte_packed;<br />+<br />+struct&nbsp;zxdh_hw_np_stats&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;np_rx_broadcast;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;np_tx_broadcast;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;np_rx_mtu_drop_pkts;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;np_tx_mtu_drop_pkts;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;np_rx_mtu_drop_bytes;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;np_tx_mtu_drop_bytes;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;np_rx_mtr_drop_pkts;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;np_tx_mtr_drop_pkts;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;np_rx_mtr_drop_bytes;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;np_tx_mtr_drop_bytes;<br />+};<br />+<br />&nbsp;int&nbsp;zxdh_dev_set_link_up(struct&nbsp;rte_eth_dev&nbsp;*dev);<br />&nbsp;int&nbsp;zxdh_dev_set_link_down(struct&nbsp;rte_eth_dev&nbsp;*dev);<br />&nbsp;int32_t&nbsp;zxdh_dev_link_update(struct&nbsp;rte_eth_dev&nbsp;*dev,&nbsp;int32_t&nbsp;wait_to_complete&nbsp;__rte_unused);<br />@@&nbsp;-46,5&nbsp;+71,7&nbsp;@@&nbsp;int&nbsp;zxdh_dev_rss_reta_query(struct&nbsp;rte_eth_dev&nbsp;*dev,<br />&nbsp;int&nbsp;zxdh_rss_hash_update(struct&nbsp;rte_eth_dev&nbsp;*dev,&nbsp;struct&nbsp;rte_eth_rss_conf&nbsp;*rss_conf);<br />&nbsp;int&nbsp;zxdh_rss_hash_conf_get(struct&nbsp;rte_eth_dev&nbsp;*dev,&nbsp;struct&nbsp;rte_eth_rss_conf&nbsp;*rss_conf);<br />&nbsp;int&nbsp;zxdh_rss_configure(struct&nbsp;rte_eth_dev&nbsp;*dev);<br />+int&nbsp;zxdh_dev_stats_get(struct&nbsp;rte_eth_dev&nbsp;*dev,&nbsp;struct&nbsp;rte_eth_stats&nbsp;*stats);<br />+int&nbsp;zxdh_dev_stats_reset(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;45a9b10aa4..159c8c9c71&nbsp;100644<br />---&nbsp;a/drivers/net/zxdh/zxdh_msg.h<br />+++&nbsp;b/drivers/net/zxdh/zxdh_msg.h<br />@@&nbsp;-9,10&nbsp;+9,16&nbsp;@@<br />&nbsp;
<br />&nbsp;#include&nbsp;&lt;ethdev_driver.h&gt;
<br />&nbsp;
<br />+#include&nbsp;&quot;zxdh_ethdev_ops.h&quot;
<br />+<br />&nbsp;#define&nbsp;ZXDH_BAR0_INDEX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br />&nbsp;#define&nbsp;ZXDH_CTRLCH_OFFSET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0x2000)<br />&nbsp;#define&nbsp;ZXDH_MSG_CHAN_PFVFSHARE_OFFSET&nbsp;&nbsp;(ZXDH_CTRLCH_OFFSET&nbsp;+&nbsp;0x1000)<br />&nbsp;
<br />+#define&nbsp;ZXDH_MAC_OFFSET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0x24000)<br />+#define&nbsp;ZXDH_MAC_STATS_OFFSET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0x1408)<br />+#define&nbsp;ZXDH_MAC_BYTES_OFFSET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0xb000)<br />+<br />&nbsp;#define&nbsp;ZXDH_MSIX_INTR_MSG_VEC_BASE&nbsp;&nbsp;&nbsp;1<br />&nbsp;#define&nbsp;ZXDH_MSIX_INTR_MSG_VEC_NUM&nbsp;&nbsp;&nbsp;&nbsp;3<br />&nbsp;#define&nbsp;ZXDH_MSIX_INTR_DTB_VEC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ZXDH_MSIX_INTR_MSG_VEC_BASE&nbsp;+&nbsp;ZXDH_MSIX_INTR_MSG_VEC_NUM)<br />@@&nbsp;-173,7&nbsp;+179,13&nbsp;@@&nbsp;enum&nbsp;pciebar_layout_type&nbsp;{<br />&nbsp;
<br />&nbsp;/*&nbsp;riscv&nbsp;msg&nbsp;opcodes&nbsp;*/<br />&nbsp;enum&nbsp;zxdh_agent_msg_type&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_MAC_STATS_GET&nbsp;=&nbsp;10,<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_MAC_STATS_RESET,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_MAC_LINK_GET&nbsp;=&nbsp;14,<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_VQM_DEV_STATS_GET&nbsp;=&nbsp;21,<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_VQM_DEV_STATS_RESET,<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_VQM_QUEUE_STATS_GET&nbsp;=&nbsp;24,<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_VQM_QUEUE_STATS_RESET,<br />&nbsp;};<br />&nbsp;
<br />&nbsp;enum&nbsp;zxdh_msg_type&nbsp;{<br />@@&nbsp;-195,6&nbsp;+207,8&nbsp;@@&nbsp;enum&nbsp;zxdh_msg_type&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_PORT_ATTRS_SET&nbsp;=&nbsp;25,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_PORT_PROMISC_SET&nbsp;=&nbsp;26,<br />&nbsp;
<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_GET_NP_STATS&nbsp;=&nbsp;31,<br />+<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_MSG_TYPE_END,<br />&nbsp;};<br />&nbsp;
<br />@@&nbsp;-322,6&nbsp;+336,8&nbsp;@@&nbsp;struct&nbsp;zxdh_msg_reply_body&nbsp;{<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_rss_hf&nbsp;rss_hf;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_rss_reta&nbsp;rss_reta;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_hw_vqm_stats&nbsp;vqm_stats;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_hw_np_stats&nbsp;np_stats;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;__rte_packed;<br />&nbsp;}&nbsp;__rte_packed;<br />&nbsp;
<br />diff&nbsp;--git&nbsp;a/drivers/net/zxdh/zxdh_np.c&nbsp;b/drivers/net/zxdh/zxdh_np.c<br />index&nbsp;1f06539263..42679635f4&nbsp;100644<br />---&nbsp;a/drivers/net/zxdh/zxdh_np.c<br />+++&nbsp;b/drivers/net/zxdh/zxdh_np.c<br />@@&nbsp;-26,6&nbsp;+26,7&nbsp;@@&nbsp;ZXDH_TLB_MGR_T&nbsp;*g_p_dpp_tlb_mgr[ZXDH_DEV_CHANNEL_MAX];<br />&nbsp;ZXDH_REG_T&nbsp;g_dpp_reg_info[4];<br />&nbsp;ZXDH_DTB_TABLE_T&nbsp;g_dpp_dtb_table_info[4];<br />&nbsp;ZXDH_SDT_TBL_DATA_T&nbsp;g_sdt_info[ZXDH_DEV_CHANNEL_MAX][ZXDH_DEV_SDT_ID_MAX];<br />+ZXDH_PPU_STAT_CFG_T&nbsp;g_ppu_stat_cfg;<br />&nbsp;
<br />&nbsp;#define&nbsp;ZXDH_SDT_MGR_PTR_GET()&nbsp;&nbsp;&nbsp;&nbsp;(&amp;g_sdt_mgr)<br />&nbsp;#define&nbsp;ZXDH_SDT_SOFT_TBL_GET(id)&nbsp;(g_sdt_mgr.sdt_tbl_array[id])<br />@@&nbsp;-117,6&nbsp;+118,18&nbsp;@@&nbsp;do&nbsp;{\<br />&nbsp;#define&nbsp;ZXDH_COMM_CONVERT16(w_data)&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(((w_data)&nbsp;&amp;&nbsp;0xff)&nbsp;&lt;&lt;&nbsp;8)<br />&nbsp;
<br />+#define&nbsp;ZXDH_DTB_TAB_UP_WR_INDEX_GET(DEV_ID,&nbsp;QUEUE_ID)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(p_dpp_dtb_mgr[(DEV_ID)]-&gt;queue_info[(QUEUE_ID)].tab_up.wr_index)<br />+<br />+#define&nbsp;ZXDH_DTB_TAB_UP_USER_PHY_ADDR_FLAG_GET(DEV_ID,&nbsp;QUEUE_ID,&nbsp;INDEX)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br />+&nbsp;&nbsp;&nbsp;&nbsp;(p_dpp_dtb_mgr[(DEV_ID)]-&gt;queue_info[(QUEUE_ID)].tab_up.user_addr[(INDEX)].user_flag)<br />+<br />+#define&nbsp;ZXDH_DTB_TAB_UP_USER_PHY_ADDR_GET(DEV_ID,&nbsp;QUEUE_ID,&nbsp;INDEX)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(p_dpp_dtb_mgr[(DEV_ID)]-&gt;queue_info[(QUEUE_ID)].tab_up.user_addr[(INDEX)].phy_addr)<br />+<br />+#define&nbsp;ZXDH_DTB_TAB_UP_DATA_LEN_GET(DEV_ID,&nbsp;QUEUE_ID,&nbsp;INDEX)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(p_dpp_dtb_mgr[(DEV_ID)]-&gt;queue_info[(QUEUE_ID)].tab_up.data_len[(INDEX)])<br />+<br />&nbsp;#define&nbsp;ZXDH_DTB_TAB_UP_VIR_ADDR_GET(DEV_ID,&nbsp;QUEUE_ID,&nbsp;INDEX)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((INDEX)&nbsp;*&nbsp;p_dpp_dtb_mgr[(DEV_ID)]-&gt;queue_info[(QUEUE_ID)].tab_up.item_size)<br />&nbsp;
<br />@@&nbsp;-1717,3&nbsp;+1730,331&nbsp;@@&nbsp;zxdh_np_dtb_table_entry_get(uint32_t&nbsp;dev_id,<br />&nbsp;
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;}<br />+<br />+static&nbsp;void<br />+zxdh_np_stat_cfg_soft_get(uint32_t&nbsp;dev_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_PPU_STAT_CFG_T&nbsp;*p_stat_cfg)<br />+{<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_COMM_CHECK_DEV_POINT(dev_id,&nbsp;p_stat_cfg);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;p_stat_cfg-&gt;ddr_base_addr&nbsp;=&nbsp;g_ppu_stat_cfg.ddr_base_addr;<br />+&nbsp;&nbsp;&nbsp;&nbsp;p_stat_cfg-&gt;eram_baddr&nbsp;=&nbsp;g_ppu_stat_cfg.eram_baddr;<br />+&nbsp;&nbsp;&nbsp;&nbsp;p_stat_cfg-&gt;eram_depth&nbsp;=&nbsp;g_ppu_stat_cfg.eram_depth;<br />+&nbsp;&nbsp;&nbsp;&nbsp;p_stat_cfg-&gt;ppu_addr_offset&nbsp;=&nbsp;g_ppu_stat_cfg.ppu_addr_offset;<br />+}<br />+<br />+static&nbsp;uint32_t<br />+zxdh_np_dtb_tab_up_info_set(uint32_t&nbsp;dev_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;queue_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;item_index,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;int_flag,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;data_len,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;desc_len,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;*p_desc_data)<br />+{<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_QUEUE_ITEM_INFO_T&nbsp;item_info&nbsp;=&nbsp;{0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;queue_en&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;rc;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;zxdh_np_dtb_queue_enable_get(dev_id,&nbsp;queue_id,&nbsp;&amp;queue_en);<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!queue_en)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;the&nbsp;queue&nbsp;%d&nbsp;is&nbsp;not&nbsp;enable!&quot;,&nbsp;queue_id);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ZXDH_RC_DTB_QUEUE_NOT_ENABLE;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ZXDH_DTB_QUEUE_INIT_FLAG_GET(dev_id,&nbsp;queue_id)&nbsp;==&nbsp;0)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;dtb&nbsp;queue&nbsp;%d&nbsp;is&nbsp;not&nbsp;init.&quot;,&nbsp;queue_id);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ZXDH_RC_DTB_QUEUE_IS_NOT_INIT;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(desc_len&nbsp;%&nbsp;4&nbsp;!=&nbsp;0)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ZXDH_RC_DTB_PARA_INVALID;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;zxdh_np_dtb_item_buff_wr(dev_id,&nbsp;queue_id,&nbsp;ZXDH_DTB_DIR_UP_TYPE,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item_index,&nbsp;0,&nbsp;desc_len,&nbsp;p_desc_data);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_TAB_UP_DATA_LEN_GET(dev_id,&nbsp;queue_id,&nbsp;item_index)&nbsp;=&nbsp;data_len;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;item_info.cmd_vld&nbsp;=&nbsp;1;<br />+&nbsp;&nbsp;&nbsp;&nbsp;item_info.cmd_type&nbsp;=&nbsp;ZXDH_DTB_DIR_UP_TYPE;<br />+&nbsp;&nbsp;&nbsp;&nbsp;item_info.int_en&nbsp;=&nbsp;int_flag;<br />+&nbsp;&nbsp;&nbsp;&nbsp;item_info.data_len&nbsp;=&nbsp;desc_len&nbsp;/&nbsp;4;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(zxdh_np_dev_get_dev_type(dev_id)&nbsp;==&nbsp;ZXDH_DEV_TYPE_SIM)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;=&nbsp;zxdh_np_dtb_queue_item_info_set(dev_id,&nbsp;queue_id,&nbsp;&amp;item_info);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;rc;<br />+}<br />+<br />+static&nbsp;uint32_t<br />+zxdh_np_dtb_write_dump_desc_info(uint32_t&nbsp;dev_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;queue_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;queue_element_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;*p_dump_info,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;data_len,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;desc_len,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;*p_dump_data)<br />+{<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;dtb_interrupt_status&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;rc;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_COMM_CHECK_POINT(p_dump_data);<br />+&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;=&nbsp;zxdh_np_dtb_tab_up_info_set(dev_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue_element_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dtb_interrupt_status,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data_len,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;desc_len,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_dump_info);<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rc&nbsp;!=&nbsp;0)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;the&nbsp;queue&nbsp;%d&nbsp;element&nbsp;id&nbsp;%d&nbsp;dump&quot;
<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&nbsp;info&nbsp;set&nbsp;failed!&quot;,&nbsp;queue_id,&nbsp;queue_element_id);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_np_dtb_item_ack_wr(dev_id,&nbsp;queue_id,&nbsp;ZXDH_DTB_DIR_UP_TYPE,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue_element_id,&nbsp;0,&nbsp;ZXDH_DTB_TAB_ACK_UNUSED_MASK);<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;rc;<br />+}<br />+<br />+static&nbsp;uint32_t<br />+zxdh_np_dtb_tab_up_free_item_get(uint32_t&nbsp;dev_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;queue_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;*p_item_index)<br />+{<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;ack_vale&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;item_index&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;unused_item_num&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;i;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ZXDH_DTB_QUEUE_INIT_FLAG_GET(dev_id,&nbsp;queue_id)&nbsp;==&nbsp;0)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;dtb&nbsp;queue&nbsp;%d&nbsp;is&nbsp;not&nbsp;init.&quot;,&nbsp;queue_id);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ZXDH_RC_DTB_QUEUE_IS_NOT_INIT;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;zxdh_np_dtb_queue_unused_item_num_get(dev_id,&nbsp;queue_id,&nbsp;&amp;unused_item_num);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(unused_item_num&nbsp;==&nbsp;0)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ZXDH_RC_DTB_QUEUE_ITEM_HW_EMPTY;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;ZXDH_DTB_QUEUE_ITEM_NUM_MAX;&nbsp;i++)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item_index&nbsp;=&nbsp;ZXDH_DTB_TAB_UP_WR_INDEX_GET(dev_id,&nbsp;queue_id)&nbsp;%<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_QUEUE_ITEM_NUM_MAX;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_np_dtb_item_ack_rd(dev_id,&nbsp;queue_id,&nbsp;ZXDH_DTB_DIR_UP_TYPE,&nbsp;item_index,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&amp;ack_vale);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_TAB_UP_WR_INDEX_GET(dev_id,&nbsp;queue_id)++;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((ack_vale&nbsp;&gt;&gt;&nbsp;8)&nbsp;==&nbsp;ZXDH_DTB_TAB_ACK_UNUSED_MASK)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(i&nbsp;==&nbsp;ZXDH_DTB_QUEUE_ITEM_NUM_MAX)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ZXDH_RC_DTB_QUEUE_ITEM_SW_EMPTY;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;zxdh_np_dtb_item_ack_wr(dev_id,&nbsp;queue_id,&nbsp;ZXDH_DTB_DIR_UP_TYPE,&nbsp;item_index,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;ZXDH_DTB_TAB_ACK_IS_USING_MASK);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;*p_item_index&nbsp;=&nbsp;item_index;<br />+<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />+}<br />+<br />+static&nbsp;uint32_t<br />+zxdh_np_dtb_tab_up_item_addr_get(uint32_t&nbsp;dev_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;queue_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;item_index,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;*p_phy_haddr,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;*p_phy_laddr)<br />+{<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;rc&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint64_t&nbsp;addr;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ZXDH_DTB_QUEUE_INIT_FLAG_GET(dev_id,&nbsp;queue_id)&nbsp;==&nbsp;0)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;dtb&nbsp;queue&nbsp;%d&nbsp;is&nbsp;not&nbsp;init.&quot;,&nbsp;queue_id);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ZXDH_RC_DTB_QUEUE_IS_NOT_INIT;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ZXDH_DTB_TAB_UP_USER_PHY_ADDR_FLAG_GET(dev_id,&nbsp;queue_id,&nbsp;item_index)&nbsp;==<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_TAB_UP_USER_ADDR_TYPE)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr&nbsp;=&nbsp;ZXDH_DTB_TAB_UP_USER_PHY_ADDR_GET(dev_id,&nbsp;queue_id,&nbsp;item_index);<br />+&nbsp;&nbsp;&nbsp;&nbsp;else<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr&nbsp;=&nbsp;ZXDH_DTB_ITEM_ACK_SIZE;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;*p_phy_haddr&nbsp;=&nbsp;(addr&nbsp;&gt;&gt;&nbsp;32)&nbsp;&amp;&nbsp;0xffffffff;<br />+&nbsp;&nbsp;&nbsp;&nbsp;*p_phy_laddr&nbsp;=&nbsp;addr&nbsp;&amp;&nbsp;0xffffffff;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;rc;<br />+}<br />+<br />+static&nbsp;uint32_t<br />+zxdh_np_dtb_se_smmu0_dma_dump(uint32_t&nbsp;dev_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;queue_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;base_addr,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;depth,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;*p_data,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;*element_id)<br />+{<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;form_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT&nbsp;/&nbsp;8]&nbsp;=&nbsp;{0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;dump_dst_phy_haddr&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;dump_dst_phy_laddr&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;queue_item_index&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;data_len;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;desc_len;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;rc;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;=&nbsp;zxdh_np_dtb_tab_up_free_item_get(dev_id,&nbsp;queue_id,&nbsp;&amp;queue_item_index);<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rc&nbsp;!=&nbsp;0)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_DRV_LOG(ERR,&nbsp;&quot;dpp_dtb_tab_up_free_item_get&nbsp;failed&nbsp;=&nbsp;%d!&quot;,&nbsp;base_addr);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ZXDH_RC_DTB_QUEUE_ITEM_SW_EMPTY;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;*element_id&nbsp;=&nbsp;queue_item_index;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;=&nbsp;zxdh_np_dtb_tab_up_item_addr_get(dev_id,&nbsp;queue_id,&nbsp;queue_item_index,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;dump_dst_phy_haddr,&nbsp;&amp;dump_dst_phy_laddr);<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_COMM_CHECK_RC_NO_ASSERT(rc,&nbsp;&quot;dpp_dtb_tab_up_item_addr_get&quot;);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;data_len&nbsp;=&nbsp;depth&nbsp;*&nbsp;128&nbsp;/&nbsp;32;<br />+&nbsp;&nbsp;&nbsp;&nbsp;desc_len&nbsp;=&nbsp;ZXDH_DTB_LEN_POS_SETP&nbsp;/&nbsp;4;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;=&nbsp;zxdh_np_dtb_write_dump_desc_info(dev_id,&nbsp;queue_id,&nbsp;queue_item_index,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(uint32_t&nbsp;*)form_buff,&nbsp;data_len,&nbsp;desc_len,&nbsp;p_data);<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_COMM_CHECK_RC_NO_ASSERT(rc,&nbsp;&quot;dpp_dtb_write_dump_desc_info&quot;);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;rc;<br />+}<br />+<br />+static&nbsp;uint32_t<br />+zxdh_np_dtb_se_smmu0_ind_read(uint32_t&nbsp;dev_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;queue_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;base_addr,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;index,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;rd_mode,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;*p_data)<br />+{<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;temp_data[4]&nbsp;=&nbsp;{0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;element_id&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;row_index&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;col_index&nbsp;=&nbsp;0;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;eram_dump_base_addr;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;rc;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(rd_mode)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;ZXDH_ERAM128_OPR_128b:<br />+&nbsp;&nbsp;&nbsp;&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row_index&nbsp;=&nbsp;index;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;ZXDH_ERAM128_OPR_64b:<br />+&nbsp;&nbsp;&nbsp;&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row_index&nbsp;=&nbsp;(index&nbsp;&gt;&gt;&nbsp;1);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col_index&nbsp;=&nbsp;index&nbsp;&amp;&nbsp;0x1;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;ZXDH_ERAM128_OPR_1b:<br />+&nbsp;&nbsp;&nbsp;&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row_index&nbsp;=&nbsp;(index&nbsp;&gt;&gt;&nbsp;7);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col_index&nbsp;=&nbsp;index&nbsp;&amp;&nbsp;0x7F;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;eram_dump_base_addr&nbsp;=&nbsp;base_addr&nbsp;+&nbsp;row_index;<br />+&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;=&nbsp;zxdh_np_dtb_se_smmu0_dma_dump(dev_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eram_dump_base_addr,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp_data,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;element_id);<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_COMM_CHECK_RC_NO_ASSERT(rc,&nbsp;&quot;zxdh_np_dtb_se_smmu0_dma_dump&quot;);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(rd_mode)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;ZXDH_ERAM128_OPR_128b:<br />+&nbsp;&nbsp;&nbsp;&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(p_data,&nbsp;temp_data,&nbsp;(128&nbsp;/&nbsp;8));<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;ZXDH_ERAM128_OPR_64b:<br />+&nbsp;&nbsp;&nbsp;&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(p_data,&nbsp;temp_data&nbsp;+&nbsp;((1&nbsp;-&nbsp;col_index)&nbsp;&lt;&lt;&nbsp;1),&nbsp;(64&nbsp;/&nbsp;8));<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;ZXDH_ERAM128_OPR_1b:<br />+&nbsp;&nbsp;&nbsp;&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_COMM_UINT32_GET_BITS(p_data[0],&nbsp;*(temp_data&nbsp;+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(3&nbsp;-&nbsp;col_index&nbsp;/&nbsp;32)),&nbsp;(col_index&nbsp;%&nbsp;32),&nbsp;1);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;rc;<br />+}<br />+<br />+static&nbsp;uint32_t<br />+zxdh_np_dtb_stat_smmu0_int_read(uint32_t&nbsp;dev_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;queue_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;smmu0_base_addr,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_STAT_CNT_MODE_E&nbsp;rd_mode,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;index,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;*p_data)<br />+{<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;eram_rd_mode;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;rc;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_COMM_CHECK_DEV_POINT(dev_id,&nbsp;p_data);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rd_mode&nbsp;==&nbsp;ZXDH_STAT_128_MODE)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eram_rd_mode&nbsp;=&nbsp;ZXDH_ERAM128_OPR_128b;<br />+&nbsp;&nbsp;&nbsp;&nbsp;else<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eram_rd_mode&nbsp;=&nbsp;ZXDH_ERAM128_OPR_64b;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;=&nbsp;zxdh_np_dtb_se_smmu0_ind_read(dev_id,<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue_id,<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;smmu0_base_addr,<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index,<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eram_rd_mode,<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_data);<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_COMM_CHECK_RC_NO_ASSERT(rc,&nbsp;&quot;zxdh_np_dtb_se_smmu0_ind_read&quot;);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;rc;<br />+}<br />+<br />+int<br />+zxdh_np_dtb_stats_get(uint32_t&nbsp;dev_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;queue_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_STAT_CNT_MODE_E&nbsp;rd_mode,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;index,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;*p_data)<br />+{<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_PPU_STAT_CFG_T&nbsp;stat_cfg&nbsp;=&nbsp;{0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;ppu_eram_baddr;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;ppu_eram_depth;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;rc&nbsp;=&nbsp;0;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_COMM_CHECK_DEV_POINT(dev_id,&nbsp;p_data);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;memset(&amp;stat_cfg,&nbsp;0x0,&nbsp;sizeof(stat_cfg));<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;zxdh_np_stat_cfg_soft_get(dev_id,&nbsp;&amp;stat_cfg);<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;ppu_eram_depth&nbsp;=&nbsp;stat_cfg.eram_depth;<br />+&nbsp;&nbsp;&nbsp;&nbsp;ppu_eram_baddr&nbsp;=&nbsp;stat_cfg.eram_baddr;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((index&nbsp;&gt;&gt;&nbsp;(ZXDH_STAT_128_MODE&nbsp;-&nbsp;rd_mode))&nbsp;&lt;&nbsp;ppu_eram_depth)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;=&nbsp;zxdh_np_dtb_stat_smmu0_int_read(dev_id,<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue_id,<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ppu_eram_baddr,<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rd_mode,<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index,<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_data);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_COMM_CHECK_RC_NO_ASSERT(rc,&nbsp;&quot;dpp_dtb_stat_smmu0_int_read&quot;);<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;rc;<br />+}<br />diff&nbsp;--git&nbsp;a/drivers/net/zxdh/zxdh_np.h&nbsp;b/drivers/net/zxdh/zxdh_np.h<br />index&nbsp;19d1f03f59..7da29cf7bd&nbsp;100644<br />---&nbsp;a/drivers/net/zxdh/zxdh_np.h<br />+++&nbsp;b/drivers/net/zxdh/zxdh_np.h<br />@@&nbsp;-432,6&nbsp;+432,18&nbsp;@@&nbsp;typedef&nbsp;enum&nbsp;zxdh_sdt_table_type_e&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_SDT_TBLT_MAX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;7,<br />&nbsp;}&nbsp;ZXDH_SDT_TABLE_TYPE_E;<br />&nbsp;
<br />+typedef&nbsp;enum&nbsp;zxdh_dtb_dir_type_e&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_DIR_DOWN_TYPE&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0,<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_DIR_UP_TYPE&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;1,<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_DIR_TYPE_MAX,<br />+}&nbsp;ZXDH_DTB_DIR_TYPE_E;<br />+<br />+typedef&nbsp;enum&nbsp;zxdh_dtb_tab_up_user_addr_type_e&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_TAB_UP_NOUSER_ADDR_TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0,<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_TAB_UP_USER_ADDR_TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;1,<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_TAB_UP_USER_ADDR_TYPE_MAX,<br />+}&nbsp;ZXDH_DTB_TAB_UP_USER_ADDR_TYPE_E;<br />+<br />&nbsp;typedef&nbsp;struct&nbsp;zxdh_dtb_lpm_entry_t&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;dtb_len0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;*p_data_buff0;<br />@@&nbsp;-537,6&nbsp;+549,19&nbsp;@@&nbsp;typedef&nbsp;struct&nbsp;zxdh_dtb_hash_entry_info_t&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;*p_rst;<br />&nbsp;}&nbsp;ZXDH_DTB_HASH_ENTRY_INFO_T;<br />&nbsp;
<br />+typedef&nbsp;struct&nbsp;zxdh_ppu_stat_cfg_t&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;eram_baddr;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;eram_depth;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;ddr_base_addr;<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;ppu_addr_offset;<br />+}&nbsp;ZXDH_PPU_STAT_CFG_T;<br />+<br />+typedef&nbsp;enum&nbsp;zxdh_stat_cnt_mode_e&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_STAT_64_MODE&nbsp;&nbsp;=&nbsp;0,<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_STAT_128_MODE&nbsp;=&nbsp;1,<br />+&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_STAT_MAX_MODE,<br />+}&nbsp;ZXDH_STAT_CNT_MODE_E;<br />+<br />&nbsp;int&nbsp;zxdh_np_host_init(uint32_t&nbsp;dev_id,&nbsp;ZXDH_DEV_INIT_CTRL_T&nbsp;*p_dev_init_ctrl);<br />&nbsp;int&nbsp;zxdh_np_online_uninit(uint32_t&nbsp;dev_id,&nbsp;char&nbsp;*port_name,&nbsp;uint32_t&nbsp;queue_id);<br />&nbsp;int&nbsp;zxdh_np_dtb_table_entry_write(uint32_t&nbsp;dev_id,&nbsp;uint32_t&nbsp;queue_id,<br />@@&nbsp;-545,5&nbsp;+570,10&nbsp;@@&nbsp;int&nbsp;zxdh_np_dtb_table_entry_delete(uint32_t&nbsp;dev_id,&nbsp;uint32_t&nbsp;queue_id,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;entrynum,&nbsp;ZXDH_DTB_USER_ENTRY_T&nbsp;*delete_entries);<br />&nbsp;int&nbsp;zxdh_np_dtb_table_entry_get(uint32_t&nbsp;dev_id,&nbsp;uint32_t&nbsp;queue_id,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_DTB_USER_ENTRY_T&nbsp;*get_entry,&nbsp;uint32_t&nbsp;srh_mode);<br />+int&nbsp;zxdh_np_dtb_stats_get(uint32_t&nbsp;dev_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;queue_id,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_STAT_CNT_MODE_E&nbsp;rd_mode,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;index,<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;*p_data);<br />&nbsp;
<br />&nbsp;#endif&nbsp;/*&nbsp;ZXDH_NP_H&nbsp;*/<br />diff&nbsp;--git&nbsp;a/drivers/net/zxdh/zxdh_queue.h&nbsp;b/drivers/net/zxdh/zxdh_queue.h<br />index&nbsp;9343df81ac..deb0dd891a&nbsp;100644<br />---&nbsp;a/drivers/net/zxdh/zxdh_queue.h<br />+++&nbsp;b/drivers/net/zxdh/zxdh_queue.h<br />@@&nbsp;-53,6&nbsp;+53,8&nbsp;@@&nbsp;enum&nbsp;{&nbsp;ZXDH_VTNET_RQ&nbsp;=&nbsp;0,&nbsp;ZXDH_VTNET_TQ&nbsp;=&nbsp;1&nbsp;};<br />&nbsp;#define&nbsp;ZXDH_PI_HDR_SIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sizeof(struct&nbsp;zxdh_pi_hdr)<br />&nbsp;#define&nbsp;ZXDH_DL_NET_HDR_SIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sizeof(struct&nbsp;zxdh_net_hdr_dl)<br />&nbsp;#define&nbsp;ZXDH_UL_NET_HDR_SIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sizeof(struct&nbsp;zxdh_net_hdr_ul)<br />+#define&nbsp;ZXDH_PD_HDR_SIZE_MAX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;256<br />+#define&nbsp;ZXDH_PD_HDR_SIZE_MIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZXDH_TYPE_HDR_SIZE<br />&nbsp;
<br />&nbsp;/*<br />&nbsp;&nbsp;*&nbsp;ring&nbsp;descriptors:&nbsp;16&nbsp;bytes.<br />diff&nbsp;--git&nbsp;a/drivers/net/zxdh/zxdh_rxtx.c&nbsp;b/drivers/net/zxdh/zxdh_rxtx.c<br />index&nbsp;0ffce50042..27a61d46dd&nbsp;100644<br />---&nbsp;a/drivers/net/zxdh/zxdh_rxtx.c<br />+++&nbsp;b/drivers/net/zxdh/zxdh_rxtx.c<br />@@&nbsp;-406,6&nbsp;+406,40&nbsp;@@&nbsp;static&nbsp;inline&nbsp;void&nbsp;zxdh_enqueue_xmit_packed(struct&nbsp;zxdh_virtnet_tx&nbsp;*txvq,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_queue_store_flags_packed(head_dp,&nbsp;head_flags,&nbsp;vq-&gt;hw-&gt;weak_barriers);<br />&nbsp;}<br />&nbsp;
<br />+static&nbsp;void<br />+zxdh_update_packet_stats(struct&nbsp;zxdh_virtnet_stats&nbsp;*stats,&nbsp;struct&nbsp;rte_mbuf&nbsp;*mbuf)<br />+{<br />+&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;s&nbsp;=&nbsp;mbuf-&gt;pkt_len;<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;rte_ether_addr&nbsp;*ea&nbsp;=&nbsp;NULL;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;bytes&nbsp;+=&nbsp;s;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(s&nbsp;==&nbsp;64)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;size_bins[1]++;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(s&nbsp;&gt;&nbsp;64&nbsp;&amp;&amp;&nbsp;s&nbsp;&lt;&nbsp;1024)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;bin;<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;count&nbsp;zeros,&nbsp;and&nbsp;offset&nbsp;into&nbsp;correct&nbsp;bin&nbsp;*/<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bin&nbsp;=&nbsp;(sizeof(s)&nbsp;*&nbsp;8)&nbsp;-&nbsp;rte_clz32(s)&nbsp;-&nbsp;5;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;size_bins[bin]++;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(s&nbsp;&lt;&nbsp;64)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;size_bins[0]++;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(s&nbsp;&lt;&nbsp;1519)<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;size_bins[6]++;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;size_bins[7]++;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+<br />+&nbsp;&nbsp;&nbsp;&nbsp;ea&nbsp;=&nbsp;rte_pktmbuf_mtod(mbuf,&nbsp;struct&nbsp;rte_ether_addr&nbsp;*);<br />+&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rte_is_multicast_ether_addr(ea))&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rte_is_broadcast_ether_addr(ea))<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;broadcast++;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stats-&gt;multicast++;<br />+&nbsp;&nbsp;&nbsp;&nbsp;}<br />+}<br />+<br />&nbsp;uint16_t<br />&nbsp;zxdh_xmit_pkts_packed(void&nbsp;*tx_queue,&nbsp;struct&nbsp;rte_mbuf&nbsp;**tx_pkts,&nbsp;uint16_t&nbsp;nb_pkts)<br />&nbsp;{<br />@@&nbsp;-459,12&nbsp;+493,19&nbsp;@@&nbsp;zxdh_xmit_pkts_packed(void&nbsp;*tx_queue,&nbsp;struct&nbsp;rte_mbuf&nbsp;**tx_pkts,&nbsp;uint16_t&nbsp;nb_pkt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(txm-&gt;nb_segs&nbsp;&gt;&nbsp;ZXDH_TX_MAX_SEGS)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_TX_LOG(ERR,&nbsp;&quot;%d&nbsp;segs&nbsp;&nbsp;dropped&quot;,&nbsp;txm-&gt;nb_segs);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txvq-&gt;stats.truncated_err&nbsp;+=&nbsp;nb_pkts&nbsp;-&nbsp;nb_tx;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Enqueue&nbsp;Packet&nbsp;buffers&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(can_push)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_enqueue_xmit_packed_fast(txvq,&nbsp;txm,&nbsp;in_order);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_enqueue_xmit_packed(txvq,&nbsp;txm,&nbsp;slots,&nbsp;use_indirect,&nbsp;in_order);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_update_packet_stats(&amp;txvq-&gt;stats,&nbsp;txm);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;txvq-&gt;stats.packets&nbsp;+=&nbsp;nb_tx;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(likely(nb_tx))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(unlikely(zxdh_queue_kick_prepare_packed(vq)))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_queue_notify(vq);<br />@@&nbsp;-474,9&nbsp;+515,10&nbsp;@@&nbsp;zxdh_xmit_pkts_packed(void&nbsp;*tx_queue,&nbsp;struct&nbsp;rte_mbuf&nbsp;**tx_pkts,&nbsp;uint16_t&nbsp;nb_pkt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;nb_tx;<br />&nbsp;}<br />&nbsp;
<br />-uint16_t&nbsp;zxdh_xmit_pkts_prepare(void&nbsp;*tx_queue&nbsp;__rte_unused,&nbsp;struct&nbsp;rte_mbuf&nbsp;**tx_pkts,<br />+uint16_t&nbsp;zxdh_xmit_pkts_prepare(void&nbsp;*tx_queue,&nbsp;struct&nbsp;rte_mbuf&nbsp;**tx_pkts,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint16_t&nbsp;nb_pkts)<br />&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_virtnet_tx&nbsp;*txvq&nbsp;=&nbsp;tx_queue;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint16_t&nbsp;nb_tx;<br />&nbsp;
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(nb_tx&nbsp;=&nbsp;0;&nbsp;nb_tx&nbsp;&lt;&nbsp;nb_pkts;&nbsp;nb_tx++)&nbsp;{<br />@@&nbsp;-496,6&nbsp;+538,12&nbsp;@@&nbsp;uint16_t&nbsp;zxdh_xmit_pkts_prepare(void&nbsp;*tx_queue&nbsp;__rte_unused,&nbsp;struct&nbsp;rte_mbuf&nbsp;**t<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rte_errno&nbsp;=&nbsp;-error;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(m-&gt;nb_segs&nbsp;&gt;&nbsp;ZXDH_TX_MAX_SEGS)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_TX_LOG(ERR,&nbsp;&quot;%d&nbsp;segs&nbsp;dropped&quot;,&nbsp;m-&gt;nb_segs);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txvq-&gt;stats.truncated_err&nbsp;+=&nbsp;nb_pkts&nbsp;-&nbsp;nb_tx;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rte_errno&nbsp;=&nbsp;ENOMEM;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;nb_tx;<br />&nbsp;}<br />@@&nbsp;-571,7&nbsp;+619,7&nbsp;@@&nbsp;static&nbsp;int32_t&nbsp;zxdh_rx_update_mbuf(struct&nbsp;rte_mbuf&nbsp;*m,&nbsp;struct&nbsp;zxdh_net_hdr_ul&nbsp;*h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;}<br />&nbsp;
<br />-static&nbsp;inline&nbsp;void&nbsp;zxdh_discard_rxbuf(struct&nbsp;zxdh_virtqueue&nbsp;*vq,&nbsp;struct&nbsp;rte_mbuf&nbsp;*m)<br />+static&nbsp;void&nbsp;zxdh_discard_rxbuf(struct&nbsp;zxdh_virtqueue&nbsp;*vq,&nbsp;struct&nbsp;rte_mbuf&nbsp;*m)<br />&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int32_t&nbsp;error&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*<br />@@&nbsp;-613,7&nbsp;+661,13&nbsp;@@&nbsp;uint16_t&nbsp;zxdh_recv_pkts_packed(void&nbsp;*rx_queue,&nbsp;struct&nbsp;rte_mbuf&nbsp;**rx_pkts,<br />&nbsp;
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;num;&nbsp;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rxm&nbsp;=&nbsp;rcv_pkts[i];<br />-<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(unlikely(len[i]&nbsp;&lt;&nbsp;ZXDH_UL_NET_HDR_SIZE))&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nb_enqueued++;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_RX_LOG(ERR,&nbsp;&quot;RX,&nbsp;len:%u&nbsp;err&quot;,&nbsp;len[i]);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_discard_rxbuf(vq,&nbsp;rxm);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rxvq-&gt;stats.errors++;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;zxdh_net_hdr_ul&nbsp;*header&nbsp;=<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(struct&nbsp;zxdh_net_hdr_ul&nbsp;*)((char&nbsp;*)rxm-&gt;buf_addr&nbsp;+<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RTE_PKTMBUF_HEADROOM);<br />@@&nbsp;-623,8&nbsp;+677,22&nbsp;@@&nbsp;uint16_t&nbsp;zxdh_recv_pkts_packed(void&nbsp;*rx_queue,&nbsp;struct&nbsp;rte_mbuf&nbsp;**rx_pkts,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_RX_LOG(ERR,&nbsp;&quot;dequeue&nbsp;%d&nbsp;pkt,&nbsp;No.%d&nbsp;pkt&nbsp;seg_num&nbsp;is&nbsp;%d&quot;,&nbsp;num,&nbsp;i,&nbsp;seg_num);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;seg_num&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(seg_num&nbsp;&gt;&nbsp;ZXDH_RX_MAX_SEGS)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_RX_LOG(ERR,&nbsp;&quot;dequeue&nbsp;%d&nbsp;pkt,&nbsp;No.%d&nbsp;pkt&nbsp;seg_num&nbsp;is&nbsp;%d&quot;,&nbsp;num,&nbsp;i,&nbsp;seg_num);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nb_enqueued++;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_discard_rxbuf(vq,&nbsp;rxm);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rxvq-&gt;stats.errors++;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;bit[0:6]-pd_len&nbsp;unit:2B&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint16_t&nbsp;pd_len&nbsp;=&nbsp;header-&gt;type_hdr.pd_len&nbsp;&lt;&lt;&nbsp;1;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(pd_len&nbsp;&gt;&nbsp;ZXDH_PD_HDR_SIZE_MAX&nbsp;||&nbsp;pd_len&nbsp;&lt;&nbsp;ZXDH_PD_HDR_SIZE_MIN)&nbsp;{<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_RX_LOG(ERR,&nbsp;&quot;pd_len:%d&nbsp;is&nbsp;invalid&quot;,&nbsp;pd_len);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nb_enqueued++;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_discard_rxbuf(vq,&nbsp;rxm);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rxvq-&gt;stats.errors++;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Private&nbsp;queue&nbsp;only&nbsp;handle&nbsp;type&nbsp;hdr&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hdr_size&nbsp;=&nbsp;pd_len;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rxm-&gt;data_off&nbsp;=&nbsp;RTE_PKTMBUF_HEADROOM&nbsp;+&nbsp;hdr_size;<br />@@&nbsp;-639,6&nbsp;+707,7&nbsp;@@&nbsp;uint16_t&nbsp;zxdh_recv_pkts_packed(void&nbsp;*rx_queue,&nbsp;struct&nbsp;rte_mbuf&nbsp;**rx_pkts,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Update&nbsp;rte_mbuf&nbsp;according&nbsp;to&nbsp;pi/pd&nbsp;header&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(zxdh_rx_update_mbuf(rxm,&nbsp;header)&nbsp;&lt;&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_discard_rxbuf(vq,&nbsp;rxm);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rxvq-&gt;stats.errors++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;seg_res&nbsp;=&nbsp;seg_num&nbsp;-&nbsp;1;<br />@@&nbsp;-661,8&nbsp;+730,11&nbsp;@@&nbsp;uint16_t&nbsp;zxdh_recv_pkts_packed(void&nbsp;*rx_queue,&nbsp;struct&nbsp;rte_mbuf&nbsp;**rx_pkts,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_RX_LOG(ERR,&nbsp;&quot;dropped&nbsp;rcvd_pkt_len&nbsp;%d&nbsp;pktlen&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;rcvd_pkt_len,&nbsp;rx_pkts[nb_rx]-&gt;pkt_len);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_discard_rxbuf(vq,&nbsp;rx_pkts[nb_rx]);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rxvq-&gt;stats.errors++;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rxvq-&gt;stats.truncated_err++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_update_packet_stats(&amp;rxvq-&gt;stats,&nbsp;rx_pkts[nb_rx]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nb_rx++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />@@&nbsp;-675,6&nbsp;+747,7&nbsp;@@&nbsp;uint16_t&nbsp;zxdh_recv_pkts_packed(void&nbsp;*rx_queue,&nbsp;struct&nbsp;rte_mbuf&nbsp;**rx_pkts,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(unlikely(rcv_cnt&nbsp;==&nbsp;0))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_RX_LOG(ERR,&nbsp;&quot;No&nbsp;enough&nbsp;segments&nbsp;for&nbsp;packet.&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rte_pktmbuf_free(rx_pkts[nb_rx]);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rxvq-&gt;stats.errors++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(extra_idx&nbsp;&lt;&nbsp;rcv_cnt)&nbsp;{<br />@@&nbsp;-694,11&nbsp;+767,15&nbsp;@@&nbsp;uint16_t&nbsp;zxdh_recv_pkts_packed(void&nbsp;*rx_queue,&nbsp;struct&nbsp;rte_mbuf&nbsp;**rx_pkts,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PMD_RX_LOG(ERR,&nbsp;&quot;dropped&nbsp;rcvd_pkt_len&nbsp;%d&nbsp;pktlen&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;rcvd_pkt_len,&nbsp;rx_pkts[nb_rx]-&gt;pkt_len);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_discard_rxbuf(vq,&nbsp;rx_pkts[nb_rx]);<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rxvq-&gt;stats.errors++;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rxvq-&gt;stats.truncated_err++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zxdh_update_packet_stats(&amp;rxvq-&gt;stats,&nbsp;rx_pkts[nb_rx]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nb_rx++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />+&nbsp;&nbsp;&nbsp;&nbsp;rxvq-&gt;stats.packets&nbsp;+=&nbsp;nb_rx;<br />&nbsp;
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Allocate&nbsp;new&nbsp;mbuf&nbsp;for&nbsp;the&nbsp;used&nbsp;descriptor&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(likely(!zxdh_queue_full(vq)))&nbsp;{<br />diff&nbsp;--git&nbsp;a/drivers/net/zxdh/zxdh_tables.h&nbsp;b/drivers/net/zxdh/zxdh_tables.h<br />index&nbsp;7bac39375c..c7da40f294&nbsp;100644<br />---&nbsp;a/drivers/net/zxdh/zxdh_tables.h<br />+++&nbsp;b/drivers/net/zxdh/zxdh_tables.h<br />@@&nbsp;-11,6&nbsp;+11,11&nbsp;@@<br />&nbsp;#define&nbsp;ZXDH_PORT_BASE_QID_FLAG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10<br />&nbsp;#define&nbsp;ZXDH_PORT_ATTR_IS_UP_FLAG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;35<br />&nbsp;
<br />+#define&nbsp;ZXDH_MTU_STATS_EGRESS_BASE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x8481<br />+#define&nbsp;ZXDH_MTU_STATS_INGRESS_BASE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x8981<br />+#define&nbsp;ZXDH_BROAD_STATS_EGRESS_BASE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xC902<br />+#define&nbsp;ZXDH_BROAD_STATS_INGRESS_BASE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xD102<br />+<br />&nbsp;extern&nbsp;struct&nbsp;zxdh_dtb_shared_data&nbsp;g_dtb_data;<br />&nbsp;
<br />&nbsp;struct&nbsp;zxdh_port_attr_table&nbsp;{<br />--&nbsp;
<br />2.27.0<br />