Linux Audio

Check our new training course

Embedded Linux Audio

Check our new training course
with Creative Commons CC-BY-SA
lecture materials

Bootlin logo

Elixir Cross Referencer

Loading...
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
/**********************************************************************
 * iph5526.c: Structures for the Interphase 5526 PCI Fibre Channel 
 *			  IP/SCSI driver.
 * Copyright (C) 1999 Vineet M Abraham <vmabraham@hotmail.com>
 **********************************************************************/

#ifndef _TACH_STRUCT_H
#define _TACH_STRUCT_H

typedef struct {
	u_short cmnd_code;
	u_short payload_length;
	u_short type_code;
	u_short est_image_pair;
	u_int originator_pa;
	u_int responder_pa;
	u_int service_params;
} PRLI;

typedef struct {
	u_int flags_and_byte_offset;
	u_int byte_count;
	u_short no_of_recvd_frames;
	u_short no_of_expected_frames;
	u_int last_fctl;
	u_int sdb_address;
	u_int scratch_pad;
	u_int expected_ro;
	u_short buffer_index;
	u_short buffer_offset;
	} INB_SEST_ENTRY;

typedef struct {
	u_int flags_and_did;
	u_short max_frame_len;
	u_short cntl;
	u_int total_seq_length;
	u_short link;
	u_short rx_id;
	u_int transaction_id;
	u_int header_address;
	u_char seq_id;
	u_char reserved;
	u_short header_length;
	u_int edb_address;
	} OUTB_SEST_ENTRY;

typedef struct {
	u_short d_naa;
	u_short dest_high;
	u_int dest_low;
	u_short s_naa;
	u_short source_high;
	u_int source_low;
	} NW_HEADER;

typedef struct {
	u_int resv;
	u_char sof_and_eof;
	u_char dest_alpa;
	u_short lcr_and_time_stamp;
	u_int r_ctl_and_d_id;
	u_int vc_id_and_s_id;
	u_int type_and_f_cntl;
	u_char seq_id;
	u_char df_cntl;
	u_short seq_cnt;
	u_short ox_id;
	u_short rx_id;
	u_int ro;
	NW_HEADER nw_header;
	} TACHYON_HEADER;

typedef struct {
	u_short service_options;
	u_short initiator_ctl;
	u_short recipient_ctl;
	u_short recv_data_field_size;
	u_short concurrent_sequences;
	u_short n_port_end_to_end_credit;
	u_short open_seq_per_exchange;
	u_short resv;
	}CLASS_OF_SERVICE;

typedef struct {
	u_int logo_cmnd;
	u_char reserved;
	u_char n_port_id_2;
	u_char n_port_id_1;
	u_char n_port_id_0;
	u_int port_name_up;
	u_int port_name_low;
	} LOGO;

typedef struct {
	u_int ls_cmnd_code;
	u_int hard_address;
	u_int port_name_high;
	u_int port_name_low;
	u_int node_name_high;
	u_int node_name_low;
	u_int n_port_id;
	} ADISC;
	
typedef struct {
	u_int cmnd_code;
	u_int reason_code;
	} LS_RJT;

typedef struct {
	u_int cmnd_code;
	} ACC;

typedef struct  {
	u_int seq_d_id;
	u_int tot_len;
	u_short cntl;
	u_short rx_id;
	u_short cs_enable;
	u_short cs_seed;
	u_int trans_id;
	u_int hdr_addr;
	u_short frame_len;
	u_short hdr_len;
	u_int edb_addr;
	}ODB;

typedef struct {
	u_int cmnd_code;
	u_int reg_function; /* in the last byte */
	} SCR;

typedef struct {
	u_int rev_in_id;
	u_char fs_type;
	u_char fs_subtype;
	u_char options;
	u_char resv1;
	u_short cmnd_resp_code;
	u_short max_res_size;
	u_char resv2;
	u_char reason_code;
	u_char expln_code;
	u_char vendor_unique;
	} CT_HDR;

typedef struct {
	CT_HDR	 ct_hdr;
	u_int s_id;
	u_char bit_map[32]; /* 32 byte bit map */
	} RFC_4;

typedef struct {
	u_int ls_cmnd_code;
	u_short fc_ph_version;
	u_short buff_to_buff_credit;
	u_short common_features;
	u_short recv_data_field_size;
	u_short n_port_total_conc_seq;
	u_short rel_off_by_info_cat;
	u_int ED_TOV;
	u_int n_port_name_high;
	u_int n_port_name_low;
	u_int node_name_high;
	u_int node_name_low;
	CLASS_OF_SERVICE c_of_s[3];
	u_int resv[4];
	u_int vendor_version_level[4];
	}LOGIN;

typedef struct {
	CT_HDR	 ct_hdr;
	u_int port_type; /* in the first byte */
	} GP_ID4;

typedef struct  {
	u_int   buf_addr;
	u_short ehf;
	u_short buf_len;
	}EDB;

