|
@@ -315,6 +315,14 @@ union db_prod {
|
|
|
u32 raw;
|
|
|
};
|
|
|
|
|
|
+/* dropless fc FW/HW related params */
|
|
|
+#define BRB_SIZE(bp) (CHIP_IS_E3(bp) ? 1024 : 512)
|
|
|
+#define MAX_AGG_QS(bp) (CHIP_IS_E1(bp) ? \
|
|
|
+ ETH_MAX_AGGREGATION_QUEUES_E1 :\
|
|
|
+ ETH_MAX_AGGREGATION_QUEUES_E1H_E2)
|
|
|
+#define FW_DROP_LEVEL(bp) (3 + MAX_SPQ_PENDING + MAX_AGG_QS(bp))
|
|
|
+#define FW_PREFETCH_CNT 16
|
|
|
+#define DROPLESS_FC_HEADROOM 100
|
|
|
|
|
|
/* MC hsi */
|
|
|
#define BCM_PAGE_SHIFT 12
|
|
@@ -331,15 +339,35 @@ union db_prod {
|
|
|
/* SGE ring related macros */
|
|
|
#define NUM_RX_SGE_PAGES 2
|
|
|
#define RX_SGE_CNT (BCM_PAGE_SIZE / sizeof(struct eth_rx_sge))
|
|
|
-#define MAX_RX_SGE_CNT (RX_SGE_CNT - 2)
|
|
|
+#define NEXT_PAGE_SGE_DESC_CNT 2
|
|
|
+#define MAX_RX_SGE_CNT (RX_SGE_CNT - NEXT_PAGE_SGE_DESC_CNT)
|
|
|
/* RX_SGE_CNT is promised to be a power of 2 */
|
|
|
#define RX_SGE_MASK (RX_SGE_CNT - 1)
|
|
|
#define NUM_RX_SGE (RX_SGE_CNT * NUM_RX_SGE_PAGES)
|
|
|
#define MAX_RX_SGE (NUM_RX_SGE - 1)
|
|
|
#define NEXT_SGE_IDX(x) ((((x) & RX_SGE_MASK) == \
|
|
|
- (MAX_RX_SGE_CNT - 1)) ? (x) + 3 : (x) + 1)
|
|
|
+ (MAX_RX_SGE_CNT - 1)) ? \
|
|
|
+ (x) + 1 + NEXT_PAGE_SGE_DESC_CNT : \
|
|
|
+ (x) + 1)
|
|
|
#define RX_SGE(x) ((x) & MAX_RX_SGE)
|
|
|
|
|
|
+/*
|
|
|
+ * Number of required SGEs is the sum of two:
|
|
|
+ * 1. Number of possible opened aggregations (next packet for
|
|
|
+ * these aggregations will probably consume SGE immidiatelly)
|
|
|
+ * 2. Rest of BRB blocks divided by 2 (block will consume new SGE only
|
|
|
+ * after placement on BD for new TPA aggregation)
|
|
|
+ *
|
|
|
+ * Takes into account NEXT_PAGE_SGE_DESC_CNT "next" elements on each page
|
|
|
+ */
|
|
|
+#define NUM_SGE_REQ (MAX_AGG_QS(bp) + \
|
|
|
+ (BRB_SIZE(bp) - MAX_AGG_QS(bp)) / 2)
|
|
|
+#define NUM_SGE_PG_REQ ((NUM_SGE_REQ + MAX_RX_SGE_CNT - 1) / \
|
|
|
+ MAX_RX_SGE_CNT)
|
|
|
+#define SGE_TH_LO(bp) (NUM_SGE_REQ + \
|
|
|
+ NUM_SGE_PG_REQ * NEXT_PAGE_SGE_DESC_CNT)
|
|
|
+#define SGE_TH_HI(bp) (SGE_TH_LO(bp) + DROPLESS_FC_HEADROOM)
|
|
|
+
|
|
|
/* Manipulate a bit vector defined as an array of u64 */
|
|
|
|
|
|
/* Number of bits in one sge_mask array element */
|
|
@@ -551,24 +579,43 @@ struct bnx2x_fastpath {
|
|
|
|
|
|
#define NUM_TX_RINGS 16
|
|
|
#define TX_DESC_CNT (BCM_PAGE_SIZE / sizeof(union eth_tx_bd_types))
|
|
|
-#define MAX_TX_DESC_CNT (TX_DESC_CNT - 1)
|
|
|
+#define NEXT_PAGE_TX_DESC_CNT 1
|
|
|
+#define MAX_TX_DESC_CNT (TX_DESC_CNT - NEXT_PAGE_TX_DESC_CNT)
|
|
|
#define NUM_TX_BD (TX_DESC_CNT * NUM_TX_RINGS)
|
|
|
#define MAX_TX_BD (NUM_TX_BD - 1)
|
|
|
#define MAX_TX_AVAIL (MAX_TX_DESC_CNT * NUM_TX_RINGS - 2)
|
|
|
#define NEXT_TX_IDX(x) ((((x) & MAX_TX_DESC_CNT) == \
|
|
|
- (MAX_TX_DESC_CNT - 1)) ? (x) + 2 : (x) + 1)
|
|
|
+ (MAX_TX_DESC_CNT - 1)) ? \
|
|
|
+ (x) + 1 + NEXT_PAGE_TX_DESC_CNT : \
|
|
|
+ (x) + 1)
|
|
|
#define TX_BD(x) ((x) & MAX_TX_BD)
|
|
|
#define TX_BD_POFF(x) ((x) & MAX_TX_DESC_CNT)
|
|
|
|
|
|
/* The RX BD ring is special, each bd is 8 bytes but the last one is 16 */
|
|
|
#define NUM_RX_RINGS 8
|
|
|
#define RX_DESC_CNT (BCM_PAGE_SIZE / sizeof(struct eth_rx_bd))
|
|
|
-#define MAX_RX_DESC_CNT (RX_DESC_CNT - 2)
|
|
|
+#define NEXT_PAGE_RX_DESC_CNT 2
|
|
|
+#define MAX_RX_DESC_CNT (RX_DESC_CNT - NEXT_PAGE_RX_DESC_CNT)
|
|
|
#define RX_DESC_MASK (RX_DESC_CNT - 1)
|
|
|
#define NUM_RX_BD (RX_DESC_CNT * NUM_RX_RINGS)
|
|
|
#define MAX_RX_BD (NUM_RX_BD - 1)
|
|
|
#define MAX_RX_AVAIL (MAX_RX_DESC_CNT * NUM_RX_RINGS - 2)
|
|
|
-#define MIN_RX_AVAIL 128
|
|
|
+
|
|
|
+/* dropless fc calculations for BDs
|
|
|
+ *
|
|
|
+ * Number of BDs should as number of buffers in BRB:
|
|
|
+ * Low threshold takes into account NEXT_PAGE_RX_DESC_CNT
|
|
|
+ * "next" elements on each page
|
|
|
+ */
|
|
|
+#define NUM_BD_REQ BRB_SIZE(bp)
|
|
|
+#define NUM_BD_PG_REQ ((NUM_BD_REQ + MAX_RX_DESC_CNT - 1) / \
|
|
|
+ MAX_RX_DESC_CNT)
|
|
|
+#define BD_TH_LO(bp) (NUM_BD_REQ + \
|
|
|
+ NUM_BD_PG_REQ * NEXT_PAGE_RX_DESC_CNT + \
|
|
|
+ FW_DROP_LEVEL(bp))
|
|
|
+#define BD_TH_HI(bp) (BD_TH_LO(bp) + DROPLESS_FC_HEADROOM)
|
|
|
+
|
|
|
+#define MIN_RX_AVAIL ((bp)->dropless_fc ? BD_TH_HI(bp) + 128 : 128)
|
|
|
|
|
|
#define MIN_RX_SIZE_TPA_HW (CHIP_IS_E1(bp) ? \
|
|
|
ETH_MIN_RX_CQES_WITH_TPA_E1 : \
|
|
@@ -579,7 +626,9 @@ struct bnx2x_fastpath {
|
|
|
MIN_RX_AVAIL))
|
|
|
|
|
|
#define NEXT_RX_IDX(x) ((((x) & RX_DESC_MASK) == \
|
|
|
- (MAX_RX_DESC_CNT - 1)) ? (x) + 3 : (x) + 1)
|
|
|
+ (MAX_RX_DESC_CNT - 1)) ? \
|
|
|
+ (x) + 1 + NEXT_PAGE_RX_DESC_CNT : \
|
|
|
+ (x) + 1)
|
|
|
#define RX_BD(x) ((x) & MAX_RX_BD)
|
|
|
|
|
|
/*
|
|
@@ -589,14 +638,31 @@ struct bnx2x_fastpath {
|
|
|
#define CQE_BD_REL (sizeof(union eth_rx_cqe) / sizeof(struct eth_rx_bd))
|
|
|
#define NUM_RCQ_RINGS (NUM_RX_RINGS * CQE_BD_REL)
|
|
|
#define RCQ_DESC_CNT (BCM_PAGE_SIZE / sizeof(union eth_rx_cqe))
|
|
|
-#define MAX_RCQ_DESC_CNT (RCQ_DESC_CNT - 1)
|
|
|
+#define NEXT_PAGE_RCQ_DESC_CNT 1
|
|
|
+#define MAX_RCQ_DESC_CNT (RCQ_DESC_CNT - NEXT_PAGE_RCQ_DESC_CNT)
|
|
|
#define NUM_RCQ_BD (RCQ_DESC_CNT * NUM_RCQ_RINGS)
|
|
|
#define MAX_RCQ_BD (NUM_RCQ_BD - 1)
|
|
|
#define MAX_RCQ_AVAIL (MAX_RCQ_DESC_CNT * NUM_RCQ_RINGS - 2)
|
|
|
#define NEXT_RCQ_IDX(x) ((((x) & MAX_RCQ_DESC_CNT) == \
|
|
|
- (MAX_RCQ_DESC_CNT - 1)) ? (x) + 2 : (x) + 1)
|
|
|
+ (MAX_RCQ_DESC_CNT - 1)) ? \
|
|
|
+ (x) + 1 + NEXT_PAGE_RCQ_DESC_CNT : \
|
|
|
+ (x) + 1)
|
|
|
#define RCQ_BD(x) ((x) & MAX_RCQ_BD)
|
|
|
|
|
|
+/* dropless fc calculations for RCQs
|
|
|
+ *
|
|
|
+ * Number of RCQs should be as number of buffers in BRB:
|
|
|
+ * Low threshold takes into account NEXT_PAGE_RCQ_DESC_CNT
|
|
|
+ * "next" elements on each page
|
|
|
+ */
|
|
|
+#define NUM_RCQ_REQ BRB_SIZE(bp)
|
|
|
+#define NUM_RCQ_PG_REQ ((NUM_BD_REQ + MAX_RCQ_DESC_CNT - 1) / \
|
|
|
+ MAX_RCQ_DESC_CNT)
|
|
|
+#define RCQ_TH_LO(bp) (NUM_RCQ_REQ + \
|
|
|
+ NUM_RCQ_PG_REQ * NEXT_PAGE_RCQ_DESC_CNT + \
|
|
|
+ FW_DROP_LEVEL(bp))
|
|
|
+#define RCQ_TH_HI(bp) (RCQ_TH_LO(bp) + DROPLESS_FC_HEADROOM)
|
|
|
+
|
|
|
|
|
|
/* This is needed for determining of last_max */
|
|
|
#define SUB_S16(a, b) (s16)((s16)(a) - (s16)(b))
|