diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /drivers/scsi/cpqfcTSstructs.h |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'drivers/scsi/cpqfcTSstructs.h')
-rw-r--r-- | drivers/scsi/cpqfcTSstructs.h | 1530 |
1 files changed, 1530 insertions, 0 deletions
diff --git a/drivers/scsi/cpqfcTSstructs.h b/drivers/scsi/cpqfcTSstructs.h new file mode 100644 index 000000000000..0bae3298c44b --- /dev/null +++ b/drivers/scsi/cpqfcTSstructs.h | |||
@@ -0,0 +1,1530 @@ | |||
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 | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License as published by the | ||
11 | * Free Software Foundation; either version 2, or (at your option) any | ||
12 | * later version. | ||
13 | * | ||
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 | ||
19 | */ | ||
20 | #ifndef CPQFCTSSTRUCTS_H | ||
21 | #define CPQFCTSSTRUCTS_H | ||
22 | |||
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" | ||
27 | |||
28 | #define DbgDelay(secs) { int wait_time; printk( " DbgDelay %ds ", secs); \ | ||
29 | for( wait_time=jiffies + (secs*HZ); \ | ||
30 | time_before(jiffies, wait_time) ;) ; } | ||
31 | |||
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 | ||
34 | #define VER_MAJOR 2 | ||
35 | #define VER_MINOR 5 | ||
36 | #define VER_SUBMINOR 4 | ||
37 | |||
38 | // Macros for kernel (esp. SMP) tracing using a PCI analyzer | ||
39 | // (e.g. x86). | ||
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)); | ||
44 | #else | ||
45 | |||
46 | #define PCI_TRACE(x) | ||
47 | #define PCI_TRACEO(x,y) | ||
48 | #endif | ||
49 | |||
50 | |||
51 | //#define DEBUG_CMND 1 // debug output for Linux Scsi CDBs | ||
52 | //#define DUMMYCMND_DBG 1 | ||
53 | |||
54 | //#define DEBUG_CPQFCTS 1 | ||
55 | //#undef DEBUG_CPQFCTS | ||
56 | #ifdef DEBUG_CPQFCTS | ||
57 | #define ENTER(x) printk("cpqfcts : entering %s()\n", x); | ||
58 | #define LEAVE(x) printk("cpqfcts : leaving %s()\n", x); | ||
59 | #define DEBUG(x) x | ||
60 | #else | ||
61 | #define ENTER(x) | ||
62 | #define LEAVE(x) | ||
63 | #define DEBUG(x) | ||
64 | #endif /* DEBUG_CPQFCTS */ | ||
65 | |||
66 | //#define DEBUG_CPQFCTS_PCI 1 | ||
67 | //#undef DEBUG_CPQFCTS_PCI | ||
68 | #if DEBUG_CPQFCTS_PCI | ||
69 | #define DEBUG_PCI(x) x | ||
70 | #else | ||
71 | #define DEBUG_PCI(x) | ||
72 | #endif /* DEBUG_CPQFCTS_PCI */ | ||
73 | |||
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" | ||
78 | |||
79 | // PDA is Peripheral Device Address, VSA is Volume Set Addressing | ||
80 | // Linux SCSI parameters | ||
81 | #define CPQFCTS_MAX_TARGET_ID 64 | ||
82 | |||
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 | ||
87 | |||
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 | ||
90 | |||
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 | ||
94 | #endif | ||
95 | |||
96 | #define DEV_NAME "cpqfcTS" | ||
97 | |||
98 | struct SupportedPCIcards | ||
99 | { | ||
100 | __u16 vendor_id; | ||
101 | __u16 device_id; | ||
102 | }; | ||
103 | |||
104 | // nn:nn denotes bit field | ||
105 | // TachyonHeader struct def. | ||
106 | // the fields shared with ODB | ||
107 | // need to have same value | ||
108 | |||
109 | |||
110 | |||
111 | |||
112 | #ifndef BYTE | ||
113 | //typedef UCHAR BYTE; | ||
114 | typedef __u8 BYTE; | ||
115 | #endif | ||
116 | #ifndef UCHAR | ||
117 | typedef __u8 UCHAR; | ||
118 | #endif | ||
119 | #ifndef LONG | ||
120 | typedef __s32 LONG; | ||
121 | #endif | ||
122 | #ifndef ULONG | ||
123 | typedef __u32 ULONG; | ||
124 | #endif | ||
125 | #ifndef PVOID | ||
126 | typedef void * PVOID; | ||
127 | #endif | ||
128 | #ifndef USHORT | ||
129 | typedef __u16 USHORT; | ||
130 | #endif | ||
131 | #ifndef BOOLEAN | ||
132 | typedef __u8 BOOLEAN; | ||
133 | #endif | ||
134 | |||
135 | |||
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 | ||
141 | |||
142 | #define LS_RJT_REASON( code, expl) (( code<<8) | (expl <<16)) | ||
143 | |||
144 | |||
145 | #define TachLiteSTATUS 0x12 | ||
146 | |||
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 | ||
176 | |||
177 | // Maximum number of Host Bus Adapters (HBA) / controllers supported | ||
178 | // only important for mem allocation dimensions - increase as necessary | ||
179 | |||
180 | #define MAX_ADAPTERS 8 | ||
181 | #define MAX_RX_PAYLOAD 1024 // hardware dependent max frame payload | ||
182 | // Tach header struc defines | ||
183 | #define SOFi3 0x7 | ||
184 | #define SOFf 0x8 | ||
185 | #define SOFn3 0xB | ||
186 | #define EOFn 0x5 | ||
187 | #define EOFt 0x6 | ||
188 | |||
189 | // FCP R_CTL defines | ||
190 | #define FCP_CMND 0x6 | ||
191 | #define FCP_XFER_RDY 0x5 | ||
192 | #define FCP_RSP 0x7 | ||
193 | #define FCP_RESPONSE 0x777 // (arbitrary #) | ||
194 | #define NEED_FCP_RSP 0x77 // (arbitrary #) | ||
195 | #define FCP_DATA 0x1 | ||
196 | |||
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 | ||
203 | #define LIP 0x900 | ||
204 | #define CLEAR_FCPORTS 99 // (arbitrary #) free mem for Logged in ports | ||
205 | #define FMINIT 0x707 // (arbitrary) for Frame Manager Init command | ||
206 | |||
207 | // BLS == Basic Link Service | ||
208 | // ELS == Extended Link Service | ||
209 | #define BLS_NOP 4 | ||
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 | ||
230 | |||
231 | #define ELS_LILP_FRAME 0x00000711 // 1st payload word of LILP frame | ||
232 | |||
233 | #define SFQ_UNASSISTED_FCP 1 // ICM, DWord3, "Type" unassisted FCP | ||
234 | #define SFQ_UNKNOWN 0x31 // (arbitrary) ICM, DWord3, "Type" unknown | ||
235 | |||
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 | ||
239 | |||
240 | //#define VOLUME_SET_ADDRESSING 1 // "channel" or "bus" 1 | ||
241 | |||
242 | typedef struct // 32 bytes hdr ONLY (e.g. FCP_DATA buffer for SEST) | ||
243 | { | ||
244 | ULONG reserved; // dword 0 (don't use) | ||
245 | ULONG sof_eof; | ||
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 | ||
252 | } TachFCHDR; | ||
253 | |||
254 | // NOTE!! the following struct MUST be 64 bytes. | ||
255 | typedef struct // 32 bytes hdr + 32 bytes payload | ||
256 | { | ||
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 | ||
265 | //--------- | ||
266 | __u32 pl[8]; // dwords 8-15 frame data payload | ||
267 | } TachFCHDR_CMND; | ||
268 | |||
269 | |||
270 | typedef struct // 32 bytes hdr + 120 bytes payload | ||
271 | { | ||
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 | ||
280 | //--------- | ||
281 | __u32 pl[30]; // largest necessary payload (for LOGIN cmnds) | ||
282 | } TachFCHDR_GCMND; | ||
283 | |||
284 | typedef struct // 32 bytes hdr + 64 bytes payload | ||
285 | { | ||
286 | ULONG reserved; // dword 0 (don't use) | ||
287 | ULONG sof_eof; | ||
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 | ||
294 | //--------- | ||
295 | __u32 pl[18]; // payload for FCP-RSP (response buffer) RA-4x00 is 72bytes | ||
296 | } TachFCHDR_RSP; | ||
297 | |||
298 | |||
299 | |||
300 | |||
301 | |||
302 | |||
303 | // Inbound Message Queue structures... | ||
304 | typedef struct // each entry 8 words (32 bytes) | ||
305 | { | ||
306 | ULONG type; // IMQ completion message types | ||
307 | ULONG word[7]; // remainder of structure | ||
308 | // interpreted by IMQ type | ||
309 | } TachyonIMQE; | ||
310 | |||
311 | |||
312 | // Queues for TachLite not in original Tachyon | ||
313 | // ERQ - Exchange Request Queue (for outbound commands) | ||
314 | // SFQ - Single Frame Queue (for incoming frames) | ||
315 | |||
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 | ||
322 | |||
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 | ||
326 | |||
327 | #define ERQ_LEN 128 // power of 2, max 4096 | ||
328 | |||
329 | // Inbound Message Queue structures... | ||
330 | #define IMQ_LEN 512 // minimum 4 entries [(power of 2) - 1] | ||
331 | typedef struct // 8 words - 32 bytes | ||
332 | { | ||
333 | TachyonIMQE QEntry[IMQ_LEN]; | ||
334 | ULONG producerIndex; // IMQ Producer Index register | ||
335 | // @32 byte align | ||
336 | ULONG consumerIndex; // Consumer Index register (in Tachyon) | ||
337 | ULONG length; // Length register | ||
338 | ULONG base; | ||
339 | } TachyonIMQ; // @ 32 * IMQ_LEN align | ||
340 | |||
341 | |||
342 | |||
343 | typedef struct // inbound completion message | ||
344 | { | ||
345 | ULONG Type; | ||
346 | ULONG Index; | ||
347 | ULONG TransferLength; | ||
348 | } TachyonInbCM; | ||
349 | |||
350 | |||
351 | |||
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 | ||
359 | |||
360 | // for INCOMING frames | ||
361 | #define SFQ_LEN 32 // minimum 32 entries, max 4096 | ||
362 | |||
363 | typedef struct // Single Frame Que | ||
364 | { | ||
365 | TachFCHDR_CMND QEntry[SFQ_LEN]; // must be 64 bytes!! | ||
366 | ULONG producerIndex; // IMQ Producer Index register | ||
367 | // @32 byte align | ||
368 | ULONG consumerIndex; // Consumer Index register (in Tachyon) | ||
369 | ULONG length; // Length register | ||
370 | ULONG base; | ||
371 | } TachLiteSFQ; | ||
372 | |||
373 | |||
374 | typedef struct // I/O Request Block flags | ||
375 | { | ||
376 | UCHAR BRD : 1; | ||
377 | UCHAR : 1; // reserved | ||
378 | UCHAR SFA : 1; | ||
379 | UCHAR DNC : 1; | ||
380 | UCHAR DIN : 1; | ||
381 | UCHAR DCM : 1; | ||
382 | UCHAR CTS : 1; | ||
383 | UCHAR SBV : 1; // IRB entry valid - IRB'B' only | ||
384 | } IRBflags; | ||
385 | |||
386 | typedef struct // I/O Request Block | ||
387 | { // Request 'A' | ||
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 | ||
392 | // Request 'B' | ||
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 | ||
397 | } TachLiteIRB; | ||
398 | |||
399 | |||
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 | ||
405 | // ERQ_LEN | ||
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) | ||
412 | } TachLiteERQ; | ||
413 | |||
414 | // for now, just 32 bit DMA, eventually 40something, with code changes | ||
415 | #define CPQFCTS_DMA_MASK ((unsigned long) (0x00000000FFFFFFFF)) | ||
416 | |||
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(). | ||
422 | |||
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.) | ||
430 | |||
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 | ||
434 | |||
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) | ||
437 | |||
438 | |||
439 | |||
440 | // SEST entry types: IWE, IRE, TWE, TRE | ||
441 | typedef struct | ||
442 | { | ||
443 | ULONG Hdr_Len; | ||
444 | ULONG Hdr_Addr; | ||
445 | ULONG RSP_Len; | ||
446 | ULONG RSP_Addr; | ||
447 | ULONG Buff_Off; | ||
448 | #define USES_EXTENDED_SGLIST(this_sest, x_ID) \ | ||
449 | (!((this_sest)->u[ x_ID ].IWE.Buff_Off & 0x80000000)) | ||
450 | ULONG Link; | ||
451 | ULONG RX_ID; | ||
452 | ULONG Data_Len; | ||
453 | ULONG Exp_RO; | ||
454 | ULONG Exp_Byte_Cnt; | ||
455 | // --- extended/local Gather Len/Address pairs | ||
456 | ULONG GLen1; | ||
457 | ULONG GAddr1; | ||
458 | ULONG GLen2; | ||
459 | ULONG GAddr2; | ||
460 | ULONG GLen3; | ||
461 | ULONG GAddr3; | ||
462 | } TachLiteIWE; | ||
463 | |||
464 | |||
465 | typedef struct | ||
466 | { | ||
467 | ULONG Seq_Accum; | ||
468 | ULONG reserved; // must clear to 0 | ||
469 | ULONG RSP_Len; | ||
470 | ULONG RSP_Addr; | ||
471 | ULONG Buff_Off; | ||
472 | ULONG Buff_Index; // ULONG 5 | ||
473 | ULONG Exp_RO; | ||
474 | ULONG Byte_Count; | ||
475 | ULONG reserved_; // ULONG 8 | ||
476 | ULONG Exp_Byte_Cnt; | ||
477 | // --- extended/local Scatter Len/Address pairs | ||
478 | ULONG SLen1; | ||
479 | ULONG SAddr1; | ||
480 | ULONG SLen2; | ||
481 | ULONG SAddr2; | ||
482 | ULONG SLen3; | ||
483 | ULONG SAddr3; | ||
484 | } TachLiteIRE; | ||
485 | |||
486 | |||
487 | typedef struct // Target Write Entry | ||
488 | { | ||
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 | ||
493 | ULONG Buff_Off; | ||
494 | ULONG Buff_Index; // ULONG 5 | ||
495 | ULONG Exp_RO; | ||
496 | ULONG Byte_Count; | ||
497 | ULONG reserved_; // ULONG 8 | ||
498 | ULONG Exp_Byte_Cnt; | ||
499 | // --- extended/local Scatter Len/Address pairs | ||
500 | ULONG SLen1; | ||
501 | ULONG SAddr1; | ||
502 | ULONG SLen2; | ||
503 | ULONG SAddr2; | ||
504 | ULONG SLen3; | ||
505 | ULONG SAddr3; | ||
506 | } TachLiteTWE; | ||
507 | |||
508 | typedef struct | ||
509 | { | ||
510 | ULONG Hdr_Len; | ||
511 | ULONG Hdr_Addr; | ||
512 | ULONG RSP_Len; // DWord 2 | ||
513 | ULONG RSP_Addr; | ||
514 | ULONG Buff_Off; | ||
515 | ULONG Buff_Index; // DWord 5 | ||
516 | ULONG reserved; | ||
517 | ULONG Data_Len; | ||
518 | ULONG reserved_; | ||
519 | ULONG reserved__; | ||
520 | // --- extended/local Gather Len/Address pairs | ||
521 | ULONG GLen1; // DWord A | ||
522 | ULONG GAddr1; | ||
523 | ULONG GLen2; | ||
524 | ULONG GAddr2; | ||
525 | ULONG GLen3; | ||
526 | ULONG GAddr3; | ||
527 | } TachLiteTRE; | ||
528 | |||
529 | typedef struct ext_sg_page_ptr_t *PSGPAGES; | ||
530 | typedef struct ext_sg_page_ptr_t | ||
531 | { | ||
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. | ||
535 | PSGPAGES next; | ||
536 | } SGPAGES; // linked list of S/G pairs, by Exchange | ||
537 | |||
538 | typedef struct // SCSI Exchange State Table | ||
539 | { | ||
540 | union // Entry can be IWE, IRE, TWE, TRE | ||
541 | { // 64 bytes per entry | ||
542 | TachLiteIWE IWE; | ||
543 | TachLiteIRE IRE; | ||
544 | TachLiteTWE TWE; | ||
545 | TachLiteTRE TRE; | ||
546 | } u[TACH_SEST_LEN]; | ||
547 | |||
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 | ||
553 | } TachSEST; | ||
554 | |||
555 | |||
556 | |||
557 | typedef struct // each register has it's own address | ||
558 | // and value (used for write-only regs) | ||
559 | { | ||
560 | void* address; | ||
561 | volatile ULONG value; | ||
562 | } FCREGISTER; | ||
563 | |||
564 | typedef struct // Host copy - TachLite Registers | ||
565 | { | ||
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 | ||
570 | ULONG wwn_lo; | ||
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) | ||
576 | |||
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; | ||
584 | FCREGISTER TYstatus; | ||
585 | FCREGISTER FMconfig; // Frame Manager (FC loop level) | ||
586 | FCREGISTER FMcontrol; | ||
587 | FCREGISTER FMstatus; | ||
588 | FCREGISTER FMLinkStatus1; | ||
589 | FCREGISTER FMLinkStatus2; | ||
590 | FCREGISTER FMBB_CreditZero; | ||
591 | FCREGISTER status; | ||
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(), ... | ||
595 | } TL_REGISTERS; | ||
596 | |||
597 | |||
598 | |||
599 | typedef struct | ||
600 | { | ||
601 | ULONG ok; | ||
602 | ULONG invalidArgs; | ||
603 | ULONG linkDown; | ||
604 | ULONG linkUp; | ||
605 | ULONG outQueFull; | ||
606 | ULONG SESTFull; | ||
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 | ||
612 | ULONG retries; | ||
613 | ULONG linkFailTX; | ||
614 | ULONG linkFailRX; | ||
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 | ||
630 | } FCSTATS; | ||
631 | |||
632 | |||
633 | typedef struct // Config Options | ||
634 | { // LS Bit first | ||
635 | USHORT : 1; // bit0: | ||
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 | ||
643 | USHORT : 1; // bit8: | ||
644 | USHORT : 1; // bit9: | ||
645 | USHORT : 1; // bit10: | ||
646 | USHORT : 1; // bit11: | ||
647 | USHORT : 1; // bit12: | ||
648 | USHORT : 1; // bit13: | ||
649 | USHORT : 1; // bit14: | ||
650 | USHORT : 1; // bit15: | ||
651 | } FC_OPTIONS; | ||
652 | |||
653 | |||
654 | |||
655 | typedef struct dyn_mem_pair | ||
656 | { | ||
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; | ||
660 | size_t size; | ||
661 | } ALIGNED_MEM; | ||
662 | |||
663 | |||
664 | |||
665 | |||
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.) | ||
668 | |||
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. | ||
673 | |||
674 | #define IMPLICIT_LOGOUT 1 | ||
675 | #define EXPLICIT_LOGOUT 2 | ||
676 | |||
677 | typedef struct | ||
678 | { | ||
679 | UCHAR channel; // SCSI "bus" | ||
680 | UCHAR target; | ||
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]; | ||
685 | } SCSI_NEXUS; | ||
686 | |||
687 | |||
688 | typedef struct | ||
689 | { | ||
690 | union | ||
691 | { | ||
692 | UCHAR ucWWN[8]; // a FC 64-bit World Wide Name/ PortID of target | ||
693 | // addressing of single target on single loop... | ||
694 | u64 liWWN; | ||
695 | } u; | ||
696 | |||
697 | ULONG port_id; // a FC 24-bit address of port (lower 8 bits = al_pa) | ||
698 | |||
699 | #define REPORT_LUNS_PL 256 | ||
700 | UCHAR ReportLunsPayload[REPORT_LUNS_PL]; | ||
701 | |||
702 | SCSI_NEXUS ScsiNexus; // LUNs per FC device | ||
703 | |||
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 | ||
707 | |||
708 | ULONG concurrent_seq; // must be 1 or greater | ||
709 | ULONG rx_data_size; // e.g. 128, 256, 1024, 2048 per FC-PH spec | ||
710 | ULONG BB_credit; | ||
711 | ULONG EE_credit; | ||
712 | |||
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) | ||
723 | UCHAR highest_ver; | ||
724 | UCHAR lowest_ver; | ||
725 | |||
726 | |||
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 | ||
731 | |||
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 | ||
736 | |||
737 | } FC_LOGGEDIN_PORT, *PFC_LOGGEDIN_PORT; | ||
738 | |||
739 | |||
740 | |||
741 | // This serves as the ESB (Exchange Status Block), | ||
742 | // and has timeout counter; used for ABORTs | ||
743 | typedef struct | ||
744 | { // FC-1 X_IDs | ||
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; | ||
754 | |||
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!) | ||
761 | |||
762 | typedef struct // we will allocate this dynamically | ||
763 | { | ||
764 | FC_EXCHANGE fcExchange[ TACH_MAX_XID ]; | ||
765 | } FC_EXCHANGES; | ||
766 | |||
767 | |||
768 | |||
769 | |||
770 | |||
771 | |||
772 | |||
773 | |||
774 | |||
775 | |||
776 | |||
777 | typedef struct | ||
778 | { | ||
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 | ||
783 | |||
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 | ||
790 | |||
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 | ||
796 | |||
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 | ||
802 | |||
803 | dma_addr_t exch_dma_handle; | ||
804 | |||
805 | // these function pointers are for "generic" functions, which are | ||
806 | // replaced with Host Bus Adapter types at | ||
807 | // runtime. | ||
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); | ||
819 | |||
820 | } TACHYON, *PTACHYON; | ||
821 | |||
822 | |||
823 | void cpqfcTSClearLinkStatusCounters(TACHYON * fcChip); | ||
824 | |||
825 | int CpqTsCreateTachLiteQues( void* pHBA, int opcode); | ||
826 | int CpqTsDestroyTachLiteQues( void* , int); | ||
827 | int CpqTsInitializeTachLite( void *pHBA, int opcode1, int opcode2); | ||
828 | |||
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); | ||
837 | |||
838 | void cpqfcTS_WorkTask( struct Scsi_Host *HostAdapter); | ||
839 | void cpqfcTSWorkerThread( void *host); | ||
840 | |||
841 | int cpqfcTS_GetNVRAM_data( UCHAR *wwnbuf, UCHAR *buf ); | ||
842 | ULONG cpqfcTS_ReadNVRAM( void* GPIOin, void* GPIOout , USHORT count, | ||
843 | UCHAR *buf ); | ||
844 | |||
845 | BOOLEAN tl_write_i2c_nvram( void* GPIOin, void* GPIOout, | ||
846 | USHORT startOffset, // e.g. 0x2f for WWN start | ||
847 | USHORT count, | ||
848 | UCHAR *buf ); | ||
849 | |||
850 | |||
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); | ||
857 | |||
858 | void BigEndianSwap( UCHAR *source, UCHAR *dest, USHORT cnt); | ||
859 | |||
860 | //ULONG virt_to_phys( PVOID virtaddr ); | ||
861 | |||
862 | |||
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 ); | ||
866 | |||
867 | |||
868 | |||
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) | ||
873 | typedef struct | ||
874 | { | ||
875 | ULONG Type; // e.g. LINKUP, SFQENTRY, PDISC, BLS_ABTS, ... | ||
876 | ULONG ulBuff[ LINKQ_ITEM_SIZE ]; | ||
877 | } LINKQ_ITEM; | ||
878 | |||
879 | #define FC_LINKQ_DEPTH TACH_MAX_XID | ||
880 | typedef struct | ||
881 | { | ||
882 | ULONG producer; | ||
883 | ULONG consumer; // when producer equals consumer, Q empty | ||
884 | |||
885 | LINKQ_ITEM Qitem[ FC_LINKQ_DEPTH ]; | ||
886 | |||
887 | } FC_LINK_QUE, *PFC_LINK_QUE; | ||
888 | |||
889 | |||
890 | // DPC routines post to here on Inbound SCSI frames | ||
891 | // User thread processes | ||
892 | #define FC_SCSIQ_DEPTH 32 | ||
893 | |||
894 | typedef struct | ||
895 | { | ||
896 | int Type; // e.g. SCSI | ||
897 | ULONG ulBuff[ 3*16 ]; | ||
898 | } SCSIQ_ITEM; | ||
899 | |||
900 | typedef struct | ||
901 | { | ||
902 | ULONG producer; | ||
903 | ULONG consumer; // when producer equals consumer, Q empty | ||
904 | |||
905 | SCSIQ_ITEM Qitem[ FC_SCSIQ_DEPTH ]; | ||
906 | |||
907 | } FC_SCSI_QUE, *PFC_SCSI_QUE; | ||
908 | |||
909 | typedef struct { | ||
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. */ | ||
915 | ushort bus; | ||
916 | ushort pdrive; | ||
917 | } cpqfc_passthru_private_t; | ||
918 | |||
919 | #define CPQFC_MAX_PASSTHRU_CMDS 100 | ||
920 | |||
921 | #define DYNAMIC_ALLOCATIONS 4 // Tachyon aligned allocations: ERQ,IMQ,SFQ,SEST | ||
922 | |||
923 | // Linux space allocated per HBA (chip state, etc.) | ||
924 | typedef struct | ||
925 | { | ||
926 | struct Scsi_Host *HostAdapter; // back pointer to Linux Scsi struct | ||
927 | |||
928 | TACHYON fcChip; // All Tachyon registers, Queues, functions | ||
929 | ALIGNED_MEM dynamic_mem[DYNAMIC_ALLOCATIONS]; | ||
930 | |||
931 | struct pci_dev *PciDev; | ||
932 | dma_addr_t fcLQ_dma_handle; | ||
933 | |||
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 | ||
937 | |||
938 | Scsi_Cmnd *BadTargetCmnd[CPQFCTS_MAX_TARGET_ID]; // missing targets | ||
939 | |||
940 | u_char HBAnum; // 0-based host number | ||
941 | |||
942 | |||
943 | struct timer_list cpqfcTStimer; // FC utility timer for implicit | ||
944 | // logouts, FC protocol timeouts, etc. | ||
945 | int fcStatsTime; // Statistics delta reporting time | ||
946 | |||
947 | struct task_struct *worker_thread; // our kernel thread | ||
948 | int PortDiscDone; // set by SendLogins(), cleared by LDn | ||
949 | |||
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; | ||
955 | |||
956 | PFC_LINK_QUE fcLQ; // the WorkerThread operates on this | ||
957 | |||
958 | spinlock_t hba_spinlock; // held/released by WorkerThread | ||
959 | cpqfc_passthru_private_t *private_data_pool; | ||
960 | unsigned long *private_data_bits; | ||
961 | |||
962 | } CPQFCHBA; | ||
963 | |||
964 | #define CPQ_SPINLOCK_HBA( x ) spin_lock(&x->hba_spinlock); | ||
965 | #define CPQ_SPINUNLOCK_HBA(x) spin_unlock(&x->hba_spinlock); | ||
966 | |||
967 | |||
968 | |||
969 | void cpqfcTSImplicitLogout( CPQFCHBA* cpqfcHBAdata, | ||
970 | PFC_LOGGEDIN_PORT pFcPort); | ||
971 | |||
972 | |||
973 | void cpqfcTSTerminateExchange( CPQFCHBA*, SCSI_NEXUS *target, int ); | ||
974 | |||
975 | PFC_LOGGEDIN_PORT fcPortLoggedIn( | ||
976 | CPQFCHBA *cpqfcHBAdata, | ||
977 | TachFCHDR_GCMND* fchs, | ||
978 | BOOLEAN, | ||
979 | BOOLEAN); | ||
980 | void fcProcessLoggedIn( | ||
981 | CPQFCHBA *cpqfcHBAdata, TachFCHDR_GCMND* fchs); | ||
982 | |||
983 | |||
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 | ||
990 | |||
991 | ULONG cpqfcTSStartExchange( | ||
992 | CPQFCHBA *cpqfcHBAdata, | ||
993 | LONG ExchangeID ); | ||
994 | |||
995 | void cpqfcTSCompleteExchange( | ||
996 | struct pci_dev *pcidev, | ||
997 | PTACHYON fcChip, | ||
998 | ULONG exchange_ID); | ||
999 | |||
1000 | |||
1001 | PFC_LOGGEDIN_PORT fcFindLoggedInPort( | ||
1002 | PTACHYON fcChip, | ||
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 | ||
1007 | ); | ||
1008 | |||
1009 | void cpqfcTSPutLinkQue( | ||
1010 | CPQFCHBA *cpqfcHBAdata, | ||
1011 | int Type, | ||
1012 | void *QueContent); | ||
1013 | |||
1014 | void fcPutScsiQue( | ||
1015 | CPQFCHBA *cpqfcHBAdata, | ||
1016 | int Type, | ||
1017 | void *QueContent); | ||
1018 | |||
1019 | void fcLinkQReset( | ||
1020 | CPQFCHBA *); | ||
1021 | void fcScsiQReset( | ||
1022 | CPQFCHBA *); | ||
1023 | void fcSestReset( | ||
1024 | CPQFCHBA *); | ||
1025 | |||
1026 | void cpqfc_pci_unmap(struct pci_dev *pcidev, | ||
1027 | Scsi_Cmnd *cmd, | ||
1028 | PTACHYON fcChip, | ||
1029 | ULONG x_ID); | ||
1030 | |||
1031 | extern const UCHAR valid_al_pa[]; | ||
1032 | extern const int number_of_al_pa; | ||
1033 | |||
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 | ||
1038 | |||
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 | ||
1045 | |||
1046 | // FCP-SCSI response status struct | ||
1047 | typedef struct // see "TachFCHDR_RSP" definition - 64 bytes | ||
1048 | { | ||
1049 | __u32 reserved; | ||
1050 | __u32 reserved1; | ||
1051 | __u32 fcp_status; // field validity and SCSI status | ||
1052 | __u32 fcp_resid; | ||
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) | ||
1058 | |||
1059 | } FCP_STATUS_RESPONSE, *PFCP_STATUS_RESPONSE; | ||
1060 | |||
1061 | |||
1062 | // Fabric State Change Registration | ||
1063 | typedef struct scrpl | ||
1064 | { | ||
1065 | __u32 command; | ||
1066 | __u32 function; | ||
1067 | } SCR_PL; | ||
1068 | |||
1069 | // Fabric Name Service Request | ||
1070 | typedef struct nsrpl | ||
1071 | { | ||
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) | ||
1077 | |||
1078 | } NSR_PL; | ||
1079 | |||
1080 | |||
1081 | |||
1082 | // "FC.H" | ||
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 | ||
1087 | |||
1088 | #define CLASS_1 0x01 | ||
1089 | #define CLASS_2 0x02 | ||
1090 | #define CLASS_3 0x03 | ||
1091 | |||
1092 | #define FC_PH42 0x08 | ||
1093 | #define FC_PH43 0x09 | ||
1094 | #define FC_PH3 0x20 | ||
1095 | |||
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 | ||
1099 | // Completion. | ||
1100 | #define R_A_TOV 0 // Minimum Time for Target to wait | ||
1101 | // before reclaiming resources. | ||
1102 | // | ||
1103 | // R_CTL Field | ||
1104 | // | ||
1105 | // Routing Bits (31-28) | ||
1106 | // | ||
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 | ||
1114 | |||
1115 | // | ||
1116 | // Information Bits (27-24) | ||
1117 | // | ||
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 | ||
1127 | // | ||
1128 | // (Link Control Codes) | ||
1129 | // | ||
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 | ||
1138 | // | ||
1139 | // (Link Service Command Codes) | ||
1140 | // | ||
1141 | //#define LS_RJT 0x01000000 // LS Reject | ||
1142 | |||
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 | ||
1169 | |||
1170 | // | ||
1171 | // TYPE Bit Masks | ||
1172 | // | ||
1173 | #define BASIC_LINK_SERVICE 0x00000000 | ||
1174 | #define EXT_LINK_SERVICE 0x01000000 | ||
1175 | |||
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 | ||
1195 | |||
1196 | typedef struct { | ||
1197 | UCHAR seq_id_valid; | ||
1198 | UCHAR seq_id; | ||
1199 | USHORT reserved; // 2 bytes reserved | ||
1200 | ULONG ox_rx_id; | ||
1201 | USHORT low_seq_cnt; | ||
1202 | USHORT high_seq_cnt; | ||
1203 | } BA_ACC_PAYLOAD; | ||
1204 | |||
1205 | typedef struct { | ||
1206 | UCHAR reserved; | ||
1207 | UCHAR reason_code; | ||
1208 | UCHAR reason_explain; | ||
1209 | UCHAR vendor_unique; | ||
1210 | } BA_RJT_PAYLOAD; | ||
1211 | |||
1212 | |||
1213 | typedef struct { | ||
1214 | ULONG command_code; | ||
1215 | ULONG sid; | ||
1216 | USHORT ox_id; | ||
1217 | USHORT rx_id; | ||
1218 | } RRQ_MESSAGE; | ||
1219 | |||
1220 | typedef struct { | ||
1221 | ULONG command_code; | ||
1222 | UCHAR vendor; | ||
1223 | UCHAR explain; | ||
1224 | UCHAR reason; | ||
1225 | UCHAR reserved; | ||
1226 | } REJECT_MESSAGE; | ||
1227 | |||
1228 | |||
1229 | #define N_OR_F_PORT 0x1000 | ||
1230 | #define RANDOM_RELATIVE_OFFSET 0x4000 | ||
1231 | #define CONTINUOSLY_INCREASING 0x8000 | ||
1232 | |||
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 | ||
1238 | |||
1239 | #define XID_NOT_SUPPORTED 0x00 | ||
1240 | #define XID_SUPPORTED 0x4000 | ||
1241 | #define XID_REQUIRED 0xC000 | ||
1242 | |||
1243 | #define ASSOCIATOR_NOT_SUPPORTED 0x00 | ||
1244 | #define ASSOCIATOR_SUPPORTED 0x1000 | ||
1245 | #define ASSOCIATOR_REQUIRED 0x3000 | ||
1246 | |||
1247 | #define INIT_ACK0_SUPPORT 0x800 | ||
1248 | #define INIT_ACKN_SUPPORT 0x400 | ||
1249 | |||
1250 | #define RECIP_ACK0_SUPPORT 0x8000 | ||
1251 | #define RECIP_ACKN_SUPPORT 0x4000 | ||
1252 | |||
1253 | #define X_ID_INTERLOCK 0x2000 | ||
1254 | |||
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 | ||
1258 | |||
1259 | #define NODE_ID 0x01 | ||
1260 | #define IEEE_EXT 0x20 | ||
1261 | |||
1262 | // | ||
1263 | // Categories Supported Per Sequence | ||
1264 | // | ||
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 | ||
1269 | |||
1270 | typedef struct { | ||
1271 | |||
1272 | USHORT initiator_control; | ||
1273 | USHORT service_options; | ||
1274 | |||
1275 | USHORT rx_data_size; | ||
1276 | USHORT recipient_control; | ||
1277 | |||
1278 | USHORT ee_credit; | ||
1279 | USHORT concurrent_sequences; | ||
1280 | |||
1281 | USHORT reserved; | ||
1282 | USHORT open_sequences; | ||
1283 | |||
1284 | } CLASS_PARAMETERS; | ||
1285 | |||
1286 | typedef struct { | ||
1287 | ULONG login_cmd; | ||
1288 | // | ||
1289 | // Common Service Parameters | ||
1290 | // | ||
1291 | struct { | ||
1292 | |||
1293 | USHORT bb_credit; | ||
1294 | UCHAR lowest_ver; | ||
1295 | UCHAR highest_ver; | ||
1296 | |||
1297 | USHORT bb_rx_size; | ||
1298 | USHORT common_features; | ||
1299 | |||
1300 | USHORT rel_offset; | ||
1301 | USHORT concurrent_seq; | ||
1302 | |||
1303 | |||
1304 | ULONG e_d_tov; | ||
1305 | } cmn_services; | ||
1306 | |||
1307 | // | ||
1308 | // Port Name | ||
1309 | // | ||
1310 | UCHAR port_name[8]; | ||
1311 | |||
1312 | // | ||
1313 | // Node/Fabric Name | ||
1314 | // | ||
1315 | UCHAR node_name[8]; | ||
1316 | |||
1317 | // | ||
1318 | // Class 1, 2 and 3 Service Parameters | ||
1319 | // | ||
1320 | CLASS_PARAMETERS class1; | ||
1321 | CLASS_PARAMETERS class2; | ||
1322 | CLASS_PARAMETERS class3; | ||
1323 | |||
1324 | ULONG reserved[4]; | ||
1325 | |||
1326 | // | ||
1327 | // Vendor Version Level | ||
1328 | // | ||
1329 | UCHAR vendor_id[2]; | ||
1330 | UCHAR vendor_version[6]; | ||
1331 | ULONG buffer_size; | ||
1332 | USHORT rxid_start; | ||
1333 | USHORT total_rxids; | ||
1334 | } LOGIN_PAYLOAD; | ||
1335 | |||
1336 | |||
1337 | typedef struct | ||
1338 | { | ||
1339 | ULONG cmd; // 4 bytes | ||
1340 | UCHAR n_port_identifier[3]; | ||
1341 | UCHAR reserved; | ||
1342 | UCHAR port_name[8]; | ||
1343 | } LOGOUT_PAYLOAD; | ||
1344 | |||
1345 | |||
1346 | // | ||
1347 | // PRLI Request Service Parameter Defines | ||
1348 | // | ||
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 | ||
1361 | |||
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 | ||
1370 | |||
1371 | typedef struct { | ||
1372 | USHORT payload_length; | ||
1373 | UCHAR page_length; | ||
1374 | UCHAR cmd; | ||
1375 | |||
1376 | |||
1377 | ULONG valid; | ||
1378 | |||
1379 | ULONG orig_process_associator; | ||
1380 | |||
1381 | ULONG resp_process_associator; | ||
1382 | |||
1383 | ULONG fcp_info; | ||
1384 | } PRLI_REQUEST; | ||
1385 | |||
1386 | typedef struct { | ||
1387 | |||
1388 | USHORT payload_length; | ||
1389 | UCHAR page_length; | ||
1390 | UCHAR cmd; | ||
1391 | |||
1392 | ULONG valid; | ||
1393 | ULONG orig_process_associator; | ||
1394 | |||
1395 | ULONG resp_process_associator; | ||
1396 | ULONG reserved; | ||
1397 | } PRLO_REQUEST; | ||
1398 | |||
1399 | typedef struct { | ||
1400 | ULONG cmd; | ||
1401 | |||
1402 | ULONG hard_address; | ||
1403 | |||
1404 | UCHAR port_name[8]; | ||
1405 | |||
1406 | UCHAR node_name[8]; | ||
1407 | |||
1408 | ULONG s_id; | ||
1409 | } ADISC_PAYLOAD; | ||
1410 | |||
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 */ | ||
1415 | }; | ||
1416 | |||
1417 | |||
1418 | // J. McCarty's LINK.H | ||
1419 | // | ||
1420 | // LS_RJT Reason Codes | ||
1421 | // | ||
1422 | |||
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 | ||
1430 | |||
1431 | // | ||
1432 | // LS_RJT Reason Codes Explanations | ||
1433 | // | ||
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 | ||
1457 | |||
1458 | // | ||
1459 | // Link Control Codes | ||
1460 | // | ||
1461 | |||
1462 | // | ||
1463 | // P_BSY Action Codes | ||
1464 | // | ||
1465 | #define SEQUENCE_TERMINATED 0x01000000 | ||
1466 | #define SEQUENCE_ACTIVE 0x02000000 | ||
1467 | |||
1468 | // | ||
1469 | // P_BSY Reason Codes | ||
1470 | // | ||
1471 | #define PHYS_NPORT_BUSY 0x010000 | ||
1472 | #define NPORT_RESOURCE_BUSY 0x020000 | ||
1473 | |||
1474 | // | ||
1475 | // P_RJT, F_RJT Action Codes | ||
1476 | // | ||
1477 | |||
1478 | #define RETRYABLE_ERROR 0x01000000 | ||
1479 | #define NON_RETRYABLE_ERROR 0x02000000 | ||
1480 | |||
1481 | // | ||
1482 | // P_RJT, F_RJT Reason Codes | ||
1483 | // | ||
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 | ||
1510 | |||
1511 | // | ||
1512 | // BA_RJT Reason Codes | ||
1513 | // | ||
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 | ||
1519 | |||
1520 | // | ||
1521 | // BA_RJT Reason Explanation Codes | ||
1522 | // | ||
1523 | #define BA_NO_REASON 0x00000000 | ||
1524 | #define BA_INVALID_OX_RX 0x00000300 | ||
1525 | #define BA_SEQUENCE_ABORTED 0x00000500 | ||
1526 | |||
1527 | |||
1528 | |||
1529 | #endif /* CPQFCTSSTRUCTS_H */ | ||
1530 | |||