linux/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
<<
>>
Prefs
   1/*
   2 * QLogic qlcnic NIC Driver
   3 * Copyright (c) 2009-2013 QLogic Corporation
   4 *
   5 * See LICENSE.qlcnic for copyright and licensing details.
   6 */
   7
   8#ifndef _QLCNIC_H_
   9#define _QLCNIC_H_
  10
  11#include <linux/module.h>
  12#include <linux/kernel.h>
  13#include <linux/types.h>
  14#include <linux/ioport.h>
  15#include <linux/pci.h>
  16#include <linux/netdevice.h>
  17#include <linux/etherdevice.h>
  18#include <linux/ip.h>
  19#include <linux/in.h>
  20#include <linux/tcp.h>
  21#include <linux/skbuff.h>
  22#include <linux/firmware.h>
  23#include <linux/ethtool.h>
  24#include <linux/mii.h>
  25#include <linux/timer.h>
  26#include <linux/irq.h>
  27#include <linux/vmalloc.h>
  28#include <linux/io.h>
  29#include <asm/byteorder.h>
  30#include <linux/bitops.h>
  31#include <linux/if_vlan.h>
  32
  33#include "qlcnic_hdr.h"
  34#include "qlcnic_hw.h"
  35#include "qlcnic_83xx_hw.h"
  36#include "qlcnic_dcb.h"
  37
  38#define _QLCNIC_LINUX_MAJOR 5
  39#define _QLCNIC_LINUX_MINOR 3
  40#define _QLCNIC_LINUX_SUBVERSION 66
  41#define QLCNIC_LINUX_VERSIONID  "5.3.66"
  42#define QLCNIC_DRV_IDC_VER  0x01
  43#define QLCNIC_DRIVER_VERSION  ((_QLCNIC_LINUX_MAJOR << 16) |\
  44                 (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION))
  45
  46#define QLCNIC_VERSION_CODE(a, b, c)    (((a) << 24) + ((b) << 16) + (c))
  47#define _major(v)       (((v) >> 24) & 0xff)
  48#define _minor(v)       (((v) >> 16) & 0xff)
  49#define _build(v)       ((v) & 0xffff)
  50
  51/* version in image has weird encoding:
  52 *  7:0  - major
  53 * 15:8  - minor
  54 * 31:16 - build (little endian)
  55 */
  56#define QLCNIC_DECODE_VERSION(v) \
  57        QLCNIC_VERSION_CODE(((v) & 0xff), (((v) >> 8) & 0xff), ((v) >> 16))
  58
  59#define QLCNIC_MIN_FW_VERSION     QLCNIC_VERSION_CODE(4, 4, 2)
  60#define QLCNIC_NUM_FLASH_SECTORS (64)
  61#define QLCNIC_FLASH_SECTOR_SIZE (64 * 1024)
  62#define QLCNIC_FLASH_TOTAL_SIZE  (QLCNIC_NUM_FLASH_SECTORS \
  63                                        * QLCNIC_FLASH_SECTOR_SIZE)
  64
  65#define RCV_DESC_RINGSIZE(rds_ring)     \
  66        (sizeof(struct rcv_desc) * (rds_ring)->num_desc)
  67#define RCV_BUFF_RINGSIZE(rds_ring)     \
  68        (sizeof(struct qlcnic_rx_buffer) * rds_ring->num_desc)
  69#define STATUS_DESC_RINGSIZE(sds_ring)  \
  70        (sizeof(struct status_desc) * (sds_ring)->num_desc)
  71#define TX_BUFF_RINGSIZE(tx_ring)       \
  72        (sizeof(struct qlcnic_cmd_buffer) * tx_ring->num_desc)
  73#define TX_DESC_RINGSIZE(tx_ring)       \
  74        (sizeof(struct cmd_desc_type0) * tx_ring->num_desc)
  75
  76#define QLCNIC_P3P_A0           0x50
  77#define QLCNIC_P3P_C0           0x58
  78
  79#define QLCNIC_IS_REVISION_P3P(REVISION)     (REVISION >= QLCNIC_P3P_A0)
  80
  81#define FIRST_PAGE_GROUP_START  0
  82#define FIRST_PAGE_GROUP_END    0x100000
  83
  84#define P3P_MAX_MTU                     (9600)
  85#define P3P_MIN_MTU                     (68)
  86#define QLCNIC_MAX_ETHERHDR                32 /* This contains some padding */
  87
  88#define QLCNIC_P3P_RX_BUF_MAX_LEN         (QLCNIC_MAX_ETHERHDR + ETH_DATA_LEN)
  89#define QLCNIC_P3P_RX_JUMBO_BUF_MAX_LEN   (QLCNIC_MAX_ETHERHDR + P3P_MAX_MTU)
  90#define QLCNIC_CT_DEFAULT_RX_BUF_LEN    2048
  91#define QLCNIC_LRO_BUFFER_EXTRA         2048
  92
  93/* Tx defines */
  94#define QLCNIC_MAX_FRAGS_PER_TX 14
  95#define MAX_TSO_HEADER_DESC     2
  96#define MGMT_CMD_DESC_RESV      4
  97#define TX_STOP_THRESH          ((MAX_SKB_FRAGS >> 2) + MAX_TSO_HEADER_DESC \
  98                                                        + MGMT_CMD_DESC_RESV)
  99#define QLCNIC_MAX_TX_TIMEOUTS  2
 100
 101/* Driver will use 1 Tx ring in INT-x/MSI/SRIOV mode. */
 102#define QLCNIC_SINGLE_RING              1
 103#define QLCNIC_DEF_SDS_RINGS            4
 104#define QLCNIC_DEF_TX_RINGS             4
 105#define QLCNIC_MAX_VNIC_TX_RINGS        4
 106#define QLCNIC_MAX_VNIC_SDS_RINGS       4
 107#define QLCNIC_83XX_MINIMUM_VECTOR      3
 108#define QLCNIC_82XX_MINIMUM_VECTOR      2
 109
 110enum qlcnic_queue_type {
 111        QLCNIC_TX_QUEUE = 1,
 112        QLCNIC_RX_QUEUE,
 113};
 114
 115/* Operational mode for driver */
 116#define QLCNIC_VNIC_MODE        0xFF
 117#define QLCNIC_DEFAULT_MODE     0x0
 118
 119/* Virtual NIC function count */
 120#define QLC_DEFAULT_VNIC_COUNT  8
 121#define QLC_84XX_VNIC_COUNT     16
 122
 123/*
 124 * Following are the states of the Phantom. Phantom will set them and
 125 * Host will read to check if the fields are correct.
 126 */
 127#define PHAN_INITIALIZE_FAILED          0xffff
 128#define PHAN_INITIALIZE_COMPLETE        0xff01
 129
 130/* Host writes the following to notify that it has done the init-handshake */
 131#define PHAN_INITIALIZE_ACK             0xf00f
 132#define PHAN_PEG_RCV_INITIALIZED        0xff01
 133
 134#define NUM_RCV_DESC_RINGS      3
 135
 136#define RCV_RING_NORMAL 0
 137#define RCV_RING_JUMBO  1
 138
 139#define MIN_CMD_DESCRIPTORS             64
 140#define MIN_RCV_DESCRIPTORS             64
 141#define MIN_JUMBO_DESCRIPTORS           32
 142
 143#define MAX_CMD_DESCRIPTORS             1024
 144#define MAX_RCV_DESCRIPTORS_1G          4096
 145#define MAX_RCV_DESCRIPTORS_10G         8192
 146#define MAX_RCV_DESCRIPTORS_VF          2048
 147#define MAX_JUMBO_RCV_DESCRIPTORS_1G    512
 148#define MAX_JUMBO_RCV_DESCRIPTORS_10G   1024
 149
 150#define DEFAULT_RCV_DESCRIPTORS_1G      2048
 151#define DEFAULT_RCV_DESCRIPTORS_10G     4096
 152#define DEFAULT_RCV_DESCRIPTORS_VF      1024
 153#define MAX_RDS_RINGS                   2
 154
 155#define get_next_index(index, length)   \
 156        (((index) + 1) & ((length) - 1))
 157
 158/*
 159 * Following data structures describe the descriptors that will be used.
 160 * Added fileds of tcpHdrSize and ipHdrSize, The driver needs to do it only when
 161 * we are doing LSO (above the 1500 size packet) only.
 162 */
 163struct cmd_desc_type0 {
 164        u8 tcp_hdr_offset;      /* For LSO only */
 165        u8 ip_hdr_offset;       /* For LSO only */
 166        __le16 flags_opcode;    /* 15:13 unused, 12:7 opcode, 6:0 flags */
 167        __le32 nfrags__length;  /* 31:8 total len, 7:0 frag count */
 168
 169        __le64 addr_buffer2;
 170
 171        __le16 encap_descr;     /* 15:10 offset of outer L3 header,
 172                                 * 9:6 number of 32bit words in outer L3 header,
 173                                 * 5 offload outer L4 checksum,
 174                                 * 4 offload outer L3 checksum,
 175                                 * 3 Inner L4 type, TCP=0, UDP=1,
 176                                 * 2 Inner L3 type, IPv4=0, IPv6=1,
 177                                 * 1 Outer L3 type,IPv4=0, IPv6=1,
 178                                 * 0 type of encapsulation, GRE=0, VXLAN=1
 179                                 */
 180        __le16 mss;
 181        u8 port_ctxid;          /* 7:4 ctxid 3:0 port */
 182        u8 hdr_length;          /* LSO only : MAC+IP+TCP Hdr size */
 183        u8 outer_hdr_length;    /* Encapsulation only */
 184        u8 rsvd1;
 185
 186        __le64 addr_buffer3;
 187        __le64 addr_buffer1;
 188
 189        __le16 buffer_length[4];
 190
 191        __le64 addr_buffer4;
 192
 193        u8 eth_addr[ETH_ALEN];
 194        __le16 vlan_TCI;        /* In case of  encapsulation,
 195                                 * this is for outer VLAN
 196                                 */
 197
 198} __attribute__ ((aligned(64)));
 199
 200/* Note: sizeof(rcv_desc) should always be a mutliple of 2 */
 201struct rcv_desc {
 202        __le16 reference_handle;
 203        __le16 reserved;
 204        __le32 buffer_length;   /* allocated buffer length (usually 2K) */
 205        __le64 addr_buffer;
 206} __packed;
 207
 208struct status_desc {
 209        __le64 status_desc_data[2];
 210} __attribute__ ((aligned(16)));
 211
 212/* UNIFIED ROMIMAGE */
 213#define QLCNIC_UNI_FW_MIN_SIZE          0xc8000
 214#define QLCNIC_UNI_DIR_SECT_PRODUCT_TBL 0x0
 215#define QLCNIC_UNI_DIR_SECT_BOOTLD      0x6
 216#define QLCNIC_UNI_DIR_SECT_FW          0x7
 217
 218/*Offsets */
 219#define QLCNIC_UNI_CHIP_REV_OFF         10
 220#define QLCNIC_UNI_FLAGS_OFF            11
 221#define QLCNIC_UNI_BIOS_VERSION_OFF     12
 222#define QLCNIC_UNI_BOOTLD_IDX_OFF       27
 223#define QLCNIC_UNI_FIRMWARE_IDX_OFF     29
 224
 225struct uni_table_desc{
 226        __le32  findex;
 227        __le32  num_entries;
 228        __le32  entry_size;
 229        __le32  reserved[5];
 230};
 231
 232struct uni_data_desc{
 233        __le32  findex;
 234        __le32  size;
 235        __le32  reserved[5];
 236};
 237
 238/* Flash Defines and Structures */
 239#define QLCNIC_FLT_LOCATION     0x3F1000
 240#define QLCNIC_FDT_LOCATION     0x3F0000
 241#define QLCNIC_B0_FW_IMAGE_REGION 0x74
 242#define QLCNIC_C0_FW_IMAGE_REGION 0x97
 243#define QLCNIC_BOOTLD_REGION    0X72
 244struct qlcnic_flt_header {
 245        u16 version;
 246        u16 len;
 247        u16 checksum;
 248        u16 reserved;
 249};
 250
 251struct qlcnic_flt_entry {
 252        u8 region;
 253        u8 reserved0;
 254        u8 attrib;
 255        u8 reserved1;
 256        u32 size;
 257        u32 start_addr;
 258        u32 end_addr;
 259};
 260
 261/* Flash Descriptor Table */
 262struct qlcnic_fdt {
 263        u32     valid;
 264        u16     ver;
 265        u16     len;
 266        u16     cksum;
 267        u16     unused;
 268        u8      model[16];
 269        u8      mfg_id;
 270        u16     id;
 271        u8      flag;
 272        u8      erase_cmd;
 273        u8      alt_erase_cmd;
 274        u8      write_enable_cmd;
 275        u8      write_enable_bits;
 276        u8      write_statusreg_cmd;
 277        u8      unprotected_sec_cmd;
 278        u8      read_manuf_cmd;
 279        u32     block_size;
 280        u32     alt_block_size;
 281        u32     flash_size;
 282        u32     write_enable_data;
 283        u8      readid_addr_len;
 284        u8      write_disable_bits;
 285        u8      read_dev_id_len;
 286        u8      chip_erase_cmd;
 287        u16     read_timeo;
 288        u8      protected_sec_cmd;
 289        u8      resvd[65];
 290};
 291/* Magic number to let user know flash is programmed */
 292#define QLCNIC_BDINFO_MAGIC 0x12345678
 293
 294#define QLCNIC_BRDTYPE_P3P_REF_QG       0x0021
 295#define QLCNIC_BRDTYPE_P3P_HMEZ         0x0022
 296#define QLCNIC_BRDTYPE_P3P_10G_CX4_LP   0x0023
 297#define QLCNIC_BRDTYPE_P3P_4_GB         0x0024
 298#define QLCNIC_BRDTYPE_P3P_IMEZ         0x0025
 299#define QLCNIC_BRDTYPE_P3P_10G_SFP_PLUS 0x0026
 300#define QLCNIC_BRDTYPE_P3P_10000_BASE_T 0x0027
 301#define QLCNIC_BRDTYPE_P3P_XG_LOM       0x0028
 302#define QLCNIC_BRDTYPE_P3P_4_GB_MM      0x0029
 303#define QLCNIC_BRDTYPE_P3P_10G_SFP_CT   0x002a
 304#define QLCNIC_BRDTYPE_P3P_10G_SFP_QT   0x002b
 305#define QLCNIC_BRDTYPE_P3P_10G_CX4      0x0031
 306#define QLCNIC_BRDTYPE_P3P_10G_XFP      0x0032
 307#define QLCNIC_BRDTYPE_P3P_10G_TP       0x0080
 308
 309#define QLCNIC_MSIX_TABLE_OFFSET        0x44
 310
 311/* Flash memory map */
 312#define QLCNIC_BRDCFG_START     0x4000          /* board config */
 313#define QLCNIC_BOOTLD_START     0x10000         /* bootld */
 314#define QLCNIC_IMAGE_START      0x43000         /* compressed image */
 315#define QLCNIC_USER_START       0x3E8000        /* Firmware info */
 316
 317#define QLCNIC_FW_VERSION_OFFSET        (QLCNIC_USER_START+0x408)
 318#define QLCNIC_FW_SIZE_OFFSET           (QLCNIC_USER_START+0x40c)
 319#define QLCNIC_FW_SERIAL_NUM_OFFSET     (QLCNIC_USER_START+0x81c)
 320#define QLCNIC_BIOS_VERSION_OFFSET      (QLCNIC_USER_START+0x83c)
 321
 322#define QLCNIC_BRDTYPE_OFFSET           (QLCNIC_BRDCFG_START+0x8)
 323#define QLCNIC_FW_MAGIC_OFFSET          (QLCNIC_BRDCFG_START+0x128)
 324
 325#define QLCNIC_FW_MIN_SIZE              (0x3fffff)
 326#define QLCNIC_UNIFIED_ROMIMAGE         0
 327#define QLCNIC_FLASH_ROMIMAGE           1
 328#define QLCNIC_UNKNOWN_ROMIMAGE         0xff
 329
 330#define QLCNIC_UNIFIED_ROMIMAGE_NAME    "phanfw.bin"
 331#define QLCNIC_FLASH_ROMIMAGE_NAME      "flash"
 332
 333extern char qlcnic_driver_name[];
 334
 335extern int qlcnic_use_msi;
 336extern int qlcnic_use_msi_x;
 337extern int qlcnic_auto_fw_reset;
 338extern int qlcnic_load_fw_file;
 339
 340/* Number of status descriptors to handle per interrupt */
 341#define MAX_STATUS_HANDLE       (64)
 342
 343/*
 344 * qlcnic_skb_frag{} is to contain mapping info for each SG list. This
 345 * has to be freed when DMA is complete. This is part of qlcnic_tx_buffer{}.
 346 */
 347struct qlcnic_skb_frag {
 348        u64 dma;
 349        u64 length;
 350};
 351
 352/*    Following defines are for the state of the buffers    */
 353#define QLCNIC_BUFFER_FREE      0
 354#define QLCNIC_BUFFER_BUSY      1
 355
 356/*
 357 * There will be one qlcnic_buffer per skb packet.    These will be
 358 * used to save the dma info for pci_unmap_page()
 359 */
 360struct qlcnic_cmd_buffer {
 361        struct sk_buff *skb;
 362        struct qlcnic_skb_frag frag_array[MAX_SKB_FRAGS + 1];
 363        u32 frag_count;
 364};
 365
 366/* In rx_buffer, we do not need multiple fragments as is a single buffer */
 367struct qlcnic_rx_buffer {
 368        u16 ref_handle;
 369        struct sk_buff *skb;
 370        struct list_head list;
 371        u64 dma;
 372};
 373
 374/* Board types */
 375#define QLCNIC_GBE      0x01
 376#define QLCNIC_XGBE     0x02
 377
 378/*
 379 * Interrupt coalescing defaults. The defaults are for 1500 MTU. It is
 380 * adjusted based on configured MTU.
 381 */
 382#define QLCNIC_INTR_COAL_TYPE_RX                1
 383#define QLCNIC_INTR_COAL_TYPE_TX                2
 384#define QLCNIC_INTR_COAL_TYPE_RX_TX             3
 385
 386#define QLCNIC_DEF_INTR_COALESCE_RX_TIME_US     3
 387#define QLCNIC_DEF_INTR_COALESCE_RX_PACKETS     256
 388
 389#define QLCNIC_DEF_INTR_COALESCE_TX_TIME_US     64
 390#define QLCNIC_DEF_INTR_COALESCE_TX_PACKETS     64
 391
 392#define QLCNIC_INTR_DEFAULT                     0x04
 393#define QLCNIC_CONFIG_INTR_COALESCE             3
 394#define QLCNIC_DEV_INFO_SIZE                    2
 395
 396struct qlcnic_nic_intr_coalesce {
 397        u8      type;
 398        u8      sts_ring_mask;
 399        u16     rx_packets;
 400        u16     rx_time_us;
 401        u16     tx_packets;
 402        u16     tx_time_us;
 403        u16     flag;
 404        u32     timer_out;
 405};
 406
 407struct qlcnic_83xx_dump_template_hdr {
 408        u32     type;
 409        u32     offset;
 410        u32     size;
 411        u32     cap_mask;
 412        u32     num_entries;
 413        u32     version;
 414        u32     timestamp;
 415        u32     checksum;
 416        u32     drv_cap_mask;
 417        u32     sys_info[3];
 418        u32     saved_state[16];
 419        u32     cap_sizes[8];
 420        u32     ocm_wnd_reg[16];
 421        u32     rsvd[0];
 422};
 423
 424struct qlcnic_82xx_dump_template_hdr {
 425        u32     type;
 426        u32     offset;
 427        u32     size;
 428        u32     cap_mask;
 429        u32     num_entries;
 430        u32     version;
 431        u32     timestamp;
 432        u32     checksum;
 433        u32     drv_cap_mask;
 434        u32     sys_info[3];
 435        u32     saved_state[16];
 436        u32     cap_sizes[8];
 437        u32     rsvd[7];
 438        u32     capabilities;
 439        u32     rsvd1[0];
 440};
 441
 442#define QLC_PEX_DMA_READ_SIZE   (PAGE_SIZE * 16)
 443
 444struct qlcnic_fw_dump {
 445        u8      clr;    /* flag to indicate if dump is cleared */
 446        bool    enable; /* enable/disable dump */
 447        u32     size;   /* total size of the dump */
 448        u32     cap_mask; /* Current capture mask */
 449        void    *data;  /* dump data area */
 450        void    *tmpl_hdr;
 451        dma_addr_t phys_addr;
 452        void    *dma_buffer;
 453        bool    use_pex_dma;
 454        /* Read only elements which are common between 82xx and 83xx
 455         * template header. Update these values immediately after we read
 456         * template header from Firmware
 457         */
 458        u32     tmpl_hdr_size;
 459        u32     version;
 460        u32     num_entries;
 461        u32     offset;
 462};
 463
 464/*
 465 * One hardware_context{} per adapter
 466 * contains interrupt info as well shared hardware info.
 467 */
 468struct qlcnic_hardware_context {
 469        void __iomem *pci_base0;
 470        void __iomem *ocm_win_crb;
 471
 472        unsigned long pci_len0;
 473
 474        rwlock_t crb_lock;
 475        struct mutex mem_lock;
 476
 477        u8 revision_id;
 478        u8 pci_func;
 479        u8 linkup;
 480        u8 loopback_state;
 481        u8 beacon_state;
 482        u8 has_link_events;
 483        u8 fw_type;
 484        u8 physical_port;
 485        u8 reset_context;
 486        u8 msix_supported;
 487        u8 max_mac_filters;
 488        u8 mc_enabled;
 489        u8 max_mc_count;
 490        u8 diag_test;
 491        u8 num_msix;
 492        u8 nic_mode;
 493        int diag_cnt;
 494
 495        u16 max_uc_count;
 496        u16 port_type;
 497        u16 board_type;
 498        u16 supported_type;
 499
 500        u16 link_speed;
 501        u16 link_duplex;
 502        u16 link_autoneg;
 503        u16 module_type;
 504
 505        u16 op_mode;
 506        u16 switch_mode;
 507        u16 max_tx_ques;
 508        u16 max_rx_ques;
 509        u16 max_mtu;
 510        u32 msg_enable;
 511        u16 total_nic_func;
 512        u16 max_pci_func;
 513        u32 max_vnic_func;
 514        u32 total_pci_func;
 515
 516        u32 capabilities;
 517        u32 extra_capability[3];
 518        u32 temp;
 519        u32 int_vec_bit;
 520        u32 fw_hal_version;
 521        u32 port_config;
 522        struct qlcnic_hardware_ops *hw_ops;
 523        struct qlcnic_nic_intr_coalesce coal;
 524        struct qlcnic_fw_dump fw_dump;
 525        struct qlcnic_fdt fdt;
 526        struct qlc_83xx_reset reset;
 527        struct qlc_83xx_idc idc;
 528        struct qlc_83xx_fw_info *fw_info;
 529        struct qlcnic_intrpt_config *intr_tbl;
 530        struct qlcnic_sriov *sriov;
 531        u32 *reg_tbl;
 532        u32 *ext_reg_tbl;
 533        u32 mbox_aen[QLC_83XX_MBX_AEN_CNT];
 534        u32 mbox_reg[4];
 535        struct qlcnic_mailbox *mailbox;
 536        u8 extend_lb_time;
 537        u8 phys_port_id[ETH_ALEN];
 538        u8 lb_mode;
 539        u8 vxlan_port_count;
 540        u16 vxlan_port;
 541        struct device *hwmon_dev;
 542        u32 post_mode;
 543        bool run_post;
 544};
 545
 546struct qlcnic_adapter_stats {
 547        u64  xmitcalled;
 548        u64  xmitfinished;
 549        u64  rxdropped;
 550        u64  txdropped;
 551        u64  csummed;
 552        u64  rx_pkts;
 553        u64  lro_pkts;
 554        u64  rxbytes;
 555        u64  txbytes;
 556        u64  lrobytes;
 557        u64  lso_frames;
 558        u64  encap_lso_frames;
 559        u64  encap_tx_csummed;
 560        u64  encap_rx_csummed;
 561        u64  xmit_on;
 562        u64  xmit_off;
 563        u64  skb_alloc_failure;
 564        u64  null_rxbuf;
 565        u64  rx_dma_map_error;
 566        u64  tx_dma_map_error;
 567        u64  spurious_intr;
 568        u64  mac_filter_limit_overrun;
 569        u64  mbx_spurious_intr;
 570};
 571
 572/*
 573 * Rcv Descriptor Context. One such per Rcv Descriptor. There may
 574 * be one Rcv Descriptor for normal packets, one for jumbo and may be others.
 575 */
 576struct qlcnic_host_rds_ring {
 577        void __iomem *crb_rcv_producer;
 578        struct rcv_desc *desc_head;
 579        struct qlcnic_rx_buffer *rx_buf_arr;
 580        u32 num_desc;
 581        u32 producer;
 582        u32 dma_size;
 583        u32 skb_size;
 584        u32 flags;
 585        struct list_head free_list;
 586        spinlock_t lock;
 587        dma_addr_t phys_addr;
 588} ____cacheline_internodealigned_in_smp;
 589
 590struct qlcnic_host_sds_ring {
 591        u32 consumer;
 592        u32 num_desc;
 593        void __iomem *crb_sts_consumer;
 594
 595        struct qlcnic_host_tx_ring *tx_ring;
 596        struct status_desc *desc_head;
 597        struct qlcnic_adapter *adapter;
 598        struct napi_struct napi;
 599        struct list_head free_list[NUM_RCV_DESC_RINGS];
 600
 601        void __iomem *crb_intr_mask;
 602        int irq;
 603
 604        dma_addr_t phys_addr;
 605        char name[IFNAMSIZ + 12];
 606} ____cacheline_internodealigned_in_smp;
 607
 608struct qlcnic_tx_queue_stats {
 609        u64 xmit_on;
 610        u64 xmit_off;
 611        u64 xmit_called;
 612        u64 xmit_finished;
 613        u64 tx_bytes;
 614};
 615
 616struct qlcnic_host_tx_ring {
 617        int irq;
 618        void __iomem *crb_intr_mask;
 619        char name[IFNAMSIZ + 12];
 620        u16 ctx_id;
 621
 622        u32 state;
 623        u32 producer;
 624        u32 sw_consumer;
 625        u32 num_desc;
 626
 627        struct qlcnic_tx_queue_stats tx_stats;
 628
 629        void __iomem *crb_cmd_producer;
 630        struct cmd_desc_type0 *desc_head;
 631        struct qlcnic_adapter *adapter;
 632        struct napi_struct napi;
 633        struct qlcnic_cmd_buffer *cmd_buf_arr;
 634        __le32 *hw_consumer;
 635
 636        dma_addr_t phys_addr;
 637        dma_addr_t hw_cons_phys_addr;
 638        struct netdev_queue *txq;
 639        /* Lock to protect Tx descriptors cleanup */
 640        spinlock_t tx_clean_lock;
 641} ____cacheline_internodealigned_in_smp;
 642
 643/*
 644 * Receive context. There is one such structure per instance of the
 645 * receive processing. Any state information that is relevant to
 646 * the receive, and is must be in this structure. The global data may be
 647 * present elsewhere.
 648 */
 649struct qlcnic_recv_context {
 650        struct qlcnic_host_rds_ring *rds_rings;
 651        struct qlcnic_host_sds_ring *sds_rings;
 652        u32 state;
 653        u16 context_id;
 654        u16 virt_port;
 655};
 656
 657/* HW context creation */
 658
 659#define QLCNIC_OS_CRB_RETRY_COUNT       4000
 660
 661#define QLCNIC_CDRP_CMD_BIT             0x80000000
 662
 663/*
 664 * All responses must have the QLCNIC_CDRP_CMD_BIT cleared
 665 * in the crb QLCNIC_CDRP_CRB_OFFSET.
 666 */
 667#define QLCNIC_CDRP_FORM_RSP(rsp)       (rsp)
 668#define QLCNIC_CDRP_IS_RSP(rsp) (((rsp) & QLCNIC_CDRP_CMD_BIT) == 0)
 669
 670#define QLCNIC_CDRP_RSP_OK              0x00000001
 671#define QLCNIC_CDRP_RSP_FAIL            0x00000002
 672#define QLCNIC_CDRP_RSP_TIMEOUT         0x00000003
 673
 674/*
 675 * All commands must have the QLCNIC_CDRP_CMD_BIT set in
 676 * the crb QLCNIC_CDRP_CRB_OFFSET.
 677 */
 678#define QLCNIC_CDRP_FORM_CMD(cmd)       (QLCNIC_CDRP_CMD_BIT | (cmd))
 679
 680#define QLCNIC_RCODE_SUCCESS            0
 681#define QLCNIC_RCODE_INVALID_ARGS       6
 682#define QLCNIC_RCODE_NOT_SUPPORTED      9
 683#define QLCNIC_RCODE_NOT_PERMITTED      10
 684#define QLCNIC_RCODE_NOT_IMPL           15
 685#define QLCNIC_RCODE_INVALID            16
 686#define QLCNIC_RCODE_TIMEOUT            17
 687#define QLCNIC_DESTROY_CTX_RESET        0
 688
 689/*
 690 * Capabilities Announced
 691 */
 692#define QLCNIC_CAP0_LEGACY_CONTEXT      (1)
 693#define QLCNIC_CAP0_LEGACY_MN           (1 << 2)
 694#define QLCNIC_CAP0_LSO                 (1 << 6)
 695#define QLCNIC_CAP0_JUMBO_CONTIGUOUS    (1 << 7)
 696#define QLCNIC_CAP0_LRO_CONTIGUOUS      (1 << 8)
 697#define QLCNIC_CAP0_VALIDOFF            (1 << 11)
 698#define QLCNIC_CAP0_LRO_MSS             (1 << 21)
 699#define QLCNIC_CAP0_TX_MULTI            (1 << 22)
 700
 701/*
 702 * Context state
 703 */
 704#define QLCNIC_HOST_CTX_STATE_FREED     0
 705#define QLCNIC_HOST_CTX_STATE_ACTIVE    2
 706
 707/*
 708 * Rx context
 709 */
 710
 711struct qlcnic_hostrq_sds_ring {
 712        __le64 host_phys_addr;  /* Ring base addr */
 713        __le32 ring_size;               /* Ring entries */
 714        __le16 msi_index;
 715        __le16 rsvd;            /* Padding */
 716} __packed;
 717
 718struct qlcnic_hostrq_rds_ring {
 719        __le64 host_phys_addr;  /* Ring base addr */
 720        __le64 buff_size;               /* Packet buffer size */
 721        __le32 ring_size;               /* Ring entries */
 722        __le32 ring_kind;               /* Class of ring */
 723} __packed;
 724
 725struct qlcnic_hostrq_rx_ctx {
 726        __le64 host_rsp_dma_addr;       /* Response dma'd here */
 727        __le32 capabilities[4];         /* Flag bit vector */
 728        __le32 host_int_crb_mode;       /* Interrupt crb usage */
 729        __le32 host_rds_crb_mode;       /* RDS crb usage */
 730        /* These ring offsets are relative to data[0] below */
 731        __le32 rds_ring_offset; /* Offset to RDS config */
 732        __le32 sds_ring_offset; /* Offset to SDS config */
 733        __le16 num_rds_rings;   /* Count of RDS rings */
 734        __le16 num_sds_rings;   /* Count of SDS rings */
 735        __le16 valid_field_offset;
 736        u8  txrx_sds_binding;
 737        u8  msix_handler;
 738        u8  reserved[128];      /* reserve space for future expansion*/
 739        /* MUST BE 64-bit aligned.
 740           The following is packed:
 741           - N hostrq_rds_rings
 742           - N hostrq_sds_rings */
 743        char data[0];
 744} __packed;
 745
 746struct qlcnic_cardrsp_rds_ring{
 747        __le32 host_producer_crb;       /* Crb to use */
 748        __le32 rsvd1;           /* Padding */
 749} __packed;
 750
 751struct qlcnic_cardrsp_sds_ring {
 752        __le32 host_consumer_crb;       /* Crb to use */
 753        __le32 interrupt_crb;   /* Crb to use */
 754} __packed;
 755
 756struct qlcnic_cardrsp_rx_ctx {
 757        /* These ring offsets are relative to data[0] below */
 758        __le32 rds_ring_offset; /* Offset to RDS config */
 759        __le32 sds_ring_offset; /* Offset to SDS config */
 760        __le32 host_ctx_state;  /* Starting State */
 761        __le32 num_fn_per_port; /* How many PCI fn share the port */
 762        __le16 num_rds_rings;   /* Count of RDS rings */
 763        __le16 num_sds_rings;   /* Count of SDS rings */
 764        __le16 context_id;              /* Handle for context */
 765        u8  phys_port;          /* Physical id of port */
 766        u8  virt_port;          /* Virtual/Logical id of port */
 767        u8  reserved[128];      /* save space for future expansion */
 768        /*  MUST BE 64-bit aligned.
 769           The following is packed:
 770           - N cardrsp_rds_rings
 771           - N cardrs_sds_rings */
 772        char data[0];
 773} __packed;
 774
 775#define SIZEOF_HOSTRQ_RX(HOSTRQ_RX, rds_rings, sds_rings)       \
 776        (sizeof(HOSTRQ_RX) +                                    \
 777        (rds_rings)*(sizeof(struct qlcnic_hostrq_rds_ring)) +           \
 778        (sds_rings)*(sizeof(struct qlcnic_hostrq_sds_ring)))
 779
 780#define SIZEOF_CARDRSP_RX(CARDRSP_RX, rds_rings, sds_rings)     \
 781        (sizeof(CARDRSP_RX) +                                   \
 782        (rds_rings)*(sizeof(struct qlcnic_cardrsp_rds_ring)) +          \
 783        (sds_rings)*(sizeof(struct qlcnic_cardrsp_sds_ring)))
 784
 785/*
 786 * Tx context
 787 */
 788
 789struct qlcnic_hostrq_cds_ring {
 790        __le64 host_phys_addr;  /* Ring base addr */
 791        __le32 ring_size;               /* Ring entries */
 792        __le32 rsvd;            /* Padding */
 793} __packed;
 794
 795struct qlcnic_hostrq_tx_ctx {
 796        __le64 host_rsp_dma_addr;       /* Response dma'd here */
 797        __le64 cmd_cons_dma_addr;       /*  */
 798        __le64 dummy_dma_addr;  /*  */
 799        __le32 capabilities[4]; /* Flag bit vector */
 800        __le32 host_int_crb_mode;       /* Interrupt crb usage */
 801        __le32 rsvd1;           /* Padding */
 802        __le16 rsvd2;           /* Padding */
 803        __le16 interrupt_ctl;
 804        __le16 msi_index;
 805        __le16 rsvd3;           /* Padding */
 806        struct qlcnic_hostrq_cds_ring cds_ring; /* Desc of cds ring */
 807        u8  reserved[128];      /* future expansion */
 808} __packed;
 809
 810struct qlcnic_cardrsp_cds_ring {
 811        __le32 host_producer_crb;       /* Crb to use */
 812        __le32 interrupt_crb;   /* Crb to use */
 813} __packed;
 814
 815struct qlcnic_cardrsp_tx_ctx {
 816        __le32 host_ctx_state;  /* Starting state */
 817        __le16 context_id;              /* Handle for context */
 818        u8  phys_port;          /* Physical id of port */
 819        u8  virt_port;          /* Virtual/Logical id of port */
 820        struct qlcnic_cardrsp_cds_ring cds_ring;        /* Card cds settings */
 821        u8  reserved[128];      /* future expansion */
 822} __packed;
 823
 824#define SIZEOF_HOSTRQ_TX(HOSTRQ_TX)     (sizeof(HOSTRQ_TX))
 825#define SIZEOF_CARDRSP_TX(CARDRSP_TX)   (sizeof(CARDRSP_TX))
 826
 827/* CRB */
 828
 829#define QLCNIC_HOST_RDS_CRB_MODE_UNIQUE 0
 830#define QLCNIC_HOST_RDS_CRB_MODE_SHARED 1
 831#define QLCNIC_HOST_RDS_CRB_MODE_CUSTOM 2
 832#define QLCNIC_HOST_RDS_CRB_MODE_MAX    3
 833
 834#define QLCNIC_HOST_INT_CRB_MODE_UNIQUE 0
 835#define QLCNIC_HOST_INT_CRB_MODE_SHARED 1
 836#define QLCNIC_HOST_INT_CRB_MODE_NORX   2
 837#define QLCNIC_HOST_INT_CRB_MODE_NOTX   3
 838#define QLCNIC_HOST_INT_CRB_MODE_NORXTX 4
 839
 840
 841/* MAC */
 842
 843#define MC_COUNT_P3P    38
 844
 845#define QLCNIC_MAC_NOOP 0
 846#define QLCNIC_MAC_ADD  1
 847#define QLCNIC_MAC_DEL  2
 848#define QLCNIC_MAC_VLAN_ADD     3
 849#define QLCNIC_MAC_VLAN_DEL     4
 850
 851enum qlcnic_mac_type {
 852        QLCNIC_UNICAST_MAC,
 853        QLCNIC_MULTICAST_MAC,
 854        QLCNIC_BROADCAST_MAC,
 855};
 856
 857struct qlcnic_mac_vlan_list {
 858        struct list_head list;
 859        uint8_t mac_addr[ETH_ALEN+2];
 860        u16 vlan_id;
 861        enum qlcnic_mac_type mac_type;
 862};
 863
 864/* MAC Learn */
 865#define NO_MAC_LEARN            0
 866#define DRV_MAC_LEARN           1
 867#define FDB_MAC_LEARN           2
 868
 869#define QLCNIC_HOST_REQUEST     0x13
 870#define QLCNIC_REQUEST          0x14
 871
 872#define QLCNIC_MAC_EVENT        0x1
 873
 874#define QLCNIC_IP_UP            2
 875#define QLCNIC_IP_DOWN          3
 876
 877#define QLCNIC_ILB_MODE         0x1
 878#define QLCNIC_ELB_MODE         0x2
 879#define QLCNIC_LB_MODE_MASK     0x3
 880
 881#define QLCNIC_LINKEVENT        0x1
 882#define QLCNIC_LB_RESPONSE      0x2
 883#define QLCNIC_IS_LB_CONFIGURED(VAL)    \
 884                (VAL == (QLCNIC_LINKEVENT | QLCNIC_LB_RESPONSE))
 885
 886/*
 887 * Driver --> Firmware
 888 */
 889#define QLCNIC_H2C_OPCODE_CONFIG_RSS                    0x1
 890#define QLCNIC_H2C_OPCODE_CONFIG_INTR_COALESCE          0x3
 891#define QLCNIC_H2C_OPCODE_CONFIG_LED                    0x4
 892#define QLCNIC_H2C_OPCODE_LRO_REQUEST                   0x7
 893#define QLCNIC_H2C_OPCODE_SET_MAC_RECEIVE_MODE          0xc
 894#define QLCNIC_H2C_OPCODE_CONFIG_IPADDR         0x12
 895
 896#define QLCNIC_H2C_OPCODE_GET_LINKEVENT         0x15
 897#define QLCNIC_H2C_OPCODE_CONFIG_BRIDGING               0x17
 898#define QLCNIC_H2C_OPCODE_CONFIG_HW_LRO         0x18
 899#define QLCNIC_H2C_OPCODE_CONFIG_LOOPBACK               0x13
 900
 901/*
 902 * Firmware --> Driver
 903 */
 904
 905#define QLCNIC_C2H_OPCODE_CONFIG_LOOPBACK               0x8f
 906#define QLCNIC_C2H_OPCODE_GET_LINKEVENT_RESPONSE        0x8D
 907#define QLCNIC_C2H_OPCODE_GET_DCB_AEN                   0x90
 908
 909#define VPORT_MISS_MODE_DROP            0 /* drop all unmatched */
 910#define VPORT_MISS_MODE_ACCEPT_ALL      1 /* accept all packets */
 911#define VPORT_MISS_MODE_ACCEPT_MULTI    2 /* accept unmatched multicast */
 912
 913#define QLCNIC_LRO_REQUEST_CLEANUP      4
 914
 915/* Capabilites received */
 916#define QLCNIC_FW_CAPABILITY_TSO                BIT_1
 917#define QLCNIC_FW_CAPABILITY_BDG                BIT_8
 918#define QLCNIC_FW_CAPABILITY_FVLANTX            BIT_9
 919#define QLCNIC_FW_CAPABILITY_HW_LRO             BIT_10
 920#define QLCNIC_FW_CAPABILITY_2_MULTI_TX         BIT_4
 921#define QLCNIC_FW_CAPABILITY_MULTI_LOOPBACK     BIT_27
 922#define QLCNIC_FW_CAPABILITY_MORE_CAPS          BIT_31
 923
 924#define QLCNIC_FW_CAPABILITY_2_LRO_MAX_TCP_SEG  BIT_2
 925#define QLCNIC_FW_CAP2_HW_LRO_IPV6              BIT_3
 926#define QLCNIC_FW_CAPABILITY_SET_DRV_VER        BIT_5
 927#define QLCNIC_FW_CAPABILITY_2_BEACON           BIT_7
 928#define QLCNIC_FW_CAPABILITY_2_PER_PORT_ESWITCH_CFG     BIT_9
 929#define QLCNIC_FW_CAPABILITY_2_EXT_ISCSI_DUMP   BIT_13
 930
 931#define QLCNIC_83XX_FW_CAPAB_ENCAP_RX_OFFLOAD   BIT_0
 932#define QLCNIC_83XX_FW_CAPAB_ENCAP_TX_OFFLOAD   BIT_1
 933#define QLCNIC_83XX_FW_CAPAB_ENCAP_CKO_OFFLOAD  BIT_4
 934
 935/* module types */
 936#define LINKEVENT_MODULE_NOT_PRESENT                    1
 937#define LINKEVENT_MODULE_OPTICAL_UNKNOWN                2
 938#define LINKEVENT_MODULE_OPTICAL_SRLR                   3
 939#define LINKEVENT_MODULE_OPTICAL_LRM                    4
 940#define LINKEVENT_MODULE_OPTICAL_SFP_1G                 5
 941#define LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLE       6
 942#define LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLELEN    7
 943#define LINKEVENT_MODULE_TWINAX                         8
 944
 945#define LINKSPEED_10GBPS        10000
 946#define LINKSPEED_1GBPS         1000
 947#define LINKSPEED_100MBPS       100
 948#define LINKSPEED_10MBPS        10
 949
 950#define LINKSPEED_ENCODED_10MBPS        0
 951#define LINKSPEED_ENCODED_100MBPS       1
 952#define LINKSPEED_ENCODED_1GBPS         2
 953
 954#define LINKEVENT_AUTONEG_DISABLED      0
 955#define LINKEVENT_AUTONEG_ENABLED       1
 956
 957#define LINKEVENT_HALF_DUPLEX           0
 958#define LINKEVENT_FULL_DUPLEX           1
 959
 960#define LINKEVENT_LINKSPEED_MBPS        0
 961#define LINKEVENT_LINKSPEED_ENCODED     1
 962
 963/* firmware response header:
 964 *      63:58 - message type
 965 *      57:56 - owner
 966 *      55:53 - desc count
 967 *      52:48 - reserved
 968 *      47:40 - completion id
 969 *      39:32 - opcode
 970 *      31:16 - error code
 971 *      15:00 - reserved
 972 */
 973#define qlcnic_get_nic_msg_opcode(msg_hdr)      \
 974        ((msg_hdr >> 32) & 0xFF)
 975
 976struct qlcnic_fw_msg {
 977        union {
 978                struct {
 979                        u64 hdr;
 980                        u64 body[7];
 981                };
 982                u64 words[8];
 983        };
 984};
 985
 986struct qlcnic_nic_req {
 987        __le64 qhdr;
 988        __le64 req_hdr;
 989        __le64 words[6];
 990} __packed;
 991
 992struct qlcnic_mac_req {
 993        u8 op;
 994        u8 tag;
 995        u8 mac_addr[6];
 996};
 997
 998struct qlcnic_vlan_req {
 999        __le16 vlan_id;
1000        __le16 rsvd[3];
1001} __packed;
1002
1003struct qlcnic_ipaddr {
1004        __be32 ipv4;
1005        __be32 ipv6[4];
1006};
1007
1008#define QLCNIC_MSI_ENABLED              0x02
1009#define QLCNIC_MSIX_ENABLED             0x04
1010#define QLCNIC_LRO_ENABLED              0x01
1011#define QLCNIC_LRO_DISABLED             0x00
1012#define QLCNIC_BRIDGE_ENABLED           0X10
1013#define QLCNIC_DIAG_ENABLED             0x20
1014#define QLCNIC_ESWITCH_ENABLED          0x40
1015#define QLCNIC_ADAPTER_INITIALIZED      0x80
1016#define QLCNIC_TAGGING_ENABLED          0x100
1017#define QLCNIC_MACSPOOF                 0x200
1018#define QLCNIC_MAC_OVERRIDE_DISABLED    0x400
1019#define QLCNIC_PROMISC_DISABLED         0x800
1020#define QLCNIC_NEED_FLR                 0x1000
1021#define QLCNIC_FW_RESET_OWNER           0x2000
1022#define QLCNIC_FW_HANG                  0x4000
1023#define QLCNIC_FW_LRO_MSS_CAP           0x8000
1024#define QLCNIC_TX_INTR_SHARED           0x10000
1025#define QLCNIC_APP_CHANGED_FLAGS        0x20000
1026#define QLCNIC_HAS_PHYS_PORT_ID         0x40000
1027#define QLCNIC_TSS_RSS                  0x80000
1028
1029#define QLCNIC_ADD_VXLAN_PORT           0x100000
1030#define QLCNIC_DEL_VXLAN_PORT           0x200000
1031
1032#define QLCNIC_VLAN_FILTERING           0x800000
1033
1034#define QLCNIC_IS_MSI_FAMILY(adapter) \
1035        ((adapter)->flags & (QLCNIC_MSI_ENABLED | QLCNIC_MSIX_ENABLED))
1036#define QLCNIC_IS_TSO_CAPABLE(adapter)  \
1037        ((adapter)->ahw->capabilities & QLCNIC_FW_CAPABILITY_TSO)
1038
1039#define QLCNIC_BEACON_EANBLE            0xC
1040#define QLCNIC_BEACON_DISABLE           0xD
1041
1042#define QLCNIC_BEACON_ON                2
1043#define QLCNIC_BEACON_OFF               0
1044
1045#define QLCNIC_MSIX_TBL_SPACE           8192
1046#define QLCNIC_PCI_REG_MSIX_TBL         0x44
1047#define QLCNIC_MSIX_TBL_PGSIZE          4096
1048
1049#define QLCNIC_ADAPTER_UP_MAGIC 777
1050
1051#define __QLCNIC_FW_ATTACHED            0
1052#define __QLCNIC_DEV_UP                 1
1053#define __QLCNIC_RESETTING              2
1054#define __QLCNIC_START_FW               4
1055#define __QLCNIC_AER                    5
1056#define __QLCNIC_DIAG_RES_ALLOC         6
1057#define __QLCNIC_LED_ENABLE             7
1058#define __QLCNIC_ELB_INPROGRESS         8
1059#define __QLCNIC_MULTI_TX_UNIQUE        9
1060#define __QLCNIC_SRIOV_ENABLE           10
1061#define __QLCNIC_SRIOV_CAPABLE          11
1062#define __QLCNIC_MBX_POLL_ENABLE        12
1063#define __QLCNIC_DIAG_MODE              13
1064#define __QLCNIC_MAINTENANCE_MODE       16
1065
1066#define QLCNIC_INTERRUPT_TEST           1
1067#define QLCNIC_LOOPBACK_TEST            2
1068#define QLCNIC_LED_TEST         3
1069
1070#define QLCNIC_FILTER_AGE       80
1071#define QLCNIC_READD_AGE        20
1072#define QLCNIC_LB_MAX_FILTERS   64
1073#define QLCNIC_LB_BUCKET_SIZE   32
1074#define QLCNIC_ILB_MAX_RCV_LOOP 10
1075
1076struct qlcnic_filter {
1077        struct hlist_node fnode;
1078        u8 faddr[ETH_ALEN];
1079        u16 vlan_id;
1080        unsigned long ftime;
1081};
1082
1083struct qlcnic_filter_hash {
1084        struct hlist_head *fhead;
1085        u8 fnum;
1086        u16 fmax;
1087        u16 fbucket_size;
1088};
1089
1090/* Mailbox specific data structures */
1091struct qlcnic_mailbox {
1092        struct workqueue_struct *work_q;
1093        struct qlcnic_adapter   *adapter;
1094        const struct qlcnic_mbx_ops *ops;
1095        struct work_struct      work;
1096        struct completion       completion;
1097        struct list_head        cmd_q;
1098        unsigned long           status;
1099        spinlock_t              queue_lock;     /* Mailbox queue lock */
1100        spinlock_t              aen_lock;       /* Mailbox response/AEN lock */
1101        u32                     rsp_status;
1102        u32                     num_cmds;
1103};
1104
1105struct qlcnic_adapter {
1106        struct qlcnic_hardware_context *ahw;
1107        struct qlcnic_recv_context *recv_ctx;
1108        struct qlcnic_host_tx_ring *tx_ring;
1109        struct net_device *netdev;
1110        struct pci_dev *pdev;
1111
1112        unsigned long state;
1113        u32 flags;
1114
1115        u16 num_txd;
1116        u16 num_rxd;
1117        u16 num_jumbo_rxd;
1118        u16 max_rxd;
1119        u16 max_jumbo_rxd;
1120
1121        u8 max_rds_rings;
1122
1123        u8 max_sds_rings; /* max sds rings supported by adapter */
1124        u8 max_tx_rings;  /* max tx rings supported by adapter */
1125
1126        u8 drv_tx_rings;  /* max tx rings supported by driver */
1127        u8 drv_sds_rings; /* max sds rings supported by driver */
1128
1129        u8 drv_tss_rings; /* tss ring input */
1130        u8 drv_rss_rings; /* rss ring input */
1131
1132        u8 rx_csum;
1133        u8 portnum;
1134
1135        u8 fw_wait_cnt;
1136        u8 fw_fail_cnt;
1137        u8 tx_timeo_cnt;
1138        u8 need_fw_reset;
1139        u8 reset_ctx_cnt;
1140
1141        u16 is_up;
1142        u16 rx_pvid;
1143        u16 tx_pvid;
1144
1145        u32 irq;
1146        u32 heartbeat;
1147
1148        u8 dev_state;
1149        u8 reset_ack_timeo;
1150        u8 dev_init_timeo;
1151
1152        u8 mac_addr[ETH_ALEN];
1153
1154        u64 dev_rst_time;
1155        bool drv_mac_learn;
1156        bool fdb_mac_learn;
1157        bool rx_mac_learn;
1158        unsigned long vlans[BITS_TO_LONGS(VLAN_N_VID)];
1159        u8 flash_mfg_id;
1160        struct qlcnic_npar_info *npars;
1161        struct qlcnic_eswitch *eswitch;
1162        struct qlcnic_nic_template *nic_ops;
1163
1164        struct qlcnic_adapter_stats stats;
1165        struct list_head mac_list;
1166
1167        void __iomem    *tgt_mask_reg;
1168        void __iomem    *tgt_status_reg;
1169        void __iomem    *crb_int_state_reg;
1170        void __iomem    *isr_int_vec;
1171
1172        struct msix_entry *msix_entries;
1173        struct workqueue_struct *qlcnic_wq;
1174        struct delayed_work fw_work;
1175        struct delayed_work idc_aen_work;
1176        struct delayed_work mbx_poll_work;
1177        struct qlcnic_dcb *dcb;
1178
1179        struct qlcnic_filter_hash fhash;
1180        struct qlcnic_filter_hash rx_fhash;
1181        struct list_head vf_mc_list;
1182
1183        spinlock_t mac_learn_lock;
1184        /* spinlock for catching rcv filters for eswitch traffic */
1185        spinlock_t rx_mac_learn_lock;
1186        u32 file_prd_off;       /*File fw product offset*/
1187        u32 fw_version;
1188        u32 offload_flags;
1189        const struct firmware *fw;
1190};
1191
1192struct qlcnic_info_le {
1193        __le16  pci_func;
1194        __le16  op_mode;        /* 1 = Priv, 2 = NP, 3 = NP passthru */
1195        __le16  phys_port;
1196        __le16  switch_mode;    /* 0 = disabled, 1 = int, 2 = ext */
1197
1198        __le32  capabilities;
1199        u8      max_mac_filters;
1200        u8      reserved1;
1201        __le16  max_mtu;
1202
1203        __le16  max_tx_ques;
1204        __le16  max_rx_ques;
1205        __le16  min_tx_bw;
1206        __le16  max_tx_bw;
1207        __le32  op_type;
1208        __le16  max_bw_reg_offset;
1209        __le16  max_linkspeed_reg_offset;
1210        __le32  capability1;
1211        __le32  capability2;
1212        __le32  capability3;
1213        __le16  max_tx_mac_filters;
1214        __le16  max_rx_mcast_mac_filters;
1215        __le16  max_rx_ucast_mac_filters;
1216        __le16  max_rx_ip_addr;
1217        __le16  max_rx_lro_flow;
1218        __le16  max_rx_status_rings;
1219        __le16  max_rx_buf_rings;
1220        __le16  max_tx_vlan_keys;
1221        u8      total_pf;
1222        u8      total_rss_engines;
1223        __le16  max_vports;
1224        __le16  linkstate_reg_offset;
1225        __le16  bit_offsets;
1226        __le16  max_local_ipv6_addrs;
1227        __le16  max_remote_ipv6_addrs;
1228        u8      reserved2[56];
1229} __packed;
1230
1231struct qlcnic_info {
1232        u16     pci_func;
1233        u16     op_mode;
1234        u16     phys_port;
1235        u16     switch_mode;
1236        u32     capabilities;
1237        u8      max_mac_filters;
1238        u16     max_mtu;
1239        u16     max_tx_ques;
1240        u16     max_rx_ques;
1241        u16     min_tx_bw;
1242        u16     max_tx_bw;
1243        u32     op_type;
1244        u16     max_bw_reg_offset;
1245        u16     max_linkspeed_reg_offset;
1246        u32     capability1;
1247        u32     capability2;
1248        u32     capability3;
1249        u16     max_tx_mac_filters;
1250        u16     max_rx_mcast_mac_filters;
1251        u16     max_rx_ucast_mac_filters;
1252        u16     max_rx_ip_addr;
1253        u16     max_rx_lro_flow;
1254        u16     max_rx_status_rings;
1255        u16     max_rx_buf_rings;
1256        u16     max_tx_vlan_keys;
1257        u8      total_pf;
1258        u8      total_rss_engines;
1259        u16     max_vports;
1260        u16     linkstate_reg_offset;
1261        u16     bit_offsets;
1262        u16     max_local_ipv6_addrs;
1263        u16     max_remote_ipv6_addrs;
1264};
1265
1266struct qlcnic_pci_info_le {
1267        __le16  id;             /* pci function id */
1268        __le16  active;         /* 1 = Enabled */
1269        __le16  type;           /* 1 = NIC, 2 = FCoE, 3 = iSCSI */
1270        __le16  default_port;   /* default port number */
1271
1272        __le16  tx_min_bw;      /* Multiple of 100mbpc */
1273        __le16  tx_max_bw;
1274        __le16  reserved1[2];
1275
1276        u8      mac[ETH_ALEN];
1277        __le16  func_count;
1278        u8      reserved2[104];
1279
1280} __packed;
1281
1282struct qlcnic_pci_info {
1283        u16     id;
1284        u16     active;
1285        u16     type;
1286        u16     default_port;
1287        u16     tx_min_bw;
1288        u16     tx_max_bw;
1289        u8      mac[ETH_ALEN];
1290        u16  func_count;
1291};
1292
1293struct qlcnic_npar_info {
1294        bool    eswitch_status;
1295        u16     pvid;
1296        u16     min_bw;
1297        u16     max_bw;
1298        u8      phy_port;
1299        u8      type;
1300        u8      active;
1301        u8      enable_pm;
1302        u8      dest_npar;
1303        u8      discard_tagged;
1304        u8      mac_override;
1305        u8      mac_anti_spoof;
1306        u8      promisc_mode;
1307        u8      offload_flags;
1308        u8      pci_func;
1309        u8      mac[ETH_ALEN];
1310};
1311
1312struct qlcnic_eswitch {
1313        u8      port;
1314        u8      active_vports;
1315        u8      active_vlans;
1316        u8      active_ucast_filters;
1317        u8      max_ucast_filters;
1318        u8      max_active_vlans;
1319
1320        u32     flags;
1321#define QLCNIC_SWITCH_ENABLE            BIT_1
1322#define QLCNIC_SWITCH_VLAN_FILTERING    BIT_2
1323#define QLCNIC_SWITCH_PROMISC_MODE      BIT_3
1324#define QLCNIC_SWITCH_PORT_MIRRORING    BIT_4
1325};
1326
1327
1328#define MAX_BW                  100     /* % of link speed */
1329#define MIN_BW                  1       /* % of link speed */
1330#define MAX_VLAN_ID             4095
1331#define MIN_VLAN_ID             2
1332#define DEFAULT_MAC_LEARN       1
1333
1334#define IS_VALID_VLAN(vlan)     (vlan >= MIN_VLAN_ID && vlan < MAX_VLAN_ID)
1335#define IS_VALID_BW(bw)         (bw <= MAX_BW)
1336
1337struct qlcnic_pci_func_cfg {
1338        u16     func_type;
1339        u16     min_bw;
1340        u16     max_bw;
1341        u16     port_num;
1342        u8      pci_func;
1343        u8      func_state;
1344        u8      def_mac_addr[ETH_ALEN];
1345};
1346
1347struct qlcnic_npar_func_cfg {
1348        u32     fw_capab;
1349        u16     port_num;
1350        u16     min_bw;
1351        u16     max_bw;
1352        u16     max_tx_queues;
1353        u16     max_rx_queues;
1354        u8      pci_func;
1355        u8      op_mode;
1356};
1357
1358struct qlcnic_pm_func_cfg {
1359        u8      pci_func;
1360        u8      action;
1361        u8      dest_npar;
1362        u8      reserved[5];
1363};
1364
1365struct qlcnic_esw_func_cfg {
1366        u16     vlan_id;
1367        u8      op_mode;
1368        u8      op_type;
1369        u8      pci_func;
1370        u8      host_vlan_tag;
1371        u8      promisc_mode;
1372        u8      discard_tagged;
1373        u8      mac_override;
1374        u8      mac_anti_spoof;
1375        u8      offload_flags;
1376        u8      reserved[5];
1377};
1378
1379#define QLCNIC_STATS_VERSION            1
1380#define QLCNIC_STATS_PORT               1
1381#define QLCNIC_STATS_ESWITCH            2
1382#define QLCNIC_QUERY_RX_COUNTER         0
1383#define QLCNIC_QUERY_TX_COUNTER         1
1384#define QLCNIC_STATS_NOT_AVAIL  0xffffffffffffffffULL
1385#define QLCNIC_FILL_STATS(VAL1) \
1386        (((VAL1) == QLCNIC_STATS_NOT_AVAIL) ? 0 : VAL1)
1387#define QLCNIC_MAC_STATS 1
1388#define QLCNIC_ESW_STATS 2
1389
1390#define QLCNIC_ADD_ESW_STATS(VAL1, VAL2)\
1391do {    \
1392        if (((VAL1) == QLCNIC_STATS_NOT_AVAIL) && \
1393            ((VAL2) != QLCNIC_STATS_NOT_AVAIL)) \
1394                (VAL1) = (VAL2); \
1395        else if (((VAL1) != QLCNIC_STATS_NOT_AVAIL) && \
1396                 ((VAL2) != QLCNIC_STATS_NOT_AVAIL)) \
1397                        (VAL1) += (VAL2); \
1398} while (0)
1399
1400struct qlcnic_mac_statistics_le {
1401        __le64  mac_tx_frames;
1402        __le64  mac_tx_bytes;
1403        __le64  mac_tx_mcast_pkts;
1404        __le64  mac_tx_bcast_pkts;
1405        __le64  mac_tx_pause_cnt;
1406        __le64  mac_tx_ctrl_pkt;
1407        __le64  mac_tx_lt_64b_pkts;
1408        __le64  mac_tx_lt_127b_pkts;
1409        __le64  mac_tx_lt_255b_pkts;
1410        __le64  mac_tx_lt_511b_pkts;
1411        __le64  mac_tx_lt_1023b_pkts;
1412        __le64  mac_tx_lt_1518b_pkts;
1413        __le64  mac_tx_gt_1518b_pkts;
1414        __le64  rsvd1[3];
1415
1416        __le64  mac_rx_frames;
1417        __le64  mac_rx_bytes;
1418        __le64  mac_rx_mcast_pkts;
1419        __le64  mac_rx_bcast_pkts;
1420        __le64  mac_rx_pause_cnt;
1421        __le64  mac_rx_ctrl_pkt;
1422        __le64  mac_rx_lt_64b_pkts;
1423        __le64  mac_rx_lt_127b_pkts;
1424        __le64  mac_rx_lt_255b_pkts;
1425        __le64  mac_rx_lt_511b_pkts;
1426        __le64  mac_rx_lt_1023b_pkts;
1427        __le64  mac_rx_lt_1518b_pkts;
1428        __le64  mac_rx_gt_1518b_pkts;
1429        __le64  rsvd2[3];
1430
1431        __le64  mac_rx_length_error;
1432        __le64  mac_rx_length_small;
1433        __le64  mac_rx_length_large;
1434        __le64  mac_rx_jabber;
1435        __le64  mac_rx_dropped;
1436        __le64  mac_rx_crc_error;
1437        __le64  mac_align_error;
1438} __packed;
1439
1440struct qlcnic_mac_statistics {
1441        u64     mac_tx_frames;
1442        u64     mac_tx_bytes;
1443        u64     mac_tx_mcast_pkts;
1444        u64     mac_tx_bcast_pkts;
1445        u64     mac_tx_pause_cnt;
1446        u64     mac_tx_ctrl_pkt;
1447        u64     mac_tx_lt_64b_pkts;
1448        u64     mac_tx_lt_127b_pkts;
1449        u64     mac_tx_lt_255b_pkts;
1450        u64     mac_tx_lt_511b_pkts;
1451        u64     mac_tx_lt_1023b_pkts;
1452        u64     mac_tx_lt_1518b_pkts;
1453        u64     mac_tx_gt_1518b_pkts;
1454        u64     rsvd1[3];
1455        u64     mac_rx_frames;
1456        u64     mac_rx_bytes;
1457        u64     mac_rx_mcast_pkts;
1458        u64     mac_rx_bcast_pkts;
1459        u64     mac_rx_pause_cnt;
1460        u64     mac_rx_ctrl_pkt;
1461        u64     mac_rx_lt_64b_pkts;
1462        u64     mac_rx_lt_127b_pkts;
1463        u64     mac_rx_lt_255b_pkts;
1464        u64     mac_rx_lt_511b_pkts;
1465        u64     mac_rx_lt_1023b_pkts;
1466        u64     mac_rx_lt_1518b_pkts;
1467        u64     mac_rx_gt_1518b_pkts;
1468        u64     rsvd2[3];
1469        u64     mac_rx_length_error;
1470        u64     mac_rx_length_small;
1471        u64     mac_rx_length_large;
1472        u64     mac_rx_jabber;
1473        u64     mac_rx_dropped;
1474        u64     mac_rx_crc_error;
1475        u64     mac_align_error;
1476};
1477
1478struct qlcnic_esw_stats_le {
1479        __le16 context_id;
1480        __le16 version;
1481        __le16 size;
1482        __le16 unused;
1483        __le64 unicast_frames;
1484        __le64 multicast_frames;
1485        __le64 broadcast_frames;
1486        __le64 dropped_frames;
1487        __le64 errors;
1488        __le64 local_frames;
1489        __le64 numbytes;
1490        __le64 rsvd[3];
1491} __packed;
1492
1493struct __qlcnic_esw_statistics {
1494        u16     context_id;
1495        u16     version;
1496        u16     size;
1497        u16     unused;
1498        u64     unicast_frames;
1499        u64     multicast_frames;
1500        u64     broadcast_frames;
1501        u64     dropped_frames;
1502        u64     errors;
1503        u64     local_frames;
1504        u64     numbytes;
1505        u64     rsvd[3];
1506};
1507
1508struct qlcnic_esw_statistics {
1509        struct __qlcnic_esw_statistics rx;
1510        struct __qlcnic_esw_statistics tx;
1511};
1512
1513#define QLCNIC_FORCE_FW_DUMP_KEY        0xdeadfeed
1514#define QLCNIC_ENABLE_FW_DUMP           0xaddfeed
1515#define QLCNIC_DISABLE_FW_DUMP          0xbadfeed
1516#define QLCNIC_FORCE_FW_RESET           0xdeaddead
1517#define QLCNIC_SET_QUIESCENT            0xadd00010
1518#define QLCNIC_RESET_QUIESCENT          0xadd00020
1519
1520struct _cdrp_cmd {
1521        u32 num;
1522        u32 *arg;
1523};
1524
1525struct qlcnic_cmd_args {
1526        struct completion       completion;
1527        struct list_head        list;
1528        struct _cdrp_cmd        req;
1529        struct _cdrp_cmd        rsp;
1530        atomic_t                rsp_status;
1531        int                     pay_size;
1532        u32                     rsp_opcode;
1533        u32                     total_cmds;
1534        u32                     op_type;
1535        u32                     type;
1536        u32                     cmd_op;
1537        u32                     *hdr;   /* Back channel message header */
1538        u32                     *pay;   /* Back channel message payload */
1539        u8                      func_num;
1540};
1541
1542int qlcnic_fw_cmd_get_minidump_temp(struct qlcnic_adapter *adapter);
1543int qlcnic_fw_cmd_set_port(struct qlcnic_adapter *adapter, u32 config);
1544int qlcnic_pci_mem_write_2M(struct qlcnic_adapter *, u64 off, u64 data);
1545int qlcnic_pci_mem_read_2M(struct qlcnic_adapter *, u64 off, u64 *data);
1546
1547#define ADDR_IN_RANGE(addr, low, high)  \
1548        (((addr) < (high)) && ((addr) >= (low)))
1549
1550#define QLCRD32(adapter, off, err) \
1551        (adapter->ahw->hw_ops->read_reg)(adapter, off, err)
1552
1553#define QLCWR32(adapter, off, val) \
1554        adapter->ahw->hw_ops->write_reg(adapter, off, val)
1555
1556int qlcnic_pcie_sem_lock(struct qlcnic_adapter *, int, u32);
1557void qlcnic_pcie_sem_unlock(struct qlcnic_adapter *, int);
1558
1559#define qlcnic_rom_lock(a)      \
1560        qlcnic_pcie_sem_lock((a), 2, QLCNIC_ROM_LOCK_ID)
1561#define qlcnic_rom_unlock(a)    \
1562        qlcnic_pcie_sem_unlock((a), 2)
1563#define qlcnic_phy_lock(a)      \
1564        qlcnic_pcie_sem_lock((a), 3, QLCNIC_PHY_LOCK_ID)
1565#define qlcnic_phy_unlock(a)    \
1566        qlcnic_pcie_sem_unlock((a), 3)
1567#define qlcnic_sw_lock(a)       \
1568        qlcnic_pcie_sem_lock((a), 6, 0)
1569#define qlcnic_sw_unlock(a)     \
1570        qlcnic_pcie_sem_unlock((a), 6)
1571#define crb_win_lock(a) \
1572        qlcnic_pcie_sem_lock((a), 7, QLCNIC_CRB_WIN_LOCK_ID)
1573#define crb_win_unlock(a)       \
1574        qlcnic_pcie_sem_unlock((a), 7)
1575
1576#define __QLCNIC_MAX_LED_RATE   0xf
1577#define __QLCNIC_MAX_LED_STATE  0x2
1578
1579#define MAX_CTL_CHECK 1000
1580
1581void qlcnic_prune_lb_filters(struct qlcnic_adapter *adapter);
1582void qlcnic_delete_lb_filters(struct qlcnic_adapter *adapter);
1583int qlcnic_dump_fw(struct qlcnic_adapter *);
1584int qlcnic_enable_fw_dump_state(struct qlcnic_adapter *);
1585bool qlcnic_check_fw_dump_state(struct qlcnic_adapter *);
1586
1587/* Functions from qlcnic_init.c */
1588void qlcnic_schedule_work(struct qlcnic_adapter *, work_func_t, int);
1589int qlcnic_load_firmware(struct qlcnic_adapter *adapter);
1590int qlcnic_need_fw_reset(struct qlcnic_adapter *adapter);
1591void qlcnic_request_firmware(struct qlcnic_adapter *adapter);
1592void qlcnic_release_firmware(struct qlcnic_adapter *adapter);
1593int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter);
1594int qlcnic_setup_idc_param(struct qlcnic_adapter *adapter);
1595int qlcnic_check_flash_fw_ver(struct qlcnic_adapter *adapter);
1596
1597int qlcnic_rom_fast_read(struct qlcnic_adapter *adapter, u32 addr, u32 *valp);
1598int qlcnic_rom_fast_read_words(struct qlcnic_adapter *adapter, int addr,
1599                                u8 *bytes, size_t size);
1600int qlcnic_alloc_sw_resources(struct qlcnic_adapter *adapter);
1601void qlcnic_free_sw_resources(struct qlcnic_adapter *adapter);
1602
1603void __iomem *qlcnic_get_ioaddr(struct qlcnic_hardware_context *, u32);
1604
1605int qlcnic_alloc_hw_resources(struct qlcnic_adapter *adapter);
1606void qlcnic_free_hw_resources(struct qlcnic_adapter *adapter);
1607
1608int qlcnic_fw_create_ctx(struct qlcnic_adapter *adapter);
1609void qlcnic_fw_destroy_ctx(struct qlcnic_adapter *adapter);
1610
1611void qlcnic_reset_rx_buffers_list(struct qlcnic_adapter *adapter);
1612void qlcnic_release_rx_buffers(struct qlcnic_adapter *adapter);
1613void qlcnic_release_tx_buffers(struct qlcnic_adapter *,
1614                               struct qlcnic_host_tx_ring *);
1615
1616int qlcnic_check_fw_status(struct qlcnic_adapter *adapter);
1617void qlcnic_watchdog_task(struct work_struct *work);
1618void qlcnic_post_rx_buffers(struct qlcnic_adapter *adapter,
1619                struct qlcnic_host_rds_ring *rds_ring, u8 ring_id);
1620void qlcnic_set_multi(struct net_device *netdev);
1621void qlcnic_flush_mcast_mac(struct qlcnic_adapter *);
1622int qlcnic_nic_add_mac(struct qlcnic_adapter *, const u8 *, u16,
1623                       enum qlcnic_mac_type);
1624int qlcnic_nic_del_mac(struct qlcnic_adapter *, const u8 *);
1625void qlcnic_82xx_free_mac_list(struct qlcnic_adapter *adapter);
1626int qlcnic_82xx_read_phys_port_id(struct qlcnic_adapter *);
1627
1628int qlcnic_fw_cmd_set_mtu(struct qlcnic_adapter *adapter, int mtu);
1629int qlcnic_fw_cmd_set_drv_version(struct qlcnic_adapter *, u32);
1630int qlcnic_change_mtu(struct net_device *netdev, int new_mtu);
1631netdev_features_t qlcnic_fix_features(struct net_device *netdev,
1632        netdev_features_t features);
1633int qlcnic_set_features(struct net_device *netdev, netdev_features_t features);
1634int qlcnic_config_bridged_mode(struct qlcnic_adapter *adapter, u32 enable);
1635void qlcnic_update_cmd_producer(struct qlcnic_host_tx_ring *);
1636
1637/* Functions from qlcnic_ethtool.c */
1638int qlcnic_check_loopback_buff(unsigned char *, u8 []);
1639int qlcnic_do_lb_test(struct qlcnic_adapter *, u8);
1640
1641/* Functions from qlcnic_main.c */
1642int qlcnic_reset_context(struct qlcnic_adapter *);
1643void qlcnic_diag_free_res(struct net_device *netdev, int);
1644int qlcnic_diag_alloc_res(struct net_device *netdev, int);
1645netdev_tx_t qlcnic_xmit_frame(struct sk_buff *, struct net_device *);
1646void qlcnic_set_tx_ring_count(struct qlcnic_adapter *, u8);
1647void qlcnic_set_sds_ring_count(struct qlcnic_adapter *, u8);
1648int qlcnic_setup_rings(struct qlcnic_adapter *);
1649int qlcnic_validate_rings(struct qlcnic_adapter *, __u32, int);
1650void qlcnic_alloc_lb_filters_mem(struct qlcnic_adapter *adapter);
1651int qlcnic_enable_msix(struct qlcnic_adapter *, u32);
1652void qlcnic_set_drv_version(struct qlcnic_adapter *);
1653
1654/*  eSwitch management functions */
1655int qlcnic_config_switch_port(struct qlcnic_adapter *,
1656                                struct qlcnic_esw_func_cfg *);
1657
1658int qlcnic_get_eswitch_port_config(struct qlcnic_adapter *,
1659                                struct qlcnic_esw_func_cfg *);
1660int qlcnic_config_port_mirroring(struct qlcnic_adapter *, u8, u8, u8);
1661int qlcnic_get_port_stats(struct qlcnic_adapter *, const u8, const u8,
1662                                        struct __qlcnic_esw_statistics *);
1663int qlcnic_get_eswitch_stats(struct qlcnic_adapter *, const u8, u8,
1664                                        struct __qlcnic_esw_statistics *);
1665int qlcnic_clear_esw_stats(struct qlcnic_adapter *adapter, u8, u8, u8);
1666int qlcnic_get_mac_stats(struct qlcnic_adapter *, struct qlcnic_mac_statistics *);
1667
1668void qlcnic_free_mbx_args(struct qlcnic_cmd_args *cmd);
1669
1670int qlcnic_alloc_sds_rings(struct qlcnic_recv_context *, int);
1671void qlcnic_free_sds_rings(struct qlcnic_recv_context *);
1672void qlcnic_advert_link_change(struct qlcnic_adapter *, int);
1673void qlcnic_free_tx_rings(struct qlcnic_adapter *);
1674int qlcnic_alloc_tx_rings(struct qlcnic_adapter *, struct net_device *);
1675void qlcnic_dump_mbx(struct qlcnic_adapter *, struct qlcnic_cmd_args *);
1676
1677void qlcnic_create_sysfs_entries(struct qlcnic_adapter *adapter);
1678void qlcnic_remove_sysfs_entries(struct qlcnic_adapter *adapter);
1679void qlcnic_82xx_add_sysfs(struct qlcnic_adapter *adapter);
1680void qlcnic_82xx_remove_sysfs(struct qlcnic_adapter *adapter);
1681
1682int qlcnicvf_config_bridged_mode(struct qlcnic_adapter *, u32);
1683int qlcnicvf_config_led(struct qlcnic_adapter *, u32, u32);
1684void qlcnic_set_vlan_config(struct qlcnic_adapter *,
1685                            struct qlcnic_esw_func_cfg *);
1686void qlcnic_set_eswitch_port_features(struct qlcnic_adapter *,
1687                                      struct qlcnic_esw_func_cfg *);
1688int qlcnic_setup_tss_rss_intr(struct qlcnic_adapter  *);
1689void qlcnic_down(struct qlcnic_adapter *, struct net_device *);
1690int qlcnic_up(struct qlcnic_adapter *, struct net_device *);
1691void __qlcnic_down(struct qlcnic_adapter *, struct net_device *);
1692void qlcnic_detach(struct qlcnic_adapter *);
1693void qlcnic_teardown_intr(struct qlcnic_adapter *);
1694int qlcnic_attach(struct qlcnic_adapter *);
1695int __qlcnic_up(struct qlcnic_adapter *, struct net_device *);
1696void qlcnic_restore_indev_addr(struct net_device *, unsigned long);
1697
1698int qlcnic_check_temp(struct qlcnic_adapter *);
1699int qlcnic_init_pci_info(struct qlcnic_adapter *);
1700int qlcnic_set_default_offload_settings(struct qlcnic_adapter *);
1701int qlcnic_reset_npar_config(struct qlcnic_adapter *);
1702int qlcnic_set_eswitch_port_config(struct qlcnic_adapter *);
1703int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter);
1704int qlcnic_read_mac_addr(struct qlcnic_adapter *);
1705int qlcnic_setup_netdev(struct qlcnic_adapter *, struct net_device *, int);
1706void qlcnic_set_netdev_features(struct qlcnic_adapter *,
1707                                struct qlcnic_esw_func_cfg *);
1708void qlcnic_sriov_vf_set_multi(struct net_device *);
1709int qlcnic_is_valid_nic_func(struct qlcnic_adapter *, u8);
1710int qlcnic_get_pci_func_type(struct qlcnic_adapter *, u16, u16 *, u16 *,
1711                             u16 *);
1712
1713/*
1714 * QLOGIC Board information
1715 */
1716
1717#define QLCNIC_MAX_BOARD_NAME_LEN 100
1718struct qlcnic_board_info {
1719        unsigned short  vendor;
1720        unsigned short  device;
1721        unsigned short  sub_vendor;
1722        unsigned short  sub_device;
1723        char short_name[QLCNIC_MAX_BOARD_NAME_LEN];
1724};
1725
1726static inline u32 qlcnic_tx_avail(struct qlcnic_host_tx_ring *tx_ring)
1727{
1728        if (likely(tx_ring->producer < tx_ring->sw_consumer))
1729                return tx_ring->sw_consumer - tx_ring->producer;
1730        else
1731                return tx_ring->sw_consumer + tx_ring->num_desc -
1732                                tx_ring->producer;
1733}
1734
1735struct qlcnic_nic_template {
1736        int (*config_bridged_mode) (struct qlcnic_adapter *, u32);
1737        int (*config_led) (struct qlcnic_adapter *, u32, u32);
1738        int (*start_firmware) (struct qlcnic_adapter *);
1739        int (*init_driver) (struct qlcnic_adapter *);
1740        void (*request_reset) (struct qlcnic_adapter *, u32);
1741        void (*cancel_idc_work) (struct qlcnic_adapter *);
1742        int (*napi_add)(struct qlcnic_adapter *, struct net_device *);
1743        void (*napi_del)(struct qlcnic_adapter *);
1744        void (*config_ipaddr)(struct qlcnic_adapter *, __be32, int);
1745        irqreturn_t (*clear_legacy_intr)(struct qlcnic_adapter *);
1746        int (*shutdown)(struct pci_dev *);
1747        int (*resume)(struct qlcnic_adapter *);
1748};
1749
1750struct qlcnic_mbx_ops {
1751        int (*enqueue_cmd) (struct qlcnic_adapter *,
1752                            struct qlcnic_cmd_args *, unsigned long *);
1753        void (*dequeue_cmd) (struct qlcnic_adapter *, struct qlcnic_cmd_args *);
1754        void (*decode_resp) (struct qlcnic_adapter *, struct qlcnic_cmd_args *);
1755        void (*encode_cmd) (struct qlcnic_adapter *, struct qlcnic_cmd_args *);
1756        void (*nofity_fw) (struct qlcnic_adapter *, u8);
1757};
1758
1759int qlcnic_83xx_init_mailbox_work(struct qlcnic_adapter *);
1760void qlcnic_83xx_detach_mailbox_work(struct qlcnic_adapter *);
1761void qlcnic_83xx_reinit_mbx_work(struct qlcnic_mailbox *mbx);
1762void qlcnic_83xx_free_mailbox(struct qlcnic_mailbox *mbx);
1763void qlcnic_update_stats(struct qlcnic_adapter *);
1764
1765/* Adapter hardware abstraction */
1766struct qlcnic_hardware_ops {
1767        void (*read_crb) (struct qlcnic_adapter *, char *, loff_t, size_t);
1768        void (*write_crb) (struct qlcnic_adapter *, char *, loff_t, size_t);
1769        int (*read_reg) (struct qlcnic_adapter *, ulong, int *);
1770        int (*write_reg) (struct qlcnic_adapter *, ulong, u32);
1771        void (*get_ocm_win) (struct qlcnic_hardware_context *);
1772        int (*get_mac_address) (struct qlcnic_adapter *, u8 *, u8);
1773        int (*setup_intr) (struct qlcnic_adapter *);
1774        int (*alloc_mbx_args)(struct qlcnic_cmd_args *,
1775                              struct qlcnic_adapter *, u32);
1776        int (*mbx_cmd) (struct qlcnic_adapter *, struct qlcnic_cmd_args *);
1777        void (*get_func_no) (struct qlcnic_adapter *);
1778        int (*api_lock) (struct qlcnic_adapter *);
1779        void (*api_unlock) (struct qlcnic_adapter *);
1780        void (*add_sysfs) (struct qlcnic_adapter *);
1781        void (*remove_sysfs) (struct qlcnic_adapter *);
1782        void (*process_lb_rcv_ring_diag) (struct qlcnic_host_sds_ring *);
1783        int (*create_rx_ctx) (struct qlcnic_adapter *);
1784        int (*create_tx_ctx) (struct qlcnic_adapter *,
1785        struct qlcnic_host_tx_ring *, int);
1786        void (*del_rx_ctx) (struct qlcnic_adapter *);
1787        void (*del_tx_ctx) (struct qlcnic_adapter *,
1788                            struct qlcnic_host_tx_ring *);
1789        int (*setup_link_event) (struct qlcnic_adapter *, int);
1790        int (*get_nic_info) (struct qlcnic_adapter *, struct qlcnic_info *, u8);
1791        int (*get_pci_info) (struct qlcnic_adapter *, struct qlcnic_pci_info *);
1792        int (*set_nic_info) (struct qlcnic_adapter *, struct qlcnic_info *);
1793        int (*change_macvlan) (struct qlcnic_adapter *, u8*, u16, u8);
1794        void (*napi_enable) (struct qlcnic_adapter *);
1795        void (*napi_disable) (struct qlcnic_adapter *);
1796        int (*config_intr_coal) (struct qlcnic_adapter *,
1797                                 struct ethtool_coalesce *);
1798        int (*config_rss) (struct qlcnic_adapter *, int);
1799        int (*config_hw_lro) (struct qlcnic_adapter *, int);
1800        int (*config_loopback) (struct qlcnic_adapter *, u8);
1801        int (*clear_loopback) (struct qlcnic_adapter *, u8);
1802        int (*config_promisc_mode) (struct qlcnic_adapter *, u32);
1803        void (*change_l2_filter) (struct qlcnic_adapter *, u64 *, u16);
1804        int (*get_board_info) (struct qlcnic_adapter *);
1805        void (*set_mac_filter_count) (struct qlcnic_adapter *);
1806        void (*free_mac_list) (struct qlcnic_adapter *);
1807        int (*read_phys_port_id) (struct qlcnic_adapter *);
1808        pci_ers_result_t (*io_error_detected) (struct pci_dev *,
1809                                               pci_channel_state_t);
1810        pci_ers_result_t (*io_slot_reset) (struct pci_dev *);
1811        void (*io_resume) (struct pci_dev *);
1812        void (*get_beacon_state)(struct qlcnic_adapter *);
1813        void (*enable_sds_intr) (struct qlcnic_adapter *,
1814                                 struct qlcnic_host_sds_ring *);
1815        void (*disable_sds_intr) (struct qlcnic_adapter *,
1816                                  struct qlcnic_host_sds_ring *);
1817        void (*enable_tx_intr) (struct qlcnic_adapter *,
1818                                struct qlcnic_host_tx_ring *);
1819        void (*disable_tx_intr) (struct qlcnic_adapter *,
1820                                 struct qlcnic_host_tx_ring *);
1821        u32 (*get_saved_state)(void *, u32);
1822        void (*set_saved_state)(void *, u32, u32);
1823        void (*cache_tmpl_hdr_values)(struct qlcnic_fw_dump *);
1824        u32 (*get_cap_size)(void *, int);
1825        void (*set_sys_info)(void *, int, u32);
1826        void (*store_cap_mask)(void *, u32);
1827        bool (*encap_rx_offload) (struct qlcnic_adapter *adapter);
1828        bool (*encap_tx_offload) (struct qlcnic_adapter *adapter);
1829};
1830
1831extern struct qlcnic_nic_template qlcnic_vf_ops;
1832
1833static inline bool qlcnic_83xx_encap_tx_offload(struct qlcnic_adapter *adapter)
1834{
1835        return adapter->ahw->extra_capability[0] &
1836               QLCNIC_83XX_FW_CAPAB_ENCAP_TX_OFFLOAD;
1837}
1838
1839static inline bool qlcnic_83xx_encap_rx_offload(struct qlcnic_adapter *adapter)
1840{
1841        return adapter->ahw->extra_capability[0] &
1842               QLCNIC_83XX_FW_CAPAB_ENCAP_RX_OFFLOAD;
1843}
1844
1845static inline bool qlcnic_82xx_encap_tx_offload(struct qlcnic_adapter *adapter)
1846{
1847        return false;
1848}
1849
1850static inline bool qlcnic_82xx_encap_rx_offload(struct qlcnic_adapter *adapter)
1851{
1852        return false;
1853}
1854
1855static inline bool qlcnic_encap_rx_offload(struct qlcnic_adapter *adapter)
1856{
1857        return adapter->ahw->hw_ops->encap_rx_offload(adapter);
1858}
1859
1860static inline bool qlcnic_encap_tx_offload(struct qlcnic_adapter *adapter)
1861{
1862        return adapter->ahw->hw_ops->encap_tx_offload(adapter);
1863}
1864
1865static inline int qlcnic_start_firmware(struct qlcnic_adapter *adapter)
1866{
1867        return adapter->nic_ops->start_firmware(adapter);
1868}
1869
1870static inline void qlcnic_read_crb(struct qlcnic_adapter *adapter, char *buf,
1871                                   loff_t offset, size_t size)
1872{
1873        adapter->ahw->hw_ops->read_crb(adapter, buf, offset, size);
1874}
1875
1876static inline void qlcnic_write_crb(struct qlcnic_adapter *adapter, char *buf,
1877                                    loff_t offset, size_t size)
1878{
1879        adapter->ahw->hw_ops->write_crb(adapter, buf, offset, size);
1880}
1881
1882static inline int qlcnic_hw_write_wx_2M(struct qlcnic_adapter *adapter,
1883                                        ulong off, u32 data)
1884{
1885        return adapter->ahw->hw_ops->write_reg(adapter, off, data);
1886}
1887
1888static inline int qlcnic_get_mac_address(struct qlcnic_adapter *adapter,
1889                                         u8 *mac, u8 function)
1890{
1891        return adapter->ahw->hw_ops->get_mac_address(adapter, mac, function);
1892}
1893
1894static inline int qlcnic_setup_intr(struct qlcnic_adapter *adapter)
1895{
1896        return adapter->ahw->hw_ops->setup_intr(adapter);
1897}
1898
1899static inline int qlcnic_alloc_mbx_args(struct qlcnic_cmd_args *mbx,
1900                                        struct qlcnic_adapter *adapter, u32 arg)
1901{
1902        return adapter->ahw->hw_ops->alloc_mbx_args(mbx, adapter, arg);
1903}
1904
1905static inline int qlcnic_issue_cmd(struct qlcnic_adapter *adapter,
1906                                   struct qlcnic_cmd_args *cmd)
1907{
1908        if (adapter->ahw->hw_ops->mbx_cmd)
1909                return adapter->ahw->hw_ops->mbx_cmd(adapter, cmd);
1910
1911        return -EIO;
1912}
1913
1914static inline void qlcnic_get_func_no(struct qlcnic_adapter *adapter)
1915{
1916        adapter->ahw->hw_ops->get_func_no(adapter);
1917}
1918
1919static inline int qlcnic_api_lock(struct qlcnic_adapter *adapter)
1920{
1921        return adapter->ahw->hw_ops->api_lock(adapter);
1922}
1923
1924static inline void qlcnic_api_unlock(struct qlcnic_adapter *adapter)
1925{
1926        adapter->ahw->hw_ops->api_unlock(adapter);
1927}
1928
1929static inline void qlcnic_add_sysfs(struct qlcnic_adapter *adapter)
1930{
1931        if (adapter->ahw->hw_ops->add_sysfs)
1932                adapter->ahw->hw_ops->add_sysfs(adapter);
1933}
1934
1935static inline void qlcnic_remove_sysfs(struct qlcnic_adapter *adapter)
1936{
1937        if (adapter->ahw->hw_ops->remove_sysfs)
1938                adapter->ahw->hw_ops->remove_sysfs(adapter);
1939}
1940
1941static inline void
1942qlcnic_process_rcv_ring_diag(struct qlcnic_host_sds_ring *sds_ring)
1943{
1944        sds_ring->adapter->ahw->hw_ops->process_lb_rcv_ring_diag(sds_ring);
1945}
1946
1947static inline int qlcnic_fw_cmd_create_rx_ctx(struct qlcnic_adapter *adapter)
1948{
1949        return adapter->ahw->hw_ops->create_rx_ctx(adapter);
1950}
1951
1952static inline int qlcnic_fw_cmd_create_tx_ctx(struct qlcnic_adapter *adapter,
1953                                              struct qlcnic_host_tx_ring *ptr,
1954                                              int ring)
1955{
1956        return adapter->ahw->hw_ops->create_tx_ctx(adapter, ptr, ring);
1957}
1958
1959static inline void qlcnic_fw_cmd_del_rx_ctx(struct qlcnic_adapter *adapter)
1960{
1961        return adapter->ahw->hw_ops->del_rx_ctx(adapter);
1962}
1963
1964static inline void qlcnic_fw_cmd_del_tx_ctx(struct qlcnic_adapter *adapter,
1965                                            struct qlcnic_host_tx_ring *ptr)
1966{
1967        return adapter->ahw->hw_ops->del_tx_ctx(adapter, ptr);
1968}
1969
1970static inline int qlcnic_linkevent_request(struct qlcnic_adapter *adapter,
1971                                           int enable)
1972{
1973        return adapter->ahw->hw_ops->setup_link_event(adapter, enable);
1974}
1975
1976static inline int qlcnic_get_nic_info(struct qlcnic_adapter *adapter,
1977                                      struct qlcnic_info *info, u8 id)
1978{
1979        return adapter->ahw->hw_ops->get_nic_info(adapter, info, id);
1980}
1981
1982static inline int qlcnic_get_pci_info(struct qlcnic_adapter *adapter,
1983                                      struct qlcnic_pci_info *info)
1984{
1985        return adapter->ahw->hw_ops->get_pci_info(adapter, info);
1986}
1987
1988static inline int qlcnic_set_nic_info(struct qlcnic_adapter *adapter,
1989                                      struct qlcnic_info *info)
1990{
1991        return adapter->ahw->hw_ops->set_nic_info(adapter, info);
1992}
1993
1994static inline int qlcnic_sre_macaddr_change(struct qlcnic_adapter *adapter,
1995                                            u8 *addr, u16 id, u8 cmd)
1996{
1997        return adapter->ahw->hw_ops->change_macvlan(adapter, addr, id, cmd);
1998}
1999
2000static inline int qlcnic_napi_add(struct qlcnic_adapter *adapter,
2001                                  struct net_device *netdev)
2002{
2003        return adapter->nic_ops->napi_add(adapter, netdev);
2004}
2005
2006static inline void qlcnic_napi_del(struct qlcnic_adapter *adapter)
2007{
2008        adapter->nic_ops->napi_del(adapter);
2009}
2010
2011static inline void qlcnic_napi_enable(struct qlcnic_adapter *adapter)
2012{
2013        adapter->ahw->hw_ops->napi_enable(adapter);
2014}
2015
2016static inline int __qlcnic_shutdown(struct pci_dev *pdev)
2017{
2018        struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
2019
2020        return adapter->nic_ops->shutdown(pdev);
2021}
2022
2023static inline int __qlcnic_resume(struct qlcnic_adapter *adapter)
2024{
2025        return adapter->nic_ops->resume(adapter);
2026}
2027
2028static inline void qlcnic_napi_disable(struct qlcnic_adapter *adapter)
2029{
2030        adapter->ahw->hw_ops->napi_disable(adapter);
2031}
2032
2033static inline int qlcnic_config_intr_coalesce(struct qlcnic_adapter *adapter,
2034                                              struct ethtool_coalesce *ethcoal)
2035{
2036        return adapter->ahw->hw_ops->config_intr_coal(adapter, ethcoal);
2037}
2038
2039static inline int qlcnic_config_rss(struct qlcnic_adapter *adapter, int enable)
2040{
2041        return adapter->ahw->hw_ops->config_rss(adapter, enable);
2042}
2043
2044static inline int qlcnic_config_hw_lro(struct qlcnic_adapter *adapter,
2045                                       int enable)
2046{
2047        return adapter->ahw->hw_ops->config_hw_lro(adapter, enable);
2048}
2049
2050static inline int qlcnic_set_lb_mode(struct qlcnic_adapter *adapter, u8 mode)
2051{
2052        return adapter->ahw->hw_ops->config_loopback(adapter, mode);
2053}
2054
2055static inline int qlcnic_clear_lb_mode(struct qlcnic_adapter *adapter, u8 mode)
2056{
2057        return adapter->ahw->hw_ops->clear_loopback(adapter, mode);
2058}
2059
2060static inline int qlcnic_nic_set_promisc(struct qlcnic_adapter *adapter,
2061                                         u32 mode)
2062{
2063        return adapter->ahw->hw_ops->config_promisc_mode(adapter, mode);
2064}
2065
2066static inline void qlcnic_change_filter(struct qlcnic_adapter *adapter,
2067                                        u64 *addr, u16 id)
2068{
2069        adapter->ahw->hw_ops->change_l2_filter(adapter, addr, id);
2070}
2071
2072static inline int qlcnic_get_board_info(struct qlcnic_adapter *adapter)
2073{
2074        return adapter->ahw->hw_ops->get_board_info(adapter);
2075}
2076
2077static inline void qlcnic_free_mac_list(struct qlcnic_adapter *adapter)
2078{
2079        return adapter->ahw->hw_ops->free_mac_list(adapter);
2080}
2081
2082static inline void qlcnic_set_mac_filter_count(struct qlcnic_adapter *adapter)
2083{
2084        if (adapter->ahw->hw_ops->set_mac_filter_count)
2085                adapter->ahw->hw_ops->set_mac_filter_count(adapter);
2086}
2087
2088static inline void qlcnic_get_beacon_state(struct qlcnic_adapter *adapter)
2089{
2090        adapter->ahw->hw_ops->get_beacon_state(adapter);
2091}
2092
2093static inline void qlcnic_read_phys_port_id(struct qlcnic_adapter *adapter)
2094{
2095        if (adapter->ahw->hw_ops->read_phys_port_id)
2096                adapter->ahw->hw_ops->read_phys_port_id(adapter);
2097}
2098
2099static inline u32 qlcnic_get_saved_state(struct qlcnic_adapter *adapter,
2100                                         void *t_hdr, u32 index)
2101{
2102        return adapter->ahw->hw_ops->get_saved_state(t_hdr, index);
2103}
2104
2105static inline void qlcnic_set_saved_state(struct qlcnic_adapter *adapter,
2106                                          void *t_hdr, u32 index, u32 value)
2107{
2108        adapter->ahw->hw_ops->set_saved_state(t_hdr, index, value);
2109}
2110
2111static inline void qlcnic_cache_tmpl_hdr_values(struct qlcnic_adapter *adapter,
2112                                                struct qlcnic_fw_dump *fw_dump)
2113{
2114        adapter->ahw->hw_ops->cache_tmpl_hdr_values(fw_dump);
2115}
2116
2117static inline u32 qlcnic_get_cap_size(struct qlcnic_adapter *adapter,
2118                                      void *tmpl_hdr, int index)
2119{
2120        return adapter->ahw->hw_ops->get_cap_size(tmpl_hdr, index);
2121}
2122
2123static inline void qlcnic_set_sys_info(struct qlcnic_adapter *adapter,
2124                                       void *tmpl_hdr, int idx, u32 value)
2125{
2126        adapter->ahw->hw_ops->set_sys_info(tmpl_hdr, idx, value);
2127}
2128
2129static inline void qlcnic_store_cap_mask(struct qlcnic_adapter *adapter,
2130                                         void *tmpl_hdr, u32 mask)
2131{
2132        adapter->ahw->hw_ops->store_cap_mask(tmpl_hdr, mask);
2133}
2134
2135static inline void qlcnic_dev_request_reset(struct qlcnic_adapter *adapter,
2136                                            u32 key)
2137{
2138        if (adapter->nic_ops->request_reset)
2139                adapter->nic_ops->request_reset(adapter, key);
2140}
2141
2142static inline void qlcnic_cancel_idc_work(struct qlcnic_adapter *adapter)
2143{
2144        if (adapter->nic_ops->cancel_idc_work)
2145                adapter->nic_ops->cancel_idc_work(adapter);
2146}
2147
2148static inline irqreturn_t
2149qlcnic_clear_legacy_intr(struct qlcnic_adapter *adapter)
2150{
2151        return adapter->nic_ops->clear_legacy_intr(adapter);
2152}
2153
2154static inline int qlcnic_config_led(struct qlcnic_adapter *adapter, u32 state,
2155                                    u32 rate)
2156{
2157        return adapter->nic_ops->config_led(adapter, state, rate);
2158}
2159
2160static inline void qlcnic_config_ipaddr(struct qlcnic_adapter *adapter,
2161                                        __be32 ip, int cmd)
2162{
2163        adapter->nic_ops->config_ipaddr(adapter, ip, cmd);
2164}
2165
2166static inline bool qlcnic_check_multi_tx(struct qlcnic_adapter *adapter)
2167{
2168        return test_bit(__QLCNIC_MULTI_TX_UNIQUE, &adapter->state);
2169}
2170
2171static inline void
2172qlcnic_82xx_enable_tx_intr(struct qlcnic_adapter *adapter,
2173                           struct qlcnic_host_tx_ring *tx_ring)
2174{
2175        if (qlcnic_check_multi_tx(adapter) &&
2176            !adapter->ahw->diag_test)
2177                writel(0x0, tx_ring->crb_intr_mask);
2178}
2179
2180static inline void
2181qlcnic_82xx_disable_tx_intr(struct qlcnic_adapter *adapter,
2182                            struct qlcnic_host_tx_ring *tx_ring)
2183{
2184        if (qlcnic_check_multi_tx(adapter) &&
2185            !adapter->ahw->diag_test)
2186                writel(1, tx_ring->crb_intr_mask);
2187}
2188
2189static inline void
2190qlcnic_83xx_enable_tx_intr(struct qlcnic_adapter *adapter,
2191                           struct qlcnic_host_tx_ring *tx_ring)
2192{
2193        writel(0, tx_ring->crb_intr_mask);
2194}
2195
2196static inline void
2197qlcnic_83xx_disable_tx_intr(struct qlcnic_adapter *adapter,
2198                            struct qlcnic_host_tx_ring *tx_ring)
2199{
2200        writel(1, tx_ring->crb_intr_mask);
2201}
2202
2203/* Enable MSI-x and INT-x interrupts */
2204static inline void
2205qlcnic_83xx_enable_sds_intr(struct qlcnic_adapter *adapter,
2206                            struct qlcnic_host_sds_ring *sds_ring)
2207{
2208        writel(0, sds_ring->crb_intr_mask);
2209}
2210
2211/* Disable MSI-x and INT-x interrupts */
2212static inline void
2213qlcnic_83xx_disable_sds_intr(struct qlcnic_adapter *adapter,
2214                             struct qlcnic_host_sds_ring *sds_ring)
2215{
2216        writel(1, sds_ring->crb_intr_mask);
2217}
2218
2219static inline void qlcnic_disable_multi_tx(struct qlcnic_adapter *adapter)
2220{
2221        test_and_clear_bit(__QLCNIC_MULTI_TX_UNIQUE, &adapter->state);
2222        adapter->drv_tx_rings = QLCNIC_SINGLE_RING;
2223}
2224
2225/* When operating in a muti tx mode, driver needs to write 0x1
2226 * to src register, instead of 0x0 to disable receiving interrupt.
2227 */
2228static inline void
2229qlcnic_82xx_disable_sds_intr(struct qlcnic_adapter *adapter,
2230                             struct qlcnic_host_sds_ring *sds_ring)
2231{
2232        if (qlcnic_check_multi_tx(adapter) &&
2233            !adapter->ahw->diag_test &&
2234            (adapter->flags & QLCNIC_MSIX_ENABLED))
2235                writel(0x1, sds_ring->crb_intr_mask);
2236        else
2237                writel(0, sds_ring->crb_intr_mask);
2238}
2239
2240static inline void qlcnic_enable_sds_intr(struct qlcnic_adapter *adapter,
2241                                          struct qlcnic_host_sds_ring *sds_ring)
2242{
2243        if (adapter->ahw->hw_ops->enable_sds_intr)
2244                adapter->ahw->hw_ops->enable_sds_intr(adapter, sds_ring);
2245}
2246
2247static inline void
2248qlcnic_disable_sds_intr(struct qlcnic_adapter *adapter,
2249                        struct qlcnic_host_sds_ring *sds_ring)
2250{
2251        if (adapter->ahw->hw_ops->disable_sds_intr)
2252                adapter->ahw->hw_ops->disable_sds_intr(adapter, sds_ring);
2253}
2254
2255static inline void qlcnic_enable_tx_intr(struct qlcnic_adapter *adapter,
2256                                         struct qlcnic_host_tx_ring *tx_ring)
2257{
2258        if (adapter->ahw->hw_ops->enable_tx_intr)
2259                adapter->ahw->hw_ops->enable_tx_intr(adapter, tx_ring);
2260}
2261
2262static inline void qlcnic_disable_tx_intr(struct qlcnic_adapter *adapter,
2263                                          struct qlcnic_host_tx_ring *tx_ring)
2264{
2265        if (adapter->ahw->hw_ops->disable_tx_intr)
2266                adapter->ahw->hw_ops->disable_tx_intr(adapter, tx_ring);
2267}
2268
2269/* When operating in a muti tx mode, driver needs to write 0x0
2270 * to src register, instead of 0x1 to enable receiving interrupts.
2271 */
2272static inline void
2273qlcnic_82xx_enable_sds_intr(struct qlcnic_adapter *adapter,
2274                            struct qlcnic_host_sds_ring *sds_ring)
2275{
2276        if (qlcnic_check_multi_tx(adapter) &&
2277            !adapter->ahw->diag_test &&
2278            (adapter->flags & QLCNIC_MSIX_ENABLED))
2279                writel(0, sds_ring->crb_intr_mask);
2280        else
2281                writel(0x1, sds_ring->crb_intr_mask);
2282
2283        if (!QLCNIC_IS_MSI_FAMILY(adapter))
2284                writel(0xfbff, adapter->tgt_mask_reg);
2285}
2286
2287static inline int qlcnic_get_diag_lock(struct qlcnic_adapter *adapter)
2288{
2289        return test_and_set_bit(__QLCNIC_DIAG_MODE, &adapter->state);
2290}
2291
2292static inline void qlcnic_release_diag_lock(struct qlcnic_adapter *adapter)
2293{
2294        clear_bit(__QLCNIC_DIAG_MODE, &adapter->state);
2295}
2296
2297static inline int qlcnic_check_diag_status(struct qlcnic_adapter *adapter)
2298{
2299        return test_bit(__QLCNIC_DIAG_MODE, &adapter->state);
2300}
2301
2302extern const struct ethtool_ops qlcnic_sriov_vf_ethtool_ops;
2303extern const struct ethtool_ops qlcnic_ethtool_ops;
2304extern const struct ethtool_ops qlcnic_ethtool_failed_ops;
2305
2306#define QLCDB(adapter, lvl, _fmt, _args...) do {        \
2307        if (NETIF_MSG_##lvl & adapter->ahw->msg_enable) \
2308                printk(KERN_INFO "%s: %s: " _fmt,       \
2309                         dev_name(&adapter->pdev->dev), \
2310                        __func__, ##_args);             \
2311        } while (0)
2312
2313#define PCI_DEVICE_ID_QLOGIC_QLE824X            0x8020
2314#define PCI_DEVICE_ID_QLOGIC_QLE834X            0x8030
2315#define PCI_DEVICE_ID_QLOGIC_VF_QLE834X 0x8430
2316#define PCI_DEVICE_ID_QLOGIC_QLE8830            0x8830
2317#define PCI_DEVICE_ID_QLOGIC_VF_QLE8C30         0x8C30
2318#define PCI_DEVICE_ID_QLOGIC_QLE844X            0x8040
2319#define PCI_DEVICE_ID_QLOGIC_VF_QLE844X 0x8440
2320
2321static inline bool qlcnic_82xx_check(struct qlcnic_adapter *adapter)
2322{
2323        unsigned short device = adapter->pdev->device;
2324        return (device == PCI_DEVICE_ID_QLOGIC_QLE824X) ? true : false;
2325}
2326
2327static inline bool qlcnic_84xx_check(struct qlcnic_adapter *adapter)
2328{
2329        unsigned short device = adapter->pdev->device;
2330
2331        return ((device == PCI_DEVICE_ID_QLOGIC_QLE844X) ||
2332                (device == PCI_DEVICE_ID_QLOGIC_VF_QLE844X)) ? true : false;
2333}
2334
2335static inline bool qlcnic_83xx_check(struct qlcnic_adapter *adapter)
2336{
2337        unsigned short device = adapter->pdev->device;
2338        bool status;
2339
2340        status = ((device == PCI_DEVICE_ID_QLOGIC_QLE834X) ||
2341                  (device == PCI_DEVICE_ID_QLOGIC_QLE8830) ||
2342                  (device == PCI_DEVICE_ID_QLOGIC_QLE844X) ||
2343                  (device == PCI_DEVICE_ID_QLOGIC_VF_QLE844X) ||
2344                  (device == PCI_DEVICE_ID_QLOGIC_VF_QLE834X) ||
2345                  (device == PCI_DEVICE_ID_QLOGIC_VF_QLE8C30)) ? true : false;
2346
2347        return status;
2348}
2349
2350static inline bool qlcnic_sriov_pf_check(struct qlcnic_adapter *adapter)
2351{
2352        return (adapter->ahw->op_mode == QLCNIC_SRIOV_PF_FUNC) ? true : false;
2353}
2354
2355static inline bool qlcnic_sriov_vf_check(struct qlcnic_adapter *adapter)
2356{
2357        unsigned short device = adapter->pdev->device;
2358        bool status;
2359
2360        status = ((device == PCI_DEVICE_ID_QLOGIC_VF_QLE834X) ||
2361                  (device == PCI_DEVICE_ID_QLOGIC_VF_QLE844X) ||
2362                  (device == PCI_DEVICE_ID_QLOGIC_VF_QLE8C30)) ? true : false;
2363
2364        return status;
2365}
2366
2367static inline bool qlcnic_83xx_pf_check(struct qlcnic_adapter *adapter)
2368{
2369        unsigned short device = adapter->pdev->device;
2370
2371        return (device == PCI_DEVICE_ID_QLOGIC_QLE834X) ? true : false;
2372}
2373
2374static inline bool qlcnic_83xx_vf_check(struct qlcnic_adapter *adapter)
2375{
2376        unsigned short device = adapter->pdev->device;
2377
2378        return ((device == PCI_DEVICE_ID_QLOGIC_VF_QLE834X) ||
2379                (device == PCI_DEVICE_ID_QLOGIC_VF_QLE8C30)) ? true : false;
2380}
2381
2382static inline bool qlcnic_sriov_check(struct qlcnic_adapter *adapter)
2383{
2384        bool status;
2385
2386        status = (qlcnic_sriov_pf_check(adapter) ||
2387                  qlcnic_sriov_vf_check(adapter)) ? true : false;
2388
2389        return status;
2390}
2391
2392static inline u32 qlcnic_get_vnic_func_count(struct qlcnic_adapter *adapter)
2393{
2394        if (qlcnic_84xx_check(adapter))
2395                return QLC_84XX_VNIC_COUNT;
2396        else
2397                return QLC_DEFAULT_VNIC_COUNT;
2398}
2399
2400static inline void qlcnic_swap32_buffer(u32 *buffer, int count)
2401{
2402#if defined(__BIG_ENDIAN)
2403        u32 *tmp = buffer;
2404        int i;
2405
2406        for (i = 0; i < count; i++) {
2407                *tmp = swab32(*tmp);
2408                tmp++;
2409        }
2410#endif
2411}
2412
2413#ifdef CONFIG_QLCNIC_HWMON
2414void qlcnic_register_hwmon_dev(struct qlcnic_adapter *);
2415void qlcnic_unregister_hwmon_dev(struct qlcnic_adapter *);
2416#else
2417static inline void qlcnic_register_hwmon_dev(struct qlcnic_adapter *adapter)
2418{
2419        return;
2420}
2421static inline void qlcnic_unregister_hwmon_dev(struct qlcnic_adapter *adapter)
2422{
2423        return;
2424}
2425#endif
2426#endif                          /* __QLCNIC_H_ */
2427