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 */