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 18f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang#include "bfad_drv.h" 19a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfa_modules.h" 207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing HuangBFA_TRC_FILE(HAL, FCPIM); 227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 235fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 24a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * BFA ITNIM Related definitions 25a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 26a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_update_del_itn_stats(struct bfa_itnim_s *itnim); 2783763d591b343b07331cebe86715205230c568b1Krishna Gudipatistatic void bfa_ioim_lm_init(struct bfa_s *bfa); 28a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 29a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define BFA_ITNIM_FROM_TAG(_fcpim, _tag) \ 30a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (((_fcpim)->itnim_arr + ((_tag) & ((_fcpim)->num_itnims - 1)))) 31a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 32a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_fcpim_additn(__itnim) \ 33a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_add_tail(&(__itnim)->qe, &(__itnim)->fcpim->itnim_q) 34a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_fcpim_delitn(__itnim) do { \ 35d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(!bfa_q_is_on_q(&(__itnim)->fcpim->itnim_q, __itnim)); \ 36a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_update_del_itn_stats(__itnim); \ 37a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_del(&(__itnim)->qe); \ 38d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(!list_empty(&(__itnim)->io_q)); \ 39d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(!list_empty(&(__itnim)->io_cleanup_q)); \ 40d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(!list_empty(&(__itnim)->pending_q)); \ 41a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} while (0) 42a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 43a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_itnim_online_cb(__itnim) do { \ 44a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if ((__itnim)->bfa->fcs) \ 45a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_itnim_online((__itnim)->ditn); \ 46a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati else { \ 47a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue((__itnim)->bfa, &(__itnim)->hcb_qe, \ 48a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati __bfa_cb_itnim_online, (__itnim)); \ 49a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } \ 50a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} while (0) 51a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 52a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_itnim_offline_cb(__itnim) do { \ 53a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if ((__itnim)->bfa->fcs) \ 54a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_itnim_offline((__itnim)->ditn); \ 55a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati else { \ 56a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue((__itnim)->bfa, &(__itnim)->hcb_qe, \ 57a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati __bfa_cb_itnim_offline, (__itnim)); \ 58a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } \ 59a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} while (0) 60a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 61a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_itnim_sler_cb(__itnim) do { \ 62a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if ((__itnim)->bfa->fcs) \ 63a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_itnim_sler((__itnim)->ditn); \ 64a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati else { \ 65a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue((__itnim)->bfa, &(__itnim)->hcb_qe, \ 66a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati __bfa_cb_itnim_sler, (__itnim)); \ 67a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } \ 68a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} while (0) 69a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 7083763d591b343b07331cebe86715205230c568b1Krishna Gudipatienum bfa_ioim_lm_ua_status { 7183763d591b343b07331cebe86715205230c568b1Krishna Gudipati BFA_IOIM_LM_UA_RESET = 0, 7283763d591b343b07331cebe86715205230c568b1Krishna Gudipati BFA_IOIM_LM_UA_SET = 1, 7383763d591b343b07331cebe86715205230c568b1Krishna Gudipati}; 7483763d591b343b07331cebe86715205230c568b1Krishna Gudipati 755fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 76da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * itnim state machine event 77a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 78a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatienum bfa_itnim_event { 79a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_ITNIM_SM_CREATE = 1, /* itnim is created */ 80a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_ITNIM_SM_ONLINE = 2, /* itnim is online */ 81a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_ITNIM_SM_OFFLINE = 3, /* itnim is offline */ 82a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_ITNIM_SM_FWRSP = 4, /* firmware response */ 83a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_ITNIM_SM_DELETE = 5, /* deleting an existing itnim */ 84a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_ITNIM_SM_CLEANUP = 6, /* IO cleanup completion */ 85a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_ITNIM_SM_SLER = 7, /* second level error recovery */ 86a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_ITNIM_SM_HWFAIL = 8, /* IOC h/w failure event */ 87a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_ITNIM_SM_QRESUME = 9, /* queue space available */ 88a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}; 89a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 905fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 91a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * BFA IOIM related definitions 92a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 93a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_ioim_move_to_comp_q(__ioim) do { \ 94a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_del(&(__ioim)->qe); \ 95a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_add_tail(&(__ioim)->qe, &(__ioim)->fcpim->ioim_comp_q); \ 96a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} while (0) 97a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 98a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 99a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_ioim_cb_profile_comp(__fcpim, __ioim) do { \ 100a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if ((__fcpim)->profile_comp) \ 101a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (__fcpim)->profile_comp(__ioim); \ 102a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} while (0) 103a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 104a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_ioim_cb_profile_start(__fcpim, __ioim) do { \ 105a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if ((__fcpim)->profile_start) \ 106a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (__fcpim)->profile_start(__ioim); \ 107a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} while (0) 108a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1095fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 110a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IO state machine events 111a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 112a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatienum bfa_ioim_event { 113a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOIM_SM_START = 1, /* io start request from host */ 114a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOIM_SM_COMP_GOOD = 2, /* io good comp, resource free */ 115a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOIM_SM_COMP = 3, /* io comp, resource is free */ 116a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOIM_SM_COMP_UTAG = 4, /* io comp, resource is free */ 117a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOIM_SM_DONE = 5, /* io comp, resource not free */ 118a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOIM_SM_FREE = 6, /* io resource is freed */ 119a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOIM_SM_ABORT = 7, /* abort request from scsi stack */ 120a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOIM_SM_ABORT_COMP = 8, /* abort from f/w */ 121a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOIM_SM_ABORT_DONE = 9, /* abort completion from f/w */ 122a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOIM_SM_QRESUME = 10, /* CQ space available to queue IO */ 123a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOIM_SM_SGALLOCED = 11, /* SG page allocation successful */ 124a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOIM_SM_SQRETRY = 12, /* sequence recovery retry */ 125a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOIM_SM_HCB = 13, /* bfa callback complete */ 126a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOIM_SM_CLEANUP = 14, /* IO cleanup from itnim */ 127a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOIM_SM_TMSTART = 15, /* IO cleanup from tskim */ 128a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOIM_SM_TMDONE = 16, /* IO cleanup from tskim */ 129a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOIM_SM_HWFAIL = 17, /* IOC h/w failure event */ 130a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOIM_SM_IOTOV = 18, /* ITN offline TOV */ 131a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}; 132a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 133a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1345fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 135a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * BFA TSKIM related definitions 136a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 137a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1385fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 139a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * task management completion handling 140a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 141a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_tskim_qcomp(__tskim, __cbfn) do { \ 142a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue((__tskim)->bfa, &(__tskim)->hcb_qe, __cbfn, (__tskim));\ 143a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_notify_comp(__tskim); \ 144a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} while (0) 145a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 146a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_tskim_notify_comp(__tskim) do { \ 147a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if ((__tskim)->notify) \ 148a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_tskdone((__tskim)->itnim); \ 149a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} while (0) 150a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 151a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 152a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatienum bfa_tskim_event { 153a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_TSKIM_SM_START = 1, /* TM command start */ 154a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_TSKIM_SM_DONE = 2, /* TM completion */ 155a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_TSKIM_SM_QRESUME = 3, /* resume after qfull */ 156a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_TSKIM_SM_HWFAIL = 5, /* IOC h/w failure event */ 157a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_TSKIM_SM_HCB = 6, /* BFA callback completion */ 158a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_TSKIM_SM_IOS_DONE = 7, /* IO and sub TM completions */ 159a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_TSKIM_SM_CLEANUP = 8, /* TM cleanup on ITN offline */ 160a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_TSKIM_SM_CLEANUP_DONE = 9, /* TM abort completion */ 1611306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati BFA_TSKIM_SM_UTAG = 10, /* TM completion unknown tag */ 162a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}; 163a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1645fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 165a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * forward declaration for BFA ITNIM functions 166a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 167a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_iocdisable_cleanup(struct bfa_itnim_s *itnim); 168a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t bfa_itnim_send_fwcreate(struct bfa_itnim_s *itnim); 169a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t bfa_itnim_send_fwdelete(struct bfa_itnim_s *itnim); 170a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_cleanp_comp(void *itnim_cbarg); 171a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_cleanup(struct bfa_itnim_s *itnim); 172a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void __bfa_cb_itnim_online(void *cbarg, bfa_boolean_t complete); 173a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void __bfa_cb_itnim_offline(void *cbarg, bfa_boolean_t complete); 174a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void __bfa_cb_itnim_sler(void *cbarg, bfa_boolean_t complete); 175a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_iotov_online(struct bfa_itnim_s *itnim); 176a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_iotov_cleanup(struct bfa_itnim_s *itnim); 177a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_iotov(void *itnim_arg); 178a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_iotov_start(struct bfa_itnim_s *itnim); 179a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_iotov_stop(struct bfa_itnim_s *itnim); 180a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_iotov_delete(struct bfa_itnim_s *itnim); 181a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1825fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 183a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * forward declaration of ITNIM state machine 184a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 185a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_sm_uninit(struct bfa_itnim_s *itnim, 186a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event); 187a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_sm_created(struct bfa_itnim_s *itnim, 188a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event); 189a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_sm_fwcreate(struct bfa_itnim_s *itnim, 190a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event); 191a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_sm_delete_pending(struct bfa_itnim_s *itnim, 192a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event); 193a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_sm_online(struct bfa_itnim_s *itnim, 194a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event); 195a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_sm_sler(struct bfa_itnim_s *itnim, 196a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event); 197a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_sm_cleanup_offline(struct bfa_itnim_s *itnim, 198a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event); 199a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_sm_cleanup_delete(struct bfa_itnim_s *itnim, 200a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event); 201a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_sm_fwdelete(struct bfa_itnim_s *itnim, 202a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event); 203a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_sm_offline(struct bfa_itnim_s *itnim, 204a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event); 205a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_sm_iocdisable(struct bfa_itnim_s *itnim, 206a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event); 207a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_sm_deleting(struct bfa_itnim_s *itnim, 208a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event); 209a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_sm_fwcreate_qfull(struct bfa_itnim_s *itnim, 210a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event); 211a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_sm_fwdelete_qfull(struct bfa_itnim_s *itnim, 212a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event); 213a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_itnim_sm_deleting_qfull(struct bfa_itnim_s *itnim, 214a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event); 215a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2165fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 217a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * forward declaration for BFA IOIM functions 218a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 219a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t bfa_ioim_send_ioreq(struct bfa_ioim_s *ioim); 220e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhangstatic bfa_boolean_t bfa_ioim_sgpg_alloc(struct bfa_ioim_s *ioim); 221a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t bfa_ioim_send_abort(struct bfa_ioim_s *ioim); 222a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioim_notify_cleanup(struct bfa_ioim_s *ioim); 223a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void __bfa_cb_ioim_good_comp(void *cbarg, bfa_boolean_t complete); 224a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void __bfa_cb_ioim_comp(void *cbarg, bfa_boolean_t complete); 225a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void __bfa_cb_ioim_abort(void *cbarg, bfa_boolean_t complete); 226a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void __bfa_cb_ioim_failed(void *cbarg, bfa_boolean_t complete); 227a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void __bfa_cb_ioim_pathtov(void *cbarg, bfa_boolean_t complete); 228a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t bfa_ioim_is_abortable(struct bfa_ioim_s *ioim); 229a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2305fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 231a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * forward declaration of BFA IO state machine 232a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 233a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioim_sm_uninit(struct bfa_ioim_s *ioim, 234a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_ioim_event event); 235a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioim_sm_sgalloc(struct bfa_ioim_s *ioim, 236a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_ioim_event event); 237a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioim_sm_active(struct bfa_ioim_s *ioim, 238a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_ioim_event event); 239a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioim_sm_abort(struct bfa_ioim_s *ioim, 240a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_ioim_event event); 241a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioim_sm_cleanup(struct bfa_ioim_s *ioim, 242a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_ioim_event event); 243a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioim_sm_qfull(struct bfa_ioim_s *ioim, 244a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_ioim_event event); 245a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioim_sm_abort_qfull(struct bfa_ioim_s *ioim, 246a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_ioim_event event); 247a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioim_sm_cleanup_qfull(struct bfa_ioim_s *ioim, 248a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_ioim_event event); 249a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioim_sm_hcb(struct bfa_ioim_s *ioim, 250a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_ioim_event event); 251a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioim_sm_hcb_free(struct bfa_ioim_s *ioim, 252a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_ioim_event event); 253a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioim_sm_resfree(struct bfa_ioim_s *ioim, 254a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_ioim_event event); 255a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioim_sm_cmnd_retry(struct bfa_ioim_s *ioim, 256a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_ioim_event event); 2575fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 258a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * forward declaration for BFA TSKIM functions 259a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 260a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void __bfa_cb_tskim_done(void *cbarg, bfa_boolean_t complete); 261a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void __bfa_cb_tskim_failed(void *cbarg, bfa_boolean_t complete); 262a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t bfa_tskim_match_scope(struct bfa_tskim_s *tskim, 263f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang struct scsi_lun lun); 264a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_tskim_gather_ios(struct bfa_tskim_s *tskim); 265a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_tskim_cleanp_comp(void *tskim_cbarg); 266a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_tskim_cleanup_ios(struct bfa_tskim_s *tskim); 267a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t bfa_tskim_send(struct bfa_tskim_s *tskim); 268a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t bfa_tskim_send_abort(struct bfa_tskim_s *tskim); 269a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_tskim_iocdisable_ios(struct bfa_tskim_s *tskim); 270a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2715fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 272a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * forward declaration of BFA TSKIM state machine 273a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 274a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_tskim_sm_uninit(struct bfa_tskim_s *tskim, 275a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_tskim_event event); 276a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_tskim_sm_active(struct bfa_tskim_s *tskim, 277a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_tskim_event event); 278a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_tskim_sm_cleanup(struct bfa_tskim_s *tskim, 279a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_tskim_event event); 280a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_tskim_sm_iocleanup(struct bfa_tskim_s *tskim, 281a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_tskim_event event); 282a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_tskim_sm_qfull(struct bfa_tskim_s *tskim, 283a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_tskim_event event); 284a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_tskim_sm_cleanup_qfull(struct bfa_tskim_s *tskim, 285a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_tskim_event event); 286a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_tskim_sm_hcb(struct bfa_tskim_s *tskim, 287a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_tskim_event event); 2885fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 289df0f1933eb5454a5c481311837076056557467adMaggie Zhang * BFA FCP Initiator Mode module 2907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 2917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2925fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 293da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Compute and return memory needed by FCP(im) module. 2947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 2957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 2964507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipatibfa_fcpim_meminfo(struct bfa_iocfc_cfg_s *cfg, u32 *km_len) 2977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2984507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati bfa_itnim_meminfo(cfg, km_len); 2997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3005fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 3017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IO memory 3027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 3037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *km_len += cfg->fwcfg.num_ioim_reqs * 3047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang (sizeof(struct bfa_ioim_s) + sizeof(struct bfa_ioim_sp_s)); 3057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3065fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 3077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * task management command memory 3087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 3097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (cfg->fwcfg.num_tskim_reqs < BFA_TSKIM_MIN) 3107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cfg->fwcfg.num_tskim_reqs = BFA_TSKIM_MIN; 3117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *km_len += cfg->fwcfg.num_tskim_reqs * sizeof(struct bfa_tskim_s); 3127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 316e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatibfa_fcpim_attach(struct bfa_fcp_mod_s *fcp, void *bfad, 3174507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati struct bfa_iocfc_cfg_s *cfg, struct bfa_pcidev_s *pcidev) 3187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 319e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_fcpim_s *fcpim = &fcp->fcpim; 320e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_s *bfa = fcp->bfa; 3217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(bfa, cfg->drvcfg.path_tov); 3237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(bfa, cfg->fwcfg.num_rports); 3247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(bfa, cfg->fwcfg.num_ioim_reqs); 3257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(bfa, cfg->fwcfg.num_tskim_reqs); 3267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 327e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati fcpim->fcp = fcp; 328a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fcpim->bfa = bfa; 329a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fcpim->num_itnims = cfg->fwcfg.num_rports; 3307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcpim->num_tskim_reqs = cfg->fwcfg.num_tskim_reqs; 331a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fcpim->path_tov = cfg->drvcfg.path_tov; 332a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fcpim->delay_comp = cfg->drvcfg.delay_comp; 333a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fcpim->profile_comp = NULL; 334a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fcpim->profile_start = NULL; 3357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3364507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati bfa_itnim_attach(fcpim); 3374507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati bfa_tskim_attach(fcpim); 3384507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati bfa_ioim_attach(fcpim); 3397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 342e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatibfa_fcpim_iocdisable(struct bfa_fcp_mod_s *fcp) 3437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 344e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_fcpim_s *fcpim = &fcp->fcpim; 3457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_itnim_s *itnim; 346a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct list_head *qe, *qen; 3477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3483fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati /* Enqueue unused ioim resources to free_q */ 3493fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati list_splice_tail_init(&fcpim->tskim_unused_q, &fcpim->tskim_free_q); 3503fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati 3517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang list_for_each_safe(qe, qen, &fcpim->itnim_q) { 3527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang itnim = (struct bfa_itnim_s *) qe; 3537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_itnim_iocdisable(itnim); 3547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 3557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 3587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcpim_path_tov_set(struct bfa_s *bfa, u16 path_tov) 3597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 360e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa); 3617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcpim->path_tov = path_tov * 1000; 3637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (fcpim->path_tov > BFA_FCPIM_PATHTOV_MAX) 3647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fcpim->path_tov = BFA_FCPIM_PATHTOV_MAX; 3657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 3687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcpim_path_tov_get(struct bfa_s *bfa) 3697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 370e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa); 3717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 372f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return fcpim->path_tov / 1000; 3737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 375601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati#define bfa_fcpim_add_iostats(__l, __r, __stats) \ 376601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati (__l->__stats += __r->__stats) 377601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 378601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipativoid 379601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfa_fcpim_add_stats(struct bfa_itnim_iostats_s *lstats, 380601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_itnim_iostats_s *rstats) 381601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 382601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, total_ios); 383601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, qresumes); 384601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, no_iotags); 385601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, io_aborts); 386601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, no_tskims); 387601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, iocomp_ok); 388601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, iocomp_underrun); 389601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, iocomp_overrun); 390601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, iocomp_aborted); 391601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, iocomp_timedout); 392601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, iocom_nexus_abort); 393601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, iocom_proto_err); 394601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, iocom_dif_err); 395601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, iocom_sqer_needed); 396601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, iocom_res_free); 397601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, iocom_hostabrts); 398601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, iocom_utags); 399601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, io_cleanups); 400601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, io_tmaborts); 401601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, onlines); 402601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, offlines); 403601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, creates); 404601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, deletes); 405601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, create_comps); 406601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, delete_comps); 407601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, sler_events); 408601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, fw_create); 409601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, fw_delete); 410601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, ioc_disabled); 411601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, cleanup_comps); 412601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, tm_cmnds); 413601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, tm_fw_rsps); 414601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, tm_success); 415601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, tm_failures); 416601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, tm_io_comps); 417601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, tm_qresumes); 418601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, tm_iocdowns); 419601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, tm_cleanups); 420601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, tm_cleanup_comps); 421601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, io_comps); 422601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, input_reqs); 423601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, output_reqs); 424601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, rd_throughput); 425601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_iostats(lstats, rstats, wr_throughput); 426601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 427601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 428601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfa_status_t 429601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfa_fcpim_port_iostats(struct bfa_s *bfa, 430601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_itnim_iostats_s *stats, u8 lp_tag) 431601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{ 432601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa); 433601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct list_head *qe, *qen; 434601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati struct bfa_itnim_s *itnim; 435601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 436601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati /* accumulate IO stats from itnim */ 437601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati memset(stats, 0, sizeof(struct bfa_itnim_iostats_s)); 438601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati list_for_each_safe(qe, qen, &fcpim->itnim_q) { 439601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati itnim = (struct bfa_itnim_s *) qe; 440601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati if (itnim->rport->rport_info.lp_tag != lp_tag) 441601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati continue; 442601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati bfa_fcpim_add_stats(stats, &(itnim->stats)); 443601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati } 444601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati return BFA_STATUS_OK; 445601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati} 446601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati 44742a8e6e298f39518445785c53a16357267db37efKrishna Gudipativoid 44842a8e6e298f39518445785c53a16357267db37efKrishna Gudipatibfa_ioim_profile_comp(struct bfa_ioim_s *ioim) 44942a8e6e298f39518445785c53a16357267db37efKrishna Gudipati{ 45042a8e6e298f39518445785c53a16357267db37efKrishna Gudipati struct bfa_itnim_latency_s *io_lat = 45142a8e6e298f39518445785c53a16357267db37efKrishna Gudipati &(ioim->itnim->ioprofile.io_latency); 45242a8e6e298f39518445785c53a16357267db37efKrishna Gudipati u32 val, idx; 45342a8e6e298f39518445785c53a16357267db37efKrishna Gudipati 45442a8e6e298f39518445785c53a16357267db37efKrishna Gudipati val = (u32)(jiffies - ioim->start_time); 45542a8e6e298f39518445785c53a16357267db37efKrishna Gudipati idx = bfa_ioim_get_index(scsi_bufflen((struct scsi_cmnd *)ioim->dio)); 45642a8e6e298f39518445785c53a16357267db37efKrishna Gudipati bfa_itnim_ioprofile_update(ioim->itnim, idx); 45742a8e6e298f39518445785c53a16357267db37efKrishna Gudipati 45842a8e6e298f39518445785c53a16357267db37efKrishna Gudipati io_lat->count[idx]++; 45942a8e6e298f39518445785c53a16357267db37efKrishna Gudipati io_lat->min[idx] = (io_lat->min[idx] < val) ? io_lat->min[idx] : val; 46042a8e6e298f39518445785c53a16357267db37efKrishna Gudipati io_lat->max[idx] = (io_lat->max[idx] > val) ? io_lat->max[idx] : val; 46142a8e6e298f39518445785c53a16357267db37efKrishna Gudipati io_lat->avg[idx] += val; 46242a8e6e298f39518445785c53a16357267db37efKrishna Gudipati} 46342a8e6e298f39518445785c53a16357267db37efKrishna Gudipati 46442a8e6e298f39518445785c53a16357267db37efKrishna Gudipativoid 46542a8e6e298f39518445785c53a16357267db37efKrishna Gudipatibfa_ioim_profile_start(struct bfa_ioim_s *ioim) 46642a8e6e298f39518445785c53a16357267db37efKrishna Gudipati{ 46742a8e6e298f39518445785c53a16357267db37efKrishna Gudipati ioim->start_time = jiffies; 46842a8e6e298f39518445785c53a16357267db37efKrishna Gudipati} 46942a8e6e298f39518445785c53a16357267db37efKrishna Gudipati 47042a8e6e298f39518445785c53a16357267db37efKrishna Gudipatibfa_status_t 47142a8e6e298f39518445785c53a16357267db37efKrishna Gudipatibfa_fcpim_profile_on(struct bfa_s *bfa, u32 time) 47242a8e6e298f39518445785c53a16357267db37efKrishna Gudipati{ 47342a8e6e298f39518445785c53a16357267db37efKrishna Gudipati struct bfa_itnim_s *itnim; 47442a8e6e298f39518445785c53a16357267db37efKrishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa); 47542a8e6e298f39518445785c53a16357267db37efKrishna Gudipati struct list_head *qe, *qen; 47642a8e6e298f39518445785c53a16357267db37efKrishna Gudipati 47742a8e6e298f39518445785c53a16357267db37efKrishna Gudipati /* accumulate IO stats from itnim */ 47842a8e6e298f39518445785c53a16357267db37efKrishna Gudipati list_for_each_safe(qe, qen, &fcpim->itnim_q) { 47942a8e6e298f39518445785c53a16357267db37efKrishna Gudipati itnim = (struct bfa_itnim_s *) qe; 48042a8e6e298f39518445785c53a16357267db37efKrishna Gudipati bfa_itnim_clear_stats(itnim); 48142a8e6e298f39518445785c53a16357267db37efKrishna Gudipati } 48242a8e6e298f39518445785c53a16357267db37efKrishna Gudipati fcpim->io_profile = BFA_TRUE; 48342a8e6e298f39518445785c53a16357267db37efKrishna Gudipati fcpim->io_profile_start_time = time; 48442a8e6e298f39518445785c53a16357267db37efKrishna Gudipati fcpim->profile_comp = bfa_ioim_profile_comp; 48542a8e6e298f39518445785c53a16357267db37efKrishna Gudipati fcpim->profile_start = bfa_ioim_profile_start; 48642a8e6e298f39518445785c53a16357267db37efKrishna Gudipati return BFA_STATUS_OK; 48742a8e6e298f39518445785c53a16357267db37efKrishna Gudipati} 48842a8e6e298f39518445785c53a16357267db37efKrishna Gudipati 48942a8e6e298f39518445785c53a16357267db37efKrishna Gudipatibfa_status_t 49042a8e6e298f39518445785c53a16357267db37efKrishna Gudipatibfa_fcpim_profile_off(struct bfa_s *bfa) 49142a8e6e298f39518445785c53a16357267db37efKrishna Gudipati{ 49242a8e6e298f39518445785c53a16357267db37efKrishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa); 49342a8e6e298f39518445785c53a16357267db37efKrishna Gudipati fcpim->io_profile = BFA_FALSE; 49442a8e6e298f39518445785c53a16357267db37efKrishna Gudipati fcpim->io_profile_start_time = 0; 49542a8e6e298f39518445785c53a16357267db37efKrishna Gudipati fcpim->profile_comp = NULL; 49642a8e6e298f39518445785c53a16357267db37efKrishna Gudipati fcpim->profile_start = NULL; 49742a8e6e298f39518445785c53a16357267db37efKrishna Gudipati return BFA_STATUS_OK; 49842a8e6e298f39518445785c53a16357267db37efKrishna Gudipati} 49942a8e6e298f39518445785c53a16357267db37efKrishna Gudipati 5007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu16 5017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcpim_qdepth_get(struct bfa_s *bfa) 5027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 503e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa); 5047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 505f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return fcpim->q_depth; 5067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5085fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 509a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * BFA ITNIM module state machine functions 510a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 511a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 5125fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 513da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Beginning/unallocated state - no events expected. 514a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 515a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 516a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_uninit(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) 517a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 518a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, itnim->rport->rport_tag); 519a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, event); 520a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 521a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 522a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_CREATE: 523a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_created); 524a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->is_online = BFA_FALSE; 525a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fcpim_additn(itnim); 526a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 527a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 528a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 529a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(itnim->bfa, event); 530a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 531a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 532a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 5335fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 534da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Beginning state, only online event expected. 535a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 536a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 537a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_created(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) 538a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 539a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, itnim->rport->rport_tag); 540a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, event); 541a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 542a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 543a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_ONLINE: 544a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (bfa_itnim_send_fwcreate(itnim)) 545a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_fwcreate); 546a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati else 547a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_fwcreate_qfull); 548a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 549a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 550a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_DELETE: 551a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_uninit); 552a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fcpim_delitn(itnim); 553a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 554a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 555a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_HWFAIL: 556a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_iocdisable); 557a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 558a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 559a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 560a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(itnim->bfa, event); 561a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 562a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 563a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 5645fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 565a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Waiting for itnim create response from firmware. 566a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 567a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 568a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_fwcreate(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) 569a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 570a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, itnim->rport->rport_tag); 571a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, event); 572a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 573a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 574a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_FWRSP: 575a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_online); 576a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->is_online = BFA_TRUE; 577a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_iotov_online(itnim); 578a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_online_cb(itnim); 579a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 580a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 581a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_DELETE: 582a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_delete_pending); 583a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 584a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 585a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_OFFLINE: 586a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (bfa_itnim_send_fwdelete(itnim)) 587a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_fwdelete); 588a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati else 589a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_fwdelete_qfull); 590a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 591a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 592a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_HWFAIL: 593a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_iocdisable); 594a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 595a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 596a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 597a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(itnim->bfa, event); 598a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 599a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 600a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 601a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 602a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_fwcreate_qfull(struct bfa_itnim_s *itnim, 603a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event) 604a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 605a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, itnim->rport->rport_tag); 606a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, event); 607a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 608a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 609a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_QRESUME: 610a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_fwcreate); 611a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_send_fwcreate(itnim); 612a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 613a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 614a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_DELETE: 615a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_uninit); 616a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wcancel(&itnim->reqq_wait); 617a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fcpim_delitn(itnim); 618a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 619a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 620a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_OFFLINE: 621a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_offline); 622a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wcancel(&itnim->reqq_wait); 623a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_offline_cb(itnim); 624a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 625a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 626a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_HWFAIL: 627a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_iocdisable); 628a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wcancel(&itnim->reqq_wait); 629a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 630a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 631a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 632a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(itnim->bfa, event); 633a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 634a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 635a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 6365fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 637da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Waiting for itnim create response from firmware, a delete is pending. 638a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 639a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 640a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_delete_pending(struct bfa_itnim_s *itnim, 641a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event) 642a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 643a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, itnim->rport->rport_tag); 644a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, event); 645a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 646a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 647a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_FWRSP: 648a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (bfa_itnim_send_fwdelete(itnim)) 649a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_deleting); 650a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati else 651a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_deleting_qfull); 652a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 653a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 654a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_HWFAIL: 655a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_uninit); 656a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fcpim_delitn(itnim); 657a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 658a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 659a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 660a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(itnim->bfa, event); 661a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 662a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 663a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 6645fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 665da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Online state - normal parking state. 666a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 667a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 668a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_online(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) 669a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 670a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, itnim->rport->rport_tag); 671a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, event); 672a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 673a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 674a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_OFFLINE: 675a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_cleanup_offline); 676a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->is_online = BFA_FALSE; 677a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_iotov_start(itnim); 678a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_cleanup(itnim); 679a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 680a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 681a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_DELETE: 682a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_cleanup_delete); 683a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->is_online = BFA_FALSE; 684a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_cleanup(itnim); 685a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 686a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 687a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_SLER: 688a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_sler); 689a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->is_online = BFA_FALSE; 690a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_iotov_start(itnim); 691a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_sler_cb(itnim); 692a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 693a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 694a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_HWFAIL: 695a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_iocdisable); 696a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->is_online = BFA_FALSE; 697a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_iotov_start(itnim); 698a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_iocdisable_cleanup(itnim); 699a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 700a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 701a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 702a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(itnim->bfa, event); 703a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 704a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 705a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 7065fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 707da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Second level error recovery need. 708a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 709a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 710a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_sler(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) 711a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 712a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, itnim->rport->rport_tag); 713a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, event); 714a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 715a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 716a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_OFFLINE: 717a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_cleanup_offline); 718a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_cleanup(itnim); 719a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 720a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 721a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_DELETE: 722a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_cleanup_delete); 723a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_cleanup(itnim); 724a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_iotov_delete(itnim); 725a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 726a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 727a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_HWFAIL: 728a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_iocdisable); 729a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_iocdisable_cleanup(itnim); 730a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 731a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 732a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 733a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(itnim->bfa, event); 734a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 735a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 736a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 7375fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 738da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Going offline. Waiting for active IO cleanup. 739a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 740a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 741a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_cleanup_offline(struct bfa_itnim_s *itnim, 742a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event) 743a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 744a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, itnim->rport->rport_tag); 745a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, event); 746a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 747a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 748a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_CLEANUP: 749a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (bfa_itnim_send_fwdelete(itnim)) 750a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_fwdelete); 751a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati else 752a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_fwdelete_qfull); 753a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 754a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 755a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_DELETE: 756a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_cleanup_delete); 757a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_iotov_delete(itnim); 758a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 759a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 760a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_HWFAIL: 761a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_iocdisable); 762a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_iocdisable_cleanup(itnim); 763a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_offline_cb(itnim); 764a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 765a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 766a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_SLER: 767a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 768a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 769a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 770a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(itnim->bfa, event); 771a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 772a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 773a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 7745fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 775da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Deleting itnim. Waiting for active IO cleanup. 776a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 777a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 778a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_cleanup_delete(struct bfa_itnim_s *itnim, 779a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event) 780a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 781a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, itnim->rport->rport_tag); 782a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, event); 783a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 784a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 785a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_CLEANUP: 786a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (bfa_itnim_send_fwdelete(itnim)) 787a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_deleting); 788a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati else 789a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_deleting_qfull); 790a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 791a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 792a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_HWFAIL: 793a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_iocdisable); 794a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_iocdisable_cleanup(itnim); 795a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 796a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 797a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 798a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(itnim->bfa, event); 799a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 800a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 801a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 8025fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 803a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Rport offline. Fimrware itnim is being deleted - awaiting f/w response. 804a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 805a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 806a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_fwdelete(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) 807a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 808a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, itnim->rport->rport_tag); 809a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, event); 810a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 811a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 812a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_FWRSP: 813a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_offline); 814a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_offline_cb(itnim); 815a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 816a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 817a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_DELETE: 818a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_deleting); 819a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 820a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 821a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_HWFAIL: 822a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_iocdisable); 823a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_offline_cb(itnim); 824a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 825a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 826a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 827a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(itnim->bfa, event); 828a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 829a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 830a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 831a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 832a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_fwdelete_qfull(struct bfa_itnim_s *itnim, 833a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event) 834a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 835a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, itnim->rport->rport_tag); 836a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, event); 837a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 838a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 839a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_QRESUME: 840a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_fwdelete); 841a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_send_fwdelete(itnim); 842a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 843a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 844a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_DELETE: 845a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_deleting_qfull); 846a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 847a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 848a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_HWFAIL: 849a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_iocdisable); 850a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wcancel(&itnim->reqq_wait); 851a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_offline_cb(itnim); 852a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 853a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 854a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 855a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(itnim->bfa, event); 856a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 857a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 858a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 8595fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 860da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Offline state. 861a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 862a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 863a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_offline(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) 864a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 865a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, itnim->rport->rport_tag); 866a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, event); 867a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 868a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 869a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_DELETE: 870a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_uninit); 871a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_iotov_delete(itnim); 872a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fcpim_delitn(itnim); 873a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 874a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 875a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_ONLINE: 876a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (bfa_itnim_send_fwcreate(itnim)) 877a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_fwcreate); 878a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati else 879a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_fwcreate_qfull); 880a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 881a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 882a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_HWFAIL: 883a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_iocdisable); 884a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 885a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 886a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 887a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(itnim->bfa, event); 888a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 889a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 890a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 891a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 892a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_iocdisable(struct bfa_itnim_s *itnim, 893a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event) 894a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 895a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, itnim->rport->rport_tag); 896a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, event); 897a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 898a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 899a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_DELETE: 900a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_uninit); 901a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_iotov_delete(itnim); 902a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fcpim_delitn(itnim); 903a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 904a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 905a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_OFFLINE: 906a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_offline_cb(itnim); 907a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 908a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 909a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_ONLINE: 910a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (bfa_itnim_send_fwcreate(itnim)) 911a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_fwcreate); 912a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati else 913a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_fwcreate_qfull); 914a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 915a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 916a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_HWFAIL: 917a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 918a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 919a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 920a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(itnim->bfa, event); 921a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 922a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 923a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 9245fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 925da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Itnim is deleted, waiting for firmware response to delete. 926a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 927a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 928a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_deleting(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) 929a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 930a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, itnim->rport->rport_tag); 931a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, event); 932a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 933a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 934a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_FWRSP: 935a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_HWFAIL: 936a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_uninit); 937a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fcpim_delitn(itnim); 938a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 939a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 940a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 941a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(itnim->bfa, event); 942a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 943a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 944a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 945a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 946a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_sm_deleting_qfull(struct bfa_itnim_s *itnim, 947a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_itnim_event event) 948a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 949a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, itnim->rport->rport_tag); 950a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(itnim->bfa, event); 951a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 952a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 953a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_QRESUME: 954a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_deleting); 955a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_send_fwdelete(itnim); 956a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 957a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 958a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_ITNIM_SM_HWFAIL: 959a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_uninit); 960a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wcancel(&itnim->reqq_wait); 961a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fcpim_delitn(itnim); 962a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 963a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 964a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 965a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(itnim->bfa, event); 966a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 967a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 968a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 9695fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 970da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Initiate cleanup of all IOs on an IOC failure. 971a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 972a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 973a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_iocdisable_cleanup(struct bfa_itnim_s *itnim) 974a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 975a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_tskim_s *tskim; 976a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioim_s *ioim; 977a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct list_head *qe, *qen; 978a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 979a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_for_each_safe(qe, qen, &itnim->tsk_q) { 980a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati tskim = (struct bfa_tskim_s *) qe; 981a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_iocdisable(tskim); 982a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 983a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 984a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_for_each_safe(qe, qen, &itnim->io_q) { 985a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim = (struct bfa_ioim_s *) qe; 986a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_iocdisable(ioim); 987a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 988a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 9895fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 990a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * For IO request in pending queue, we pretend an early timeout. 991a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 992a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_for_each_safe(qe, qen, &itnim->pending_q) { 993a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim = (struct bfa_ioim_s *) qe; 994a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_tov(ioim); 995a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 996a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 997a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_for_each_safe(qe, qen, &itnim->io_cleanup_q) { 998a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim = (struct bfa_ioim_s *) qe; 999a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_iocdisable(ioim); 1000a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1001a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1002a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 10035fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1004da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * IO cleanup completion 1005a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1006a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1007a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_cleanp_comp(void *itnim_cbarg) 1008a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1009a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_itnim_s *itnim = itnim_cbarg; 1010a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1011a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(itnim, cleanup_comps); 1012a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(itnim, BFA_ITNIM_SM_CLEANUP); 1013a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1014a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 10155fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1016da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Initiate cleanup of all IOs. 1017a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1018a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1019a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_cleanup(struct bfa_itnim_s *itnim) 1020a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1021a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioim_s *ioim; 1022a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_tskim_s *tskim; 1023a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct list_head *qe, *qen; 1024a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1025a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_wc_init(&itnim->wc, bfa_itnim_cleanp_comp, itnim); 1026a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1027a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_for_each_safe(qe, qen, &itnim->io_q) { 1028a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim = (struct bfa_ioim_s *) qe; 1029a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 10305fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1031a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Move IO to a cleanup queue from active queue so that a later 1032a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * TM will not pickup this IO. 1033a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1034a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_del(&ioim->qe); 1035a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_add_tail(&ioim->qe, &itnim->io_cleanup_q); 1036a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1037a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_wc_up(&itnim->wc); 1038a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_cleanup(ioim); 1039a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1040a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1041a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_for_each_safe(qe, qen, &itnim->tsk_q) { 1042a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati tskim = (struct bfa_tskim_s *) qe; 1043a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_wc_up(&itnim->wc); 1044a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_cleanup(tskim); 1045a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1046a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1047a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_wc_wait(&itnim->wc); 1048a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1049a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1050a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1051a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati__bfa_cb_itnim_online(void *cbarg, bfa_boolean_t complete) 1052a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1053a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_itnim_s *itnim = cbarg; 1054a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1055a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (complete) 1056a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_itnim_online(itnim->ditn); 1057a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1058a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1059a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1060a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati__bfa_cb_itnim_offline(void *cbarg, bfa_boolean_t complete) 1061a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1062a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_itnim_s *itnim = cbarg; 1063a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1064a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (complete) 1065a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_itnim_offline(itnim->ditn); 1066a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1067a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1068a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1069a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati__bfa_cb_itnim_sler(void *cbarg, bfa_boolean_t complete) 1070a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1071a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_itnim_s *itnim = cbarg; 1072a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1073a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (complete) 1074a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_itnim_sler(itnim->ditn); 1075a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1076a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 10775fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1078a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Call to resume any I/O requests waiting for room in request queue. 1079a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1080a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1081a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_qresume(void *cbarg) 1082a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1083a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_itnim_s *itnim = cbarg; 1084a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1085a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(itnim, BFA_ITNIM_SM_QRESUME); 1086a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1087a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 10885fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1089a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * bfa_itnim_public 1090a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1091a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1092a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 1093a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_iodone(struct bfa_itnim_s *itnim) 1094a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1095a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_wc_down(&itnim->wc); 1096a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1097a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1098a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 1099a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_tskdone(struct bfa_itnim_s *itnim) 1100a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1101a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_wc_down(&itnim->wc); 1102a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1103a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1104a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 11054507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipatibfa_itnim_meminfo(struct bfa_iocfc_cfg_s *cfg, u32 *km_len) 1106a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 11075fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1108a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * ITN memory 1109a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1110a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *km_len += cfg->fwcfg.num_rports * sizeof(struct bfa_itnim_s); 1111a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1112a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1113a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 11144507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipatibfa_itnim_attach(struct bfa_fcpim_s *fcpim) 1115a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1116a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_s *bfa = fcpim->bfa; 11174507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati struct bfa_fcp_mod_s *fcp = fcpim->fcp; 1118a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_itnim_s *itnim; 1119a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int i, j; 1120a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1121a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati INIT_LIST_HEAD(&fcpim->itnim_q); 1122a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 11234507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati itnim = (struct bfa_itnim_s *) bfa_mem_kva_curp(fcp); 1124a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fcpim->itnim_arr = itnim; 1125a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1126a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati for (i = 0; i < fcpim->num_itnims; i++, itnim++) { 11276a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(itnim, 0, sizeof(struct bfa_itnim_s)); 1128a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->bfa = bfa; 1129a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->fcpim = fcpim; 1130a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->reqq = BFA_REQQ_QOS_LO; 1131a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->rport = BFA_RPORT_FROM_TAG(bfa, i); 1132a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->iotov_active = BFA_FALSE; 1133a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_winit(&itnim->reqq_wait, bfa_itnim_qresume, itnim); 1134a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1135a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati INIT_LIST_HEAD(&itnim->io_q); 1136a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati INIT_LIST_HEAD(&itnim->io_cleanup_q); 1137a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati INIT_LIST_HEAD(&itnim->pending_q); 1138a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati INIT_LIST_HEAD(&itnim->tsk_q); 1139a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati INIT_LIST_HEAD(&itnim->delay_comp_q); 1140a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati for (j = 0; j < BFA_IOBUCKET_MAX; j++) 1141a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->ioprofile.io_latency.min[j] = ~0; 1142a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(itnim, bfa_itnim_sm_uninit); 1143a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1144a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 11454507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati bfa_mem_kva_curp(fcp) = (u8 *) itnim; 1146a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1147a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1148a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 1149a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_iocdisable(struct bfa_itnim_s *itnim) 1150a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1151a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(itnim, ioc_disabled); 1152a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(itnim, BFA_ITNIM_SM_HWFAIL); 1153a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1154a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1155a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t 1156a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_send_fwcreate(struct bfa_itnim_s *itnim) 1157a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1158dd5aaf4536c5111784a18d935b9b5adeac9f914cKrishna Gudipati struct bfi_itn_create_req_s *m; 1159a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1160a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->msg_no++; 1161a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 11625fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1163a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * check for room in queue to send request now 1164a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1165a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m = bfa_reqq_next(itnim->bfa, itnim->reqq); 1166a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!m) { 1167a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wait(itnim->bfa, itnim->reqq, &itnim->reqq_wait); 1168a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_FALSE; 1169a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1170a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1171dd5aaf4536c5111784a18d935b9b5adeac9f914cKrishna Gudipati bfi_h2i_set(m->mh, BFI_MC_ITN, BFI_ITN_H2I_CREATE_REQ, 11723fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati bfa_fn_lpu(itnim->bfa)); 1173a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m->fw_handle = itnim->rport->fw_handle; 1174a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m->class = FC_CLASS_3; 1175a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m->seq_rec = itnim->seq_rec; 1176a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m->msg_no = itnim->msg_no; 1177a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(itnim, fw_create); 1178a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 11795fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1180a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * queue I/O message to firmware 1181a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 11823fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati bfa_reqq_produce(itnim->bfa, itnim->reqq, m->mh); 1183a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_TRUE; 1184a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1185a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1186a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t 1187a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_send_fwdelete(struct bfa_itnim_s *itnim) 1188a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1189dd5aaf4536c5111784a18d935b9b5adeac9f914cKrishna Gudipati struct bfi_itn_delete_req_s *m; 1190a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 11915fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1192a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * check for room in queue to send request now 1193a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1194a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m = bfa_reqq_next(itnim->bfa, itnim->reqq); 1195a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!m) { 1196a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wait(itnim->bfa, itnim->reqq, &itnim->reqq_wait); 1197a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_FALSE; 1198a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1199a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1200dd5aaf4536c5111784a18d935b9b5adeac9f914cKrishna Gudipati bfi_h2i_set(m->mh, BFI_MC_ITN, BFI_ITN_H2I_DELETE_REQ, 12013fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati bfa_fn_lpu(itnim->bfa)); 1202a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m->fw_handle = itnim->rport->fw_handle; 1203a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(itnim, fw_delete); 1204a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 12055fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1206a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * queue I/O message to firmware 1207a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 12083fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati bfa_reqq_produce(itnim->bfa, itnim->reqq, m->mh); 1209a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_TRUE; 1210a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1211a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 12125fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1213a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Cleanup all pending failed inflight requests. 1214a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1215a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1216a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_delayed_comp(struct bfa_itnim_s *itnim, bfa_boolean_t iotov) 1217a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1218a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioim_s *ioim; 1219a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct list_head *qe, *qen; 1220a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1221a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_for_each_safe(qe, qen, &itnim->delay_comp_q) { 1222a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim = (struct bfa_ioim_s *)qe; 1223a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_delayed_comp(ioim, iotov); 1224a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1225a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1226a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 12275fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1228a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Start all pending IO requests. 1229a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1230a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1231a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_iotov_online(struct bfa_itnim_s *itnim) 1232a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1233a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioim_s *ioim; 1234a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1235a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_iotov_stop(itnim); 1236a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 12375fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1238a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Abort all inflight IO requests in the queue 1239a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1240a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_delayed_comp(itnim, BFA_FALSE); 1241a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 12425fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1243a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Start all pending IO requests. 1244a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1245a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati while (!list_empty(&itnim->pending_q)) { 1246a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_q_deq(&itnim->pending_q, &ioim); 1247a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_add_tail(&ioim->qe, &itnim->io_q); 1248a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_start(ioim); 1249a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1250a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1251a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 12525fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1253a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Fail all pending IO requests 1254a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1255a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1256a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_iotov_cleanup(struct bfa_itnim_s *itnim) 1257a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1258a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioim_s *ioim; 1259a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 12605fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1261a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Fail all inflight IO requests in the queue 1262a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1263a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_delayed_comp(itnim, BFA_TRUE); 1264a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 12655fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1266a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Fail any pending IO requests. 1267a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1268a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati while (!list_empty(&itnim->pending_q)) { 1269a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_q_deq(&itnim->pending_q, &ioim); 1270a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_add_tail(&ioim->qe, &ioim->fcpim->ioim_comp_q); 1271a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_tov(ioim); 1272a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1273a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1274a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 12755fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1276a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IO TOV timer callback. Fail any pending IO requests. 1277a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1278a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1279a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_iotov(void *itnim_arg) 1280a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1281a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_itnim_s *itnim = itnim_arg; 1282a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1283a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->iotov_active = BFA_FALSE; 1284a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1285a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_itnim_tov_begin(itnim->ditn); 1286a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_iotov_cleanup(itnim); 1287a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_itnim_tov(itnim->ditn); 1288a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1289a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 12905fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1291a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Start IO TOV timer for failing back pending IO requests in offline state. 1292a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1293a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1294a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_iotov_start(struct bfa_itnim_s *itnim) 1295a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1296a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (itnim->fcpim->path_tov > 0) { 1297a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1298a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->iotov_active = BFA_TRUE; 1299d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(!bfa_itnim_hold_io(itnim)); 1300a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_timer_start(itnim->bfa, &itnim->timer, 1301a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_iotov, itnim, itnim->fcpim->path_tov); 1302a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1303a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1304a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 13055fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1306a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Stop IO TOV timer. 1307a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1308a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1309a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_iotov_stop(struct bfa_itnim_s *itnim) 1310a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1311a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (itnim->iotov_active) { 1312a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->iotov_active = BFA_FALSE; 1313a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_timer_stop(&itnim->timer); 1314a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1315a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1316a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 13175fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1318a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Stop IO TOV timer. 1319a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1320a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1321a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_iotov_delete(struct bfa_itnim_s *itnim) 1322a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1323a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_boolean_t pathtov_active = BFA_FALSE; 1324a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1325a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (itnim->iotov_active) 1326a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati pathtov_active = BFA_TRUE; 1327a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1328a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_iotov_stop(itnim); 1329a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (pathtov_active) 1330a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_itnim_tov_begin(itnim->ditn); 1331a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_iotov_cleanup(itnim); 1332a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (pathtov_active) 1333a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_itnim_tov(itnim->ditn); 1334a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1335a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1336a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1337a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_update_del_itn_stats(struct bfa_itnim_s *itnim) 1338a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1339e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(itnim->bfa); 1340a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fcpim->del_itn_stats.del_itn_iocomp_aborted += 1341a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->stats.iocomp_aborted; 1342a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fcpim->del_itn_stats.del_itn_iocomp_timedout += 1343a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->stats.iocomp_timedout; 1344a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fcpim->del_itn_stats.del_itn_iocom_sqer_needed += 1345a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->stats.iocom_sqer_needed; 1346a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fcpim->del_itn_stats.del_itn_iocom_res_free += 1347a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->stats.iocom_res_free; 1348a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fcpim->del_itn_stats.del_itn_iocom_hostabrts += 1349a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->stats.iocom_hostabrts; 1350a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fcpim->del_itn_stats.del_itn_total_ios += itnim->stats.total_ios; 1351a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fcpim->del_itn_stats.del_io_iocdowns += itnim->stats.io_iocdowns; 1352a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fcpim->del_itn_stats.del_tm_iocdowns += itnim->stats.tm_iocdowns; 1353a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1354a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 13555fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1356da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * bfa_itnim_public 1357a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1358a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 13595fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1360da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Itnim interrupt processing. 1361a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1362a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 1363a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_isr(struct bfa_s *bfa, struct bfi_msg_s *m) 1364a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1365e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa); 1366dd5aaf4536c5111784a18d935b9b5adeac9f914cKrishna Gudipati union bfi_itn_i2h_msg_u msg; 1367a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_itnim_s *itnim; 1368a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1369a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(bfa, m->mhdr.msg_id); 1370a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1371a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati msg.msg = m; 1372a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1373a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (m->mhdr.msg_id) { 1374dd5aaf4536c5111784a18d935b9b5adeac9f914cKrishna Gudipati case BFI_ITN_I2H_CREATE_RSP: 1375a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim = BFA_ITNIM_FROM_TAG(fcpim, 1376a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati msg.create_rsp->bfa_handle); 1377d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(msg.create_rsp->status != BFA_STATUS_OK); 1378a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(itnim, create_comps); 1379a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(itnim, BFA_ITNIM_SM_FWRSP); 1380a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1381a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1382dd5aaf4536c5111784a18d935b9b5adeac9f914cKrishna Gudipati case BFI_ITN_I2H_DELETE_RSP: 1383a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim = BFA_ITNIM_FROM_TAG(fcpim, 1384a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati msg.delete_rsp->bfa_handle); 1385d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(msg.delete_rsp->status != BFA_STATUS_OK); 1386a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(itnim, delete_comps); 1387a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(itnim, BFA_ITNIM_SM_FWRSP); 1388a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1389a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1390dd5aaf4536c5111784a18d935b9b5adeac9f914cKrishna Gudipati case BFI_ITN_I2H_SLER_EVENT: 1391a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim = BFA_ITNIM_FROM_TAG(fcpim, 1392a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati msg.sler_event->bfa_handle); 1393a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(itnim, sler_events); 1394a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(itnim, BFA_ITNIM_SM_SLER); 1395a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1396a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1397a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 1398a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(bfa, m->mhdr.msg_id); 1399d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(1); 1400a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1401a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1402a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 14035fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1404da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * bfa_itnim_api 1405a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1406a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1407a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistruct bfa_itnim_s * 1408a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_create(struct bfa_s *bfa, struct bfa_rport_s *rport, void *ditn) 1409a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1410e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa); 1411a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_itnim_s *itnim; 1412a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1413e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati bfa_itn_create(bfa, rport, bfa_itnim_isr); 1414e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 1415a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim = BFA_ITNIM_FROM_TAG(fcpim, rport->rport_tag); 1416d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(itnim->rport != rport); 1417a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1418a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->ditn = ditn; 1419a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1420a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(itnim, creates); 1421a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(itnim, BFA_ITNIM_SM_CREATE); 1422a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1423a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return itnim; 1424a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1425a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1426a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 1427a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_delete(struct bfa_itnim_s *itnim) 1428a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1429a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(itnim, deletes); 1430a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(itnim, BFA_ITNIM_SM_DELETE); 1431a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1432a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1433a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 1434a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_online(struct bfa_itnim_s *itnim, bfa_boolean_t seq_rec) 1435a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1436a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->seq_rec = seq_rec; 1437a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(itnim, onlines); 1438a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(itnim, BFA_ITNIM_SM_ONLINE); 1439a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1440a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1441a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 1442a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_offline(struct bfa_itnim_s *itnim) 1443a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1444a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(itnim, offlines); 1445a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(itnim, BFA_ITNIM_SM_OFFLINE); 1446a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1447a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 14485fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1449a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Return true if itnim is considered offline for holding off IO request. 1450a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IO is not held if itnim is being deleted. 1451a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1452a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_boolean_t 1453a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_hold_io(struct bfa_itnim_s *itnim) 1454a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1455a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return itnim->fcpim->path_tov && itnim->iotov_active && 1456a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (bfa_sm_cmp_state(itnim, bfa_itnim_sm_fwcreate) || 1457a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_cmp_state(itnim, bfa_itnim_sm_sler) || 1458a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_cmp_state(itnim, bfa_itnim_sm_cleanup_offline) || 1459a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_cmp_state(itnim, bfa_itnim_sm_fwdelete) || 1460a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_cmp_state(itnim, bfa_itnim_sm_offline) || 1461a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_cmp_state(itnim, bfa_itnim_sm_iocdisable)); 1462a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1463a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 146442a8e6e298f39518445785c53a16357267db37efKrishna Gudipati#define bfa_io_lat_clock_res_div HZ 146542a8e6e298f39518445785c53a16357267db37efKrishna Gudipati#define bfa_io_lat_clock_res_mul 1000 146642a8e6e298f39518445785c53a16357267db37efKrishna Gudipatibfa_status_t 146742a8e6e298f39518445785c53a16357267db37efKrishna Gudipatibfa_itnim_get_ioprofile(struct bfa_itnim_s *itnim, 146842a8e6e298f39518445785c53a16357267db37efKrishna Gudipati struct bfa_itnim_ioprofile_s *ioprofile) 146942a8e6e298f39518445785c53a16357267db37efKrishna Gudipati{ 147061ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati struct bfa_fcpim_s *fcpim; 147161ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati 147261ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati if (!itnim) 147361ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati return BFA_STATUS_NO_FCPIM_NEXUS; 147461ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati 147561ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati fcpim = BFA_FCPIM(itnim->bfa); 147661ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati 147742a8e6e298f39518445785c53a16357267db37efKrishna Gudipati if (!fcpim->io_profile) 147842a8e6e298f39518445785c53a16357267db37efKrishna Gudipati return BFA_STATUS_IOPROFILE_OFF; 147942a8e6e298f39518445785c53a16357267db37efKrishna Gudipati 148042a8e6e298f39518445785c53a16357267db37efKrishna Gudipati itnim->ioprofile.index = BFA_IOBUCKET_MAX; 148142a8e6e298f39518445785c53a16357267db37efKrishna Gudipati itnim->ioprofile.io_profile_start_time = 148242a8e6e298f39518445785c53a16357267db37efKrishna Gudipati bfa_io_profile_start_time(itnim->bfa); 148342a8e6e298f39518445785c53a16357267db37efKrishna Gudipati itnim->ioprofile.clock_res_mul = bfa_io_lat_clock_res_mul; 148442a8e6e298f39518445785c53a16357267db37efKrishna Gudipati itnim->ioprofile.clock_res_div = bfa_io_lat_clock_res_div; 148542a8e6e298f39518445785c53a16357267db37efKrishna Gudipati *ioprofile = itnim->ioprofile; 148642a8e6e298f39518445785c53a16357267db37efKrishna Gudipati 148742a8e6e298f39518445785c53a16357267db37efKrishna Gudipati return BFA_STATUS_OK; 148842a8e6e298f39518445785c53a16357267db37efKrishna Gudipati} 148942a8e6e298f39518445785c53a16357267db37efKrishna Gudipati 1490a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 1491a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_itnim_clear_stats(struct bfa_itnim_s *itnim) 1492a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1493a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int j; 149461ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati 149561ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati if (!itnim) 149661ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati return; 149761ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati 14986a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(&itnim->stats, 0, sizeof(itnim->stats)); 14996a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(&itnim->ioprofile, 0, sizeof(itnim->ioprofile)); 1500a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati for (j = 0; j < BFA_IOBUCKET_MAX; j++) 1501a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati itnim->ioprofile.io_latency.min[j] = ~0; 1502a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1503a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 15045fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1505a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * BFA IO module state machine functions 1506a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1507a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 15085fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1509da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * IO is not started (unallocated). 1510a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1511a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1512a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_uninit(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) 1513a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1514a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 1515a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_START: 1516a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!bfa_itnim_is_online(ioim->itnim)) { 1517a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!bfa_itnim_hold_io(ioim->itnim)) { 1518a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1519a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_del(&ioim->qe); 1520a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_add_tail(&ioim->qe, 1521a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati &ioim->fcpim->ioim_comp_q); 1522a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, 1523a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati __bfa_cb_ioim_pathtov, ioim); 1524a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } else { 1525a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_del(&ioim->qe); 1526a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_add_tail(&ioim->qe, 1527a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati &ioim->itnim->pending_q); 1528a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1529a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1530a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1531a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1532a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (ioim->nsges > BFI_SGE_INLINE) { 1533e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang if (!bfa_ioim_sgpg_alloc(ioim)) { 1534a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_sgalloc); 1535a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return; 1536a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1537a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1538a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1539a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!bfa_ioim_send_ioreq(ioim)) { 1540a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_qfull); 1541a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1542a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1543a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1544a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_active); 1545a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1546a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1547a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_IOTOV: 1548a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1549a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_move_to_comp_q(ioim); 1550a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, 1551a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati __bfa_cb_ioim_pathtov, ioim); 1552a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1553a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1554a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_ABORT: 15555fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1556a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IO in pending queue can get abort requests. Complete abort 1557a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * requests immediately. 1558a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1559a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1560d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(!bfa_q_is_on_q(&ioim->itnim->pending_q, ioim)); 1561a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, 156283763d591b343b07331cebe86715205230c568b1Krishna Gudipati __bfa_cb_ioim_abort, ioim); 156383763d591b343b07331cebe86715205230c568b1Krishna Gudipati break; 156483763d591b343b07331cebe86715205230c568b1Krishna Gudipati 1565a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 1566a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(ioim->bfa, event); 1567a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1568a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1569a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 15705fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1571da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * IO is waiting for SG pages. 1572a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1573a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1574a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_sgalloc(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) 1575a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1576a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, ioim->iotag); 1577a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, event); 1578a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1579a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 1580a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_SGALLOCED: 1581a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!bfa_ioim_send_ioreq(ioim)) { 1582a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_qfull); 1583a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1584a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1585a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_active); 1586a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1587a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1588a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_CLEANUP: 1589a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1590a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sgpg_wcancel(ioim->bfa, &ioim->iosp->sgpg_wqe); 1591a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed, 1592a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim); 1593a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_notify_cleanup(ioim); 1594a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1595a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1596a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_ABORT: 1597a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1598a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sgpg_wcancel(ioim->bfa, &ioim->iosp->sgpg_wqe); 1599a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_move_to_comp_q(ioim); 1600a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort, 1601a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim); 1602a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1603a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1604a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_HWFAIL: 1605a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1606a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sgpg_wcancel(ioim->bfa, &ioim->iosp->sgpg_wqe); 1607a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_move_to_comp_q(ioim); 1608a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed, 1609a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim); 1610a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1611a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1612a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 1613a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(ioim->bfa, event); 1614a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1615a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1616a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 16175fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1618da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * IO is active. 1619a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1620a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1621a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_active(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) 1622a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1623a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 1624a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_COMP_GOOD: 1625a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1626a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_move_to_comp_q(ioim); 1627a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, 1628a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati __bfa_cb_ioim_good_comp, ioim); 1629a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1630a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1631a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_COMP: 1632a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1633a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_move_to_comp_q(ioim); 1634a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_comp, 1635a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim); 1636a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1637a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1638a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_DONE: 1639a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free); 1640a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_move_to_comp_q(ioim); 1641a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_comp, 1642a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim); 1643a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1644a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1645a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_ABORT: 1646a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->iosp->abort_explicit = BFA_TRUE; 1647a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->io_cbfn = __bfa_cb_ioim_abort; 1648a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1649a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (bfa_ioim_send_abort(ioim)) 1650a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_abort); 1651a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati else { 1652a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_abort_qfull); 1653a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, qwait); 1654a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wait(ioim->bfa, ioim->reqq, 1655a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati &ioim->iosp->reqq_wait); 1656a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1657a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1658a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1659a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_CLEANUP: 1660a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->iosp->abort_explicit = BFA_FALSE; 1661a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->io_cbfn = __bfa_cb_ioim_failed; 1662a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1663a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (bfa_ioim_send_abort(ioim)) 1664a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup); 1665a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati else { 1666a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup_qfull); 1667a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, qwait); 1668a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wait(ioim->bfa, ioim->reqq, 1669a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati &ioim->iosp->reqq_wait); 1670a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1671a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1672a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1673a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_HWFAIL: 1674a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1675a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_move_to_comp_q(ioim); 1676a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed, 1677a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim); 1678a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1679a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1680a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_SQRETRY: 168115821f05b78dbeb2f897d1d22576449103a4d8d5Krishna Gudipati if (bfa_ioim_maxretry_reached(ioim)) { 168215821f05b78dbeb2f897d1d22576449103a4d8d5Krishna Gudipati /* max retry reached, free IO */ 1683a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free); 1684a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_move_to_comp_q(ioim); 1685a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, 1686a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati __bfa_cb_ioim_failed, ioim); 1687a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1688a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1689a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati /* waiting for IO tag resource free */ 1690a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_cmnd_retry); 1691a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1692a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1693a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 1694a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(ioim->bfa, event); 1695a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1696a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1697a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 16985fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1699da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * IO is retried with new tag. 1700da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang */ 1701a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1702a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_cmnd_retry(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) 1703a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1704a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 1705a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_FREE: 1706a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati /* abts and rrq done. Now retry the IO with new tag */ 170715821f05b78dbeb2f897d1d22576449103a4d8d5Krishna Gudipati bfa_ioim_update_iotag(ioim); 1708a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!bfa_ioim_send_ioreq(ioim)) { 1709a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_qfull); 1710a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1711a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1712a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_active); 1713a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1714a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1715a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_CLEANUP: 1716a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->iosp->abort_explicit = BFA_FALSE; 1717a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->io_cbfn = __bfa_cb_ioim_failed; 1718a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1719a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (bfa_ioim_send_abort(ioim)) 1720a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup); 1721a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati else { 1722a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup_qfull); 1723a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, qwait); 1724a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wait(ioim->bfa, ioim->reqq, 1725a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati &ioim->iosp->reqq_wait); 1726a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1727a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1728a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1729a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_HWFAIL: 1730a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1731a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_move_to_comp_q(ioim); 1732a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, 1733a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati __bfa_cb_ioim_failed, ioim); 1734a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1735a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1736a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_ABORT: 17375fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* in this state IO abort is done. 1738a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Waiting for IO tag resource free. 1739a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1740a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free); 1741a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort, 1742a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim); 1743a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1744a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1745a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 1746a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(ioim->bfa, event); 1747a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1748a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1749a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 17505fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1751da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * IO is being aborted, waiting for completion from firmware. 1752a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1753a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1754a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_abort(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) 1755a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1756a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, ioim->iotag); 1757a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, event); 1758a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1759a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 1760a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_COMP_GOOD: 1761a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_COMP: 1762a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_DONE: 1763a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_FREE: 1764a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1765a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1766a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_ABORT_DONE: 1767a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free); 1768a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort, 1769a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim); 1770a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1771a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1772a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_ABORT_COMP: 1773a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1774a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_move_to_comp_q(ioim); 1775a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort, 1776a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim); 1777a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1778a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1779a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_COMP_UTAG: 1780a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1781a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_move_to_comp_q(ioim); 1782a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort, 1783a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim); 1784a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1785a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1786a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_CLEANUP: 1787d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(ioim->iosp->abort_explicit != BFA_TRUE); 1788a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->iosp->abort_explicit = BFA_FALSE; 1789a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1790a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (bfa_ioim_send_abort(ioim)) 1791a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup); 1792a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati else { 1793a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup_qfull); 1794a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, qwait); 1795a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wait(ioim->bfa, ioim->reqq, 1796a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati &ioim->iosp->reqq_wait); 1797a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1798a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1799a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1800a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_HWFAIL: 1801a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1802a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_move_to_comp_q(ioim); 1803a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed, 1804a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim); 1805a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1806a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1807a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 1808a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(ioim->bfa, event); 1809a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1810a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1811a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 18125fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1813a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IO is being cleaned up (implicit abort), waiting for completion from 1814a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * firmware. 1815a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1816a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1817a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_cleanup(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) 1818a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1819a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, ioim->iotag); 1820a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, event); 1821a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1822a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 1823a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_COMP_GOOD: 1824a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_COMP: 1825a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_DONE: 1826a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_FREE: 1827a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1828a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1829a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_ABORT: 18305fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1831a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IO is already being aborted implicitly 1832a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1833a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->io_cbfn = __bfa_cb_ioim_abort; 1834a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1835a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1836a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_ABORT_DONE: 1837a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free); 1838a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, ioim->io_cbfn, ioim); 1839a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_notify_cleanup(ioim); 1840a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1841a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1842a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_ABORT_COMP: 1843a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1844a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, ioim->io_cbfn, ioim); 1845a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_notify_cleanup(ioim); 1846a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1847a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1848a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_COMP_UTAG: 1849a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1850a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, ioim->io_cbfn, ioim); 1851a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_notify_cleanup(ioim); 1852a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1853a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1854a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_HWFAIL: 1855a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1856a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_move_to_comp_q(ioim); 1857a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed, 1858a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim); 1859a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1860a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1861a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_CLEANUP: 18625fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1863a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IO can be in cleanup state already due to TM command. 1864a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * 2nd cleanup request comes from ITN offline event. 1865a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1866a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1867a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1868a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 1869a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(ioim->bfa, event); 1870a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1871a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1872a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 18735fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1874da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * IO is waiting for room in request CQ 1875a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1876a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1877a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_qfull(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) 1878a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1879a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, ioim->iotag); 1880a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, event); 1881a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1882a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 1883a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_QRESUME: 1884a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_active); 1885a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_send_ioreq(ioim); 1886a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1887a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1888a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_ABORT: 1889a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1890a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wcancel(&ioim->iosp->reqq_wait); 1891a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_move_to_comp_q(ioim); 1892a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort, 1893a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim); 1894a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1895a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1896a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_CLEANUP: 1897a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1898a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wcancel(&ioim->iosp->reqq_wait); 1899a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed, 1900a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim); 1901a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_notify_cleanup(ioim); 1902a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1903a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1904a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_HWFAIL: 1905a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1906a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wcancel(&ioim->iosp->reqq_wait); 1907a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_move_to_comp_q(ioim); 1908a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed, 1909a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim); 1910a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1911a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1912a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 1913a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(ioim->bfa, event); 1914a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1915a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1916a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 19175fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1918da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Active IO is being aborted, waiting for room in request CQ. 1919a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1920a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1921a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_abort_qfull(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) 1922a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1923a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, ioim->iotag); 1924a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, event); 1925a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1926a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 1927a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_QRESUME: 1928a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_abort); 1929a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_send_abort(ioim); 1930a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1931a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1932a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_CLEANUP: 1933d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(ioim->iosp->abort_explicit != BFA_TRUE); 1934a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->iosp->abort_explicit = BFA_FALSE; 1935a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup_qfull); 1936a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1937a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1938a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_COMP_GOOD: 1939a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_COMP: 1940a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1941a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wcancel(&ioim->iosp->reqq_wait); 1942a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_move_to_comp_q(ioim); 1943a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort, 1944a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim); 1945a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1946a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1947a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_DONE: 1948a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free); 1949a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wcancel(&ioim->iosp->reqq_wait); 1950a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_move_to_comp_q(ioim); 1951a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_abort, 1952a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim); 1953a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1954a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1955a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_HWFAIL: 1956a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1957a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wcancel(&ioim->iosp->reqq_wait); 1958a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_move_to_comp_q(ioim); 1959a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed, 1960a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim); 1961a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1962a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1963a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 1964a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(ioim->bfa, event); 1965a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1966a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1967a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 19685fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1969da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Active IO is being cleaned up, waiting for room in request CQ. 1970a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1971a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1972a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_cleanup_qfull(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) 1973a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1974a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, ioim->iotag); 1975a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, event); 1976a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1977a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 1978a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_QRESUME: 1979a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_cleanup); 1980a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_send_abort(ioim); 1981a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1982a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1983a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_ABORT: 19845fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1985b595076a180a56d1bb170e6eceda6eb9d76f4cd3Uwe Kleine-König * IO is already being cleaned up implicitly 1986a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1987a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->io_cbfn = __bfa_cb_ioim_abort; 1988a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1989a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1990a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_COMP_GOOD: 1991a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_COMP: 1992a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 1993a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wcancel(&ioim->iosp->reqq_wait); 1994a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, ioim->io_cbfn, ioim); 1995a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_notify_cleanup(ioim); 1996a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1997a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1998a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_DONE: 1999a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free); 2000a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wcancel(&ioim->iosp->reqq_wait); 2001a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, ioim->io_cbfn, ioim); 2002a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_notify_cleanup(ioim); 2003a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2004a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2005a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_HWFAIL: 2006a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 2007a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wcancel(&ioim->iosp->reqq_wait); 2008a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_move_to_comp_q(ioim); 2009a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, __bfa_cb_ioim_failed, 2010a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim); 2011a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2012a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2013a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 2014a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(ioim->bfa, event); 2015a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2016a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2017a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 20185fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 2019a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IO bfa callback is pending. 2020a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2021a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 2022a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_hcb(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) 2023a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2024a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 2025a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_HCB: 2026a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_uninit); 2027a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_free(ioim); 2028a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2029a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2030a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_CLEANUP: 2031a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_notify_cleanup(ioim); 2032a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2033a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2034a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_HWFAIL: 2035a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2036a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2037a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 2038a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(ioim->bfa, event); 2039a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2040a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2041a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 20425fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 2043a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IO bfa callback is pending. IO resource cannot be freed. 2044a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2045a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 2046a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_hcb_free(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) 2047a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2048a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, ioim->iotag); 2049a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, event); 2050a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2051a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 2052a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_HCB: 2053a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_resfree); 2054a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_del(&ioim->qe); 2055a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_add_tail(&ioim->qe, &ioim->fcpim->ioim_resfree_q); 2056a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2057a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2058a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_FREE: 2059a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 2060a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2061a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2062a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_CLEANUP: 2063a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_notify_cleanup(ioim); 2064a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2065a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2066a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_HWFAIL: 2067a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_hcb); 2068a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2069a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2070a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 2071a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(ioim->bfa, event); 2072a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2073a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2074a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 20755fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 2076a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IO is completed, waiting resource free from firmware. 2077a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2078a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 2079a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sm_resfree(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) 2080a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2081a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, ioim->iotag); 2082a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, event); 2083a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2084a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 2085a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_FREE: 2086a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_uninit); 2087a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_free(ioim); 2088a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2089a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2090a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_CLEANUP: 2091a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_notify_cleanup(ioim); 2092a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2093a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2094a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOIM_SM_HWFAIL: 2095a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2096a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2097a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 2098a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(ioim->bfa, event); 2099a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2100a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2101a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 210283763d591b343b07331cebe86715205230c568b1Krishna Gudipati/* 210383763d591b343b07331cebe86715205230c568b1Krishna Gudipati * This is called from bfa_fcpim_start after the bfa_init() with flash read 210483763d591b343b07331cebe86715205230c568b1Krishna Gudipati * is complete by driver. now invalidate the stale content of lun mask 210583763d591b343b07331cebe86715205230c568b1Krishna Gudipati * like unit attention, rp tag and lp tag. 210683763d591b343b07331cebe86715205230c568b1Krishna Gudipati */ 210783763d591b343b07331cebe86715205230c568b1Krishna Gudipatistatic void 210883763d591b343b07331cebe86715205230c568b1Krishna Gudipatibfa_ioim_lm_init(struct bfa_s *bfa) 210983763d591b343b07331cebe86715205230c568b1Krishna Gudipati{ 211083763d591b343b07331cebe86715205230c568b1Krishna Gudipati struct bfa_lun_mask_s *lunm_list; 211183763d591b343b07331cebe86715205230c568b1Krishna Gudipati int i; 211283763d591b343b07331cebe86715205230c568b1Krishna Gudipati 211383763d591b343b07331cebe86715205230c568b1Krishna Gudipati if (bfa_get_lun_mask_status(bfa) == BFA_LUNMASK_MINCFG) 211483763d591b343b07331cebe86715205230c568b1Krishna Gudipati return; 211583763d591b343b07331cebe86715205230c568b1Krishna Gudipati 211683763d591b343b07331cebe86715205230c568b1Krishna Gudipati lunm_list = bfa_get_lun_mask_list(bfa); 211783763d591b343b07331cebe86715205230c568b1Krishna Gudipati for (i = 0; i < MAX_LUN_MASK_CFG; i++) { 211883763d591b343b07331cebe86715205230c568b1Krishna Gudipati lunm_list[i].ua = BFA_IOIM_LM_UA_RESET; 211983763d591b343b07331cebe86715205230c568b1Krishna Gudipati lunm_list[i].lp_tag = BFA_LP_TAG_INVALID; 212083763d591b343b07331cebe86715205230c568b1Krishna Gudipati lunm_list[i].rp_tag = BFA_RPORT_TAG_INVALID; 212183763d591b343b07331cebe86715205230c568b1Krishna Gudipati } 212283763d591b343b07331cebe86715205230c568b1Krishna Gudipati} 212383763d591b343b07331cebe86715205230c568b1Krishna Gudipati 2124a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 2125a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati__bfa_cb_ioim_good_comp(void *cbarg, bfa_boolean_t complete) 2126a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2127a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioim_s *ioim = cbarg; 2128a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2129a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!complete) { 2130a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(ioim, BFA_IOIM_SM_HCB); 2131a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return; 2132a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2133a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2134a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_ioim_good_comp(ioim->bfa->bfad, ioim->dio); 2135a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2136a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2137a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 2138a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati__bfa_cb_ioim_comp(void *cbarg, bfa_boolean_t complete) 2139a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2140a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioim_s *ioim = cbarg; 2141a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfi_ioim_rsp_s *m; 2142a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u8 *snsinfo = NULL; 2143a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u8 sns_len = 0; 2144a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati s32 residue = 0; 2145a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2146a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!complete) { 2147a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(ioim, BFA_IOIM_SM_HCB); 2148a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return; 2149a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2150a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2151a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m = (struct bfi_ioim_rsp_s *) &ioim->iosp->comp_rspmsg; 2152a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (m->io_status == BFI_IOIM_STS_OK) { 21535fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2154a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * setup sense information, if present 2155a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2156a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if ((m->scsi_status == SCSI_STATUS_CHECK_CONDITION) && 2157a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m->sns_len) { 2158a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati sns_len = m->sns_len; 2159e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati snsinfo = BFA_SNSINFO_FROM_TAG(ioim->fcpim->fcp, 2160e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati ioim->iotag); 2161a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2162a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 21635fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2164a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * setup residue value correctly for normal completions 2165a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2166a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (m->resid_flags == FCP_RESID_UNDER) { 2167ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang residue = be32_to_cpu(m->residue); 2168a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, iocomp_underrun); 2169a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2170a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (m->resid_flags == FCP_RESID_OVER) { 2171ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang residue = be32_to_cpu(m->residue); 2172a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati residue = -residue; 2173a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, iocomp_overrun); 2174a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2175a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2176a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2177a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_ioim_done(ioim->bfa->bfad, ioim->dio, m->io_status, 2178a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m->scsi_status, sns_len, snsinfo, residue); 2179a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2180a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 218183763d591b343b07331cebe86715205230c568b1Krishna Gudipativoid 218283763d591b343b07331cebe86715205230c568b1Krishna Gudipatibfa_fcpim_lunmask_rp_update(struct bfa_s *bfa, wwn_t lp_wwn, wwn_t rp_wwn, 218383763d591b343b07331cebe86715205230c568b1Krishna Gudipati u16 rp_tag, u8 lp_tag) 218483763d591b343b07331cebe86715205230c568b1Krishna Gudipati{ 218583763d591b343b07331cebe86715205230c568b1Krishna Gudipati struct bfa_lun_mask_s *lun_list; 218683763d591b343b07331cebe86715205230c568b1Krishna Gudipati u8 i; 218783763d591b343b07331cebe86715205230c568b1Krishna Gudipati 218883763d591b343b07331cebe86715205230c568b1Krishna Gudipati if (bfa_get_lun_mask_status(bfa) == BFA_LUNMASK_MINCFG) 218983763d591b343b07331cebe86715205230c568b1Krishna Gudipati return; 219083763d591b343b07331cebe86715205230c568b1Krishna Gudipati 219183763d591b343b07331cebe86715205230c568b1Krishna Gudipati lun_list = bfa_get_lun_mask_list(bfa); 219283763d591b343b07331cebe86715205230c568b1Krishna Gudipati for (i = 0; i < MAX_LUN_MASK_CFG; i++) { 219383763d591b343b07331cebe86715205230c568b1Krishna Gudipati if (lun_list[i].state == BFA_IOIM_LUN_MASK_ACTIVE) { 219483763d591b343b07331cebe86715205230c568b1Krishna Gudipati if ((lun_list[i].lp_wwn == lp_wwn) && 219583763d591b343b07331cebe86715205230c568b1Krishna Gudipati (lun_list[i].rp_wwn == rp_wwn)) { 219683763d591b343b07331cebe86715205230c568b1Krishna Gudipati lun_list[i].rp_tag = rp_tag; 219783763d591b343b07331cebe86715205230c568b1Krishna Gudipati lun_list[i].lp_tag = lp_tag; 219883763d591b343b07331cebe86715205230c568b1Krishna Gudipati } 219983763d591b343b07331cebe86715205230c568b1Krishna Gudipati } 220083763d591b343b07331cebe86715205230c568b1Krishna Gudipati } 220183763d591b343b07331cebe86715205230c568b1Krishna Gudipati} 220283763d591b343b07331cebe86715205230c568b1Krishna Gudipati 22034c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati/* 22044c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati * set UA for all active luns in LM DB 22054c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati */ 22064c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatistatic void 22074c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_ioim_lm_set_ua(struct bfa_s *bfa) 22084c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati{ 22094c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati struct bfa_lun_mask_s *lunm_list; 22104c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati int i; 22114c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 22124c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lunm_list = bfa_get_lun_mask_list(bfa); 22134c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati for (i = 0; i < MAX_LUN_MASK_CFG; i++) { 22144c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati if (lunm_list[i].state != BFA_IOIM_LUN_MASK_ACTIVE) 22154c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati continue; 22164c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lunm_list[i].ua = BFA_IOIM_LM_UA_SET; 22174c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati } 22184c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati} 22194c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 22204c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_status_t 22214c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_fcpim_lunmask_update(struct bfa_s *bfa, u32 update) 22224c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati{ 22234c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati struct bfa_lunmask_cfg_s *lun_mask; 22244c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 22254c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati bfa_trc(bfa, bfa_get_lun_mask_status(bfa)); 22264c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati if (bfa_get_lun_mask_status(bfa) == BFA_LUNMASK_MINCFG) 22274c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati return BFA_STATUS_FAILED; 22284c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 22294c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati if (bfa_get_lun_mask_status(bfa) == update) 22304c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati return BFA_STATUS_NO_CHANGE; 22314c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 22324c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lun_mask = bfa_get_lun_mask(bfa); 22334c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lun_mask->status = update; 22344c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 22354c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati if (bfa_get_lun_mask_status(bfa) == BFA_LUNMASK_ENABLED) 22364c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati bfa_ioim_lm_set_ua(bfa); 22374c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 22384c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati return bfa_dconf_update(bfa); 22394c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati} 22404c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 22414c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_status_t 22424c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_fcpim_lunmask_clear(struct bfa_s *bfa) 22434c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati{ 22444c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati int i; 22454c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati struct bfa_lun_mask_s *lunm_list; 22464c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 22474c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati bfa_trc(bfa, bfa_get_lun_mask_status(bfa)); 22484c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati if (bfa_get_lun_mask_status(bfa) == BFA_LUNMASK_MINCFG) 22494c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati return BFA_STATUS_FAILED; 22504c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 22514c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lunm_list = bfa_get_lun_mask_list(bfa); 22524c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati for (i = 0; i < MAX_LUN_MASK_CFG; i++) { 22534c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati if (lunm_list[i].state == BFA_IOIM_LUN_MASK_ACTIVE) { 22544c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati if (lunm_list[i].rp_tag != BFA_RPORT_TAG_INVALID) 22554c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati bfa_rport_unset_lunmask(bfa, 22564c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati BFA_RPORT_FROM_TAG(bfa, lunm_list[i].rp_tag)); 22574c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati } 22584c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati } 22594c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 22604c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati memset(lunm_list, 0, sizeof(struct bfa_lun_mask_s) * MAX_LUN_MASK_CFG); 22614c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati return bfa_dconf_update(bfa); 22624c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati} 22634c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 22644c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_status_t 22654c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_fcpim_lunmask_query(struct bfa_s *bfa, void *buf) 22664c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati{ 22674c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati struct bfa_lunmask_cfg_s *lun_mask; 22684c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 22694c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati bfa_trc(bfa, bfa_get_lun_mask_status(bfa)); 22704c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati if (bfa_get_lun_mask_status(bfa) == BFA_LUNMASK_MINCFG) 22714c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati return BFA_STATUS_FAILED; 22724c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 22734c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lun_mask = bfa_get_lun_mask(bfa); 22744c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati memcpy(buf, lun_mask, sizeof(struct bfa_lunmask_cfg_s)); 22754c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati return BFA_STATUS_OK; 22764c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati} 22774c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 22784c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_status_t 22794c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_fcpim_lunmask_add(struct bfa_s *bfa, u16 vf_id, wwn_t *pwwn, 22804c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati wwn_t rpwwn, struct scsi_lun lun) 22814c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati{ 22824c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati struct bfa_lun_mask_s *lunm_list; 22834c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati struct bfa_rport_s *rp = NULL; 22844c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati int i, free_index = MAX_LUN_MASK_CFG + 1; 22854c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati struct bfa_fcs_lport_s *port = NULL; 22864c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati struct bfa_fcs_rport_s *rp_fcs; 22874c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 22884c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati bfa_trc(bfa, bfa_get_lun_mask_status(bfa)); 22894c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati if (bfa_get_lun_mask_status(bfa) == BFA_LUNMASK_MINCFG) 22904c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati return BFA_STATUS_FAILED; 22914c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 22924c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati port = bfa_fcs_lookup_port(&((struct bfad_s *)bfa->bfad)->bfa_fcs, 22934c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati vf_id, *pwwn); 22944c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati if (port) { 22954c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati *pwwn = port->port_cfg.pwwn; 22964c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati rp_fcs = bfa_fcs_lport_get_rport_by_pwwn(port, rpwwn); 22976bc6204e3b7f4ac235e98e362714213369d6a012Krishna Gudipati if (rp_fcs) 22986bc6204e3b7f4ac235e98e362714213369d6a012Krishna Gudipati rp = rp_fcs->bfa_rport; 22994c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati } 23004c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 23014c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lunm_list = bfa_get_lun_mask_list(bfa); 23024c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati /* if entry exists */ 23034c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati for (i = 0; i < MAX_LUN_MASK_CFG; i++) { 23044c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati if (lunm_list[i].state != BFA_IOIM_LUN_MASK_ACTIVE) 23054c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati free_index = i; 23064c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati if ((lunm_list[i].lp_wwn == *pwwn) && 23074c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati (lunm_list[i].rp_wwn == rpwwn) && 23084c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati (scsilun_to_int((struct scsi_lun *)&lunm_list[i].lun) == 23094c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati scsilun_to_int((struct scsi_lun *)&lun))) 23104c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati return BFA_STATUS_ENTRY_EXISTS; 23114c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati } 23124c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 23134c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati if (free_index > MAX_LUN_MASK_CFG) 23144c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati return BFA_STATUS_MAX_ENTRY_REACHED; 23154c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 23164c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati if (rp) { 23174c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lunm_list[free_index].lp_tag = bfa_lps_get_tag_from_pid(bfa, 23184c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati rp->rport_info.local_pid); 23194c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lunm_list[free_index].rp_tag = rp->rport_tag; 23204c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati } else { 23214c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lunm_list[free_index].lp_tag = BFA_LP_TAG_INVALID; 23224c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lunm_list[free_index].rp_tag = BFA_RPORT_TAG_INVALID; 23234c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati } 23244c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 23254c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lunm_list[free_index].lp_wwn = *pwwn; 23264c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lunm_list[free_index].rp_wwn = rpwwn; 23274c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lunm_list[free_index].lun = lun; 23284c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lunm_list[free_index].state = BFA_IOIM_LUN_MASK_ACTIVE; 23294c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 23304c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati /* set for all luns in this rp */ 23314c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati for (i = 0; i < MAX_LUN_MASK_CFG; i++) { 23324c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati if ((lunm_list[i].lp_wwn == *pwwn) && 23334c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati (lunm_list[i].rp_wwn == rpwwn)) 23344c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lunm_list[i].ua = BFA_IOIM_LM_UA_SET; 23354c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati } 23364c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 23374c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati return bfa_dconf_update(bfa); 23384c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati} 23394c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 23404c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_status_t 23414c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfa_fcpim_lunmask_delete(struct bfa_s *bfa, u16 vf_id, wwn_t *pwwn, 23424c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati wwn_t rpwwn, struct scsi_lun lun) 23434c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati{ 23444c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati struct bfa_lun_mask_s *lunm_list; 23454c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati struct bfa_rport_s *rp = NULL; 23464c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati struct bfa_fcs_lport_s *port = NULL; 23474c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati struct bfa_fcs_rport_s *rp_fcs; 23484c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati int i; 23494c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 23504c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati /* in min cfg lunm_list could be NULL but no commands should run. */ 23514c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati if (bfa_get_lun_mask_status(bfa) == BFA_LUNMASK_MINCFG) 23524c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati return BFA_STATUS_FAILED; 23534c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 23544c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati bfa_trc(bfa, bfa_get_lun_mask_status(bfa)); 23554c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati bfa_trc(bfa, *pwwn); 23564c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati bfa_trc(bfa, rpwwn); 23574c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati bfa_trc(bfa, scsilun_to_int((struct scsi_lun *)&lun)); 23584c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 23594c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati if (*pwwn == 0) { 23604c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati port = bfa_fcs_lookup_port( 23614c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati &((struct bfad_s *)bfa->bfad)->bfa_fcs, 23624c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati vf_id, *pwwn); 23634c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati if (port) { 23644c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati *pwwn = port->port_cfg.pwwn; 23654c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati rp_fcs = bfa_fcs_lport_get_rport_by_pwwn(port, rpwwn); 23666bc6204e3b7f4ac235e98e362714213369d6a012Krishna Gudipati if (rp_fcs) 23676bc6204e3b7f4ac235e98e362714213369d6a012Krishna Gudipati rp = rp_fcs->bfa_rport; 23684c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati } 23694c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati } 23704c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 23714c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lunm_list = bfa_get_lun_mask_list(bfa); 23724c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati for (i = 0; i < MAX_LUN_MASK_CFG; i++) { 23734c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati if ((lunm_list[i].lp_wwn == *pwwn) && 23744c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati (lunm_list[i].rp_wwn == rpwwn) && 23754c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati (scsilun_to_int((struct scsi_lun *)&lunm_list[i].lun) == 23764c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati scsilun_to_int((struct scsi_lun *)&lun))) { 23774c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lunm_list[i].lp_wwn = 0; 23784c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lunm_list[i].rp_wwn = 0; 23794c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati int_to_scsilun(0, &lunm_list[i].lun); 23804c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lunm_list[i].state = BFA_IOIM_LUN_MASK_INACTIVE; 23814c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati if (lunm_list[i].rp_tag != BFA_RPORT_TAG_INVALID) { 23824c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lunm_list[i].rp_tag = BFA_RPORT_TAG_INVALID; 23834c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lunm_list[i].lp_tag = BFA_LP_TAG_INVALID; 23844c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati } 23854c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati return bfa_dconf_update(bfa); 23864c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati } 23874c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati } 23884c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 23894c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati /* set for all luns in this rp */ 23904c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati for (i = 0; i < MAX_LUN_MASK_CFG; i++) { 23914c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati if ((lunm_list[i].lp_wwn == *pwwn) && 23924c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati (lunm_list[i].rp_wwn == rpwwn)) 23934c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati lunm_list[i].ua = BFA_IOIM_LM_UA_SET; 23944c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati } 23954c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 23964c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati return BFA_STATUS_ENTRY_NOT_EXISTS; 23974c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati} 23984c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati 239983763d591b343b07331cebe86715205230c568b1Krishna Gudipatistatic void 2400a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati__bfa_cb_ioim_failed(void *cbarg, bfa_boolean_t complete) 2401a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2402a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioim_s *ioim = cbarg; 2403a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2404a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!complete) { 2405a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(ioim, BFA_IOIM_SM_HCB); 2406a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return; 2407a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2408a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2409a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_ioim_done(ioim->bfa->bfad, ioim->dio, BFI_IOIM_STS_ABORTED, 2410a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 0, 0, NULL, 0); 2411a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2412a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2413a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 2414a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati__bfa_cb_ioim_pathtov(void *cbarg, bfa_boolean_t complete) 2415a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2416a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioim_s *ioim = cbarg; 2417a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2418a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, path_tov_expired); 2419a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!complete) { 2420a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(ioim, BFA_IOIM_SM_HCB); 2421a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return; 2422a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2423a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2424a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_ioim_done(ioim->bfa->bfad, ioim->dio, BFI_IOIM_STS_PATHTOV, 2425a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 0, 0, NULL, 0); 2426a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2427a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2428a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 2429a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati__bfa_cb_ioim_abort(void *cbarg, bfa_boolean_t complete) 2430a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2431a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioim_s *ioim = cbarg; 2432a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2433a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!complete) { 2434a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(ioim, BFA_IOIM_SM_HCB); 2435a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return; 2436a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2437a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2438a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_ioim_abort(ioim->bfa->bfad, ioim->dio); 2439a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2440a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2441a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 2442a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_sgpg_alloced(void *cbarg) 2443a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2444a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioim_s *ioim = cbarg; 2445a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2446a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->nsgpgs = BFA_SGPG_NPAGE(ioim->nsges); 2447a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_splice_tail_init(&ioim->iosp->sgpg_wqe.sgpg_q, &ioim->sgpg_q); 2448e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang ioim->sgpg = bfa_q_first(&ioim->sgpg_q); 2449a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(ioim, BFA_IOIM_SM_SGALLOCED); 2450a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2451a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 24525fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 2453a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Send I/O request to firmware. 2454a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2455a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t 2456a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_send_ioreq(struct bfa_ioim_s *ioim) 2457a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2458a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_itnim_s *itnim = ioim->itnim; 2459a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfi_ioim_req_s *m; 2460da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang static struct fcp_cmnd_s cmnd_z0 = { { { 0 } } }; 2461e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang struct bfi_sge_s *sge, *sgpge; 2462a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 pgdlen = 0; 2463a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 fcp_dl; 2464a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u64 addr; 2465a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct scatterlist *sg; 2466e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang struct bfa_sgpg_s *sgpg; 2467a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct scsi_cmnd *cmnd = (struct scsi_cmnd *) ioim->dio; 2468e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang u32 i, sge_id, pgcumsz; 2469f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang enum dma_data_direction dmadir; 2470a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 24715fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2472a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * check for room in queue to send request now 2473a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2474a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m = bfa_reqq_next(ioim->bfa, ioim->reqq); 2475a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!m) { 2476a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, qwait); 2477a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wait(ioim->bfa, ioim->reqq, 2478a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati &ioim->iosp->reqq_wait); 2479a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_FALSE; 2480a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2481a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 24825fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2483a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * build i/o request message next 2484a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2485ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang m->io_tag = cpu_to_be16(ioim->iotag); 2486a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m->rport_hdl = ioim->itnim->rport->fw_handle; 2487f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang m->io_timeout = 0; 2488a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2489a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati sge = &m->sges[0]; 2490e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sgpg = ioim->sgpg; 2491e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sge_id = 0; 2492e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sgpge = NULL; 2493e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang pgcumsz = 0; 2494e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang scsi_for_each_sg(cmnd, sg, ioim->nsges, i) { 2495e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang if (i == 0) { 2496e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang /* build inline IO SG element */ 2497f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang addr = bfa_sgaddr_le(sg_dma_address(sg)); 2498e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sge->sga = *(union bfi_addr_u *) &addr; 2499e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang pgdlen = sg_dma_len(sg); 2500e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sge->sg_len = pgdlen; 2501e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sge->flags = (ioim->nsges > BFI_SGE_INLINE) ? 2502a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFI_SGE_DATA_CPL : BFI_SGE_DATA_LAST; 2503e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang bfa_sge_to_be(sge); 2504e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sge++; 2505e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang } else { 2506e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang if (sge_id == 0) 2507e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sgpge = sgpg->sgpg->sges; 2508e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang 2509f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang addr = bfa_sgaddr_le(sg_dma_address(sg)); 2510e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sgpge->sga = *(union bfi_addr_u *) &addr; 2511e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sgpge->sg_len = sg_dma_len(sg); 2512e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang pgcumsz += sgpge->sg_len; 2513e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang 2514e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang /* set flags */ 2515e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang if (i < (ioim->nsges - 1) && 2516e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sge_id < (BFI_SGPG_DATA_SGES - 1)) 2517e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sgpge->flags = BFI_SGE_DATA; 2518e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang else if (i < (ioim->nsges - 1)) 2519e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sgpge->flags = BFI_SGE_DATA_CPL; 2520e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang else 2521e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sgpge->flags = BFI_SGE_DATA_LAST; 2522e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang 2523e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang bfa_sge_to_le(sgpge); 2524e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang 2525e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sgpge++; 2526e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang if (i == (ioim->nsges - 1)) { 2527e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sgpge->flags = BFI_SGE_PGDLEN; 2528e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sgpge->sga.a32.addr_lo = 0; 2529e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sgpge->sga.a32.addr_hi = 0; 2530e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sgpge->sg_len = pgcumsz; 2531e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang bfa_sge_to_le(sgpge); 2532e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang } else if (++sge_id == BFI_SGPG_DATA_SGES) { 2533e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sgpg = (struct bfa_sgpg_s *) bfa_q_next(sgpg); 2534e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sgpge->flags = BFI_SGE_LINK; 2535e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sgpge->sga = sgpg->sgpg_pa; 2536e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sgpge->sg_len = pgcumsz; 2537e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang bfa_sge_to_le(sgpge); 2538e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang sge_id = 0; 2539e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang pgcumsz = 0; 2540e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang } 2541e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang } 2542a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2543a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2544a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (ioim->nsges > BFI_SGE_INLINE) { 2545a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati sge->sga = ioim->sgpg->sgpg_pa; 2546a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } else { 2547a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati sge->sga.a32.addr_lo = 0; 2548a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati sge->sga.a32.addr_hi = 0; 2549a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2550a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati sge->sg_len = pgdlen; 2551a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati sge->flags = BFI_SGE_PGDLEN; 2552a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sge_to_be(sge); 2553a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 25545fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2555a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * set up I/O command parameters 2556a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 25576a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang m->cmnd = cmnd_z0; 2558f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang int_to_scsilun(cmnd->device->lun, &m->cmnd.lun); 2559f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang dmadir = cmnd->sc_data_direction; 2560f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang if (dmadir == DMA_TO_DEVICE) 2561f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang m->cmnd.iodir = FCP_IODIR_WRITE; 2562f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang else if (dmadir == DMA_FROM_DEVICE) 2563f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang m->cmnd.iodir = FCP_IODIR_READ; 2564f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang else 2565f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang m->cmnd.iodir = FCP_IODIR_NONE; 2566f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang 25678f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang m->cmnd.cdb = *(struct scsi_cdb_s *) cmnd->cmnd; 2568f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang fcp_dl = scsi_bufflen(cmnd); 2569ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang m->cmnd.fcp_dl = cpu_to_be32(fcp_dl); 2570a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 25715fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2572a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * set up I/O message header 2573a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2574a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (m->cmnd.iodir) { 2575a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case FCP_IODIR_READ: 25763fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati bfi_h2i_set(m->mh, BFI_MC_IOIM_READ, 0, bfa_fn_lpu(ioim->bfa)); 2577a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(itnim, input_reqs); 2578a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->itnim->stats.rd_throughput += fcp_dl; 2579a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2580a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case FCP_IODIR_WRITE: 25813fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati bfi_h2i_set(m->mh, BFI_MC_IOIM_WRITE, 0, bfa_fn_lpu(ioim->bfa)); 2582a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(itnim, output_reqs); 2583a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->itnim->stats.wr_throughput += fcp_dl; 2584a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2585a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case FCP_IODIR_RW: 2586a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(itnim, input_reqs); 2587a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(itnim, output_reqs); 2588a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 25893fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati bfi_h2i_set(m->mh, BFI_MC_IOIM_IO, 0, bfa_fn_lpu(ioim->bfa)); 2590a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2591a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (itnim->seq_rec || 2592f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang (scsi_bufflen(cmnd) & (sizeof(u32) - 1))) 25933fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati bfi_h2i_set(m->mh, BFI_MC_IOIM_IO, 0, bfa_fn_lpu(ioim->bfa)); 2594a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 25955fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2596a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * queue I/O message to firmware 2597a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 25983fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati bfa_reqq_produce(ioim->bfa, ioim->reqq, m->mh); 2599a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_TRUE; 2600a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2601a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 26025fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 2603a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Setup any additional SG pages needed.Inline SG element is setup 2604a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * at queuing time. 2605a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2606a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t 2607e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhangbfa_ioim_sgpg_alloc(struct bfa_ioim_s *ioim) 2608a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2609a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u16 nsgpgs; 2610a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2611d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(ioim->nsges <= BFI_SGE_INLINE); 2612a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 26135fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2614a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * allocate SG pages needed 2615a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2616a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati nsgpgs = BFA_SGPG_NPAGE(ioim->nsges); 2617a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!nsgpgs) 2618a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_TRUE; 2619a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2620a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (bfa_sgpg_malloc(ioim->bfa, &ioim->sgpg_q, nsgpgs) 2621a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati != BFA_STATUS_OK) { 2622a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sgpg_wait(ioim->bfa, &ioim->iosp->sgpg_wqe, nsgpgs); 2623a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_FALSE; 2624a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2625a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2626a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->nsgpgs = nsgpgs; 2627e3e7d3eebb08735c8a14cd27f76dac784e9a9b75Maggie Zhang ioim->sgpg = bfa_q_first(&ioim->sgpg_q); 2628a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2629a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_TRUE; 2630a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2631a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 26325fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 2633a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Send I/O abort request to firmware. 2634a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2635a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t 2636a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_send_abort(struct bfa_ioim_s *ioim) 2637a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2638a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfi_ioim_abort_req_s *m; 2639a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfi_ioim_h2i msgop; 2640a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 26415fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2642a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * check for room in queue to send request now 2643a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2644a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m = bfa_reqq_next(ioim->bfa, ioim->reqq); 2645a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!m) 2646a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_FALSE; 2647a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 26485fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2649a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * build i/o request message next 2650a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2651a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (ioim->iosp->abort_explicit) 2652a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati msgop = BFI_IOIM_H2I_IOABORT_REQ; 2653a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati else 2654a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati msgop = BFI_IOIM_H2I_IOCLEANUP_REQ; 2655a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 26563fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati bfi_h2i_set(m->mh, BFI_MC_IOIM, msgop, bfa_fn_lpu(ioim->bfa)); 2657ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang m->io_tag = cpu_to_be16(ioim->iotag); 2658a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m->abort_tag = ++ioim->abort_tag; 2659a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 26605fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2661a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * queue I/O message to firmware 2662a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 26633fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati bfa_reqq_produce(ioim->bfa, ioim->reqq, m->mh); 2664a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_TRUE; 2665a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2666a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 26675fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 2668a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Call to resume any I/O requests waiting for room in request queue. 2669a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2670a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 2671a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_qresume(void *cbarg) 2672a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2673a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioim_s *ioim = cbarg; 2674a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2675a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, qresumes); 2676a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(ioim, BFA_IOIM_SM_QRESUME); 2677a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2678a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2679a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2680a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 2681a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_notify_cleanup(struct bfa_ioim_s *ioim) 2682a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 26835fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2684a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Move IO from itnim queue to fcpim global queue since itnim will be 2685a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * freed. 2686a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2687a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_del(&ioim->qe); 2688a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_add_tail(&ioim->qe, &ioim->fcpim->ioim_comp_q); 2689a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2690a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!ioim->iosp->tskim) { 2691a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (ioim->fcpim->delay_comp && ioim->itnim->iotov_active) { 2692a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_dequeue(&ioim->hcb_qe); 2693a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_del(&ioim->qe); 2694a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_add_tail(&ioim->qe, &ioim->itnim->delay_comp_q); 2695a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2696a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_itnim_iodone(ioim->itnim); 2697a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } else 2698f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_wc_down(&ioim->iosp->tskim->wc); 2699a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2700a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2701a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t 2702a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_is_abortable(struct bfa_ioim_s *ioim) 2703a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2704a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if ((bfa_sm_cmp_state(ioim, bfa_ioim_sm_uninit) && 2705a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (!bfa_q_is_on_q(&ioim->itnim->pending_q, ioim))) || 2706a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (bfa_sm_cmp_state(ioim, bfa_ioim_sm_abort)) || 2707a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (bfa_sm_cmp_state(ioim, bfa_ioim_sm_abort_qfull)) || 2708a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (bfa_sm_cmp_state(ioim, bfa_ioim_sm_hcb)) || 2709a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (bfa_sm_cmp_state(ioim, bfa_ioim_sm_hcb_free)) || 2710a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (bfa_sm_cmp_state(ioim, bfa_ioim_sm_resfree))) 2711a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_FALSE; 2712a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2713a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_TRUE; 2714a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2715a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2716a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 2717a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_delayed_comp(struct bfa_ioim_s *ioim, bfa_boolean_t iotov) 2718a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 27195fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2720a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * If path tov timer expired, failback with PATHTOV status - these 2721a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IO requests are not normally retried by IO stack. 2722a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * 2723a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Otherwise device cameback online and fail it with normal failed 2724a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * status so that IO stack retries these failed IO requests. 2725a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2726a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (iotov) 2727a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->io_cbfn = __bfa_cb_ioim_pathtov; 2728a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati else { 2729a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->io_cbfn = __bfa_cb_ioim_failed; 2730a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, iocom_nexus_abort); 2731a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2732a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, ioim->io_cbfn, ioim); 2733a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 27345fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2735a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Move IO to fcpim global queue since itnim will be 2736a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * freed. 2737a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2738a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_del(&ioim->qe); 2739a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_add_tail(&ioim->qe, &ioim->fcpim->ioim_comp_q); 2740a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2741a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2742a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 27435fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 2744a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Memory allocation and initialization. 2745a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2746a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 27474507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipatibfa_ioim_attach(struct bfa_fcpim_s *fcpim) 2748a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2749a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioim_s *ioim; 27504507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati struct bfa_fcp_mod_s *fcp = fcpim->fcp; 2751a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioim_sp_s *iosp; 2752a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u16 i; 2753a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 27545fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2755a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * claim memory first 2756a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 27574507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati ioim = (struct bfa_ioim_s *) bfa_mem_kva_curp(fcp); 2758a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fcpim->ioim_arr = ioim; 27594507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati bfa_mem_kva_curp(fcp) = (u8 *) (ioim + fcpim->fcp->num_ioim_reqs); 2760a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 27614507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati iosp = (struct bfa_ioim_sp_s *) bfa_mem_kva_curp(fcp); 2762a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fcpim->ioim_sp_arr = iosp; 27634507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati bfa_mem_kva_curp(fcp) = (u8 *) (iosp + fcpim->fcp->num_ioim_reqs); 2764a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 27655fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2766a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Initialize ioim free queues 2767a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2768a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati INIT_LIST_HEAD(&fcpim->ioim_resfree_q); 2769a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati INIT_LIST_HEAD(&fcpim->ioim_comp_q); 2770a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2771e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati for (i = 0; i < fcpim->fcp->num_ioim_reqs; 2772e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati i++, ioim++, iosp++) { 2773a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati /* 2774a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * initialize IOIM 2775a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 27766a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(ioim, 0, sizeof(struct bfa_ioim_s)); 2777a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->iotag = i; 2778a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->bfa = fcpim->bfa; 2779a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->fcpim = fcpim; 2780a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->iosp = iosp; 2781a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati INIT_LIST_HEAD(&ioim->sgpg_q); 2782a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_winit(&ioim->iosp->reqq_wait, 2783a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_qresume, ioim); 2784a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sgpg_winit(&ioim->iosp->sgpg_wqe, 2785a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_sgpg_alloced, ioim); 2786a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(ioim, bfa_ioim_sm_uninit); 2787a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2788a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2789a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2790a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 2791a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_isr(struct bfa_s *bfa, struct bfi_msg_s *m) 2792a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2793e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa); 2794a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfi_ioim_rsp_s *rsp = (struct bfi_ioim_rsp_s *) m; 2795a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioim_s *ioim; 2796a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u16 iotag; 2797a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_ioim_event evt = BFA_IOIM_SM_COMP; 2798a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2799ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang iotag = be16_to_cpu(rsp->io_tag); 2800a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2801a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim = BFA_IOIM_FROM_TAG(fcpim, iotag); 2802d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(ioim->iotag != iotag); 2803a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2804a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, ioim->iotag); 2805a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, rsp->io_status); 2806a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, rsp->reuse_io_tag); 2807a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2808a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (bfa_sm_cmp_state(ioim, bfa_ioim_sm_active)) 28096a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang ioim->iosp->comp_rspmsg = *m; 2810a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2811a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (rsp->io_status) { 2812a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFI_IOIM_STS_OK: 2813a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, iocomp_ok); 2814a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (rsp->reuse_io_tag == 0) 2815a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati evt = BFA_IOIM_SM_DONE; 2816a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati else 2817a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati evt = BFA_IOIM_SM_COMP; 2818a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2819a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2820a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFI_IOIM_STS_TIMEDOUT: 2821a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, iocomp_timedout); 2822a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFI_IOIM_STS_ABORTED: 2823a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati rsp->io_status = BFI_IOIM_STS_ABORTED; 2824a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, iocomp_aborted); 2825a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (rsp->reuse_io_tag == 0) 2826a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati evt = BFA_IOIM_SM_DONE; 2827a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati else 2828a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati evt = BFA_IOIM_SM_COMP; 2829a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2830a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2831a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFI_IOIM_STS_PROTO_ERR: 2832a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, iocom_proto_err); 2833d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(!rsp->reuse_io_tag); 2834a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati evt = BFA_IOIM_SM_COMP; 2835a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2836a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2837a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFI_IOIM_STS_SQER_NEEDED: 2838a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, iocom_sqer_needed); 2839d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(rsp->reuse_io_tag != 0); 2840a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati evt = BFA_IOIM_SM_SQRETRY; 2841a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2842a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2843a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFI_IOIM_STS_RES_FREE: 2844a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, iocom_res_free); 2845a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati evt = BFA_IOIM_SM_FREE; 2846a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2847a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2848a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFI_IOIM_STS_HOST_ABORTED: 2849a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, iocom_hostabrts); 2850a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (rsp->abort_tag != ioim->abort_tag) { 2851a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, rsp->abort_tag); 2852a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, ioim->abort_tag); 2853a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return; 2854a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2855a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2856a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (rsp->reuse_io_tag) 2857a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati evt = BFA_IOIM_SM_ABORT_COMP; 2858a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati else 2859a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati evt = BFA_IOIM_SM_ABORT_DONE; 2860a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2861a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2862a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFI_IOIM_STS_UTAG: 2863a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, iocom_utags); 2864a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati evt = BFA_IOIM_SM_COMP_UTAG; 2865a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2866a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2867a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 2868d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(1); 2869a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2870a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2871a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(ioim, evt); 2872a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2873a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2874a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 2875a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_good_comp_isr(struct bfa_s *bfa, struct bfi_msg_s *m) 2876a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2877e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa); 2878a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfi_ioim_rsp_s *rsp = (struct bfi_ioim_rsp_s *) m; 2879a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioim_s *ioim; 2880a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u16 iotag; 2881a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2882ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang iotag = be16_to_cpu(rsp->io_tag); 2883a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2884a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim = BFA_IOIM_FROM_TAG(fcpim, iotag); 28851287641e945de1bf533178c2e0e31eed287b4a60Vijaya Mohan Guvva WARN_ON(ioim->iotag != iotag); 2886a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2887a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_cb_profile_comp(fcpim, ioim); 288883763d591b343b07331cebe86715205230c568b1Krishna Gudipati 28898ca2dd87e7f29df99389e9dc41f7a45a35223672Krishna Gudipati bfa_sm_send_event(ioim, BFA_IOIM_SM_COMP_GOOD); 2890a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2891a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 28925fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 2893a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Called by itnim to clean up IO while going offline. 2894a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2895a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 2896a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_cleanup(struct bfa_ioim_s *ioim) 2897a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2898a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, ioim->iotag); 2899a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, io_cleanups); 2900a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2901a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->iosp->tskim = NULL; 2902a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(ioim, BFA_IOIM_SM_CLEANUP); 2903a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2904a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2905a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 2906a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_cleanup_tm(struct bfa_ioim_s *ioim, struct bfa_tskim_s *tskim) 2907a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2908a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, ioim->iotag); 2909a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, io_tmaborts); 2910a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2911a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->iosp->tskim = tskim; 2912a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(ioim, BFA_IOIM_SM_CLEANUP); 2913a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2914a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 29155fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 2916a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC failure handling. 2917a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2918a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 2919a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_iocdisable(struct bfa_ioim_s *ioim) 2920a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2921a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, ioim->iotag); 2922a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, io_iocdowns); 2923a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(ioim, BFA_IOIM_SM_HWFAIL); 2924a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2925a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 29265fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 2927a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IO offline TOV popped. Fail the pending IO. 2928a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2929a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 2930a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_tov(struct bfa_ioim_s *ioim) 2931a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2932a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, ioim->iotag); 2933a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(ioim, BFA_IOIM_SM_IOTOV); 2934a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2935a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2936a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 29375fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 2938a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Allocate IOIM resource for initiator mode I/O request. 2939a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2940a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistruct bfa_ioim_s * 2941a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_alloc(struct bfa_s *bfa, struct bfad_ioim_s *dio, 2942a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_itnim_s *itnim, u16 nsges) 2943a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2944e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa); 2945a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioim_s *ioim; 2946e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_iotag_s *iotag = NULL; 2947a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 29485fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2949a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * alocate IOIM resource 2950a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2951e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati bfa_q_deq(&fcpim->fcp->iotag_ioim_free_q, &iotag); 2952e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati if (!iotag) { 2953a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(itnim, no_iotags); 2954a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return NULL; 2955a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2956a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2957e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati ioim = BFA_IOIM_FROM_TAG(fcpim, iotag->tag); 2958e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 2959a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->dio = dio; 2960a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->itnim = itnim; 2961a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->nsges = nsges; 2962a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->nsgpgs = 0; 2963a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2964a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(itnim, total_ios); 2965a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fcpim->ios_active++; 2966a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2967a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_add_tail(&ioim->qe, &itnim->io_q); 2968a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2969a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return ioim; 2970a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2971a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2972a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 2973a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_free(struct bfa_ioim_s *ioim) 2974a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2975e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_fcpim_s *fcpim = ioim->fcpim; 2976e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_iotag_s *iotag; 2977a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2978a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (ioim->nsgpgs > 0) 2979a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sgpg_mfree(ioim->bfa, &ioim->sgpg_q, ioim->nsgpgs); 2980a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2981a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, io_comps); 2982a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fcpim->ios_active--; 2983a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 298415821f05b78dbeb2f897d1d22576449103a4d8d5Krishna Gudipati ioim->iotag &= BFA_IOIM_IOTAG_MASK; 2985e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 2986e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati WARN_ON(!(ioim->iotag < 2987e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati (fcpim->fcp->num_ioim_reqs + fcpim->fcp->num_fwtio_reqs))); 2988e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati iotag = BFA_IOTAG_FROM_TAG(fcpim->fcp, ioim->iotag); 2989e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 2990e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati if (ioim->iotag < fcpim->fcp->num_ioim_reqs) 2991e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati list_add_tail(&iotag->qe, &fcpim->fcp->iotag_ioim_free_q); 2992e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati else 2993e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati list_add_tail(&iotag->qe, &fcpim->fcp->iotag_tio_free_q); 2994e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 2995a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_del(&ioim->qe); 2996a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2997a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2998a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 2999a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_start(struct bfa_ioim_s *ioim) 3000a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 3001a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_cb_profile_start(ioim->fcpim, ioim); 3002a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 30035fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 3004a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Obtain the queue over which this request has to be issued 3005a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3006a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim->reqq = bfa_fcpim_ioredirect_enabled(ioim->bfa) ? 3007f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang BFA_FALSE : bfa_itnim_get_reqq(ioim); 3008a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3009a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(ioim, BFA_IOIM_SM_START); 3010a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3011a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 30125fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3013a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Driver I/O abort request. 3014a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3015a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_status_t 3016a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioim_abort(struct bfa_ioim_s *ioim) 3017a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 3018a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3019a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioim->bfa, ioim->iotag); 3020a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3021a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!bfa_ioim_is_abortable(ioim)) 3022a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_STATUS_FAILED; 3023a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3024a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(ioim->itnim, io_aborts); 3025a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(ioim, BFA_IOIM_SM_ABORT); 3026a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3027a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_STATUS_OK; 3028a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3029a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 30305fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3031a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * BFA TSKIM state machine functions 3032a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3033a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 30345fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3035da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Task management command beginning state. 3036a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3037a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 3038a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_sm_uninit(struct bfa_tskim_s *tskim, enum bfa_tskim_event event) 3039a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 30401306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati bfa_trc(tskim->bfa, tskim->tsk_tag << 16 | event); 3041a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3042a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 3043a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_TSKIM_SM_START: 3044a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(tskim, bfa_tskim_sm_active); 3045a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_gather_ios(tskim); 3046a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 30475fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 3048a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * If device is offline, do not send TM on wire. Just cleanup 3049a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * any pending IO requests and complete TM request. 3050a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3051a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!bfa_itnim_is_online(tskim->itnim)) { 3052a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(tskim, bfa_tskim_sm_iocleanup); 3053a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati tskim->tsk_status = BFI_TSKIM_STS_OK; 3054a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_cleanup_ios(tskim); 3055a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return; 3056a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3057a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3058a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!bfa_tskim_send(tskim)) { 3059a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(tskim, bfa_tskim_sm_qfull); 3060a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(tskim->itnim, tm_qwait); 3061a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wait(tskim->bfa, tskim->itnim->reqq, 3062a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati &tskim->reqq_wait); 3063a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3064a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 3065a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3066a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 3067a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(tskim->bfa, event); 3068a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3069a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3070a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 30715fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3072da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * TM command is active, awaiting completion from firmware to 3073da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * cleanup IO requests in TM scope. 3074a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3075a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 3076a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_sm_active(struct bfa_tskim_s *tskim, enum bfa_tskim_event event) 3077a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 30781306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati bfa_trc(tskim->bfa, tskim->tsk_tag << 16 | event); 3079a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3080a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 3081a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_TSKIM_SM_DONE: 3082a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(tskim, bfa_tskim_sm_iocleanup); 3083a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_cleanup_ios(tskim); 3084a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 3085a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3086a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_TSKIM_SM_CLEANUP: 3087a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(tskim, bfa_tskim_sm_cleanup); 3088a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!bfa_tskim_send_abort(tskim)) { 3089a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(tskim, bfa_tskim_sm_cleanup_qfull); 3090a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(tskim->itnim, tm_qwait); 3091a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wait(tskim->bfa, tskim->itnim->reqq, 3092a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati &tskim->reqq_wait); 3093a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3094a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 3095a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3096a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_TSKIM_SM_HWFAIL: 3097a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(tskim, bfa_tskim_sm_hcb); 3098a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_iocdisable_ios(tskim); 3099a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_qcomp(tskim, __bfa_cb_tskim_failed); 3100a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 3101a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3102a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 3103a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(tskim->bfa, event); 3104a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3105a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3106a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 31075fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3108da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * An active TM is being cleaned up since ITN is offline. Awaiting cleanup 3109da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * completion event from firmware. 3110a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3111a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 3112a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_sm_cleanup(struct bfa_tskim_s *tskim, enum bfa_tskim_event event) 3113a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 31141306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati bfa_trc(tskim->bfa, tskim->tsk_tag << 16 | event); 3115a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3116a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 3117a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_TSKIM_SM_DONE: 31185fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 3119a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Ignore and wait for ABORT completion from firmware. 3120a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3121a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 3122a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 31231306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati case BFA_TSKIM_SM_UTAG: 3124a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_TSKIM_SM_CLEANUP_DONE: 3125a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(tskim, bfa_tskim_sm_iocleanup); 3126a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_cleanup_ios(tskim); 3127a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 3128a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3129a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_TSKIM_SM_HWFAIL: 3130a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(tskim, bfa_tskim_sm_hcb); 3131a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_iocdisable_ios(tskim); 3132a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_qcomp(tskim, __bfa_cb_tskim_failed); 3133a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 3134a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3135a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 3136a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(tskim->bfa, event); 3137a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3138a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3139a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3140a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 3141a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_sm_iocleanup(struct bfa_tskim_s *tskim, enum bfa_tskim_event event) 3142a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 31431306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati bfa_trc(tskim->bfa, tskim->tsk_tag << 16 | event); 3144a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3145a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 3146a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_TSKIM_SM_IOS_DONE: 3147a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(tskim, bfa_tskim_sm_hcb); 3148a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_qcomp(tskim, __bfa_cb_tskim_done); 3149a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 3150a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3151a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_TSKIM_SM_CLEANUP: 31525fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 3153a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Ignore, TM command completed on wire. 3154a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Notify TM conmpletion on IO cleanup completion. 3155a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3156a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 3157a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3158a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_TSKIM_SM_HWFAIL: 3159a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(tskim, bfa_tskim_sm_hcb); 3160a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_iocdisable_ios(tskim); 3161a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_qcomp(tskim, __bfa_cb_tskim_failed); 3162a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 3163a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3164a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 3165a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(tskim->bfa, event); 3166a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3167a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3168a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 31695fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3170da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Task management command is waiting for room in request CQ 3171a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3172a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 3173a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_sm_qfull(struct bfa_tskim_s *tskim, enum bfa_tskim_event event) 3174a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 31751306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati bfa_trc(tskim->bfa, tskim->tsk_tag << 16 | event); 3176a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3177a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 3178a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_TSKIM_SM_QRESUME: 3179a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(tskim, bfa_tskim_sm_active); 3180a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_send(tskim); 3181a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 3182a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3183a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_TSKIM_SM_CLEANUP: 31845fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 3185a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * No need to send TM on wire since ITN is offline. 3186a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3187a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(tskim, bfa_tskim_sm_iocleanup); 3188a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wcancel(&tskim->reqq_wait); 3189a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_cleanup_ios(tskim); 3190a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 3191a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3192a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_TSKIM_SM_HWFAIL: 3193a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(tskim, bfa_tskim_sm_hcb); 3194a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wcancel(&tskim->reqq_wait); 3195a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_iocdisable_ios(tskim); 3196a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_qcomp(tskim, __bfa_cb_tskim_failed); 3197a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 3198a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3199a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 3200a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(tskim->bfa, event); 3201a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3202a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3203a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 32045fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3205da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Task management command is active, awaiting for room in request CQ 3206da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * to send clean up request. 3207a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3208a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 3209a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_sm_cleanup_qfull(struct bfa_tskim_s *tskim, 3210a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_tskim_event event) 3211a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 32121306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati bfa_trc(tskim->bfa, tskim->tsk_tag << 16 | event); 3213a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3214a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 3215a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_TSKIM_SM_DONE: 3216a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wcancel(&tskim->reqq_wait); 32175fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 3218a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Fall through !!! 3219a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3220a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_TSKIM_SM_QRESUME: 3221a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(tskim, bfa_tskim_sm_cleanup); 3222a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_send_abort(tskim); 3223a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 3224a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3225a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_TSKIM_SM_HWFAIL: 3226a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(tskim, bfa_tskim_sm_hcb); 3227a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_wcancel(&tskim->reqq_wait); 3228a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_iocdisable_ios(tskim); 3229a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_qcomp(tskim, __bfa_cb_tskim_failed); 3230a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 3231a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3232a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 3233a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(tskim->bfa, event); 3234a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3235a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3236a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 32375fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3238da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * BFA callback is pending 3239a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3240a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 3241a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_sm_hcb(struct bfa_tskim_s *tskim, enum bfa_tskim_event event) 3242a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 32431306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati bfa_trc(tskim->bfa, tskim->tsk_tag << 16 | event); 3244a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3245a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 3246a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_TSKIM_SM_HCB: 3247a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(tskim, bfa_tskim_sm_uninit); 3248a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_free(tskim); 3249a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 3250a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3251a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_TSKIM_SM_CLEANUP: 3252a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_tskim_notify_comp(tskim); 3253a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 3254a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3255a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_TSKIM_SM_HWFAIL: 3256a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 3257a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3258a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 3259a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(tskim->bfa, event); 3260a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3261a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3262a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3263a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 3264a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati__bfa_cb_tskim_done(void *cbarg, bfa_boolean_t complete) 3265a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 3266a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_tskim_s *tskim = cbarg; 3267a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3268a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!complete) { 3269a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(tskim, BFA_TSKIM_SM_HCB); 3270a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return; 3271a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3272a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3273a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(tskim->itnim, tm_success); 3274a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_tskim_done(tskim->bfa->bfad, tskim->dtsk, tskim->tsk_status); 3275a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3276a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3277a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 3278a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati__bfa_cb_tskim_failed(void *cbarg, bfa_boolean_t complete) 3279a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 3280a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_tskim_s *tskim = cbarg; 3281a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3282a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!complete) { 3283a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(tskim, BFA_TSKIM_SM_HCB); 3284a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return; 3285a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3286a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3287a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(tskim->itnim, tm_failures); 3288a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_cb_tskim_done(tskim->bfa->bfad, tskim->dtsk, 3289a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFI_TSKIM_STS_FAILED); 3290a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3291a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3292da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhangstatic bfa_boolean_t 3293f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhangbfa_tskim_match_scope(struct bfa_tskim_s *tskim, struct scsi_lun lun) 3294a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 3295a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (tskim->tm_cmnd) { 3296a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case FCP_TM_TARGET_RESET: 3297a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_TRUE; 3298a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3299a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case FCP_TM_ABORT_TASK_SET: 3300a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case FCP_TM_CLEAR_TASK_SET: 3301a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case FCP_TM_LUN_RESET: 3302a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case FCP_TM_CLEAR_ACA: 3303da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang return !memcmp(&tskim->lun, &lun, sizeof(lun)); 3304a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3305a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 3306d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(1); 3307a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3308a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3309a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_FALSE; 3310a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3311a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 33125fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3313da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Gather affected IO requests and task management commands. 3314a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3315a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 3316a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_gather_ios(struct bfa_tskim_s *tskim) 3317a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 3318a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_itnim_s *itnim = tskim->itnim; 3319a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioim_s *ioim; 3320f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang struct list_head *qe, *qen; 3321f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang struct scsi_cmnd *cmnd; 3322f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang struct scsi_lun scsilun; 3323a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3324a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati INIT_LIST_HEAD(&tskim->io_q); 3325a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 33265fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 3327a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Gather any active IO requests first. 3328a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3329a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_for_each_safe(qe, qen, &itnim->io_q) { 3330a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim = (struct bfa_ioim_s *) qe; 3331f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang cmnd = (struct scsi_cmnd *) ioim->dio; 3332f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang int_to_scsilun(cmnd->device->lun, &scsilun); 3333f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang if (bfa_tskim_match_scope(tskim, scsilun)) { 3334a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_del(&ioim->qe); 3335a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_add_tail(&ioim->qe, &tskim->io_q); 3336a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3337a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3338a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 33395fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 3340a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Failback any pending IO requests immediately. 3341a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3342a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_for_each_safe(qe, qen, &itnim->pending_q) { 3343a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim = (struct bfa_ioim_s *) qe; 3344f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang cmnd = (struct scsi_cmnd *) ioim->dio; 3345f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang int_to_scsilun(cmnd->device->lun, &scsilun); 3346f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang if (bfa_tskim_match_scope(tskim, scsilun)) { 3347a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_del(&ioim->qe); 3348a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_add_tail(&ioim->qe, &ioim->fcpim->ioim_comp_q); 3349a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_tov(ioim); 3350a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3351a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3352a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3353a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 33545fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3355da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * IO cleanup completion 3356a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3357a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 3358a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_cleanp_comp(void *tskim_cbarg) 3359a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 3360a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_tskim_s *tskim = tskim_cbarg; 3361a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3362a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(tskim->itnim, tm_io_comps); 3363a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(tskim, BFA_TSKIM_SM_IOS_DONE); 3364a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3365a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 33665fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3367da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Gather affected IO requests and task management commands. 3368a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3369a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 3370a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_cleanup_ios(struct bfa_tskim_s *tskim) 3371a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 3372a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioim_s *ioim; 3373a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct list_head *qe, *qen; 3374a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3375a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_wc_init(&tskim->wc, bfa_tskim_cleanp_comp, tskim); 3376a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3377a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_for_each_safe(qe, qen, &tskim->io_q) { 3378a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim = (struct bfa_ioim_s *) qe; 3379a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_wc_up(&tskim->wc); 3380a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_cleanup_tm(ioim, tskim); 3381a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3382a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3383a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_wc_wait(&tskim->wc); 3384a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3385a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 33865fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3387da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Send task management request to firmware. 3388a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3389a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t 3390a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_send(struct bfa_tskim_s *tskim) 3391a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 3392a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_itnim_s *itnim = tskim->itnim; 3393a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfi_tskim_req_s *m; 3394a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 33955fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 3396a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * check for room in queue to send request now 3397a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3398a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m = bfa_reqq_next(tskim->bfa, itnim->reqq); 3399a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!m) 3400a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_FALSE; 3401a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 34025fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 3403a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * build i/o request message next 3404a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3405a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfi_h2i_set(m->mh, BFI_MC_TSKIM, BFI_TSKIM_H2I_TM_REQ, 34063fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati bfa_fn_lpu(tskim->bfa)); 3407a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3408ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang m->tsk_tag = cpu_to_be16(tskim->tsk_tag); 3409a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m->itn_fhdl = tskim->itnim->rport->fw_handle; 3410a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m->t_secs = tskim->tsecs; 3411a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m->lun = tskim->lun; 3412a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m->tm_flags = tskim->tm_cmnd; 3413a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 34145fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 3415a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * queue I/O message to firmware 3416a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 34173fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati bfa_reqq_produce(tskim->bfa, itnim->reqq, m->mh); 3418a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_TRUE; 3419a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3420a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 34215fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3422da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Send abort request to cleanup an active TM to firmware. 3423a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3424a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t 3425a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_send_abort(struct bfa_tskim_s *tskim) 3426a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 3427a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_itnim_s *itnim = tskim->itnim; 3428a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfi_tskim_abortreq_s *m; 3429a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 34305fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 3431a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * check for room in queue to send request now 3432a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3433a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m = bfa_reqq_next(tskim->bfa, itnim->reqq); 3434a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!m) 3435a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_FALSE; 3436a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 34375fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 3438a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * build i/o request message next 3439a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3440a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfi_h2i_set(m->mh, BFI_MC_TSKIM, BFI_TSKIM_H2I_ABORT_REQ, 34413fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati bfa_fn_lpu(tskim->bfa)); 3442a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3443ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang m->tsk_tag = cpu_to_be16(tskim->tsk_tag); 3444a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 34455fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 3446a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * queue I/O message to firmware 3447a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 34483fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati bfa_reqq_produce(tskim->bfa, itnim->reqq, m->mh); 3449a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_TRUE; 3450a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3451a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 34525fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3453da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Call to resume task management cmnd waiting for room in request queue. 3454a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3455a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 3456a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_qresume(void *cbarg) 3457a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 3458a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_tskim_s *tskim = cbarg; 3459a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3460a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(tskim->itnim, tm_qresumes); 3461a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(tskim, BFA_TSKIM_SM_QRESUME); 3462a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3463a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 34645fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3465a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Cleanup IOs associated with a task mangement command on IOC failures. 3466a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3467a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 3468a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_iocdisable_ios(struct bfa_tskim_s *tskim) 3469a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 3470a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioim_s *ioim; 3471a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct list_head *qe, *qen; 3472a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3473a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_for_each_safe(qe, qen, &tskim->io_q) { 3474a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioim = (struct bfa_ioim_s *) qe; 3475a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioim_iocdisable(ioim); 3476a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3477a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3478a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 34795fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3480a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Notification on completions from related ioim. 3481a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3482a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 3483a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_iodone(struct bfa_tskim_s *tskim) 3484a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 3485a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_wc_down(&tskim->wc); 3486a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3487a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 34885fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3489a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Handle IOC h/w failure notification from itnim. 3490a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3491a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 3492a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_iocdisable(struct bfa_tskim_s *tskim) 3493a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 3494a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati tskim->notify = BFA_FALSE; 3495a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(tskim->itnim, tm_iocdowns); 3496a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(tskim, BFA_TSKIM_SM_HWFAIL); 3497a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3498a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 34995fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3500a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Cleanup TM command and associated IOs as part of ITNIM offline. 3501a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3502a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 3503a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_cleanup(struct bfa_tskim_s *tskim) 3504a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 3505a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati tskim->notify = BFA_TRUE; 3506a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(tskim->itnim, tm_cleanups); 3507a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(tskim, BFA_TSKIM_SM_CLEANUP); 3508a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3509a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 35105fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3511da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Memory allocation and initialization. 3512a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3513a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 35144507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipatibfa_tskim_attach(struct bfa_fcpim_s *fcpim) 3515a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 3516a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_tskim_s *tskim; 35174507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati struct bfa_fcp_mod_s *fcp = fcpim->fcp; 3518a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u16 i; 3519a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3520a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati INIT_LIST_HEAD(&fcpim->tskim_free_q); 35213fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati INIT_LIST_HEAD(&fcpim->tskim_unused_q); 3522a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 35234507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati tskim = (struct bfa_tskim_s *) bfa_mem_kva_curp(fcp); 3524a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fcpim->tskim_arr = tskim; 3525a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3526a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati for (i = 0; i < fcpim->num_tskim_reqs; i++, tskim++) { 3527a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati /* 3528a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * initialize TSKIM 3529a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 35306a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset(tskim, 0, sizeof(struct bfa_tskim_s)); 3531a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati tskim->tsk_tag = i; 3532a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati tskim->bfa = fcpim->bfa; 3533a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati tskim->fcpim = fcpim; 3534a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati tskim->notify = BFA_FALSE; 3535a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_reqq_winit(&tskim->reqq_wait, bfa_tskim_qresume, 3536a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati tskim); 3537a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_set_state(tskim, bfa_tskim_sm_uninit); 3538a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3539a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_add_tail(&tskim->qe, &fcpim->tskim_free_q); 3540a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3541a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 35424507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati bfa_mem_kva_curp(fcp) = (u8 *) tskim; 3543a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3544a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3545a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 3546a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_isr(struct bfa_s *bfa, struct bfi_msg_s *m) 3547a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 3548e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa); 3549a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfi_tskim_rsp_s *rsp = (struct bfi_tskim_rsp_s *) m; 3550a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_tskim_s *tskim; 3551ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang u16 tsk_tag = be16_to_cpu(rsp->tsk_tag); 3552a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3553a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati tskim = BFA_TSKIM_FROM_TAG(fcpim, tsk_tag); 3554d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(tskim->tsk_tag != tsk_tag); 3555a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3556a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati tskim->tsk_status = rsp->tsk_status; 3557a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 35585fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 3559a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Firmware sends BFI_TSKIM_STS_ABORTED status for abort 3560a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * requests. All other statuses are for normal completions. 3561a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3562a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (rsp->tsk_status == BFI_TSKIM_STS_ABORTED) { 3563a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(tskim->itnim, tm_cleanup_comps); 3564a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(tskim, BFA_TSKIM_SM_CLEANUP_DONE); 35651306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati } else if (rsp->tsk_status == BFI_TSKIM_STS_UTAG) { 35661306e31d417df05c25053c5632b26d1c1b22d1edKrishna Gudipati bfa_sm_send_event(tskim, BFA_TSKIM_SM_UTAG); 3567a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } else { 3568a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(tskim->itnim, tm_fw_rsps); 3569a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(tskim, BFA_TSKIM_SM_DONE); 3570a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 3571a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3572a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3573a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3574a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistruct bfa_tskim_s * 3575a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_alloc(struct bfa_s *bfa, struct bfad_tskim_s *dtsk) 3576a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 3577e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa); 3578a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_tskim_s *tskim; 3579a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3580a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_q_deq(&fcpim->tskim_free_q, &tskim); 3581a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3582a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (tskim) 3583a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati tskim->dtsk = dtsk; 3584a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3585a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return tskim; 3586a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3587a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3588a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 3589a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_tskim_free(struct bfa_tskim_s *tskim) 3590a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 3591d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(!bfa_q_is_on_q_func(&tskim->itnim->tsk_q, &tskim->qe)); 3592a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_del(&tskim->qe); 3593a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_add_tail(&tskim->qe, &tskim->fcpim->tskim_free_q); 3594a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3595a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 35965fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 3597da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang * Start a task management command. 3598a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * 3599a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in] tskim BFA task management command instance 3600a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in] itnim i-t nexus for the task management command 3601a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in] lun lun, if applicable 3602a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in] tm_cmnd Task management command code. 3603a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in] t_secs Timeout in seconds 3604a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * 3605a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @return None. 3606a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 3607a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 3608f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhangbfa_tskim_start(struct bfa_tskim_s *tskim, struct bfa_itnim_s *itnim, 3609f314878ab95d4802ddde066096f7b30087cea7baMaggie Zhang struct scsi_lun lun, 3610a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum fcp_tm_cmnd tm_cmnd, u8 tsecs) 3611a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 3612a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati tskim->itnim = itnim; 3613a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati tskim->lun = lun; 3614a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati tskim->tm_cmnd = tm_cmnd; 3615a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati tskim->tsecs = tsecs; 3616a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati tskim->notify = BFA_FALSE; 3617a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_stats(itnim, tm_cmnds); 3618a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3619a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_add_tail(&tskim->qe, &itnim->tsk_q); 3620a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_send_event(tskim, BFA_TSKIM_SM_START); 3621a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 3622e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 36233fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipativoid 36243fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipatibfa_tskim_res_recfg(struct bfa_s *bfa, u16 num_tskim_fw) 36253fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati{ 36263fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa); 36273fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati struct list_head *qe; 36283fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati int i; 36293fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati 36303fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati for (i = 0; i < (fcpim->num_tskim_reqs - num_tskim_fw); i++) { 36313fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati bfa_q_deq_tail(&fcpim->tskim_free_q, &qe); 36323fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati list_add_tail(qe, &fcpim->tskim_unused_q); 36333fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati } 36343fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati} 36353fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati 3636e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati/* BFA FCP module - parent module for fcpim */ 3637e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 3638e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna GudipatiBFA_MODULE(fcp); 3639e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 3640e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatistatic void 36414507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipatibfa_fcp_meminfo(struct bfa_iocfc_cfg_s *cfg, struct bfa_meminfo_s *minfo, 36424507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati struct bfa_s *bfa) 3643e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati{ 36444507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati struct bfa_fcp_mod_s *fcp = BFA_FCP_MOD(bfa); 36454507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati struct bfa_mem_kva_s *fcp_kva = BFA_MEM_FCP_KVA(bfa); 36464507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati struct bfa_mem_dma_s *seg_ptr; 36474507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati u16 nsegs, idx, per_seg_ios, num_io_req; 36484507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati u32 km_len = 0; 3649e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 3650e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati /* 3651e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati * ZERO for num_ioim_reqs and num_fwtio_reqs is allowed config value. 3652e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati * So if the values are non zero, adjust them appropriately. 3653e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati */ 3654e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati if (cfg->fwcfg.num_ioim_reqs && 3655e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati cfg->fwcfg.num_ioim_reqs < BFA_IOIM_MIN) 3656e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati cfg->fwcfg.num_ioim_reqs = BFA_IOIM_MIN; 3657e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati else if (cfg->fwcfg.num_ioim_reqs > BFA_IOIM_MAX) 3658e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati cfg->fwcfg.num_ioim_reqs = BFA_IOIM_MAX; 3659e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 3660e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati if (cfg->fwcfg.num_fwtio_reqs > BFA_FWTIO_MAX) 3661e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati cfg->fwcfg.num_fwtio_reqs = BFA_FWTIO_MAX; 3662e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 3663e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati num_io_req = (cfg->fwcfg.num_ioim_reqs + cfg->fwcfg.num_fwtio_reqs); 3664e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati if (num_io_req > BFA_IO_MAX) { 3665e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati if (cfg->fwcfg.num_ioim_reqs && cfg->fwcfg.num_fwtio_reqs) { 3666e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati cfg->fwcfg.num_ioim_reqs = BFA_IO_MAX/2; 3667e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati cfg->fwcfg.num_fwtio_reqs = BFA_IO_MAX/2; 3668e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati } else if (cfg->fwcfg.num_fwtio_reqs) 3669e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati cfg->fwcfg.num_fwtio_reqs = BFA_FWTIO_MAX; 3670e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati else 3671e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati cfg->fwcfg.num_ioim_reqs = BFA_IOIM_MAX; 3672e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati } 3673e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 36744507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati bfa_fcpim_meminfo(cfg, &km_len); 3675e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 3676e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati num_io_req = (cfg->fwcfg.num_ioim_reqs + cfg->fwcfg.num_fwtio_reqs); 36774507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati km_len += num_io_req * sizeof(struct bfa_iotag_s); 36784507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati km_len += cfg->fwcfg.num_rports * sizeof(struct bfa_itn_s); 36794507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati 36804507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati /* dma memory */ 36814507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati nsegs = BFI_MEM_DMA_NSEGS(num_io_req, BFI_IOIM_SNSLEN); 36824507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati per_seg_ios = BFI_MEM_NREQS_SEG(BFI_IOIM_SNSLEN); 36834507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati 36844507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati bfa_mem_dma_seg_iter(fcp, seg_ptr, nsegs, idx) { 36854507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati if (num_io_req >= per_seg_ios) { 36864507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati num_io_req -= per_seg_ios; 36874507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati bfa_mem_dma_setup(minfo, seg_ptr, 36884507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati per_seg_ios * BFI_IOIM_SNSLEN); 36894507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati } else 36904507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati bfa_mem_dma_setup(minfo, seg_ptr, 36914507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati num_io_req * BFI_IOIM_SNSLEN); 36924507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati } 36934507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati 36944507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati /* kva memory */ 36954507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati bfa_mem_kva_setup(minfo, fcp_kva, km_len); 3696e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati} 3697e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 3698e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatistatic void 3699e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatibfa_fcp_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, 37004507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati struct bfa_pcidev_s *pcidev) 3701e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati{ 3702e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_fcp_mod_s *fcp = BFA_FCP_MOD(bfa); 37034507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati struct bfa_mem_dma_s *seg_ptr; 37044507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati u16 idx, nsegs, num_io_req; 3705e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 37067ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati fcp->max_ioim_reqs = cfg->fwcfg.num_ioim_reqs; 3707e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati fcp->num_ioim_reqs = cfg->fwcfg.num_ioim_reqs; 3708e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati fcp->num_fwtio_reqs = cfg->fwcfg.num_fwtio_reqs; 37094507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati fcp->num_itns = cfg->fwcfg.num_rports; 3710e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati fcp->bfa = bfa; 3711e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 37124507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati /* 37134507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati * Setup the pool of snsbase addr's, that is passed to fw as 37144507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati * part of bfi_iocfc_cfg_s. 37154507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati */ 37164507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati num_io_req = (cfg->fwcfg.num_ioim_reqs + cfg->fwcfg.num_fwtio_reqs); 37174507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati nsegs = BFI_MEM_DMA_NSEGS(num_io_req, BFI_IOIM_SNSLEN); 37184507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati 37194507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati bfa_mem_dma_seg_iter(fcp, seg_ptr, nsegs, idx) { 37204507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati 37214507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati if (!bfa_mem_dma_virt(seg_ptr)) 37224507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati break; 37234507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati 37244507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati fcp->snsbase[idx].pa = bfa_mem_dma_phys(seg_ptr); 37254507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati fcp->snsbase[idx].kva = bfa_mem_dma_virt(seg_ptr); 37264507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati bfa_iocfc_set_snsbase(bfa, idx, fcp->snsbase[idx].pa); 37274507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati } 3728e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 37297ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati fcp->throttle_update_required = 1; 37304507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati bfa_fcpim_attach(fcp, bfad, cfg, pcidev); 3731e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 37324507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati bfa_iotag_attach(fcp); 3733e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 37344507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati fcp->itn_arr = (struct bfa_itn_s *) bfa_mem_kva_curp(fcp); 37354507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati bfa_mem_kva_curp(fcp) = (u8 *)fcp->itn_arr + 3736e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati (fcp->num_itns * sizeof(struct bfa_itn_s)); 3737e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati memset(fcp->itn_arr, 0, 3738e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati (fcp->num_itns * sizeof(struct bfa_itn_s))); 3739e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati} 3740e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 3741e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatistatic void 3742e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatibfa_fcp_detach(struct bfa_s *bfa) 3743e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati{ 3744e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati} 3745e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 3746e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatistatic void 3747e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatibfa_fcp_start(struct bfa_s *bfa) 3748e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati{ 374983763d591b343b07331cebe86715205230c568b1Krishna Gudipati struct bfa_fcp_mod_s *fcp = BFA_FCP_MOD(bfa); 375083763d591b343b07331cebe86715205230c568b1Krishna Gudipati 375183763d591b343b07331cebe86715205230c568b1Krishna Gudipati /* 375283763d591b343b07331cebe86715205230c568b1Krishna Gudipati * bfa_init() with flash read is complete. now invalidate the stale 375383763d591b343b07331cebe86715205230c568b1Krishna Gudipati * content of lun mask like unit attention, rp tag and lp tag. 375483763d591b343b07331cebe86715205230c568b1Krishna Gudipati */ 375583763d591b343b07331cebe86715205230c568b1Krishna Gudipati bfa_ioim_lm_init(fcp->bfa); 3756e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati} 3757e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 3758e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatistatic void 3759e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatibfa_fcp_stop(struct bfa_s *bfa) 3760e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati{ 3761e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati} 3762e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 3763e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatistatic void 3764e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatibfa_fcp_iocdisable(struct bfa_s *bfa) 3765e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati{ 3766e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_fcp_mod_s *fcp = BFA_FCP_MOD(bfa); 3767e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 3768e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati bfa_fcpim_iocdisable(fcp); 3769e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati} 3770e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 3771e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipativoid 37727ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatibfa_fcp_res_recfg(struct bfa_s *bfa, u16 num_ioim_fw, u16 max_ioim_fw) 37733fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati{ 37743fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati struct bfa_fcp_mod_s *mod = BFA_FCP_MOD(bfa); 37753fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati struct list_head *qe; 37763fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati int i; 37773fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati 37787ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati /* Update io throttle value only once during driver load time */ 37797ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati if (!mod->throttle_update_required) 37807ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati return; 37817ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati 37823fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati for (i = 0; i < (mod->num_ioim_reqs - num_ioim_fw); i++) { 37833fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati bfa_q_deq_tail(&mod->iotag_ioim_free_q, &qe); 37843fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati list_add_tail(qe, &mod->iotag_unused_q); 37853fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati } 37867ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati 37877ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati if (mod->num_ioim_reqs != num_ioim_fw) { 37887ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati bfa_trc(bfa, mod->num_ioim_reqs); 37897ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati bfa_trc(bfa, num_ioim_fw); 37907ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati } 37917ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati 37927ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati mod->max_ioim_reqs = max_ioim_fw; 37937ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati mod->num_ioim_reqs = num_ioim_fw; 37947ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati mod->throttle_update_required = 0; 37953fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati} 37963fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati 37973fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipativoid 3798e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatibfa_itn_create(struct bfa_s *bfa, struct bfa_rport_s *rport, 3799e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati void (*isr)(struct bfa_s *bfa, struct bfi_msg_s *m)) 3800e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati{ 3801e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_fcp_mod_s *fcp = BFA_FCP_MOD(bfa); 3802e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_itn_s *itn; 3803e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 3804e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati itn = BFA_ITN_FROM_TAG(fcp, rport->rport_tag); 3805e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati itn->isr = isr; 3806e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati} 3807e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 3808e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati/* 3809e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati * Itn interrupt processing. 3810e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati */ 3811e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipativoid 3812e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipatibfa_itn_isr(struct bfa_s *bfa, struct bfi_msg_s *m) 3813e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati{ 3814e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_fcp_mod_s *fcp = BFA_FCP_MOD(bfa); 3815e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati union bfi_itn_i2h_msg_u msg; 3816e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_itn_s *itn; 3817e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 3818e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati msg.msg = m; 3819e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati itn = BFA_ITN_FROM_TAG(fcp, msg.create_rsp->bfa_handle); 3820e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 3821e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati if (itn->isr) 3822e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati itn->isr(bfa, m); 3823e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati else 3824e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati WARN_ON(1); 3825e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati} 3826e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 3827e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipativoid 38284507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipatibfa_iotag_attach(struct bfa_fcp_mod_s *fcp) 3829e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati{ 3830e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati struct bfa_iotag_s *iotag; 3831e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati u16 num_io_req, i; 3832e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 38334507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati iotag = (struct bfa_iotag_s *) bfa_mem_kva_curp(fcp); 3834e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati fcp->iotag_arr = iotag; 3835e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 3836e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati INIT_LIST_HEAD(&fcp->iotag_ioim_free_q); 3837e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati INIT_LIST_HEAD(&fcp->iotag_tio_free_q); 38383fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati INIT_LIST_HEAD(&fcp->iotag_unused_q); 3839e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 3840e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati num_io_req = fcp->num_ioim_reqs + fcp->num_fwtio_reqs; 3841e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati for (i = 0; i < num_io_req; i++, iotag++) { 3842e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati memset(iotag, 0, sizeof(struct bfa_iotag_s)); 3843e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati iotag->tag = i; 3844e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati if (i < fcp->num_ioim_reqs) 3845e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati list_add_tail(&iotag->qe, &fcp->iotag_ioim_free_q); 3846e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati else 3847e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati list_add_tail(&iotag->qe, &fcp->iotag_tio_free_q); 3848e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati } 3849e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati 38504507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati bfa_mem_kva_curp(fcp) = (u8 *) iotag; 3851e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati} 38527ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati 38537ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati 38547ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati/** 38557ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati * To send config req, first try to use throttle value from flash 38567ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati * If 0, then use driver parameter 38577ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati * We need to use min(flash_val, drv_val) because 38587ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati * memory allocation was done based on this cfg'd value 38597ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati */ 38607ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatiu16 38617ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatibfa_fcpim_get_throttle_cfg(struct bfa_s *bfa, u16 drv_cfg_param) 38627ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati{ 38637ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati u16 tmp; 38647ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati struct bfa_fcp_mod_s *fcp = BFA_FCP_MOD(bfa); 38657ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati 38667ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati /* 38677ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati * If throttle value from flash is already in effect after driver is 38687ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati * loaded then until next load, always return current value instead 38697ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati * of actual flash value 38707ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati */ 38717ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati if (!fcp->throttle_update_required) 38727ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati return (u16)fcp->num_ioim_reqs; 38737ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati 38747ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati tmp = bfa_dconf_read_data_valid(bfa) ? bfa_fcpim_read_throttle(bfa) : 0; 38757ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati if (!tmp || (tmp > drv_cfg_param)) 38767ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati tmp = drv_cfg_param; 38777ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati 38787ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati return tmp; 38797ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati} 38807ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati 38817ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatibfa_status_t 38827ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatibfa_fcpim_write_throttle(struct bfa_s *bfa, u16 value) 38837ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati{ 38847ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati if (!bfa_dconf_get_min_cfg(bfa)) { 38857ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati BFA_DCONF_MOD(bfa)->dconf->throttle_cfg.value = value; 38867ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati BFA_DCONF_MOD(bfa)->dconf->throttle_cfg.is_valid = 1; 38877ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati return BFA_STATUS_OK; 38887ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati } 38897ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati 38907ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati return BFA_STATUS_FAILED; 38917ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati} 38927ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati 38937ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatiu16 38947ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatibfa_fcpim_read_throttle(struct bfa_s *bfa) 38957ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati{ 38967ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati struct bfa_throttle_cfg_s *throttle_cfg = 38977ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati &(BFA_DCONF_MOD(bfa)->dconf->throttle_cfg); 38987ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati 38997ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati return ((!bfa_dconf_get_min_cfg(bfa)) ? 39007ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati ((throttle_cfg->is_valid == 1) ? (throttle_cfg->value) : 0) : 0); 39017ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati} 39027ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati 39037ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatibfa_status_t 39047ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatibfa_fcpim_throttle_set(struct bfa_s *bfa, u16 value) 39057ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati{ 39067ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati /* in min cfg no commands should run. */ 39077ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati if ((bfa_dconf_get_min_cfg(bfa) == BFA_TRUE) || 39087ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati (!bfa_dconf_read_data_valid(bfa))) 39097ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati return BFA_STATUS_FAILED; 39107ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati 39117ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati bfa_fcpim_write_throttle(bfa, value); 39127ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati 39137ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati return bfa_dconf_update(bfa); 39147ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati} 39157ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati 39167ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatibfa_status_t 39177ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipatibfa_fcpim_throttle_get(struct bfa_s *bfa, void *buf) 39187ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati{ 39197ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa); 39207ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati struct bfa_defs_fcpim_throttle_s throttle; 39217ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati 39227ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati if ((bfa_dconf_get_min_cfg(bfa) == BFA_TRUE) || 39237ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati (!bfa_dconf_read_data_valid(bfa))) 39247ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati return BFA_STATUS_FAILED; 39257ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati 39267ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati memset(&throttle, 0, sizeof(struct bfa_defs_fcpim_throttle_s)); 39277ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati 39287ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati throttle.cur_value = (u16)(fcpim->fcp->num_ioim_reqs); 39297ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati throttle.cfg_value = bfa_fcpim_read_throttle(bfa); 39307ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati if (!throttle.cfg_value) 39317ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati throttle.cfg_value = throttle.cur_value; 39327ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati throttle.max_value = (u16)(fcpim->fcp->max_ioim_reqs); 39337ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati memcpy(buf, &throttle, sizeof(struct bfa_defs_fcpim_throttle_s)); 39347ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati 39357ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati return BFA_STATUS_OK; 39367ace27ae28a5fa67fa3d25f31d1111991c81e015Krishna Gudipati} 3937