@@ -1708,3 +1708,93 @@ void erdma_port_event(struct erdma_dev *dev, enum ib_event_type reason)
17081708
17091709 ib_dispatch_event (& event );
17101710}
1711+
1712+ enum counters {
1713+ ERDMA_STATS_TX_REQS_CNT ,
1714+ ERDMA_STATS_TX_PACKETS_CNT ,
1715+ ERDMA_STATS_TX_BYTES_CNT ,
1716+ ERDMA_STATS_TX_DISABLE_DROP_CNT ,
1717+ ERDMA_STATS_TX_BPS_METER_DROP_CNT ,
1718+ ERDMA_STATS_TX_PPS_METER_DROP_CNT ,
1719+
1720+ ERDMA_STATS_RX_PACKETS_CNT ,
1721+ ERDMA_STATS_RX_BYTES_CNT ,
1722+ ERDMA_STATS_RX_DISABLE_DROP_CNT ,
1723+ ERDMA_STATS_RX_BPS_METER_DROP_CNT ,
1724+ ERDMA_STATS_RX_PPS_METER_DROP_CNT ,
1725+
1726+ ERDMA_STATS_MAX
1727+ };
1728+
1729+ static const struct rdma_stat_desc erdma_descs [] = {
1730+ [ERDMA_STATS_TX_REQS_CNT ].name = "tx_reqs_cnt" ,
1731+ [ERDMA_STATS_TX_PACKETS_CNT ].name = "tx_packets_cnt" ,
1732+ [ERDMA_STATS_TX_BYTES_CNT ].name = "tx_bytes_cnt" ,
1733+ [ERDMA_STATS_TX_DISABLE_DROP_CNT ].name = "tx_disable_drop_cnt" ,
1734+ [ERDMA_STATS_TX_BPS_METER_DROP_CNT ].name = "tx_bps_limit_drop_cnt" ,
1735+ [ERDMA_STATS_TX_PPS_METER_DROP_CNT ].name = "tx_pps_limit_drop_cnt" ,
1736+ [ERDMA_STATS_RX_PACKETS_CNT ].name = "rx_packets_cnt" ,
1737+ [ERDMA_STATS_RX_BYTES_CNT ].name = "rx_bytes_cnt" ,
1738+ [ERDMA_STATS_RX_DISABLE_DROP_CNT ].name = "rx_disable_drop_cnt" ,
1739+ [ERDMA_STATS_RX_BPS_METER_DROP_CNT ].name = "rx_bps_limit_drop_cnt" ,
1740+ [ERDMA_STATS_RX_PPS_METER_DROP_CNT ].name = "rx_pps_limit_drop_cnt" ,
1741+ };
1742+
1743+ struct rdma_hw_stats * erdma_alloc_hw_port_stats (struct ib_device * device ,
1744+ u32 port_num )
1745+ {
1746+ return rdma_alloc_hw_stats_struct (erdma_descs , ERDMA_STATS_MAX ,
1747+ RDMA_HW_STATS_DEFAULT_LIFESPAN );
1748+ }
1749+
1750+ static int erdma_query_hw_stats (struct erdma_dev * dev ,
1751+ struct rdma_hw_stats * stats )
1752+ {
1753+ struct erdma_cmdq_query_stats_resp * resp ;
1754+ struct erdma_cmdq_query_req req ;
1755+ dma_addr_t dma_addr ;
1756+ int err ;
1757+
1758+ erdma_cmdq_build_reqhdr (& req .hdr , CMDQ_SUBMOD_COMMON ,
1759+ CMDQ_OPCODE_GET_STATS );
1760+
1761+ resp = dma_pool_zalloc (dev -> resp_pool , GFP_KERNEL , & dma_addr );
1762+ if (!resp )
1763+ return - ENOMEM ;
1764+
1765+ req .target_addr = dma_addr ;
1766+ req .target_length = ERDMA_HW_RESP_SIZE ;
1767+
1768+ err = erdma_post_cmd_wait (& dev -> cmdq , & req , sizeof (req ), NULL , NULL );
1769+ if (err )
1770+ goto out ;
1771+
1772+ if (resp -> hdr .magic != ERDMA_HW_RESP_MAGIC ) {
1773+ err = - EINVAL ;
1774+ goto out ;
1775+ }
1776+
1777+ memcpy (& stats -> value [0 ], & resp -> tx_req_cnt ,
1778+ sizeof (u64 ) * stats -> num_counters );
1779+
1780+ out :
1781+ dma_pool_free (dev -> resp_pool , resp , dma_addr );
1782+
1783+ return err ;
1784+ }
1785+
1786+ int erdma_get_hw_stats (struct ib_device * ibdev , struct rdma_hw_stats * stats ,
1787+ u32 port , int index )
1788+ {
1789+ struct erdma_dev * dev = to_edev (ibdev );
1790+ int ret ;
1791+
1792+ if (port == 0 )
1793+ return 0 ;
1794+
1795+ ret = erdma_query_hw_stats (dev , stats );
1796+ if (ret )
1797+ return ret ;
1798+
1799+ return stats -> num_counters ;
1800+ }
0 commit comments