1 |
1275 |
phoenix |
/* 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 |
|
|
|
21 |
|
|
#ifndef CPQFCTSSTRUCTS_H
|
22 |
|
|
#define CPQFCTSSTRUCTS_H
|
23 |
|
|
|
24 |
|
|
#include <linux/timer.h> // timer declaration in our host data
|
25 |
|
|
#include <linux/tqueue.h> // task queue sched
|
26 |
|
|
#include <asm/atomic.h>
|
27 |
|
|
#include "cpqfcTSioctl.h"
|
28 |
|
|
|
29 |
|
|
/* FIXME - this is crap */
|
30 |
|
|
#define DbgDelay(secs) { int wait_time; printk( " DbgDelay %ds ", secs); \
|
31 |
|
|
for( wait_time=jiffies + (secs*HZ); \
|
32 |
|
|
time_before(jiffies, wait_time) ;) ; }
|
33 |
|
|
|
34 |
|
|
#define CPQFCTS_DRIVER_VER(maj,min,submin) ((maj<<16)|(min<<8)|(submin))
|
35 |
|
|
/* don't forget to also change MODULE_DESCRIPTION in cpqfcTSinit.c */
|
36 |
|
|
#define VER_MAJOR 2
|
37 |
|
|
#define VER_MINOR 1
|
38 |
|
|
#define VER_SUBMINOR 2
|
39 |
|
|
|
40 |
|
|
/*
|
41 |
|
|
* Macros for kernel (esp. SMP) tracing using a PCI analyzer
|
42 |
|
|
* (e.g. x86).
|
43 |
|
|
*/
|
44 |
|
|
|
45 |
|
|
//#define PCI_KERNEL_TRACE
|
46 |
|
|
#ifdef PCI_KERNEL_TRACE
|
47 |
|
|
#define PCI_TRACE(x) inl( fcChip->Registers.IOBaseL +x);
|
48 |
|
|
#define PCI_TRACEO(x,y) outl( x, (fcChip->Registers.IOBaseL +y));
|
49 |
|
|
#else
|
50 |
|
|
|
51 |
|
|
#define PCI_TRACE(x)
|
52 |
|
|
#define PCI_TRACEO(x,y)
|
53 |
|
|
#endif
|
54 |
|
|
|
55 |
|
|
|
56 |
|
|
//#define DEBUG_CMND 1 // debug output for Linux Scsi CDBs
|
57 |
|
|
//#define DUMMYCMND_DBG 1
|
58 |
|
|
|
59 |
|
|
//#define DEBUG_CPQFCTS 1
|
60 |
|
|
//#undef DEBUG_CPQFCTS
|
61 |
|
|
#ifdef DEBUG_CPQFCTS
|
62 |
|
|
#define ENTER(x) printk("cpqfcts : entering %s()\n", x);
|
63 |
|
|
#define LEAVE(x) printk("cpqfcts : leaving %s()\n", x);
|
64 |
|
|
#define DEBUG(x) x
|
65 |
|
|
#else
|
66 |
|
|
#define ENTER(x)
|
67 |
|
|
#define LEAVE(x)
|
68 |
|
|
#define DEBUG(x)
|
69 |
|
|
#endif /* DEBUG_CPQFCTS */
|
70 |
|
|
|
71 |
|
|
//#define DEBUG_CPQFCTS_PCI 1
|
72 |
|
|
//#undef DEBUG_CPQFCTS_PCI
|
73 |
|
|
#if DEBUG_CPQFCTS_PCI
|
74 |
|
|
#define DEBUG_PCI(x) x
|
75 |
|
|
#else
|
76 |
|
|
#define DEBUG_PCI(x)
|
77 |
|
|
#endif /* DEBUG_CPQFCTS_PCI */
|
78 |
|
|
|
79 |
|
|
#define STACHLITE66_TS12 "Compaq FibreChannel HBA Tachyon TS HPFC-5166A/1.2"
|
80 |
|
|
#define STACHLITE66_TS13 "Compaq FibreChannel HBA Tachyon TS HPFC-5166A/1.3"
|
81 |
|
|
#define STACHLITE_UNKNOWN "Compaq FibreChannel HBA Tachyon Chip/Board Ver??"
|
82 |
|
|
#define SAGILENT_XL2_21 "Agilent FC HBA, Tachyon XL2 HPFC-5200B/2.1"
|
83 |
|
|
|
84 |
|
|
// PDA is Peripheral Device Address, VSA is Volume Set Addressing
|
85 |
|
|
// Linux SCSI parameters
|
86 |
|
|
#define CPQFCTS_MAX_TARGET_ID 64
|
87 |
|
|
|
88 |
|
|
// Note, changing CPQFCTS_MAX_LUN to less than 32 (e.g, 8) will result in
|
89 |
|
|
// strange behavior if a box with more than, e.g. 8, is on the loop.
|
90 |
|
|
#define CPQFCTS_MAX_LUN 32 // The RA-4x00 supports 32 (Linux SCSI supports 8)
|
91 |
|
|
#define CPQFCTS_MAX_CHANNEL 0 // One FC port on cpqfcTS HBA
|
92 |
|
|
|
93 |
|
|
#define CPQFCTS_CMD_PER_LUN 15 // power of 2 -1, must be >0
|
94 |
|
|
#define CPQFCTS_REQ_QUEUE_LEN (TACH_SEST_LEN/2) // must be < TACH_SEST_LEN
|
95 |
|
|
|
96 |
|
|
/* FIMXME - these are crpa too */
|
97 |
|
|
#define LinuxVersionCode(v, p, s) (((v)<<16)+((p)<<8)+(s))
|
98 |
|
|
#ifndef DECLARE_MUTEX_LOCKED
|
99 |
|
|
#define DECLARE_MUTEX_LOCKED(sem) struct semaphore sem = MUTEX_LOCKED
|
100 |
|
|
#endif
|
101 |
|
|
|
102 |
|
|
#define DEV_NAME "cpqfcTS"
|
103 |
|
|
|
104 |
|
|
struct SupportedPCIcards {
|
105 |
|
|
__u16 vendor_id;
|
106 |
|
|
__u16 device_id;
|
107 |
|
|
};
|
108 |
|
|
|
109 |
|
|
/*
|
110 |
|
|
* nn:nn denotes bit field
|
111 |
|
|
* TachyonHeader struct def.
|
112 |
|
|
* the fields shared with ODB
|
113 |
|
|
* need to have same value
|
114 |
|
|
*/
|
115 |
|
|
|
116 |
|
|
/*
|
117 |
|
|
* macro for FC-PH reject codes
|
118 |
|
|
* payload format for LS_RJT (FC payloads are big endian):
|
119 |
|
|
* byte 0 1 2 3 (MSB)
|
120 |
|
|
* DWORD 0 01 00 00 00
|
121 |
|
|
* DWORD 1 resvd code expl. vendor
|
122 |
|
|
*/
|
123 |
|
|
#define LS_RJT_REASON( code, expl) (( code<<8) | (expl <<16))
|
124 |
|
|
|
125 |
|
|
#define TachLiteSTATUS 0x12
|
126 |
|
|
|
127 |
|
|
/*
|
128 |
|
|
* Fibre Channel EXCHANGE status codes for Tachyon chips/ driver software
|
129 |
|
|
* 32-bit ERROR word defines
|
130 |
|
|
*/
|
131 |
|
|
#define INVALID_ARGS 0x1
|
132 |
|
|
#define LNKDWN_OSLS 0x2
|
133 |
|
|
#define LNKDWN_LASER 0x4
|
134 |
|
|
#define OUTQUE_FULL 0x8
|
135 |
|
|
#define DRIVERQ_FULL 0x10
|
136 |
|
|
#define SEST_FULL 0x20
|
137 |
|
|
#define BAD_ALPA 0x40
|
138 |
|
|
#define OVERFLOW 0x80 // inbound CM
|
139 |
|
|
#define COUNT_ERROR 0x100 // inbound CM
|
140 |
|
|
#define LINKFAIL_RX 0x200 // inbound CM
|
141 |
|
|
#define ABORTSEQ_NOTIFY 0x400 // outbound CM
|
142 |
|
|
#define LINKFAIL_TX 0x800 // outbound CM
|
143 |
|
|
#define HOSTPROG_ERR 0x1000 // outbound CM
|
144 |
|
|
#define FRAME_TO 0x2000 // outbound CM
|
145 |
|
|
#define INV_ENTRY 0x4000 // outbound CM
|
146 |
|
|
#define SESTPROG_ERR 0x8000 // outbound CM
|
147 |
|
|
#define OUTBOUND_TIMEOUT 0x10000L // timeout waiting for Tachyon outbound CM
|
148 |
|
|
#define INITIATOR_ABORT 0x20000L // initiator exchange timeout or O/S ABORT
|
149 |
|
|
#define MEMPOOL_FAIL 0x40000L // O/S memory pool allocation failed
|
150 |
|
|
#define FC2_TIMEOUT 0x80000L // driver timeout for lost frames
|
151 |
|
|
#define TARGET_ABORT 0x100000L // ABTS received from FC port
|
152 |
|
|
#define EXCHANGE_QUEUED 0x200000L // e.g. Link State was LDn on fcStart
|
153 |
|
|
#define PORTID_CHANGED 0x400000L // fc Port address changed
|
154 |
|
|
#define DEVICE_REMOVED 0x800000L // fc Port address changed
|
155 |
|
|
/*
|
156 |
|
|
* Several error scenarios result in SEST Exchange frames
|
157 |
|
|
* unexpectedly arriving in the SFQ
|
158 |
|
|
*/
|
159 |
|
|
#define SFQ_FRAME 0x1000000L // SFQ frames from open Exchange
|
160 |
|
|
|
161 |
|
|
/*
|
162 |
|
|
* Maximum number of Host Bus Adapters (HBA) / controllers supported
|
163 |
|
|
* only important for mem allocation dimensions - increase as necessary
|
164 |
|
|
*/
|
165 |
|
|
|
166 |
|
|
#define MAX_ADAPTERS 8
|
167 |
|
|
#define MAX_RX_PAYLOAD 1024 // hardware dependent max frame payload
|
168 |
|
|
|
169 |
|
|
/*
|
170 |
|
|
* Tach header struct defines
|
171 |
|
|
*/
|
172 |
|
|
|
173 |
|
|
#define SOFi3 0x7
|
174 |
|
|
#define SOFf 0x8
|
175 |
|
|
#define SOFn3 0xB
|
176 |
|
|
#define EOFn 0x5
|
177 |
|
|
#define EOFt 0x6
|
178 |
|
|
|
179 |
|
|
// FCP R_CTL defines
|
180 |
|
|
#define FCP_CMND 0x6
|
181 |
|
|
#define FCP_XFER_RDY 0x5
|
182 |
|
|
#define FCP_RSP 0x7
|
183 |
|
|
#define FCP_RESPONSE 0x777 // (arbitrary #)
|
184 |
|
|
#define NEED_FCP_RSP 0x77 // (arbitrary #)
|
185 |
|
|
#define FCP_DATA 0x1
|
186 |
|
|
|
187 |
|
|
#define RESET_TACH 0x100 // Reset Tachyon/TachLite
|
188 |
|
|
#define SCSI_IWE 0x2000 // initiator write entry (for SEST)
|
189 |
|
|
#define SCSI_IRE 0x3000 // initiator read entry (for SEST)
|
190 |
|
|
#define SCSI_TRE 0x400 // target read entry (for SEST)
|
191 |
|
|
#define SCSI_TWE 0x500 // target write entry (for SEST)
|
192 |
|
|
#define TOGGLE_LASER 0x800
|
193 |
|
|
#define LIP 0x900
|
194 |
|
|
#define CLEAR_FCPORTS 99 // (arbitrary #) free mem for Logged in ports
|
195 |
|
|
#define FMINIT 0x707 // (arbitrary) for Frame Manager Init command
|
196 |
|
|
|
197 |
|
|
/*
|
198 |
|
|
* BLS == Basic Link Service
|
199 |
|
|
* ELS == Extended Link Service
|
200 |
|
|
*/
|
201 |
|
|
|
202 |
|
|
#define BLS_NOP 4
|
203 |
|
|
#define BLS_ABTS 0x10 // FC-PH Basic Link Service Abort Sequence
|
204 |
|
|
#define BLS_ABTS_ACC 0x100 // FC-PH Basic Link Service Abort Sequence Accept
|
205 |
|
|
#define BLS_ABTS_RJT 0x101 // FC-PH Basic Link Service Abort Sequence Reject
|
206 |
|
|
#define ELS_PLOGI 0x03 // FC-PH Port Login (arbitrary assign)
|
207 |
|
|
#define ELS_SCR 0x70 // (arb assign) State Change Registration (Fabric)
|
208 |
|
|
#define FCS_NSR 0x72 // (arb assign) Name Service Request (Fabric)
|
209 |
|
|
#define ELS_FLOGI 0x44 // (arb assign) Fabric Login
|
210 |
|
|
#define ELS_FDISC 0x41 // (arb assign) Fabric Discovery (Login)
|
211 |
|
|
#define ELS_PDISC 0x50 // FC-PH2 Port Discovery
|
212 |
|
|
#define ELS_ABTX 0x06 // FC-PH Abort Exchange
|
213 |
|
|
#define ELS_LOGO 0x05 // FC-PH Port Logout
|
214 |
|
|
#define ELS_PRLI 0x20 // FCP-SCSI Process Login
|
215 |
|
|
#define ELS_PRLO 0x21 // FCP-SCSI Process Logout
|
216 |
|
|
#define ELS_LOGO_ACC 0x07 // {FC-PH} Port Logout Accept
|
217 |
|
|
#define ELS_PLOGI_ACC 0x08 // {FC-PH} Port Login Accept
|
218 |
|
|
#define ELS_ACC 0x18 // {FC-PH} (generic) ACCept
|
219 |
|
|
#define ELS_PRLI_ACC 0x22 // {FCP-SCSI} Process Login Accept
|
220 |
|
|
#define ELS_RJT 0x1000000
|
221 |
|
|
#define SCSI_REPORT_LUNS 0x0A0
|
222 |
|
|
#define FCP_TARGET_RESET 0x200
|
223 |
|
|
|
224 |
|
|
#define ELS_LILP_FRAME 0x00000711 // 1st payload word of LILP frame
|
225 |
|
|
|
226 |
|
|
#define SFQ_UNASSISTED_FCP 1 // ICM, DWord3, "Type" unassisted FCP
|
227 |
|
|
#define SFQ_UNKNOWN 0x31 // (arbitrary) ICM, DWord3, "Type" unknown
|
228 |
|
|
|
229 |
|
|
/*
|
230 |
|
|
* These "LINK" bits refer to loop or non-loop
|
231 |
|
|
*/
|
232 |
|
|
#define LINKACTIVE 0x2 // fcLinkQ type - LINK UP Tachyon FM 'Lup' bit set
|
233 |
|
|
#define LINKDOWN 0xf2 // fcLinkQ type - LINK DOWN Tachyon FM 'Ldn' bit set
|
234 |
|
|
|
235 |
|
|
//#define VOLUME_SET_ADDRESSING 1 // "channel" or "bus" 1
|
236 |
|
|
|
237 |
|
|
typedef struct // 32 bytes hdr ONLY (e.g. FCP_DATA buffer for SEST)
|
238 |
|
|
{
|
239 |
|
|
__u32 reserved; // dword 0 (don't use)
|
240 |
|
|
__u32 sof_eof;
|
241 |
|
|
__u32 d_id; // dword 2 - 31:24 R_CTL, 23:0 D_ID
|
242 |
|
|
__u32 s_id; // dword 3 - 31:24 CS_CTL, 23:0 S_ID
|
243 |
|
|
__u32 f_ctl; // dword 4 - 31:24 Type, 23:0 F_CTL
|
244 |
|
|
__u32 seq_cnt; // dword 5 - 31:24 SEQ_ID, 23:16 DF_CTL, 15:0 SEQ_CNT
|
245 |
|
|
__u32 ox_rx_id; // dword 6 - 31:16 OX_ID, 15:0 RX_ID
|
246 |
|
|
__u32 ro; // dword 7 - relative offset
|
247 |
|
|
} TachFCHDR;
|
248 |
|
|
|
249 |
|
|
// NOTE!! the following struct MUST be 64 bytes.
|
250 |
|
|
typedef struct // 32 bytes hdr + 32 bytes payload
|
251 |
|
|
{
|
252 |
|
|
__u32 reserved; // dword 0 (don't use - must clear to 0)
|
253 |
|
|
__u32 sof_eof; // dword 1 - 31:24 SOF:EOF, UAM,CLS, LCr, TFV, TimeStamp
|
254 |
|
|
__u32 d_id; // dword 2 - 31:24 R_CTL, 23:0 D_ID
|
255 |
|
|
__u32 s_id; // dword 3 - 31:24 CS_CTL, 23:0 S_ID
|
256 |
|
|
__u32 f_ctl; // dword 4 - 31:24 Type, 23:0 F_CTL
|
257 |
|
|
__u32 seq_cnt; // dword 5 - 31:24 SEQ_ID, 23:16 DF_CTL, 15:0 SEQ_CNT
|
258 |
|
|
__u32 ox_rx_id; // dword 6 - 31:16 OX_ID, 15:0 RX_ID
|
259 |
|
|
__u32 ro; // dword 7 - relative offset
|
260 |
|
|
//---------
|
261 |
|
|
__u32 pl[8]; // dwords 8-15 frame data payload
|
262 |
|
|
} TachFCHDR_CMND;
|
263 |
|
|
|
264 |
|
|
|
265 |
|
|
typedef struct // 32 bytes hdr + 120 bytes payload
|
266 |
|
|
{
|
267 |
|
|
__u32 reserved; // dword 0 (don't use - must clear to 0)
|
268 |
|
|
__u32 sof_eof; // dword 1 - 31:24 SOF:EOF, UAM,CLS, LCr, TFV, TimeStamp
|
269 |
|
|
__u32 d_id; // dword 2 - 31:24 R_CTL, 23:0 D_ID
|
270 |
|
|
__u32 s_id; // dword 3 - 31:24 CS_CTL, 23:0 S_ID
|
271 |
|
|
__u32 f_ctl; // dword 4 - 31:24 Type, 23:0 F_CTL
|
272 |
|
|
__u32 seq_cnt; // dword 5 - 31:24 SEQ_ID, 23:16 DF_CTL, 15:0 SEQ_CNT
|
273 |
|
|
__u32 ox_rx_id; // dword 6 - 31:16 OX_ID, 15:0 RX_ID
|
274 |
|
|
__u32 ro; // dword 7 - relative offset
|
275 |
|
|
//---------
|
276 |
|
|
__u32 pl[30]; // largest necessary payload (for LOGIN cmnds)
|
277 |
|
|
} TachFCHDR_GCMND;
|
278 |
|
|
|
279 |
|
|
typedef struct // 32 bytes hdr + 64 bytes payload
|
280 |
|
|
{
|
281 |
|
|
__u32 reserved; // dword 0 (don't use)
|
282 |
|
|
__u32 sof_eof;
|
283 |
|
|
__u32 d_id; // dword 2 - 31:24 R_CTL, 23:0 D_ID
|
284 |
|
|
__u32 s_id; // dword 3 - 31:24 CS_CTL, 23:0 S_ID
|
285 |
|
|
__u32 f_ctl; // dword 4 - 31:24 Type, 23:0 F_CTL
|
286 |
|
|
__u32 seq_cnt; // dword 5 - 31:24 SEQ_ID, 23:16 DF_CTL, 15:0 SEQ_CNT
|
287 |
|
|
__u32 ox_rx_id; // dword 6 - 31:16 OX_ID, 15:0 RX_ID
|
288 |
|
|
__u32 ro; // dword 7 - relative offset
|
289 |
|
|
//---------
|
290 |
|
|
__u32 pl[18]; // payload for FCP-RSP (response buffer) RA-4x00 is 72bytes
|
291 |
|
|
} TachFCHDR_RSP;
|
292 |
|
|
|
293 |
|
|
|
294 |
|
|
|
295 |
|
|
|
296 |
|
|
|
297 |
|
|
|
298 |
|
|
// Inbound Message Queue structures...
|
299 |
|
|
typedef struct // each entry 8 words (32 bytes)
|
300 |
|
|
{
|
301 |
|
|
__u32 type; // IMQ completion message types
|
302 |
|
|
__u32 word[7]; // remainder of structure
|
303 |
|
|
// interpreted by IMQ type
|
304 |
|
|
} TachyonIMQE;
|
305 |
|
|
|
306 |
|
|
|
307 |
|
|
// Queues for TachLite not in original Tachyon
|
308 |
|
|
// ERQ - Exchange Request Queue (for outbound commands)
|
309 |
|
|
// SFQ - Single Frame Queue (for incoming frames)
|
310 |
|
|
|
311 |
|
|
// Define Tachyon Outbound Command Que
|
312 |
|
|
// (Since many Tachyon registers are Read
|
313 |
|
|
// only, maintain copies for debugging)
|
314 |
|
|
// most Tach ques need power-of-2 sizes,
|
315 |
|
|
// where registers are loaded with po2 -1
|
316 |
|
|
#define TACH_SEST_LEN 512 // TachLite SEST
|
317 |
|
|
|
318 |
|
|
#define ELS_EXCHANGES 64 // e.g. PLOGI, RSCN, ...
|
319 |
|
|
// define the total number of outstanding (simultaneous) exchanges
|
320 |
|
|
#define TACH_MAX_XID (TACH_SEST_LEN + ELS_EXCHANGES) // ELS exchanges
|
321 |
|
|
|
322 |
|
|
#define ERQ_LEN 128 // power of 2, max 4096
|
323 |
|
|
|
324 |
|
|
// Inbound Message Queue structures...
|
325 |
|
|
#define IMQ_LEN 512 // minimum 4 entries [(power of 2) - 1]
|
326 |
|
|
typedef struct // 8 words - 32 bytes
|
327 |
|
|
{
|
328 |
|
|
TachyonIMQE QEntry[IMQ_LEN];
|
329 |
|
|
__u32 producerIndex; // IMQ Producer Index register
|
330 |
|
|
// @32 byte align
|
331 |
|
|
__u32 consumerIndex; // Consumer Index register (in Tachyon)
|
332 |
|
|
__u32 length; // Length register
|
333 |
|
|
__u32 base;
|
334 |
|
|
} TachyonIMQ; // @ 32 * IMQ_LEN align
|
335 |
|
|
|
336 |
|
|
|
337 |
|
|
|
338 |
|
|
typedef struct // inbound completion message
|
339 |
|
|
{
|
340 |
|
|
__u32 Type;
|
341 |
|
|
__u32 Index;
|
342 |
|
|
__u32 TransferLength;
|
343 |
|
|
} TachyonInbCM;
|
344 |
|
|
|
345 |
|
|
|
346 |
|
|
|
347 |
|
|
// arbitrary numeric tags for TL structures
|
348 |
|
|
#define TL_FCHS 1 // TachLite Fibre Channel Header Structure
|
349 |
|
|
#define TL_IWE 2 // initiator write entry (for SEST)
|
350 |
|
|
#define TL_TWE 3 // target write entry (for SEST)
|
351 |
|
|
#define TL_IRE 4 // initiator read entry (for SEST)
|
352 |
|
|
#define TL_TRE 5 // target read entry (for SEST)
|
353 |
|
|
#define TL_IRB 6 // I/O request block
|
354 |
|
|
|
355 |
|
|
// for INCOMING frames
|
356 |
|
|
#define SFQ_LEN 32 // minimum 32 entries, max 4096
|
357 |
|
|
|
358 |
|
|
typedef struct // Single Frame Que
|
359 |
|
|
{
|
360 |
|
|
TachFCHDR_CMND QEntry[SFQ_LEN]; // must be 64 bytes!!
|
361 |
|
|
__u32 producerIndex; // IMQ Producer Index register
|
362 |
|
|
// @32 byte align
|
363 |
|
|
__u32 consumerIndex; // Consumer Index register (in Tachyon)
|
364 |
|
|
__u32 length; // Length register
|
365 |
|
|
__u32 base;
|
366 |
|
|
} TachLiteSFQ;
|
367 |
|
|
|
368 |
|
|
|
369 |
|
|
typedef struct // I/O Request Block flags
|
370 |
|
|
{
|
371 |
|
|
__u8 BRD:1;
|
372 |
|
|
__u8:1; // reserved
|
373 |
|
|
__u8 SFA:1;
|
374 |
|
|
__u8 DNC:1;
|
375 |
|
|
__u8 DIN:1;
|
376 |
|
|
__u8 DCM:1;
|
377 |
|
|
__u8 CTS:1;
|
378 |
|
|
__u8 SBV:1; // IRB entry valid - IRB'B' only
|
379 |
|
|
} IRBflags;
|
380 |
|
|
|
381 |
|
|
typedef struct // I/O Request Block
|
382 |
|
|
{ // Request 'A'
|
383 |
|
|
__u32 Req_A_SFS_Len; // total frame len (hdr + payload), min 32
|
384 |
|
|
__u32 Req_A_SFS_Addr; // 32-bit pointer to FCHS struct (to be sent)
|
385 |
|
|
__u32 Req_A_SFS_D_ID; // 24-bit FC destination (i.e. 8 bit al_pa)
|
386 |
|
|
__u32 Req_A_Trans_ID; // X_ID (OX_ID or RX_ID) and/or Index in SEST
|
387 |
|
|
// Request 'B'
|
388 |
|
|
__u32 Req_B_SFS_Len; // total frame len (hdr + payload), min 32
|
389 |
|
|
__u32 Req_B_SFS_Addr; // 32-bit pointer to FCHS struct (to be sent)
|
390 |
|
|
__u32 Req_B_SFS_D_ID; // 24-bit FC destination (i.e. 8 bit al_pa)
|
391 |
|
|
__u32 Req_B_Trans_ID; // X_ID (OX_ID or RX_ID) and/or Index in SEST
|
392 |
|
|
} TachLiteIRB;
|
393 |
|
|
|
394 |
|
|
|
395 |
|
|
typedef struct // TachLite placeholder for IRBs
|
396 |
|
|
{ // aligned @sizeof(ERQ) for TachLite
|
397 |
|
|
// MAX commands is sum of SEST len and ERQ
|
398 |
|
|
// we know that each SEST entry requires an
|
399 |
|
|
// IRB (ERQ) entry; in addition, we provide
|
400 |
|
|
// ERQ_LEN
|
401 |
|
|
TachLiteIRB QEntry[ERQ_LEN]; // Base register; entries 32 bytes ea.
|
402 |
|
|
__u32 consumerIndex; // Consumer Index register
|
403 |
|
|
__u32 producerIndex; // ERQ Producer Index register
|
404 |
|
|
__u32 length; // Length register
|
405 |
|
|
__u32 base; // copy of base ptr for debug
|
406 |
|
|
// struct is sized for largest expected cmnd (LOGIN)
|
407 |
|
|
} TachLiteERQ;
|
408 |
|
|
|
409 |
|
|
// for now, just 32 bit DMA, eventually 40something, with code changes
|
410 |
|
|
#define CPQFCTS_DMA_MASK ((unsigned long) (0x00000000FFFFFFFF))
|
411 |
|
|
|
412 |
|
|
#define TL_MAX_SG_ELEM_LEN 0x7ffff // Max buffer length a single S/G entry
|
413 |
|
|
// may represent (a hardware limitation). The
|
414 |
|
|
// only reason to ever change this is if you
|
415 |
|
|
// want to exercise very-hard-to-reach code in
|
416 |
|
|
// cpqfcTSworker.c:build_SEST_sglist().
|
417 |
|
|
|
418 |
|
|
#define TL_DANGER_SGPAGES 7 // arbitrary high water mark for # of S/G pages
|
419 |
|
|
// we must exceed to elicit a warning indicative
|
420 |
|
|
// of EXTREMELY large data transfers or
|
421 |
|
|
// EXTREME memory fragmentation.
|
422 |
|
|
// (means we just used up 2048 S/G elements,
|
423 |
|
|
// Never seen this is real life, only in
|
424 |
|
|
// testing with tricked up driver.)
|
425 |
|
|
|
426 |
|
|
#define TL_EXT_SG_PAGE_COUNT 256 // Number of Extended Scatter/Gather a/l PAIRS
|
427 |
|
|
// Tachyon register (IOBaseU 0x68)
|
428 |
|
|
// power-of-2 value ONLY! 4 min, 256 max
|
429 |
|
|
|
430 |
|
|
// byte len is #Pairs * 2 __u32/Pair * 4 bytes/__u32
|
431 |
|
|
#define TL_EXT_SG_PAGE_BYTELEN (TL_EXT_SG_PAGE_COUNT *2 *4)
|
432 |
|
|
|
433 |
|
|
|
434 |
|
|
|
435 |
|
|
// SEST entry types: IWE, IRE, TWE, TRE
|
436 |
|
|
typedef struct {
|
437 |
|
|
__u32 Hdr_Len;
|
438 |
|
|
__u32 Hdr_Addr;
|
439 |
|
|
__u32 RSP_Len;
|
440 |
|
|
__u32 RSP_Addr;
|
441 |
|
|
__u32 Buff_Off;
|
442 |
|
|
#define USES_EXTENDED_SGLIST(this_sest, x_ID) \
|
443 |
|
|
(!((this_sest)->u[ x_ID ].IWE.Buff_Off & 0x80000000))
|
444 |
|
|
__u32 Link;
|
445 |
|
|
__u32 RX_ID;
|
446 |
|
|
__u32 Data_Len;
|
447 |
|
|
__u32 Exp_RO;
|
448 |
|
|
__u32 Exp_Byte_Cnt;
|
449 |
|
|
// --- extended/local Gather Len/Address pairs
|
450 |
|
|
__u32 GLen1;
|
451 |
|
|
__u32 GAddr1;
|
452 |
|
|
__u32 GLen2;
|
453 |
|
|
__u32 GAddr2;
|
454 |
|
|
__u32 GLen3;
|
455 |
|
|
__u32 GAddr3;
|
456 |
|
|
} TachLiteIWE;
|
457 |
|
|
|
458 |
|
|
|
459 |
|
|
typedef struct {
|
460 |
|
|
__u32 Seq_Accum;
|
461 |
|
|
__u32 reserved; // must clear to 0
|
462 |
|
|
__u32 RSP_Len;
|
463 |
|
|
__u32 RSP_Addr;
|
464 |
|
|
__u32 Buff_Off;
|
465 |
|
|
__u32 Buff_Index; // __u32 5
|
466 |
|
|
__u32 Exp_RO;
|
467 |
|
|
__u32 Byte_Count;
|
468 |
|
|
__u32 reserved_; // __u32 8
|
469 |
|
|
__u32 Exp_Byte_Cnt;
|
470 |
|
|
// --- extended/local Scatter Len/Address pairs
|
471 |
|
|
__u32 SLen1;
|
472 |
|
|
__u32 SAddr1;
|
473 |
|
|
__u32 SLen2;
|
474 |
|
|
__u32 SAddr2;
|
475 |
|
|
__u32 SLen3;
|
476 |
|
|
__u32 SAddr3;
|
477 |
|
|
} TachLiteIRE;
|
478 |
|
|
|
479 |
|
|
|
480 |
|
|
typedef struct // Target Write Entry
|
481 |
|
|
{
|
482 |
|
|
__u32 Seq_Accum; // dword 0
|
483 |
|
|
__u32 reserved; // dword 1 must clear to 0
|
484 |
|
|
__u32 Remote_Node_ID;
|
485 |
|
|
__u32 reserved1; // dword 3 must clear to 0
|
486 |
|
|
__u32 Buff_Off;
|
487 |
|
|
__u32 Buff_Index; // __u32 5
|
488 |
|
|
__u32 Exp_RO;
|
489 |
|
|
__u32 Byte_Count;
|
490 |
|
|
__u32 reserved_; // __u32 8
|
491 |
|
|
__u32 Exp_Byte_Cnt;
|
492 |
|
|
// --- extended/local Scatter Len/Address pairs
|
493 |
|
|
__u32 SLen1;
|
494 |
|
|
__u32 SAddr1;
|
495 |
|
|
__u32 SLen2;
|
496 |
|
|
__u32 SAddr2;
|
497 |
|
|
__u32 SLen3;
|
498 |
|
|
__u32 SAddr3;
|
499 |
|
|
} TachLiteTWE;
|
500 |
|
|
|
501 |
|
|
typedef struct {
|
502 |
|
|
__u32 Hdr_Len;
|
503 |
|
|
__u32 Hdr_Addr;
|
504 |
|
|
__u32 RSP_Len; // DWord 2
|
505 |
|
|
__u32 RSP_Addr;
|
506 |
|
|
__u32 Buff_Off;
|
507 |
|
|
__u32 Buff_Index; // DWord 5
|
508 |
|
|
__u32 reserved;
|
509 |
|
|
__u32 Data_Len;
|
510 |
|
|
__u32 reserved_;
|
511 |
|
|
__u32 reserved__;
|
512 |
|
|
// --- extended/local Gather Len/Address pairs
|
513 |
|
|
__u32 GLen1; // DWord A
|
514 |
|
|
__u32 GAddr1;
|
515 |
|
|
__u32 GLen2;
|
516 |
|
|
__u32 GAddr2;
|
517 |
|
|
__u32 GLen3;
|
518 |
|
|
__u32 GAddr3;
|
519 |
|
|
} TachLiteTRE;
|
520 |
|
|
|
521 |
|
|
typedef struct ext_sg_page_ptr_t *PSGPAGES;
|
522 |
|
|
typedef struct ext_sg_page_ptr_t {
|
523 |
|
|
unsigned char page[TL_EXT_SG_PAGE_BYTELEN * 2]; // 2x for alignment
|
524 |
|
|
dma_addr_t busaddr; // need the bus addresses and
|
525 |
|
|
unsigned int maplen; // lengths for later pci unmapping.
|
526 |
|
|
PSGPAGES next;
|
527 |
|
|
} SGPAGES; // linked list of S/G pairs, by Exchange
|
528 |
|
|
|
529 |
|
|
typedef struct // SCSI Exchange State Table
|
530 |
|
|
{
|
531 |
|
|
union // Entry can be IWE, IRE, TWE, TRE
|
532 |
|
|
{ // 64 bytes per entry
|
533 |
|
|
TachLiteIWE IWE;
|
534 |
|
|
TachLiteIRE IRE;
|
535 |
|
|
TachLiteTWE TWE;
|
536 |
|
|
TachLiteTRE TRE;
|
537 |
|
|
} u[TACH_SEST_LEN];
|
538 |
|
|
|
539 |
|
|
TachFCHDR DataHDR[TACH_SEST_LEN]; // for SEST FCP_DATA frame hdr (no pl)
|
540 |
|
|
TachFCHDR_RSP RspHDR[TACH_SEST_LEN]; // space for SEST FCP_RSP frame
|
541 |
|
|
PSGPAGES sgPages[TACH_SEST_LEN]; // head of linked list of Pool-allocations
|
542 |
|
|
__u32 length; // Length register
|
543 |
|
|
__u32 base; // copy of base ptr for debug
|
544 |
|
|
} TachSEST;
|
545 |
|
|
|
546 |
|
|
|
547 |
|
|
|
548 |
|
|
typedef struct // each register has it's own address
|
549 |
|
|
// and value (used for write-only regs)
|
550 |
|
|
{
|
551 |
|
|
void *address;
|
552 |
|
|
volatile __u32 value;
|
553 |
|
|
} FCREGISTER;
|
554 |
|
|
|
555 |
|
|
typedef struct // Host copy - TachLite Registers
|
556 |
|
|
{
|
557 |
|
|
__u32 IOBaseL, IOBaseU; // I/O port lower and upper TL register addresses
|
558 |
|
|
__u32 MemBase; // memory mapped register addresses
|
559 |
|
|
void *ReMapMemBase; // O/S VM reference for MemBase
|
560 |
|
|
__u32 wwn_hi; // WWN is set once at startup
|
561 |
|
|
__u32 wwn_lo;
|
562 |
|
|
__u32 my_al_pa; // al_pa received after LIP()
|
563 |
|
|
__u32 ROMCTR; // flags for on-board RAM/ROM
|
564 |
|
|
__u32 RAMBase; // on-board RAM (i.e. some Tachlites)
|
565 |
|
|
__u32 SROMBase; // on-board EEPROM (some Tachlites)
|
566 |
|
|
__u32 PCIMCTR; // PCI Master Control Reg (has bus width)
|
567 |
|
|
|
568 |
|
|
FCREGISTER INTEN; // copy of interrupt enable mask
|
569 |
|
|
FCREGISTER INTPEND; // interrupt pending
|
570 |
|
|
FCREGISTER INTSTAT; // interrupt status
|
571 |
|
|
FCREGISTER SFQconsumerIndex;
|
572 |
|
|
FCREGISTER ERQproducerIndex;
|
573 |
|
|
FCREGISTER TYconfig; // TachYon (chip level)
|
574 |
|
|
FCREGISTER TYcontrol;
|
575 |
|
|
FCREGISTER TYstatus;
|
576 |
|
|
FCREGISTER FMconfig; // Frame Manager (FC loop level)
|
577 |
|
|
FCREGISTER FMcontrol;
|
578 |
|
|
FCREGISTER FMstatus;
|
579 |
|
|
FCREGISTER FMLinkStatus1;
|
580 |
|
|
FCREGISTER FMLinkStatus2;
|
581 |
|
|
FCREGISTER FMBB_CreditZero;
|
582 |
|
|
FCREGISTER status;
|
583 |
|
|
FCREGISTER ed_tov; // error detect time-out value
|
584 |
|
|
FCREGISTER rcv_al_pa; // received arb. loop physical address
|
585 |
|
|
FCREGISTER primitive; // e.g. LIP(), OPN(), ...
|
586 |
|
|
} TL_REGISTERS;
|
587 |
|
|
|
588 |
|
|
|
589 |
|
|
|
590 |
|
|
typedef struct {
|
591 |
|
|
__u32 ok;
|
592 |
|
|
__u32 invalidArgs;
|
593 |
|
|
__u32 linkDown;
|
594 |
|
|
__u32 linkUp;
|
595 |
|
|
__u32 outQueFull;
|
596 |
|
|
__u32 SESTFull;
|
597 |
|
|
__u32 hpe; // host programming err (from Tach)
|
598 |
|
|
__u32 FC4aborted; // aborts from Application or upper driver layer
|
599 |
|
|
__u32 FC2aborted; // aborts from our driver's timeouts
|
600 |
|
|
__u32 timeouts; // our driver timeout (on individual exchanges)
|
601 |
|
|
__u32 logouts; // explicit - sent LOGO; implicit - device removed
|
602 |
|
|
__u32 retries;
|
603 |
|
|
__u32 linkFailTX;
|
604 |
|
|
__u32 linkFailRX;
|
605 |
|
|
__u32 CntErrors; // byte count expected != count received (typ. SEST)
|
606 |
|
|
__u32 e_stores; // elastic store errs
|
607 |
|
|
__u32 resets; // hard or soft controller resets
|
608 |
|
|
__u32 FMinits; // TACH Frame Manager Init (e.g. LIPs)
|
609 |
|
|
__u32 lnkQueFull; // too many LOGIN, loop commands
|
610 |
|
|
__u32 ScsiQueFull; // too many FCP-SCSI inbound frames
|
611 |
|
|
__u32 LossofSignal; // FM link status 1 regs
|
612 |
|
|
__u32 BadRXChar; // FM link status 1 regs
|
613 |
|
|
__u32 LossofSync; // FM link status 1 regs
|
614 |
|
|
__u32 Rx_EOFa; // FM link status 2 regs (received EOFa)
|
615 |
|
|
__u32 Dis_Frm; // FM link status 2 regs (discarded frames)
|
616 |
|
|
__u32 Bad_CRC; // FM link status 2 regs
|
617 |
|
|
__u32 BB0_Timer; // FM BB_Credit Zero Timer Reg
|
618 |
|
|
__u32 loopBreaks; // infinite loop exits
|
619 |
|
|
__u32 lastBB0timer; // static accum. buffer needed by Tachlite
|
620 |
|
|
} FCSTATS;
|
621 |
|
|
|
622 |
|
|
|
623 |
|
|
typedef struct // Config Options
|
624 |
|
|
{ // LS Bit first
|
625 |
|
|
__u16:1; // bit0:
|
626 |
|
|
__u16 flogi:1; // bit1: We sent FLOGI - wait for Fabric logins
|
627 |
|
|
__u16 fabric:1; // bit2: Tachyon detected Fabric (FM stat LG)
|
628 |
|
|
__u16 LILPin:1; // bit3: We can use an FC-AL LILP frame
|
629 |
|
|
__u16 target:1; // bit4: this Port has SCSI target capability
|
630 |
|
|
__u16 initiator:1; // bit5: this Port has SCSI initiator capability
|
631 |
|
|
__u16 extLoopback:1; // bit6: loopback at GBIC
|
632 |
|
|
__u16 intLoopback:1; // bit7: loopback in HP silicon
|
633 |
|
|
__u16:1; // bit8:
|
634 |
|
|
__u16:1; // bit9:
|
635 |
|
|
__u16:1; // bit10:
|
636 |
|
|
__u16:1; // bit11:
|
637 |
|
|
__u16:1; // bit12:
|
638 |
|
|
__u16:1; // bit13:
|
639 |
|
|
__u16:1; // bit14:
|
640 |
|
|
__u16:1; // bit15:
|
641 |
|
|
} FC_OPTIONS;
|
642 |
|
|
|
643 |
|
|
|
644 |
|
|
|
645 |
|
|
typedef struct dyn_mem_pair {
|
646 |
|
|
void *BaseAllocated; // address as allocated from O/S;
|
647 |
|
|
unsigned long AlignedAddress; // aligned address (used by Tachyon DMA)
|
648 |
|
|
dma_addr_t dma_handle;
|
649 |
|
|
size_t size;
|
650 |
|
|
} ALIGNED_MEM;
|
651 |
|
|
|
652 |
|
|
|
653 |
|
|
|
654 |
|
|
|
655 |
|
|
// these structs contain only CRUCIAL (stuff we actually use) parameters
|
656 |
|
|
// from FC-PH(n) logins. (Don't save entire LOGIN payload to save mem.)
|
657 |
|
|
|
658 |
|
|
// Implicit logout happens when the loop goes down - we require PDISC
|
659 |
|
|
// to restore. Explicit logout is when WE decide never to talk to someone,
|
660 |
|
|
// or when a target refuses to talk to us, i.e. sends us a LOGO frame or
|
661 |
|
|
// LS_RJT reject in response to our PLOGI request.
|
662 |
|
|
|
663 |
|
|
#define IMPLICIT_LOGOUT 1
|
664 |
|
|
#define EXPLICIT_LOGOUT 2
|
665 |
|
|
|
666 |
|
|
typedef struct {
|
667 |
|
|
__u8 channel; // SCSI "bus"
|
668 |
|
|
__u8 target;
|
669 |
|
|
__u8 InqDeviceType; // byte 0 from SCSI Inquiry response
|
670 |
|
|
__u8 VolumeSetAddressing; // FCP-SCSI LUN coding (40h for VSA)
|
671 |
|
|
__u8 LunMasking; // True if selective presentation supported
|
672 |
|
|
__u8 lun[CPQFCTS_MAX_LUN];
|
673 |
|
|
} SCSI_NEXUS;
|
674 |
|
|
|
675 |
|
|
|
676 |
|
|
typedef struct {
|
677 |
|
|
union {
|
678 |
|
|
__u8 ucWWN[8]; // a FC 64-bit World Wide Name/ PortID of target
|
679 |
|
|
// addressing of single target on single loop...
|
680 |
|
|
u64 liWWN;
|
681 |
|
|
} u;
|
682 |
|
|
|
683 |
|
|
__u32 port_id; // a FC 24-bit address of port (lower 8 bits = al_pa)
|
684 |
|
|
|
685 |
|
|
Scsi_Cmnd ScsiCmnd; // command buffer for Report Luns
|
686 |
|
|
#define REPORT_LUNS_PL 256
|
687 |
|
|
__u8 ReportLunsPayload[REPORT_LUNS_PL];
|
688 |
|
|
|
689 |
|
|
SCSI_NEXUS ScsiNexus; // LUNs per FC device
|
690 |
|
|
|
691 |
|
|
__u32 LOGO_counter; // might try several times before logging out for good
|
692 |
|
|
__u32 LOGO_timer; // after LIP, ports expecting PDISC must time-out and
|
693 |
|
|
// LOGOut if successful PDISC not completed in 2 secs
|
694 |
|
|
|
695 |
|
|
__u32 concurrent_seq; // must be 1 or greater
|
696 |
|
|
__u32 rx_data_size; // e.g. 128, 256, 1024, 2048 per FC-PH spec
|
697 |
|
|
__u32 BB_credit;
|
698 |
|
|
__u32 EE_credit;
|
699 |
|
|
|
700 |
|
|
__u32 fcp_info; // from PRLI (i.e. INITIATOR/ TARGET flags)
|
701 |
|
|
// flags for login process
|
702 |
|
|
__u8 Originator; // Login sequence Originated (if false, we
|
703 |
|
|
// responded to another port's login sequence)
|
704 |
|
|
__u8 plogi; // PLOGI frame ACCepted (originated or responded)
|
705 |
|
|
__u8 pdisc; // PDISC frame was ORIGINATED (self-login logic)
|
706 |
|
|
__u8 prli; // PRLI frame ACCepted (originated or responded)
|
707 |
|
|
__u8 flogi; // FLOGI frame ACCepted (originated or responded)
|
708 |
|
|
__u8 logo; // port permanently logged out (invalid login param)
|
709 |
|
|
__u8 flogiReq; // Fabric login required (set in LIP process)
|
710 |
|
|
__u8 highest_ver;
|
711 |
|
|
__u8 lowest_ver;
|
712 |
|
|
|
713 |
|
|
|
714 |
|
|
// when the "target" (actually FC Port) is waiting for login
|
715 |
|
|
// (e.g. after Link reset), set the device_blocked bit;
|
716 |
|
|
// after Port completes login, un-block target.
|
717 |
|
|
__u8 device_blocked; // see Scsi_Device struct
|
718 |
|
|
|
719 |
|
|
// define singly-linked list of logged-in ports
|
720 |
|
|
// once a port_id is identified, it is remembered,
|
721 |
|
|
// even if the port is removed indefinitely
|
722 |
|
|
void * pNextPort; // actually, type PFC_LOGGEDIN_PORT; void for Compiler
|
723 |
|
|
|
724 |
|
|
} FC_LOGGEDIN_PORT, *PFC_LOGGEDIN_PORT;
|
725 |
|
|
|
726 |
|
|
|
727 |
|
|
|
728 |
|
|
// This serves as the ESB (Exchange Status Block),
|
729 |
|
|
// and has timeout counter; used for ABORTs
|
730 |
|
|
typedef struct { // FC-1 X_IDs
|
731 |
|
|
__u32 type; // ELS_PLOGI, SCSI_IWE, ... (0 if free)
|
732 |
|
|
PFC_LOGGEDIN_PORT pLoggedInPort; // FC device on other end of Exchange
|
733 |
|
|
Scsi_Cmnd *Cmnd; // Linux SCSI command packet includes S/G list
|
734 |
|
|
__u32 timeOut; // units of ??, DEC by driver, Abort when 0
|
735 |
|
|
__u32 reTries; // need one or more retries?
|
736 |
|
|
__u32 status; // flags indicating errors (0 if none)
|
737 |
|
|
TachLiteIRB IRB; // I/O Request Block, gets copied to ERQ
|
738 |
|
|
TachFCHDR_GCMND fchs; // location of IRB's Req_A_SFS_Addr
|
739 |
|
|
} FC_EXCHANGE, *PFC_EXCHANGE;
|
740 |
|
|
|
741 |
|
|
// Unfortunately, Linux limits our kmalloc() allocations to 128k.
|
742 |
|
|
// Because of this and the fact that our ScsiRegister allocation
|
743 |
|
|
// is also constrained, we move this large structure out for
|
744 |
|
|
// allocation after Scsi Register.
|
745 |
|
|
// (In other words, this cumbersome indirection is necessary
|
746 |
|
|
// because of kernel memory allocation constraints!)
|
747 |
|
|
|
748 |
|
|
typedef struct // we will allocate this dynamically
|
749 |
|
|
{
|
750 |
|
|
FC_EXCHANGE fcExchange[TACH_MAX_XID];
|
751 |
|
|
} FC_EXCHANGES;
|
752 |
|
|
|
753 |
|
|
|
754 |
|
|
|
755 |
|
|
|
756 |
|
|
|
757 |
|
|
|
758 |
|
|
|
759 |
|
|
|
760 |
|
|
|
761 |
|
|
|
762 |
|
|
|
763 |
|
|
typedef struct {
|
764 |
|
|
char Name[64]; // name of controller ("HP Tachlite TL Rev2.0, 33MHz, 64bit bus")
|
765 |
|
|
//void * pAdapterDevExt; // back pointer to device object/extension
|
766 |
|
|
__u32 ChipType; // local numeric key for Tachyon Type / Rev.
|
767 |
|
|
__u32 status; // our Driver - logical status
|
768 |
|
|
|
769 |
|
|
TL_REGISTERS Registers; // reg addresses & host memory copies
|
770 |
|
|
// FC-4 mapping of 'transaction' to X_IDs
|
771 |
|
|
__u8 LILPmap[32 * 4]; // Loop Position Map of ALPAs (late FC-AL only)
|
772 |
|
|
FC_OPTIONS Options; // e.g. Target, Initiator, loopback...
|
773 |
|
|
__u8 highest_FCPH_ver; // FC-PH version limits
|
774 |
|
|
__u8 lowest_FCPH_ver; // FC-PH version limits
|
775 |
|
|
|
776 |
|
|
FC_EXCHANGES *Exchanges;
|
777 |
|
|
__u32 fcLsExchangeLRU; // Least Recently Used counter (Link Service)
|
778 |
|
|
__u32 fcSestExchangeLRU; // Least Recently Used counter (FCP-SCSI)
|
779 |
|
|
FC_LOGGEDIN_PORT fcPorts; // linked list of every FC port ever seen
|
780 |
|
|
FCSTATS fcStats; // FC comm err counters
|
781 |
|
|
|
782 |
|
|
// Host memory QUEUE pointers
|
783 |
|
|
TachLiteERQ *ERQ; // Exchange Request Que
|
784 |
|
|
TachyonIMQ *IMQ; // Inbound Message Que
|
785 |
|
|
TachLiteSFQ *SFQ; // Single Frame Queue
|
786 |
|
|
TachSEST *SEST; // SCSI Exchange State Table
|
787 |
|
|
|
788 |
|
|
dma_addr_t exch_dma_handle;
|
789 |
|
|
|
790 |
|
|
// these function pointers are for "generic" functions, which are
|
791 |
|
|
// replaced with Host Bus Adapter types at
|
792 |
|
|
// runtime.
|
793 |
|
|
int (*CreateTachyonQues) (void *, int);
|
794 |
|
|
int (*DestroyTachyonQues) (void *, int);
|
795 |
|
|
int (*LaserControl) (void *, int); // e.g. On/Off
|
796 |
|
|
int (*ResetTachyon) (void *, int);
|
797 |
|
|
void (*FreezeTachyon) (void *, int);
|
798 |
|
|
void (*UnFreezeTachyon) (void *, int);
|
799 |
|
|
int (*InitializeTachyon) (void *, int, int);
|
800 |
|
|
int (*InitializeFrameManager) (void *, int);
|
801 |
|
|
int (*ProcessIMQEntry) (void *);
|
802 |
|
|
int (*ReadWriteWWN) (void *, int ReadWrite);
|
803 |
|
|
int (*ReadWriteNVRAM) (void *, void *, int ReadWrite);
|
804 |
|
|
|
805 |
|
|
} TACHYON, *PTACHYON;
|
806 |
|
|
|
807 |
|
|
|
808 |
|
|
void cpqfcTSClearLinkStatusCounters(TACHYON * fcChip);
|
809 |
|
|
|
810 |
|
|
int CpqTsCreateTachLiteQues(void *pHBA, int opcode);
|
811 |
|
|
int CpqTsDestroyTachLiteQues(void *, int);
|
812 |
|
|
int CpqTsInitializeTachLite(void *pHBA, int opcode1, int opcode2);
|
813 |
|
|
|
814 |
|
|
int CpqTsProcessIMQEntry(void *pHBA);
|
815 |
|
|
int CpqTsResetTachLite(void *pHBA, int type);
|
816 |
|
|
void CpqTsFreezeTachlite(void *pHBA, int type);
|
817 |
|
|
void CpqTsUnFreezeTachlite(void *pHBA, int type);
|
818 |
|
|
int CpqTsInitializeFrameManager(void *pHBA, int);
|
819 |
|
|
int CpqTsLaserControl(void *addrBase, int opcode);
|
820 |
|
|
int CpqTsReadWriteWWN(void *, int ReadWrite);
|
821 |
|
|
int CpqTsReadWriteNVRAM(void *, void *data, int ReadWrite);
|
822 |
|
|
|
823 |
|
|
void cpqfcTS_WorkTask(struct Scsi_Host *HostAdapter);
|
824 |
|
|
void cpqfcTSWorkerThread(void *host);
|
825 |
|
|
|
826 |
|
|
int cpqfcTS_GetNVRAM_data(__u8 * wwnbuf, __u8 * buf);
|
827 |
|
|
__u32 cpqfcTS_ReadNVRAM(void *GPIOin, void *GPIOout, __u16 count, __u8 * buf);
|
828 |
|
|
|
829 |
|
|
__u8 tl_write_i2c_nvram(void *GPIOin, void *GPIOout, __u16 startOffset, // e.g. 0x2f for WWN start
|
830 |
|
|
__u16 count, __u8 * buf);
|
831 |
|
|
|
832 |
|
|
|
833 |
|
|
// define misc functions
|
834 |
|
|
int cpqfcTSGetLPSM(PTACHYON fcChip, char cErrorString[]);
|
835 |
|
|
int cpqfcTSDecodeGBICtype(PTACHYON fcChip, char cErrorString[]);
|
836 |
|
|
void *fcMemManager(struct pci_dev *pdev, ALIGNED_MEM * dyn_mem_pair, __u32 n_alloc, __u32 ab, __u32 ulAlignedAddress, dma_addr_t * dma_handle);
|
837 |
|
|
|
838 |
|
|
void BigEndianSwap(__u8 * source, __u8 * dest, __u16 cnt);
|
839 |
|
|
|
840 |
|
|
//__u32 virt_to_phys( void * virtaddr );
|
841 |
|
|
|
842 |
|
|
|
843 |
|
|
// Linux interrupt handler
|
844 |
|
|
void cpqfcTS_intr_handler(int irq, void *dev_id, struct pt_regs *regs);
|
845 |
|
|
void cpqfcTSheartbeat(unsigned long ptr);
|
846 |
|
|
|
847 |
|
|
|
848 |
|
|
|
849 |
|
|
// The biggest Q element we deal with is Aborts - we
|
850 |
|
|
// need 4 bytes for x_ID, and a Scsi_Cmnd (~284 bytes)
|
851 |
|
|
//#define LINKQ_ITEM_SIZE ((4+sizeof(Scsi_Cmnd)+3)/4)
|
852 |
|
|
#define LINKQ_ITEM_SIZE (3*16)
|
853 |
|
|
typedef struct {
|
854 |
|
|
__u32 Type; // e.g. LINKUP, SFQENTRY, PDISC, BLS_ABTS, ...
|
855 |
|
|
__u32 ulBuff[LINKQ_ITEM_SIZE];
|
856 |
|
|
} LINKQ_ITEM;
|
857 |
|
|
|
858 |
|
|
#define FC_LINKQ_DEPTH TACH_MAX_XID
|
859 |
|
|
typedef struct {
|
860 |
|
|
__u32 producer;
|
861 |
|
|
__u32 consumer; // when producer equals consumer, Q empty
|
862 |
|
|
|
863 |
|
|
LINKQ_ITEM Qitem[FC_LINKQ_DEPTH];
|
864 |
|
|
|
865 |
|
|
} FC_LINK_QUE, *PFC_LINK_QUE;
|
866 |
|
|
|
867 |
|
|
|
868 |
|
|
// DPC routines post to here on Inbound SCSI frames
|
869 |
|
|
// User thread processes
|
870 |
|
|
#define FC_SCSIQ_DEPTH 32
|
871 |
|
|
|
872 |
|
|
typedef struct {
|
873 |
|
|
int Type; // e.g. SCSI
|
874 |
|
|
__u32 ulBuff[3 * 16];
|
875 |
|
|
} SCSIQ_ITEM;
|
876 |
|
|
|
877 |
|
|
typedef struct {
|
878 |
|
|
__u32 producer;
|
879 |
|
|
__u32 consumer; // when producer equals consumer, Q empty
|
880 |
|
|
|
881 |
|
|
SCSIQ_ITEM Qitem[FC_SCSIQ_DEPTH];
|
882 |
|
|
|
883 |
|
|
} FC_SCSI_QUE, *PFC_SCSI_QUE;
|
884 |
|
|
|
885 |
|
|
|
886 |
|
|
|
887 |
|
|
|
888 |
|
|
|
889 |
|
|
#define DYNAMIC_ALLOCATIONS 4 // Tachyon aligned allocations: ERQ,IMQ,SFQ,SEST
|
890 |
|
|
|
891 |
|
|
// Linux space allocated per HBA (chip state, etc.)
|
892 |
|
|
typedef struct {
|
893 |
|
|
struct Scsi_Host *HostAdapter; // back pointer to Linux Scsi struct
|
894 |
|
|
|
895 |
|
|
TACHYON fcChip; // All Tachyon registers, Queues, functions
|
896 |
|
|
ALIGNED_MEM dynamic_mem[DYNAMIC_ALLOCATIONS];
|
897 |
|
|
|
898 |
|
|
struct pci_dev *PciDev;
|
899 |
|
|
dma_addr_t fcLQ_dma_handle;
|
900 |
|
|
|
901 |
|
|
Scsi_Cmnd *LinkDnCmnd[CPQFCTS_REQ_QUEUE_LEN]; // collects Cmnds during LDn
|
902 |
|
|
// (for Acceptable targets)
|
903 |
|
|
Scsi_Cmnd *BoardLockCmnd[CPQFCTS_REQ_QUEUE_LEN]; // SEST was full
|
904 |
|
|
|
905 |
|
|
Scsi_Cmnd *BadTargetCmnd[CPQFCTS_MAX_TARGET_ID]; // missing targets
|
906 |
|
|
|
907 |
|
|
u_char HBAnum; // 0-based host number
|
908 |
|
|
|
909 |
|
|
|
910 |
|
|
struct timer_list cpqfcTStimer; // FC utility timer for implicit
|
911 |
|
|
// logouts, FC protocol timeouts, etc.
|
912 |
|
|
int fcStatsTime; // Statistics delta reporting time
|
913 |
|
|
|
914 |
|
|
struct task_struct *worker_thread; // our kernel thread
|
915 |
|
|
int PortDiscDone; // set by SendLogins(), cleared by LDn
|
916 |
|
|
|
917 |
|
|
struct semaphore *TachFrozen;
|
918 |
|
|
struct semaphore *TYOBcomplete; // handshake for Tach outbound frames
|
919 |
|
|
struct semaphore *fcQueReady; // FibreChannel work for our kernel thread
|
920 |
|
|
struct semaphore *notify_wt; // synchronizes kernel thread kill
|
921 |
|
|
struct semaphore *BoardLock;
|
922 |
|
|
|
923 |
|
|
PFC_LINK_QUE fcLQ; // the WorkerThread operates on this
|
924 |
|
|
|
925 |
|
|
spinlock_t hba_spinlock; // held/released by WorkerThread
|
926 |
|
|
|
927 |
|
|
} CPQFCHBA;
|
928 |
|
|
|
929 |
|
|
#define CPQ_SPINLOCK_HBA( x ) spin_lock(&x->hba_spinlock);
|
930 |
|
|
#define CPQ_SPINUNLOCK_HBA(x) spin_unlock(&x->hba_spinlock);
|
931 |
|
|
|
932 |
|
|
|
933 |
|
|
|
934 |
|
|
void cpqfcTSImplicitLogout(CPQFCHBA * cpqfcHBAdata, PFC_LOGGEDIN_PORT pFcPort);
|
935 |
|
|
|
936 |
|
|
|
937 |
|
|
void cpqfcTSTerminateExchange(CPQFCHBA *, SCSI_NEXUS * target, int);
|
938 |
|
|
|
939 |
|
|
PFC_LOGGEDIN_PORT fcPortLoggedIn(CPQFCHBA * cpqfcHBAdata, TachFCHDR_GCMND * fchs, __u8, __u8);
|
940 |
|
|
void fcProcessLoggedIn(CPQFCHBA * cpqfcHBAdata, TachFCHDR_GCMND * fchs);
|
941 |
|
|
|
942 |
|
|
|
943 |
|
|
__u32 cpqfcTSBuildExchange(CPQFCHBA * cpqfcHBAdata, __u32 type, // e.g. PLOGI
|
944 |
|
|
TachFCHDR_GCMND * InFCHS, // incoming FCHS
|
945 |
|
|
void *Data, // the CDB, scatter/gather, etc.
|
946 |
|
|
__s32 * ExchangeID); // allocated exchange ID
|
947 |
|
|
|
948 |
|
|
__u32 cpqfcTSStartExchange(CPQFCHBA * cpqfcHBAdata, __s32 ExchangeID);
|
949 |
|
|
|
950 |
|
|
void cpqfcTSCompleteExchange(struct pci_dev *pcidev, PTACHYON fcChip, __u32 exchange_ID);
|
951 |
|
|
|
952 |
|
|
|
953 |
|
|
PFC_LOGGEDIN_PORT fcFindLoggedInPort(PTACHYON fcChip, Scsi_Cmnd * Cmnd, // (We want the channel/target/lun Nexus from Cmnd)
|
954 |
|
|
__u32 port_id, // search linked list for al_pa, or
|
955 |
|
|
__u8 wwn[8], // search linked list for WWN, or...
|
956 |
|
|
PFC_LOGGEDIN_PORT * pLastLoggedInPort);
|
957 |
|
|
|
958 |
|
|
void cpqfcTSPutLinkQue(CPQFCHBA * cpqfcHBAdata, int Type, void *QueContent);
|
959 |
|
|
|
960 |
|
|
void fcPutScsiQue(CPQFCHBA * cpqfcHBAdata, int Type, void *QueContent);
|
961 |
|
|
|
962 |
|
|
void fcLinkQReset(CPQFCHBA *);
|
963 |
|
|
void fcScsiQReset(CPQFCHBA *);
|
964 |
|
|
void fcSestReset(CPQFCHBA *);
|
965 |
|
|
|
966 |
|
|
void cpqfc_pci_unmap(struct pci_dev *pcidev, Scsi_Cmnd * cmd, PTACHYON fcChip, __u32 x_ID);
|
967 |
|
|
|
968 |
|
|
extern const __u8 valid_al_pa[];
|
969 |
|
|
extern const int number_of_al_pa;
|
970 |
|
|
|
971 |
|
|
#define FCP_RESID_UNDER 0x80000
|
972 |
|
|
#define FCP_RESID_OVER 0x40000
|
973 |
|
|
#define FCP_SNS_LEN_VALID 0x20000
|
974 |
|
|
#define FCP_RSP_LEN_VALID 0x10000
|
975 |
|
|
|
976 |
|
|
// RSP_CODE definitions (dpANS Fibre Channel Protocol for SCSI, pg 34)
|
977 |
|
|
#define FCP_DATA_LEN_NOT_BURST_LEN 0x1000000
|
978 |
|
|
#define FCP_CMND_FIELD_INVALID 0x2000000
|
979 |
|
|
#define FCP_DATA_RO_NOT_XRDY_RO 0x3000000
|
980 |
|
|
#define FCP_TASKFUNCTION_NS 0x4000000
|
981 |
|
|
#define FCP_TASKFUNCTION_FAIL 0x5000000
|
982 |
|
|
|
983 |
|
|
// FCP-SCSI response status struct
|
984 |
|
|
typedef struct // see "TachFCHDR_RSP" definition - 64 bytes
|
985 |
|
|
{
|
986 |
|
|
__u32 reserved;
|
987 |
|
|
__u32 reserved1;
|
988 |
|
|
__u32 fcp_status; // field validity and SCSI status
|
989 |
|
|
__u32 fcp_resid;
|
990 |
|
|
__u32 fcp_sns_len; // length of FCP_SNS_INFO field
|
991 |
|
|
__u32 fcp_rsp_len; // length of FCP_RSP_INFO field (expect 8)
|
992 |
|
|
__u32 fcp_rsp_info; // 4 bytes of FCP protocol response information
|
993 |
|
|
__u32 fcp_rsp_info2; // (4 more bytes, since most implementations use 8)
|
994 |
|
|
__u8 fcp_sns_info[36]; // bytes for SCSI sense (ASC, ASCQ)
|
995 |
|
|
|
996 |
|
|
} FCP_STATUS_RESPONSE, *PFCP_STATUS_RESPONSE;
|
997 |
|
|
|
998 |
|
|
|
999 |
|
|
// Fabric State Change Registration
|
1000 |
|
|
typedef struct scrpl {
|
1001 |
|
|
__u32 command;
|
1002 |
|
|
__u32 function;
|
1003 |
|
|
} SCR_PL;
|
1004 |
|
|
|
1005 |
|
|
// Fabric Name Service Request
|
1006 |
|
|
typedef struct nsrpl {
|
1007 |
|
|
__u32 CT_Rev; // (& IN_ID) WORD 0
|
1008 |
|
|
__u32 FCS_Type; // WORD 1
|
1009 |
|
|
__u32 Command_code; // WORD 2
|
1010 |
|
|
__u32 reason_code; // WORD 3
|
1011 |
|
|
__u32 FCP; // WORD 4 (lower byte)
|
1012 |
|
|
|
1013 |
|
|
} NSR_PL;
|
1014 |
|
|
|
1015 |
|
|
|
1016 |
|
|
|
1017 |
|
|
// "FC.H"
|
1018 |
|
|
#define MAX_RX_SIZE 0x800 // Max Receive Buffer Size is 2048
|
1019 |
|
|
#define MIN_RX_SIZE 0x100 // Min Size is 256, per FC-PLDA Spec
|
1020 |
|
|
#define MAX_TARGET_RXIDS SEST_DEPTH
|
1021 |
|
|
#define TARGET_RX_SIZE SEST_BUFFER_LENGTH
|
1022 |
|
|
|
1023 |
|
|
#define CLASS_1 0x01
|
1024 |
|
|
#define CLASS_2 0x02
|
1025 |
|
|
#define CLASS_3 0x03
|
1026 |
|
|
|
1027 |
|
|
#define FC_PH42 0x08
|
1028 |
|
|
#define FC_PH43 0x09
|
1029 |
|
|
#define FC_PH3 0x20
|
1030 |
|
|
|
1031 |
|
|
#define RR_TOV 2 // Minimum Time for target to wait for
|
1032 |
|
|
// PDISC after a LIP.
|
1033 |
|
|
#define E_D_TOV 2 // Minimum Time to wait for Sequence
|
1034 |
|
|
// Completion.
|
1035 |
|
|
#define R_A_TOV 0 // Minimum Time for Target to wait
|
1036 |
|
|
// before reclaiming resources.
|
1037 |
|
|
//
|
1038 |
|
|
// R_CTL Field
|
1039 |
|
|
//
|
1040 |
|
|
// Routing Bits (31-28)
|
1041 |
|
|
//
|
1042 |
|
|
#define FC4_DEVICE_DATA 0x00000000
|
1043 |
|
|
#define EXT_LINK_DATA 0x20000000
|
1044 |
|
|
#define FC4_LINK_DATA 0x30000000
|
1045 |
|
|
#define VIDEO_DATA 0x40000000
|
1046 |
|
|
#define BASIC_LINK_DATA 0x80000000
|
1047 |
|
|
#define LINK_CONTROL 0xC0000000
|
1048 |
|
|
#define ROUTING_MASK 0xF0000000
|
1049 |
|
|
|
1050 |
|
|
//
|
1051 |
|
|
// Information Bits (27-24)
|
1052 |
|
|
//
|
1053 |
|
|
#define UNCAT_INFORMATION 0x00000000
|
1054 |
|
|
#define SOLICITED_DATA 0x01000000
|
1055 |
|
|
#define UNSOLICITED_CONTROL 0x02000000
|
1056 |
|
|
#define SOLICITED_CONTROL 0x03000000
|
1057 |
|
|
#define UNSOLICITED_DATA 0x04000000
|
1058 |
|
|
#define DATA_DESCRIPTOR 0x05000000
|
1059 |
|
|
#define UNSOLICITED_COMMAND 0x06000000
|
1060 |
|
|
#define COMMAND_STATUS 0x07000000
|
1061 |
|
|
#define INFO_MASK 0x0F000000
|
1062 |
|
|
//
|
1063 |
|
|
// (Link Control Codes)
|
1064 |
|
|
//
|
1065 |
|
|
#define ACK_1 0x00000000
|
1066 |
|
|
#define ACK_0_OR_N 0x01000000
|
1067 |
|
|
#define P_RJT 0x02000000
|
1068 |
|
|
#define F_RJT 0x03000000
|
1069 |
|
|
#define P_BSY 0x04000000
|
1070 |
|
|
#define FABRIC_BUSY_TO_DF 0x05000000 // Fabric Busy to Data Frame
|
1071 |
|
|
#define FABRIC_BUSY_TO_LC 0x06000000 // Fabric Busy to Link Ctl Frame
|
1072 |
|
|
#define LINK_CREDIT_RESET 0x07000000
|
1073 |
|
|
//
|
1074 |
|
|
// (Link Service Command Codes)
|
1075 |
|
|
//
|
1076 |
|
|
//#define LS_RJT 0x01000000 // LS Reject
|
1077 |
|
|
|
1078 |
|
|
#define LS_ACC 0x02000000 // LS Accept
|
1079 |
|
|
#define LS_PLOGI 0x03000000 // N_PORT Login
|
1080 |
|
|
#define LS_FLOGI 0x04000000 // F_PORT Login
|
1081 |
|
|
#define LS_LOGO 0x05000000 // Logout
|
1082 |
|
|
#define LS_ABTX 0x06000000 // Abort Exchange
|
1083 |
|
|
#define LS_RCS 0x07000000 // Read Connection Status
|
1084 |
|
|
#define LS_RES 0x08000000 // Read Exchange Status
|
1085 |
|
|
#define LS_RSS 0x09000000 // Read Sequence Status
|
1086 |
|
|
#define LS_RSI 0x0A000000 // Request Seq Initiative
|
1087 |
|
|
#define LS_ESTS 0x0B000000 // Establish Steaming
|
1088 |
|
|
#define LS_ESTC 0x0C000000 // Estimate Credit
|
1089 |
|
|
#define LS_ADVC 0x0D000000 // Advice Credit
|
1090 |
|
|
#define LS_RTV 0x0E000000 // Read Timeout Value
|
1091 |
|
|
#define LS_RLS 0x0F000000 // Read Link Status
|
1092 |
|
|
#define LS_ECHO 0x10000000 // Echo
|
1093 |
|
|
#define LS_TEST 0x11000000 // Test
|
1094 |
|
|
#define LS_RRQ 0x12000000 // Reinstate Rec. Qual.
|
1095 |
|
|
#define LS_PRLI 0x20000000 // Process Login
|
1096 |
|
|
#define LS_PRLO 0x21000000 // Process Logout
|
1097 |
|
|
#define LS_TPRLO 0x24000000 // 3rd Party Process Logout
|
1098 |
|
|
#define LS_PDISC 0x50000000 // Process Discovery
|
1099 |
|
|
#define LS_FDISC 0x51000000 // Fabric Discovery
|
1100 |
|
|
#define LS_ADISC 0x52000000 // Discover Address
|
1101 |
|
|
#define LS_RNC 0x53000000 // Report Node Capability
|
1102 |
|
|
#define LS_SCR 0x62000000 // State Change Registration
|
1103 |
|
|
#define LS_MASK 0xFF000000
|
1104 |
|
|
|
1105 |
|
|
//
|
1106 |
|
|
// TYPE Bit Masks
|
1107 |
|
|
//
|
1108 |
|
|
#define BASIC_LINK_SERVICE 0x00000000
|
1109 |
|
|
#define EXT_LINK_SERVICE 0x01000000
|
1110 |
|
|
|
1111 |
|
|
#define LLC 0x04000000
|
1112 |
|
|
#define LLC_SNAP 0x05000000
|
1113 |
|
|
#define SCSI_FCP 0x08000000
|
1114 |
|
|
#define SCSI_GPP 0x09000000
|
1115 |
|
|
#define IPI3_MASTER 0x11000000
|
1116 |
|
|
#define IPI3_SLAVE 0x12000000
|
1117 |
|
|
#define IPI3_PEER 0x13000000
|
1118 |
|
|
#define CP_IPI3_MASTER 0x15000000
|
1119 |
|
|
#define CP_IPI3_SLAVE 0x16000000
|
1120 |
|
|
#define CP_IPI3_PEER 0x17000000
|
1121 |
|
|
#define SBCCS_CHANNEL 0x19000000
|
1122 |
|
|
#define SBCCS_CONTROL 0x1A000000
|
1123 |
|
|
#define FIBRE_SERVICES 0x20000000
|
1124 |
|
|
#define FC_FG 0x21000000
|
1125 |
|
|
#define FC_XS 0x22000000
|
1126 |
|
|
#define FC_AL 0x23000000
|
1127 |
|
|
#define SNMP 0x24000000
|
1128 |
|
|
#define HIPPI_FP 0x40000000
|
1129 |
|
|
#define TYPE_MASK 0xFF000000
|
1130 |
|
|
|
1131 |
|
|
typedef struct {
|
1132 |
|
|
__u8 seq_id_valid;
|
1133 |
|
|
__u8 seq_id;
|
1134 |
|
|
__u16 reserved; // 2 bytes reserved
|
1135 |
|
|
__u32 ox_rx_id;
|
1136 |
|
|
__u16 low_seq_cnt;
|
1137 |
|
|
__u16 high_seq_cnt;
|
1138 |
|
|
} BA_ACC_PAYLOAD;
|
1139 |
|
|
|
1140 |
|
|
typedef struct {
|
1141 |
|
|
__u8 reserved;
|
1142 |
|
|
__u8 reason_code;
|
1143 |
|
|
__u8 reason_explain;
|
1144 |
|
|
__u8 vendor_unique;
|
1145 |
|
|
} BA_RJT_PAYLOAD;
|
1146 |
|
|
|
1147 |
|
|
|
1148 |
|
|
typedef struct {
|
1149 |
|
|
__u32 command_code;
|
1150 |
|
|
__u32 sid;
|
1151 |
|
|
__u16 ox_id;
|
1152 |
|
|
__u16 rx_id;
|
1153 |
|
|
} RRQ_MESSAGE;
|
1154 |
|
|
|
1155 |
|
|
typedef struct {
|
1156 |
|
|
__u32 command_code;
|
1157 |
|
|
__u8 vendor;
|
1158 |
|
|
__u8 explain;
|
1159 |
|
|
__u8 reason;
|
1160 |
|
|
__u8 reserved;
|
1161 |
|
|
} REJECT_MESSAGE;
|
1162 |
|
|
|
1163 |
|
|
|
1164 |
|
|
#define N_OR_F_PORT 0x1000
|
1165 |
|
|
#define RANDOM_RELATIVE_OFFSET 0x4000
|
1166 |
|
|
#define CONTINUOSLY_INCREASING 0x8000
|
1167 |
|
|
|
1168 |
|
|
#define CLASS_VALID 0x8000
|
1169 |
|
|
#define INTERMIX_MODE 0x4000
|
1170 |
|
|
#define TRANSPARENT_STACKED 0x2000
|
1171 |
|
|
#define LOCKDOWN_STACKED 0x1000
|
1172 |
|
|
#define SEQ_DELIVERY 0x800
|
1173 |
|
|
|
1174 |
|
|
#define XID_NOT_SUPPORTED 0x00
|
1175 |
|
|
#define XID_SUPPORTED 0x4000
|
1176 |
|
|
#define XID_REQUIRED 0xC000
|
1177 |
|
|
|
1178 |
|
|
#define ASSOCIATOR_NOT_SUPPORTED 0x00
|
1179 |
|
|
#define ASSOCIATOR_SUPPORTED 0x1000
|
1180 |
|
|
#define ASSOCIATOR_REQUIRED 0x3000
|
1181 |
|
|
|
1182 |
|
|
#define INIT_ACK0_SUPPORT 0x800
|
1183 |
|
|
#define INIT_ACKN_SUPPORT 0x400
|
1184 |
|
|
|
1185 |
|
|
#define RECIP_ACK0_SUPPORT 0x8000
|
1186 |
|
|
#define RECIP_ACKN_SUPPORT 0x4000
|
1187 |
|
|
|
1188 |
|
|
#define X_ID_INTERLOCK 0x2000
|
1189 |
|
|
|
1190 |
|
|
#define ERROR_POLICY 0x1800 // Error Policy Supported
|
1191 |
|
|
#define ERROR_DISCARD 0x00 // Only Discard Supported
|
1192 |
|
|
#define ERROR_DISC_PROCESS 0x02 // Discard and process supported
|
1193 |
|
|
|
1194 |
|
|
#define NODE_ID 0x01
|
1195 |
|
|
#define IEEE_EXT 0x20
|
1196 |
|
|
|
1197 |
|
|
//
|
1198 |
|
|
// Categories Supported Per Sequence
|
1199 |
|
|
//
|
1200 |
|
|
#define CATEGORIES_PER_SEQUENCE 0x300
|
1201 |
|
|
#define ONE_CATEGORY_SEQUENCE 0x00 // 1 Category per Sequence
|
1202 |
|
|
#define TWO_CATEGORY_SEQUENCE 0x01 // 2 Categories per Sequence
|
1203 |
|
|
#define MANY_CATEGORY_SEQUENCE 0x03 // > 2 Categories/Sequence
|
1204 |
|
|
|
1205 |
|
|
typedef struct {
|
1206 |
|
|
|
1207 |
|
|
__u16 initiator_control;
|
1208 |
|
|
__u16 service_options;
|
1209 |
|
|
|
1210 |
|
|
__u16 rx_data_size;
|
1211 |
|
|
__u16 recipient_control;
|
1212 |
|
|
|
1213 |
|
|
__u16 ee_credit;
|
1214 |
|
|
__u16 concurrent_sequences;
|
1215 |
|
|
|
1216 |
|
|
__u16 reserved;
|
1217 |
|
|
__u16 open_sequences;
|
1218 |
|
|
|
1219 |
|
|
} CLASS_PARAMETERS;
|
1220 |
|
|
|
1221 |
|
|
typedef struct {
|
1222 |
|
|
__u32 login_cmd;
|
1223 |
|
|
//
|
1224 |
|
|
// Common Service Parameters
|
1225 |
|
|
//
|
1226 |
|
|
struct {
|
1227 |
|
|
|
1228 |
|
|
__u16 bb_credit;
|
1229 |
|
|
__u8 lowest_ver;
|
1230 |
|
|
__u8 highest_ver;
|
1231 |
|
|
|
1232 |
|
|
__u16 bb_rx_size;
|
1233 |
|
|
__u16 common_features;
|
1234 |
|
|
|
1235 |
|
|
__u16 rel_offset;
|
1236 |
|
|
__u16 concurrent_seq;
|
1237 |
|
|
|
1238 |
|
|
|
1239 |
|
|
__u32 e_d_tov;
|
1240 |
|
|
} cmn_services;
|
1241 |
|
|
|
1242 |
|
|
//
|
1243 |
|
|
// Port Name
|
1244 |
|
|
//
|
1245 |
|
|
__u8 port_name[8];
|
1246 |
|
|
|
1247 |
|
|
//
|
1248 |
|
|
// Node/Fabric Name
|
1249 |
|
|
//
|
1250 |
|
|
__u8 node_name[8];
|
1251 |
|
|
|
1252 |
|
|
//
|
1253 |
|
|
// Class 1, 2 and 3 Service Parameters
|
1254 |
|
|
//
|
1255 |
|
|
CLASS_PARAMETERS class1;
|
1256 |
|
|
CLASS_PARAMETERS class2;
|
1257 |
|
|
CLASS_PARAMETERS class3;
|
1258 |
|
|
|
1259 |
|
|
__u32 reserved[4];
|
1260 |
|
|
|
1261 |
|
|
//
|
1262 |
|
|
// Vendor Version Level
|
1263 |
|
|
//
|
1264 |
|
|
__u8 vendor_id[2];
|
1265 |
|
|
__u8 vendor_version[6];
|
1266 |
|
|
__u32 buffer_size;
|
1267 |
|
|
__u16 rxid_start;
|
1268 |
|
|
__u16 total_rxids;
|
1269 |
|
|
} LOGIN_PAYLOAD;
|
1270 |
|
|
|
1271 |
|
|
|
1272 |
|
|
typedef struct {
|
1273 |
|
|
__u32 cmd; // 4 bytes
|
1274 |
|
|
__u8 n_port_identifier[3];
|
1275 |
|
|
__u8 reserved;
|
1276 |
|
|
__u8 port_name[8];
|
1277 |
|
|
} LOGOUT_PAYLOAD;
|
1278 |
|
|
|
1279 |
|
|
|
1280 |
|
|
//
|
1281 |
|
|
// PRLI Request Service Parameter Defines
|
1282 |
|
|
//
|
1283 |
|
|
#define PRLI_ACC 0x01
|
1284 |
|
|
#define PRLI_REQ 0x02
|
1285 |
|
|
#define ORIG_PROCESS_ASSOC_VALID 0x8000
|
1286 |
|
|
#define RESP_PROCESS_ASSOC_VALID 0x4000
|
1287 |
|
|
#define ESTABLISH_PAIR 0x2000
|
1288 |
|
|
#define DATA_OVERLAY_ALLOWED 0x40
|
1289 |
|
|
#define INITIATOR_FUNCTION 0x20
|
1290 |
|
|
#define TARGET_FUNCTION 0x10
|
1291 |
|
|
#define CMD_DATA_MIXED 0x08
|
1292 |
|
|
#define DATA_RESP_MIXED 0x04
|
1293 |
|
|
#define READ_XFER_RDY 0x02
|
1294 |
|
|
#define WRITE_XFER_RDY 0x01
|
1295 |
|
|
|
1296 |
|
|
#define RESPONSE_CODE_MASK 0xF00
|
1297 |
|
|
#define REQUEST_EXECUTED 0x100
|
1298 |
|
|
#define NO_RESOURCES 0x200
|
1299 |
|
|
#define INIT_NOT_COMPLETE 0x300
|
1300 |
|
|
#define IMAGE_DOES_NOT_EXIST 0x400
|
1301 |
|
|
#define BAD_PREDEFINED_COND 0x500
|
1302 |
|
|
#define REQ_EXEC_COND 0x600
|
1303 |
|
|
#define NO_MULTI_PAGE 0x700
|
1304 |
|
|
|
1305 |
|
|
typedef struct {
|
1306 |
|
|
__u16 payload_length;
|
1307 |
|
|
__u8 page_length;
|
1308 |
|
|
__u8 cmd;
|
1309 |
|
|
|
1310 |
|
|
|
1311 |
|
|
__u32 valid;
|
1312 |
|
|
|
1313 |
|
|
__u32 orig_process_associator;
|
1314 |
|
|
|
1315 |
|
|
__u32 resp_process_associator;
|
1316 |
|
|
|
1317 |
|
|
__u32 fcp_info;
|
1318 |
|
|
} PRLI_REQUEST;
|
1319 |
|
|
|
1320 |
|
|
typedef struct {
|
1321 |
|
|
|
1322 |
|
|
__u16 payload_length;
|
1323 |
|
|
__u8 page_length;
|
1324 |
|
|
__u8 cmd;
|
1325 |
|
|
|
1326 |
|
|
__u32 valid;
|
1327 |
|
|
__u32 orig_process_associator;
|
1328 |
|
|
|
1329 |
|
|
__u32 resp_process_associator;
|
1330 |
|
|
__u32 reserved;
|
1331 |
|
|
} PRLO_REQUEST;
|
1332 |
|
|
|
1333 |
|
|
typedef struct {
|
1334 |
|
|
__u32 cmd;
|
1335 |
|
|
|
1336 |
|
|
__u32 hard_address;
|
1337 |
|
|
|
1338 |
|
|
__u8 port_name[8];
|
1339 |
|
|
|
1340 |
|
|
__u8 node_name[8];
|
1341 |
|
|
|
1342 |
|
|
__u32 s_id;
|
1343 |
|
|
} ADISC_PAYLOAD;
|
1344 |
|
|
|
1345 |
|
|
struct ext_sg_entry_t {
|
1346 |
|
|
__u32 len:18; /* buffer length, bits 0-17 */
|
1347 |
|
|
__u32 uba:13; /* upper bus address bits 18-31 */
|
1348 |
|
|
__u32 lba; /* lower bus address bits 0-31 */
|
1349 |
|
|
};
|
1350 |
|
|
|
1351 |
|
|
// J. McCarty's LINK.H
|
1352 |
|
|
//
|
1353 |
|
|
// LS_RJT Reason Codes
|
1354 |
|
|
//
|
1355 |
|
|
|
1356 |
|
|
#define INVALID_COMMAND_CODE 0x01
|
1357 |
|
|
#define LOGICAL_ERROR 0x03
|
1358 |
|
|
#define LOGICAL_BUSY 0x05
|
1359 |
|
|
#define PROTOCOL_ERROR 0x07
|
1360 |
|
|
#define UNABLE_TO_PERFORM 0x09
|
1361 |
|
|
#define COMMAND_NOT_SUPPORTED 0x0B
|
1362 |
|
|
#define LS_VENDOR_UNIQUE 0xFF
|
1363 |
|
|
|
1364 |
|
|
//
|
1365 |
|
|
// LS_RJT Reason Codes Explanations
|
1366 |
|
|
//
|
1367 |
|
|
#define NO_REASON 0x00
|
1368 |
|
|
#define OPTIONS_ERROR 0x01
|
1369 |
|
|
#define INITIATOR_CTL_ERROR 0x03
|
1370 |
|
|
#define RECIPIENT_CTL_ERROR 0x05
|
1371 |
|
|
#define DATA_FIELD_SIZE_ERROR 0x07
|
1372 |
|
|
#define CONCURRENT_SEQ_ERROR 0x09
|
1373 |
|
|
#define CREDIT_ERROR 0x0B
|
1374 |
|
|
#define INVALID_PORT_NAME 0x0D
|
1375 |
|
|
#define INVALID_NODE_NAME 0x0E
|
1376 |
|
|
#define INVALID_CSP 0x0F // Invalid Service Parameters
|
1377 |
|
|
#define INVALID_ASSOC_HDR 0x11 // Invalid Association Header
|
1378 |
|
|
#define ASSOC_HDR_REQUIRED 0x13 // Association Header Required
|
1379 |
|
|
#define LS_INVALID_S_ID 0x15
|
1380 |
|
|
#define INVALID_OX_RX_ID 0x17 // Invalid OX_ID RX_ID Combination
|
1381 |
|
|
#define CMD_IN_PROCESS 0x19
|
1382 |
|
|
#define INVALID_IDENTIFIER 0x1F // Invalid N_PORT Identifier
|
1383 |
|
|
#define INVALID_SEQ_ID 0x21
|
1384 |
|
|
#define ABT_INVALID_XCHNG 0x23 // Attempt to Abort an invalid Exchange
|
1385 |
|
|
#define ABT_INACTIVE_XCHNG 0x25 // Attempt to Abort an inactive Exchange
|
1386 |
|
|
#define NEED_REC_QUAL 0x27 // Recovery Qualifier required
|
1387 |
|
|
#define NO_LOGIN_RESOURCES 0x29 // No resources to support login
|
1388 |
|
|
#define NO_DATA 0x2A // Unable to supply requested data
|
1389 |
|
|
#define REQUEST_NOT_SUPPORTED 0x2C // Request Not Supported
|
1390 |
|
|
|
1391 |
|
|
//
|
1392 |
|
|
// Link Control Codes
|
1393 |
|
|
//
|
1394 |
|
|
|
1395 |
|
|
//
|
1396 |
|
|
// P_BSY Action Codes
|
1397 |
|
|
//
|
1398 |
|
|
#define SEQUENCE_TERMINATED 0x01000000
|
1399 |
|
|
#define SEQUENCE_ACTIVE 0x02000000
|
1400 |
|
|
|
1401 |
|
|
//
|
1402 |
|
|
// P_BSY Reason Codes
|
1403 |
|
|
//
|
1404 |
|
|
#define PHYS_NPORT_BUSY 0x010000
|
1405 |
|
|
#define NPORT_RESOURCE_BUSY 0x020000
|
1406 |
|
|
|
1407 |
|
|
//
|
1408 |
|
|
// P_RJT, F_RJT Action Codes
|
1409 |
|
|
//
|
1410 |
|
|
|
1411 |
|
|
#define RETRYABLE_ERROR 0x01000000
|
1412 |
|
|
#define NON_RETRYABLE_ERROR 0x02000000
|
1413 |
|
|
|
1414 |
|
|
//
|
1415 |
|
|
// P_RJT, F_RJT Reason Codes
|
1416 |
|
|
//
|
1417 |
|
|
#define INVALID_D_ID 0x010000
|
1418 |
|
|
#define INVALID_S_ID 0x020000
|
1419 |
|
|
#define NPORT_NOT_AVAIL_TMP 0x030000
|
1420 |
|
|
#define NPORT_NOT_AVAIL_PERM 0x040000
|
1421 |
|
|
#define CLASS_NOT_SUPPORTED 0x050000
|
1422 |
|
|
#define USAGE_ERROR 0x060000
|
1423 |
|
|
#define TYPE_NOT_SUPPORTED 0x070000
|
1424 |
|
|
#define INVAL_LINK_CONTROL 0x080000
|
1425 |
|
|
#define INVAL_R_CTL 0x090000
|
1426 |
|
|
#define INVAL_F_CTL 0x0A0000
|
1427 |
|
|
#define INVAL_OX_ID 0x0B0000
|
1428 |
|
|
#define INVAL_RX_ID 0x0C0000
|
1429 |
|
|
#define INVAL_SEQ_ID 0x0D0000
|
1430 |
|
|
#define INVAL_DF_CTL 0x0E0000
|
1431 |
|
|
#define INVAL_SEQ_CNT 0x0F0000
|
1432 |
|
|
#define INVAL_PARAMS 0x100000
|
1433 |
|
|
#define EXCHANGE_ERROR 0x110000
|
1434 |
|
|
#define LS_PROTOCOL_ERROR 0x120000
|
1435 |
|
|
#define INCORRECT_LENGTH 0x130000
|
1436 |
|
|
#define UNEXPECTED_ACK 0x140000
|
1437 |
|
|
#define LOGIN_REQ 0x160000
|
1438 |
|
|
#define EXCESSIVE_SEQ 0x170000
|
1439 |
|
|
#define NO_EXCHANGE 0x180000
|
1440 |
|
|
#define SEC_HDR_NOT_SUPPORTED 0x190000
|
1441 |
|
|
#define NO_FABRIC 0x1A0000
|
1442 |
|
|
#define P_VENDOR_UNIQUE 0xFF0000
|
1443 |
|
|
|
1444 |
|
|
//
|
1445 |
|
|
// BA_RJT Reason Codes
|
1446 |
|
|
//
|
1447 |
|
|
#define BA_INVALID_COMMAND 0x00010000
|
1448 |
|
|
#define BA_LOGICAL_ERROR 0x00030000
|
1449 |
|
|
#define BA_LOGICAL_BUSY 0x00050000
|
1450 |
|
|
#define BA_PROTOCOL_ERROR 0x00070000
|
1451 |
|
|
#define BA_UNABLE_TO_PERFORM 0x00090000
|
1452 |
|
|
|
1453 |
|
|
//
|
1454 |
|
|
// BA_RJT Reason Explanation Codes
|
1455 |
|
|
//
|
1456 |
|
|
#define BA_NO_REASON 0x00000000
|
1457 |
|
|
#define BA_INVALID_OX_RX 0x00000300
|
1458 |
|
|
#define BA_SEQUENCE_ABORTED 0x00000500
|
1459 |
|
|
|
1460 |
|
|
|
1461 |
|
|
|
1462 |
|
|
#endif /* CPQFCTSSTRUCTS_H */
|