Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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;
}
Exemplo n.º 7
0
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;
}
Exemplo n.º 9
0
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;
}
Exemplo n.º 10
0
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;
}