tach_structs.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:10k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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