/* (i)chip Registers */
struct i_chip_regs {
	u_int	ptr_ichip_hw_control_reg;
	u_int	ptr_ichip_hw_status_reg;
	u_int	ptr_ichip_hw_addr_mask_reg;
};

struct iph5526_novram {
	u_int	ptr_novram_hw_control_reg;
	u_int	ptr_novram_hw_status_reg;
	u_short data[IPH5526_NOVRAM_SIZE];
};

/* Tachyon Registers */
struct tachyon_regs {
	u_int    ptr_ocq_base_reg;
	u_int    ptr_ocq_len_reg;
	u_int    ptr_ocq_prod_indx_reg;
	u_int    ptr_ocq_cons_indx_reg;

	u_int    ptr_imq_base_reg;
	u_int    ptr_imq_len_reg;
	u_int    ptr_imq_cons_indx_reg;
	u_int    ptr_imq_prod_indx_reg;

	u_int    ptr_mfsbq_base_reg;
	u_int    ptr_mfsbq_len_reg;
	u_int    ptr_mfsbq_prod_reg;
	u_int    ptr_mfsbq_cons_reg;
	u_int    ptr_mfsbuff_len_reg;

	u_int    ptr_sfsbq_base_reg;
	u_int    ptr_sfsbq_len_reg;
	u_int    ptr_sfsbq_prod_reg;
	u_int    ptr_sfsbq_cons_reg;
	u_int    ptr_sfsbuff_len_reg;

	u_int    ptr_sest_base_reg;
	u_int    ptr_sest_len_reg;
	u_int    ptr_scsibuff_len_reg;

	u_int    ptr_tach_config_reg;
	u_int    ptr_tach_control_reg;
	u_int    ptr_tach_status_reg;
	u_int    ptr_tach_flush_oxid_reg;

	u_int    ptr_fm_config_reg;
	u_int    ptr_fm_control_reg;
	u_int    ptr_fm_status_reg;
	u_int    ptr_fm_tov_reg;
	u_int    ptr_fm_wwn_hi_reg;
	u_int    ptr_fm_wwn_low_reg;
	u_int    ptr_fm_rx_al_pa_reg;
};

struct globals {
	u_long tachyon_base;
	u_int *mem_base;
	u_short ox_id; /* OX_ID used for IP and ELS frames */
	u_short scsi_oxid; /* OX_ID for SEST entry */
	u_char seq_id;
	u_int my_id;
	u_int my_ddaa; /* my domain and area in a fabric */
	volatile u_char loop_up;
	volatile u_char ptp_up; /* we have a point-to-point link */
	volatile u_char link_up;
	volatile u_char n_port_try;
	volatile u_char nport_timer_set;
	volatile u_char lport_timer_set;
	/* Hmmm... We don't want to Initialize while closing */
	u_char dont_init; 
	u_int my_node_name_high;
	u_int my_node_name_low;
	u_int my_port_name_high;
	u_int my_port_name_low;
	u_char fabric_present;
	u_char explore_fabric;
	u_char name_server;  
	u_int my_mtu;
	u_int *els_buffer[MAX_PENDING_FRAMES]; /* temp space for ELS frames */
	char *arp_buffer; /* temp space for ARP frames */
	u_int mfs_buffer_count; /* keep track of MFS buffers used*/
	u_char scsi_registered;
	/* variables for port discovery */
	volatile u_char port_discovery;
	volatile u_char perform_adisc;
	u_short alpa_list_index;
	u_short type_of_frame; /* Could be IP/SCSI Read/SCSI Write*/	
	u_char no_of_targets; /* used to assign target_ids */
	u_long sem; /* to synchronize between IP and SCSI */
	u_char e_i;

	/* the frames */
	TACHYON_HEADER tach_header;
	LOGIN login;
	PRLI prli;
	LOGO logo;
	ADISC adisc;
	LS_RJT ls_rjt;
	ODB	odb;
	INB_SEST_ENTRY inb_sest_entry;
	OUTB_SEST_ENTRY outb_sest_entry;
	ACC	acc;
	SCR	scr;
	EDB	edb;
	RFC_4 rfc_4;
	GP_ID4 gp_id4;
};

struct queue_variables {
	/* Indices maintained in host memory.
	 */
	u_int *host_ocq_cons_indx, *host_hpcq_cons_indx, *host_imq_prod_indx;
	u_int *ptr_host_ocq_cons_indx, *ptr_host_hpcq_cons_indx, *ptr_host_imq_prod_indx;

	/* Variables for Outbound Command Queue (OCQ).
	 */
	u_int *ptr_ocq_base;
	u_int ocq_len, ocq_end;
	u_int ocq_prod_indx;
	u_int *ptr_odb[OCQ_LENGTH];

	/* Variables for Inbound Message Queue (IMQ).
	 */
	u_int *ptr_imq_base;
	u_int imq_len, imq_end;
	u_int imq_cons_indx;
	u_int imq_prod_indx;
	u_int *ptr_imqe[IMQ_LENGTH];

