📄 cmd.c
字号:
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 + -