Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
[firefly-linux-kernel-4.4.55.git] / drivers / net / benet / be.h
index 53306bf3f401bee193fc89f5c6c4d1b35759ecb0..add0b93350dd9fb14e73706cdf33c986f100c650 100644 (file)
 #define BE_NAME                        "ServerEngines BladeEngine2 10Gbps NIC"
 #define BE3_NAME               "ServerEngines BladeEngine3 10Gbps NIC"
 #define OC_NAME                        "Emulex OneConnect 10Gbps NIC"
-#define OC_NAME1               "Emulex OneConnect 10Gbps NIC (be3)"
+#define OC_NAME_BE             OC_NAME "(be3)"
+#define OC_NAME_LANCER         OC_NAME "(Lancer)"
 #define DRV_DESC               "ServerEngines BladeEngine 10Gbps NIC Driver"
 
 #define BE_VENDOR_ID           0x19a2
+#define EMULEX_VENDOR_ID       0x10df
 #define BE_DEVICE_ID1          0x211
 #define BE_DEVICE_ID2          0x221
-#define OC_DEVICE_ID1          0x700
-#define OC_DEVICE_ID2          0x710
+#define OC_DEVICE_ID1          0x700   /* Device Id for BE2 cards */
+#define OC_DEVICE_ID2          0x710   /* Device Id for BE3 cards */
+#define OC_DEVICE_ID3          0xe220  /* Device id for Lancer cards */
 
 static inline char *nic_name(struct pci_dev *pdev)
 {
@@ -53,7 +56,9 @@ static inline char *nic_name(struct pci_dev *pdev)
        case OC_DEVICE_ID1:
                return OC_NAME;
        case OC_DEVICE_ID2:
-               return OC_NAME1;
+               return OC_NAME_BE;
+       case OC_DEVICE_ID3:
+               return OC_NAME_LANCER;
        case BE_DEVICE_ID2:
                return BE3_NAME;
        default:
@@ -78,6 +83,8 @@ static inline char *nic_name(struct pci_dev *pdev)
 #define MCC_Q_LEN              128     /* total size not to exceed 8 pages */
 #define MCC_CQ_LEN             256
 
+#define MAX_RSS_QS             4       /* BE limit is 4 queues/port */
+#define BE_MAX_MSIX_VECTORS    (MAX_RSS_QS + 1 + 1)/* RSS qs + 1 def Rx + Tx */
 #define BE_NAPI_WEIGHT         64
 #define MAX_RX_POST            BE_NAPI_WEIGHT /* Frags posted at a time */
 #define RX_FRAGS_REFILL_WM     (RX_Q_LEN - MAX_RX_POST)
@@ -147,6 +154,7 @@ struct be_eq_obj {
        u16 min_eqd;            /* in usecs */
        u16 max_eqd;            /* in usecs */
        u16 cur_eqd;            /* in usecs */
+       u8  msix_vec_idx;
 
        struct napi_struct napi;
 };
@@ -157,10 +165,9 @@ struct be_mcc_obj {
        bool rearm_cq;
 };
 
-struct be_drvr_stats {
+struct be_tx_stats {
        u32 be_tx_reqs;         /* number of TX requests initiated */
        u32 be_tx_stops;        /* number of times TX Q was stopped */
-       u32 be_fwd_reqs;        /* number of send reqs through forwarding i/f */
        u32 be_tx_wrbs;         /* number of tx WRBs used */
        u32 be_tx_events;       /* number of tx completion events  */
        u32 be_tx_compl;        /* number of tx completion entries processed */
@@ -169,35 +176,6 @@ struct be_drvr_stats {
        u64 be_tx_bytes_prev;
        u64 be_tx_pkts;
        u32 be_tx_rate;
-
-       u32 cache_barrier[16];
-
-       u32 be_ethrx_post_fail;/* number of ethrx buffer alloc failures */
-       u32 be_rx_polls;        /* number of times NAPI called poll function */
-       u32 be_rx_events;       /* number of ucast rx completion events  */
-       u32 be_rx_compl;        /* number of rx completion entries processed */
-       ulong be_rx_jiffies;
-       u64 be_rx_bytes;
-       u64 be_rx_bytes_prev;
-       u64 be_rx_pkts;
-       u32 be_rx_rate;
-       u32 be_rx_mcast_pkt;
-       /* number of non ether type II frames dropped where
-        * frame len > length field of Mac Hdr */
-       u32 be_802_3_dropped_frames;
-       /* number of non ether type II frames malformed where
-        * in frame len < length field of Mac Hdr */
-       u32 be_802_3_malformed_frames;
-       u32 be_rxcp_err;        /* Num rx completion entries w/ err set. */
-       ulong rx_fps_jiffies;   /* jiffies at last FPS calc */
-       u32 be_rx_frags;
-       u32 be_prev_rx_frags;
-       u32 be_rx_fps;          /* Rx frags per second */
-};
-
-struct be_stats_obj {
-       struct be_drvr_stats drvr_stats;
-       struct be_dma_mem cmd;
 };
 
 struct be_tx_obj {
@@ -215,10 +193,36 @@ struct be_rx_page_info {
        bool last_page_user;
 };
 
+struct be_rx_stats {
+       u32 rx_post_fail;/* number of ethrx buffer alloc failures */
+       u32 rx_polls;   /* number of times NAPI called poll function */
+       u32 rx_events;  /* number of ucast rx completion events  */
+       u32 rx_compl;   /* number of rx completion entries processed */
+       ulong rx_jiffies;
+       u64 rx_bytes;
+       u64 rx_bytes_prev;
+       u64 rx_pkts;
+       u32 rx_rate;
+       u32 rx_mcast_pkts;
+       u32 rxcp_err;   /* Num rx completion entries w/ err set. */
+       ulong rx_fps_jiffies;   /* jiffies at last FPS calc */
+       u32 rx_frags;
+       u32 prev_rx_frags;
+       u32 rx_fps;             /* Rx frags per second */
+};
+
 struct be_rx_obj {
+       struct be_adapter *adapter;
        struct be_queue_info q;
        struct be_queue_info cq;
        struct be_rx_page_info page_info_tbl[RX_Q_LEN];
+       struct be_eq_obj rx_eq;
+       struct be_rx_stats stats;
+       u8 rss_id;
+       bool rx_post_starved;   /* Zero rx frags have been posted to BE */
+       u16 last_frag_index;
+       u16 rsvd;
+       u32 cache_line_barrier[15];
 };
 
 struct be_vf_cfg {
@@ -229,7 +233,6 @@ struct be_vf_cfg {
        u32 vf_tx_rate;
 };
 
-#define BE_NUM_MSIX_VECTORS            2       /* 1 each for Tx and Rx */
 #define BE_INVALID_PMAC_ID             0xffffffff
 struct be_adapter {
        struct pci_dev *pdev;
@@ -239,7 +242,7 @@ struct be_adapter {
        u8 __iomem *db;         /* Door Bell */
        u8 __iomem *pcicfg;     /* PCI config space */
 
-       spinlock_t mbox_lock;   /* For serializing mbox cmds to BE card */
+       struct mutex mbox_lock; /* For serializing mbox cmds to BE card */
        struct be_dma_mem mbox_mem;
        /* Mbox mem is adjusted to align to 16 bytes. The allocated addr
         * is stored for freeing purpose */
@@ -249,29 +252,33 @@ struct be_adapter {
        spinlock_t mcc_lock;    /* For serializing mcc cmds to BE card */
        spinlock_t mcc_cq_lock;
 
-       struct msix_entry msix_entries[BE_NUM_MSIX_VECTORS];
+       struct msix_entry msix_entries[BE_MAX_MSIX_VECTORS];
        bool msix_enabled;
        bool isr_registered;
 
        /* TX Rings */
        struct be_eq_obj tx_eq;
        struct be_tx_obj tx_obj;
+       struct be_tx_stats tx_stats;
 
        u32 cache_line_break[8];
 
        /* Rx rings */
-       struct be_eq_obj rx_eq;
-       struct be_rx_obj rx_obj;
+       struct be_rx_obj rx_obj[MAX_RSS_QS + 1]; /* one default non-rss Q */
+       u32 num_rx_qs;
        u32 big_page_size;      /* Compounded page size shared by rx wrbs */
-       bool rx_post_starved;   /* Zero rx frags have been posted to BE */
+
+       u8 msix_vec_next_idx;
 
        struct vlan_group *vlan_grp;
        u16 vlans_added;
        u16 max_vlans;  /* Number of vlans supported */
-       u8 vlan_tag[VLAN_GROUP_ARRAY_LEN];
+       u8 vlan_tag[VLAN_N_VID];
+       u8 vlan_prio_bmap;      /* Available Priority BitMap */
+       u16 recommended_prio;   /* Recommended Priority */
        struct be_dma_mem mc_cmd_mem;
 
-       struct be_stats_obj stats;
+       struct be_dma_mem stats_cmd;
        /* Work queue used to perform periodic tasks like getting statistics */
        struct delayed_work work;
 
@@ -287,6 +294,7 @@ struct be_adapter {
        bool promiscuous;
        bool wol;
        u32 function_mode;
+       u32 function_caps;
        u32 rx_fc;              /* Rx flow control */
        u32 tx_fc;              /* Tx flow control */
        bool ue_detected;
@@ -301,8 +309,8 @@ struct be_adapter {
 
        bool sriov_enabled;
        struct be_vf_cfg vf_cfg[BE_MAX_VF];
-       u8 base_eq_id;
        u8 is_virtfn;
+       u32 sli_family;
 };
 
 #define be_physfn(adapter) (!adapter->is_virtfn)
@@ -311,12 +319,24 @@ struct be_adapter {
 #define BE_GEN2 2
 #define BE_GEN3 3
 
+#define lancer_chip(adapter)           (adapter->pdev->device == OC_DEVICE_ID3)
+
 extern const struct ethtool_ops be_ethtool_ops;
 
-#define drvr_stats(adapter)            (&adapter->stats.drvr_stats)
+#define tx_stats(adapter)              (&adapter->tx_stats)
+#define rx_stats(rxo)                  (&rxo->stats)
 
 #define BE_SET_NETDEV_OPS(netdev, ops) (netdev->netdev_ops = ops)
 
+#define for_all_rx_queues(adapter, rxo, i)                             \
+       for (i = 0, rxo = &adapter->rx_obj[i]; i < adapter->num_rx_qs;  \
+               i++, rxo++)
+
+/* Just skip the first default non-rss queue */
+#define for_all_rss_queues(adapter, rxo, i)                            \
+       for (i = 0, rxo = &adapter->rx_obj[i+1]; i < (adapter->num_rx_qs - 1);\
+               i++, rxo++)
+
 #define PAGE_SHIFT_4K          12
 #define PAGE_SIZE_4K           (1 << PAGE_SHIFT_4K)
 
@@ -408,10 +428,31 @@ static inline u8 is_udp_pkt(struct sk_buff *skb)
 static inline void be_check_sriov_fn_type(struct be_adapter *adapter)
 {
        u8 data;
+       u32 sli_intf;
+
+       if (lancer_chip(adapter)) {
+               pci_read_config_dword(adapter->pdev, SLI_INTF_REG_OFFSET,
+                                                               &sli_intf);
+               adapter->is_virtfn = (sli_intf & SLI_INTF_FT_MASK) ? 1 : 0;
+       } else {
+               pci_write_config_byte(adapter->pdev, 0xFE, 0xAA);
+               pci_read_config_byte(adapter->pdev, 0xFE, &data);
+               adapter->is_virtfn = (data != 0xAA);
+       }
+}
+
+static inline void be_vf_eth_addr_generate(struct be_adapter *adapter, u8 *mac)
+{
+       u32 addr;
+
+       addr = jhash(adapter->netdev->dev_addr, ETH_ALEN, 0);
 
-       pci_write_config_byte(adapter->pdev, 0xFE, 0xAA);
-       pci_read_config_byte(adapter->pdev, 0xFE, &data);
-       adapter->is_virtfn = (data != 0xAA);
+       mac[5] = (u8)(addr & 0xFF);
+       mac[4] = (u8)((addr >> 8) & 0xFF);
+       mac[3] = (u8)((addr >> 16) & 0xFF);
+       mac[2] = 0xC9;
+       mac[1] = 0x00;
+       mac[0] = 0x00;
 }
 
 extern void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm,