bfa_fcs_fcpim.c revision d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359a
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); 407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 415fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * fcs_itnim_sm FCS itnim state machine events 437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum bfa_fcs_itnim_event { 467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_ITNIM_SM_ONLINE = 1, /* rport online event */ 477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_ITNIM_SM_OFFLINE = 2, /* rport offline */ 487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_ITNIM_SM_FRMSENT = 3, /* prli frame is sent */ 497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_ITNIM_SM_RSP_OK = 4, /* good response */ 507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_ITNIM_SM_RSP_ERROR = 5, /* error response */ 517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_ITNIM_SM_TIMEOUT = 6, /* delay timeout */ 52a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_FCS_ITNIM_SM_HCB_OFFLINE = 7, /* BFA online callback */ 53a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_FCS_ITNIM_SM_HCB_ONLINE = 8, /* BFA offline callback */ 547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_ITNIM_SM_INITIATOR = 9, /* rport is initiator */ 557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_ITNIM_SM_DELETE = 10, /* delete event from rport */ 567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_ITNIM_SM_PRLO = 11, /* delete event from rport */ 577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}; 587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 59a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_fcs_itnim_sm_offline(struct bfa_fcs_itnim_s *itnim, 607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 61a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_fcs_itnim_sm_prli_send(struct bfa_fcs_itnim_s *itnim, 627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 63a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_fcs_itnim_sm_prli(struct bfa_fcs_itnim_s *itnim, 647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 65a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_fcs_itnim_sm_prli_retry(struct bfa_fcs_itnim_s *itnim, 667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 67a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_fcs_itnim_sm_hcb_online(struct bfa_fcs_itnim_s *itnim, 687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 69a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_fcs_itnim_sm_online(struct bfa_fcs_itnim_s *itnim, 707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 71a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_fcs_itnim_sm_hcb_offline(struct bfa_fcs_itnim_s *itnim, 727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 73a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_fcs_itnim_sm_initiator(struct bfa_fcs_itnim_s *itnim, 747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic struct bfa_sm_table_s itnim_sm_table[] = { 777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_offline), BFA_ITNIM_OFFLINE}, 787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_prli_send), BFA_ITNIM_PRLI_SEND}, 797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_prli), BFA_ITNIM_PRLI_SENT}, 807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_prli_retry), BFA_ITNIM_PRLI_RETRY}, 817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_hcb_online), BFA_ITNIM_HCB_ONLINE}, 827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_online), BFA_ITNIM_ONLINE}, 837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_hcb_offline), BFA_ITNIM_HCB_OFFLINE}, 847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_initiator), BFA_ITNIM_INITIATIOR}, 857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}; 867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 875fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * fcs_itnim_sm FCS itnim state machine 897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_offline(struct bfa_fcs_itnim_s *itnim, 93a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_fcs_itnim_event event) 947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_ONLINE: 1007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_send); 10141188cf5a60a24bf54df5be70142f0928f413788Jing Huang itnim->prli_retries = 0; 1027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_send_prli(itnim, NULL); 1037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_OFFLINE: 106f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE); 1077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_INITIATOR: 1107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator); 1117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 1147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 1157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 118e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati bfa_sm_fault(itnim->fcs, event); 1197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 1207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 1247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_prli_send(struct bfa_fcs_itnim_s *itnim, 125a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_fcs_itnim_event event) 1267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 1287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 1297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 1317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_FRMSENT: 1327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli); 1337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_INITIATOR: 1367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator); 1377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcxp_walloc_cancel(itnim->fcs->bfa, &itnim->fcxp_wqe); 1387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_OFFLINE: 1417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 1427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcxp_walloc_cancel(itnim->fcs->bfa, &itnim->fcxp_wqe); 143f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE); 1447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 1477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 1487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcxp_walloc_cancel(itnim->fcs->bfa, &itnim->fcxp_wqe); 1497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 1507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 153e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati bfa_sm_fault(itnim->fcs, event); 1547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 1557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 1587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_prli(struct bfa_fcs_itnim_s *itnim, 159a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_fcs_itnim_event event) 1607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 1627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 1637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 1657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_RSP_OK: 1664b5e759dca9fb26d921c1267283350004dbf197bJing Huang if (itnim->rport->scsi_function == BFA_RPORT_INITIATOR) { 1674b5e759dca9fb26d921c1267283350004dbf197bJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator); 1684b5e759dca9fb26d921c1267283350004dbf197bJing Huang } else { 1694b5e759dca9fb26d921c1267283350004dbf197bJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_hcb_online); 1704b5e759dca9fb26d921c1267283350004dbf197bJing Huang bfa_itnim_online(itnim->bfa_itnim, itnim->seq_rec); 1714b5e759dca9fb26d921c1267283350004dbf197bJing Huang } 1727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_RSP_ERROR: 1757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_retry); 1767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_timer_start(itnim->fcs->bfa, &itnim->timer, 1777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_timeout, itnim, 1787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_RETRY_TIMEOUT); 1797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_OFFLINE: 1827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 1837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcxp_discard(itnim->fcxp); 184f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE); 1857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_INITIATOR: 1887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator); 1894b5e759dca9fb26d921c1267283350004dbf197bJing Huang bfa_fcxp_discard(itnim->fcxp); 1907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 1937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 1947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcxp_discard(itnim->fcxp); 1957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 1967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 199e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati bfa_sm_fault(itnim->fcs, event); 2007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 2017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 2047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_prli_retry(struct bfa_fcs_itnim_s *itnim, 2057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event) 2067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 2087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 2097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 2117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_TIMEOUT: 21241188cf5a60a24bf54df5be70142f0928f413788Jing Huang if (itnim->prli_retries < BFA_FCS_RPORT_MAX_RETRIES) { 21341188cf5a60a24bf54df5be70142f0928f413788Jing Huang itnim->prli_retries++; 21441188cf5a60a24bf54df5be70142f0928f413788Jing Huang bfa_trc(itnim->fcs, itnim->prli_retries); 21541188cf5a60a24bf54df5be70142f0928f413788Jing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_send); 21641188cf5a60a24bf54df5be70142f0928f413788Jing Huang bfa_fcs_itnim_send_prli(itnim, NULL); 21741188cf5a60a24bf54df5be70142f0928f413788Jing Huang } else { 21841188cf5a60a24bf54df5be70142f0928f413788Jing Huang /* invoke target offline */ 21941188cf5a60a24bf54df5be70142f0928f413788Jing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 220f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_sm_send_event(itnim->rport, RPSM_EVENT_LOGO_IMP); 22141188cf5a60a24bf54df5be70142f0928f413788Jing Huang } 2227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 224a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_OFFLINE: 2267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 2277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_timer_stop(&itnim->timer); 228f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE); 2297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_INITIATOR: 2327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator); 2337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_timer_stop(&itnim->timer); 2347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 2377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 2387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_timer_stop(&itnim->timer); 2397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 2407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 243e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati bfa_sm_fault(itnim->fcs, event); 2447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 2457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 2487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_hcb_online(struct bfa_fcs_itnim_s *itnim, 2497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event) 2507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 251a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfad_s *bfad = (struct bfad_s *)itnim->fcs->bfad; 252a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati char lpwwn_buf[BFA_STRING_32]; 253a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati char rpwwn_buf[BFA_STRING_32]; 254a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 2567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 2577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 2597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_HCB_ONLINE: 2607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_online); 2617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcb_itnim_online(itnim->itnim_drv); 262a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati wwn2str(lpwwn_buf, bfa_fcs_lport_get_pwwn(itnim->rport->port)); 263a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati wwn2str(rpwwn_buf, itnim->rport->pwwn); 2648816624222b12e5d7e291e9d1973fc42b994eb6bJing Huang BFA_LOG(KERN_INFO, bfad, bfa_log_level, 265a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati "Target (WWN = %s) is online for initiator (WWN = %s)\n", 266a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati rpwwn_buf, lpwwn_buf); 2677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_OFFLINE: 2707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 2717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_itnim_offline(itnim->bfa_itnim); 272f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE); 2737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 2767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 2777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 2787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 281e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati bfa_sm_fault(itnim->fcs, event); 2827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 2837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 2867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_online(struct bfa_fcs_itnim_s *itnim, 287a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_fcs_itnim_event event) 2887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 289a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfad_s *bfad = (struct bfad_s *)itnim->fcs->bfad; 290a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati char lpwwn_buf[BFA_STRING_32]; 291a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati char rpwwn_buf[BFA_STRING_32]; 292a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 2947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 2957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 2977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_OFFLINE: 2987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_hcb_offline); 2997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcb_itnim_offline(itnim->itnim_drv); 3007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_itnim_offline(itnim->bfa_itnim); 301a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati wwn2str(lpwwn_buf, bfa_fcs_lport_get_pwwn(itnim->rport->port)); 302a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati wwn2str(rpwwn_buf, itnim->rport->pwwn); 303a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (bfa_fcs_lport_is_online(itnim->rport->port) == BFA_TRUE) 3048816624222b12e5d7e291e9d1973fc42b994eb6bJing Huang BFA_LOG(KERN_ERR, bfad, bfa_log_level, 305a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati "Target (WWN = %s) connectivity lost for " 306a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati "initiator (WWN = %s)\n", rpwwn_buf, lpwwn_buf); 307f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang else 3088816624222b12e5d7e291e9d1973fc42b994eb6bJing Huang BFA_LOG(KERN_INFO, bfad, bfa_log_level, 309a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati "Target (WWN = %s) offlined by initiator (WWN = %s)\n", 310a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati rpwwn_buf, lpwwn_buf); 3117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 3147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 3157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 3167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 319e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati bfa_sm_fault(itnim->fcs, event); 3207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 3217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 3247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_hcb_offline(struct bfa_fcs_itnim_s *itnim, 3257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event) 3267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 3277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 3287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 3297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 3317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_HCB_OFFLINE: 3327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 333f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE); 3347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 3377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 3387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 3397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 342e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati bfa_sm_fault(itnim->fcs, event); 3437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 3447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 3477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This state is set when a discovered rport is also in intiator mode. 3487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This ITN is marked as no_op and is not active and will not be truned into 3497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * online state. 3507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 3517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 3527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_initiator(struct bfa_fcs_itnim_s *itnim, 353a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_fcs_itnim_event event) 3547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 3557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 3567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 3577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 3597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_OFFLINE: 3607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 361f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE); 3627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_RSP_ERROR: 3657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_ONLINE: 3667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_INITIATOR: 3677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 3707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 3717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 3727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 375e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati bfa_sm_fault(itnim->fcs, event); 3767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 3777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 3807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_send_prli(void *itnim_cbarg, struct bfa_fcxp_s *fcxp_alloced) 3817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 3827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim = itnim_cbarg; 3837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_rport_s *rport = itnim->rport; 384a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_fcs_lport_s *port = rport->port; 385a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fchs_s fchs; 3867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcxp_s *fcxp; 387a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int len; 3887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 3907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcxp = fcxp_alloced ? fcxp_alloced : bfa_fcs_fcxp_alloc(port->fcs); 3927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!fcxp) { 3937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.fcxp_alloc_wait++; 394a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fcs_fcxp_alloc_wait(port->fcs->bfa, &itnim->fcxp_wqe, 3957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_send_prli, itnim); 3967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 3977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 3987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->fcxp = fcxp; 3997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 400a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati len = fc_prli_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), 401a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->rport->pid, bfa_fcs_lport_get_fcid(port), 0); 4027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcxp_send(fcxp, rport->bfa_rport, port->fabric->vf_id, port->lp_tag, 4047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FALSE, FC_CLASS_3, len, &fchs, 405a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fcs_itnim_prli_response, (void *)itnim, 406a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati FC_MAX_PDUSZ, FC_ELS_TOV); 4077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.prli_sent++; 4097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_FRMSENT); 4107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 4137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_prli_response(void *fcsarg, struct bfa_fcxp_s *fcxp, void *cbarg, 4147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_status_t req_status, u32 rsp_len, 4157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 resid_len, struct fchs_s *rsp_fchs) 4167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 417a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cbarg; 418a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_els_cmd_s *els_cmd; 419a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_prli_s *prli_resp; 420a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_ls_rjt_s *ls_rjt; 4217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct fc_prli_params_s *sparams; 4227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, req_status); 4247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 4267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Sanity Checks 4277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 4287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (req_status != BFA_STATUS_OK) { 4297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.prli_rsp_err++; 4307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_RSP_ERROR); 4317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 4327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 4337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang els_cmd = (struct fc_els_cmd_s *) BFA_FCXP_RSP_PLD(fcxp); 4357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (els_cmd->els_code == FC_ELS_ACC) { 4377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli_resp = (struct fc_prli_s *) els_cmd; 4387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (fc_prli_rsp_parse(prli_resp, rsp_len) != FC_PARSE_OK) { 4407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, rsp_len); 4417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 4427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Check if this r-port is also in Initiator mode. 4437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * If so, we need to set this ITN as a no-op. 4447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 4457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prli_resp->parampage.servparams.initiator) { 4467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, prli_resp->parampage.type); 4477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->rport->scsi_function = 448a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_RPORT_INITIATOR; 4497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.prli_rsp_acc++; 4507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, 4514b5e759dca9fb26d921c1267283350004dbf197bJing Huang BFA_FCS_ITNIM_SM_RSP_OK); 4527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 4537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 4547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.prli_rsp_parse_err++; 4567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 4577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 4587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->rport->scsi_function = BFA_RPORT_TARGET; 4597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang sparams = &prli_resp->parampage.servparams; 461a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->seq_rec = sparams->retry; 462a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->rec_support = sparams->rec_support; 4637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->task_retry_id = sparams->task_retry_id; 464a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->conf_comp = sparams->confirm; 4657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.prli_rsp_acc++; 4677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_RSP_OK); 4687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } else { 4697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ls_rjt = (struct fc_ls_rjt_s *) BFA_FCXP_RSP_PLD(fcxp); 4707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, ls_rjt->reason_code); 4727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, ls_rjt->reason_code_expl); 4737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.prli_rsp_rjt++; 4757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_RSP_ERROR); 4767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 4777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 4807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_timeout(void *arg) 4817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 482a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) arg; 4837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.timeout++; 4857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_TIMEOUT); 4867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 4897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_free(struct bfa_fcs_itnim_s *itnim) 4907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_itnim_delete(itnim->bfa_itnim); 4927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcb_itnim_free(itnim->fcs->bfad, itnim->itnim_drv); 4937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4975fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 4987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * itnim_public FCS ITNIM public interfaces 4997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5015fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 502a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Called by rport when a new rport is created. 5037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 5047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] rport - remote port. 5057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstruct bfa_fcs_itnim_s * 5077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_create(struct bfa_fcs_rport_s *rport) 5087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 509a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_fcs_lport_s *port = rport->port; 5107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim; 511a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfad_itnim_s *itnim_drv; 5127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_itnim_s *bfa_itnim; 5137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 5157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * call bfad to allocate the itnim 5167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcb_itnim_alloc(port->fcs->bfad, &itnim, &itnim_drv); 5187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (itnim == NULL) { 5197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(port->fcs, rport->pwwn); 5207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return NULL; 5217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 5227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 5247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Initialize itnim 5257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->rport = rport; 5277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->fcs = rport->fcs; 5287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->itnim_drv = itnim_drv; 5297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 5317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * call BFA to create the itnim 5327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 533a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim = 534a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_create(port->fcs->bfa, rport->bfa_rport, itnim); 5357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (bfa_itnim == NULL) { 5377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(port->fcs, rport->pwwn); 5387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcb_itnim_free(port->fcs->bfad, itnim_drv); 539d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(1); 5407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return NULL; 5417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 5427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 543a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->bfa_itnim = bfa_itnim; 544a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->seq_rec = BFA_FALSE; 545a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->rec_support = BFA_FALSE; 546a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->conf_comp = BFA_FALSE; 5477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->task_retry_id = BFA_FALSE; 5487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 5507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Set State machine 5517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 5537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return itnim; 5557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5575fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 558a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Called by rport to delete the instance of FCPIM. 5597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 5607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] rport - remote port. 5617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 5637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_delete(struct bfa_fcs_itnim_s *itnim) 5647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pid); 5667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_DELETE); 5677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5695fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 5707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Notification from rport that PLOGI is complete to initiate FC-4 session. 5717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 5737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_rport_online(struct bfa_fcs_itnim_s *itnim) 5747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.onlines++; 5767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!BFA_FCS_PID_IS_WKA(itnim->rport->pid)) { 5787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_ONLINE); 5797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } else { 5807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 581a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * For well known addresses, we set the itnim to initiator 582a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * state 5837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.initiator++; 5857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_INITIATOR); 5867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 5877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5895fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 5907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Called by rport to handle a remote device offline. 5917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 5937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_rport_offline(struct bfa_fcs_itnim_s *itnim) 5947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.offlines++; 5967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_OFFLINE); 5977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5995fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 6007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Called by rport when remote port is known to be an initiator from 6017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * PRLI received. 6027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 6047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_is_initiator(struct bfa_fcs_itnim_s *itnim) 6057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pid); 6077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.initiator++; 6087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_INITIATOR); 6097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6115fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 6127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Called by rport to check if the itnim is online. 6137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t 6157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_get_online_state(struct bfa_fcs_itnim_s *itnim) 6167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pid); 6187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (bfa_sm_to_state(itnim_sm_table, itnim->sm)) { 6197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_ITNIM_ONLINE: 6207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_ITNIM_INITIATIOR: 6217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_OK; 6227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 6247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_NO_FCPIM_NEXUS; 6257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 6267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6285fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 6297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * BFA completion callback for bfa_itnim_online(). 6307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 6327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_online(void *cbarg) 6337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 634a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cbarg; 6357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 6377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_HCB_ONLINE); 6387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6405fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 6417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * BFA completion callback for bfa_itnim_offline(). 6427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 6447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_offline(void *cb_arg) 6457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 646a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cb_arg; 6477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 6497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_HCB_OFFLINE); 6507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6525fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 6537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Mark the beginning of PATH TOV handling. IO completion callbacks 6547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * are still pending. 6557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 6577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_tov_begin(void *cb_arg) 6587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 659a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cb_arg; 6607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 6627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6645fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 6657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Mark the end of PATH TOV handling. All pending IOs are already cleaned up. 6667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 6687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_tov(void *cb_arg) 6697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 670a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cb_arg; 671a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfad_itnim_s *itnim_drv = itnim->itnim_drv; 6727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 674a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim_drv->state = ITNIM_STATE_TIMEOUT; 6757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6775fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 678a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * BFA notification to FCS/driver for second level error recovery. 6797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 6807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Atleast one I/O request has timedout and target is unresponsive to 6817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * repeated abort requests. Second level error recovery should be initiated 6827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * by starting implicit logout and recovery procedures. 6837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 6857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_sler(void *cb_arg) 6867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 687a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cb_arg; 6887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.sler++; 6907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 691f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_sm_send_event(itnim->rport, RPSM_EVENT_LOGO_IMP); 6927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstruct bfa_fcs_itnim_s * 695a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fcs_itnim_lookup(struct bfa_fcs_lport_s *port, wwn_t rpwwn) 6967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_rport_s *rport; 6987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rport = bfa_fcs_rport_lookup(port, rpwwn); 6997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!rport) 7017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return NULL; 7027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 703d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(rport->itnim == NULL); 704f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return rport->itnim; 7057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t 708a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fcs_itnim_attr_get(struct bfa_fcs_lport_s *port, wwn_t rpwwn, 7097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_itnim_attr_s *attr) 7107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim = NULL; 7127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim = bfa_fcs_itnim_lookup(port, rpwwn); 7147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (itnim == NULL) 7167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_NO_FCPIM_NEXUS; 7177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 718a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati attr->state = bfa_sm_to_state(itnim_sm_table, itnim->sm); 719a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati attr->retry = itnim->seq_rec; 720a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati attr->rec_support = itnim->rec_support; 721a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati attr->conf_comp = itnim->conf_comp; 7227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang attr->task_retry_id = itnim->task_retry_id; 7237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_OK; 7247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t 727a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fcs_itnim_stats_get(struct bfa_fcs_lport_s *port, wwn_t rpwwn, 7287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_itnim_stats_s *stats) 7297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim = NULL; 7317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 732d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(port == NULL); 7337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim = bfa_fcs_itnim_lookup(port, rpwwn); 7357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (itnim == NULL) 7377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_NO_FCPIM_NEXUS; 7387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7396a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(stats, &itnim->stats, sizeof(struct bfa_itnim_stats_s)); 7407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_OK; 7427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t 745a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fcs_itnim_stats_clear(struct bfa_fcs_lport_s *port, wwn_t rpwwn) 7467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim = NULL; 7487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 749d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(port == NULL); 7507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim = bfa_fcs_itnim_lookup(port, rpwwn); 7527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (itnim == NULL) 7547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_NO_FCPIM_NEXUS; 7557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7566a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(&itnim->stats, 0, sizeof(struct bfa_itnim_stats_s)); 7577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_OK; 7587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 761a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fcs_fcpim_uf_recv(struct bfa_fcs_itnim_s *itnim, 762a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fchs_s *fchs, u16 len) 7637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 764a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct fc_els_cmd_s *els_cmd; 7657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, fchs->type); 7677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (fchs->type != FC_TYPE_ELS) 7697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 7707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang els_cmd = (struct fc_els_cmd_s *) (fchs + 1); 7727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, els_cmd->els_code); 7747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (els_cmd->els_code) { 7767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case FC_ELS_PRLO: 7774b5e759dca9fb26d921c1267283350004dbf197bJing Huang bfa_fcs_rport_prlo(itnim->rport, fchs->ox_id); 7787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 7797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 781d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(1); 7827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 7837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 784