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 ---