linux/drivers/scsi/bfa/bfi.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
   3 * Copyright (c) 2014- QLogic Corporation.
   4 * All rights reserved
   5 * www.qlogic.com
   6 *
   7 * Linux driver for QLogic BR-series Fibre Channel Host Bus Adapter.
   8 *
   9 * This program is free software; you can redistribute it and/or modify it
  10 * under the terms of the GNU General Public License (GPL) Version 2 as
  11 * published by the Free Software Foundation
  12 *
  13 * This program is distributed in the hope that it will be useful, but
  14 * WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16 * General Public License for more details.
  17 */
  18
  19#ifndef __BFI_H__
  20#define __BFI_H__
  21
  22#include "bfa_defs.h"
  23#include "bfa_defs_svc.h"
  24
  25#pragma pack(1)
  26
  27/* Per dma segment max size */
  28#define BFI_MEM_DMA_SEG_SZ      (131072)
  29
  30/* Get number of dma segments required */
  31#define BFI_MEM_DMA_NSEGS(_num_reqs, _req_sz)                           \
  32        ((u16)(((((_num_reqs) * (_req_sz)) + BFI_MEM_DMA_SEG_SZ - 1) &  \
  33         ~(BFI_MEM_DMA_SEG_SZ - 1)) / BFI_MEM_DMA_SEG_SZ))
  34
  35/* Get num dma reqs - that fit in a segment */
  36#define BFI_MEM_NREQS_SEG(_rqsz) (BFI_MEM_DMA_SEG_SZ / (_rqsz))
  37
  38/* Get segment num from tag */
  39#define BFI_MEM_SEG_FROM_TAG(_tag, _rqsz) ((_tag) / BFI_MEM_NREQS_SEG(_rqsz))
  40
  41/* Get dma req offset in a segment */
  42#define BFI_MEM_SEG_REQ_OFFSET(_tag, _sz)       \
  43        ((_tag) - (BFI_MEM_SEG_FROM_TAG(_tag, _sz) * BFI_MEM_NREQS_SEG(_sz)))
  44
  45/*
  46 * BFI FW image type
  47 */
  48#define BFI_FLASH_CHUNK_SZ                      256     /*  Flash chunk size */
  49#define BFI_FLASH_CHUNK_SZ_WORDS        (BFI_FLASH_CHUNK_SZ/sizeof(u32))
  50#define BFI_FLASH_IMAGE_SZ              0x100000
  51
  52/*
  53 * Msg header common to all msgs
  54 */
  55struct bfi_mhdr_s {
  56        u8              msg_class;      /*  @ref bfi_mclass_t               */
  57        u8              msg_id;         /*  msg opcode with in the class   */
  58        union {
  59                struct {
  60                        u8      qid;
  61                        u8      fn_lpu; /*  msg destination                 */
  62                } h2i;
  63                u16     i2htok; /*  token in msgs to host           */
  64        } mtag;
  65};
  66
  67#define bfi_fn_lpu(__fn, __lpu) ((__fn) << 1 | (__lpu))
  68#define bfi_mhdr_2_fn(_mh)      ((_mh)->mtag.h2i.fn_lpu >> 1)
  69
  70#define bfi_h2i_set(_mh, _mc, _op, _fn_lpu) do {                \
  71        (_mh).msg_class         = (_mc);      \
  72        (_mh).msg_id            = (_op);      \
  73        (_mh).mtag.h2i.fn_lpu   = (_fn_lpu);      \
  74} while (0)
  75
  76#define bfi_i2h_set(_mh, _mc, _op, _i2htok) do {                \
  77        (_mh).msg_class         = (_mc);      \
  78        (_mh).msg_id            = (_op);      \
  79        (_mh).mtag.i2htok       = (_i2htok);      \
  80} while (0)
  81
  82/*
  83 * Message opcodes: 0-127 to firmware, 128-255 to host
  84 */
  85#define BFI_I2H_OPCODE_BASE     128
  86#define BFA_I2HM(_x)            ((_x) + BFI_I2H_OPCODE_BASE)
  87
  88/*
  89 ****************************************************************************
  90 *
  91 * Scatter Gather Element and Page definition
  92 *
  93 ****************************************************************************
  94 */
  95
  96#define BFI_SGE_INLINE  1
  97#define BFI_SGE_INLINE_MAX      (BFI_SGE_INLINE + 1)
  98
  99/*
 100 * SG Flags
 101 */
 102enum {
 103        BFI_SGE_DATA            = 0,    /*  data address, not last           */
 104        BFI_SGE_DATA_CPL        = 1,    /*  data addr, last in current page */
 105        BFI_SGE_DATA_LAST       = 3,    /*  data address, last               */
 106        BFI_SGE_LINK            = 2,    /*  link address                     */
 107        BFI_SGE_PGDLEN          = 2,    /*  cumulative data length for page */
 108};
 109
 110/*
 111 * DMA addresses
 112 */
 113union bfi_addr_u {
 114        struct {
 115                __be32  addr_lo;
 116                __be32  addr_hi;
 117        } a32;
 118};
 119
 120/*
 121 * Scatter Gather Element used for fast-path IO requests
 122 */
 123struct bfi_sge_s {
 124#ifdef __BIG_ENDIAN
 125        u32     flags:2,
 126                        rsvd:2,
 127                        sg_len:28;
 128#else
 129        u32     sg_len:28,
 130                        rsvd:2,
 131                        flags:2;
 132#endif
 133        union bfi_addr_u sga;
 134};
 135
 136/**
 137 * Generic DMA addr-len pair.
 138 */
 139struct bfi_alen_s {
 140        union bfi_addr_u        al_addr;        /* DMA addr of buffer   */
 141        u32                     al_len;         /* length of buffer     */
 142};
 143
 144/*
 145 * Scatter Gather Page
 146 */
 147#define BFI_SGPG_DATA_SGES              7
 148#define BFI_SGPG_SGES_MAX               (BFI_SGPG_DATA_SGES + 1)
 149#define BFI_SGPG_RSVD_WD_LEN    8
 150struct bfi_sgpg_s {
 151        struct bfi_sge_s sges[BFI_SGPG_SGES_MAX];
 152        u32     rsvd[BFI_SGPG_RSVD_WD_LEN];
 153};
 154
 155/* FCP module definitions */
 156#define BFI_IO_MAX      (2000)
 157#define BFI_IOIM_SNSLEN (256)
 158#define BFI_IOIM_SNSBUF_SEGS    \
 159        BFI_MEM_DMA_NSEGS(BFI_IO_MAX, BFI_IOIM_SNSLEN)
 160
 161/*
 162 * Large Message structure - 128 Bytes size Msgs
 163 */
 164#define BFI_LMSG_SZ             128
 165#define BFI_LMSG_PL_WSZ \
 166                        ((BFI_LMSG_SZ - sizeof(struct bfi_mhdr_s)) / 4)
 167
 168struct bfi_msg_s {
 169        struct bfi_mhdr_s mhdr;
 170        u32     pl[BFI_LMSG_PL_WSZ];
 171};
 172
 173/*
 174 * Mailbox message structure
 175 */
 176#define BFI_MBMSG_SZ            7
 177struct bfi_mbmsg_s {
 178        struct bfi_mhdr_s       mh;
 179        u32             pl[BFI_MBMSG_SZ];
 180};
 181
 182/*
 183 * Supported PCI function class codes (personality)
 184 */
 185enum bfi_pcifn_class {
 186        BFI_PCIFN_CLASS_FC  = 0x0c04,
 187        BFI_PCIFN_CLASS_ETH = 0x0200,
 188};
 189
 190/*
 191 * Message Classes
 192 */
 193enum bfi_mclass {
 194        BFI_MC_IOC              = 1,    /*  IO Controller (IOC)     */
 195        BFI_MC_DIAG             = 2,    /*  Diagnostic Msgs            */
 196        BFI_MC_FLASH            = 3,    /*  Flash message class */
 197        BFI_MC_CEE              = 4,    /*  CEE */
 198        BFI_MC_FCPORT           = 5,    /*  FC port                         */
 199        BFI_MC_IOCFC            = 6,    /*  FC - IO Controller (IOC)        */
 200        BFI_MC_ABLK             = 7,    /*  ASIC block configuration        */
 201        BFI_MC_UF               = 8,    /*  Unsolicited frame receive       */
 202        BFI_MC_FCXP             = 9,    /*  FC Transport                    */
 203        BFI_MC_LPS              = 10,   /*  lport fc login services         */
 204        BFI_MC_RPORT            = 11,   /*  Remote port             */
 205        BFI_MC_ITN              = 12,   /*  I-T nexus (Initiator mode)      */
 206        BFI_MC_IOIM_READ        = 13,   /*  read IO (Initiator mode)        */
 207        BFI_MC_IOIM_WRITE       = 14,   /*  write IO (Initiator mode)       */
 208        BFI_MC_IOIM_IO          = 15,   /*  IO (Initiator mode)     */
 209        BFI_MC_IOIM             = 16,   /*  IO (Initiator mode)     */
 210        BFI_MC_IOIM_IOCOM       = 17,   /*  good IO completion              */
 211        BFI_MC_TSKIM            = 18,   /*  Initiator Task management       */
 212        BFI_MC_PORT             = 21,   /*  Physical port                   */
 213        BFI_MC_SFP              = 22,   /*  SFP module  */
 214        BFI_MC_PHY              = 25,   /*  External PHY message class  */
 215        BFI_MC_FRU              = 34,
 216        BFI_MC_MAX              = 35
 217};
 218
 219#define BFI_IOC_MAX_CQS         4
 220#define BFI_IOC_MAX_CQS_ASIC    8
 221#define BFI_IOC_MSGLEN_MAX      32      /* 32 bytes */
 222
 223/*
 224 *----------------------------------------------------------------------
 225 *                              IOC
 226 *----------------------------------------------------------------------
 227 */
 228
 229/*
 230 * Different asic generations
 231 */
 232enum bfi_asic_gen {
 233        BFI_ASIC_GEN_CB         = 1,    /* crossbow 8G FC               */
 234        BFI_ASIC_GEN_CT         = 2,    /* catapult 8G FC or 10G CNA    */
 235        BFI_ASIC_GEN_CT2        = 3,    /* catapult-2 16G FC or 10G CNA */
 236};
 237
 238enum bfi_asic_mode {
 239        BFI_ASIC_MODE_FC        = 1,    /* FC upto 8G speed             */
 240        BFI_ASIC_MODE_FC16      = 2,    /* FC upto 16G speed            */
 241        BFI_ASIC_MODE_ETH       = 3,    /* Ethernet ports               */
 242        BFI_ASIC_MODE_COMBO     = 4,    /* FC 16G and Ethernet 10G port */
 243};
 244
 245enum bfi_ioc_h2i_msgs {
 246        BFI_IOC_H2I_ENABLE_REQ          = 1,
 247        BFI_IOC_H2I_DISABLE_REQ         = 2,
 248        BFI_IOC_H2I_GETATTR_REQ         = 3,
 249        BFI_IOC_H2I_DBG_SYNC            = 4,
 250        BFI_IOC_H2I_DBG_DUMP            = 5,
 251};
 252
 253enum bfi_ioc_i2h_msgs {
 254        BFI_IOC_I2H_ENABLE_REPLY        = BFA_I2HM(1),
 255        BFI_IOC_I2H_DISABLE_REPLY       = BFA_I2HM(2),
 256        BFI_IOC_I2H_GETATTR_REPLY       = BFA_I2HM(3),
 257        BFI_IOC_I2H_HBEAT               = BFA_I2HM(4),
 258        BFI_IOC_I2H_ACQ_ADDR_REPLY      = BFA_I2HM(5),
 259};
 260
 261/*
 262 * BFI_IOC_H2I_GETATTR_REQ message
 263 */
 264struct bfi_ioc_getattr_req_s {
 265        struct bfi_mhdr_s       mh;
 266        union bfi_addr_u        attr_addr;
 267};
 268
 269#define BFI_IOC_ATTR_UUID_SZ    16
 270struct bfi_ioc_attr_s {
 271        wwn_t           mfg_pwwn;       /*  Mfg port wwn           */
 272        wwn_t           mfg_nwwn;       /*  Mfg node wwn           */
 273        mac_t           mfg_mac;        /*  Mfg mac                */
 274        u8              port_mode;      /* bfi_port_mode           */
 275        u8              rsvd_a;
 276        wwn_t           pwwn;
 277        wwn_t           nwwn;
 278        mac_t           mac;            /*  PBC or Mfg mac         */
 279        u16     rsvd_b;
 280        mac_t           fcoe_mac;
 281        u16     rsvd_c;
 282        char            brcd_serialnum[STRSZ(BFA_MFG_SERIALNUM_SIZE)];
 283        u8              pcie_gen;
 284        u8              pcie_lanes_orig;
 285        u8              pcie_lanes;
 286        u8              rx_bbcredit;    /*  receive buffer credits */
 287        u32     adapter_prop;   /*  adapter properties     */
 288        u16     maxfrsize;      /*  max receive frame size */
 289        char            asic_rev;
 290        u8              rsvd_d;
 291        char            fw_version[BFA_VERSION_LEN];
 292        char            optrom_version[BFA_VERSION_LEN];
 293        struct          bfa_mfg_vpd_s   vpd;
 294        u32     card_type;      /*  card type                   */
 295        u8      mfg_day;        /* manufacturing day */
 296        u8      mfg_month;      /* manufacturing month */
 297        u16     mfg_year;       /* manufacturing year */
 298        u8      uuid[BFI_IOC_ATTR_UUID_SZ];     /*!< chinook uuid */
 299};
 300
 301/*
 302 * BFI_IOC_I2H_GETATTR_REPLY message
 303 */
 304struct bfi_ioc_getattr_reply_s {
 305        struct  bfi_mhdr_s      mh;     /*  Common msg header           */
 306        u8                      status; /*  cfg reply status            */
 307        u8                      rsvd[3];
 308};
 309
 310/*
 311 * Firmware memory page offsets
 312 */
 313#define BFI_IOC_SMEM_PG0_CB     (0x40)
 314#define BFI_IOC_SMEM_PG0_CT     (0x180)
 315
 316/*
 317 * Firmware statistic offset
 318 */
 319#define BFI_IOC_FWSTATS_OFF     (0x6B40)
 320#define BFI_IOC_FWSTATS_SZ      (4096)
 321
 322/*
 323 * Firmware trace offset
 324 */
 325#define BFI_IOC_TRC_OFF         (0x4b00)
 326#define BFI_IOC_TRC_ENTS        256
 327
 328#define BFI_IOC_FW_SIGNATURE    (0xbfadbfad)
 329#define BFA_IOC_FW_INV_SIGN     (0xdeaddead)
 330#define BFI_IOC_MD5SUM_SZ       4
 331
 332struct bfi_ioc_fwver_s {
 333#ifdef __BIG_ENDIAN
 334        uint8_t patch;
 335        uint8_t maint;
 336        uint8_t minor;
 337        uint8_t major;
 338        uint8_t rsvd[2];
 339        uint8_t build;
 340        uint8_t phase;
 341#else
 342        uint8_t major;
 343        uint8_t minor;
 344        uint8_t maint;
 345        uint8_t patch;
 346        uint8_t phase;
 347        uint8_t build;
 348        uint8_t rsvd[2];
 349#endif
 350};
 351
 352struct bfi_ioc_image_hdr_s {
 353        u32     signature;      /* constant signature           */
 354        u8      asic_gen;       /* asic generation              */
 355        u8      asic_mode;
 356        u8      port0_mode;     /* device mode for port 0       */
 357        u8      port1_mode;     /* device mode for port 1       */
 358        u32     exec;           /* exec vector                  */
 359        u32     bootenv;        /* fimware boot env             */
 360        u32     rsvd_b[2];
 361        struct bfi_ioc_fwver_s  fwver;
 362        u32     md5sum[BFI_IOC_MD5SUM_SZ];
 363};
 364
 365enum bfi_ioc_img_ver_cmp_e {
 366        BFI_IOC_IMG_VER_INCOMP,
 367        BFI_IOC_IMG_VER_OLD,
 368        BFI_IOC_IMG_VER_SAME,
 369        BFI_IOC_IMG_VER_BETTER
 370};
 371
 372#define BFI_FWBOOT_DEVMODE_OFF          4
 373#define BFI_FWBOOT_TYPE_OFF             8
 374#define BFI_FWBOOT_ENV_OFF              12
 375#define BFI_FWBOOT_DEVMODE(__asic_gen, __asic_mode, __p0_mode, __p1_mode) \
 376        (((u32)(__asic_gen)) << 24 |            \
 377         ((u32)(__asic_mode)) << 16 |           \
 378         ((u32)(__p0_mode)) << 8 |              \
 379         ((u32)(__p1_mode)))
 380
 381enum bfi_fwboot_type {
 382        BFI_FWBOOT_TYPE_NORMAL  = 0,
 383        BFI_FWBOOT_TYPE_FLASH   = 1,
 384        BFI_FWBOOT_TYPE_MEMTEST = 2,
 385};
 386
 387#define BFI_FWBOOT_TYPE_NORMAL  0
 388#define BFI_FWBOOT_TYPE_MEMTEST 2
 389#define BFI_FWBOOT_ENV_OS       0
 390
 391enum bfi_port_mode {
 392        BFI_PORT_MODE_FC        = 1,
 393        BFI_PORT_MODE_ETH       = 2,
 394};
 395
 396struct bfi_ioc_hbeat_s {
 397        struct bfi_mhdr_s  mh;          /*  common msg header           */
 398        u32        hb_count;    /*  current heart beat count    */
 399};
 400
 401/*
 402 * IOC hardware/firmware state
 403 */
 404enum bfi_ioc_state {
 405        BFI_IOC_UNINIT          = 0,    /*  not initialized                  */
 406        BFI_IOC_INITING         = 1,    /*  h/w is being initialized         */
 407        BFI_IOC_HWINIT          = 2,    /*  h/w is initialized               */
 408        BFI_IOC_CFG             = 3,    /*  IOC configuration in progress   */
 409        BFI_IOC_OP              = 4,    /*  IOC is operational               */
 410        BFI_IOC_DISABLING       = 5,    /*  IOC is being disabled            */
 411        BFI_IOC_DISABLED        = 6,    /*  IOC is disabled                  */
 412        BFI_IOC_CFG_DISABLED    = 7,    /*  IOC is being disabled;transient */
 413        BFI_IOC_FAIL            = 8,    /*  IOC heart-beat failure           */
 414        BFI_IOC_MEMTEST         = 9,    /*  IOC is doing memtest             */
 415};
 416
 417#define BFA_IOC_CB_JOIN_SH      16
 418#define BFA_IOC_CB_FWSTATE_MASK 0x0000ffff
 419#define BFA_IOC_CB_JOIN_MASK    0xffff0000
 420
 421#define BFI_IOC_ENDIAN_SIG  0x12345678
 422
 423enum {
 424        BFI_ADAPTER_TYPE_FC     = 0x01,         /*  FC adapters    */
 425        BFI_ADAPTER_TYPE_MK     = 0x0f0000,     /*  adapter type mask     */
 426        BFI_ADAPTER_TYPE_SH     = 16,           /*  adapter type shift    */
 427        BFI_ADAPTER_NPORTS_MK   = 0xff00,       /*  number of ports mask  */
 428        BFI_ADAPTER_NPORTS_SH   = 8,            /*  number of ports shift */
 429        BFI_ADAPTER_SPEED_MK    = 0xff,         /*  adapter speed mask    */
 430        BFI_ADAPTER_SPEED_SH    = 0,            /*  adapter speed shift   */
 431        BFI_ADAPTER_PROTO       = 0x100000,     /*  prototype adapaters   */
 432        BFI_ADAPTER_TTV         = 0x200000,     /*  TTV debug capable     */
 433        BFI_ADAPTER_UNSUPP      = 0x400000,     /*  unknown adapter type  */
 434};
 435
 436#define BFI_ADAPTER_GETP(__prop, __adap_prop)                   \
 437        (((__adap_prop) & BFI_ADAPTER_ ## __prop ## _MK) >>     \
 438                BFI_ADAPTER_ ## __prop ## _SH)
 439#define BFI_ADAPTER_SETP(__prop, __val)                         \
 440        ((__val) << BFI_ADAPTER_ ## __prop ## _SH)
 441#define BFI_ADAPTER_IS_PROTO(__adap_type)                       \
 442        ((__adap_type) & BFI_ADAPTER_PROTO)
 443#define BFI_ADAPTER_IS_TTV(__adap_type)                         \
 444        ((__adap_type) & BFI_ADAPTER_TTV)
 445#define BFI_ADAPTER_IS_UNSUPP(__adap_type)                      \
 446        ((__adap_type) & BFI_ADAPTER_UNSUPP)
 447#define BFI_ADAPTER_IS_SPECIAL(__adap_type)                     \
 448        ((__adap_type) & (BFI_ADAPTER_TTV | BFI_ADAPTER_PROTO | \
 449                        BFI_ADAPTER_UNSUPP))
 450
 451/*
 452 * BFI_IOC_H2I_ENABLE_REQ & BFI_IOC_H2I_DISABLE_REQ messages
 453 */
 454struct bfi_ioc_ctrl_req_s {
 455        struct bfi_mhdr_s       mh;
 456        u16                     clscode;
 457        u16                     rsvd;
 458        u32             tv_sec;
 459};
 460#define bfi_ioc_enable_req_t struct bfi_ioc_ctrl_req_s;
 461#define bfi_ioc_disable_req_t struct bfi_ioc_ctrl_req_s;
 462
 463/*
 464 * BFI_IOC_I2H_ENABLE_REPLY & BFI_IOC_I2H_DISABLE_REPLY messages
 465 */
 466struct bfi_ioc_ctrl_reply_s {
 467        struct bfi_mhdr_s       mh;             /*  Common msg header     */
 468        u8                      status;         /*  enable/disable status */
 469        u8                      port_mode;      /*  bfa_mode_s  */
 470        u8                      cap_bm;         /*  capability bit mask */
 471        u8                      rsvd;
 472};
 473#define bfi_ioc_enable_reply_t struct bfi_ioc_ctrl_reply_s;
 474#define bfi_ioc_disable_reply_t struct bfi_ioc_ctrl_reply_s;
 475
 476#define BFI_IOC_MSGSZ   8
 477/*
 478 * H2I Messages
 479 */
 480union bfi_ioc_h2i_msg_u {
 481        struct bfi_mhdr_s               mh;
 482        struct bfi_ioc_ctrl_req_s       enable_req;
 483        struct bfi_ioc_ctrl_req_s       disable_req;
 484        struct bfi_ioc_getattr_req_s    getattr_req;
 485        u32                     mboxmsg[BFI_IOC_MSGSZ];
 486};
 487
 488/*
 489 * I2H Messages
 490 */
 491union bfi_ioc_i2h_msg_u {
 492        struct bfi_mhdr_s               mh;
 493        struct bfi_ioc_ctrl_reply_s     fw_event;
 494        u32                     mboxmsg[BFI_IOC_MSGSZ];
 495};
 496
 497
 498/*
 499 *----------------------------------------------------------------------
 500 *                              PBC
 501 *----------------------------------------------------------------------
 502 */
 503
 504#define BFI_PBC_MAX_BLUNS       8
 505#define BFI_PBC_MAX_VPORTS      16
 506#define BFI_PBC_PORT_DISABLED   2
 507
 508/*
 509 * PBC boot lun configuration
 510 */
 511struct bfi_pbc_blun_s {
 512        wwn_t           tgt_pwwn;
 513        struct scsi_lun tgt_lun;
 514};
 515
 516/*
 517 * PBC virtual port configuration
 518 */
 519struct bfi_pbc_vport_s {
 520        wwn_t           vp_pwwn;
 521        wwn_t           vp_nwwn;
 522};
 523
 524/*
 525 * BFI pre-boot configuration information
 526 */
 527struct bfi_pbc_s {
 528        u8              port_enabled;
 529        u8              boot_enabled;
 530        u8              nbluns;
 531        u8              nvports;
 532        u8              port_speed;
 533        u8              rsvd_a;
 534        u16     hss;
 535        wwn_t           pbc_pwwn;
 536        wwn_t           pbc_nwwn;
 537        struct bfi_pbc_blun_s blun[BFI_PBC_MAX_BLUNS];
 538        struct bfi_pbc_vport_s vport[BFI_PBC_MAX_VPORTS];
 539};
 540
 541/*
 542 *----------------------------------------------------------------------
 543 *                              MSGQ
 544 *----------------------------------------------------------------------
 545 */
 546#define BFI_MSGQ_FULL(_q)       (((_q->pi + 1) % _q->q_depth) == _q->ci)
 547#define BFI_MSGQ_EMPTY(_q)      (_q->pi == _q->ci)
 548#define BFI_MSGQ_UPDATE_CI(_q)  (_q->ci = (_q->ci + 1) % _q->q_depth)
 549#define BFI_MSGQ_UPDATE_PI(_q)  (_q->pi = (_q->pi + 1) % _q->q_depth)
 550
 551/* q_depth must be power of 2 */
 552#define BFI_MSGQ_FREE_CNT(_q)   ((_q->ci - _q->pi - 1) & (_q->q_depth - 1))
 553
 554enum bfi_msgq_h2i_msgs_e {
 555        BFI_MSGQ_H2I_INIT_REQ   = 1,
 556        BFI_MSGQ_H2I_DOORBELL   = 2,
 557        BFI_MSGQ_H2I_SHUTDOWN   = 3,
 558};
 559
 560enum bfi_msgq_i2h_msgs_e {
 561        BFI_MSGQ_I2H_INIT_RSP   = 1,
 562        BFI_MSGQ_I2H_DOORBELL   = 2,
 563};
 564
 565
 566/* Messages(commands/responsed/AENS will have the following header */
 567struct bfi_msgq_mhdr_s {
 568        u8              msg_class;
 569        u8              msg_id;
 570        u16     msg_token;
 571        u16     num_entries;
 572        u8              enet_id;
 573        u8              rsvd[1];
 574};
 575
 576#define bfi_msgq_mhdr_set(_mh, _mc, _mid, _tok, _enet_id) do {        \
 577        (_mh).msg_class         = (_mc);      \
 578        (_mh).msg_id            = (_mid);      \
 579        (_mh).msg_token         = (_tok);      \
 580        (_mh).enet_id           = (_enet_id);      \
 581} while (0)
 582
 583/*
 584 * Mailbox  for messaging interface
 585 *
 586*/
 587#define BFI_MSGQ_CMD_ENTRY_SIZE         (64)    /* TBD */
 588#define BFI_MSGQ_RSP_ENTRY_SIZE         (64)    /* TBD */
 589#define BFI_MSGQ_MSG_SIZE_MAX           (2048)  /* TBD */
 590
 591struct bfi_msgq_s {
 592        union bfi_addr_u addr;
 593        u16 q_depth;     /* Total num of entries in the queue */
 594        u8 rsvd[2];
 595};
 596
 597/* BFI_ENET_MSGQ_CFG_REQ TBD init or cfg? */
 598struct bfi_msgq_cfg_req_s {
 599        struct bfi_mhdr_s mh;
 600        struct bfi_msgq_s cmdq;
 601        struct bfi_msgq_s rspq;
 602};
 603
 604/* BFI_ENET_MSGQ_CFG_RSP */
 605struct bfi_msgq_cfg_rsp_s {
 606        struct bfi_mhdr_s mh;
 607        u8 cmd_status;
 608        u8 rsvd[3];
 609};
 610
 611
 612/* BFI_MSGQ_H2I_DOORBELL */
 613struct bfi_msgq_h2i_db_s {
 614        struct bfi_mhdr_s mh;
 615        u16 cmdq_pi;
 616        u16 rspq_ci;
 617};
 618
 619/* BFI_MSGQ_I2H_DOORBELL */
 620struct bfi_msgq_i2h_db_s {
 621        struct bfi_mhdr_s mh;
 622        u16 rspq_pi;
 623        u16 cmdq_ci;
 624};
 625
 626#pragma pack()
 627
 628/* BFI port specific */
 629#pragma pack(1)
 630
 631enum bfi_port_h2i {
 632        BFI_PORT_H2I_ENABLE_REQ         = (1),
 633        BFI_PORT_H2I_DISABLE_REQ        = (2),
 634        BFI_PORT_H2I_GET_STATS_REQ      = (3),
 635        BFI_PORT_H2I_CLEAR_STATS_REQ    = (4),
 636};
 637
 638enum bfi_port_i2h {
 639        BFI_PORT_I2H_ENABLE_RSP         = BFA_I2HM(1),
 640        BFI_PORT_I2H_DISABLE_RSP        = BFA_I2HM(2),
 641        BFI_PORT_I2H_GET_STATS_RSP      = BFA_I2HM(3),
 642        BFI_PORT_I2H_CLEAR_STATS_RSP    = BFA_I2HM(4),
 643};
 644
 645/*
 646 * Generic REQ type
 647 */
 648struct bfi_port_generic_req_s {
 649        struct bfi_mhdr_s  mh;          /*  msg header          */
 650        u32     msgtag;         /*  msgtag for reply                */
 651        u32     rsvd;
 652};
 653
 654/*
 655 * Generic RSP type
 656 */
 657struct bfi_port_generic_rsp_s {
 658        struct bfi_mhdr_s  mh;          /*  common msg header               */
 659        u8              status;         /*  port enable status              */
 660        u8              rsvd[3];
 661        u32     msgtag;         /*  msgtag for reply                */
 662};
 663
 664/*
 665 * BFI_PORT_H2I_GET_STATS_REQ
 666 */
 667struct bfi_port_get_stats_req_s {
 668        struct bfi_mhdr_s  mh;          /*  common msg header               */
 669        union bfi_addr_u   dma_addr;
 670};
 671
 672union bfi_port_h2i_msg_u {
 673        struct bfi_mhdr_s               mh;
 674        struct bfi_port_generic_req_s   enable_req;
 675        struct bfi_port_generic_req_s   disable_req;
 676        struct bfi_port_get_stats_req_s getstats_req;
 677        struct bfi_port_generic_req_s   clearstats_req;
 678};
 679
 680union bfi_port_i2h_msg_u {
 681        struct bfi_mhdr_s               mh;
 682        struct bfi_port_generic_rsp_s   enable_rsp;
 683        struct bfi_port_generic_rsp_s   disable_rsp;
 684        struct bfi_port_generic_rsp_s   getstats_rsp;
 685        struct bfi_port_generic_rsp_s   clearstats_rsp;
 686};
 687
 688/*
 689 *----------------------------------------------------------------------
 690 *                              ABLK
 691 *----------------------------------------------------------------------
 692 */
 693enum bfi_ablk_h2i_msgs_e {
 694        BFI_ABLK_H2I_QUERY              = 1,
 695        BFI_ABLK_H2I_ADPT_CONFIG        = 2,
 696        BFI_ABLK_H2I_PORT_CONFIG        = 3,
 697        BFI_ABLK_H2I_PF_CREATE          = 4,
 698        BFI_ABLK_H2I_PF_DELETE          = 5,
 699        BFI_ABLK_H2I_PF_UPDATE          = 6,
 700        BFI_ABLK_H2I_OPTROM_ENABLE      = 7,
 701        BFI_ABLK_H2I_OPTROM_DISABLE     = 8,
 702};
 703
 704enum bfi_ablk_i2h_msgs_e {
 705        BFI_ABLK_I2H_QUERY              = BFA_I2HM(BFI_ABLK_H2I_QUERY),
 706        BFI_ABLK_I2H_ADPT_CONFIG        = BFA_I2HM(BFI_ABLK_H2I_ADPT_CONFIG),
 707        BFI_ABLK_I2H_PORT_CONFIG        = BFA_I2HM(BFI_ABLK_H2I_PORT_CONFIG),
 708        BFI_ABLK_I2H_PF_CREATE          = BFA_I2HM(BFI_ABLK_H2I_PF_CREATE),
 709        BFI_ABLK_I2H_PF_DELETE          = BFA_I2HM(BFI_ABLK_H2I_PF_DELETE),
 710        BFI_ABLK_I2H_PF_UPDATE          = BFA_I2HM(BFI_ABLK_H2I_PF_UPDATE),
 711        BFI_ABLK_I2H_OPTROM_ENABLE      = BFA_I2HM(BFI_ABLK_H2I_OPTROM_ENABLE),
 712        BFI_ABLK_I2H_OPTROM_DISABLE     = BFA_I2HM(BFI_ABLK_H2I_OPTROM_DISABLE),
 713};
 714
 715/* BFI_ABLK_H2I_QUERY */
 716struct bfi_ablk_h2i_query_s {
 717        struct bfi_mhdr_s       mh;
 718        union bfi_addr_u        addr;
 719};
 720
 721/* BFI_ABL_H2I_ADPT_CONFIG, BFI_ABLK_H2I_PORT_CONFIG */
 722struct bfi_ablk_h2i_cfg_req_s {
 723        struct bfi_mhdr_s       mh;
 724        u8                      mode;
 725        u8                      port;
 726        u8                      max_pf;
 727        u8                      max_vf;
 728};
 729
 730/*
 731 * BFI_ABLK_H2I_PF_CREATE, BFI_ABLK_H2I_PF_DELETE,
 732 */
 733struct bfi_ablk_h2i_pf_req_s {
 734        struct bfi_mhdr_s       mh;
 735        u8                      pcifn;
 736        u8                      port;
 737        u16                     pers;
 738        u16                     bw_min; /* percent BW @ max speed */
 739        u16                     bw_max; /* percent BW @ max speed */
 740};
 741
 742/* BFI_ABLK_H2I_OPTROM_ENABLE, BFI_ABLK_H2I_OPTROM_DISABLE */
 743struct bfi_ablk_h2i_optrom_s {
 744        struct bfi_mhdr_s       mh;
 745};
 746
 747/*
 748 * BFI_ABLK_I2H_QUERY
 749 * BFI_ABLK_I2H_PORT_CONFIG
 750 * BFI_ABLK_I2H_PF_CREATE
 751 * BFI_ABLK_I2H_PF_DELETE
 752 * BFI_ABLK_I2H_PF_UPDATE
 753 * BFI_ABLK_I2H_OPTROM_ENABLE
 754 * BFI_ABLK_I2H_OPTROM_DISABLE
 755 */
 756struct bfi_ablk_i2h_rsp_s {
 757        struct bfi_mhdr_s       mh;
 758        u8                      status;
 759        u8                      pcifn;
 760        u8                      port_mode;
 761};
 762
 763
 764/*
 765 *      CEE module specific messages
 766 */
 767
 768/* Mailbox commands from host to firmware */
 769enum bfi_cee_h2i_msgs_e {
 770        BFI_CEE_H2I_GET_CFG_REQ = 1,
 771        BFI_CEE_H2I_RESET_STATS = 2,
 772        BFI_CEE_H2I_GET_STATS_REQ = 3,
 773};
 774
 775enum bfi_cee_i2h_msgs_e {
 776        BFI_CEE_I2H_GET_CFG_RSP = BFA_I2HM(1),
 777        BFI_CEE_I2H_RESET_STATS_RSP = BFA_I2HM(2),
 778        BFI_CEE_I2H_GET_STATS_RSP = BFA_I2HM(3),
 779};
 780
 781/*
 782 * H2I command structure for resetting the stats
 783 */
 784struct bfi_cee_reset_stats_s {
 785        struct bfi_mhdr_s  mh;
 786};
 787
 788/*
 789 * Get configuration  command from host
 790 */
 791struct bfi_cee_get_req_s {
 792        struct bfi_mhdr_s       mh;
 793        union bfi_addr_u        dma_addr;
 794};
 795
 796/*
 797 * Reply message from firmware
 798 */
 799struct bfi_cee_get_rsp_s {
 800        struct bfi_mhdr_s       mh;
 801        u8                      cmd_status;
 802        u8                      rsvd[3];
 803};
 804
 805/*
 806 * Reply message from firmware
 807 */
 808struct bfi_cee_stats_rsp_s {
 809        struct bfi_mhdr_s       mh;
 810        u8                      cmd_status;
 811        u8                      rsvd[3];
 812};
 813
 814/* Mailbox message structures from firmware to host     */
 815union bfi_cee_i2h_msg_u {
 816        struct bfi_mhdr_s               mh;
 817        struct bfi_cee_get_rsp_s        get_rsp;
 818        struct bfi_cee_stats_rsp_s      stats_rsp;
 819};
 820
 821/*
 822 * SFP related
 823 */
 824
 825enum bfi_sfp_h2i_e {
 826        BFI_SFP_H2I_SHOW        = 1,
 827        BFI_SFP_H2I_SCN         = 2,
 828};
 829
 830enum bfi_sfp_i2h_e {
 831        BFI_SFP_I2H_SHOW = BFA_I2HM(BFI_SFP_H2I_SHOW),
 832        BFI_SFP_I2H_SCN  = BFA_I2HM(BFI_SFP_H2I_SCN),
 833};
 834
 835/*
 836 *      SFP state change notification
 837 */
 838struct bfi_sfp_scn_s {
 839        struct bfi_mhdr_s mhr;  /* host msg header        */
 840        u8      event;
 841        u8      sfpid;
 842        u8      pomlvl; /* pom level: normal/warning/alarm */
 843        u8      is_elb; /* e-loopback */
 844};
 845
 846/*
 847 *      SFP state
 848 */
 849enum bfa_sfp_stat_e {
 850        BFA_SFP_STATE_INIT      = 0,    /* SFP state is uninit  */
 851        BFA_SFP_STATE_REMOVED   = 1,    /* SFP is removed       */
 852        BFA_SFP_STATE_INSERTED  = 2,    /* SFP is inserted      */
 853        BFA_SFP_STATE_VALID     = 3,    /* SFP is valid         */
 854        BFA_SFP_STATE_UNSUPPORT = 4,    /* SFP is unsupport     */
 855        BFA_SFP_STATE_FAILED    = 5,    /* SFP i2c read fail    */
 856};
 857
 858/*
 859 *  SFP memory access type
 860 */
 861enum bfi_sfp_mem_e {
 862        BFI_SFP_MEM_ALL         = 0x1,  /* access all data field */
 863        BFI_SFP_MEM_DIAGEXT     = 0x2,  /* access diag ext data field only */
 864};
 865
 866struct bfi_sfp_req_s {
 867        struct bfi_mhdr_s       mh;
 868        u8                      memtype;
 869        u8                      rsvd[3];
 870        struct bfi_alen_s       alen;
 871};
 872
 873struct bfi_sfp_rsp_s {
 874        struct bfi_mhdr_s       mh;
 875        u8                      status;
 876        u8                      state;
 877        u8                      rsvd[2];
 878};
 879
 880/*
 881 *      FLASH module specific
 882 */
 883enum bfi_flash_h2i_msgs {
 884        BFI_FLASH_H2I_QUERY_REQ = 1,
 885        BFI_FLASH_H2I_ERASE_REQ = 2,
 886        BFI_FLASH_H2I_WRITE_REQ = 3,
 887        BFI_FLASH_H2I_READ_REQ = 4,
 888        BFI_FLASH_H2I_BOOT_VER_REQ = 5,
 889};
 890
 891enum bfi_flash_i2h_msgs {
 892        BFI_FLASH_I2H_QUERY_RSP = BFA_I2HM(1),
 893        BFI_FLASH_I2H_ERASE_RSP = BFA_I2HM(2),
 894        BFI_FLASH_I2H_WRITE_RSP = BFA_I2HM(3),
 895        BFI_FLASH_I2H_READ_RSP = BFA_I2HM(4),
 896        BFI_FLASH_I2H_BOOT_VER_RSP = BFA_I2HM(5),
 897        BFI_FLASH_I2H_EVENT = BFA_I2HM(127),
 898};
 899
 900/*
 901 * Flash query request
 902 */
 903struct bfi_flash_query_req_s {
 904        struct bfi_mhdr_s mh;   /* Common msg header */
 905        struct bfi_alen_s alen;
 906};
 907
 908/*
 909 * Flash erase request
 910 */
 911struct bfi_flash_erase_req_s {
 912        struct bfi_mhdr_s       mh;     /* Common msg header */
 913        u32     type;   /* partition type */
 914        u8      instance; /* partition instance */
 915        u8      rsv[3];
 916};
 917
 918/*
 919 * Flash write request
 920 */
 921struct bfi_flash_write_req_s {
 922        struct bfi_mhdr_s mh;   /* Common msg header */
 923        struct bfi_alen_s alen;
 924        u32     type;   /* partition type */
 925        u8      instance; /* partition instance */
 926        u8      last;
 927        u8      rsv[2];
 928        u32     offset;
 929        u32     length;
 930};
 931
 932/*
 933 * Flash read request
 934 */
 935struct bfi_flash_read_req_s {
 936        struct bfi_mhdr_s mh;   /* Common msg header */
 937        u32     type;           /* partition type */
 938        u8      instance;       /* partition instance */
 939        u8      rsv[3];
 940        u32     offset;
 941        u32     length;
 942        struct bfi_alen_s alen;
 943};
 944
 945/*
 946 * Flash query response
 947 */
 948struct bfi_flash_query_rsp_s {
 949        struct bfi_mhdr_s mh;   /* Common msg header */
 950        u32     status;
 951};
 952
 953/*
 954 * Flash read response
 955 */
 956struct bfi_flash_read_rsp_s {
 957        struct bfi_mhdr_s mh;   /* Common msg header */
 958        u32     type;       /* partition type */
 959        u8      instance;   /* partition instance */
 960        u8      rsv[3];
 961        u32     status;
 962        u32     length;
 963};
 964
 965/*
 966 * Flash write response
 967 */
 968struct bfi_flash_write_rsp_s {
 969        struct bfi_mhdr_s mh;   /* Common msg header */
 970        u32     type;       /* partition type */
 971        u8      instance;   /* partition instance */
 972        u8      rsv[3];
 973        u32     status;
 974        u32     length;
 975};
 976
 977/*
 978 * Flash erase response
 979 */
 980struct bfi_flash_erase_rsp_s {
 981        struct bfi_mhdr_s mh;   /* Common msg header */
 982        u32     type;           /* partition type */
 983        u8      instance;       /* partition instance */
 984        u8      rsv[3];
 985        u32     status;
 986};
 987
 988/*
 989 * Flash event notification
 990 */
 991struct bfi_flash_event_s {
 992        struct bfi_mhdr_s       mh;     /* Common msg header */
 993        bfa_status_t            status;
 994        u32                     param;
 995};
 996
 997/*
 998 *----------------------------------------------------------------------
 999 *                              DIAG
1000 *----------------------------------------------------------------------
1001 */
1002enum bfi_diag_h2i {
1003        BFI_DIAG_H2I_PORTBEACON = 1,
1004        BFI_DIAG_H2I_LOOPBACK = 2,
1005        BFI_DIAG_H2I_FWPING = 3,
1006        BFI_DIAG_H2I_TEMPSENSOR = 4,
1007        BFI_DIAG_H2I_LEDTEST = 5,
1008        BFI_DIAG_H2I_QTEST      = 6,
1009        BFI_DIAG_H2I_DPORT      = 7,
1010};
1011
1012enum bfi_diag_i2h {
1013        BFI_DIAG_I2H_PORTBEACON = BFA_I2HM(BFI_DIAG_H2I_PORTBEACON),
1014        BFI_DIAG_I2H_LOOPBACK = BFA_I2HM(BFI_DIAG_H2I_LOOPBACK),
1015        BFI_DIAG_I2H_FWPING = BFA_I2HM(BFI_DIAG_H2I_FWPING),
1016        BFI_DIAG_I2H_TEMPSENSOR = BFA_I2HM(BFI_DIAG_H2I_TEMPSENSOR),
1017        BFI_DIAG_I2H_LEDTEST = BFA_I2HM(BFI_DIAG_H2I_LEDTEST),
1018        BFI_DIAG_I2H_QTEST      = BFA_I2HM(BFI_DIAG_H2I_QTEST),
1019        BFI_DIAG_I2H_DPORT      = BFA_I2HM(BFI_DIAG_H2I_DPORT),
1020        BFI_DIAG_I2H_DPORT_SCN  = BFA_I2HM(8),
1021};
1022
1023#define BFI_DIAG_MAX_SGES       2
1024#define BFI_DIAG_DMA_BUF_SZ     (2 * 1024)
1025#define BFI_BOOT_MEMTEST_RES_ADDR 0x900
1026#define BFI_BOOT_MEMTEST_RES_SIG  0xA0A1A2A3
1027
1028struct bfi_diag_lb_req_s {
1029        struct bfi_mhdr_s mh;
1030        u32     loopcnt;
1031        u32     pattern;
1032        u8      lb_mode;        /*!< bfa_port_opmode_t */
1033        u8      speed;          /*!< bfa_port_speed_t */
1034        u8      rsvd[2];
1035};
1036
1037struct bfi_diag_lb_rsp_s {
1038        struct bfi_mhdr_s  mh;          /* 4 bytes */
1039        struct bfa_diag_loopback_result_s res; /* 16 bytes */
1040};
1041
1042struct bfi_diag_fwping_req_s {
1043        struct bfi_mhdr_s mh;   /* 4 bytes */
1044        struct bfi_alen_s alen; /* 12 bytes */
1045        u32     data;           /* user input data pattern */
1046        u32     count;          /* user input dma count */
1047        u8      qtag;           /* track CPE vc */
1048        u8      rsv[3];
1049};
1050
1051struct bfi_diag_fwping_rsp_s {
1052        struct bfi_mhdr_s  mh;          /* 4 bytes */
1053        u32     data;           /* user input data pattern    */
1054        u8      qtag;           /* track CPE vc               */
1055        u8      dma_status;     /* dma status                 */
1056        u8      rsv[2];
1057};
1058
1059/*
1060 * Temperature Sensor
1061 */
1062struct bfi_diag_ts_req_s {
1063        struct bfi_mhdr_s mh;   /* 4 bytes */
1064        u16     temp;           /* 10-bit A/D value */
1065        u16     brd_temp;       /* 9-bit board temp */
1066        u8      status;
1067        u8      ts_junc;        /* show junction tempsensor   */
1068        u8      ts_brd;         /* show board tempsensor      */
1069        u8      rsv;
1070};
1071#define bfi_diag_ts_rsp_t struct bfi_diag_ts_req_s
1072
1073struct bfi_diag_ledtest_req_s {
1074        struct bfi_mhdr_s  mh;  /* 4 bytes */
1075        u8      cmd;
1076        u8      color;
1077        u8      portid;
1078        u8      led;    /* bitmap of LEDs to be tested */
1079        u16     freq;   /* no. of blinks every 10 secs */
1080        u8      rsv[2];
1081};
1082
1083/* notify host led operation is done */
1084struct bfi_diag_ledtest_rsp_s {
1085        struct bfi_mhdr_s  mh;  /* 4 bytes */
1086};
1087
1088struct bfi_diag_portbeacon_req_s {
1089        struct bfi_mhdr_s  mh;  /* 4 bytes */
1090        u32     period; /* beaconing period */
1091        u8      beacon; /* 1: beacon on */
1092        u8      rsvd[3];
1093};
1094
1095/* notify host the beacon is off */
1096struct bfi_diag_portbeacon_rsp_s {
1097        struct bfi_mhdr_s  mh;  /* 4 bytes */
1098};
1099
1100struct bfi_diag_qtest_req_s {
1101        struct bfi_mhdr_s       mh;             /* 4 bytes */
1102        u32     data[BFI_LMSG_PL_WSZ]; /* fill up tcm prefetch area */
1103};
1104#define bfi_diag_qtest_rsp_t struct bfi_diag_qtest_req_s
1105
1106/*
1107 *      D-port test
1108 */
1109enum bfi_dport_req {
1110        BFI_DPORT_DISABLE       = 0,    /* disable dport request        */
1111        BFI_DPORT_ENABLE        = 1,    /* enable dport request         */
1112        BFI_DPORT_START         = 2,    /* start dport request  */
1113        BFI_DPORT_SHOW          = 3,    /* show dport request   */
1114        BFI_DPORT_DYN_DISABLE   = 4,    /* disable dynamic dport request */
1115};
1116
1117enum bfi_dport_scn {
1118        BFI_DPORT_SCN_TESTSTART         = 1,
1119        BFI_DPORT_SCN_TESTCOMP          = 2,
1120        BFI_DPORT_SCN_SFP_REMOVED       = 3,
1121        BFI_DPORT_SCN_DDPORT_ENABLE     = 4,
1122        BFI_DPORT_SCN_DDPORT_DISABLE    = 5,
1123        BFI_DPORT_SCN_FCPORT_DISABLE    = 6,
1124        BFI_DPORT_SCN_SUBTESTSTART      = 7,
1125        BFI_DPORT_SCN_TESTSKIP          = 8,
1126        BFI_DPORT_SCN_DDPORT_DISABLED   = 9,
1127};
1128
1129struct bfi_diag_dport_req_s {
1130        struct bfi_mhdr_s       mh;     /* 4 bytes                      */
1131        u8                      req;    /* request 1: enable 0: disable */
1132        u8                      rsvd[3];
1133        u32                     lpcnt;
1134        u32                     payload;
1135};
1136
1137struct bfi_diag_dport_rsp_s {
1138        struct bfi_mhdr_s       mh;     /* header 4 bytes               */
1139        bfa_status_t            status; /* reply status                 */
1140        wwn_t                   pwwn;   /* switch port wwn. 8 bytes     */
1141        wwn_t                   nwwn;   /* switch node wwn. 8 bytes     */
1142};
1143
1144struct bfi_diag_dport_scn_teststart_s {
1145        wwn_t   pwwn;   /* switch port wwn. 8 bytes */
1146        wwn_t   nwwn;   /* switch node wwn. 8 bytes */
1147        u8      type;   /* bfa_diag_dport_test_type_e */
1148        u8      mode;   /* bfa_diag_dport_test_opmode */
1149        u8      rsvd[2];
1150        u32     numfrm; /* from switch uint in 1M */
1151};
1152
1153struct bfi_diag_dport_scn_testcomp_s {
1154        u8      status; /* bfa_diag_dport_test_status_e */
1155        u8      speed;  /* bfa_port_speed_t  */
1156        u16     numbuffer; /* from switch  */
1157        u8      subtest_status[DPORT_TEST_MAX];  /* 4 bytes */
1158        u32     latency;   /* from switch  */
1159        u32     distance;  /* from swtich unit in meters  */
1160                        /* Buffers required to saturate the link */
1161        u16     frm_sz; /* from switch for buf_reqd */
1162        u8      rsvd[2];
1163};
1164
1165struct bfi_diag_dport_scn_s {           /* max size == RDS_RMESZ        */
1166        struct bfi_mhdr_s       mh;     /* header 4 bytes               */
1167        u8                      state;  /* new state                    */
1168        u8                      rsvd[3];
1169        union {
1170                struct bfi_diag_dport_scn_teststart_s teststart;
1171                struct bfi_diag_dport_scn_testcomp_s testcomp;
1172        } info;
1173};
1174
1175union bfi_diag_dport_msg_u {
1176        struct bfi_diag_dport_req_s     req;
1177        struct bfi_diag_dport_rsp_s     rsp;
1178        struct bfi_diag_dport_scn_s     scn;
1179};
1180
1181/*
1182 *      PHY module specific
1183 */
1184enum bfi_phy_h2i_msgs_e {
1185        BFI_PHY_H2I_QUERY_REQ = 1,
1186        BFI_PHY_H2I_STATS_REQ = 2,
1187        BFI_PHY_H2I_WRITE_REQ = 3,
1188        BFI_PHY_H2I_READ_REQ = 4,
1189};
1190
1191enum bfi_phy_i2h_msgs_e {
1192        BFI_PHY_I2H_QUERY_RSP = BFA_I2HM(1),
1193        BFI_PHY_I2H_STATS_RSP = BFA_I2HM(2),
1194        BFI_PHY_I2H_WRITE_RSP = BFA_I2HM(3),
1195        BFI_PHY_I2H_READ_RSP = BFA_I2HM(4),
1196};
1197
1198/*
1199 * External PHY query request
1200 */
1201struct bfi_phy_query_req_s {
1202        struct bfi_mhdr_s       mh;             /* Common msg header */
1203        u8                      instance;
1204        u8                      rsv[3];
1205        struct bfi_alen_s       alen;
1206};
1207
1208/*
1209 * External PHY stats request
1210 */
1211struct bfi_phy_stats_req_s {
1212        struct bfi_mhdr_s       mh;             /* Common msg header */
1213        u8                      instance;
1214        u8                      rsv[3];
1215        struct bfi_alen_s       alen;
1216};
1217
1218/*
1219 * External PHY write request
1220 */
1221struct bfi_phy_write_req_s {
1222        struct bfi_mhdr_s       mh;             /* Common msg header */
1223        u8              instance;
1224        u8              last;
1225        u8              rsv[2];
1226        u32             offset;
1227        u32             length;
1228        struct bfi_alen_s       alen;
1229};
1230
1231/*
1232 * External PHY read request
1233 */
1234struct bfi_phy_read_req_s {
1235        struct bfi_mhdr_s       mh;     /* Common msg header */
1236        u8              instance;
1237        u8              rsv[3];
1238        u32             offset;
1239        u32             length;
1240        struct bfi_alen_s       alen;
1241};
1242
1243/*
1244 * External PHY query response
1245 */
1246struct bfi_phy_query_rsp_s {
1247        struct bfi_mhdr_s       mh;     /* Common msg header */
1248        u32                     status;
1249};
1250
1251/*
1252 * External PHY stats response
1253 */
1254struct bfi_phy_stats_rsp_s {
1255        struct bfi_mhdr_s       mh;     /* Common msg header */
1256        u32                     status;
1257};
1258
1259/*
1260 * External PHY read response
1261 */
1262struct bfi_phy_read_rsp_s {
1263        struct bfi_mhdr_s       mh;     /* Common msg header */
1264        u32                     status;
1265        u32             length;
1266};
1267
1268/*
1269 * External PHY write response
1270 */
1271struct bfi_phy_write_rsp_s {
1272        struct bfi_mhdr_s       mh;     /* Common msg header */
1273        u32                     status;
1274        u32                     length;
1275};
1276
1277enum bfi_fru_h2i_msgs {
1278        BFI_FRUVPD_H2I_WRITE_REQ = 1,
1279        BFI_FRUVPD_H2I_READ_REQ = 2,
1280        BFI_TFRU_H2I_WRITE_REQ = 3,
1281        BFI_TFRU_H2I_READ_REQ = 4,
1282};
1283
1284enum bfi_fru_i2h_msgs {
1285        BFI_FRUVPD_I2H_WRITE_RSP = BFA_I2HM(1),
1286        BFI_FRUVPD_I2H_READ_RSP = BFA_I2HM(2),
1287        BFI_TFRU_I2H_WRITE_RSP = BFA_I2HM(3),
1288        BFI_TFRU_I2H_READ_RSP = BFA_I2HM(4),
1289};
1290
1291/*
1292 * FRU write request
1293 */
1294struct bfi_fru_write_req_s {
1295        struct bfi_mhdr_s       mh;     /* Common msg header */
1296        u8                      last;
1297        u8                      rsv_1[3];
1298        u8                      trfr_cmpl;
1299        u8                      rsv_2[3];
1300        u32                     offset;
1301        u32                     length;
1302        struct bfi_alen_s       alen;
1303};
1304
1305/*
1306 * FRU read request
1307 */
1308struct bfi_fru_read_req_s {
1309        struct bfi_mhdr_s       mh;     /* Common msg header */
1310        u32                     offset;
1311        u32                     length;
1312        struct bfi_alen_s       alen;
1313};
1314
1315/*
1316 * FRU response
1317 */
1318struct bfi_fru_rsp_s {
1319        struct bfi_mhdr_s       mh;     /* Common msg header */
1320        u32                     status;
1321        u32                     length;
1322};
1323#pragma pack()
1324
1325#endif /* __BFI_H__ */
1326