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