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 185fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * fcpim.c - FCP initiator mode i-t nexus state machine 207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 22f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang#include "bfad_drv.h" 23a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfa_fcs.h" 24a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfa_fcbuild.h" 25a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfad_im.h" 267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing HuangBFA_TRC_FILE(FCS, FCPIM); 287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * forward declarations 317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 32a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_fcs_itnim_timeout(void *arg); 33a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_fcs_itnim_free(struct bfa_fcs_itnim_s *itnim); 34a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_fcs_itnim_send_prli(void *itnim_cbarg, 357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcxp_s *fcxp_alloced); 36a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_fcs_itnim_prli_response(void *fcsarg, 37a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_fcxp_s *fcxp, void *cbarg, 38a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_status_t req_status, u32 rsp_len, 39a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 resid_len, struct fchs_s *rsp_fchs); 407826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipatistatic void bfa_fcs_itnim_aen_post(struct bfa_fcs_itnim_s *itnim, 417826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati enum bfa_itnim_aen_event event); 427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 43a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_fcs_itnim_sm_offline(struct bfa_fcs_itnim_s *itnim, 447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 45a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_fcs_itnim_sm_prli_send(struct bfa_fcs_itnim_s *itnim, 467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 47a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_fcs_itnim_sm_prli(struct bfa_fcs_itnim_s *itnim, 487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 49a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_fcs_itnim_sm_prli_retry(struct bfa_fcs_itnim_s *itnim, 507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 51a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_fcs_itnim_sm_hcb_online(struct bfa_fcs_itnim_s *itnim, 527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 5361ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipatistatic void bfa_fcs_itnim_sm_hal_rport_online(struct bfa_fcs_itnim_s *itnim, 5461ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati enum bfa_fcs_itnim_event event); 55a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_fcs_itnim_sm_online(struct bfa_fcs_itnim_s *itnim, 567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 57a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_fcs_itnim_sm_hcb_offline(struct bfa_fcs_itnim_s *itnim, 587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 59a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_fcs_itnim_sm_initiator(struct bfa_fcs_itnim_s *itnim, 607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic struct bfa_sm_table_s itnim_sm_table[] = { 637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_offline), BFA_ITNIM_OFFLINE}, 647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_prli_send), BFA_ITNIM_PRLI_SEND}, 657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_prli), BFA_ITNIM_PRLI_SENT}, 667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_prli_retry), BFA_ITNIM_PRLI_RETRY}, 677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_hcb_online), BFA_ITNIM_HCB_ONLINE}, 687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_online), BFA_ITNIM_ONLINE}, 697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_hcb_offline), BFA_ITNIM_HCB_OFFLINE}, 707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_initiator), BFA_ITNIM_INITIATIOR}, 717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}; 727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 735fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * fcs_itnim_sm FCS itnim state machine 757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_offline(struct bfa_fcs_itnim_s *itnim, 79a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_fcs_itnim_event event) 807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 8561ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati case BFA_FCS_ITNIM_SM_FCS_ONLINE: 867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_send); 8741188cf5a60a24bf54df5be70142f0928f413788Jing Huang itnim->prli_retries = 0; 887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_send_prli(itnim, NULL); 897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_OFFLINE: 92f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE); 937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_INITIATOR: 967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator); 977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 1007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 1017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 104e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati bfa_sm_fault(itnim->fcs, event); 1057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 1067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 1107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_prli_send(struct bfa_fcs_itnim_s *itnim, 111a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_fcs_itnim_event event) 1127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 1147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 1157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 1177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_FRMSENT: 1187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli); 1197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_INITIATOR: 1227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator); 1237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcxp_walloc_cancel(itnim->fcs->bfa, &itnim->fcxp_wqe); 12461ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_FCS_ONLINE); 1257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_OFFLINE: 1287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 1297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcxp_walloc_cancel(itnim->fcs->bfa, &itnim->fcxp_wqe); 130f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE); 1317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 1347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 1357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcxp_walloc_cancel(itnim->fcs->bfa, &itnim->fcxp_wqe); 1367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 1377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 140e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati bfa_sm_fault(itnim->fcs, event); 1417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 1427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 1457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_prli(struct bfa_fcs_itnim_s *itnim, 146a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_fcs_itnim_event event) 1477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 1497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 1507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 1527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_RSP_OK: 15361ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati if (itnim->rport->scsi_function == BFA_RPORT_INITIATOR) 1544b5e759dca9fb26d921c1267283350004dbf197bJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator); 15561ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati else 15661ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati bfa_sm_set_state(itnim, 15761ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati bfa_fcs_itnim_sm_hal_rport_online); 15861ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati 15961ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_FCS_ONLINE); 1607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_RSP_ERROR: 1637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_retry); 1647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_timer_start(itnim->fcs->bfa, &itnim->timer, 1657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_timeout, itnim, 1667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_RETRY_TIMEOUT); 1677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 169d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati case BFA_FCS_ITNIM_SM_RSP_NOT_SUPP: 170d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 171d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati break; 172d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati 1737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_OFFLINE: 1747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 1757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcxp_discard(itnim->fcxp); 176f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE); 1777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_INITIATOR: 1807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator); 1814b5e759dca9fb26d921c1267283350004dbf197bJing Huang bfa_fcxp_discard(itnim->fcxp); 18261ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_FCS_ONLINE); 1837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 1867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 1877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcxp_discard(itnim->fcxp); 1887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 1897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 192e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati bfa_sm_fault(itnim->fcs, event); 1937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 1947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 19761ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipatibfa_fcs_itnim_sm_hal_rport_online(struct bfa_fcs_itnim_s *itnim, 19861ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati enum bfa_fcs_itnim_event event) 19961ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati{ 20061ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati bfa_trc(itnim->fcs, itnim->rport->pwwn); 20161ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati bfa_trc(itnim->fcs, event); 20261ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati 20361ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati switch (event) { 20461ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati case BFA_FCS_ITNIM_SM_HAL_ONLINE: 20561ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati if (!itnim->bfa_itnim) 20661ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati itnim->bfa_itnim = bfa_itnim_create(itnim->fcs->bfa, 20761ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati itnim->rport->bfa_rport, itnim); 20861ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati 20961ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati if (itnim->bfa_itnim) { 21061ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_hcb_online); 21161ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati bfa_itnim_online(itnim->bfa_itnim, itnim->seq_rec); 21261ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati } else { 21361ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 21461ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati bfa_sm_send_event(itnim->rport, RPSM_EVENT_DELETE); 21561ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati } 21661ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati 21761ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati break; 21861ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati 21961ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati case BFA_FCS_ITNIM_SM_OFFLINE: 22061ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 22161ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE); 22261ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati break; 22361ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati 22461ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati case BFA_FCS_ITNIM_SM_DELETE: 22561ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 22661ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati bfa_fcs_itnim_free(itnim); 22761ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati break; 22861ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati 22961ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati default: 23061ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati bfa_sm_fault(itnim->fcs, event); 23161ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati } 23261ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati} 23361ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati 23461ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipatistatic void 2357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_prli_retry(struct bfa_fcs_itnim_s *itnim, 2367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event) 2377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 2397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 2407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 2427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_TIMEOUT: 24341188cf5a60a24bf54df5be70142f0928f413788Jing Huang if (itnim->prli_retries < BFA_FCS_RPORT_MAX_RETRIES) { 24441188cf5a60a24bf54df5be70142f0928f413788Jing Huang itnim->prli_retries++; 24541188cf5a60a24bf54df5be70142f0928f413788Jing Huang bfa_trc(itnim->fcs, itnim->prli_retries); 24641188cf5a60a24bf54df5be70142f0928f413788Jing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_send); 24741188cf5a60a24bf54df5be70142f0928f413788Jing Huang bfa_fcs_itnim_send_prli(itnim, NULL); 24841188cf5a60a24bf54df5be70142f0928f413788Jing Huang } else { 24941188cf5a60a24bf54df5be70142f0928f413788Jing Huang /* invoke target offline */ 25041188cf5a60a24bf54df5be70142f0928f413788Jing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 251f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_sm_send_event(itnim->rport, RPSM_EVENT_LOGO_IMP); 25241188cf5a60a24bf54df5be70142f0928f413788Jing Huang } 2537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 255a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_OFFLINE: 2577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 2587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_timer_stop(&itnim->timer); 259f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE); 2607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_INITIATOR: 2637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator); 2647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_timer_stop(&itnim->timer); 26561ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_FCS_ONLINE); 2667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 2697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 2707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_timer_stop(&itnim->timer); 2717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 2727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 275e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati bfa_sm_fault(itnim->fcs, event); 2767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 2777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 2807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_hcb_online(struct bfa_fcs_itnim_s *itnim, 2817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event) 2827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 283a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfad_s *bfad = (struct bfad_s *)itnim->fcs->bfad; 284a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati char lpwwn_buf[BFA_STRING_32]; 285a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati char rpwwn_buf[BFA_STRING_32]; 286a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 2887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 2897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 2917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_HCB_ONLINE: 2927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_online); 2937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcb_itnim_online(itnim->itnim_drv); 294a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati wwn2str(lpwwn_buf, bfa_fcs_lport_get_pwwn(itnim->rport->port)); 295a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati wwn2str(rpwwn_buf, itnim->rport->pwwn); 2968816624222b12e5d7e291e9d1973fc42b994eb6bJing Huang BFA_LOG(KERN_INFO, bfad, bfa_log_level, 297a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati "Target (WWN = %s) is online for initiator (WWN = %s)\n", 298a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati rpwwn_buf, lpwwn_buf); 2997826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_fcs_itnim_aen_post(itnim, BFA_ITNIM_AEN_ONLINE); 3007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_OFFLINE: 30361ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_hcb_offline); 3047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_itnim_offline(itnim->bfa_itnim); 3057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 3087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 3097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 3107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 313e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati bfa_sm_fault(itnim->fcs, event); 3147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 3157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 3187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_online(struct bfa_fcs_itnim_s *itnim, 319a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_fcs_itnim_event event) 3207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 321a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfad_s *bfad = (struct bfad_s *)itnim->fcs->bfad; 322a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati char lpwwn_buf[BFA_STRING_32]; 323a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati char rpwwn_buf[BFA_STRING_32]; 324a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 3267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 3277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 3297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_OFFLINE: 3307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_hcb_offline); 3317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcb_itnim_offline(itnim->itnim_drv); 3327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_itnim_offline(itnim->bfa_itnim); 333a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati wwn2str(lpwwn_buf, bfa_fcs_lport_get_pwwn(itnim->rport->port)); 334a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati wwn2str(rpwwn_buf, itnim->rport->pwwn); 3357826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati if (bfa_fcs_lport_is_online(itnim->rport->port) == BFA_TRUE) { 3368816624222b12e5d7e291e9d1973fc42b994eb6bJing Huang BFA_LOG(KERN_ERR, bfad, bfa_log_level, 337a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati "Target (WWN = %s) connectivity lost for " 338a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati "initiator (WWN = %s)\n", rpwwn_buf, lpwwn_buf); 3397826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_fcs_itnim_aen_post(itnim, BFA_ITNIM_AEN_DISCONNECT); 3407826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati } else { 3418816624222b12e5d7e291e9d1973fc42b994eb6bJing Huang BFA_LOG(KERN_INFO, bfad, bfa_log_level, 342a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati "Target (WWN = %s) offlined by initiator (WWN = %s)\n", 343a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati rpwwn_buf, lpwwn_buf); 3447826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_fcs_itnim_aen_post(itnim, BFA_ITNIM_AEN_OFFLINE); 3457826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati } 3467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 3497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 3507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 3517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 354e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati bfa_sm_fault(itnim->fcs, event); 3557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 3567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 3597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_hcb_offline(struct bfa_fcs_itnim_s *itnim, 3607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event) 3617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 3627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 3637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 3647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 3667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_HCB_OFFLINE: 3677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 368f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE); 3697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 3727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 3737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 3747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 377e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati bfa_sm_fault(itnim->fcs, event); 3787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 3797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 3827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This state is set when a discovered rport is also in intiator mode. 3837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This ITN is marked as no_op and is not active and will not be truned into 3847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * online state. 3857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 3867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 3877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_initiator(struct bfa_fcs_itnim_s *itnim, 388a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_fcs_itnim_event event) 3897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 3907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 3917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 3927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 3947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_OFFLINE: 3957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 396f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE); 3977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 39961ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati /* 40061ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati * fcs_online is expected here for well known initiator ports 40161ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati */ 40261ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati case BFA_FCS_ITNIM_SM_FCS_ONLINE: 40361ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_FCS_ONLINE); 40461ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati break; 40561ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati 4067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_RSP_ERROR: 4077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_INITIATOR: 4087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 4097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 4117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 4127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 4137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 4147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 416e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati bfa_sm_fault(itnim->fcs, event); 4177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 4187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 4217826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipatibfa_fcs_itnim_aen_post(struct bfa_fcs_itnim_s *itnim, 4227826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati enum bfa_itnim_aen_event event) 4237826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati{ 4247826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati struct bfa_fcs_rport_s *rport = itnim->rport; 4257826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati struct bfad_s *bfad = (struct bfad_s *)itnim->fcs->bfad; 4267826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati struct bfa_aen_entry_s *aen_entry; 4277826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati 4287826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati /* Don't post events for well known addresses */ 4297826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati if (BFA_FCS_PID_IS_WKA(rport->pid)) 4307826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati return; 4317826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati 4327826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfad_get_aen_entry(bfad, aen_entry); 4337826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati if (!aen_entry) 4347826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati return; 4357826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati 4367826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati aen_entry->aen_data.itnim.vf_id = rport->port->fabric->vf_id; 4377826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati aen_entry->aen_data.itnim.ppwwn = bfa_fcs_lport_get_pwwn( 4387826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_fcs_get_base_port(itnim->fcs)); 4397826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati aen_entry->aen_data.itnim.lpwwn = bfa_fcs_lport_get_pwwn(rport->port); 4407826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati aen_entry->aen_data.itnim.rpwwn = rport->pwwn; 4417826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati 4427826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati /* Send the AEN notification */ 4437826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfad_im_post_vendor_event(aen_entry, bfad, ++rport->fcs->fcs_aen_seq, 4447826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati BFA_AEN_CAT_ITNIM, event); 4457826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati} 4467826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati 4477826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipatistatic void 4487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_send_prli(void *itnim_cbarg, struct bfa_fcxp_s *fcxp_alloced) 4497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim = itnim_cbarg; 4517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_rport_s *rport = itnim->rport; 452a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_fcs_lport_s *port = rport->port; 453a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fchs_s fchs; 4547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcxp_s *fcxp; 455a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int len; 4567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 4587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 459c3f1b123d0573b47aea540c711e6ca83737c5d86Krishna Gudipati fcxp = fcxp_alloced ? fcxp_alloced : 460c3f1b123d0573b47aea540c711e6ca83737c5d86Krishna Gudipati bfa_fcs_fcxp_alloc(port->fcs, BFA_TRUE); 4617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!fcxp) { 4627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.fcxp_alloc_wait++; 463a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fcs_fcxp_alloc_wait(port->fcs->bfa, &itnim->fcxp_wqe, 464c3f1b123d0573b47aea540c711e6ca83737c5d86Krishna Gudipati bfa_fcs_itnim_send_prli, itnim, BFA_TRUE); 4657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 4667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 4677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->fcxp = fcxp; 4687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 469a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati len = fc_prli_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), 470a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->rport->pid, bfa_fcs_lport_get_fcid(port), 0); 4717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcxp_send(fcxp, rport->bfa_rport, port->fabric->vf_id, port->lp_tag, 4737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FALSE, FC_CLASS_3, len, &fchs, 474a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fcs_itnim_prli_response, (void *)itnim, 475a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati FC_MAX_PDUSZ, FC_ELS_TOV); 4767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.prli_sent++; 4787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_FRMSENT); 4797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 4827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_prli_response(void *fcsarg, struct bfa_fcxp_s *fcxp, void *cbarg, 4837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_status_t req_status, u32 rsp_len, 4847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 resid_len, struct fchs_s *rsp_fchs) 4857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 486a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cbarg; 487a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_els_cmd_s *els_cmd; 488a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_prli_s *prli_resp; 489a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_ls_rjt_s *ls_rjt; 4907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct fc_prli_params_s *sparams; 4917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, req_status); 4937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 4957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Sanity Checks 4967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 4977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (req_status != BFA_STATUS_OK) { 4987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.prli_rsp_err++; 4997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_RSP_ERROR); 5007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 5017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 5027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang els_cmd = (struct fc_els_cmd_s *) BFA_FCXP_RSP_PLD(fcxp); 5047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (els_cmd->els_code == FC_ELS_ACC) { 5067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli_resp = (struct fc_prli_s *) els_cmd; 5077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (fc_prli_rsp_parse(prli_resp, rsp_len) != FC_PARSE_OK) { 5097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, rsp_len); 5107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 5117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Check if this r-port is also in Initiator mode. 5127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * If so, we need to set this ITN as a no-op. 5137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prli_resp->parampage.servparams.initiator) { 5157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, prli_resp->parampage.type); 5167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->rport->scsi_function = 51761ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati BFA_RPORT_INITIATOR; 5187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.prli_rsp_acc++; 519d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati itnim->stats.initiator++; 5207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, 5214b5e759dca9fb26d921c1267283350004dbf197bJing Huang BFA_FCS_ITNIM_SM_RSP_OK); 5227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 5237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 5247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.prli_rsp_parse_err++; 5267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 5277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 5287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->rport->scsi_function = BFA_RPORT_TARGET; 5297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang sparams = &prli_resp->parampage.servparams; 531a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->seq_rec = sparams->retry; 532a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->rec_support = sparams->rec_support; 5337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->task_retry_id = sparams->task_retry_id; 534a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->conf_comp = sparams->confirm; 5357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.prli_rsp_acc++; 5377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_RSP_OK); 5387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } else { 5397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ls_rjt = (struct fc_ls_rjt_s *) BFA_FCXP_RSP_PLD(fcxp); 5407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, ls_rjt->reason_code); 5427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, ls_rjt->reason_code_expl); 5437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.prli_rsp_rjt++; 545d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati if (ls_rjt->reason_code == FC_LS_RJT_RSN_CMD_NOT_SUPP) { 546d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_RSP_NOT_SUPP); 547d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati return; 548d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati } 5497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_RSP_ERROR); 5507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 5517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 5547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_timeout(void *arg) 5557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 556a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) arg; 5577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.timeout++; 5597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_TIMEOUT); 5607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 5637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_free(struct bfa_fcs_itnim_s *itnim) 5647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 56561ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati if (itnim->bfa_itnim) { 56661ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati bfa_itnim_delete(itnim->bfa_itnim); 56761ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati itnim->bfa_itnim = NULL; 56861ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati } 56961ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati 5707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcb_itnim_free(itnim->fcs->bfad, itnim->itnim_drv); 5717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5755fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 5767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * itnim_public FCS ITNIM public interfaces 5777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5795fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 580a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Called by rport when a new rport is created. 5817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 5827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] rport - remote port. 5837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstruct bfa_fcs_itnim_s * 5857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_create(struct bfa_fcs_rport_s *rport) 5867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 587a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_fcs_lport_s *port = rport->port; 5887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim; 589a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfad_itnim_s *itnim_drv; 5907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 5927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * call bfad to allocate the itnim 5937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcb_itnim_alloc(port->fcs->bfad, &itnim, &itnim_drv); 5957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (itnim == NULL) { 5967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(port->fcs, rport->pwwn); 5977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return NULL; 5987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 5997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 6017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Initialize itnim 6027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->rport = rport; 6047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->fcs = rport->fcs; 6057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->itnim_drv = itnim_drv; 6067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 60761ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati itnim->bfa_itnim = NULL; 608a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->seq_rec = BFA_FALSE; 609a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->rec_support = BFA_FALSE; 610a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->conf_comp = BFA_FALSE; 6117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->task_retry_id = BFA_FALSE; 6127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 6147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Set State machine 6157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 6177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return itnim; 6197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6215fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 622a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Called by rport to delete the instance of FCPIM. 6237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 6247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] rport - remote port. 6257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 6277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_delete(struct bfa_fcs_itnim_s *itnim) 6287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pid); 6307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_DELETE); 6317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6335fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 6347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Notification from rport that PLOGI is complete to initiate FC-4 session. 6357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 63761ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipatibfa_fcs_itnim_brp_online(struct bfa_fcs_itnim_s *itnim) 6387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.onlines++; 6407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 64161ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati if (!BFA_FCS_PID_IS_WKA(itnim->rport->pid)) 64261ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_HAL_ONLINE); 6437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6455fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 6467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Called by rport to handle a remote device offline. 6477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 6497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_rport_offline(struct bfa_fcs_itnim_s *itnim) 6507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.offlines++; 6527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_OFFLINE); 6537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6555fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 6567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Called by rport when remote port is known to be an initiator from 6577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * PRLI received. 6587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 6607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_is_initiator(struct bfa_fcs_itnim_s *itnim) 6617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pid); 6637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.initiator++; 6647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_INITIATOR); 6657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6675fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 6687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Called by rport to check if the itnim is online. 6697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t 6717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_get_online_state(struct bfa_fcs_itnim_s *itnim) 6727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pid); 6747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (bfa_sm_to_state(itnim_sm_table, itnim->sm)) { 6757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_ITNIM_ONLINE: 6767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_ITNIM_INITIATIOR: 6777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_OK; 6787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 6807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_NO_FCPIM_NEXUS; 6817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 6827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6845fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 6857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * BFA completion callback for bfa_itnim_online(). 6867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 6887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_online(void *cbarg) 6897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 690a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cbarg; 6917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 6937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_HCB_ONLINE); 6947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6965fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 6977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * BFA completion callback for bfa_itnim_offline(). 6987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 7007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_offline(void *cb_arg) 7017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 702a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cb_arg; 7037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 7057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_HCB_OFFLINE); 7067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7085fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 7097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Mark the beginning of PATH TOV handling. IO completion callbacks 7107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * are still pending. 7117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 7127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 7137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_tov_begin(void *cb_arg) 7147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 715a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cb_arg; 7167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 7187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7205fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 7217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Mark the end of PATH TOV handling. All pending IOs are already cleaned up. 7227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 7237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 7247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_tov(void *cb_arg) 7257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 726a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cb_arg; 727a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfad_itnim_s *itnim_drv = itnim->itnim_drv; 7287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 730a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim_drv->state = ITNIM_STATE_TIMEOUT; 7317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7335fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 734a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * BFA notification to FCS/driver for second level error recovery. 7357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 7367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Atleast one I/O request has timedout and target is unresponsive to 7377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * repeated abort requests. Second level error recovery should be initiated 7387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * by starting implicit logout and recovery procedures. 7397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 7407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 7417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_sler(void *cb_arg) 7427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 743a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cb_arg; 7447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.sler++; 7467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 747f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_sm_send_event(itnim->rport, RPSM_EVENT_LOGO_IMP); 7487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstruct bfa_fcs_itnim_s * 751a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fcs_itnim_lookup(struct bfa_fcs_lport_s *port, wwn_t rpwwn) 7527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_rport_s *rport; 7547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rport = bfa_fcs_rport_lookup(port, rpwwn); 7557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!rport) 7577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return NULL; 7587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 759d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(rport->itnim == NULL); 760f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return rport->itnim; 7617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t 764a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fcs_itnim_attr_get(struct bfa_fcs_lport_s *port, wwn_t rpwwn, 7657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_itnim_attr_s *attr) 7667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim = NULL; 7687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim = bfa_fcs_itnim_lookup(port, rpwwn); 7707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (itnim == NULL) 7727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_NO_FCPIM_NEXUS; 7737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 774a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati attr->state = bfa_sm_to_state(itnim_sm_table, itnim->sm); 775a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati attr->retry = itnim->seq_rec; 776a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati attr->rec_support = itnim->rec_support; 777a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati attr->conf_comp = itnim->conf_comp; 7787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang attr->task_retry_id = itnim->task_retry_id; 7797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_OK; 7807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t 783a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fcs_itnim_stats_get(struct bfa_fcs_lport_s *port, wwn_t rpwwn, 7847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_itnim_stats_s *stats) 7857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim = NULL; 7877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 788d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(port == NULL); 7897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim = bfa_fcs_itnim_lookup(port, rpwwn); 7917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (itnim == NULL) 7937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_NO_FCPIM_NEXUS; 7947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7956a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(stats, &itnim->stats, sizeof(struct bfa_itnim_stats_s)); 7967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_OK; 7987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t 801a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fcs_itnim_stats_clear(struct bfa_fcs_lport_s *port, wwn_t rpwwn) 8027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 8037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim = NULL; 8047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 805d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(port == NULL); 8067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim = bfa_fcs_itnim_lookup(port, rpwwn); 8087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (itnim == NULL) 8107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_NO_FCPIM_NEXUS; 8117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8126a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(&itnim->stats, 0, sizeof(struct bfa_itnim_stats_s)); 8137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_OK; 8147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 817a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fcs_fcpim_uf_recv(struct bfa_fcs_itnim_s *itnim, 818a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fchs_s *fchs, u16 len) 8197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 820a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_els_cmd_s *els_cmd; 8217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, fchs->type); 8237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (fchs->type != FC_TYPE_ELS) 8257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 8267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang els_cmd = (struct fc_els_cmd_s *) (fchs + 1); 8287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, els_cmd->els_code); 8307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (els_cmd->els_code) { 8327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case FC_ELS_PRLO: 8334b5e759dca9fb26d921c1267283350004dbf197bJing Huang bfa_fcs_rport_prlo(itnim->rport, fchs->ox_id); 8347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 8357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 837d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(1); 8387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 8397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 840