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

嵌入式Linux

开发平台:

Unix_Linux

  1. fi->g.e_i = 0;
  2. LEAVE("tx_logo");
  3. }
  4. static void tx_adisc(struct fc_info *fi, u_int cmnd_code, u_int d_id, u_short received_ox_id)
  5. {
  6. int int_required = 0;
  7. u_int r_ctl = RCTL_ELS_SCTL;
  8. u_int type  = TYPE_ELS | EXCHANGE_RESPONDER | SEQUENCE_RESPONDER | FIRST_SEQUENCE | END_SEQUENCE;
  9. int size = sizeof(ADISC);
  10. u_int my_mtu = fi->g.my_mtu;
  11. fi->g.adisc.ls_cmnd_code = htonl(cmnd_code);
  12. fi->g.adisc.hard_address = htonl(0);
  13. fi->g.adisc.port_name_high = htonl(N_PORT_NAME_HIGH);
  14. fi->g.adisc.port_name_low = htonl(N_PORT_NAME_LOW);
  15. fi->g.adisc.node_name_high = htonl(NODE_NAME_HIGH);
  16. fi->g.adisc.node_name_low = htonl(NODE_NAME_LOW);
  17. fi->g.adisc.n_port_id = htonl(fi->g.my_id);
  18. if (cmnd_code == ELS_ADISC) {
  19. int_required = 1;
  20. r_ctl = RCTL_ELS_UCTL;
  21. type  = TYPE_ELS | SEQUENCE_INITIATIVE | FIRST_SEQUENCE;
  22. }
  23. fi->g.type_of_frame = FC_ELS;
  24. memcpy(fi->g.els_buffer[fi->g.e_i], &fi->g.adisc, size);
  25. tx_exchange(fi, (char *)(fi->g.els_buffer[fi->g.e_i]),size, r_ctl, type, d_id, my_mtu, int_required, received_ox_id, cmnd_code);
  26. fi->g.e_i++;
  27. if (fi->g.e_i == MAX_PENDING_FRAMES)
  28. fi->g.e_i = 0;
  29. }
  30. static void tx_ls_rjt(struct fc_info *fi, u_int d_id, u_short received_ox_id, u_short reason_code, u_short expln_code)
  31. {
  32. int int_required = 0;
  33. u_int r_ctl = RCTL_ELS_SCTL;
  34. u_int type  = TYPE_ELS | EXCHANGE_RESPONDER | LAST_SEQUENCE;
  35. int size = sizeof(LS_RJT);
  36. u_int my_mtu = fi->g.my_mtu;
  37. ENTER("tx_ls_rjt");
  38. fi->g.ls_rjt.cmnd_code = htonl(ELS_LS_RJT);
  39. fi->g.ls_rjt.reason_code = htonl((reason_code << 16) | expln_code); 
  40. fi->g.type_of_frame = FC_ELS;
  41. memcpy(fi->g.els_buffer[fi->g.e_i], &fi->g.ls_rjt, size);
  42. tx_exchange(fi, (char *)(fi->g.els_buffer[fi->g.e_i]),size, r_ctl, type, d_id, my_mtu, int_required, received_ox_id, ELS_LS_RJT);
  43. fi->g.e_i++;
  44. if (fi->g.e_i == MAX_PENDING_FRAMES)
  45. fi->g.e_i = 0;
  46. LEAVE("tx_ls_rjt");
  47. }
  48. static void tx_abts(struct fc_info *fi, u_int d_id, u_short ox_id)
  49. {
  50. int int_required = 1;
  51. u_int r_ctl = RCTL_BASIC_ABTS;
  52. u_int type  = TYPE_BLS | SEQUENCE_INITIATIVE | FIRST_SEQUENCE;
  53. int size = 0;
  54. u_int my_mtu = fi->g.my_mtu;
  55. ENTER("tx_abts");
  56. fi->g.type_of_frame = FC_BLS;
  57. tx_exchange(fi, NULL, size, r_ctl, type, d_id, my_mtu, int_required, ox_id, RCTL_BASIC_ABTS);
  58. LEAVE("tx_abts");
  59. }
  60. static u_int plogi_ok(struct fc_info *fi, u_int *buff_addr, int size)
  61. {
  62. int ret_code = 0;
  63. u_short mtu = ntohl(*(buff_addr + 10)) & 0x00000FFF;
  64. u_short class3 = ntohl(*(buff_addr + 25)) >> 16;
  65. u_short class3_conc_seq = ntohl(*(buff_addr + 27)) >> 16;
  66. u_short open_seq = ntohl(*(buff_addr + 28)) >> 16;
  67. DPRINTK1("mtu = %x class3 = %x conc_seq = %x open_seq = %x", mtu, class3, class3_conc_seq, open_seq);
  68. size -= TACHYON_HEADER_LEN;
  69. if (!(class3 & 0x8000)) {
  70. DPRINTK1("Received PLOGI with class3 = %x", class3);
  71. ret_code = (LOGICAL_ERR << 16) | NO_EXPLN;
  72. return ret_code;
  73. }
  74. if (mtu < 256) {
  75. DPRINTK1("Received PLOGI with MTU set to %x", mtu);
  76. ret_code = (LOGICAL_ERR << 16) | RECV_FIELD_SIZE;
  77. return ret_code;
  78. }
  79. if (size != PLOGI_LEN) {
  80. DPRINTK1("Received PLOGI of size %x", size);
  81. ret_code = (LOGICAL_ERR << 16) | INV_PAYLOAD_LEN;
  82. return ret_code;
  83. }
  84. if (class3_conc_seq == 0) {
  85. DPRINTK1("Received PLOGI with conc_seq == 0");
  86. ret_code = (LOGICAL_ERR << 16) | CONC_SEQ;
  87. return ret_code;
  88. }
  89. if (open_seq == 0) {
  90. DPRINTK1("Received PLOGI with open_seq == 0");
  91. ret_code = (LOGICAL_ERR << 16) | NO_EXPLN;
  92. return ret_code;
  93. }
  94. /* Could potentially check for more fields, but might end up
  95.    not talking to most of the devices. ;-) */
  96. /* Things that could get checked are:
  97.    common_features = 0x8800
  98.    total_concurrent_seq = at least 1
  99. */
  100. return ret_code;
  101. }
  102. static void tx_acc(struct fc_info *fi, u_int d_id, u_short received_ox_id)
  103. {
  104. int int_required = 0;
  105. u_int r_ctl = RCTL_ELS_SCTL;
  106. u_int type  = TYPE_ELS | EXCHANGE_RESPONDER | LAST_SEQUENCE;
  107. int size = sizeof(ACC);
  108. u_int my_mtu = fi->g.my_mtu;
  109. ENTER("tx_acc");
  110. fi->g.acc.cmnd_code = htonl(ELS_ACC);
  111. fi->g.type_of_frame = FC_ELS;
  112. memcpy(fi->g.els_buffer[fi->g.e_i], &fi->g.acc, size);
  113. tx_exchange(fi, (char *)(fi->g.els_buffer[fi->g.e_i]),size, r_ctl, type, d_id, my_mtu, int_required, received_ox_id, ELS_ACC);
  114. fi->g.e_i++;
  115. if (fi->g.e_i == MAX_PENDING_FRAMES)
  116. fi->g.e_i = 0;
  117. LEAVE("tx_acc");
  118. }
  119. static void tx_name_server_req(struct fc_info *fi, u_int req)
  120. {
  121. int int_required = 1, i, size = 0;
  122. u_short ox_id = OX_ID_FIRST_SEQUENCE;
  123. u_int type  = TYPE_FC_SERVICES | SEQUENCE_INITIATIVE | FIRST_SEQUENCE;
  124. u_int r_ctl = FC4_DEVICE_DATA | UNSOLICITED_CONTROL;
  125. u_int my_mtu = fi->g.my_mtu, d_id = DIRECTORY_SERVER;
  126. CT_HDR ct_hdr;
  127. ENTER("tx_name_server_req");
  128. /* Fill up CT_Header */
  129. ct_hdr.rev_in_id = htonl(FC_CT_REV);
  130. ct_hdr.fs_type = DIRECTORY_SERVER_APP;
  131. ct_hdr.fs_subtype = NAME_SERVICE;
  132. ct_hdr.options = 0;
  133. ct_hdr.resv1 = 0;
  134. ct_hdr.cmnd_resp_code = htons(req >> 16);
  135. ct_hdr.max_res_size = 0;
  136. ct_hdr.resv2 = 0;
  137. ct_hdr.reason_code = 0;
  138. ct_hdr.expln_code = 0;
  139. ct_hdr.vendor_unique = 0;
  140. fi->g.type_of_frame = FC_ELS;
  141. switch(req) {
  142. case FCS_RFC_4:
  143. memcpy(&(fi->g.rfc_4.ct_hdr), &ct_hdr, sizeof(CT_HDR));
  144. fi->g.rfc_4.s_id = htonl(fi->g.my_id);
  145. for (i = 0; i < 32; i++)
  146. fi->g.rfc_4.bit_map[i] = 0;
  147. /* We support IP & SCSI */
  148. fi->g.rfc_4.bit_map[2] = 0x01;
  149. fi->g.rfc_4.bit_map[3] = 0x20;
  150. size = sizeof(RFC_4);
  151. memcpy(fi->g.els_buffer[fi->g.e_i], &fi->g.rfc_4, size);
  152. tx_exchange(fi, (char *)(fi->g.els_buffer[fi->g.e_i]),size, r_ctl, type, d_id, my_mtu, int_required, ox_id, req);
  153. break;
  154. case FCS_GP_ID4:
  155. memcpy(&(fi->g.gp_id4.ct_hdr), &ct_hdr, sizeof(CT_HDR));
  156. fi->g.gp_id4.port_type = htonl(PORT_TYPE_NX_PORTS);
  157. size = sizeof(GP_ID4);
  158. memcpy(fi->g.els_buffer[fi->g.e_i], &fi->g.gp_id4, size);
  159. tx_exchange(fi, (char *)(fi->g.els_buffer[fi->g.e_i]),size, r_ctl, type, d_id, my_mtu, int_required, ox_id, req);
  160. break;
  161. }
  162. fi->g.e_i++;
  163. if (fi->g.e_i == MAX_PENDING_FRAMES)
  164. fi->g.e_i = 0;
  165. LEAVE("tx_name_server_req");
  166. }
  167. static void tx_scr(struct fc_info *fi)
  168. {
  169. int int_required = 1, size = sizeof(SCR);
  170. u_short ox_id = OX_ID_FIRST_SEQUENCE;
  171. u_int type  = TYPE_ELS | SEQUENCE_INITIATIVE | FIRST_SEQUENCE;
  172. u_int r_ctl = RCTL_ELS_UCTL;
  173. u_int my_mtu = fi->g.my_mtu, d_id = FABRIC_CONTROLLER;
  174. ENTER("tx_scr");
  175. fi->g.scr.cmnd_code = htonl(ELS_SCR);
  176. fi->g.scr.reg_function = htonl(FULL_REGISTRATION);
  177. fi->g.type_of_frame = FC_ELS;
  178. memcpy(fi->g.els_buffer[fi->g.e_i], &fi->g.scr, size);
  179. tx_exchange(fi, (char *)(fi->g.els_buffer[fi->g.e_i]),size, r_ctl, type, d_id, my_mtu, int_required, ox_id, ELS_SCR);
  180. fi->g.e_i++;
  181. if (fi->g.e_i == MAX_PENDING_FRAMES)
  182. fi->g.e_i = 0;
  183. LEAVE("tx_scr");
  184. }
  185. static void perform_adisc(struct fc_info *fi)
  186. {
  187. int count = 0;
  188. /* Will be set to TRUE when timer expires in a PLDA environment. 
  189.  */
  190. fi->g.port_discovery = FALSE;
  191. if (fi->node_info_list) {
  192. struct fc_node_info *temp_list = fi->node_info_list;
  193. while(temp_list) {
  194. /* Tx ADISC to all non-fabric based 
  195.      * entities.
  196.      */
  197. if ((temp_list->d_id & 0xFF0000) != 0xFF0000)
  198. tx_adisc(fi, ELS_ADISC, temp_list->d_id, OX_ID_FIRST_SEQUENCE);
  199. temp_list = temp_list->next;
  200. udelay(20);
  201. count++;
  202. }
  203. }
  204. /* Perform Port Discovery after timer expires.
  205.  * We are giving time for the ADISCed nodes to respond
  206.  * so that we dont have to perform PLOGI to those whose
  207.  * login are _still_ valid.
  208.  */
  209. fi->explore_timer.function = port_discovery_timer;
  210. fi->explore_timer.data = (unsigned long)fi;
  211. fi->explore_timer.expires = RUN_AT((count*3*HZ)/100); 
  212. init_timer(&fi->explore_timer);
  213. add_timer(&fi->explore_timer);
  214. }
  215. static void explore_fabric(struct fc_info *fi, u_int *buff_addr)
  216. {
  217. u_int *addr = buff_addr + 12; /* index into payload */
  218. u_char control_code;
  219. u_int d_id;
  220. int count = 0;
  221. ENTER("explore_fabric");
  222. DPRINTK1("entering explore_fabric");
  223. /*fi->g.perform_adisc = TRUE;
  224. fi->g.explore_fabric = TRUE;
  225. perform_adisc(fi);*/
  226. do {
  227. d_id = ntohl(*addr) & 0x00FFFFFF;
  228. if (d_id != fi->g.my_id) {
  229. if (sid_logged_in(fi, d_id) == NODE_NOT_PRESENT)
  230. tx_logi(fi, ELS_PLOGI, d_id); 
  231. else
  232. if (sid_logged_in(fi, d_id) == NODE_LOGGED_OUT)
  233. tx_adisc(fi, ELS_ADISC, d_id, OX_ID_FIRST_SEQUENCE); 
  234. count++;
  235. }
  236. control_code = (ntohl(*addr) & 0xFF000000) >> 24;
  237. addr++;
  238. DPRINTK1("cc = %x, d_id = %x", control_code, d_id);
  239. } while (control_code != 0x80);
  240. fi->explore_timer.function = fabric_explore_timer;
  241. fi->explore_timer.data = (unsigned long)fi;
  242. /* We give 30 msec for each device to respond and then send out
  243.  * our SCSI enquiries. 
  244.  */
  245. fi->explore_timer.expires = RUN_AT((count*3*HZ)/100); 
  246. init_timer(&fi->explore_timer);
  247. add_timer(&fi->explore_timer);
  248. DPRINTK1("leaving explore_fabric");
  249. LEAVE("explore_fabric");
  250. }
  251. static void fabric_explore_timer(unsigned long data)
  252. {
  253. struct fc_info *fi = (struct fc_info*)data;
  254. del_timer(&fi->explore_timer);
  255. if ((fi->g.loop_up == TRUE) && (fi->g.ptp_up == FALSE)) {
  256. /* Initiate Local Port Discovery on the Local Loop.
  257.  */
  258. fi->g.port_discovery = TRUE;
  259. fi->g.alpa_list_index = 1;
  260. local_port_discovery(fi);
  261. }
  262. fi->g.explore_fabric = FALSE;
  263. return;
  264. }
  265. static void port_discovery_timer(unsigned long data)
  266. {
  267. struct fc_info *fi = (struct fc_info*)data;
  268. del_timer(&fi->explore_timer);
  269. if ((fi->g.loop_up == TRUE) && (fi->g.explore_fabric != TRUE)) {
  270. fi->g.port_discovery = TRUE;
  271. fi->g.alpa_list_index = 1;
  272. local_port_discovery(fi);
  273. }
  274. fi->g.perform_adisc = FALSE;
  275. return;
  276. }
  277. static void add_to_ox_id_list(struct fc_info *fi, u_int transaction_id, u_int cmnd_code)
  278. {
  279. struct ox_id_els_map *p, *q = fi->ox_id_list, *r = NULL;
  280. int size = sizeof(struct ox_id_els_map);
  281. while (q != NULL) {
  282. r = q;
  283. q = q->next;
  284. }
  285. p = (struct ox_id_els_map *)kmalloc(size, GFP_ATOMIC);
  286. if (p == NULL) {
  287. T_MSG("kmalloc failed in add_to_ox_id_list()");
  288. return;
  289. }
  290. p->ox_id = transaction_id;
  291. p->els = cmnd_code;
  292. p->next = NULL;
  293. if (fi->ox_id_list == NULL)
  294. fi->ox_id_list = p;
  295. else
  296. r->next = p;
  297. return;
  298. }
  299. static u_int remove_from_ox_id_list(struct fc_info *fi, u_short received_ox_id)
  300. {
  301. struct ox_id_els_map *p = fi->ox_id_list, *q = fi->ox_id_list;
  302. u_int els_type;
  303. while (q != NULL) {
  304. if (q->ox_id == received_ox_id) {
  305. if (q == fi->ox_id_list) 
  306. fi->ox_id_list = fi->ox_id_list->next;
  307. else
  308. if (q->next == NULL) 
  309. p->next = NULL;
  310. else 
  311. p->next = q->next;
  312. els_type = q->els;
  313. kfree(q);
  314. return els_type;
  315. }
  316. p = q;
  317. q = q->next;
  318. }
  319. if (q == NULL)
  320. DPRINTK2("Could not find ox_id %x in ox_id_els_map", received_ox_id);
  321. return 0;
  322. }
  323. static void build_tachyon_header(struct fc_info *fi, u_int my_id, u_int r_ctl, u_int d_id, u_int type, u_char seq_id, u_char df_ctl, u_short ox_id, u_short rx_id, char *data)
  324. {
  325. u_char alpa = d_id & 0x0000FF;
  326. u_int dest_ddaa = d_id &0xFFFF00;
  327. ENTER("build_tachyon_header");
  328. DPRINTK("d_id = %x, my_ddaa = %x", d_id, fi->g.my_ddaa);
  329. /* Does it have to go to/thru a Fabric? */
  330. if ((dest_ddaa != 0) && ((d_id == F_PORT) || (fi->g.fabric_present && (dest_ddaa != fi->g.my_ddaa))))
  331. alpa = 0x00;
  332. fi->g.tach_header.resv = 0x00000000;
  333. fi->g.tach_header.sof_and_eof = SOFI3 | EOFN;
  334. fi->g.tach_header.dest_alpa = alpa;
  335. /* Set LCr properly to have enuff credit */
  336. if (alpa == REPLICATE)
  337. fi->g.tach_header.lcr_and_time_stamp = htons(0xC00);/* LCr=3 */
  338. else
  339. fi->g.tach_header.lcr_and_time_stamp = 0;
  340. fi->g.tach_header.r_ctl_and_d_id = htonl(r_ctl | d_id);
  341. fi->g.tach_header.vc_id_and_s_id = htonl(my_id);
  342. fi->g.tach_header.type_and_f_cntl = htonl(type);
  343. fi->g.tach_header.seq_id = seq_id;
  344. fi->g.tach_header.df_cntl = df_ctl;
  345. fi->g.tach_header.seq_cnt = 0;
  346. fi->g.tach_header.ox_id = htons(ox_id);
  347. fi->g.tach_header.rx_id = htons(rx_id);
  348. fi->g.tach_header.ro = 0;
  349. if (data) {
  350. /* We use the Seq_Count to keep track of IP frames in the
  351.  * OCI_interrupt handler. Initial Seq_Count of IP frames is 1.
  352.  */
  353. if (fi->g.type_of_frame == FC_BROADCAST)
  354. fi->g.tach_header.seq_cnt = htons(0x1);
  355. else
  356. fi->g.tach_header.seq_cnt = htons(0x2);
  357. fi->g.tach_header.nw_header.d_naa = htons(0x1000);
  358. fi->g.tach_header.nw_header.s_naa = htons(0x1000);
  359. memcpy(&(fi->g.tach_header.nw_header.dest_high), data, 2);
  360. memcpy(&(fi->g.tach_header.nw_header.dest_low), data + 2, 4);
  361. memcpy(&(fi->g.tach_header.nw_header.source_high), data + 6, 2);
  362. memcpy(&(fi->g.tach_header.nw_header.source_low), data + 8, 4);
  363. }
  364. LEAVE("build_tachyon_header");
  365. }
  366. static void build_EDB(struct fc_info *fi, char *data, u_short flags, u_short len)
  367. {
  368. fi->g.edb.buf_addr = ntohl((u_int)virt_to_bus(data));
  369. fi->g.edb.ehf = ntohs(flags);
  370. if (len % 4)
  371. len += (4 - (len % 4));
  372. fi->g.edb.buf_len = ntohs(len);
  373. }
  374. static void build_ODB(struct fc_info *fi, u_char seq_id, u_int d_id, u_int len, u_int cntl, u_short mtu, u_short ox_id, u_short rx_id, int NW_header, int int_required, u_int frame_class)
  375. {
  376. fi->g.odb.seq_d_id = htonl(seq_id << 24 | d_id);
  377. fi->g.odb.tot_len = len;
  378. if (NW_header)
  379. fi->g.odb.tot_len += NW_HEADER_LEN;
  380. if (fi->g.odb.tot_len % 4)
  381. fi->g.odb.tot_len += (4 - (fi->g.odb.tot_len % 4));
  382. fi->g.odb.tot_len = htonl(fi->g.odb.tot_len);
  383. switch(int_required) {
  384. case NO_COMP_AND_INT:
  385. fi->g.odb.cntl = htons(ODB_CLASS_3 | ODB_EE_CREDIT | ODB_NO_INT | ODB_NO_COMP | cntl);
  386. break;
  387. case INT_AND_COMP_REQ:
  388. fi->g.odb.cntl = htons(ODB_CLASS_3 | ODB_EE_CREDIT | cntl);
  389. break;
  390. case NO_INT_COMP_REQ:
  391. fi->g.odb.cntl = htons(ODB_CLASS_3 | ODB_EE_CREDIT | ODB_NO_INT | cntl);
  392. break;
  393. }
  394. fi->g.odb.rx_id = htons(rx_id);
  395. fi->g.odb.cs_enable = 0;
  396. fi->g.odb.cs_seed = htons(1);
  397. fi->g.odb.hdr_addr = htonl(virt_to_bus(fi->q.ptr_tachyon_header[fi->q.tachyon_header_indx]));
  398. fi->g.odb.frame_len = htons(mtu);
  399. if (NW_header) {
  400. /* The pointer to the sk_buff is in here. Freed up when the
  401.  * OCI_interrupt is received.
  402.  */
  403. fi->g.odb.trans_id = htonl(frame_class);
  404. fi->g.odb.hdr_len = TACHYON_HEADER_LEN + NW_HEADER_LEN;
  405. }
  406. else {
  407. /* helps in tracking transmitted OX_IDs */
  408. fi->g.odb.trans_id = htonl((frame_class & 0xFFFF0000) | ox_id);
  409. fi->g.odb.hdr_len = TACHYON_HEADER_LEN;
  410. }
  411. fi->g.odb.hdr_len = htons(fi->g.odb.hdr_len);
  412. fi->g.odb.edb_addr = htonl(virt_to_bus(fi->q.ptr_edb[fi->q.edb_buffer_indx]));
  413. }
  414. static void fill_login_frame(struct fc_info *fi, u_int logi)
  415. {
  416. int i;
  417. fi->g.login.ls_cmnd_code= htonl(logi);
  418. fi->g.login.fc_ph_version = htons(PH_VERSION);
  419. if (fi->g.loop_up)
  420. fi->g.login.buff_to_buff_credit = htons(LOOP_BB_CREDIT);
  421. else
  422. if (fi->g.ptp_up)
  423. fi->g.login.buff_to_buff_credit = htons(PT2PT_BB_CREDIT);
  424. if ((logi != ELS_FLOGI) || (logi == ELS_ACC))
  425. fi->g.login.common_features = htons(PLOGI_C_F);
  426. else
  427. if (logi == ELS_FLOGI)
  428. fi->g.login.common_features = htons(FLOGI_C_F);
  429. fi->g.login.recv_data_field_size = htons(TACH_FRAME_SIZE);
  430. fi->g.login.n_port_total_conc_seq = htons(CONCURRENT_SEQUENCES);
  431. fi->g.login.rel_off_by_info_cat = htons(RO_INFO_CATEGORY);
  432. fi->g.login.ED_TOV = htonl(E_D_TOV);
  433. fi->g.login.n_port_name_high = htonl(N_PORT_NAME_HIGH);
  434. fi->g.login.n_port_name_low = htonl(N_PORT_NAME_LOW);
  435. fi->g.login.node_name_high = htonl(NODE_NAME_HIGH);
  436. fi->g.login.node_name_low = htonl(NODE_NAME_LOW);
  437. /* Fill Class 1 parameters */
  438. fi->g.login.c_of_s[0].service_options = htons(0);
  439. fi->g.login.c_of_s[0].initiator_ctl = htons(0);
  440. fi->g.login.c_of_s[0].recipient_ctl = htons(0);
  441. fi->g.login.c_of_s[0].recv_data_field_size = htons(0);
  442. fi->g.login.c_of_s[0].concurrent_sequences = htons(0);
  443. fi->g.login.c_of_s[0].n_port_end_to_end_credit = htons(0);
  444. fi->g.login.c_of_s[0].open_seq_per_exchange = htons(0);
  445. fi->g.login.c_of_s[0].resv = htons(0);
  446. /* Fill Class 2 parameters */
  447. fi->g.login.c_of_s[1].service_options = htons(0);
  448. fi->g.login.c_of_s[1].initiator_ctl = htons(0);
  449. fi->g.login.c_of_s[1].recipient_ctl = htons(0);
  450. fi->g.login.c_of_s[1].recv_data_field_size = htons(0);
  451. fi->g.login.c_of_s[1].concurrent_sequences = htons(0);
  452. fi->g.login.c_of_s[1].n_port_end_to_end_credit = htons(0);
  453. fi->g.login.c_of_s[1].open_seq_per_exchange = htons(0);
  454. fi->g.login.c_of_s[1].resv = htons(0);
  455. /* Fill Class 3 parameters */
  456. if (logi == ELS_FLOGI)
  457. fi->g.login.c_of_s[2].service_options  = htons(SERVICE_VALID | SEQUENCE_DELIVERY);
  458. else
  459. fi->g.login.c_of_s[2].service_options  = htons(SERVICE_VALID);
  460. fi->g.login.c_of_s[2].initiator_ctl = htons(0);
  461. fi->g.login.c_of_s[2].recipient_ctl = htons(0);
  462. fi->g.login.c_of_s[2].recv_data_field_size = htons(TACH_FRAME_SIZE);
  463. fi->g.login.c_of_s[2].concurrent_sequences = htons(CLASS3_CONCURRENT_SEQUENCE);
  464. fi->g.login.c_of_s[2].n_port_end_to_end_credit = htons(0);
  465. fi->g.login.c_of_s[2].open_seq_per_exchange = htons(CLASS3_OPEN_SEQUENCE);
  466. fi->g.login.c_of_s[2].resv = htons(0);
  467. for(i = 0; i < 4; i++) {
  468. fi->g.login.resv[i] = 0;
  469. fi->g.login.vendor_version_level[i] = 0;
  470. }
  471. }
  472. /* clear the Interrupt Latch on the (i)chip, so that you can receive 
  473.  * Interrupts from Tachyon in future 
  474.  */
  475. static void reset_latch(struct fc_info *fi)
  476. {
  477. writel(readl(fi->i_r.ptr_ichip_hw_status_reg) | ICHIP_HSR_INT_LATCH, fi->i_r.ptr_ichip_hw_status_reg);
  478. }
  479. static void update_OCQ_indx(struct fc_info *fi)
  480. {
  481. fi->q.ocq_prod_indx++;
  482. if (fi->q.ocq_prod_indx == OCQ_LENGTH)
  483. fi->q.ocq_prod_indx = 0;
  484. writel(fi->q.ocq_prod_indx, fi->t_r.ptr_ocq_prod_indx_reg);
  485. }
  486. static void update_IMQ_indx(struct fc_info *fi, int count)
  487. {
  488. fi->q.imq_cons_indx += count;
  489. if (fi->q.imq_cons_indx >= IMQ_LENGTH)
  490. fi->q.imq_cons_indx -= IMQ_LENGTH;
  491. writel(fi->q.imq_cons_indx, fi->t_r.ptr_imq_cons_indx_reg);
  492. }
  493. static void update_SFSBQ_indx(struct fc_info *fi)
  494. {
  495. fi->q.sfsbq_prod_indx++;
  496. if (fi->q.sfsbq_prod_indx == SFSBQ_LENGTH)
  497. fi->q.sfsbq_prod_indx = 0;
  498. writel(fi->q.sfsbq_prod_indx, fi->t_r.ptr_sfsbq_prod_reg);
  499. }
  500. static void update_MFSBQ_indx(struct fc_info *fi, int count)
  501. {
  502. fi->q.mfsbq_prod_indx += count;
  503. if (fi->q.mfsbq_prod_indx >= MFSBQ_LENGTH)
  504. fi->q.mfsbq_prod_indx -= MFSBQ_LENGTH;
  505. writel(fi->q.mfsbq_prod_indx, fi->t_r.ptr_mfsbq_prod_reg);
  506. }
  507. static void update_tachyon_header_indx(struct fc_info *fi)
  508. {
  509. fi->q.tachyon_header_indx++;
  510. if (fi->q.tachyon_header_indx == NO_OF_TACH_HEADERS)
  511. fi->q.tachyon_header_indx = 0;
  512. }
  513. static void update_EDB_indx(struct fc_info *fi)
  514. {
  515. fi->q.edb_buffer_indx++;
  516. if (fi->q.edb_buffer_indx == EDB_LEN)
  517. fi->q.edb_buffer_indx = 0;
  518. }
  519. static int iph5526_open(struct net_device *dev)
  520. {
  521. netif_start_queue(dev);
  522. MOD_INC_USE_COUNT;
  523. return 0;
  524. }
  525. static int iph5526_close(struct net_device *dev)
  526. {
  527. netif_stop_queue(dev);
  528. MOD_DEC_USE_COUNT;
  529. return 0;
  530. }
  531. static void iph5526_timeout(struct net_device *dev)
  532. {
  533. struct fc_info *fi = (struct fc_info*)dev->priv;
  534. printk(KERN_WARNING "%s: timed out on send.n", dev->name);
  535. fi->fc_stats.rx_dropped++;
  536. dev->trans_start = jiffies;
  537. netif_wake_queue(dev);
  538. }
  539. static int iph5526_send_packet(struct sk_buff *skb, struct net_device *dev)
  540. {
  541. struct fc_info *fi = (struct fc_info*)dev->priv;
  542. int status = 0;
  543. short type = 0;
  544. u_long flags;
  545. struct fcllc *fcllc;
  546. ENTER("iph5526_send_packet");
  547. netif_stop_queue(dev);
  548. /* Strip off the pseudo header.
  549.  */
  550. skb->data = skb->data + 2*FC_ALEN; 
  551. skb->len = skb->len - 2*FC_ALEN;
  552. fcllc = (struct fcllc *)skb->data;
  553. type = ntohs(fcllc->ethertype);
  554. spin_lock_irqsave(&fi->fc_lock, flags);
  555. switch(type) {
  556. case ETH_P_IP:
  557. status = tx_ip_packet(skb, skb->len, fi);
  558. break;
  559. case ETH_P_ARP:
  560. status = tx_arp_packet(skb->data, skb->len, fi);
  561. break;
  562. default:
  563. T_MSG("WARNING!!! Received Unknown Packet Type... Discarding...");
  564. fi->fc_stats.rx_dropped++;
  565. break;
  566. }
  567. spin_unlock_irqrestore(&fi->fc_lock, flags);
  568. if (status) {
  569. fi->fc_stats.tx_bytes += skb->len;
  570. fi->fc_stats.tx_packets++;
  571. }
  572. else
  573. fi->fc_stats.rx_dropped++;
  574. dev->trans_start = jiffies;
  575. /* We free up the IP buffers in the OCI_interrupt handler.
  576.  * status == 0 implies that the frame was not transmitted. So the
  577.  * skb is freed here.
  578.  */
  579. if ((type == ETH_P_ARP) || (status == 0))
  580. dev_kfree_skb(skb);
  581. else
  582. netif_wake_queue(dev);
  583. LEAVE("iph5526_send_packet");
  584. return 0;
  585. }
  586. static int iph5526_change_mtu(struct net_device *dev, int mtu)
  587. {
  588. return 0;
  589. }
  590. static int tx_ip_packet(struct sk_buff *skb, unsigned long len, struct fc_info *fi)
  591. {
  592. u_int d_id;
  593. int int_required = 1;
  594. u_int r_ctl = FC4_DEVICE_DATA | UNSOLICITED_DATA;
  595. u_int type = TYPE_LLC_SNAP;
  596. u_short ox_id = OX_ID_FIRST_SEQUENCE;
  597. u_int mtu;
  598. struct fc_node_info *q;
  599. ENTER("tx_ip_packet");
  600. q = look_up_cache(fi, skb->data - 2*FC_ALEN);
  601. if (q != NULL) {
  602. d_id = q->d_id;
  603. DPRINTK("Look-Up Cache Succeeded for d_id = %x", d_id);
  604. mtu = q->mtu;
  605. if (q->login == LOGIN_COMPLETED){
  606. fi->g.type_of_frame = FC_IP;
  607. return tx_exchange(fi, skb->data, len, r_ctl, type, d_id, mtu, int_required, ox_id, virt_to_bus(skb));
  608. }
  609. if (q->d_id == BROADCAST) {
  610. struct fc_node_info *p = fi->node_info_list;
  611. int return_value = FALSE;
  612. fi->g.type_of_frame = FC_BROADCAST;
  613. /* Do unicast to local nodes.
  614.  */
  615. int_required = 0;
  616. while(p != NULL) {
  617. d_id = p->d_id;
  618. if ((d_id & 0xFFFF00) == fi->g.my_ddaa)
  619. return_value |= tx_exchange(fi, skb->data, len, r_ctl, type, d_id, fi->g.my_mtu, int_required, ox_id, TYPE_LLC_SNAP);
  620. p = p->next;
  621. }
  622. kfree(q);
  623. return return_value;
  624. }
  625. if (q->login != LOGIN_COMPLETED) {
  626. DPRINTK1("Node not logged in... Txing PLOGI to %x", d_id);
  627. /* FIXME: we are dumping the frame here */
  628. tx_logi(fi, ELS_PLOGI, d_id); 
  629. }
  630. }
  631. DPRINTK2("Look-Up Cache Failed");
  632. LEAVE("tx_ip_packet");
  633. return 0;
  634. }
  635. static int tx_arp_packet(char *data, unsigned long len, struct fc_info *fi)
  636. {
  637. u_int opcode = data[ARP_OPCODE_0]; 
  638. u_int d_id;
  639. int int_required = 0, return_value = FALSE;
  640. u_int r_ctl = FC4_DEVICE_DATA | UNSOLICITED_DATA;
  641. u_int type = TYPE_LLC_SNAP;
  642. u_short ox_id = OX_ID_FIRST_SEQUENCE;
  643. u_int my_mtu = fi->g.my_mtu;
  644. ENTER("tx_arp_packet");
  645. opcode = opcode << 8 | data[ARP_OPCODE_1];
  646. fi->g.type_of_frame = FC_IP;
  647. if (opcode == ARPOP_REQUEST) {
  648. struct fc_node_info *q = fi->node_info_list;
  649. d_id = BROADCAST;
  650. return_value |= tx_exchange(fi, data, len, r_ctl, type, d_id, my_mtu, int_required, ox_id, TYPE_LLC_SNAP);
  651. /* Some devices support HW_TYPE 0x01 */
  652. memcpy(fi->g.arp_buffer, data - 2*FC_ALEN, len + 2*FC_ALEN);
  653. fi->g.arp_buffer[9 + 2*FC_ALEN] = 0x01;
  654. return_value |= tx_exchange(fi, (char *)(fi->g.arp_buffer + 2*FC_ALEN), len, r_ctl, type, d_id, my_mtu, int_required, ox_id, TYPE_LLC_SNAP);
  655. /* Do unicast to local nodes.
  656.  */
  657. while(q != NULL) {
  658. fi->g.type_of_frame = FC_BROADCAST;
  659. d_id = q->d_id;
  660. if ((d_id & 0xFFFF00) == fi->g.my_ddaa) {
  661. return_value |= tx_exchange(fi, data, len, r_ctl, type, d_id, my_mtu, int_required, ox_id, TYPE_LLC_SNAP);
  662. // Some devices support HW_TYPE 0x01
  663. memcpy(fi->g.arp_buffer, data - 2*FC_ALEN, len + 2*FC_ALEN);
  664. fi->g.arp_buffer[9 + 2*FC_ALEN] = 0x01;
  665. return_value |= tx_exchange(fi, (char *)(fi->g.arp_buffer + 2*FC_ALEN), len, r_ctl, type, d_id, my_mtu, int_required, ox_id, TYPE_LLC_SNAP);
  666. }
  667. q = q->next;
  668. }
  669. return return_value;
  670. }
  671. else
  672. if (opcode == ARPOP_REPLY) {
  673. struct fc_node_info *q; u_int mtu;
  674. DPRINTK("We are sending out an ARP reply");
  675. q = look_up_cache(fi, data - 2*FC_ALEN);
  676. if (q != NULL) {
  677. d_id = q->d_id;
  678. DPRINTK("Look-Up Cache Succeeded for d_id = %x", d_id);
  679. mtu = q->mtu;
  680. if (q->login == LOGIN_COMPLETED){
  681. tx_exchange(fi, data, len, r_ctl, type, d_id, mtu, int_required, ox_id, TYPE_LLC_SNAP);
  682. /* Some devices support HW_TYPE 0x01 */
  683. memcpy(fi->g.arp_buffer, data - 2*FC_ALEN, len + 2*FC_ALEN);
  684. fi->g.arp_buffer[9 + 2*FC_ALEN] = 0x01;
  685. return tx_exchange(fi, (char *)(fi->g.arp_buffer + 2*FC_ALEN), len, r_ctl, type, d_id, my_mtu, int_required, ox_id, TYPE_LLC_SNAP);
  686. }
  687. else {
  688. DPRINTK1("Node not logged in... Txing PLOGI to %x", d_id);
  689. tx_logi(fi, ELS_PLOGI, d_id); /* FIXME: we are dumping the frame here */
  690. }
  691. }
  692. DPRINTK2("Look-Up Cache Failed");
  693. }
  694. else {
  695. T_MSG("Warning!!! Invalid Opcode in ARP Packet!");
  696. }
  697. LEAVE("tx_arp_packet");
  698. return 0;
  699. }
  700. static void rx_net_packet(struct fc_info *fi, u_char *buff_addr, int payload_size)
  701. {
  702. struct net_device *dev = fi->dev;
  703. struct sk_buff *skb;
  704. u_int skb_size = 0;
  705. struct fch_hdr fch;
  706. ENTER("rx_net_packet");
  707. skb_size = payload_size - TACHYON_HEADER_LEN;
  708. DPRINTK("skb_size = %d", skb_size);
  709. fi->fc_stats.rx_bytes += skb_size - 2;
  710. skb = dev_alloc_skb(skb_size);
  711. if (skb == NULL) {
  712. printk(KERN_NOTICE "%s: In rx_net_packet() Memory squeeze, dropping packet.n", dev->name);
  713. fi->fc_stats.rx_dropped++;
  714. return;
  715. }
  716. /* Skip over the Tachyon Frame Header.
  717.  */
  718. buff_addr += TACHYON_HEADER_LEN; 
  719. memcpy(fch.daddr, buff_addr + 2, FC_ALEN);
  720. memcpy(fch.saddr, buff_addr + 10, FC_ALEN);
  721. buff_addr += 2;
  722. memcpy(buff_addr, fch.daddr, FC_ALEN);
  723. memcpy(buff_addr + 6, fch.saddr, FC_ALEN);
  724. skb_reserve(skb, 2);
  725. memcpy(skb_put(skb, skb_size - 2), buff_addr, skb_size - 2);
  726. skb->dev = dev;
  727. skb->protocol = fc_type_trans(skb, dev);
  728. DPRINTK("protocol = %x", skb->protocol);
  729. /* Hmmm... to accept HW Type 0x01 as well... 
  730.  */
  731. if (skb->protocol == ntohs(ETH_P_ARP))
  732. skb->data[1] = 0x06;
  733. netif_rx(skb);
  734. dev->last_rx = jiffies;
  735. fi->fc_stats.rx_packets++;
  736. LEAVE("rx_net_packet");
  737. }
  738. static void rx_net_mfs_packet(struct fc_info *fi, struct sk_buff *skb)
  739. {
  740. struct net_device *dev = fi->dev;
  741. struct fch_hdr fch;
  742. ENTER("rx_net_mfs_packet");
  743. /* Construct your Hard Header */
  744. memcpy(fch.daddr, skb->data + 2, FC_ALEN);
  745. memcpy(fch.saddr, skb->data + 10, FC_ALEN);
  746. skb_pull(skb, 2);
  747. memcpy(skb->data, fch.daddr, FC_ALEN);
  748. memcpy(skb->data + 6, fch.saddr, FC_ALEN);
  749. skb->dev = dev;
  750. skb->protocol = fc_type_trans(skb, dev);
  751. DPRINTK("protocol = %x", skb->protocol);
  752. netif_rx(skb);
  753. dev->last_rx = jiffies;
  754. LEAVE("rx_net_mfs_packet");
  755. }
  756. unsigned short fc_type_trans(struct sk_buff *skb, struct net_device *dev) 
  757. {
  758. struct fch_hdr *fch=(struct fch_hdr *)skb->data;
  759. struct fcllc *fcllc;
  760. skb->mac.raw = skb->data;
  761. fcllc = (struct fcllc *)(skb->data + sizeof(struct fch_hdr) + 2);
  762. skb_pull(skb,sizeof(struct fch_hdr) + 2);
  763. if(*fch->daddr & 1) {
  764. if(!memcmp(fch->daddr,dev->broadcast,FC_ALEN)) 
  765. skb->pkt_type = PACKET_BROADCAST;
  766. else
  767. skb->pkt_type = PACKET_MULTICAST;
  768. }
  769. else if(dev->flags & IFF_PROMISC) {
  770. if(memcmp(fch->daddr, dev->dev_addr, FC_ALEN))
  771. skb->pkt_type=PACKET_OTHERHOST;
  772. }
  773. /* Strip the SNAP header from ARP packets since we don't 
  774.  * pass them through to the 802.2/SNAP layers.
  775.  */
  776. if (fcllc->dsap == EXTENDED_SAP &&
  777. (fcllc->ethertype == ntohs(ETH_P_IP) ||
  778.  fcllc->ethertype == ntohs(ETH_P_ARP))) {
  779. skb_pull(skb, sizeof(struct fcllc));
  780. return fcllc->ethertype;
  781. }
  782. return ntohs(ETH_P_802_2);
  783. }
  784. static int tx_exchange(struct fc_info *fi, char *data, u_int len, u_int r_ctl, u_int type, u_int d_id, u_int mtu, int int_required, u_short tx_ox_id, u_int frame_class)
  785. {
  786. u_char df_ctl; 
  787. int NW_flag = 0, h_size, return_value;
  788. u_short rx_id = RX_ID_FIRST_SEQUENCE;
  789. u_int tachyon_status;
  790. u_int my_id = fi->g.my_id;
  791. ENTER("tx_exchange");
  792. tachyon_status = readl(fi->t_r.ptr_tach_status_reg);
  793. DPRINTK("Tachyon Status = %x len = %d MTU = %d", tachyon_status, len, mtu);
  794. if (tachyon_status & OSM_FROZEN) {
  795. reset_tachyon(fi, ERROR_RELEASE);
  796. reset_tachyon(fi, OCQ_RESET);
  797. DPRINTK("Tachyon Status = %x len = %d MTU = %d", tachyon_status, len, mtu);
  798. }
  799. if (tx_ox_id == OX_ID_FIRST_SEQUENCE) {
  800. switch(fi->g.type_of_frame) {
  801. case FC_SCSI_READ:
  802. tx_ox_id = fi->g.scsi_oxid | SCSI_READ_BIT;
  803. break;
  804. case FC_SCSI_WRITE:
  805. tx_ox_id = fi->g.scsi_oxid;
  806. break;
  807. default:
  808. tx_ox_id = fi->g.ox_id;
  809. break;
  810. }
  811. }
  812. else {
  813. switch(fi->g.type_of_frame) {
  814. case FC_SCSI_READ:
  815. rx_id = fi->g.scsi_oxid | SCSI_READ_BIT;
  816. break;
  817. case FC_SCSI_WRITE:
  818. rx_id = fi->g.scsi_oxid;
  819. break;
  820. case FC_BLS:
  821. rx_id = RX_ID_FIRST_SEQUENCE;
  822. break;
  823. default:
  824. rx_id = fi->g.ox_id;
  825. break;
  826. }
  827. }
  828. if (type == TYPE_LLC_SNAP) {
  829. df_ctl = 0x20;
  830. NW_flag = 1;
  831. /* Multi Frame Sequence ? If yes, set RO bit */
  832. if (len > mtu)
  833. type |= RELATIVE_OFF_PRESENT;
  834. build_tachyon_header(fi, my_id, r_ctl, d_id, type, fi->g.seq_id, df_ctl, tx_ox_id, rx_id, data - 2*FC_ALEN);
  835. }
  836. else {
  837. df_ctl = 0;
  838. /* Multi Frame Sequence ? If yes, set RO bit */
  839. if (len > mtu)
  840. type |= RELATIVE_OFF_PRESENT;
  841. build_tachyon_header(fi, my_id, r_ctl, d_id, type, fi->g.seq_id, df_ctl, tx_ox_id, rx_id, NULL);
  842. }
  843. /* Get free Tachyon Headers and EDBs */
  844. if (get_free_header(fi) || get_free_EDB(fi))
  845. return 0;
  846. if ((type & 0xFF000000) == TYPE_LLC_SNAP) {
  847. h_size =  TACHYON_HEADER_LEN + NW_HEADER_LEN;
  848. memcpy(fi->q.ptr_tachyon_header[fi->q.tachyon_header_indx], &(fi->g.tach_header), h_size);
  849. }
  850. else 
  851. memcpy(fi->q.ptr_tachyon_header[fi->q.tachyon_header_indx], &(fi->g.tach_header), TACHYON_HEADER_LEN);
  852. return_value = tx_sequence(fi, data, len, mtu, d_id, tx_ox_id, rx_id, fi->g.seq_id, NW_flag, int_required, frame_class);
  853. switch(fi->g.type_of_frame) {
  854. case FC_SCSI_READ:
  855. case FC_SCSI_WRITE:
  856. update_scsi_oxid(fi);
  857. break;
  858. case FC_BLS:
  859. break;
  860. default:
  861. fi->g.ox_id++;
  862. if (fi->g.ox_id == 0xFFFF)
  863. fi->g.ox_id = NOT_SCSI_XID;
  864. break;
  865. }
  866. if (fi->g.seq_id == MAX_SEQ_ID)
  867. fi->g.seq_id = 0;
  868. else
  869. fi->g.seq_id++;
  870. LEAVE("tx_exchange");
  871. return return_value;
  872. }
  873. static int tx_sequence(struct fc_info *fi, char *data, u_int len, u_int mtu, u_int d_id, u_short ox_id, u_short rx_id, u_char seq_id, int NW_flag, int int_required, u_int frame_class)
  874. {
  875. u_int cntl = 0;
  876. int return_value;
  877. ENTER("tx_sequence");
  878. build_EDB(fi, data, EDB_END, len);
  879. memcpy(fi->q.ptr_edb[fi->q.edb_buffer_indx], &(fi->g.edb), sizeof(EDB));
  880. build_ODB(fi, seq_id, d_id, len, cntl, mtu, ox_id, rx_id, NW_flag, int_required, frame_class);
  881. memcpy(fi->q.ptr_odb[fi->q.ocq_prod_indx], &(fi->g.odb), sizeof(ODB));
  882. if (fi->g.link_up != TRUE) {
  883. DPRINTK2("Fibre Channel Link not up. Dropping Exchange!");
  884. return_value = FALSE;
  885. }
  886. else {
  887. /* To be on the safe side, a check should be included
  888.  * at this point to check if we are overrunning 
  889.  * Tachyon.
  890.  */
  891. update_OCQ_indx(fi);
  892. return_value = TRUE;
  893. }
  894. update_EDB_indx(fi);
  895. update_tachyon_header_indx(fi);
  896. LEAVE("tx_sequence");
  897. return return_value;
  898. }
  899. static int get_free_header(struct fc_info *fi)
  900. {
  901. u_short temp_ox_id;
  902. u_int *tach_header, initial_indx = fi->q.tachyon_header_indx;
  903. /* Check if the header is in use.
  904.  * We could have an outstanding command.
  905.  * We should find a free slot as we can queue a
  906.  * maximum of 32 SCSI commands only. 
  907.  */
  908. tach_header = fi->q.ptr_tachyon_header[fi->q.tachyon_header_indx];
  909. temp_ox_id = ntohl(*(tach_header + 6)) >> 16;
  910. /* We care about the SCSI writes only. Those are the wicked ones
  911.  * that need an additional set of buffers.
  912.  */
  913. while(temp_ox_id <= MAX_SCSI_XID) {
  914. update_tachyon_header_indx(fi);
  915. if (fi->q.tachyon_header_indx == initial_indx) {
  916. /* Should never happen.
  917.  */
  918. T_MSG("No free Tachyon headers available");
  919. reset_tachyon(fi, SOFTWARE_RESET);
  920. return 1;
  921. }
  922. tach_header = fi->q.ptr_tachyon_header[fi->q.tachyon_header_indx];
  923. temp_ox_id = ntohl(*(tach_header + 6)) >> 16;
  924. }
  925. return 0;
  926. }
  927. static int get_free_EDB(struct fc_info *fi)
  928. {
  929. unsigned int initial_indx = fi->q.edb_buffer_indx;
  930. /* Check if the EDB is in use.
  931.  * We could have an outstanding SCSI Write command.
  932.  * We should find a free slot as we can queue a
  933.  * maximum of 32 SCSI commands only. 
  934.  */
  935. while (fi->q.free_edb_list[fi->q.edb_buffer_indx] != EDB_FREE) {
  936. update_EDB_indx(fi);
  937. if (fi->q.edb_buffer_indx == initial_indx) {
  938. T_MSG("No free EDB buffers avaliable")
  939. reset_tachyon(fi, SOFTWARE_RESET);
  940. return 1;
  941. }
  942. }
  943. return 0;
  944. }
  945. static int validate_login(struct fc_info *fi, u_int *base_ptr)
  946. {
  947. struct fc_node_info *q = fi->node_info_list;
  948. char n_port_name[PORT_NAME_LEN];
  949. char node_name[NODE_NAME_LEN];
  950. u_int s_id;
  951. ENTER("validate_login");
  952. /*index to Port Name in the payload. We need the 8 byte Port Name */
  953. memcpy(n_port_name, base_ptr + 10, PORT_NAME_LEN);
  954. memcpy(node_name, base_ptr + 12, NODE_NAME_LEN);
  955. s_id = ntohl(*(base_ptr + 3)) & 0x00FFFFFF;
  956. /* check if Fibre Channel IDs have changed */
  957. while(q != NULL) {
  958. if (memcmp(n_port_name, q->hw_addr, PORT_NAME_LEN) == 0) {
  959. if ((s_id != q->d_id) || (memcmp(node_name, q->node_name, NODE_NAME_LEN) != 0)) {
  960. DPRINTK1("Fibre Channel ID of Node has changed. Txing LOGO.");
  961. return 0;
  962. }
  963. q->login = LOGIN_COMPLETED;
  964. #if DEBUG_5526_2
  965. display_cache(fi);
  966. #endif
  967. return 1;
  968. }
  969. q = q->next;
  970. }
  971. DPRINTK1("Port Name does not match. Txing LOGO.");
  972. return 0;
  973. LEAVE("validate_login");
  974. }
  975. static void add_to_address_cache(struct fc_info *fi, u_int *base_ptr)
  976. {
  977. int size = sizeof(struct fc_node_info);
  978. struct fc_node_info *p, *q = fi->node_info_list, *r = NULL;
  979. char n_port_name[PORT_NAME_LEN];
  980. u_int s_id;
  981. ENTER("add_to_address_cache");
  982. /*index to Port Name in the payload. We need the 8 byte Port Name */
  983. memcpy(n_port_name, base_ptr + 13, PORT_NAME_LEN);
  984. s_id = ntohl(*(base_ptr + 3)) & 0x00FFFFFF;
  985. /* check if info already exists */
  986. while(q != NULL) {
  987. if (memcmp(n_port_name, q->hw_addr, PORT_NAME_LEN) == 0) {
  988. if (s_id != q->d_id) {
  989. memcpy(&(q->c_of_s[0]), base_ptr + 17, 3 * sizeof(CLASS_OF_SERVICE));
  990. q->mtu = ntohl(*(base_ptr + 10)) & 0x00000FFF;
  991. q->d_id = s_id;
  992. memcpy(q->node_name, base_ptr + 15, NODE_NAME_LEN);
  993. }
  994. q->login = LOGIN_COMPLETED;
  995. q->scsi = FALSE;
  996. fi->num_nodes++;
  997. #if DEBUG_5526_2
  998. display_cache(fi);
  999. #endif
  1000. return;
  1001. }
  1002. r = q;
  1003. q = q->next;
  1004. }
  1005. p = (struct fc_node_info *)kmalloc(size, GFP_ATOMIC);
  1006. if (p == NULL) {
  1007. T_MSG("kmalloc failed in add_to_address_cache()");
  1008. return;
  1009. }
  1010. memcpy(&(p->c_of_s[0]), base_ptr + 17, 3 * sizeof(CLASS_OF_SERVICE));
  1011. p->mtu = ntohl(*(base_ptr + 10)) & 0x00000FFF;
  1012. p->d_id = s_id;
  1013. memcpy(p->hw_addr, base_ptr + 13, PORT_NAME_LEN);
  1014. memcpy(p->node_name, base_ptr + 15, NODE_NAME_LEN);
  1015. p->login = LOGIN_COMPLETED;
  1016. p->scsi = FALSE;
  1017. p->target_id = 0xFF;
  1018. p->next = NULL;
  1019. if (fi->node_info_list == NULL)
  1020. fi->node_info_list = p;
  1021. else
  1022. r->next = p;
  1023. fi->num_nodes++;
  1024. #if DEBUG_5526_2
  1025. display_cache(fi);
  1026. #endif
  1027. LEAVE("add_to_address_cache");
  1028. return;
  1029. }
  1030. static void remove_from_address_cache(struct fc_info *fi, u_int *base_ptr, u_int cmnd_code)
  1031. {
  1032. struct fc_node_info *q = fi->node_info_list;
  1033. u_int s_id;
  1034. ENTER("remove_from_address_cache");
  1035. s_id = ntohl(*(base_ptr + 3)) & 0x00FFFFFF;
  1036. switch(cmnd_code) {
  1037. case ELS_LOGO:
  1038. /* check if info exists */
  1039. while (q != NULL) {
  1040. if (s_id == q->d_id) {
  1041. if (q->login == LOGIN_COMPLETED)
  1042. q->login = LOGIN_ATTEMPTED;
  1043. if (fi->num_nodes > 0)
  1044. fi->num_nodes--;
  1045. #if DEBUG_5526_2
  1046. display_cache(fi);
  1047. #endif
  1048. return;
  1049. }
  1050. q = q->next;
  1051. }
  1052. DPRINTK1("ELS_LOGO received from node 0x%x which is not logged-in", s_id);
  1053. break;
  1054. case ELS_RSCN:
  1055. {
  1056. int payload_len = ntohl(*(base_ptr + 8)) & 0xFF;
  1057. int no_of_pages, i;
  1058. u_char address_format;
  1059. u_short received_ox_id = ntohl(*(base_ptr + 6)) >> 16;
  1060. u_int node_id, mask, *page_ptr = base_ptr + 9;
  1061. if ((payload_len < 4) || (payload_len > 256)) {
  1062. DPRINTK1("RSCN with invalid payload length received");
  1063. tx_ls_rjt(fi, s_id, received_ox_id, LOGICAL_ERR, RECV_FIELD_SIZE);
  1064. return;
  1065. }
  1066. /* Page_size includes the Command Code */
  1067. no_of_pages = (payload_len / 4) - 1;
  1068. for (i = 0; i < no_of_pages; i++) {
  1069. address_format = ntohl(*page_ptr) >> 24; 
  1070. node_id = ntohl(*page_ptr) & 0x00FFFFFF;
  1071. switch(address_format) {
  1072. case PORT_ADDRESS_FORMAT:
  1073. rscn_handler(fi, node_id);
  1074. break;
  1075. case AREA_ADDRESS_FORMAT:
  1076. case DOMAIN_ADDRESS_FORMAT:
  1077. if (address_format == AREA_ADDRESS_FORMAT)
  1078. mask = 0xFFFF00;
  1079. else
  1080. mask = 0xFF0000;
  1081. while(q != NULL) {
  1082. if ((q->d_id & mask) == (node_id & mask)) 
  1083. rscn_handler(fi, q->d_id);
  1084. q = q->next;
  1085. }
  1086. /* There might be some new nodes to be 
  1087.  * discovered. But, some of the earlier 
  1088.  * requests as a result of the RSCN might be 
  1089.  * in progress. We dont want to duplicate that 
  1090.  * effort. So letz call SCR after a lag.
  1091.  */
  1092. fi->explore_timer.function = scr_timer;
  1093. fi->explore_timer.data = (unsigned long)fi;
  1094. fi->explore_timer.expires = RUN_AT((no_of_pages*3*HZ)/100); 
  1095. init_timer(&fi->explore_timer);
  1096. add_timer(&fi->explore_timer);
  1097. break;
  1098. default:
  1099. T_MSG("RSCN with invalid address format received");
  1100. tx_ls_rjt(fi, s_id, received_ox_id, LOGICAL_ERR, NO_EXPLN);
  1101. }
  1102. page_ptr += 1;
  1103. } /* end of for loop */
  1104. } /* end of case RSCN: */
  1105. break;
  1106. }
  1107. #if DEBUG_5526_2
  1108. display_cache(fi);
  1109. #endif
  1110. LEAVE("remove_from_address_cache");
  1111. }
  1112. static void rscn_handler(struct fc_info *fi, u_int node_id)
  1113. {
  1114. struct fc_node_info *q = fi->node_info_list;
  1115. int login_state = sid_logged_in(fi, node_id);
  1116. if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) {
  1117. while(q != NULL) {
  1118. if (q->d_id == node_id) {
  1119. q->login = LOGIN_ATTEMPTED;
  1120. if (fi->num_nodes > 0)
  1121. fi->num_nodes--;
  1122. break;
  1123. }
  1124. else
  1125. q = q->next;
  1126. }
  1127. }
  1128. else
  1129. if (login_state == NODE_LOGGED_OUT)
  1130. tx_adisc(fi, ELS_ADISC, node_id, OX_ID_FIRST_SEQUENCE); 
  1131. else
  1132. if (login_state == NODE_LOGGED_OUT)
  1133. tx_logi(fi, ELS_PLOGI, node_id);
  1134. }
  1135. static void scr_timer(unsigned long data)
  1136. {
  1137. struct fc_info *fi = (struct fc_info *)data;
  1138. del_timer(&fi->explore_timer);
  1139. tx_name_server_req(fi, FCS_GP_ID4);
  1140. }
  1141. static int sid_logged_in(struct fc_info *fi, u_int s_id)
  1142. {
  1143. struct fc_node_info *temp = fi->node_info_list;
  1144. while(temp != NULL)
  1145. if ((temp->d_id == s_id) && (temp->login == LOGIN_COMPLETED)) {
  1146. if (temp->scsi != FALSE)
  1147. return NODE_PROCESS_LOGGED_IN;
  1148. else
  1149. return NODE_LOGGED_IN;
  1150. }
  1151. else
  1152. if ((temp->d_id == s_id) && (temp->login != LOGIN_COMPLETED))
  1153. return NODE_LOGGED_OUT;
  1154. else
  1155. temp = temp->next;
  1156. return NODE_NOT_PRESENT;
  1157. }
  1158. static void mark_scsi_sid(struct fc_info *fi, u_int *buff_addr, u_char action)
  1159. {
  1160. struct fc_node_info *temp = fi->node_info_list;
  1161. u_int s_id;
  1162. u_int service_params;
  1163. s_id = ntohl(*(buff_addr + 3)) & 0x00FFFFFF;
  1164. service_params = ntohl(*(buff_addr + 12)) & 0x000000F0;
  1165. while(temp != NULL)
  1166. if ((temp->d_id == s_id) && (temp->login == LOGIN_COMPLETED)) {
  1167. if (action == DELETE_ENTRY) {
  1168. temp->scsi = FALSE;
  1169. #if DEBUG_5526_2
  1170. display_cache(fi);
  1171. #endif
  1172. return;
  1173. }
  1174. /* Check if it is a SCSI Target */
  1175. if (!(service_params & TARGET_FUNC)) {
  1176. temp->scsi = INITIATOR;
  1177. #if DEBUG_5526_2
  1178. display_cache(fi);
  1179. #endif
  1180. return;
  1181. }
  1182. temp->scsi = TARGET;
  1183. /* This helps to maintain the target_id no matter what your
  1184.  *  Fibre Channel ID is.
  1185.  */
  1186. if (temp->target_id == 0xFF) {
  1187. if (fi->g.no_of_targets <= MAX_SCSI_TARGETS)
  1188. temp->target_id = fi->g.no_of_targets++;
  1189. else
  1190. T_MSG("MAX TARGETS reached!");
  1191. }
  1192. else
  1193. DPRINTK1("Target_id %d already present", temp->target_id);
  1194. #if DEBUG_5526_2
  1195. display_cache(fi);
  1196. #endif
  1197. return;
  1198. }
  1199. else
  1200. temp = temp->next;
  1201. return;
  1202. }
  1203. static int node_logged_in_prev(struct fc_info *fi, u_int *buff_addr)
  1204. {
  1205. struct fc_node_info *temp;
  1206. u_char *data = (u_char *)buff_addr;
  1207. u_int s_id;
  1208. char node_name[NODE_NAME_LEN];
  1209. s_id = ntohl(*(buff_addr + 3)) & 0x00FFFFFF;
  1210. memcpy(node_name, buff_addr + 12, NODE_NAME_LEN);
  1211. /* point to port_name in the ADISC payload */
  1212. data += 10 * 4;
  1213. /* point to last 6 bytes of port_name */
  1214. data += 2;
  1215. temp = look_up_cache(fi, data);
  1216. if (temp != NULL) {
  1217. if ((temp->d_id == s_id) && (memcmp(node_name, temp->node_name, NODE_NAME_LEN) == 0)) {
  1218. temp->login = LOGIN_COMPLETED;
  1219. #if DEBUG_5526_2
  1220. display_cache(fi);
  1221. #endif
  1222. return TRUE;
  1223. }
  1224. }
  1225. return FALSE;
  1226. }
  1227. static struct fc_node_info *look_up_cache(struct fc_info *fi, char *data)
  1228. {
  1229. struct fc_node_info *temp_list = fi->node_info_list, *q;
  1230. u_char n_port_name[FC_ALEN], temp_addr[FC_ALEN];
  1231. ENTER("look_up_cache");
  1232. memcpy(n_port_name, data, FC_ALEN);
  1233. while(temp_list) {
  1234. if (memcmp(n_port_name, &(temp_list->hw_addr[2]), FC_ALEN) == 0)
  1235. return temp_list;
  1236. else
  1237. temp_list = temp_list->next;
  1238. }
  1239. /* Broadcast IP ?
  1240.  */
  1241. temp_addr[0] = temp_addr[1] = temp_addr[2] = 0xFF;
  1242. temp_addr[3] = temp_addr[4] = temp_addr[5] = 0xFF;
  1243. if (memcmp(n_port_name, temp_addr, FC_ALEN) == 0) {
  1244. q = (struct fc_node_info *)kmalloc(sizeof(struct fc_node_info), GFP_ATOMIC);
  1245. if (q == NULL) {
  1246. T_MSG("kmalloc failed in look_up_cache()");
  1247. return NULL;
  1248. }
  1249. q->d_id = BROADCAST;
  1250. return q;
  1251. }
  1252. LEAVE("look_up_cache");
  1253. return NULL;
  1254. }
  1255. static int display_cache(struct fc_info *fi)
  1256. {
  1257. struct fc_node_info *q = fi->node_info_list;
  1258. #if DEBUG_5526_2
  1259. struct ox_id_els_map *temp_ox_id_list = fi->ox_id_list;
  1260. #endif
  1261. int count = 0, j;
  1262. printk("nFibre Channel Node Information for %sn", fi->name);
  1263. printk("My FC_ID = %x, My WWN = %x %x, ", fi->g.my_id, fi->g.my_node_name_high, fi->g.my_node_name_low);
  1264. if (fi->g.ptp_up == TRUE)
  1265. printk("Port_Type = N_Portn");
  1266. if (fi->g.loop_up == TRUE)
  1267. printk("Port_Type = L_Portn");
  1268. while(q != NULL) {
  1269. printk("WWN = ");
  1270. for (j = 0; j < PORT_NAME_LEN; j++)
  1271. printk("%x ", q->hw_addr[j]); 
  1272. printk("FC_ID = %x, ", q->d_id);
  1273. printk("Login = ");
  1274. if (q->login == LOGIN_COMPLETED)
  1275. printk("ON ");
  1276. else
  1277. printk("OFF ");
  1278. if (q->scsi == TARGET)
  1279. printk("Target_ID = %d ", q->target_id);
  1280. printk("n");
  1281. q = q->next;
  1282. count++;
  1283. }
  1284. #if DEBUG_5526_2
  1285. printk("OX_ID -> ELS Mapn");
  1286. while(temp_ox_id_list) {
  1287. printk("ox_id = %x, ELS = %xn", temp_ox_id_list->ox_id, temp_ox_id_list->els);
  1288. temp_ox_id_list = temp_ox_id_list->next;
  1289. }
  1290. #endif
  1291. return 0;
  1292. }
  1293. static struct net_device_stats * iph5526_get_stats(struct net_device *dev)
  1294. {
  1295. struct fc_info *fi = (struct fc_info*)dev->priv; 
  1296. return (struct net_device_stats *) &fi->fc_stats;
  1297. }
  1298. /* SCSI stuff starts here */
  1299. int iph5526_detect(Scsi_Host_Template *tmpt)
  1300. {
  1301. struct Scsi_Host *host = NULL;
  1302. struct iph5526_hostdata *hostdata;
  1303. struct fc_info *fi = NULL;
  1304. int no_of_hosts = 0, timeout, i, j, count = 0;
  1305. u_int pci_maddr = 0;
  1306. struct pci_dev *pdev = NULL;
  1307. tmpt->proc_name = "iph5526";
  1308. if (pci_present() == 0) {
  1309. printk("iph5526: PCI not presentn");
  1310. return 0;
  1311. }
  1312. for (i = 0; i <= MAX_FC_CARDS; i++) 
  1313. fc[i] = NULL;
  1314. for (i = 0; i < clone_list[i].vendor_id != 0; i++)
  1315. while ((pdev = pci_find_device(clone_list[i].vendor_id, clone_list[i].device_id, pdev))) {
  1316. unsigned short pci_command;
  1317. if (pci_enable_device(pdev))
  1318. continue;
  1319. if (count < MAX_FC_CARDS) {
  1320. fc[count] = kmalloc(sizeof(struct fc_info), GFP_ATOMIC);
  1321. if (fc[count] == NULL) {
  1322. printk("iph5526.c: Unable to register card # %dn", count + 1);
  1323. return no_of_hosts;
  1324. }
  1325. memset(fc[count], 0, sizeof(struct fc_info));
  1326. }
  1327. else {
  1328. printk("iph5526.c: Maximum Number of cards reached.n");
  1329. return no_of_hosts;
  1330. }
  1331. fi = fc[count];
  1332. sprintf(fi->name, "fc%d", count);
  1333. host = scsi_register(tmpt, sizeof(struct iph5526_hostdata));
  1334. if(host==NULL)
  1335. return no_of_hosts;
  1336. hostdata = (struct iph5526_hostdata *)host->hostdata;
  1337. memset(hostdata, 0 , sizeof(struct iph5526_hostdata));
  1338. for (j = 0; j < MAX_SCSI_TARGETS; j++)
  1339. hostdata->tag_ages[j] = jiffies;
  1340. hostdata->fi = fi;
  1341. fi->host = host;
  1342. //host->max_id = MAX_SCSI_TARGETS;
  1343. host->max_id = 5;
  1344. host->hostt->use_new_eh_code = 1;
  1345. host->this_id = tmpt->this_id;
  1346. pci_maddr = pci_resource_start(pdev, 0);
  1347. if (pci_resource_flags(pdev, 0) & IORESOURCE_IO) {
  1348. printk("iph5526.c : Cannot find proper PCI device base address.n");
  1349. scsi_unregister(host);
  1350. kfree(fc[count]);
  1351. fc[count] = NULL;
  1352. continue;
  1353. }
  1354. DPRINTK("pci_maddr = %x", pci_maddr);
  1355. pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
  1356. pci_irq_line = pdev->irq;
  1357. printk("iph5526.c: PCI BIOS reports %s at i/o %#x, irq %d.n", clone_list[i].name, pci_maddr, pci_irq_line);
  1358. fi->g.mem_base = ioremap(pci_maddr & PAGE_MASK, 1024);
  1359. /* We use Memory Mapped IO. The initial space contains the
  1360.  * PCI Configuration registers followed by the (i) chip
  1361.  * registers followed by the Tachyon registers.
  1362.  */
  1363. /* Thatz where (i)chip maps Tachyon Address Space.
  1364.  */
  1365. fi->g.tachyon_base = (u_long)fi->g.mem_base + TACHYON_OFFSET + ( pci_maddr & ~PAGE_MASK );
  1366. DPRINTK("fi->g.tachyon_base = %x", (u_int)fi->g.tachyon_base);
  1367. if (fi->g.mem_base == NULL) {
  1368. printk("iph5526.c : ioremap failed!!!n");
  1369. scsi_unregister(host);
  1370. kfree(fc[count]);
  1371. fc[count] = NULL;
  1372. continue;
  1373. }
  1374. DPRINTK("IRQ1 = %dn", pci_irq_line);
  1375. printk(version);
  1376. fi->base_addr = (long) pdev;
  1377. if (pci_irq_line) {
  1378. int irqval = 0;
  1379. /* Found it, get IRQ.
  1380.  */
  1381. irqval = request_irq(pci_irq_line, &tachyon_interrupt, pci_irq_line ? SA_SHIRQ : 0, fi->name, host);
  1382. if (irqval) {
  1383. printk("iph5526.c : Unable to get IRQ %d (irqval = %d).n", pci_irq_line, irqval);
  1384. scsi_unregister(host);
  1385. kfree(fc[count]);
  1386. fc[count] = NULL;
  1387. continue;
  1388. }
  1389. host->irq = fi->irq = pci_irq_line;
  1390. pci_irq_line = 0;
  1391. fi->clone_id = clone_list[i].vendor_id;
  1392. }
  1393. if (!initialize_register_pointers(fi) || !tachyon_init(fi)) {
  1394. printk("iph5526.c: TACHYON initialization failed for card # %d!!!n", count + 1);
  1395. free_irq(host->irq, host);
  1396. scsi_unregister(host);
  1397. if (fi) 
  1398. clean_up_memory(fi);
  1399. kfree(fc[count]);
  1400. fc[count] = NULL;
  1401. break;
  1402. }
  1403. DPRINTK1("Fibre Channel card initialized");
  1404. /* Wait for the Link to come up and the login process 
  1405.  * to complete. 
  1406.  */
  1407. for(timeout = jiffies + 10*HZ; (timeout > jiffies) && ((fi->g.link_up == FALSE) || (fi->g.port_discovery == TRUE) || (fi->g.explore_fabric == TRUE) || (fi->g.perform_adisc == TRUE));)
  1408. barrier();
  1409. count++;
  1410. no_of_hosts++;
  1411. }
  1412. DPRINTK1("no_of_hosts = %d",no_of_hosts);
  1413. /* This is to make sure that the ACC to the PRLI comes in 
  1414.  * for the last ALPA. 
  1415.  */
  1416. mdelay(1000); /* Ugly! Let the Gods forgive me */
  1417. DPRINTK1("leaving iph5526_detectn");
  1418. return no_of_hosts;
  1419. }
  1420. int iph5526_biosparam(Disk * disk, kdev_t n, int ip[])
  1421. {
  1422. int size = disk->capacity;
  1423. ip[0] = 64;
  1424. ip[1] = 32;
  1425. ip[2] = size >> 11;
  1426. if (ip[2] > 1024) {
  1427. ip[0] = 255;
  1428. ip[1] = 63;
  1429. ip[2] = size / (ip[0] * ip[1]);
  1430. }
  1431. return 0;
  1432. }
  1433. int iph5526_queuecommand(Scsi_Cmnd *Cmnd, void (*done) (Scsi_Cmnd *))
  1434. {
  1435. int int_required = 0;
  1436. u_int r_ctl = FC4_DEVICE_DATA | UNSOLICITED_COMMAND;
  1437. u_int type = TYPE_FCP | SEQUENCE_INITIATIVE;
  1438. u_int frame_class = Cmnd->target;
  1439. u_short ox_id = OX_ID_FIRST_SEQUENCE;
  1440. struct Scsi_Host *host = Cmnd->host;
  1441. struct iph5526_hostdata *hostdata = (struct iph5526_hostdata*)host->hostdata;
  1442. struct fc_info *fi = hostdata->fi;
  1443. struct fc_node_info *q;
  1444. u_long flags;
  1445. ENTER("iph5526_queuecommand");
  1446. spin_lock_irqsave(&fi->fc_lock, flags);
  1447. Cmnd->scsi_done = done;
  1448. if (Cmnd->device->tagged_supported) {
  1449. switch(Cmnd->tag) {
  1450. case SIMPLE_QUEUE_TAG:
  1451. hostdata->cmnd.fcp_cntl = FCP_CNTL_QTYPE_SIMPLE;
  1452. break;
  1453. case HEAD_OF_QUEUE_TAG:
  1454. hostdata->cmnd.fcp_cntl = FCP_CNTL_QTYPE_HEAD_OF_Q;
  1455. break;
  1456. case  ORDERED_QUEUE_TAG:
  1457. hostdata->cmnd.fcp_cntl = FCP_CNTL_QTYPE_ORDERED;
  1458. break;
  1459. default:
  1460. if ((jiffies - hostdata->tag_ages[Cmnd->target]) > (5 * HZ)) {
  1461. hostdata->cmnd.fcp_cntl = FCP_CNTL_QTYPE_ORDERED;
  1462. hostdata->tag_ages[Cmnd->target] = jiffies;
  1463. }
  1464. else
  1465. hostdata->cmnd.fcp_cntl = FCP_CNTL_QTYPE_SIMPLE;
  1466. break;
  1467. }
  1468. }
  1469. /*else
  1470. hostdata->cmnd.fcp_cntl = FCP_CNTL_QTYPE_UNTAGGED;
  1471. */
  1472. hostdata->cmnd.fcp_addr[3] = 0;
  1473. hostdata->cmnd.fcp_addr[2] = 0;
  1474. hostdata->cmnd.fcp_addr[1] = 0;
  1475. hostdata->cmnd.fcp_addr[0] = htons(Cmnd->lun);
  1476. memcpy(&hostdata->cmnd.fcp_cdb, Cmnd->cmnd, Cmnd->cmd_len);
  1477. hostdata->cmnd.fcp_data_len = htonl(Cmnd->request_bufflen);
  1478. /* Get an used OX_ID. We could have pending commands.
  1479.  */
  1480. if (get_scsi_oxid(fi)) {
  1481. spin_unlock_irqrestore(&fi->fc_lock, flags);
  1482. return 1;
  1483. }
  1484. fi->q.free_scsi_oxid[fi->g.scsi_oxid] = OXID_INUSE;
  1485. /* Maintain a handler so that we can associate the done() function
  1486.  * on completion of the SCSI command. 
  1487.  */
  1488. hostdata->cmnd_handler[fi->g.scsi_oxid] = Cmnd;
  1489. switch(Cmnd->cmnd[0]) {
  1490. case WRITE_6:
  1491. case WRITE_10:
  1492. case WRITE_12:
  1493. fi->g.type_of_frame = FC_SCSI_WRITE;
  1494. hostdata->cmnd.fcp_cntl = htonl(FCP_CNTL_WRITE | hostdata->cmnd.fcp_cntl);
  1495. break;
  1496. default:
  1497. fi->g.type_of_frame = FC_SCSI_READ;
  1498. hostdata->cmnd.fcp_cntl = htonl(FCP_CNTL_READ | hostdata->cmnd.fcp_cntl);
  1499. }
  1500. memcpy(fi->q.ptr_fcp_cmnd[fi->q.fcp_cmnd_indx], &(hostdata->cmnd), sizeof(fcp_cmd));
  1501. q = resolve_target(fi, Cmnd->target);
  1502. if (q == NULL) {
  1503. u_int bad_id = fi->g.my_ddaa | 0xFE;
  1504. /* We transmit to an non-existant AL_PA so that the "done" 
  1505.  * function can be called while receiving the interrupt 
  1506.  * due to a Timeout for a bad AL_PA. In a PTP configuration,
  1507.  * the int_required field is set, since there is no notion
  1508.  * of AL_PAs. This approach sucks, but works alright!
  1509.  */
  1510. if (fi->g.ptp_up == TRUE)
  1511. int_required = 1;
  1512. tx_exchange(fi, (char *)(&(hostdata->cmnd)), sizeof(fcp_cmd), r_ctl, type, bad_id, fi->g.my_mtu, int_required, ox_id, FC_SCSI_BAD_TARGET);
  1513. spin_unlock_irqrestore(&fi->fc_lock, flags);
  1514. DPRINTK1("Target ID %x not present", Cmnd->target);
  1515. return 0;
  1516. }
  1517. if (q->login == LOGIN_COMPLETED) {
  1518. if (add_to_sest(fi, Cmnd, q)) {
  1519. DPRINTK1("add_to_sest() failed.");
  1520. spin_unlock_irqrestore(&fi->fc_lock, flags);
  1521. return 0;
  1522. }
  1523. tx_exchange(fi, (char *)(fi->q.ptr_fcp_cmnd[fi->q.fcp_cmnd_indx]), sizeof(fcp_cmd), r_ctl, type, q->d_id, q->mtu, int_required, ox_id, frame_class << 16);
  1524. update_FCP_CMND_indx(fi);
  1525. }
  1526. spin_unlock_irqrestore(&fi->fc_lock, flags);
  1527. /* If q != NULL, then we have a SCSI Target. 
  1528.  * If q->login != LOGIN_COMPLETED, then that device could be 
  1529.  * offline temporarily. So we let the command to time-out. 
  1530.  */
  1531. LEAVE("iph5526_queuecommand");
  1532. return 0;
  1533. }
  1534. int iph5526_abort(Scsi_Cmnd *Cmnd)
  1535. {
  1536. struct Scsi_Host *host = Cmnd->host;
  1537. struct iph5526_hostdata *hostdata = (struct iph5526_hostdata *)host->hostdata;
  1538. struct fc_info *fi = hostdata->fi;
  1539. struct fc_node_info *q;
  1540. u_int r_ctl = FC4_DEVICE_DATA | UNSOLICITED_COMMAND;
  1541. u_int type = TYPE_FCP | SEQUENCE_INITIATIVE;
  1542. u_short ox_id = OX_ID_FIRST_SEQUENCE;
  1543. int int_required = 1, i, abort_status = FALSE;
  1544. u_long flags;
  1545. ENTER("iph5526_abort");
  1546. spin_lock_irqsave(&fi->fc_lock, flags);
  1547. q = resolve_target(fi, Cmnd->target);
  1548. if (q == NULL) {
  1549. u_int bad_id = fi->g.my_ddaa | 0xFE;
  1550. /* This should not happen as we should always be able to
  1551.  * resolve a target id. But, jus in case...
  1552.  * We transmit to an non-existant AL_PA so that the done 
  1553.  * function can be called while receiving the interrupt 
  1554.  * for a bad AL_PA. 
  1555.  */
  1556. DPRINTK1("Unresolved Target ID!");
  1557. tx_exchange(fi, (char *)(&(hostdata->cmnd)), sizeof(fcp_cmd), r_ctl, type, bad_id, fi->g.my_mtu, int_required, ox_id, FC_SCSI_BAD_TARGET);
  1558. DPRINTK1("Target ID %x not present", Cmnd->target);
  1559. spin_unlock_irqrestore(&fi->fc_lock, flags);
  1560. return FAILED;
  1561. }
  1562. /* If q != NULL, then we have a SCSI Target. If 
  1563.  * q->login != LOGIN_COMPLETED, then that device could 
  1564.  * be offline temporarily. So we let the command to time-out. 
  1565.  */
  1566. /* Get the OX_ID for the Command to be aborted.
  1567.  */
  1568. for (i = 0; i <= MAX_SCSI_XID; i++) {
  1569. if (hostdata->cmnd_handler[i] == Cmnd) {
  1570. hostdata->cmnd_handler[i] = NULL;
  1571. ox_id = i;
  1572. break;
  1573. }
  1574. }
  1575. if (i > MAX_SCSI_XID) {
  1576. T_MSG("Command could not be resolved to OX_ID");
  1577. spin_unlock_irqrestore(&fi->fc_lock, flags);
  1578. return FAILED;
  1579. }
  1580. switch(Cmnd->cmnd[0]) {
  1581. case WRITE_6:
  1582. case WRITE_10:
  1583. case WRITE_12:
  1584. break;
  1585. default:
  1586. ox_id |= SCSI_READ_BIT;
  1587. }
  1588. abort_status = abort_exchange(fi, ox_id);
  1589. if ((q->login == LOGIN_COMPLETED) && (abort_status == TRUE)) {
  1590. /* Then, transmit an ABTS to the target. The rest 
  1591.  * is done when the BA_ACC is received for the ABTS.
  1592.      */
  1593. tx_abts(fi, q->d_id, ox_id);
  1594. }
  1595. else {
  1596. u_int STE_bit;
  1597. u_short x_id;
  1598. /* Invalidate resources for that Exchange.
  1599.  */
  1600. x_id = ox_id & MAX_SCSI_XID;
  1601. STE_bit = ntohl(*fi->q.ptr_sest[x_id]);
  1602. if (STE_bit & SEST_V) {
  1603. *(fi->q.ptr_sest[x_id]) &= htonl(SEST_INV);
  1604. invalidate_SEST_entry(fi, ox_id);
  1605. }
  1606. }
  1607. LEAVE("iph5526_abort");
  1608. spin_unlock_irqrestore(&fi->fc_lock, flags);
  1609. return SUCCESS;
  1610. }
  1611. static int abort_exchange(struct fc_info *fi, u_short ox_id)
  1612. {
  1613. u_short x_id;
  1614. volatile u_int flush_SEST, STE_bit;
  1615. x_id = ox_id & MAX_SCSI_XID;
  1616. DPRINTK1("Aborting Exchange %x", ox_id);
  1617. STE_bit = ntohl(*fi->q.ptr_sest[x_id]);
  1618. /* Is the Exchange still active?.
  1619.  */
  1620. if (STE_bit & SEST_V) {
  1621. if (ox_id & SCSI_READ_BIT) {
  1622. /* If the Exchange to be aborted is Inbound, 
  1623.  * Flush the SEST Entry from Tachyon's Cache.
  1624.  */
  1625. *(fi->q.ptr_sest[x_id]) &= htonl(SEST_INV);
  1626. flush_tachyon_cache(fi, ox_id);
  1627. flush_SEST = readl(fi->t_r.ptr_tach_flush_oxid_reg);
  1628. while ((flush_SEST & 0x80000000) != 0) 
  1629. flush_SEST = readl(fi->t_r.ptr_tach_flush_oxid_reg);
  1630. STE_bit = ntohl(*fi->q.ptr_sest[x_id]);
  1631. while ((STE_bit & 0x80000000) != 0)
  1632. STE_bit = ntohl(*fi->q.ptr_sest[x_id]);
  1633. flush_SEST = readl(fi->t_r.ptr_tach_flush_oxid_reg);
  1634. invalidate_SEST_entry(fi, ox_id);
  1635. }
  1636. else {
  1637. int i;
  1638. u_int *ptr_edb;
  1639. /* For In-Order Reassembly, the following is done:
  1640.  * First, write zero as the buffer length in the EDB. 
  1641.    */
  1642. ptr_edb = bus_to_virt(ntohl(*(fi->q.ptr_sest[x_id] + 7)));
  1643. for (i = 0; i < EDB_LEN; i++)
  1644. if (fi->q.ptr_edb[i] == ptr_edb)
  1645. break;
  1646. if (i < EDB_LEN) 
  1647. *ptr_edb = *ptr_edb & 0x0000FFFF;
  1648. else
  1649. T_MSG("EDB not found while clearing in abort_exchange()");
  1650. }
  1651. DPRINTK1("Exchange %x invalidated", ox_id);
  1652. return TRUE;
  1653. }
  1654. else {
  1655. DPRINTK1("SEST Entry for exchange %x not valid", ox_id);
  1656. return FALSE;
  1657. }
  1658. }
  1659. static void flush_tachyon_cache(struct fc_info *fi, u_short ox_id)
  1660. {
  1661. volatile u_int tachyon_status;
  1662. if (fi->g.loop_up == TRUE) {
  1663. writel(HOST_CONTROL, fi->t_r.ptr_fm_control_reg);
  1664. /* Make sure that the Inbound FIFO is empty.
  1665.  */
  1666. do {
  1667. tachyon_status = readl(fi->t_r.ptr_tach_status_reg);
  1668. udelay(200);
  1669. }while ((tachyon_status & RECEIVE_FIFO_EMPTY) == 0);
  1670. /* Ok. Go ahead and flushhhhhhhhh!
  1671.  */
  1672. writel(0x80000000 | ox_id, fi->t_r.ptr_tach_flush_oxid_reg);
  1673. writel(EXIT_HOST_CONTROL, fi->t_r.ptr_fm_control_reg);
  1674. return;
  1675. }
  1676. if (fi->g.ptp_up == TRUE) {
  1677. take_tachyon_offline(fi);
  1678. /* Make sure that the Inbound FIFO is empty.
  1679.  */
  1680. do {
  1681. tachyon_status = readl(fi->t_r.ptr_tach_status_reg);
  1682. udelay(200);
  1683. }while ((tachyon_status & RECEIVE_FIFO_EMPTY) == 0);
  1684. writel(0x80000000 | ox_id, fi->t_r.ptr_tach_flush_oxid_reg);
  1685. /* Write the Initialize command to the FM Control reg.
  1686.  */
  1687. fi->g.n_port_try = TRUE;
  1688. DPRINTK1("In abort_exchange, TACHYON initializing as N_Port...n");
  1689. writel(INITIALIZE, fi->t_r.ptr_fm_control_reg);
  1690. }
  1691. }
  1692. static struct fc_node_info *resolve_target(struct fc_info *fi, u_char target)
  1693. {
  1694. struct fc_node_info *temp = fi->node_info_list;
  1695. while(temp != NULL)
  1696. if (temp->target_id == target) {
  1697. if ((temp->scsi == TARGET) && (temp->login == LOGIN_COMPLETED))
  1698. return temp;
  1699. else {
  1700. if (temp->login != LOGIN_COMPLETED) {
  1701. /* The Target is not currently logged in.
  1702.  * It could be a Target on the Local Loop or
  1703.  * on a Remote Loop connected through a switch.
  1704.  * In either case, we will know whenever the Target
  1705.  * comes On-Line again. We let the command to 
  1706.  * time-out so that it gets retried.
  1707.  */
  1708. T_MSG("Target %d not logged in.", temp->target_id);
  1709. tx_logi(fi, ELS_PLOGI, temp->d_id);
  1710. return temp;
  1711. }
  1712. else {
  1713. if (temp->scsi != TARGET) {
  1714. /* For some reason, we did not get a response to
  1715.  * PRLI. Letz try it again...
  1716.  */
  1717. DPRINTK1("Node not PRLIied. Txing PRLI...");
  1718. tx_prli(fi, ELS_PRLI, temp->d_id, OX_ID_FIRST_SEQUENCE);
  1719. }
  1720. }
  1721. return temp;
  1722. }
  1723. }
  1724. else
  1725. temp = temp->next;
  1726. return NULL;
  1727. }
  1728. static int add_to_sest(struct fc_info *fi, Scsi_Cmnd *Cmnd, struct fc_node_info *ni)
  1729. {
  1730. /* we have at least 1 buffer, the terminator */
  1731. int no_of_sdb_buffers = 1, i; 
  1732. int no_of_edb_buffers = 0; 
  1733. u_int *req_buffer = (u_int *)Cmnd->request_buffer;
  1734. u_int *ptr_sdb = NULL;
  1735. struct scatterlist *sl1, *sl2 = NULL;
  1736. int no_of_sg = 0;
  1737. switch(fi->g.type_of_frame) {
  1738. case FC_SCSI_READ:
  1739. fi->g.inb_sest_entry.flags_and_byte_offset = htonl(INB_SEST_VED);
  1740. fi->g.inb_sest_entry.byte_count = 0;
  1741. fi->g.inb_sest_entry.no_of_recvd_frames = 0;
  1742. fi->g.inb_sest_entry.no_of_expected_frames = 0;
  1743. fi->g.inb_sest_entry.last_fctl = 0;
  1744. if (Cmnd->use_sg) {
  1745. no_of_sg = Cmnd->use_sg;
  1746. sl1 = sl2 = (struct scatterlist *)Cmnd->request_buffer;
  1747. for (i = 0; i < no_of_sg; i++) {
  1748. no_of_sdb_buffers += sl1->length / SEST_BUFFER_SIZE;
  1749. if (sl1->length % SEST_BUFFER_SIZE)
  1750. no_of_sdb_buffers++;
  1751. sl1++;
  1752. }
  1753. }
  1754. else {
  1755. no_of_sdb_buffers += Cmnd->request_bufflen / SEST_BUFFER_SIZE;
  1756. if (Cmnd->request_bufflen % SEST_BUFFER_SIZE)
  1757. no_of_sdb_buffers++;
  1758. } /* if !use_sg */
  1759. /* We are working with the premise that at the max we would
  1760.  * get a scatter-gather buffer containing 63 buffers
  1761.  * of size 1024 bytes each. Is it a _bad_ assumption?
  1762.  */
  1763. if (no_of_sdb_buffers > 512) {
  1764. T_MSG("Number of SDB buffers needed = %d", no_of_sdb_buffers);
  1765. T_MSG("Disable Scatter-Gather!!!");
  1766. return 1;
  1767. }
  1768. /* Store it in the sdb_table so that we can retrieve that
  1769.  * free up the memory when the Read Command completes.
  1770.  */
  1771. if (get_free_SDB(fi))
  1772. return 1;
  1773. ptr_sdb = fi->q.ptr_sdb_slot[fi->q.sdb_indx];
  1774. fi->q.sdb_slot_status[fi->q.sdb_indx] = SDB_BUSY;
  1775. fi->g.inb_sest_entry.sdb_address = htonl(virt_to_bus(ptr_sdb));
  1776. if (Cmnd->use_sg) {
  1777. int count = 0, j;
  1778. for(i = 0; i < no_of_sg; i++) {
  1779. char *addr_ptr = sl2->address;
  1780. count = sl2->length / SEST_BUFFER_SIZE;
  1781. if (sl2->length % SEST_BUFFER_SIZE)
  1782. count++;
  1783. for (j = 0; j < count; j++) {
  1784. *(ptr_sdb) = htonl(virt_to_bus(addr_ptr));
  1785. addr_ptr += SEST_BUFFER_SIZE;
  1786. ptr_sdb++;
  1787. }
  1788. count = 0;
  1789. sl2++;
  1790. }
  1791. }
  1792. else {
  1793. for (i = 0; i < no_of_sdb_buffers - 1; i++) {
  1794. *(ptr_sdb) = htonl(virt_to_bus(req_buffer));
  1795. req_buffer += SEST_BUFFER_SIZE/4;
  1796. ptr_sdb++;
  1797. }
  1798. }
  1799. *(ptr_sdb) = htonl(0x1); /* Terminator */
  1800. /* The scratch pad is used to hold the index into the SDB.
  1801.  */
  1802. fi->g.inb_sest_entry.scratch_pad = fi->q.sdb_indx;
  1803. fi->g.inb_sest_entry.expected_ro = 0;
  1804. fi->g.inb_sest_entry.buffer_index = 0;
  1805. fi->g.inb_sest_entry.buffer_offset = 0;
  1806. memcpy(fi->q.ptr_sest[fi->g.scsi_oxid], &fi->g.inb_sest_entry, sizeof(INB_SEST_ENTRY));
  1807. break;
  1808. case FC_SCSI_WRITE:
  1809. fi->g.outb_sest_entry.flags_and_did = htonl(OUTB_SEST_VED | ni->d_id);
  1810. fi->g.outb_sest_entry.max_frame_len = htons(ni->mtu << 4);
  1811. fi->g.outb_sest_entry.cntl = htons(ODB_CLASS_3 | ODB_EE_CREDIT | ODB_NO_INT | ODB_NO_COMP);
  1812. fi->g.outb_sest_entry.total_seq_length = INV_SEQ_LEN;
  1813. fi->g.outb_sest_entry.link = htons(OUTB_SEST_LINK);
  1814. fi->g.outb_sest_entry.transaction_id = htonl(fi->g.scsi_oxid);
  1815. fi->g.outb_sest_entry.seq_id = fi->g.seq_id;
  1816. fi->g.outb_sest_entry.reserved = 0x0;
  1817. fi->g.outb_sest_entry.header_length = htons(TACHYON_HEADER_LEN);
  1818. {
  1819. u_char df_ctl = 0;
  1820. u_short rx_id = RX_ID_FIRST_SEQUENCE;
  1821. u_int r_ctl = FC4_DEVICE_DATA | SOLICITED_DATA;
  1822. u_int type = TYPE_FCP | SEQUENCE_INITIATIVE;
  1823. /* Multi Frame Sequence ? If yes, set RO bit. 
  1824.  */
  1825. if (Cmnd->request_bufflen > ni->mtu)
  1826. type |= RELATIVE_OFF_PRESENT;
  1827. build_tachyon_header(fi, fi->g.my_id, r_ctl, ni->d_id, type, fi->g.seq_id, df_ctl, fi->g.scsi_oxid, rx_id, NULL);
  1828. if (get_free_header(fi) || get_free_EDB(fi))
  1829. return 1;
  1830. memcpy(fi->q.ptr_tachyon_header[fi->q.tachyon_header_indx], &(fi->g.tach_header), TACHYON_HEADER_LEN);
  1831. fi->g.outb_sest_entry.header_address = htonl(virt_to_bus(fi->q.ptr_tachyon_header[fi->q.tachyon_header_indx]));
  1832. update_tachyon_header_indx(fi);
  1833. }
  1834. if (Cmnd->use_sg) {
  1835. no_of_sg = Cmnd->use_sg;
  1836. sl1 = sl2 = (struct scatterlist *)Cmnd->request_buffer;
  1837. for (i = 0; i < no_of_sg; i++) {
  1838. no_of_edb_buffers += sl1->length / SEST_BUFFER_SIZE;
  1839. if (sl1->length % SEST_BUFFER_SIZE)
  1840. no_of_edb_buffers++;
  1841. sl1++;
  1842. }
  1843. }
  1844. else {
  1845. no_of_edb_buffers += Cmnd->request_bufflen / SEST_BUFFER_SIZE;
  1846. if (Cmnd->request_bufflen % SEST_BUFFER_SIZE)
  1847. no_of_edb_buffers++;
  1848. } /* if !use_sg */
  1849. /* We need "no_of_edb_buffers" _contiguous_ EDBs 
  1850.  * that are FREE. Check for that first.
  1851.  */
  1852. for (i = 0; i < no_of_edb_buffers; i++) {
  1853. int j;
  1854. if ((fi->q.edb_buffer_indx + no_of_edb_buffers) >= EDB_LEN)
  1855. fi->q.edb_buffer_indx = 0;
  1856. if (fi->q.free_edb_list[fi->q.edb_buffer_indx + i] != EDB_FREE) {
  1857. for (j = 0; j < i; j++)
  1858. update_EDB_indx(fi);
  1859. if (get_free_EDB(fi))
  1860. return 1;
  1861. i = 0;
  1862. }
  1863. }
  1864. /* We got enuff FREE EDBs.
  1865.  */
  1866. if (Cmnd->use_sg) {
  1867. fi->g.outb_sest_entry.edb_address = htonl(virt_to_bus(fi->q.ptr_edb[fi->q.edb_buffer_indx]));
  1868. sl1 = (struct scatterlist *)Cmnd->request_buffer;
  1869. for(i = 0; i < no_of_sg; i++) {
  1870. int count = 0, j;
  1871. count = sl1->length / SEST_BUFFER_SIZE;
  1872. for (j = 0; j < count; j++) {
  1873. build_EDB(fi, (char *)sl1->address, 0, SEST_BUFFER_SIZE);
  1874. memcpy(fi->q.ptr_edb[fi->q.edb_buffer_indx], &(fi->g.edb), sizeof(EDB));
  1875. /* Mark this EDB as being in use */
  1876. fi->q.free_edb_list[fi->q.edb_buffer_indx] = EDB_BUSY;
  1877. /* We have already made sure that we have enuff
  1878.      * free EDBs that are contiguous. So this is 
  1879.  * safe.
  1880.      */
  1881. update_EDB_indx(fi);
  1882. sl1->address += SEST_BUFFER_SIZE;
  1883. }
  1884. /* Just in case itz not a multiple of 
  1885.  * SEST_BUFFER_SIZE bytes.
  1886.  */
  1887. if (sl1->length % SEST_BUFFER_SIZE) {
  1888. build_EDB(fi, (char *)sl1->address, 0, sl1->length % SEST_BUFFER_SIZE);
  1889. memcpy(fi->q.ptr_edb[fi->q.edb_buffer_indx], &(fi->g.edb), sizeof(EDB));
  1890. fi->q.free_edb_list[fi->q.edb_buffer_indx] = EDB_BUSY;
  1891. update_EDB_indx(fi);
  1892. }
  1893. sl1++;
  1894. }
  1895. /* The last EDB is special. It needs the "end bit" to
  1896.  * be set.
  1897.  */
  1898. *(fi->q.ptr_edb[fi->q.edb_buffer_indx - 1] + 1) = *(fi->q.ptr_edb[fi->q.edb_buffer_indx - 1] + 1) | ntohs(EDB_END);
  1899. }
  1900. else {
  1901. int count = 0, j;
  1902. fi->g.outb_sest_entry.edb_address = htonl(virt_to_bus(fi->q.ptr_edb[fi->q.edb_buffer_indx]));
  1903. count = Cmnd->request_bufflen / SEST_BUFFER_SIZE;
  1904. for (j = 0; j < count; j++) {
  1905. build_EDB(fi, (char *)req_buffer, 0, SEST_BUFFER_SIZE);
  1906. memcpy(fi->q.ptr_edb[fi->q.edb_buffer_indx], &(fi->g.edb), sizeof(EDB));
  1907. /* Mark this EDB as being in use */
  1908. fi->q.free_edb_list[fi->q.edb_buffer_indx] = EDB_BUSY;
  1909. /* We have already made sure that we have enuff
  1910.      * free EDBs that are contiguous. So this is 
  1911.  * safe.
  1912.      */
  1913. update_EDB_indx(fi);
  1914. req_buffer += SEST_BUFFER_SIZE;
  1915. }
  1916. /* Just in case itz not a multiple of 
  1917.  * SEST_BUFFER_SIZE bytes.
  1918.  */
  1919. if (Cmnd->request_bufflen % SEST_BUFFER_SIZE) {
  1920. build_EDB(fi, (char *)req_buffer, EDB_END, Cmnd->request_bufflen % SEST_BUFFER_SIZE);
  1921. memcpy(fi->q.ptr_edb[fi->q.edb_buffer_indx], &(fi->g.edb), sizeof(EDB));
  1922. fi->q.free_edb_list[fi->q.edb_buffer_indx] = EDB_BUSY;
  1923. update_EDB_indx(fi);
  1924. }
  1925. else {
  1926. /* Mark the last EDB as the "end edb".
  1927.  */
  1928. *(fi->q.ptr_edb[fi->q.edb_buffer_indx - 1] + 1) = *(fi->q.ptr_edb[fi->q.edb_buffer_indx - 1] + 1) | htons(EDB_END);
  1929. }
  1930. }
  1931. /* Finally we have something to send!.
  1932.  */
  1933. memcpy(fi->q.ptr_sest[fi->g.scsi_oxid], &fi->g.outb_sest_entry, sizeof(OUTB_SEST_ENTRY));
  1934. break;
  1935. }
  1936. return 0;
  1937. }
  1938. static void update_FCP_CMND_indx(struct fc_info *fi)
  1939. {
  1940. fi->q.fcp_cmnd_indx++;
  1941. if (fi->q.fcp_cmnd_indx == NO_OF_FCP_CMNDS)
  1942. fi->q.fcp_cmnd_indx = 0;
  1943. }
  1944. static int get_scsi_oxid(struct fc_info *fi)
  1945. {
  1946. u_short initial_oxid = fi->g.scsi_oxid;
  1947. /* Check if the OX_ID is in use.
  1948.  * We could have an outstanding SCSI command.
  1949.  */
  1950. while (fi->q.free_scsi_oxid[fi->g.scsi_oxid] != OXID_AVAILABLE) {
  1951. update_scsi_oxid(fi);
  1952. if (fi->g.scsi_oxid == initial_oxid) {
  1953. T_MSG("No free OX_IDs avaliable")
  1954. reset_tachyon(fi, SOFTWARE_RESET);
  1955. return 1;
  1956. }
  1957. }
  1958. return 0;
  1959. }
  1960. static void update_scsi_oxid(struct fc_info *fi)
  1961. {
  1962. fi->g.scsi_oxid++;
  1963. if (fi->g.scsi_oxid == (MAX_SCSI_XID + 1))
  1964. fi->g.scsi_oxid = 0;
  1965. }
  1966. static int get_free_SDB(struct fc_info *fi)
  1967. {
  1968. unsigned int initial_indx = fi->q.sdb_indx;
  1969. /* Check if the SDB is in use.
  1970.  * We could have an outstanding SCSI Read command.
  1971.  * We should find a free slot as we can queue a
  1972.  * maximum of 32 SCSI commands only. 
  1973.  */
  1974. while (fi->q.sdb_slot_status[fi->q.sdb_indx] != SDB_FREE) {
  1975. update_SDB_indx(fi);
  1976. if (fi->q.sdb_indx == initial_indx) {
  1977. T_MSG("No free SDB buffers avaliable")
  1978. reset_tachyon(fi, SOFTWARE_RESET);
  1979. return 1;
  1980. }
  1981. }
  1982. return 0;
  1983. }
  1984. static void update_SDB_indx(struct fc_info *fi)
  1985. {
  1986. fi->q.sdb_indx++;
  1987. if (fi->q.sdb_indx == NO_OF_SDB_ENTRIES)
  1988. fi->q.sdb_indx = 0;
  1989. }
  1990. int iph5526_release(struct Scsi_Host *host)
  1991. {
  1992. struct iph5526_hostdata *hostdata = (struct iph5526_hostdata*)host->hostdata;
  1993. struct fc_info *fi = hostdata->fi;
  1994. free_irq(host->irq, host);
  1995. iounmap(fi->g.mem_base);
  1996. return 0;
  1997. }
  1998. const char *iph5526_info(struct Scsi_Host *host)
  1999. {
  2000. static char buf[80];
  2001. sprintf(buf, "Interphase 5526 Fibre Channel PCI SCSI Adapter using IRQ %dn", host->irq);
  2002. return buf;
  2003. }
  2004. #ifdef MODULE
  2005. #define NAMELEN 8 /* # of chars for storing dev->name */
  2006. static struct net_device *dev_fc[MAX_FC_CARDS];
  2007. static int io;
  2008. static int irq;
  2009. static int bad; /* 0xbad = bad sig or no reset ack */
  2010. static int scsi_registered;
  2011. int init_module(void)
  2012. {
  2013. int i = 0;
  2014. driver_template.module = &__this_module;
  2015. scsi_register_module(MODULE_SCSI_HA, &driver_template);
  2016. if (driver_template.present)
  2017. scsi_registered = TRUE; 
  2018. else {
  2019. printk("iph5526: SCSI registeration failed!!!n");
  2020. scsi_registered = FALSE;
  2021. scsi_unregister_module(MODULE_SCSI_HA, &driver_template);
  2022. }
  2023. while(fc[i] != NULL) {
  2024. dev_fc[i] = NULL;
  2025. dev_fc[i] = init_fcdev(dev_fc[i], 0);
  2026. if (dev_fc[i] == NULL) {
  2027. printk("iph5526.c: init_fcdev failed for card #%dn", i+1);
  2028. break;
  2029. }
  2030. dev_fc[i]->irq = irq;
  2031. dev_fc[i]->mem_end = bad;
  2032. dev_fc[i]->base_addr = io;
  2033. dev_fc[i]->init = iph5526_probe;
  2034. dev_fc[i]->priv = fc[i];
  2035. fc[i]->dev = dev_fc[i];
  2036. if (register_fcdev(dev_fc[i]) != 0) {
  2037. kfree(dev_fc[i]);
  2038. dev_fc[i] = NULL;
  2039. if (i == 0) {
  2040. printk("iph5526.c: IP registeration failed!!!n");
  2041. return -ENODEV;
  2042. }
  2043. }
  2044. i++;
  2045. }
  2046. if (i == 0)
  2047. return -ENODEV;
  2048. return 0;
  2049. }
  2050. void cleanup_module(void)
  2051. {
  2052. int i = 0;
  2053. while(fc[i] != NULL) {
  2054. struct net_device *dev = fc[i]->dev;
  2055. void *priv = dev->priv;
  2056. fc[i]->g.dont_init = TRUE;
  2057. take_tachyon_offline(fc[i]);
  2058. unregister_fcdev(dev);
  2059. clean_up_memory(fc[i]);
  2060. if (dev->priv)
  2061. kfree(priv);
  2062. kfree(dev);
  2063. dev = NULL;
  2064. i++;
  2065. }
  2066. if (scsi_registered == TRUE)
  2067. scsi_unregister_module(MODULE_SCSI_HA, &driver_template); 
  2068. }
  2069. #endif /* MODULE */
  2070. void clean_up_memory(struct fc_info *fi)
  2071. {
  2072. int i,j;
  2073. ENTER("clean_up_memory");
  2074. if (fi->q.ptr_mfsbq_base)
  2075. free_pages((u_long)bus_to_virt(ntohl(*(fi->q.ptr_mfsbq_base))), 5);
  2076. DPRINTK("after kfree2");
  2077. for (i = 0; i < SFSBQ_LENGTH; i++)
  2078. for (j = 0; j < NO_OF_ENTRIES; j++)
  2079. if (fi->q.ptr_sfs_buffers[i*NO_OF_ENTRIES + j])
  2080. kfree(fi->q.ptr_sfs_buffers[i*NO_OF_ENTRIES + j]);
  2081. DPRINTK("after kfree1");
  2082. if (fi->q.ptr_ocq_base)
  2083. free_page((u_long)fi->q.ptr_ocq_base);
  2084. if (fi->q.ptr_imq_base)
  2085. free_page((u_long)fi->q.ptr_imq_base);
  2086. if (fi->q.ptr_mfsbq_base)
  2087. free_page((u_long)fi->q.ptr_mfsbq_base);
  2088. if (fi->q.ptr_sfsbq_base)
  2089. free_page((u_long)fi->q.ptr_sfsbq_base);
  2090. if (fi->q.ptr_edb_base)
  2091. free_pages((u_long)fi->q.ptr_edb_base, 5);
  2092. if (fi->q.ptr_sest_base)
  2093. free_pages((u_long)fi->q.ptr_sest_base, 5);
  2094. if (fi->q.ptr_tachyon_header_base)
  2095. free_page((u_long)fi->q.ptr_tachyon_header_base);
  2096. if (fi->q.ptr_sdb_base)
  2097. free_pages((u_long)fi->q.ptr_sdb_base, 5);
  2098. if (fi->q.ptr_fcp_cmnd_base)
  2099. free_page((u_long)fi->q.ptr_fcp_cmnd_base);
  2100. DPRINTK("after free_pages"); 
  2101. if (fi->q.ptr_host_ocq_cons_indx)
  2102. kfree(fi->q.ptr_host_ocq_cons_indx);
  2103. if (fi->q.ptr_host_hpcq_cons_indx)
  2104. kfree(fi->q.ptr_host_hpcq_cons_indx);
  2105. if (fi->q.ptr_host_imq_prod_indx)
  2106. kfree(fi->q.ptr_host_imq_prod_indx);
  2107. DPRINTK("after kfree3");
  2108. while (fi->node_info_list) {
  2109. struct fc_node_info *temp_list = fi->node_info_list;
  2110. fi->node_info_list = fi->node_info_list->next;
  2111. kfree(temp_list);
  2112. }
  2113. while (fi->ox_id_list) {
  2114. struct ox_id_els_map *temp = fi->ox_id_list;
  2115. fi->ox_id_list = fi->ox_id_list->next;
  2116. kfree(temp);
  2117. }
  2118. LEAVE("clean_up_memory");
  2119. }
  2120. static int initialize_register_pointers(struct fc_info *fi)
  2121. {
  2122. ENTER("initialize_register_pointers");
  2123. if(fi->g.tachyon_base == 0)
  2124. return -ENOMEM; 
  2125. fi->i_r.ptr_ichip_hw_control_reg = ICHIP_HW_CONTROL_REG_OFF + fi->g.tachyon_base;
  2126. fi->i_r.ptr_ichip_hw_status_reg = ICHIP_HW_STATUS_REG_OFF + fi->g.tachyon_base;
  2127. fi->i_r.ptr_ichip_hw_addr_mask_reg = ICHIP_HW_ADDR_MASK_REG_OFF + fi->g.tachyon_base;
  2128. fi->t_r.ptr_ocq_base_reg = OCQ_BASE_REGISTER_OFFSET + fi->g.tachyon_base;
  2129. fi->t_r.ptr_ocq_len_reg = OCQ_LENGTH_REGISTER_OFFSET + fi->g.tachyon_base;
  2130. fi->t_r.ptr_ocq_prod_indx_reg = OCQ_PRODUCER_REGISTER_OFFSET + fi->g.tachyon_base;
  2131. fi->t_r.ptr_ocq_cons_indx_reg = OCQ_CONSUMER_REGISTER_OFFSET + fi->g.tachyon_base;
  2132. fi->t_r.ptr_imq_base_reg = IMQ_BASE_REGISTER_OFFSET + fi->g.tachyon_base;
  2133. fi->t_r.ptr_imq_len_reg = IMQ_LENGTH_REGISTER_OFFSET + fi->g.tachyon_base;
  2134. fi->t_r.ptr_imq_cons_indx_reg = IMQ_CONSUMER_REGISTER_OFFSET + fi->g.tachyon_base;
  2135. fi->t_r.ptr_imq_prod_indx_reg = IMQ_PRODUCER_REGISTER_OFFSET + fi->g.tachyon_base;
  2136. fi->t_r.ptr_mfsbq_base_reg = MFSBQ_BASE_REGISTER_OFFSET + fi->g.tachyon_base;
  2137. fi->t_r.ptr_mfsbq_len_reg = MFSBQ_LENGTH_REGISTER_OFFSET + fi->g.tachyon_base;
  2138. fi->t_r.ptr_mfsbq_prod_reg = MFSBQ_PRODUCER_REGISTER_OFFSET + fi->g.tachyon_base;
  2139. fi->t_r.ptr_mfsbq_cons_reg = MFSBQ_CONSUMER_REGISTER_OFFSET + fi->g.tachyon_base;
  2140. fi->t_r.ptr_mfsbuff_len_reg = MFS_LENGTH_REGISTER_OFFSET + fi->g.tachyon_base;
  2141. fi->t_r.ptr_sfsbq_base_reg = SFSBQ_BASE_REGISTER_OFFSET + fi->g.tachyon_base;
  2142. fi->t_r.ptr_sfsbq_len_reg = SFSBQ_LENGTH_REGISTER_OFFSET + fi->g.tachyon_base;
  2143. fi->t_r.ptr_sfsbq_prod_reg = SFSBQ_PRODUCER_REGISTER_OFFSET + fi->g.tachyon_base;
  2144. fi->t_r.ptr_sfsbq_cons_reg = SFSBQ_CONSUMER_REGISTER_OFFSET + fi->g.tachyon_base;
  2145. fi->t_r.ptr_sfsbuff_len_reg = SFS_LENGTH_REGISTER_OFFSET + fi->g.tachyon_base;
  2146. fi->t_r.ptr_sest_base_reg = SEST_BASE_REGISTER_OFFSET + fi->g.tachyon_base;
  2147. fi->t_r.ptr_sest_len_reg = SEST_LENGTH_REGISTER_OFFSET + fi->g.tachyon_base;
  2148. fi->t_r.ptr_scsibuff_len_reg = SCSI_LENGTH_REGISTER_OFFSET + fi->g.tachyon_base;
  2149. fi->t_r.ptr_tach_config_reg = TACHYON_CONFIG_REGISTER_OFFSET + fi->g.tachyon_base;
  2150. fi->t_r.ptr_tach_control_reg = TACHYON_CONTROL_REGISTER_OFFSET + fi->g.tachyon_base;
  2151. fi->t_r.ptr_tach_status_reg = TACHYON_STATUS_REGISTER_OFFSET + fi->g.tachyon_base;
  2152. fi->t_r.ptr_tach_flush_oxid_reg = TACHYON_FLUSH_SEST_REGISTER_OFFSET + fi->g.tachyon_base;
  2153. fi->t_r.ptr_fm_config_reg = FMGR_CONFIG_REGISTER_OFFSET + fi->g.tachyon_base;
  2154. fi->t_r.ptr_fm_control_reg = FMGR_CONTROL_REGISTER_OFFSET + fi->g.tachyon_base;
  2155. fi->t_r.ptr_fm_status_reg = FMGR_STATUS_REGISTER_OFFSET + fi->g.tachyon_base;
  2156. fi->t_r.ptr_fm_tov_reg = FMGR_TIMER_REGISTER_OFFSET + fi->g.tachyon_base;
  2157. fi->t_r.ptr_fm_wwn_hi_reg = FMGR_WWN_HI_REGISTER_OFFSET + fi->g.tachyon_base;
  2158. fi->t_r.ptr_fm_wwn_low_reg = FMGR_WWN_LO_REGISTER_OFFSET + fi->g.tachyon_base;
  2159. fi->t_r.ptr_fm_rx_al_pa_reg = FMGR_RCVD_ALPA_REGISTER_OFFSET + fi->g.tachyon_base;
  2160. LEAVE("initialize_register_pointers");
  2161. return 1;
  2162. }
  2163. /*
  2164.  * Local variables:
  2165.  *  compile-command: "gcc -DKERNEL -Wall -O6 -fomit-frame-pointer -I/usr/src/linux/net/tcp -c iph5526.c"
  2166.  *  version-control: t
  2167.  *  kept-new-versions: 5
  2168.  * End:
  2169.  */