/** * @brief This function handles the command response * * @param priv A pointer to wlan_private structure * @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE */ int wlan_process_rx_command(WlanCard *cardinfo) { WlanCard *card = cardinfo; u16 RespCmd; HostCmd_DS_COMMAND *resp; int ret = WLAN_STATUS_SUCCESS; u16 Result; if (!card->CurCmd) { resp = (HostCmd_DS_COMMAND *) card->CmdResBuf; WlanDebug(WlanErr, "CMD_RESP: NULL CurCmd, 0x%x\n", resp->Command); ret = WLAN_STATUS_FAILURE; goto done; } resp = (HostCmd_DS_COMMAND *) card->CmdResBuf; RespCmd = resp->Command; Result = resp->Result; WlanDebug(WlanCmd, "CMD_RESP: 0x%x, result %d, len %d, seqno %d\n",RespCmd, Result, resp->Size, resp->SeqNum); if (!(RespCmd & 0x8000)) { WlanDebug(WlanErr,"CMD_RESP: Invalid response to command!"); card->CurCmdRetCode = WLAN_STATUS_FAILURE; ret = WLAN_STATUS_FAILURE; rt_event_send(&(card->cmdwaitevent), CmdWaitQWoken); goto done; } /* Store the response code to CurCmdRetCode. */ card->CurCmdRetCode = resp->Result; /* If the command is not successful, cleanup and return failure */ if ((Result != HostCmd_RESULT_OK || !(RespCmd & 0x8000))) { WlanDebug(WlanErr,"CMD_RESP: cmd %#x error, result=%#x\n",resp->Command, resp->Result); /* * Handling errors here */ switch (RespCmd) { case HostCmd_RET_HW_SPEC_INFO: WlanDebug(WlanMsg,"CMD_RESP: HW spec command Failed\n"); break; } card->CurCmdRetCode = WLAN_STATUS_FAILURE; rt_event_send(&(card->cmdwaitevent), CmdWaitQWoken); return WLAN_STATUS_FAILURE; } switch (RespCmd) { case HostCmd_RET_MAC_REG_ACCESS: case HostCmd_RET_BBP_REG_ACCESS: case HostCmd_RET_RF_REG_ACCESS: // ret = wlan_ret_reg_access(priv, RespCmd, resp); break; case HostCmd_RET_HW_SPEC_INFO: ret = wlan_ret_get_hw_spec(card, resp); break; case HostCmd_RET_802_11_SCAN: if (card->ScanPurpose == ScanMultichs) { ret = WlanparserScanResult(card, resp); } else if (card->ScanPurpose == ScanFilter) { ret = WlanparserScanResult(card, resp); // ret = wlan_ret_802_11_scan(card, resp); } break; case HostCmd_RET_MAC_CONTROL: WlanDebug(WlanMsg,"HostCmd_RET_MAC_CONTROL\r\n"); break; case HostCmd_RET_802_11_ASSOCIATE: ret = wlan_ret_802_11_associate(card, resp); break; case HostCmd_RET_802_11_DEAUTHENTICATE: // ret = wlan_ret_802_11_disassociate(priv, resp); break; case HostCmd_RET_802_11_SET_WEP: ret = wlan_ret_802_11_set_wep(card, resp); break; case HostCmd_RET_802_11_RESET: // ret = wlan_ret_802_11_reset(priv, resp); break; case HostCmd_RET_802_11_RF_TX_POWER: ret = wlan_ret_802_11_rf_tx_power(card, resp); break; case HostCmd_RET_802_11_RADIO_CONTROL: // ret = wlan_ret_802_11_radio_control(priv, resp); break; case HostCmd_RET_802_11_SNMP_MIB: ret = wlan_ret_802_11_snmp_mib(card, resp); break; case HostCmd_RET_802_11_RF_ANTENNA: // ret = wlan_ret_802_11_rf_antenna(priv, resp); break; case HostCmd_RET_MAC_MULTICAST_ADR: ret = wlan_ret_mac_multicast_adr(card, resp); break; case HostCmd_RET_802_11_RATE_ADAPT_RATESET: ret = wlan_ret_802_11_rate_adapt_rateset(card, resp); break; case HostCmd_RET_802_11_RF_CHANNEL: // ret = wlan_ret_802_11_rf_channel(priv, resp); break; case HostCmd_RET_802_11_RSSI: ret = wlan_ret_802_11_rssi(card, resp); break; case HostCmd_RET_802_11_GET_LOG: ret = wlan_ret_802_11_get_log(card, resp); break; case HostCmd_RET_802_11_MAC_ADDRESS: // ret = wlan_ret_802_11_mac_address(priv, resp); break; case HostCmd_RET_802_11_CAL_DATA_EXT: // ret = wlan_ret_802_11_cal_data_ext(priv, resp); break; case HostCmd_RET_802_11_KEY_MATERIAL: ret = wlan_ret_802_11_key_material(card, resp); break; case HostCmd_RET_CMD_GSPI_BUS_CONFIG: WlanDebug(WlanMsg,"HostCmd_RET_CMD_GSPI_BUS_CONFIG\r\n"); break; case HostCmd_RET_802_11D_DOMAIN_INFO: // ret = wlan_ret_802_11d_domain_info(priv, resp); break; case HostCmd_RET_802_11_BCA_CONFIG_TIMESHARE: // ret = wlan_ret_802_11_bca_timeshare(priv, resp); break; case HostCmd_RET_802_11_INACTIVITY_TIMEOUT: // *((u16 *) Adapter->CurCmd->pdata_buf) = // wlan_le16_to_cpu(resp->params.inactivity_timeout.Timeout); break; case HostCmd_RET_802_11_BG_SCAN_CONFIG: break; case HostCmd_RET_802_11_FW_WAKE_METHOD: ret = wlan_ret_fw_wakeup_method(card, resp); break; case HostCmd_RET_802_11_SLEEP_PERIOD: //ret = wlan_ret_802_11_sleep_period(priv, resp); break; case HostCmd_RET_WMM_GET_STATUS: //ret = wlan_cmdresp_wmm_get_status(priv, resp); break; case HostCmd_RET_WMM_ADDTS_REQ: // ret = wlan_cmdresp_wmm_addts_req(priv, resp); break; case HostCmd_RET_WMM_DELTS_REQ: // ret = wlan_cmdresp_wmm_delts_req(priv, resp); break; case HostCmd_RET_WMM_QUEUE_CONFIG: // ret = wlan_cmdresp_wmm_queue_config(priv, resp); break; case HostCmd_RET_WMM_QUEUE_STATS: // ret = wlan_cmdresp_wmm_queue_stats(priv, resp); break; case HostCmd_CMD_TX_PKT_STATS: // memcpy(Adapter->CurCmd->pdata_buf, // &resp->params.txPktStats, sizeof(HostCmd_DS_TX_PKT_STATS)); // ret = WLAN_STATUS_SUCCESS; break; case HostCmd_RET_802_11_TPC_CFG: // memmove(Adapter->CurCmd->pdata_buf, // &resp->params.tpccfg, sizeof(HostCmd_DS_802_11_TPC_CFG)); break; case HostCmd_RET_802_11_LED_CONTROL: { break; } case HostCmd_RET_802_11_CRYPTO: //ret = wlan_ret_cmd_802_11_crypto(priv, resp); break; case HostCmd_RET_GET_TSF: /*resp->params.gettsf.TsfValue = wlan_le64_to_cpu(resp->params.gettsf.TsfValue); memcpy(priv->adapter->CurCmd->pdata_buf, &resp->params.gettsf.TsfValue, sizeof(u64));*/ break; case HostCmd_RTE_802_11_TX_RATE_QUERY: // priv->adapter->TxRate = // wlan_le16_to_cpu(resp->params.txrate.TxRate); break; case HostCmd_RET_VERSION_EXT: /* memcpy(Adapter->CurCmd->pdata_buf, &resp->params.verext, sizeof(HostCmd_DS_VERSION_EXT));*/ break; case HostCmd_RET_802_11_PS_MODE: break; default: WlanDebug(WlanMsg,"CMD_RESP: Unknown command response %#x\n",resp->Command); break; } if (card->CurCmd) { /* Clean up and Put current command back to CmdFreeQ */ rt_event_send(&(cardinfo->cmdwaitevent), CmdWaitQWoken); } done: return ret; }
static inline int handle_cmd_response(u16 respcmd, struct cmd_ds_command *resp, wlan_private *priv) { int ret = 0; unsigned long flags; wlan_adapter *adapter = priv->adapter; lbs_deb_enter(LBS_DEB_HOST); switch (respcmd) { case CMD_RET(CMD_MAC_REG_ACCESS): case CMD_RET(CMD_BBP_REG_ACCESS): case CMD_RET(CMD_RF_REG_ACCESS): ret = wlan_ret_reg_access(priv, respcmd, resp); break; case CMD_RET(CMD_GET_HW_SPEC): ret = wlan_ret_get_hw_spec(priv, resp); break; case CMD_RET(CMD_802_11_SCAN): ret = libertas_ret_80211_scan(priv, resp); break; case CMD_RET(CMD_802_11_GET_LOG): ret = wlan_ret_get_log(priv, resp); break; case CMD_RET_802_11_ASSOCIATE: case CMD_RET(CMD_802_11_ASSOCIATE): case CMD_RET(CMD_802_11_REASSOCIATE): ret = libertas_ret_80211_associate(priv, resp); break; case CMD_RET(CMD_802_11_DISASSOCIATE): case CMD_RET(CMD_802_11_DEAUTHENTICATE): ret = libertas_ret_80211_disassociate(priv, resp); break; case CMD_RET(CMD_802_11_AD_HOC_START): case CMD_RET(CMD_802_11_AD_HOC_JOIN): ret = libertas_ret_80211_ad_hoc_start(priv, resp); break; case CMD_RET(CMD_802_11_GET_STAT): ret = wlan_ret_802_11_stat(priv, resp); break; case CMD_RET(CMD_802_11_SNMP_MIB): ret = wlan_ret_802_11_snmp_mib(priv, resp); break; case CMD_RET(CMD_802_11_RF_TX_POWER): ret = wlan_ret_802_11_rf_tx_power(priv, resp); break; case CMD_RET(CMD_802_11_SET_AFC): case CMD_RET(CMD_802_11_GET_AFC): spin_lock_irqsave(&adapter->driver_lock, flags); memmove(adapter->cur_cmd->pdata_buf, &resp->params.afc, sizeof(struct cmd_ds_802_11_afc)); spin_unlock_irqrestore(&adapter->driver_lock, flags); break; case CMD_RET(CMD_MAC_MULTICAST_ADR): case CMD_RET(CMD_MAC_CONTROL): case CMD_RET(CMD_802_11_SET_WEP): case CMD_RET(CMD_802_11_RESET): case CMD_RET(CMD_802_11_AUTHENTICATE): case CMD_RET(CMD_802_11_RADIO_CONTROL): case CMD_RET(CMD_802_11_BEACON_STOP): break; case CMD_RET(CMD_802_11_ENABLE_RSN): ret = libertas_ret_802_11_enable_rsn(priv, resp); break; case CMD_RET(CMD_802_11_DATA_RATE): ret = wlan_ret_802_11_data_rate(priv, resp); break; case CMD_RET(CMD_802_11_RATE_ADAPT_RATESET): ret = wlan_ret_802_11_rate_adapt_rateset(priv, resp); break; case CMD_RET(CMD_802_11_RF_CHANNEL): ret = wlan_ret_802_11_rf_channel(priv, resp); break; case CMD_RET(CMD_802_11_RSSI): ret = wlan_ret_802_11_rssi(priv, resp); break; case CMD_RET(CMD_802_11_MAC_ADDRESS): ret = wlan_ret_802_11_mac_address(priv, resp); break; case CMD_RET(CMD_802_11_AD_HOC_STOP): ret = libertas_ret_80211_ad_hoc_stop(priv, resp); break; case CMD_RET(CMD_802_11_KEY_MATERIAL): ret = wlan_ret_802_11_key_material(priv, resp); break; case CMD_RET(CMD_802_11_EEPROM_ACCESS): ret = wlan_ret_802_11_eeprom_access(priv, resp); break; case CMD_RET(CMD_802_11D_DOMAIN_INFO): ret = libertas_ret_802_11d_domain_info(priv, resp); break; case CMD_RET(CMD_802_11_SLEEP_PARAMS): ret = wlan_ret_802_11_sleep_params(priv, resp); break; case CMD_RET(CMD_802_11_INACTIVITY_TIMEOUT): spin_lock_irqsave(&adapter->driver_lock, flags); *((u16 *) adapter->cur_cmd->pdata_buf) = le16_to_cpu(resp->params.inactivity_timeout.timeout); spin_unlock_irqrestore(&adapter->driver_lock, flags); break; case CMD_RET(CMD_802_11_TPC_CFG): spin_lock_irqsave(&adapter->driver_lock, flags); memmove(adapter->cur_cmd->pdata_buf, &resp->params.tpccfg, sizeof(struct cmd_ds_802_11_tpc_cfg)); spin_unlock_irqrestore(&adapter->driver_lock, flags); break; case CMD_RET(CMD_802_11_LED_GPIO_CTRL): spin_lock_irqsave(&adapter->driver_lock, flags); memmove(adapter->cur_cmd->pdata_buf, &resp->params.ledgpio, sizeof(struct cmd_ds_802_11_led_ctrl)); spin_unlock_irqrestore(&adapter->driver_lock, flags); break; case CMD_RET(CMD_802_11_PWR_CFG): spin_lock_irqsave(&adapter->driver_lock, flags); memmove(adapter->cur_cmd->pdata_buf, &resp->params.pwrcfg, sizeof(struct cmd_ds_802_11_pwr_cfg)); spin_unlock_irqrestore(&adapter->driver_lock, flags); break; case CMD_RET(CMD_GET_TSF): spin_lock_irqsave(&adapter->driver_lock, flags); memcpy(priv->adapter->cur_cmd->pdata_buf, &resp->params.gettsf.tsfvalue, sizeof(u64)); spin_unlock_irqrestore(&adapter->driver_lock, flags); break; case CMD_RET(CMD_BT_ACCESS): spin_lock_irqsave(&adapter->driver_lock, flags); if (adapter->cur_cmd->pdata_buf) memcpy(adapter->cur_cmd->pdata_buf, &resp->params.bt.addr1, 2 * ETH_ALEN); spin_unlock_irqrestore(&adapter->driver_lock, flags); break; case CMD_RET(CMD_FWT_ACCESS): spin_lock_irqsave(&adapter->driver_lock, flags); if (adapter->cur_cmd->pdata_buf) memcpy(adapter->cur_cmd->pdata_buf, &resp->params.fwt, sizeof(resp->params.fwt)); spin_unlock_irqrestore(&adapter->driver_lock, flags); break; case CMD_RET(CMD_MESH_ACCESS): if (adapter->cur_cmd->pdata_buf) memcpy(adapter->cur_cmd->pdata_buf, &resp->params.mesh, sizeof(resp->params.mesh)); break; default: lbs_deb_host("CMD_RESP: unknown cmd response 0x%04x\n", resp->command); break; } lbs_deb_leave(LBS_DEB_HOST); return ret; }