bfa_ioc.c revision 0a4b1fc0b24fc7adbaf8413f2992ce1395991a78
17725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 27725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. 37725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * All rights reserved 47725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * www.brocade.com 57725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 67725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Linux driver for Brocade Fibre Channel Host Bus Adapter. 77725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 87725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This program is free software; you can redistribute it and/or modify it 97725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * under the terms of the GNU General Public License (GPL) Version 2 as 107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * published by the Free Software Foundation 117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This program is distributed in the hope that it will be useful, but 137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * WITHOUT ANY WARRANTY; without even the implied warranty of 147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * General Public License for more details. 167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <bfa.h> 197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <bfa_ioc.h> 207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <bfa_fwimg_priv.h> 217af074dc9d343f69bab4bfd699e6d7ba09915fd9Krishna Gudipati#include <cna/bfa_cna_trcmod.h> 227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <cs/bfa_debug.h> 237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <bfi/bfi_ioc.h> 247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <bfi/bfi_ctreg.h> 257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <aen/bfa_aen_ioc.h> 267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <aen/bfa_aen.h> 277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <log/bfa_log_hal.h> 287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <defs/bfa_defs_pci.h> 297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 307af074dc9d343f69bab4bfd699e6d7ba09915fd9Krishna GudipatiBFA_TRC_FILE(CNA, IOC); 317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC local definitions 347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define BFA_IOC_TOV 2000 /* msecs */ 360a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define BFA_IOC_HWSEM_TOV 500 /* msecs */ 370a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define BFA_IOC_HB_TOV 500 /* msecs */ 380a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define BFA_IOC_HWINIT_MAX 2 397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define BFA_IOC_FWIMG_MINSZ (16 * 1024) 400a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define BFA_IOC_TOV_RECOVER BFA_IOC_HB_TOV 417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define bfa_ioc_timer_start(__ioc) \ 437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_timer_begin((__ioc)->timer_mod, &(__ioc)->ioc_timer, \ 447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timeout, (__ioc), BFA_IOC_TOV) 457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define bfa_ioc_timer_stop(__ioc) bfa_timer_stop(&(__ioc)->ioc_timer) 467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define BFA_DBG_FWTRC_ENTS (BFI_IOC_TRC_ENTS) 487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define BFA_DBG_FWTRC_LEN \ 497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang (BFA_DBG_FWTRC_ENTS * sizeof(struct bfa_trc_s) + \ 507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang (sizeof(struct bfa_trc_mod_s) - \ 517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_TRC_MAX * sizeof(struct bfa_trc_s))) 527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define BFA_DBG_FWTRC_OFF(_fn) (BFI_IOC_TRC_OFF + BFA_DBG_FWTRC_LEN * (_fn)) 537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 540a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati/** 550a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Asic specific macros : see bfa_hw_cb.c and bfa_hw_ct.c for details. 560a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 570a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 580a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define bfa_ioc_firmware_lock(__ioc) \ 590a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ((__ioc)->ioc_hwif->ioc_firmware_lock(__ioc)) 600a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define bfa_ioc_firmware_unlock(__ioc) \ 610a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ((__ioc)->ioc_hwif->ioc_firmware_unlock(__ioc)) 620a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define bfa_ioc_fwimg_get_chunk(__ioc, __off) \ 630a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ((__ioc)->ioc_hwif->ioc_fwimg_get_chunk(__ioc, __off)) 640a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define bfa_ioc_fwimg_get_size(__ioc) \ 650a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ((__ioc)->ioc_hwif->ioc_fwimg_get_size(__ioc)) 660a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define bfa_ioc_reg_init(__ioc) ((__ioc)->ioc_hwif->ioc_reg_init(__ioc)) 670a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define bfa_ioc_map_port(__ioc) ((__ioc)->ioc_hwif->ioc_map_port(__ioc)) 680a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define bfa_ioc_notify_hbfail(__ioc) \ 690a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ((__ioc)->ioc_hwif->ioc_notify_hbfail(__ioc)) 700a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 712f9b8857a914b71ba1b84fb23a0a20a87de41c91Krishna Gudipatibfa_boolean_t bfa_auto_recover = BFA_TRUE; 727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/* 747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * forward declarations 757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_ioc_aen_post(struct bfa_ioc_s *bfa, 777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfa_ioc_aen_event event); 787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_ioc_hw_sem_get(struct bfa_ioc_s *ioc); 797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_ioc_hw_sem_get_cancel(struct bfa_ioc_s *ioc); 807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_ioc_hwinit(struct bfa_ioc_s *ioc, bfa_boolean_t force); 817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_ioc_timeout(void *ioc); 827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_ioc_send_enable(struct bfa_ioc_s *ioc); 837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_ioc_send_disable(struct bfa_ioc_s *ioc); 847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_ioc_send_getattr(struct bfa_ioc_s *ioc); 857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_ioc_hb_monitor(struct bfa_ioc_s *ioc); 867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_ioc_hb_stop(struct bfa_ioc_s *ioc); 877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_ioc_reset(struct bfa_ioc_s *ioc, bfa_boolean_t force); 887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_ioc_mbox_poll(struct bfa_ioc_s *ioc); 897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_ioc_mbox_hbfail(struct bfa_ioc_s *ioc); 907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_ioc_recover(struct bfa_ioc_s *ioc); 917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_ioc_disable_comp(struct bfa_ioc_s *ioc); 927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void bfa_ioc_lpu_stop(struct bfa_ioc_s *ioc); 937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * bfa_ioc_sm 967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC state machine events 1007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 1017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum ioc_event { 1027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang IOC_E_ENABLE = 1, /* IOC enable request */ 1037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang IOC_E_DISABLE = 2, /* IOC disable request */ 1047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang IOC_E_TIMEOUT = 3, /* f/w response timeout */ 1057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang IOC_E_FWREADY = 4, /* f/w initialization done */ 1067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang IOC_E_FWRSP_GETATTR = 5, /* IOC get attribute response */ 1077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang IOC_E_FWRSP_ENABLE = 6, /* enable f/w response */ 1087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang IOC_E_FWRSP_DISABLE = 7, /* disable f/w response */ 1097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang IOC_E_HBFAIL = 8, /* heartbeat failure */ 1107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang IOC_E_HWERROR = 9, /* hardware error interrupt */ 1117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang IOC_E_SEMLOCKED = 10, /* h/w semaphore is locked */ 1127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang IOC_E_DETACH = 11, /* driver detach cleanup */ 1137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}; 1147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, reset, struct bfa_ioc_s, enum ioc_event); 1167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, fwcheck, struct bfa_ioc_s, enum ioc_event); 1177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, mismatch, struct bfa_ioc_s, enum ioc_event); 1187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, semwait, struct bfa_ioc_s, enum ioc_event); 1197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, hwinit, struct bfa_ioc_s, enum ioc_event); 1207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, enabling, struct bfa_ioc_s, enum ioc_event); 1217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, getattr, struct bfa_ioc_s, enum ioc_event); 1227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, op, struct bfa_ioc_s, enum ioc_event); 1237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, initfail, struct bfa_ioc_s, enum ioc_event); 1247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, hbfail, struct bfa_ioc_s, enum ioc_event); 1257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, disabling, struct bfa_ioc_s, enum ioc_event); 1267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, disabled, struct bfa_ioc_s, enum ioc_event); 1277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic struct bfa_sm_table_s ioc_sm_table[] = { 1297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_ioc_sm_reset), BFA_IOC_RESET}, 1307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_ioc_sm_fwcheck), BFA_IOC_FWMISMATCH}, 1317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_ioc_sm_mismatch), BFA_IOC_FWMISMATCH}, 1327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_ioc_sm_semwait), BFA_IOC_SEMWAIT}, 1337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_ioc_sm_hwinit), BFA_IOC_HWINIT}, 1347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_ioc_sm_enabling), BFA_IOC_HWINIT}, 1357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_ioc_sm_getattr), BFA_IOC_GETATTR}, 1367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_ioc_sm_op), BFA_IOC_OPERATIONAL}, 1377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_ioc_sm_initfail), BFA_IOC_INITFAIL}, 1387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_ioc_sm_hbfail), BFA_IOC_HBFAIL}, 1397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_ioc_sm_disabling), BFA_IOC_DISABLING}, 1407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang {BFA_SM(bfa_ioc_sm_disabled), BFA_IOC_DISABLED}, 1417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}; 1427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 1447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Reset entry actions -- initialize state machine 1457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 1467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 1477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_reset_entry(struct bfa_ioc_s *ioc) 1487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->retry_count = 0; 1507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->auto_recover = bfa_auto_recover; 1517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 1547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Beginning state. IOC is in reset state. 1557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 1567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 1577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_reset(struct bfa_ioc_s *ioc, enum ioc_event event) 1587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 1607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 1627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_ENABLE: 1637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_fwcheck); 1647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_DISABLE: 1677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_disable_comp(ioc); 1687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_DETACH: 1717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 1727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 1747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 1757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 1767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 1797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Semaphore should be acquired for version check. 1807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 1817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 1827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_fwcheck_entry(struct bfa_ioc_s *ioc) 1837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_hw_sem_get(ioc); 1857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 1867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 1887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Awaiting h/w semaphore to continue with version check. 1897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 1907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 1917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_fwcheck(struct bfa_ioc_s *ioc, enum ioc_event event) 1927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 1947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 1957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 1967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_SEMLOCKED: 1977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (bfa_ioc_firmware_lock(ioc)) { 1987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->retry_count = 0; 1997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_hwinit); 2007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } else { 2017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_hw_sem_release(ioc); 2027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_mismatch); 2037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 2047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_DISABLE: 2077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_disable_comp(ioc); 2087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 2097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * fall through 2107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 2117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_DETACH: 2137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_hw_sem_get_cancel(ioc); 2147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_reset); 2157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_FWREADY: 2187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 2217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 2227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 2237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 2267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Notify enable completion callback and generate mismatch AEN. 2277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 2287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 2297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_mismatch_entry(struct bfa_ioc_s *ioc) 2307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 2327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Provide enable completion callback and AEN notification only once. 2337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 2347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (ioc->retry_count == 0) { 2357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE); 2367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_aen_post(ioc, BFA_IOC_AEN_FWMISMATCH); 2377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 2387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->retry_count++; 2397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timer_start(ioc); 2407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 2437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Awaiting firmware version match. 2447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 2457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 2467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_mismatch(struct bfa_ioc_s *ioc, enum ioc_event event) 2477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 2497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 2517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_TIMEOUT: 2527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_fwcheck); 2537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_DISABLE: 2567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_disable_comp(ioc); 2577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 2587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * fall through 2597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 2607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_DETACH: 2627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timer_stop(ioc); 2637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_reset); 2647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_FWREADY: 2677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 2707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 2717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 2727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 2757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Request for semaphore. 2767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 2777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 2787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_semwait_entry(struct bfa_ioc_s *ioc) 2797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_hw_sem_get(ioc); 2817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 2827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 2847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Awaiting semaphore for h/w initialzation. 2857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 2867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 2877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_semwait(struct bfa_ioc_s *ioc, enum ioc_event event) 2887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 2897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 2907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 2927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_SEMLOCKED: 2937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->retry_count = 0; 2947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_hwinit); 2957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 2967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_DISABLE: 2987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_hw_sem_get_cancel(ioc); 2997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled); 3007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 3037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 3047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 3057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 3097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_hwinit_entry(struct bfa_ioc_s *ioc) 3107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 3117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timer_start(ioc); 3127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_reset(ioc, BFA_FALSE); 3137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 3167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Hardware is being initialized. Interrupts are enabled. 3177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Holding hardware semaphore lock. 3187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 3197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 3207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_hwinit(struct bfa_ioc_s *ioc, enum ioc_event event) 3217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 3227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 3237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 3257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_FWREADY: 3267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timer_stop(ioc); 3277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_enabling); 3287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_HWERROR: 3317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timer_stop(ioc); 3327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 3337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * fall through 3347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 3357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_TIMEOUT: 3377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->retry_count++; 3387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (ioc->retry_count < BFA_IOC_HWINIT_MAX) { 3397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timer_start(ioc); 3407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_reset(ioc, BFA_TRUE); 3417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 3437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_hw_sem_release(ioc); 3457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_initfail); 3467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_DISABLE: 3497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_hw_sem_release(ioc); 3507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timer_stop(ioc); 3517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled); 3527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 3557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 3567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 3577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 3617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_enabling_entry(struct bfa_ioc_s *ioc) 3627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 3637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timer_start(ioc); 3647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_send_enable(ioc); 3657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 3667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 3687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Host IOC function is being enabled, awaiting response from firmware. 3697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Semaphore is acquired. 3707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 3717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 3727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_enabling(struct bfa_ioc_s *ioc, enum ioc_event event) 3737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 3747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 3757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 3777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_FWRSP_ENABLE: 3787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timer_stop(ioc); 3797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_hw_sem_release(ioc); 3807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_getattr); 3817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_HWERROR: 3847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timer_stop(ioc); 3857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 3867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * fall through 3877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 3887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_TIMEOUT: 3907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->retry_count++; 3917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (ioc->retry_count < BFA_IOC_HWINIT_MAX) { 3927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write(ioc->ioc_regs.ioc_fwstate, 3937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFI_IOC_UNINIT); 3947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_hwinit); 3957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 3967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 3977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 3987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_hw_sem_release(ioc); 3997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_initfail); 4007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 4017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_DISABLE: 4037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timer_stop(ioc); 4047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_hw_sem_release(ioc); 4057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled); 4067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 4077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_FWREADY: 4097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_send_enable(ioc); 4107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 4117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 4137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 4147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 4157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 4197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_getattr_entry(struct bfa_ioc_s *ioc) 4207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timer_start(ioc); 4227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_send_getattr(ioc); 4237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 4267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC configuration in progress. Timer is active. 4277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 4287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 4297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_getattr(struct bfa_ioc_s *ioc, enum ioc_event event) 4307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 4327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 4347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_FWRSP_GETATTR: 4357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timer_stop(ioc); 4367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_op); 4377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 4387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_HWERROR: 4407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timer_stop(ioc); 4417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 4427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * fall through 4437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 4447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_TIMEOUT: 4467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_initfail); 4477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 4487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_DISABLE: 4507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timer_stop(ioc); 4517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled); 4527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 4537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 4557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 4567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 4577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 4617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_op_entry(struct bfa_ioc_s *ioc) 4627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_OK); 4647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_hb_monitor(ioc); 4657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_aen_post(ioc, BFA_IOC_AEN_ENABLE); 4667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 4677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 4697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_op(struct bfa_ioc_s *ioc, enum ioc_event event) 4707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 4717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 4727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 4747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_ENABLE: 4757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 4767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_DISABLE: 4787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_hb_stop(ioc); 4797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling); 4807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 4817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_HWERROR: 4837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_FWREADY: 4847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 4857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Hard error or IOC recovery by other function. 4867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Treat it same as heartbeat failure. 4877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 4887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_hb_stop(ioc); 4897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 4907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * !!! fall through !!! 4917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 4927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_HBFAIL: 4947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_hbfail); 4957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 4967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 4977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 4987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 4997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 5007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 5047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_disabling_entry(struct bfa_ioc_s *ioc) 5057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_aen_post(ioc, BFA_IOC_AEN_DISABLE); 5077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timer_start(ioc); 5087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_send_disable(ioc); 5097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 5127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC is being disabled 5137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 5157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_disabling(struct bfa_ioc_s *ioc, enum ioc_event event) 5167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 5187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 5207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_FWRSP_DISABLE: 5217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timer_stop(ioc); 5220a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled); 5230a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati break; 5240a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 5250a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati case IOC_E_HWERROR: 5260a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_ioc_timer_stop(ioc); 5277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 5287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * !!! fall through !!! 5297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_TIMEOUT: 5320a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_reg_write(ioc->ioc_regs.ioc_fwstate, BFI_IOC_FAIL); 5337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled); 5347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 5357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 5377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 5387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 5397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 5427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC disable completion entry. 5437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 5457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_disabled_entry(struct bfa_ioc_s *ioc) 5467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_disable_comp(ioc); 5487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 5517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_disabled(struct bfa_ioc_s *ioc, enum ioc_event event) 5527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 5547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 5567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_ENABLE: 5577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_semwait); 5587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 5597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_DISABLE: 5617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->cbfn->disable_cbfn(ioc->bfa); 5627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 5637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_FWREADY: 5657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 5667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_DETACH: 5687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_firmware_unlock(ioc); 5697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_reset); 5707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 5717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 5737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 5747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 5757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 5797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_initfail_entry(struct bfa_ioc_s *ioc) 5807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE); 5827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timer_start(ioc); 5837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 5847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 5867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Hardware initialization failed. 5877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 5887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 5897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_initfail(struct bfa_ioc_s *ioc, enum ioc_event event) 5907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 5917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 5927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 5947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_DISABLE: 5957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timer_stop(ioc); 5967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled); 5977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 5987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 5997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_DETACH: 6007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timer_stop(ioc); 6017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_firmware_unlock(ioc); 6027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_reset); 6037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 6047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_TIMEOUT: 6067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_semwait); 6077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 6087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 6107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 6117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 6127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 6167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_hbfail_entry(struct bfa_ioc_s *ioc) 6177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct list_head *qe; 6197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_ioc_hbfail_notify_s *notify; 6207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 6227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Mark IOC as failed in hardware and stop firmware. 6237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_lpu_stop(ioc); 6250a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_reg_write(ioc->ioc_regs.ioc_fwstate, BFI_IOC_FAIL); 6267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6270a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati /** 6280a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Notify other functions on HB failure. 6290a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 6300a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_ioc_notify_hbfail(ioc); 6317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 6337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Notify driver and common modules registered for notification. 6347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->cbfn->hbfail_cbfn(ioc->bfa); 6367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang list_for_each(qe, &ioc->hb_notify_q) { 6377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang notify = (struct bfa_ioc_hbfail_notify_s *)qe; 6387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang notify->cbfn(notify->cbarg); 6397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 6407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 6427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Flush any queued up mailbox requests. 6437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_mbox_hbfail(ioc); 6457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_aen_post(ioc, BFA_IOC_AEN_HBFAIL); 6467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 6487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Trigger auto-recovery after a delay. 6497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (ioc->auto_recover) { 6517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_timer_begin(ioc->timer_mod, &ioc->ioc_timer, 6527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timeout, ioc, BFA_IOC_TOV_RECOVER); 6537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 6547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 6577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC heartbeat failure. 6587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 6607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_hbfail(struct bfa_ioc_s *ioc, enum ioc_event event) 6617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 6627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, event); 6637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (event) { 6657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_ENABLE: 6677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE); 6687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 6697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_DISABLE: 6717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (ioc->auto_recover) 6727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_timer_stop(ioc); 6737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled); 6747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 6757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_TIMEOUT: 6777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_semwait); 6787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 6797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case IOC_E_FWREADY: 6817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 6827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Recovery is already initiated by other function. 6837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 6847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 6857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6860a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati case IOC_E_HWERROR: 6870a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati /* 6880a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * HB failure notification, ignore. 6890a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 6900a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati break; 6910a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 6927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 6937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_sm_fault(ioc, event); 6947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 6957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 6967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 6997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 7007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * bfa_ioc_pvt BFA IOC private functions 7017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 7027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 7047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_disable_comp(struct bfa_ioc_s *ioc) 7057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct list_head *qe; 7077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_ioc_hbfail_notify_s *notify; 7087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->cbfn->disable_cbfn(ioc->bfa); 7107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 7127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Notify common modules registered for notification. 7137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 7147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang list_for_each(qe, &ioc->hb_notify_q) { 7157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang notify = (struct bfa_ioc_hbfail_notify_s *)qe; 7167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang notify->cbfn(notify->cbarg); 7177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 7187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7200a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipativoid 7217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sem_timeout(void *ioc_arg) 7227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_ioc_s *ioc = (struct bfa_ioc_s *)ioc_arg; 7247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_hw_sem_get(ioc); 7267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7280a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_boolean_t 7290a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_ioc_sem_get(bfa_os_addr_t sem_reg) 7307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7310a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati u32 r32; 7320a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati int cnt = 0; 7330a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define BFA_SEM_SPINCNT 3000 7347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7350a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati r32 = bfa_reg_read(sem_reg); 7360a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 7370a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati while (r32 && (cnt < BFA_SEM_SPINCNT)) { 7387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang cnt++; 7390a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_os_udelay(2); 7400a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati r32 = bfa_reg_read(sem_reg); 7410a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati } 7420a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 7430a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati if (r32 == 0) 7440a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati return BFA_TRUE; 7450a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 7467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_assert(cnt < BFA_SEM_SPINCNT); 7470a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati return BFA_FALSE; 7487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7500a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipativoid 7510a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_ioc_sem_release(bfa_os_addr_t sem_reg) 7527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7530a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_reg_write(sem_reg, 1); 7547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 7577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hw_sem_get(struct bfa_ioc_s *ioc) 7587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 r32; 7607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 7627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * First read to the semaphore register will return 0, subsequent reads 7630a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * will return 1. Semaphore is released by writing 1 to the register 7647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 7657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang r32 = bfa_reg_read(ioc->ioc_regs.ioc_sem_reg); 7667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (r32 == 0) { 7677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_send_event(ioc, IOC_E_SEMLOCKED); 7687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 7697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 7707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_timer_begin(ioc->timer_mod, &ioc->sem_timer, bfa_ioc_sem_timeout, 7720a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc, BFA_IOC_HWSEM_TOV); 7737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7750a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipativoid 7767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hw_sem_release(struct bfa_ioc_s *ioc) 7777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write(ioc->ioc_regs.ioc_sem_reg, 1); 7797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 7827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hw_sem_get_cancel(struct bfa_ioc_s *ioc) 7837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_timer_stop(&ioc->sem_timer); 7857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 7867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 7887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Initialize LPU local memory (aka secondary memory / SRAM) 7897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 7907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 7917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_lmem_init(struct bfa_ioc_s *ioc) 7927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 7937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 pss_ctl; 7947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int i; 7957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define PSS_LMEM_INIT_TIME 10000 7967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 7977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pss_ctl = bfa_reg_read(ioc->ioc_regs.pss_ctl_reg); 7987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pss_ctl &= ~__PSS_LMEM_RESET; 7997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pss_ctl |= __PSS_LMEM_INIT_EN; 8007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pss_ctl |= __PSS_I2C_CLK_DIV(3UL); /* i2c workaround 12.5khz clock */ 8017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write(ioc->ioc_regs.pss_ctl_reg, pss_ctl); 8027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 8047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * wait for memory initialization to be complete 8057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 8067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang i = 0; 8077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang do { 8087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pss_ctl = bfa_reg_read(ioc->ioc_regs.pss_ctl_reg); 8097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang i++; 8107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } while (!(pss_ctl & __PSS_LMEM_INIT_DONE) && (i < PSS_LMEM_INIT_TIME)); 8117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 8137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * If memory initialization is not successful, IOC timeout will catch 8147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * such failures. 8157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 8167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_assert(pss_ctl & __PSS_LMEM_INIT_DONE); 8177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, pss_ctl); 8187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pss_ctl &= ~(__PSS_LMEM_INIT_DONE | __PSS_LMEM_INIT_EN); 8207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write(ioc->ioc_regs.pss_ctl_reg, pss_ctl); 8217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 8247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_lpu_start(struct bfa_ioc_s *ioc) 8257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 8267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 pss_ctl; 8277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 8297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Take processor out of reset. 8307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 8317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pss_ctl = bfa_reg_read(ioc->ioc_regs.pss_ctl_reg); 8327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pss_ctl &= ~__PSS_LPU0_RESET; 8337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write(ioc->ioc_regs.pss_ctl_reg, pss_ctl); 8357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 8387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_lpu_stop(struct bfa_ioc_s *ioc) 8397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 8407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 pss_ctl; 8417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 8437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Put processors in reset. 8447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 8457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pss_ctl = bfa_reg_read(ioc->ioc_regs.pss_ctl_reg); 8467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pss_ctl |= (__PSS_LPU0_RESET | __PSS_LPU1_RESET); 8477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write(ioc->ioc_regs.pss_ctl_reg, pss_ctl); 8497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 8527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Get driver and firmware versions. 8537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 8540a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipativoid 8557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_fwver_get(struct bfa_ioc_s *ioc, struct bfi_ioc_image_hdr_s *fwhdr) 8567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 8577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 pgnum, pgoff; 8587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 loff = 0; 8597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int i; 8607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 *fwsig = (u32 *) fwhdr; 8617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pgnum = bfa_ioc_smem_pgnum(ioc, loff); 8637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pgoff = bfa_ioc_smem_pgoff(ioc, loff); 8647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write(ioc->ioc_regs.host_page_num_fn, pgnum); 8657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (i = 0; i < (sizeof(struct bfi_ioc_image_hdr_s) / sizeof(u32)); 8677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang i++) { 8687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fwsig[i] = bfa_mem_read(ioc->ioc_regs.smem_page_start, loff); 8697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang loff += sizeof(u32); 8707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 8717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 8747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Returns TRUE if same. 8757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 8760a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_boolean_t 8777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_fwver_cmp(struct bfa_ioc_s *ioc, struct bfi_ioc_image_hdr_s *fwhdr) 8787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 8797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfi_ioc_image_hdr_s *drv_fwhdr; 8807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int i; 8817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang drv_fwhdr = 8837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang (struct bfi_ioc_image_hdr_s *)bfa_ioc_fwimg_get_chunk(ioc, 0); 8847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (i = 0; i < BFI_IOC_MD5SUM_SZ; i++) { 8867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (fwhdr->md5sum[i] != drv_fwhdr->md5sum[i]) { 8877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, i); 8887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, fwhdr->md5sum[i]); 8897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, drv_fwhdr->md5sum[i]); 8907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_FALSE; 8917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 8927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 8937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, fwhdr->md5sum[0]); 8957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_TRUE; 8967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 8977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 8987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 8997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Return true if current running version is valid. Firmware signature and 9007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * execution context (driver/bios) must match. 9017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 9027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic bfa_boolean_t 9037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_fwver_valid(struct bfa_ioc_s *ioc) 9047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 9057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfi_ioc_image_hdr_s fwhdr, *drv_fwhdr; 9067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 9087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * If bios/efi boot (flash based) -- return true 9097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 9107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (bfa_ioc_fwimg_get_size(ioc) < BFA_IOC_FWIMG_MINSZ) 9117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_TRUE; 9127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_fwver_get(ioc, &fwhdr); 9147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang drv_fwhdr = 9157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang (struct bfi_ioc_image_hdr_s *)bfa_ioc_fwimg_get_chunk(ioc, 0); 9167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (fwhdr.signature != drv_fwhdr->signature) { 9187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, fwhdr.signature); 9197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, drv_fwhdr->signature); 9207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_FALSE; 9217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 9227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (fwhdr.exec != drv_fwhdr->exec) { 9247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, fwhdr.exec); 9257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, drv_fwhdr->exec); 9267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_FALSE; 9277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 9287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return bfa_ioc_fwver_cmp(ioc, &fwhdr); 9307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 9317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 9337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Conditionally flush any pending message from firmware at start. 9347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 9357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 9367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_msgflush(struct bfa_ioc_s *ioc) 9377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 9387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 r32; 9397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang r32 = bfa_reg_read(ioc->ioc_regs.lpu_mbox_cmd); 9417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (r32) 9427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write(ioc->ioc_regs.lpu_mbox_cmd, 1); 9437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 9447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 9477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hwinit(struct bfa_ioc_s *ioc, bfa_boolean_t force) 9487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 9497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfi_ioc_state ioc_fwstate; 9507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_boolean_t fwvalid; 9517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc_fwstate = bfa_reg_read(ioc->ioc_regs.ioc_fwstate); 9537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (force) 9557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc_fwstate = BFI_IOC_UNINIT; 9567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, ioc_fwstate); 9587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 9607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * check if firmware is valid 9617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 9627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fwvalid = (ioc_fwstate == BFI_IOC_UNINIT) ? 9637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_FALSE : bfa_ioc_fwver_valid(ioc); 9647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!fwvalid) { 9667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_boot(ioc, BFI_BOOT_TYPE_NORMAL, ioc->pcidev.device_id); 9677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 9687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 9697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 9717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * If hardware initialization is in progress (initialized by other IOC), 9727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * just wait for an initialization completion interrupt. 9737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 9747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (ioc_fwstate == BFI_IOC_INITING) { 9757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, ioc_fwstate); 9767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->cbfn->reset_cbfn(ioc->bfa); 9777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 9787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 9797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 9817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * If IOC function is disabled and firmware version is same, 9827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * just re-enable IOC. 9837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 9847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (ioc_fwstate == BFI_IOC_DISABLED || ioc_fwstate == BFI_IOC_OP) { 9857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, ioc_fwstate); 9867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 9887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * When using MSI-X any pending firmware ready event should 9897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * be flushed. Otherwise MSI-X interrupts are not delivered. 9907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 9917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_msgflush(ioc); 9927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->cbfn->reset_cbfn(ioc->bfa); 9937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_send_event(ioc, IOC_E_FWREADY); 9947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 9957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 9967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 9977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 9987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Initialize the h/w for any other states. 9997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 10007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_boot(ioc, BFI_BOOT_TYPE_NORMAL, ioc->pcidev.device_id); 10017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 10047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_timeout(void *ioc_arg) 10057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 10067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_ioc_s *ioc = (struct bfa_ioc_s *)ioc_arg; 10077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, 0); 10097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_send_event(ioc, IOC_E_TIMEOUT); 10107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 10137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_send(struct bfa_ioc_s *ioc, void *ioc_msg, int len) 10147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 10157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 *msgp = (u32 *) ioc_msg; 10167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 i; 10177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, msgp[0]); 10197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, len); 10207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_assert(len <= BFI_IOC_MSGLEN_MAX); 10227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 10247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * first write msg to mailbox registers 10257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 10267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (i = 0; i < len / sizeof(u32); i++) 10277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write(ioc->ioc_regs.hfn_mbox + i * sizeof(u32), 10287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_os_wtole(msgp[i])); 10297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (; i < BFI_IOC_MSGLEN_MAX / sizeof(u32); i++) 10317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write(ioc->ioc_regs.hfn_mbox + i * sizeof(u32), 0); 10327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /* 10347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * write 1 to mailbox CMD to trigger LPU event 10357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 10367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write(ioc->ioc_regs.hfn_mbox_cmd, 1); 10377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang (void)bfa_reg_read(ioc->ioc_regs.hfn_mbox_cmd); 10387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 10417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_send_enable(struct bfa_ioc_s *ioc) 10427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 10437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfi_ioc_ctrl_req_s enable_req; 10447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfi_h2i_set(enable_req.mh, BFI_MC_IOC, BFI_IOC_H2I_ENABLE_REQ, 10467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_portid(ioc)); 10477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enable_req.ioc_class = ioc->ioc_mc; 10487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_mbox_send(ioc, &enable_req, sizeof(struct bfi_ioc_ctrl_req_s)); 10497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 10527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_send_disable(struct bfa_ioc_s *ioc) 10537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 10547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfi_ioc_ctrl_req_s disable_req; 10557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfi_h2i_set(disable_req.mh, BFI_MC_IOC, BFI_IOC_H2I_DISABLE_REQ, 10577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_portid(ioc)); 10587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_mbox_send(ioc, &disable_req, sizeof(struct bfi_ioc_ctrl_req_s)); 10597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 10627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_send_getattr(struct bfa_ioc_s *ioc) 10637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 10647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfi_ioc_getattr_req_s attr_req; 10657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfi_h2i_set(attr_req.mh, BFI_MC_IOC, BFI_IOC_H2I_GETATTR_REQ, 10677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_portid(ioc)); 10687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_dma_be_addr_set(attr_req.attr_addr, ioc->attr_dma.pa); 10697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_mbox_send(ioc, &attr_req, sizeof(attr_req)); 10707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 10737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hb_check(void *cbarg) 10747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 10750a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati struct bfa_ioc_s *ioc = cbarg; 10760a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati u32 hb_count; 10777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang hb_count = bfa_reg_read(ioc->ioc_regs.heartbeat); 10797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (ioc->hb_count == hb_count) { 10800a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_log(ioc->logm, BFA_LOG_HAL_HEARTBEAT_FAILURE, 10810a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati hb_count); 10827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_recover(ioc); 10837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 10840a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati } else { 10850a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc->hb_count = hb_count; 10867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 10877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_mbox_poll(ioc); 10890a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_timer_begin(ioc->timer_mod, &ioc->ioc_timer, bfa_ioc_hb_check, 10900a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ioc, BFA_IOC_HB_TOV); 10917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 10927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 10937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 10947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hb_monitor(struct bfa_ioc_s *ioc) 10957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 10967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->hb_count = bfa_reg_read(ioc->ioc_regs.heartbeat); 10977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_timer_begin(ioc->timer_mod, &ioc->ioc_timer, bfa_ioc_hb_check, ioc, 10987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang BFA_IOC_HB_TOV); 10997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 11027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hb_stop(struct bfa_ioc_s *ioc) 11037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 11047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_timer_stop(&ioc->ioc_timer); 11057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 11087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Initiate a full firmware download. 11097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 11107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 11117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_download_fw(struct bfa_ioc_s *ioc, u32 boot_type, 11127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 boot_param) 11137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 11147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 *fwimg; 11157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 pgnum, pgoff; 11167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 loff = 0; 11177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 chunkno = 0; 11187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 i; 11197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 11217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Initialize LMEM first before code download 11227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 11237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_lmem_init(ioc); 11247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 11267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Flash based firmware boot 11277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 11287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, bfa_ioc_fwimg_get_size(ioc)); 11297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (bfa_ioc_fwimg_get_size(ioc) < BFA_IOC_FWIMG_MINSZ) 11307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang boot_type = BFI_BOOT_TYPE_FLASH; 11317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fwimg = bfa_ioc_fwimg_get_chunk(ioc, chunkno); 11327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pgnum = bfa_ioc_smem_pgnum(ioc, loff); 11347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pgoff = bfa_ioc_smem_pgoff(ioc, loff); 11357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write(ioc->ioc_regs.host_page_num_fn, pgnum); 11377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (i = 0; i < bfa_ioc_fwimg_get_size(ioc); i++) { 11397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11400a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati if (BFA_IOC_FLASH_CHUNK_NO(i) != chunkno) { 11410a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati chunkno = BFA_IOC_FLASH_CHUNK_NO(i); 11427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang fwimg = bfa_ioc_fwimg_get_chunk(ioc, 11430a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati BFA_IOC_FLASH_CHUNK_ADDR(chunkno)); 11447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 11457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 11477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * write smem 11487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 11497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_mem_write(ioc->ioc_regs.smem_page_start, loff, 11500a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati fwimg[BFA_IOC_FLASH_OFFSET_IN_CHUNK(i)]); 11517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang loff += sizeof(u32); 11537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 11557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * handle page offset wrap around 11567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 11577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang loff = PSS_SMEM_PGOFF(loff); 11587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (loff == 0) { 11597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pgnum++; 11607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write(ioc->ioc_regs.host_page_num_fn, pgnum); 11617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 11627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 11637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write(ioc->ioc_regs.host_page_num_fn, 11657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_smem_pgnum(ioc, 0)); 116613cc20c5e764e6ef8d57f33980ab8c386c25fb4dKrishna Gudipati 116713cc20c5e764e6ef8d57f33980ab8c386c25fb4dKrishna Gudipati /* 116813cc20c5e764e6ef8d57f33980ab8c386c25fb4dKrishna Gudipati * Set boot type and boot param at the end. 116913cc20c5e764e6ef8d57f33980ab8c386c25fb4dKrishna Gudipati */ 117013cc20c5e764e6ef8d57f33980ab8c386c25fb4dKrishna Gudipati bfa_mem_write(ioc->ioc_regs.smem_page_start, BFI_BOOT_TYPE_OFF, 117113cc20c5e764e6ef8d57f33980ab8c386c25fb4dKrishna Gudipati bfa_os_swap32(boot_type)); 117213cc20c5e764e6ef8d57f33980ab8c386c25fb4dKrishna Gudipati bfa_mem_write(ioc->ioc_regs.smem_page_start, BFI_BOOT_PARAM_OFF, 117313cc20c5e764e6ef8d57f33980ab8c386c25fb4dKrishna Gudipati bfa_os_swap32(boot_param)); 11747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 11777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_reset(struct bfa_ioc_s *ioc, bfa_boolean_t force) 11787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 11797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_hwinit(ioc, force); 11807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 11837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Update BFA configuration from firmware configuration. 11847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 11857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 11867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_getattr_reply(struct bfa_ioc_s *ioc) 11877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 11887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfi_ioc_attr_s *attr = ioc->attr; 11897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang attr->adapter_prop = bfa_os_ntohl(attr->adapter_prop); 11917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang attr->maxfrsize = bfa_os_ntohs(attr->maxfrsize); 11927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_send_event(ioc, IOC_E_FWRSP_GETATTR); 11947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 11957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 11967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 11977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Attach time initialization of mbox logic. 11987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 11997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 12007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_attach(struct bfa_ioc_s *ioc) 12017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 12027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_ioc_mbox_mod_s *mod = &ioc->mbox_mod; 12037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int mc; 12047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang INIT_LIST_HEAD(&mod->cmd_q); 12067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (mc = 0; mc < BFI_MC_MAX; mc++) { 12077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang mod->mbhdlr[mc].cbfn = NULL; 12087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang mod->mbhdlr[mc].cbarg = ioc->bfa; 12097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 12107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 12137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Mbox poll timer -- restarts any pending mailbox requests. 12147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 12157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 12167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_poll(struct bfa_ioc_s *ioc) 12177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 12187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_ioc_mbox_mod_s *mod = &ioc->mbox_mod; 12197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_mbox_cmd_s *cmd; 12207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 stat; 12217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 12237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * If no command pending, do nothing 12247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 12257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (list_empty(&mod->cmd_q)) 12267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 12277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 12297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * If previous command is not yet fetched by firmware, do nothing 12307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 12317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang stat = bfa_reg_read(ioc->ioc_regs.hfn_mbox_cmd); 12327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (stat) 12337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 12347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 12367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Enqueue command to firmware. 12377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 12387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_q_deq(&mod->cmd_q, &cmd); 12397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_mbox_send(ioc, cmd->msg, sizeof(cmd->msg)); 12407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 12437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Cleanup any pending requests. 12447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 12457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 12467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_hbfail(struct bfa_ioc_s *ioc) 12477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 12487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_ioc_mbox_mod_s *mod = &ioc->mbox_mod; 12497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_mbox_cmd_s *cmd; 12507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang while (!list_empty(&mod->cmd_q)) 12527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_q_deq(&mod->cmd_q, &cmd); 12537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 12567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * bfa_ioc_public 12577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 12587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 12607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Interface used by diag module to do firmware boot with memory test 12617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * as the entry vector. 12627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 12637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 12647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_boot(struct bfa_ioc_s *ioc, u32 boot_type, u32 boot_param) 12657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 12667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_os_addr_t rb; 12677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_stats(ioc, ioc_boots); 12697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (bfa_ioc_pll_init(ioc) != BFA_STATUS_OK) 12717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 12727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 12747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Initialize IOC state of all functions on a chip reset. 12757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 12767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang rb = ioc->pcidev.pci_bar_kva; 12777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (boot_param == BFI_BOOT_TYPE_MEMTEST) { 12787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write((rb + BFA_IOC0_STATE_REG), BFI_IOC_MEMTEST); 12797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write((rb + BFA_IOC1_STATE_REG), BFI_IOC_MEMTEST); 12807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } else { 12817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write((rb + BFA_IOC0_STATE_REG), BFI_IOC_INITING); 12827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write((rb + BFA_IOC1_STATE_REG), BFI_IOC_INITING); 12837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 12847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_download_fw(ioc, boot_type, boot_param); 12867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 12887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Enable interrupts just before starting LPU 12897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 12907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->cbfn->reset_cbfn(ioc->bfa); 12917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_lpu_start(ioc); 12927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 12937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 12947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 12957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Enable/disable IOC failure auto recovery. 12967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 12977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 12987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_auto_recover(bfa_boolean_t auto_recover) 12997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 13002f9b8857a914b71ba1b84fb23a0a20a87de41c91Krishna Gudipati bfa_auto_recover = auto_recover; 13017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_boolean_t 13057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_is_operational(struct bfa_ioc_s *ioc) 13067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 13077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return bfa_fsm_cmp_state(ioc, bfa_ioc_sm_op); 13087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 13117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_msgget(struct bfa_ioc_s *ioc, void *mbmsg) 13127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 13137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 *msgp = mbmsg; 13147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 r32; 13157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int i; 13167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 13187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * read the MBOX msg 13197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 13207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (i = 0; i < (sizeof(union bfi_ioc_i2h_msg_u) / sizeof(u32)); 13217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang i++) { 13227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang r32 = bfa_reg_read(ioc->ioc_regs.lpu_mbox + 13237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang i * sizeof(u32)); 13247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang msgp[i] = bfa_os_htonl(r32); 13257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 13267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 13287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * turn off mailbox interrupt by clearing mailbox status 13297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 13307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write(ioc->ioc_regs.lpu_mbox_cmd, 1); 13317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_read(ioc->ioc_regs.lpu_mbox_cmd); 13327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 13357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_isr(struct bfa_ioc_s *ioc, struct bfi_mbmsg_s *m) 13367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 13377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang union bfi_ioc_i2h_msg_u *msg; 13387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang msg = (union bfi_ioc_i2h_msg_u *)m; 13407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_stats(ioc, ioc_isrs); 13427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang switch (msg->mh.msg_id) { 13447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFI_IOC_I2H_HBEAT: 13457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 13467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFI_IOC_I2H_READY_EVENT: 13487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_send_event(ioc, IOC_E_FWREADY); 13497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 13507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFI_IOC_I2H_ENABLE_REPLY: 13527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_send_event(ioc, IOC_E_FWRSP_ENABLE); 13537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 13547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFI_IOC_I2H_DISABLE_REPLY: 13567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_send_event(ioc, IOC_E_FWRSP_DISABLE); 13577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 13587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFI_IOC_I2H_GETATTR_REPLY: 13607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_getattr_reply(ioc); 13617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 13627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 13647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, msg->mh.msg_id); 13657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_assert(0); 13667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 13677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 13707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC attach time initialization and setup. 13717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 13727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] ioc memory for IOC 13737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] bfa driver instance structure 13747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] trcmod kernel trace module 13757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] aen kernel aen event module 13767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] logm kernel logging module 13777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 13787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 13797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_attach(struct bfa_ioc_s *ioc, void *bfa, struct bfa_ioc_cbfn_s *cbfn, 13807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_timer_mod_s *timer_mod, struct bfa_trc_mod_s *trcmod, 13817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_aen_s *aen, struct bfa_log_mod_s *logm) 13827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 13837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->bfa = bfa; 13847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->cbfn = cbfn; 13857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->timer_mod = timer_mod; 13867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->trcmod = trcmod; 13877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->aen = aen; 13887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->logm = logm; 13897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->fcmode = BFA_FALSE; 13907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->pllinit = BFA_FALSE; 13917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->dbg_fwsave_once = BFA_TRUE; 13927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_mbox_attach(ioc); 13947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang INIT_LIST_HEAD(&ioc->hb_notify_q); 13957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_set_state(ioc, bfa_ioc_sm_reset); 13977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 13987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 13997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 14007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Driver detach time IOC cleanup. 14017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 14027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 14037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_detach(struct bfa_ioc_s *ioc) 14047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 14057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_send_event(ioc, IOC_E_DETACH); 14067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 14077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 14097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Setup IOC PCI properties. 14107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 14117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] pcidev PCI device information for this IOC 14127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 14137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 14147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_pci_init(struct bfa_ioc_s *ioc, struct bfa_pcidev_s *pcidev, 14157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang enum bfi_mclass mc) 14167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 14177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->ioc_mc = mc; 14187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->pcidev = *pcidev; 14197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->ctdev = (ioc->pcidev.device_id == BFA_PCI_DEVICE_ID_CT); 14207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->cna = ioc->ctdev && !ioc->fcmode; 14217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14220a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati /** 14230a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Set asic specific interfaces. See bfa_ioc_cb.c and bfa_ioc_ct.c 14240a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 14250a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati if (ioc->ctdev) 14260a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_ioc_set_ct_hwif(ioc); 14270a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati else 14280a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_ioc_set_cb_hwif(ioc); 14290a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 14307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_map_port(ioc); 14317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_reg_init(ioc); 14327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 14337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 14357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Initialize IOC dma memory 14367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 14377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] dm_kva kernel virtual address of IOC dma memory 14387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] dm_pa physical address of IOC dma memory 14397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 14407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 14417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mem_claim(struct bfa_ioc_s *ioc, u8 *dm_kva, u64 dm_pa) 14427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 14437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 14447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * dma memory for firmware attribute 14457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 14467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->attr_dma.kva = dm_kva; 14477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->attr_dma.pa = dm_pa; 14487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->attr = (struct bfi_ioc_attr_s *)dm_kva; 14497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 14507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 14527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Return size of dma memory required. 14537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 14547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu32 14557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_meminfo(void) 14567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 14577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_ROUNDUP(sizeof(struct bfi_ioc_attr_s), BFA_DMA_ALIGN_SZ); 14587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 14597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 14617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_enable(struct bfa_ioc_s *ioc) 14627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 14637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_stats(ioc, ioc_enables); 14647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->dbg_fwsave_once = BFA_TRUE; 14657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_send_event(ioc, IOC_E_ENABLE); 14677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 14687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 14707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_disable(struct bfa_ioc_s *ioc) 14717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 14727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_stats(ioc, ioc_disables); 14737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_send_event(ioc, IOC_E_DISABLE); 14747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 14757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 14777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Returns memory required for saving firmware trace in case of crash. 14787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Driver must call this interface to allocate memory required for 14797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * automatic saving of firmware trace. Driver should call 14807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * bfa_ioc_debug_memclaim() right after bfa_ioc_attach() to setup this 14817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * trace memory. 14827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 14837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangint 14847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_debug_trcsz(bfa_boolean_t auto_recover) 14857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 14867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangreturn (auto_recover) ? BFA_DBG_FWTRC_LEN : 0; 14877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 14887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 14897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 14907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Initialize memory for saving firmware trace. Driver must initialize 14917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * trace memory before call bfa_ioc_enable(). 14927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 14937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 14947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_debug_memclaim(struct bfa_ioc_s *ioc, void *dbg_fwsave) 14957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 14967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->dbg_fwsave = dbg_fwsave; 14977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->dbg_fwsave_len = bfa_ioc_debug_trcsz(ioc->auto_recover); 14987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 14997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu32 15017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_smem_pgnum(struct bfa_ioc_s *ioc, u32 fmaddr) 15027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 15037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, fmaddr); 15047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 15057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu32 15077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_smem_pgoff(struct bfa_ioc_s *ioc, u32 fmaddr) 15087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 15097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return PSS_SMEM_PGOFF(fmaddr); 15107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 15117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 15137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Register mailbox message handler functions 15147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 15157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] ioc IOC instance 15167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] mcfuncs message class handler functions 15177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 15187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 15197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_register(struct bfa_ioc_s *ioc, bfa_ioc_mbox_mcfunc_t *mcfuncs) 15207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 15217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_ioc_mbox_mod_s *mod = &ioc->mbox_mod; 15227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int mc; 15237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (mc = 0; mc < BFI_MC_MAX; mc++) 15257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang mod->mbhdlr[mc].cbfn = mcfuncs[mc]; 15267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 15277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 15297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Register mailbox message handler function, to be called by common modules 15307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 15317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 15327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_regisr(struct bfa_ioc_s *ioc, enum bfi_mclass mc, 15337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_mbox_mcfunc_t cbfn, void *cbarg) 15347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 15357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_ioc_mbox_mod_s *mod = &ioc->mbox_mod; 15367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang mod->mbhdlr[mc].cbfn = cbfn; 15387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang mod->mbhdlr[mc].cbarg = cbarg; 15397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 15407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 15427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Queue a mailbox command request to firmware. Waits if mailbox is busy. 15437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Responsibility of caller to serialize 15447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 15457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] ioc IOC instance 15467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[i] cmd Mailbox command 15477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 15487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 15497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_queue(struct bfa_ioc_s *ioc, struct bfa_mbox_cmd_s *cmd) 15507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 15517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_ioc_mbox_mod_s *mod = &ioc->mbox_mod; 15527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 stat; 15537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 15557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * If a previous command is pending, queue new command 15567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 15577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!list_empty(&mod->cmd_q)) { 15587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang list_add_tail(&cmd->qe, &mod->cmd_q); 15597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 15607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 15617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 15637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * If mailbox is busy, queue command for poll timer 15647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 15657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang stat = bfa_reg_read(ioc->ioc_regs.hfn_mbox_cmd); 15667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (stat) { 15677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang list_add_tail(&cmd->qe, &mod->cmd_q); 15687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 15697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 15707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 15727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * mailbox is free -- queue command to firmware 15737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 15747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_mbox_send(ioc, cmd->msg, sizeof(cmd->msg)); 15757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 15767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 15787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Handle mailbox interrupts 15797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 15807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 15817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_isr(struct bfa_ioc_s *ioc) 15827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 15837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_ioc_mbox_mod_s *mod = &ioc->mbox_mod; 15847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfi_mbmsg_s m; 15857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int mc; 15867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_msgget(ioc, &m); 15887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 15907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Treat IOC message class as special. 15917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 15927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang mc = m.mh.msg_class; 15937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (mc == BFI_MC_IOC) { 15947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_isr(ioc, &m); 15957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 15967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 15977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 15987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if ((mc > BFI_MC_MAX) || (mod->mbhdlr[mc].cbfn == NULL)) 15997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return; 16007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang mod->mbhdlr[mc].cbfn(mod->mbhdlr[mc].cbarg, &m); 16027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 16037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 16057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_error_isr(struct bfa_ioc_s *ioc) 16067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 16077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_send_event(ioc, IOC_E_HWERROR); 16087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 16097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#ifndef BFA_BIOS_BUILD 16117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 16137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * return true if IOC is disabled 16147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 16157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_boolean_t 16167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_is_disabled(struct bfa_ioc_s *ioc) 16177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1618f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return bfa_fsm_cmp_state(ioc, bfa_ioc_sm_disabling) 1619f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang || bfa_fsm_cmp_state(ioc, bfa_ioc_sm_disabled); 16207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 16217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 16237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * return true if IOC firmware is different. 16247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 16257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_boolean_t 16267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_fw_mismatch(struct bfa_ioc_s *ioc) 16277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 1628f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang return bfa_fsm_cmp_state(ioc, bfa_ioc_sm_reset) 16297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang || bfa_fsm_cmp_state(ioc, bfa_ioc_sm_fwcheck) 1630f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang || bfa_fsm_cmp_state(ioc, bfa_ioc_sm_mismatch); 16317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 16327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define bfa_ioc_state_disabled(__sm) \ 16347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang (((__sm) == BFI_IOC_UNINIT) || \ 16357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ((__sm) == BFI_IOC_INITING) || \ 16367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ((__sm) == BFI_IOC_HWINIT) || \ 16377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ((__sm) == BFI_IOC_DISABLED) || \ 16380a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati ((__sm) == BFI_IOC_FAIL) || \ 16397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ((__sm) == BFI_IOC_CFG_DISABLED)) 16407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 16427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Check if adapter is disabled -- both IOCs should be in a disabled 16437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * state. 16447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 16457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_boolean_t 16467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_adapter_is_disabled(struct bfa_ioc_s *ioc) 16477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 16487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 ioc_state; 16497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_os_addr_t rb = ioc->pcidev.pci_bar_kva; 16507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!bfa_fsm_cmp_state(ioc, bfa_ioc_sm_disabled)) 16527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_FALSE; 16537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc_state = bfa_reg_read(rb + BFA_IOC0_STATE_REG); 16557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!bfa_ioc_state_disabled(ioc_state)) 16567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_FALSE; 16577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc_state = bfa_reg_read(rb + BFA_IOC1_STATE_REG); 16597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (!bfa_ioc_state_disabled(ioc_state)) 16607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_FALSE; 16617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_TRUE; 16637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 16647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 16667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Add to IOC heartbeat failure notification queue. To be used by common 16677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * modules such as 16687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 16697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 16707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hbfail_register(struct bfa_ioc_s *ioc, 16717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_ioc_hbfail_notify_s *notify) 16727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 16737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang list_add_tail(¬ify->qe, &ioc->hb_notify_q); 16747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 16757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define BFA_MFG_NAME "Brocade" 16777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 16787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_adapter_attr(struct bfa_ioc_s *ioc, 16797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_adapter_attr_s *ad_attr) 16807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 16817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfi_ioc_attr_s *ioc_attr; 16827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc_attr = ioc->attr; 16840a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 16850a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_ioc_get_adapter_serial_num(ioc, ad_attr->serial_num); 16860a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_ioc_get_adapter_fw_ver(ioc, ad_attr->fw_ver); 16870a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_ioc_get_adapter_optrom_ver(ioc, ad_attr->optrom_ver); 16880a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_ioc_get_adapter_manufacturer(ioc, ad_attr->manufacturer); 16897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_os_memcpy(&ad_attr->vpd, &ioc_attr->vpd, 16907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang sizeof(struct bfa_mfg_vpd_s)); 16917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16920a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati ad_attr->nports = bfa_ioc_get_nports(ioc); 16930a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati ad_attr->max_speed = bfa_ioc_speed_sup(ioc); 16947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16950a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_ioc_get_adapter_model(ioc, ad_attr->model); 16960a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati /* For now, model descr uses same model string */ 16970a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_ioc_get_adapter_model(ioc, ad_attr->model_descr); 16987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 16997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (BFI_ADAPTER_IS_SPECIAL(ioc_attr->adapter_prop)) 17007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ad_attr->prototype = 1; 17017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang else 17027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ad_attr->prototype = 0; 17037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 17047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ad_attr->pwwn = bfa_ioc_get_pwwn(ioc); 17057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ad_attr->mac = bfa_ioc_get_mac(ioc); 17067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 17077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ad_attr->pcie_gen = ioc_attr->pcie_gen; 17087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ad_attr->pcie_lanes = ioc_attr->pcie_lanes; 17097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ad_attr->pcie_lanes_orig = ioc_attr->pcie_lanes_orig; 17107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ad_attr->asic_rev = ioc_attr->asic_rev; 17110a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 17120a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_ioc_get_pci_chip_rev(ioc, ad_attr->hw_ver); 17137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 17147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ad_attr->cna_capable = ioc->cna; 17157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 17167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 17172993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipatienum bfa_ioc_type_e 17182993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipatibfa_ioc_get_type(struct bfa_ioc_s *ioc) 17192993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati{ 17202993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati if (!ioc->ctdev || ioc->fcmode) 17212993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati return BFA_IOC_TYPE_FC; 17222993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati else if (ioc->ioc_mc == BFI_MC_IOCFC) 17232993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati return BFA_IOC_TYPE_FCoE; 17242993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati else if (ioc->ioc_mc == BFI_MC_LL) 17252993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati return BFA_IOC_TYPE_LL; 17262993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati else { 17272993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati bfa_assert(ioc->ioc_mc == BFI_MC_LL); 17282993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati return BFA_IOC_TYPE_LL; 17292993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati } 17302993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati} 17312993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati 17327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 17330a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_adapter_serial_num(struct bfa_ioc_s *ioc, char *serial_num) 17340a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{ 17350a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_os_memset((void *)serial_num, 0, BFA_ADAPTER_SERIAL_NUM_LEN); 17360a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_os_memcpy((void *)serial_num, 17370a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati (void *)ioc->attr->brcd_serialnum, 17380a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati BFA_ADAPTER_SERIAL_NUM_LEN); 17390a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati} 17400a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 17410a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid 17420a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_adapter_fw_ver(struct bfa_ioc_s *ioc, char *fw_ver) 17430a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{ 17440a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_os_memset((void *)fw_ver, 0, BFA_VERSION_LEN); 17450a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_os_memcpy(fw_ver, ioc->attr->fw_version, BFA_VERSION_LEN); 17460a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati} 17470a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 17480a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid 17490a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_pci_chip_rev(struct bfa_ioc_s *ioc, char *chip_rev) 17500a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{ 17510a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_assert(chip_rev); 17520a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 17530a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_os_memset((void *)chip_rev, 0, BFA_IOC_CHIP_REV_LEN); 17540a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 17550a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati chip_rev[0] = 'R'; 17560a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati chip_rev[1] = 'e'; 17570a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati chip_rev[2] = 'v'; 17580a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati chip_rev[3] = '-'; 17590a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati chip_rev[4] = ioc->attr->asic_rev; 17600a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati chip_rev[5] = '\0'; 17610a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati} 17620a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 17630a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid 17640a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_adapter_optrom_ver(struct bfa_ioc_s *ioc, char *optrom_ver) 17650a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{ 17660a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_os_memset((void *)optrom_ver, 0, BFA_VERSION_LEN); 17670a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_os_memcpy(optrom_ver, ioc->attr->optrom_version, 17680a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati BFA_VERSION_LEN); 17690a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati} 17700a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 17710a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid 17720a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_adapter_manufacturer(struct bfa_ioc_s *ioc, char *manufacturer) 17730a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{ 17740a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_os_memset((void *)manufacturer, 0, BFA_ADAPTER_MFG_NAME_LEN); 17750a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_os_memcpy(manufacturer, BFA_MFG_NAME, BFA_ADAPTER_MFG_NAME_LEN); 17760a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati} 17770a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 17780a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid 17790a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_adapter_model(struct bfa_ioc_s *ioc, char *model) 17800a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{ 17810a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati struct bfi_ioc_attr_s *ioc_attr; 17820a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati u8 nports; 17830a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati u8 max_speed; 17840a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 17850a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_assert(model); 17860a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_os_memset((void *)model, 0, BFA_ADAPTER_MODEL_NAME_LEN); 17870a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 17880a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati ioc_attr = ioc->attr; 17890a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 17900a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati nports = bfa_ioc_get_nports(ioc); 17910a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati max_speed = bfa_ioc_speed_sup(ioc); 17920a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 17930a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati /** 17940a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati * model name 17950a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati */ 17960a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati if (max_speed == 10) { 17970a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati strcpy(model, "BR-10?0"); 17980a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati model[5] = '0' + nports; 17990a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati } else { 18000a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati strcpy(model, "Brocade-??5"); 18010a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati model[8] = '0' + max_speed; 18020a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati model[9] = '0' + nports; 18030a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati } 18040a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati} 18050a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 18060a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatienum bfa_ioc_state 18070a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_state(struct bfa_ioc_s *ioc) 18080a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{ 18090a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati return bfa_sm_to_state(ioc_sm_table, ioc->fsm); 18100a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati} 18110a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati 18120a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid 18137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_attr(struct bfa_ioc_s *ioc, struct bfa_ioc_attr_s *ioc_attr) 18147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 18157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_os_memset((void *)ioc_attr, 0, sizeof(struct bfa_ioc_attr_s)); 18167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 18170a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati ioc_attr->state = bfa_ioc_get_state(ioc); 18187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc_attr->port_id = ioc->port_id; 18197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 18202993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati ioc_attr->ioc_type = bfa_ioc_get_type(ioc); 18217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 18227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_get_adapter_attr(ioc, &ioc_attr->adapter_attr); 18237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 18247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc_attr->pci_attr.device_id = ioc->pcidev.device_id; 18257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc_attr->pci_attr.pcifn = ioc->pcidev.pci_func; 18260a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_ioc_get_pci_chip_rev(ioc, ioc_attr->pci_attr.chip_rev); 18277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 18287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 18297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 18307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * hal_wwn_public 18317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 18327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangwwn_t 18337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_pwwn(struct bfa_ioc_s *ioc) 18347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 18357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang union { 18367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t wwn; 18377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 byte[sizeof(wwn_t)]; 18387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 18397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang w; 18407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 18417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang w.wwn = ioc->attr->mfg_wwn; 18427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 18437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (bfa_ioc_portid(ioc) == 1) 18447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang w.byte[7]++; 18457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 18467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return w.wwn; 18477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 18487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 18497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangwwn_t 18507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_nwwn(struct bfa_ioc_s *ioc) 18517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 18527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang union { 18537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t wwn; 18547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 byte[sizeof(wwn_t)]; 18557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 18567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang w; 18577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 18587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang w.wwn = ioc->attr->mfg_wwn; 18597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 18607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (bfa_ioc_portid(ioc) == 1) 18617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang w.byte[7]++; 18627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 18637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang w.byte[0] = 0x20; 18647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 18657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return w.wwn; 18667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 18677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 18687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangwwn_t 18697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_wwn_naa5(struct bfa_ioc_s *ioc, u16 inst) 18707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 18717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang union { 18727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang wwn_t wwn; 18737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u8 byte[sizeof(wwn_t)]; 18747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 18757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang w , w5; 18767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 18777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, inst); 18787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 18797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang w.wwn = ioc->attr->mfg_wwn; 18807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang w5.byte[0] = 0x50 | w.byte[2] >> 4; 18817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang w5.byte[1] = w.byte[2] << 4 | w.byte[3] >> 4; 18827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang w5.byte[2] = w.byte[3] << 4 | w.byte[4] >> 4; 18837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang w5.byte[3] = w.byte[4] << 4 | w.byte[5] >> 4; 18847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang w5.byte[4] = w.byte[5] << 4 | w.byte[6] >> 4; 18857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang w5.byte[5] = w.byte[6] << 4 | w.byte[7] >> 4; 18867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang w5.byte[6] = w.byte[7] << 4 | (inst & 0x0f00) >> 8; 18877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang w5.byte[7] = (inst & 0xff); 18887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 18897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return w5.wwn; 18907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 18917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 18927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu64 18937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_adid(struct bfa_ioc_s *ioc) 18947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 18957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return ioc->attr->mfg_wwn; 18967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 18977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 18987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangmac_t 18997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_mac(struct bfa_ioc_s *ioc) 19007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 19017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang mac_t mac; 19027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 19037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang mac = ioc->attr->mfg_mac; 19047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang mac.mac[MAC_ADDRLEN - 1] += bfa_ioc_pcifn(ioc); 19057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 19067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return mac; 19077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 19087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 19097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid 19107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_set_fcmode(struct bfa_ioc_s *ioc) 19117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 19127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->fcmode = BFA_TRUE; 19137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->port_id = bfa_ioc_pcifn(ioc); 19147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 19157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 19167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_boolean_t 19177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_fcmode(struct bfa_ioc_s *ioc) 19187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 19197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return ioc->fcmode || (ioc->pcidev.device_id != BFA_PCI_DEVICE_ID_CT); 19207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 19217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 19227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 19237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Send AEN notification 19247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 19257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 19267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_aen_post(struct bfa_ioc_s *ioc, enum bfa_ioc_aen_event event) 19277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 19287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang union bfa_aen_data_u aen_data; 19297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang struct bfa_log_mod_s *logmod = ioc->logm; 19307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang s32 inst_num = 0; 19312993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati enum bfa_ioc_type_e ioc_type; 19327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 19330a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati bfa_log(logmod, BFA_LOG_CREATE_ID(BFA_AEN_CAT_IOC, event), inst_num); 19347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 19357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang memset(&aen_data.ioc.pwwn, 0, sizeof(aen_data.ioc.pwwn)); 19367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang memset(&aen_data.ioc.mac, 0, sizeof(aen_data.ioc.mac)); 19372993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati ioc_type = bfa_ioc_get_type(ioc); 19382993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati switch (ioc_type) { 19397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_IOC_TYPE_FC: 19407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang aen_data.ioc.pwwn = bfa_ioc_get_pwwn(ioc); 19417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 19427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_IOC_TYPE_FCoE: 19437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang aen_data.ioc.pwwn = bfa_ioc_get_pwwn(ioc); 19447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang aen_data.ioc.mac = bfa_ioc_get_mac(ioc); 19457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 19467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang case BFA_IOC_TYPE_LL: 19477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang aen_data.ioc.mac = bfa_ioc_get_mac(ioc); 19487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 19497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang default: 19502993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati bfa_assert(ioc_type == BFA_IOC_TYPE_FC); 19517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang break; 19527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 19532993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati aen_data.ioc.ioc_type = ioc_type; 19547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 19557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 19567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 19577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Retrieve saved firmware trace from a prior IOC failure. 19587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 19597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t 19607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_debug_fwsave(struct bfa_ioc_s *ioc, void *trcdata, int *trclen) 19617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 19627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int tlen; 19637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 19647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (ioc->dbg_fwsave_len == 0) 19657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_ENOFSAVE; 19667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 19677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tlen = *trclen; 19687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tlen > ioc->dbg_fwsave_len) 19697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tlen = ioc->dbg_fwsave_len; 19707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 19717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_os_memcpy(trcdata, ioc->dbg_fwsave, tlen); 19727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *trclen = tlen; 19737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_OK; 19747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 19757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 19767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 1977738c9e66dcb7e17a962a7d65c976386b970d10caKrishna Gudipati * Clear saved firmware trace 1978738c9e66dcb7e17a962a7d65c976386b970d10caKrishna Gudipati */ 1979738c9e66dcb7e17a962a7d65c976386b970d10caKrishna Gudipativoid 1980738c9e66dcb7e17a962a7d65c976386b970d10caKrishna Gudipatibfa_ioc_debug_fwsave_clear(struct bfa_ioc_s *ioc) 1981738c9e66dcb7e17a962a7d65c976386b970d10caKrishna Gudipati{ 1982738c9e66dcb7e17a962a7d65c976386b970d10caKrishna Gudipati ioc->dbg_fwsave_once = BFA_TRUE; 1983738c9e66dcb7e17a962a7d65c976386b970d10caKrishna Gudipati} 1984738c9e66dcb7e17a962a7d65c976386b970d10caKrishna Gudipati 1985738c9e66dcb7e17a962a7d65c976386b970d10caKrishna Gudipati/** 19867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Retrieve saved firmware trace from a prior IOC failure. 19877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 19887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t 19897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_debug_fwtrc(struct bfa_ioc_s *ioc, void *trcdata, int *trclen) 19907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 19917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 pgnum; 19927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 loff = BFA_DBG_FWTRC_OFF(bfa_ioc_portid(ioc)); 19937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int i, tlen; 19947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang u32 *tbuf = trcdata, r32; 19957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 19967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, *trclen); 19977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 19987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pgnum = bfa_ioc_smem_pgnum(ioc, loff); 19997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang loff = bfa_ioc_smem_pgoff(ioc, loff); 20000a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 20010a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati /* 20020a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Hold semaphore to serialize pll init and fwtrc. 20030a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 20040a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati if (BFA_FALSE == bfa_ioc_sem_get(ioc->ioc_regs.ioc_init_sem_reg)) 20050a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati return BFA_STATUS_FAILED; 20060a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 20077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write(ioc->ioc_regs.host_page_num_fn, pgnum); 20087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tlen = *trclen; 20107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (tlen > BFA_DBG_FWTRC_LEN) 20117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tlen = BFA_DBG_FWTRC_LEN; 20127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tlen /= sizeof(u32); 20137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, tlen); 20157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang for (i = 0; i < tlen; i++) { 20177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang r32 = bfa_mem_read(ioc->ioc_regs.smem_page_start, loff); 20187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tbuf[i] = bfa_os_ntohl(r32); 20197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang loff += sizeof(u32); 20207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang /** 20227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * handle page offset wrap around 20237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 20247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang loff = PSS_SMEM_PGOFF(loff); 20257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (loff == 0) { 20267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang pgnum++; 20277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write(ioc->ioc_regs.host_page_num_fn, pgnum); 20287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 20297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 20307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_reg_write(ioc->ioc_regs.host_page_num_fn, 20317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_smem_pgnum(ioc, 0)); 20320a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 20330a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati /* 20340a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * release semaphore. 20350a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */ 20360a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati bfa_ioc_sem_release(ioc->ioc_regs.ioc_init_sem_reg); 20370a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati 20387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_trc(ioc, pgnum); 20397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *trclen = tlen * sizeof(u32); 20417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang return BFA_STATUS_OK; 20427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 20437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 20457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Save firmware trace if configured. 20467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 20477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 20487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_debug_save(struct bfa_ioc_s *ioc) 20497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 20507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang int tlen; 20517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (ioc->dbg_fwsave_len) { 20537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang tlen = ioc->dbg_fwsave_len; 20547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_debug_fwtrc(ioc, ioc->dbg_fwsave, &tlen); 20557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 20567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 20577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/** 20597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Firmware failure detected. Start recovery actions. 20607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */ 20617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 20627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_recover(struct bfa_ioc_s *ioc) 20637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 20647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang if (ioc->dbg_fwsave_once) { 20657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang ioc->dbg_fwsave_once = BFA_FALSE; 20667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_debug_save(ioc); 20677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang } 20687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_ioc_stats(ioc, ioc_hbfails); 20707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_fsm_send_event(ioc, IOC_E_HBFAIL); 20717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 20727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#else 20747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 20767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_aen_post(struct bfa_ioc_s *ioc, enum bfa_ioc_aen_event event) 20777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 20787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 20797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void 20817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_recover(struct bfa_ioc_s *ioc) 20827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{ 20837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang bfa_assert(0); 20847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang} 20857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#endif 20877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 20887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang 2089