Merge branch 'for-upstream' of git://openrisc.net/jonas/linux
[pandora-kernel.git] / drivers / net / bnx2x / bnx2x.h
index 16dc2c9..c423504 100644 (file)
@@ -120,6 +120,7 @@ do {                                                                 \
 
 
 #ifdef BNX2X_STOP_ON_ERROR
+void bnx2x_int_disable(struct bnx2x *bp);
 #define bnx2x_panic() do { \
                bp->panic = 1; \
                BNX2X_ERR("driver assert\n"); \
@@ -240,21 +241,21 @@ do {                                                               \
  */
 /* iSCSI L2 */
 #define BNX2X_ISCSI_ETH_CL_ID_IDX      1
-#define BNX2X_ISCSI_ETH_CID            17
+#define BNX2X_ISCSI_ETH_CID            49
 
 /* FCoE L2 */
 #define BNX2X_FCOE_ETH_CL_ID_IDX       2
-#define BNX2X_FCOE_ETH_CID             18
+#define BNX2X_FCOE_ETH_CID             50
 
 /** Additional rings budgeting */
 #ifdef BCM_CNIC
-#define CNIC_CONTEXT_USE               1
-#define FCOE_CONTEXT_USE               1
+#define CNIC_PRESENT                   1
+#define FCOE_PRESENT                   1
 #else
-#define CNIC_CONTEXT_USE               0
-#define FCOE_CONTEXT_USE               0
+#define CNIC_PRESENT                   0
+#define FCOE_PRESENT                   0
 #endif /* BCM_CNIC */
-#define NONE_ETH_CONTEXT_USE   (FCOE_CONTEXT_USE)
+#define NON_ETH_CONTEXT_USE    (FCOE_PRESENT)
 
 #define AEU_IN_ATTN_BITS_PXPPCICLOCKCLIENT_PARITY_ERROR \
        AEU_INPUTS_ATTN_BITS_PXPPCICLOCKCLIENT_PARITY_ERROR
@@ -262,8 +263,35 @@ do {                                                                \
 #define SM_RX_ID                       0
 #define SM_TX_ID                       1
 
-/* fast path */
+/* defines for multiple tx priority indices */
+#define FIRST_TX_ONLY_COS_INDEX                1
+#define FIRST_TX_COS_INDEX             0
+
+/* defines for decodeing the fastpath index and the cos index out of the
+ * transmission queue index
+ */
+#define MAX_TXQS_PER_COS       FP_SB_MAX_E1x
+
+#define TXQ_TO_FP(txq_index)   ((txq_index) % MAX_TXQS_PER_COS)
+#define TXQ_TO_COS(txq_index)  ((txq_index) / MAX_TXQS_PER_COS)
+
+/* rules for calculating the cids of tx-only connections */
+#define CID_TO_FP(cid)         ((cid) % MAX_TXQS_PER_COS)
+#define CID_COS_TO_TX_ONLY_CID(cid, cos)       (cid + cos * MAX_TXQS_PER_COS)
+
+/* fp index inside class of service range */
+#define FP_COS_TO_TXQ(fp, cos)    ((fp)->index + cos * MAX_TXQS_PER_COS)
+
+/*
+ * 0..15 eth cos0
+ * 16..31 eth cos1 if applicable
+ * 32..47 eth cos2 If applicable
+ * fcoe queue follows eth queues (16, 32, 48 depending on cos)
+ */
+#define MAX_ETH_TXQ_IDX(bp)    (MAX_TXQS_PER_COS * (bp)->max_cos)
+#define FCOE_TXQ_IDX(bp)       (MAX_ETH_TXQ_IDX(bp))
 
+/* fast path */
 struct sw_rx_bd {
        struct sk_buff  *skb;
        DEFINE_DMA_UNMAP_ADDR(mapping);
@@ -388,6 +416,29 @@ struct bnx2x_agg_info {
 #define Q_STATS_OFFSET32(stat_name) \
                        (offsetof(struct bnx2x_eth_q_stats, stat_name) / 4)
 
+struct bnx2x_fp_txdata {
+
+       struct sw_tx_bd         *tx_buf_ring;
+
+       union eth_tx_bd_types   *tx_desc_ring;
+       dma_addr_t              tx_desc_mapping;
+
+       u32                     cid;
+
+       union db_prod           tx_db;
+
+       u16                     tx_pkt_prod;
+       u16                     tx_pkt_cons;
+       u16                     tx_bd_prod;
+       u16                     tx_bd_cons;
+
+       unsigned long           tx_pkt;
+
+       __le16                  *tx_cons_sb;
+
+       int                     txq_index;
+};
+
 struct bnx2x_fastpath {
        struct bnx2x            *bp; /* parent */
 
@@ -404,10 +455,8 @@ struct bnx2x_fastpath {
 
        dma_addr_t              status_blk_mapping;
 
-       struct sw_tx_bd         *tx_buf_ring;
-
-       union eth_tx_bd_types   *tx_desc_ring;
-       dma_addr_t              tx_desc_mapping;
+       u8                      max_cos; /* actual number of active tx coses */
+       struct bnx2x_fp_txdata  txdata[BNX2X_MULTI_TX_COS];
 
        struct sw_rx_bd         *rx_buf_ring;   /* BDs mappings ring */
        struct sw_rx_page       *rx_page_ring;  /* SGE pages mappings ring */
@@ -426,20 +475,13 @@ struct bnx2x_fastpath {
 
        u32                     cid;
 
+       __le16                  fp_hc_idx;
+
        u8                      index;          /* number in fp array */
        u8                      cl_id;          /* eth client id */
        u8                      cl_qzone_id;
        u8                      fw_sb_id;       /* status block number in FW */
        u8                      igu_sb_id;      /* status block number in HW */
-       union db_prod           tx_db;
-
-       u16                     tx_pkt_prod;
-       u16                     tx_pkt_cons;
-       u16                     tx_bd_prod;
-       u16                     tx_bd_cons;
-       __le16                  *tx_cons_sb;
-
-       __le16                  fp_hc_idx;
 
        u16                     rx_bd_prod;
        u16                     rx_bd_cons;
@@ -449,8 +491,7 @@ struct bnx2x_fastpath {
        /* The last maximal completed SGE */
        u16                     last_max_sge;
        __le16                  *rx_cons_sb;
-       unsigned long           tx_pkt,
-                               rx_pkt,
+       unsigned long           rx_pkt,
                                rx_calls;
 
        /* TPA related */
@@ -489,8 +530,12 @@ struct bnx2x_fastpath {
 #define FCOE_IDX                       BNX2X_NUM_ETH_QUEUES(bp)
 #define bnx2x_fcoe_fp(bp)              (&bp->fp[FCOE_IDX])
 #define bnx2x_fcoe(bp, var)            (bnx2x_fcoe_fp(bp)->var)
+#define bnx2x_fcoe_tx(bp, var)         (bnx2x_fcoe_fp(bp)-> \
+                                               txdata[FIRST_TX_COS_INDEX].var)
 
 
+#define IS_ETH_FP(fp)                  (fp->index < \
+                                        BNX2X_NUM_ETH_QUEUES(fp->bp))
 #ifdef BCM_CNIC
 #define IS_FCOE_FP(fp)                 (fp->index == FCOE_IDX)
 #define IS_FCOE_IDX(idx)               ((idx) == FCOE_IDX)
@@ -649,18 +694,23 @@ struct bnx2x_fastpath {
 
 #define HC_INDEX_TOE_TX_CQ_CONS                4 /* Formerly Cstorm TOE CQ index   */
                                          /* (HC_INDEX_C_TOE_TX_CQ_CONS)    */
-#define HC_INDEX_ETH_TX_CQ_CONS                5 /* Formerly Cstorm ETH CQ index   */
+#define HC_INDEX_ETH_TX_CQ_CONS_COS0   5 /* Formerly Cstorm ETH CQ index   */
+                                         /* (HC_INDEX_C_ETH_TX_CQ_CONS)    */
+#define HC_INDEX_ETH_TX_CQ_CONS_COS1   6 /* Formerly Cstorm ETH CQ index   */
+                                         /* (HC_INDEX_C_ETH_TX_CQ_CONS)    */
+#define HC_INDEX_ETH_TX_CQ_CONS_COS2   7 /* Formerly Cstorm ETH CQ index   */
                                          /* (HC_INDEX_C_ETH_TX_CQ_CONS)    */
 
-#define U_SB_ETH_RX_CQ_INDEX           HC_INDEX_ETH_RX_CQ_CONS
-#define U_SB_ETH_RX_BD_INDEX           HC_INDEX_ETH_RX_BD_CONS
-#define C_SB_ETH_TX_CQ_INDEX           HC_INDEX_ETH_TX_CQ_CONS
+#define HC_INDEX_ETH_FIRST_TX_CQ_CONS  HC_INDEX_ETH_TX_CQ_CONS_COS0
+
 
 #define BNX2X_RX_SB_INDEX \
        (&fp->sb_index_values[HC_INDEX_ETH_RX_CQ_CONS])
 
-#define BNX2X_TX_SB_INDEX \
-       (&fp->sb_index_values[C_SB_ETH_TX_CQ_INDEX])
+#define BNX2X_TX_SB_INDEX_BASE BNX2X_TX_SB_INDEX_COS0
+
+#define BNX2X_TX_SB_INDEX_COS0 \
+       (&fp->sb_index_values[HC_INDEX_ETH_TX_CQ_CONS_COS0])
 
 /* end of fast path */
 
@@ -845,25 +895,6 @@ extern struct workqueue_struct *bnx2x_wq;
 /* fast-path interrupt contexts E2 */
 #define FP_SB_MAX_E2           HC_SB_MAX_SB_E2
 
-/*
- * cid_cnt paramter below refers to the value returned by
- * 'bnx2x_get_l2_cid_count()' routine
- */
-
-/*
- * The number of FP context allocated by the driver == max number of regular
- * L2 queues + 1 for the FCoE L2 queue
- */
-#define L2_FP_COUNT(cid_cnt)   ((cid_cnt) - FCOE_CONTEXT_USE)
-
-/*
- * The number of FP-SB allocated by the driver == max number of regular L2
- * queues + 1 for the CNIC which also consumes an FP-SB
- */
-#define FP_SB_COUNT(cid_cnt)   ((cid_cnt) - CNIC_CONTEXT_USE)
-#define NUM_IGU_SB_REQUIRED(cid_cnt) \
-                               (FP_SB_COUNT(cid_cnt) - NONE_ETH_CONTEXT_USE)
-
 union cdu_context {
        struct eth_context eth;
        char pad[1024];
@@ -871,7 +902,7 @@ union cdu_context {
 
 /* CDU host DB constants */
 #define CDU_ILT_PAGE_SZ_HW     3
-#define CDU_ILT_PAGE_SZ                (4096 << CDU_ILT_PAGE_SZ_HW) /* 32K */
+#define CDU_ILT_PAGE_SZ                (8192 << CDU_ILT_PAGE_SZ_HW) /* 64K */
 #define ILT_PAGE_CIDS          (CDU_ILT_PAGE_SZ / sizeof(union cdu_context))
 
 #ifdef BCM_CNIC
@@ -935,6 +966,8 @@ struct bnx2x_slowpath {
 
        union {
                struct function_start_data      func_start;
+               /* pfc configuration for DCBX ramrod */
+               struct flow_control_configuration pfc_config;
        } func_rdata;
 
        /* used by dmae command executer */
@@ -949,8 +982,6 @@ struct bnx2x_slowpath {
 
        u32                             wb_comp;
        u32                             wb_data[4];
-       /* pfc configuration for DCBX ramrod */
-       struct flow_control_configuration pfc_config;
 };
 
 #define bnx2x_sp(bp, var)              (&bp->slowpath->var)
@@ -1048,6 +1079,7 @@ struct bnx2x_fw_stats_data {
 
 /* Public slow path states */
 enum {
+       BNX2X_SP_RTNL_SETUP_TC,
        BNX2X_SP_RTNL_TX_TIMEOUT,
 };
 
@@ -1072,7 +1104,7 @@ struct bnx2x {
 #define BP_VN(bp)                      (BP_E1HVN(bp)) /*remove when approved*/
 #define BP_L_ID(bp)                    (BP_E1HVN(bp) << 2)
 #define BP_FW_MB_IDX(bp)               (BP_PORT(bp) +\
-                                        BP_VN(bp) * (CHIP_IS_E1x(bp) ? 2  : 1))
+         BP_VN(bp) * ((CHIP_IS_E1x(bp) || (CHIP_MODE_IS_4_PORT(bp))) ? 2  : 1))
 
        struct net_device       *dev;
        struct pci_dev          *pdev;
@@ -1226,6 +1258,10 @@ struct bnx2x {
 #define BNX2X_STATE_ERROR              0xf000
 
        int                     multi_mode;
+#define BNX2X_MAX_PRIORITY             8
+#define BNX2X_MAX_ENTRIES_PER_PRI      16
+#define BNX2X_MAX_COS                  3
+#define BNX2X_MAX_TX_COS               2
        int                     num_queues;
        int                     disable_tpa;
 
@@ -1275,11 +1311,21 @@ struct bnx2x {
        struct bnx2x_ilt        *ilt;
 #define BP_ILT(bp)             ((bp)->ilt)
 #define ILT_MAX_LINES          256
+/*
+ * Maximum supported number of RSS queues: number of IGU SBs minus one that goes
+ * to CNIC.
+ */
+#define BNX2X_MAX_RSS_COUNT(bp)        ((bp)->igu_sb_cnt - CNIC_PRESENT)
 
-       int                     l2_cid_count;
-#define L2_ILT_LINES(bp)       (DIV_ROUND_UP((bp)->l2_cid_count, \
-                                ILT_PAGE_CIDS))
-#define BNX2X_DB_SIZE(bp)      ((bp)->l2_cid_count * (1 << BNX2X_DB_SHIFT))
+/*
+ * Maximum CID count that might be required by the bnx2x:
+ * Max Tss * Max_Tx_Multi_Cos + CNIC L2 Clients (FCoE and iSCSI related)
+ */
+#define BNX2X_L2_CID_COUNT(bp) (MAX_TXQS_PER_COS * BNX2X_MULTI_TX_COS +\
+                                       NON_ETH_CONTEXT_USE + CNIC_PRESENT)
+#define L2_ILT_LINES(bp)       (DIV_ROUND_UP(BNX2X_L2_CID_COUNT(bp),\
+                                       ILT_PAGE_CIDS))
+#define BNX2X_DB_SIZE(bp)      (BNX2X_L2_CID_COUNT(bp) * (1 << BNX2X_DB_SHIFT))
 
        int                     qm_cid_count;
 
@@ -1371,9 +1417,6 @@ struct bnx2x {
        char                    fw_ver[32];
        const struct firmware   *firmware;
 
-       /* LLDP params */
-       struct bnx2x_config_lldp_params         lldp_config_params;
-
        /* DCB support on/off */
        u16 dcb_state;
 #define BNX2X_DCB_STATE_OFF                    0
@@ -1421,16 +1464,24 @@ struct bnx2x {
        u32                                     dcbx_remote_flags;
 #endif
        u32                                     pending_max;
+
+       /* multiple tx classes of service */
+       u8                                      max_cos;
+
+       /* priority to cos mapping */
+       u8                                      prio_to_cos[8];
 };
 
 /* Tx queues may be less or equal to Rx queues */
 extern int num_queues;
 #define BNX2X_NUM_QUEUES(bp)   (bp->num_queues)
-#define BNX2X_NUM_ETH_QUEUES(bp) (BNX2X_NUM_QUEUES(bp) - NONE_ETH_CONTEXT_USE)
+#define BNX2X_NUM_ETH_QUEUES(bp) (BNX2X_NUM_QUEUES(bp) - NON_ETH_CONTEXT_USE)
+#define BNX2X_NUM_RX_QUEUES(bp)        BNX2X_NUM_QUEUES(bp)
 
 #define is_multi(bp)           (BNX2X_NUM_QUEUES(bp) > 1)
 
-#define BNX2X_MAX_QUEUES(bp)   (bp->igu_sb_cnt - CNIC_CONTEXT_USE)
+#define BNX2X_MAX_QUEUES(bp)   BNX2X_MAX_RSS_COUNT(bp)
+/* #define is_eth_multi(bp)    (BNX2X_NUM_ETH_QUEUES(bp) > 1) */
 
 #define RSS_IPV4_CAP_MASK                                              \
        TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV4_CAPABILITY
@@ -1465,35 +1516,40 @@ struct bnx2x_func_init_params {
 };
 
 #define for_each_eth_queue(bp, var) \
-       for (var = 0; var < BNX2X_NUM_ETH_QUEUES(bp); var++)
+       for ((var) = 0; (var) < BNX2X_NUM_ETH_QUEUES(bp); (var)++)
 
 #define for_each_nondefault_eth_queue(bp, var) \
-       for (var = 1; var < BNX2X_NUM_ETH_QUEUES(bp); var++)
+       for ((var) = 1; (var) < BNX2X_NUM_ETH_QUEUES(bp); (var)++)
 
 #define for_each_queue(bp, var) \
-       for (var = 0; var < BNX2X_NUM_QUEUES(bp); var++) \
+       for ((var) = 0; (var) < BNX2X_NUM_QUEUES(bp); (var)++) \
                if (skip_queue(bp, var))        \
                        continue;               \
                else
 
+/* Skip forwarding FP */
 #define for_each_rx_queue(bp, var) \
-       for (var = 0; var < BNX2X_NUM_QUEUES(bp); var++) \
+       for ((var) = 0; (var) < BNX2X_NUM_QUEUES(bp); (var)++) \
                if (skip_rx_queue(bp, var))     \
                        continue;               \
                else
 
+/* Skip OOO FP */
 #define for_each_tx_queue(bp, var) \
-       for (var = 0; var < BNX2X_NUM_QUEUES(bp); var++) \
+       for ((var) = 0; (var) < BNX2X_NUM_QUEUES(bp); (var)++) \
                if (skip_tx_queue(bp, var))     \
                        continue;               \
                else
 
 #define for_each_nondefault_queue(bp, var) \
-       for (var = 1; var < BNX2X_NUM_QUEUES(bp); var++) \
+       for ((var) = 1; (var) < BNX2X_NUM_QUEUES(bp); (var)++) \
                if (skip_queue(bp, var))        \
                        continue;               \
                else
 
+#define for_each_cos_in_tx_queue(fp, var) \
+       for ((var) = 0; (var) < (fp)->max_cos; (var)++)
+
 /* skip rx queue
  * if FCOE l2 support is disabled and this is the fcoe L2 queue
  */
@@ -1864,6 +1920,9 @@ static inline u32 reg_poll(struct bnx2x *bp, u32 reg, u32 expected, int ms,
                AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_TX_PARITY | \
                AEU_INPUTS_ATTN_BITS_MCP_LATCHED_SCPAD_PARITY)
 
+#define HW_PRTY_ASSERT_SET_4 (AEU_INPUTS_ATTN_BITS_PGLUE_PARITY_ERROR | \
+                             AEU_INPUTS_ATTN_BITS_ATC_PARITY_ERROR)
+
 #define RSS_FLAGS(bp) \
                (TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV4_CAPABILITY | \
                 TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV4_TCP_CAPABILITY | \