wmi.c (67cd22e48d4acd3ac8c0032b628537bb27e92a24) | wmi.c (804483e90794256f9ed53e795ffbf1e94de237c8) |
---|---|
1/* 2 * Copyright (c) 2004-2011 Atheros Communications Inc. | 1/* 2 * Copyright (c) 2004-2011 Atheros Communications Inc. |
3 * Copyright (c) 2011-2012 Qualcomm Atheros, Inc. | |
4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR --- 540 unchanged lines hidden (view full) --- 552 "len=%d dlen=%u\n", len, dlen); 553 return -EINVAL; 554 } 555 ath6kl_dbg(ATH6KL_DBG_WMI, "rx_probe_req: len=%u freq=%u " 556 "probe_req_report=%d\n", 557 dlen, freq, vif->probe_req_report); 558 559 if (vif->probe_req_report || vif->nw_type == AP_NETWORK) | 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR --- 540 unchanged lines hidden (view full) --- 551 "len=%d dlen=%u\n", len, dlen); 552 return -EINVAL; 553 } 554 ath6kl_dbg(ATH6KL_DBG_WMI, "rx_probe_req: len=%u freq=%u " 555 "probe_req_report=%d\n", 556 dlen, freq, vif->probe_req_report); 557 558 if (vif->probe_req_report || vif->nw_type == AP_NETWORK) |
560 cfg80211_rx_mgmt(vif->ndev, freq, ev->data, dlen, GFP_ATOMIC); | 559 cfg80211_rx_mgmt(vif->ndev, freq, 0, 560 ev->data, dlen, GFP_ATOMIC); |
561 562 return 0; 563} 564 565static int ath6kl_wmi_p2p_capabilities_event_rx(u8 *datap, int len) 566{ 567 struct wmi_p2p_capabilities_event *ev; 568 u16 dlen; --- 22 unchanged lines hidden (view full) --- 591 freq = le32_to_cpu(ev->freq); 592 dlen = le16_to_cpu(ev->len); 593 if (datap + len < ev->data + dlen) { 594 ath6kl_err("invalid wmi_rx_action_event: " 595 "len=%d dlen=%u\n", len, dlen); 596 return -EINVAL; 597 } 598 ath6kl_dbg(ATH6KL_DBG_WMI, "rx_action: len=%u freq=%u\n", dlen, freq); | 561 562 return 0; 563} 564 565static int ath6kl_wmi_p2p_capabilities_event_rx(u8 *datap, int len) 566{ 567 struct wmi_p2p_capabilities_event *ev; 568 u16 dlen; --- 22 unchanged lines hidden (view full) --- 591 freq = le32_to_cpu(ev->freq); 592 dlen = le16_to_cpu(ev->len); 593 if (datap + len < ev->data + dlen) { 594 ath6kl_err("invalid wmi_rx_action_event: " 595 "len=%d dlen=%u\n", len, dlen); 596 return -EINVAL; 597 } 598 ath6kl_dbg(ATH6KL_DBG_WMI, "rx_action: len=%u freq=%u\n", dlen, freq); |
599 cfg80211_rx_mgmt(vif->ndev, freq, ev->data, dlen, GFP_ATOMIC); | 599 cfg80211_rx_mgmt(vif->ndev, freq, 0, 600 ev->data, dlen, GFP_ATOMIC); |
600 601 return 0; 602} 603 604static int ath6kl_wmi_p2p_info_event_rx(u8 *datap, int len) 605{ 606 struct wmi_p2p_info_event *ev; 607 u32 flags; --- 301 unchanged lines hidden (view full) --- 909 else if (!(((u16) reg_code & WORLD_SKU_MASK) == WORLD_SKU_PREFIX)) { 910 911 regpair = ath6kl_get_regpair((u16) reg_code); 912 country = ath6kl_regd_find_country_by_rd((u16) reg_code); 913 ath6kl_dbg(ATH6KL_DBG_WMI, "Regpair used: 0x%0x\n", 914 regpair->regDmnEnum); 915 } 916 | 601 602 return 0; 603} 604 605static int ath6kl_wmi_p2p_info_event_rx(u8 *datap, int len) 606{ 607 struct wmi_p2p_info_event *ev; 608 u32 flags; --- 301 unchanged lines hidden (view full) --- 910 else if (!(((u16) reg_code & WORLD_SKU_MASK) == WORLD_SKU_PREFIX)) { 911 912 regpair = ath6kl_get_regpair((u16) reg_code); 913 country = ath6kl_regd_find_country_by_rd((u16) reg_code); 914 ath6kl_dbg(ATH6KL_DBG_WMI, "Regpair used: 0x%0x\n", 915 regpair->regDmnEnum); 916 } 917 |
917 if (country && wmi->parent_dev->wiphy_registered) { | 918 if (country) { |
918 alpha2[0] = country->isoName[0]; 919 alpha2[1] = country->isoName[1]; 920 921 regulatory_hint(wmi->parent_dev->wiphy, alpha2); 922 923 ath6kl_dbg(ATH6KL_DBG_WMI, "Country alpha2 being used: %c%c\n", 924 alpha2[0], alpha2[1]); 925 } --- 2082 unchanged lines hidden (view full) --- 3008 memcpy(cm->mac, mac, ETH_ALEN); 3009 cm->reason = cpu_to_le16(reason); 3010 cm->cmd = cmd; 3011 3012 return ath6kl_wmi_cmd_send(wmip, if_idx, skb, WMI_AP_SET_MLME_CMDID, 3013 NO_SYNC_WMIFLAG); 3014} 3015 | 919 alpha2[0] = country->isoName[0]; 920 alpha2[1] = country->isoName[1]; 921 922 regulatory_hint(wmi->parent_dev->wiphy, alpha2); 923 924 ath6kl_dbg(ATH6KL_DBG_WMI, "Country alpha2 being used: %c%c\n", 925 alpha2[0], alpha2[1]); 926 } --- 2082 unchanged lines hidden (view full) --- 3009 memcpy(cm->mac, mac, ETH_ALEN); 3010 cm->reason = cpu_to_le16(reason); 3011 cm->cmd = cmd; 3012 3013 return ath6kl_wmi_cmd_send(wmip, if_idx, skb, WMI_AP_SET_MLME_CMDID, 3014 NO_SYNC_WMIFLAG); 3015} 3016 |
3016int ath6kl_wmi_ap_hidden_ssid(struct wmi *wmi, u8 if_idx, bool enable) 3017{ 3018 struct sk_buff *skb; 3019 struct wmi_ap_hidden_ssid_cmd *cmd; 3020 3021 skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); 3022 if (!skb) 3023 return -ENOMEM; 3024 3025 cmd = (struct wmi_ap_hidden_ssid_cmd *) skb->data; 3026 cmd->hidden_ssid = enable ? 1 : 0; 3027 3028 return ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_AP_HIDDEN_SSID_CMDID, 3029 NO_SYNC_WMIFLAG); 3030} 3031 | |
3032/* This command will be used to enable/disable AP uAPSD feature */ 3033int ath6kl_wmi_ap_set_apsd(struct wmi *wmi, u8 if_idx, u8 enable) 3034{ 3035 struct wmi_ap_set_apsd_cmd *cmd; 3036 struct sk_buff *skb; 3037 3038 skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); 3039 if (!skb) --- 153 unchanged lines hidden (view full) --- 3193 return ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_REMAIN_ON_CHNL_CMDID, 3194 NO_SYNC_WMIFLAG); 3195} 3196 3197/* ath6kl_wmi_send_action_cmd is to be deprecated. Use 3198 * ath6kl_wmi_send_mgmt_cmd instead. The new function supports P2P 3199 * mgmt operations using station interface. 3200 */ | 3017/* This command will be used to enable/disable AP uAPSD feature */ 3018int ath6kl_wmi_ap_set_apsd(struct wmi *wmi, u8 if_idx, u8 enable) 3019{ 3020 struct wmi_ap_set_apsd_cmd *cmd; 3021 struct sk_buff *skb; 3022 3023 skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); 3024 if (!skb) --- 153 unchanged lines hidden (view full) --- 3178 return ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_REMAIN_ON_CHNL_CMDID, 3179 NO_SYNC_WMIFLAG); 3180} 3181 3182/* ath6kl_wmi_send_action_cmd is to be deprecated. Use 3183 * ath6kl_wmi_send_mgmt_cmd instead. The new function supports P2P 3184 * mgmt operations using station interface. 3185 */ |
3201static int ath6kl_wmi_send_action_cmd(struct wmi *wmi, u8 if_idx, u32 id, 3202 u32 freq, u32 wait, const u8 *data, 3203 u16 data_len) | 3186int ath6kl_wmi_send_action_cmd(struct wmi *wmi, u8 if_idx, u32 id, u32 freq, 3187 u32 wait, const u8 *data, u16 data_len) |
3204{ 3205 struct sk_buff *skb; 3206 struct wmi_send_action_cmd *p; 3207 u8 *buf; 3208 3209 if (wait) 3210 return -EINVAL; /* Offload for wait not supported */ 3211 --- 19 unchanged lines hidden (view full) --- 3231 p->freq = cpu_to_le32(freq); 3232 p->wait = cpu_to_le32(wait); 3233 p->len = cpu_to_le16(data_len); 3234 memcpy(p->data, data, data_len); 3235 return ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SEND_ACTION_CMDID, 3236 NO_SYNC_WMIFLAG); 3237} 3238 | 3188{ 3189 struct sk_buff *skb; 3190 struct wmi_send_action_cmd *p; 3191 u8 *buf; 3192 3193 if (wait) 3194 return -EINVAL; /* Offload for wait not supported */ 3195 --- 19 unchanged lines hidden (view full) --- 3215 p->freq = cpu_to_le32(freq); 3216 p->wait = cpu_to_le32(wait); 3217 p->len = cpu_to_le16(data_len); 3218 memcpy(p->data, data, data_len); 3219 return ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SEND_ACTION_CMDID, 3220 NO_SYNC_WMIFLAG); 3221} 3222 |
3239static int __ath6kl_wmi_send_mgmt_cmd(struct wmi *wmi, u8 if_idx, u32 id, 3240 u32 freq, u32 wait, const u8 *data, 3241 u16 data_len, u32 no_cck) | 3223int ath6kl_wmi_send_mgmt_cmd(struct wmi *wmi, u8 if_idx, u32 id, u32 freq, 3224 u32 wait, const u8 *data, u16 data_len, 3225 u32 no_cck) |
3242{ 3243 struct sk_buff *skb; 3244 struct wmi_send_mgmt_cmd *p; 3245 u8 *buf; 3246 3247 if (wait) 3248 return -EINVAL; /* Offload for wait not supported */ 3249 --- 20 unchanged lines hidden (view full) --- 3270 p->wait = cpu_to_le32(wait); 3271 p->no_cck = cpu_to_le32(no_cck); 3272 p->len = cpu_to_le16(data_len); 3273 memcpy(p->data, data, data_len); 3274 return ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SEND_MGMT_CMDID, 3275 NO_SYNC_WMIFLAG); 3276} 3277 | 3226{ 3227 struct sk_buff *skb; 3228 struct wmi_send_mgmt_cmd *p; 3229 u8 *buf; 3230 3231 if (wait) 3232 return -EINVAL; /* Offload for wait not supported */ 3233 --- 20 unchanged lines hidden (view full) --- 3254 p->wait = cpu_to_le32(wait); 3255 p->no_cck = cpu_to_le32(no_cck); 3256 p->len = cpu_to_le16(data_len); 3257 memcpy(p->data, data, data_len); 3258 return ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SEND_MGMT_CMDID, 3259 NO_SYNC_WMIFLAG); 3260} 3261 |
3278int ath6kl_wmi_send_mgmt_cmd(struct wmi *wmi, u8 if_idx, u32 id, u32 freq, 3279 u32 wait, const u8 *data, u16 data_len, 3280 u32 no_cck) 3281{ 3282 int status; 3283 struct ath6kl *ar = wmi->parent_dev; 3284 3285 if (test_bit(ATH6KL_FW_CAPABILITY_STA_P2PDEV_DUPLEX, 3286 ar->fw_capabilities)) { 3287 /* 3288 * If capable of doing P2P mgmt operations using 3289 * station interface, send additional information like 3290 * supported rates to advertise and xmit rates for 3291 * probe requests 3292 */ 3293 status = __ath6kl_wmi_send_mgmt_cmd(ar->wmi, if_idx, id, freq, 3294 wait, data, data_len, 3295 no_cck); 3296 } else { 3297 status = ath6kl_wmi_send_action_cmd(ar->wmi, if_idx, id, freq, 3298 wait, data, data_len); 3299 } 3300 3301 return status; 3302} 3303 | |
3304int ath6kl_wmi_send_probe_response_cmd(struct wmi *wmi, u8 if_idx, u32 freq, 3305 const u8 *dst, const u8 *data, 3306 u16 data_len) 3307{ 3308 struct sk_buff *skb; 3309 struct wmi_p2p_probe_response_cmd *p; 3310 size_t cmd_len = sizeof(*p) + data_len; 3311 --- 95 unchanged lines hidden (view full) --- 3407 return ret; 3408} 3409 3410static int ath6kl_wmi_roam_tbl_event_rx(struct wmi *wmi, u8 *datap, int len) 3411{ 3412 return ath6kl_debug_roam_tbl_event(wmi->parent_dev, datap, len); 3413} 3414 | 3262int ath6kl_wmi_send_probe_response_cmd(struct wmi *wmi, u8 if_idx, u32 freq, 3263 const u8 *dst, const u8 *data, 3264 u16 data_len) 3265{ 3266 struct sk_buff *skb; 3267 struct wmi_p2p_probe_response_cmd *p; 3268 size_t cmd_len = sizeof(*p) + data_len; 3269 --- 95 unchanged lines hidden (view full) --- 3365 return ret; 3366} 3367 3368static int ath6kl_wmi_roam_tbl_event_rx(struct wmi *wmi, u8 *datap, int len) 3369{ 3370 return ath6kl_debug_roam_tbl_event(wmi->parent_dev, datap, len); 3371} 3372 |
3415/* Process interface specific wmi events, caller would free the datap */ 3416static int ath6kl_wmi_proc_events_vif(struct wmi *wmi, u16 if_idx, u16 cmd_id, 3417 u8 *datap, u32 len) | 3373/* Control Path */ 3374int ath6kl_wmi_control_rx(struct wmi *wmi, struct sk_buff *skb) |
3418{ | 3375{ |
3376 struct wmi_cmd_hdr *cmd; |
|
3419 struct ath6kl_vif *vif; | 3377 struct ath6kl_vif *vif; |
3378 u32 len; 3379 u16 id; 3380 u8 if_idx; 3381 u8 *datap; 3382 int ret = 0; |
|
3420 | 3383 |
3421 vif = ath6kl_get_vif_by_index(wmi->parent_dev, if_idx); 3422 if (!vif) { 3423 ath6kl_dbg(ATH6KL_DBG_WMI, 3424 "Wmi event for unavailable vif, vif_index:%d\n", 3425 if_idx); | 3384 if (WARN_ON(skb == NULL)) |
3426 return -EINVAL; | 3385 return -EINVAL; |
3427 } | |
3428 | 3386 |
3429 switch (cmd_id) { 3430 case WMI_CONNECT_EVENTID: 3431 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_CONNECT_EVENTID\n"); 3432 return ath6kl_wmi_connect_event_rx(wmi, datap, len, vif); 3433 case WMI_DISCONNECT_EVENTID: 3434 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_DISCONNECT_EVENTID\n"); 3435 return ath6kl_wmi_disconnect_event_rx(wmi, datap, len, vif); 3436 case WMI_TKIP_MICERR_EVENTID: 3437 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_TKIP_MICERR_EVENTID\n"); 3438 return ath6kl_wmi_tkip_micerr_event_rx(wmi, datap, len, vif); 3439 case WMI_BSSINFO_EVENTID: 3440 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_BSSINFO_EVENTID\n"); 3441 return ath6kl_wmi_bssinfo_event_rx(wmi, datap, len, vif); 3442 case WMI_NEIGHBOR_REPORT_EVENTID: 3443 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_NEIGHBOR_REPORT_EVENTID\n"); 3444 return ath6kl_wmi_neighbor_report_event_rx(wmi, datap, len, 3445 vif); 3446 case WMI_SCAN_COMPLETE_EVENTID: 3447 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_SCAN_COMPLETE_EVENTID\n"); 3448 return ath6kl_wmi_scan_complete_rx(wmi, datap, len, vif); 3449 case WMI_REPORT_STATISTICS_EVENTID: 3450 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REPORT_STATISTICS_EVENTID\n"); 3451 return ath6kl_wmi_stats_event_rx(wmi, datap, len, vif); 3452 case WMI_CAC_EVENTID: 3453 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_CAC_EVENTID\n"); 3454 return ath6kl_wmi_cac_event_rx(wmi, datap, len, vif); 3455 case WMI_PSPOLL_EVENTID: 3456 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_PSPOLL_EVENTID\n"); 3457 return ath6kl_wmi_pspoll_event_rx(wmi, datap, len, vif); 3458 case WMI_DTIMEXPIRY_EVENTID: 3459 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_DTIMEXPIRY_EVENTID\n"); 3460 return ath6kl_wmi_dtimexpiry_event_rx(wmi, datap, len, vif); 3461 case WMI_ADDBA_REQ_EVENTID: 3462 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_ADDBA_REQ_EVENTID\n"); 3463 return ath6kl_wmi_addba_req_event_rx(wmi, datap, len, vif); 3464 case WMI_DELBA_REQ_EVENTID: 3465 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_DELBA_REQ_EVENTID\n"); 3466 return ath6kl_wmi_delba_req_event_rx(wmi, datap, len, vif); 3467 case WMI_SET_HOST_SLEEP_MODE_CMD_PROCESSED_EVENTID: 3468 ath6kl_dbg(ATH6KL_DBG_WMI, 3469 "WMI_SET_HOST_SLEEP_MODE_CMD_PROCESSED_EVENTID"); 3470 return ath6kl_wmi_host_sleep_mode_cmd_prcd_evt_rx(wmi, vif); 3471 case WMI_REMAIN_ON_CHNL_EVENTID: 3472 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REMAIN_ON_CHNL_EVENTID\n"); 3473 return ath6kl_wmi_remain_on_chnl_event_rx(wmi, datap, len, vif); 3474 case WMI_CANCEL_REMAIN_ON_CHNL_EVENTID: 3475 ath6kl_dbg(ATH6KL_DBG_WMI, 3476 "WMI_CANCEL_REMAIN_ON_CHNL_EVENTID\n"); 3477 return ath6kl_wmi_cancel_remain_on_chnl_event_rx(wmi, datap, 3478 len, vif); 3479 case WMI_TX_STATUS_EVENTID: 3480 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_TX_STATUS_EVENTID\n"); 3481 return ath6kl_wmi_tx_status_event_rx(wmi, datap, len, vif); 3482 case WMI_RX_PROBE_REQ_EVENTID: 3483 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_RX_PROBE_REQ_EVENTID\n"); 3484 return ath6kl_wmi_rx_probe_req_event_rx(wmi, datap, len, vif); 3485 case WMI_RX_ACTION_EVENTID: 3486 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_RX_ACTION_EVENTID\n"); 3487 return ath6kl_wmi_rx_action_event_rx(wmi, datap, len, vif); 3488 default: 3489 ath6kl_dbg(ATH6KL_DBG_WMI, "unknown cmd id 0x%x\n", cmd_id); | 3387 if (skb->len < sizeof(struct wmi_cmd_hdr)) { 3388 ath6kl_err("bad packet 1\n"); 3389 dev_kfree_skb(skb); |
3490 return -EINVAL; 3491 } 3492 | 3390 return -EINVAL; 3391 } 3392 |
3493 return 0; 3494} 3495 3496static int ath6kl_wmi_proc_events(struct wmi *wmi, struct sk_buff *skb) 3497{ 3498 struct wmi_cmd_hdr *cmd; 3499 int ret = 0; 3500 u32 len; 3501 u16 id; 3502 u8 if_idx; 3503 u8 *datap; 3504 | |
3505 cmd = (struct wmi_cmd_hdr *) skb->data; 3506 id = le16_to_cpu(cmd->cmd_id); 3507 if_idx = le16_to_cpu(cmd->info1) & WMI_CMD_HDR_IF_ID_MASK; 3508 3509 skb_pull(skb, sizeof(struct wmi_cmd_hdr)); | 3393 cmd = (struct wmi_cmd_hdr *) skb->data; 3394 id = le16_to_cpu(cmd->cmd_id); 3395 if_idx = le16_to_cpu(cmd->info1) & WMI_CMD_HDR_IF_ID_MASK; 3396 3397 skb_pull(skb, sizeof(struct wmi_cmd_hdr)); |
3398 |
|
3510 datap = skb->data; 3511 len = skb->len; 3512 3513 ath6kl_dbg(ATH6KL_DBG_WMI, "wmi rx id %d len %d\n", id, len); 3514 ath6kl_dbg_dump(ATH6KL_DBG_WMI_DUMP, NULL, "wmi rx ", 3515 datap, len); 3516 | 3399 datap = skb->data; 3400 len = skb->len; 3401 3402 ath6kl_dbg(ATH6KL_DBG_WMI, "wmi rx id %d len %d\n", id, len); 3403 ath6kl_dbg_dump(ATH6KL_DBG_WMI_DUMP, NULL, "wmi rx ", 3404 datap, len); 3405 |
3406 vif = ath6kl_get_vif_by_index(wmi->parent_dev, if_idx); 3407 if (!vif) { 3408 ath6kl_dbg(ATH6KL_DBG_WMI, 3409 "Wmi event for unavailable vif, vif_index:%d\n", 3410 if_idx); 3411 dev_kfree_skb(skb); 3412 return -EINVAL; 3413 } 3414 |
|
3517 switch (id) { 3518 case WMI_GET_BITRATE_CMDID: 3519 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_BITRATE_CMDID\n"); 3520 ret = ath6kl_wmi_bitrate_reply_rx(wmi, datap, len); 3521 break; 3522 case WMI_GET_CHANNEL_LIST_CMDID: 3523 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_CHANNEL_LIST_CMDID\n"); 3524 ret = ath6kl_wmi_ch_list_reply_rx(wmi, datap, len); 3525 break; 3526 case WMI_GET_TX_PWR_CMDID: 3527 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_TX_PWR_CMDID\n"); 3528 ret = ath6kl_wmi_tx_pwr_reply_rx(wmi, datap, len); 3529 break; 3530 case WMI_READY_EVENTID: 3531 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_READY_EVENTID\n"); 3532 ret = ath6kl_wmi_ready_event_rx(wmi, datap, len); 3533 break; | 3415 switch (id) { 3416 case WMI_GET_BITRATE_CMDID: 3417 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_BITRATE_CMDID\n"); 3418 ret = ath6kl_wmi_bitrate_reply_rx(wmi, datap, len); 3419 break; 3420 case WMI_GET_CHANNEL_LIST_CMDID: 3421 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_CHANNEL_LIST_CMDID\n"); 3422 ret = ath6kl_wmi_ch_list_reply_rx(wmi, datap, len); 3423 break; 3424 case WMI_GET_TX_PWR_CMDID: 3425 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_TX_PWR_CMDID\n"); 3426 ret = ath6kl_wmi_tx_pwr_reply_rx(wmi, datap, len); 3427 break; 3428 case WMI_READY_EVENTID: 3429 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_READY_EVENTID\n"); 3430 ret = ath6kl_wmi_ready_event_rx(wmi, datap, len); 3431 break; |
3432 case WMI_CONNECT_EVENTID: 3433 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_CONNECT_EVENTID\n"); 3434 ret = ath6kl_wmi_connect_event_rx(wmi, datap, len, vif); 3435 break; 3436 case WMI_DISCONNECT_EVENTID: 3437 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_DISCONNECT_EVENTID\n"); 3438 ret = ath6kl_wmi_disconnect_event_rx(wmi, datap, len, vif); 3439 break; |
|
3534 case WMI_PEER_NODE_EVENTID: 3535 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_PEER_NODE_EVENTID\n"); 3536 ret = ath6kl_wmi_peer_node_event_rx(wmi, datap, len); 3537 break; | 3440 case WMI_PEER_NODE_EVENTID: 3441 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_PEER_NODE_EVENTID\n"); 3442 ret = ath6kl_wmi_peer_node_event_rx(wmi, datap, len); 3443 break; |
3444 case WMI_TKIP_MICERR_EVENTID: 3445 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_TKIP_MICERR_EVENTID\n"); 3446 ret = ath6kl_wmi_tkip_micerr_event_rx(wmi, datap, len, vif); 3447 break; 3448 case WMI_BSSINFO_EVENTID: 3449 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_BSSINFO_EVENTID\n"); 3450 ret = ath6kl_wmi_bssinfo_event_rx(wmi, datap, len, vif); 3451 break; |
|
3538 case WMI_REGDOMAIN_EVENTID: 3539 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REGDOMAIN_EVENTID\n"); 3540 ath6kl_wmi_regdomain_event(wmi, datap, len); 3541 break; 3542 case WMI_PSTREAM_TIMEOUT_EVENTID: 3543 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_PSTREAM_TIMEOUT_EVENTID\n"); 3544 ret = ath6kl_wmi_pstream_timeout_event_rx(wmi, datap, len); 3545 break; | 3452 case WMI_REGDOMAIN_EVENTID: 3453 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REGDOMAIN_EVENTID\n"); 3454 ath6kl_wmi_regdomain_event(wmi, datap, len); 3455 break; 3456 case WMI_PSTREAM_TIMEOUT_EVENTID: 3457 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_PSTREAM_TIMEOUT_EVENTID\n"); 3458 ret = ath6kl_wmi_pstream_timeout_event_rx(wmi, datap, len); 3459 break; |
3460 case WMI_NEIGHBOR_REPORT_EVENTID: 3461 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_NEIGHBOR_REPORT_EVENTID\n"); 3462 ret = ath6kl_wmi_neighbor_report_event_rx(wmi, datap, len, 3463 vif); 3464 break; 3465 case WMI_SCAN_COMPLETE_EVENTID: 3466 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_SCAN_COMPLETE_EVENTID\n"); 3467 ret = ath6kl_wmi_scan_complete_rx(wmi, datap, len, vif); 3468 break; |
|
3546 case WMI_CMDERROR_EVENTID: 3547 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_CMDERROR_EVENTID\n"); 3548 ret = ath6kl_wmi_error_event_rx(wmi, datap, len); 3549 break; | 3469 case WMI_CMDERROR_EVENTID: 3470 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_CMDERROR_EVENTID\n"); 3471 ret = ath6kl_wmi_error_event_rx(wmi, datap, len); 3472 break; |
3473 case WMI_REPORT_STATISTICS_EVENTID: 3474 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REPORT_STATISTICS_EVENTID\n"); 3475 ret = ath6kl_wmi_stats_event_rx(wmi, datap, len, vif); 3476 break; |
|
3550 case WMI_RSSI_THRESHOLD_EVENTID: 3551 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_RSSI_THRESHOLD_EVENTID\n"); 3552 ret = ath6kl_wmi_rssi_threshold_event_rx(wmi, datap, len); 3553 break; 3554 case WMI_ERROR_REPORT_EVENTID: 3555 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_ERROR_REPORT_EVENTID\n"); 3556 break; 3557 case WMI_OPT_RX_FRAME_EVENTID: 3558 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_OPT_RX_FRAME_EVENTID\n"); 3559 /* this event has been deprecated */ 3560 break; 3561 case WMI_REPORT_ROAM_TBL_EVENTID: 3562 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REPORT_ROAM_TBL_EVENTID\n"); 3563 ret = ath6kl_wmi_roam_tbl_event_rx(wmi, datap, len); 3564 break; 3565 case WMI_EXTENSION_EVENTID: 3566 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_EXTENSION_EVENTID\n"); 3567 ret = ath6kl_wmi_control_rx_xtnd(wmi, skb); 3568 break; | 3477 case WMI_RSSI_THRESHOLD_EVENTID: 3478 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_RSSI_THRESHOLD_EVENTID\n"); 3479 ret = ath6kl_wmi_rssi_threshold_event_rx(wmi, datap, len); 3480 break; 3481 case WMI_ERROR_REPORT_EVENTID: 3482 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_ERROR_REPORT_EVENTID\n"); 3483 break; 3484 case WMI_OPT_RX_FRAME_EVENTID: 3485 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_OPT_RX_FRAME_EVENTID\n"); 3486 /* this event has been deprecated */ 3487 break; 3488 case WMI_REPORT_ROAM_TBL_EVENTID: 3489 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REPORT_ROAM_TBL_EVENTID\n"); 3490 ret = ath6kl_wmi_roam_tbl_event_rx(wmi, datap, len); 3491 break; 3492 case WMI_EXTENSION_EVENTID: 3493 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_EXTENSION_EVENTID\n"); 3494 ret = ath6kl_wmi_control_rx_xtnd(wmi, skb); 3495 break; |
3496 case WMI_CAC_EVENTID: 3497 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_CAC_EVENTID\n"); 3498 ret = ath6kl_wmi_cac_event_rx(wmi, datap, len, vif); 3499 break; |
|
3569 case WMI_CHANNEL_CHANGE_EVENTID: 3570 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_CHANNEL_CHANGE_EVENTID\n"); 3571 break; 3572 case WMI_REPORT_ROAM_DATA_EVENTID: 3573 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REPORT_ROAM_DATA_EVENTID\n"); 3574 break; 3575 case WMI_TEST_EVENTID: 3576 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_TEST_EVENTID\n"); --- 23 unchanged lines hidden (view full) --- 3600 break; 3601 case WMI_GET_WOW_LIST_EVENTID: 3602 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_WOW_LIST_EVENTID\n"); 3603 break; 3604 case WMI_GET_PMKID_LIST_EVENTID: 3605 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_PMKID_LIST_EVENTID\n"); 3606 ret = ath6kl_wmi_get_pmkid_list_event_rx(wmi, datap, len); 3607 break; | 3500 case WMI_CHANNEL_CHANGE_EVENTID: 3501 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_CHANNEL_CHANGE_EVENTID\n"); 3502 break; 3503 case WMI_REPORT_ROAM_DATA_EVENTID: 3504 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REPORT_ROAM_DATA_EVENTID\n"); 3505 break; 3506 case WMI_TEST_EVENTID: 3507 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_TEST_EVENTID\n"); --- 23 unchanged lines hidden (view full) --- 3531 break; 3532 case WMI_GET_WOW_LIST_EVENTID: 3533 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_WOW_LIST_EVENTID\n"); 3534 break; 3535 case WMI_GET_PMKID_LIST_EVENTID: 3536 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_PMKID_LIST_EVENTID\n"); 3537 ret = ath6kl_wmi_get_pmkid_list_event_rx(wmi, datap, len); 3538 break; |
3539 case WMI_PSPOLL_EVENTID: 3540 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_PSPOLL_EVENTID\n"); 3541 ret = ath6kl_wmi_pspoll_event_rx(wmi, datap, len, vif); 3542 break; 3543 case WMI_DTIMEXPIRY_EVENTID: 3544 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_DTIMEXPIRY_EVENTID\n"); 3545 ret = ath6kl_wmi_dtimexpiry_event_rx(wmi, datap, len, vif); 3546 break; |
|
3608 case WMI_SET_PARAMS_REPLY_EVENTID: 3609 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_SET_PARAMS_REPLY_EVENTID\n"); 3610 break; | 3547 case WMI_SET_PARAMS_REPLY_EVENTID: 3548 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_SET_PARAMS_REPLY_EVENTID\n"); 3549 break; |
3550 case WMI_ADDBA_REQ_EVENTID: 3551 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_ADDBA_REQ_EVENTID\n"); 3552 ret = ath6kl_wmi_addba_req_event_rx(wmi, datap, len, vif); 3553 break; |
|
3611 case WMI_ADDBA_RESP_EVENTID: 3612 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_ADDBA_RESP_EVENTID\n"); 3613 break; | 3554 case WMI_ADDBA_RESP_EVENTID: 3555 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_ADDBA_RESP_EVENTID\n"); 3556 break; |
3557 case WMI_DELBA_REQ_EVENTID: 3558 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_DELBA_REQ_EVENTID\n"); 3559 ret = ath6kl_wmi_delba_req_event_rx(wmi, datap, len, vif); 3560 break; |
|
3614 case WMI_REPORT_BTCOEX_CONFIG_EVENTID: 3615 ath6kl_dbg(ATH6KL_DBG_WMI, 3616 "WMI_REPORT_BTCOEX_CONFIG_EVENTID\n"); 3617 break; 3618 case WMI_REPORT_BTCOEX_STATS_EVENTID: 3619 ath6kl_dbg(ATH6KL_DBG_WMI, 3620 "WMI_REPORT_BTCOEX_STATS_EVENTID\n"); 3621 break; 3622 case WMI_TX_COMPLETE_EVENTID: 3623 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_TX_COMPLETE_EVENTID\n"); 3624 ret = ath6kl_wmi_tx_complete_event_rx(datap, len); 3625 break; | 3561 case WMI_REPORT_BTCOEX_CONFIG_EVENTID: 3562 ath6kl_dbg(ATH6KL_DBG_WMI, 3563 "WMI_REPORT_BTCOEX_CONFIG_EVENTID\n"); 3564 break; 3565 case WMI_REPORT_BTCOEX_STATS_EVENTID: 3566 ath6kl_dbg(ATH6KL_DBG_WMI, 3567 "WMI_REPORT_BTCOEX_STATS_EVENTID\n"); 3568 break; 3569 case WMI_TX_COMPLETE_EVENTID: 3570 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_TX_COMPLETE_EVENTID\n"); 3571 ret = ath6kl_wmi_tx_complete_event_rx(datap, len); 3572 break; |
3573 case WMI_SET_HOST_SLEEP_MODE_CMD_PROCESSED_EVENTID: 3574 ath6kl_dbg(ATH6KL_DBG_WMI, 3575 "WMI_SET_HOST_SLEEP_MODE_CMD_PROCESSED_EVENTID"); 3576 ret = ath6kl_wmi_host_sleep_mode_cmd_prcd_evt_rx(wmi, vif); 3577 break; 3578 case WMI_REMAIN_ON_CHNL_EVENTID: 3579 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REMAIN_ON_CHNL_EVENTID\n"); 3580 ret = ath6kl_wmi_remain_on_chnl_event_rx(wmi, datap, len, vif); 3581 break; 3582 case WMI_CANCEL_REMAIN_ON_CHNL_EVENTID: 3583 ath6kl_dbg(ATH6KL_DBG_WMI, 3584 "WMI_CANCEL_REMAIN_ON_CHNL_EVENTID\n"); 3585 ret = ath6kl_wmi_cancel_remain_on_chnl_event_rx(wmi, datap, 3586 len, vif); 3587 break; 3588 case WMI_TX_STATUS_EVENTID: 3589 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_TX_STATUS_EVENTID\n"); 3590 ret = ath6kl_wmi_tx_status_event_rx(wmi, datap, len, vif); 3591 break; 3592 case WMI_RX_PROBE_REQ_EVENTID: 3593 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_RX_PROBE_REQ_EVENTID\n"); 3594 ret = ath6kl_wmi_rx_probe_req_event_rx(wmi, datap, len, vif); 3595 break; |
|
3626 case WMI_P2P_CAPABILITIES_EVENTID: 3627 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_P2P_CAPABILITIES_EVENTID\n"); 3628 ret = ath6kl_wmi_p2p_capabilities_event_rx(datap, len); 3629 break; | 3596 case WMI_P2P_CAPABILITIES_EVENTID: 3597 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_P2P_CAPABILITIES_EVENTID\n"); 3598 ret = ath6kl_wmi_p2p_capabilities_event_rx(datap, len); 3599 break; |
3600 case WMI_RX_ACTION_EVENTID: 3601 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_RX_ACTION_EVENTID\n"); 3602 ret = ath6kl_wmi_rx_action_event_rx(wmi, datap, len, vif); 3603 break; |
|
3630 case WMI_P2P_INFO_EVENTID: 3631 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_P2P_INFO_EVENTID\n"); 3632 ret = ath6kl_wmi_p2p_info_event_rx(datap, len); 3633 break; 3634 default: | 3604 case WMI_P2P_INFO_EVENTID: 3605 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_P2P_INFO_EVENTID\n"); 3606 ret = ath6kl_wmi_p2p_info_event_rx(datap, len); 3607 break; 3608 default: |
3635 /* may be the event is interface specific */ 3636 ret = ath6kl_wmi_proc_events_vif(wmi, if_idx, id, datap, len); | 3609 ath6kl_dbg(ATH6KL_DBG_WMI, "unknown cmd id 0x%x\n", id); 3610 ret = -EINVAL; |
3637 break; 3638 } 3639 3640 dev_kfree_skb(skb); | 3611 break; 3612 } 3613 3614 dev_kfree_skb(skb); |
3615 |
|
3641 return ret; 3642} 3643 | 3616 return ret; 3617} 3618 |
3644/* Control Path */ 3645int ath6kl_wmi_control_rx(struct wmi *wmi, struct sk_buff *skb) 3646{ 3647 if (WARN_ON(skb == NULL)) 3648 return -EINVAL; 3649 3650 if (skb->len < sizeof(struct wmi_cmd_hdr)) { 3651 ath6kl_err("bad packet 1\n"); 3652 dev_kfree_skb(skb); 3653 return -EINVAL; 3654 } 3655 3656 return ath6kl_wmi_proc_events(wmi, skb); 3657} 3658 | |
3659void ath6kl_wmi_reset(struct wmi *wmi) 3660{ 3661 spin_lock_bh(&wmi->lock); 3662 3663 wmi->fat_pipe_exist = 0; 3664 memset(wmi->stream_exist_for_ac, 0, sizeof(wmi->stream_exist_for_ac)); 3665 3666 spin_unlock_bh(&wmi->lock); --- 29 unchanged lines hidden --- | 3619void ath6kl_wmi_reset(struct wmi *wmi) 3620{ 3621 spin_lock_bh(&wmi->lock); 3622 3623 wmi->fat_pipe_exist = 0; 3624 memset(wmi->stream_exist_for_ac, 0, sizeof(wmi->stream_exist_for_ac)); 3625 3626 spin_unlock_bh(&wmi->lock); --- 29 unchanged lines hidden --- |