bfa_fcbuild.c revision 50444a340028119ce5ba45d60b4cf44e3e6e1b32
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 21a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfa_os_inc.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 = 517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_os_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 = 627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_os_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; 717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_bls_req_tmpl.f_ctl = bfa_os_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 = 817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_os_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; 97ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang plogi_tmpl.csp.bbcred = cpu_to_be16(0x0004); 987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi_tmpl.csp.ciro = 0x1; 997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi_tmpl.csp.cisc = 0x0; 1007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi_tmpl.csp.altbbcred = 0x0; 101ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang plogi_tmpl.csp.conseq = cpu_to_be16(0x00FF); 102ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang plogi_tmpl.csp.ro_bitmap = cpu_to_be16(0x0002); 103ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang plogi_tmpl.csp.e_d_tov = cpu_to_be32(2000); 1047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi_tmpl.class3.class_valid = 1; 1067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi_tmpl.class3.sequential = 1; 1077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi_tmpl.class3.conseq = 0xFF; 1087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi_tmpl.class3.ospx = 1; 1097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 1117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * prli_tmpl 1127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 1137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli_tmpl.command = FC_ELS_PRLI; 1147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli_tmpl.pglen = 0x10; 115ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang prli_tmpl.pagebytes = cpu_to_be16(0x0014); 1167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli_tmpl.parampage.type = FC_TYPE_FCP; 1177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli_tmpl.parampage.imagepair = 1; 1187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli_tmpl.parampage.servparams.rxrdisab = 1; 1197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 1217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * rrq_tmpl 1227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 1237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rrq_tmpl.els_cmd.els_code = FC_ELS_RRQ; 1247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 126a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * fcp_struct fchs_s mpl 1277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 1287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcp_fchs_tmpl.routing = FC_RTG_FC4_DEV_DATA; 1297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcp_fchs_tmpl.cat_info = FC_CAT_UNSOLICIT_CMD; 1307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcp_fchs_tmpl.type = FC_TYPE_FCP; 1317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcp_fchs_tmpl.f_ctl = 1327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_os_hton3b(FCTL_FS_EXCH | FCTL_END_SEQ | FCTL_SI_XFER); 1337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcp_fchs_tmpl.seq_id = 1; 1347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcp_fchs_tmpl.rx_id = FC_RXID_ANY; 1357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 138a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_gs_fchdr_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u32 ox_id) 1397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1406a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(fchs, 0, sizeof(struct fchs_s)); 1417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->routing = FC_RTG_FC4_DEV_DATA; 1437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->cat_info = FC_CAT_UNSOLICIT_CTRL; 1447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->type = FC_TYPE_SERVICES; 1457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->f_ctl = 1467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_os_hton3b(FCTL_SEQ_INI | FCTL_FS_EXCH | FCTL_END_SEQ | 1477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang FCTL_SI_XFER); 1487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->rx_id = FC_RXID_ANY; 1497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->d_id = (d_id); 1507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->s_id = (s_id); 151ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang fchs->ox_id = cpu_to_be16(ox_id); 1527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1535fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @todo no need to set ox_id for request 1557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * no need to set rx_id for response 1567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 1577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 16050444a340028119ce5ba45d60b4cf44e3e6e1b32Maggiefc_els_req_build(struct fchs_s *fchs, u32 d_id, u32 s_id, __be16 ox_id) 1617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1626a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(fchs, &fc_els_req_tmpl, sizeof(struct fchs_s)); 1637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->d_id = (d_id); 1647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->s_id = (s_id); 165ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang fchs->ox_id = cpu_to_be16(ox_id); 1667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 16950444a340028119ce5ba45d60b4cf44e3e6e1b32Maggiefc_els_rsp_build(struct fchs_s *fchs, u32 d_id, u32 s_id, __be16 ox_id) 1707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1716a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(fchs, &fc_els_rsp_tmpl, sizeof(struct fchs_s)); 1727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->d_id = d_id; 1737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->s_id = s_id; 1747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->ox_id = ox_id; 1757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 1787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_els_rsp_parse(struct fchs_s *fchs, int len) 1797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 180a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_els_cmd_s *els_cmd = (struct fc_els_cmd_s *) (fchs + 1); 181a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_ls_rjt_s *ls_rjt = (struct fc_ls_rjt_s *) els_cmd; 1827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang len = len; 1847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (els_cmd->els_code) { 1867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case FC_ELS_LS_RJT: 1877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (ls_rjt->reason_code == FC_LS_RJT_RSN_LOGICAL_BUSY) 188f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_BUSY; 1897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang else 190f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 1917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case FC_ELS_ACC: 193f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 1947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 195f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 1967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 19950444a340028119ce5ba45d60b4cf44e3e6e1b32Maggiefc_bls_rsp_build(struct fchs_s *fchs, u32 d_id, u32 s_id, __be16 ox_id) 2007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2016a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(fchs, &fc_bls_rsp_tmpl, sizeof(struct fchs_s)); 2027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->d_id = d_id; 2037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->s_id = s_id; 2047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->ox_id = ox_id; 2057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic u16 2087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_plogi_x_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, 20950444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be16 ox_id, wwn_t port_name, wwn_t node_name, 2107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u16 pdu_size, u8 els_code) 2117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 212a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_logi_s *plogi = (struct fc_logi_s *) (pld); 2137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2146a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(plogi, &plogi_tmpl, sizeof(struct fc_logi_s)); 2157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi->els_cmd.els_code = els_code; 2177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (els_code == FC_ELS_PLOGI) 2187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 2197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang else 2207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 2217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 222ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang plogi->csp.rxsz = plogi->class3.rxsz = cpu_to_be16(pdu_size); 2237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2246a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(&plogi->port_name, &port_name, sizeof(wwn_t)); 2256a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(&plogi->node_name, &node_name, sizeof(wwn_t)); 2267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 227f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_logi_s); 2287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 2317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_flogi_build(struct fchs_s *fchs, struct fc_logi_s *flogi, u32 s_id, 232a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u16 ox_id, wwn_t port_name, wwn_t node_name, u16 pdu_size, 233a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u8 set_npiv, u8 set_auth, u16 local_bb_credits) 2347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = bfa_os_hton3b(FC_FABRIC_PORT); 23650444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be32 *vvl_info; 2377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2386a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(flogi, &plogi_tmpl, sizeof(struct fc_logi_s)); 2397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->els_cmd.els_code = FC_ELS_FLOGI; 2417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 2427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 243ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang flogi->csp.rxsz = flogi->class3.rxsz = cpu_to_be16(pdu_size); 2447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->port_name = port_name; 2457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->node_name = node_name; 2467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 2487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Set the NPIV Capability Bit ( word 1, bit 31) of Common 2497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Service Parameters. 2507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 2517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->csp.ciro = set_npiv; 2527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* set AUTH capability */ 2547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->csp.security = set_auth; 2557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 256ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang flogi->csp.bbcred = cpu_to_be16(local_bb_credits); 2577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* Set brcd token in VVL */ 2597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang vvl_info = (u32 *)&flogi->vvl[0]; 2607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* set the flag to indicate the presence of VVL */ 2627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->csp.npiv_supp = 1; /* @todo. field name is not correct */ 263ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang vvl_info[0] = cpu_to_be32(FLOGI_VVL_BRCD); 2647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 265f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_logi_s); 2667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 2697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_flogi_acc_build(struct fchs_s *fchs, struct fc_logi_s *flogi, u32 s_id, 27050444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be16 ox_id, wwn_t port_name, wwn_t node_name, 2717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u16 pdu_size, u16 local_bb_credits) 2727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = 0; 2747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2756a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(flogi, &plogi_tmpl, sizeof(struct fc_logi_s)); 2767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 2777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->els_cmd.els_code = FC_ELS_ACC; 279ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang flogi->csp.rxsz = flogi->class3.rxsz = cpu_to_be16(pdu_size); 2807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->port_name = port_name; 2817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->node_name = node_name; 2827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 283ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang flogi->csp.bbcred = cpu_to_be16(local_bb_credits); 2847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 285f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_logi_s); 2867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 2897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_fdisc_build(struct fchs_s *fchs, struct fc_logi_s *flogi, u32 s_id, 290a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u16 ox_id, wwn_t port_name, wwn_t node_name, u16 pdu_size) 2917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = bfa_os_hton3b(FC_FABRIC_PORT); 2937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2946a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(flogi, &plogi_tmpl, sizeof(struct fc_logi_s)); 2957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->els_cmd.els_code = FC_ELS_FDISC; 2977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 2987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 299ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang flogi->csp.rxsz = flogi->class3.rxsz = cpu_to_be16(pdu_size); 3007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->port_name = port_name; 3017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang flogi->node_name = node_name; 3027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 303f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_logi_s); 3047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 3077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_plogi_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, 3087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u16 ox_id, wwn_t port_name, wwn_t node_name, 3097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u16 pdu_size) 3107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 3117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return fc_plogi_x_build(fchs, pld, d_id, s_id, ox_id, port_name, 3127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang node_name, pdu_size, FC_ELS_PLOGI); 3137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 3167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_plogi_acc_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, 3177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u16 ox_id, wwn_t port_name, wwn_t node_name, 3187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u16 pdu_size) 3197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 3207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return fc_plogi_x_build(fchs, pld, d_id, s_id, ox_id, port_name, 3217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang node_name, pdu_size, FC_ELS_ACC); 3227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 3257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_plogi_rsp_parse(struct fchs_s *fchs, int len, wwn_t port_name) 3267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 327a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_els_cmd_s *els_cmd = (struct fc_els_cmd_s *) (fchs + 1); 328a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_logi_s *plogi; 329a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_ls_rjt_s *ls_rjt; 3307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (els_cmd->els_code) { 3327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case FC_ELS_LS_RJT: 3337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ls_rjt = (struct fc_ls_rjt_s *) (fchs + 1); 3347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (ls_rjt->reason_code == FC_LS_RJT_RSN_LOGICAL_BUSY) 335f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_BUSY; 3367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang else 337f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 3387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case FC_ELS_ACC: 3397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang plogi = (struct fc_logi_s *) (fchs + 1); 3407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (len < sizeof(struct fc_logi_s)) 341f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 3427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!wwn_is_equal(plogi->port_name, port_name)) 344f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 3457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!plogi->class3.class_valid) 347f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 3487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 349ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang if (be16_to_cpu(plogi->class3.rxsz) < (FC_MIN_PDUSZ)) 350f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 3517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 352f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 3537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 354f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 3557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 3567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 3597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_plogi_parse(struct fchs_s *fchs) 3607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 361a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_logi_s *plogi = (struct fc_logi_s *) (fchs + 1); 3627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (plogi->class3.class_valid != 1) 3647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 3657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 366ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang if ((be16_to_cpu(plogi->class3.rxsz) < FC_MIN_PDUSZ) 367ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang || (be16_to_cpu(plogi->class3.rxsz) > FC_MAX_PDUSZ) 3687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang || (plogi->class3.rxsz == 0)) 369f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 3707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_OK; 3727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 3757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_prli_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, 3767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u16 ox_id) 3777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 378a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_prli_s *prli = (struct fc_prli_s *) (pld); 3797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 3816a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(prli, &prli_tmpl, sizeof(struct fc_prli_s)); 3827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->command = FC_ELS_PRLI; 3847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->parampage.servparams.initiator = 1; 3857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->parampage.servparams.retry = 1; 3867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->parampage.servparams.rec_support = 1; 3877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->parampage.servparams.task_retry_id = 0; 3887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->parampage.servparams.confirm = 1; 3897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 390f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_prli_s); 3917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 3947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_prli_acc_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, 39550444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be16 ox_id, enum bfa_lport_role role) 3967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 397a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_prli_s *prli = (struct fc_prli_s *) (pld); 3987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 4006a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(prli, &prli_tmpl, sizeof(struct fc_prli_s)); 4017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->command = FC_ELS_ACC; 4037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 404a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati prli->parampage.servparams.initiator = 1; 4057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli->parampage.rspcode = FC_PRLI_ACC_XQTD; 4077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 408f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_prli_s); 4097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 4127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_prli_rsp_parse(struct fc_prli_s *prli, int len) 4137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (len < sizeof(struct fc_prli_s)) 415f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 4167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prli->command != FC_ELS_ACC) 418f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 4197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if ((prli->parampage.rspcode != FC_PRLI_ACC_XQTD) 4217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang && (prli->parampage.rspcode != FC_PRLI_ACC_PREDEF_IMG)) 422f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 4237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prli->parampage.servparams.target != 1) 425f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 4267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 427f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 4287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 4317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_prli_parse(struct fc_prli_s *prli) 4327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prli->parampage.type != FC_TYPE_FCP) 434f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 4357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!prli->parampage.imagepair) 437f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 4387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!prli->parampage.servparams.initiator) 440f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 4417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 442f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 4437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 446a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_logo_build(struct fchs_s *fchs, struct fc_logo_s *logo, u32 d_id, u32 s_id, 447a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u16 ox_id, wwn_t port_name) 4487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 4507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4516a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(logo, '\0', sizeof(struct fc_logo_s)); 4527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang logo->els_cmd.els_code = FC_ELS_LOGO; 4537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang logo->nport_id = (s_id); 4547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang logo->orig_port_name = port_name; 4557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 456f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_logo_s); 4577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic u16 4607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_adisc_x_build(struct fchs_s *fchs, struct fc_adisc_s *adisc, u32 d_id, 46150444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id, wwn_t port_name, 4627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t node_name, u8 els_code) 4637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4646a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(adisc, '\0', sizeof(struct fc_adisc_s)); 4657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang adisc->els_cmd.els_code = els_code; 4677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (els_code == FC_ELS_ADISC) 4697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 4707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang else 4717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 4727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang adisc->orig_HA = 0; 4747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang adisc->orig_port_name = port_name; 4757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang adisc->orig_node_name = node_name; 4767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang adisc->nport_id = (s_id); 4777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 478f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_adisc_s); 4797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 4827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_adisc_build(struct fchs_s *fchs, struct fc_adisc_s *adisc, u32 d_id, 48350444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id, wwn_t port_name, wwn_t node_name) 4847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return fc_adisc_x_build(fchs, adisc, d_id, s_id, ox_id, port_name, 4867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang node_name, FC_ELS_ADISC); 4877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 4907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_adisc_acc_build(struct fchs_s *fchs, struct fc_adisc_s *adisc, u32 d_id, 49150444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id, wwn_t port_name, 4927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t node_name) 4937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return fc_adisc_x_build(fchs, adisc, d_id, s_id, ox_id, port_name, 4957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang node_name, FC_ELS_ACC); 4967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 4997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_adisc_rsp_parse(struct fc_adisc_s *adisc, int len, wwn_t port_name, 5007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t node_name) 5017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (len < sizeof(struct fc_adisc_s)) 504f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (adisc->els_cmd.els_code != FC_ELS_ACC) 507f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!wwn_is_equal(adisc->orig_port_name, port_name)) 510f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 512f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 5137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 516a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_adisc_parse(struct fchs_s *fchs, void *pld, u32 host_dap, wwn_t node_name, 517a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati wwn_t port_name) 5187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 519a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_adisc_s *adisc = (struct fc_adisc_s *) pld; 5207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (adisc->els_cmd.els_code != FC_ELS_ACC) 522f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if ((adisc->nport_id == (host_dap)) 5257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang && wwn_is_equal(adisc->orig_port_name, port_name) 5267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang && wwn_is_equal(adisc->orig_node_name, node_name)) 527f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 5287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 529f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 5337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_pdisc_parse(struct fchs_s *fchs, wwn_t node_name, wwn_t port_name) 5347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 535a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_logi_s *pdisc = (struct fc_logi_s *) (fchs + 1); 5367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (pdisc->class3.class_valid != 1) 5387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 5397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 540ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang if ((be16_to_cpu(pdisc->class3.rxsz) < 541a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (FC_MIN_PDUSZ - sizeof(struct fchs_s))) 5427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang || (pdisc->class3.rxsz == 0)) 543f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!wwn_is_equal(pdisc->port_name, port_name)) 546f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!wwn_is_equal(pdisc->node_name, node_name)) 549f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_OK; 5527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 5557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_abts_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id) 5567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5576a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(fchs, &fc_bls_req_tmpl, sizeof(struct fchs_s)); 5587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->cat_info = FC_CAT_ABTS; 5597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->d_id = (d_id); 5607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->s_id = (s_id); 561ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang fchs->ox_id = cpu_to_be16(ox_id); 5627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 563f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fchs_s); 5647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 5677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_abts_rsp_parse(struct fchs_s *fchs, int len) 5687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if ((fchs->cat_info == FC_CAT_BA_ACC) 5707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang || (fchs->cat_info == FC_CAT_BA_RJT)) 571f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 5727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 573f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 5747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 577a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_rrq_build(struct fchs_s *fchs, struct fc_rrq_s *rrq, u32 d_id, u32 s_id, 578a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u16 ox_id, u16 rrq_oxid) 5797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 5817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 5837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * build rrq payload 5847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5856a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(rrq, &rrq_tmpl, sizeof(struct fc_rrq_s)); 5867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rrq->s_id = (s_id); 587ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang rrq->ox_id = cpu_to_be16(rrq_oxid); 5887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rrq->rx_id = FC_RXID_ANY; 5897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 590f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_rrq_s); 5917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 5947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_logo_acc_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, 59550444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be16 ox_id) 5967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 597a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_els_cmd_s *acc = pld; 5987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 6007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6016a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(acc, 0, sizeof(struct fc_els_cmd_s)); 6027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang acc->els_code = FC_ELS_ACC; 6037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 604f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_els_cmd_s); 6057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 6087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_ls_rjt_build(struct fchs_s *fchs, struct fc_ls_rjt_s *ls_rjt, u32 d_id, 60950444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id, u8 reason_code, 6107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 reason_code_expl) 6117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 6136a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(ls_rjt, 0, sizeof(struct fc_ls_rjt_s)); 6147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ls_rjt->els_cmd.els_code = FC_ELS_LS_RJT; 6167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ls_rjt->reason_code = reason_code; 6177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ls_rjt->reason_code_expl = reason_code_expl; 6187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ls_rjt->vendor_unique = 0x00; 6197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 620f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_ls_rjt_s); 6217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 6247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_ba_acc_build(struct fchs_s *fchs, struct fc_ba_acc_s *ba_acc, u32 d_id, 62550444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id, u16 rx_id) 6267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_bls_rsp_build(fchs, d_id, s_id, ox_id); 6287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6296a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(ba_acc, &ba_acc_tmpl, sizeof(struct fc_ba_acc_s)); 6307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->rx_id = rx_id; 6327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ba_acc->ox_id = fchs->ox_id; 6347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ba_acc->rx_id = fchs->rx_id; 6357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 636f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_ba_acc_s); 6377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 640a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_ls_acc_build(struct fchs_s *fchs, struct fc_els_cmd_s *els_cmd, u32 d_id, 64150444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id) 6427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 6446a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(els_cmd, 0, sizeof(struct fc_els_cmd_s)); 6457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang els_cmd->els_code = FC_ELS_ACC; 6467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 647f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_els_cmd_s); 6487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangint 6517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_logout_params_pages(struct fchs_s *fc_frame, u8 els_code) 6527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int num_pages = 0; 654a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_prlo_s *prlo; 655a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_tprlo_s *tprlo; 6567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (els_code == FC_ELS_PRLO) { 6587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo = (struct fc_prlo_s *) (fc_frame + 1); 659ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang num_pages = (be16_to_cpu(prlo->payload_len) - 4) / 16; 6607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } else { 6617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo = (struct fc_tprlo_s *) (fc_frame + 1); 662ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang num_pages = (be16_to_cpu(tprlo->payload_len) - 4) / 16; 6637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 6647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return num_pages; 6657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 6687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_tprlo_acc_build(struct fchs_s *fchs, struct fc_tprlo_acc_s *tprlo_acc, 66950444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 d_id, u32 s_id, __be16 ox_id, int num_pages) 6707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int page; 6727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 6747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6756a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(tprlo_acc, 0, (num_pages * 16) + 4); 6767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo_acc->command = FC_ELS_ACC; 6777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo_acc->page_len = 0x10; 679ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang tprlo_acc->payload_len = cpu_to_be16((num_pages * 16) + 4); 6807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (page = 0; page < num_pages; page++) { 6827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo_acc->tprlo_acc_params[page].opa_valid = 0; 6837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo_acc->tprlo_acc_params[page].rpa_valid = 0; 6847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo_acc->tprlo_acc_params[page].fc4type_csp = FC_TYPE_FCP; 6857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo_acc->tprlo_acc_params[page].orig_process_assc = 0; 6867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo_acc->tprlo_acc_params[page].resp_process_assc = 0; 6877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 688ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang return be16_to_cpu(tprlo_acc->payload_len); 6897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 692a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_prlo_acc_build(struct fchs_s *fchs, struct fc_prlo_acc_s *prlo_acc, u32 d_id, 69350444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id, int num_pages) 6947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int page; 6967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 6987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6996a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(prlo_acc, 0, (num_pages * 16) + 4); 7007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo_acc->command = FC_ELS_ACC; 7017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo_acc->page_len = 0x10; 702ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang prlo_acc->payload_len = cpu_to_be16((num_pages * 16) + 4); 7037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (page = 0; page < num_pages; page++) { 7057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo_acc->prlo_acc_params[page].opa_valid = 0; 7067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo_acc->prlo_acc_params[page].rpa_valid = 0; 7077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo_acc->prlo_acc_params[page].fc4type_csp = FC_TYPE_FCP; 7087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo_acc->prlo_acc_params[page].orig_process_assc = 0; 7097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo_acc->prlo_acc_params[page].resp_process_assc = 0; 7107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 7117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 712ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang return be16_to_cpu(prlo_acc->payload_len); 7137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 7167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rnid_build(struct fchs_s *fchs, struct fc_rnid_cmd_s *rnid, u32 d_id, 717a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 s_id, u16 ox_id, u32 data_format) 7187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 7207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7216a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rnid, 0, sizeof(struct fc_rnid_cmd_s)); 7227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnid->els_cmd.els_code = FC_ELS_RNID; 7247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnid->node_id_data_format = data_format; 7257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 726f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_rnid_cmd_s); 7277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 730a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_rnid_acc_build(struct fchs_s *fchs, struct fc_rnid_acc_s *rnid_acc, u32 d_id, 73150444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 s_id, __be16 ox_id, u32 data_format, 732a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_rnid_common_id_data_s *common_id_data, 733a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_rnid_general_topology_data_s *gen_topo_data) 7347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7356a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rnid_acc, 0, sizeof(struct fc_rnid_acc_s)); 7367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 7387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnid_acc->els_cmd.els_code = FC_ELS_ACC; 7407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnid_acc->node_id_data_format = data_format; 7417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnid_acc->common_id_data_length = 7427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang sizeof(struct fc_rnid_common_id_data_s); 7437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnid_acc->common_id_data = *common_id_data; 7447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (data_format == RNID_NODEID_DATA_FORMAT_DISCOVERY) { 7467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnid_acc->specific_id_data_length = 7477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang sizeof(struct fc_rnid_general_topology_data_s); 7486a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang rnid_acc->gen_topology_data = *gen_topo_data; 749f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_rnid_acc_s); 7507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } else { 751f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_rnid_acc_s) - 752f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang sizeof(struct fc_rnid_general_topology_data_s); 7537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 7547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 7587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rpsc_build(struct fchs_s *fchs, struct fc_rpsc_cmd_s *rpsc, u32 d_id, 759a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 s_id, u16 ox_id) 7607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 7627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7636a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rpsc, 0, sizeof(struct fc_rpsc_cmd_s)); 7647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpsc->els_cmd.els_code = FC_ELS_RPSC; 766f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_rpsc_cmd_s); 7677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 770a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_rpsc2_build(struct fchs_s *fchs, struct fc_rpsc2_cmd_s *rpsc2, u32 d_id, 771a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 s_id, u32 *pid_list, u16 npids) 7727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 dctlr_id = FC_DOMAIN_CTRLR(bfa_os_hton3b(d_id)); 7747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int i = 0; 7757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, bfa_os_hton3b(dctlr_id), s_id, 0); 7777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7786a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rpsc2, 0, sizeof(struct fc_rpsc2_cmd_s)); 7797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpsc2->els_cmd.els_code = FC_ELS_RPSC; 781ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang rpsc2->token = cpu_to_be32(FC_BRCD_TOKEN); 782ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang rpsc2->num_pids = cpu_to_be16(npids); 7837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (i = 0; i < npids; i++) 7847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpsc2->pid_list[i].pid = pid_list[i]; 7857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 786a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return sizeof(struct fc_rpsc2_cmd_s) + ((npids - 1) * (sizeof(u32))); 7877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 7907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rpsc_acc_build(struct fchs_s *fchs, struct fc_rpsc_acc_s *rpsc_acc, 79150444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 d_id, u32 s_id, __be16 ox_id, 792a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_rpsc_speed_info_s *oper_speed) 7937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7946a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rpsc_acc, 0, sizeof(struct fc_rpsc_acc_s)); 7957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_rsp_build(fchs, d_id, s_id, ox_id); 7977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpsc_acc->command = FC_ELS_ACC; 799ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang rpsc_acc->num_entries = cpu_to_be16(1); 8007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpsc_acc->speed_info[0].port_speed_cap = 802ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang cpu_to_be16(oper_speed->port_speed_cap); 8037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpsc_acc->speed_info[0].port_op_speed = 805ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang cpu_to_be16(oper_speed->port_op_speed); 8067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 807f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_rpsc_acc_s); 8087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 8117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * TBD - 8127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * . get rid of unnecessary memsets 8137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 8147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 8167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_logo_rsp_parse(struct fchs_s *fchs, int len) 8177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 818a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_els_cmd_s *els_cmd = (struct fc_els_cmd_s *) (fchs + 1); 8197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang len = len; 8217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (els_cmd->els_code != FC_ELS_ACC) 8227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 8237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_OK; 8257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 828a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_pdisc_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id, 829a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati wwn_t port_name, wwn_t node_name, u16 pdu_size) 8307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 831a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_logi_s *pdisc = (struct fc_logi_s *) (fchs + 1); 8327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8336a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(pdisc, &plogi_tmpl, sizeof(struct fc_logi_s)); 8347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pdisc->els_cmd.els_code = FC_ELS_PDISC; 8367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 8377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 838ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang pdisc->csp.rxsz = pdisc->class3.rxsz = cpu_to_be16(pdu_size); 8397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pdisc->port_name = port_name; 8407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pdisc->node_name = node_name; 8417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 842f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_logi_s); 8437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 8467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_pdisc_rsp_parse(struct fchs_s *fchs, int len, wwn_t port_name) 8477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 848a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_logi_s *pdisc = (struct fc_logi_s *) (fchs + 1); 8497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (len < sizeof(struct fc_logi_s)) 851f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_LEN_INVAL; 8527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (pdisc->els_cmd.els_code != FC_ELS_ACC) 854f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_ACC_INVAL; 8557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!wwn_is_equal(pdisc->port_name, port_name)) 857f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_PWWN_NOT_EQUAL; 8587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!pdisc->class3.class_valid) 860f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_NWWN_NOT_EQUAL; 8617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 862ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang if (be16_to_cpu(pdisc->class3.rxsz) < (FC_MIN_PDUSZ)) 863f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_RXSZ_INVAL; 8647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 865f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 8667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 8697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_prlo_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id, 8707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int num_pages) 8717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 872a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_prlo_s *prlo = (struct fc_prlo_s *) (fchs + 1); 8737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int page; 8747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 8766a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(prlo, 0, (num_pages * 16) + 4); 8777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo->command = FC_ELS_PRLO; 8787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo->page_len = 0x10; 879ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang prlo->payload_len = cpu_to_be16((num_pages * 16) + 4); 8807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (page = 0; page < num_pages; page++) { 8827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo->prlo_params[page].type = FC_TYPE_FCP; 8837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo->prlo_params[page].opa_valid = 0; 8847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo->prlo_params[page].rpa_valid = 0; 8857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo->prlo_params[page].orig_process_assc = 0; 8867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prlo->prlo_params[page].resp_process_assc = 0; 8877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 8887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 889ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang return be16_to_cpu(prlo->payload_len); 8907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 8937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_prlo_rsp_parse(struct fchs_s *fchs, int len) 8947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 895a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_prlo_acc_s *prlo = (struct fc_prlo_acc_s *) (fchs + 1); 8967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int num_pages = 0; 8977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int page = 0; 8987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang len = len; 9007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prlo->command != FC_ELS_ACC) 902f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_FAILURE; 9037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 904ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang num_pages = ((be16_to_cpu(prlo->payload_len)) - 4) / 16; 9057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (page = 0; page < num_pages; page++) { 9077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prlo->prlo_acc_params[page].type != FC_TYPE_FCP) 9087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 9097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prlo->prlo_acc_params[page].opa_valid != 0) 9117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 9127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prlo->prlo_acc_params[page].rpa_valid != 0) 9147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 9157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prlo->prlo_acc_params[page].orig_process_assc != 0) 9177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 9187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prlo->prlo_acc_params[page].resp_process_assc != 0) 9207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 9217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 922f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 9237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 9257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 927a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_tprlo_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id, 928a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int num_pages, enum fc_tprlo_type tprlo_type, u32 tpr_id) 9297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 930a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_tprlo_s *tprlo = (struct fc_tprlo_s *) (fchs + 1); 9317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int page; 9327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 9346a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(tprlo, 0, (num_pages * 16) + 4); 9357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->command = FC_ELS_TPRLO; 9367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->page_len = 0x10; 937ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang tprlo->payload_len = cpu_to_be16((num_pages * 16) + 4); 9387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (page = 0; page < num_pages; page++) { 9407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].type = FC_TYPE_FCP; 9417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].opa_valid = 0; 9427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].rpa_valid = 0; 9437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].orig_process_assc = 0; 9447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].resp_process_assc = 0; 9457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tprlo_type == FC_GLOBAL_LOGO) { 9467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].global_process_logout = 1; 9477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } else if (tprlo_type == FC_TPR_LOGO) { 9487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].tpo_nport_valid = 1; 9497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tprlo->tprlo_params[page].tpo_nport_id = (tpr_id); 9507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 9517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 9527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 953ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang return be16_to_cpu(tprlo->payload_len); 9547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 9557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 9577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_tprlo_rsp_parse(struct fchs_s *fchs, int len) 9587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 9597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct fc_tprlo_acc_s *tprlo = (struct fc_tprlo_acc_s *) (fchs + 1); 9607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int num_pages = 0; 9617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int page = 0; 9627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang len = len; 9647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tprlo->command != FC_ELS_ACC) 966f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_ACC_INVAL; 9677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 968ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang num_pages = (be16_to_cpu(tprlo->payload_len) - 4) / 16; 9697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (page = 0; page < num_pages; page++) { 9717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tprlo->tprlo_acc_params[page].type != FC_TYPE_FCP) 972f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_NOT_FCP; 9737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tprlo->tprlo_acc_params[page].opa_valid != 0) 974f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OPAFLAG_INVAL; 9757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tprlo->tprlo_acc_params[page].rpa_valid != 0) 976f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_RPAFLAG_INVAL; 9777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tprlo->tprlo_acc_params[page].orig_process_assc != 0) 978f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OPA_INVAL; 9797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tprlo->tprlo_acc_params[page].resp_process_assc != 0) 980f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_RPA_INVAL; 9817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 982f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return FC_PARSE_OK; 9837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 9847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum fc_parse_status 9867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rrq_rsp_parse(struct fchs_s *fchs, int len) 9877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 988a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_els_cmd_s *els_cmd = (struct fc_els_cmd_s *) (fchs + 1); 9897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang len = len; 9917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (els_cmd->els_code != FC_ELS_ACC) 9927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 9937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_OK; 9957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 9967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 99850444a340028119ce5ba45d60b4cf44e3e6e1b32Maggiefc_ba_rjt_build(struct fchs_s *fchs, u32 d_id, u32 s_id, __be16 ox_id, 999a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 reason_code, u32 reason_expl) 10007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1001a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_ba_rjt_s *ba_rjt = (struct fc_ba_rjt_s *) (fchs + 1); 10027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_bls_rsp_build(fchs, d_id, s_id, ox_id); 10047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fchs->cat_info = FC_CAT_BA_RJT; 10067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ba_rjt->reason_code = reason_code; 10077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ba_rjt->reason_expl = reason_expl; 1008f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_ba_rjt_s); 10097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 10127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gs_cthdr_build(struct ct_hdr_s *cthdr, u32 s_id, u16 cmd_code) 10137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 10146a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(cthdr, 0, sizeof(struct ct_hdr_s)); 10157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->rev_id = CT_GS3_REVISION; 10167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->gs_type = CT_GSTYPE_DIRSERVICE; 10177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->gs_sub_type = CT_GSSUBTYPE_NAMESERVER; 1018ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang cthdr->cmd_rsp_code = cpu_to_be16(cmd_code); 10197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 10227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gs_fdmi_cthdr_build(struct ct_hdr_s *cthdr, u32 s_id, u16 cmd_code) 10237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 10246a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(cthdr, 0, sizeof(struct ct_hdr_s)); 10257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->rev_id = CT_GS3_REVISION; 10267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->gs_type = CT_GSTYPE_MGMTSERVICE; 10277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->gs_sub_type = CT_GSSUBTYPE_HBA_MGMTSERVER; 1028ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang cthdr->cmd_rsp_code = cpu_to_be16(cmd_code); 10297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 10327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gs_ms_cthdr_build(struct ct_hdr_s *cthdr, u32 s_id, u16 cmd_code, 10337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 sub_type) 10347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 10356a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(cthdr, 0, sizeof(struct ct_hdr_s)); 10367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->rev_id = CT_GS3_REVISION; 10377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->gs_type = CT_GSTYPE_MGMTSERVICE; 10387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cthdr->gs_sub_type = sub_type; 1039ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang cthdr->cmd_rsp_code = cpu_to_be16(cmd_code); 10407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 10437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gidpn_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, 10447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t port_name) 10457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1046a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1047a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_gidpn_req_s *gidpn = (struct fcgs_gidpn_req_s *)(cthdr + 1); 10487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = bfa_os_hton3b(FC_NAME_SERVER); 10497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); 10517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_GID_PN); 10527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10536a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(gidpn, 0, sizeof(struct fcgs_gidpn_req_s)); 10547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gidpn->port_name = port_name; 1055f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_gidpn_req_s) + sizeof(struct ct_hdr_s); 10567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 10597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gpnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, 10607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 port_id) 10617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1062a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 10637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcgs_gpnid_req_t *gpnid = (fcgs_gpnid_req_t *) (cthdr + 1); 10647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = bfa_os_hton3b(FC_NAME_SERVER); 10657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); 10677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_GPN_ID); 10687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10696a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(gpnid, 0, sizeof(fcgs_gpnid_req_t)); 10707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gpnid->dap = port_id; 1071f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(fcgs_gpnid_req_t) + sizeof(struct ct_hdr_s); 10727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 10757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gnnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, 10767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 port_id) 10777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1078a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 10797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcgs_gnnid_req_t *gnnid = (fcgs_gnnid_req_t *) (cthdr + 1); 10807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = bfa_os_hton3b(FC_NAME_SERVER); 10817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); 10837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_GNN_ID); 10847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10856a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(gnnid, 0, sizeof(fcgs_gnnid_req_t)); 10867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gnnid->dap = port_id; 1087f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(fcgs_gnnid_req_t) + sizeof(struct ct_hdr_s); 10887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 10917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_ct_rsp_parse(struct ct_hdr_s *cthdr) 10927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1093ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang if (be16_to_cpu(cthdr->cmd_rsp_code) != CT_RSP_ACCEPT) { 10947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (cthdr->reason_code == CT_RSN_LOGICAL_BUSY) 10957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_BUSY; 10967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang else 10977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_FAILURE; 10987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 10997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return FC_PARSE_OK; 11017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 1104a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_scr_build(struct fchs_s *fchs, struct fc_scr_s *scr, 1105a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u8 set_br_reg, u32 s_id, u16 ox_id) 11067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 11077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = bfa_os_hton3b(FC_FABRIC_CONTROLLER); 11087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 11107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11116a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(scr, 0, sizeof(struct fc_scr_s)); 11127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang scr->command = FC_ELS_SCR; 11137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang scr->reg_func = FC_SCR_REG_FUNC_FULL; 11147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (set_br_reg) 11157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang scr->vu_reg_func = FC_VU_SCR_REG_FUNC_FABRIC_NAME_CHANGE; 11167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1117f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_scr_s); 11187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 1121a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_rscn_build(struct fchs_s *fchs, struct fc_rscn_pl_s *rscn, 1122a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 s_id, u16 ox_id) 11237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 11247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = bfa_os_hton3b(FC_FABRIC_CONTROLLER); 11257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u16 payldlen; 11267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_els_req_build(fchs, d_id, s_id, ox_id); 11287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rscn->command = FC_ELS_RSCN; 11297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rscn->pagelen = sizeof(rscn->event[0]); 11307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang payldlen = sizeof(u32) + rscn->pagelen; 1132ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang rscn->payldlen = cpu_to_be16(payldlen); 11337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rscn->event[0].format = FC_RSCN_FORMAT_PORTID; 11357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rscn->event[0].portid = s_id; 11367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1137f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fc_rscn_pl_s); 11387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 11417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rftid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, 1142a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_lport_role roles) 11437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1144a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1145a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_rftid_req_s *rftid = (struct fcgs_rftid_req_s *)(cthdr + 1); 11467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 type_value, d_id = bfa_os_hton3b(FC_NAME_SERVER); 11477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 index; 11487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); 11507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RFT_ID); 11517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11526a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rftid, 0, sizeof(struct fcgs_rftid_req_s)); 11537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rftid->dap = s_id; 11557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* By default, FCP FC4 Type is registered */ 11577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang index = FC_TYPE_FCP >> 5; 11587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang type_value = 1 << (FC_TYPE_FCP % 32); 1159ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang rftid->fc4_type[index] = cpu_to_be32(type_value); 11607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1161f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rftid_req_s) + sizeof(struct ct_hdr_s); 11627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 1165a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_rftid_build_sol(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, 1166a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u8 *fc4_bitmap, u32 bitmap_size) 11677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1168a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1169a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_rftid_req_s *rftid = (struct fcgs_rftid_req_s *)(cthdr + 1); 11707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = bfa_os_hton3b(FC_NAME_SERVER); 11717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); 11737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RFT_ID); 11747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11756a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rftid, 0, sizeof(struct fcgs_rftid_req_s)); 11767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rftid->dap = s_id; 11786a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy((void *)rftid->fc4_type, (void *)fc4_bitmap, 1179a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (bitmap_size < 32 ? bitmap_size : 32)); 11807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1181f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rftid_req_s) + sizeof(struct ct_hdr_s); 11827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 11857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rffid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, 11867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 fc4_type, u8 fc4_ftrs) 11877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1188a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1189a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_rffid_req_s *rffid = (struct fcgs_rffid_req_s *)(cthdr + 1); 11907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = bfa_os_hton3b(FC_NAME_SERVER); 11917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); 11937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RFF_ID); 11947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11956a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rffid, 0, sizeof(struct fcgs_rffid_req_s)); 11967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1197a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati rffid->dap = s_id; 11987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rffid->fc4ftr_bits = fc4_ftrs; 1199a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati rffid->fc4_type = fc4_type; 12007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1201f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rffid_req_s) + sizeof(struct ct_hdr_s); 12027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 12057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rspnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, 12067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 *name) 12077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 12087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1209a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 12107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct fcgs_rspnid_req_s *rspnid = 1211a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (struct fcgs_rspnid_req_s *)(cthdr + 1); 12127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = bfa_os_hton3b(FC_NAME_SERVER); 12137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); 12157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RSPN_ID); 12167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12176a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rspnid, 0, sizeof(struct fcgs_rspnid_req_s)); 12187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rspnid->dap = s_id; 12207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rspnid->spn_len = (u8) strlen((char *)name); 12217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang strncpy((char *)rspnid->spn, (char *)name, rspnid->spn_len); 12227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1223f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rspnid_req_s) + sizeof(struct ct_hdr_s); 12247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 1227a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatifc_gid_ft_build(struct fchs_s *fchs, void *pyld, u32 s_id, u8 fc4_type) 12287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 12297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1230a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1231a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_gidft_req_s *gidft = (struct fcgs_gidft_req_s *)(cthdr + 1); 12327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = bfa_os_hton3b(FC_NAME_SERVER); 12337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 12357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_GID_FT); 12377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12386a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(gidft, 0, sizeof(struct fcgs_gidft_req_s)); 12397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gidft->fc4_type = fc4_type; 12407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gidft->domain_id = 0; 12417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gidft->area_id = 0; 12427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1243f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_gidft_req_s) + sizeof(struct ct_hdr_s); 12447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 12477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rpnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id, 12487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t port_name) 12497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1250a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1251a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_rpnid_req_s *rpnid = (struct fcgs_rpnid_req_s *)(cthdr + 1); 12527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = bfa_os_hton3b(FC_NAME_SERVER); 12537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 12557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RPN_ID); 12567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12576a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rpnid, 0, sizeof(struct fcgs_rpnid_req_s)); 12587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpnid->port_id = port_id; 12597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rpnid->port_name = port_name; 12607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1261f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rpnid_req_s) + sizeof(struct ct_hdr_s); 12627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 12657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rnnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id, 12667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t node_name) 12677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1268a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1269a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_rnnid_req_s *rnnid = (struct fcgs_rnnid_req_s *)(cthdr + 1); 12707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = bfa_os_hton3b(FC_NAME_SERVER); 12717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 12737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RNN_ID); 12747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12756a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rnnid, 0, sizeof(struct fcgs_rnnid_req_s)); 12767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnnid->port_id = port_id; 12777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rnnid->node_name = node_name; 12787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1279f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rnnid_req_s) + sizeof(struct ct_hdr_s); 12807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 12837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rcsid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id, 12847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 cos) 12857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1286a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 12877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct fcgs_rcsid_req_s *rcsid = 12887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang (struct fcgs_rcsid_req_s *) (cthdr + 1); 12897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = bfa_os_hton3b(FC_NAME_SERVER); 12907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 12927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RCS_ID); 12937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12946a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rcsid, 0, sizeof(struct fcgs_rcsid_req_s)); 12957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rcsid->port_id = port_id; 12967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rcsid->cos = cos; 12977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1298f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rcsid_req_s) + sizeof(struct ct_hdr_s); 12997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 13027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_rptid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id, 13037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 port_type) 13047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1305a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1306a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_rptid_req_s *rptid = (struct fcgs_rptid_req_s *)(cthdr + 1); 13077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = bfa_os_hton3b(FC_NAME_SERVER); 13087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 13107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_RPT_ID); 13117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13126a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(rptid, 0, sizeof(struct fcgs_rptid_req_s)); 13137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rptid->port_id = port_id; 13147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rptid->port_type = port_type; 13157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1316f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct fcgs_rptid_req_s) + sizeof(struct ct_hdr_s); 13177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 13207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_ganxt_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id) 13217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1322a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 1323a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fcgs_ganxt_req_s *ganxt = (struct fcgs_ganxt_req_s *)(cthdr + 1); 13247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = bfa_os_hton3b(FC_NAME_SERVER); 13257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 13277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_cthdr_build(cthdr, s_id, GS_GA_NXT); 13287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13296a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(ganxt, 0, sizeof(struct fcgs_ganxt_req_s)); 13307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ganxt->port_id = port_id; 13317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1332f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct ct_hdr_s) + sizeof(struct fcgs_ganxt_req_s); 13337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 13367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Builds fc hdr and ct hdr for FDMI requests. 13377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 13387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 13397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_fdmi_reqhdr_build(struct fchs_s *fchs, void *pyld, u32 s_id, 13407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u16 cmd_code) 13417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 13427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1343a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 13447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = bfa_os_hton3b(FC_MGMT_SERVER); 13457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 13477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fdmi_cthdr_build(cthdr, s_id, cmd_code); 13487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1349f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct ct_hdr_s); 13507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 13537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Given a FC4 Type, this function returns a fc4 type bitmask 13547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 13557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 13567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_get_fc4type_bitmask(u8 fc4_type, u8 *bit_mask) 13577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 13587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 index; 135950444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be32 *ptr = (__be32 *) bit_mask; 13607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 type_value; 13617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 13637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @todo : Check for bitmask size 13647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 13657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang index = fc4_type >> 5; 13677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang type_value = 1 << (fc4_type % 32); 1368ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang ptr[index] = cpu_to_be32(type_value); 13697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 1373a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * GMAL Request 13747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 13757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 13767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gmal_req_build(struct fchs_s *fchs, void *pyld, u32 s_id, wwn_t wwn) 13777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1378a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 13797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcgs_gmal_req_t *gmal = (fcgs_gmal_req_t *) (cthdr + 1); 13807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = bfa_os_hton3b(FC_MGMT_SERVER); 13817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 13837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_ms_cthdr_build(cthdr, s_id, GS_FC_GMAL_CMD, 13847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang CT_GSSUBTYPE_CFGSERVER); 13857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13866a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(gmal, 0, sizeof(fcgs_gmal_req_t)); 13877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gmal->wwn = wwn; 13887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1389f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct ct_hdr_s) + sizeof(fcgs_gmal_req_t); 13907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 13937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * GFN (Get Fabric Name) Request 13947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 13957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 13967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangfc_gfn_req_build(struct fchs_s *fchs, void *pyld, u32 s_id, wwn_t wwn) 13977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1398a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; 13997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcgs_gfn_req_t *gfn = (fcgs_gfn_req_t *) (cthdr + 1); 14007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 d_id = bfa_os_hton3b(FC_MGMT_SERVER); 14017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_fchdr_build(fchs, d_id, s_id, 0); 14037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fc_gs_ms_cthdr_build(cthdr, s_id, GS_FC_GFN_CMD, 14047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang CT_GSSUBTYPE_CFGSERVER); 14057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14066a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(gfn, 0, sizeof(fcgs_gfn_req_t)); 14077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang gfn->wwn = wwn; 14087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1409f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return sizeof(struct ct_hdr_s) + sizeof(fcgs_gfn_req_t); 14107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1411