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" 197826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati#include "bfad_im.h" 20a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfa_ioc.h" 21111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati#include "bfi_reg.h" 22a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfa_defs.h" 23a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfa_defs_svc.h" 247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 257af074dc9d343f69bab4bfd699e6d7ba09915fd9Krishna GudipatiBFA_TRC_FILE(CNA, IOC); 267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 275fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC local definitions 297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 30a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define BFA_IOC_TOV 3000 /* msecs */ 31a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define BFA_IOC_HWSEM_TOV 500 /* msecs */ 32a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define BFA_IOC_HB_TOV 500 /* msecs */ 33a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define BFA_IOC_TOV_RECOVER BFA_IOC_HB_TOV 34775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati#define BFA_IOC_POLL_TOV BFA_TIMER_FREQ 357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define bfa_ioc_timer_start(__ioc) \ 377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_timer_begin((__ioc)->timer_mod, &(__ioc)->ioc_timer, \ 387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timeout, (__ioc), BFA_IOC_TOV) 397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define bfa_ioc_timer_stop(__ioc) bfa_timer_stop(&(__ioc)->ioc_timer) 407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 41a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_hb_timer_start(__ioc) \ 42a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_timer_begin((__ioc)->timer_mod, &(__ioc)->hb_timer, \ 43a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_hb_check, (__ioc), BFA_IOC_HB_TOV) 44a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_hb_timer_stop(__ioc) bfa_timer_stop(&(__ioc)->hb_timer) 45a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define BFA_DBG_FWTRC_OFF(_fn) (BFI_IOC_TRC_OFF + BFA_DBG_FWTRC_LEN * (_fn)) 477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 485fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 490a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Asic specific macros : see bfa_hw_cb.c and bfa_hw_ct.c for details. 500a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 510a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 52a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_ioc_firmware_lock(__ioc) \ 530a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ((__ioc)->ioc_hwif->ioc_firmware_lock(__ioc)) 54a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_ioc_firmware_unlock(__ioc) \ 550a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ((__ioc)->ioc_hwif->ioc_firmware_unlock(__ioc)) 560a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define bfa_ioc_reg_init(__ioc) ((__ioc)->ioc_hwif->ioc_reg_init(__ioc)) 570a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define bfa_ioc_map_port(__ioc) ((__ioc)->ioc_hwif->ioc_map_port(__ioc)) 58f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati#define bfa_ioc_notify_fail(__ioc) \ 59f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati ((__ioc)->ioc_hwif->ioc_notify_fail(__ioc)) 6045d7f0cc58183062adea0a1de3d8cba768134138Jing Huang#define bfa_ioc_sync_start(__ioc) \ 6145d7f0cc58183062adea0a1de3d8cba768134138Jing Huang ((__ioc)->ioc_hwif->ioc_sync_start(__ioc)) 62f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati#define bfa_ioc_sync_join(__ioc) \ 63f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati ((__ioc)->ioc_hwif->ioc_sync_join(__ioc)) 64f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati#define bfa_ioc_sync_leave(__ioc) \ 65f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati ((__ioc)->ioc_hwif->ioc_sync_leave(__ioc)) 66f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati#define bfa_ioc_sync_ack(__ioc) \ 67f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati ((__ioc)->ioc_hwif->ioc_sync_ack(__ioc)) 68f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati#define bfa_ioc_sync_complete(__ioc) \ 69f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati ((__ioc)->ioc_hwif->ioc_sync_complete(__ioc)) 70a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 71a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_ioc_mbox_cmd_pending(__ioc) \ 72a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (!list_empty(&((__ioc)->mbox_mod.cmd_q)) || \ 735344026065f79b102fcc44bc6332f856a111962aJing Huang readl((__ioc)->ioc_regs.hfn_mbox_cmd)) 74a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 75a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_boolean_t bfa_auto_recover = BFA_TRUE; 767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * forward declarations 797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 80a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_hw_sem_get(struct bfa_ioc_s *ioc); 81a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_hwinit(struct bfa_ioc_s *ioc, bfa_boolean_t force); 82a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_timeout(void *ioc); 83775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipatistatic void bfa_ioc_poll_fwinit(struct bfa_ioc_s *ioc); 84a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_send_enable(struct bfa_ioc_s *ioc); 85a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_send_disable(struct bfa_ioc_s *ioc); 86a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_send_getattr(struct bfa_ioc_s *ioc); 87a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_hb_monitor(struct bfa_ioc_s *ioc); 88a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_mbox_poll(struct bfa_ioc_s *ioc); 898b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipatistatic void bfa_ioc_mbox_flush(struct bfa_ioc_s *ioc); 90a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_recover(struct bfa_ioc_s *ioc); 91d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipatistatic void bfa_ioc_event_notify(struct bfa_ioc_s *ioc , 92d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati enum bfa_ioc_event_e event); 93a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_disable_comp(struct bfa_ioc_s *ioc); 94a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_lpu_stop(struct bfa_ioc_s *ioc); 954e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipatistatic void bfa_ioc_debug_save_ftrc(struct bfa_ioc_s *ioc); 964e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipatistatic void bfa_ioc_fail_notify(struct bfa_ioc_s *ioc); 97a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_pf_fwmismatch(struct bfa_ioc_s *ioc); 987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 995fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 100a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC state machine definitions/declarations 1017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 1027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum ioc_event { 103a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati IOC_E_RESET = 1, /* IOC reset request */ 104a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati IOC_E_ENABLE = 2, /* IOC enable request */ 105a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati IOC_E_DISABLE = 3, /* IOC disable request */ 106a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati IOC_E_DETACH = 4, /* driver detach cleanup */ 107a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati IOC_E_ENABLED = 5, /* f/w enabled */ 108a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati IOC_E_FWRSP_GETATTR = 6, /* IOC get attribute response */ 109a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati IOC_E_DISABLED = 7, /* f/w disabled */ 110775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati IOC_E_PFFAILED = 8, /* failure notice by iocpf sm */ 111775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati IOC_E_HBFAIL = 9, /* heartbeat failure */ 112775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati IOC_E_HWERROR = 10, /* hardware error interrupt */ 113775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati IOC_E_TIMEOUT = 11, /* timeout */ 1145a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati IOC_E_HWFAILED = 12, /* PCI mapping failure notice */ 1157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}; 1167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 117a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_ioc, uninit, struct bfa_ioc_s, enum ioc_event); 1187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, reset, struct bfa_ioc_s, enum ioc_event); 1197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, enabling, struct bfa_ioc_s, enum ioc_event); 1207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, getattr, struct bfa_ioc_s, enum ioc_event); 1217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, op, struct bfa_ioc_s, enum ioc_event); 1224e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipatibfa_fsm_state_decl(bfa_ioc, fail_retry, struct bfa_ioc_s, enum ioc_event); 123a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_ioc, fail, struct bfa_ioc_s, enum ioc_event); 1247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, disabling, struct bfa_ioc_s, enum ioc_event); 1257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, disabled, struct bfa_ioc_s, enum ioc_event); 1265a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipatibfa_fsm_state_decl(bfa_ioc, hwfail, struct bfa_ioc_s, enum ioc_event); 1277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic struct bfa_sm_table_s ioc_sm_table[] = { 129a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati {BFA_SM(bfa_ioc_sm_uninit), BFA_IOC_UNINIT}, 1307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_ioc_sm_reset), BFA_IOC_RESET}, 131a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati {BFA_SM(bfa_ioc_sm_enabling), BFA_IOC_ENABLING}, 1327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_ioc_sm_getattr), BFA_IOC_GETATTR}, 1337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_ioc_sm_op), BFA_IOC_OPERATIONAL}, 1344e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati {BFA_SM(bfa_ioc_sm_fail_retry), BFA_IOC_INITFAIL}, 135a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati {BFA_SM(bfa_ioc_sm_fail), BFA_IOC_FAIL}, 1367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_ioc_sm_disabling), BFA_IOC_DISABLING}, 1377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_ioc_sm_disabled), BFA_IOC_DISABLED}, 1385a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati {BFA_SM(bfa_ioc_sm_hwfail), BFA_IOC_HWFAIL}, 1397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}; 1407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1415fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 142a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOCPF state machine definitions/declarations 143a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 144a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 145a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_iocpf_timer_start(__ioc) \ 146a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_timer_begin((__ioc)->timer_mod, &(__ioc)->ioc_timer, \ 147a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_iocpf_timeout, (__ioc), BFA_IOC_TOV) 148a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_iocpf_timer_stop(__ioc) bfa_timer_stop(&(__ioc)->ioc_timer) 149a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 150775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati#define bfa_iocpf_poll_timer_start(__ioc) \ 151a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_timer_begin((__ioc)->timer_mod, &(__ioc)->ioc_timer, \ 152775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati bfa_iocpf_poll_timeout, (__ioc), BFA_IOC_POLL_TOV) 153a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 154a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_sem_timer_start(__ioc) \ 155a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_timer_begin((__ioc)->timer_mod, &(__ioc)->sem_timer, \ 156a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_iocpf_sem_timeout, (__ioc), BFA_IOC_HWSEM_TOV) 157a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_sem_timer_stop(__ioc) bfa_timer_stop(&(__ioc)->sem_timer) 158a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 159a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati/* 160a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Forward declareations for iocpf state machine 161a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 162a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_iocpf_timeout(void *ioc_arg); 163a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_iocpf_sem_timeout(void *ioc_arg); 164775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipatistatic void bfa_iocpf_poll_timeout(void *ioc_arg); 165a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1665fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 167a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOCPF state machine events 168a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 169a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatienum iocpf_event { 170a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati IOCPF_E_ENABLE = 1, /* IOCPF enable request */ 171a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati IOCPF_E_DISABLE = 2, /* IOCPF disable request */ 172a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati IOCPF_E_STOP = 3, /* stop on driver detach */ 173a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati IOCPF_E_FWREADY = 4, /* f/w initialization done */ 174a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati IOCPF_E_FWRSP_ENABLE = 5, /* enable f/w response */ 175a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati IOCPF_E_FWRSP_DISABLE = 6, /* disable f/w response */ 176a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati IOCPF_E_FAIL = 7, /* failure notice by ioc sm */ 177a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati IOCPF_E_INITFAIL = 8, /* init fail notice by ioc sm */ 178a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati IOCPF_E_GETATTRFAIL = 9, /* init fail notice by ioc sm */ 179a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati IOCPF_E_SEMLOCKED = 10, /* h/w semaphore is locked */ 180a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati IOCPF_E_TIMEOUT = 11, /* f/w response timeout */ 1815a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati IOCPF_E_SEM_ERROR = 12, /* h/w sem mapping error */ 182a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}; 183a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1845fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 185a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOCPF states 186a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 187a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatienum bfa_iocpf_state { 188a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOCPF_RESET = 1, /* IOC is in reset state */ 189a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOCPF_SEMWAIT = 2, /* Waiting for IOC h/w semaphore */ 190a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOCPF_HWINIT = 3, /* IOC h/w is being initialized */ 191a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOCPF_READY = 4, /* IOCPF is initialized */ 192a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOCPF_INITFAIL = 5, /* IOCPF failed */ 193a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOCPF_FAIL = 6, /* IOCPF failed */ 194a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOCPF_DISABLING = 7, /* IOCPF is being disabled */ 195a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOCPF_DISABLED = 8, /* IOCPF is disabled */ 196a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_IOCPF_FWMISMATCH = 9, /* IOC f/w different from drivers */ 197a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}; 198a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 199a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, reset, struct bfa_iocpf_s, enum iocpf_event); 200a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, fwcheck, struct bfa_iocpf_s, enum iocpf_event); 201a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, mismatch, struct bfa_iocpf_s, enum iocpf_event); 202a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, semwait, struct bfa_iocpf_s, enum iocpf_event); 203a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, hwinit, struct bfa_iocpf_s, enum iocpf_event); 204a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, enabling, struct bfa_iocpf_s, enum iocpf_event); 205a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, ready, struct bfa_iocpf_s, enum iocpf_event); 206f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_fsm_state_decl(bfa_iocpf, initfail_sync, struct bfa_iocpf_s, 207f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati enum iocpf_event); 208a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, initfail, struct bfa_iocpf_s, enum iocpf_event); 209f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_fsm_state_decl(bfa_iocpf, fail_sync, struct bfa_iocpf_s, enum iocpf_event); 210a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, fail, struct bfa_iocpf_s, enum iocpf_event); 211a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, disabling, struct bfa_iocpf_s, enum iocpf_event); 212f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_fsm_state_decl(bfa_iocpf, disabling_sync, struct bfa_iocpf_s, 213f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati enum iocpf_event); 214a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, disabled, struct bfa_iocpf_s, enum iocpf_event); 215a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 216a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic struct bfa_sm_table_s iocpf_sm_table[] = { 217a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati {BFA_SM(bfa_iocpf_sm_reset), BFA_IOCPF_RESET}, 218a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati {BFA_SM(bfa_iocpf_sm_fwcheck), BFA_IOCPF_FWMISMATCH}, 219a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati {BFA_SM(bfa_iocpf_sm_mismatch), BFA_IOCPF_FWMISMATCH}, 220a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati {BFA_SM(bfa_iocpf_sm_semwait), BFA_IOCPF_SEMWAIT}, 221a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati {BFA_SM(bfa_iocpf_sm_hwinit), BFA_IOCPF_HWINIT}, 222a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati {BFA_SM(bfa_iocpf_sm_enabling), BFA_IOCPF_HWINIT}, 223a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati {BFA_SM(bfa_iocpf_sm_ready), BFA_IOCPF_READY}, 224f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati {BFA_SM(bfa_iocpf_sm_initfail_sync), BFA_IOCPF_INITFAIL}, 225a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati {BFA_SM(bfa_iocpf_sm_initfail), BFA_IOCPF_INITFAIL}, 226f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati {BFA_SM(bfa_iocpf_sm_fail_sync), BFA_IOCPF_FAIL}, 227a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati {BFA_SM(bfa_iocpf_sm_fail), BFA_IOCPF_FAIL}, 228a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati {BFA_SM(bfa_iocpf_sm_disabling), BFA_IOCPF_DISABLING}, 229f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati {BFA_SM(bfa_iocpf_sm_disabling_sync), BFA_IOCPF_DISABLING}, 230a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati {BFA_SM(bfa_iocpf_sm_disabled), BFA_IOCPF_DISABLED}, 231a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}; 232a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2335fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 234a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC State Machine 235a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 236a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2375fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 238a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Beginning state. IOC uninit state. 239a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 240a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 241a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 242a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_uninit_entry(struct bfa_ioc_s *ioc) 243a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 244a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 245a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2465fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 247a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC is in uninit state. 248a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 249a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 250a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_uninit(struct bfa_ioc_s *ioc, enum ioc_event event) 251a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 252a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, event); 253a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 254a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 255a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_RESET: 256a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_reset); 257a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 258a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 259a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 260a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(ioc, event); 261a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 262a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2635fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 2647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Reset entry actions -- initialize state machine 2657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 2667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 2677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_reset_entry(struct bfa_ioc_s *ioc) 2687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 269a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(&ioc->iocpf, bfa_iocpf_sm_reset); 2707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2725fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 273a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC is in reset state. 2747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 2757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 2767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_reset(struct bfa_ioc_s *ioc, enum ioc_event event) 2777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 2797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 2817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_ENABLE: 282a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_enabling); 2837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_DISABLE: 2867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_disable_comp(ioc); 2877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_DETACH: 290a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit); 2917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 2947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 2957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 2967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 298a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 299a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 300a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_enabling_entry(struct bfa_ioc_s *ioc) 301a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 302f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_ENABLE); 303a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 304a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3055fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 306a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Host IOC function is being enabled, awaiting response from firmware. 307a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Semaphore is acquired. 3087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 3097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 310a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_enabling(struct bfa_ioc_s *ioc, enum ioc_event event) 3117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 312a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, event); 313a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 314a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 315a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_ENABLED: 316a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_getattr); 317a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 318a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3194e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati case IOC_E_PFFAILED: 3204e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati /* !!! fall through !!! */ 321a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_HWERROR: 3224e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE); 323775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_fail); 3244e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati if (event != IOC_E_PFFAILED) 3254e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_INITFAIL); 326a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 327a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3285a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati case IOC_E_HWFAILED: 3295a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE); 3305a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_hwfail); 3315a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati break; 3325a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati 333a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_DISABLE: 334a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling); 335a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 336a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 337a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_DETACH: 338a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit); 339f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_STOP); 340a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 341a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 342a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_ENABLE: 343a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 344a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 345a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 346a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(ioc, event); 347a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 348a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 349a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 350a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 351a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 352a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_getattr_entry(struct bfa_ioc_s *ioc) 353a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 354a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_timer_start(ioc); 355a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_send_getattr(ioc); 3567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3585fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 359a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC configuration in progress. Timer is active. 3607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 3617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 362a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_getattr(struct bfa_ioc_s *ioc, enum ioc_event event) 3637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 3647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 3657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 367a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_FWRSP_GETATTR: 368a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_timer_stop(ioc); 369a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_op); 370a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 371a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 3724e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati case IOC_E_PFFAILED: 373a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_HWERROR: 374a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_timer_stop(ioc); 3754e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati /* !!! fall through !!! */ 376a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_TIMEOUT: 3774e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE); 378775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_fail); 3794e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati if (event != IOC_E_PFFAILED) 3804e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_GETATTRFAIL); 3817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_DISABLE: 384a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_timer_stop(ioc); 385a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling); 386a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 387a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 388a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_ENABLE: 389a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 390a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 391a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 392a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(ioc, event); 393a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 394a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 395a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 396a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 397a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_op_entry(struct bfa_ioc_s *ioc) 398a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 399a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfad_s *bfad = (struct bfad_s *)ioc->bfa->bfad; 400a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 401a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_OK); 402d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati bfa_ioc_event_notify(ioc, BFA_IOC_E_ENABLED); 403db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati bfa_ioc_hb_monitor(ioc); 4048816624222b12e5d7e291e9d1973fc42b994eb6bJing Huang BFA_LOG(KERN_INFO, bfad, bfa_log_level, "IOC enabled\n"); 4057826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_ioc_aen_post(ioc, BFA_IOC_AEN_ENABLE); 406a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 407a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 408a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 409a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_op(struct bfa_ioc_s *ioc, enum ioc_event event) 410a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 411a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, event); 412a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 413a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 414a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_ENABLE: 415a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 416a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 417a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_DISABLE: 418f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_hb_timer_stop(ioc); 419a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling); 420a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 421a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 4224e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati case IOC_E_PFFAILED: 423a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_HWERROR: 424f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_hb_timer_stop(ioc); 425a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati /* !!! fall through !!! */ 426a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_HBFAIL: 4274e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati if (ioc->iocpf.auto_recover) 4284e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_fail_retry); 4294e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati else 4304e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_fail); 4314e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati 432775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati bfa_ioc_fail_notify(ioc); 433775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati 4344e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati if (event != IOC_E_PFFAILED) 4354e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_FAIL); 436a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 437a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 438a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 439a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(ioc, event); 440a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 441a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 442a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 443a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 444a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 445a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_disabling_entry(struct bfa_ioc_s *ioc) 446a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 447a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfad_s *bfad = (struct bfad_s *)ioc->bfa->bfad; 448f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_DISABLE); 4498816624222b12e5d7e291e9d1973fc42b994eb6bJing Huang BFA_LOG(KERN_INFO, bfad, bfa_log_level, "IOC disabled\n"); 4507826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_ioc_aen_post(ioc, BFA_IOC_AEN_DISABLE); 451a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 452a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 4535fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 454a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC is being disabled 455a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 456a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 457a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_disabling(struct bfa_ioc_s *ioc, enum ioc_event event) 458a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 459a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, event); 460a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 461a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 462a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_DISABLED: 463a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled); 464a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 465a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 466a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_HWERROR: 4677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 468a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * No state change. Will move to disabled state 469a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * after iocpf sm completes failure processing and 470a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * moves to disabled state. 4717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 472f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_FAIL); 473a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 4747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4755a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati case IOC_E_HWFAILED: 4765a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_hwfail); 4775a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_ioc_disable_comp(ioc); 4785a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati break; 4795a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati 480a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 481a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(ioc, event); 482a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 483a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 484a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 4855fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 486a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC disable completion entry. 487a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 488a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 489a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_disabled_entry(struct bfa_ioc_s *ioc) 490a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 491a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_disable_comp(ioc); 492a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 493a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 494a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 495a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_disabled(struct bfa_ioc_s *ioc, enum ioc_event event) 496a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 497a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, event); 498a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 499a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 500a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_ENABLE: 501a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_enabling); 5027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 5037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 504a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_DISABLE: 505a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc->cbfn->disable_cbfn(ioc->bfa); 506a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 507a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 508a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_DETACH: 509a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit); 510f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_STOP); 5117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 5127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 5147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 5157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 5167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 518a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 519a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 5204e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipatibfa_ioc_sm_fail_retry_entry(struct bfa_ioc_s *ioc) 521a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 5224e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati bfa_trc(ioc, 0); 523a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 524a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 5255fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 526f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * Hardware initialization retry. 5277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 5294e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipatibfa_ioc_sm_fail_retry(struct bfa_ioc_s *ioc, enum ioc_event event) 5307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 531a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, event); 532a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 533a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 534a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_ENABLED: 535a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_getattr); 536a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 537a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 5384e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati case IOC_E_PFFAILED: 5394e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati case IOC_E_HWERROR: 5405fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 5414e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati * Initialization retry failed. 542a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 543a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE); 544775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_fail); 5454e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati if (event != IOC_E_PFFAILED) 5464e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_INITFAIL); 5474e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati break; 5484e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati 5495a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati case IOC_E_HWFAILED: 5505a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE); 5515a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_hwfail); 5525a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati break; 5535a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati 5544e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati case IOC_E_ENABLE: 555a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 556a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 557a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_DISABLE: 558a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling); 559a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 560a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 561a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_DETACH: 562a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit); 563f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_STOP); 564a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 565a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 566a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 567a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(ioc, event); 568a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 569a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 570a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 571a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 572a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 573a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_fail_entry(struct bfa_ioc_s *ioc) 574a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 5754e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati bfa_trc(ioc, 0); 5767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5785fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 579a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC failure. 5807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 582a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_fail(struct bfa_ioc_s *ioc, enum ioc_event event) 5837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 5857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 587a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 588a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_ENABLE: 589a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE); 590a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 591a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 5927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_DISABLE: 593a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling); 594a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 595a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 596f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati case IOC_E_DETACH: 597f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit); 598f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_STOP); 599f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati break; 600f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 601a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOC_E_HWERROR: 6027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 603a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * HB failure notification, ignore. 6047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 605a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 606a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 607a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(ioc, event); 608a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 609a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 6107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6115a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipatistatic void 6125a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipatibfa_ioc_sm_hwfail_entry(struct bfa_ioc_s *ioc) 6135a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati{ 6145a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_trc(ioc, 0); 6155a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati} 6165a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati 6175a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipatistatic void 6185a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipatibfa_ioc_sm_hwfail(struct bfa_ioc_s *ioc, enum ioc_event event) 6195a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati{ 6205a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_trc(ioc, event); 6215a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati 6225a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati switch (event) { 6235a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati case IOC_E_ENABLE: 6245a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE); 6255a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati break; 6265a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati 6275a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati case IOC_E_DISABLE: 6285a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati ioc->cbfn->disable_cbfn(ioc->bfa); 6295a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati break; 6305a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati 6315a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati case IOC_E_DETACH: 6325a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit); 6335a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati break; 6345a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati 6355a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati default: 6365a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_sm_fault(ioc, event); 6375a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati } 6385a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati} 6395a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati 6405fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 641a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOCPF State Machine 642a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 643a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 6445fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 645a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Reset entry actions -- initialize state machine 646a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 647a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 648a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_reset_entry(struct bfa_iocpf_s *iocpf) 649a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 650775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati iocpf->fw_mismatch_notified = BFA_FALSE; 651a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati iocpf->auto_recover = bfa_auto_recover; 652a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 653a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 6545fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 655a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Beginning state. IOC is in reset state. 656a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 657a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 658a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_reset(struct bfa_iocpf_s *iocpf, enum iocpf_event event) 659a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 660a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioc_s *ioc = iocpf->ioc; 661a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 662a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, event); 663a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 664a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 665a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_ENABLE: 666a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_fwcheck); 6677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 6687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 669a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_STOP: 6707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 6717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 6737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 6747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 6757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6775fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 678a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Semaphore should be acquired for version check. 6797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 681a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_fwcheck_entry(struct bfa_iocpf_s *iocpf) 6827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6835a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati struct bfi_ioc_image_hdr_s fwhdr; 6848919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati u32 r32, fwstate, pgnum, pgoff, loff = 0; 6858919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati int i; 6868919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati 6878919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati /* 6888919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati * Spin on init semaphore to serialize. 6898919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati */ 6908919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati r32 = readl(iocpf->ioc->ioc_regs.ioc_init_sem_reg); 6918919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati while (r32 & 0x1) { 6928919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati udelay(20); 6938919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati r32 = readl(iocpf->ioc->ioc_regs.ioc_init_sem_reg); 6948919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati } 6955a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati 6965a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati /* h/w sem init */ 6978919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati fwstate = readl(iocpf->ioc->ioc_regs.ioc_fwstate); 6988919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati if (fwstate == BFI_IOC_UNINIT) { 6998919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati writel(1, iocpf->ioc->ioc_regs.ioc_init_sem_reg); 7005a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati goto sem_get; 7018919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati } 7025a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati 7035a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_ioc_fwver_get(iocpf->ioc, &fwhdr); 7045a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati 7058919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati if (swab32(fwhdr.exec) == BFI_FWBOOT_TYPE_NORMAL) { 7068919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati writel(1, iocpf->ioc->ioc_regs.ioc_init_sem_reg); 7075a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati goto sem_get; 7088919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati } 7098919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati 7108919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati /* 7118919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati * Clear fwver hdr 7128919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati */ 7138919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati pgnum = PSS_SMEM_PGNUM(iocpf->ioc->ioc_regs.smem_pg0, loff); 7148919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati pgoff = PSS_SMEM_PGOFF(loff); 7158919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati writel(pgnum, iocpf->ioc->ioc_regs.host_page_num_fn); 7168919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati 7178919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati for (i = 0; i < sizeof(struct bfi_ioc_image_hdr_s) / sizeof(u32); i++) { 7188919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati bfa_mem_write(iocpf->ioc->ioc_regs.smem_page_start, loff, 0); 7198919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati loff += sizeof(u32); 7208919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati } 7215a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati 7225a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_trc(iocpf->ioc, fwstate); 7238919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati bfa_trc(iocpf->ioc, swab32(fwhdr.exec)); 7245a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati writel(BFI_IOC_UNINIT, iocpf->ioc->ioc_regs.ioc_fwstate); 7258919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati writel(BFI_IOC_UNINIT, iocpf->ioc->ioc_regs.alt_ioc_fwstate); 7265a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati 7275a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati /* 7288919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati * Unlock the hw semaphore. Should be here only once per boot. 7295a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati */ 7305a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati readl(iocpf->ioc->ioc_regs.ioc_sem_reg); 7315a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati writel(1, iocpf->ioc->ioc_regs.ioc_sem_reg); 7328919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati 7338919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati /* 7348919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati * unlock init semaphore. 7358919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati */ 7368919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati writel(1, iocpf->ioc->ioc_regs.ioc_init_sem_reg); 7378919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati 7385a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipatisem_get: 739a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_hw_sem_get(iocpf->ioc); 7407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7425fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 743a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Awaiting h/w semaphore to continue with version check. 7447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 7457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 746a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_fwcheck(struct bfa_iocpf_s *iocpf, enum iocpf_event event) 7477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 748a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioc_s *ioc = iocpf->ioc; 749a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 7507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 7517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 753a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_SEMLOCKED: 754a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (bfa_ioc_firmware_lock(ioc)) { 75545d7f0cc58183062adea0a1de3d8cba768134138Jing Huang if (bfa_ioc_sync_start(ioc)) { 756f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_ioc_sync_join(ioc); 757f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_hwinit); 758f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati } else { 759f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_ioc_firmware_unlock(ioc); 760f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel(1, ioc->ioc_regs.ioc_sem_reg); 761f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_sem_timer_start(ioc); 762f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati } 763a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } else { 764f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(1, ioc->ioc_regs.ioc_sem_reg); 765a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_mismatch); 766a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 7677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 7687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7695a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati case IOCPF_E_SEM_ERROR: 7705a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_fail); 7715a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_fsm_send_event(ioc, IOC_E_HWFAILED); 7725a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati break; 7735a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati 774a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_DISABLE: 775f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_sem_timer_stop(ioc); 776a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_reset); 777f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_fsm_send_event(ioc, IOC_E_DISABLED); 778a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 779a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 780a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_STOP: 781f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_sem_timer_stop(ioc); 782a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_reset); 7837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 7847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 7867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 7877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 7887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7905fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 791a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Notify enable completion callback. 792a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 7937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 794a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_mismatch_entry(struct bfa_iocpf_s *iocpf) 7957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 796a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati /* 797a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Call only the first time sm enters fwmismatch state. 798a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 799775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati if (iocpf->fw_mismatch_notified == BFA_FALSE) 800a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_pf_fwmismatch(iocpf->ioc); 801a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 802775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati iocpf->fw_mismatch_notified = BFA_TRUE; 803a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_iocpf_timer_start(iocpf->ioc); 8047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8065fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 807a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Awaiting firmware version match. 8087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 8097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 810a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_mismatch(struct bfa_iocpf_s *iocpf, enum iocpf_event event) 8117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 812a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioc_s *ioc = iocpf->ioc; 813a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 8147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 8157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 817a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_TIMEOUT: 818a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_fwcheck); 8197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 8207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 821a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_DISABLE: 822a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_iocpf_timer_stop(ioc); 823a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_reset); 824f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_fsm_send_event(ioc, IOC_E_DISABLED); 825a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 8267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 827a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_STOP: 828a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_iocpf_timer_stop(ioc); 829a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_reset); 830a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 8317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 832a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 833a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sm_fault(ioc, event); 834a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 835a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 836a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 8375fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 838a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Request for semaphore. 839a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 840a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 841a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_semwait_entry(struct bfa_iocpf_s *iocpf) 842a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 843a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_hw_sem_get(iocpf->ioc); 844a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 845a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 8465fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 847a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Awaiting semaphore for h/w initialzation. 848a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 849a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 850a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_semwait(struct bfa_iocpf_s *iocpf, enum iocpf_event event) 851a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 852a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioc_s *ioc = iocpf->ioc; 853a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 854a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, event); 855a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 856a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (event) { 857a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_SEMLOCKED: 858f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati if (bfa_ioc_sync_complete(ioc)) { 859f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_ioc_sync_join(ioc); 860f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_hwinit); 861f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati } else { 862f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel(1, ioc->ioc_regs.ioc_sem_reg); 863f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_sem_timer_start(ioc); 864f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati } 8657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 8667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8675a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati case IOCPF_E_SEM_ERROR: 8685a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_fail); 8695a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_fsm_send_event(ioc, IOC_E_HWFAILED); 8705a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati break; 8715a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati 872a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_DISABLE: 873f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_sem_timer_stop(ioc); 874f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabling_sync); 8757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 8767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 8787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 8797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 8807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 883a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_hwinit_entry(struct bfa_iocpf_s *iocpf) 8847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 885775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati iocpf->poll_time = 0; 886f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_ioc_hwinit(iocpf->ioc, BFA_FALSE); 8877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8895fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 890a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Hardware is being initialized. Interrupts are enabled. 891a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Holding hardware semaphore lock. 8927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 8937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 894a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_hwinit(struct bfa_iocpf_s *iocpf, enum iocpf_event event) 8957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 896a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioc_s *ioc = iocpf->ioc; 897a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 8987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 8997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 901a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_FWREADY: 902a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_enabling); 9037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 9047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 905a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_TIMEOUT: 906f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(1, ioc->ioc_regs.ioc_sem_reg); 907775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati bfa_fsm_send_event(ioc, IOC_E_PFFAILED); 908f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_initfail_sync); 9097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 9107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 911a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_DISABLE: 912a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_iocpf_timer_stop(ioc); 913f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_ioc_sync_leave(ioc); 914f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel(1, ioc->ioc_regs.ioc_sem_reg); 915a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabled); 9167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 9177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 9197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 9207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 9217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 9227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 924a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_enabling_entry(struct bfa_iocpf_s *iocpf) 9257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 926a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_iocpf_timer_start(iocpf->ioc); 927775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati /* 928775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati * Enable Interrupts before sending fw IOC ENABLE cmd. 929775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati */ 930775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati iocpf->ioc->cbfn->reset_cbfn(iocpf->ioc->bfa); 931a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_send_enable(iocpf->ioc); 9327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 9337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9345fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 935a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Host IOC function is being enabled, awaiting response from firmware. 936a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Semaphore is acquired. 9377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 9387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 939a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_enabling(struct bfa_iocpf_s *iocpf, enum iocpf_event event) 9407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 941a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioc_s *ioc = iocpf->ioc; 942a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 9437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 9447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 946a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_FWRSP_ENABLE: 947a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_iocpf_timer_stop(ioc); 948f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(1, ioc->ioc_regs.ioc_sem_reg); 949a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_ready); 9507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 9517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 952a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_INITFAIL: 953a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_iocpf_timer_stop(ioc); 9547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 955a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * !!! fall through !!! 9567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 9577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 958a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_TIMEOUT: 959f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(1, ioc->ioc_regs.ioc_sem_reg); 960a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (event == IOCPF_E_TIMEOUT) 9614e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati bfa_fsm_send_event(ioc, IOC_E_PFFAILED); 962f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_initfail_sync); 9637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 9647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 965a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_DISABLE: 966a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_iocpf_timer_stop(ioc); 967f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(1, ioc->ioc_regs.ioc_sem_reg); 968a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabling); 969a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 970a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 9717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 9727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 9737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 9747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 9757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 977a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_ready_entry(struct bfa_iocpf_s *iocpf) 9787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 979f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_fsm_send_event(iocpf->ioc, IOC_E_ENABLED); 9807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 9817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 983a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_ready(struct bfa_iocpf_s *iocpf, enum iocpf_event event) 9847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 985a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioc_s *ioc = iocpf->ioc; 986a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 9877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 9887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 990a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_DISABLE: 991a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabling); 992a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 993a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 994a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_GETATTRFAIL: 995f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_initfail_sync); 9967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 9977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 998a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_FAIL: 999f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_fail_sync); 10007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 10017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 10037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 10047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 10057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 1008a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_disabling_entry(struct bfa_iocpf_s *iocpf) 10097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1010a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_iocpf_timer_start(iocpf->ioc); 1011a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_send_disable(iocpf->ioc); 10127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10145fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 10157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC is being disabled 10167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 10177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 1018a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_disabling(struct bfa_iocpf_s *iocpf, enum iocpf_event event) 10197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1020a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioc_s *ioc = iocpf->ioc; 1021a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 10227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 10237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 1025a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_FWRSP_DISABLE: 1026a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_iocpf_timer_stop(ioc); 1027f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabling_sync); 10280a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati break; 10290a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1030a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_FAIL: 1031a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_iocpf_timer_stop(ioc); 10327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 10337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * !!! fall through !!! 10347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 10357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1036a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_TIMEOUT: 10375344026065f79b102fcc44bc6332f856a111962aJing Huang writel(BFI_IOC_FAIL, ioc->ioc_regs.ioc_fwstate); 1038f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabling_sync); 1039a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 1040a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1041a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_FWRSP_ENABLE: 10427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 10437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 10457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 10467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 10477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1049f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void 1050f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_iocpf_sm_disabling_sync_entry(struct bfa_iocpf_s *iocpf) 1051f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{ 1052f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_ioc_hw_sem_get(iocpf->ioc); 1053f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati} 1054f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 10558f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang/* 1056f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * IOC hb ack request is being removed. 1057f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati */ 1058f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void 1059f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_iocpf_sm_disabling_sync(struct bfa_iocpf_s *iocpf, enum iocpf_event event) 1060f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{ 1061f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati struct bfa_ioc_s *ioc = iocpf->ioc; 1062f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 1063f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_trc(ioc, event); 1064f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 1065f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati switch (event) { 1066f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati case IOCPF_E_SEMLOCKED: 1067f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_ioc_sync_leave(ioc); 1068f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel(1, ioc->ioc_regs.ioc_sem_reg); 1069f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabled); 1070f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati break; 1071f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 10725a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati case IOCPF_E_SEM_ERROR: 10735a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_fail); 10745a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_fsm_send_event(ioc, IOC_E_HWFAILED); 10755a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati break; 10765a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati 1077f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati case IOCPF_E_FAIL: 1078f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati break; 1079f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 1080f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati default: 1081f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_sm_fault(ioc, event); 1082f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati } 1083f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati} 1084f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 10855fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 10867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC disable completion entry. 10877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 10887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 1089a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_disabled_entry(struct bfa_iocpf_s *iocpf) 10907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 10918b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati bfa_ioc_mbox_flush(iocpf->ioc); 1092f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang bfa_fsm_send_event(iocpf->ioc, IOC_E_DISABLED); 10937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 1096a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_disabled(struct bfa_iocpf_s *iocpf, enum iocpf_event event) 10977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1098a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioc_s *ioc = iocpf->ioc; 1099a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 11007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 11017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 1103a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_ENABLE: 1104a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_semwait); 11057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 11067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1107a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_STOP: 11087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_firmware_unlock(ioc); 1109a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_reset); 11107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 11117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 11137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 11147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 11157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 1118f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_iocpf_sm_initfail_sync_entry(struct bfa_iocpf_s *iocpf) 1119f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{ 11205a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_ioc_debug_save_ftrc(iocpf->ioc); 1121f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_ioc_hw_sem_get(iocpf->ioc); 1122f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati} 1123f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 11248f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang/* 1125f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * Hardware initialization failed. 1126f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati */ 1127f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void 1128f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_iocpf_sm_initfail_sync(struct bfa_iocpf_s *iocpf, enum iocpf_event event) 1129f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{ 1130f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati struct bfa_ioc_s *ioc = iocpf->ioc; 1131f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 1132f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_trc(ioc, event); 1133f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 1134f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati switch (event) { 1135f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati case IOCPF_E_SEMLOCKED: 1136f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_ioc_notify_fail(ioc); 1137775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati bfa_ioc_sync_leave(ioc); 1138775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati writel(BFI_IOC_FAIL, ioc->ioc_regs.ioc_fwstate); 1139775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati writel(1, ioc->ioc_regs.ioc_sem_reg); 1140775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_initfail); 1141f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati break; 1142f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 11435a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati case IOCPF_E_SEM_ERROR: 11445a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_fail); 11455a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_fsm_send_event(ioc, IOC_E_HWFAILED); 11465a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati break; 11475a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati 1148f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati case IOCPF_E_DISABLE: 1149f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_sem_timer_stop(ioc); 1150f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabling_sync); 1151f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati break; 1152f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 1153f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati case IOCPF_E_STOP: 1154f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_sem_timer_stop(ioc); 1155f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_ioc_firmware_unlock(ioc); 1156f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_reset); 1157f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati break; 1158f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 1159f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati case IOCPF_E_FAIL: 1160f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati break; 1161f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 1162f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati default: 1163f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_sm_fault(ioc, event); 1164f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati } 1165f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati} 1166f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 1167f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void 1168a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_initfail_entry(struct bfa_iocpf_s *iocpf) 11697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 11705a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_trc(iocpf->ioc, 0); 11717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11735fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 11747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Hardware initialization failed. 11757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 11767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 1177a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_initfail(struct bfa_iocpf_s *iocpf, enum iocpf_event event) 11787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1179a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioc_s *ioc = iocpf->ioc; 1180a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 11817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 11827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 1184a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_DISABLE: 1185a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabled); 11867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 11877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1188a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_STOP: 11897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_firmware_unlock(ioc); 1190a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_reset); 11917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 11927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 11947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 11957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 11967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 1199f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_iocpf_sm_fail_sync_entry(struct bfa_iocpf_s *iocpf) 12007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 12018f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang /* 12027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Mark IOC as failed in hardware and stop firmware. 12037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 1204a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_lpu_stop(iocpf->ioc); 12057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12068f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang /* 12077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Flush any queued up mailbox requests. 12087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 12098b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati bfa_ioc_mbox_flush(iocpf->ioc); 12107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1211f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_ioc_hw_sem_get(iocpf->ioc); 1212f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati} 1213f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 1214f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void 1215f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_iocpf_sm_fail_sync(struct bfa_iocpf_s *iocpf, enum iocpf_event event) 1216f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{ 1217f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati struct bfa_ioc_s *ioc = iocpf->ioc; 1218f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 1219f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_trc(ioc, event); 1220f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 1221f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati switch (event) { 1222f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati case IOCPF_E_SEMLOCKED: 1223f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_ioc_sync_ack(ioc); 1224f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_ioc_notify_fail(ioc); 1225f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati if (!iocpf->auto_recover) { 1226f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_ioc_sync_leave(ioc); 1227775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati writel(BFI_IOC_FAIL, ioc->ioc_regs.ioc_fwstate); 1228f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel(1, ioc->ioc_regs.ioc_sem_reg); 1229f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_fail); 1230f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati } else { 1231f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati if (bfa_ioc_sync_complete(ioc)) 1232f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_hwinit); 1233f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati else { 1234f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel(1, ioc->ioc_regs.ioc_sem_reg); 1235f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_semwait); 1236f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati } 1237f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati } 1238f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati break; 1239f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 12405a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati case IOCPF_E_SEM_ERROR: 12415a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_fail); 12425a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_fsm_send_event(ioc, IOC_E_HWFAILED); 12435a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati break; 12445a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati 1245f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati case IOCPF_E_DISABLE: 1246f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_sem_timer_stop(ioc); 1247f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabling_sync); 1248f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati break; 1249f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 1250f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati case IOCPF_E_FAIL: 1251f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati break; 1252f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 1253f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati default: 1254f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati bfa_sm_fault(ioc, event); 1255f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati } 1256f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati} 1257f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 1258f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void 1259f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_iocpf_sm_fail_entry(struct bfa_iocpf_s *iocpf) 1260f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{ 12615a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_trc(iocpf->ioc, 0); 12627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12645fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1265a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC is in failed state. 12667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 12677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 1268a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_fail(struct bfa_iocpf_s *iocpf, enum iocpf_event event) 12697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1270a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioc_s *ioc = iocpf->ioc; 1271a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 12727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 12737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 1275a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case IOCPF_E_DISABLE: 1276a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabled); 12777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 12787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 12807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 12817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 12827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12845fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1285df0f1933eb5454a5c481311837076056557467adMaggie Zhang * BFA IOC private functions 12867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 12877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1288d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati/* 1289d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati * Notify common modules registered for notification. 1290d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati */ 12917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 1292d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipatibfa_ioc_event_notify(struct bfa_ioc_s *ioc, enum bfa_ioc_event_e event) 12937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1294d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati struct bfa_ioc_notify_s *notify; 1295d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati struct list_head *qe; 12967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1297d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati list_for_each(qe, &ioc->notify_q) { 1298d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati notify = (struct bfa_ioc_notify_s *)qe; 1299d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati notify->cbfn(notify->cbarg, event); 13007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 13017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1303d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipatistatic void 1304d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipatibfa_ioc_disable_comp(struct bfa_ioc_s *ioc) 1305d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati{ 1306d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati ioc->cbfn->disable_cbfn(ioc->bfa); 1307d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati bfa_ioc_event_notify(ioc, BFA_IOC_E_DISABLED); 1308d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati} 1309d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati 13100a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_boolean_t 13115344026065f79b102fcc44bc6332f856a111962aJing Huangbfa_ioc_sem_get(void __iomem *sem_reg) 13127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 13130a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati u32 r32; 13140a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati int cnt = 0; 1315a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define BFA_SEM_SPINCNT 3000 13167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13175344026065f79b102fcc44bc6332f856a111962aJing Huang r32 = readl(sem_reg); 13180a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1319111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati while ((r32 & 1) && (cnt < BFA_SEM_SPINCNT)) { 13207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cnt++; 13216a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang udelay(2); 13225344026065f79b102fcc44bc6332f856a111962aJing Huang r32 = readl(sem_reg); 13230a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati } 13240a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 1325111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati if (!(r32 & 1)) 13260a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati return BFA_TRUE; 13270a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 13280a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati return BFA_FALSE; 13297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 13327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hw_sem_get(struct bfa_ioc_s *ioc) 13337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1334a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 r32; 13357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13365fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 13377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * First read to the semaphore register will return 0, subsequent reads 13380a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * will return 1. Semaphore is released by writing 1 to the register 13397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 13405344026065f79b102fcc44bc6332f856a111962aJing Huang r32 = readl(ioc->ioc_regs.ioc_sem_reg); 13415a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati if (r32 == ~0) { 13425a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati WARN_ON(r32 == ~0); 13435a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_SEM_ERROR); 13445a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati return; 13455a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati } 1346111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati if (!(r32 & 1)) { 1347a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_SEMLOCKED); 13487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 13497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 13507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1351a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_sem_timer_start(ioc); 13527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13545fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 13557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Initialize LPU local memory (aka secondary memory / SRAM) 13567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 13577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 13587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_lmem_init(struct bfa_ioc_s *ioc) 13597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1360a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 pss_ctl; 1361a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int i; 13627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define PSS_LMEM_INIT_TIME 10000 13637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13645344026065f79b102fcc44bc6332f856a111962aJing Huang pss_ctl = readl(ioc->ioc_regs.pss_ctl_reg); 13657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pss_ctl &= ~__PSS_LMEM_RESET; 13667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pss_ctl |= __PSS_LMEM_INIT_EN; 1367a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1368a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati /* 1369a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * i2c workaround 12.5khz clock 1370a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1371a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati pss_ctl |= __PSS_I2C_CLK_DIV(3UL); 13725344026065f79b102fcc44bc6332f856a111962aJing Huang writel(pss_ctl, ioc->ioc_regs.pss_ctl_reg); 13737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13745fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 13757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * wait for memory initialization to be complete 13767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 13777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang i = 0; 13787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang do { 13795344026065f79b102fcc44bc6332f856a111962aJing Huang pss_ctl = readl(ioc->ioc_regs.pss_ctl_reg); 13807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang i++; 13817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } while (!(pss_ctl & __PSS_LMEM_INIT_DONE) && (i < PSS_LMEM_INIT_TIME)); 13827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13835fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 13847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * If memory initialization is not successful, IOC timeout will catch 13857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * such failures. 13867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 1387d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(!(pss_ctl & __PSS_LMEM_INIT_DONE)); 13887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, pss_ctl); 13897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pss_ctl &= ~(__PSS_LMEM_INIT_DONE | __PSS_LMEM_INIT_EN); 13915344026065f79b102fcc44bc6332f856a111962aJing Huang writel(pss_ctl, ioc->ioc_regs.pss_ctl_reg); 13927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 13957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_lpu_start(struct bfa_ioc_s *ioc) 13967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1397a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 pss_ctl; 13987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13995fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 14007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Take processor out of reset. 14017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 14025344026065f79b102fcc44bc6332f856a111962aJing Huang pss_ctl = readl(ioc->ioc_regs.pss_ctl_reg); 14037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pss_ctl &= ~__PSS_LPU0_RESET; 14047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14055344026065f79b102fcc44bc6332f856a111962aJing Huang writel(pss_ctl, ioc->ioc_regs.pss_ctl_reg); 14067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 14077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 14097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_lpu_stop(struct bfa_ioc_s *ioc) 14107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1411a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 pss_ctl; 14127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14135fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 14147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Put processors in reset. 14157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 14165344026065f79b102fcc44bc6332f856a111962aJing Huang pss_ctl = readl(ioc->ioc_regs.pss_ctl_reg); 14177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pss_ctl |= (__PSS_LPU0_RESET | __PSS_LPU1_RESET); 14187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14195344026065f79b102fcc44bc6332f856a111962aJing Huang writel(pss_ctl, ioc->ioc_regs.pss_ctl_reg); 14207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 14217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14225fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 14237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Get driver and firmware versions. 14247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 14250a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipativoid 14267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_fwver_get(struct bfa_ioc_s *ioc, struct bfi_ioc_image_hdr_s *fwhdr) 14277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1428a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 pgnum, pgoff; 1429a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 loff = 0; 1430a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int i; 1431a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 *fwsig = (u32 *) fwhdr; 14327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1433f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang pgnum = PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, loff); 1434f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang pgoff = PSS_SMEM_PGOFF(loff); 14355344026065f79b102fcc44bc6332f856a111962aJing Huang writel(pgnum, ioc->ioc_regs.host_page_num_fn); 14367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (i = 0; i < (sizeof(struct bfi_ioc_image_hdr_s) / sizeof(u32)); 14387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang i++) { 1439a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fwsig[i] = 1440a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_mem_read(ioc->ioc_regs.smem_page_start, loff); 14417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang loff += sizeof(u32); 14427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 14437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 14447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14455fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 14467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Returns TRUE if same. 14477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 14480a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_boolean_t 14497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_fwver_cmp(struct bfa_ioc_s *ioc, struct bfi_ioc_image_hdr_s *fwhdr) 14507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 14517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfi_ioc_image_hdr_s *drv_fwhdr; 1452a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int i; 14537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1454293f82d59ed8b6d61d242e40ee7a6a146fae5eaaJing Huang drv_fwhdr = (struct bfi_ioc_image_hdr_s *) 1455111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc), 0); 14567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (i = 0; i < BFI_IOC_MD5SUM_SZ; i++) { 14587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (fwhdr->md5sum[i] != drv_fwhdr->md5sum[i]) { 14597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, i); 14607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, fwhdr->md5sum[i]); 14617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, drv_fwhdr->md5sum[i]); 14627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_FALSE; 14637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 14647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 14657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, fwhdr->md5sum[0]); 14677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_TRUE; 14687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 14697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14705fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 14717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Return true if current running version is valid. Firmware signature and 14727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * execution context (driver/bios) must match. 14737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 1474a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t 1475a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_fwver_valid(struct bfa_ioc_s *ioc, u32 boot_env) 14767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 14777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfi_ioc_image_hdr_s fwhdr, *drv_fwhdr; 14787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_fwver_get(ioc, &fwhdr); 1480293f82d59ed8b6d61d242e40ee7a6a146fae5eaaJing Huang drv_fwhdr = (struct bfi_ioc_image_hdr_s *) 1481111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc), 0); 14827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (fwhdr.signature != drv_fwhdr->signature) { 14847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, fwhdr.signature); 14857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, drv_fwhdr->signature); 14867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_FALSE; 14877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 14887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1489111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati if (swab32(fwhdr.bootenv) != boot_env) { 1490111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati bfa_trc(ioc, fwhdr.bootenv); 1491a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, boot_env); 14927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_FALSE; 14937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 14947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return bfa_ioc_fwver_cmp(ioc, &fwhdr); 14967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 14977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14985fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 14997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Conditionally flush any pending message from firmware at start. 15007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 15017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 15027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_msgflush(struct bfa_ioc_s *ioc) 15037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1504a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 r32; 15057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15065344026065f79b102fcc44bc6332f856a111962aJing Huang r32 = readl(ioc->ioc_regs.lpu_mbox_cmd); 15077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (r32) 15085344026065f79b102fcc44bc6332f856a111962aJing Huang writel(1, ioc->ioc_regs.lpu_mbox_cmd); 15097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 15107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 15127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hwinit(struct bfa_ioc_s *ioc, bfa_boolean_t force) 15137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 15147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfi_ioc_state ioc_fwstate; 1515a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_boolean_t fwvalid; 1516a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 boot_type; 1517a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 boot_env; 15187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15195344026065f79b102fcc44bc6332f856a111962aJing Huang ioc_fwstate = readl(ioc->ioc_regs.ioc_fwstate); 15207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (force) 15227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc_fwstate = BFI_IOC_UNINIT; 15237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, ioc_fwstate); 15257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1526111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati boot_type = BFI_FWBOOT_TYPE_NORMAL; 1527111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati boot_env = BFI_FWBOOT_ENV_OS; 1528a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 15295fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 15307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * check if firmware is valid 15317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 15327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fwvalid = (ioc_fwstate == BFI_IOC_UNINIT) ? 1533a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_FALSE : bfa_ioc_fwver_valid(ioc, boot_env); 15347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!fwvalid) { 1536a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_boot(ioc, boot_type, boot_env); 15378b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati bfa_ioc_poll_fwinit(ioc); 15387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 15397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 15407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15415fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 15427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * If hardware initialization is in progress (initialized by other IOC), 15437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * just wait for an initialization completion interrupt. 15447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 15457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (ioc_fwstate == BFI_IOC_INITING) { 1546775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati bfa_ioc_poll_fwinit(ioc); 15477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 15487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 15497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15505fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 15517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * If IOC function is disabled and firmware version is same, 15527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * just re-enable IOC. 155307b2838669dc7704e02e079b1a96602656893d78Jing Huang * 155407b2838669dc7704e02e079b1a96602656893d78Jing Huang * If option rom, IOC must not be in operational state. With 155507b2838669dc7704e02e079b1a96602656893d78Jing Huang * convergence, IOC will be in operational state when 2nd driver 155607b2838669dc7704e02e079b1a96602656893d78Jing Huang * is loaded. 15577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 15588f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang if (ioc_fwstate == BFI_IOC_DISABLED || ioc_fwstate == BFI_IOC_OP) { 15597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15605fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 15617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * When using MSI-X any pending firmware ready event should 15627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * be flushed. Otherwise MSI-X interrupts are not delivered. 15637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 15647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_msgflush(ioc); 1565a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_FWREADY); 15667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 15677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 15687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15695fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 15707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Initialize the h/w for any other states. 15717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 1572a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_boot(ioc, boot_type, boot_env); 15738b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati bfa_ioc_poll_fwinit(ioc); 15747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 15757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 15777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_timeout(void *ioc_arg) 15787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1579a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioc_s *ioc = (struct bfa_ioc_s *) ioc_arg; 15807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, 0); 15827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_send_event(ioc, IOC_E_TIMEOUT); 15837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 15847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 15867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_send(struct bfa_ioc_s *ioc, void *ioc_msg, int len) 15877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1588a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 *msgp = (u32 *) ioc_msg; 1589a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 i; 15907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, msgp[0]); 15927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, len); 15937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1594d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(len > BFI_IOC_MSGLEN_MAX); 15957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 15977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * first write msg to mailbox registers 15987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 15997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (i = 0; i < len / sizeof(u32); i++) 16005344026065f79b102fcc44bc6332f856a111962aJing Huang writel(cpu_to_le32(msgp[i]), 16015344026065f79b102fcc44bc6332f856a111962aJing Huang ioc->ioc_regs.hfn_mbox + i * sizeof(u32)); 16027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (; i < BFI_IOC_MSGLEN_MAX / sizeof(u32); i++) 16045344026065f79b102fcc44bc6332f856a111962aJing Huang writel(0, ioc->ioc_regs.hfn_mbox + i * sizeof(u32)); 16057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 16077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * write 1 to mailbox CMD to trigger LPU event 16087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 16095344026065f79b102fcc44bc6332f856a111962aJing Huang writel(1, ioc->ioc_regs.hfn_mbox_cmd); 16105344026065f79b102fcc44bc6332f856a111962aJing Huang (void) readl(ioc->ioc_regs.hfn_mbox_cmd); 16117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 16127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 16147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_send_enable(struct bfa_ioc_s *ioc) 16157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 16167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfi_ioc_ctrl_req_s enable_req; 1617f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang struct timeval tv; 16187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfi_h2i_set(enable_req.mh, BFI_MC_IOC, BFI_IOC_H2I_ENABLE_REQ, 16207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_portid(ioc)); 1621d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati enable_req.clscode = cpu_to_be16(ioc->clscode); 1622f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang do_gettimeofday(&tv); 1623ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang enable_req.tv_sec = be32_to_cpu(tv.tv_sec); 16247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_mbox_send(ioc, &enable_req, sizeof(struct bfi_ioc_ctrl_req_s)); 16257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 16267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 16287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_send_disable(struct bfa_ioc_s *ioc) 16297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 16307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfi_ioc_ctrl_req_s disable_req; 16317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfi_h2i_set(disable_req.mh, BFI_MC_IOC, BFI_IOC_H2I_DISABLE_REQ, 16337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_portid(ioc)); 16347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_mbox_send(ioc, &disable_req, sizeof(struct bfi_ioc_ctrl_req_s)); 16357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 16367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 16387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_send_getattr(struct bfa_ioc_s *ioc) 16397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1640a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfi_ioc_getattr_req_s attr_req; 16417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfi_h2i_set(attr_req.mh, BFI_MC_IOC, BFI_IOC_H2I_GETATTR_REQ, 16437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_portid(ioc)); 16447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_dma_be_addr_set(attr_req.attr_addr, ioc->attr_dma.pa); 16457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_mbox_send(ioc, &attr_req, sizeof(attr_req)); 16467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 16477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 16497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hb_check(void *cbarg) 16507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 16510a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati struct bfa_ioc_s *ioc = cbarg; 1652a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 hb_count; 16537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16545344026065f79b102fcc44bc6332f856a111962aJing Huang hb_count = readl(ioc->ioc_regs.heartbeat); 16557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (ioc->hb_count == hb_count) { 16567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_recover(ioc); 16577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 16580a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati } else { 16590a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->hb_count = hb_count; 16607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 16617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_mbox_poll(ioc); 1663a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_hb_timer_start(ioc); 16647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 16657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 16677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hb_monitor(struct bfa_ioc_s *ioc) 16687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 16695344026065f79b102fcc44bc6332f856a111962aJing Huang ioc->hb_count = readl(ioc->ioc_regs.heartbeat); 1670a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_hb_timer_start(ioc); 16717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 16727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16735fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1674a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Initiate a full firmware download. 16757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 16767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 16777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_download_fw(struct bfa_ioc_s *ioc, u32 boot_type, 1678a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 boot_env) 16797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1680a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 *fwimg; 1681a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 pgnum, pgoff; 1682a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 loff = 0; 1683a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 chunkno = 0; 1684a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 i; 1685111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati u32 asicmode; 16867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1687111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati bfa_trc(ioc, bfa_cb_image_get_size(bfa_ioc_asic_gen(ioc))); 1688111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati fwimg = bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc), chunkno); 16897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1690f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang pgnum = PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, loff); 1691f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang pgoff = PSS_SMEM_PGOFF(loff); 16927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16935344026065f79b102fcc44bc6332f856a111962aJing Huang writel(pgnum, ioc->ioc_regs.host_page_num_fn); 16947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1695111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati for (i = 0; i < bfa_cb_image_get_size(bfa_ioc_asic_gen(ioc)); i++) { 16967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16970a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati if (BFA_IOC_FLASH_CHUNK_NO(i) != chunkno) { 16980a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati chunkno = BFA_IOC_FLASH_CHUNK_NO(i); 1699111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati fwimg = bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc), 17000a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati BFA_IOC_FLASH_CHUNK_ADDR(chunkno)); 17017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 17027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 17035fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 17047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * write smem 17057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 17067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_mem_write(ioc->ioc_regs.smem_page_start, loff, 17070a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati fwimg[BFA_IOC_FLASH_OFFSET_IN_CHUNK(i)]); 17087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 17097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang loff += sizeof(u32); 17107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 17115fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 17127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * handle page offset wrap around 17137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 17147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang loff = PSS_SMEM_PGOFF(loff); 17157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (loff == 0) { 17167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pgnum++; 17175344026065f79b102fcc44bc6332f856a111962aJing Huang writel(pgnum, ioc->ioc_regs.host_page_num_fn); 17187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 17197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 17207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1721f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, 0), 1722f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang ioc->ioc_regs.host_page_num_fn); 172313cc20c5e764e6ef8d57f33980ab8c386c25fb4dKrishna Gudipati 172413cc20c5e764e6ef8d57f33980ab8c386c25fb4dKrishna Gudipati /* 1725111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati * Set boot type and device mode at the end. 1726111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati */ 1727111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati asicmode = BFI_FWBOOT_DEVMODE(ioc->asic_gen, ioc->asic_mode, 1728111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->port0_mode, ioc->port1_mode); 1729111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati bfa_mem_write(ioc->ioc_regs.smem_page_start, BFI_FWBOOT_DEVMODE_OFF, 1730111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati swab32(asicmode)); 1731111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati bfa_mem_write(ioc->ioc_regs.smem_page_start, BFI_FWBOOT_TYPE_OFF, 17325344026065f79b102fcc44bc6332f856a111962aJing Huang swab32(boot_type)); 1733111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati bfa_mem_write(ioc->ioc_regs.smem_page_start, BFI_FWBOOT_ENV_OFF, 17345344026065f79b102fcc44bc6332f856a111962aJing Huang swab32(boot_env)); 1735a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1736a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1737a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 17385fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1739a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Update BFA configuration from firmware configuration. 1740a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1741a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1742a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_getattr_reply(struct bfa_ioc_s *ioc) 1743a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1744a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfi_ioc_attr_s *attr = ioc->attr; 1745a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1746ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang attr->adapter_prop = be32_to_cpu(attr->adapter_prop); 1747ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang attr->card_type = be32_to_cpu(attr->card_type); 1748ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang attr->maxfrsize = be16_to_cpu(attr->maxfrsize); 17495a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati ioc->fcmode = (attr->port_mode == BFI_PORT_MODE_FC); 1750a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1751a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_send_event(ioc, IOC_E_FWRSP_GETATTR); 1752a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1753a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 17545fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1755a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Attach time initialization of mbox logic. 1756a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1757a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1758a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_mbox_attach(struct bfa_ioc_s *ioc) 1759a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1760a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioc_mbox_mod_s *mod = &ioc->mbox_mod; 1761a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int mc; 1762a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1763a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati INIT_LIST_HEAD(&mod->cmd_q); 1764a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati for (mc = 0; mc < BFI_MC_MAX; mc++) { 1765a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati mod->mbhdlr[mc].cbfn = NULL; 1766a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati mod->mbhdlr[mc].cbarg = ioc->bfa; 1767a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1768a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1769a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 17705fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1771a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Mbox poll timer -- restarts any pending mailbox requests. 1772a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1773a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 1774a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_mbox_poll(struct bfa_ioc_s *ioc) 1775a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1776a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioc_mbox_mod_s *mod = &ioc->mbox_mod; 1777a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_mbox_cmd_s *cmd; 1778a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 stat; 1779a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 17805fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1781a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * If no command pending, do nothing 1782a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1783a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (list_empty(&mod->cmd_q)) 1784a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return; 1785a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 17865fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1787a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * If previous command is not yet fetched by firmware, do nothing 1788a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 17895344026065f79b102fcc44bc6332f856a111962aJing Huang stat = readl(ioc->ioc_regs.hfn_mbox_cmd); 1790a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (stat) 1791a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return; 1792a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 17935fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1794a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Enqueue command to firmware. 1795a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1796a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_q_deq(&mod->cmd_q, &cmd); 1797a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_mbox_send(ioc, cmd->msg, sizeof(cmd->msg)); 1798a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1799a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 18005fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1801a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Cleanup any pending requests. 1802a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1803a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 18048b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipatibfa_ioc_mbox_flush(struct bfa_ioc_s *ioc) 1805a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1806a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioc_mbox_mod_s *mod = &ioc->mbox_mod; 1807a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_mbox_cmd_s *cmd; 1808a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1809a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati while (!list_empty(&mod->cmd_q)) 1810a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_q_deq(&mod->cmd_q, &cmd); 1811a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1812a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 18135fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1814a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Read data from SMEM to host through PCI memmap 1815a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * 1816a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in] ioc memory for IOC 1817a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in] tbuf app memory to store data from smem 1818a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in] soff smem offset 1819a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in] sz size of smem in bytes 1820a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1821a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_status_t 1822a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_smem_read(struct bfa_ioc_s *ioc, void *tbuf, u32 soff, u32 sz) 1823a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 182450444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie u32 pgnum, loff; 182550444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be32 r32; 1826a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int i, len; 1827a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 *buf = tbuf; 1828a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1829f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang pgnum = PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, soff); 1830f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang loff = PSS_SMEM_PGOFF(soff); 1831a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, pgnum); 1832a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, loff); 1833a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, sz); 1834a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1835a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati /* 1836a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Hold semaphore to serialize pll init and fwtrc. 1837a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1838a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (BFA_FALSE == bfa_ioc_sem_get(ioc->ioc_regs.ioc_init_sem_reg)) { 1839a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, 0); 1840a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_STATUS_FAILED; 1841a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1842a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 18435344026065f79b102fcc44bc6332f856a111962aJing Huang writel(pgnum, ioc->ioc_regs.host_page_num_fn); 1844a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1845a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati len = sz/sizeof(u32); 1846a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, len); 1847a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati for (i = 0; i < len; i++) { 1848a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati r32 = bfa_mem_read(ioc->ioc_regs.smem_page_start, loff); 1849ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang buf[i] = be32_to_cpu(r32); 1850a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati loff += sizeof(u32); 1851a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 18525fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1853a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * handle page offset wrap around 1854a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1855a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati loff = PSS_SMEM_PGOFF(loff); 1856a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (loff == 0) { 1857a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati pgnum++; 18585344026065f79b102fcc44bc6332f856a111962aJing Huang writel(pgnum, ioc->ioc_regs.host_page_num_fn); 1859a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1860a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1861f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, 0), 1862f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang ioc->ioc_regs.host_page_num_fn); 1863a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati /* 1864a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * release semaphore. 1865a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 18665a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati readl(ioc->ioc_regs.ioc_init_sem_reg); 1867f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(1, ioc->ioc_regs.ioc_init_sem_reg); 1868a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1869a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, pgnum); 1870a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_STATUS_OK; 1871a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 1872a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 18735fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 1874a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Clear SMEM data from host through PCI memmap 1875a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * 1876a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in] ioc memory for IOC 1877a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in] soff smem offset 1878a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in] sz size of smem in bytes 1879a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1880a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_status_t 1881a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_smem_clr(struct bfa_ioc_s *ioc, u32 soff, u32 sz) 1882a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 1883a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int i, len; 1884a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 pgnum, loff; 1885a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1886f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang pgnum = PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, soff); 1887f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang loff = PSS_SMEM_PGOFF(soff); 1888a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, pgnum); 1889a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, loff); 1890a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, sz); 1891a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1892a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati /* 1893a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Hold semaphore to serialize pll init and fwtrc. 1894a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1895a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (BFA_FALSE == bfa_ioc_sem_get(ioc->ioc_regs.ioc_init_sem_reg)) { 1896a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, 0); 1897a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_STATUS_FAILED; 1898a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1899a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 19005344026065f79b102fcc44bc6332f856a111962aJing Huang writel(pgnum, ioc->ioc_regs.host_page_num_fn); 1901a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1902a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati len = sz/sizeof(u32); /* len in words */ 1903a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, len); 1904a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati for (i = 0; i < len; i++) { 1905a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_mem_write(ioc->ioc_regs.smem_page_start, loff, 0); 1906a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati loff += sizeof(u32); 1907a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 19085fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1909a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * handle page offset wrap around 1910a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1911a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati loff = PSS_SMEM_PGOFF(loff); 1912a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (loff == 0) { 1913a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati pgnum++; 19145344026065f79b102fcc44bc6332f856a111962aJing Huang writel(pgnum, ioc->ioc_regs.host_page_num_fn); 1915a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1916a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 1917f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, 0), 1918f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang ioc->ioc_regs.host_page_num_fn); 1919a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1920a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati /* 1921a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * release semaphore. 1922a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 19235a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati readl(ioc->ioc_regs.ioc_init_sem_reg); 1924f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(1, ioc->ioc_regs.ioc_init_sem_reg); 1925a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, pgnum); 1926a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_STATUS_OK; 19277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 19287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 19297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 19304e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipatibfa_ioc_fail_notify(struct bfa_ioc_s *ioc) 19314e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati{ 19324e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati struct bfad_s *bfad = (struct bfad_s *)ioc->bfa->bfad; 19334e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati 19348f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang /* 19354e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati * Notify driver and common modules registered for notification. 19364e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati */ 19374e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati ioc->cbfn->hbfail_cbfn(ioc->bfa); 1938d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati bfa_ioc_event_notify(ioc, BFA_IOC_E_FAILED); 19394e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati 19404e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati bfa_ioc_debug_save_ftrc(ioc); 19414e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati 19424e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati BFA_LOG(KERN_CRIT, bfad, bfa_log_level, 19434e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati "Heart Beat of IOC has failed\n"); 19447826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_ioc_aen_post(ioc, BFA_IOC_AEN_HBFAIL); 19454e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati 19464e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati} 19474e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati 19484e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipatistatic void 1949a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_pf_fwmismatch(struct bfa_ioc_s *ioc) 19507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1951a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfad_s *bfad = (struct bfad_s *)ioc->bfa->bfad; 19525fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 1953a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Provide enable completion callback. 19547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 1955a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE); 19568816624222b12e5d7e291e9d1973fc42b994eb6bJing Huang BFA_LOG(KERN_WARNING, bfad, bfa_log_level, 1957a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati "Running firmware version is incompatible " 1958a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati "with the driver version\n"); 19597826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_ioc_aen_post(ioc, BFA_IOC_AEN_FWMISMATCH); 1960a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 19617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1962a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_status_t 1963a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_pll_init(struct bfa_ioc_s *ioc) 19647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 19657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1966a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati /* 1967a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Hold semaphore so that nobody can access the chip during init. 1968a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 1969a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_sem_get(ioc->ioc_regs.ioc_init_sem_reg); 19707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1971a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_pll_init_asic(ioc); 1972a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1973a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc->pllinit = BFA_TRUE; 19748919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati 19758919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati /* 19768919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati * Initialize LMEM 19778919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati */ 19788919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati bfa_ioc_lmem_init(ioc); 19798919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati 1980a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati /* 1981a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * release semaphore. 1982a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 19835a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati readl(ioc->ioc_regs.ioc_init_sem_reg); 1984f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang writel(1, ioc->ioc_regs.ioc_init_sem_reg); 1985a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 1986a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_STATUS_OK; 1987a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 19887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 19895fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 19907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Interface used by diag module to do firmware boot with memory test 19917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * as the entry vector. 19927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 19937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 1994a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_boot(struct bfa_ioc_s *ioc, u32 boot_type, u32 boot_env) 19957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 19967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_stats(ioc, ioc_boots); 19977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 19987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (bfa_ioc_pll_init(ioc) != BFA_STATUS_OK) 19997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 20007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20015fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 20027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Initialize IOC state of all functions on a chip reset. 20037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 2004111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati if (boot_type == BFI_FWBOOT_TYPE_MEMTEST) { 2005111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati writel(BFI_IOC_MEMTEST, ioc->ioc_regs.ioc_fwstate); 2006111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati writel(BFI_IOC_MEMTEST, ioc->ioc_regs.alt_ioc_fwstate); 20077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } else { 2008111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati writel(BFI_IOC_INITING, ioc->ioc_regs.ioc_fwstate); 2009111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati writel(BFI_IOC_INITING, ioc->ioc_regs.alt_ioc_fwstate); 20107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 20117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 201207b2838669dc7704e02e079b1a96602656893d78Jing Huang bfa_ioc_msgflush(ioc); 2013a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_download_fw(ioc, boot_type, boot_env); 20147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_lpu_start(ioc); 20157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 20167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20175fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 20187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Enable/disable IOC failure auto recovery. 20197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 20207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 20217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_auto_recover(bfa_boolean_t auto_recover) 20227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 20232f9b8857a914b71ba1b84fb23a0a20a87de41c91Krishna Gudipati bfa_auto_recover = auto_recover; 20247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 20257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2027a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 20287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_boolean_t 20297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_is_operational(struct bfa_ioc_s *ioc) 20307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 20317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return bfa_fsm_cmp_state(ioc, bfa_ioc_sm_op); 20327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 20337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2034a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_boolean_t 2035a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_is_initialized(struct bfa_ioc_s *ioc) 2036a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 20375344026065f79b102fcc44bc6332f856a111962aJing Huang u32 r32 = readl(ioc->ioc_regs.ioc_fwstate); 2038a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2039a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return ((r32 != BFI_IOC_UNINIT) && 2040a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (r32 != BFI_IOC_INITING) && 2041a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati (r32 != BFI_IOC_MEMTEST)); 2042a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2043a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2044111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatibfa_boolean_t 20457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_msgget(struct bfa_ioc_s *ioc, void *mbmsg) 20467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 204750444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie __be32 *msgp = mbmsg; 2048a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 r32; 2049a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int i; 20507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2051111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati r32 = readl(ioc->ioc_regs.lpu_mbox_cmd); 2052111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati if ((r32 & 1) == 0) 2053111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati return BFA_FALSE; 2054111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 20555fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 20567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * read the MBOX msg 20577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 20587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (i = 0; i < (sizeof(union bfi_ioc_i2h_msg_u) / sizeof(u32)); 20597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang i++) { 20605344026065f79b102fcc44bc6332f856a111962aJing Huang r32 = readl(ioc->ioc_regs.lpu_mbox + 20617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang i * sizeof(u32)); 2062ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang msgp[i] = cpu_to_be32(r32); 20637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 20647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20655fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 20667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * turn off mailbox interrupt by clearing mailbox status 20677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 20685344026065f79b102fcc44bc6332f856a111962aJing Huang writel(1, ioc->ioc_regs.lpu_mbox_cmd); 20695344026065f79b102fcc44bc6332f856a111962aJing Huang readl(ioc->ioc_regs.lpu_mbox_cmd); 2070111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 2071111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati return BFA_TRUE; 20727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 20737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 20757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_isr(struct bfa_ioc_s *ioc, struct bfi_mbmsg_s *m) 20767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2077a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati union bfi_ioc_i2h_msg_u *msg; 2078a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_iocpf_s *iocpf = &ioc->iocpf; 20797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2080a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati msg = (union bfi_ioc_i2h_msg_u *) m; 20817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_stats(ioc, ioc_isrs); 20837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (msg->mh.msg_id) { 20857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFI_IOC_I2H_HBEAT: 20867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 20877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFI_IOC_I2H_ENABLE_REPLY: 20891a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc->port_mode = ioc->port_mode_cfg = 20901a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati (enum bfa_mode_s)msg->fw_event.port_mode; 20911a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc->ad_cap_bm = msg->fw_event.cap_bm; 2092a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_send_event(iocpf, IOCPF_E_FWRSP_ENABLE); 20937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 20947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFI_IOC_I2H_DISABLE_REPLY: 2096a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_send_event(iocpf, IOCPF_E_FWRSP_DISABLE); 20977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 20987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFI_IOC_I2H_GETATTR_REPLY: 21007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_getattr_reply(ioc); 21017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 21027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 21037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 21047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, msg->mh.msg_id); 2105d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(1); 21067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 21077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 21087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 21095fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 21107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC attach time initialization and setup. 21117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 21127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] ioc memory for IOC 21137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] bfa driver instance structure 21147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 21157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 21167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_attach(struct bfa_ioc_s *ioc, void *bfa, struct bfa_ioc_cbfn_s *cbfn, 2117a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_timer_mod_s *timer_mod) 2118a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2119a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc->bfa = bfa; 2120a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc->cbfn = cbfn; 2121a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc->timer_mod = timer_mod; 2122a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc->fcmode = BFA_FALSE; 2123a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc->pllinit = BFA_FALSE; 21247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->dbg_fwsave_once = BFA_TRUE; 2125a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc->iocpf.ioc = ioc; 21267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 21277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_mbox_attach(ioc); 2128d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati INIT_LIST_HEAD(&ioc->notify_q); 21297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2130a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit); 2131a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_send_event(ioc, IOC_E_RESET); 21327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 21337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 21345fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 21357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Driver detach time IOC cleanup. 21367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 21377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 21387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_detach(struct bfa_ioc_s *ioc) 21397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 21407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_send_event(ioc, IOC_E_DETACH); 21413350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati INIT_LIST_HEAD(&ioc->notify_q); 21427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 21437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 21445fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 21457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Setup IOC PCI properties. 21467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 21477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] pcidev PCI device information for this IOC 21487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 21497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 21507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_pci_init(struct bfa_ioc_s *ioc, struct bfa_pcidev_s *pcidev, 2151d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati enum bfi_pcifn_class clscode) 21527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2153d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati ioc->clscode = clscode; 2154a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc->pcidev = *pcidev; 2155111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 2156111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati /* 2157111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati * Initialize IOC and device personality 2158111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati */ 2159111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->port0_mode = ioc->port1_mode = BFI_PORT_MODE_FC; 2160111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->asic_mode = BFI_ASIC_MODE_FC; 2161111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 2162111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati switch (pcidev->device_id) { 2163111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati case BFA_PCI_DEVICE_ID_FC_8G1P: 2164111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati case BFA_PCI_DEVICE_ID_FC_8G2P: 2165111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->asic_gen = BFI_ASIC_GEN_CB; 21661a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc->fcmode = BFA_TRUE; 21671a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc->port_mode = ioc->port_mode_cfg = BFA_MODE_HBA; 21681a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc->ad_cap_bm = BFA_CM_HBA; 2169111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati break; 2170111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 2171111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati case BFA_PCI_DEVICE_ID_CT: 2172111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->asic_gen = BFI_ASIC_GEN_CT; 2173111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->port0_mode = ioc->port1_mode = BFI_PORT_MODE_ETH; 2174111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->asic_mode = BFI_ASIC_MODE_ETH; 21751a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc->port_mode = ioc->port_mode_cfg = BFA_MODE_CNA; 21761a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc->ad_cap_bm = BFA_CM_CNA; 2177111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati break; 2178111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 2179111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati case BFA_PCI_DEVICE_ID_CT_FC: 2180111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->asic_gen = BFI_ASIC_GEN_CT; 21811a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc->fcmode = BFA_TRUE; 21821a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc->port_mode = ioc->port_mode_cfg = BFA_MODE_HBA; 21831a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc->ad_cap_bm = BFA_CM_HBA; 2184111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati break; 2185111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 2186111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati case BFA_PCI_DEVICE_ID_CT2: 2187111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->asic_gen = BFI_ASIC_GEN_CT2; 21881a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (clscode == BFI_PCIFN_CLASS_FC && 21891a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati pcidev->ssid == BFA_PCI_CT2_SSID_FC) { 2190111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->asic_mode = BFI_ASIC_MODE_FC16; 21911a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc->fcmode = BFA_TRUE; 21921a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc->port_mode = ioc->port_mode_cfg = BFA_MODE_HBA; 21931a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc->ad_cap_bm = BFA_CM_HBA; 21941a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } else { 2195111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc->port0_mode = ioc->port1_mode = BFI_PORT_MODE_ETH; 21961a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc->asic_mode = BFI_ASIC_MODE_ETH; 21971a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (pcidev->ssid == BFA_PCI_CT2_SSID_FCoE) { 21981a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc->port_mode = 21991a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc->port_mode_cfg = BFA_MODE_CNA; 22001a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc->ad_cap_bm = BFA_CM_CNA; 22011a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } else { 22021a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc->port_mode = 22031a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc->port_mode_cfg = BFA_MODE_NIC; 22041a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc->ad_cap_bm = BFA_CM_NIC; 22051a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 2206111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati } 2207111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati break; 2208111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 2209111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati default: 2210111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati WARN_ON(1); 2211111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati } 22127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 22135fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 22140a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Set asic specific interfaces. See bfa_ioc_cb.c and bfa_ioc_ct.c 22150a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 2216111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati if (ioc->asic_gen == BFI_ASIC_GEN_CB) 22170a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_ioc_set_cb_hwif(ioc); 2218111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati else if (ioc->asic_gen == BFI_ASIC_GEN_CT) 2219111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati bfa_ioc_set_ct_hwif(ioc); 2220111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati else { 2221111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati WARN_ON(ioc->asic_gen != BFI_ASIC_GEN_CT2); 2222111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati bfa_ioc_set_ct2_hwif(ioc); 2223111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati bfa_ioc_ct2_poweron(ioc); 2224111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati } 22250a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 22267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_map_port(ioc); 22277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_reg_init(ioc); 22287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 22297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 22305fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 22317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Initialize IOC dma memory 22327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 22337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] dm_kva kernel virtual address of IOC dma memory 22347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] dm_pa physical address of IOC dma memory 22357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 22367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 2237a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_mem_claim(struct bfa_ioc_s *ioc, u8 *dm_kva, u64 dm_pa) 22387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 22395fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 22407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * dma memory for firmware attribute 22417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 22427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->attr_dma.kva = dm_kva; 22437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->attr_dma.pa = dm_pa; 2244a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc->attr = (struct bfi_ioc_attr_s *) dm_kva; 22457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 22467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 22477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 22487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_enable(struct bfa_ioc_s *ioc) 22497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 22507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_stats(ioc, ioc_enables); 22517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->dbg_fwsave_once = BFA_TRUE; 22527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 22537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_send_event(ioc, IOC_E_ENABLE); 22547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 22557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 22567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 22577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_disable(struct bfa_ioc_s *ioc) 22587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 22597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_stats(ioc, ioc_disables); 22607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_send_event(ioc, IOC_E_DISABLE); 22617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 22627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 22637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 22645fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 22657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Initialize memory for saving firmware trace. Driver must initialize 22667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * trace memory before call bfa_ioc_enable(). 22677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 22687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 22697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_debug_memclaim(struct bfa_ioc_s *ioc, void *dbg_fwsave) 22707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2271a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc->dbg_fwsave = dbg_fwsave; 2272f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang ioc->dbg_fwsave_len = (ioc->iocpf.auto_recover) ? BFA_DBG_FWTRC_LEN : 0; 22737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 22747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 22755fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 22767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Register mailbox message handler functions 22777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 22787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] ioc IOC instance 22797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] mcfuncs message class handler functions 22807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 22817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 22827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_register(struct bfa_ioc_s *ioc, bfa_ioc_mbox_mcfunc_t *mcfuncs) 22837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2284a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioc_mbox_mod_s *mod = &ioc->mbox_mod; 2285a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int mc; 22867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 22877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (mc = 0; mc < BFI_MC_MAX; mc++) 22887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang mod->mbhdlr[mc].cbfn = mcfuncs[mc]; 22897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 22907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 22915fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 22927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Register mailbox message handler function, to be called by common modules 22937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 22947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 22957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_regisr(struct bfa_ioc_s *ioc, enum bfi_mclass mc, 22967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_mbox_mcfunc_t cbfn, void *cbarg) 22977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2298a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioc_mbox_mod_s *mod = &ioc->mbox_mod; 22997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2300a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati mod->mbhdlr[mc].cbfn = cbfn; 2301a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati mod->mbhdlr[mc].cbarg = cbarg; 23027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 23037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 23045fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 23057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Queue a mailbox command request to firmware. Waits if mailbox is busy. 23067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Responsibility of caller to serialize 23077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 23087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] ioc IOC instance 23097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[i] cmd Mailbox command 23107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 23117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 23127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_queue(struct bfa_ioc_s *ioc, struct bfa_mbox_cmd_s *cmd) 23137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2314a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioc_mbox_mod_s *mod = &ioc->mbox_mod; 2315a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 stat; 23167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 23175fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 23187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * If a previous command is pending, queue new command 23197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 23207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!list_empty(&mod->cmd_q)) { 23217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang list_add_tail(&cmd->qe, &mod->cmd_q); 23227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 23237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 23247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 23255fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 23267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * If mailbox is busy, queue command for poll timer 23277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 23285344026065f79b102fcc44bc6332f856a111962aJing Huang stat = readl(ioc->ioc_regs.hfn_mbox_cmd); 23297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (stat) { 23307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang list_add_tail(&cmd->qe, &mod->cmd_q); 23317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 23327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 23337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 23345fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 23357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * mailbox is free -- queue command to firmware 23367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 23377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_mbox_send(ioc, cmd->msg, sizeof(cmd->msg)); 23387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 23397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 23405fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 23417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Handle mailbox interrupts 23427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 23437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 23447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_isr(struct bfa_ioc_s *ioc) 23457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2346a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioc_mbox_mod_s *mod = &ioc->mbox_mod; 2347a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfi_mbmsg_s m; 2348a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int mc; 23497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 23508b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati if (bfa_ioc_msgget(ioc, &m)) { 23518b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati /* 23528b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati * Treat IOC message class as special. 23538b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati */ 23548b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati mc = m.mh.msg_class; 23558b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati if (mc == BFI_MC_IOC) { 23568b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati bfa_ioc_isr(ioc, &m); 23578b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati return; 23588b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati } 23597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 23608b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati if ((mc > BFI_MC_MAX) || (mod->mbhdlr[mc].cbfn == NULL)) 23618b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati return; 23628b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati 23638b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati mod->mbhdlr[mc].cbfn(mod->mbhdlr[mc].cbarg, &m); 23647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 23657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 23668b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati bfa_ioc_lpu_read_stat(ioc); 23677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 23688b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati /* 23698b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati * Try to send pending mailbox commands 23708b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati */ 23718b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati bfa_ioc_mbox_poll(ioc); 23727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 23737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 23747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 23757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_error_isr(struct bfa_ioc_s *ioc) 23767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 23775a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati bfa_ioc_stats(ioc, ioc_hbfails); 23785a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati ioc->stats.hb_count = ioc->hb_count; 23797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_send_event(ioc, IOC_E_HWERROR); 23807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 23817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 23825fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 23837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * return true if IOC is disabled 23847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 23857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_boolean_t 23867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_is_disabled(struct bfa_ioc_s *ioc) 23877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2388a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return bfa_fsm_cmp_state(ioc, bfa_ioc_sm_disabling) || 2389a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_cmp_state(ioc, bfa_ioc_sm_disabled); 23907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 23917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 23925fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 23937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * return true if IOC firmware is different. 23947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 23957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_boolean_t 23967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_fw_mismatch(struct bfa_ioc_s *ioc) 23977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2398a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return bfa_fsm_cmp_state(ioc, bfa_ioc_sm_reset) || 2399a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_cmp_state(&ioc->iocpf, bfa_iocpf_sm_fwcheck) || 2400a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_cmp_state(&ioc->iocpf, bfa_iocpf_sm_mismatch); 24017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 24027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 24037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define bfa_ioc_state_disabled(__sm) \ 24047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang (((__sm) == BFI_IOC_UNINIT) || \ 24057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ((__sm) == BFI_IOC_INITING) || \ 24067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ((__sm) == BFI_IOC_HWINIT) || \ 24077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ((__sm) == BFI_IOC_DISABLED) || \ 24080a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ((__sm) == BFI_IOC_FAIL) || \ 24097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ((__sm) == BFI_IOC_CFG_DISABLED)) 24107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 24115fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 24127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Check if adapter is disabled -- both IOCs should be in a disabled 24137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * state. 24147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 24157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_boolean_t 24167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_adapter_is_disabled(struct bfa_ioc_s *ioc) 24177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2418a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 ioc_state; 24197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 24207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!bfa_fsm_cmp_state(ioc, bfa_ioc_sm_disabled)) 24217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_FALSE; 24227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2423111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc_state = readl(ioc->ioc_regs.ioc_fwstate); 24247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!bfa_ioc_state_disabled(ioc_state)) 24257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_FALSE; 24267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2427a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (ioc->pcidev.device_id != BFA_PCI_DEVICE_ID_FC_8G1P) { 2428111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ioc_state = readl(ioc->ioc_regs.alt_ioc_fwstate); 2429a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (!bfa_ioc_state_disabled(ioc_state)) 2430a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_FALSE; 2431a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 24327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 24337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_TRUE; 24347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 24357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 24368f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang/* 2437f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * Reset IOC fwstate registers. 2438f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati */ 2439f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipativoid 2440f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_ioc_reset_fwstate(struct bfa_ioc_s *ioc) 2441f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{ 2442f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel(BFI_IOC_UNINIT, ioc->ioc_regs.ioc_fwstate); 2443f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati writel(BFI_IOC_UNINIT, ioc->ioc_regs.alt_ioc_fwstate); 2444f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati} 2445f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati 24467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define BFA_MFG_NAME "Brocade" 24477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 24487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_adapter_attr(struct bfa_ioc_s *ioc, 24497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_adapter_attr_s *ad_attr) 24507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2451a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfi_ioc_attr_s *ioc_attr; 24527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 24537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc_attr = ioc->attr; 24540a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 24550a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_ioc_get_adapter_serial_num(ioc, ad_attr->serial_num); 24560a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_ioc_get_adapter_fw_ver(ioc, ad_attr->fw_ver); 24570a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_ioc_get_adapter_optrom_ver(ioc, ad_attr->optrom_ver); 24580a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_ioc_get_adapter_manufacturer(ioc, ad_attr->manufacturer); 24596a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(&ad_attr->vpd, &ioc_attr->vpd, 24607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang sizeof(struct bfa_mfg_vpd_s)); 24617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 24620a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati ad_attr->nports = bfa_ioc_get_nports(ioc); 24630a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati ad_attr->max_speed = bfa_ioc_speed_sup(ioc); 24647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 24650a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_ioc_get_adapter_model(ioc, ad_attr->model); 24660a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati /* For now, model descr uses same model string */ 24670a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_ioc_get_adapter_model(ioc, ad_attr->model_descr); 24687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2469ed96932470e4ca3aab29518a748dc1162853b456Jing Huang ad_attr->card_type = ioc_attr->card_type; 2470ed96932470e4ca3aab29518a748dc1162853b456Jing Huang ad_attr->is_mezz = bfa_mfg_is_mezz(ioc_attr->card_type); 2471ed96932470e4ca3aab29518a748dc1162853b456Jing Huang 24727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (BFI_ADAPTER_IS_SPECIAL(ioc_attr->adapter_prop)) 24737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ad_attr->prototype = 1; 24747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang else 24757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ad_attr->prototype = 0; 24767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2477f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang ad_attr->pwwn = ioc->attr->pwwn; 2478a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ad_attr->mac = bfa_ioc_get_mac(ioc); 24797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 24807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ad_attr->pcie_gen = ioc_attr->pcie_gen; 24817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ad_attr->pcie_lanes = ioc_attr->pcie_lanes; 24827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ad_attr->pcie_lanes_orig = ioc_attr->pcie_lanes_orig; 24837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ad_attr->asic_rev = ioc_attr->asic_rev; 24840a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 24850a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_ioc_get_pci_chip_rev(ioc, ad_attr->hw_ver); 24867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2487111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ad_attr->cna_capable = bfa_ioc_is_cna(ioc); 2488111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ad_attr->trunk_capable = (ad_attr->nports > 1) && 2489111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati !bfa_ioc_is_cna(ioc) && !ad_attr->is_mezz; 24907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 24917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 24922993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipatienum bfa_ioc_type_e 24932993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipatibfa_ioc_get_type(struct bfa_ioc_s *ioc) 24942993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati{ 2495111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati if (ioc->clscode == BFI_PCIFN_CLASS_ETH) 24962993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati return BFA_IOC_TYPE_LL; 2497111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 2498111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati WARN_ON(ioc->clscode != BFI_PCIFN_CLASS_FC); 2499111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati 25005a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati return (ioc->attr->port_mode == BFI_PORT_MODE_FC) 2501111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati ? BFA_IOC_TYPE_FC : BFA_IOC_TYPE_FCoE; 25022993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati} 25032993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati 25047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 25050a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_adapter_serial_num(struct bfa_ioc_s *ioc, char *serial_num) 25060a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{ 25076a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset((void *)serial_num, 0, BFA_ADAPTER_SERIAL_NUM_LEN); 25086a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy((void *)serial_num, 25090a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati (void *)ioc->attr->brcd_serialnum, 25100a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati BFA_ADAPTER_SERIAL_NUM_LEN); 25110a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati} 25120a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 25130a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid 25140a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_adapter_fw_ver(struct bfa_ioc_s *ioc, char *fw_ver) 25150a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{ 25166a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset((void *)fw_ver, 0, BFA_VERSION_LEN); 25176a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(fw_ver, ioc->attr->fw_version, BFA_VERSION_LEN); 25180a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati} 25190a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 25200a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid 25210a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_pci_chip_rev(struct bfa_ioc_s *ioc, char *chip_rev) 25220a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{ 2523d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(!chip_rev); 25240a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 25256a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset((void *)chip_rev, 0, BFA_IOC_CHIP_REV_LEN); 25260a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 25270a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati chip_rev[0] = 'R'; 25280a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati chip_rev[1] = 'e'; 25290a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati chip_rev[2] = 'v'; 25300a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati chip_rev[3] = '-'; 25310a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati chip_rev[4] = ioc->attr->asic_rev; 25320a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati chip_rev[5] = '\0'; 25330a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati} 25340a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 25350a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid 25360a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_adapter_optrom_ver(struct bfa_ioc_s *ioc, char *optrom_ver) 25370a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{ 25386a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset((void *)optrom_ver, 0, BFA_VERSION_LEN); 25396a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(optrom_ver, ioc->attr->optrom_version, 2540a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFA_VERSION_LEN); 25410a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati} 25420a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 25430a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid 25440a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_adapter_manufacturer(struct bfa_ioc_s *ioc, char *manufacturer) 25450a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{ 25466a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset((void *)manufacturer, 0, BFA_ADAPTER_MFG_NAME_LEN); 25476a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(manufacturer, BFA_MFG_NAME, BFA_ADAPTER_MFG_NAME_LEN); 25480a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati} 25490a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 25500a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid 25510a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_adapter_model(struct bfa_ioc_s *ioc, char *model) 25520a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{ 2553a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfi_ioc_attr_s *ioc_attr; 25540a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 2555d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(!model); 25566a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset((void *)model, 0, BFA_ADAPTER_MODEL_NAME_LEN); 25570a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 25580a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati ioc_attr = ioc->attr; 25590a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 256010a07379247078448c076690657a076076bf89aaKrishna Gudipati snprintf(model, BFA_ADAPTER_MODEL_NAME_LEN, "%s-%u", 25618b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati BFA_MFG_NAME, ioc_attr->card_type); 25620a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati} 25630a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 25640a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatienum bfa_ioc_state 25650a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_state(struct bfa_ioc_s *ioc) 25660a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{ 2567a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_iocpf_state iocpf_st; 2568a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati enum bfa_ioc_state ioc_st = bfa_sm_to_state(ioc_sm_table, ioc->fsm); 2569a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2570a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (ioc_st == BFA_IOC_ENABLING || 2571a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc_st == BFA_IOC_FAIL || ioc_st == BFA_IOC_INITFAIL) { 2572a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2573a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati iocpf_st = bfa_sm_to_state(iocpf_sm_table, ioc->iocpf.fsm); 2574a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2575a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati switch (iocpf_st) { 2576a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOCPF_SEMWAIT: 2577a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc_st = BFA_IOC_SEMWAIT; 2578a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2579a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2580a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOCPF_HWINIT: 2581a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc_st = BFA_IOC_HWINIT; 2582a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2583a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2584a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOCPF_FWMISMATCH: 2585a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc_st = BFA_IOC_FWMISMATCH; 2586a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2587a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2588a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOCPF_FAIL: 2589a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc_st = BFA_IOC_FAIL; 2590a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2591a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2592a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati case BFA_IOCPF_INITFAIL: 2593a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc_st = BFA_IOC_INITFAIL; 2594a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2595a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2596a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati default: 2597a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati break; 2598a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2599a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2600a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2601a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return ioc_st; 26020a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati} 26030a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 26040a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid 26057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_attr(struct bfa_ioc_s *ioc, struct bfa_ioc_attr_s *ioc_attr) 26067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 26076a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memset((void *)ioc_attr, 0, sizeof(struct bfa_ioc_attr_s)); 26087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 26090a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati ioc_attr->state = bfa_ioc_get_state(ioc); 26107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc_attr->port_id = ioc->port_id; 26111a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc_attr->port_mode = ioc->port_mode; 26121a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc_attr->port_mode_cfg = ioc->port_mode_cfg; 26131a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ioc_attr->cap_bm = ioc->ad_cap_bm; 26147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 26152993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati ioc_attr->ioc_type = bfa_ioc_get_type(ioc); 26167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 26177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_get_adapter_attr(ioc, &ioc_attr->adapter_attr); 26187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 26197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc_attr->pci_attr.device_id = ioc->pcidev.device_id; 26207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc_attr->pci_attr.pcifn = ioc->pcidev.pci_func; 26210a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_ioc_get_pci_chip_rev(ioc, ioc_attr->pci_attr.chip_rev); 26227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 26237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 26247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangmac_t 26257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_mac(struct bfa_ioc_s *ioc) 26267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 262715b64a835def4c784c6e62ad762677f5cb56eba2Jing Huang /* 2628a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Check the IOC type and return the appropriate MAC 262915b64a835def4c784c6e62ad762677f5cb56eba2Jing Huang */ 263015b64a835def4c784c6e62ad762677f5cb56eba2Jing Huang if (bfa_ioc_get_type(ioc) == BFA_IOC_TYPE_FCoE) 2631a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return ioc->attr->fcoe_mac; 263215b64a835def4c784c6e62ad762677f5cb56eba2Jing Huang else 263315b64a835def4c784c6e62ad762677f5cb56eba2Jing Huang return ioc->attr->mac; 263415b64a835def4c784c6e62ad762677f5cb56eba2Jing Huang} 263515b64a835def4c784c6e62ad762677f5cb56eba2Jing Huang 263615b64a835def4c784c6e62ad762677f5cb56eba2Jing Huangmac_t 263715b64a835def4c784c6e62ad762677f5cb56eba2Jing Huangbfa_ioc_get_mfg_mac(struct bfa_ioc_s *ioc) 263815b64a835def4c784c6e62ad762677f5cb56eba2Jing Huang{ 2639a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati mac_t m; 26407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2641a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m = ioc->attr->mfg_mac; 2642a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (bfa_mfg_is_old_wwn_mac_model(ioc->attr->card_type)) 2643a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati m.mac[MAC_ADDRLEN - 1] += bfa_ioc_pcifn(ioc); 2644a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati else 2645a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_mfg_increment_wwn_mac(&(m.mac[MAC_ADDRLEN-3]), 2646a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_pcifn(ioc)); 26477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2648a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return m; 26497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 26507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 26515fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 26527826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati * Send AEN notification 26537826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati */ 26547826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipativoid 26557826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipatibfa_ioc_aen_post(struct bfa_ioc_s *ioc, enum bfa_ioc_aen_event event) 26567826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati{ 26577826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati struct bfad_s *bfad = (struct bfad_s *)ioc->bfa->bfad; 26587826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati struct bfa_aen_entry_s *aen_entry; 26597826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati enum bfa_ioc_type_e ioc_type; 26607826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati 26617826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfad_get_aen_entry(bfad, aen_entry); 26627826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati if (!aen_entry) 26637826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati return; 26647826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati 26657826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati ioc_type = bfa_ioc_get_type(ioc); 26667826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati switch (ioc_type) { 26677826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati case BFA_IOC_TYPE_FC: 26687826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati aen_entry->aen_data.ioc.pwwn = ioc->attr->pwwn; 26697826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati break; 26707826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati case BFA_IOC_TYPE_FCoE: 26717826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati aen_entry->aen_data.ioc.pwwn = ioc->attr->pwwn; 26727826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati aen_entry->aen_data.ioc.mac = bfa_ioc_get_mac(ioc); 26737826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati break; 26747826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati case BFA_IOC_TYPE_LL: 26757826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati aen_entry->aen_data.ioc.mac = bfa_ioc_get_mac(ioc); 26767826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati break; 26777826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati default: 26787826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati WARN_ON(ioc_type != BFA_IOC_TYPE_FC); 26797826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati break; 26807826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati } 26817826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati 26827826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati /* Send the AEN notification */ 26837826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati aen_entry->aen_data.ioc.ioc_type = ioc_type; 26847826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfad_im_post_vendor_event(aen_entry, bfad, ++ioc->ioc_aen_seq, 26857826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati BFA_AEN_CAT_IOC, event); 26867826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati} 26877826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati 26887826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati/* 26897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Retrieve saved firmware trace from a prior IOC failure. 26907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 26917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t 26927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_debug_fwsave(struct bfa_ioc_s *ioc, void *trcdata, int *trclen) 26937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2694a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int tlen; 26957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 26967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (ioc->dbg_fwsave_len == 0) 26977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_ENOFSAVE; 26987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 26997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tlen = *trclen; 27007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tlen > ioc->dbg_fwsave_len) 27017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tlen = ioc->dbg_fwsave_len; 27027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 27036a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang memcpy(trcdata, ioc->dbg_fwsave, tlen); 27047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *trclen = tlen; 27057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_OK; 27067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 27077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2708738c9e66dcb7e17a962a7d65c976386b970d10caKrishna Gudipati 27095fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 27107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Retrieve saved firmware trace from a prior IOC failure. 27117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 27127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t 27137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_debug_fwtrc(struct bfa_ioc_s *ioc, void *trcdata, int *trclen) 27147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2715a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 loff = BFA_DBG_FWTRC_OFF(bfa_ioc_portid(ioc)); 2716a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int tlen; 2717a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_status_t status; 27187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 27197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, *trclen); 27207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 27217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tlen = *trclen; 27227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tlen > BFA_DBG_FWTRC_LEN) 27237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tlen = BFA_DBG_FWTRC_LEN; 27247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2725a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati status = bfa_ioc_smem_read(ioc, trcdata, loff, tlen); 2726a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *trclen = tlen; 2727a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return status; 2728a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 27297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2730a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 2731a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_send_fwsync(struct bfa_ioc_s *ioc) 2732a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2733a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_mbox_cmd_s cmd; 2734a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfi_ioc_ctrl_req_s *req = (struct bfi_ioc_ctrl_req_s *) cmd.msg; 27357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2736a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfi_h2i_set(req->mh, BFI_MC_IOC, BFI_IOC_H2I_DBG_SYNC, 2737a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_portid(ioc)); 2738d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati req->clscode = cpu_to_be16(ioc->clscode); 2739a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_mbox_queue(ioc, &cmd); 2740a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2741a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2742a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 2743a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_fwsync(struct bfa_ioc_s *ioc) 2744a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2745a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 fwsync_iter = 1000; 2746a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2747a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_send_fwsync(ioc); 2748a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 27495fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2750a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * After sending a fw sync mbox command wait for it to 2751a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * take effect. We will not wait for a response because 2752a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * 1. fw_sync mbox cmd doesn't have a response. 2753a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * 2. Even if we implement that, interrupts might not 2754a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * be enabled when we call this function. 2755a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * So, just keep checking if any mbox cmd is pending, and 2756a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * after waiting for a reasonable amount of time, go ahead. 2757a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * It is possible that fw has crashed and the mbox command 2758a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * is never acknowledged. 2759a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2760a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati while (bfa_ioc_mbox_cmd_pending(ioc) && fwsync_iter > 0) 2761a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati fwsync_iter--; 2762a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2763a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 27645fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 2765a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Dump firmware smem 2766a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2767a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_status_t 2768a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_debug_fwcore(struct bfa_ioc_s *ioc, void *buf, 2769a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 *offset, int *buflen) 2770a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2771a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 loff; 2772a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int dlen; 2773a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_status_t status; 2774a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 smem_len = BFA_IOC_FW_SMEM_SIZE(ioc); 2775a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2776a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (*offset >= smem_len) { 2777a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *offset = *buflen = 0; 2778a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_STATUS_EINVAL; 27797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 27800a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 2781a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati loff = *offset; 2782a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati dlen = *buflen; 2783a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 27845fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang /* 2785a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * First smem read, sync smem before proceeding 2786a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * No need to sync before reading every chunk. 27870a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 2788a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (loff == 0) 2789a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_fwsync(ioc); 27900a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 2791a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if ((loff + dlen) >= smem_len) 2792a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati dlen = smem_len - loff; 27937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2794a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati status = bfa_ioc_smem_read(ioc, buf, loff, dlen); 2795a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2796a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (status != BFA_STATUS_OK) { 2797a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *offset = *buflen = 0; 2798a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return status; 2799a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2800a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2801a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *offset += dlen; 2802a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2803a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (*offset >= smem_len) 2804a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *offset = 0; 2805a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2806a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *buflen = dlen; 2807a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2808a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return status; 2809a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2810a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 28115fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 2812a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Firmware statistics 2813a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2814a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_status_t 2815a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_fw_stats_get(struct bfa_ioc_s *ioc, void *stats) 2816a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2817a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 loff = BFI_IOC_FWSTATS_OFF + \ 2818a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFI_IOC_FWSTATS_SZ * (bfa_ioc_portid(ioc)); 2819a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int tlen; 2820a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_status_t status; 2821a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2822a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (ioc->stats_busy) { 2823a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, ioc->stats_busy); 2824a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_STATUS_DEVBUSY; 2825a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2826a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc->stats_busy = BFA_TRUE; 2827a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2828a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati tlen = sizeof(struct bfa_fw_stats_s); 2829a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati status = bfa_ioc_smem_read(ioc, stats, loff, tlen); 2830a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2831a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc->stats_busy = BFA_FALSE; 2832a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return status; 2833a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2834a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2835a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_status_t 2836a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_fw_stats_clear(struct bfa_ioc_s *ioc) 2837a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2838a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati u32 loff = BFI_IOC_FWSTATS_OFF + \ 2839a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati BFI_IOC_FWSTATS_SZ * (bfa_ioc_portid(ioc)); 2840a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int tlen; 2841a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_status_t status; 2842a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2843a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (ioc->stats_busy) { 2844a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, ioc->stats_busy); 2845a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return BFA_STATUS_DEVBUSY; 2846a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2847a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc->stats_busy = BFA_TRUE; 2848a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2849a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati tlen = sizeof(struct bfa_fw_stats_s); 2850a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati status = bfa_ioc_smem_clr(ioc, loff, tlen); 2851a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2852a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati ioc->stats_busy = BFA_FALSE; 2853a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati return status; 28547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 28557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 28565fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 28577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Save firmware trace if configured. 28587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 28597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 28604e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipatibfa_ioc_debug_save_ftrc(struct bfa_ioc_s *ioc) 28617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2862a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati int tlen; 28637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 28644e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati if (ioc->dbg_fwsave_once) { 28654e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati ioc->dbg_fwsave_once = BFA_FALSE; 28664e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati if (ioc->dbg_fwsave_len) { 28674e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati tlen = ioc->dbg_fwsave_len; 28684e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati bfa_ioc_debug_fwtrc(ioc, ioc->dbg_fwsave, &tlen); 28694e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati } 28707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 28717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 28727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 28735fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 28747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Firmware failure detected. Start recovery actions. 28757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 28767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 28777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_recover(struct bfa_ioc_s *ioc) 28787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 28797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_stats(ioc, ioc_hbfails); 28805a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati ioc->stats.hb_count = ioc->hb_count; 28817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_send_event(ioc, IOC_E_HBFAIL); 28827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 28837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 28845fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 2885df0f1933eb5454a5c481311837076056557467adMaggie Zhang * BFA IOC PF private functions 2886a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2887a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 2888a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_timeout(void *ioc_arg) 2889a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2890a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioc_s *ioc = (struct bfa_ioc_s *) ioc_arg; 2891a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2892a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_trc(ioc, 0); 2893a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_TIMEOUT); 2894a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2895a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2896a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void 2897a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sem_timeout(void *ioc_arg) 2898a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2899a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_ioc_s *ioc = (struct bfa_ioc_s *) ioc_arg; 2900a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2901a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_ioc_hw_sem_get(ioc); 2902a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2903a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2904775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipatistatic void 2905775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipatibfa_ioc_poll_fwinit(struct bfa_ioc_s *ioc) 2906775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati{ 2907775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati u32 fwstate = readl(ioc->ioc_regs.ioc_fwstate); 2908775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati 2909775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati bfa_trc(ioc, fwstate); 2910775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati 2911775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati if (fwstate == BFI_IOC_DISABLED) { 2912775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_FWREADY); 2913775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati return; 2914775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati } 2915775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati 2916775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati if (ioc->iocpf.poll_time >= BFA_IOC_TOV) 2917775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati bfa_iocpf_timeout(ioc); 2918775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati else { 2919775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati ioc->iocpf.poll_time += BFA_IOC_POLL_TOV; 2920775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati bfa_iocpf_poll_timer_start(ioc); 2921775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati } 2922775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati} 2923775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati 2924775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipatistatic void 2925775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipatibfa_iocpf_poll_timeout(void *ioc_arg) 2926775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati{ 2927775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati struct bfa_ioc_s *ioc = (struct bfa_ioc_s *) ioc_arg; 2928775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati 2929775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati bfa_ioc_poll_fwinit(ioc); 2930775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati} 2931775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati 29325fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 2933a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * bfa timer function 2934a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2935a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 2936a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_timer_beat(struct bfa_timer_mod_s *mod) 2937a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2938a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct list_head *qh = &mod->timer_q; 2939a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct list_head *qe, *qe_next; 2940a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct bfa_timer_s *elem; 2941a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati struct list_head timedout_q; 2942a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2943a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati INIT_LIST_HEAD(&timedout_q); 2944a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2945a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati qe = bfa_q_next(qh); 2946a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2947a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati while (qe != qh) { 2948a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati qe_next = bfa_q_next(qe); 2949a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2950a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati elem = (struct bfa_timer_s *) qe; 2951a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati if (elem->timeout <= BFA_TIMER_FREQ) { 2952a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati elem->timeout = 0; 2953a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_del(&elem->qe); 2954a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_add_tail(&elem->qe, &timedout_q); 2955a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } else { 2956a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati elem->timeout -= BFA_TIMER_FREQ; 2957a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2958a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2959a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati qe = qe_next; /* go to next elem */ 2960a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2961a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2962a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati /* 2963a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Pop all the timeout entries 2964a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2965a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati while (!list_empty(&timedout_q)) { 2966a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati bfa_q_deq(&timedout_q, &elem); 2967a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati elem->timercb(elem->arg); 2968a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati } 2969a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2970a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 29715fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 2972a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Should be called with lock protection 2973a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2974a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 2975a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_timer_begin(struct bfa_timer_mod_s *mod, struct bfa_timer_s *timer, 2976a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati void (*timercb) (void *), void *arg, unsigned int timeout) 2977a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2978a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2979d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(timercb == NULL); 2980d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(bfa_q_is_on_q(&mod->timer_q, timer)); 2981a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2982a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati timer->timeout = timeout; 2983a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati timer->timercb = timercb; 2984a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati timer->arg = arg; 2985a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2986a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_add_tail(&timer->qe, &mod->timer_q); 2987a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 2988a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 29895fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/* 2990a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Should be called with lock protection 2991a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */ 2992a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid 2993a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_timer_stop(struct bfa_timer_s *timer) 2994a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{ 2995d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang WARN_ON(list_empty(&timer->qe)); 2996a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati 2997a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati list_del(&timer->qe); 2998a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati} 29991a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 30001a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati/* 30011a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati * ASIC block related 30021a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati */ 30031a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatistatic void 30041a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_config_swap(struct bfa_ablk_cfg_s *cfg) 30051a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{ 30061a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfa_ablk_cfg_inst_s *cfg_inst; 30071a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati int i, j; 30081a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati u16 be16; 30091a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati u32 be32; 30101a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 30111a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati for (i = 0; i < BFA_ABLK_MAX; i++) { 30121a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati cfg_inst = &cfg->inst[i]; 30131a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati for (j = 0; j < BFA_ABLK_MAX_PFS; j++) { 30141a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati be16 = cfg_inst->pf_cfg[j].pers; 30151a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati cfg_inst->pf_cfg[j].pers = be16_to_cpu(be16); 30161a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati be16 = cfg_inst->pf_cfg[j].num_qpairs; 30171a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati cfg_inst->pf_cfg[j].num_qpairs = be16_to_cpu(be16); 30181a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati be16 = cfg_inst->pf_cfg[j].num_vectors; 30191a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati cfg_inst->pf_cfg[j].num_vectors = be16_to_cpu(be16); 30201a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati be32 = cfg_inst->pf_cfg[j].bw; 30211a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati cfg_inst->pf_cfg[j].bw = be16_to_cpu(be32); 30221a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 30231a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 30241a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati} 30251a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 30261a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatistatic void 30271a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_isr(void *cbarg, struct bfi_mbmsg_s *msg) 30281a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{ 30291a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfa_ablk_s *ablk = (struct bfa_ablk_s *)cbarg; 30301a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfi_ablk_i2h_rsp_s *rsp = (struct bfi_ablk_i2h_rsp_s *)msg; 30311a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ablk_cbfn_t cbfn; 30321a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 30331a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati WARN_ON(msg->mh.msg_class != BFI_MC_ABLK); 30341a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_trc(ablk->ioc, msg->mh.msg_id); 30351a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 30361a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati switch (msg->mh.msg_id) { 30371a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case BFI_ABLK_I2H_QUERY: 30381a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (rsp->status == BFA_STATUS_OK) { 30391a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati memcpy(ablk->cfg, ablk->dma_addr.kva, 30401a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati sizeof(struct bfa_ablk_cfg_s)); 30411a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ablk_config_swap(ablk->cfg); 30421a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->cfg = NULL; 30431a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 30441a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati break; 30451a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 30461a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case BFI_ABLK_I2H_ADPT_CONFIG: 30471a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case BFI_ABLK_I2H_PORT_CONFIG: 30481a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati /* update config port mode */ 30491a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->ioc->port_mode_cfg = rsp->port_mode; 30501a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 30511a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case BFI_ABLK_I2H_PF_DELETE: 30521a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case BFI_ABLK_I2H_PF_UPDATE: 30531a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case BFI_ABLK_I2H_OPTROM_ENABLE: 30541a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case BFI_ABLK_I2H_OPTROM_DISABLE: 30551a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati /* No-op */ 30561a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati break; 30571a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 30581a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case BFI_ABLK_I2H_PF_CREATE: 30591a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati *(ablk->pcifn) = rsp->pcifn; 30601a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->pcifn = NULL; 30611a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati break; 30621a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 30631a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati default: 30641a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati WARN_ON(1); 30651a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 30661a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 30671a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->busy = BFA_FALSE; 30681a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (ablk->cbfn) { 30691a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati cbfn = ablk->cbfn; 30701a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->cbfn = NULL; 30711a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati cbfn(ablk->cbarg, rsp->status); 30721a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 30731a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati} 30741a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 30751a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatistatic void 30761a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_notify(void *cbarg, enum bfa_ioc_event_e event) 30771a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{ 30781a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfa_ablk_s *ablk = (struct bfa_ablk_s *)cbarg; 30791a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 30801a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_trc(ablk->ioc, event); 30811a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 30821a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati switch (event) { 30831a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case BFA_IOC_E_ENABLED: 30841a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati WARN_ON(ablk->busy != BFA_FALSE); 30851a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati break; 30861a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 30871a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case BFA_IOC_E_DISABLED: 30881a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati case BFA_IOC_E_FAILED: 30891a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati /* Fail any pending requests */ 30901a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->pcifn = NULL; 30911a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (ablk->busy) { 30921a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (ablk->cbfn) 30931a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->cbfn(ablk->cbarg, BFA_STATUS_FAILED); 30941a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->cbfn = NULL; 30951a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->busy = BFA_FALSE; 30961a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 30971a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati break; 30981a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 30991a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati default: 31001a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati WARN_ON(1); 31011a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati break; 31021a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 31031a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati} 31041a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 31051a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiu32 31061a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_meminfo(void) 31071a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{ 31081a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_ROUNDUP(sizeof(struct bfa_ablk_cfg_s), BFA_DMA_ALIGN_SZ); 31091a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati} 31101a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 31111a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipativoid 31121a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_memclaim(struct bfa_ablk_s *ablk, u8 *dma_kva, u64 dma_pa) 31131a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{ 31141a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->dma_addr.kva = dma_kva; 31151a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->dma_addr.pa = dma_pa; 31161a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati} 31171a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 31181a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipativoid 31191a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_attach(struct bfa_ablk_s *ablk, struct bfa_ioc_s *ioc) 31201a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{ 31211a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->ioc = ioc; 31221a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 31231a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ioc_mbox_regisr(ablk->ioc, BFI_MC_ABLK, bfa_ablk_isr, ablk); 31243350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_q_qe_init(&ablk->ioc_notify); 31251a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ioc_notify_init(&ablk->ioc_notify, bfa_ablk_notify, ablk); 31261a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati list_add_tail(&ablk->ioc_notify.qe, &ablk->ioc->notify_q); 31271a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati} 31281a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 31291a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_status_t 31301a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_query(struct bfa_ablk_s *ablk, struct bfa_ablk_cfg_s *ablk_cfg, 31311a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ablk_cbfn_t cbfn, void *cbarg) 31321a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{ 31331a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfi_ablk_h2i_query_s *m; 31341a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 31351a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati WARN_ON(!ablk_cfg); 31361a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 31371a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (!bfa_ioc_is_operational(ablk->ioc)) { 31381a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_trc(ablk->ioc, BFA_STATUS_IOC_FAILURE); 31391a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_IOC_FAILURE; 31401a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 31411a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 31421a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (ablk->busy) { 31431a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_trc(ablk->ioc, BFA_STATUS_DEVBUSY); 31441a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_DEVBUSY; 31451a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 31461a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 31471a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->cfg = ablk_cfg; 31481a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->cbfn = cbfn; 31491a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->cbarg = cbarg; 31501a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->busy = BFA_TRUE; 31511a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 31521a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati m = (struct bfi_ablk_h2i_query_s *)ablk->mb.msg; 31531a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfi_h2i_set(m->mh, BFI_MC_ABLK, BFI_ABLK_H2I_QUERY, 31541a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ioc_portid(ablk->ioc)); 31551a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_dma_be_addr_set(m->addr, ablk->dma_addr.pa); 31561a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ioc_mbox_queue(ablk->ioc, &ablk->mb); 31571a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 31581a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_OK; 31591a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati} 31601a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 31611a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_status_t 31621a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_pf_create(struct bfa_ablk_s *ablk, u16 *pcifn, 31631a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati u8 port, enum bfi_pcifn_class personality, int bw, 31641a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ablk_cbfn_t cbfn, void *cbarg) 31651a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{ 31661a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfi_ablk_h2i_pf_req_s *m; 31671a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 31681a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (!bfa_ioc_is_operational(ablk->ioc)) { 31691a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_trc(ablk->ioc, BFA_STATUS_IOC_FAILURE); 31701a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_IOC_FAILURE; 31711a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 31721a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 31731a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (ablk->busy) { 31741a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_trc(ablk->ioc, BFA_STATUS_DEVBUSY); 31751a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_DEVBUSY; 31761a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 31771a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 31781a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->pcifn = pcifn; 31791a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->cbfn = cbfn; 31801a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->cbarg = cbarg; 31811a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->busy = BFA_TRUE; 31821a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 31831a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati m = (struct bfi_ablk_h2i_pf_req_s *)ablk->mb.msg; 31841a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfi_h2i_set(m->mh, BFI_MC_ABLK, BFI_ABLK_H2I_PF_CREATE, 31851a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ioc_portid(ablk->ioc)); 31861a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati m->pers = cpu_to_be16((u16)personality); 31871a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati m->bw = cpu_to_be32(bw); 31881a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati m->port = port; 31891a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ioc_mbox_queue(ablk->ioc, &ablk->mb); 31901a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 31911a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_OK; 31921a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati} 31931a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 31941a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_status_t 31951a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_pf_delete(struct bfa_ablk_s *ablk, int pcifn, 31961a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ablk_cbfn_t cbfn, void *cbarg) 31971a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{ 31981a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfi_ablk_h2i_pf_req_s *m; 31991a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 32001a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (!bfa_ioc_is_operational(ablk->ioc)) { 32011a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_trc(ablk->ioc, BFA_STATUS_IOC_FAILURE); 32021a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_IOC_FAILURE; 32031a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 32041a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 32051a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (ablk->busy) { 32061a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_trc(ablk->ioc, BFA_STATUS_DEVBUSY); 32071a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_DEVBUSY; 32081a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 32091a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 32101a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->cbfn = cbfn; 32111a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->cbarg = cbarg; 32121a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->busy = BFA_TRUE; 32131a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 32141a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati m = (struct bfi_ablk_h2i_pf_req_s *)ablk->mb.msg; 32151a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfi_h2i_set(m->mh, BFI_MC_ABLK, BFI_ABLK_H2I_PF_DELETE, 32161a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ioc_portid(ablk->ioc)); 32171a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati m->pcifn = (u8)pcifn; 32181a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ioc_mbox_queue(ablk->ioc, &ablk->mb); 32191a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 32201a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_OK; 32211a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati} 32221a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 32231a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_status_t 32241a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_adapter_config(struct bfa_ablk_s *ablk, enum bfa_mode_s mode, 32251a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati int max_pf, int max_vf, bfa_ablk_cbfn_t cbfn, void *cbarg) 32261a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{ 32271a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfi_ablk_h2i_cfg_req_s *m; 32281a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 32291a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (!bfa_ioc_is_operational(ablk->ioc)) { 32301a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_trc(ablk->ioc, BFA_STATUS_IOC_FAILURE); 32311a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_IOC_FAILURE; 32321a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 32331a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 32341a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (ablk->busy) { 32351a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_trc(ablk->ioc, BFA_STATUS_DEVBUSY); 32361a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_DEVBUSY; 32371a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 32381a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 32391a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->cbfn = cbfn; 32401a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->cbarg = cbarg; 32411a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->busy = BFA_TRUE; 32421a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 32431a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati m = (struct bfi_ablk_h2i_cfg_req_s *)ablk->mb.msg; 32441a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfi_h2i_set(m->mh, BFI_MC_ABLK, BFI_ABLK_H2I_ADPT_CONFIG, 32451a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ioc_portid(ablk->ioc)); 32461a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati m->mode = (u8)mode; 32471a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati m->max_pf = (u8)max_pf; 32481a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati m->max_vf = (u8)max_vf; 32491a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ioc_mbox_queue(ablk->ioc, &ablk->mb); 32501a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 32511a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_OK; 32521a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati} 32531a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 32541a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_status_t 32551a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_port_config(struct bfa_ablk_s *ablk, int port, enum bfa_mode_s mode, 32561a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati int max_pf, int max_vf, bfa_ablk_cbfn_t cbfn, void *cbarg) 32571a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{ 32581a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfi_ablk_h2i_cfg_req_s *m; 32591a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 32601a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (!bfa_ioc_is_operational(ablk->ioc)) { 32611a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_trc(ablk->ioc, BFA_STATUS_IOC_FAILURE); 32621a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_IOC_FAILURE; 32631a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 32641a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 32651a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (ablk->busy) { 32661a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_trc(ablk->ioc, BFA_STATUS_DEVBUSY); 32671a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_DEVBUSY; 32681a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 32691a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 32701a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->cbfn = cbfn; 32711a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->cbarg = cbarg; 32721a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->busy = BFA_TRUE; 32731a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 32741a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati m = (struct bfi_ablk_h2i_cfg_req_s *)ablk->mb.msg; 32751a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfi_h2i_set(m->mh, BFI_MC_ABLK, BFI_ABLK_H2I_PORT_CONFIG, 32761a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ioc_portid(ablk->ioc)); 32771a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati m->port = (u8)port; 32781a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati m->mode = (u8)mode; 32791a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati m->max_pf = (u8)max_pf; 32801a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati m->max_vf = (u8)max_vf; 32811a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ioc_mbox_queue(ablk->ioc, &ablk->mb); 32821a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 32831a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_OK; 32841a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati} 32851a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 32861a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_status_t 32871a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_pf_update(struct bfa_ablk_s *ablk, int pcifn, int bw, 32881a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ablk_cbfn_t cbfn, void *cbarg) 32891a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{ 32901a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfi_ablk_h2i_pf_req_s *m; 32911a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 32921a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (!bfa_ioc_is_operational(ablk->ioc)) { 32931a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_trc(ablk->ioc, BFA_STATUS_IOC_FAILURE); 32941a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_IOC_FAILURE; 32951a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 32961a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 32971a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (ablk->busy) { 32981a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_trc(ablk->ioc, BFA_STATUS_DEVBUSY); 32991a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_DEVBUSY; 33001a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 33011a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 33021a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->cbfn = cbfn; 33031a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->cbarg = cbarg; 33041a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->busy = BFA_TRUE; 33051a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 33061a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati m = (struct bfi_ablk_h2i_pf_req_s *)ablk->mb.msg; 33071a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfi_h2i_set(m->mh, BFI_MC_ABLK, BFI_ABLK_H2I_PF_UPDATE, 33081a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ioc_portid(ablk->ioc)); 33091a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati m->pcifn = (u8)pcifn; 33101a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati m->bw = cpu_to_be32(bw); 33111a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ioc_mbox_queue(ablk->ioc, &ablk->mb); 33121a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 33131a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_OK; 33141a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati} 33151a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 33161a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_status_t 33171a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_optrom_en(struct bfa_ablk_s *ablk, bfa_ablk_cbfn_t cbfn, void *cbarg) 33181a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{ 33191a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfi_ablk_h2i_optrom_s *m; 33201a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 33211a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (!bfa_ioc_is_operational(ablk->ioc)) { 33221a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_trc(ablk->ioc, BFA_STATUS_IOC_FAILURE); 33231a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_IOC_FAILURE; 33241a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 33251a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 33261a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (ablk->busy) { 33271a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_trc(ablk->ioc, BFA_STATUS_DEVBUSY); 33281a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_DEVBUSY; 33291a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 33301a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 33311a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->cbfn = cbfn; 33321a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->cbarg = cbarg; 33331a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->busy = BFA_TRUE; 33341a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 33351a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati m = (struct bfi_ablk_h2i_optrom_s *)ablk->mb.msg; 33361a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfi_h2i_set(m->mh, BFI_MC_ABLK, BFI_ABLK_H2I_OPTROM_ENABLE, 33371a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ioc_portid(ablk->ioc)); 33381a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ioc_mbox_queue(ablk->ioc, &ablk->mb); 33391a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 33401a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_OK; 33411a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati} 33421a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 33431a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_status_t 33441a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_optrom_dis(struct bfa_ablk_s *ablk, bfa_ablk_cbfn_t cbfn, void *cbarg) 33451a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{ 33461a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati struct bfi_ablk_h2i_optrom_s *m; 33471a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 33481a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (!bfa_ioc_is_operational(ablk->ioc)) { 33491a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_trc(ablk->ioc, BFA_STATUS_IOC_FAILURE); 33501a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_IOC_FAILURE; 33511a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 33521a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 33531a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati if (ablk->busy) { 33541a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_trc(ablk->ioc, BFA_STATUS_DEVBUSY); 33551a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_DEVBUSY; 33561a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati } 33571a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 33581a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->cbfn = cbfn; 33591a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->cbarg = cbarg; 33601a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati ablk->busy = BFA_TRUE; 33611a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 33621a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati m = (struct bfi_ablk_h2i_optrom_s *)ablk->mb.msg; 33631a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfi_h2i_set(m->mh, BFI_MC_ABLK, BFI_ABLK_H2I_OPTROM_DISABLE, 33641a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ioc_portid(ablk->ioc)); 33651a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati bfa_ioc_mbox_queue(ablk->ioc, &ablk->mb); 33661a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati 33671a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati return BFA_STATUS_OK; 33681a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati} 336951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 337051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/* 337151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * SFP module specific 337251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */ 337351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 337451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/* forward declarations */ 337551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic void bfa_sfp_getdata_send(struct bfa_sfp_s *sfp); 337651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic void bfa_sfp_media_get(struct bfa_sfp_s *sfp); 337751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic bfa_status_t bfa_sfp_speed_valid(struct bfa_sfp_s *sfp, 337851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati enum bfa_port_speed portspeed); 337951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 338051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic void 338151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_cb_sfp_show(struct bfa_sfp_s *sfp) 338251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{ 338351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, sfp->lock); 338451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (sfp->cbfn) 338551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->cbfn(sfp->cbarg, sfp->status); 338651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->lock = 0; 338751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->cbfn = NULL; 338851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati} 338951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 339051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic void 339151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_cb_sfp_state_query(struct bfa_sfp_s *sfp) 339251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{ 339351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, sfp->portspeed); 339451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (sfp->media) { 339551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_sfp_media_get(sfp); 339651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (sfp->state_query_cbfn) 339751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->state_query_cbfn(sfp->state_query_cbarg, 339851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->status); 339951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->media = NULL; 340051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 340151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 340251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (sfp->portspeed) { 340351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->status = bfa_sfp_speed_valid(sfp, sfp->portspeed); 340451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (sfp->state_query_cbfn) 340551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->state_query_cbfn(sfp->state_query_cbarg, 340651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->status); 340751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->portspeed = BFA_PORT_SPEED_UNKNOWN; 340851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 340951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 341051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->state_query_lock = 0; 341151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->state_query_cbfn = NULL; 341251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati} 341351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 341451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/* 341551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * IOC event handler. 341651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */ 341751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic void 341851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_notify(void *sfp_arg, enum bfa_ioc_event_e event) 341951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{ 342051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati struct bfa_sfp_s *sfp = sfp_arg; 342151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 342251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, event); 342351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, sfp->lock); 342451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, sfp->state_query_lock); 342551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 342651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati switch (event) { 342751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati case BFA_IOC_E_DISABLED: 342851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati case BFA_IOC_E_FAILED: 342951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (sfp->lock) { 343051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->status = BFA_STATUS_IOC_FAILURE; 343151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_cb_sfp_show(sfp); 343251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 343351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 343451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (sfp->state_query_lock) { 343551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->status = BFA_STATUS_IOC_FAILURE; 343651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_cb_sfp_state_query(sfp); 343751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 343851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati break; 343951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 344051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati default: 344151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati break; 344251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 344351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati} 344451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 344551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/* 34467826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati * SFP's State Change Notification post to AEN 34477826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati */ 34487826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipatistatic void 34497826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipatibfa_sfp_scn_aen_post(struct bfa_sfp_s *sfp, struct bfi_sfp_scn_s *rsp) 34507826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati{ 34517826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati struct bfad_s *bfad = (struct bfad_s *)sfp->ioc->bfa->bfad; 34527826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati struct bfa_aen_entry_s *aen_entry; 34537826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati enum bfa_port_aen_event aen_evt = 0; 34547826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati 34557826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_trc(sfp, (((u64)rsp->pomlvl) << 16) | (((u64)rsp->sfpid) << 8) | 34567826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati ((u64)rsp->event)); 34577826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati 34587826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfad_get_aen_entry(bfad, aen_entry); 34597826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati if (!aen_entry) 34607826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati return; 34617826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati 34627826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati aen_entry->aen_data.port.ioc_type = bfa_ioc_get_type(sfp->ioc); 34637826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati aen_entry->aen_data.port.pwwn = sfp->ioc->attr->pwwn; 34647826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati aen_entry->aen_data.port.mac = bfa_ioc_get_mac(sfp->ioc); 34657826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati 34667826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati switch (rsp->event) { 34677826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati case BFA_SFP_SCN_INSERTED: 34687826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati aen_evt = BFA_PORT_AEN_SFP_INSERT; 34697826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati break; 34707826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati case BFA_SFP_SCN_REMOVED: 34717826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati aen_evt = BFA_PORT_AEN_SFP_REMOVE; 34727826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati break; 34737826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati case BFA_SFP_SCN_FAILED: 34747826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati aen_evt = BFA_PORT_AEN_SFP_ACCESS_ERROR; 34757826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati break; 34767826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati case BFA_SFP_SCN_UNSUPPORT: 34777826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati aen_evt = BFA_PORT_AEN_SFP_UNSUPPORT; 34787826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati break; 34797826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati case BFA_SFP_SCN_POM: 34807826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati aen_evt = BFA_PORT_AEN_SFP_POM; 34817826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati aen_entry->aen_data.port.level = rsp->pomlvl; 34827826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati break; 34837826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati default: 34847826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_trc(sfp, rsp->event); 34857826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati WARN_ON(1); 34867826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati } 34877826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati 34887826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati /* Send the AEN notification */ 34897826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfad_im_post_vendor_event(aen_entry, bfad, ++sfp->ioc->ioc_aen_seq, 34907826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati BFA_AEN_CAT_PORT, aen_evt); 34917826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati} 34927826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati 34937826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati/* 349451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * SFP get data send 349551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */ 349651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic void 349751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_getdata_send(struct bfa_sfp_s *sfp) 349851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{ 349951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati struct bfi_sfp_req_s *req = (struct bfi_sfp_req_s *)sfp->mbcmd.msg; 350051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 350151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, req->memtype); 350251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 350351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati /* build host command */ 350451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfi_h2i_set(req->mh, BFI_MC_SFP, BFI_SFP_H2I_SHOW, 350551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_ioc_portid(sfp->ioc)); 350651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 350751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati /* send mbox cmd */ 350851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_ioc_mbox_queue(sfp->ioc, &sfp->mbcmd); 350951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati} 351051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 351151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/* 351251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * SFP is valid, read sfp data 351351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */ 351451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic void 351551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_getdata(struct bfa_sfp_s *sfp, enum bfi_sfp_mem_e memtype) 351651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{ 351751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati struct bfi_sfp_req_s *req = (struct bfi_sfp_req_s *)sfp->mbcmd.msg; 351851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 351951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati WARN_ON(sfp->lock != 0); 352051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, sfp->state); 352151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 352251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->lock = 1; 352351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->memtype = memtype; 352451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati req->memtype = memtype; 352551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 352651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati /* Setup SG list */ 352751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_alen_set(&req->alen, sizeof(struct sfp_mem_s), sfp->dbuf_pa); 352851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 352951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_sfp_getdata_send(sfp); 353051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati} 353151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 353251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/* 35337826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati * SFP scn handler 35347826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati */ 35357826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipatistatic void 35367826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipatibfa_sfp_scn(struct bfa_sfp_s *sfp, struct bfi_mbmsg_s *msg) 35377826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati{ 35387826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati struct bfi_sfp_scn_s *rsp = (struct bfi_sfp_scn_s *) msg; 35397826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati 35407826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati switch (rsp->event) { 35417826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati case BFA_SFP_SCN_INSERTED: 35427826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati sfp->state = BFA_SFP_STATE_INSERTED; 35437826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati sfp->data_valid = 0; 35447826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_sfp_scn_aen_post(sfp, rsp); 35457826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati break; 35467826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati case BFA_SFP_SCN_REMOVED: 35477826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati sfp->state = BFA_SFP_STATE_REMOVED; 35487826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati sfp->data_valid = 0; 35497826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_sfp_scn_aen_post(sfp, rsp); 35507826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati break; 35517826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati case BFA_SFP_SCN_FAILED: 35527826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati sfp->state = BFA_SFP_STATE_FAILED; 35537826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati sfp->data_valid = 0; 35547826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_sfp_scn_aen_post(sfp, rsp); 35557826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati break; 35567826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati case BFA_SFP_SCN_UNSUPPORT: 35577826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati sfp->state = BFA_SFP_STATE_UNSUPPORT; 35587826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_sfp_scn_aen_post(sfp, rsp); 35597826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati if (!sfp->lock) 35607826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_sfp_getdata(sfp, BFI_SFP_MEM_ALL); 35617826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati break; 35627826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati case BFA_SFP_SCN_POM: 35637826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_sfp_scn_aen_post(sfp, rsp); 35647826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati break; 35657826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati case BFA_SFP_SCN_VALID: 35667826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati sfp->state = BFA_SFP_STATE_VALID; 35677826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati if (!sfp->lock) 35687826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_sfp_getdata(sfp, BFI_SFP_MEM_ALL); 35697826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati break; 35707826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati default: 35717826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_trc(sfp, rsp->event); 35727826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati WARN_ON(1); 35737826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati } 35747826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati} 35757826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati 35767826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati/* 357751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * SFP show complete 357851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */ 357951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic void 358051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_show_comp(struct bfa_sfp_s *sfp, struct bfi_mbmsg_s *msg) 358151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{ 358251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati struct bfi_sfp_rsp_s *rsp = (struct bfi_sfp_rsp_s *) msg; 358351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 358451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (!sfp->lock) { 358551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati /* 358651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * receiving response after ioc failure 358751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */ 358851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, sfp->lock); 358951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return; 359051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 359151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 359251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, rsp->status); 359351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (rsp->status == BFA_STATUS_OK) { 359451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->data_valid = 1; 359551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (sfp->state == BFA_SFP_STATE_VALID) 359651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->status = BFA_STATUS_OK; 359751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati else if (sfp->state == BFA_SFP_STATE_UNSUPPORT) 359851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->status = BFA_STATUS_SFP_UNSUPP; 359951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati else 360051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, sfp->state); 360151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } else { 360251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->data_valid = 0; 360351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->status = rsp->status; 360451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati /* sfpshow shouldn't change sfp state */ 360551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 360651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 360751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, sfp->memtype); 360851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (sfp->memtype == BFI_SFP_MEM_DIAGEXT) { 360951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, sfp->data_valid); 361051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (sfp->data_valid) { 361151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati u32 size = sizeof(struct sfp_mem_s); 361251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati u8 *des = (u8 *) &(sfp->sfpmem->srlid_base); 361351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati memcpy(des, sfp->dbuf_kva, size); 361451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 361551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati /* 361651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * Queue completion callback. 361751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */ 361851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_cb_sfp_show(sfp); 361951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } else 362051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->lock = 0; 362151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 362251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, sfp->state_query_lock); 362351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (sfp->state_query_lock) { 362451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->state = rsp->state; 362551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati /* Complete callback */ 362651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_cb_sfp_state_query(sfp); 362751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 362851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati} 362951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 363051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/* 363151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * SFP query fw sfp state 363251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */ 363351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic void 363451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_state_query(struct bfa_sfp_s *sfp) 363551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{ 363651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati struct bfi_sfp_req_s *req = (struct bfi_sfp_req_s *)sfp->mbcmd.msg; 363751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 363851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati /* Should not be doing query if not in _INIT state */ 363951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati WARN_ON(sfp->state != BFA_SFP_STATE_INIT); 364051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati WARN_ON(sfp->state_query_lock != 0); 364151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, sfp->state); 364251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 364351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->state_query_lock = 1; 364451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati req->memtype = 0; 364551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 364651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (!sfp->lock) 364751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_sfp_getdata(sfp, BFI_SFP_MEM_ALL); 364851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati} 364951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 365051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic void 365151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_media_get(struct bfa_sfp_s *sfp) 365251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{ 365351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati enum bfa_defs_sfp_media_e *media = sfp->media; 365451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 365551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *media = BFA_SFP_MEDIA_UNKNOWN; 365651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 365751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (sfp->state == BFA_SFP_STATE_UNSUPPORT) 365851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *media = BFA_SFP_MEDIA_UNSUPPORT; 365951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati else if (sfp->state == BFA_SFP_STATE_VALID) { 366051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati union sfp_xcvr_e10g_code_u e10g; 366151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati struct sfp_mem_s *sfpmem = (struct sfp_mem_s *)sfp->dbuf_kva; 366251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati u16 xmtr_tech = (sfpmem->srlid_base.xcvr[4] & 0x3) << 7 | 366351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati (sfpmem->srlid_base.xcvr[5] >> 1); 366451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 366551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati e10g.b = sfpmem->srlid_base.xcvr[0]; 366651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, e10g.b); 366751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, xmtr_tech); 366851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati /* check fc transmitter tech */ 366951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if ((xmtr_tech & SFP_XMTR_TECH_CU) || 367051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati (xmtr_tech & SFP_XMTR_TECH_CP) || 367151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati (xmtr_tech & SFP_XMTR_TECH_CA)) 367251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *media = BFA_SFP_MEDIA_CU; 367351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati else if ((xmtr_tech & SFP_XMTR_TECH_EL_INTRA) || 367451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati (xmtr_tech & SFP_XMTR_TECH_EL_INTER)) 367551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *media = BFA_SFP_MEDIA_EL; 367651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati else if ((xmtr_tech & SFP_XMTR_TECH_LL) || 367751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati (xmtr_tech & SFP_XMTR_TECH_LC)) 367851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *media = BFA_SFP_MEDIA_LW; 367951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati else if ((xmtr_tech & SFP_XMTR_TECH_SL) || 368051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati (xmtr_tech & SFP_XMTR_TECH_SN) || 368151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati (xmtr_tech & SFP_XMTR_TECH_SA)) 368251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *media = BFA_SFP_MEDIA_SW; 368351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati /* Check 10G Ethernet Compilance code */ 368498cdfb4347f5d38b97de2045d688e44e2a26ea42Jing Huang else if (e10g.r.e10g_sr) 368551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *media = BFA_SFP_MEDIA_SW; 368698cdfb4347f5d38b97de2045d688e44e2a26ea42Jing Huang else if (e10g.r.e10g_lrm && e10g.r.e10g_lr) 368751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *media = BFA_SFP_MEDIA_LW; 368898cdfb4347f5d38b97de2045d688e44e2a26ea42Jing Huang else if (e10g.r.e10g_unall) 368951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *media = BFA_SFP_MEDIA_UNKNOWN; 369051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati else 369151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, 0); 369251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } else 369351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, sfp->state); 369451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati} 369551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 369651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic bfa_status_t 369751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_speed_valid(struct bfa_sfp_s *sfp, enum bfa_port_speed portspeed) 369851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{ 369951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati struct sfp_mem_s *sfpmem = (struct sfp_mem_s *)sfp->dbuf_kva; 370051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati struct sfp_xcvr_s *xcvr = (struct sfp_xcvr_s *) sfpmem->srlid_base.xcvr; 370151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati union sfp_xcvr_fc3_code_u fc3 = xcvr->fc3; 370251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati union sfp_xcvr_e10g_code_u e10g = xcvr->e10g; 370351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 370451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (portspeed == BFA_PORT_SPEED_10GBPS) { 370551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (e10g.r.e10g_sr || e10g.r.e10g_lr) 370651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return BFA_STATUS_OK; 370751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati else { 370851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, e10g.b); 370951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return BFA_STATUS_UNSUPP_SPEED; 371051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 371151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 371251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (((portspeed & BFA_PORT_SPEED_16GBPS) && fc3.r.mb1600) || 371351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati ((portspeed & BFA_PORT_SPEED_8GBPS) && fc3.r.mb800) || 371451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati ((portspeed & BFA_PORT_SPEED_4GBPS) && fc3.r.mb400) || 371551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati ((portspeed & BFA_PORT_SPEED_2GBPS) && fc3.r.mb200) || 371651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati ((portspeed & BFA_PORT_SPEED_1GBPS) && fc3.r.mb100)) 371751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return BFA_STATUS_OK; 371851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati else { 371951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, portspeed); 372051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, fc3.b); 372151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, e10g.b); 372251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return BFA_STATUS_UNSUPP_SPEED; 372351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 372451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati} 372551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 372651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/* 372751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * SFP hmbox handler 372851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */ 372951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipativoid 373051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_intr(void *sfparg, struct bfi_mbmsg_s *msg) 373151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{ 373251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati struct bfa_sfp_s *sfp = sfparg; 373351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 373451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati switch (msg->mh.msg_id) { 373551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati case BFI_SFP_I2H_SHOW: 373651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_sfp_show_comp(sfp, msg); 373751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati break; 373851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 373951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati case BFI_SFP_I2H_SCN: 37407826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_sfp_scn(sfp, msg); 374151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati break; 374251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 374351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati default: 374451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, msg->mh.msg_id); 374551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati WARN_ON(1); 374651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 374751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati} 374851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 374951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/* 375051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * Return DMA memory needed by sfp module. 375151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */ 375251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatiu32 375351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_meminfo(void) 375451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{ 375551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return BFA_ROUNDUP(sizeof(struct sfp_mem_s), BFA_DMA_ALIGN_SZ); 375651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati} 375751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 375851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/* 375951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * Attach virtual and physical memory for SFP. 376051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */ 376151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipativoid 376251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_attach(struct bfa_sfp_s *sfp, struct bfa_ioc_s *ioc, void *dev, 376351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati struct bfa_trc_mod_s *trcmod) 376451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{ 376551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->dev = dev; 376651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->ioc = ioc; 376751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->trcmod = trcmod; 376851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 376951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->cbfn = NULL; 377051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->cbarg = NULL; 377151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->sfpmem = NULL; 377251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->lock = 0; 377351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->data_valid = 0; 377451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->state = BFA_SFP_STATE_INIT; 377551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->state_query_lock = 0; 377651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->state_query_cbfn = NULL; 377751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->state_query_cbarg = NULL; 377851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->media = NULL; 377951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->portspeed = BFA_PORT_SPEED_UNKNOWN; 378051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->is_elb = BFA_FALSE; 378151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 378251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_ioc_mbox_regisr(sfp->ioc, BFI_MC_SFP, bfa_sfp_intr, sfp); 378351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_q_qe_init(&sfp->ioc_notify); 378451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_ioc_notify_init(&sfp->ioc_notify, bfa_sfp_notify, sfp); 378551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati list_add_tail(&sfp->ioc_notify.qe, &sfp->ioc->notify_q); 378651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati} 378751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 378851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/* 378951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * Claim Memory for SFP 379051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */ 379151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipativoid 379251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_memclaim(struct bfa_sfp_s *sfp, u8 *dm_kva, u64 dm_pa) 379351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{ 379451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->dbuf_kva = dm_kva; 379551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->dbuf_pa = dm_pa; 379651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati memset(sfp->dbuf_kva, 0, sizeof(struct sfp_mem_s)); 379751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 379851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati dm_kva += BFA_ROUNDUP(sizeof(struct sfp_mem_s), BFA_DMA_ALIGN_SZ); 379951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati dm_pa += BFA_ROUNDUP(sizeof(struct sfp_mem_s), BFA_DMA_ALIGN_SZ); 380051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati} 380151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 380251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/* 380351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * Show SFP eeprom content 380451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * 380551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * @param[in] sfp - bfa sfp module 380651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * 380751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * @param[out] sfpmem - sfp eeprom data 380851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * 380951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */ 381051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_status_t 381151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_show(struct bfa_sfp_s *sfp, struct sfp_mem_s *sfpmem, 381251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_cb_sfp_t cbfn, void *cbarg) 381351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{ 381451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 381551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (!bfa_ioc_is_operational(sfp->ioc)) { 381651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, 0); 381751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return BFA_STATUS_IOC_NON_OP; 381851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 381951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 382051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (sfp->lock) { 382151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, 0); 382251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return BFA_STATUS_DEVBUSY; 382351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 382451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 382551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->cbfn = cbfn; 382651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->cbarg = cbarg; 382751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->sfpmem = sfpmem; 382851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 382951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_sfp_getdata(sfp, BFI_SFP_MEM_DIAGEXT); 383051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return BFA_STATUS_OK; 383151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati} 383251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 383351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/* 383451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * Return SFP Media type 383551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * 383651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * @param[in] sfp - bfa sfp module 383751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * 383851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * @param[out] media - port speed from user 383951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * 384051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */ 384151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_status_t 384251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_media(struct bfa_sfp_s *sfp, enum bfa_defs_sfp_media_e *media, 384351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_cb_sfp_t cbfn, void *cbarg) 384451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{ 384551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (!bfa_ioc_is_operational(sfp->ioc)) { 384651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, 0); 384751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return BFA_STATUS_IOC_NON_OP; 384851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 384951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 385051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->media = media; 385151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (sfp->state == BFA_SFP_STATE_INIT) { 385251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (sfp->state_query_lock) { 385351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, 0); 385451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return BFA_STATUS_DEVBUSY; 385551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } else { 385651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->state_query_cbfn = cbfn; 385751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->state_query_cbarg = cbarg; 385851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_sfp_state_query(sfp); 385951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return BFA_STATUS_SFP_NOT_READY; 386051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 386151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 386251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 386351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_sfp_media_get(sfp); 386451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return BFA_STATUS_OK; 386551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati} 386651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 386751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/* 386851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * Check if user set port speed is allowed by the SFP 386951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * 387051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * @param[in] sfp - bfa sfp module 387151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * @param[in] portspeed - port speed from user 387251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * 387351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */ 387451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_status_t 387551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_speed(struct bfa_sfp_s *sfp, enum bfa_port_speed portspeed, 387651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_cb_sfp_t cbfn, void *cbarg) 387751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{ 387851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati WARN_ON(portspeed == BFA_PORT_SPEED_UNKNOWN); 387951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 388051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (!bfa_ioc_is_operational(sfp->ioc)) 388151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return BFA_STATUS_IOC_NON_OP; 388251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 388351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati /* For Mezz card, all speed is allowed */ 388451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (bfa_mfg_is_mezz(sfp->ioc->attr->card_type)) 388551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return BFA_STATUS_OK; 388651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 388751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati /* Check SFP state */ 388851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->portspeed = portspeed; 388951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (sfp->state == BFA_SFP_STATE_INIT) { 389051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (sfp->state_query_lock) { 389151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, 0); 389251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return BFA_STATUS_DEVBUSY; 389351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } else { 389451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->state_query_cbfn = cbfn; 389551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->state_query_cbarg = cbarg; 389651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_sfp_state_query(sfp); 389751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return BFA_STATUS_SFP_NOT_READY; 389851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 389951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 390051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 390151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (sfp->state == BFA_SFP_STATE_REMOVED || 390251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati sfp->state == BFA_SFP_STATE_FAILED) { 390351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, sfp->state); 390451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return BFA_STATUS_NO_SFP_DEV; 390551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 390651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 390751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (sfp->state == BFA_SFP_STATE_INSERTED) { 390851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati bfa_trc(sfp, sfp->state); 390951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return BFA_STATUS_DEVBUSY; /* sfp is reading data */ 391051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati } 391151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 391251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati /* For eloopback, all speed is allowed */ 391351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati if (sfp->is_elb) 391451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return BFA_STATUS_OK; 391551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati 391651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati return bfa_sfp_speed_valid(sfp, portspeed); 391751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati} 39185a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 39195a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/* 39205a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Flash module specific 39215a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */ 39225a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 39235a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/* 39245a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * FLASH DMA buffer should be big enough to hold both MFG block and 39255a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * asic block(64k) at the same time and also should be 2k aligned to 39265a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * avoid write segement to cross sector boundary. 39275a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */ 39285a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati#define BFA_FLASH_SEG_SZ 2048 39295a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati#define BFA_FLASH_DMA_BUF_SZ \ 39305a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati BFA_ROUNDUP(0x010000 + sizeof(struct bfa_mfg_block_s), BFA_FLASH_SEG_SZ) 39315a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 39325a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatistatic void 39337826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipatibfa_flash_aen_audit_post(struct bfa_ioc_s *ioc, enum bfa_audit_aen_event event, 39347826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati int inst, int type) 39357826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati{ 39367826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati struct bfad_s *bfad = (struct bfad_s *)ioc->bfa->bfad; 39377826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati struct bfa_aen_entry_s *aen_entry; 39387826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati 39397826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfad_get_aen_entry(bfad, aen_entry); 39407826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati if (!aen_entry) 39417826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati return; 39427826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati 39437826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati aen_entry->aen_data.audit.pwwn = ioc->attr->pwwn; 39447826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati aen_entry->aen_data.audit.partition_inst = inst; 39457826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati aen_entry->aen_data.audit.partition_type = type; 39467826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati 39477826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati /* Send the AEN notification */ 39487826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfad_im_post_vendor_event(aen_entry, bfad, ++ioc->ioc_aen_seq, 39497826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati BFA_AEN_CAT_AUDIT, event); 39507826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati} 39517826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati 39527826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipatistatic void 39535a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_cb(struct bfa_flash_s *flash) 39545a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{ 39555a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->op_busy = 0; 39565a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (flash->cbfn) 39575a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->cbfn(flash->cbarg, flash->status); 39585a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati} 39595a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 39605a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatistatic void 39615a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_notify(void *cbarg, enum bfa_ioc_event_e event) 39625a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{ 39635a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfa_flash_s *flash = cbarg; 39645a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 39655a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, event); 39665a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati switch (event) { 39675a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati case BFA_IOC_E_DISABLED: 39685a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati case BFA_IOC_E_FAILED: 39695a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (flash->op_busy) { 39705a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->status = BFA_STATUS_IOC_FAILURE; 39715a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->cbfn(flash->cbarg, flash->status); 39725a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->op_busy = 0; 39735a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati } 39745a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati break; 39755a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 39765a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati default: 39775a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati break; 39785a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati } 39795a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati} 39805a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 39815a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/* 39825a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Send flash attribute query request. 39835a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * 39845a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbarg - callback argument 39855a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */ 39865a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatistatic void 39875a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_query_send(void *cbarg) 39885a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{ 39895a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfa_flash_s *flash = cbarg; 39905a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfi_flash_query_req_s *msg = 39915a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati (struct bfi_flash_query_req_s *) flash->mb.msg; 39925a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 39935a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfi_h2i_set(msg->mh, BFI_MC_FLASH, BFI_FLASH_H2I_QUERY_REQ, 39945a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_ioc_portid(flash->ioc)); 39955a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_alen_set(&msg->alen, sizeof(struct bfa_flash_attr_s), 39965a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->dbuf_pa); 39975a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_ioc_mbox_queue(flash->ioc, &flash->mb); 39985a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati} 39995a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 40005a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/* 40015a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Send flash write request. 40025a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * 40035a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbarg - callback argument 40045a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */ 40055a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatistatic void 40065a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_write_send(struct bfa_flash_s *flash) 40075a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{ 40085a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfi_flash_write_req_s *msg = 40095a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati (struct bfi_flash_write_req_s *) flash->mb.msg; 40105a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati u32 len; 40115a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 40125a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati msg->type = be32_to_cpu(flash->type); 40135a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati msg->instance = flash->instance; 40145a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati msg->offset = be32_to_cpu(flash->addr_off + flash->offset); 40155a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati len = (flash->residue < BFA_FLASH_DMA_BUF_SZ) ? 40165a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->residue : BFA_FLASH_DMA_BUF_SZ; 40175a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati msg->length = be32_to_cpu(len); 40185a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 40195a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati /* indicate if it's the last msg of the whole write operation */ 40205a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati msg->last = (len == flash->residue) ? 1 : 0; 40215a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 40225a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfi_h2i_set(msg->mh, BFI_MC_FLASH, BFI_FLASH_H2I_WRITE_REQ, 40235a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_ioc_portid(flash->ioc)); 40245a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_alen_set(&msg->alen, len, flash->dbuf_pa); 40255a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati memcpy(flash->dbuf_kva, flash->ubuf + flash->offset, len); 40265a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_ioc_mbox_queue(flash->ioc, &flash->mb); 40275a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 40285a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->residue -= len; 40295a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->offset += len; 40305a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati} 40315a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 40325a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/* 40335a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Send flash read request. 40345a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * 40355a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbarg - callback argument 40365a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */ 40375a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatistatic void 40385a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_read_send(void *cbarg) 40395a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{ 40405a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfa_flash_s *flash = cbarg; 40415a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfi_flash_read_req_s *msg = 40425a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati (struct bfi_flash_read_req_s *) flash->mb.msg; 40435a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati u32 len; 40445a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 40455a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati msg->type = be32_to_cpu(flash->type); 40465a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati msg->instance = flash->instance; 40475a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati msg->offset = be32_to_cpu(flash->addr_off + flash->offset); 40485a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati len = (flash->residue < BFA_FLASH_DMA_BUF_SZ) ? 40495a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->residue : BFA_FLASH_DMA_BUF_SZ; 40505a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati msg->length = be32_to_cpu(len); 40515a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfi_h2i_set(msg->mh, BFI_MC_FLASH, BFI_FLASH_H2I_READ_REQ, 40525a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_ioc_portid(flash->ioc)); 40535a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_alen_set(&msg->alen, len, flash->dbuf_pa); 40545a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_ioc_mbox_queue(flash->ioc, &flash->mb); 40555a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati} 40565a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 40575a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/* 40585a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Send flash erase request. 40595a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * 40605a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbarg - callback argument 40615a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */ 40625a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatistatic void 40635a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_erase_send(void *cbarg) 40645a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{ 40655a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfa_flash_s *flash = cbarg; 40665a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfi_flash_erase_req_s *msg = 40675a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati (struct bfi_flash_erase_req_s *) flash->mb.msg; 40685a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 40695a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati msg->type = be32_to_cpu(flash->type); 40705a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati msg->instance = flash->instance; 40715a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfi_h2i_set(msg->mh, BFI_MC_FLASH, BFI_FLASH_H2I_ERASE_REQ, 40725a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_ioc_portid(flash->ioc)); 40735a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_ioc_mbox_queue(flash->ioc, &flash->mb); 40745a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati} 40755a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 40765a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/* 40775a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Process flash response messages upon receiving interrupts. 40785a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * 40795a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] flasharg - flash structure 40805a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] msg - message structure 40815a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */ 40825a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatistatic void 40835a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_intr(void *flasharg, struct bfi_mbmsg_s *msg) 40845a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{ 40855a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfa_flash_s *flash = flasharg; 40865a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati u32 status; 40875a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 40885a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati union { 40895a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfi_flash_query_rsp_s *query; 40905a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfi_flash_erase_rsp_s *erase; 40915a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfi_flash_write_rsp_s *write; 40925a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfi_flash_read_rsp_s *read; 40937826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati struct bfi_flash_event_s *event; 40945a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfi_mbmsg_s *msg; 40955a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati } m; 40965a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 40975a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati m.msg = msg; 40985a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, msg->mh.msg_id); 40995a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 41005a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (!flash->op_busy && msg->mh.msg_id != BFI_FLASH_I2H_EVENT) { 41015a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati /* receiving response after ioc failure */ 41025a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, 0x9999); 41035a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return; 41045a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati } 41055a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 41065a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati switch (msg->mh.msg_id) { 41075a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati case BFI_FLASH_I2H_QUERY_RSP: 41085a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati status = be32_to_cpu(m.query->status); 41095a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, status); 41105a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (status == BFA_STATUS_OK) { 41115a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati u32 i; 41125a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfa_flash_attr_s *attr, *f; 41135a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 41145a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati attr = (struct bfa_flash_attr_s *) flash->ubuf; 41155a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati f = (struct bfa_flash_attr_s *) flash->dbuf_kva; 41165a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati attr->status = be32_to_cpu(f->status); 41175a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati attr->npart = be32_to_cpu(f->npart); 41185a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, attr->status); 41195a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, attr->npart); 41205a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati for (i = 0; i < attr->npart; i++) { 41215a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati attr->part[i].part_type = 41225a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati be32_to_cpu(f->part[i].part_type); 41235a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati attr->part[i].part_instance = 41245a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati be32_to_cpu(f->part[i].part_instance); 41255a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati attr->part[i].part_off = 41265a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati be32_to_cpu(f->part[i].part_off); 41275a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati attr->part[i].part_size = 41285a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati be32_to_cpu(f->part[i].part_size); 41295a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati attr->part[i].part_len = 41305a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati be32_to_cpu(f->part[i].part_len); 41315a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati attr->part[i].part_status = 41325a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati be32_to_cpu(f->part[i].part_status); 41335a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati } 41345a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati } 41355a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->status = status; 41365a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_flash_cb(flash); 41375a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati break; 41385a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati case BFI_FLASH_I2H_ERASE_RSP: 41395a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati status = be32_to_cpu(m.erase->status); 41405a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, status); 41415a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->status = status; 41425a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_flash_cb(flash); 41435a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati break; 41445a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati case BFI_FLASH_I2H_WRITE_RSP: 41455a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati status = be32_to_cpu(m.write->status); 41465a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, status); 41475a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (status != BFA_STATUS_OK || flash->residue == 0) { 41485a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->status = status; 41495a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_flash_cb(flash); 41505a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati } else { 41515a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, flash->offset); 41525a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_flash_write_send(flash); 41535a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati } 41545a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati break; 41555a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati case BFI_FLASH_I2H_READ_RSP: 41565a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati status = be32_to_cpu(m.read->status); 41575a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, status); 41585a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (status != BFA_STATUS_OK) { 41595a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->status = status; 41605a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_flash_cb(flash); 41615a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati } else { 41625a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati u32 len = be32_to_cpu(m.read->length); 41635a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, flash->offset); 41645a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, len); 41655a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati memcpy(flash->ubuf + flash->offset, 41665a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->dbuf_kva, len); 41675a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->residue -= len; 41685a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->offset += len; 41695a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (flash->residue == 0) { 41705a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->status = status; 41715a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_flash_cb(flash); 41725a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati } else 41735a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_flash_read_send(flash); 41745a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati } 41755a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati break; 41765a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati case BFI_FLASH_I2H_BOOT_VER_RSP: 41777826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati break; 41785a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati case BFI_FLASH_I2H_EVENT: 41797826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati status = be32_to_cpu(m.event->status); 41807826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_trc(flash, status); 41817826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati if (status == BFA_STATUS_BAD_FWCFG) 41827826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_ioc_aen_post(flash->ioc, BFA_IOC_AEN_FWCFG_ERROR); 41837826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati else if (status == BFA_STATUS_INVALID_VENDOR) { 41847826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati u32 param; 41857826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati param = be32_to_cpu(m.event->param); 41867826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_trc(flash, param); 41877826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_ioc_aen_post(flash->ioc, 41887826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati BFA_IOC_AEN_INVALID_VENDOR); 41897826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati } 41905a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati break; 41915a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 41925a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati default: 41935a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati WARN_ON(1); 41945a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati } 41955a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati} 41965a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 41975a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/* 41985a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Flash memory info API. 41995a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * 42005a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] mincfg - minimal cfg variable 42015a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */ 42025a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiu32 42035a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_meminfo(bfa_boolean_t mincfg) 42045a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{ 42055a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati /* min driver doesn't need flash */ 42065a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (mincfg) 42075a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return 0; 42085a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return BFA_ROUNDUP(BFA_FLASH_DMA_BUF_SZ, BFA_DMA_ALIGN_SZ); 42095a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati} 42105a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 42115a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/* 42125a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Flash attach API. 42135a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * 42145a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] flash - flash structure 42155a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] ioc - ioc structure 42165a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] dev - device structure 42175a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] trcmod - trace module 42185a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] logmod - log module 42195a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */ 42205a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipativoid 42215a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_attach(struct bfa_flash_s *flash, struct bfa_ioc_s *ioc, void *dev, 42225a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati struct bfa_trc_mod_s *trcmod, bfa_boolean_t mincfg) 42235a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{ 42245a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->ioc = ioc; 42255a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->trcmod = trcmod; 42265a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->cbfn = NULL; 42275a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->cbarg = NULL; 42285a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->op_busy = 0; 42295a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 42305a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_ioc_mbox_regisr(flash->ioc, BFI_MC_FLASH, bfa_flash_intr, flash); 42315a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_q_qe_init(&flash->ioc_notify); 42325a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_ioc_notify_init(&flash->ioc_notify, bfa_flash_notify, flash); 42335a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati list_add_tail(&flash->ioc_notify.qe, &flash->ioc->notify_q); 42345a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 42355a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati /* min driver doesn't need flash */ 42365a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (mincfg) { 42375a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->dbuf_kva = NULL; 42385a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->dbuf_pa = 0; 42395a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati } 42405a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati} 42415a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 42425a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/* 42435a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Claim memory for flash 42445a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * 42455a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] flash - flash structure 42465a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] dm_kva - pointer to virtual memory address 42475a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] dm_pa - physical memory address 42485a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] mincfg - minimal cfg variable 42495a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */ 42505a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipativoid 42515a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_memclaim(struct bfa_flash_s *flash, u8 *dm_kva, u64 dm_pa, 42525a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_boolean_t mincfg) 42535a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{ 42545a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (mincfg) 42555a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return; 42565a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 42575a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->dbuf_kva = dm_kva; 42585a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->dbuf_pa = dm_pa; 42595a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati memset(flash->dbuf_kva, 0, BFA_FLASH_DMA_BUF_SZ); 42605a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati dm_kva += BFA_ROUNDUP(BFA_FLASH_DMA_BUF_SZ, BFA_DMA_ALIGN_SZ); 42615a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati dm_pa += BFA_ROUNDUP(BFA_FLASH_DMA_BUF_SZ, BFA_DMA_ALIGN_SZ); 42625a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati} 42635a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 42645a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/* 42655a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Get flash attribute. 42665a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * 42675a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] flash - flash structure 42685a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] attr - flash attribute structure 42695a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbfn - callback function 42705a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbarg - callback argument 42715a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * 42725a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Return status. 42735a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */ 42745a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_status_t 42755a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_get_attr(struct bfa_flash_s *flash, struct bfa_flash_attr_s *attr, 42765a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_cb_flash_t cbfn, void *cbarg) 42775a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{ 42785a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, BFI_FLASH_H2I_QUERY_REQ); 42795a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 42805a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (!bfa_ioc_is_operational(flash->ioc)) 42815a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return BFA_STATUS_IOC_NON_OP; 42825a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 42835a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (flash->op_busy) { 42845a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, flash->op_busy); 42855a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return BFA_STATUS_DEVBUSY; 42865a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati } 42875a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 42885a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->op_busy = 1; 42895a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->cbfn = cbfn; 42905a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->cbarg = cbarg; 42915a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->ubuf = (u8 *) attr; 42925a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_flash_query_send(flash); 42935a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 42945a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return BFA_STATUS_OK; 42955a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati} 42965a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 42975a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/* 42985a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Erase flash partition. 42995a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * 43005a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] flash - flash structure 43015a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] type - flash partition type 43025a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] instance - flash partition instance 43035a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbfn - callback function 43045a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbarg - callback argument 43055a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * 43065a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Return status. 43075a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */ 43085a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_status_t 43095a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_erase_part(struct bfa_flash_s *flash, enum bfa_flash_part_type type, 43105a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati u8 instance, bfa_cb_flash_t cbfn, void *cbarg) 43115a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{ 43125a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, BFI_FLASH_H2I_ERASE_REQ); 43135a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, type); 43145a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, instance); 43155a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 43165a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (!bfa_ioc_is_operational(flash->ioc)) 43175a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return BFA_STATUS_IOC_NON_OP; 43185a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 43195a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (flash->op_busy) { 43205a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, flash->op_busy); 43215a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return BFA_STATUS_DEVBUSY; 43225a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati } 43235a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 43245a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->op_busy = 1; 43255a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->cbfn = cbfn; 43265a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->cbarg = cbarg; 43275a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->type = type; 43285a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->instance = instance; 43295a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 43305a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_flash_erase_send(flash); 43317826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati bfa_flash_aen_audit_post(flash->ioc, BFA_AUDIT_AEN_FLASH_ERASE, 43327826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati instance, type); 43335a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return BFA_STATUS_OK; 43345a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati} 43355a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 43365a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/* 43375a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Update flash partition. 43385a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * 43395a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] flash - flash structure 43405a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] type - flash partition type 43415a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] instance - flash partition instance 43425a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] buf - update data buffer 43435a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] len - data buffer length 43445a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] offset - offset relative to the partition starting address 43455a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbfn - callback function 43465a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbarg - callback argument 43475a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * 43485a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Return status. 43495a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */ 43505a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_status_t 43515a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_update_part(struct bfa_flash_s *flash, enum bfa_flash_part_type type, 43525a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati u8 instance, void *buf, u32 len, u32 offset, 43535a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_cb_flash_t cbfn, void *cbarg) 43545a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{ 43555a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, BFI_FLASH_H2I_WRITE_REQ); 43565a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, type); 43575a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, instance); 43585a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, len); 43595a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, offset); 43605a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 43615a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (!bfa_ioc_is_operational(flash->ioc)) 43625a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return BFA_STATUS_IOC_NON_OP; 43635a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 43645a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati /* 43655a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * 'len' must be in word (4-byte) boundary 43665a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * 'offset' must be in sector (16kb) boundary 43675a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */ 43685a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (!len || (len & 0x03) || (offset & 0x00003FFF)) 43695a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return BFA_STATUS_FLASH_BAD_LEN; 43705a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 43715a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (type == BFA_FLASH_PART_MFG) 43725a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return BFA_STATUS_EINVAL; 43735a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 43745a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (flash->op_busy) { 43755a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, flash->op_busy); 43765a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return BFA_STATUS_DEVBUSY; 43775a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati } 43785a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 43795a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->op_busy = 1; 43805a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->cbfn = cbfn; 43815a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->cbarg = cbarg; 43825a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->type = type; 43835a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->instance = instance; 43845a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->residue = len; 43855a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->offset = 0; 43865a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->addr_off = offset; 43875a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->ubuf = buf; 43885a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 43895a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_flash_write_send(flash); 43905a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return BFA_STATUS_OK; 43915a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati} 43925a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 43935a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/* 43945a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Read flash partition. 43955a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * 43965a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] flash - flash structure 43975a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] type - flash partition type 43985a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] instance - flash partition instance 43995a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] buf - read data buffer 44005a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] len - data buffer length 44015a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] offset - offset relative to the partition starting address 44025a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbfn - callback function 44035a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbarg - callback argument 44045a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * 44055a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Return status. 44065a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */ 44075a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_status_t 44085a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_read_part(struct bfa_flash_s *flash, enum bfa_flash_part_type type, 44095a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati u8 instance, void *buf, u32 len, u32 offset, 44105a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_cb_flash_t cbfn, void *cbarg) 44115a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{ 44125a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, BFI_FLASH_H2I_READ_REQ); 44135a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, type); 44145a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, instance); 44155a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, len); 44165a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, offset); 44175a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 44185a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (!bfa_ioc_is_operational(flash->ioc)) 44195a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return BFA_STATUS_IOC_NON_OP; 44205a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 44215a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati /* 44225a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * 'len' must be in word (4-byte) boundary 44235a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * 'offset' must be in sector (16kb) boundary 44245a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */ 44255a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (!len || (len & 0x03) || (offset & 0x00003FFF)) 44265a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return BFA_STATUS_FLASH_BAD_LEN; 44275a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 44285a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati if (flash->op_busy) { 44295a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_trc(flash, flash->op_busy); 44305a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return BFA_STATUS_DEVBUSY; 44315a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati } 44325a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 44335a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->op_busy = 1; 44345a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->cbfn = cbfn; 44355a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->cbarg = cbarg; 44365a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->type = type; 44375a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->instance = instance; 44385a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->residue = len; 44395a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->offset = 0; 44405a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->addr_off = offset; 44415a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati flash->ubuf = buf; 44425a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati bfa_flash_read_send(flash); 44435a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati 44445a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati return BFA_STATUS_OK; 44455a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati} 44463d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 44473d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/* 44483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * DIAG module specific 44493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */ 44503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 44513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati#define BFA_DIAG_MEMTEST_TOV 50000 /* memtest timeout in msec */ 4452bd5a026019bc1f799065b0a39230d1f81bb4ff76Krishna Gudipati#define CT2_BFA_DIAG_MEMTEST_TOV (9*30*1000) /* 4.5 min */ 44533d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 44543d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/* IOC event handler */ 44553d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatistatic void 44563d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_notify(void *diag_arg, enum bfa_ioc_event_e event) 44573d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 44583d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfa_diag_s *diag = diag_arg; 44593d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 44603d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, event); 44613d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, diag->block); 44623d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, diag->fwping.lock); 44633d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, diag->tsensor.lock); 44643d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 44653d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati switch (event) { 44663d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati case BFA_IOC_E_DISABLED: 44673d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati case BFA_IOC_E_FAILED: 44683d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (diag->fwping.lock) { 44693d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.status = BFA_STATUS_IOC_FAILURE; 44703d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.cbfn(diag->fwping.cbarg, 44713d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.status); 44723d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.lock = 0; 44733d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati } 44743d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 44753d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (diag->tsensor.lock) { 44763d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->tsensor.status = BFA_STATUS_IOC_FAILURE; 44773d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->tsensor.cbfn(diag->tsensor.cbarg, 44783d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->tsensor.status); 44793d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->tsensor.lock = 0; 44803d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati } 44813d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 44823d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (diag->block) { 44833d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (diag->timer_active) { 44843d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_timer_stop(&diag->timer); 44853d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->timer_active = 0; 44863d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati } 44873d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 44883d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->status = BFA_STATUS_IOC_FAILURE; 44893d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->cbfn(diag->cbarg, diag->status); 44903d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->block = 0; 44913d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati } 44923d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati break; 44933d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 44943d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati default: 44953d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati break; 44963d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati } 44973d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 44983d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 44993d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatistatic void 45003d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_memtest_done(void *cbarg) 45013d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 45023d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfa_diag_s *diag = cbarg; 45033d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfa_ioc_s *ioc = diag->ioc; 45043d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfa_diag_memtest_result *res = diag->result; 45053d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati u32 loff = BFI_BOOT_MEMTEST_RES_ADDR; 45063d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati u32 pgnum, pgoff, i; 45073d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 45083d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati pgnum = PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, loff); 45093d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati pgoff = PSS_SMEM_PGOFF(loff); 45103d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 45113d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati writel(pgnum, ioc->ioc_regs.host_page_num_fn); 45123d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 45133d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati for (i = 0; i < (sizeof(struct bfa_diag_memtest_result) / 45143d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati sizeof(u32)); i++) { 45153d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* read test result from smem */ 45163d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *((u32 *) res + i) = 45173d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_mem_read(ioc->ioc_regs.smem_page_start, loff); 45183d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati loff += sizeof(u32); 45193d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati } 45203d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 45213d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* Reset IOC fwstates to BFI_IOC_UNINIT */ 45223d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_ioc_reset_fwstate(ioc); 45233d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 45243d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati res->status = swab32(res->status); 45253d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, res->status); 45263d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 45273d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (res->status == BFI_BOOT_MEMTEST_RES_SIG) 45283d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->status = BFA_STATUS_OK; 45293d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati else { 45303d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->status = BFA_STATUS_MEMTEST_FAILED; 45313d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati res->addr = swab32(res->addr); 45323d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati res->exp = swab32(res->exp); 45333d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati res->act = swab32(res->act); 45343d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati res->err_status = swab32(res->err_status); 45353d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati res->err_status1 = swab32(res->err_status1); 45363d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati res->err_addr = swab32(res->err_addr); 45373d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, res->addr); 45383d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, res->exp); 45393d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, res->act); 45403d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, res->err_status); 45413d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, res->err_status1); 45423d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, res->err_addr); 45433d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati } 45443d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->timer_active = 0; 45453d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->cbfn(diag->cbarg, diag->status); 45463d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->block = 0; 45473d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 45483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 45493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/* 45503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * Firmware ping 45513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */ 45523d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 45533d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/* 45543d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * Perform DMA test directly 45553d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */ 45563d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatistatic void 45573d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatidiag_fwping_send(struct bfa_diag_s *diag) 45583d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 45593d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfi_diag_fwping_req_s *fwping_req; 45603d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati u32 i; 45613d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 45623d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, diag->fwping.dbuf_pa); 45633d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 45643d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* fill DMA area with pattern */ 45653d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati for (i = 0; i < (BFI_DIAG_DMA_BUF_SZ >> 2); i++) 45663d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *((u32 *)diag->fwping.dbuf_kva + i) = diag->fwping.data; 45673d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 45683d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* Fill mbox msg */ 45693d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati fwping_req = (struct bfi_diag_fwping_req_s *)diag->fwping.mbcmd.msg; 45703d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 45713d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* Setup SG list */ 45723d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_alen_set(&fwping_req->alen, BFI_DIAG_DMA_BUF_SZ, 45733d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.dbuf_pa); 45743d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* Set up dma count */ 45753d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati fwping_req->count = cpu_to_be32(diag->fwping.count); 45763d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* Set up data pattern */ 45773d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati fwping_req->data = diag->fwping.data; 45783d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 45793d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* build host command */ 45803d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfi_h2i_set(fwping_req->mh, BFI_MC_DIAG, BFI_DIAG_H2I_FWPING, 45813d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_ioc_portid(diag->ioc)); 45823d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 45833d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* send mbox cmd */ 45843d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_ioc_mbox_queue(diag->ioc, &diag->fwping.mbcmd); 45853d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 45863d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 45873d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatistatic void 45883d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatidiag_fwping_comp(struct bfa_diag_s *diag, 45893d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfi_diag_fwping_rsp_s *diag_rsp) 45903d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 45913d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati u32 rsp_data = diag_rsp->data; 45923d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati u8 rsp_dma_status = diag_rsp->dma_status; 45933d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 45943d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, rsp_data); 45953d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, rsp_dma_status); 45963d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 45973d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (rsp_dma_status == BFA_STATUS_OK) { 45983d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati u32 i, pat; 45993d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati pat = (diag->fwping.count & 0x1) ? ~(diag->fwping.data) : 46003d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.data; 46013d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* Check mbox data */ 46023d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (diag->fwping.data != rsp_data) { 46033d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, rsp_data); 46043d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.result->dmastatus = 46053d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati BFA_STATUS_DATACORRUPTED; 46063d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.status = BFA_STATUS_DATACORRUPTED; 46073d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.cbfn(diag->fwping.cbarg, 46083d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.status); 46093d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.lock = 0; 46103d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return; 46113d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati } 46123d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* Check dma pattern */ 46133d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati for (i = 0; i < (BFI_DIAG_DMA_BUF_SZ >> 2); i++) { 46143d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (*((u32 *)diag->fwping.dbuf_kva + i) != pat) { 46153d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, i); 46163d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, pat); 46173d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, 46183d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *((u32 *)diag->fwping.dbuf_kva + i)); 46193d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.result->dmastatus = 46203d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati BFA_STATUS_DATACORRUPTED; 46213d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.status = BFA_STATUS_DATACORRUPTED; 46223d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.cbfn(diag->fwping.cbarg, 46233d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.status); 46243d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.lock = 0; 46253d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return; 46263d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati } 46273d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati } 46283d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.result->dmastatus = BFA_STATUS_OK; 46293d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.status = BFA_STATUS_OK; 46303d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.cbfn(diag->fwping.cbarg, diag->fwping.status); 46313d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.lock = 0; 46323d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati } else { 46333d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.status = BFA_STATUS_HDMA_FAILED; 46343d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.cbfn(diag->fwping.cbarg, diag->fwping.status); 46353d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.lock = 0; 46363d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati } 46373d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 46383d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 46393d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/* 46403d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * Temperature Sensor 46413d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */ 46423d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 46433d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatistatic void 46443d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatidiag_tempsensor_send(struct bfa_diag_s *diag) 46453d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 46463d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfi_diag_ts_req_s *msg; 46473d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 46483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati msg = (struct bfi_diag_ts_req_s *)diag->tsensor.mbcmd.msg; 46493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, msg->temp); 46503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* build host command */ 46513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfi_h2i_set(msg->mh, BFI_MC_DIAG, BFI_DIAG_H2I_TEMPSENSOR, 46523d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_ioc_portid(diag->ioc)); 46533d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* send mbox cmd */ 46543d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_ioc_mbox_queue(diag->ioc, &diag->tsensor.mbcmd); 46553d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 46563d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 46573d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatistatic void 46583d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatidiag_tempsensor_comp(struct bfa_diag_s *diag, bfi_diag_ts_rsp_t *rsp) 46593d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 46603d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (!diag->tsensor.lock) { 46613d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* receiving response after ioc failure */ 46623d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, diag->tsensor.lock); 46633d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return; 46643d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati } 46653d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 46663d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* 46673d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * ASIC junction tempsensor is a reg read operation 46683d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * it will always return OK 46693d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */ 46703d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->tsensor.temp->temp = be16_to_cpu(rsp->temp); 46713d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->tsensor.temp->ts_junc = rsp->ts_junc; 46723d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->tsensor.temp->ts_brd = rsp->ts_brd; 46733d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->tsensor.temp->status = BFA_STATUS_OK; 46743d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 46753d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (rsp->ts_brd) { 46763d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (rsp->status == BFA_STATUS_OK) { 46773d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->tsensor.temp->brd_temp = 46783d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati be16_to_cpu(rsp->brd_temp); 46793d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati } else { 46803d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, rsp->status); 46813d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->tsensor.temp->brd_temp = 0; 46823d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->tsensor.temp->status = BFA_STATUS_DEVBUSY; 46833d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati } 46843d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati } 46853d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, rsp->ts_junc); 46863d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, rsp->temp); 46873d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, rsp->ts_brd); 46883d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, rsp->brd_temp); 46893d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->tsensor.cbfn(diag->tsensor.cbarg, diag->tsensor.status); 46903d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->tsensor.lock = 0; 46913d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 46923d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 46933d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/* 46943d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * LED Test command 46953d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */ 46963d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatistatic void 46973d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatidiag_ledtest_send(struct bfa_diag_s *diag, struct bfa_diag_ledtest_s *ledtest) 46983d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 46993d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfi_diag_ledtest_req_s *msg; 47003d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 47013d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati msg = (struct bfi_diag_ledtest_req_s *)diag->ledtest.mbcmd.msg; 47023d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* build host command */ 47033d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfi_h2i_set(msg->mh, BFI_MC_DIAG, BFI_DIAG_H2I_LEDTEST, 47043d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_ioc_portid(diag->ioc)); 47053d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 47063d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* 47073d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * convert the freq from N blinks per 10 sec to 47083d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * crossbow ontime value. We do it here because division is need 47093d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */ 47103d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (ledtest->freq) 47113d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati ledtest->freq = 500 / ledtest->freq; 47123d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 47133d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (ledtest->freq == 0) 47143d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati ledtest->freq = 1; 47153d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 47163d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, ledtest->freq); 47173d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* mcpy(&ledtest_req->req, ledtest, sizeof(bfa_diag_ledtest_t)); */ 47183d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati msg->cmd = (u8) ledtest->cmd; 47193d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati msg->color = (u8) ledtest->color; 47203d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati msg->portid = bfa_ioc_portid(diag->ioc); 47213d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati msg->led = ledtest->led; 47223d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati msg->freq = cpu_to_be16(ledtest->freq); 47233d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 47243d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* send mbox cmd */ 47253d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_ioc_mbox_queue(diag->ioc, &diag->ledtest.mbcmd); 47263d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 47273d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 47283d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatistatic void 47298919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipatidiag_ledtest_comp(struct bfa_diag_s *diag, struct bfi_diag_ledtest_rsp_s *msg) 47303d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 47313d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, diag->ledtest.lock); 47323d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->ledtest.lock = BFA_FALSE; 47333d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* no bfa_cb_queue is needed because driver is not waiting */ 47343d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 47353d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 47363d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/* 47373d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * Port beaconing 47383d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */ 47393d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatistatic void 47403d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatidiag_portbeacon_send(struct bfa_diag_s *diag, bfa_boolean_t beacon, u32 sec) 47413d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 47423d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfi_diag_portbeacon_req_s *msg; 47433d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 47443d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati msg = (struct bfi_diag_portbeacon_req_s *)diag->beacon.mbcmd.msg; 47453d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* build host command */ 47463d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfi_h2i_set(msg->mh, BFI_MC_DIAG, BFI_DIAG_H2I_PORTBEACON, 47473d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_ioc_portid(diag->ioc)); 47483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati msg->beacon = beacon; 47493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati msg->period = cpu_to_be32(sec); 47503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* send mbox cmd */ 47513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_ioc_mbox_queue(diag->ioc, &diag->beacon.mbcmd); 47523d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 47533d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 47543d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatistatic void 47553d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatidiag_portbeacon_comp(struct bfa_diag_s *diag) 47563d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 47573d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, diag->beacon.state); 47583d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->beacon.state = BFA_FALSE; 47593d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (diag->cbfn_beacon) 47603d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->cbfn_beacon(diag->dev, BFA_FALSE, diag->beacon.link_e2e); 47613d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 47623d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 47633d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/* 47643d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * Diag hmbox handler 47653d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */ 47663d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipativoid 47673d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_intr(void *diagarg, struct bfi_mbmsg_s *msg) 47683d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 47693d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfa_diag_s *diag = diagarg; 47703d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 47713d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati switch (msg->mh.msg_id) { 47723d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati case BFI_DIAG_I2H_PORTBEACON: 47733d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag_portbeacon_comp(diag); 47743d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati break; 47753d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati case BFI_DIAG_I2H_FWPING: 47763d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag_fwping_comp(diag, (struct bfi_diag_fwping_rsp_s *) msg); 47773d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati break; 47783d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati case BFI_DIAG_I2H_TEMPSENSOR: 47793d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag_tempsensor_comp(diag, (bfi_diag_ts_rsp_t *) msg); 47803d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati break; 47813d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati case BFI_DIAG_I2H_LEDTEST: 47823d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag_ledtest_comp(diag, (struct bfi_diag_ledtest_rsp_s *) msg); 47833d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati break; 47843d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati default: 47853d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, msg->mh.msg_id); 47863d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati WARN_ON(1); 47873d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati } 47883d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 47893d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 47903d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/* 47913d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * Gen RAM Test 47923d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * 47933d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] *diag - diag data struct 47943d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] *memtest - mem test params input from upper layer, 47953d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] pattern - mem test pattern 47963d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] *result - mem test result 47973d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] cbfn - mem test callback functioin 47983d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] cbarg - callback functioin arg 47993d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * 48003d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[out] 48013d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */ 48023d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_status_t 48033d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_memtest(struct bfa_diag_s *diag, struct bfa_diag_memtest_s *memtest, 48043d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati u32 pattern, struct bfa_diag_memtest_result *result, 48053d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_cb_diag_t cbfn, void *cbarg) 48063d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 4807bd5a026019bc1f799065b0a39230d1f81bb4ff76Krishna Gudipati u32 memtest_tov; 4808bd5a026019bc1f799065b0a39230d1f81bb4ff76Krishna Gudipati 48093d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, pattern); 48103d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 48113d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (!bfa_ioc_adapter_is_disabled(diag->ioc)) 48123d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return BFA_STATUS_ADAPTER_ENABLED; 48133d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 48143d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* check to see if there is another destructive diag cmd running */ 48153d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (diag->block) { 48163d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, diag->block); 48173d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return BFA_STATUS_DEVBUSY; 48183d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati } else 48193d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->block = 1; 48203d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 48213d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->result = result; 48223d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->cbfn = cbfn; 48233d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->cbarg = cbarg; 48243d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 48253d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* download memtest code and take LPU0 out of reset */ 48263d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_ioc_boot(diag->ioc, BFI_FWBOOT_TYPE_MEMTEST, BFI_FWBOOT_ENV_OS); 48273d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 4828bd5a026019bc1f799065b0a39230d1f81bb4ff76Krishna Gudipati memtest_tov = (bfa_ioc_asic_gen(diag->ioc) == BFI_ASIC_GEN_CT2) ? 4829bd5a026019bc1f799065b0a39230d1f81bb4ff76Krishna Gudipati CT2_BFA_DIAG_MEMTEST_TOV : BFA_DIAG_MEMTEST_TOV; 48303d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_timer_begin(diag->ioc->timer_mod, &diag->timer, 4831bd5a026019bc1f799065b0a39230d1f81bb4ff76Krishna Gudipati bfa_diag_memtest_done, diag, memtest_tov); 48323d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->timer_active = 1; 48333d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return BFA_STATUS_OK; 48343d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 48353d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 48363d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/* 48373d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * DIAG firmware ping command 48383d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * 48393d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] *diag - diag data struct 48403d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] cnt - dma loop count for testing PCIE 48413d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] data - data pattern to pass in fw 48423d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] *result - pt to bfa_diag_fwping_result_t data struct 48433d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] cbfn - callback function 48443d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] *cbarg - callback functioin arg 48453d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * 48463d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[out] 48473d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */ 48483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_status_t 48493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_fwping(struct bfa_diag_s *diag, u32 cnt, u32 data, 48503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfa_diag_results_fwping *result, bfa_cb_diag_t cbfn, 48513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati void *cbarg) 48523d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 48533d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, cnt); 48543d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, data); 48553d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 48563d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (!bfa_ioc_is_operational(diag->ioc)) 48573d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return BFA_STATUS_IOC_NON_OP; 48583d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 48593d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (bfa_asic_id_ct2(bfa_ioc_devid((diag->ioc))) && 48603d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati ((diag->ioc)->clscode == BFI_PCIFN_CLASS_ETH)) 48613d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return BFA_STATUS_CMD_NOTSUPP; 48623d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 48633d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* check to see if there is another destructive diag cmd running */ 48643d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (diag->block || diag->fwping.lock) { 48653d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, diag->block); 48663d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, diag->fwping.lock); 48673d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return BFA_STATUS_DEVBUSY; 48683d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati } 48693d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 48703d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* Initialization */ 48713d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.lock = 1; 48723d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.cbfn = cbfn; 48733d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.cbarg = cbarg; 48743d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.result = result; 48753d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.data = data; 48763d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.count = cnt; 48773d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 48783d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* Init test results */ 48793d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.result->data = 0; 48803d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.result->status = BFA_STATUS_OK; 48813d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 48823d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* kick off the first ping */ 48833d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag_fwping_send(diag); 48843d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return BFA_STATUS_OK; 48853d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 48863d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 48873d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/* 48883d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * Read Temperature Sensor 48893d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * 48903d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] *diag - diag data struct 48913d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] *result - pt to bfa_diag_temp_t data struct 48923d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] cbfn - callback function 48933d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] *cbarg - callback functioin arg 48943d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * 48953d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[out] 48963d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */ 48973d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_status_t 48983d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_tsensor_query(struct bfa_diag_s *diag, 48993d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati struct bfa_diag_results_tempsensor_s *result, 49003d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_cb_diag_t cbfn, void *cbarg) 49013d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 49023d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* check to see if there is a destructive diag cmd running */ 49033d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (diag->block || diag->tsensor.lock) { 49043d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, diag->block); 49053d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, diag->tsensor.lock); 49063d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return BFA_STATUS_DEVBUSY; 49073d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati } 49083d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 49093d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (!bfa_ioc_is_operational(diag->ioc)) 49103d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return BFA_STATUS_IOC_NON_OP; 49113d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 49123d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* Init diag mod params */ 49133d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->tsensor.lock = 1; 49143d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->tsensor.temp = result; 49153d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->tsensor.cbfn = cbfn; 49163d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->tsensor.cbarg = cbarg; 49173d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 49183d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* Send msg to fw */ 49193d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag_tempsensor_send(diag); 49203d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 49213d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return BFA_STATUS_OK; 49223d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 49233d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 49243d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/* 49253d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * LED Test command 49263d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * 49273d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] *diag - diag data struct 49283d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] *ledtest - pt to ledtest data structure 49293d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * 49303d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[out] 49313d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */ 49323d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_status_t 49333d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_ledtest(struct bfa_diag_s *diag, struct bfa_diag_ledtest_s *ledtest) 49343d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 49353d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, ledtest->cmd); 49363d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 49373d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (!bfa_ioc_is_operational(diag->ioc)) 49383d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return BFA_STATUS_IOC_NON_OP; 49393d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 49403d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (diag->beacon.state) 49413d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return BFA_STATUS_BEACON_ON; 49423d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 49433d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (diag->ledtest.lock) 49443d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return BFA_STATUS_LEDTEST_OP; 49453d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 49463d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* Send msg to fw */ 49473d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->ledtest.lock = BFA_TRUE; 49483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag_ledtest_send(diag, ledtest); 49493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 49503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return BFA_STATUS_OK; 49513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 49523d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 49533d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/* 49543d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * Port beaconing command 49553d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * 49563d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] *diag - diag data struct 49573d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] beacon - port beaconing 1:ON 0:OFF 49583d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] link_e2e_beacon - link beaconing 1:ON 0:OFF 49593d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[in] sec - beaconing duration in seconds 49603d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * 49613d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * @param[out] 49623d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */ 49633d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_status_t 49643d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_beacon_port(struct bfa_diag_s *diag, bfa_boolean_t beacon, 49653d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_boolean_t link_e2e_beacon, uint32_t sec) 49663d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 49673d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, beacon); 49683d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, link_e2e_beacon); 49693d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_trc(diag, sec); 49703d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 49713d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (!bfa_ioc_is_operational(diag->ioc)) 49723d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return BFA_STATUS_IOC_NON_OP; 49733d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 49743d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (diag->ledtest.lock) 49753d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return BFA_STATUS_LEDTEST_OP; 49763d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 49773d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (diag->beacon.state && beacon) /* beacon alread on */ 49783d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return BFA_STATUS_BEACON_ON; 49793d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 49803d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->beacon.state = beacon; 49813d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->beacon.link_e2e = link_e2e_beacon; 49823d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati if (diag->cbfn_beacon) 49833d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->cbfn_beacon(diag->dev, beacon, link_e2e_beacon); 49843d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 49853d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati /* Send msg to fw */ 49863d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag_portbeacon_send(diag, beacon, sec); 49873d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 49883d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return BFA_STATUS_OK; 49893d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 49903d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 49913d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/* 49923d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * Return DMA memory needed by diag module. 49933d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */ 49943d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiu32 49953d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_meminfo(void) 49963d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 49973d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati return BFA_ROUNDUP(BFI_DIAG_DMA_BUF_SZ, BFA_DMA_ALIGN_SZ); 49983d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 49993d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 50003d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/* 50013d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * Attach virtual and physical memory for Diag. 50023d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */ 50033d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipativoid 50043d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_attach(struct bfa_diag_s *diag, struct bfa_ioc_s *ioc, void *dev, 50053d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_cb_diag_beacon_t cbfn_beacon, struct bfa_trc_mod_s *trcmod) 50063d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 50073d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->dev = dev; 50083d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->ioc = ioc; 50093d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->trcmod = trcmod; 50103d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 50113d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->block = 0; 50123d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->cbfn = NULL; 50133d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->cbarg = NULL; 50143d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->result = NULL; 50153d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->cbfn_beacon = cbfn_beacon; 50163d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 50173d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_ioc_mbox_regisr(diag->ioc, BFI_MC_DIAG, bfa_diag_intr, diag); 50183d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_q_qe_init(&diag->ioc_notify); 50193d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati bfa_ioc_notify_init(&diag->ioc_notify, bfa_diag_notify, diag); 50203d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati list_add_tail(&diag->ioc_notify.qe, &diag->ioc->notify_q); 50213d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 50223d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati 50233d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipativoid 50243d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_memclaim(struct bfa_diag_s *diag, u8 *dm_kva, u64 dm_pa) 50253d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{ 50263d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.dbuf_kva = dm_kva; 50273d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati diag->fwping.dbuf_pa = dm_pa; 50283d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati memset(diag->fwping.dbuf_kva, 0, BFI_DIAG_DMA_BUF_SZ); 50293d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati} 50303350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 50313350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/* 50323350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * PHY module specific 50333350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */ 50343350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati#define BFA_PHY_DMA_BUF_SZ 0x02000 /* 8k dma buffer */ 50353350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati#define BFA_PHY_LOCK_STATUS 0x018878 /* phy semaphore status reg */ 50363350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 50373350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatistatic void 50383350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_ntoh32(u32 *obuf, u32 *ibuf, int sz) 50393350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{ 50403350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati int i, m = sz >> 2; 50413350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 50423350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati for (i = 0; i < m; i++) 50433350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati obuf[i] = be32_to_cpu(ibuf[i]); 50443350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati} 50453350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 50463350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatistatic bfa_boolean_t 50473350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_present(struct bfa_phy_s *phy) 50483350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{ 50493350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return (phy->ioc->attr->card_type == BFA_MFG_TYPE_LIGHTNING); 50503350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati} 50513350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 50523350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatistatic void 50533350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_notify(void *cbarg, enum bfa_ioc_event_e event) 50543350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{ 50553350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfa_phy_s *phy = cbarg; 50563350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 50573350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, event); 50583350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 50593350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati switch (event) { 50603350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati case BFA_IOC_E_DISABLED: 50613350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati case BFA_IOC_E_FAILED: 50623350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (phy->op_busy) { 50633350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->status = BFA_STATUS_IOC_FAILURE; 50643350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->cbfn(phy->cbarg, phy->status); 50653350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->op_busy = 0; 50663350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati } 50673350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati break; 50683350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 50693350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati default: 50703350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati break; 50713350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati } 50723350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati} 50733350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 50743350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/* 50753350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Send phy attribute query request. 50763350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * 50773350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbarg - callback argument 50783350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */ 50793350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatistatic void 50803350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_query_send(void *cbarg) 50813350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{ 50823350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfa_phy_s *phy = cbarg; 50833350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfi_phy_query_req_s *msg = 50843350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati (struct bfi_phy_query_req_s *) phy->mb.msg; 50853350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 50863350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati msg->instance = phy->instance; 50873350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfi_h2i_set(msg->mh, BFI_MC_PHY, BFI_PHY_H2I_QUERY_REQ, 50883350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_ioc_portid(phy->ioc)); 50893350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_alen_set(&msg->alen, sizeof(struct bfa_phy_attr_s), phy->dbuf_pa); 50903350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_ioc_mbox_queue(phy->ioc, &phy->mb); 50913350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati} 50923350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 50933350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/* 50943350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Send phy write request. 50953350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * 50963350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbarg - callback argument 50973350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */ 50983350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatistatic void 50993350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_write_send(void *cbarg) 51003350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{ 51013350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfa_phy_s *phy = cbarg; 51023350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfi_phy_write_req_s *msg = 51033350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati (struct bfi_phy_write_req_s *) phy->mb.msg; 51043350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati u32 len; 51053350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati u16 *buf, *dbuf; 51063350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati int i, sz; 51073350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 51083350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati msg->instance = phy->instance; 51093350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati msg->offset = cpu_to_be32(phy->addr_off + phy->offset); 51103350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati len = (phy->residue < BFA_PHY_DMA_BUF_SZ) ? 51113350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->residue : BFA_PHY_DMA_BUF_SZ; 51123350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati msg->length = cpu_to_be32(len); 51133350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 51143350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati /* indicate if it's the last msg of the whole write operation */ 51153350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati msg->last = (len == phy->residue) ? 1 : 0; 51163350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 51173350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfi_h2i_set(msg->mh, BFI_MC_PHY, BFI_PHY_H2I_WRITE_REQ, 51183350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_ioc_portid(phy->ioc)); 51193350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_alen_set(&msg->alen, len, phy->dbuf_pa); 51203350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 51213350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati buf = (u16 *) (phy->ubuf + phy->offset); 51223350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati dbuf = (u16 *)phy->dbuf_kva; 51233350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati sz = len >> 1; 51243350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati for (i = 0; i < sz; i++) 51253350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati buf[i] = cpu_to_be16(dbuf[i]); 51263350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 51273350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_ioc_mbox_queue(phy->ioc, &phy->mb); 51283350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 51293350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->residue -= len; 51303350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->offset += len; 51313350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati} 51323350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 51333350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/* 51343350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Send phy read request. 51353350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * 51363350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbarg - callback argument 51373350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */ 51383350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatistatic void 51393350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_read_send(void *cbarg) 51403350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{ 51413350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfa_phy_s *phy = cbarg; 51423350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfi_phy_read_req_s *msg = 51433350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati (struct bfi_phy_read_req_s *) phy->mb.msg; 51443350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati u32 len; 51453350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 51463350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati msg->instance = phy->instance; 51473350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati msg->offset = cpu_to_be32(phy->addr_off + phy->offset); 51483350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati len = (phy->residue < BFA_PHY_DMA_BUF_SZ) ? 51493350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->residue : BFA_PHY_DMA_BUF_SZ; 51503350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati msg->length = cpu_to_be32(len); 51513350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfi_h2i_set(msg->mh, BFI_MC_PHY, BFI_PHY_H2I_READ_REQ, 51523350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_ioc_portid(phy->ioc)); 51533350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_alen_set(&msg->alen, len, phy->dbuf_pa); 51543350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_ioc_mbox_queue(phy->ioc, &phy->mb); 51553350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati} 51563350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 51573350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/* 51583350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Send phy stats request. 51593350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * 51603350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbarg - callback argument 51613350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */ 51623350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatistatic void 51633350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_stats_send(void *cbarg) 51643350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{ 51653350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfa_phy_s *phy = cbarg; 51663350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfi_phy_stats_req_s *msg = 51673350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati (struct bfi_phy_stats_req_s *) phy->mb.msg; 51683350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 51693350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati msg->instance = phy->instance; 51703350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfi_h2i_set(msg->mh, BFI_MC_PHY, BFI_PHY_H2I_STATS_REQ, 51713350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_ioc_portid(phy->ioc)); 51723350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_alen_set(&msg->alen, sizeof(struct bfa_phy_stats_s), phy->dbuf_pa); 51733350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_ioc_mbox_queue(phy->ioc, &phy->mb); 51743350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati} 51753350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 51763350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/* 51773350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Flash memory info API. 51783350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * 51793350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] mincfg - minimal cfg variable 51803350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */ 51813350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiu32 51823350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_meminfo(bfa_boolean_t mincfg) 51833350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{ 51843350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati /* min driver doesn't need phy */ 51853350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (mincfg) 51863350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return 0; 51873350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 51883350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return BFA_ROUNDUP(BFA_PHY_DMA_BUF_SZ, BFA_DMA_ALIGN_SZ); 51893350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati} 51903350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 51913350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/* 51923350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Flash attach API. 51933350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * 51943350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] phy - phy structure 51953350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] ioc - ioc structure 51963350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] dev - device structure 51973350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] trcmod - trace module 51983350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] logmod - log module 51993350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */ 52003350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipativoid 52013350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_attach(struct bfa_phy_s *phy, struct bfa_ioc_s *ioc, void *dev, 52023350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfa_trc_mod_s *trcmod, bfa_boolean_t mincfg) 52033350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{ 52043350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->ioc = ioc; 52053350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->trcmod = trcmod; 52063350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->cbfn = NULL; 52073350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->cbarg = NULL; 52083350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->op_busy = 0; 52093350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 52103350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_ioc_mbox_regisr(phy->ioc, BFI_MC_PHY, bfa_phy_intr, phy); 52113350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_q_qe_init(&phy->ioc_notify); 52123350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_ioc_notify_init(&phy->ioc_notify, bfa_phy_notify, phy); 52133350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati list_add_tail(&phy->ioc_notify.qe, &phy->ioc->notify_q); 52143350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 52153350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati /* min driver doesn't need phy */ 52163350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (mincfg) { 52173350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->dbuf_kva = NULL; 52183350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->dbuf_pa = 0; 52193350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati } 52203350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati} 52213350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 52223350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/* 52233350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Claim memory for phy 52243350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * 52253350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] phy - phy structure 52263350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] dm_kva - pointer to virtual memory address 52273350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] dm_pa - physical memory address 52283350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] mincfg - minimal cfg variable 52293350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */ 52303350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipativoid 52313350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_memclaim(struct bfa_phy_s *phy, u8 *dm_kva, u64 dm_pa, 52323350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_boolean_t mincfg) 52333350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{ 52343350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (mincfg) 52353350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return; 52363350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 52373350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->dbuf_kva = dm_kva; 52383350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->dbuf_pa = dm_pa; 52393350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati memset(phy->dbuf_kva, 0, BFA_PHY_DMA_BUF_SZ); 52403350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati dm_kva += BFA_ROUNDUP(BFA_PHY_DMA_BUF_SZ, BFA_DMA_ALIGN_SZ); 52413350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati dm_pa += BFA_ROUNDUP(BFA_PHY_DMA_BUF_SZ, BFA_DMA_ALIGN_SZ); 52423350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati} 52433350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 52443350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_boolean_t 52453350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_busy(struct bfa_ioc_s *ioc) 52463350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{ 52473350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati void __iomem *rb; 52483350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 52493350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati rb = bfa_ioc_bar0(ioc); 52503350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return readl(rb + BFA_PHY_LOCK_STATUS); 52513350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati} 52523350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 52533350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/* 52543350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Get phy attribute. 52553350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * 52563350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] phy - phy structure 52573350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] attr - phy attribute structure 52583350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbfn - callback function 52593350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbarg - callback argument 52603350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * 52613350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Return status. 52623350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */ 52633350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_status_t 52643350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_get_attr(struct bfa_phy_s *phy, u8 instance, 52653350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfa_phy_attr_s *attr, bfa_cb_phy_t cbfn, void *cbarg) 52663350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{ 52673350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, BFI_PHY_H2I_QUERY_REQ); 52683350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, instance); 52693350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 52703350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (!bfa_phy_present(phy)) 52713350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return BFA_STATUS_PHY_NOT_PRESENT; 52723350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 52733350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (!bfa_ioc_is_operational(phy->ioc)) 52743350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return BFA_STATUS_IOC_NON_OP; 52753350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 52763350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (phy->op_busy || bfa_phy_busy(phy->ioc)) { 52773350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, phy->op_busy); 52783350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return BFA_STATUS_DEVBUSY; 52793350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati } 52803350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 52813350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->op_busy = 1; 52823350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->cbfn = cbfn; 52833350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->cbarg = cbarg; 52843350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->instance = instance; 52853350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->ubuf = (uint8_t *) attr; 52863350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_phy_query_send(phy); 52873350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 52883350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return BFA_STATUS_OK; 52893350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati} 52903350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 52913350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/* 52923350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Get phy stats. 52933350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * 52943350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] phy - phy structure 52953350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] instance - phy image instance 52963350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] stats - pointer to phy stats 52973350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbfn - callback function 52983350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbarg - callback argument 52993350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * 53003350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Return status. 53013350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */ 53023350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_status_t 53033350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_get_stats(struct bfa_phy_s *phy, u8 instance, 53043350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfa_phy_stats_s *stats, 53053350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_cb_phy_t cbfn, void *cbarg) 53063350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{ 53073350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, BFI_PHY_H2I_STATS_REQ); 53083350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, instance); 53093350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 53103350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (!bfa_phy_present(phy)) 53113350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return BFA_STATUS_PHY_NOT_PRESENT; 53123350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 53133350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (!bfa_ioc_is_operational(phy->ioc)) 53143350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return BFA_STATUS_IOC_NON_OP; 53153350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 53163350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (phy->op_busy || bfa_phy_busy(phy->ioc)) { 53173350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, phy->op_busy); 53183350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return BFA_STATUS_DEVBUSY; 53193350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati } 53203350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 53213350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->op_busy = 1; 53223350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->cbfn = cbfn; 53233350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->cbarg = cbarg; 53243350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->instance = instance; 53253350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->ubuf = (u8 *) stats; 53263350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_phy_stats_send(phy); 53273350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 53283350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return BFA_STATUS_OK; 53293350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati} 53303350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 53313350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/* 53323350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Update phy image. 53333350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * 53343350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] phy - phy structure 53353350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] instance - phy image instance 53363350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] buf - update data buffer 53373350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] len - data buffer length 53383350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] offset - offset relative to starting address 53393350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbfn - callback function 53403350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbarg - callback argument 53413350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * 53423350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Return status. 53433350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */ 53443350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_status_t 53453350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_update(struct bfa_phy_s *phy, u8 instance, 53463350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati void *buf, u32 len, u32 offset, 53473350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_cb_phy_t cbfn, void *cbarg) 53483350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{ 53493350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, BFI_PHY_H2I_WRITE_REQ); 53503350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, instance); 53513350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, len); 53523350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, offset); 53533350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 53543350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (!bfa_phy_present(phy)) 53553350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return BFA_STATUS_PHY_NOT_PRESENT; 53563350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 53573350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (!bfa_ioc_is_operational(phy->ioc)) 53583350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return BFA_STATUS_IOC_NON_OP; 53593350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 53603350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati /* 'len' must be in word (4-byte) boundary */ 53613350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (!len || (len & 0x03)) 53623350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return BFA_STATUS_FAILED; 53633350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 53643350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (phy->op_busy || bfa_phy_busy(phy->ioc)) { 53653350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, phy->op_busy); 53663350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return BFA_STATUS_DEVBUSY; 53673350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati } 53683350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 53693350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->op_busy = 1; 53703350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->cbfn = cbfn; 53713350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->cbarg = cbarg; 53723350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->instance = instance; 53733350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->residue = len; 53743350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->offset = 0; 53753350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->addr_off = offset; 53763350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->ubuf = buf; 53773350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 53783350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_phy_write_send(phy); 53793350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return BFA_STATUS_OK; 53803350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati} 53813350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 53823350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/* 53833350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Read phy image. 53843350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * 53853350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] phy - phy structure 53863350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] instance - phy image instance 53873350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] buf - read data buffer 53883350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] len - data buffer length 53893350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] offset - offset relative to starting address 53903350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbfn - callback function 53913350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbarg - callback argument 53923350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * 53933350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Return status. 53943350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */ 53953350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_status_t 53963350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_read(struct bfa_phy_s *phy, u8 instance, 53973350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati void *buf, u32 len, u32 offset, 53983350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_cb_phy_t cbfn, void *cbarg) 53993350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{ 54003350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, BFI_PHY_H2I_READ_REQ); 54013350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, instance); 54023350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, len); 54033350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, offset); 54043350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 54053350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (!bfa_phy_present(phy)) 54063350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return BFA_STATUS_PHY_NOT_PRESENT; 54073350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 54083350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (!bfa_ioc_is_operational(phy->ioc)) 54093350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return BFA_STATUS_IOC_NON_OP; 54103350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 54113350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati /* 'len' must be in word (4-byte) boundary */ 54123350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (!len || (len & 0x03)) 54133350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return BFA_STATUS_FAILED; 54143350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 54153350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (phy->op_busy || bfa_phy_busy(phy->ioc)) { 54163350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, phy->op_busy); 54173350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return BFA_STATUS_DEVBUSY; 54183350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati } 54193350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 54203350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->op_busy = 1; 54213350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->cbfn = cbfn; 54223350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->cbarg = cbarg; 54233350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->instance = instance; 54243350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->residue = len; 54253350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->offset = 0; 54263350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->addr_off = offset; 54273350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->ubuf = buf; 54283350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_phy_read_send(phy); 54293350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 54303350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return BFA_STATUS_OK; 54313350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati} 54323350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 54333350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/* 54343350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Process phy response messages upon receiving interrupts. 54353350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * 54363350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] phyarg - phy structure 54373350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] msg - message structure 54383350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */ 54393350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipativoid 54403350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_intr(void *phyarg, struct bfi_mbmsg_s *msg) 54413350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{ 54423350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfa_phy_s *phy = phyarg; 54433350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati u32 status; 54443350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 54453350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati union { 54463350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfi_phy_query_rsp_s *query; 54473350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfi_phy_stats_rsp_s *stats; 54483350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfi_phy_write_rsp_s *write; 54493350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfi_phy_read_rsp_s *read; 54503350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfi_mbmsg_s *msg; 54513350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati } m; 54523350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 54533350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati m.msg = msg; 54543350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, msg->mh.msg_id); 54553350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 54563350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (!phy->op_busy) { 54573350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati /* receiving response after ioc failure */ 54583350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, 0x9999); 54593350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati return; 54603350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati } 54613350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 54623350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati switch (msg->mh.msg_id) { 54633350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati case BFI_PHY_I2H_QUERY_RSP: 54643350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati status = be32_to_cpu(m.query->status); 54653350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, status); 54663350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 54673350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (status == BFA_STATUS_OK) { 54683350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfa_phy_attr_s *attr = 54693350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati (struct bfa_phy_attr_s *) phy->ubuf; 54703350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_phy_ntoh32((u32 *)attr, (u32 *)phy->dbuf_kva, 54713350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati sizeof(struct bfa_phy_attr_s)); 54723350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, attr->status); 54733350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, attr->length); 54743350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati } 54753350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 54763350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->status = status; 54773350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->op_busy = 0; 54783350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (phy->cbfn) 54793350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->cbfn(phy->cbarg, phy->status); 54803350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati break; 54813350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati case BFI_PHY_I2H_STATS_RSP: 54823350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati status = be32_to_cpu(m.stats->status); 54833350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, status); 54843350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 54853350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (status == BFA_STATUS_OK) { 54863350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati struct bfa_phy_stats_s *stats = 54873350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati (struct bfa_phy_stats_s *) phy->ubuf; 54883350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_phy_ntoh32((u32 *)stats, (u32 *)phy->dbuf_kva, 54893350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati sizeof(struct bfa_phy_stats_s)); 54903350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, stats->status); 54913350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati } 54923350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 54933350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->status = status; 54943350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->op_busy = 0; 54953350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (phy->cbfn) 54963350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->cbfn(phy->cbarg, phy->status); 54973350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati break; 54983350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati case BFI_PHY_I2H_WRITE_RSP: 54993350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati status = be32_to_cpu(m.write->status); 55003350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, status); 55013350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 55023350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (status != BFA_STATUS_OK || phy->residue == 0) { 55033350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->status = status; 55043350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->op_busy = 0; 55053350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (phy->cbfn) 55063350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->cbfn(phy->cbarg, phy->status); 55073350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati } else { 55083350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, phy->offset); 55093350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_phy_write_send(phy); 55103350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati } 55113350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati break; 55123350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati case BFI_PHY_I2H_READ_RSP: 55133350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati status = be32_to_cpu(m.read->status); 55143350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, status); 55153350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 55163350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (status != BFA_STATUS_OK) { 55173350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->status = status; 55183350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->op_busy = 0; 55193350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (phy->cbfn) 55203350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->cbfn(phy->cbarg, phy->status); 55213350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati } else { 55223350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati u32 len = be32_to_cpu(m.read->length); 55233350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati u16 *buf = (u16 *)(phy->ubuf + phy->offset); 55243350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati u16 *dbuf = (u16 *)phy->dbuf_kva; 55253350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati int i, sz = len >> 1; 55263350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 55273350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, phy->offset); 55283350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_trc(phy, len); 55293350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 55303350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati for (i = 0; i < sz; i++) 55313350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati buf[i] = be16_to_cpu(dbuf[i]); 55323350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 55333350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->residue -= len; 55343350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->offset += len; 55353350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati 55363350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (phy->residue == 0) { 55373350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->status = status; 55383350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->op_busy = 0; 55393350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati if (phy->cbfn) 55403350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati phy->cbfn(phy->cbarg, phy->status); 55413350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati } else 55423350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati bfa_phy_read_send(phy); 55433350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati } 55443350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati break; 55453350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati default: 55463350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati WARN_ON(1); 55473350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati } 55483350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati} 554945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 555045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati/* 555145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati * DCONF module specific 555245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati */ 555345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 555445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna GudipatiBFA_MODULE(dconf); 555545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 555645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati/* 555745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati * DCONF state machine events 555845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati */ 555945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatienum bfa_dconf_event { 556045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati BFA_DCONF_SM_INIT = 1, /* dconf Init */ 556145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati BFA_DCONF_SM_FLASH_COMP = 2, /* read/write to flash */ 556245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati BFA_DCONF_SM_WR = 3, /* binding change, map */ 556345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati BFA_DCONF_SM_TIMEOUT = 4, /* Start timer */ 556445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati BFA_DCONF_SM_EXIT = 5, /* exit dconf module */ 556545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati BFA_DCONF_SM_IOCDISABLE = 6, /* IOC disable event */ 556645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}; 556745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 556845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati/* forward declaration of DCONF state machine */ 556945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_sm_uninit(struct bfa_dconf_mod_s *dconf, 557045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati enum bfa_dconf_event event); 557145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_sm_flash_read(struct bfa_dconf_mod_s *dconf, 557245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati enum bfa_dconf_event event); 557345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_sm_ready(struct bfa_dconf_mod_s *dconf, 557445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati enum bfa_dconf_event event); 557545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_sm_dirty(struct bfa_dconf_mod_s *dconf, 557645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati enum bfa_dconf_event event); 557745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_sm_sync(struct bfa_dconf_mod_s *dconf, 557845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati enum bfa_dconf_event event); 557945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_sm_final_sync(struct bfa_dconf_mod_s *dconf, 558045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati enum bfa_dconf_event event); 558145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_sm_iocdown_dirty(struct bfa_dconf_mod_s *dconf, 558245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati enum bfa_dconf_event event); 558345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 558445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_cbfn(void *dconf, bfa_status_t status); 558545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_timer(void *cbarg); 558645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic bfa_status_t bfa_dconf_flash_write(struct bfa_dconf_mod_s *dconf); 558745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_init_cb(void *arg, bfa_status_t status); 558845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 558945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati/* 559045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati * Begining state of dconf module. Waiting for an event to start. 559145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati */ 559245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void 559345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_sm_uninit(struct bfa_dconf_mod_s *dconf, enum bfa_dconf_event event) 559445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{ 559545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_status_t bfa_status; 559645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_trc(dconf->bfa, event); 559745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 559845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati switch (event) { 559945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_INIT: 560045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati if (dconf->min_cfg) { 560145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_trc(dconf->bfa, dconf->min_cfg); 5602db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati bfa_fsm_send_event(&dconf->bfa->iocfc, 5603db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati IOCFC_E_DCONF_DONE); 560445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati return; 560545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati } 560645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_set_state(dconf, bfa_dconf_sm_flash_read); 5607db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati bfa_timer_start(dconf->bfa, &dconf->timer, 5608db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati bfa_dconf_timer, dconf, BFA_DCONF_UPDATE_TOV); 560945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_status = bfa_flash_read_part(BFA_FLASH(dconf->bfa), 561045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati BFA_FLASH_PART_DRV, dconf->instance, 561145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati dconf->dconf, 561245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati sizeof(struct bfa_dconf_s), 0, 561345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_dconf_init_cb, dconf->bfa); 561445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati if (bfa_status != BFA_STATUS_OK) { 5615db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati bfa_timer_stop(&dconf->timer); 561645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_dconf_init_cb(dconf->bfa, BFA_STATUS_FAILED); 561745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_set_state(dconf, bfa_dconf_sm_uninit); 561845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati return; 561945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati } 562045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati break; 562145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_EXIT: 5622db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati bfa_fsm_send_event(&dconf->bfa->iocfc, IOCFC_E_DCONF_DONE); 562345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_IOCDISABLE: 562445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_WR: 562545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_FLASH_COMP: 562645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati break; 562745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati default: 562845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_fault(dconf->bfa, event); 562945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati } 563045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati} 563145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 563245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati/* 563345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati * Read flash for dconf entries and make a call back to the driver once done. 563445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati */ 563545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void 563645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_sm_flash_read(struct bfa_dconf_mod_s *dconf, 563745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati enum bfa_dconf_event event) 563845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{ 563945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_trc(dconf->bfa, event); 564045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 564145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati switch (event) { 564245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_FLASH_COMP: 5643db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati bfa_timer_stop(&dconf->timer); 564445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_set_state(dconf, bfa_dconf_sm_ready); 564545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati break; 564645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_TIMEOUT: 564745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_set_state(dconf, bfa_dconf_sm_ready); 5648db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati bfa_fsm_send_event(&dconf->bfa->iocfc, IOCFC_E_IOC_FAILED); 564945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati break; 565045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_EXIT: 5651db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati bfa_timer_stop(&dconf->timer); 5652db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati bfa_sm_set_state(dconf, bfa_dconf_sm_uninit); 5653db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati bfa_fsm_send_event(&dconf->bfa->iocfc, IOCFC_E_DCONF_DONE); 5654db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati break; 565545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_IOCDISABLE: 5656db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati bfa_timer_stop(&dconf->timer); 565745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_set_state(dconf, bfa_dconf_sm_uninit); 565845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati break; 565945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati default: 566045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_fault(dconf->bfa, event); 566145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati } 566245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati} 566345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 566445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati/* 566545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati * DCONF Module is in ready state. Has completed the initialization. 566645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati */ 566745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void 566845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_sm_ready(struct bfa_dconf_mod_s *dconf, enum bfa_dconf_event event) 566945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{ 567045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_trc(dconf->bfa, event); 567145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 567245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati switch (event) { 567345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_WR: 567445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_timer_start(dconf->bfa, &dconf->timer, 567545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_dconf_timer, dconf, BFA_DCONF_UPDATE_TOV); 567645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_set_state(dconf, bfa_dconf_sm_dirty); 567745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati break; 567845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_EXIT: 567945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_set_state(dconf, bfa_dconf_sm_uninit); 5680db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati bfa_fsm_send_event(&dconf->bfa->iocfc, IOCFC_E_DCONF_DONE); 568145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati break; 568245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_INIT: 568345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_IOCDISABLE: 568445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati break; 568545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati default: 568645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_fault(dconf->bfa, event); 568745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati } 568845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati} 568945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 569045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati/* 569145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati * entries are dirty, write back to the flash. 569245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati */ 569345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 569445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void 569545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_sm_dirty(struct bfa_dconf_mod_s *dconf, enum bfa_dconf_event event) 569645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{ 569745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_trc(dconf->bfa, event); 569845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 569945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati switch (event) { 570045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_TIMEOUT: 570145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_set_state(dconf, bfa_dconf_sm_sync); 570245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_dconf_flash_write(dconf); 570345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati break; 570445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_WR: 570545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_timer_stop(&dconf->timer); 570645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_timer_start(dconf->bfa, &dconf->timer, 570745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_dconf_timer, dconf, BFA_DCONF_UPDATE_TOV); 570845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati break; 570945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_EXIT: 571045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_timer_stop(&dconf->timer); 571145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_timer_start(dconf->bfa, &dconf->timer, 571245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_dconf_timer, dconf, BFA_DCONF_UPDATE_TOV); 571345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_set_state(dconf, bfa_dconf_sm_final_sync); 571445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_dconf_flash_write(dconf); 571545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati break; 571645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_FLASH_COMP: 571745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati break; 571845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_IOCDISABLE: 571945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_timer_stop(&dconf->timer); 572045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_set_state(dconf, bfa_dconf_sm_iocdown_dirty); 572145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati break; 572245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati default: 572345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_fault(dconf->bfa, event); 572445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati } 572545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati} 572645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 572745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati/* 572845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati * Sync the dconf entries to the flash. 572945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati */ 573045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void 573145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_sm_final_sync(struct bfa_dconf_mod_s *dconf, 573245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati enum bfa_dconf_event event) 573345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{ 573445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_trc(dconf->bfa, event); 573545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 573645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati switch (event) { 573745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_IOCDISABLE: 573845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_FLASH_COMP: 573945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_timer_stop(&dconf->timer); 574045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_TIMEOUT: 574145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_set_state(dconf, bfa_dconf_sm_uninit); 5742db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati bfa_fsm_send_event(&dconf->bfa->iocfc, IOCFC_E_DCONF_DONE); 574345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati break; 574445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati default: 574545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_fault(dconf->bfa, event); 574645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati } 574745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati} 574845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 574945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void 575045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_sm_sync(struct bfa_dconf_mod_s *dconf, enum bfa_dconf_event event) 575145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{ 575245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_trc(dconf->bfa, event); 575345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 575445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati switch (event) { 575545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_FLASH_COMP: 575645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_set_state(dconf, bfa_dconf_sm_ready); 575745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati break; 575845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_WR: 575945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_timer_start(dconf->bfa, &dconf->timer, 576045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_dconf_timer, dconf, BFA_DCONF_UPDATE_TOV); 576145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_set_state(dconf, bfa_dconf_sm_dirty); 576245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati break; 576345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_EXIT: 576445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_timer_start(dconf->bfa, &dconf->timer, 576545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_dconf_timer, dconf, BFA_DCONF_UPDATE_TOV); 576645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_set_state(dconf, bfa_dconf_sm_final_sync); 576745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati break; 576845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_IOCDISABLE: 576945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_set_state(dconf, bfa_dconf_sm_iocdown_dirty); 577045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati break; 577145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati default: 577245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_fault(dconf->bfa, event); 577345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati } 577445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati} 577545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 577645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void 577745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_sm_iocdown_dirty(struct bfa_dconf_mod_s *dconf, 577845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati enum bfa_dconf_event event) 577945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{ 578045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_trc(dconf->bfa, event); 578145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 578245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati switch (event) { 578345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_INIT: 578445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_timer_start(dconf->bfa, &dconf->timer, 578545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_dconf_timer, dconf, BFA_DCONF_UPDATE_TOV); 578645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_set_state(dconf, bfa_dconf_sm_dirty); 578745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati break; 578845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_EXIT: 578945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_set_state(dconf, bfa_dconf_sm_uninit); 5790db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati bfa_fsm_send_event(&dconf->bfa->iocfc, IOCFC_E_DCONF_DONE); 579145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati break; 579245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati case BFA_DCONF_SM_IOCDISABLE: 579345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati break; 579445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati default: 579545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_fault(dconf->bfa, event); 579645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati } 579745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati} 579845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 579945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati/* 580045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati * Compute and return memory needed by DRV_CFG module. 580145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati */ 580245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void 580345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_meminfo(struct bfa_iocfc_cfg_s *cfg, struct bfa_meminfo_s *meminfo, 580445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati struct bfa_s *bfa) 580545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{ 580645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati struct bfa_mem_kva_s *dconf_kva = BFA_MEM_DCONF_KVA(bfa); 580745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 580845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati if (cfg->drvcfg.min_cfg) 580945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_mem_kva_setup(meminfo, dconf_kva, 581045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati sizeof(struct bfa_dconf_hdr_s)); 581145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati else 581245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_mem_kva_setup(meminfo, dconf_kva, 581345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati sizeof(struct bfa_dconf_s)); 581445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati} 581545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 581645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void 581745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, 581845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati struct bfa_pcidev_s *pcidev) 581945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{ 582045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati struct bfa_dconf_mod_s *dconf = BFA_DCONF_MOD(bfa); 582145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 582245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati dconf->bfad = bfad; 582345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati dconf->bfa = bfa; 582445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati dconf->instance = bfa->ioc.port_id; 582545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_trc(bfa, dconf->instance); 582645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 582745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati dconf->dconf = (struct bfa_dconf_s *) bfa_mem_kva_curp(dconf); 582845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati if (cfg->drvcfg.min_cfg) { 582945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_mem_kva_curp(dconf) += sizeof(struct bfa_dconf_hdr_s); 583045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati dconf->min_cfg = BFA_TRUE; 583145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati } else { 583245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati dconf->min_cfg = BFA_FALSE; 583345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_mem_kva_curp(dconf) += sizeof(struct bfa_dconf_s); 583445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati } 583545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 583645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_dconf_read_data_valid(bfa) = BFA_FALSE; 583745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_set_state(dconf, bfa_dconf_sm_uninit); 583845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati} 583945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 584045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void 584145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_init_cb(void *arg, bfa_status_t status) 584245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{ 584345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati struct bfa_s *bfa = arg; 584445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati struct bfa_dconf_mod_s *dconf = BFA_DCONF_MOD(bfa); 584545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 5846db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati bfa_sm_send_event(dconf, BFA_DCONF_SM_FLASH_COMP); 584745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati if (status == BFA_STATUS_OK) { 584845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_dconf_read_data_valid(bfa) = BFA_TRUE; 584945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati if (dconf->dconf->hdr.signature != BFI_DCONF_SIGNATURE) 585045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati dconf->dconf->hdr.signature = BFI_DCONF_SIGNATURE; 585145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati if (dconf->dconf->hdr.version != BFI_DCONF_VERSION) 585245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati dconf->dconf->hdr.version = BFI_DCONF_VERSION; 585345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati } 5854db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati bfa_fsm_send_event(&bfa->iocfc, IOCFC_E_DCONF_DONE); 585545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati} 585645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 585745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipativoid 585845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_modinit(struct bfa_s *bfa) 585945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{ 586045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati struct bfa_dconf_mod_s *dconf = BFA_DCONF_MOD(bfa); 586145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_send_event(dconf, BFA_DCONF_SM_INIT); 586245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati} 586345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void 586445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_start(struct bfa_s *bfa) 586545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{ 586645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati} 586745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 586845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void 586945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_stop(struct bfa_s *bfa) 587045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{ 587145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati} 587245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 587345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_timer(void *cbarg) 587445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{ 587545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati struct bfa_dconf_mod_s *dconf = cbarg; 587645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_send_event(dconf, BFA_DCONF_SM_TIMEOUT); 587745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati} 587845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void 587945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_iocdisable(struct bfa_s *bfa) 588045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{ 588145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati struct bfa_dconf_mod_s *dconf = BFA_DCONF_MOD(bfa); 588245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_send_event(dconf, BFA_DCONF_SM_IOCDISABLE); 588345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati} 588445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 588545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void 588645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_detach(struct bfa_s *bfa) 588745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{ 588845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati} 588945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 589045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic bfa_status_t 589145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_flash_write(struct bfa_dconf_mod_s *dconf) 589245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{ 589345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_status_t bfa_status; 589445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_trc(dconf->bfa, 0); 589545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 589645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_status = bfa_flash_update_part(BFA_FLASH(dconf->bfa), 589745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati BFA_FLASH_PART_DRV, dconf->instance, 589845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati dconf->dconf, sizeof(struct bfa_dconf_s), 0, 589945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_dconf_cbfn, dconf); 590045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati if (bfa_status != BFA_STATUS_OK) 590145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati WARN_ON(bfa_status); 590245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_trc(dconf->bfa, bfa_status); 590345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 590445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati return bfa_status; 590545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati} 590645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 590745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_status_t 590845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_update(struct bfa_s *bfa) 590945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{ 591045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati struct bfa_dconf_mod_s *dconf = BFA_DCONF_MOD(bfa); 591145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_trc(dconf->bfa, 0); 591245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati if (bfa_sm_cmp_state(dconf, bfa_dconf_sm_iocdown_dirty)) 591345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati return BFA_STATUS_FAILED; 591445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 591545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati if (dconf->min_cfg) { 591645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_trc(dconf->bfa, dconf->min_cfg); 591745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati return BFA_STATUS_FAILED; 591845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati } 591945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 592045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_send_event(dconf, BFA_DCONF_SM_WR); 592145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati return BFA_STATUS_OK; 592245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati} 592345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 592445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void 592545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_cbfn(void *arg, bfa_status_t status) 592645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{ 592745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati struct bfa_dconf_mod_s *dconf = arg; 592845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati WARN_ON(status); 592945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_send_event(dconf, BFA_DCONF_SM_FLASH_COMP); 593045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati} 593145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati 593245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipativoid 593345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_modexit(struct bfa_s *bfa) 593445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{ 593545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati struct bfa_dconf_mod_s *dconf = BFA_DCONF_MOD(bfa); 593645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati bfa_sm_send_event(dconf, BFA_DCONF_SM_EXIT); 593745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati} 5938