wmi.c (804483e90794256f9ed53e795ffbf1e94de237c8) | wmi.c (ce0dc0cfeac9fde9964fa4b07aecd7cc604060e0) |
---|---|
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. |
|
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) | 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) |
559 cfg80211_rx_mgmt(vif->ndev, freq, 0, 560 ev->data, dlen, GFP_ATOMIC); | 560 cfg80211_rx_mgmt(vif->ndev, freq, 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, 0, 600 ev->data, dlen, GFP_ATOMIC); | 599 cfg80211_rx_mgmt(vif->ndev, freq, ev->data, dlen, GFP_ATOMIC); |
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 | 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 |
918 if (country) { | 917 if (country && wmi->parent_dev->wiphy_registered) { |
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 } --- 1096 unchanged lines hidden (view full) --- 2023 cmd->listen_intvl = cpu_to_le16(listen_interval); 2024 cmd->num_beacons = cpu_to_le16(listen_beacons); 2025 2026 ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_LISTEN_INT_CMDID, 2027 NO_SYNC_WMIFLAG); 2028 return ret; 2029} 2030 | 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 } --- 1096 unchanged lines hidden (view full) --- 2022 cmd->listen_intvl = cpu_to_le16(listen_interval); 2023 cmd->num_beacons = cpu_to_le16(listen_beacons); 2024 2025 ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_LISTEN_INT_CMDID, 2026 NO_SYNC_WMIFLAG); 2027 return ret; 2028} 2029 |
2030int ath6kl_wmi_bmisstime_cmd(struct wmi *wmi, u8 if_idx, 2031 u16 bmiss_time, u16 num_beacons) 2032{ 2033 struct sk_buff *skb; 2034 struct wmi_bmiss_time_cmd *cmd; 2035 int ret; 2036 2037 skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); 2038 if (!skb) 2039 return -ENOMEM; 2040 2041 cmd = (struct wmi_bmiss_time_cmd *) skb->data; 2042 cmd->bmiss_time = cpu_to_le16(bmiss_time); 2043 cmd->num_beacons = cpu_to_le16(num_beacons); 2044 2045 ret = ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_BMISS_TIME_CMDID, 2046 NO_SYNC_WMIFLAG); 2047 return ret; 2048} 2049 |
|
2031int ath6kl_wmi_powermode_cmd(struct wmi *wmi, u8 if_idx, u8 pwr_mode) 2032{ 2033 struct sk_buff *skb; 2034 struct wmi_power_mode_cmd *cmd; 2035 int ret; 2036 2037 skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); 2038 if (!skb) --- 970 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 | 2050int ath6kl_wmi_powermode_cmd(struct wmi *wmi, u8 if_idx, u8 pwr_mode) 2051{ 2052 struct sk_buff *skb; 2053 struct wmi_power_mode_cmd *cmd; 2054 int ret; 2055 2056 skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); 2057 if (!skb) --- 970 unchanged lines hidden (view full) --- 3028 memcpy(cm->mac, mac, ETH_ALEN); 3029 cm->reason = cpu_to_le16(reason); 3030 cm->cmd = cmd; 3031 3032 return ath6kl_wmi_cmd_send(wmip, if_idx, skb, WMI_AP_SET_MLME_CMDID, 3033 NO_SYNC_WMIFLAG); 3034} 3035 |
3036int ath6kl_wmi_ap_hidden_ssid(struct wmi *wmi, u8 if_idx, bool enable) 3037{ 3038 struct sk_buff *skb; 3039 struct wmi_ap_hidden_ssid_cmd *cmd; 3040 3041 skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); 3042 if (!skb) 3043 return -ENOMEM; 3044 3045 cmd = (struct wmi_ap_hidden_ssid_cmd *) skb->data; 3046 cmd->hidden_ssid = enable ? 1 : 0; 3047 3048 return ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_AP_HIDDEN_SSID_CMDID, 3049 NO_SYNC_WMIFLAG); 3050} 3051 |
|
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 */ | 3052/* This command will be used to enable/disable AP uAPSD feature */ 3053int ath6kl_wmi_ap_set_apsd(struct wmi *wmi, u8 if_idx, u8 enable) 3054{ 3055 struct wmi_ap_set_apsd_cmd *cmd; 3056 struct sk_buff *skb; 3057 3058 skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); 3059 if (!skb) --- 153 unchanged lines hidden (view full) --- 3213 return ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_REMAIN_ON_CHNL_CMDID, 3214 NO_SYNC_WMIFLAG); 3215} 3216 3217/* ath6kl_wmi_send_action_cmd is to be deprecated. Use 3218 * ath6kl_wmi_send_mgmt_cmd instead. The new function supports P2P 3219 * mgmt operations using station interface. 3220 */ |
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) | 3221static int ath6kl_wmi_send_action_cmd(struct wmi *wmi, u8 if_idx, u32 id, 3222 u32 freq, u32 wait, const u8 *data, 3223 u16 data_len) |
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 | 3224{ 3225 struct sk_buff *skb; 3226 struct wmi_send_action_cmd *p; 3227 u8 *buf; 3228 3229 if (wait) 3230 return -EINVAL; /* Offload for wait not supported */ 3231 --- 19 unchanged lines hidden (view full) --- 3251 p->freq = cpu_to_le32(freq); 3252 p->wait = cpu_to_le32(wait); 3253 p->len = cpu_to_le16(data_len); 3254 memcpy(p->data, data, data_len); 3255 return ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SEND_ACTION_CMDID, 3256 NO_SYNC_WMIFLAG); 3257} 3258 |
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) | 3259static int __ath6kl_wmi_send_mgmt_cmd(struct wmi *wmi, u8 if_idx, u32 id, 3260 u32 freq, u32 wait, const u8 *data, 3261 u16 data_len, u32 no_cck) |
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 | 3262{ 3263 struct sk_buff *skb; 3264 struct wmi_send_mgmt_cmd *p; 3265 u8 *buf; 3266 3267 if (wait) 3268 return -EINVAL; /* Offload for wait not supported */ 3269 --- 20 unchanged lines hidden (view full) --- 3290 p->wait = cpu_to_le32(wait); 3291 p->no_cck = cpu_to_le32(no_cck); 3292 p->len = cpu_to_le16(data_len); 3293 memcpy(p->data, data, data_len); 3294 return ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SEND_MGMT_CMDID, 3295 NO_SYNC_WMIFLAG); 3296} 3297 |
3298int ath6kl_wmi_send_mgmt_cmd(struct wmi *wmi, u8 if_idx, u32 id, u32 freq, 3299 u32 wait, const u8 *data, u16 data_len, 3300 u32 no_cck) 3301{ 3302 int status; 3303 struct ath6kl *ar = wmi->parent_dev; 3304 3305 if (test_bit(ATH6KL_FW_CAPABILITY_STA_P2PDEV_DUPLEX, 3306 ar->fw_capabilities)) { 3307 /* 3308 * If capable of doing P2P mgmt operations using 3309 * station interface, send additional information like 3310 * supported rates to advertise and xmit rates for 3311 * probe requests 3312 */ 3313 status = __ath6kl_wmi_send_mgmt_cmd(ar->wmi, if_idx, id, freq, 3314 wait, data, data_len, 3315 no_cck); 3316 } else { 3317 status = ath6kl_wmi_send_action_cmd(ar->wmi, if_idx, id, freq, 3318 wait, data, data_len); 3319 } 3320 3321 return status; 3322} 3323 |
|
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 | 3324int ath6kl_wmi_send_probe_response_cmd(struct wmi *wmi, u8 if_idx, u32 freq, 3325 const u8 *dst, const u8 *data, 3326 u16 data_len) 3327{ 3328 struct sk_buff *skb; 3329 struct wmi_p2p_probe_response_cmd *p; 3330 size_t cmd_len = sizeof(*p) + data_len; 3331 --- 95 unchanged lines hidden (view full) --- 3427 return ret; 3428} 3429 3430static int ath6kl_wmi_roam_tbl_event_rx(struct wmi *wmi, u8 *datap, int len) 3431{ 3432 return ath6kl_debug_roam_tbl_event(wmi->parent_dev, datap, len); 3433} 3434 |
3373/* Control Path */ 3374int ath6kl_wmi_control_rx(struct wmi *wmi, struct sk_buff *skb) | 3435/* Process interface specific wmi events, caller would free the datap */ 3436static int ath6kl_wmi_proc_events_vif(struct wmi *wmi, u16 if_idx, u16 cmd_id, 3437 u8 *datap, u32 len) |
3375{ | 3438{ |
3376 struct wmi_cmd_hdr *cmd; | |
3377 struct ath6kl_vif *vif; | 3439 struct ath6kl_vif *vif; |
3378 u32 len; 3379 u16 id; 3380 u8 if_idx; 3381 u8 *datap; 3382 int ret = 0; | |
3383 | 3440 |
3384 if (WARN_ON(skb == NULL)) | 3441 vif = ath6kl_get_vif_by_index(wmi->parent_dev, if_idx); 3442 if (!vif) { 3443 ath6kl_dbg(ATH6KL_DBG_WMI, 3444 "Wmi event for unavailable vif, vif_index:%d\n", 3445 if_idx); |
3385 return -EINVAL; | 3446 return -EINVAL; |
3447 } |
|
3386 | 3448 |
3387 if (skb->len < sizeof(struct wmi_cmd_hdr)) { 3388 ath6kl_err("bad packet 1\n"); 3389 dev_kfree_skb(skb); | 3449 switch (cmd_id) { 3450 case WMI_CONNECT_EVENTID: 3451 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_CONNECT_EVENTID\n"); 3452 return ath6kl_wmi_connect_event_rx(wmi, datap, len, vif); 3453 case WMI_DISCONNECT_EVENTID: 3454 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_DISCONNECT_EVENTID\n"); 3455 return ath6kl_wmi_disconnect_event_rx(wmi, datap, len, vif); 3456 case WMI_TKIP_MICERR_EVENTID: 3457 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_TKIP_MICERR_EVENTID\n"); 3458 return ath6kl_wmi_tkip_micerr_event_rx(wmi, datap, len, vif); 3459 case WMI_BSSINFO_EVENTID: 3460 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_BSSINFO_EVENTID\n"); 3461 return ath6kl_wmi_bssinfo_event_rx(wmi, datap, len, vif); 3462 case WMI_NEIGHBOR_REPORT_EVENTID: 3463 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_NEIGHBOR_REPORT_EVENTID\n"); 3464 return ath6kl_wmi_neighbor_report_event_rx(wmi, datap, len, 3465 vif); 3466 case WMI_SCAN_COMPLETE_EVENTID: 3467 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_SCAN_COMPLETE_EVENTID\n"); 3468 return ath6kl_wmi_scan_complete_rx(wmi, datap, len, vif); 3469 case WMI_REPORT_STATISTICS_EVENTID: 3470 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REPORT_STATISTICS_EVENTID\n"); 3471 return ath6kl_wmi_stats_event_rx(wmi, datap, len, vif); 3472 case WMI_CAC_EVENTID: 3473 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_CAC_EVENTID\n"); 3474 return ath6kl_wmi_cac_event_rx(wmi, datap, len, vif); 3475 case WMI_PSPOLL_EVENTID: 3476 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_PSPOLL_EVENTID\n"); 3477 return ath6kl_wmi_pspoll_event_rx(wmi, datap, len, vif); 3478 case WMI_DTIMEXPIRY_EVENTID: 3479 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_DTIMEXPIRY_EVENTID\n"); 3480 return ath6kl_wmi_dtimexpiry_event_rx(wmi, datap, len, vif); 3481 case WMI_ADDBA_REQ_EVENTID: 3482 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_ADDBA_REQ_EVENTID\n"); 3483 return ath6kl_wmi_addba_req_event_rx(wmi, datap, len, vif); 3484 case WMI_DELBA_REQ_EVENTID: 3485 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_DELBA_REQ_EVENTID\n"); 3486 return ath6kl_wmi_delba_req_event_rx(wmi, datap, len, vif); 3487 case WMI_SET_HOST_SLEEP_MODE_CMD_PROCESSED_EVENTID: 3488 ath6kl_dbg(ATH6KL_DBG_WMI, 3489 "WMI_SET_HOST_SLEEP_MODE_CMD_PROCESSED_EVENTID"); 3490 return ath6kl_wmi_host_sleep_mode_cmd_prcd_evt_rx(wmi, vif); 3491 case WMI_REMAIN_ON_CHNL_EVENTID: 3492 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REMAIN_ON_CHNL_EVENTID\n"); 3493 return ath6kl_wmi_remain_on_chnl_event_rx(wmi, datap, len, vif); 3494 case WMI_CANCEL_REMAIN_ON_CHNL_EVENTID: 3495 ath6kl_dbg(ATH6KL_DBG_WMI, 3496 "WMI_CANCEL_REMAIN_ON_CHNL_EVENTID\n"); 3497 return ath6kl_wmi_cancel_remain_on_chnl_event_rx(wmi, datap, 3498 len, vif); 3499 case WMI_TX_STATUS_EVENTID: 3500 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_TX_STATUS_EVENTID\n"); 3501 return ath6kl_wmi_tx_status_event_rx(wmi, datap, len, vif); 3502 case WMI_RX_PROBE_REQ_EVENTID: 3503 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_RX_PROBE_REQ_EVENTID\n"); 3504 return ath6kl_wmi_rx_probe_req_event_rx(wmi, datap, len, vif); 3505 case WMI_RX_ACTION_EVENTID: 3506 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_RX_ACTION_EVENTID\n"); 3507 return ath6kl_wmi_rx_action_event_rx(wmi, datap, len, vif); 3508 default: 3509 ath6kl_dbg(ATH6KL_DBG_WMI, "unknown cmd id 0x%x\n", cmd_id); |
3390 return -EINVAL; 3391 } 3392 | 3510 return -EINVAL; 3511 } 3512 |
3513 return 0; 3514} 3515 3516static int ath6kl_wmi_proc_events(struct wmi *wmi, struct sk_buff *skb) 3517{ 3518 struct wmi_cmd_hdr *cmd; 3519 int ret = 0; 3520 u32 len; 3521 u16 id; 3522 u8 if_idx; 3523 u8 *datap; 3524 |
|
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)); | 3525 cmd = (struct wmi_cmd_hdr *) skb->data; 3526 id = le16_to_cpu(cmd->cmd_id); 3527 if_idx = le16_to_cpu(cmd->info1) & WMI_CMD_HDR_IF_ID_MASK; 3528 3529 skb_pull(skb, sizeof(struct wmi_cmd_hdr)); |
3398 | |
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 | 3530 datap = skb->data; 3531 len = skb->len; 3532 3533 ath6kl_dbg(ATH6KL_DBG_WMI, "wmi rx id %d len %d\n", id, len); 3534 ath6kl_dbg_dump(ATH6KL_DBG_WMI_DUMP, NULL, "wmi rx ", 3535 datap, len); 3536 |
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 | |
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; | 3537 switch (id) { 3538 case WMI_GET_BITRATE_CMDID: 3539 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_BITRATE_CMDID\n"); 3540 ret = ath6kl_wmi_bitrate_reply_rx(wmi, datap, len); 3541 break; 3542 case WMI_GET_CHANNEL_LIST_CMDID: 3543 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_CHANNEL_LIST_CMDID\n"); 3544 ret = ath6kl_wmi_ch_list_reply_rx(wmi, datap, len); 3545 break; 3546 case WMI_GET_TX_PWR_CMDID: 3547 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_TX_PWR_CMDID\n"); 3548 ret = ath6kl_wmi_tx_pwr_reply_rx(wmi, datap, len); 3549 break; 3550 case WMI_READY_EVENTID: 3551 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_READY_EVENTID\n"); 3552 ret = ath6kl_wmi_ready_event_rx(wmi, datap, len); 3553 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; | |
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; | 3554 case WMI_PEER_NODE_EVENTID: 3555 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_PEER_NODE_EVENTID\n"); 3556 ret = ath6kl_wmi_peer_node_event_rx(wmi, datap, len); 3557 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; | |
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; | 3558 case WMI_REGDOMAIN_EVENTID: 3559 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REGDOMAIN_EVENTID\n"); 3560 ath6kl_wmi_regdomain_event(wmi, datap, len); 3561 break; 3562 case WMI_PSTREAM_TIMEOUT_EVENTID: 3563 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_PSTREAM_TIMEOUT_EVENTID\n"); 3564 ret = ath6kl_wmi_pstream_timeout_event_rx(wmi, datap, len); 3565 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; | |
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; | 3566 case WMI_CMDERROR_EVENTID: 3567 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_CMDERROR_EVENTID\n"); 3568 ret = ath6kl_wmi_error_event_rx(wmi, datap, len); 3569 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; | |
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; | 3570 case WMI_RSSI_THRESHOLD_EVENTID: 3571 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_RSSI_THRESHOLD_EVENTID\n"); 3572 ret = ath6kl_wmi_rssi_threshold_event_rx(wmi, datap, len); 3573 break; 3574 case WMI_ERROR_REPORT_EVENTID: 3575 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_ERROR_REPORT_EVENTID\n"); 3576 break; 3577 case WMI_OPT_RX_FRAME_EVENTID: 3578 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_OPT_RX_FRAME_EVENTID\n"); 3579 /* this event has been deprecated */ 3580 break; 3581 case WMI_REPORT_ROAM_TBL_EVENTID: 3582 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REPORT_ROAM_TBL_EVENTID\n"); 3583 ret = ath6kl_wmi_roam_tbl_event_rx(wmi, datap, len); 3584 break; 3585 case WMI_EXTENSION_EVENTID: 3586 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_EXTENSION_EVENTID\n"); 3587 ret = ath6kl_wmi_control_rx_xtnd(wmi, skb); 3588 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; | |
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; | 3589 case WMI_CHANNEL_CHANGE_EVENTID: 3590 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_CHANNEL_CHANGE_EVENTID\n"); 3591 break; 3592 case WMI_REPORT_ROAM_DATA_EVENTID: 3593 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REPORT_ROAM_DATA_EVENTID\n"); 3594 break; 3595 case WMI_TEST_EVENTID: 3596 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_TEST_EVENTID\n"); --- 23 unchanged lines hidden (view full) --- 3620 break; 3621 case WMI_GET_WOW_LIST_EVENTID: 3622 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_WOW_LIST_EVENTID\n"); 3623 break; 3624 case WMI_GET_PMKID_LIST_EVENTID: 3625 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_PMKID_LIST_EVENTID\n"); 3626 ret = ath6kl_wmi_get_pmkid_list_event_rx(wmi, datap, len); 3627 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; | |
3547 case WMI_SET_PARAMS_REPLY_EVENTID: 3548 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_SET_PARAMS_REPLY_EVENTID\n"); 3549 break; | 3628 case WMI_SET_PARAMS_REPLY_EVENTID: 3629 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_SET_PARAMS_REPLY_EVENTID\n"); 3630 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; | |
3554 case WMI_ADDBA_RESP_EVENTID: 3555 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_ADDBA_RESP_EVENTID\n"); 3556 break; | 3631 case WMI_ADDBA_RESP_EVENTID: 3632 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_ADDBA_RESP_EVENTID\n"); 3633 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; | |
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; | 3634 case WMI_REPORT_BTCOEX_CONFIG_EVENTID: 3635 ath6kl_dbg(ATH6KL_DBG_WMI, 3636 "WMI_REPORT_BTCOEX_CONFIG_EVENTID\n"); 3637 break; 3638 case WMI_REPORT_BTCOEX_STATS_EVENTID: 3639 ath6kl_dbg(ATH6KL_DBG_WMI, 3640 "WMI_REPORT_BTCOEX_STATS_EVENTID\n"); 3641 break; 3642 case WMI_TX_COMPLETE_EVENTID: 3643 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_TX_COMPLETE_EVENTID\n"); 3644 ret = ath6kl_wmi_tx_complete_event_rx(datap, len); 3645 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; | |
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; | 3646 case WMI_P2P_CAPABILITIES_EVENTID: 3647 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_P2P_CAPABILITIES_EVENTID\n"); 3648 ret = ath6kl_wmi_p2p_capabilities_event_rx(datap, len); 3649 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; | |
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: | 3650 case WMI_P2P_INFO_EVENTID: 3651 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_P2P_INFO_EVENTID\n"); 3652 ret = ath6kl_wmi_p2p_info_event_rx(datap, len); 3653 break; 3654 default: |
3609 ath6kl_dbg(ATH6KL_DBG_WMI, "unknown cmd id 0x%x\n", id); 3610 ret = -EINVAL; | 3655 /* may be the event is interface specific */ 3656 ret = ath6kl_wmi_proc_events_vif(wmi, if_idx, id, datap, len); |
3611 break; 3612 } 3613 3614 dev_kfree_skb(skb); | 3657 break; 3658 } 3659 3660 dev_kfree_skb(skb); |
3615 | |
3616 return ret; 3617} 3618 | 3661 return ret; 3662} 3663 |
3664/* Control Path */ 3665int ath6kl_wmi_control_rx(struct wmi *wmi, struct sk_buff *skb) 3666{ 3667 if (WARN_ON(skb == NULL)) 3668 return -EINVAL; 3669 3670 if (skb->len < sizeof(struct wmi_cmd_hdr)) { 3671 ath6kl_err("bad packet 1\n"); 3672 dev_kfree_skb(skb); 3673 return -EINVAL; 3674 } 3675 3676 return ath6kl_wmi_proc_events(wmi, skb); 3677} 3678 |
|
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 --- | 3679void ath6kl_wmi_reset(struct wmi *wmi) 3680{ 3681 spin_lock_bh(&wmi->lock); 3682 3683 wmi->fat_pipe_exist = 0; 3684 memset(wmi->stream_exist_for_ac, 0, sizeof(wmi->stream_exist_for_ac)); 3685 3686 spin_unlock_bh(&wmi->lock); --- 29 unchanged lines hidden --- |