예제 #1
0
/** 
 *  @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;
}
예제 #2
0
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;
}