bfa_fcbuild.c revision be540a991e2097c313d7304e0daaf89d68011bb9
17725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 2a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Copyright (c) 2005-2010 Brocade Communications Systems, Inc. 37725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * All rights reserved 47725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * www.brocade.com 57725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 67725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Linux driver for Brocade Fibre Channel Host Bus Adapter. 77725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 87725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This program is free software; you can redistribute it and/or modify it 97725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * under the terms of the GNU General Public License (GPL) Version 2 as 107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * published by the Free Software Foundation 117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This program is distributed in the hope that it will be useful, but 137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * WITHOUT ANY WARRANTY; without even the implied warranty of 147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * General Public License for more details. 167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * fcbuild.c - FC link service frame building and parsing routines 197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 21f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang#include "bfad_drv.h" 22a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfa_fcbuild.h" 237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * static build functions 267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 27a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void fc_els_rsp_build(struct fchs_s *fchs, u32 d_id, u32 s_id, 2850444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be16 ox_id); 29a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void fc_bls_rsp_build(struct fchs_s *fchs, u32 d_id, u32 s_id, 3050444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be16 ox_id); 31a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic struct fchs_s fc_els_req_tmpl; 32a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic struct fchs_s fc_els_rsp_tmpl; 33a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic struct fchs_s fc_bls_req_tmpl; 34a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic struct fchs_s fc_bls_rsp_tmpl; 357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic struct fc_ba_acc_s ba_acc_tmpl; 367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic struct fc_logi_s plogi_tmpl; 377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic struct fc_prli_s prli_tmpl; 387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic struct fc_rrq_s rrq_tmpl; 39a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic struct fchs_s fcp_fchs_tmpl; 407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfcbuild_init(void) 437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * fc_els_req_tmpl 467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_tmpl.routing = FC_RTG_EXT_LINK; 487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_tmpl.cat_info = FC_CAT_LD_REQUEST; 497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_tmpl.type = FC_TYPE_ELS; 507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_tmpl.f_ctl = 51f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang bfa_hton3b(FCTL_SEQ_INI | FCTL_FS_EXCH | FCTL_END_SEQ | 527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang FCTL_SI_XFER); 537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_tmpl.rx_id = FC_RXID_ANY; 547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * fc_els_rsp_tmpl 577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_tmpl.routing = FC_RTG_EXT_LINK; 597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_tmpl.cat_info = FC_CAT_LD_REPLY; 607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_tmpl.type = FC_TYPE_ELS; 617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_tmpl.f_ctl = 62f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang bfa_hton3b(FCTL_EC_RESP | FCTL_SEQ_INI | FCTL_LS_EXCH | 637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang FCTL_END_SEQ | FCTL_SI_XFER); 647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_tmpl.rx_id = FC_RXID_ANY; 657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * fc_bls_req_tmpl 687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_bls_req_tmpl.routing = FC_RTG_BASIC_LINK; 707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_bls_req_tmpl.type = FC_TYPE_BLS; 71f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang fc_bls_req_tmpl.f_ctl = bfa_hton3b(FCTL_END_SEQ | FCTL_SI_XFER); 727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_bls_req_tmpl.rx_id = FC_RXID_ANY; 737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * fc_bls_rsp_tmpl 767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_bls_rsp_tmpl.routing = FC_RTG_BASIC_LINK; 787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_bls_rsp_tmpl.cat_info = FC_CAT_BA_ACC; 797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_bls_rsp_tmpl.type = FC_TYPE_BLS; 807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_bls_rsp_tmpl.f_ctl = 81f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang bfa_hton3b(FCTL_EC_RESP | FCTL_SEQ_INI | FCTL_LS_EXCH | 827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang FCTL_END_SEQ | FCTL_SI_XFER); 837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_bls_rsp_tmpl.rx_id = FC_RXID_ANY; 847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * ba_acc_tmpl 877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ba_acc_tmpl.seq_id_valid = 0; 897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ba_acc_tmpl.low_seq_cnt = 0; 907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ba_acc_tmpl.high_seq_cnt = 0xFFFF; 917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * plogi_tmpl 947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi_tmpl.csp.verhi = FC_PH_VER_PH_3; 967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi_tmpl.csp.verlo = FC_PH_VER_4_3; 977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi_tmpl.csp.ciro = 0x1; 987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi_tmpl.csp.cisc = 0x0; 997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi_tmpl.csp.altbbcred = 0x0; 100ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang plogi_tmpl.csp.conseq = cpu_to_be16(0x00FF); 101ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang plogi_tmpl.csp.ro_bitmap = cpu_to_be16(0x0002); 102ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang plogi_tmpl.csp.e_d_tov = cpu_to_be32(2000); 1037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi_tmpl.class3.class_valid = 1; 1057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi_tmpl.class3.sequential = 1; 1067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi_tmpl.class3.conseq = 0xFF; 1077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi_tmpl.class3.ospx = 1; 1087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 1107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * prli_tmpl 1117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 1127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli_tmpl.command = FC_ELS_PRLI; 1137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli_tmpl.pglen = 0x10; 114ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang prli_tmpl.pagebytes = cpu_to_be16(0x0014); 1157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli_tmpl.parampage.type = FC_TYPE_FCP; 1167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli_tmpl.parampage.imagepair = 1; 1177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli_tmpl.parampage.servparams.rxrdisab = 1; 1187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 1207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * rrq_tmpl 1217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 1227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rrq_tmpl.els_cmd.els_code = FC_ELS_RRQ; 1237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 125a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * fcp_struct fchs_s mpl 1267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 1277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcp_fchs_tmpl.routing = FC_RTG_FC4_DEV_DATA; 1287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcp_fchs_tmpl.cat_info = FC_CAT_UNSOLICIT_CMD; 1297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcp_fchs_tmpl.type = FC_TYPE_FCP; 1307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcp_fchs_tmpl.f_ctl = 131f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang bfa_hton3b(FCTL_FS_EXCH | FCTL_END_SEQ | FCTL_SI_XFER); 1327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcp_fchs_tmpl.seq_id = 1; 1337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcp_fchs_tmpl.rx_id = FC_RXID_ANY; 1347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 137a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_gs_fchdr_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u32 ox_id) 1387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1396a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(fchs, 0, sizeof(struct fchs_s)); 1407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->routing = FC_RTG_FC4_DEV_DATA; 1427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->cat_info = FC_CAT_UNSOLICIT_CTRL; 1437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->type = FC_TYPE_SERVICES; 1447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->f_ctl = 145f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang bfa_hton3b(FCTL_SEQ_INI | FCTL_FS_EXCH | FCTL_END_SEQ | 1467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang FCTL_SI_XFER); 1477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->rx_id = FC_RXID_ANY; 1487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->d_id = (d_id); 1497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->s_id = (s_id); 150ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang fchs->ox_id = cpu_to_be16(ox_id); 1517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1525fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @todo no need to set ox_id for request 1547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * no need to set rx_id for response 1557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 1567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 15950444a340028119ce5ba45d60b4cf44e3e6e1b32Maggiefc_els_req_build(struct fchs_s *fchs, u32 d_id, u32 s_id, __be16 ox_id) 1607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1616a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(fchs, &fc_els_req_tmpl, sizeof(struct fchs_s)); 1627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->d_id = (d_id); 1637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->s_id = (s_id); 164ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang fchs->ox_id = cpu_to_be16(ox_id); 1657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 16850444a340028119ce5ba45d60b4cf44e3e6e1b32Maggiefc_els_rsp_build(struct fchs_s *fchs, u32 d_id, u32 s_id, __be16 ox_id) 1697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1706a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(fchs, &fc_els_rsp_tmpl, sizeof(struct fchs_s)); 1717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->d_id = d_id; 1727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->s_id = s_id; 1737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->ox_id = ox_id; 1747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 1777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_els_rsp_parse(struct fchs_s *fchs, int len) 1787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 179a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_els_cmd_s *els_cmd = (struct fc_els_cmd_s *) (fchs + 1); 180a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_ls_rjt_s *ls_rjt = (struct fc_ls_rjt_s *) els_cmd; 1817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang len = len; 1837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (els_cmd->els_code) { 1857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case FC_ELS_LS_RJT: 1867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (ls_rjt->reason_code == FC_LS_RJT_RSN_LOGICAL_BUSY) 187f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_BUSY; 1887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang else 189f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 1907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case FC_ELS_ACC: 192f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 1937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 194f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 1957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 19850444a340028119ce5ba45d60b4cf44e3e6e1b32Maggiefc_bls_rsp_build(struct fchs_s *fchs, u32 d_id, u32 s_id, __be16 ox_id) 1997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2006a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(fchs, &fc_bls_rsp_tmpl, sizeof(struct fchs_s)); 2017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->d_id = d_id; 2027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->s_id = s_id; 2037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->ox_id = ox_id; 2047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic u16 2077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_plogi_x_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, 20850444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be16 ox_id, wwn_t port_name, wwn_t node_name, 209be540a991e2097c313d7304e0daaf89d68011bb9Krishna Gudipati u16 pdu_size, u16 bb_cr, u8 els_code) 2107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 211a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_logi_s *plogi = (struct fc_logi_s *) (pld); 2127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2136a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(plogi, &plogi_tmpl, sizeof(struct fc_logi_s)); 2147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi->els_cmd.els_code = els_code; 2167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (els_code == FC_ELS_PLOGI) 2177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 2187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang else 2197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 2207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 221ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang plogi->csp.rxsz = plogi->class3.rxsz = cpu_to_be16(pdu_size); 222be540a991e2097c313d7304e0daaf89d68011bb9Krishna Gudipati plogi->csp.bbcred = cpu_to_be16(bb_cr); 2237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2246a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(&plogi->port_name, &port_name, sizeof(wwn_t)); 2256a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(&plogi->node_name, &node_name, sizeof(wwn_t)); 2267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 227f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_logi_s); 2287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 2317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_flogi_build(struct fchs_s *fchs, struct fc_logi_s *flogi, u32 s_id, 232a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u16 ox_id, wwn_t port_name, wwn_t node_name, u16 pdu_size, 233a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u8 set_npiv, u8 set_auth, u16 local_bb_credits) 2347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 235f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_FABRIC_PORT); 23650444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be32 *vvl_info; 2377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2386a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(flogi, &plogi_tmpl, sizeof(struct fc_logi_s)); 2397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->els_cmd.els_code = FC_ELS_FLOGI; 2417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 2427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 243ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang flogi->csp.rxsz = flogi->class3.rxsz = cpu_to_be16(pdu_size); 2447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->port_name = port_name; 2457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->node_name = node_name; 2467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 2487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Set the NPIV Capability Bit ( word 1, bit 31) of Common 2497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Service Parameters. 2507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 2517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->csp.ciro = set_npiv; 2527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* set AUTH capability */ 2547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->csp.security = set_auth; 2557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 256ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang flogi->csp.bbcred = cpu_to_be16(local_bb_credits); 2577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* Set brcd token in VVL */ 2597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang vvl_info = (u32 *)&flogi->vvl[0]; 2607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* set the flag to indicate the presence of VVL */ 2627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->csp.npiv_supp = 1; /* @todo. field name is not correct */ 263ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang vvl_info[0] = cpu_to_be32(FLOGI_VVL_BRCD); 2647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 265f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_logi_s); 2667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 2697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_flogi_acc_build(struct fchs_s *fchs, struct fc_logi_s *flogi, u32 s_id, 27050444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be16 ox_id, wwn_t port_name, wwn_t node_name, 271be540a991e2097c313d7304e0daaf89d68011bb9Krishna Gudipati u16 pdu_size, u16 local_bb_credits, u8 bb_scn) 2727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = 0; 274be540a991e2097c313d7304e0daaf89d68011bb9Krishna Gudipati u16 bbscn_rxsz = (bb_scn << 12) | pdu_size; 2757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2766a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(flogi, &plogi_tmpl, sizeof(struct fc_logi_s)); 2777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 2787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->els_cmd.els_code = FC_ELS_ACC; 280be540a991e2097c313d7304e0daaf89d68011bb9Krishna Gudipati flogi->class3.rxsz = cpu_to_be16(pdu_size); 281be540a991e2097c313d7304e0daaf89d68011bb9Krishna Gudipati flogi->csp.rxsz = cpu_to_be16(bbscn_rxsz); /* bb_scn/rxsz */ 2827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->port_name = port_name; 2837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->node_name = node_name; 2847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 285ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang flogi->csp.bbcred = cpu_to_be16(local_bb_credits); 2867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 287f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_logi_s); 2887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 2917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_fdisc_build(struct fchs_s *fchs, struct fc_logi_s *flogi, u32 s_id, 292a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u16 ox_id, wwn_t port_name, wwn_t node_name, u16 pdu_size) 2937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 294f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_FABRIC_PORT); 2957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2966a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(flogi, &plogi_tmpl, sizeof(struct fc_logi_s)); 2977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->els_cmd.els_code = FC_ELS_FDISC; 2997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 3007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 301ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang flogi->csp.rxsz = flogi->class3.rxsz = cpu_to_be16(pdu_size); 3027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->port_name = port_name; 3037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->node_name = node_name; 3047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 305f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_logi_s); 3067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 3097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_plogi_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, 3107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u16 ox_id, wwn_t port_name, wwn_t node_name, 311be540a991e2097c313d7304e0daaf89d68011bb9Krishna Gudipati u16 pdu_size, u16 bb_cr) 3127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 3137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return fc_plogi_x_build(fchs, pld, d_id, s_id, ox_id, port_name, 314be540a991e2097c313d7304e0daaf89d68011bb9Krishna Gudipati node_name, pdu_size, bb_cr, FC_ELS_PLOGI); 3157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 3187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_plogi_acc_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, 3197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u16 ox_id, wwn_t port_name, wwn_t node_name, 320be540a991e2097c313d7304e0daaf89d68011bb9Krishna Gudipati u16 pdu_size, u16 bb_cr) 3217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 3227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return fc_plogi_x_build(fchs, pld, d_id, s_id, ox_id, port_name, 323be540a991e2097c313d7304e0daaf89d68011bb9Krishna Gudipati node_name, pdu_size, bb_cr, FC_ELS_ACC); 3247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 3277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_plogi_rsp_parse(struct fchs_s *fchs, int len, wwn_t port_name) 3287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 329a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_els_cmd_s *els_cmd = (struct fc_els_cmd_s *) (fchs + 1); 330a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_logi_s *plogi; 331a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_ls_rjt_s *ls_rjt; 3327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (els_cmd->els_code) { 3347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case FC_ELS_LS_RJT: 3357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ls_rjt = (struct fc_ls_rjt_s *) (fchs + 1); 3367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (ls_rjt->reason_code == FC_LS_RJT_RSN_LOGICAL_BUSY) 337f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_BUSY; 3387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang else 339f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 3407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case FC_ELS_ACC: 3417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi = (struct fc_logi_s *) (fchs + 1); 3427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (len < sizeof(struct fc_logi_s)) 343f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 3447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!wwn_is_equal(plogi->port_name, port_name)) 346f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 3477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!plogi->class3.class_valid) 349f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 3507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 351ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang if (be16_to_cpu(plogi->class3.rxsz) < (FC_MIN_PDUSZ)) 352f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 3537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 354f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 3557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 356f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 3577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 3587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 3617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_plogi_parse(struct fchs_s *fchs) 3627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 363a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_logi_s *plogi = (struct fc_logi_s *) (fchs + 1); 3647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (plogi->class3.class_valid != 1) 3667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 3677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 368ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang if ((be16_to_cpu(plogi->class3.rxsz) < FC_MIN_PDUSZ) 369ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang || (be16_to_cpu(plogi->class3.rxsz) > FC_MAX_PDUSZ) 3707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang || (plogi->class3.rxsz == 0)) 371f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 3727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_OK; 3747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 3777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_prli_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, 3787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u16 ox_id) 3797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 380a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_prli_s *prli = (struct fc_prli_s *) (pld); 3817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 3836a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(prli, &prli_tmpl, sizeof(struct fc_prli_s)); 3847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->command = FC_ELS_PRLI; 3867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->parampage.servparams.initiator = 1; 3877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->parampage.servparams.retry = 1; 3887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->parampage.servparams.rec_support = 1; 3897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->parampage.servparams.task_retry_id = 0; 3907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->parampage.servparams.confirm = 1; 3917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 392f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_prli_s); 3937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 3967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_prli_acc_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, 39750444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be16 ox_id, enum bfa_lport_role role) 3987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 399a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_prli_s *prli = (struct fc_prli_s *) (pld); 4007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 4026a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(prli, &prli_tmpl, sizeof(struct fc_prli_s)); 4037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->command = FC_ELS_ACC; 4057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 406a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati prli->parampage.servparams.initiator = 1; 4077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->parampage.rspcode = FC_PRLI_ACC_XQTD; 4097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 410f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_prli_s); 4117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 4147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_prli_rsp_parse(struct fc_prli_s *prli, int len) 4157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (len < sizeof(struct fc_prli_s)) 417f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 4187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prli->command != FC_ELS_ACC) 420f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 4217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if ((prli->parampage.rspcode != FC_PRLI_ACC_XQTD) 4237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang && (prli->parampage.rspcode != FC_PRLI_ACC_PREDEF_IMG)) 424f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 4257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prli->parampage.servparams.target != 1) 427f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 4287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 429f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 4307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 4337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_prli_parse(struct fc_prli_s *prli) 4347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prli->parampage.type != FC_TYPE_FCP) 436f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 4377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!prli->parampage.imagepair) 439f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 4407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!prli->parampage.servparams.initiator) 442f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 4437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 444f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 4457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 448a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_logo_build(struct fchs_s *fchs, struct fc_logo_s *logo, u32 d_id, u32 s_id, 449a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u16 ox_id, wwn_t port_name) 4507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 4527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4536a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(logo, '\0', sizeof(struct fc_logo_s)); 4547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang logo->els_cmd.els_code = FC_ELS_LOGO; 4557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang logo->nport_id = (s_id); 4567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang logo->orig_port_name = port_name; 4577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 458f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_logo_s); 4597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 461da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhangstatic u16 4627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_adisc_x_build(struct fchs_s *fchs, struct fc_adisc_s *adisc, u32 d_id, 46350444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id, wwn_t port_name, 4647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t node_name, u8 els_code) 4657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4666a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(adisc, '\0', sizeof(struct fc_adisc_s)); 4677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang adisc->els_cmd.els_code = els_code; 4697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (els_code == FC_ELS_ADISC) 4717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 4727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang else 4737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 4747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang adisc->orig_HA = 0; 4767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang adisc->orig_port_name = port_name; 4777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang adisc->orig_node_name = node_name; 4787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang adisc->nport_id = (s_id); 4797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 480f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_adisc_s); 4817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 4847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_adisc_build(struct fchs_s *fchs, struct fc_adisc_s *adisc, u32 d_id, 48550444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id, wwn_t port_name, wwn_t node_name) 4867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return fc_adisc_x_build(fchs, adisc, d_id, s_id, ox_id, port_name, 4887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang node_name, FC_ELS_ADISC); 4897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 4927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_adisc_acc_build(struct fchs_s *fchs, struct fc_adisc_s *adisc, u32 d_id, 49350444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id, wwn_t port_name, 4947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t node_name) 4957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return fc_adisc_x_build(fchs, adisc, d_id, s_id, ox_id, port_name, 4977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang node_name, FC_ELS_ACC); 4987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 5017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_adisc_rsp_parse(struct fc_adisc_s *adisc, int len, wwn_t port_name, 5027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t node_name) 5037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (len < sizeof(struct fc_adisc_s)) 506f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (adisc->els_cmd.els_code != FC_ELS_ACC) 509f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!wwn_is_equal(adisc->orig_port_name, port_name)) 512f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 514f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 5157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 518a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_adisc_parse(struct fchs_s *fchs, void *pld, u32 host_dap, wwn_t node_name, 519a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati wwn_t port_name) 5207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 521a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_adisc_s *adisc = (struct fc_adisc_s *) pld; 5227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (adisc->els_cmd.els_code != FC_ELS_ACC) 524f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if ((adisc->nport_id == (host_dap)) 5277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang && wwn_is_equal(adisc->orig_port_name, port_name) 5287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang && wwn_is_equal(adisc->orig_node_name, node_name)) 529f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 5307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 531f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 5357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_pdisc_parse(struct fchs_s *fchs, wwn_t node_name, wwn_t port_name) 5367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 537a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_logi_s *pdisc = (struct fc_logi_s *) (fchs + 1); 5387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (pdisc->class3.class_valid != 1) 5407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 5417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 542ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang if ((be16_to_cpu(pdisc->class3.rxsz) < 543a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (FC_MIN_PDUSZ - sizeof(struct fchs_s))) 5447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang || (pdisc->class3.rxsz == 0)) 545f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!wwn_is_equal(pdisc->port_name, port_name)) 548f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!wwn_is_equal(pdisc->node_name, node_name)) 551f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_OK; 5547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 5577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_abts_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id) 5587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5596a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(fchs, &fc_bls_req_tmpl, sizeof(struct fchs_s)); 5607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->cat_info = FC_CAT_ABTS; 5617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->d_id = (d_id); 5627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->s_id = (s_id); 563ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang fchs->ox_id = cpu_to_be16(ox_id); 5647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 565f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fchs_s); 5667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 5697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_abts_rsp_parse(struct fchs_s *fchs, int len) 5707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if ((fchs->cat_info == FC_CAT_BA_ACC) 5727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang || (fchs->cat_info == FC_CAT_BA_RJT)) 573f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 5747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 575f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 579a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_rrq_build(struct fchs_s *fchs, struct fc_rrq_s *rrq, u32 d_id, u32 s_id, 580a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u16 ox_id, u16 rrq_oxid) 5817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 5837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 5857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * build rrq payload 5867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5876a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(rrq, &rrq_tmpl, sizeof(struct fc_rrq_s)); 5887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rrq->s_id = (s_id); 589ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang rrq->ox_id = cpu_to_be16(rrq_oxid); 5907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rrq->rx_id = FC_RXID_ANY; 5917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 592f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_rrq_s); 5937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 5967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_logo_acc_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, 59750444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be16 ox_id) 5987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 599a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_els_cmd_s *acc = pld; 6007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 6027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6036a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(acc, 0, sizeof(struct fc_els_cmd_s)); 6047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang acc->els_code = FC_ELS_ACC; 6057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 606f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_els_cmd_s); 6077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 6107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_ls_rjt_build(struct fchs_s *fchs, struct fc_ls_rjt_s *ls_rjt, u32 d_id, 61150444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id, u8 reason_code, 6127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 reason_code_expl) 6137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 6156a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(ls_rjt, 0, sizeof(struct fc_ls_rjt_s)); 6167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ls_rjt->els_cmd.els_code = FC_ELS_LS_RJT; 6187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ls_rjt->reason_code = reason_code; 6197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ls_rjt->reason_code_expl = reason_code_expl; 6207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ls_rjt->vendor_unique = 0x00; 6217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 622f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_ls_rjt_s); 6237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 6267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_ba_acc_build(struct fchs_s *fchs, struct fc_ba_acc_s *ba_acc, u32 d_id, 62750444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id, u16 rx_id) 6287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_bls_rsp_build(fchs, d_id, s_id, ox_id); 6307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6316a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(ba_acc, &ba_acc_tmpl, sizeof(struct fc_ba_acc_s)); 6327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->rx_id = rx_id; 6347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ba_acc->ox_id = fchs->ox_id; 6367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ba_acc->rx_id = fchs->rx_id; 6377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 638f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_ba_acc_s); 6397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 642a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_ls_acc_build(struct fchs_s *fchs, struct fc_els_cmd_s *els_cmd, u32 d_id, 64350444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id) 6447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 6466a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(els_cmd, 0, sizeof(struct fc_els_cmd_s)); 6477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang els_cmd->els_code = FC_ELS_ACC; 6487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 649f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_els_cmd_s); 6507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangint 6537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_logout_params_pages(struct fchs_s *fc_frame, u8 els_code) 6547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int num_pages = 0; 656a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_prlo_s *prlo; 657a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_tprlo_s *tprlo; 6587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (els_code == FC_ELS_PRLO) { 6607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo = (struct fc_prlo_s *) (fc_frame + 1); 661ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang num_pages = (be16_to_cpu(prlo->payload_len) - 4) / 16; 6627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } else { 6637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo = (struct fc_tprlo_s *) (fc_frame + 1); 664ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang num_pages = (be16_to_cpu(tprlo->payload_len) - 4) / 16; 6657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 6667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return num_pages; 6677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 6707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_tprlo_acc_build(struct fchs_s *fchs, struct fc_tprlo_acc_s *tprlo_acc, 67150444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 d_id, u32 s_id, __be16 ox_id, int num_pages) 6727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int page; 6747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 6767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6776a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(tprlo_acc, 0, (num_pages * 16) + 4); 6787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo_acc->command = FC_ELS_ACC; 6797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo_acc->page_len = 0x10; 681ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang tprlo_acc->payload_len = cpu_to_be16((num_pages * 16) + 4); 6827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (page = 0; page < num_pages; page++) { 6847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo_acc->tprlo_acc_params[page].opa_valid = 0; 6857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo_acc->tprlo_acc_params[page].rpa_valid = 0; 6867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo_acc->tprlo_acc_params[page].fc4type_csp = FC_TYPE_FCP; 6877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo_acc->tprlo_acc_params[page].orig_process_assc = 0; 6887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo_acc->tprlo_acc_params[page].resp_process_assc = 0; 6897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 690ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang return be16_to_cpu(tprlo_acc->payload_len); 6917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 694a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_prlo_acc_build(struct fchs_s *fchs, struct fc_prlo_acc_s *prlo_acc, u32 d_id, 69550444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id, int num_pages) 6967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int page; 6987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 7007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7016a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(prlo_acc, 0, (num_pages * 16) + 4); 7027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo_acc->command = FC_ELS_ACC; 7037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo_acc->page_len = 0x10; 704ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang prlo_acc->payload_len = cpu_to_be16((num_pages * 16) + 4); 7057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (page = 0; page < num_pages; page++) { 7077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo_acc->prlo_acc_params[page].opa_valid = 0; 7087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo_acc->prlo_acc_params[page].rpa_valid = 0; 7097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo_acc->prlo_acc_params[page].fc4type_csp = FC_TYPE_FCP; 7107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo_acc->prlo_acc_params[page].orig_process_assc = 0; 7117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo_acc->prlo_acc_params[page].resp_process_assc = 0; 7127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 7137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 714ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang return be16_to_cpu(prlo_acc->payload_len); 7157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 7187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rnid_build(struct fchs_s *fchs, struct fc_rnid_cmd_s *rnid, u32 d_id, 719a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 s_id, u16 ox_id, u32 data_format) 7207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 7227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7236a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rnid, 0, sizeof(struct fc_rnid_cmd_s)); 7247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnid->els_cmd.els_code = FC_ELS_RNID; 7267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnid->node_id_data_format = data_format; 7277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 728f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_rnid_cmd_s); 7297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 732a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_rnid_acc_build(struct fchs_s *fchs, struct fc_rnid_acc_s *rnid_acc, u32 d_id, 73350444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id, u32 data_format, 734a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_rnid_common_id_data_s *common_id_data, 735a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_rnid_general_topology_data_s *gen_topo_data) 7367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7376a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rnid_acc, 0, sizeof(struct fc_rnid_acc_s)); 7387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 7407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnid_acc->els_cmd.els_code = FC_ELS_ACC; 7427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnid_acc->node_id_data_format = data_format; 7437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnid_acc->common_id_data_length = 7447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang sizeof(struct fc_rnid_common_id_data_s); 7457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnid_acc->common_id_data = *common_id_data; 7467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (data_format == RNID_NODEID_DATA_FORMAT_DISCOVERY) { 7487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnid_acc->specific_id_data_length = 7497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang sizeof(struct fc_rnid_general_topology_data_s); 7506a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang rnid_acc->gen_topology_data = *gen_topo_data; 751f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_rnid_acc_s); 7527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } else { 753f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_rnid_acc_s) - 754f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang sizeof(struct fc_rnid_general_topology_data_s); 7557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 7567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 7607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rpsc_build(struct fchs_s *fchs, struct fc_rpsc_cmd_s *rpsc, u32 d_id, 761a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 s_id, u16 ox_id) 7627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 7647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7656a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rpsc, 0, sizeof(struct fc_rpsc_cmd_s)); 7667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpsc->els_cmd.els_code = FC_ELS_RPSC; 768f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_rpsc_cmd_s); 7697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 772a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_rpsc2_build(struct fchs_s *fchs, struct fc_rpsc2_cmd_s *rpsc2, u32 d_id, 773a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 s_id, u32 *pid_list, u16 npids) 7747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 775f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 dctlr_id = FC_DOMAIN_CTRLR(bfa_hton3b(d_id)); 7767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int i = 0; 7777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 778f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang fc_els_req_build(fchs, bfa_hton3b(dctlr_id), s_id, 0); 7797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7806a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rpsc2, 0, sizeof(struct fc_rpsc2_cmd_s)); 7817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpsc2->els_cmd.els_code = FC_ELS_RPSC; 783ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang rpsc2->token = cpu_to_be32(FC_BRCD_TOKEN); 784ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang rpsc2->num_pids = cpu_to_be16(npids); 7857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (i = 0; i < npids; i++) 7867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpsc2->pid_list[i].pid = pid_list[i]; 7877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 788a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return sizeof(struct fc_rpsc2_cmd_s) + ((npids - 1) * (sizeof(u32))); 7897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 7927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rpsc_acc_build(struct fchs_s *fchs, struct fc_rpsc_acc_s *rpsc_acc, 79350444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 d_id, u32 s_id, __be16 ox_id, 794a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_rpsc_speed_info_s *oper_speed) 7957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7966a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rpsc_acc, 0, sizeof(struct fc_rpsc_acc_s)); 7977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 7997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpsc_acc->command = FC_ELS_ACC; 801ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang rpsc_acc->num_entries = cpu_to_be16(1); 8027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpsc_acc->speed_info[0].port_speed_cap = 804ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang cpu_to_be16(oper_speed->port_speed_cap); 8057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpsc_acc->speed_info[0].port_op_speed = 807ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang cpu_to_be16(oper_speed->port_op_speed); 8087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 809f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_rpsc_acc_s); 8107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 8137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_logo_rsp_parse(struct fchs_s *fchs, int len) 8147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 815a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_els_cmd_s *els_cmd = (struct fc_els_cmd_s *) (fchs + 1); 8167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang len = len; 8187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (els_cmd->els_code != FC_ELS_ACC) 8197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 8207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_OK; 8227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 825a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_pdisc_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id, 826a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati wwn_t port_name, wwn_t node_name, u16 pdu_size) 8277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 828a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_logi_s *pdisc = (struct fc_logi_s *) (fchs + 1); 8297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8306a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(pdisc, &plogi_tmpl, sizeof(struct fc_logi_s)); 8317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pdisc->els_cmd.els_code = FC_ELS_PDISC; 8337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 8347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 835ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang pdisc->csp.rxsz = pdisc->class3.rxsz = cpu_to_be16(pdu_size); 8367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pdisc->port_name = port_name; 8377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pdisc->node_name = node_name; 8387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 839f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_logi_s); 8407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 8437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_pdisc_rsp_parse(struct fchs_s *fchs, int len, wwn_t port_name) 8447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 845a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_logi_s *pdisc = (struct fc_logi_s *) (fchs + 1); 8467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (len < sizeof(struct fc_logi_s)) 848f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_LEN_INVAL; 8497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (pdisc->els_cmd.els_code != FC_ELS_ACC) 851f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_ACC_INVAL; 8527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!wwn_is_equal(pdisc->port_name, port_name)) 854f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_PWWN_NOT_EQUAL; 8557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!pdisc->class3.class_valid) 857f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_NWWN_NOT_EQUAL; 8587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 859ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang if (be16_to_cpu(pdisc->class3.rxsz) < (FC_MIN_PDUSZ)) 860f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_RXSZ_INVAL; 8617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 862f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 8637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 8667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_prlo_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id, 8677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int num_pages) 8687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 869a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_prlo_s *prlo = (struct fc_prlo_s *) (fchs + 1); 8707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int page; 8717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 8736a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(prlo, 0, (num_pages * 16) + 4); 8747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo->command = FC_ELS_PRLO; 8757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo->page_len = 0x10; 876ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang prlo->payload_len = cpu_to_be16((num_pages * 16) + 4); 8777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (page = 0; page < num_pages; page++) { 8797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo->prlo_params[page].type = FC_TYPE_FCP; 8807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo->prlo_params[page].opa_valid = 0; 8817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo->prlo_params[page].rpa_valid = 0; 8827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo->prlo_params[page].orig_process_assc = 0; 8837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo->prlo_params[page].resp_process_assc = 0; 8847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 8857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 886ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang return be16_to_cpu(prlo->payload_len); 8877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 8907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_prlo_rsp_parse(struct fchs_s *fchs, int len) 8917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 892a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_prlo_acc_s *prlo = (struct fc_prlo_acc_s *) (fchs + 1); 8937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int num_pages = 0; 8947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int page = 0; 8957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang len = len; 8977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prlo->command != FC_ELS_ACC) 899f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 9007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 901ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang num_pages = ((be16_to_cpu(prlo->payload_len)) - 4) / 16; 9027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (page = 0; page < num_pages; page++) { 9047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prlo->prlo_acc_params[page].type != FC_TYPE_FCP) 9057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 9067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prlo->prlo_acc_params[page].opa_valid != 0) 9087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 9097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prlo->prlo_acc_params[page].rpa_valid != 0) 9117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 9127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prlo->prlo_acc_params[page].orig_process_assc != 0) 9147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 9157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prlo->prlo_acc_params[page].resp_process_assc != 0) 9177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 9187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 919f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 9207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 9227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 924a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_tprlo_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id, 925a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int num_pages, enum fc_tprlo_type tprlo_type, u32 tpr_id) 9267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 927a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_tprlo_s *tprlo = (struct fc_tprlo_s *) (fchs + 1); 9287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int page; 9297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 9316a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(tprlo, 0, (num_pages * 16) + 4); 9327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->command = FC_ELS_TPRLO; 9337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->page_len = 0x10; 934ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang tprlo->payload_len = cpu_to_be16((num_pages * 16) + 4); 9357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (page = 0; page < num_pages; page++) { 9377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].type = FC_TYPE_FCP; 9387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].opa_valid = 0; 9397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].rpa_valid = 0; 9407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].orig_process_assc = 0; 9417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].resp_process_assc = 0; 9427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tprlo_type == FC_GLOBAL_LOGO) { 9437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].global_process_logout = 1; 9447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } else if (tprlo_type == FC_TPR_LOGO) { 9457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].tpo_nport_valid = 1; 9467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].tpo_nport_id = (tpr_id); 9477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 9487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 9497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 950ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang return be16_to_cpu(tprlo->payload_len); 9517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 9527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 9547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_tprlo_rsp_parse(struct fchs_s *fchs, int len) 9557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 9567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct fc_tprlo_acc_s *tprlo = (struct fc_tprlo_acc_s *) (fchs + 1); 9577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int num_pages = 0; 9587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int page = 0; 9597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang len = len; 9617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tprlo->command != FC_ELS_ACC) 963f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_ACC_INVAL; 9647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 965ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang num_pages = (be16_to_cpu(tprlo->payload_len) - 4) / 16; 9667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (page = 0; page < num_pages; page++) { 9687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tprlo->tprlo_acc_params[page].type != FC_TYPE_FCP) 969f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_NOT_FCP; 9707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tprlo->tprlo_acc_params[page].opa_valid != 0) 971f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OPAFLAG_INVAL; 9727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tprlo->tprlo_acc_params[page].rpa_valid != 0) 973f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_RPAFLAG_INVAL; 9747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tprlo->tprlo_acc_params[page].orig_process_assc != 0) 975f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OPA_INVAL; 9767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tprlo->tprlo_acc_params[page].resp_process_assc != 0) 977f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_RPA_INVAL; 9787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 979f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 9807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 9817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 9837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rrq_rsp_parse(struct fchs_s *fchs, int len) 9847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 985a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_els_cmd_s *els_cmd = (struct fc_els_cmd_s *) (fchs + 1); 9867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang len = len; 9887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (els_cmd->els_code != FC_ELS_ACC) 9897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 9907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_OK; 9927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 9937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 99550444a340028119ce5ba45d60b4cf44e3e6e1b32Maggiefc_ba_rjt_build(struct fchs_s *fchs, u32 d_id, u32 s_id, __be16 ox_id, 996a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 reason_code, u32 reason_expl) 9977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 998a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_ba_rjt_s *ba_rjt = (struct fc_ba_rjt_s *) (fchs + 1); 9997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_bls_rsp_build(fchs, d_id, s_id, ox_id); 10017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->cat_info = FC_CAT_BA_RJT; 10037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ba_rjt->reason_code = reason_code; 10047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ba_rjt->reason_expl = reason_expl; 1005f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_ba_rjt_s); 10067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 10097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gs_cthdr_build(struct ct_hdr_s *cthdr, u32 s_id, u16 cmd_code) 10107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 10116a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(cthdr, 0, sizeof(struct ct_hdr_s)); 10127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->rev_id = CT_GS3_REVISION; 10137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->gs_type = CT_GSTYPE_DIRSERVICE; 10147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->gs_sub_type = CT_GSSUBTYPE_NAMESERVER; 1015ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang cthdr->cmd_rsp_code = cpu_to_be16(cmd_code); 10167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 10197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gs_fdmi_cthdr_build(struct ct_hdr_s *cthdr, u32 s_id, u16 cmd_code) 10207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 10216a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(cthdr, 0, sizeof(struct ct_hdr_s)); 10227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->rev_id = CT_GS3_REVISION; 10237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->gs_type = CT_GSTYPE_MGMTSERVICE; 10247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->gs_sub_type = CT_GSSUBTYPE_HBA_MGMTSERVER; 1025ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang cthdr->cmd_rsp_code = cpu_to_be16(cmd_code); 10267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 10297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gs_ms_cthdr_build(struct ct_hdr_s *cthdr, u32 s_id, u16 cmd_code, 10307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 sub_type) 10317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 10326a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(cthdr, 0, sizeof(struct ct_hdr_s)); 10337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->rev_id = CT_GS3_REVISION; 10347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->gs_type = CT_GSTYPE_MGMTSERVICE; 10357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->gs_sub_type = sub_type; 1036ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang cthdr->cmd_rsp_code = cpu_to_be16(cmd_code); 10377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 10407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gidpn_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, 10417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t port_name) 10427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1043a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1044a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_gidpn_req_s *gidpn = (struct fcgs_gidpn_req_s *)(cthdr + 1); 1045f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 10467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); 10487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_GID_PN); 10497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10506a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(gidpn, 0, sizeof(struct fcgs_gidpn_req_s)); 10517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gidpn->port_name = port_name; 1052f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_gidpn_req_s) + sizeof(struct ct_hdr_s); 10537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 10567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gpnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, 10577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 port_id) 10587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1059a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 10607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcgs_gpnid_req_t *gpnid = (fcgs_gpnid_req_t *) (cthdr + 1); 1061f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 10627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); 10647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_GPN_ID); 10657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10666a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(gpnid, 0, sizeof(fcgs_gpnid_req_t)); 10677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gpnid->dap = port_id; 1068f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(fcgs_gpnid_req_t) + sizeof(struct ct_hdr_s); 10697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 10727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gnnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, 10737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 port_id) 10747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1075a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 10767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcgs_gnnid_req_t *gnnid = (fcgs_gnnid_req_t *) (cthdr + 1); 1077f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 10787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); 10807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_GNN_ID); 10817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10826a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(gnnid, 0, sizeof(fcgs_gnnid_req_t)); 10837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gnnid->dap = port_id; 1084f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(fcgs_gnnid_req_t) + sizeof(struct ct_hdr_s); 10857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 10887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_ct_rsp_parse(struct ct_hdr_s *cthdr) 10897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1090ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang if (be16_to_cpu(cthdr->cmd_rsp_code) != CT_RSP_ACCEPT) { 10917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (cthdr->reason_code == CT_RSN_LOGICAL_BUSY) 10927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_BUSY; 10937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang else 10947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 10957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 10967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_OK; 10987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 1101a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_scr_build(struct fchs_s *fchs, struct fc_scr_s *scr, 1102a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u8 set_br_reg, u32 s_id, u16 ox_id) 11037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1104f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_FABRIC_CONTROLLER); 11057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 11077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11086a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(scr, 0, sizeof(struct fc_scr_s)); 11097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang scr->command = FC_ELS_SCR; 11107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang scr->reg_func = FC_SCR_REG_FUNC_FULL; 11117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (set_br_reg) 11127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang scr->vu_reg_func = FC_VU_SCR_REG_FUNC_FABRIC_NAME_CHANGE; 11137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1114f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_scr_s); 11157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 1118a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_rscn_build(struct fchs_s *fchs, struct fc_rscn_pl_s *rscn, 1119a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 s_id, u16 ox_id) 11207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1121f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_FABRIC_CONTROLLER); 11227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u16 payldlen; 11237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 11257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rscn->command = FC_ELS_RSCN; 11267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rscn->pagelen = sizeof(rscn->event[0]); 11277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang payldlen = sizeof(u32) + rscn->pagelen; 1129ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang rscn->payldlen = cpu_to_be16(payldlen); 11307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rscn->event[0].format = FC_RSCN_FORMAT_PORTID; 11327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rscn->event[0].portid = s_id; 11337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1134f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_rscn_pl_s); 11357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 11387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rftid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, 1139a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_lport_role roles) 11407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1141a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1142a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_rftid_req_s *rftid = (struct fcgs_rftid_req_s *)(cthdr + 1); 1143f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 type_value, d_id = bfa_hton3b(FC_NAME_SERVER); 11447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 index; 11457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); 11477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RFT_ID); 11487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11496a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rftid, 0, sizeof(struct fcgs_rftid_req_s)); 11507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rftid->dap = s_id; 11527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* By default, FCP FC4 Type is registered */ 11547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang index = FC_TYPE_FCP >> 5; 11557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang type_value = 1 << (FC_TYPE_FCP % 32); 1156ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang rftid->fc4_type[index] = cpu_to_be32(type_value); 11577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1158f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rftid_req_s) + sizeof(struct ct_hdr_s); 11597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 1162a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_rftid_build_sol(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, 1163a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u8 *fc4_bitmap, u32 bitmap_size) 11647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1165a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1166a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_rftid_req_s *rftid = (struct fcgs_rftid_req_s *)(cthdr + 1); 1167f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 11687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); 11707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RFT_ID); 11717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11726a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rftid, 0, sizeof(struct fcgs_rftid_req_s)); 11737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rftid->dap = s_id; 11756a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy((void *)rftid->fc4_type, (void *)fc4_bitmap, 1176a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (bitmap_size < 32 ? bitmap_size : 32)); 11777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1178f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rftid_req_s) + sizeof(struct ct_hdr_s); 11797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 11827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rffid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, 11837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 fc4_type, u8 fc4_ftrs) 11847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1185a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1186a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_rffid_req_s *rffid = (struct fcgs_rffid_req_s *)(cthdr + 1); 1187f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 11887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); 11907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RFF_ID); 11917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11926a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rffid, 0, sizeof(struct fcgs_rffid_req_s)); 11937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1194a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati rffid->dap = s_id; 11957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rffid->fc4ftr_bits = fc4_ftrs; 1196a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati rffid->fc4_type = fc4_type; 11977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1198f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rffid_req_s) + sizeof(struct ct_hdr_s); 11997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 12027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rspnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, 12037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 *name) 12047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 12057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1206a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 12077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct fcgs_rspnid_req_s *rspnid = 1208a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (struct fcgs_rspnid_req_s *)(cthdr + 1); 1209f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 12107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); 12127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RSPN_ID); 12137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12146a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rspnid, 0, sizeof(struct fcgs_rspnid_req_s)); 12157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rspnid->dap = s_id; 12177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rspnid->spn_len = (u8) strlen((char *)name); 12187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang strncpy((char *)rspnid->spn, (char *)name, rspnid->spn_len); 12197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1220f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rspnid_req_s) + sizeof(struct ct_hdr_s); 12217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 1224a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_gid_ft_build(struct fchs_s *fchs, void *pyld, u32 s_id, u8 fc4_type) 12257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 12267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1227a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1228a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_gidft_req_s *gidft = (struct fcgs_gidft_req_s *)(cthdr + 1); 1229f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 12307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 12327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_GID_FT); 12347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12356a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(gidft, 0, sizeof(struct fcgs_gidft_req_s)); 12367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gidft->fc4_type = fc4_type; 12377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gidft->domain_id = 0; 12387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gidft->area_id = 0; 12397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1240f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_gidft_req_s) + sizeof(struct ct_hdr_s); 12417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 12447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rpnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id, 12457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t port_name) 12467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1247a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1248a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_rpnid_req_s *rpnid = (struct fcgs_rpnid_req_s *)(cthdr + 1); 1249f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 12507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 12527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RPN_ID); 12537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12546a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rpnid, 0, sizeof(struct fcgs_rpnid_req_s)); 12557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpnid->port_id = port_id; 12567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpnid->port_name = port_name; 12577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1258f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rpnid_req_s) + sizeof(struct ct_hdr_s); 12597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 12627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rnnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id, 12637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t node_name) 12647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1265a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1266a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_rnnid_req_s *rnnid = (struct fcgs_rnnid_req_s *)(cthdr + 1); 1267f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 12687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 12707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RNN_ID); 12717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12726a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rnnid, 0, sizeof(struct fcgs_rnnid_req_s)); 12737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnnid->port_id = port_id; 12747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnnid->node_name = node_name; 12757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1276f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rnnid_req_s) + sizeof(struct ct_hdr_s); 12777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 12807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rcsid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id, 12817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 cos) 12827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1283a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 12847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct fcgs_rcsid_req_s *rcsid = 12857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang (struct fcgs_rcsid_req_s *) (cthdr + 1); 1286f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 12877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 12897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RCS_ID); 12907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12916a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rcsid, 0, sizeof(struct fcgs_rcsid_req_s)); 12927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rcsid->port_id = port_id; 12937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rcsid->cos = cos; 12947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1295f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rcsid_req_s) + sizeof(struct ct_hdr_s); 12967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 12997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rptid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id, 13007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 port_type) 13017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1302a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1303a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_rptid_req_s *rptid = (struct fcgs_rptid_req_s *)(cthdr + 1); 1304f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 13057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 13077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RPT_ID); 13087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13096a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rptid, 0, sizeof(struct fcgs_rptid_req_s)); 13107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rptid->port_id = port_id; 13117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rptid->port_type = port_type; 13127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1313f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rptid_req_s) + sizeof(struct ct_hdr_s); 13147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 13177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_ganxt_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id) 13187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1319a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1320a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_ganxt_req_s *ganxt = (struct fcgs_ganxt_req_s *)(cthdr + 1); 1321f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 13227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 13247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_GA_NXT); 13257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13266a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(ganxt, 0, sizeof(struct fcgs_ganxt_req_s)); 13277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ganxt->port_id = port_id; 13287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1329f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct ct_hdr_s) + sizeof(struct fcgs_ganxt_req_s); 13307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 13337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Builds fc hdr and ct hdr for FDMI requests. 13347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 13357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 13367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_fdmi_reqhdr_build(struct fchs_s *fchs, void *pyld, u32 s_id, 13377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u16 cmd_code) 13387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 13397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1340a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1341f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_MGMT_SERVER); 13427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 13447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fdmi_cthdr_build(cthdr, s_id, cmd_code); 13457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1346f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct ct_hdr_s); 13477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 13507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Given a FC4 Type, this function returns a fc4 type bitmask 13517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 13527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 13537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_get_fc4type_bitmask(u8 fc4_type, u8 *bit_mask) 13547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 13557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 index; 135650444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be32 *ptr = (__be32 *) bit_mask; 13577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 type_value; 13587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 13607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @todo : Check for bitmask size 13617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 13627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang index = fc4_type >> 5; 13647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang type_value = 1 << (fc4_type % 32); 1365ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang ptr[index] = cpu_to_be32(type_value); 13667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 1370a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * GMAL Request 13717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 13727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 13737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gmal_req_build(struct fchs_s *fchs, void *pyld, u32 s_id, wwn_t wwn) 13747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1375a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 13767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcgs_gmal_req_t *gmal = (fcgs_gmal_req_t *) (cthdr + 1); 1377f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_MGMT_SERVER); 13787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 13807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_ms_cthdr_build(cthdr, s_id, GS_FC_GMAL_CMD, 13817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang CT_GSSUBTYPE_CFGSERVER); 13827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13836a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(gmal, 0, sizeof(fcgs_gmal_req_t)); 13847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gmal->wwn = wwn; 13857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1386f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct ct_hdr_s) + sizeof(fcgs_gmal_req_t); 13877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 13907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * GFN (Get Fabric Name) Request 13917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 13927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 13937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gfn_req_build(struct fchs_s *fchs, void *pyld, u32 s_id, wwn_t wwn) 13947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1395a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 13967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcgs_gfn_req_t *gfn = (fcgs_gfn_req_t *) (cthdr + 1); 1397f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_MGMT_SERVER); 13987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 14007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_ms_cthdr_build(cthdr, s_id, GS_FC_GFN_CMD, 14017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang CT_GSSUBTYPE_CFGSERVER); 14027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14036a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(gfn, 0, sizeof(fcgs_gfn_req_t)); 14047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gfn->wwn = wwn; 14057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1406f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct ct_hdr_s) + sizeof(fcgs_gfn_req_t); 14077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1408