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

📄 cmd.c

📁 linux内核源码
💻 C
📖 第 1 页 / 共 4 页
字号:
					 int cmd_action){	wlan_adapter *adapter = priv->adapter;	struct cmd_ds_802_11_radio_control *pradiocontrol = &cmd->params.radio;	lbs_deb_enter(LBS_DEB_CMD);	cmd->size =	    cpu_to_le16((sizeof(struct cmd_ds_802_11_radio_control)) +			     S_DS_GEN);	cmd->command = cpu_to_le16(CMD_802_11_RADIO_CONTROL);	pradiocontrol->action = cpu_to_le16(cmd_action);	switch (adapter->preamble) {	case CMD_TYPE_SHORT_PREAMBLE:		pradiocontrol->control = cpu_to_le16(SET_SHORT_PREAMBLE);		break;	case CMD_TYPE_LONG_PREAMBLE:		pradiocontrol->control = cpu_to_le16(SET_LONG_PREAMBLE);		break;	case CMD_TYPE_AUTO_PREAMBLE:	default:		pradiocontrol->control = cpu_to_le16(SET_AUTO_PREAMBLE);		break;	}	if (adapter->radioon)		pradiocontrol->control |= cpu_to_le16(TURN_ON_RF);	else		pradiocontrol->control &= cpu_to_le16(~TURN_ON_RF);	lbs_deb_leave(LBS_DEB_CMD);	return 0;}static int wlan_cmd_802_11_rf_tx_power(wlan_private * priv,				       struct cmd_ds_command *cmd,				       u16 cmd_action, void *pdata_buf){	struct cmd_ds_802_11_rf_tx_power *prtp = &cmd->params.txp;	lbs_deb_enter(LBS_DEB_CMD);	cmd->size =	    cpu_to_le16((sizeof(struct cmd_ds_802_11_rf_tx_power)) + S_DS_GEN);	cmd->command = cpu_to_le16(CMD_802_11_RF_TX_POWER);	prtp->action = cpu_to_le16(cmd_action);	lbs_deb_cmd("RF_TX_POWER_CMD: size:%d cmd:0x%x Act:%d\n",		    le16_to_cpu(cmd->size), le16_to_cpu(cmd->command),		    le16_to_cpu(prtp->action));	switch (cmd_action) {	case CMD_ACT_TX_POWER_OPT_GET:		prtp->action = cpu_to_le16(CMD_ACT_GET);		prtp->currentlevel = 0;		break;	case CMD_ACT_TX_POWER_OPT_SET_HIGH:		prtp->action = cpu_to_le16(CMD_ACT_SET);		prtp->currentlevel = cpu_to_le16(CMD_ACT_TX_POWER_INDEX_HIGH);		break;	case CMD_ACT_TX_POWER_OPT_SET_MID:		prtp->action = cpu_to_le16(CMD_ACT_SET);		prtp->currentlevel = cpu_to_le16(CMD_ACT_TX_POWER_INDEX_MID);		break;	case CMD_ACT_TX_POWER_OPT_SET_LOW:		prtp->action = cpu_to_le16(CMD_ACT_SET);		prtp->currentlevel = cpu_to_le16(*((u16 *) pdata_buf));		break;	}	lbs_deb_leave(LBS_DEB_CMD);	return 0;}static int wlan_cmd_802_11_monitor_mode(wlan_private * priv,				      struct cmd_ds_command *cmd,				      u16 cmd_action, void *pdata_buf){	struct cmd_ds_802_11_monitor_mode *monitor = &cmd->params.monitor;	cmd->command = cpu_to_le16(CMD_802_11_MONITOR_MODE);	cmd->size =	    cpu_to_le16(sizeof(struct cmd_ds_802_11_monitor_mode) +			     S_DS_GEN);	monitor->action = cpu_to_le16(cmd_action);	if (cmd_action == CMD_ACT_SET) {		monitor->mode =		    cpu_to_le16((u16) (*(u32 *) pdata_buf));	}	return 0;}static int wlan_cmd_802_11_rate_adapt_rateset(wlan_private * priv,					      struct cmd_ds_command *cmd,					      u16 cmd_action){	struct cmd_ds_802_11_rate_adapt_rateset	*rateadapt = &cmd->params.rateset;	wlan_adapter *adapter = priv->adapter;	lbs_deb_enter(LBS_DEB_CMD);	cmd->size =	    cpu_to_le16(sizeof(struct cmd_ds_802_11_rate_adapt_rateset)			     + S_DS_GEN);	cmd->command = cpu_to_le16(CMD_802_11_RATE_ADAPT_RATESET);	rateadapt->action = cpu_to_le16(cmd_action);	rateadapt->enablehwauto = cpu_to_le16(adapter->enablehwauto);	rateadapt->bitmap = cpu_to_le16(adapter->ratebitmap);	lbs_deb_leave(LBS_DEB_CMD);	return 0;}static int wlan_cmd_802_11_data_rate(wlan_private * priv,				     struct cmd_ds_command *cmd,				     u16 cmd_action){	struct cmd_ds_802_11_data_rate *pdatarate = &cmd->params.drate;	wlan_adapter *adapter = priv->adapter;	lbs_deb_enter(LBS_DEB_CMD);	cmd->size = cpu_to_le16(sizeof(struct cmd_ds_802_11_data_rate) +			     S_DS_GEN);	cmd->command = cpu_to_le16(CMD_802_11_DATA_RATE);	memset(pdatarate, 0, sizeof(struct cmd_ds_802_11_data_rate));	pdatarate->action = cpu_to_le16(cmd_action);	if (cmd_action == CMD_ACT_SET_TX_FIX_RATE) {		pdatarate->rates[0] = libertas_data_rate_to_fw_index(adapter->cur_rate);		lbs_deb_cmd("DATA_RATE: set fixed 0x%02X\n",		       adapter->cur_rate);	} else if (cmd_action == CMD_ACT_SET_TX_AUTO) {		lbs_deb_cmd("DATA_RATE: setting auto\n");	}	lbs_deb_leave(LBS_DEB_CMD);	return 0;}static int wlan_cmd_mac_multicast_adr(wlan_private * priv,				      struct cmd_ds_command *cmd,				      u16 cmd_action){	struct cmd_ds_mac_multicast_adr *pMCastAdr = &cmd->params.madr;	wlan_adapter *adapter = priv->adapter;	lbs_deb_enter(LBS_DEB_CMD);	cmd->size = cpu_to_le16(sizeof(struct cmd_ds_mac_multicast_adr) +			     S_DS_GEN);	cmd->command = cpu_to_le16(CMD_MAC_MULTICAST_ADR);	lbs_deb_cmd("MULTICAST_ADR: setting %d addresses\n", pMCastAdr->nr_of_adrs);	pMCastAdr->action = cpu_to_le16(cmd_action);	pMCastAdr->nr_of_adrs =	    cpu_to_le16((u16) adapter->nr_of_multicastmacaddr);	memcpy(pMCastAdr->maclist, adapter->multicastlist,	       adapter->nr_of_multicastmacaddr * ETH_ALEN);	lbs_deb_leave(LBS_DEB_CMD);	return 0;}static int wlan_cmd_802_11_rf_channel(wlan_private * priv,				      struct cmd_ds_command *cmd,				      int option, void *pdata_buf){	struct cmd_ds_802_11_rf_channel *rfchan = &cmd->params.rfchannel;	lbs_deb_enter(LBS_DEB_CMD);	cmd->command = cpu_to_le16(CMD_802_11_RF_CHANNEL);	cmd->size = cpu_to_le16(sizeof(struct cmd_ds_802_11_rf_channel) +				S_DS_GEN);	if (option == CMD_OPT_802_11_RF_CHANNEL_SET) {		rfchan->currentchannel = cpu_to_le16(*((u16 *) pdata_buf));	}	rfchan->action = cpu_to_le16(option);	lbs_deb_leave(LBS_DEB_CMD);	return 0;}static int wlan_cmd_802_11_rssi(wlan_private * priv,				struct cmd_ds_command *cmd){	wlan_adapter *adapter = priv->adapter;	lbs_deb_enter(LBS_DEB_CMD);	cmd->command = cpu_to_le16(CMD_802_11_RSSI);	cmd->size = cpu_to_le16(sizeof(struct cmd_ds_802_11_rssi) + S_DS_GEN);	cmd->params.rssi.N = cpu_to_le16(DEFAULT_BCN_AVG_FACTOR);	/* reset Beacon SNR/NF/RSSI values */	adapter->SNR[TYPE_BEACON][TYPE_NOAVG] = 0;	adapter->SNR[TYPE_BEACON][TYPE_AVG] = 0;	adapter->NF[TYPE_BEACON][TYPE_NOAVG] = 0;	adapter->NF[TYPE_BEACON][TYPE_AVG] = 0;	adapter->RSSI[TYPE_BEACON][TYPE_NOAVG] = 0;	adapter->RSSI[TYPE_BEACON][TYPE_AVG] = 0;	lbs_deb_leave(LBS_DEB_CMD);	return 0;}static int wlan_cmd_reg_access(wlan_private * priv,			       struct cmd_ds_command *cmdptr,			       u8 cmd_action, void *pdata_buf){	struct wlan_offset_value *offval;	lbs_deb_enter(LBS_DEB_CMD);	offval = (struct wlan_offset_value *)pdata_buf;	switch (cmdptr->command) {	case CMD_MAC_REG_ACCESS:		{			struct cmd_ds_mac_reg_access *macreg;			cmdptr->size =			    cpu_to_le16(sizeof (struct cmd_ds_mac_reg_access)					+ S_DS_GEN);			macreg =			    (struct cmd_ds_mac_reg_access *)&cmdptr->params.			    macreg;			macreg->action = cpu_to_le16(cmd_action);			macreg->offset = cpu_to_le16((u16) offval->offset);			macreg->value = cpu_to_le32(offval->value);			break;		}	case CMD_BBP_REG_ACCESS:		{			struct cmd_ds_bbp_reg_access *bbpreg;			cmdptr->size =			    cpu_to_le16(sizeof					     (struct cmd_ds_bbp_reg_access)					     + S_DS_GEN);			bbpreg =			    (struct cmd_ds_bbp_reg_access *)&cmdptr->params.			    bbpreg;			bbpreg->action = cpu_to_le16(cmd_action);			bbpreg->offset = cpu_to_le16((u16) offval->offset);			bbpreg->value = (u8) offval->value;			break;		}	case CMD_RF_REG_ACCESS:		{			struct cmd_ds_rf_reg_access *rfreg;			cmdptr->size =			    cpu_to_le16(sizeof					     (struct cmd_ds_rf_reg_access) +					     S_DS_GEN);			rfreg =			    (struct cmd_ds_rf_reg_access *)&cmdptr->params.			    rfreg;			rfreg->action = cpu_to_le16(cmd_action);			rfreg->offset = cpu_to_le16((u16) offval->offset);			rfreg->value = (u8) offval->value;			break;		}	default:		break;	}	lbs_deb_leave(LBS_DEB_CMD);	return 0;}static int wlan_cmd_802_11_mac_address(wlan_private * priv,				       struct cmd_ds_command *cmd,				       u16 cmd_action){	wlan_adapter *adapter = priv->adapter;	lbs_deb_enter(LBS_DEB_CMD);	cmd->command = cpu_to_le16(CMD_802_11_MAC_ADDRESS);	cmd->size = cpu_to_le16(sizeof(struct cmd_ds_802_11_mac_address) +			     S_DS_GEN);	cmd->result = 0;	cmd->params.macadd.action = cpu_to_le16(cmd_action);	if (cmd_action == CMD_ACT_SET) {		memcpy(cmd->params.macadd.macadd,		       adapter->current_addr, ETH_ALEN);		lbs_deb_hex(LBS_DEB_CMD, "SET_CMD: MAC addr", adapter->current_addr, 6);	}	lbs_deb_leave(LBS_DEB_CMD);	return 0;}static int wlan_cmd_802_11_eeprom_access(wlan_private * priv,					 struct cmd_ds_command *cmd,					 int cmd_action, void *pdata_buf){	struct wlan_ioctl_regrdwr *ea = pdata_buf;	lbs_deb_enter(LBS_DEB_CMD);	cmd->command = cpu_to_le16(CMD_802_11_EEPROM_ACCESS);	cmd->size = cpu_to_le16(sizeof(struct cmd_ds_802_11_eeprom_access) +				S_DS_GEN);	cmd->result = 0;	cmd->params.rdeeprom.action = cpu_to_le16(ea->action);	cmd->params.rdeeprom.offset = cpu_to_le16(ea->offset);	cmd->params.rdeeprom.bytecount = cpu_to_le16(ea->NOB);	cmd->params.rdeeprom.value = 0;	lbs_deb_leave(LBS_DEB_CMD);	return 0;}static int wlan_cmd_bt_access(wlan_private * priv,			       struct cmd_ds_command *cmd,			       u16 cmd_action, void *pdata_buf){	struct cmd_ds_bt_access *bt_access = &cmd->params.bt;	lbs_deb_enter_args(LBS_DEB_CMD, "action %d", cmd_action);	cmd->command = cpu_to_le16(CMD_BT_ACCESS);	cmd->size = cpu_to_le16(sizeof(struct cmd_ds_bt_access) + S_DS_GEN);	cmd->result = 0;	bt_access->action = cpu_to_le16(cmd_action);	switch (cmd_action) {	case CMD_ACT_BT_ACCESS_ADD:		memcpy(bt_access->addr1, pdata_buf, 2 * ETH_ALEN);		lbs_deb_hex(LBS_DEB_MESH, "BT_ADD: blinded MAC addr", bt_access->addr1, 6);		break;	case CMD_ACT_BT_ACCESS_DEL:		memcpy(bt_access->addr1, pdata_buf, 1 * ETH_ALEN);		lbs_deb_hex(LBS_DEB_MESH, "BT_DEL: blinded MAC addr", bt_access->addr1, 6);		break;	case CMD_ACT_BT_ACCESS_LIST:		bt_access->id = cpu_to_le32(*(u32 *) pdata_buf);		break;	case CMD_ACT_BT_ACCESS_RESET:		break;	case CMD_ACT_BT_ACCESS_SET_INVERT:		bt_access->id = cpu_to_le32(*(u32 *) pdata_buf);		break;	case CMD_ACT_BT_ACCESS_GET_INVERT:		break;	default:		break;	}	lbs_deb_leave(LBS_DEB_CMD);	return 0;}static int wlan_cmd_fwt_access(wlan_private * priv,			       struct cmd_ds_command *cmd,			       u16 cmd_action, void *pdata_buf){	struct cmd_ds_fwt_access *fwt_access = &cmd->params.fwt;	lbs_deb_enter_args(LBS_DEB_CMD, "action %d", cmd_action);	cmd->command = cpu_to_le16(CMD_FWT_ACCESS);	cmd->size = cpu_to_le16(sizeof(struct cmd_ds_fwt_access) + S_DS_GEN);	cmd->result = 0;	if (pdata_buf)		memcpy(fwt_access, pdata_buf, sizeof(*fwt_access));	else		memset(fwt_access, 0, sizeof(*fwt_access));	fwt_access->action = cpu_to_le16(cmd_action);	lbs_deb_leave(LBS_DEB_CMD);	return 0;}static int wlan_cmd_mesh_access(wlan_private * priv,				struct cmd_ds_command *cmd,				u16 cmd_action, void *pdata_buf){	struct cmd_ds_mesh_access *mesh_access = &cmd->params.mesh;	lbs_deb_enter_args(LBS_DEB_CMD, "action %d", cmd_action);	cmd->command = cpu_to_le16(CMD_MESH_ACCESS);	cmd->size = cpu_to_le16(sizeof(struct cmd_ds_mesh_access) + S_DS_GEN);	cmd->result = 0;	if (pdata_buf)		memcpy(mesh_access, pdata_buf, sizeof(*mesh_access));	else		memset(mesh_access, 0, sizeof(*mesh_access));	mesh_access->action = cpu_to_le16(cmd_action);	lbs_deb_leave(LBS_DEB_CMD);	return 0;}static int wlan_cmd_set_boot2_ver(wlan_private * priv,				struct cmd_ds_command *cmd,				u16 cmd_action, void *pdata_buf){	struct cmd_ds_set_boot2_ver *boot2_ver = &cmd->params.boot2_ver;	cmd->command = cpu_to_le16(CMD_SET_BOOT2_VER);	cmd->size = cpu_to_le16(sizeof(struct cmd_ds_set_boot2_ver) + S_DS_GEN);	boot2_ver->version = priv->boot2_version;	return 0;}/* * Note: NEVER use libertas_queue_cmd() with addtail==0 other than for * the command timer, because it does not account for queued commands. */void libertas_queue_cmd(wlan_adapter * adapter, struct cmd_ctrl_node *cmdnode, u8 addtail){	unsigned long flags;	struct cmd_ds_command *cmdptr;	lbs_deb_enter(LBS_DEB_HOST);	if (!cmdnode) {		lbs_deb_host("QUEUE_CMD: cmdnode is NULL\n");		goto done;	}	cmdptr = (struct cmd_ds_command *)cmdnode->bufvirtualaddr;	if (!cmdptr) {		lbs_deb_host("QUEUE_CMD: cmdptr is NULL\n");		goto done;	}	/* Exit_PS command needs to be queued in the header always. */	if (cmdptr->command == CMD_802_11_PS_MODE) {		struct cmd_ds_802_11_ps_mode *psm = &cmdptr->params.psmode;		if (psm->action == cpu_to_le16(CMD_SUBCMD_EXIT_PS)) {			if (adapter->psstate != PS_STATE_FULL_POWER)				addtail = 0;		}	}	spin_lock_irqsave(&adapter->driver_lock, flags);	if (addtail) {		list_add_tail((struct list_head *)cmdnode,			      &adapter->cmdpendingq);		adapter->nr_cmd_pending++;	} else		list_add((struct list_head *)cmdnode, &adapter->cmdpendingq);	spin_unlock_irqrestore(&adapter->driver_lock, flags);	lbs_deb_host("QUEUE_CMD: inserted command 0x%04x into cmdpendingq\n",	       le16_to_cpu(((struct cmd_ds_gen*)cmdnode->bufvirtualaddr)->command));done:	lbs_deb_leave(LBS_DEB_HOST);}/* * TODO: Fix the issue when DownloadcommandToStation is being called the * second time when the command times out. All the cmdptr->xxx are in little

⌨️ 快捷键说明

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