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 158d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipatistatic void 159d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipatifc_gsresp_fchdr_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id) 160d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati{ 161d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati memset(fchs, 0, sizeof(struct fchs_s)); 162d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati 163d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati fchs->routing = FC_RTG_FC4_DEV_DATA; 164d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati fchs->cat_info = FC_CAT_SOLICIT_CTRL; 165d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati fchs->type = FC_TYPE_SERVICES; 166d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati fchs->f_ctl = 167d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati bfa_hton3b(FCTL_EC_RESP | FCTL_SEQ_INI | FCTL_LS_EXCH | 168d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati FCTL_END_SEQ | FCTL_SI_XFER); 169d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati fchs->d_id = d_id; 170d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati fchs->s_id = s_id; 171d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati fchs->ox_id = ox_id; 172d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati} 173d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati 1747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 17550444a340028119ce5ba45d60b4cf44e3e6e1b32Maggiefc_els_req_build(struct fchs_s *fchs, u32 d_id, u32 s_id, __be16 ox_id) 1767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1776a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(fchs, &fc_els_req_tmpl, sizeof(struct fchs_s)); 1787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->d_id = (d_id); 1797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->s_id = (s_id); 180ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang fchs->ox_id = cpu_to_be16(ox_id); 1817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 18450444a340028119ce5ba45d60b4cf44e3e6e1b32Maggiefc_els_rsp_build(struct fchs_s *fchs, u32 d_id, u32 s_id, __be16 ox_id) 1857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1866a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(fchs, &fc_els_rsp_tmpl, sizeof(struct fchs_s)); 1877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->d_id = d_id; 1887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->s_id = s_id; 1897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->ox_id = ox_id; 1907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 1937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_els_rsp_parse(struct fchs_s *fchs, int len) 1947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 195a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_els_cmd_s *els_cmd = (struct fc_els_cmd_s *) (fchs + 1); 196a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_ls_rjt_s *ls_rjt = (struct fc_ls_rjt_s *) els_cmd; 1977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang len = len; 1997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (els_cmd->els_code) { 2017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case FC_ELS_LS_RJT: 2027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (ls_rjt->reason_code == FC_LS_RJT_RSN_LOGICAL_BUSY) 203f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_BUSY; 2047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang else 205f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 2067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case FC_ELS_ACC: 208f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 2097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 210f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 2117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 21450444a340028119ce5ba45d60b4cf44e3e6e1b32Maggiefc_bls_rsp_build(struct fchs_s *fchs, u32 d_id, u32 s_id, __be16 ox_id) 2157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2166a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(fchs, &fc_bls_rsp_tmpl, sizeof(struct fchs_s)); 2177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->d_id = d_id; 2187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->s_id = s_id; 2197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->ox_id = ox_id; 2207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic u16 2237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_plogi_x_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, 22450444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be16 ox_id, wwn_t port_name, wwn_t node_name, 225be540a991e2097c313d7304e0daaf89d68011bb9Krishna Gudipati u16 pdu_size, u16 bb_cr, u8 els_code) 2267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 227a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_logi_s *plogi = (struct fc_logi_s *) (pld); 2287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2296a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(plogi, &plogi_tmpl, sizeof(struct fc_logi_s)); 2307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi->els_cmd.els_code = els_code; 2327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (els_code == FC_ELS_PLOGI) 2337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 2347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang else 2357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 2367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 237ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang plogi->csp.rxsz = plogi->class3.rxsz = cpu_to_be16(pdu_size); 238be540a991e2097c313d7304e0daaf89d68011bb9Krishna Gudipati plogi->csp.bbcred = cpu_to_be16(bb_cr); 2397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2406a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(&plogi->port_name, &port_name, sizeof(wwn_t)); 2416a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(&plogi->node_name, &node_name, sizeof(wwn_t)); 2427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 243f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_logi_s); 2447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 2477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_flogi_build(struct fchs_s *fchs, struct fc_logi_s *flogi, u32 s_id, 248a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u16 ox_id, wwn_t port_name, wwn_t node_name, u16 pdu_size, 249a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u8 set_npiv, u8 set_auth, u16 local_bb_credits) 2507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 251f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_FABRIC_PORT); 25250444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be32 *vvl_info; 2537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2546a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(flogi, &plogi_tmpl, sizeof(struct fc_logi_s)); 2557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->els_cmd.els_code = FC_ELS_FLOGI; 2577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 2587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 259ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang flogi->csp.rxsz = flogi->class3.rxsz = cpu_to_be16(pdu_size); 2607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->port_name = port_name; 2617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->node_name = node_name; 2627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 2647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Set the NPIV Capability Bit ( word 1, bit 31) of Common 2657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Service Parameters. 2667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 2677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->csp.ciro = set_npiv; 2687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* set AUTH capability */ 2707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->csp.security = set_auth; 2717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 272ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang flogi->csp.bbcred = cpu_to_be16(local_bb_credits); 2737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* Set brcd token in VVL */ 2757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang vvl_info = (u32 *)&flogi->vvl[0]; 2767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* set the flag to indicate the presence of VVL */ 2787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->csp.npiv_supp = 1; /* @todo. field name is not correct */ 279ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang vvl_info[0] = cpu_to_be32(FLOGI_VVL_BRCD); 2807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 281f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_logi_s); 2827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 2857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_flogi_acc_build(struct fchs_s *fchs, struct fc_logi_s *flogi, u32 s_id, 28650444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be16 ox_id, wwn_t port_name, wwn_t node_name, 287be540a991e2097c313d7304e0daaf89d68011bb9Krishna Gudipati u16 pdu_size, u16 local_bb_credits, u8 bb_scn) 2887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = 0; 290be540a991e2097c313d7304e0daaf89d68011bb9Krishna Gudipati u16 bbscn_rxsz = (bb_scn << 12) | pdu_size; 2917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2926a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(flogi, &plogi_tmpl, sizeof(struct fc_logi_s)); 2937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 2947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->els_cmd.els_code = FC_ELS_ACC; 296be540a991e2097c313d7304e0daaf89d68011bb9Krishna Gudipati flogi->class3.rxsz = cpu_to_be16(pdu_size); 297be540a991e2097c313d7304e0daaf89d68011bb9Krishna Gudipati flogi->csp.rxsz = cpu_to_be16(bbscn_rxsz); /* bb_scn/rxsz */ 2987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->port_name = port_name; 2997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->node_name = node_name; 3007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 301ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang flogi->csp.bbcred = cpu_to_be16(local_bb_credits); 3027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 303f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_logi_s); 3047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 3077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_fdisc_build(struct fchs_s *fchs, struct fc_logi_s *flogi, u32 s_id, 308a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u16 ox_id, wwn_t port_name, wwn_t node_name, u16 pdu_size) 3097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 310f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_FABRIC_PORT); 3117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3126a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(flogi, &plogi_tmpl, sizeof(struct fc_logi_s)); 3137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->els_cmd.els_code = FC_ELS_FDISC; 3157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 3167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 317ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang flogi->csp.rxsz = flogi->class3.rxsz = cpu_to_be16(pdu_size); 3187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->port_name = port_name; 3197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->node_name = node_name; 3207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 321f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_logi_s); 3227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 3257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_plogi_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, 3267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u16 ox_id, wwn_t port_name, wwn_t node_name, 327be540a991e2097c313d7304e0daaf89d68011bb9Krishna Gudipati u16 pdu_size, u16 bb_cr) 3287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 3297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return fc_plogi_x_build(fchs, pld, d_id, s_id, ox_id, port_name, 330be540a991e2097c313d7304e0daaf89d68011bb9Krishna Gudipati node_name, pdu_size, bb_cr, FC_ELS_PLOGI); 3317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 3347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_plogi_acc_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, 3357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u16 ox_id, wwn_t port_name, wwn_t node_name, 336be540a991e2097c313d7304e0daaf89d68011bb9Krishna Gudipati u16 pdu_size, u16 bb_cr) 3377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 3387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return fc_plogi_x_build(fchs, pld, d_id, s_id, ox_id, port_name, 339be540a991e2097c313d7304e0daaf89d68011bb9Krishna Gudipati node_name, pdu_size, bb_cr, FC_ELS_ACC); 3407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 3437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_plogi_rsp_parse(struct fchs_s *fchs, int len, wwn_t port_name) 3447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 345a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_els_cmd_s *els_cmd = (struct fc_els_cmd_s *) (fchs + 1); 346a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_logi_s *plogi; 347a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_ls_rjt_s *ls_rjt; 3487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (els_cmd->els_code) { 3507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case FC_ELS_LS_RJT: 3517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ls_rjt = (struct fc_ls_rjt_s *) (fchs + 1); 3527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (ls_rjt->reason_code == FC_LS_RJT_RSN_LOGICAL_BUSY) 353f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_BUSY; 3547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang else 355f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 3567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case FC_ELS_ACC: 3577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi = (struct fc_logi_s *) (fchs + 1); 3587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (len < sizeof(struct fc_logi_s)) 359f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 3607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!wwn_is_equal(plogi->port_name, port_name)) 362f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 3637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!plogi->class3.class_valid) 365f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 3667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 367ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang if (be16_to_cpu(plogi->class3.rxsz) < (FC_MIN_PDUSZ)) 368f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 3697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 370f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 3717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 372f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 3737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 3747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 3777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_plogi_parse(struct fchs_s *fchs) 3787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 379a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_logi_s *plogi = (struct fc_logi_s *) (fchs + 1); 3807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (plogi->class3.class_valid != 1) 3827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 3837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 384ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang if ((be16_to_cpu(plogi->class3.rxsz) < FC_MIN_PDUSZ) 385ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang || (be16_to_cpu(plogi->class3.rxsz) > FC_MAX_PDUSZ) 3867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang || (plogi->class3.rxsz == 0)) 387f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 3887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_OK; 3907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 3937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_prli_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, 3947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u16 ox_id) 3957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 396a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_prli_s *prli = (struct fc_prli_s *) (pld); 3977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 3996a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(prli, &prli_tmpl, sizeof(struct fc_prli_s)); 4007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->command = FC_ELS_PRLI; 4027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->parampage.servparams.initiator = 1; 4037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->parampage.servparams.retry = 1; 4047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->parampage.servparams.rec_support = 1; 4057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->parampage.servparams.task_retry_id = 0; 4067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->parampage.servparams.confirm = 1; 4077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 408f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_prli_s); 4097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 4127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_prli_acc_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, 41350444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be16 ox_id, enum bfa_lport_role role) 4147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 415a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_prli_s *prli = (struct fc_prli_s *) (pld); 4167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 4186a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(prli, &prli_tmpl, sizeof(struct fc_prli_s)); 4197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->command = FC_ELS_ACC; 4217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 422a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati prli->parampage.servparams.initiator = 1; 4237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->parampage.rspcode = FC_PRLI_ACC_XQTD; 4257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 426f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_prli_s); 4277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 4307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_prli_rsp_parse(struct fc_prli_s *prli, int len) 4317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (len < sizeof(struct fc_prli_s)) 433f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 4347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prli->command != FC_ELS_ACC) 436f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 4377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if ((prli->parampage.rspcode != FC_PRLI_ACC_XQTD) 4397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang && (prli->parampage.rspcode != FC_PRLI_ACC_PREDEF_IMG)) 440f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 4417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prli->parampage.servparams.target != 1) 443f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 4447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 445f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 4467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 4497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_prli_parse(struct fc_prli_s *prli) 4507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prli->parampage.type != FC_TYPE_FCP) 452f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 4537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!prli->parampage.imagepair) 455f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 4567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!prli->parampage.servparams.initiator) 458f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 4597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 460f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 4617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 464a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_logo_build(struct fchs_s *fchs, struct fc_logo_s *logo, u32 d_id, u32 s_id, 465a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u16 ox_id, wwn_t port_name) 4667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 4687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4696a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(logo, '\0', sizeof(struct fc_logo_s)); 4707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang logo->els_cmd.els_code = FC_ELS_LOGO; 4717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang logo->nport_id = (s_id); 4727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang logo->orig_port_name = port_name; 4737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 474f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_logo_s); 4757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 477da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhangstatic u16 4787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_adisc_x_build(struct fchs_s *fchs, struct fc_adisc_s *adisc, u32 d_id, 47950444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id, wwn_t port_name, 4807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t node_name, u8 els_code) 4817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4826a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(adisc, '\0', sizeof(struct fc_adisc_s)); 4837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang adisc->els_cmd.els_code = els_code; 4857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (els_code == FC_ELS_ADISC) 4877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 4887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang else 4897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 4907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang adisc->orig_HA = 0; 4927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang adisc->orig_port_name = port_name; 4937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang adisc->orig_node_name = node_name; 4947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang adisc->nport_id = (s_id); 4957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 496f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_adisc_s); 4977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 5007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_adisc_build(struct fchs_s *fchs, struct fc_adisc_s *adisc, u32 d_id, 50150444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id, wwn_t port_name, wwn_t node_name) 5027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return fc_adisc_x_build(fchs, adisc, d_id, s_id, ox_id, port_name, 5047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang node_name, FC_ELS_ADISC); 5057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 5087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_adisc_acc_build(struct fchs_s *fchs, struct fc_adisc_s *adisc, u32 d_id, 50950444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id, wwn_t port_name, 5107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t node_name) 5117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return fc_adisc_x_build(fchs, adisc, d_id, s_id, ox_id, port_name, 5137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang node_name, FC_ELS_ACC); 5147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 5177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_adisc_rsp_parse(struct fc_adisc_s *adisc, int len, wwn_t port_name, 5187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t node_name) 5197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (len < sizeof(struct fc_adisc_s)) 522f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (adisc->els_cmd.els_code != FC_ELS_ACC) 525f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!wwn_is_equal(adisc->orig_port_name, port_name)) 528f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 530f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 5317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 534a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_adisc_parse(struct fchs_s *fchs, void *pld, u32 host_dap, wwn_t node_name, 535a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati wwn_t port_name) 5367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 537a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_adisc_s *adisc = (struct fc_adisc_s *) pld; 5387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (adisc->els_cmd.els_code != FC_ELS_ACC) 540f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if ((adisc->nport_id == (host_dap)) 5437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang && wwn_is_equal(adisc->orig_port_name, port_name) 5447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang && wwn_is_equal(adisc->orig_node_name, node_name)) 545f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 5467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 547f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 5517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_pdisc_parse(struct fchs_s *fchs, wwn_t node_name, wwn_t port_name) 5527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 553a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_logi_s *pdisc = (struct fc_logi_s *) (fchs + 1); 5547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (pdisc->class3.class_valid != 1) 5567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 5577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 558ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang if ((be16_to_cpu(pdisc->class3.rxsz) < 559a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (FC_MIN_PDUSZ - sizeof(struct fchs_s))) 5607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang || (pdisc->class3.rxsz == 0)) 561f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!wwn_is_equal(pdisc->port_name, port_name)) 564f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!wwn_is_equal(pdisc->node_name, node_name)) 567f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_OK; 5707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 5737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_abts_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id) 5747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5756a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(fchs, &fc_bls_req_tmpl, sizeof(struct fchs_s)); 5767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->cat_info = FC_CAT_ABTS; 5777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->d_id = (d_id); 5787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->s_id = (s_id); 579ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang fchs->ox_id = cpu_to_be16(ox_id); 5807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 581f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fchs_s); 5827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 5857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_abts_rsp_parse(struct fchs_s *fchs, int len) 5867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if ((fchs->cat_info == FC_CAT_BA_ACC) 5887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang || (fchs->cat_info == FC_CAT_BA_RJT)) 589f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 5907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 591f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 595a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_rrq_build(struct fchs_s *fchs, struct fc_rrq_s *rrq, u32 d_id, u32 s_id, 596a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u16 ox_id, u16 rrq_oxid) 5977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 5997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 6017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * build rrq payload 6027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6036a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(rrq, &rrq_tmpl, sizeof(struct fc_rrq_s)); 6047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rrq->s_id = (s_id); 605ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang rrq->ox_id = cpu_to_be16(rrq_oxid); 6067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rrq->rx_id = FC_RXID_ANY; 6077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 608f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_rrq_s); 6097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 6127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_logo_acc_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, 61350444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be16 ox_id) 6147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 615a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_els_cmd_s *acc = pld; 6167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 6187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6196a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(acc, 0, sizeof(struct fc_els_cmd_s)); 6207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang acc->els_code = FC_ELS_ACC; 6217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 622f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_els_cmd_s); 6237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 6267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_ls_rjt_build(struct fchs_s *fchs, struct fc_ls_rjt_s *ls_rjt, u32 d_id, 62750444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id, u8 reason_code, 6287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 reason_code_expl) 6297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 6316a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(ls_rjt, 0, sizeof(struct fc_ls_rjt_s)); 6327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ls_rjt->els_cmd.els_code = FC_ELS_LS_RJT; 6347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ls_rjt->reason_code = reason_code; 6357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ls_rjt->reason_code_expl = reason_code_expl; 6367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ls_rjt->vendor_unique = 0x00; 6377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 638f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_ls_rjt_s); 6397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 6427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_ba_acc_build(struct fchs_s *fchs, struct fc_ba_acc_s *ba_acc, u32 d_id, 64350444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id, u16 rx_id) 6447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_bls_rsp_build(fchs, d_id, s_id, ox_id); 6467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6476a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(ba_acc, &ba_acc_tmpl, sizeof(struct fc_ba_acc_s)); 6487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->rx_id = rx_id; 6507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ba_acc->ox_id = fchs->ox_id; 6527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ba_acc->rx_id = fchs->rx_id; 6537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 654f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_ba_acc_s); 6557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 658a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_ls_acc_build(struct fchs_s *fchs, struct fc_els_cmd_s *els_cmd, u32 d_id, 65950444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id) 6607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 6626a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(els_cmd, 0, sizeof(struct fc_els_cmd_s)); 6637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang els_cmd->els_code = FC_ELS_ACC; 6647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 665f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_els_cmd_s); 6667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangint 6697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_logout_params_pages(struct fchs_s *fc_frame, u8 els_code) 6707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int num_pages = 0; 672a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_prlo_s *prlo; 673a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_tprlo_s *tprlo; 6747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (els_code == FC_ELS_PRLO) { 6767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo = (struct fc_prlo_s *) (fc_frame + 1); 677ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang num_pages = (be16_to_cpu(prlo->payload_len) - 4) / 16; 6787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } else { 6797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo = (struct fc_tprlo_s *) (fc_frame + 1); 680ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang num_pages = (be16_to_cpu(tprlo->payload_len) - 4) / 16; 6817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 6827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return num_pages; 6837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 6867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_tprlo_acc_build(struct fchs_s *fchs, struct fc_tprlo_acc_s *tprlo_acc, 68750444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 d_id, u32 s_id, __be16 ox_id, int num_pages) 6887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int page; 6907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 6927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6936a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(tprlo_acc, 0, (num_pages * 16) + 4); 6947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo_acc->command = FC_ELS_ACC; 6957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo_acc->page_len = 0x10; 697ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang tprlo_acc->payload_len = cpu_to_be16((num_pages * 16) + 4); 6987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (page = 0; page < num_pages; page++) { 7007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo_acc->tprlo_acc_params[page].opa_valid = 0; 7017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo_acc->tprlo_acc_params[page].rpa_valid = 0; 7027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo_acc->tprlo_acc_params[page].fc4type_csp = FC_TYPE_FCP; 7037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo_acc->tprlo_acc_params[page].orig_process_assc = 0; 7047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo_acc->tprlo_acc_params[page].resp_process_assc = 0; 7057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 706ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang return be16_to_cpu(tprlo_acc->payload_len); 7077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 710a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_prlo_acc_build(struct fchs_s *fchs, struct fc_prlo_acc_s *prlo_acc, u32 d_id, 71150444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id, int num_pages) 7127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int page; 7147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 7167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7176a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(prlo_acc, 0, (num_pages * 16) + 4); 7187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo_acc->command = FC_ELS_ACC; 7197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo_acc->page_len = 0x10; 720ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang prlo_acc->payload_len = cpu_to_be16((num_pages * 16) + 4); 7217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (page = 0; page < num_pages; page++) { 7237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo_acc->prlo_acc_params[page].opa_valid = 0; 7247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo_acc->prlo_acc_params[page].rpa_valid = 0; 7257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo_acc->prlo_acc_params[page].fc4type_csp = FC_TYPE_FCP; 7267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo_acc->prlo_acc_params[page].orig_process_assc = 0; 7277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo_acc->prlo_acc_params[page].resp_process_assc = 0; 7287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 7297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 730ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang return be16_to_cpu(prlo_acc->payload_len); 7317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 7347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rnid_build(struct fchs_s *fchs, struct fc_rnid_cmd_s *rnid, u32 d_id, 735a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 s_id, u16 ox_id, u32 data_format) 7367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 7387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7396a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rnid, 0, sizeof(struct fc_rnid_cmd_s)); 7407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnid->els_cmd.els_code = FC_ELS_RNID; 7427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnid->node_id_data_format = data_format; 7437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 744f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_rnid_cmd_s); 7457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 748a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_rnid_acc_build(struct fchs_s *fchs, struct fc_rnid_acc_s *rnid_acc, u32 d_id, 74950444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id, u32 data_format, 750a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_rnid_common_id_data_s *common_id_data, 751a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_rnid_general_topology_data_s *gen_topo_data) 7527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7536a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rnid_acc, 0, sizeof(struct fc_rnid_acc_s)); 7547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 7567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnid_acc->els_cmd.els_code = FC_ELS_ACC; 7587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnid_acc->node_id_data_format = data_format; 7597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnid_acc->common_id_data_length = 7607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang sizeof(struct fc_rnid_common_id_data_s); 7617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnid_acc->common_id_data = *common_id_data; 7627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (data_format == RNID_NODEID_DATA_FORMAT_DISCOVERY) { 7647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnid_acc->specific_id_data_length = 7657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang sizeof(struct fc_rnid_general_topology_data_s); 7666a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang rnid_acc->gen_topology_data = *gen_topo_data; 767f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_rnid_acc_s); 7687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } else { 769f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_rnid_acc_s) - 770f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang sizeof(struct fc_rnid_general_topology_data_s); 7717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 7727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 7767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rpsc_build(struct fchs_s *fchs, struct fc_rpsc_cmd_s *rpsc, u32 d_id, 777a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 s_id, u16 ox_id) 7787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 7807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7816a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rpsc, 0, sizeof(struct fc_rpsc_cmd_s)); 7827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpsc->els_cmd.els_code = FC_ELS_RPSC; 784f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_rpsc_cmd_s); 7857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 788a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_rpsc2_build(struct fchs_s *fchs, struct fc_rpsc2_cmd_s *rpsc2, u32 d_id, 789a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 s_id, u32 *pid_list, u16 npids) 7907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 791f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 dctlr_id = FC_DOMAIN_CTRLR(bfa_hton3b(d_id)); 7927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int i = 0; 7937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 794f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang fc_els_req_build(fchs, bfa_hton3b(dctlr_id), s_id, 0); 7957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7966a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rpsc2, 0, sizeof(struct fc_rpsc2_cmd_s)); 7977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpsc2->els_cmd.els_code = FC_ELS_RPSC; 799ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang rpsc2->token = cpu_to_be32(FC_BRCD_TOKEN); 800ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang rpsc2->num_pids = cpu_to_be16(npids); 8017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (i = 0; i < npids; i++) 8027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpsc2->pid_list[i].pid = pid_list[i]; 8037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 804a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return sizeof(struct fc_rpsc2_cmd_s) + ((npids - 1) * (sizeof(u32))); 8057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 8087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rpsc_acc_build(struct fchs_s *fchs, struct fc_rpsc_acc_s *rpsc_acc, 80950444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 d_id, u32 s_id, __be16 ox_id, 810a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_rpsc_speed_info_s *oper_speed) 8117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 8126a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rpsc_acc, 0, sizeof(struct fc_rpsc_acc_s)); 8137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 8157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpsc_acc->command = FC_ELS_ACC; 817ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang rpsc_acc->num_entries = cpu_to_be16(1); 8187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpsc_acc->speed_info[0].port_speed_cap = 820ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang cpu_to_be16(oper_speed->port_speed_cap); 8217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpsc_acc->speed_info[0].port_op_speed = 823ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang cpu_to_be16(oper_speed->port_op_speed); 8247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 825f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_rpsc_acc_s); 8267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 8297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_logo_rsp_parse(struct fchs_s *fchs, int len) 8307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 831a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_els_cmd_s *els_cmd = (struct fc_els_cmd_s *) (fchs + 1); 8327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang len = len; 8347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (els_cmd->els_code != FC_ELS_ACC) 8357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 8367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_OK; 8387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 841a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_pdisc_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id, 842a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati wwn_t port_name, wwn_t node_name, u16 pdu_size) 8437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 844a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_logi_s *pdisc = (struct fc_logi_s *) (fchs + 1); 8457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8466a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(pdisc, &plogi_tmpl, sizeof(struct fc_logi_s)); 8477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pdisc->els_cmd.els_code = FC_ELS_PDISC; 8497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 8507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 851ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang pdisc->csp.rxsz = pdisc->class3.rxsz = cpu_to_be16(pdu_size); 8527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pdisc->port_name = port_name; 8537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pdisc->node_name = node_name; 8547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 855f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_logi_s); 8567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 8597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_pdisc_rsp_parse(struct fchs_s *fchs, int len, wwn_t port_name) 8607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 861a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_logi_s *pdisc = (struct fc_logi_s *) (fchs + 1); 8627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (len < sizeof(struct fc_logi_s)) 864f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_LEN_INVAL; 8657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (pdisc->els_cmd.els_code != FC_ELS_ACC) 867f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_ACC_INVAL; 8687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!wwn_is_equal(pdisc->port_name, port_name)) 870f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_PWWN_NOT_EQUAL; 8717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!pdisc->class3.class_valid) 873f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_NWWN_NOT_EQUAL; 8747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 875ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang if (be16_to_cpu(pdisc->class3.rxsz) < (FC_MIN_PDUSZ)) 876f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_RXSZ_INVAL; 8777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 878f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 8797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 8827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_prlo_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id, 8837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int num_pages) 8847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 885a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_prlo_s *prlo = (struct fc_prlo_s *) (fchs + 1); 8867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int page; 8877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 8896a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(prlo, 0, (num_pages * 16) + 4); 8907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo->command = FC_ELS_PRLO; 8917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo->page_len = 0x10; 892ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang prlo->payload_len = cpu_to_be16((num_pages * 16) + 4); 8937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (page = 0; page < num_pages; page++) { 8957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo->prlo_params[page].type = FC_TYPE_FCP; 8967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo->prlo_params[page].opa_valid = 0; 8977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo->prlo_params[page].rpa_valid = 0; 8987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo->prlo_params[page].orig_process_assc = 0; 8997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo->prlo_params[page].resp_process_assc = 0; 9007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 9017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 902ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang return be16_to_cpu(prlo->payload_len); 9037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 9047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 9067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_prlo_rsp_parse(struct fchs_s *fchs, int len) 9077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 908a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_prlo_acc_s *prlo = (struct fc_prlo_acc_s *) (fchs + 1); 9097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int num_pages = 0; 9107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int page = 0; 9117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang len = len; 9137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prlo->command != FC_ELS_ACC) 915f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 9167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 917ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang num_pages = ((be16_to_cpu(prlo->payload_len)) - 4) / 16; 9187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (page = 0; page < num_pages; page++) { 9207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prlo->prlo_acc_params[page].type != FC_TYPE_FCP) 9217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 9227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prlo->prlo_acc_params[page].opa_valid != 0) 9247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 9257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prlo->prlo_acc_params[page].rpa_valid != 0) 9277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 9287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prlo->prlo_acc_params[page].orig_process_assc != 0) 9307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 9317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prlo->prlo_acc_params[page].resp_process_assc != 0) 9337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 9347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 935f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 9367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 9387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 940a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_tprlo_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id, 941a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int num_pages, enum fc_tprlo_type tprlo_type, u32 tpr_id) 9427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 943a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_tprlo_s *tprlo = (struct fc_tprlo_s *) (fchs + 1); 9447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int page; 9457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 9476a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(tprlo, 0, (num_pages * 16) + 4); 9487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->command = FC_ELS_TPRLO; 9497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->page_len = 0x10; 950ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang tprlo->payload_len = cpu_to_be16((num_pages * 16) + 4); 9517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (page = 0; page < num_pages; page++) { 9537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].type = FC_TYPE_FCP; 9547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].opa_valid = 0; 9557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].rpa_valid = 0; 9567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].orig_process_assc = 0; 9577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].resp_process_assc = 0; 9587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tprlo_type == FC_GLOBAL_LOGO) { 9597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].global_process_logout = 1; 9607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } else if (tprlo_type == FC_TPR_LOGO) { 9617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].tpo_nport_valid = 1; 9627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].tpo_nport_id = (tpr_id); 9637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 9647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 9657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 966ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang return be16_to_cpu(tprlo->payload_len); 9677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 9687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 9707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_tprlo_rsp_parse(struct fchs_s *fchs, int len) 9717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 9727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct fc_tprlo_acc_s *tprlo = (struct fc_tprlo_acc_s *) (fchs + 1); 9737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int num_pages = 0; 9747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int page = 0; 9757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang len = len; 9777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tprlo->command != FC_ELS_ACC) 979f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_ACC_INVAL; 9807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 981ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang num_pages = (be16_to_cpu(tprlo->payload_len) - 4) / 16; 9827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (page = 0; page < num_pages; page++) { 9847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tprlo->tprlo_acc_params[page].type != FC_TYPE_FCP) 985f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_NOT_FCP; 9867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tprlo->tprlo_acc_params[page].opa_valid != 0) 987f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OPAFLAG_INVAL; 9887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tprlo->tprlo_acc_params[page].rpa_valid != 0) 989f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_RPAFLAG_INVAL; 9907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tprlo->tprlo_acc_params[page].orig_process_assc != 0) 991f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OPA_INVAL; 9927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tprlo->tprlo_acc_params[page].resp_process_assc != 0) 993f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_RPA_INVAL; 9947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 995f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 9967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 9977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 9997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rrq_rsp_parse(struct fchs_s *fchs, int len) 10007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1001a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_els_cmd_s *els_cmd = (struct fc_els_cmd_s *) (fchs + 1); 10027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang len = len; 10047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (els_cmd->els_code != FC_ELS_ACC) 10057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 10067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_OK; 10087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 101150444a340028119ce5ba45d60b4cf44e3e6e1b32Maggiefc_ba_rjt_build(struct fchs_s *fchs, u32 d_id, u32 s_id, __be16 ox_id, 1012a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 reason_code, u32 reason_expl) 10137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1014a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_ba_rjt_s *ba_rjt = (struct fc_ba_rjt_s *) (fchs + 1); 10157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_bls_rsp_build(fchs, d_id, s_id, ox_id); 10177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->cat_info = FC_CAT_BA_RJT; 10197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ba_rjt->reason_code = reason_code; 10207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ba_rjt->reason_expl = reason_expl; 1021f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_ba_rjt_s); 10227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 10257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gs_cthdr_build(struct ct_hdr_s *cthdr, u32 s_id, u16 cmd_code) 10267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 10276a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(cthdr, 0, sizeof(struct ct_hdr_s)); 10287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->rev_id = CT_GS3_REVISION; 10297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->gs_type = CT_GSTYPE_DIRSERVICE; 10307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->gs_sub_type = CT_GSSUBTYPE_NAMESERVER; 1031ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang cthdr->cmd_rsp_code = cpu_to_be16(cmd_code); 10327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 10357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gs_fdmi_cthdr_build(struct ct_hdr_s *cthdr, u32 s_id, u16 cmd_code) 10367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 10376a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(cthdr, 0, sizeof(struct ct_hdr_s)); 10387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->rev_id = CT_GS3_REVISION; 10397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->gs_type = CT_GSTYPE_MGMTSERVICE; 10407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->gs_sub_type = CT_GSSUBTYPE_HBA_MGMTSERVER; 1041ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang cthdr->cmd_rsp_code = cpu_to_be16(cmd_code); 10427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 10457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gs_ms_cthdr_build(struct ct_hdr_s *cthdr, u32 s_id, u16 cmd_code, 10467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 sub_type) 10477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 10486a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(cthdr, 0, sizeof(struct ct_hdr_s)); 10497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->rev_id = CT_GS3_REVISION; 10507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->gs_type = CT_GSTYPE_MGMTSERVICE; 10517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->gs_sub_type = sub_type; 1052ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang cthdr->cmd_rsp_code = cpu_to_be16(cmd_code); 10537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 10567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gidpn_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, 10577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t port_name) 10587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1059a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1060a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_gidpn_req_s *gidpn = (struct fcgs_gidpn_req_s *)(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_GID_PN); 10657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10666a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(gidpn, 0, sizeof(struct fcgs_gidpn_req_s)); 10677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gidpn->port_name = port_name; 1068f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_gidpn_req_s) + sizeof(struct ct_hdr_s); 10697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 10727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gpnid_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_gpnid_req_t *gpnid = (fcgs_gpnid_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_GPN_ID); 10817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10826a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(gpnid, 0, sizeof(fcgs_gpnid_req_t)); 10837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gpnid->dap = port_id; 1084f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(fcgs_gpnid_req_t) + sizeof(struct ct_hdr_s); 10857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 10887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gnnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, 10897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 port_id) 10907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1091a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 10927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcgs_gnnid_req_t *gnnid = (fcgs_gnnid_req_t *) (cthdr + 1); 1093f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 10947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); 10967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_GNN_ID); 10977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10986a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(gnnid, 0, sizeof(fcgs_gnnid_req_t)); 10997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gnnid->dap = port_id; 1100f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(fcgs_gnnid_req_t) + sizeof(struct ct_hdr_s); 11017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 11047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_ct_rsp_parse(struct ct_hdr_s *cthdr) 11057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1106ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang if (be16_to_cpu(cthdr->cmd_rsp_code) != CT_RSP_ACCEPT) { 11077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (cthdr->reason_code == CT_RSN_LOGICAL_BUSY) 11087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_BUSY; 11097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang else 11107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 11117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 11127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_OK; 11147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 1117d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipatifc_gs_rjt_build(struct fchs_s *fchs, struct ct_hdr_s *cthdr, 1118d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati u32 d_id, u32 s_id, u16 ox_id, u8 reason_code, 1119d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati u8 reason_code_expl) 1120d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati{ 1121d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati fc_gsresp_fchdr_build(fchs, d_id, s_id, ox_id); 1122d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati 1123d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati cthdr->cmd_rsp_code = cpu_to_be16(CT_RSP_REJECT); 1124d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati cthdr->rev_id = CT_GS3_REVISION; 1125d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati 1126d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati cthdr->reason_code = reason_code; 1127d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati cthdr->exp_code = reason_code_expl; 1128d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati return sizeof(struct ct_hdr_s); 1129d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati} 1130d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati 1131d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipatiu16 1132a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_scr_build(struct fchs_s *fchs, struct fc_scr_s *scr, 1133a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u8 set_br_reg, u32 s_id, u16 ox_id) 11347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1135f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_FABRIC_CONTROLLER); 11367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 11387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11396a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(scr, 0, sizeof(struct fc_scr_s)); 11407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang scr->command = FC_ELS_SCR; 11417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang scr->reg_func = FC_SCR_REG_FUNC_FULL; 11427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (set_br_reg) 11437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang scr->vu_reg_func = FC_VU_SCR_REG_FUNC_FABRIC_NAME_CHANGE; 11447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1145f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_scr_s); 11467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 1149a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_rscn_build(struct fchs_s *fchs, struct fc_rscn_pl_s *rscn, 1150a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 s_id, u16 ox_id) 11517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1152f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_FABRIC_CONTROLLER); 11537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u16 payldlen; 11547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 11567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rscn->command = FC_ELS_RSCN; 11577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rscn->pagelen = sizeof(rscn->event[0]); 11587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang payldlen = sizeof(u32) + rscn->pagelen; 1160ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang rscn->payldlen = cpu_to_be16(payldlen); 11617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rscn->event[0].format = FC_RSCN_FORMAT_PORTID; 11637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rscn->event[0].portid = s_id; 11647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1165f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_rscn_pl_s); 11667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 11697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rftid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, 1170a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_lport_role roles) 11717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1172a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1173a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_rftid_req_s *rftid = (struct fcgs_rftid_req_s *)(cthdr + 1); 1174f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 type_value, d_id = bfa_hton3b(FC_NAME_SERVER); 11757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 index; 11767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); 11787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RFT_ID); 11797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11806a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rftid, 0, sizeof(struct fcgs_rftid_req_s)); 11817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rftid->dap = s_id; 11837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* By default, FCP FC4 Type is registered */ 11857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang index = FC_TYPE_FCP >> 5; 11867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang type_value = 1 << (FC_TYPE_FCP % 32); 1187ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang rftid->fc4_type[index] = cpu_to_be32(type_value); 11887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1189f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rftid_req_s) + sizeof(struct ct_hdr_s); 11907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 1193a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_rftid_build_sol(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, 1194a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u8 *fc4_bitmap, u32 bitmap_size) 11957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1196a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1197a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_rftid_req_s *rftid = (struct fcgs_rftid_req_s *)(cthdr + 1); 1198f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 11997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); 12017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RFT_ID); 12027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12036a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rftid, 0, sizeof(struct fcgs_rftid_req_s)); 12047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rftid->dap = s_id; 12066a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy((void *)rftid->fc4_type, (void *)fc4_bitmap, 1207a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (bitmap_size < 32 ? bitmap_size : 32)); 12087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1209f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rftid_req_s) + sizeof(struct ct_hdr_s); 12107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 12137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rffid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, 12147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 fc4_type, u8 fc4_ftrs) 12157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1216a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1217a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_rffid_req_s *rffid = (struct fcgs_rffid_req_s *)(cthdr + 1); 1218f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 12197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); 12217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RFF_ID); 12227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12236a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rffid, 0, sizeof(struct fcgs_rffid_req_s)); 12247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1225a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati rffid->dap = s_id; 12267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rffid->fc4ftr_bits = fc4_ftrs; 1227a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati rffid->fc4_type = fc4_type; 12287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1229f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rffid_req_s) + sizeof(struct ct_hdr_s); 12307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 12337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rspnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, 12347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 *name) 12357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 12367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1237a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 12387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct fcgs_rspnid_req_s *rspnid = 1239a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (struct fcgs_rspnid_req_s *)(cthdr + 1); 1240f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 12417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); 12437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RSPN_ID); 12447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12456a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rspnid, 0, sizeof(struct fcgs_rspnid_req_s)); 12467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rspnid->dap = s_id; 12487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rspnid->spn_len = (u8) strlen((char *)name); 12497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang strncpy((char *)rspnid->spn, (char *)name, rspnid->spn_len); 12507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1251f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rspnid_req_s) + sizeof(struct ct_hdr_s); 12527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 1255a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_gid_ft_build(struct fchs_s *fchs, void *pyld, u32 s_id, u8 fc4_type) 12567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 12577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1258a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1259a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_gidft_req_s *gidft = (struct fcgs_gidft_req_s *)(cthdr + 1); 1260f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 12617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 12637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_GID_FT); 12657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12666a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(gidft, 0, sizeof(struct fcgs_gidft_req_s)); 12677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gidft->fc4_type = fc4_type; 12687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gidft->domain_id = 0; 12697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gidft->area_id = 0; 12707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1271f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_gidft_req_s) + sizeof(struct ct_hdr_s); 12727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 12757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rpnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id, 12767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t port_name) 12777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1278a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1279a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_rpnid_req_s *rpnid = (struct fcgs_rpnid_req_s *)(cthdr + 1); 1280f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 12817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 12837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RPN_ID); 12847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12856a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rpnid, 0, sizeof(struct fcgs_rpnid_req_s)); 12867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpnid->port_id = port_id; 12877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpnid->port_name = port_name; 12887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1289f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rpnid_req_s) + sizeof(struct ct_hdr_s); 12907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 12937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rnnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id, 12947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t node_name) 12957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1296a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1297a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_rnnid_req_s *rnnid = (struct fcgs_rnnid_req_s *)(cthdr + 1); 1298f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 12997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 13017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RNN_ID); 13027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13036a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rnnid, 0, sizeof(struct fcgs_rnnid_req_s)); 13047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnnid->port_id = port_id; 13057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnnid->node_name = node_name; 13067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1307f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rnnid_req_s) + sizeof(struct ct_hdr_s); 13087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 13117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rcsid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id, 13127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 cos) 13137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1314a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 13157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct fcgs_rcsid_req_s *rcsid = 13167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang (struct fcgs_rcsid_req_s *) (cthdr + 1); 1317f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 13187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 13207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RCS_ID); 13217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13226a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rcsid, 0, sizeof(struct fcgs_rcsid_req_s)); 13237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rcsid->port_id = port_id; 13247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rcsid->cos = cos; 13257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1326f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rcsid_req_s) + sizeof(struct ct_hdr_s); 13277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 13307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rptid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id, 13317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 port_type) 13327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1333a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1334a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_rptid_req_s *rptid = (struct fcgs_rptid_req_s *)(cthdr + 1); 1335f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 13367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 13387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RPT_ID); 13397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13406a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rptid, 0, sizeof(struct fcgs_rptid_req_s)); 13417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rptid->port_id = port_id; 13427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rptid->port_type = port_type; 13437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1344f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rptid_req_s) + sizeof(struct ct_hdr_s); 13457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 13487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_ganxt_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id) 13497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1350a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1351a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_ganxt_req_s *ganxt = (struct fcgs_ganxt_req_s *)(cthdr + 1); 1352f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_NAME_SERVER); 13537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 13557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_GA_NXT); 13567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13576a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(ganxt, 0, sizeof(struct fcgs_ganxt_req_s)); 13587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ganxt->port_id = port_id; 13597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1360f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct ct_hdr_s) + sizeof(struct fcgs_ganxt_req_s); 13617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 13647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Builds fc hdr and ct hdr for FDMI requests. 13657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 13667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 13677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_fdmi_reqhdr_build(struct fchs_s *fchs, void *pyld, u32 s_id, 13687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u16 cmd_code) 13697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 13707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1371a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1372f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_MGMT_SERVER); 13737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 13757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fdmi_cthdr_build(cthdr, s_id, cmd_code); 13767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1377f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct ct_hdr_s); 13787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 13817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Given a FC4 Type, this function returns a fc4 type bitmask 13827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 13837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 13847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_get_fc4type_bitmask(u8 fc4_type, u8 *bit_mask) 13857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 13867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 index; 138750444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be32 *ptr = (__be32 *) bit_mask; 13887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 type_value; 13897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 13917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @todo : Check for bitmask size 13927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 13937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang index = fc4_type >> 5; 13957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang type_value = 1 << (fc4_type % 32); 1396ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang ptr[index] = cpu_to_be32(type_value); 13977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 1401a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * GMAL Request 14027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 14037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 14047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gmal_req_build(struct fchs_s *fchs, void *pyld, u32 s_id, wwn_t wwn) 14057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1406a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 14077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcgs_gmal_req_t *gmal = (fcgs_gmal_req_t *) (cthdr + 1); 1408f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_MGMT_SERVER); 14097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 14117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_ms_cthdr_build(cthdr, s_id, GS_FC_GMAL_CMD, 14127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang CT_GSSUBTYPE_CFGSERVER); 14137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14146a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(gmal, 0, sizeof(fcgs_gmal_req_t)); 14157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gmal->wwn = wwn; 14167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1417f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct ct_hdr_s) + sizeof(fcgs_gmal_req_t); 14187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 14197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 14217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * GFN (Get Fabric Name) Request 14227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 14237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 14247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gfn_req_build(struct fchs_s *fchs, void *pyld, u32 s_id, wwn_t wwn) 14257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1426a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 14277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcgs_gfn_req_t *gfn = (fcgs_gfn_req_t *) (cthdr + 1); 1428f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang u32 d_id = bfa_hton3b(FC_MGMT_SERVER); 14297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 14317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_ms_cthdr_build(cthdr, s_id, GS_FC_GFN_CMD, 14327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang CT_GSSUBTYPE_CFGSERVER); 14337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14346a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(gfn, 0, sizeof(fcgs_gfn_req_t)); 14357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gfn->wwn = wwn; 14367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1437f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct ct_hdr_s) + sizeof(fcgs_gfn_req_t); 14387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1439