ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / drivers / net / fc / tach_structs.h
1 /**********************************************************************
2  * iph5526.c: Structures for the Interphase 5526 PCI Fibre Channel 
3  *                        IP/SCSI driver.
4  * Copyright (C) 1999 Vineet M Abraham <vmabraham@hotmail.com>
5  **********************************************************************/
6
7 #ifndef _TACH_STRUCT_H
8 #define _TACH_STRUCT_H
9
10 typedef struct {
11         u_short cmnd_code;
12         u_short payload_length;
13         u_short type_code;
14         u_short est_image_pair;
15         u_int originator_pa;
16         u_int responder_pa;
17         u_int service_params;
18 } PRLI;
19
20 typedef struct {
21         u_int flags_and_byte_offset;
22         u_int byte_count;
23         u_short no_of_recvd_frames;
24         u_short no_of_expected_frames;
25         u_int last_fctl;
26         u_int sdb_address;
27         u_int scratch_pad;
28         u_int expected_ro;
29         u_short buffer_index;
30         u_short buffer_offset;
31         } INB_SEST_ENTRY;
32
33 typedef struct {
34         u_int flags_and_did;
35         u_short max_frame_len;
36         u_short cntl;
37         u_int total_seq_length;
38         u_short link;
39         u_short rx_id;
40         u_int transaction_id;
41         u_int header_address;
42         u_char seq_id;
43         u_char reserved;
44         u_short header_length;
45         u_int edb_address;
46         } OUTB_SEST_ENTRY;
47
48 typedef struct {
49         u_short d_naa;
50         u_short dest_high;
51         u_int dest_low;
52         u_short s_naa;
53         u_short source_high;
54         u_int source_low;
55         } NW_HEADER;
56
57 typedef struct {
58         u_int resv;
59         u_char sof_and_eof;
60         u_char dest_alpa;
61         u_short lcr_and_time_stamp;
62         u_int r_ctl_and_d_id;
63         u_int vc_id_and_s_id;
64         u_int type_and_f_cntl;
65         u_char seq_id;
66         u_char df_cntl;
67         u_short seq_cnt;
68         u_short ox_id;
69         u_short rx_id;
70         u_int ro;
71         NW_HEADER nw_header;
72         } TACHYON_HEADER;
73
74 typedef struct {
75         u_short service_options;
76         u_short initiator_ctl;
77         u_short recipient_ctl;
78         u_short recv_data_field_size;
79         u_short concurrent_sequences;
80         u_short n_port_end_to_end_credit;
81         u_short open_seq_per_exchange;
82         u_short resv;
83         }CLASS_OF_SERVICE;
84
85 typedef struct {
86         u_int logo_cmnd;
87         u_char reserved;
88         u_char n_port_id_2;
89         u_char n_port_id_1;
90         u_char n_port_id_0;
91         u_int port_name_up;
92         u_int port_name_low;
93         } LOGO;
94
95 typedef struct {
96         u_int ls_cmnd_code;
97         u_int hard_address;
98         u_int port_name_high;
99         u_int port_name_low;
100         u_int node_name_high;
101         u_int node_name_low;
102         u_int n_port_id;
103         } ADISC;
104         
105 typedef struct {
106         u_int cmnd_code;
107         u_int reason_code;
108         } LS_RJT;
109
110 typedef struct {
111         u_int cmnd_code;
112         } ACC;
113
114 typedef struct  {
115         u_int seq_d_id;
116         u_int tot_len;
117         u_short cntl;
118         u_short rx_id;
119         u_short cs_enable;
120         u_short cs_seed;
121         u_int trans_id;
122         u_int hdr_addr;
123         u_short frame_len;
124         u_short hdr_len;
125         u_int edb_addr;
126         }ODB;
127
128 typedef struct {
129         u_int cmnd_code;
130         u_int reg_function; /* in the last byte */
131         } SCR;
132
133 typedef struct {
134         u_int rev_in_id;
135         u_char fs_type;
136         u_char fs_subtype;
137         u_char options;
138         u_char resv1;
139         u_short cmnd_resp_code;
140         u_short max_res_size;
141         u_char resv2;
142         u_char reason_code;
143         u_char expln_code;
144         u_char vendor_unique;
145         } CT_HDR;
146
147 typedef struct {
148         CT_HDR   ct_hdr;
149         u_int s_id;
150         u_char bit_map[32]; /* 32 byte bit map */
151         } RFC_4;
152
153 typedef struct {
154         u_int ls_cmnd_code;
155         u_short fc_ph_version;
156         u_short buff_to_buff_credit;
157         u_short common_features;
158         u_short recv_data_field_size;
159         u_short n_port_total_conc_seq;
160         u_short rel_off_by_info_cat;
161         u_int ED_TOV;
162         u_int n_port_name_high;
163         u_int n_port_name_low;
164         u_int node_name_high;
165         u_int node_name_low;
166         CLASS_OF_SERVICE c_of_s[3];
167         u_int resv[4];
168         u_int vendor_version_level[4];
169         }LOGIN;
170
171 typedef struct {
172         CT_HDR   ct_hdr;
173         u_int port_type; /* in the first byte */
174         } GP_ID4;
175
176 typedef struct  {
177         u_int   buf_addr;
178         u_short ehf;
179         u_short buf_len;
180         }EDB;
181
182 /* (i)chip Registers */
183 struct i_chip_regs {
184         u_int   ptr_ichip_hw_control_reg;
185         u_int   ptr_ichip_hw_status_reg;
186         u_int   ptr_ichip_hw_addr_mask_reg;
187 };
188
189 struct iph5526_novram {
190         u_int   ptr_novram_hw_control_reg;
191         u_int   ptr_novram_hw_status_reg;
192         u_short data[IPH5526_NOVRAM_SIZE];
193 };
194
195 /* Tachyon Registers */
196 struct tachyon_regs {
197         u_int    ptr_ocq_base_reg;
198         u_int    ptr_ocq_len_reg;
199         u_int    ptr_ocq_prod_indx_reg;
200         u_int    ptr_ocq_cons_indx_reg;
201
202         u_int    ptr_imq_base_reg;
203         u_int    ptr_imq_len_reg;
204         u_int    ptr_imq_cons_indx_reg;
205         u_int    ptr_imq_prod_indx_reg;
206
207         u_int    ptr_mfsbq_base_reg;
208         u_int    ptr_mfsbq_len_reg;
209         u_int    ptr_mfsbq_prod_reg;
210         u_int    ptr_mfsbq_cons_reg;
211         u_int    ptr_mfsbuff_len_reg;
212
213         u_int    ptr_sfsbq_base_reg;
214         u_int    ptr_sfsbq_len_reg;
215         u_int    ptr_sfsbq_prod_reg;
216         u_int    ptr_sfsbq_cons_reg;
217         u_int    ptr_sfsbuff_len_reg;
218
219         u_int    ptr_sest_base_reg;
220         u_int    ptr_sest_len_reg;
221         u_int    ptr_scsibuff_len_reg;
222
223         u_int    ptr_tach_config_reg;
224         u_int    ptr_tach_control_reg;
225         u_int    ptr_tach_status_reg;
226         u_int    ptr_tach_flush_oxid_reg;
227
228         u_int    ptr_fm_config_reg;
229         u_int    ptr_fm_control_reg;
230         u_int    ptr_fm_status_reg;
231         u_int    ptr_fm_tov_reg;
232         u_int    ptr_fm_wwn_hi_reg;
233         u_int    ptr_fm_wwn_low_reg;
234         u_int    ptr_fm_rx_al_pa_reg;
235 };
236
237 struct globals {
238         u_long tachyon_base;
239         u_int *mem_base;
240         u_short ox_id; /* OX_ID used for IP and ELS frames */
241         u_short scsi_oxid; /* OX_ID for SEST entry */
242         u_char seq_id;
243         u_int my_id;
244         u_int my_ddaa; /* my domain and area in a fabric */
245         volatile u_char loop_up;
246         volatile u_char ptp_up; /* we have a point-to-point link */
247         volatile u_char link_up;
248         volatile u_char n_port_try;
249         volatile u_char nport_timer_set;
250         volatile u_char lport_timer_set;
251         /* Hmmm... We don't want to Initialize while closing */
252         u_char dont_init; 
253         u_int my_node_name_high;
254         u_int my_node_name_low;
255         u_int my_port_name_high;
256         u_int my_port_name_low;
257         u_char fabric_present;
258         u_char explore_fabric;
259         u_char name_server;  
260         u_int my_mtu;
261         u_int *els_buffer[MAX_PENDING_FRAMES]; /* temp space for ELS frames */
262         char *arp_buffer; /* temp space for ARP frames */
263         u_int mfs_buffer_count; /* keep track of MFS buffers used*/
264         u_char scsi_registered;
265         /* variables for port discovery */
266         volatile u_char port_discovery;
267         volatile u_char perform_adisc;
268         u_short alpa_list_index;
269         u_short type_of_frame; /* Could be IP/SCSI Read/SCSI Write*/    
270         u_char no_of_targets; /* used to assign target_ids */
271         u_long sem; /* to synchronize between IP and SCSI */
272         u_char e_i;
273
274         /* the frames */
275         TACHYON_HEADER tach_header;
276         LOGIN login;
277         PRLI prli;
278         LOGO logo;
279         ADISC adisc;
280         LS_RJT ls_rjt;
281         ODB     odb;
282         INB_SEST_ENTRY inb_sest_entry;
283         OUTB_SEST_ENTRY outb_sest_entry;
284         ACC     acc;
285         SCR     scr;
286         EDB     edb;
287         RFC_4 rfc_4;
288         GP_ID4 gp_id4;
289 };
290
291 struct queue_variables {
292         /* Indices maintained in host memory.
293          */
294         u_int *host_ocq_cons_indx, *host_hpcq_cons_indx, *host_imq_prod_indx;
295         u_int *ptr_host_ocq_cons_indx, *ptr_host_hpcq_cons_indx, *ptr_host_imq_prod_indx;
296
297         /* Variables for Outbound Command Queue (OCQ).
298          */
299         u_int *ptr_ocq_base;
300         u_int ocq_len, ocq_end;
301         u_int ocq_prod_indx;
302         u_int *ptr_odb[OCQ_LENGTH];
303
304         /* Variables for Inbound Message Queue (IMQ).
305          */
306         u_int *ptr_imq_base;
307         u_int imq_len, imq_end;
308         u_int imq_cons_indx;
309         u_int imq_prod_indx;
310         u_int *ptr_imqe[IMQ_LENGTH];
311
312         u_int *ptr_mfsbq_base;
313         u_int mfsbq_len, mfsbq_end;
314         u_int mfsbq_prod_indx;
315         u_int mfsbq_cons_indx;
316         u_int mfsbuff_len, mfsbuff_end;
317
318         u_int *ptr_sfsbq_base;
319         u_int sfsbq_len, sfsbq_end;
320         u_int sfsbq_prod_indx;
321         u_int sfsbq_cons_indx;
322         u_int sfsbuff_len, sfsbuff_end;
323         u_int *ptr_sfs_buffers[SFSBQ_LENGTH * NO_OF_ENTRIES];
324
325         /* Tables for SCSI Transactions */
326         u_int *ptr_sest_base;
327         u_int *ptr_sest[SEST_LENGTH];
328         u_char free_scsi_oxid[SEST_LENGTH];
329         u_int *ptr_sdb_base;
330         u_int *ptr_sdb_slot[NO_OF_SDB_ENTRIES];
331         u_char sdb_slot_status[NO_OF_SDB_ENTRIES];
332         u_int sdb_indx;
333         u_int *ptr_fcp_cmnd_base;
334         u_int *ptr_fcp_cmnd[NO_OF_FCP_CMNDS];
335         u_int fcp_cmnd_indx;
336
337         /* Table for data to be transmitted.
338          */
339         u_int *ptr_edb_base;
340         u_int *ptr_edb[EDB_LEN];
341         u_int edb_buffer_indx;
342         volatile u_char free_edb_list[EDB_LEN];
343
344         /* Table of Tachyon Headers.
345          */
346         u_int *ptr_tachyon_header[NO_OF_TACH_HEADERS];
347         u_int *ptr_tachyon_header_base;
348         u_int tachyon_header_indx;
349 };
350
351 /* Used to match incoming ACCs to ELS requests sent out */
352 struct ox_id_els_map {
353         u_short ox_id;
354         u_int els;
355         struct ox_id_els_map *next;
356 };
357
358
359 /* Carries info about individual nodes... stores the info got at login 
360  * time. Also maintains mapping between MAC->FC addresses 
361  */
362 struct fc_node_info {
363         /* Itz the WWN (8 bytes), the last 6 bytes is the MAC address */
364         u_char hw_addr[PORT_NAME_LEN]; 
365         u_char node_name[NODE_NAME_LEN]; 
366         u_int d_id;  /*real FC address, 3 bytes */
367         int mtu;
368         /* login = 1 if login attempted
369          * login = 2 if login completed 
370          */
371         int login;    
372         u_char scsi; /*  = 1 if device is a SCSI Target */
373         u_char target_id;
374         CLASS_OF_SERVICE c_of_s[3];
375         struct fc_node_info *next;
376 };
377
378 struct fc_info {
379         char name[8];
380         u_long base_addr;
381         int irq;
382         struct net_device_stats fc_stats;
383         struct fc_node_info *node_info_list;
384         int num_nodes;
385         struct ox_id_els_map *ox_id_list;
386         struct i_chip_regs i_r;
387         struct tachyon_regs t_r;
388         struct queue_variables q;
389         struct globals g;
390         struct iph5526_novram n_r;
391         u_short clone_id;
392         struct timer_list nport_timer;
393         struct timer_list lport_timer;
394         struct timer_list explore_timer;
395         struct timer_list display_cache_timer;
396         struct net_device *dev;
397         struct Scsi_Host *host;
398         spinlock_t fc_lock;
399 };
400
401 struct iph5526_hostdata {
402         struct fc_info *fi;
403         fcp_cmd cmnd;
404         Scsi_Cmnd *cmnd_handler[SEST_LENGTH];
405         u_int tag_ages[MAX_SCSI_TARGETS];
406 };
407
408 /* List of valid AL_PAs */
409 u_char alpa_list[127] = { 
410         0x00, 0x01, 0x02, 0x04, 0x08, 0x0F, 0x10, 0x17, 
411         0x18, 0x1B, 0x1D, 0x1E, 0x1F, 0x23, 0x25, 0x26, 
412         0x27, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x31, 
413         0x32, 0x33, 0x34, 0x35, 0x36, 0x39, 0x3A, 0x3C, 
414         0x43, 0x45, 0x46, 0x47, 0x49, 0x4A, 0x4B, 0x4C, 
415         0x4D, 0x4E, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 
416         0x59, 0x5A, 0x5C, 0x63, 0x65, 0x66, 0x67, 0x69, 
417         0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x71, 0x72, 0x73, 
418         0x74, 0x75, 0x76, 0x79, 0x7A, 0x7C, 0x80, 0x81, 
419         0x82, 0x84, 0x88, 0x8F, 0x90, 0x97, 0x98, 0x9B, 
420         0x9D, 0x9E, 0x9F, 0xA3, 0xA5, 0xA6, 0xA7, 0xA9, 
421         0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xB1, 0xB2, 0xB3, 
422         0xB4, 0xB5, 0xB6, 0xB9, 0xBA, 0xBC, 0xC3, 0xC5, 
423         0xC6, 0xC7, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 
424         0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD9, 0xDA, 
425         0xDC, 0xE0, 0xE1, 0xE2, 0xE4, 0xE8, 0xEF
426 };
427
428 #endif /* _TACH_STRUCT_H */