|
@@ -246,8 +246,37 @@ enum {
|
|
|
BNX2X_MAX_CNIC_ETH_CL_ID_IDX,
|
|
|
};
|
|
|
|
|
|
-#define BNX2X_CNIC_START_ETH_CID(bp) (BNX2X_NUM_NON_CNIC_QUEUES(bp) *\
|
|
|
+/* use a value high enough to be above all the PFs, which has least significant
|
|
|
+ * nibble as 8, so when cnic needs to come up with a CID for UIO to use to
|
|
|
+ * calculate doorbell address according to old doorbell configuration scheme
|
|
|
+ * (db_msg_sz 1 << 7 * cid + 0x40 DPM offset) it can come up with a valid number
|
|
|
+ * We must avoid coming up with cid 8 for iscsi since according to this method
|
|
|
+ * the designated UIO cid will come out 0 and it has a special handling for that
|
|
|
+ * case which doesn't suit us. Therefore will will cieling to closes cid which
|
|
|
+ * has least signigifcant nibble 8 and if it is 8 we will move forward to 0x18.
|
|
|
+ */
|
|
|
+
|
|
|
+#define BNX2X_1st_NON_L2_ETH_CID(bp) (BNX2X_NUM_NON_CNIC_QUEUES(bp) * \
|
|
|
(bp)->max_cos)
|
|
|
+/* amount of cids traversed by UIO's DPM addition to doorbell */
|
|
|
+#define UIO_DPM 8
|
|
|
+/* roundup to DPM offset */
|
|
|
+#define UIO_ROUNDUP(bp) (roundup(BNX2X_1st_NON_L2_ETH_CID(bp), \
|
|
|
+ UIO_DPM))
|
|
|
+/* offset to nearest value which has lsb nibble matching DPM */
|
|
|
+#define UIO_CID_OFFSET(bp) ((UIO_ROUNDUP(bp) + UIO_DPM) % \
|
|
|
+ (UIO_DPM * 2))
|
|
|
+/* add offset to rounded-up cid to get a value which could be used with UIO */
|
|
|
+#define UIO_DPM_ALIGN(bp) (UIO_ROUNDUP(bp) + UIO_CID_OFFSET(bp))
|
|
|
+/* but wait - avoid UIO special case for cid 0 */
|
|
|
+#define UIO_DPM_CID0_OFFSET(bp) ((UIO_DPM * 2) * \
|
|
|
+ (UIO_DPM_ALIGN(bp) == UIO_DPM))
|
|
|
+/* Properly DPM aligned CID dajusted to cid 0 secal case */
|
|
|
+#define BNX2X_CNIC_START_ETH_CID(bp) (UIO_DPM_ALIGN(bp) + \
|
|
|
+ (UIO_DPM_CID0_OFFSET(bp)))
|
|
|
+/* how many cids were wasted - need this value for cid allocation */
|
|
|
+#define UIO_CID_PAD(bp) (BNX2X_CNIC_START_ETH_CID(bp) - \
|
|
|
+ BNX2X_1st_NON_L2_ETH_CID(bp))
|
|
|
/* iSCSI L2 */
|
|
|
#define BNX2X_ISCSI_ETH_CID(bp) (BNX2X_CNIC_START_ETH_CID(bp))
|
|
|
/* FCoE L2 */
|
|
@@ -1680,10 +1709,11 @@ struct bnx2x {
|
|
|
* Maximum CID count that might be required by the bnx2x:
|
|
|
* Max RSS * Max_Tx_Multi_Cos + FCoE + iSCSI
|
|
|
*/
|
|
|
+
|
|
|
#define BNX2X_L2_CID_COUNT(bp) (BNX2X_NUM_ETH_QUEUES(bp) * BNX2X_MULTI_TX_COS \
|
|
|
- + 2 * CNIC_SUPPORT(bp))
|
|
|
+ + CNIC_SUPPORT(bp) * (2 + UIO_CID_PAD(bp)))
|
|
|
#define BNX2X_L2_MAX_CID(bp) (BNX2X_MAX_RSS_COUNT(bp) * BNX2X_MULTI_TX_COS \
|
|
|
- + 2 * CNIC_SUPPORT(bp))
|
|
|
+ + CNIC_SUPPORT(bp) * (2 + UIO_CID_PAD(bp)))
|
|
|
#define L2_ILT_LINES(bp) (DIV_ROUND_UP(BNX2X_L2_CID_COUNT(bp),\
|
|
|
ILT_PAGE_CIDS))
|
|
|
|