bfa_fcs_fcpim.c revision f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2e
17725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 27725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. 37725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * All rights reserved 47725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * www.brocade.com 57725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 67725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Linux driver for Brocade Fibre Channel Host Bus Adapter. 77725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 87725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This program is free software; you can redistribute it and/or modify it 97725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * under the terms of the GNU General Public License (GPL) Version 2 as 107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * published by the Free Software Foundation 117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This program is distributed in the hope that it will be useful, but 137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * WITHOUT ANY WARRANTY; without even the implied warranty of 147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * General Public License for more details. 167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * fcpim.c - FCP initiator mode i-t nexus state machine 207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <bfa.h> 237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <bfa_svc.h> 247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include "fcs_fcpim.h" 257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include "fcs_rport.h" 267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include "fcs_lport.h" 277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include "fcs_trcmod.h" 287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include "fcs_fcxp.h" 297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include "fcs.h" 307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <fcs/bfa_fcs_fcpim.h> 317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <fcb/bfa_fcb_fcpim.h> 327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <aen/bfa_aen_itnim.h> 337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing HuangBFA_TRC_FILE(FCS, FCPIM); 357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * forward declarations 387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_fcs_itnim_timeout(void *arg); 407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_fcs_itnim_free(struct bfa_fcs_itnim_s *itnim); 417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_fcs_itnim_send_prli(void *itnim_cbarg, 427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcxp_s *fcxp_alloced); 437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_fcs_itnim_prli_response(void *fcsarg, 447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcxp_s *fcxp, 457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang void *cbarg, 467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_status_t req_status, 477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 rsp_len, 487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 resid_len, 497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct fchs_s *rsp_fchs); 507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_fcs_itnim_aen_post(struct bfa_fcs_itnim_s *itnim, 517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_itnim_aen_event event); 527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * fcs_itnim_sm FCS itnim state machine events 557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum bfa_fcs_itnim_event { 587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_ITNIM_SM_ONLINE = 1, /* rport online event */ 597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_ITNIM_SM_OFFLINE = 2, /* rport offline */ 607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_ITNIM_SM_FRMSENT = 3, /* prli frame is sent */ 617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_ITNIM_SM_RSP_OK = 4, /* good response */ 627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_ITNIM_SM_RSP_ERROR = 5, /* error response */ 637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_ITNIM_SM_TIMEOUT = 6, /* delay timeout */ 647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_ITNIM_SM_HCB_OFFLINE = 7, /* BFA online callback */ 657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_ITNIM_SM_HCB_ONLINE = 8, /* BFA offline callback */ 667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_ITNIM_SM_INITIATOR = 9, /* rport is initiator */ 677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_ITNIM_SM_DELETE = 10, /* delete event from rport */ 687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_ITNIM_SM_PRLO = 11, /* delete event from rport */ 697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}; 707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_fcs_itnim_sm_offline(struct bfa_fcs_itnim_s *itnim, 727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_fcs_itnim_sm_prli_send(struct bfa_fcs_itnim_s *itnim, 747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_fcs_itnim_sm_prli(struct bfa_fcs_itnim_s *itnim, 767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_fcs_itnim_sm_prli_retry(struct bfa_fcs_itnim_s *itnim, 787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_fcs_itnim_sm_hcb_online(struct bfa_fcs_itnim_s *itnim, 807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_fcs_itnim_sm_online(struct bfa_fcs_itnim_s *itnim, 827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_fcs_itnim_sm_hcb_offline(struct bfa_fcs_itnim_s *itnim, 847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_fcs_itnim_sm_initiator(struct bfa_fcs_itnim_s *itnim, 867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event); 877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic struct bfa_sm_table_s itnim_sm_table[] = { 897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_offline), BFA_ITNIM_OFFLINE}, 907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_prli_send), BFA_ITNIM_PRLI_SEND}, 917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_prli), BFA_ITNIM_PRLI_SENT}, 927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_prli_retry), BFA_ITNIM_PRLI_RETRY}, 937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_hcb_online), BFA_ITNIM_HCB_ONLINE}, 947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_online), BFA_ITNIM_ONLINE}, 957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_hcb_offline), BFA_ITNIM_HCB_OFFLINE}, 967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_fcs_itnim_sm_initiator), BFA_ITNIM_INITIATIOR}, 977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}; 987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 1007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * fcs_itnim_sm FCS itnim state machine 1017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 1027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 1047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_offline(struct bfa_fcs_itnim_s *itnim, 1057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event) 1067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 1087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 1097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 1117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_ONLINE: 1127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_send); 1137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_send_prli(itnim, NULL); 1147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_OFFLINE: 1177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_rport_itnim_ack(itnim->rport); 1187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_INITIATOR: 1217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator); 1227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 1257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 1267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 1297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_assert(0); 1307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 1317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 1357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_prli_send(struct bfa_fcs_itnim_s *itnim, 1367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event) 1377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 1397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 1407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 1427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_FRMSENT: 1437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli); 1447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_INITIATOR: 1477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator); 1487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcxp_walloc_cancel(itnim->fcs->bfa, &itnim->fcxp_wqe); 1497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_OFFLINE: 1527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 1537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcxp_walloc_cancel(itnim->fcs->bfa, &itnim->fcxp_wqe); 1547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_rport_itnim_ack(itnim->rport); 1557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 1587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 1597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcxp_walloc_cancel(itnim->fcs->bfa, &itnim->fcxp_wqe); 1607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 1617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 1647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_assert(0); 1657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 1667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 1697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_prli(struct bfa_fcs_itnim_s *itnim, 1707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event) 1717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 1737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 1747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 1767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_RSP_OK: 1777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_hcb_online); 1787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_itnim_online(itnim->bfa_itnim, itnim->seq_rec); 1797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_RSP_ERROR: 1827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_retry); 1837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_timer_start(itnim->fcs->bfa, &itnim->timer, 1847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_timeout, itnim, 1857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_RETRY_TIMEOUT); 1867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_OFFLINE: 1897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 1907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcxp_discard(itnim->fcxp); 1917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_rport_itnim_ack(itnim->rport); 1927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_INITIATOR: 1957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator); 1967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 1977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * dont discard fcxp. accept will reach same state 1987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 1997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 2027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 2037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcxp_discard(itnim->fcxp); 2047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 2057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 2087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_assert(0); 2097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 2107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 2137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_prli_retry(struct bfa_fcs_itnim_s *itnim, 2147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event) 2157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 2177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 2187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 2207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_TIMEOUT: 2217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_send); 2227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_send_prli(itnim, NULL); 2237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 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); 2287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_rport_itnim_ack(itnim->rport); 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: 2437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_assert(0); 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{ 2517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 2527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 2537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 2557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_HCB_ONLINE: 2567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_online); 2577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcb_itnim_online(itnim->itnim_drv); 2587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_aen_post(itnim, BFA_ITNIM_AEN_ONLINE); 2597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_OFFLINE: 2627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 2637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_itnim_offline(itnim->bfa_itnim); 2647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_rport_itnim_ack(itnim->rport); 2657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 2687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 2697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 2707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 2737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_assert(0); 2747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 2757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 2787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_online(struct bfa_fcs_itnim_s *itnim, 2797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event) 2807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 2827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 2837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 2857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_OFFLINE: 2867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_hcb_offline); 2877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcb_itnim_offline(itnim->itnim_drv); 2887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_itnim_offline(itnim->bfa_itnim); 289f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang if (bfa_fcs_port_is_online(itnim->rport->port) == BFA_TRUE) 2907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_aen_post(itnim, BFA_ITNIM_AEN_DISCONNECT); 291f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang else 2927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_aen_post(itnim, BFA_ITNIM_AEN_OFFLINE); 2937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 2967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 2977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 2987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 3017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_assert(0); 3027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 3037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 3067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_hcb_offline(struct bfa_fcs_itnim_s *itnim, 3077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event) 3087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 3097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 3107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 3117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 3137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_HCB_OFFLINE: 3147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 3157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_rport_itnim_ack(itnim->rport); 3167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 3197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 3207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 3217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 3247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_assert(0); 3257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 3267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 3297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This state is set when a discovered rport is also in intiator mode. 3307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This ITN is marked as no_op and is not active and will not be truned into 3317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * online state. 3327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 3337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 3347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_initiator(struct bfa_fcs_itnim_s *itnim, 3357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_fcs_itnim_event event) 3367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 3377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 3387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, event); 3397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 3417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_OFFLINE: 3427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 3437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_rport_itnim_ack(itnim->rport); 3447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_RSP_ERROR: 3477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_ONLINE: 3487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_INITIATOR: 3497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_FCS_ITNIM_SM_DELETE: 3527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 3537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_free(itnim); 3547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 3577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_assert(0); 3587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 3597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 3647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * itnim_private FCS ITNIM private interfaces 3657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 3667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 3687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_aen_post(struct bfa_fcs_itnim_s *itnim, 3697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_itnim_aen_event event) 3707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 3717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_rport_s *rport = itnim->rport; 3727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang union bfa_aen_data_u aen_data; 3737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_log_mod_s *logmod = rport->fcs->logm; 3747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t lpwwn = bfa_fcs_port_get_pwwn(rport->port); 3757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t rpwwn = rport->pwwn; 3767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang char lpwwn_ptr[BFA_STRING_32]; 3777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang char rpwwn_ptr[BFA_STRING_32]; 3787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 3807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Don't post events for well known addresses 3817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 3827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (BFA_FCS_PID_IS_WKA(rport->pid)) 3837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 3847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn2str(lpwwn_ptr, lpwwn); 3867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn2str(rpwwn_ptr, rpwwn); 3877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 3897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_ITNIM_AEN_ONLINE: 3907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_log(logmod, BFA_AEN_ITNIM_ONLINE, rpwwn_ptr, lpwwn_ptr); 3917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_ITNIM_AEN_OFFLINE: 3937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_log(logmod, BFA_AEN_ITNIM_OFFLINE, rpwwn_ptr, lpwwn_ptr); 3947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_ITNIM_AEN_DISCONNECT: 3967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_log(logmod, BFA_AEN_ITNIM_DISCONNECT, rpwwn_ptr, lpwwn_ptr); 3977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 3997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 4007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 4017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang aen_data.itnim.vf_id = rport->port->fabric->vf_id; 4037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang aen_data.itnim.ppwwn = 4047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_port_get_pwwn(bfa_fcs_get_base_port(itnim->fcs)); 4057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang aen_data.itnim.lpwwn = lpwwn; 4067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang aen_data.itnim.rpwwn = rpwwn; 4077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 4107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_send_prli(void *itnim_cbarg, struct bfa_fcxp_s *fcxp_alloced) 4117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim = itnim_cbarg; 4137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_rport_s *rport = itnim->rport; 4147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_port_s *port = rport->port; 4157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct fchs_s fchs; 4167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcxp_s *fcxp; 4177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int len; 4187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 4207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcxp = fcxp_alloced ? fcxp_alloced : bfa_fcs_fcxp_alloc(port->fcs); 4227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!fcxp) { 4237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.fcxp_alloc_wait++; 4247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcxp_alloc_wait(port->fcs->bfa, &itnim->fcxp_wqe, 4257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_send_prli, itnim); 4267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 4277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 4287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->fcxp = fcxp; 4297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang len = fc_prli_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), itnim->rport->pid, 4317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_port_get_fcid(port), 0); 4327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcxp_send(fcxp, rport->bfa_rport, port->fabric->vf_id, port->lp_tag, 4347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FALSE, FC_CLASS_3, len, &fchs, 4357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_itnim_prli_response, (void *)itnim, FC_MAX_PDUSZ, 4367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang FC_RA_TOV); 4377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.prli_sent++; 4397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_FRMSENT); 4407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 4437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_prli_response(void *fcsarg, struct bfa_fcxp_s *fcxp, void *cbarg, 4447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_status_t req_status, u32 rsp_len, 4457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 resid_len, struct fchs_s *rsp_fchs) 4467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *)cbarg; 4487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct fc_els_cmd_s *els_cmd; 4497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct fc_prli_s *prli_resp; 4507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct fc_ls_rjt_s *ls_rjt; 4517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct fc_prli_params_s *sparams; 4527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, req_status); 4547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 4567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Sanity Checks 4577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 4587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (req_status != BFA_STATUS_OK) { 4597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.prli_rsp_err++; 4607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_RSP_ERROR); 4617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 4627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 4637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang els_cmd = (struct fc_els_cmd_s *) BFA_FCXP_RSP_PLD(fcxp); 4657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (els_cmd->els_code == FC_ELS_ACC) { 4677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang prli_resp = (struct fc_prli_s *) els_cmd; 4687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (fc_prli_rsp_parse(prli_resp, rsp_len) != FC_PARSE_OK) { 4707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, rsp_len); 4717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 4727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Check if this r-port is also in Initiator mode. 4737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * If so, we need to set this ITN as a no-op. 4747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 4757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (prli_resp->parampage.servparams.initiator) { 4767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, prli_resp->parampage.type); 4777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->rport->scsi_function = 4787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_RPORT_INITIATOR; 4797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.prli_rsp_acc++; 4807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, 4817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FCS_ITNIM_SM_INITIATOR); 4827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 4837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 4847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.prli_rsp_parse_err++; 4867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 4877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 4887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->rport->scsi_function = BFA_RPORT_TARGET; 4897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang sparams = &prli_resp->parampage.servparams; 4917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->seq_rec = sparams->retry; 4927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->rec_support = sparams->rec_support; 4937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->task_retry_id = sparams->task_retry_id; 4947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->conf_comp = sparams->confirm; 4957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.prli_rsp_acc++; 4977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_RSP_OK); 4987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } else { 4997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ls_rjt = (struct fc_ls_rjt_s *) BFA_FCXP_RSP_PLD(fcxp); 5007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, ls_rjt->reason_code); 5027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, ls_rjt->reason_code_expl); 5037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.prli_rsp_rjt++; 5057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_RSP_ERROR); 5067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 5077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 5107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_timeout(void *arg) 5117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *)arg; 5137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.timeout++; 5157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_TIMEOUT); 5167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 5197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_free(struct bfa_fcs_itnim_s *itnim) 5207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_itnim_delete(itnim->bfa_itnim); 5227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcb_itnim_free(itnim->fcs->bfad, itnim->itnim_drv); 5237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 5287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * itnim_public FCS ITNIM public interfaces 5297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 5327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Called by rport when a new rport is created. 5337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 5347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] rport - remote port. 5357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstruct bfa_fcs_itnim_s * 5377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_create(struct bfa_fcs_rport_s *rport) 5387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_port_s *port = rport->port; 5407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim; 5417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfad_itnim_s *itnim_drv; 5427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_itnim_s *bfa_itnim; 5437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 5457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * call bfad to allocate the itnim 5467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcb_itnim_alloc(port->fcs->bfad, &itnim, &itnim_drv); 5487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (itnim == NULL) { 5497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(port->fcs, rport->pwwn); 5507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return NULL; 5517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 5527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 5547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Initialize itnim 5557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->rport = rport; 5577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->fcs = rport->fcs; 5587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->itnim_drv = itnim_drv; 5597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 5617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * call BFA to create the itnim 5627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_itnim = bfa_itnim_create(port->fcs->bfa, rport->bfa_rport, itnim); 5647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (bfa_itnim == NULL) { 5667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(port->fcs, rport->pwwn); 5677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcb_itnim_free(port->fcs->bfad, itnim_drv); 5687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_assert(0); 5697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return NULL; 5707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 5717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->bfa_itnim = bfa_itnim; 5737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->seq_rec = BFA_FALSE; 5747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->rec_support = BFA_FALSE; 5757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->conf_comp = BFA_FALSE; 5767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->task_retry_id = BFA_FALSE; 5777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 5797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Set State machine 5807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 5827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return itnim; 5847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 5877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Called by rport to delete the instance of FCPIM. 5887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 5897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] rport - remote port. 5907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 5927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_delete(struct bfa_fcs_itnim_s *itnim) 5937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pid); 5957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_DELETE); 5967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 5997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Notification from rport that PLOGI is complete to initiate FC-4 session. 6007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 6027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_rport_online(struct bfa_fcs_itnim_s *itnim) 6037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.onlines++; 6057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!BFA_FCS_PID_IS_WKA(itnim->rport->pid)) { 6077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_ONLINE); 6087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } else { 6097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 6107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * For well known addresses, we set the itnim to initiator 6117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * state 6127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.initiator++; 6147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_INITIATOR); 6157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 6167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 6197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Called by rport to handle a remote device offline. 6207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 6227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_rport_offline(struct bfa_fcs_itnim_s *itnim) 6237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.offlines++; 6257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_OFFLINE); 6267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 6297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Called by rport when remote port is known to be an initiator from 6307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * PRLI received. 6317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 6337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_is_initiator(struct bfa_fcs_itnim_s *itnim) 6347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pid); 6367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.initiator++; 6377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_INITIATOR); 6387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 6417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Called by rport to check if the itnim is online. 6427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t 6447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_get_online_state(struct bfa_fcs_itnim_s *itnim) 6457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pid); 6477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (bfa_sm_to_state(itnim_sm_table, itnim->sm)) { 6487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_ITNIM_ONLINE: 6497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_ITNIM_INITIATIOR: 6507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_OK; 6517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 6537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_NO_FCPIM_NEXUS; 6547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 6567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 6597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * BFA completion callback for bfa_itnim_online(). 6607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 6627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_online(void *cbarg) 6637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *)cbarg; 6657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 6677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_HCB_ONLINE); 6687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 6717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * BFA completion callback for bfa_itnim_offline(). 6727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 6747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_offline(void *cb_arg) 6757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *)cb_arg; 6777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 6797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_HCB_OFFLINE); 6807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 6837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Mark the beginning of PATH TOV handling. IO completion callbacks 6847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * are still pending. 6857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 6877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_tov_begin(void *cb_arg) 6887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *)cb_arg; 6907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 6927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcb_itnim_tov_begin(itnim->itnim_drv); 6937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 6967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Mark the end of PATH TOV handling. All pending IOs are already cleaned up. 6977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 6997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_tov(void *cb_arg) 7007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *)cb_arg; 7027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 7047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcb_itnim_tov(itnim->itnim_drv); 7057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 7087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * BFA notification to FCS/driver for second level error recovery. 7097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 7107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Atleast one I/O request has timedout and target is unresponsive to 7117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * repeated abort requests. Second level error recovery should be initiated 7127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * by starting implicit logout and recovery procedures. 7137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 7147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 7157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_sler(void *cb_arg) 7167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *)cb_arg; 7187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim->stats.sler++; 7207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, itnim->rport->pwwn); 7217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_rport_logo_imp(itnim->rport); 7227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstruct bfa_fcs_itnim_s * 7257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_lookup(struct bfa_fcs_port_s *port, wwn_t rpwwn) 7267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_rport_s *rport; 7287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rport = bfa_fcs_rport_lookup(port, rpwwn); 7297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!rport) 7317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return NULL; 7327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_assert(rport->itnim != NULL); 734f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return rport->itnim; 7357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t 7387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_attr_get(struct bfa_fcs_port_s *port, wwn_t rpwwn, 7397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_itnim_attr_s *attr) 7407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim = NULL; 7427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim = bfa_fcs_itnim_lookup(port, rpwwn); 7447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (itnim == NULL) 7467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_NO_FCPIM_NEXUS; 7477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang attr->state = bfa_sm_to_state(itnim_sm_table, itnim->sm); 7497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang attr->retry = itnim->seq_rec; 7507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang attr->rec_support = itnim->rec_support; 7517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang attr->conf_comp = itnim->conf_comp; 7527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang attr->task_retry_id = itnim->task_retry_id; 7537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_OK; 7557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t 7587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_stats_get(struct bfa_fcs_port_s *port, wwn_t rpwwn, 7597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_itnim_stats_s *stats) 7607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim = NULL; 7627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_assert(port != NULL); 7647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim = bfa_fcs_itnim_lookup(port, rpwwn); 7667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (itnim == NULL) 7687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_NO_FCPIM_NEXUS; 7697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_os_memcpy(stats, &itnim->stats, sizeof(struct bfa_itnim_stats_s)); 7717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_OK; 7737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t 7767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_stats_clear(struct bfa_fcs_port_s *port, wwn_t rpwwn) 7777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_fcs_itnim_s *itnim = NULL; 7797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_assert(port != NULL); 7817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim = bfa_fcs_itnim_lookup(port, rpwwn); 7837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (itnim == NULL) 7857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_NO_FCPIM_NEXUS; 7867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_os_memset(&itnim->stats, 0, sizeof(struct bfa_itnim_stats_s)); 7887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_OK; 7897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 7927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_fcpim_uf_recv(struct bfa_fcs_itnim_s *itnim, struct fchs_s *fchs, 7937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u16 len) 7947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct fc_els_cmd_s *els_cmd; 7967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, fchs->type); 7987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (fchs->type != FC_TYPE_ELS) 8007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 8017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang els_cmd = (struct fc_els_cmd_s *) (fchs + 1); 8037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(itnim->fcs, els_cmd->els_code); 8057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (els_cmd->els_code) { 8077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case FC_ELS_PRLO: 8087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_PRLO); */ 8097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 8107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 8127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_assert(0); 8137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 8147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 8177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_pause(struct bfa_fcs_itnim_s *itnim) 8187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 8197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 8227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_resume(struct bfa_fcs_itnim_s *itnim) 8237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 8247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 8277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Module initialization 8287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 8297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 8307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_fcpim_modinit(struct bfa_fcs_s *fcs) 8317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 8327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 8357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Module cleanup 8367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 8377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 8387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_fcpim_modexit(struct bfa_fcs_s *fcs) 8397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 8407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fcs_modexit_comp(fcs); 8417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 844