⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmdresp.c

📁 linux内核源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	return 0;}static int wlan_ret_get_log(wlan_private * priv,			    struct cmd_ds_command *resp){	struct cmd_ds_802_11_get_log *logmessage = &resp->params.glog;	wlan_adapter *adapter = priv->adapter;	lbs_deb_enter(LBS_DEB_CMD);	/* Stored little-endian */	memcpy(&adapter->logmsg, logmessage, sizeof(struct cmd_ds_802_11_get_log));	lbs_deb_leave(LBS_DEB_CMD);	return 0;}static int libertas_ret_802_11_enable_rsn(wlan_private * priv,                                          struct cmd_ds_command *resp){	struct cmd_ds_802_11_enable_rsn *enable_rsn = &resp->params.enbrsn;	wlan_adapter *adapter = priv->adapter;	u32 * pdata_buf = adapter->cur_cmd->pdata_buf;	lbs_deb_enter(LBS_DEB_CMD);	if (enable_rsn->action == cpu_to_le16(CMD_ACT_GET)) {		if (pdata_buf)			*pdata_buf = (u32) le16_to_cpu(enable_rsn->enable);	}	lbs_deb_leave(LBS_DEB_CMD);	return 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;}int libertas_process_rx_command(wlan_private * priv){	u16 respcmd;	struct cmd_ds_command *resp;	wlan_adapter *adapter = priv->adapter;	int ret = 0;	ulong flags;	u16 result;	lbs_deb_enter(LBS_DEB_HOST);	/* Now we got response from FW, cancel the command timer */	del_timer(&adapter->command_timer);	mutex_lock(&adapter->lock);	spin_lock_irqsave(&adapter->driver_lock, flags);	if (!adapter->cur_cmd) {		lbs_deb_host("CMD_RESP: cur_cmd is NULL\n");		ret = -1;		spin_unlock_irqrestore(&adapter->driver_lock, flags);		goto done;	}	resp = (struct cmd_ds_command *)(adapter->cur_cmd->bufvirtualaddr);	respcmd = le16_to_cpu(resp->command);	result = le16_to_cpu(resp->result);	lbs_deb_host("CMD_RESP: response 0x%04x, size %d, jiffies %lu\n",		respcmd, priv->upld_len, jiffies);	lbs_deb_hex(LBS_DEB_HOST, "CMD_RESP", adapter->cur_cmd->bufvirtualaddr,		    priv->upld_len);	if (!(respcmd & 0x8000)) {		lbs_deb_host("invalid response!\n");		adapter->cur_cmd_retcode = -1;		__libertas_cleanup_and_insert_cmd(priv, adapter->cur_cmd);		adapter->nr_cmd_pending--;		adapter->cur_cmd = NULL;		spin_unlock_irqrestore(&adapter->driver_lock, flags);		ret = -1;		goto done;	}	/* Store the response code to cur_cmd_retcode. */	adapter->cur_cmd_retcode = result;;	if (respcmd == CMD_RET(CMD_802_11_PS_MODE)) {		struct cmd_ds_802_11_ps_mode *psmode = &resp->params.psmode;		u16 action = le16_to_cpu(psmode->action);		lbs_deb_host(		       "CMD_RESP: PS_MODE cmd reply result 0x%x, action 0x%x\n",		       result, action);		if (result) {			lbs_deb_host("CMD_RESP: PS command failed with 0x%x\n",				    result);			/*			 * We should not re-try enter-ps command in			 * ad-hoc mode. It takes place in			 * libertas_execute_next_command().			 */			if (adapter->mode == IW_MODE_ADHOC &&			    action == CMD_SUBCMD_ENTER_PS)				adapter->psmode = WLAN802_11POWERMODECAM;		} else if (action == CMD_SUBCMD_ENTER_PS) {			adapter->needtowakeup = 0;			adapter->psstate = PS_STATE_AWAKE;			lbs_deb_host("CMD_RESP: ENTER_PS command response\n");			if (adapter->connect_status != LIBERTAS_CONNECTED) {				/*				 * When Deauth Event received before Enter_PS command				 * response, We need to wake up the firmware.				 */				lbs_deb_host(				       "disconnected, invoking libertas_ps_wakeup\n");				spin_unlock_irqrestore(&adapter->driver_lock, flags);				mutex_unlock(&adapter->lock);				libertas_ps_wakeup(priv, 0);				mutex_lock(&adapter->lock);				spin_lock_irqsave(&adapter->driver_lock, flags);			}		} else if (action == CMD_SUBCMD_EXIT_PS) {			adapter->needtowakeup = 0;			adapter->psstate = PS_STATE_FULL_POWER;			lbs_deb_host("CMD_RESP: EXIT_PS command response\n");		} else {			lbs_deb_host("CMD_RESP: PS action 0x%X\n", action);		}		__libertas_cleanup_and_insert_cmd(priv, adapter->cur_cmd);		adapter->nr_cmd_pending--;		adapter->cur_cmd = NULL;		spin_unlock_irqrestore(&adapter->driver_lock, flags);		ret = 0;		goto done;	}	if (adapter->cur_cmd->cmdflags & CMD_F_HOSTCMD) {		/* Copy the response back to response buffer */		memcpy(adapter->cur_cmd->pdata_buf, resp,		       le16_to_cpu(resp->size));		adapter->cur_cmd->cmdflags &= ~CMD_F_HOSTCMD;	}	/* If the command is not successful, cleanup and return failure */	if ((result != 0 || !(respcmd & 0x8000))) {		lbs_deb_host("CMD_RESP: error 0x%04x in command reply 0x%04x\n",		       result, respcmd);		/*		 * Handling errors here		 */		switch (respcmd) {		case CMD_RET(CMD_GET_HW_SPEC):		case CMD_RET(CMD_802_11_RESET):			lbs_deb_host("CMD_RESP: reset failed\n");			break;		}		__libertas_cleanup_and_insert_cmd(priv, adapter->cur_cmd);		adapter->nr_cmd_pending--;		adapter->cur_cmd = NULL;		spin_unlock_irqrestore(&adapter->driver_lock, flags);		ret = -1;		goto done;	}	spin_unlock_irqrestore(&adapter->driver_lock, flags);	ret = handle_cmd_response(respcmd, resp, priv);	spin_lock_irqsave(&adapter->driver_lock, flags);	if (adapter->cur_cmd) {		/* Clean up and Put current command back to cmdfreeq */		__libertas_cleanup_and_insert_cmd(priv, adapter->cur_cmd);		adapter->nr_cmd_pending--;		WARN_ON(adapter->nr_cmd_pending > 128);		adapter->cur_cmd = NULL;	}	spin_unlock_irqrestore(&adapter->driver_lock, flags);done:	mutex_unlock(&adapter->lock);	lbs_deb_leave_args(LBS_DEB_HOST, "ret %d", ret);	return ret;}int libertas_process_event(wlan_private * priv){	int ret = 0;	wlan_adapter *adapter = priv->adapter;	u32 eventcause;	lbs_deb_enter(LBS_DEB_CMD);	spin_lock_irq(&adapter->driver_lock);	eventcause = adapter->eventcause;	spin_unlock_irq(&adapter->driver_lock);	lbs_deb_cmd("event cause 0x%x\n", eventcause);	switch (eventcause >> SBI_EVENT_CAUSE_SHIFT) {	case MACREG_INT_CODE_LINK_SENSED:		lbs_deb_cmd("EVENT: MACREG_INT_CODE_LINK_SENSED\n");		break;	case MACREG_INT_CODE_DEAUTHENTICATED:		lbs_deb_cmd("EVENT: deauthenticated\n");		libertas_mac_event_disconnected(priv);		break;	case MACREG_INT_CODE_DISASSOCIATED:		lbs_deb_cmd("EVENT: disassociated\n");		libertas_mac_event_disconnected(priv);		break;	case MACREG_INT_CODE_LINK_LOSE_NO_SCAN:		lbs_deb_cmd("EVENT: link lost\n");		libertas_mac_event_disconnected(priv);		break;	case MACREG_INT_CODE_PS_SLEEP:		lbs_deb_cmd("EVENT: sleep\n");		/* handle unexpected PS SLEEP event */		if (adapter->psstate == PS_STATE_FULL_POWER) {			lbs_deb_cmd(			       "EVENT: in FULL POWER mode, ignoreing PS_SLEEP\n");			break;		}		adapter->psstate = PS_STATE_PRE_SLEEP;		libertas_ps_confirm_sleep(priv, (u16) adapter->psmode);		break;	case MACREG_INT_CODE_PS_AWAKE:		lbs_deb_cmd("EVENT: awake\n");		/* handle unexpected PS AWAKE event */		if (adapter->psstate == PS_STATE_FULL_POWER) {			lbs_deb_cmd(			       "EVENT: In FULL POWER mode - ignore PS AWAKE\n");			break;		}		adapter->psstate = PS_STATE_AWAKE;		if (adapter->needtowakeup) {			/*			 * wait for the command processing to finish			 * before resuming sending			 * adapter->needtowakeup will be set to FALSE			 * in libertas_ps_wakeup()			 */			lbs_deb_cmd("waking up ...\n");			libertas_ps_wakeup(priv, 0);		}		break;	case MACREG_INT_CODE_MIC_ERR_UNICAST:		lbs_deb_cmd("EVENT: UNICAST MIC ERROR\n");		handle_mic_failureevent(priv, MACREG_INT_CODE_MIC_ERR_UNICAST);		break;	case MACREG_INT_CODE_MIC_ERR_MULTICAST:		lbs_deb_cmd("EVENT: MULTICAST MIC ERROR\n");		handle_mic_failureevent(priv, MACREG_INT_CODE_MIC_ERR_MULTICAST);		break;	case MACREG_INT_CODE_MIB_CHANGED:	case MACREG_INT_CODE_INIT_DONE:		break;	case MACREG_INT_CODE_ADHOC_BCN_LOST:		lbs_deb_cmd("EVENT: ADHOC beacon lost\n");		break;	case MACREG_INT_CODE_RSSI_LOW:		lbs_pr_alert("EVENT: rssi low\n");		break;	case MACREG_INT_CODE_SNR_LOW:		lbs_pr_alert("EVENT: snr low\n");		break;	case MACREG_INT_CODE_MAX_FAIL:		lbs_pr_alert("EVENT: max fail\n");		break;	case MACREG_INT_CODE_RSSI_HIGH:		lbs_pr_alert("EVENT: rssi high\n");		break;	case MACREG_INT_CODE_SNR_HIGH:		lbs_pr_alert("EVENT: snr high\n");		break;	case MACREG_INT_CODE_MESH_AUTO_STARTED:		/* Ignore spurious autostart events if autostart is disabled */		if (!priv->mesh_autostart_enabled) {			lbs_pr_info("EVENT: MESH_AUTO_STARTED (ignoring)\n");			break;		}		lbs_pr_info("EVENT: MESH_AUTO_STARTED\n");		adapter->connect_status = LIBERTAS_CONNECTED;		if (priv->mesh_open == 1) {			netif_wake_queue(priv->mesh_dev);			netif_carrier_on(priv->mesh_dev);		}		adapter->mode = IW_MODE_ADHOC;		schedule_work(&priv->sync_channel);		break;	default:		lbs_pr_alert("EVENT: unknown event id 0x%04x\n",		       eventcause >> SBI_EVENT_CAUSE_SHIFT);		break;	}	spin_lock_irq(&adapter->driver_lock);	adapter->eventcause = 0;	spin_unlock_irq(&adapter->driver_lock);	lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);	return ret;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -