|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 1 | /******************************************************************* | 
|  | 2 | * This file is part of the Emulex Linux Device Driver for         * | 
| James.Smart@Emulex.Com | c44ce17 | 2005-06-25 10:34:39 -0400 | [diff] [blame] | 3 | * Fibre Channel Host Bus Adapters.                                * | 
| James Smart | 1b32f6a | 2008-02-08 18:49:39 -0500 | [diff] [blame] | 4 | * Copyright (C) 2004-2008 Emulex.  All rights reserved.           * | 
| James.Smart@Emulex.Com | c44ce17 | 2005-06-25 10:34:39 -0400 | [diff] [blame] | 5 | * EMULEX and SLI are trademarks of Emulex.                        * | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 6 | * www.emulex.com                                                  * | 
| James.Smart@Emulex.Com | c44ce17 | 2005-06-25 10:34:39 -0400 | [diff] [blame] | 7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig              * | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 8 | *                                                                 * | 
|  | 9 | * This program is free software; you can redistribute it and/or   * | 
| James.Smart@Emulex.Com | c44ce17 | 2005-06-25 10:34:39 -0400 | [diff] [blame] | 10 | * modify it under the terms of version 2 of the GNU General       * | 
|  | 11 | * Public License as published by the Free Software Foundation.    * | 
|  | 12 | * This program is distributed in the hope that it will be useful. * | 
|  | 13 | * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND          * | 
|  | 14 | * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,  * | 
|  | 15 | * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE      * | 
|  | 16 | * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD * | 
|  | 17 | * TO BE LEGALLY INVALID.  See the GNU General Public License for  * | 
|  | 18 | * more details, a copy of which can be found in the file COPYING  * | 
|  | 19 | * included with this package.                                     * | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 20 | *******************************************************************/ | 
|  | 21 |  | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 22 | #include <scsi/scsi_host.h> | 
|  | 23 |  | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 24 | struct lpfc_sli2_slim; | 
|  | 25 |  | 
| James Smart | e17da18 | 2006-07-06 15:49:25 -0400 | [diff] [blame] | 26 | #define LPFC_MAX_TARGET		256	/* max number of targets supported */ | 
|  | 27 | #define LPFC_MAX_DISC_THREADS	64	/* max outstanding discovery els | 
|  | 28 | requests */ | 
|  | 29 | #define LPFC_MAX_NS_RETRY	3	/* Number of retry attempts to contact | 
|  | 30 | the NameServer  before giving up. */ | 
| James.Smart@Emulex.Com | 445cf4f | 2005-11-28 11:42:38 -0500 | [diff] [blame] | 31 | #define LPFC_CMD_PER_LUN	3	/* max outstanding cmds per lun */ | 
| James Smart | 83108bd | 2008-01-11 01:53:09 -0500 | [diff] [blame] | 32 | #define LPFC_DEFAULT_SG_SEG_CNT	64	/* sg element count per scsi cmnd */ | 
|  | 33 | #define LPFC_MAX_SG_SEG_CNT	256	/* sg element count per scsi cmnd */ | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 34 | #define LPFC_IOCB_LIST_CNT	2250	/* list of IOCBs for fast-path usage. */ | 
| James.Smart@Emulex.Com | 445cf4f | 2005-11-28 11:42:38 -0500 | [diff] [blame] | 35 | #define LPFC_Q_RAMP_UP_INTERVAL 120     /* lun q_depth ramp up interval */ | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 36 |  | 
| James Smart | 92d7f7b | 2007-06-17 19:56:38 -0500 | [diff] [blame] | 37 | /* | 
|  | 38 | * Following time intervals are used of adjusting SCSI device | 
|  | 39 | * queue depths when there are driver resource error or Firmware | 
|  | 40 | * resource error. | 
|  | 41 | */ | 
|  | 42 | #define QUEUE_RAMP_DOWN_INTERVAL	(1 * HZ)   /* 1 Second */ | 
|  | 43 | #define QUEUE_RAMP_UP_INTERVAL		(300 * HZ) /* 5 minutes */ | 
|  | 44 |  | 
|  | 45 | /* Number of exchanges reserved for discovery to complete */ | 
|  | 46 | #define LPFC_DISC_IOCB_BUFF_COUNT 20 | 
|  | 47 |  | 
| James Smart | 858c9f6 | 2007-06-17 19:56:39 -0500 | [diff] [blame] | 48 | #define LPFC_HB_MBOX_INTERVAL   5	/* Heart beat interval in seconds. */ | 
| James Smart | 311464e | 2007-08-02 11:10:37 -0400 | [diff] [blame] | 49 | #define LPFC_HB_MBOX_TIMEOUT    30	/* Heart beat timeout  in seconds. */ | 
| James Smart | 858c9f6 | 2007-06-17 19:56:39 -0500 | [diff] [blame] | 50 |  | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 51 | /* Define macros for 64 bit support */ | 
|  | 52 | #define putPaddrLow(addr)    ((uint32_t) (0xffffffff & (u64)(addr))) | 
|  | 53 | #define putPaddrHigh(addr)   ((uint32_t) (0xffffffff & (((u64)(addr))>>32))) | 
|  | 54 | #define getPaddr(high, low)  ((dma_addr_t)( \ | 
|  | 55 | (( (u64)(high)<<16 ) << 16)|( (u64)(low)))) | 
|  | 56 | /* Provide maximum configuration definitions. */ | 
|  | 57 | #define LPFC_DRVR_TIMEOUT	16	/* driver iocb timeout value in sec */ | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 58 | #define FC_MAX_ADPTMSG		64 | 
|  | 59 |  | 
|  | 60 | #define MAX_HBAEVT	32 | 
|  | 61 |  | 
| James.Smart@Emulex.Com | 875fbdf | 2005-11-29 16:32:13 -0500 | [diff] [blame] | 62 | enum lpfc_polling_flags { | 
|  | 63 | ENABLE_FCP_RING_POLLING = 0x1, | 
|  | 64 | DISABLE_FCP_RING_INT    = 0x2 | 
|  | 65 | }; | 
|  | 66 |  | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 67 | /* Provide DMA memory definitions the driver uses per port instance. */ | 
|  | 68 | struct lpfc_dmabuf { | 
|  | 69 | struct list_head list; | 
|  | 70 | void *virt;		/* virtual address ptr */ | 
|  | 71 | dma_addr_t phys;	/* mapped address */ | 
| James Smart | 76bb24e | 2007-10-27 13:38:00 -0400 | [diff] [blame] | 72 | uint32_t   buffer_tag;	/* used for tagged queue ring */ | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 73 | }; | 
|  | 74 |  | 
|  | 75 | struct lpfc_dma_pool { | 
|  | 76 | struct lpfc_dmabuf   *elements; | 
|  | 77 | uint32_t    max_count; | 
|  | 78 | uint32_t    current_count; | 
|  | 79 | }; | 
|  | 80 |  | 
| James Smart | ed95768 | 2007-06-17 19:56:37 -0500 | [diff] [blame] | 81 | struct hbq_dmabuf { | 
|  | 82 | struct lpfc_dmabuf dbuf; | 
| James Smart | 51ef4c2 | 2007-08-02 11:10:31 -0400 | [diff] [blame] | 83 | uint32_t size; | 
| James Smart | ed95768 | 2007-06-17 19:56:37 -0500 | [diff] [blame] | 84 | uint32_t tag; | 
|  | 85 | }; | 
|  | 86 |  | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 87 | /* Priority bit.  Set value to exceed low water mark in lpfc_mem. */ | 
|  | 88 | #define MEM_PRI		0x100 | 
|  | 89 |  | 
|  | 90 |  | 
|  | 91 | /****************************************************************************/ | 
|  | 92 | /*      Device VPD save area                                                */ | 
|  | 93 | /****************************************************************************/ | 
|  | 94 | typedef struct lpfc_vpd { | 
|  | 95 | uint32_t status;	/* vpd status value */ | 
|  | 96 | uint32_t length;	/* number of bytes actually returned */ | 
|  | 97 | struct { | 
|  | 98 | uint32_t rsvd1;	/* Revision numbers */ | 
|  | 99 | uint32_t biuRev; | 
|  | 100 | uint32_t smRev; | 
|  | 101 | uint32_t smFwRev; | 
|  | 102 | uint32_t endecRev; | 
|  | 103 | uint16_t rBit; | 
|  | 104 | uint8_t fcphHigh; | 
|  | 105 | uint8_t fcphLow; | 
|  | 106 | uint8_t feaLevelHigh; | 
|  | 107 | uint8_t feaLevelLow; | 
|  | 108 | uint32_t postKernRev; | 
|  | 109 | uint32_t opFwRev; | 
|  | 110 | uint8_t opFwName[16]; | 
|  | 111 | uint32_t sli1FwRev; | 
|  | 112 | uint8_t sli1FwName[16]; | 
|  | 113 | uint32_t sli2FwRev; | 
|  | 114 | uint8_t sli2FwName[16]; | 
|  | 115 | } rev; | 
| James Smart | 92d7f7b | 2007-06-17 19:56:38 -0500 | [diff] [blame] | 116 | struct { | 
|  | 117 | #ifdef __BIG_ENDIAN_BITFIELD | 
|  | 118 | uint32_t rsvd2  :24;  /* Reserved                             */ | 
|  | 119 | uint32_t cmv	: 1;  /* Configure Max VPIs                   */ | 
|  | 120 | uint32_t ccrp   : 1;  /* Config Command Ring Polling          */ | 
|  | 121 | uint32_t csah   : 1;  /* Configure Synchronous Abort Handling */ | 
|  | 122 | uint32_t chbs   : 1;  /* Cofigure Host Backing store          */ | 
|  | 123 | uint32_t cinb   : 1;  /* Enable Interrupt Notification Block  */ | 
|  | 124 | uint32_t cerbm	: 1;  /* Configure Enhanced Receive Buf Mgmt  */ | 
|  | 125 | uint32_t cmx	: 1;  /* Configure Max XRIs                   */ | 
|  | 126 | uint32_t cmr	: 1;  /* Configure Max RPIs                   */ | 
|  | 127 | #else	/*  __LITTLE_ENDIAN */ | 
|  | 128 | uint32_t cmr	: 1;  /* Configure Max RPIs                   */ | 
|  | 129 | uint32_t cmx	: 1;  /* Configure Max XRIs                   */ | 
|  | 130 | uint32_t cerbm	: 1;  /* Configure Enhanced Receive Buf Mgmt  */ | 
|  | 131 | uint32_t cinb   : 1;  /* Enable Interrupt Notification Block  */ | 
|  | 132 | uint32_t chbs   : 1;  /* Cofigure Host Backing store          */ | 
|  | 133 | uint32_t csah   : 1;  /* Configure Synchronous Abort Handling */ | 
|  | 134 | uint32_t ccrp   : 1;  /* Config Command Ring Polling          */ | 
|  | 135 | uint32_t cmv	: 1;  /* Configure Max VPIs                   */ | 
|  | 136 | uint32_t rsvd2  :24;  /* Reserved                             */ | 
|  | 137 | #endif | 
|  | 138 | } sli3Feat; | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 139 | } lpfc_vpd_t; | 
|  | 140 |  | 
|  | 141 | struct lpfc_scsi_buf; | 
|  | 142 |  | 
|  | 143 |  | 
|  | 144 | /* | 
|  | 145 | * lpfc stat counters | 
|  | 146 | */ | 
|  | 147 | struct lpfc_stats { | 
|  | 148 | /* Statistics for ELS commands */ | 
|  | 149 | uint32_t elsLogiCol; | 
|  | 150 | uint32_t elsRetryExceeded; | 
|  | 151 | uint32_t elsXmitRetry; | 
|  | 152 | uint32_t elsDelayRetry; | 
|  | 153 | uint32_t elsRcvDrop; | 
|  | 154 | uint32_t elsRcvFrame; | 
|  | 155 | uint32_t elsRcvRSCN; | 
|  | 156 | uint32_t elsRcvRNID; | 
|  | 157 | uint32_t elsRcvFARP; | 
|  | 158 | uint32_t elsRcvFARPR; | 
|  | 159 | uint32_t elsRcvFLOGI; | 
|  | 160 | uint32_t elsRcvPLOGI; | 
|  | 161 | uint32_t elsRcvADISC; | 
|  | 162 | uint32_t elsRcvPDISC; | 
|  | 163 | uint32_t elsRcvFAN; | 
|  | 164 | uint32_t elsRcvLOGO; | 
|  | 165 | uint32_t elsRcvPRLO; | 
|  | 166 | uint32_t elsRcvPRLI; | 
| Jamie Wellnitz | 7bb3b13 | 2006-02-28 19:25:15 -0500 | [diff] [blame] | 167 | uint32_t elsRcvLIRR; | 
|  | 168 | uint32_t elsRcvRPS; | 
|  | 169 | uint32_t elsRcvRPL; | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 170 | uint32_t elsXmitFLOGI; | 
| James Smart | 92d7f7b | 2007-06-17 19:56:38 -0500 | [diff] [blame] | 171 | uint32_t elsXmitFDISC; | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 172 | uint32_t elsXmitPLOGI; | 
|  | 173 | uint32_t elsXmitPRLI; | 
|  | 174 | uint32_t elsXmitADISC; | 
|  | 175 | uint32_t elsXmitLOGO; | 
|  | 176 | uint32_t elsXmitSCR; | 
|  | 177 | uint32_t elsXmitRNID; | 
|  | 178 | uint32_t elsXmitFARP; | 
|  | 179 | uint32_t elsXmitFARPR; | 
|  | 180 | uint32_t elsXmitACC; | 
|  | 181 | uint32_t elsXmitLSRJT; | 
|  | 182 |  | 
|  | 183 | uint32_t frameRcvBcast; | 
|  | 184 | uint32_t frameRcvMulti; | 
|  | 185 | uint32_t strayXmitCmpl; | 
|  | 186 | uint32_t frameXmitDelay; | 
|  | 187 | uint32_t xriCmdCmpl; | 
|  | 188 | uint32_t xriStatErr; | 
|  | 189 | uint32_t LinkUp; | 
|  | 190 | uint32_t LinkDown; | 
|  | 191 | uint32_t LinkMultiEvent; | 
|  | 192 | uint32_t NoRcvBuf; | 
|  | 193 | uint32_t fcpCmd; | 
|  | 194 | uint32_t fcpCmpl; | 
|  | 195 | uint32_t fcpRspErr; | 
|  | 196 | uint32_t fcpRemoteStop; | 
|  | 197 | uint32_t fcpPortRjt; | 
|  | 198 | uint32_t fcpPortBusy; | 
|  | 199 | uint32_t fcpError; | 
|  | 200 | uint32_t fcpLocalErr; | 
|  | 201 | }; | 
|  | 202 |  | 
|  | 203 | enum sysfs_mbox_state { | 
|  | 204 | SMBOX_IDLE, | 
|  | 205 | SMBOX_WRITING, | 
|  | 206 | SMBOX_READING | 
|  | 207 | }; | 
|  | 208 |  | 
|  | 209 | struct lpfc_sysfs_mbox { | 
|  | 210 | enum sysfs_mbox_state state; | 
|  | 211 | size_t                offset; | 
|  | 212 | struct lpfcMboxq *    mbox; | 
|  | 213 | }; | 
|  | 214 |  | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 215 | struct lpfc_hba; | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 216 |  | 
| James Smart | 92d7f7b | 2007-06-17 19:56:38 -0500 | [diff] [blame] | 217 |  | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 218 | enum discovery_state { | 
| James Smart | 92d7f7b | 2007-06-17 19:56:38 -0500 | [diff] [blame] | 219 | LPFC_VPORT_UNKNOWN     =  0,    /* vport state is unknown */ | 
|  | 220 | LPFC_VPORT_FAILED      =  1,    /* vport has failed */ | 
|  | 221 | LPFC_LOCAL_CFG_LINK    =  6,    /* local NPORT Id configured */ | 
|  | 222 | LPFC_FLOGI             =  7,    /* FLOGI sent to Fabric */ | 
|  | 223 | LPFC_FDISC             =  8,    /* FDISC sent for vport */ | 
|  | 224 | LPFC_FABRIC_CFG_LINK   =  9,    /* Fabric assigned NPORT Id | 
|  | 225 | * configured */ | 
|  | 226 | LPFC_NS_REG            =  10,   /* Register with NameServer */ | 
|  | 227 | LPFC_NS_QRY            =  11,   /* Query NameServer for NPort ID list */ | 
|  | 228 | LPFC_BUILD_DISC_LIST   =  12,   /* Build ADISC and PLOGI lists for | 
|  | 229 | * device authentication / discovery */ | 
|  | 230 | LPFC_DISC_AUTH         =  13,   /* Processing ADISC list */ | 
|  | 231 | LPFC_VPORT_READY       =  32, | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 232 | }; | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 233 |  | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 234 | enum hba_state { | 
|  | 235 | LPFC_LINK_UNKNOWN    =   0,   /* HBA state is unknown */ | 
|  | 236 | LPFC_WARM_START      =   1,   /* HBA state after selective reset */ | 
|  | 237 | LPFC_INIT_START      =   2,   /* Initial state after board reset */ | 
|  | 238 | LPFC_INIT_MBX_CMDS   =   3,   /* Initialize HBA with mbox commands */ | 
|  | 239 | LPFC_LINK_DOWN       =   4,   /* HBA initialized, link is down */ | 
|  | 240 | LPFC_LINK_UP         =   5,   /* Link is up  - issue READ_LA */ | 
| James Smart | 92d7f7b | 2007-06-17 19:56:38 -0500 | [diff] [blame] | 241 | LPFC_CLEAR_LA        =   6,   /* authentication cmplt - issue | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 242 | * CLEAR_LA */ | 
| James Smart | 92d7f7b | 2007-06-17 19:56:38 -0500 | [diff] [blame] | 243 | LPFC_HBA_READY       =  32, | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 244 | LPFC_HBA_ERROR       =  -1 | 
|  | 245 | }; | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 246 |  | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 247 | struct lpfc_vport { | 
|  | 248 | struct list_head listentry; | 
|  | 249 | struct lpfc_hba *phba; | 
|  | 250 | uint8_t port_type; | 
|  | 251 | #define LPFC_PHYSICAL_PORT 1 | 
|  | 252 | #define LPFC_NPIV_PORT  2 | 
|  | 253 | #define LPFC_FABRIC_PORT 3 | 
|  | 254 | enum discovery_state port_state; | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 255 |  | 
| James Smart | 92d7f7b | 2007-06-17 19:56:38 -0500 | [diff] [blame] | 256 | uint16_t vpi; | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 257 |  | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 258 | uint32_t fc_flag;	/* FC flags */ | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 259 | /* Several of these flags are HBA centric and should be moved to | 
|  | 260 | * phba->link_flag (e.g. FC_PTP, FC_PUBLIC_LOOP) | 
|  | 261 | */ | 
| James Smart | 92d7f7b | 2007-06-17 19:56:38 -0500 | [diff] [blame] | 262 | #define FC_PT2PT                0x1	 /* pt2pt with no fabric */ | 
|  | 263 | #define FC_PT2PT_PLOGI          0x2	 /* pt2pt initiate PLOGI */ | 
|  | 264 | #define FC_DISC_TMO             0x4	 /* Discovery timer running */ | 
|  | 265 | #define FC_PUBLIC_LOOP          0x8	 /* Public loop */ | 
|  | 266 | #define FC_LBIT                 0x10	 /* LOGIN bit in loopinit set */ | 
|  | 267 | #define FC_RSCN_MODE            0x20	 /* RSCN cmd rcv'ed */ | 
|  | 268 | #define FC_NLP_MORE             0x40	 /* More node to process in node tbl */ | 
|  | 269 | #define FC_OFFLINE_MODE         0x80	 /* Interface is offline for diag */ | 
|  | 270 | #define FC_FABRIC               0x100	 /* We are fabric attached */ | 
|  | 271 | #define FC_ESTABLISH_LINK       0x200	 /* Reestablish Link */ | 
|  | 272 | #define FC_RSCN_DISCOVERY       0x400	 /* Auth all devices after RSCN */ | 
|  | 273 | #define FC_SCSI_SCAN_TMO        0x4000	 /* scsi scan timer running */ | 
|  | 274 | #define FC_ABORT_DISCOVERY      0x8000	 /* we want to abort discovery */ | 
|  | 275 | #define FC_NDISC_ACTIVE         0x10000	 /* NPort discovery active */ | 
|  | 276 | #define FC_BYPASSED_MODE        0x20000	 /* NPort is in bypassed mode */ | 
| James Smart | 92d7f7b | 2007-06-17 19:56:38 -0500 | [diff] [blame] | 277 | #define FC_VPORT_NEEDS_REG_VPI	0x80000  /* Needs to have its vpi registered */ | 
|  | 278 | #define FC_RSCN_DEFERRED	0x100000 /* A deferred RSCN being processed */ | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 279 |  | 
| James Smart | 7ee5d43 | 2007-10-27 13:37:17 -0400 | [diff] [blame] | 280 | uint32_t ct_flags; | 
|  | 281 | #define FC_CT_RFF_ID		0x1	 /* RFF_ID accepted by switch */ | 
|  | 282 | #define FC_CT_RNN_ID		0x2	 /* RNN_ID accepted by switch */ | 
|  | 283 | #define FC_CT_RSNN_NN		0x4	 /* RSNN_NN accepted by switch */ | 
|  | 284 | #define FC_CT_RSPN_ID		0x8	 /* RSPN_ID accepted by switch */ | 
|  | 285 | #define FC_CT_RFT_ID		0x10	 /* RFT_ID accepted by switch */ | 
|  | 286 |  | 
| James Smart | 685f0bf | 2007-04-25 09:53:08 -0400 | [diff] [blame] | 287 | struct list_head fc_nodes; | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 288 |  | 
|  | 289 | /* Keep counters for the number of entries in each list. */ | 
|  | 290 | uint16_t fc_plogi_cnt; | 
|  | 291 | uint16_t fc_adisc_cnt; | 
|  | 292 | uint16_t fc_reglogin_cnt; | 
|  | 293 | uint16_t fc_prli_cnt; | 
|  | 294 | uint16_t fc_unmap_cnt; | 
|  | 295 | uint16_t fc_map_cnt; | 
|  | 296 | uint16_t fc_npr_cnt; | 
|  | 297 | uint16_t fc_unused_cnt; | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 298 | struct serv_parm fc_sparam;	/* buffer for our service parameters */ | 
|  | 299 |  | 
|  | 300 | uint32_t fc_myDID;	/* fibre channel S_ID */ | 
|  | 301 | uint32_t fc_prevDID;	/* previous fibre channel S_ID */ | 
|  | 302 |  | 
|  | 303 | int32_t stopped;   /* HBA has not been restarted since last ERATT */ | 
|  | 304 | uint8_t fc_linkspeed;	/* Link speed after last READ_LA */ | 
|  | 305 |  | 
|  | 306 | uint32_t num_disc_nodes;	/*in addition to hba_state */ | 
|  | 307 |  | 
|  | 308 | uint32_t fc_nlp_cnt;	/* outstanding NODELIST requests */ | 
|  | 309 | uint32_t fc_rscn_id_cnt;	/* count of RSCNs payloads in list */ | 
| James Smart | 7f5f3d0 | 2008-02-08 18:50:14 -0500 | [diff] [blame] | 310 | uint32_t fc_rscn_flush;		/* flag use of fc_rscn_id_list */ | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 311 | struct lpfc_dmabuf *fc_rscn_id_list[FC_MAX_HOLD_RSCN]; | 
|  | 312 | struct lpfc_name fc_nodename;	/* fc nodename */ | 
|  | 313 | struct lpfc_name fc_portname;	/* fc portname */ | 
|  | 314 |  | 
|  | 315 | struct lpfc_work_evt disc_timeout_evt; | 
|  | 316 |  | 
|  | 317 | struct timer_list fc_disctmo;	/* Discovery rescue timer */ | 
|  | 318 | uint8_t fc_ns_retry;	/* retries for fabric nameserver */ | 
|  | 319 | uint32_t fc_prli_sent;	/* cntr for outstanding PRLIs */ | 
|  | 320 |  | 
|  | 321 | spinlock_t work_port_lock; | 
|  | 322 | uint32_t work_port_events; /* Timeout to be handled  */ | 
| James Smart | 858c9f6 | 2007-06-17 19:56:39 -0500 | [diff] [blame] | 323 | #define WORKER_DISC_TMO                0x1	/* vport: Discovery timeout */ | 
|  | 324 | #define WORKER_ELS_TMO                 0x2	/* vport: ELS timeout */ | 
|  | 325 | #define WORKER_FDMI_TMO                0x4	/* vport: FDMI timeout */ | 
|  | 326 |  | 
|  | 327 | #define WORKER_MBOX_TMO                0x100	/* hba: MBOX timeout */ | 
|  | 328 | #define WORKER_HB_TMO                  0x200	/* hba: Heart beat timeout */ | 
| Joe Perches | b1c1181 | 2008-02-03 17:28:22 +0200 | [diff] [blame] | 329 | #define WORKER_FABRIC_BLOCK_TMO        0x400	/* hba: fabric block timeout */ | 
| James Smart | 858c9f6 | 2007-06-17 19:56:39 -0500 | [diff] [blame] | 330 | #define WORKER_RAMP_DOWN_QUEUE         0x800	/* hba: Decrease Q depth */ | 
|  | 331 | #define WORKER_RAMP_UP_QUEUE           0x1000	/* hba: Increase Q depth */ | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 332 |  | 
|  | 333 | struct timer_list fc_fdmitmo; | 
|  | 334 | struct timer_list els_tmofunc; | 
|  | 335 |  | 
|  | 336 | int unreg_vpi_cmpl; | 
|  | 337 |  | 
|  | 338 | uint8_t load_flag; | 
|  | 339 | #define FC_LOADING		0x1	/* HBA in process of loading drvr */ | 
|  | 340 | #define FC_UNLOADING		0x2	/* HBA in process of unloading drvr */ | 
| James Smart | 92d7f7b | 2007-06-17 19:56:38 -0500 | [diff] [blame] | 341 | char  *vname;		        /* Application assigned name */ | 
| James Smart | 858c9f6 | 2007-06-17 19:56:39 -0500 | [diff] [blame] | 342 |  | 
| James Smart | 3de2a65 | 2007-08-02 11:09:59 -0400 | [diff] [blame] | 343 | /* Vport Config Parameters */ | 
|  | 344 | uint32_t cfg_scan_down; | 
|  | 345 | uint32_t cfg_lun_queue_depth; | 
|  | 346 | uint32_t cfg_nodev_tmo; | 
|  | 347 | uint32_t cfg_devloss_tmo; | 
|  | 348 | uint32_t cfg_restrict_login; | 
|  | 349 | uint32_t cfg_peer_port_login; | 
|  | 350 | uint32_t cfg_fcp_class; | 
|  | 351 | uint32_t cfg_use_adisc; | 
|  | 352 | uint32_t cfg_fdmi_on; | 
|  | 353 | uint32_t cfg_discovery_threads; | 
| James Smart | e8b6201 | 2007-08-02 11:10:09 -0400 | [diff] [blame] | 354 | uint32_t cfg_log_verbose; | 
| James Smart | 3de2a65 | 2007-08-02 11:09:59 -0400 | [diff] [blame] | 355 | uint32_t cfg_max_luns; | 
| James Smart | 7ee5d43 | 2007-10-27 13:37:17 -0400 | [diff] [blame] | 356 | uint32_t cfg_enable_da_id; | 
| James Smart | 3de2a65 | 2007-08-02 11:09:59 -0400 | [diff] [blame] | 357 |  | 
|  | 358 | uint32_t dev_loss_tmo_changed; | 
| James Smart | 51ef4c2 | 2007-08-02 11:10:31 -0400 | [diff] [blame] | 359 |  | 
|  | 360 | struct fc_vport *fc_vport; | 
|  | 361 |  | 
|  | 362 | #ifdef CONFIG_LPFC_DEBUG_FS | 
|  | 363 | struct dentry *debug_disc_trc; | 
|  | 364 | struct dentry *debug_nodelist; | 
|  | 365 | struct dentry *vport_debugfs_root; | 
|  | 366 | struct lpfc_debugfs_trc *disc_trc; | 
|  | 367 | atomic_t disc_trc_cnt; | 
|  | 368 | #endif | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 369 | }; | 
|  | 370 |  | 
| James Smart | ed95768 | 2007-06-17 19:56:37 -0500 | [diff] [blame] | 371 | struct hbq_s { | 
|  | 372 | uint16_t entry_count;	  /* Current number of HBQ slots */ | 
| James Smart | a8adb83 | 2007-10-27 13:37:53 -0400 | [diff] [blame] | 373 | uint16_t buffer_count;	  /* Current number of buffers posted */ | 
| James Smart | ed95768 | 2007-06-17 19:56:37 -0500 | [diff] [blame] | 374 | uint32_t next_hbqPutIdx;  /* Index to next HBQ slot to use */ | 
|  | 375 | uint32_t hbqPutIdx;	  /* HBQ slot to use */ | 
|  | 376 | uint32_t local_hbqGetIdx; /* Local copy of Get index from Port */ | 
| James Smart | 51ef4c2 | 2007-08-02 11:10:31 -0400 | [diff] [blame] | 377 | void    *hbq_virt;	  /* Virtual ptr to this hbq */ | 
|  | 378 | struct list_head hbq_buffer_list;  /* buffers assigned to this HBQ */ | 
|  | 379 | /* Callback for HBQ buffer allocation */ | 
|  | 380 | struct hbq_dmabuf *(*hbq_alloc_buffer) (struct lpfc_hba *); | 
|  | 381 | /* Callback for HBQ buffer free */ | 
|  | 382 | void               (*hbq_free_buffer) (struct lpfc_hba *, | 
|  | 383 | struct hbq_dmabuf *); | 
| James Smart | ed95768 | 2007-06-17 19:56:37 -0500 | [diff] [blame] | 384 | }; | 
|  | 385 |  | 
| James Smart | 51ef4c2 | 2007-08-02 11:10:31 -0400 | [diff] [blame] | 386 | #define LPFC_MAX_HBQS  4 | 
|  | 387 | /* this matches the position in the lpfc_hbq_defs array */ | 
| James Smart | 92d7f7b | 2007-06-17 19:56:38 -0500 | [diff] [blame] | 388 | #define LPFC_ELS_HBQ	0 | 
| James Smart | 51ef4c2 | 2007-08-02 11:10:31 -0400 | [diff] [blame] | 389 | #define LPFC_EXTRA_HBQ	1 | 
| James Smart | ed95768 | 2007-06-17 19:56:37 -0500 | [diff] [blame] | 390 |  | 
| James Smart | 7af6705 | 2007-10-27 13:38:11 -0400 | [diff] [blame] | 391 | enum hba_temp_state { | 
|  | 392 | HBA_NORMAL_TEMP, | 
|  | 393 | HBA_OVER_TEMP | 
|  | 394 | }; | 
|  | 395 |  | 
| James Smart | db2378e | 2008-02-08 18:49:51 -0500 | [diff] [blame] | 396 | enum intr_type_t { | 
|  | 397 | NONE = 0, | 
|  | 398 | INTx, | 
|  | 399 | MSI, | 
|  | 400 | MSIX, | 
|  | 401 | }; | 
|  | 402 |  | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 403 | struct lpfc_hba { | 
|  | 404 | struct lpfc_sli sli; | 
| James Smart | ed95768 | 2007-06-17 19:56:37 -0500 | [diff] [blame] | 405 | uint32_t sli_rev;		/* SLI2 or SLI3 */ | 
|  | 406 | uint32_t sli3_options;		/* Mask of enabled SLI3 options */ | 
| James Smart | 311464e | 2007-08-02 11:10:37 -0400 | [diff] [blame] | 407 | #define LPFC_SLI3_ENABLED	 0x01 | 
| James Smart | 92d7f7b | 2007-06-17 19:56:38 -0500 | [diff] [blame] | 408 | #define LPFC_SLI3_HBQ_ENABLED	 0x02 | 
|  | 409 | #define LPFC_SLI3_NPIV_ENABLED	 0x04 | 
|  | 410 | #define LPFC_SLI3_VPORT_TEARDOWN 0x08 | 
| James Smart | ed95768 | 2007-06-17 19:56:37 -0500 | [diff] [blame] | 411 | uint32_t iocb_cmd_size; | 
|  | 412 | uint32_t iocb_rsp_size; | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 413 |  | 
|  | 414 | enum hba_state link_state; | 
|  | 415 | uint32_t link_flag;	/* link state flags */ | 
| James Smart | 311464e | 2007-08-02 11:10:37 -0400 | [diff] [blame] | 416 | #define LS_LOOPBACK_MODE      0x1	/* NPort is in Loopback mode */ | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 417 | /* This flag is set while issuing */ | 
|  | 418 | /* INIT_LINK mailbox command */ | 
| James Smart | 92d7f7b | 2007-06-17 19:56:38 -0500 | [diff] [blame] | 419 | #define LS_NPIV_FAB_SUPPORTED 0x2	/* Fabric supports NPIV */ | 
| James Smart | 1b32f6a | 2008-02-08 18:49:39 -0500 | [diff] [blame] | 420 | #define LS_IGNORE_ERATT       0x4	/* intr handler should ignore ERATT */ | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 421 |  | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 422 | struct lpfc_sli2_slim *slim2p; | 
|  | 423 | struct lpfc_dmabuf hbqslimp; | 
|  | 424 |  | 
|  | 425 | dma_addr_t slim2p_mapping; | 
|  | 426 |  | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 427 | uint16_t pci_cfg_value; | 
|  | 428 |  | 
| James Smart | 92d7f7b | 2007-06-17 19:56:38 -0500 | [diff] [blame] | 429 | uint8_t work_found; | 
|  | 430 | #define LPFC_MAX_WORKER_ITERATION  4 | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 431 |  | 
|  | 432 | uint8_t fc_linkspeed;	/* Link speed after last READ_LA */ | 
|  | 433 |  | 
|  | 434 | uint32_t fc_eventTag;	/* event tag for link attention */ | 
|  | 435 |  | 
|  | 436 |  | 
|  | 437 | struct timer_list fc_estabtmo;	/* link establishment timer */ | 
|  | 438 | /* These fields used to be binfo */ | 
|  | 439 | uint32_t fc_pref_DID;	/* preferred D_ID */ | 
| James Smart | 92d7f7b | 2007-06-17 19:56:38 -0500 | [diff] [blame] | 440 | uint8_t  fc_pref_ALPA;	/* preferred AL_PA */ | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 441 | uint32_t fc_edtov;	/* E_D_TOV timer value */ | 
|  | 442 | uint32_t fc_arbtov;	/* ARB_TOV timer value */ | 
|  | 443 | uint32_t fc_ratov;	/* R_A_TOV timer value */ | 
|  | 444 | uint32_t fc_rttov;	/* R_T_TOV timer value */ | 
|  | 445 | uint32_t fc_altov;	/* AL_TOV timer value */ | 
|  | 446 | uint32_t fc_crtov;	/* C_R_TOV timer value */ | 
|  | 447 | uint32_t fc_citov;	/* C_I_TOV timer value */ | 
|  | 448 |  | 
|  | 449 | struct serv_parm fc_fabparam;	/* fabric service parameters buffer */ | 
|  | 450 | uint8_t alpa_map[128];	/* AL_PA map from READ_LA */ | 
|  | 451 |  | 
|  | 452 | uint32_t lmt; | 
|  | 453 |  | 
|  | 454 | uint32_t fc_topology;	/* link topology, from LINK INIT */ | 
|  | 455 |  | 
|  | 456 | struct lpfc_stats fc_stat; | 
|  | 457 |  | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 458 | struct lpfc_nodelist fc_fcpnodev; /* nodelist entry for no device */ | 
|  | 459 | uint32_t nport_event_cnt;	/* timestamp for nlplist entry */ | 
|  | 460 |  | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 461 | uint8_t  wwnn[8]; | 
|  | 462 | uint8_t  wwpn[8]; | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 463 | uint32_t RandomData[7]; | 
|  | 464 |  | 
| James Smart | 3de2a65 | 2007-08-02 11:09:59 -0400 | [diff] [blame] | 465 | /* HBA Config Parameters */ | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 466 | uint32_t cfg_ack0; | 
| James Smart | 78b2d85 | 2007-08-02 11:10:21 -0400 | [diff] [blame] | 467 | uint32_t cfg_enable_npiv; | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 468 | uint32_t cfg_topology; | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 469 | uint32_t cfg_link_speed; | 
|  | 470 | uint32_t cfg_cr_delay; | 
|  | 471 | uint32_t cfg_cr_count; | 
| Jamie Wellnitz | cf5bf97 | 2006-02-28 22:33:08 -0500 | [diff] [blame] | 472 | uint32_t cfg_multi_ring_support; | 
| James Smart | a4bc337 | 2006-12-02 13:34:16 -0500 | [diff] [blame] | 473 | uint32_t cfg_multi_ring_rctl; | 
|  | 474 | uint32_t cfg_multi_ring_type; | 
| James.Smart@Emulex.Com | 875fbdf | 2005-11-29 16:32:13 -0500 | [diff] [blame] | 475 | uint32_t cfg_poll; | 
|  | 476 | uint32_t cfg_poll_tmo; | 
| James Smart | 4ff4324 | 2006-12-02 13:34:56 -0500 | [diff] [blame] | 477 | uint32_t cfg_use_msi; | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 478 | uint32_t cfg_sg_seg_cnt; | 
|  | 479 | uint32_t cfg_sg_dma_buf_size; | 
| James Smart | a12e07b | 2006-12-02 13:35:30 -0500 | [diff] [blame] | 480 | uint64_t cfg_soft_wwnn; | 
| James Smart | c3f28af | 2006-08-18 17:47:18 -0400 | [diff] [blame] | 481 | uint64_t cfg_soft_wwpn; | 
| James Smart | 3de2a65 | 2007-08-02 11:09:59 -0400 | [diff] [blame] | 482 | uint32_t cfg_hba_queue_depth; | 
| James Smart | 13815c8 | 2008-01-11 01:52:48 -0500 | [diff] [blame] | 483 | uint32_t cfg_enable_hba_reset; | 
|  | 484 | uint32_t cfg_enable_hba_heartbeat; | 
| James Smart | c01f320 | 2006-08-18 17:47:08 -0400 | [diff] [blame] | 485 |  | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 486 | lpfc_vpd_t vpd;		/* vital product data */ | 
|  | 487 |  | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 488 | struct pci_dev *pcidev; | 
|  | 489 | struct list_head      work_list; | 
|  | 490 | uint32_t              work_ha;      /* Host Attention Bits for WT */ | 
|  | 491 | uint32_t              work_ha_mask; /* HA Bits owned by WT        */ | 
|  | 492 | uint32_t              work_hs;      /* HS stored in case of ERRAT */ | 
|  | 493 | uint32_t              work_status[2]; /* Extra status from SLIM */ | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 494 |  | 
|  | 495 | wait_queue_head_t    *work_wait; | 
|  | 496 | struct task_struct   *worker_thread; | 
|  | 497 |  | 
| James Smart | 3163f72 | 2008-02-08 18:50:25 -0500 | [diff] [blame] | 498 | uint32_t hbq_in_use;		/* HBQs in use flag */ | 
|  | 499 | struct list_head hbqbuf_in_list;  /* in-fly hbq buffer list */ | 
| James Smart | ed95768 | 2007-06-17 19:56:37 -0500 | [diff] [blame] | 500 | uint32_t hbq_count;	        /* Count of configured HBQs */ | 
| James Smart | 92d7f7b | 2007-06-17 19:56:38 -0500 | [diff] [blame] | 501 | struct hbq_s hbqs[LPFC_MAX_HBQS]; /* local copy of hbq indicies  */ | 
| James Smart | ed95768 | 2007-06-17 19:56:37 -0500 | [diff] [blame] | 502 |  | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 503 | unsigned long pci_bar0_map;     /* Physical address for PCI BAR0 */ | 
|  | 504 | unsigned long pci_bar2_map;     /* Physical address for PCI BAR2 */ | 
|  | 505 | void __iomem *slim_memmap_p;	/* Kernel memory mapped address for | 
|  | 506 | PCI BAR0 */ | 
|  | 507 | void __iomem *ctrl_regs_memmap_p;/* Kernel memory mapped address for | 
|  | 508 | PCI BAR2 */ | 
|  | 509 |  | 
|  | 510 | void __iomem *MBslimaddr;	/* virtual address for mbox cmds */ | 
|  | 511 | void __iomem *HAregaddr;	/* virtual address for host attn reg */ | 
|  | 512 | void __iomem *CAregaddr;	/* virtual address for chip attn reg */ | 
|  | 513 | void __iomem *HSregaddr;	/* virtual address for host status | 
|  | 514 | reg */ | 
|  | 515 | void __iomem *HCregaddr;	/* virtual address for host ctl reg */ | 
|  | 516 |  | 
| James Smart | ed95768 | 2007-06-17 19:56:37 -0500 | [diff] [blame] | 517 | struct lpfc_hgp __iomem *host_gp; /* Host side get/put pointers */ | 
|  | 518 | uint32_t __iomem  *hbq_put;     /* Address in SLIM to HBQ put ptrs */ | 
| James Smart | 92d7f7b | 2007-06-17 19:56:38 -0500 | [diff] [blame] | 519 | uint32_t          *hbq_get;     /* Host mem address of HBQ get ptrs */ | 
| James Smart | ed95768 | 2007-06-17 19:56:37 -0500 | [diff] [blame] | 520 |  | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 521 | int brd_no;			/* FC board number */ | 
|  | 522 |  | 
|  | 523 | char SerialNumber[32];		/* adapter Serial Number */ | 
|  | 524 | char OptionROMVersion[32];	/* adapter BIOS / Fcode version */ | 
|  | 525 | char ModelDesc[256];		/* Model Description */ | 
|  | 526 | char ModelName[80];		/* Model Name */ | 
|  | 527 | char ProgramType[256];		/* Program Type */ | 
|  | 528 | char Port[20];			/* Port No */ | 
|  | 529 | uint8_t vpd_flag;               /* VPD data flag */ | 
|  | 530 |  | 
|  | 531 | #define VPD_MODEL_DESC      0x1         /* valid vpd model description */ | 
|  | 532 | #define VPD_MODEL_NAME      0x2         /* valid vpd model name */ | 
|  | 533 | #define VPD_PROGRAM_TYPE    0x4         /* valid vpd program type */ | 
|  | 534 | #define VPD_PORT            0x8         /* valid vpd port data */ | 
|  | 535 | #define VPD_MASK            0xf         /* mask for any vpd data */ | 
|  | 536 |  | 
| James Smart | a12e07b | 2006-12-02 13:35:30 -0500 | [diff] [blame] | 537 | uint8_t soft_wwn_enable; | 
| James Smart | c3f28af | 2006-08-18 17:47:18 -0400 | [diff] [blame] | 538 |  | 
| James.Smart@Emulex.Com | 875fbdf | 2005-11-29 16:32:13 -0500 | [diff] [blame] | 539 | struct timer_list fcp_poll_timer; | 
| James.Smart@Emulex.Com | 875fbdf | 2005-11-29 16:32:13 -0500 | [diff] [blame] | 540 |  | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 541 | /* | 
|  | 542 | * stat  counters | 
|  | 543 | */ | 
|  | 544 | uint64_t fc4InputRequests; | 
|  | 545 | uint64_t fc4OutputRequests; | 
|  | 546 | uint64_t fc4ControlRequests; | 
|  | 547 |  | 
|  | 548 | struct lpfc_sysfs_mbox sysfs_mbox; | 
|  | 549 |  | 
|  | 550 | /* fastpath list. */ | 
| James.Smart@Emulex.Com | 875fbdf | 2005-11-29 16:32:13 -0500 | [diff] [blame] | 551 | spinlock_t scsi_buf_list_lock; | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 552 | struct list_head lpfc_scsi_buf_list; | 
|  | 553 | uint32_t total_scsi_bufs; | 
|  | 554 | struct list_head lpfc_iocb_list; | 
|  | 555 | uint32_t total_iocbq_bufs; | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 556 | spinlock_t hbalock; | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 557 |  | 
|  | 558 | /* pci_mem_pools */ | 
|  | 559 | struct pci_pool *lpfc_scsi_dma_buf_pool; | 
|  | 560 | struct pci_pool *lpfc_mbuf_pool; | 
| James Smart | ed95768 | 2007-06-17 19:56:37 -0500 | [diff] [blame] | 561 | struct pci_pool *lpfc_hbq_pool; | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 562 | struct lpfc_dma_pool lpfc_mbuf_safety_pool; | 
|  | 563 |  | 
|  | 564 | mempool_t *mbox_mem_pool; | 
|  | 565 | mempool_t *nlp_mem_pool; | 
| James.Smart@Emulex.Com | f888ba3 | 2005-08-10 15:03:01 -0400 | [diff] [blame] | 566 |  | 
|  | 567 | struct fc_host_statistics link_stats; | 
| James Smart | db2378e | 2008-02-08 18:49:51 -0500 | [diff] [blame] | 568 | enum intr_type_t intr_type; | 
|  | 569 | struct msix_entry msix_entries[1]; | 
| James Smart | 858c9f6 | 2007-06-17 19:56:39 -0500 | [diff] [blame] | 570 |  | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 571 | struct list_head port_list; | 
| James Smart | 549e55c | 2007-08-02 11:09:51 -0400 | [diff] [blame] | 572 | struct lpfc_vport *pport;	/* physical lpfc_vport pointer */ | 
|  | 573 | uint16_t max_vpi;		/* Maximum virtual nports */ | 
| James Smart | 0937282 | 2008-01-11 01:52:54 -0500 | [diff] [blame] | 574 | #define LPFC_MAX_VPI 0xFFFF		/* Max number of VPI supported */ | 
| James Smart | 549e55c | 2007-08-02 11:09:51 -0400 | [diff] [blame] | 575 | unsigned long *vpi_bmask;	/* vpi allocation table */ | 
| James Smart | 92d7f7b | 2007-06-17 19:56:38 -0500 | [diff] [blame] | 576 |  | 
|  | 577 | /* Data structure used by fabric iocb scheduler */ | 
|  | 578 | struct list_head fabric_iocb_list; | 
|  | 579 | atomic_t fabric_iocb_count; | 
|  | 580 | struct timer_list fabric_block_timer; | 
|  | 581 | unsigned long bit_flags; | 
|  | 582 | #define	FABRIC_COMANDS_BLOCKED	0 | 
|  | 583 | atomic_t num_rsrc_err; | 
|  | 584 | atomic_t num_cmd_success; | 
|  | 585 | unsigned long last_rsrc_error_time; | 
|  | 586 | unsigned long last_ramp_down_time; | 
|  | 587 | unsigned long last_ramp_up_time; | 
| James Smart | 858c9f6 | 2007-06-17 19:56:39 -0500 | [diff] [blame] | 588 | #ifdef CONFIG_LPFC_DEBUG_FS | 
|  | 589 | struct dentry *hba_debugfs_root; | 
|  | 590 | atomic_t debugfs_vport_count; | 
| James Smart | 78b2d85 | 2007-08-02 11:10:21 -0400 | [diff] [blame] | 591 | struct dentry *debug_hbqinfo; | 
| James Smart | c95d6c6 | 2008-01-11 01:53:23 -0500 | [diff] [blame] | 592 | struct dentry *debug_dumpHostSlim; | 
|  | 593 | struct dentry *debug_dumpHBASlim; | 
| James Smart | a58cbd5 | 2007-08-02 11:09:43 -0400 | [diff] [blame] | 594 | struct dentry *debug_slow_ring_trc; | 
|  | 595 | struct lpfc_debugfs_trc *slow_ring_trc; | 
|  | 596 | atomic_t slow_ring_trc_cnt; | 
| James Smart | 858c9f6 | 2007-06-17 19:56:39 -0500 | [diff] [blame] | 597 | #endif | 
|  | 598 |  | 
| James Smart | 0ff10d4 | 2008-01-11 01:52:36 -0500 | [diff] [blame] | 599 | /* Used for deferred freeing of ELS data buffers */ | 
|  | 600 | struct list_head elsbuf; | 
|  | 601 | int elsbuf_cnt; | 
|  | 602 | int elsbuf_prev_cnt; | 
|  | 603 |  | 
| James Smart | 57127f1 | 2007-10-27 13:37:05 -0400 | [diff] [blame] | 604 | uint8_t temp_sensor_support; | 
| James Smart | 858c9f6 | 2007-06-17 19:56:39 -0500 | [diff] [blame] | 605 | /* Fields used for heart beat. */ | 
|  | 606 | unsigned long last_completion_time; | 
|  | 607 | struct timer_list hb_tmofunc; | 
|  | 608 | uint8_t hb_outstanding; | 
| James Smart | e47c909 | 2008-02-08 18:49:26 -0500 | [diff] [blame] | 609 | /* ndlp reference management */ | 
|  | 610 | spinlock_t ndlp_lock; | 
| James Smart | 76bb24e | 2007-10-27 13:38:00 -0400 | [diff] [blame] | 611 | /* | 
|  | 612 | * Following bit will be set for all buffer tags which are not | 
|  | 613 | * associated with any HBQ. | 
|  | 614 | */ | 
|  | 615 | #define QUE_BUFTAG_BIT  (1<<31) | 
|  | 616 | uint32_t buffer_tag_count; | 
| James Smart | 7af6705 | 2007-10-27 13:38:11 -0400 | [diff] [blame] | 617 | enum hba_temp_state over_temp_state; | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 618 | }; | 
|  | 619 |  | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 620 | static inline struct Scsi_Host * | 
|  | 621 | lpfc_shost_from_vport(struct lpfc_vport *vport) | 
|  | 622 | { | 
|  | 623 | return container_of((void *) vport, struct Scsi_Host, hostdata[0]); | 
| James Smart | 5b8bd0c | 2007-04-25 09:52:49 -0400 | [diff] [blame] | 624 | } | 
|  | dea3101 | 2005-04-17 16:05:31 -0500 | [diff] [blame] | 625 |  | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 626 | static inline void | 
|  | 627 | lpfc_set_loopback_flag(struct lpfc_hba *phba) | 
|  | 628 | { | 
|  | 629 | if (phba->cfg_topology == FLAGS_LOCAL_LB) | 
|  | 630 | phba->link_flag |= LS_LOOPBACK_MODE; | 
|  | 631 | else | 
|  | 632 | phba->link_flag &= ~LS_LOOPBACK_MODE; | 
|  | 633 | } | 
|  | 634 |  | 
|  | 635 | static inline int | 
|  | 636 | lpfc_is_link_up(struct lpfc_hba *phba) | 
|  | 637 | { | 
|  | 638 | return  phba->link_state == LPFC_LINK_UP || | 
| James Smart | 92d7f7b | 2007-06-17 19:56:38 -0500 | [diff] [blame] | 639 | phba->link_state == LPFC_CLEAR_LA || | 
|  | 640 | phba->link_state == LPFC_HBA_READY; | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 641 | } | 
|  | 642 |  | 
| James Smart | 57127f1 | 2007-10-27 13:37:05 -0400 | [diff] [blame] | 643 | #define FC_REG_DUMP_EVENT		0x10	/* Register for Dump events */ | 
|  | 644 | #define FC_REG_TEMPERATURE_EVENT	0x20    /* Register for temperature | 
|  | 645 | event */ | 
| James Smart | 2e0fef8 | 2007-06-17 19:56:36 -0500 | [diff] [blame] | 646 |  | 
| James Smart | 57127f1 | 2007-10-27 13:37:05 -0400 | [diff] [blame] | 647 | struct temp_event { | 
|  | 648 | uint32_t event_type; | 
|  | 649 | uint32_t event_code; | 
|  | 650 | uint32_t data; | 
|  | 651 | }; | 
|  | 652 | #define LPFC_CRIT_TEMP		0x1 | 
|  | 653 | #define LPFC_THRESHOLD_TEMP	0x2 | 
|  | 654 | #define LPFC_NORMAL_TEMP	0x3 |