Browse Source

RDMA/bnxt_re: Report out of sequence hw counters

Expose out of sequence errors received from FW.  This counter is a 32 bit
counter and driver has to accumulate the counter. Stores the previous
value for calculating the difference in the next query.

Also, update the HW statistics structure with new fields.

Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Selvin Xavier 6 years ago
parent
commit
316dd2825d

+ 4 - 1
drivers/infiniband/hw/bnxt_re/hw_counters.c

@@ -108,7 +108,8 @@ static const char * const bnxt_re_stat_name[] = {
 	[BNXT_RE_RES_CQ_LOAD_ERR]       = "res_cq_load_err",
 	[BNXT_RE_RES_CQ_LOAD_ERR]       = "res_cq_load_err",
 	[BNXT_RE_RES_SRQ_LOAD_ERR]      = "res_srq_load_err",
 	[BNXT_RE_RES_SRQ_LOAD_ERR]      = "res_srq_load_err",
 	[BNXT_RE_RES_TX_PCI_ERR]        = "res_tx_pci_err",
 	[BNXT_RE_RES_TX_PCI_ERR]        = "res_tx_pci_err",
-	[BNXT_RE_RES_RX_PCI_ERR]        = "res_rx_pci_err"
+	[BNXT_RE_RES_RX_PCI_ERR]        = "res_rx_pci_err",
+	[BNXT_RE_OUT_OF_SEQ_ERR]        = "oos_drop_count"
 };
 };
 
 
 int bnxt_re_ib_get_hw_stats(struct ib_device *ibdev,
 int bnxt_re_ib_get_hw_stats(struct ib_device *ibdev,
@@ -226,6 +227,8 @@ int bnxt_re_ib_get_hw_stats(struct ib_device *ibdev,
 				rdev->stats.res_tx_pci_err;
 				rdev->stats.res_tx_pci_err;
 		stats->value[BNXT_RE_RES_RX_PCI_ERR]    =
 		stats->value[BNXT_RE_RES_RX_PCI_ERR]    =
 				rdev->stats.res_rx_pci_err;
 				rdev->stats.res_rx_pci_err;
+		stats->value[BNXT_RE_OUT_OF_SEQ_ERR]    =
+				rdev->stats.res_oos_drop_count;
 	}
 	}
 
 
 	return ARRAY_SIZE(bnxt_re_stat_name);
 	return ARRAY_SIZE(bnxt_re_stat_name);

+ 1 - 0
drivers/infiniband/hw/bnxt_re/hw_counters.h

@@ -92,6 +92,7 @@ enum bnxt_re_hw_stats {
 	BNXT_RE_RES_SRQ_LOAD_ERR,
 	BNXT_RE_RES_SRQ_LOAD_ERR,
 	BNXT_RE_RES_TX_PCI_ERR,
 	BNXT_RE_RES_TX_PCI_ERR,
 	BNXT_RE_RES_RX_PCI_ERR,
 	BNXT_RE_RES_RX_PCI_ERR,
+	BNXT_RE_OUT_OF_SEQ_ERR,
 	BNXT_RE_NUM_COUNTERS
 	BNXT_RE_NUM_COUNTERS
 };
 };
 
 

+ 4 - 0
drivers/infiniband/hw/bnxt_re/qplib_rcfw.h

@@ -154,6 +154,8 @@ struct bnxt_qplib_qp_node {
 	void *qp_handle;        /* ptr to qplib_qp */
 	void *qp_handle;        /* ptr to qplib_qp */
 };
 };
 
 