	u_int *ptr_mfsbq_base;
	u_int mfsbq_len, mfsbq_end;
	u_int mfsbq_prod_indx;
	u_int mfsbq_cons_indx;
	u_int mfsbuff_len, mfsbuff_end;

	u_int *ptr_sfsbq_base;
	u_int sfsbq_len, sfsbq_end;
	u_int sfsbq_prod_indx;
	u_int sfsbq_cons_indx;
	u_int sfsbuff_len, sfsbuff_end;
	u_int *ptr_sfs_buffers[SFSBQ_LENGTH * NO_OF_ENTRIES];

	/* Tables for SCSI Transactions */
	u_int *ptr_sest_base;
	u_int *ptr_sest[SEST_LENGTH];
	u_char free_scsi_oxid[SEST_LENGTH];
	u_int *ptr_sdb_base;
	u_int *ptr_sdb_slot[NO_OF_SDB_ENTRIES];
	u_char sdb_slot_status[NO_OF_SDB_ENTRIES];
	u_int sdb_indx;
	u_int *ptr_fcp_cmnd_base;
	u_int *ptr_fcp_cmnd[NO_OF_FCP_CMNDS];
	u_int fcp_cmnd_indx;

	/* Table for data to be transmitted.
	 */
	u_int *ptr_edb_base;
	u_int *ptr_edb[EDB_LEN];
	u_int edb_buffer_indx;
	volatile u_char free_edb_list[EDB_LEN];

	/* Table of Tachyon Headers.
	 */
	u_int *ptr_tachyon_header[NO_OF_TACH_HEADERS];
	u_int *ptr_tachyon_header_base;
	u_int tachyon_header_indx;
};

/* Used to match incoming ACCs to ELS requests sent out */
struct ox_id_els_map {
	u_short ox_id;
	u_int els;
	struct ox_id_els_map *next;
};


/* Carries info about individual nodes... stores the info got at login 
 * time. Also maintains mapping between MAC->FC addresses 
 */
struct fc_node_info {
	/* Itz the WWN (8 bytes), the last 6 bytes is the MAC address */
	u_char hw_addr[PORT_NAME_LEN]; 
	u_char node_name[NODE_NAME_LEN]; 
	u_int d_id;  /*real FC address, 3 bytes */
	int mtu;
	/* login = 1 if login attempted
	 * login = 2 if login completed 
	 */
	int login;    
	u_char scsi; /*  = 1 if device is a SCSI Target */
	u_char target_id;
	CLASS_OF_SERVICE c_of_s[3];
	struct fc_node_info *next;
};

struct fc_info {
	char name[8];
	u_long base_addr;
	int irq;
	struct net_device_stats fc_stats;
	struct fc_node_info *node_info_list;
	int num_nodes;
	struct ox_id_els_map *ox_id_list;
	struct i_chip_regs i_r;
	struct tachyon_regs t_r;
	struct queue_variables q;
	struct globals g;
	struct iph5526_novram n_r;
	u_short clone_id;
	struct timer_list nport_timer;
	struct timer_list lport_timer;
	struct timer_list explore_timer;
	struct timer_list display_cache_timer;
	struct net_device *dev;
	struct Scsi_Host *host;
	spinlock_t fc_lock;
};

struct iph5526_hostdata {
	struct fc_info *fi;
	fcp_cmd cmnd;
	Scsi_Cmnd *cmnd_handler[SEST_LENGTH];
	u_int tag_ages[MAX_SCSI_TARGETS];
};

/* List of valid AL_PAs */
u_char alpa_list[127] = { 
	0x00, 0x01, 0x02, 0x04, 0x08, 0x0F, 0x10, 0x17, 
	0x18, 0x1B, 0x1D, 0x1E, 0x1F, 0x23, 0x25, 0x26, 
	0x27, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x31, 
	0x32, 0x33, 0x34, 0x35, 0x36, 0x39, 0x3A, 0x3C, 
	0x43, 0x45, 0x46, 0x47, 0x49, 0x4A, 0x4B, 0x4C, 
	0x4D, 0x4E, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 
	0x59, 0x5A, 0x5C, 0x63, 0x65, 0x66, 0x67, 0x69, 
	0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x71, 0x72, 0x73, 
	0x74, 0x75, 0x76, 0x79, 0x7A, 0x7C, 0x80, 0x81, 
	0x82, 0x84, 0x88, 0x8F, 0x90, 0x97, 0x98, 0x9B, 
	0x9D, 0x9E, 0x9F, 0xA3, 0xA5, 0xA6, 0xA7, 0xA9, 
	0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xB1, 0xB2, 0xB3, 
	0xB4, 0xB5, 0xB6, 0xB9, 0xBA, 0xBC, 0xC3, 0xC5, 
	0xC6, 0xC7, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 
	0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD9, 0xDA, 
	0xDC, 0xE0, 0xE1, 0xE2, 0xE4, 0xE8, 0xEF
};

#endif /* _TACH_STRUCT_H */