int ath6kl_wmi_send_btcoex_cmd(struct ath6kl *ar, u8 *buf, int len) { struct sk_buff *skb; u32 nl_cmd; int wmi_cmd; struct wmi *wmi = ar->wmi; nl_cmd = *(u32 *)buf; buf += sizeof(u32); len -= sizeof(u32); wmi_cmd = ath6kl_get_wmi_cmd(nl_cmd); if (wmi_cmd == 0) return -ENOMEM; skb = ath6kl_wmi_btcoex_get_new_buf(len); if (!skb) return -ENOMEM; ath6kl_btcoex_adjust_params(ar, wmi_cmd, buf); memcpy(skb->data, buf, len); return ath6kl_wmi_cmd_send(wmi, 0, skb, (enum wmi_cmd_id)wmi_cmd, NO_SYNC_WMIFLAG); }
int ath6kl_wmi_get_customer_reg_cmd(struct ath6kl_vif *vif, u32 addr,u32 *val) { struct sk_buff *skb; struct wmi_reg_cmd *cmd; int ret; int left; skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); if (!skb) return -ENOMEM; cmd = (struct wmi_reg_cmd *) skb->data; cmd->addr = addr; //cmd->val = val; set_bit(SONY_WMI_UPDATE, &vif->flag); //vif->ar->wmi->pwr_mode = pwr_mode; //printk("%s[%d]Start get reg addr=0x%x\n\r",__func__,__LINE__,cmd->addr); ret = ath6kl_wmi_cmd_send(vif, skb, WMI_GET_CUSTOM_REG, NO_SYNC_WMIFLAG); //printk("%s[%d]Wait\n\r",__func__,__LINE__); left = wait_event_interruptible_timeout(vif->event_wq, !test_bit(SONY_WMI_UPDATE, &vif->flag), WMI_TIMEOUT); //printk("%s[%d]Wait Fin ,left=%d\n\r",__func__,__LINE__,left); if (left == 0) return -ETIMEDOUT; //printk("%s[%d]reg addr=0x%x,val_private=0x%x\n\r",__func__,__LINE__,addr_private,val_private); *val = val_private; return ret; }
int ath6kl_wmi_get_customer_txpow_cmd(struct ath6kl_vif *vif, athcfg_wcmd_txpower_t *val) { struct sk_buff *skb; athcfg_wcmd_txpower_t *cmd; int ret; int left; skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); if (!skb) return -ENOMEM; cmd = (athcfg_wcmd_txpower_t *) skb->data; set_bit(SONY_WMI_UPDATE, &vif->flag); //printk("%s[%d]Start get txpower\n\r",__func__,__LINE__); ret = ath6kl_wmi_cmd_send(vif, skb, WMI_GET_CUSTOM_WIFI_TXPOW, NO_SYNC_WMIFLAG); //printk("%s[%d]Wait\n\r",__func__,__LINE__); left = wait_event_interruptible_timeout(vif->event_wq, !test_bit(SONY_WMI_UPDATE, &vif->flag), WMI_TIMEOUT); //printk("%s[%d]Wait Fin ,left=%d\n\r",__func__,__LINE__,left); if (left == 0) return -ETIMEDOUT; //printk("%s[%d]\n\r",__func__,__LINE__); //get tx result memcpy(val ,&txpow_private,sizeof(athcfg_wcmd_txpower_t)); return ret; }
int ath6kl_wmi_get_customer_mode_cmd(struct ath6kl_vif *vif, athcfg_wcmd_phymode_t *val) { struct sk_buff *skb; athcfg_wcmd_sta_t *cmd; int ret; int left; skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); if (!skb) return -ENOMEM; cmd = (athcfg_wcmd_sta_t *) skb->data; set_bit(SONY_WMI_UPDATE, &vif->flag); ret = ath6kl_wmi_cmd_send(vif, skb, WMI_GET_CUSTOM_STAINFO, NO_SYNC_WMIFLAG); //printk("%s[%d]Wait\n\r",__func__,__LINE__); left = wait_event_interruptible_timeout(vif->event_wq, !test_bit(SONY_WMI_UPDATE, &vif->flag), WMI_TIMEOUT); //printk("%s[%d]Wait Fin ,left=%d\n\r",__func__,__LINE__,left); if (left == 0) return -ETIMEDOUT; //get beacon RSSI if(test_bit(CONNECTED, &vif->flag)) { //printk("%s[%d]vif->nw_type=%d\n\r",__func__,__LINE__,vif->nw_type); memcpy(val ,&stainfo_private.phymode,sizeof(athcfg_wcmd_phymode_t)); } else { memset(val ,0x0,sizeof(athcfg_wcmd_phymode_t)); } return ret; }
int ath6kl_wmi_get_customer_stainfo_cmd(struct ath6kl_vif *vif, athcfg_wcmd_sta_t *val) { struct sk_buff *skb; athcfg_wcmd_sta_t *cmd; int ret; int left; skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); if (!skb) return -ENOMEM; cmd = (athcfg_wcmd_sta_t *) skb->data; set_bit(SONY_WMI_UPDATE, &vif->flag); ret = ath6kl_wmi_cmd_send(vif, skb, WMI_GET_CUSTOM_STAINFO, NO_SYNC_WMIFLAG); left = wait_event_interruptible_timeout(vif->event_wq, !test_bit(SONY_WMI_UPDATE, &vif->flag), WMI_TIMEOUT); if (left == 0) return -ETIMEDOUT; //get beacon RSSI if(test_bit(CONNECTED, &vif->flag)) { if(vif->nw_type != AP_NETWORK) { set_bit(SONY_WMI_UPDATE, &vif->flag); //printk("%s[%d]Start get beacon rssi,vif=0x%x\n\r",__func__,__LINE__,(int*)vif); ret = ath6kl_wmi_bssfilter_cmd( vif, CURRENT_BSS_FILTER, 0); if (ret) { return ret; } left = wait_event_interruptible_timeout(vif->event_wq, !test_bit(SONY_WMI_UPDATE, &vif->flag), WMI_TIMEOUT*10); ath6kl_wmi_bssfilter_cmd(vif, NONE_BSS_FILTER, 0); } } //printk("%s[%d]vif->nw_type=%d\n\r",__func__,__LINE__,vif->nw_type); memcpy(val ,&stainfo_private,sizeof(athcfg_wcmd_sta_t)); return ret; }
static int ath6kl_wmi_set_err_report_bitmask(struct wmi *wmi, u8 if_idx, u32 mask) { struct sk_buff *skb; struct wmi_tgt_err_report_mask *cmd; int ret; skb = ath6kl_wmi_get_new_buf_pri(sizeof(*cmd)); if (!skb) return -ENOMEM; cmd = (struct wmi_tgt_err_report_mask *) skb->data; cmd->mask = cpu_to_le32(mask); ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_TARGET_ERROR_REPORT_BITMASK_CMDID, NO_SYNC_WMIFLAG); return ret; }
int ath6kl_wmi_set_customer_reg_cmd(struct ath6kl_vif *vif, u32 addr,u32 val) { struct sk_buff *skb; struct wmi_reg_cmd *cmd; int ret; skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); if (!skb) return -ENOMEM; cmd = (struct wmi_reg_cmd *) skb->data; cmd->addr = addr; cmd->val = val; //printk("%s[%d]reg addr=0x%x,val=0x%x\n\r",__func__,__LINE__,cmd->addr,cmd->val); ret = ath6kl_wmi_cmd_send(vif, skb, WMI_SET_CUSTOM_REG, NO_SYNC_WMIFLAG); return ret; }
static int ath6kl_wmi_inact_period_cmd(struct wmi *wmi, u32 inact_period, u8 num_null_func) { struct sk_buff *skb; struct wmi_set_inact_period_cmd *cmd; int ret; skb = ath6kl_wmi_get_new_buf_pri(sizeof(*cmd)); if (!skb) return -ENOMEM; cmd = (struct wmi_set_inact_period_cmd *) skb->data; cmd->inact_period = cpu_to_le32(inact_period); cmd->num_null_func = num_null_func; ret = ath6kl_wmi_cmd_send(wmi, 0, skb, WMI_AP_CONN_INACT_CMDID, NO_SYNC_WMIFLAG); return ret; }
int ath6kl_wmi_set_customer_testmode_cmd(struct ath6kl_vif *vif, athcfg_wcmd_testmode_t *val) { struct sk_buff *skb; struct WMI_CUSTOMER_TESTMODE_STRUCT *cmd; int ret = 0; bool send_wmi_flag = false; switch(val->operation) { case ATHCFG_WCMD_TESTMODE_BSSID: { if(memcmp(testmode_private.bssid,val->bssid,sizeof(testmode_private.bssid)) != 0) { memcpy(testmode_private.bssid,val->bssid,sizeof(testmode_private.bssid)); send_wmi_flag = true; } //printk("%s[%d] testmode_private.bssid=\"%pM\"\n",__func__,__LINE__,testmode_private.bssid); } break; case ATHCFG_WCMD_TESTMODE_CHAN: { if(testmode_private.chan != val->chan) { testmode_private.chan = val->chan; send_wmi_flag = true; } //printk("%s[%d] testmode_private.chan=%d\n",__func__,__LINE__,testmode_private.chan); } break; case ATHCFG_WCMD_TESTMODE_RX: { if(testmode_private.rx != val->rx) { testmode_private.rx = val->rx; send_wmi_flag = true; } } break; case ATHCFG_WCMD_TESTMODE_ANT: default: printk("%s[%d]Not support\n",__func__,__LINE__); return -1; } //send WMI to target if(send_wmi_flag) { testmode_private.rx = val->rx; skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); if (!skb) return -ENOMEM; cmd = (struct WMI_CUSTOMER_TESTMODE_STRUCT *) skb->data; //transfer to little endian memcpy(cmd->bssid, val->bssid, sizeof(cmd->bssid)); cmd->chan = cpu_to_le32(val->chan); cmd->operation = cpu_to_le16(val->operation); cmd->antenna = val->antenna; cmd->rx = val->rx; cmd->rssi_combined = cpu_to_le32(val->rssi_combined); cmd->rssi0 = cpu_to_le32(val->rssi0); cmd->rssi1 = cpu_to_le32(val->rssi1); cmd->rssi2 = cpu_to_le32(val->rssi2); ret = ath6kl_wmi_cmd_send(vif, skb, WMI_SET_CUSTOM_TESTMODE, NO_SYNC_WMIFLAG); } if(val->operation == ATHCFG_WCMD_TESTMODE_RX) { if(val->rx == 1) { s8 n_channels = 1; u16 *channels = NULL; int i; set_bit(SONY_WMI_TESTMODE_RX, &vif->flag); //set scan param ath6kl_wmi_scanparams_cmd( vif, 0, 0xffff, 0, vif->sc_params.minact_chdwell_time, vif->sc_params.maxact_chdwell_time,//0xffff, 1000,//vif->sc_params.pas_chdwell_time, msec vif->sc_params.short_scan_ratio, (vif->sc_params.scan_ctrl_flags & ~ACTIVE_SCAN_CTRL_FLAGS), //vif->sc_params.scan_ctrl_flags, vif->sc_params.max_dfsch_act_time, vif->sc_params.maxact_scan_per_ssid); //assign request channel channels = kzalloc(n_channels * sizeof(u16), GFP_KERNEL); if (channels == NULL) { n_channels = 0; } for (i = 0; i < n_channels; i++) { channels[i] = ieee80211_channel_to_frequency_ath6kl((testmode_private.chan == 0 ? 1:testmode_private.chan),IEEE80211_NUM_BANDS); //printk("%s[%d]channels[%d]=%d,testmode_private.chan=%d\n",__func__,__LINE__,i,channels[i],testmode_private.chan); } ret = ath6kl_wmi_bssfilter_cmd( vif, ALL_BSS_FILTER, 0); if (ret) { printk("%s[%d] Fail\n",__func__,__LINE__); goto rx_fail; } ret = ath6kl_wmi_startscan_cmd(vif, WMI_LONG_SCAN, 1, false, 0, 0, n_channels, channels); if (ret) { printk("%s[%d] Fail\n",__func__,__LINE__); goto rx_fail; } rx_fail: kfree(channels); } else { //cancel test mode scan clear_bit(SONY_WMI_TESTMODE_RX, &vif->flag); ath6kl_wmi_scanparams_cmd(vif, vif->sc_params.fg_start_period, vif->sc_params.fg_end_period, vif->sc_params.bg_period, vif->sc_params.minact_chdwell_time, vif->sc_params.maxact_chdwell_time, vif->sc_params.pas_chdwell_time, vif->sc_params.short_scan_ratio, vif->sc_params.scan_ctrl_flags, vif->sc_params.max_dfsch_act_time, vif->sc_params.maxact_scan_per_ssid); } } return ret; }
int ath6kl_wmi_get_customer_testmode_cmd(struct ath6kl_vif *vif, athcfg_wcmd_testmode_t *val) { struct sk_buff *skb; struct WMI_CUSTOMER_TESTMODE_STRUCT *cmd; int ret; int left; skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); if (!skb) return -ENOMEM; //printk("%s[%d]\n",__func__,__LINE__); cmd = (struct WMI_CUSTOMER_TESTMODE_STRUCT *) skb->data; //transfer to little endian memcpy(cmd->bssid, val->bssid, sizeof(cmd->bssid)); cmd->chan = cpu_to_le32(val->chan); cmd->operation = cpu_to_le16(val->operation); cmd->antenna = val->antenna; cmd->rx = val->rx; cmd->rssi_combined = cpu_to_le32(val->rssi_combined); cmd->rssi0 = cpu_to_le32(val->rssi0); cmd->rssi1 = cpu_to_le32(val->rssi1); cmd->rssi2 = cpu_to_le32(val->rssi2); set_bit(SONY_WMI_TESTMODE_GET, &vif->flag); ret = ath6kl_wmi_cmd_send(vif, skb, WMI_GET_CUSTOM_TESTMODE, NO_SYNC_WMIFLAG); left = wait_event_interruptible_timeout(vif->event_wq, !test_bit(SONY_WMI_TESTMODE_GET, &vif->flag), WMI_TIMEOUT); if (left == 0) return -ETIMEDOUT; switch(val->operation) { case ATHCFG_WCMD_TESTMODE_CHAN: val->chan = testmode_private.chan; break; case ATHCFG_WCMD_TESTMODE_BSSID: memcpy(val->bssid,testmode_private.bssid,sizeof(val->bssid)); break; case ATHCFG_WCMD_TESTMODE_RX: val->rx = testmode_private.rx; break; case ATHCFG_WCMD_TESTMODE_RESULT: val->rssi_combined = testmode_private.rssi_combined; val->rssi0 = testmode_private.rssi0; val->rssi1 = testmode_private.rssi1; val->rssi2 = testmode_private.rssi2; break; case ATHCFG_WCMD_TESTMODE_ANT: val->antenna = testmode_private.antenna; break; default: printk("%s[%d]Not support\n",__func__,__LINE__); break; } return ret; }