/* Called from falcon_process_eventq for MCDI events */ void efx_mcdi_process_event(struct efx_channel *channel, efx_qword_t *event) { struct efx_nic *efx = channel->efx; int code = EFX_QWORD_FIELD(*event, MCDI_EVENT_CODE); u32 data = EFX_QWORD_FIELD(*event, MCDI_EVENT_DATA); switch (code) { case MCDI_EVENT_CODE_BADSSERT: netif_err(efx, hw, efx->net_dev, "MC watchdog or assertion failure at 0x%x\n", data); efx_mcdi_ev_death(efx, EINTR); break; case MCDI_EVENT_CODE_PMNOTICE: netif_info(efx, wol, efx->net_dev, "MCDI PM event.\n"); break; case MCDI_EVENT_CODE_CMDDONE: efx_mcdi_ev_cpl(efx, MCDI_EVENT_FIELD(*event, CMDDONE_SEQ), MCDI_EVENT_FIELD(*event, CMDDONE_DATALEN), MCDI_EVENT_FIELD(*event, CMDDONE_ERRNO)); break; case MCDI_EVENT_CODE_LINKCHANGE: efx_mcdi_process_link_change(efx, event); break; case MCDI_EVENT_CODE_SENSOREVT: efx_mcdi_sensor_event(efx, event); break; case MCDI_EVENT_CODE_SCHEDERR: netif_info(efx, hw, efx->net_dev, "MC Scheduler error address=0x%x\n", data); break; case MCDI_EVENT_CODE_REBOOT: netif_info(efx, hw, efx->net_dev, "MC Reboot\n"); efx_mcdi_ev_death(efx, EIO); break; case MCDI_EVENT_CODE_MAC_STATS_DMA: /* MAC stats are gather lazily. We can ignore this. */ break; default: netif_err(efx, hw, efx->net_dev, "Unknown MCDI event 0x%x\n", code); } }
int efx_aoe_event(struct efx_nic *efx, efx_qword_t *event, int budget) { int32_t aoe_code; struct efx_aoe_data *aoe = efx->aoe_data; if (!aoe) return -ENOENT; aoe_code = MCDI_EVENT_FIELD(*event, AOE_ERR_TYPE); if (aoe_code == MCDI_EVENT_AOE_CPLD_REPROGRAMMED) { aoe->last_status = MCDI_EVENT_FIELD(*event, AOE_ERR_DATA); if (waitqueue_active(&aoe->read_data)) wake_up(&aoe->read_data); } else return efx_dl_handle_event(efx, event, budget); return 0; }