1 /* Copyright(c) 2000, Compaq Computer Corporation
 
   2  * Fibre Channel Host Bus Adapter 64-bit, 66MHz PCI 
 
   3  * Originally developed and tested on:
 
   4  * (front): [chip] Tachyon TS HPFC-5166A/1.2  L2C1090 ...
 
   5  *          SP# P225CXCBFIEL6T, Rev XC
 
   6  *          SP# 161290-001, Rev XD
 
   7  * (back): Board No. 010008-001 A/W Rev X5, FAB REV X5
 
   9  * This program is free software; you can redistribute it and/or modify it
 
  10  * under the terms of the GNU General Public License as published by the
 
  11  * Free Software Foundation; either version 2, or (at your option) any
 
  14  * This program is distributed in the hope that it will be useful, but
 
  15  * WITHOUT ANY WARRANTY; without even the implied warranty of
 
  16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
  17  * General Public License for more details.
 
  18  * Written by Don Zimmerman
 
  20 #ifndef CPQFCTSSTRUCTS_H
 
  21 #define CPQFCTSSTRUCTS_H
 
  23 #include <linux/timer.h>  // timer declaration in our host data
 
  24 #include <linux/interrupt.h>
 
  25 #include <asm/atomic.h>
 
  26 #include "cpqfcTSioctl.h"
 
  28 #define DbgDelay(secs) { int wait_time; printk( " DbgDelay %ds ", secs); \
 
  29                          for( wait_time=jiffies + (secs*HZ); \
 
  30                          time_before(jiffies, wait_time) ;) ; }
 
  32 #define CPQFCTS_DRIVER_VER(maj,min,submin) ((maj<<16)|(min<<8)|(submin))
 
  33 // don't forget to also change MODULE_DESCRIPTION in cpqfcTSinit.c
 
  36 #define VER_SUBMINOR 4
 
  38 // Macros for kernel (esp. SMP) tracing using a PCI analyzer
 
  40 //#define PCI_KERNEL_TRACE
 
  41 #ifdef PCI_KERNEL_TRACE
 
  42 #define PCI_TRACE(x) inl( fcChip->Registers.IOBaseL +x);
 
  43 #define PCI_TRACEO(x,y) outl( x, (fcChip->Registers.IOBaseL +y));
 
  47 #define PCI_TRACEO(x,y)
 
  51 //#define DEBUG_CMND 1   // debug output for Linux Scsi CDBs
 
  52 //#define DUMMYCMND_DBG 1
 
  54 //#define DEBUG_CPQFCTS 1
 
  55 //#undef DEBUG_CPQFCTS 
 
  57 #define ENTER(x)        printk("cpqfcts : entering %s()\n", x);
 
  58 #define LEAVE(x)        printk("cpqfcts : leaving %s()\n", x);
 
  64 #endif                          /* DEBUG_CPQFCTS */
 
  66 //#define DEBUG_CPQFCTS_PCI 1
 
  67 //#undef DEBUG_CPQFCTS_PCI
 
  69 #define DEBUG_PCI(x)    x
 
  72 #endif                          /* DEBUG_CPQFCTS_PCI */
 
  74 #define STACHLITE66_TS12  "Compaq FibreChannel HBA Tachyon TS HPFC-5166A/1.2"
 
  75 #define STACHLITE66_TS13  "Compaq FibreChannel HBA Tachyon TS HPFC-5166A/1.3"
 
  76 #define STACHLITE_UNKNOWN "Compaq FibreChannel HBA Tachyon Chip/Board Ver??"
 
  77 #define SAGILENT_XL2_21   "Agilent FC HBA, Tachyon XL2 HPFC-5200B/2.1"
 
  79 // PDA is Peripheral Device Address, VSA is Volume Set Addressing
 
  80 // Linux SCSI parameters
 
  81 #define CPQFCTS_MAX_TARGET_ID 64
 
  83 // Note, changing CPQFCTS_MAX_LUN to less than 32 (e.g, 8) will result in
 
  84 // strange behavior if a box with more than, e.g. 8, is on the loop.
 
  85 #define CPQFCTS_MAX_LUN 32    // The RA-4x00 supports 32 (Linux SCSI supports 8)
 
  86 #define CPQFCTS_MAX_CHANNEL 0 // One FC port on cpqfcTS HBA
 
  88 #define CPQFCTS_CMD_PER_LUN 15 // power of 2 -1, must be >0 
 
  89 #define CPQFCTS_REQ_QUEUE_LEN (TACH_SEST_LEN/2) // must be < TACH_SEST_LEN
 
  91 #define LinuxVersionCode(v, p, s) (((v)<<16)+((p)<<8)+(s))
 
  92 #ifndef DECLARE_MUTEX_LOCKED
 
  93 #define DECLARE_MUTEX_LOCKED(sem) struct semaphore sem = MUTEX_LOCKED
 
  96 #define DEV_NAME "cpqfcTS"
 
  98 struct SupportedPCIcards
 
 104 // nn:nn denotes bit field
 
 105                             // TachyonHeader struct def.
 
 106                             // the fields shared with ODB
 
 107                             // need to have same value
 
 113 //typedef UCHAR BYTE;
 
 126 typedef void * PVOID;
 
 129 typedef __u16 USHORT;
 
 132 typedef __u8 BOOLEAN;
 
 136 // macro for FC-PH reject codes
 
 137 // payload format for LS_RJT (FC payloads are big endian):
 
 138 //     byte  0         1         2         3  (MSB)
 
 139 // DWORD 0   01        00        00        00
 
 140 // DWORD 1   resvd     code      expl.     vendor
 
 142 #define LS_RJT_REASON( code, expl) (( code<<8) | (expl <<16))
 
 145 #define TachLiteSTATUS 0x12
 
 147 // Fibre Channel EXCHANGE status codes for Tachyon chips/ driver software
 
 148 // 32-bit ERROR word defines
 
 149 #define INVALID_ARGS 0x1
 
 150 #define LNKDWN_OSLS  0x2
 
 151 #define LNKDWN_LASER 0x4
 
 152 #define OUTQUE_FULL  0x8
 
 153 #define DRIVERQ_FULL 0x10
 
 154 #define SEST_FULL    0x20
 
 155 #define BAD_ALPA     0x40
 
 156 #define OVERFLOW     0x80  // inbound CM
 
 157 #define COUNT_ERROR     0x100  // inbound CM
 
 158 #define LINKFAIL_RX     0x200  // inbound CM
 
 159 #define ABORTSEQ_NOTIFY 0x400  // outbound CM
 
 160 #define LINKFAIL_TX     0x800  // outbound CM
 
 161 #define HOSTPROG_ERR     0x1000  // outbound CM
 
 162 #define FRAME_TO         0x2000  // outbound CM
 
 163 #define INV_ENTRY        0x4000  // outbound CM
 
 164 #define SESTPROG_ERR     0x8000  // outbound CM
 
 165 #define OUTBOUND_TIMEOUT 0x10000L // timeout waiting for Tachyon outbound CM
 
 166 #define INITIATOR_ABORT  0x20000L // initiator exchange timeout or O/S ABORT
 
 167 #define MEMPOOL_FAIL     0x40000L // O/S memory pool allocation failed
 
 168 #define FC2_TIMEOUT      0x80000L // driver timeout for lost frames
 
 169 #define TARGET_ABORT     0x100000L // ABTS received from FC port
 
 170 #define EXCHANGE_QUEUED  0x200000L // e.g. Link State was LDn on fcStart
 
 171 #define PORTID_CHANGED   0x400000L // fc Port address changed
 
 172 #define DEVICE_REMOVED   0x800000L // fc Port address changed
 
 173 // Several error scenarios result in SEST Exchange frames 
 
 174 // unexpectedly arriving in the SFQ
 
 175 #define SFQ_FRAME        0x1000000L // SFQ frames from open Exchange
 
 177 // Maximum number of Host Bus Adapters (HBA) / controllers supported
 
 178 // only important for mem allocation dimensions - increase as necessary
 
 180 #define MAX_ADAPTERS 8
 
 181 #define MAX_RX_PAYLOAD 1024  // hardware dependent max frame payload
 
 182 // Tach header struc defines
 
 191 #define FCP_XFER_RDY 0x5
 
 193 #define FCP_RESPONSE 0x777 // (arbitrary #)
 
 194 #define NEED_FCP_RSP 0x77  // (arbitrary #)
 
 197 #define RESET_TACH 0x100 // Reset Tachyon/TachLite
 
 198 #define SCSI_IWE 0x2000  // initiator write entry (for SEST)
 
 199 #define SCSI_IRE 0x3000  // initiator read entry (for SEST)
 
 200 #define SCSI_TRE 0x400  // target read entry (for SEST)
 
 201 #define SCSI_TWE 0x500  // target write entry (for SEST)
 
 202 #define TOGGLE_LASER 0x800
 
 204 #define CLEAR_FCPORTS 99 // (arbitrary #) free mem for Logged in ports
 
 205 #define FMINIT 0x707     // (arbitrary) for Frame Manager Init command
 
 207 // BLS == Basic Link Service
 
 208 // ELS == Extended Link Service
 
 210 #define BLS_ABTS 0x10   // FC-PH Basic Link Service Abort Sequence
 
 211 #define BLS_ABTS_ACC 0x100  // FC-PH Basic Link Service Abort Sequence Accept
 
 212 #define BLS_ABTS_RJT 0x101  // FC-PH Basic Link Service Abort Sequence Reject
 
 213 #define ELS_PLOGI 0x03  // FC-PH Port Login (arbitrary assign)
 
 214 #define ELS_SCR   0x70  // (arb assign) State Change Registration (Fabric)
 
 215 #define FCS_NSR   0x72  // (arb assign) Name Service Request (Fabric)
 
 216 #define ELS_FLOGI 0x44  // (arb assign) Fabric Login
 
 217 #define ELS_FDISC 0x41  // (arb assign) Fabric Discovery (Login)
 
 218 #define ELS_PDISC 0x50  // FC-PH2 Port Discovery
 
 219 #define ELS_ABTX  0x06  // FC-PH Abort Exchange 
 
 220 #define ELS_LOGO 0x05   // FC-PH Port Logout
 
 221 #define ELS_PRLI 0x20   // FCP-SCSI Process Login
 
 222 #define ELS_PRLO 0x21   // FCP-SCSI Process Logout
 
 223 #define ELS_LOGO_ACC 0x07   // {FC-PH} Port Logout Accept
 
 224 #define ELS_PLOGI_ACC 0x08  // {FC-PH} Port Login Accept
 
 225 #define ELS_ACC 0x18        // {FC-PH} (generic) ACCept
 
 226 #define ELS_PRLI_ACC 0x22  // {FCP-SCSI} Process Login Accept
 
 227 #define ELS_RJT 0x1000000
 
 228 #define SCSI_REPORT_LUNS 0x0A0
 
 229 #define FCP_TARGET_RESET 0x200
 
 231 #define ELS_LILP_FRAME 0x00000711 // 1st payload word of LILP frame
 
 233 #define SFQ_UNASSISTED_FCP  1  // ICM, DWord3, "Type" unassisted FCP
 
 234 #define SFQ_UNKNOWN         0x31 // (arbitrary) ICM, DWord3, "Type" unknown
 
 236 // these "LINK" bits refer to loop or non-loop
 
 237 #define LINKACTIVE 0x2    // fcLinkQ type - LINK UP Tachyon FM 'Lup' bit set
 
 238 #define LINKDOWN 0xf2     // fcLinkQ type - LINK DOWN Tachyon FM 'Ldn' bit set
 
 240 //#define VOLUME_SET_ADDRESSING 1 // "channel" or "bus" 1
 
 242 typedef struct      // 32 bytes hdr ONLY (e.g. FCP_DATA buffer for SEST)
 
 244   ULONG reserved;   // dword 0 (don't use)
 
 246   ULONG d_id;       // dword 2 - 31:24 R_CTL, 23:0 D_ID
 
 247   ULONG s_id;       // dword 3 - 31:24 CS_CTL, 23:0 S_ID
 
 248   ULONG f_ctl;      // dword 4 - 31:24 Type,  23:0 F_CTL
 
 249   ULONG seq_cnt;    // dword 5 - 31:24 SEQ_ID, 23:16 DF_CTL, 15:0 SEQ_CNT
 
 250   ULONG ox_rx_id;   // dword 6 - 31:16 OX_ID,  15:0 RX_ID
 
 251   ULONG ro;         // dword 7 - relative offset
 
 254                     // NOTE!! the following struct MUST be 64 bytes.
 
 255 typedef struct      // 32 bytes hdr + 32 bytes payload
 
 257   ULONG reserved;   // dword 0 (don't use - must clear to 0)
 
 258   ULONG sof_eof;    // dword 1 - 31:24 SOF:EOF, UAM,CLS, LCr, TFV, TimeStamp
 
 259   ULONG d_id;       // dword 2 - 31:24 R_CTL, 23:0 D_ID
 
 260   ULONG s_id;       // dword 3 - 31:24 CS_CTL, 23:0 S_ID
 
 261   ULONG f_ctl;      // dword 4 - 31:24 Type,  23:0 F_CTL
 
 262   ULONG seq_cnt;    // dword 5 - 31:24 SEQ_ID, 23:16 DF_CTL, 15:0 SEQ_CNT
 
 263   ULONG ox_rx_id;   // dword 6 - 31:16 OX_ID,  15:0 RX_ID
 
 264   ULONG ro;  // dword 7 - relative offset
 
 266   __u32 pl[8];              // dwords 8-15 frame data payload
 
 270 typedef struct      // 32 bytes hdr + 120 bytes payload
 
 272   ULONG reserved;   // dword 0 (don't use - must clear to 0)
 
 273   ULONG sof_eof;    // dword 1 - 31:24 SOF:EOF, UAM,CLS, LCr, TFV, TimeStamp
 
 274   ULONG d_id;       // dword 2 - 31:24 R_CTL, 23:0 D_ID
 
 275   ULONG s_id;       // dword 3 - 31:24 CS_CTL, 23:0 S_ID
 
 276   ULONG f_ctl;      // dword 4 - 31:24 Type,  23:0 F_CTL
 
 277   ULONG seq_cnt;    // dword 5 - 31:24 SEQ_ID, 23:16 DF_CTL, 15:0 SEQ_CNT
 
 278   ULONG ox_rx_id;   // dword 6 - 31:16 OX_ID,  15:0 RX_ID
 
 279   ULONG ro;  // dword 7 - relative offset
 
 281   __u32 pl[30];              // largest necessary payload (for LOGIN cmnds)
 
 284 typedef struct      // 32 bytes hdr + 64 bytes payload
 
 286   ULONG reserved;   // dword 0 (don't use)
 
 288   ULONG d_id;       // dword 2 - 31:24 R_CTL, 23:0 D_ID
 
 289   ULONG s_id;       // dword 3 - 31:24 CS_CTL, 23:0 S_ID
 
 290   ULONG f_ctl;      // dword 4 - 31:24 Type,  23:0 F_CTL
 
 291   ULONG seq_cnt;    // dword 5 - 31:24 SEQ_ID, 23:16 DF_CTL, 15:0 SEQ_CNT
 
 292   ULONG ox_rx_id;   // dword 6 - 31:16 OX_ID,  15:0 RX_ID
 
 293   ULONG ro;  // dword 7 - relative offset
 
 295   __u32 pl[18]; // payload for FCP-RSP (response buffer) RA-4x00 is 72bytes
 
 303 // Inbound Message Queue structures...
 
 304 typedef struct              // each entry 8 words (32 bytes)
 
 306   ULONG type;               // IMQ completion message types
 
 307   ULONG word[7];            // remainder of structure
 
 308                             // interpreted by IMQ type
 
 312 // Queues for TachLite not in original Tachyon
 
 313 // ERQ       - Exchange Request Queue (for outbound commands)
 
 314 // SFQ       - Single Frame Queue (for incoming frames)
 
 316                             // Define Tachyon Outbound Command Que
 
 317                             // (Since many Tachyon registers are Read
 
 318                             // only, maintain copies for debugging)
 
 319                             // most Tach ques need power-of-2 sizes,
 
 320                             // where registers are loaded with po2 -1
 
 321 #define TACH_SEST_LEN 512   // TachLite SEST
 
 323 #define ELS_EXCHANGES 64    // e.g. PLOGI, RSCN, ...
 
 324 // define the total number of outstanding (simultaneous) exchanges
 
 325 #define TACH_MAX_XID (TACH_SEST_LEN + ELS_EXCHANGES)  // ELS exchanges
 
 327 #define ERQ_LEN 128         // power of 2, max 4096
 
 329 // Inbound Message Queue structures...
 
 330 #define IMQ_LEN 512              // minimum 4 entries [(power of 2) - 1]
 
 331 typedef struct                   // 8 words - 32 bytes
 
 333   TachyonIMQE QEntry[IMQ_LEN];
 
 334   ULONG producerIndex;   // IMQ Producer Index register
 
 336   ULONG consumerIndex;   // Consumer Index register (in Tachyon)
 
 337   ULONG length;          // Length register
 
 339 } TachyonIMQ;                    // @ 32 * IMQ_LEN align
 
 343 typedef struct           // inbound completion message
 
 347   ULONG TransferLength;
 
 352 // arbitrary numeric tags for TL structures
 
 353 #define TL_FCHS 1  // TachLite Fibre Channel Header Structure
 
 354 #define TL_IWE 2  // initiator write entry (for SEST)
 
 355 #define TL_TWE 3  // target write entry (for SEST)
 
 356 #define TL_IRE 4  // initiator read entry (for SEST)
 
 357 #define TL_TRE 5  // target read entry (for SEST)
 
 358 #define TL_IRB 6  // I/O request block
 
 360                                 // for INCOMING frames
 
 361 #define SFQ_LEN 32              // minimum 32 entries, max 4096
 
 363 typedef struct                  // Single Frame Que
 
 365   TachFCHDR_CMND QEntry[SFQ_LEN]; // must be 64 bytes!!
 
 366   ULONG producerIndex;   // IMQ Producer Index register
 
 368   ULONG consumerIndex;   // Consumer Index register (in Tachyon)
 
 369   ULONG length;          // Length register
 
 374 typedef struct                 // I/O Request Block flags
 
 377   UCHAR      : 1; // reserved
 
 383   UCHAR  SBV : 1;  // IRB entry valid - IRB'B' only
 
 386 typedef struct                  // I/O Request Block
 
 388   ULONG Req_A_SFS_Len;     // total frame len (hdr + payload), min 32
 
 389   ULONG Req_A_SFS_Addr;    // 32-bit pointer to FCHS struct (to be sent)
 
 390   ULONG Req_A_SFS_D_ID;    // 24-bit FC destination (i.e. 8 bit al_pa)
 
 391   ULONG Req_A_Trans_ID;    // X_ID (OX_ID or RX_ID) and/or Index in SEST
 
 393   ULONG Req_B_SFS_Len;     // total frame len (hdr + payload), min 32
 
 394   ULONG Req_B_SFS_Addr;    // 32-bit pointer to FCHS struct (to be sent)
 
 395   ULONG Req_B_SFS_D_ID;    // 24-bit FC destination (i.e. 8 bit al_pa)
 
 396   ULONG Req_B_Trans_ID;    // X_ID (OX_ID or RX_ID) and/or Index in SEST
 
 400 typedef struct           // TachLite placeholder for IRBs
 
 401 {                        // aligned @sizeof(ERQ) for TachLite
 
 402                          // MAX commands is sum of SEST len and ERQ
 
 403                          // we know that each SEST entry requires an
 
 404                          // IRB (ERQ) entry; in addition, we provide
 
 406   TachLiteIRB QEntry[ERQ_LEN]; // Base register; entries 32 bytes ea.
 
 407   ULONG consumerIndex;   // Consumer Index register
 
 408   ULONG producerIndex;   // ERQ Producer Index register
 
 409   ULONG length;          // Length register
 
 410   ULONG base;            // copy of base ptr for debug
 
 411                          // struct is sized for largest expected cmnd (LOGIN)
 
 414 // for now, just 32 bit DMA, eventually 40something, with code changes
 
 415 #define CPQFCTS_DMA_MASK ((unsigned long) (0x00000000FFFFFFFF))
 
 417 #define TL_MAX_SG_ELEM_LEN 0x7ffff  // Max buffer length a single S/G entry
 
 418                                 // may represent (a hardware limitation).  The
 
 419                                 // only reason to ever change this is if you
 
 420                                 // want to exercise very-hard-to-reach code in
 
 421                                 // cpqfcTSworker.c:build_SEST_sglist().
 
 423 #define TL_DANGER_SGPAGES 7  // arbitrary high water mark for # of S/G pages
 
 424                                 // we must exceed to elicit a warning indicative
 
 425                                 // of EXTREMELY large data transfers or 
 
 426                                 // EXTREME memory fragmentation.
 
 427                                 // (means we just used up 2048 S/G elements,
 
 428                                 // Never seen this is real life, only in 
 
 429                                 // testing with tricked up driver.)
 
 431 #define TL_EXT_SG_PAGE_COUNT 256  // Number of Extended Scatter/Gather a/l PAIRS
 
 432                                   // Tachyon register (IOBaseU 0x68)
 
 433                                   // power-of-2 value ONLY!  4 min, 256 max
 
 435                           // byte len is #Pairs * 2 ULONG/Pair * 4 bytes/ULONG
 
 436 #define TL_EXT_SG_PAGE_BYTELEN (TL_EXT_SG_PAGE_COUNT *2 *4)
 
 440 // SEST entry types: IWE, IRE, TWE, TRE
 
 448 #define USES_EXTENDED_SGLIST(this_sest, x_ID) \
 
 449         (!((this_sest)->u[ x_ID ].IWE.Buff_Off & 0x80000000))
 
 455    // --- extended/local Gather Len/Address pairs
 
 468   ULONG reserved;       // must clear to 0
 
 472   ULONG Buff_Index;           // ULONG 5
 
 475   ULONG reserved_;      // ULONG 8
 
 477    // --- extended/local Scatter Len/Address pairs
 
 487 typedef struct          // Target Write Entry
 
 489   ULONG Seq_Accum;      // dword 0
 
 490   ULONG reserved;       // dword 1  must clear to 0
 
 491   ULONG Remote_Node_ID;
 
 492   ULONG reserved1;      // dword 3  must clear to 0
 
 494   ULONG Buff_Index;     // ULONG 5
 
 497   ULONG reserved_;      // ULONG 8
 
 499    // --- extended/local Scatter Len/Address pairs
 
 512   ULONG RSP_Len;        // DWord 2
 
 515   ULONG Buff_Index;     // DWord 5
 
 520    // --- extended/local Gather Len/Address pairs
 
 521   ULONG GLen1;          // DWord A
 
 529 typedef struct ext_sg_page_ptr_t *PSGPAGES;
 
 530 typedef struct ext_sg_page_ptr_t 
 
 532   unsigned char page[TL_EXT_SG_PAGE_BYTELEN * 2]; // 2x for alignment
 
 533   dma_addr_t busaddr;   // need the bus addresses and
 
 534   unsigned int maplen;  // lengths for later pci unmapping.
 
 536 } SGPAGES; // linked list of S/G pairs, by Exchange
 
 538 typedef struct                  // SCSI Exchange State Table
 
 540   union                         // Entry can be IWE, IRE, TWE, TRE
 
 541   {                             // 64 bytes per entry
 
 548   TachFCHDR DataHDR[TACH_SEST_LEN]; // for SEST FCP_DATA frame hdr (no pl)
 
 549   TachFCHDR_RSP RspHDR[TACH_SEST_LEN]; // space for SEST FCP_RSP frame
 
 550   PSGPAGES sgPages[TACH_SEST_LEN]; // head of linked list of Pool-allocations
 
 551   ULONG length;          // Length register
 
 552   ULONG base;            // copy of base ptr for debug
 
 557 typedef struct                  // each register has it's own address
 
 558                                 // and value (used for write-only regs)
 
 561   volatile ULONG value;
 
 564 typedef struct         // Host copy - TachLite Registers
 
 566   ULONG IOBaseL, IOBaseU;  // I/O port lower and upper TL register addresses
 
 567   ULONG MemBase;           // memory mapped register addresses
 
 568   void* ReMapMemBase;      // O/S VM reference for MemBase
 
 569   ULONG wwn_hi;            // WWN is set once at startup
 
 571   ULONG my_al_pa;          // al_pa received after LIP()
 
 572   ULONG ROMCTR;            // flags for on-board RAM/ROM
 
 573   ULONG RAMBase;           // on-board RAM (i.e. some Tachlites)
 
 574   ULONG SROMBase;          // on-board EEPROM (some Tachlites)
 
 575   ULONG PCIMCTR;           // PCI Master Control Reg (has bus width)
 
 577   FCREGISTER INTEN;        // copy of interrupt enable mask
 
 578   FCREGISTER INTPEND;      // interrupt pending
 
 579   FCREGISTER INTSTAT;      // interrupt status
 
 580   FCREGISTER SFQconsumerIndex; 
 
 581   FCREGISTER ERQproducerIndex; 
 
 582   FCREGISTER TYconfig;   // TachYon (chip level)
 
 583   FCREGISTER TYcontrol;
 
 585   FCREGISTER FMconfig;   // Frame Manager (FC loop level)
 
 586   FCREGISTER FMcontrol;
 
 588   FCREGISTER FMLinkStatus1;
 
 589   FCREGISTER FMLinkStatus2;
 
 590   FCREGISTER FMBB_CreditZero;
 
 592   FCREGISTER ed_tov;     // error detect time-out value
 
 593   FCREGISTER rcv_al_pa;  // received arb. loop physical address
 
 594   FCREGISTER primitive;  // e.g. LIP(), OPN(), ...
 
 607   ULONG hpe;    // host programming err (from Tach)
 
 608   ULONG FC4aborted; // aborts from Application or upper driver layer
 
 609   ULONG FC2aborted; // aborts from our driver's timeouts
 
 610   ULONG timeouts;   // our driver timeout (on individual exchanges)
 
 611   ULONG logouts;    // explicit - sent LOGO; implicit - device removed
 
 615   ULONG CntErrors;  // byte count expected != count received (typ. SEST)
 
 616   ULONG e_stores;   // elastic store errs
 
 617   ULONG resets;     // hard or soft controller resets
 
 618   ULONG FMinits;    // TACH Frame Manager Init (e.g. LIPs)
 
 619   ULONG lnkQueFull;  // too many LOGIN, loop commands
 
 620   ULONG ScsiQueFull; // too many FCP-SCSI inbound frames
 
 621   ULONG LossofSignal;   // FM link status 1 regs
 
 622   ULONG BadRXChar;   // FM link status 1 regs
 
 623   ULONG LossofSync;   // FM link status 1 regs
 
 624   ULONG Rx_EOFa;   // FM link status 2 regs (received EOFa)
 
 625   ULONG Dis_Frm;   // FM link status 2 regs (discarded frames)
 
 626   ULONG Bad_CRC;   // FM link status 2 regs
 
 627   ULONG BB0_Timer; //  FM BB_Credit Zero Timer Reg
 
 628   ULONG loopBreaks; // infinite loop exits
 
 629   ULONG lastBB0timer;  // static accum. buffer needed by Tachlite
 
 633 typedef struct               // Config Options
 
 636   USHORT  flogi : 1;           // bit1: We sent FLOGI - wait for Fabric logins
 
 637   USHORT  fabric: 1;           // bit2: Tachyon detected Fabric (FM stat LG)
 
 638   USHORT  LILPin: 1;           // bit3: We can use an FC-AL LILP frame
 
 639   USHORT  target: 1;           // bit4: this Port has SCSI target capability
 
 640   USHORT  initiator:    1;     // bit5: this Port has SCSI initiator capability
 
 641   USHORT  extLoopback:  1;     // bit6: loopback at GBIC
 
 642   USHORT  intLoopback:  1;     // bit7: loopback in HP silicon
 
 645   USHORT        : 1;           // bit10:
 
 646   USHORT        : 1;           // bit11:
 
 647   USHORT        : 1;           // bit12:
 
 648   USHORT        : 1;           // bit13:
 
 649   USHORT        : 1;           // bit14:
 
 650   USHORT        : 1;           // bit15:
 
 655 typedef struct dyn_mem_pair
 
 657   void *BaseAllocated;  // address as allocated from O/S;
 
 658   unsigned long AlignedAddress; // aligned address (used by Tachyon DMA)
 
 659   dma_addr_t dma_handle;
 
 666 // these structs contain only CRUCIAL (stuff we actually use) parameters
 
 667 // from FC-PH(n) logins.  (Don't save entire LOGIN payload to save mem.)
 
 669 // Implicit logout happens when the loop goes down - we require PDISC
 
 670 // to restore.  Explicit logout is when WE decide never to talk to someone,
 
 671 // or when a target refuses to talk to us, i.e. sends us a LOGO frame or
 
 672 // LS_RJT reject in response to our PLOGI request.
 
 674 #define IMPLICIT_LOGOUT 1
 
 675 #define EXPLICIT_LOGOUT 2
 
 679   UCHAR channel; // SCSI "bus"
 
 681   UCHAR InqDeviceType;  // byte 0 from SCSI Inquiry response
 
 682   UCHAR VolumeSetAddressing;  // FCP-SCSI LUN coding (40h for VSA)
 
 683   UCHAR LunMasking;     // True if selective presentation supported
 
 684   UCHAR lun[CPQFCTS_MAX_LUN];
 
 692     UCHAR ucWWN[8];  // a FC 64-bit World Wide Name/ PortID of target
 
 693                      // addressing of single target on single loop...
 
 697   ULONG port_id;     // a FC 24-bit address of port (lower 8 bits = al_pa)
 
 699 #define REPORT_LUNS_PL 256  
 
 700   UCHAR ReportLunsPayload[REPORT_LUNS_PL];
 
 702   SCSI_NEXUS ScsiNexus; // LUNs per FC device
 
 704   ULONG LOGO_counter; // might try several times before logging out for good
 
 705   ULONG LOGO_timer;   // after LIP, ports expecting PDISC must time-out and
 
 706                       // LOGOut if successful PDISC not completed in 2 secs
 
 708   ULONG concurrent_seq;  // must be 1 or greater
 
 709   ULONG rx_data_size;    // e.g. 128, 256, 1024, 2048 per FC-PH spec
 
 713   ULONG fcp_info;        // from PRLI (i.e. INITIATOR/ TARGET flags)
 
 714                          // flags for login process
 
 715   BOOLEAN Originator;    // Login sequence Originated (if false, we
 
 716                          // responded to another port's login sequence)
 
 717   BOOLEAN plogi;         // PLOGI frame ACCepted (originated or responded)
 
 718   BOOLEAN pdisc;         // PDISC frame was ORIGINATED (self-login logic)
 
 719   BOOLEAN prli;          // PRLI frame ACCepted (originated or responded)
 
 720   BOOLEAN flogi;         // FLOGI frame ACCepted (originated or responded)
 
 721   BOOLEAN logo;          // port permanently logged out (invalid login param)
 
 722   BOOLEAN flogiReq;      // Fabric login required (set in LIP process)
 
 727   // when the "target" (actually FC Port) is waiting for login
 
 728   // (e.g. after Link reset), set the device_blocked bit;
 
 729   // after Port completes login, un-block target.
 
 730   UCHAR device_blocked; // see Scsi_Device struct
 
 732                     // define singly-linked list of logged-in ports
 
 733                     // once a port_id is identified, it is remembered,
 
 734                     // even if the port is removed indefinitely
 
 735   PVOID pNextPort;  // actually, type PFC_LOGGEDIN_PORT; void for Compiler
 
 737 } FC_LOGGEDIN_PORT, *PFC_LOGGEDIN_PORT;
 
 741 // This serves as the ESB (Exchange Status Block),
 
 742 // and has timeout counter; used for ABORTs
 
 745   ULONG type;            // ELS_PLOGI, SCSI_IWE, ... (0 if free)
 
 746   PFC_LOGGEDIN_PORT pLoggedInPort; // FC device on other end of Exchange
 
 747   Scsi_Cmnd *Cmnd;       // Linux SCSI command packet includes S/G list
 
 748   ULONG timeOut;         // units of ??, DEC by driver, Abort when 0
 
 749   ULONG reTries;         // need one or more retries?
 
 750   ULONG status;          // flags indicating errors (0 if none)
 
 751   TachLiteIRB IRB;       // I/O Request Block, gets copied to ERQ
 
 752   TachFCHDR_GCMND fchs;  // location of IRB's Req_A_SFS_Addr
 
 753 } FC_EXCHANGE, *PFC_EXCHANGE;
 
 755 // Unfortunately, Linux limits our kmalloc() allocations to 128k.
 
 756 // Because of this and the fact that our ScsiRegister allocation
 
 757 // is also constrained, we move this large structure out for
 
 758 // allocation after Scsi Register.
 
 759 // (In other words, this cumbersome indirection is necessary
 
 760 // because of kernel memory allocation constraints!)
 
 762 typedef struct // we will allocate this dynamically
 
 764   FC_EXCHANGE fcExchange[ TACH_MAX_XID ];
 
 779   char Name[64]; // name of controller ("HP Tachlite TL Rev2.0, 33MHz, 64bit bus")
 
 780   //PVOID  pAdapterDevExt; // back pointer to device object/extension
 
 781   ULONG ChipType;        // local numeric key for Tachyon Type / Rev.
 
 782   ULONG status;              // our Driver - logical status
 
 784   TL_REGISTERS Registers;    // reg addresses & host memory copies
 
 785                              // FC-4 mapping of 'transaction' to X_IDs
 
 786   UCHAR LILPmap[32*4];       // Loop Position Map of ALPAs (late FC-AL only)
 
 787   FC_OPTIONS Options;        // e.g. Target, Initiator, loopback...
 
 788   UCHAR highest_FCPH_ver;    // FC-PH version limits
 
 789   UCHAR lowest_FCPH_ver;     // FC-PH version limits
 
 791   FC_EXCHANGES *Exchanges;  
 
 792   ULONG fcLsExchangeLRU;       // Least Recently Used counter (Link Service)
 
 793   ULONG fcSestExchangeLRU;       // Least Recently Used counter (FCP-SCSI)
 
 794   FC_LOGGEDIN_PORT fcPorts;  // linked list of every FC port ever seen
 
 795   FCSTATS fcStats;           // FC comm err counters
 
 797                              // Host memory QUEUE pointers
 
 798   TachLiteERQ *ERQ;          // Exchange Request Que 
 
 799   TachyonIMQ *IMQ;           // Inbound Message Que 
 
 800   TachLiteSFQ *SFQ;          // Single Frame Queue
 
 801   TachSEST *SEST;            // SCSI Exchange State Table
 
 803   dma_addr_t exch_dma_handle;
 
 805   // these function pointers are for "generic" functions, which are
 
 806   // replaced with Host Bus Adapter types at
 
 808   int (*CreateTachyonQues)( void* , int);
 
 809   int (*DestroyTachyonQues)( void* , int);
 
 810   int (*LaserControl)(void*, int );   // e.g. On/Off
 
 811   int (*ResetTachyon)(void*, int );
 
 812   void (*FreezeTachyon)(void*, int );
 
 813   void (*UnFreezeTachyon)(void*, int );
 
 814   int (*InitializeTachyon)(void*, int, int );
 
 815   int (*InitializeFrameManager)(void*, int );
 
 816   int (*ProcessIMQEntry)(void*);
 
 817   int (*ReadWriteWWN)(void*, int ReadWrite);
 
 818   int (*ReadWriteNVRAM)(void*, void*, int ReadWrite);
 
 820 } TACHYON, *PTACHYON;
 
 823 void cpqfcTSClearLinkStatusCounters(TACHYON * fcChip);
 
 825 int CpqTsCreateTachLiteQues( void* pHBA, int opcode);
 
 826 int CpqTsDestroyTachLiteQues( void* , int);
 
 827 int CpqTsInitializeTachLite( void *pHBA, int opcode1, int opcode2);
 
 829 int CpqTsProcessIMQEntry(void* pHBA);
 
 830 int CpqTsResetTachLite(void *pHBA, int type);
 
 831 void CpqTsFreezeTachlite(void *pHBA, int type);
 
 832 void CpqTsUnFreezeTachlite(void *pHBA, int type);
 
 833 int CpqTsInitializeFrameManager(void *pHBA, int);
 
 834 int CpqTsLaserControl( void* addrBase, int opcode );
 
 835 int CpqTsReadWriteWWN(void*, int ReadWrite);
 
 836 int CpqTsReadWriteNVRAM(void*, void* data, int ReadWrite);
 
 838 void cpqfcTS_WorkTask( struct Scsi_Host *HostAdapter);
 
 839 void cpqfcTSWorkerThread( void *host);
 
 841 int cpqfcTS_GetNVRAM_data( UCHAR *wwnbuf, UCHAR *buf );
 
 842 ULONG cpqfcTS_ReadNVRAM( void* GPIOin, void* GPIOout , USHORT count,
 
 845 BOOLEAN tl_write_i2c_nvram( void* GPIOin, void* GPIOout,
 
 846   USHORT startOffset,  // e.g. 0x2f for WWN start
 
 851 // define misc functions 
 
 852 int cpqfcTSGetLPSM( PTACHYON fcChip, char cErrorString[]);
 
 853 int cpqfcTSDecodeGBICtype( PTACHYON fcChip, char cErrorString[]);
 
 854 void* fcMemManager( struct pci_dev *pdev,
 
 855                 ALIGNED_MEM *dyn_mem_pair, ULONG n_alloc, ULONG ab,
 
 856                    ULONG ulAlignedAddress, dma_addr_t *dma_handle);
 
 858 void BigEndianSwap(  UCHAR *source, UCHAR *dest,  USHORT cnt);
 
 860 //ULONG virt_to_phys( PVOID virtaddr );
 
 863 // Linux interrupt handler
 
 864 irqreturn_t cpqfcTS_intr_handler( int irq,void *dev_id,struct pt_regs *regs);
 
 865 void cpqfcTSheartbeat( unsigned long ptr );
 
 869 // The biggest Q element we deal with is Aborts - we
 
 870 // need 4 bytes for x_ID, and a Scsi_Cmnd (~284 bytes)
 
 871 //#define LINKQ_ITEM_SIZE ((4+sizeof(Scsi_Cmnd)+3)/4)
 
 872 #define LINKQ_ITEM_SIZE (3*16)
 
 875   ULONG Type;              // e.g. LINKUP, SFQENTRY, PDISC, BLS_ABTS, ...
 
 876   ULONG ulBuff[ LINKQ_ITEM_SIZE ];
 
 879 #define FC_LINKQ_DEPTH TACH_MAX_XID
 
 883   ULONG consumer;  // when producer equals consumer, Q empty
 
 885   LINKQ_ITEM Qitem[ FC_LINKQ_DEPTH ];
 
 887 } FC_LINK_QUE, *PFC_LINK_QUE;
 
 890      // DPC routines post to here on Inbound SCSI frames
 
 891      // User thread processes
 
 892 #define FC_SCSIQ_DEPTH 32
 
 896   int Type;              // e.g. SCSI
 
 897   ULONG ulBuff[ 3*16 ];
 
 903   ULONG consumer;  // when producer equals consumer, Q empty
 
 905   SCSIQ_ITEM Qitem[ FC_SCSIQ_DEPTH ];
 
 907 } FC_SCSI_QUE, *PFC_SCSI_QUE;
 
 910         /* This is tacked on to a Scsi_Request in upper_private_data 
 
 911            for pasthrough ioctls, as a place to hold data that can't 
 
 912            be stashed anywhere else in the Scsi_Request.  We differentiate
 
 913            this from _real_ upper_private_data by checking if the virt addr
 
 914            is within our special pool.  */
 
 917 } cpqfc_passthru_private_t;
 
 919 #define CPQFC_MAX_PASSTHRU_CMDS 100
 
 921 #define DYNAMIC_ALLOCATIONS 4  // Tachyon aligned allocations: ERQ,IMQ,SFQ,SEST
 
 923 // Linux space allocated per HBA (chip state, etc.)
 
 926   struct Scsi_Host *HostAdapter; // back pointer to Linux Scsi struct
 
 928   TACHYON fcChip;    // All Tachyon registers, Queues, functions
 
 929   ALIGNED_MEM dynamic_mem[DYNAMIC_ALLOCATIONS];
 
 931   struct pci_dev *PciDev;
 
 932   dma_addr_t fcLQ_dma_handle;
 
 934   Scsi_Cmnd *LinkDnCmnd[CPQFCTS_REQ_QUEUE_LEN]; // collects Cmnds during LDn
 
 935                                                 // (for Acceptable targets)
 
 936   Scsi_Cmnd *BoardLockCmnd[CPQFCTS_REQ_QUEUE_LEN]; // SEST was full
 
 938   Scsi_Cmnd *BadTargetCmnd[CPQFCTS_MAX_TARGET_ID]; // missing targets
 
 940   u_char HBAnum;     // 0-based host number
 
 943   struct timer_list cpqfcTStimer; // FC utility timer for implicit
 
 944                                   // logouts, FC protocol timeouts, etc.
 
 945   int fcStatsTime;  // Statistics delta reporting time
 
 947   struct task_struct *worker_thread; // our kernel thread
 
 948   int PortDiscDone;    // set by SendLogins(), cleared by LDn
 
 950   struct semaphore *TachFrozen;
 
 951   struct semaphore *TYOBcomplete;    // handshake for Tach outbound frames
 
 952   struct semaphore *fcQueReady;      // FibreChannel work for our kernel thread
 
 953   struct semaphore *notify_wt;       // synchronizes kernel thread kill
 
 954   struct semaphore *BoardLock;
 
 956   PFC_LINK_QUE fcLQ;             // the WorkerThread operates on this
 
 958   spinlock_t hba_spinlock;           // held/released by WorkerThread
 
 959   cpqfc_passthru_private_t *private_data_pool;
 
 960   unsigned long *private_data_bits;
 
 964 #define CPQ_SPINLOCK_HBA( x )   spin_lock(&x->hba_spinlock);
 
 965 #define CPQ_SPINUNLOCK_HBA(x)   spin_unlock(&x->hba_spinlock);
 
 969 void cpqfcTSImplicitLogout( CPQFCHBA* cpqfcHBAdata,
 
 970                 PFC_LOGGEDIN_PORT pFcPort);
 
 973 void cpqfcTSTerminateExchange( CPQFCHBA*, SCSI_NEXUS *target, int );
 
 975 PFC_LOGGEDIN_PORT fcPortLoggedIn( 
 
 976    CPQFCHBA *cpqfcHBAdata, 
 
 977    TachFCHDR_GCMND* fchs, 
 
 980 void fcProcessLoggedIn( 
 
 981    CPQFCHBA *cpqfcHBAdata, TachFCHDR_GCMND* fchs);
 
 984 ULONG cpqfcTSBuildExchange( 
 
 985   CPQFCHBA *cpqfcHBAdata,
 
 986   ULONG type, // e.g. PLOGI
 
 987   TachFCHDR_GCMND* InFCHS,  // incoming FCHS
 
 988   void *Data,               // the CDB, scatter/gather, etc.  
 
 989   LONG *ExchangeID );       // allocated exchange ID
 
 991 ULONG cpqfcTSStartExchange( 
 
 992   CPQFCHBA *cpqfcHBAdata,
 
 995 void cpqfcTSCompleteExchange( 
 
 996        struct pci_dev *pcidev,
 
1001 PFC_LOGGEDIN_PORT  fcFindLoggedInPort( 
 
1003   Scsi_Cmnd *Cmnd,  // (We want the channel/target/lun Nexus from Cmnd)
 
1004   ULONG port_id,  // search linked list for al_pa, or
 
1005   UCHAR wwn[8],    // search linked list for WWN, or...
 
1006   PFC_LOGGEDIN_PORT *pLastLoggedInPort
 
1009 void cpqfcTSPutLinkQue( 
 
1010   CPQFCHBA *cpqfcHBAdata, 
 
1015   CPQFCHBA *cpqfcHBAdata, 
 
1026 void cpqfc_pci_unmap(struct pci_dev *pcidev, 
 
1031 extern const UCHAR valid_al_pa[];
 
1032 extern const int number_of_al_pa;
 
1034 #define FCP_RESID_UNDER   0x80000
 
1035 #define FCP_RESID_OVER    0x40000
 
1036 #define FCP_SNS_LEN_VALID 0x20000
 
1037 #define FCP_RSP_LEN_VALID 0x10000
 
1039 // RSP_CODE definitions (dpANS Fibre Channel Protocol for SCSI, pg 34)
 
1040 #define FCP_DATA_LEN_NOT_BURST_LEN 0x1000000
 
1041 #define FCP_CMND_FIELD_INVALID     0x2000000
 
1042 #define FCP_DATA_RO_NOT_XRDY_RO    0x3000000
 
1043 #define FCP_TASKFUNCTION_NS        0x4000000
 
1044 #define FCP_TASKFUNCTION_FAIL      0x5000000
 
1046 // FCP-SCSI response status struct
 
1047 typedef struct  // see "TachFCHDR_RSP" definition - 64 bytes
 
1051   __u32 fcp_status;    // field validity and SCSI status
 
1053   __u32 fcp_sns_len;   // length of FCP_SNS_INFO field
 
1054   __u32 fcp_rsp_len;   // length of FCP_RSP_INFO field (expect 8)
 
1055   __u32 fcp_rsp_info;  // 4 bytes of FCP protocol response information
 
1056   __u32 fcp_rsp_info2; // (4 more bytes, since most implementations use 8)
 
1057   __u8  fcp_sns_info[36]; // bytes for SCSI sense (ASC, ASCQ)
 
1059 } FCP_STATUS_RESPONSE, *PFCP_STATUS_RESPONSE;
 
1062 // Fabric State Change Registration
 
1063 typedef struct scrpl
 
1069 // Fabric Name Service Request
 
1070 typedef struct nsrpl
 
1072   __u32 CT_Rev;  // (& IN_ID)   WORD 0
 
1073   __u32 FCS_Type;            // WORD 1
 
1074   __u32 Command_code;        // WORD 2
 
1075   __u32 reason_code;         // WORD 3
 
1076   __u32 FCP;                 // WORD 4 (lower byte)
 
1083 #define MAX_RX_SIZE             0x800   // Max Receive Buffer Size is 2048
 
1084 #define MIN_RX_SIZE             0x100   // Min Size is 256, per FC-PLDA Spec
 
1085 #define MAX_TARGET_RXIDS        SEST_DEPTH
 
1086 #define TARGET_RX_SIZE          SEST_BUFFER_LENGTH
 
1088 #define CLASS_1                 0x01
 
1089 #define CLASS_2                 0x02
 
1090 #define CLASS_3                 0x03
 
1092 #define FC_PH42                 0x08
 
1093 #define FC_PH43                 0x09
 
1096 #define RR_TOV                  2       // Minimum Time for target to wait for
 
1097                                         // PDISC after a LIP.
 
1098 #define E_D_TOV                 2       // Minimum Time to wait for Sequence
 
1100 #define R_A_TOV                 0       // Minimum Time for Target to wait 
 
1101                                         // before reclaiming resources.
 
1105 //      Routing Bits (31-28)
 
1107 #define FC4_DEVICE_DATA         0x00000000
 
1108 #define EXT_LINK_DATA           0x20000000
 
1109 #define FC4_LINK_DATA           0x30000000
 
1110 #define VIDEO_DATA              0x40000000
 
1111 #define BASIC_LINK_DATA         0x80000000
 
1112 #define LINK_CONTROL            0xC0000000
 
1113 #define ROUTING_MASK            0xF0000000
 
1116 //      Information Bits (27-24)
 
1118 #define UNCAT_INFORMATION       0x00000000
 
1119 #define SOLICITED_DATA          0x01000000
 
1120 #define UNSOLICITED_CONTROL     0x02000000
 
1121 #define SOLICITED_CONTROL       0x03000000
 
1122 #define UNSOLICITED_DATA        0x04000000
 
1123 #define DATA_DESCRIPTOR         0x05000000
 
1124 #define UNSOLICITED_COMMAND     0x06000000
 
1125 #define COMMAND_STATUS          0x07000000
 
1126 #define INFO_MASK               0x0F000000
 
1128 //      (Link Control Codes)
 
1130 #define ACK_1                   0x00000000
 
1131 #define ACK_0_OR_N              0x01000000
 
1132 #define P_RJT                   0x02000000 
 
1133 #define F_RJT                   0x03000000 
 
1134 #define P_BSY                   0x04000000
 
1135 #define FABRIC_BUSY_TO_DF       0x05000000      // Fabric Busy to Data Frame
 
1136 #define FABRIC_BUSY_TO_LC       0x06000000      // Fabric Busy to Link Ctl Frame
 
1137 #define LINK_CREDIT_RESET       0x07000000
 
1139 //      (Link Service Command Codes)
 
1141 //#define LS_RJT                        0x01000000      // LS Reject
 
1143 #define LS_ACC                  0x02000000      // LS Accept
 
1144 #define LS_PLOGI                0x03000000      // N_PORT Login
 
1145 #define LS_FLOGI                0x04000000      // F_PORT Login
 
1146 #define LS_LOGO                 0x05000000      // Logout
 
1147 #define LS_ABTX                 0x06000000      // Abort Exchange
 
1148 #define LS_RCS                  0x07000000      // Read Connection Status
 
1149 #define LS_RES                  0x08000000      // Read Exchange Status
 
1150 #define LS_RSS                  0x09000000      // Read Sequence Status
 
1151 #define LS_RSI                  0x0A000000      // Request Seq Initiative
 
1152 #define LS_ESTS                 0x0B000000      // Establish Steaming
 
1153 #define LS_ESTC                 0x0C000000      // Estimate Credit
 
1154 #define LS_ADVC                 0x0D000000      // Advice Credit
 
1155 #define LS_RTV                  0x0E000000      // Read Timeout Value
 
1156 #define LS_RLS                  0x0F000000      // Read Link Status
 
1157 #define LS_ECHO                 0x10000000      // Echo
 
1158 #define LS_TEST                 0x11000000      // Test
 
1159 #define LS_RRQ                  0x12000000      // Reinstate Rec. Qual.
 
1160 #define LS_PRLI                 0x20000000      // Process Login
 
1161 #define LS_PRLO                 0x21000000      // Process Logout
 
1162 #define LS_TPRLO                0x24000000      // 3rd Party Process Logout
 
1163 #define LS_PDISC                0x50000000      // Process Discovery
 
1164 #define LS_FDISC                0x51000000      // Fabric Discovery
 
1165 #define LS_ADISC                0x52000000      // Discover Address
 
1166 #define LS_RNC                  0x53000000      // Report Node Capability
 
1167 #define LS_SCR                  0x62000000      // State Change Registration
 
1168 #define LS_MASK                 0xFF000000      
 
1173 #define BASIC_LINK_SERVICE      0x00000000
 
1174 #define EXT_LINK_SERVICE        0x01000000
 
1176 #define LLC                     0x04000000
 
1177 #define LLC_SNAP                0x05000000
 
1178 #define SCSI_FCP                0x08000000
 
1179 #define SCSI_GPP                0x09000000
 
1180 #define IPI3_MASTER             0x11000000
 
1181 #define IPI3_SLAVE              0x12000000
 
1182 #define IPI3_PEER               0x13000000
 
1183 #define CP_IPI3_MASTER          0x15000000
 
1184 #define CP_IPI3_SLAVE           0x16000000
 
1185 #define CP_IPI3_PEER            0x17000000
 
1186 #define SBCCS_CHANNEL           0x19000000
 
1187 #define SBCCS_CONTROL           0x1A000000
 
1188 #define FIBRE_SERVICES          0x20000000
 
1189 #define FC_FG                   0x21000000
 
1190 #define FC_XS                   0x22000000
 
1191 #define FC_AL                   0x23000000
 
1192 #define SNMP                    0x24000000
 
1193 #define HIPPI_FP                0x40000000
 
1194 #define TYPE_MASK               0xFF000000
 
1199         USHORT reserved;  // 2 bytes reserved
 
1202         USHORT high_seq_cnt;
 
1208         UCHAR reason_explain;
 
1209         UCHAR vendor_unique;
 
1229 #define N_OR_F_PORT             0x1000
 
1230 #define RANDOM_RELATIVE_OFFSET  0x4000
 
1231 #define CONTINUOSLY_INCREASING  0x8000
 
1233 #define CLASS_VALID             0x8000
 
1234 #define INTERMIX_MODE           0x4000
 
1235 #define TRANSPARENT_STACKED     0x2000
 
1236 #define LOCKDOWN_STACKED        0x1000
 
1237 #define SEQ_DELIVERY            0x800
 
1239 #define XID_NOT_SUPPORTED       0x00
 
1240 #define XID_SUPPORTED           0x4000
 
1241 #define XID_REQUIRED            0xC000
 
1243 #define ASSOCIATOR_NOT_SUPPORTED        0x00
 
1244 #define ASSOCIATOR_SUPPORTED    0x1000
 
1245 #define ASSOCIATOR_REQUIRED     0x3000
 
1247 #define INIT_ACK0_SUPPORT       0x800
 
1248 #define INIT_ACKN_SUPPORT       0x400
 
1250 #define RECIP_ACK0_SUPPORT      0x8000
 
1251 #define RECIP_ACKN_SUPPORT      0x4000
 
1253 #define X_ID_INTERLOCK          0x2000
 
1255 #define ERROR_POLICY            0x1800          // Error Policy Supported
 
1256 #define ERROR_DISCARD           0x00            // Only Discard Supported
 
1257 #define ERROR_DISC_PROCESS      0x02            // Discard and process supported
 
1259 #define NODE_ID                 0x01
 
1260 #define IEEE_EXT                0x20
 
1263 // Categories Supported Per Sequence
 
1265 #define CATEGORIES_PER_SEQUENCE 0x300
 
1266 #define ONE_CATEGORY_SEQUENCE   0x00            // 1 Category per Sequence
 
1267 #define TWO_CATEGORY_SEQUENCE   0x01            // 2 Categories per Sequence
 
1268 #define MANY_CATEGORY_SEQUENCE  0x03            // > 2 Categories/Sequence
 
1272         USHORT initiator_control;
 
1273         USHORT service_options;
 
1275         USHORT rx_data_size;
 
1276         USHORT recipient_control;
 
1279         USHORT concurrent_sequences;
 
1282         USHORT open_sequences;
 
1289         // Common Service Parameters
 
1298                 USHORT common_features;
 
1301                 USHORT concurrent_seq;
 
1318         // Class 1, 2 and 3 Service Parameters
 
1320         CLASS_PARAMETERS        class1;
 
1321         CLASS_PARAMETERS        class2;
 
1322         CLASS_PARAMETERS        class3;
 
1327         // Vendor Version Level
 
1330         UCHAR           vendor_version[6];
 
1339   ULONG cmd;  // 4 bytes
 
1340   UCHAR n_port_identifier[3];
 
1347 //      PRLI Request Service Parameter Defines
 
1349 #define PRLI_ACC                        0x01
 
1350 #define PRLI_REQ                        0x02
 
1351 #define ORIG_PROCESS_ASSOC_VALID        0x8000
 
1352 #define RESP_PROCESS_ASSOC_VALID        0x4000
 
1353 #define ESTABLISH_PAIR                  0x2000
 
1354 #define DATA_OVERLAY_ALLOWED            0x40
 
1355 #define INITIATOR_FUNCTION              0x20
 
1356 #define TARGET_FUNCTION                 0x10
 
1357 #define CMD_DATA_MIXED                  0x08
 
1358 #define DATA_RESP_MIXED                 0x04
 
1359 #define READ_XFER_RDY                   0x02
 
1360 #define WRITE_XFER_RDY                  0x01
 
1362 #define RESPONSE_CODE_MASK      0xF00
 
1363 #define REQUEST_EXECUTED        0x100
 
1364 #define NO_RESOURCES            0x200
 
1365 #define INIT_NOT_COMPLETE       0x300
 
1366 #define IMAGE_DOES_NOT_EXIST    0x400
 
1367 #define BAD_PREDEFINED_COND     0x500
 
1368 #define REQ_EXEC_COND           0x600
 
1369 #define NO_MULTI_PAGE           0x700
 
1372         USHORT  payload_length;
 
1379         ULONG   orig_process_associator;
 
1381         ULONG   resp_process_associator;
 
1388         USHORT  payload_length;
 
1393         ULONG   orig_process_associator;
 
1395         ULONG   resp_process_associator;
 
1411 struct ext_sg_entry_t {
 
1412         __u32 len:18;           /* buffer length, bits 0-17 */
 
1413         __u32 uba:13;           /* upper bus address bits 18-31 */
 
1414         __u32 lba;              /* lower bus address bits 0-31 */
 
1418 // J. McCarty's LINK.H
 
1420 //      LS_RJT Reason Codes
 
1423 #define INVALID_COMMAND_CODE    0x01
 
1424 #define LOGICAL_ERROR           0x03
 
1425 #define LOGICAL_BUSY            0x05
 
1426 #define PROTOCOL_ERROR          0x07
 
1427 #define UNABLE_TO_PERFORM       0x09
 
1428 #define COMMAND_NOT_SUPPORTED   0x0B
 
1429 #define LS_VENDOR_UNIQUE        0xFF
 
1432 //      LS_RJT Reason Codes Explanations
 
1434 #define NO_REASON               0x00
 
1435 #define OPTIONS_ERROR           0x01
 
1436 #define INITIATOR_CTL_ERROR     0x03
 
1437 #define RECIPIENT_CTL_ERROR     0x05
 
1438 #define DATA_FIELD_SIZE_ERROR   0x07
 
1439 #define CONCURRENT_SEQ_ERROR    0x09
 
1440 #define CREDIT_ERROR            0x0B
 
1441 #define INVALID_PORT_NAME       0x0D
 
1442 #define INVALID_NODE_NAME       0x0E
 
1443 #define INVALID_CSP             0x0F    // Invalid Service Parameters
 
1444 #define INVALID_ASSOC_HDR       0x11    // Invalid Association Header
 
1445 #define ASSOC_HDR_REQUIRED      0x13    // Association Header Required
 
1446 #define LS_INVALID_S_ID         0x15
 
1447 #define INVALID_OX_RX_ID        0x17    // Invalid OX_ID RX_ID Combination
 
1448 #define CMD_IN_PROCESS          0x19
 
1449 #define INVALID_IDENTIFIER      0x1F    // Invalid N_PORT Identifier
 
1450 #define INVALID_SEQ_ID          0x21
 
1451 #define ABT_INVALID_XCHNG       0x23    // Attempt to Abort an invalid Exchange
 
1452 #define ABT_INACTIVE_XCHNG      0x25    // Attempt to Abort an inactive Exchange
 
1453 #define NEED_REC_QUAL           0x27    // Recovery Qualifier required
 
1454 #define NO_LOGIN_RESOURCES      0x29    // No resources to support login
 
1455 #define NO_DATA                 0x2A    // Unable to supply requested data
 
1456 #define REQUEST_NOT_SUPPORTED   0x2C    // Request Not Supported
 
1459 //      Link Control Codes
 
1463 //      P_BSY Action Codes
 
1465 #define SEQUENCE_TERMINATED     0x01000000
 
1466 #define SEQUENCE_ACTIVE         0x02000000
 
1469 //      P_BSY Reason Codes
 
1471 #define PHYS_NPORT_BUSY         0x010000
 
1472 #define NPORT_RESOURCE_BUSY     0x020000
 
1475 //      P_RJT, F_RJT Action Codes
 
1478 #define RETRYABLE_ERROR         0x01000000
 
1479 #define NON_RETRYABLE_ERROR     0x02000000
 
1482 //      P_RJT, F_RJT Reason Codes
 
1484 #define INVALID_D_ID            0x010000
 
1485 #define INVALID_S_ID            0x020000
 
1486 #define NPORT_NOT_AVAIL_TMP     0x030000
 
1487 #define NPORT_NOT_AVAIL_PERM    0x040000
 
1488 #define CLASS_NOT_SUPPORTED     0x050000
 
1489 #define USAGE_ERROR             0x060000
 
1490 #define TYPE_NOT_SUPPORTED      0x070000
 
1491 #define INVAL_LINK_CONTROL      0x080000
 
1492 #define INVAL_R_CTL             0x090000
 
1493 #define INVAL_F_CTL             0x0A0000
 
1494 #define INVAL_OX_ID             0x0B0000
 
1495 #define INVAL_RX_ID             0x0C0000
 
1496 #define INVAL_SEQ_ID            0x0D0000
 
1497 #define INVAL_DF_CTL            0x0E0000
 
1498 #define INVAL_SEQ_CNT           0x0F0000
 
1499 #define INVAL_PARAMS            0x100000
 
1500 #define EXCHANGE_ERROR          0x110000
 
1501 #define LS_PROTOCOL_ERROR       0x120000
 
1502 #define INCORRECT_LENGTH        0x130000
 
1503 #define UNEXPECTED_ACK          0x140000
 
1504 #define LOGIN_REQ               0x160000
 
1505 #define EXCESSIVE_SEQ           0x170000
 
1506 #define NO_EXCHANGE             0x180000
 
1507 #define SEC_HDR_NOT_SUPPORTED   0x190000
 
1508 #define NO_FABRIC               0x1A0000
 
1509 #define P_VENDOR_UNIQUE         0xFF0000
 
1512 //      BA_RJT Reason Codes
 
1514 #define BA_INVALID_COMMAND      0x00010000
 
1515 #define BA_LOGICAL_ERROR        0x00030000
 
1516 #define BA_LOGICAL_BUSY         0x00050000
 
1517 #define BA_PROTOCOL_ERROR       0x00070000
 
1518 #define BA_UNABLE_TO_PERFORM    0x00090000
 
1521 //      BA_RJT Reason Explanation Codes
 
1523 #define BA_NO_REASON            0x00000000
 
1524 #define BA_INVALID_OX_RX        0x00000300
 
1525 #define BA_SEQUENCE_ABORTED     0x00000500
 
1529 #endif /* CPQFCTSSTRUCTS_H      */