be2net: Enable SR-IOV for Lancer
[deliverable/linux.git] / drivers / net / benet / be.h
index f803c58b941d7196f4ce53d62cf6c5a0a63d33d1..a7db870d1641a5b1465223e92ce90689e535a5b2 100644 (file)
@@ -49,6 +49,7 @@
 #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 */
+#define OC_DEVICE_ID4           0xe228   /* Device id for VF in Lancer */
 
 static inline char *nic_name(struct pci_dev *pdev)
 {
@@ -58,6 +59,7 @@ static inline char *nic_name(struct pci_dev *pdev)
        case OC_DEVICE_ID2:
                return OC_NAME_BE;
        case OC_DEVICE_ID3:
+       case OC_DEVICE_ID4:
                return OC_NAME_LANCER;
        case BE_DEVICE_ID2:
                return BE3_NAME;
@@ -84,15 +86,14 @@ static inline char *nic_name(struct pci_dev *pdev)
 #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 MAX_RX_QS              (MAX_RSS_QS + 1) /* RSS qs + 1 def Rx */
+#define BE_MAX_MSIX_VECTORS    (MAX_RX_QS + 1)/* 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)
 
 #define FW_VER_LEN             32
 
-#define BE_MAX_VF              32
-
 struct be_dma_mem {
        void *va;
        dma_addr_t dma;
@@ -154,7 +155,7 @@ struct be_eq_obj {
        u16 min_eqd;            /* in usecs */
        u16 max_eqd;            /* in usecs */
        u16 cur_eqd;            /* in usecs */
-       u8  msix_vec_idx;
+       u8  eq_idx;
 
        struct napi_struct napi;
 };
@@ -213,7 +214,7 @@ struct be_rx_stats {
 
 struct be_rx_compl_info {
        u32 rss_hash;
-       u16 vid;
+       u16 vlan_tag;
        u16 pkt_size;
        u16 rxq_idx;
        u16 mac_id;
@@ -245,6 +246,43 @@ struct be_rx_obj {
 
 struct be_drv_stats {
        u8 be_on_die_temperature;
+       u64 be_tx_events;
+       u64 eth_red_drops;
+       u64 rx_drops_no_pbuf;
+       u64 rx_drops_no_txpb;
+       u64 rx_drops_no_erx_descr;
+       u64 rx_drops_no_tpre_descr;
+       u64 rx_drops_too_many_frags;
+       u64 rx_drops_invalid_ring;
+       u64 forwarded_packets;
+       u64 rx_drops_mtu;
+       u64 rx_crc_errors;
+       u64 rx_alignment_symbol_errors;
+       u64 rx_pause_frames;
+       u64 rx_priority_pause_frames;
+       u64 rx_control_frames;
+       u64 rx_in_range_errors;
+       u64 rx_out_range_errors;
+       u64 rx_frame_too_long;
+       u64 rx_address_match_errors;
+       u64 rx_dropped_too_small;
+       u64 rx_dropped_too_short;
+       u64 rx_dropped_header_too_small;
+       u64 rx_dropped_tcp_length;
+       u64 rx_dropped_runt;
+       u64 rx_ip_checksum_errs;
+       u64 rx_tcp_checksum_errs;
+       u64 rx_udp_checksum_errs;
+       u64 rx_switched_unicast_packets;
+       u64 rx_switched_multicast_packets;
+       u64 rx_switched_broadcast_packets;
+       u64 tx_pauseframes;
+       u64 tx_priority_pauseframes;
+       u64 tx_controlframes;
+       u64 rxpp_fifo_overflow_drop;
+       u64 rx_input_fifo_overflow_drop;
+       u64 pmem_fifo_overflow_drop;
+       u64 jabber_events;
 };
 
 struct be_vf_cfg {
@@ -276,7 +314,7 @@ struct be_adapter {
        spinlock_t mcc_cq_lock;
 
        struct msix_entry msix_entries[BE_MAX_MSIX_VECTORS];
-       bool msix_enabled;
+       u32 num_msix_vec;
        bool isr_registered;
 
        /* TX Rings */
@@ -287,11 +325,11 @@ struct be_adapter {
        u32 cache_line_break[8];
 
        /* Rx rings */
-       struct be_rx_obj rx_obj[MAX_RSS_QS + 1]; /* one default non-rss Q */
+       struct be_rx_obj rx_obj[MAX_RX_QS];
        u32 num_rx_qs;
        u32 big_page_size;      /* Compounded page size shared by rx wrbs */
 
-       u8 msix_vec_next_idx;
+       u8 eq_next_idx;
        struct be_drv_stats drv_stats;
 
        struct vlan_group *vlan_grp;
@@ -308,10 +346,10 @@ struct be_adapter {
        u16 work_counter;
 
        /* Ethtool knobs and info */
-       bool rx_csum;           /* BE card must perform rx-checksumming */
        char fw_ver[FW_VER_LEN];
        u32 if_handle;          /* Used to configure filtering */
        u32 pmac_id;            /* MAC addr handle used by BE card */
+       u32 beacon_state;       /* for set_phys_id */
 
        bool eeh_err;
        bool link_up;
@@ -334,7 +372,7 @@ struct be_adapter {
 
        bool be3_native;
        bool sriov_enabled;
-       struct be_vf_cfg vf_cfg[BE_MAX_VF];
+       struct be_vf_cfg *vf_cfg;
        u8 is_virtfn;
        u32 sli_family;
        u8 hba_port_num;
@@ -347,10 +385,12 @@ struct be_adapter {
 #define BE_GEN2 2
 #define BE_GEN3 3
 
-#define lancer_chip(adapter)           (adapter->pdev->device == OC_DEVICE_ID3)
+#define lancer_chip(adapter)   ((adapter->pdev->device == OC_DEVICE_ID3) || \
+                                (adapter->pdev->device == OC_DEVICE_ID4))
 
 extern const struct ethtool_ops be_ethtool_ops;
 
+#define msix_enabled(adapter)          (adapter->num_msix_vec > 0)
 #define tx_stats(adapter)              (&adapter->tx_stats)
 #define rx_stats(rxo)                  (&rxo->stats)
 
@@ -455,18 +495,10 @@ 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);
-       }
+       pci_read_config_dword(adapter->pdev, SLI_INTF_REG_OFFSET, &sli_intf);
+       adapter->is_virtfn = (sli_intf & SLI_INTF_FT_MASK) ? 1 : 0;
 }
 
 static inline void be_vf_eth_addr_generate(struct be_adapter *adapter, u8 *mac)
@@ -482,9 +514,15 @@ static inline void be_vf_eth_addr_generate(struct be_adapter *adapter, u8 *mac)
        memcpy(mac, adapter->netdev->dev_addr, 3);
 }
 
+static inline bool be_multi_rxq(const struct be_adapter *adapter)
+{
+       return adapter->num_rx_qs > 1;
+}
+
 extern void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm,
                u16 num_popped);
 extern void be_link_status_update(struct be_adapter *adapter, bool link_up);
 extern void netdev_stats_update(struct be_adapter *adapter);
+extern void be_parse_stats(struct be_adapter *adapter);
 extern int be_load_fw(struct be_adapter *adapter, u8 *func);
 #endif                         /* BE_H */
This page took 0.029352 seconds and 5 git commands to generate.