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