+#define BNXT_QPLIB_OOS_COUNT_MASK 0xFFFFFFFF
+
 /* RCFW Communication Channels */
 /* RCFW Communication Channels */
 struct bnxt_qplib_rcfw {
 struct bnxt_qplib_rcfw {
 	struct pci_dev		*pdev;
 	struct pci_dev		*pdev;
@@ -190,6 +192,8 @@ struct bnxt_qplib_rcfw {
 	struct bnxt_qplib_crsq	*crsqe_tbl;
 	struct bnxt_qplib_crsq	*crsqe_tbl;
 	int qp_tbl_size;
 	int qp_tbl_size;
 	struct bnxt_qplib_qp_node *qp_tbl;
 	struct bnxt_qplib_qp_node *qp_tbl;
+	u64 oos_prev;
+	u32 init_oos_stats;
 };
 };
 
 
 void bnxt_qplib_free_rcfw_channel(struct bnxt_qplib_rcfw *rcfw);
 void bnxt_qplib_free_rcfw_channel(struct bnxt_qplib_rcfw *rcfw);

+ 10 - 0
drivers/infiniband/hw/bnxt_re/qplib_sp.c

@@ -840,6 +840,16 @@ int bnxt_qplib_get_roce_stats(struct bnxt_qplib_rcfw *rcfw,
 	stats->res_srq_load_err = le64_to_cpu(sb->res_srq_load_err);
 	stats->res_srq_load_err = le64_to_cpu(sb->res_srq_load_err);
 	stats->res_tx_pci_err = le64_to_cpu(sb->res_tx_pci_err);
 	stats->res_tx_pci_err = le64_to_cpu(sb->res_tx_pci_err);
 	stats->res_rx_pci_err = le64_to_cpu(sb->res_rx_pci_err);
 	stats->res_rx_pci_err = le64_to_cpu(sb->res_rx_pci_err);
+	if (!rcfw->init_oos_stats) {
+		rcfw->oos_prev = le64_to_cpu(sb->res_oos_drop_count);
+		rcfw->init_oos_stats = 1;
+	} else {
+		stats->res_oos_drop_count +=
+				(le64_to_cpu(sb->res_oos_drop_count) -
+				 rcfw->oos_prev) & BNXT_QPLIB_OOS_COUNT_MASK;
+		rcfw->oos_prev = le64_to_cpu(sb->res_oos_drop_count);
+	}
+
 bail:
 bail:
 	bnxt_qplib_rcfw_free_sbuf(rcfw, sbuf);
 	bnxt_qplib_rcfw_free_sbuf(rcfw, sbuf);
 	return rc;
 	return rc;

+ 10 - 0
drivers/infiniband/hw/bnxt_re/qplib_sp.h

@@ -205,6 +205,16 @@ struct bnxt_qplib_roce_stats {
 	/* res_tx_pci_err is 64 b */
 	/* res_tx_pci_err is 64 b */
 	u64 res_rx_pci_err;
 	u64 res_rx_pci_err;
 	/* res_rx_pci_err is 64 b */
 	/* res_rx_pci_err is 64 b */
+	u64 res_oos_drop_count;
+	/* res_oos_drop_count */
+	u64     active_qp_count_p0;
+	/* port 0 active qps */
+	u64     active_qp_count_p1;
+	/* port 1 active qps */
+	u64     active_qp_count_p2;
+	/* port 2 active qps */
+	u64     active_qp_count_p3;
+	/* port 3 active qps */
 };
 };
 
 
 int bnxt_qplib_get_sgid(struct bnxt_qplib_res *res,
 int bnxt_qplib_get_sgid(struct bnxt_qplib_res *res,

+ 5 - 0
drivers/infiniband/hw/bnxt_re/roce_hsi.h

@@ -2929,6 +2929,11 @@ struct creq_query_roce_stats_resp_sb {
 	__le64	res_srq_load_err;
 	__le64	res_srq_load_err;
 	__le64	res_tx_pci_err;
 	__le64	res_tx_pci_err;
 	__le64	res_rx_pci_err;
 	__le64	res_rx_pci_err;
+	__le64  res_oos_drop_count;
+	__le64  active_qp_count_p0;
+	__le64  active_qp_count_p1;
+	__le64  active_qp_count_p2;
+	__le64  active_qp_count_p3;
 };
 };
 
 
 /* QP error notification event (16 bytes) */
 /* QP error notification event (16 bytes) */