wmi.c (ef094103233344271990d15045d6a776386c3784) wmi.c (b9b6ee603923be45c4022a0dce5fa8ccf4284524)
1/*
2 * Copyright (c) 2004-2011 Atheros Communications 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

--- 707 unchanged lines hidden (view full) ---

716 ev->u.ap_sta.auth, ev->assoc_req_len,
717 ev->assoc_info + ev->beacon_ie_len);
718 }
719 return 0;
720 }
721
722 /* STA/IBSS mode connection event */
723
1/*
2 * Copyright (c) 2004-2011 Atheros Communications 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

--- 707 unchanged lines hidden (view full) ---

716 ev->u.ap_sta.auth, ev->assoc_req_len,
717 ev->assoc_info + ev->beacon_ie_len);
718 }
719 return 0;
720 }
721
722 /* STA/IBSS mode connection event */
723
724 ath6kl_dbg(ATH6KL_DBG_WMI, "%s: freq %d bssid %pM\n",
725 __func__, le16_to_cpu(ev->u.sta.ch), ev->u.sta.bssid);
724 ath6kl_dbg(ATH6KL_DBG_WMI,
725 "wmi event connect freq %d bssid %pM listen_intvl %d beacon_intvl %d type %d\n",
726 le16_to_cpu(ev->u.sta.ch), ev->u.sta.bssid,
727 le16_to_cpu(ev->u.sta.listen_intvl),
728 le16_to_cpu(ev->u.sta.beacon_intvl),
729 le32_to_cpu(ev->u.sta.nw_type));
726
727 /* Start of assoc rsp IEs */
728 pie = ev->assoc_info + ev->beacon_ie_len +
729 ev->assoc_req_len + (sizeof(u16) * 3); /* capinfo, status, aid */
730
731 /* End of assoc rsp IEs */
732 peie = ev->assoc_info + ev->beacon_ie_len + ev->assoc_req_len +
733 ev->assoc_resp_len;

--- 83 unchanged lines hidden (view full) ---

817 reg_code = le32_to_cpu(ev->reg_code);
818
819 if ((reg_code >> ATH6KL_COUNTRY_RD_SHIFT) & COUNTRY_ERD_FLAG)
820 country = ath6kl_regd_find_country((u16) reg_code);
821 else if (!(((u16) reg_code & WORLD_SKU_MASK) == WORLD_SKU_PREFIX)) {
822
823 regpair = ath6kl_get_regpair((u16) reg_code);
824 country = ath6kl_regd_find_country_by_rd((u16) reg_code);
730
731 /* Start of assoc rsp IEs */
732 pie = ev->assoc_info + ev->beacon_ie_len +
733 ev->assoc_req_len + (sizeof(u16) * 3); /* capinfo, status, aid */
734
735 /* End of assoc rsp IEs */
736 peie = ev->assoc_info + ev->beacon_ie_len + ev->assoc_req_len +
737 ev->assoc_resp_len;

--- 83 unchanged lines hidden (view full) ---

821 reg_code = le32_to_cpu(ev->reg_code);
822
823 if ((reg_code >> ATH6KL_COUNTRY_RD_SHIFT) & COUNTRY_ERD_FLAG)
824 country = ath6kl_regd_find_country((u16) reg_code);
825 else if (!(((u16) reg_code & WORLD_SKU_MASK) == WORLD_SKU_PREFIX)) {
826
827 regpair = ath6kl_get_regpair((u16) reg_code);
828 country = ath6kl_regd_find_country_by_rd((u16) reg_code);
825 ath6kl_dbg(ATH6KL_DBG_WMI, "ath6kl: Regpair used: 0x%0x\n",
829 ath6kl_dbg(ATH6KL_DBG_WMI, "Regpair used: 0x%0x\n",
826 regpair->regDmnEnum);
827 }
828
829 if (country) {
830 alpha2[0] = country->isoName[0];
831 alpha2[1] = country->isoName[1];
832
833 regulatory_hint(wmi->parent_dev->wdev->wiphy, alpha2);
834
830 regpair->regDmnEnum);
831 }
832
833 if (country) {
834 alpha2[0] = country->isoName[0];
835 alpha2[1] = country->isoName[1];
836
837 regulatory_hint(wmi->parent_dev->wdev->wiphy, alpha2);
838
835 ath6kl_dbg(ATH6KL_DBG_WMI, "ath6kl: Country alpha2 being used: %c%c\n",
839 ath6kl_dbg(ATH6KL_DBG_WMI, "Country alpha2 being used: %c%c\n",
836 alpha2[0], alpha2[1]);
837 }
838}
839
840static int ath6kl_wmi_disconnect_event_rx(struct wmi *wmi, u8 *datap, int len)
841{
842 struct wmi_disconnect_event *ev;
843 wmi->traffic_class = 100;
844
845 if (len < sizeof(struct wmi_disconnect_event))
846 return -EINVAL;
847
848 ev = (struct wmi_disconnect_event *) datap;
849
840 alpha2[0], alpha2[1]);
841 }
842}
843
844static int ath6kl_wmi_disconnect_event_rx(struct wmi *wmi, u8 *datap, int len)
845{
846 struct wmi_disconnect_event *ev;
847 wmi->traffic_class = 100;
848
849 if (len < sizeof(struct wmi_disconnect_event))
850 return -EINVAL;
851
852 ev = (struct wmi_disconnect_event *) datap;
853
854 ath6kl_dbg(ATH6KL_DBG_WMI,
855 "wmi event disconnect proto_reason %d bssid %pM wmi_reason %d assoc_resp_len %d\n",
856 le16_to_cpu(ev->proto_reason_status), ev->bssid,
857 ev->disconn_reason, ev->assoc_resp_len);
858
850 wmi->is_wmm_enabled = false;
851 wmi->pair_crypto_type = NONE_CRYPT;
852 wmi->grp_crypto_type = NONE_CRYPT;
853
854 ath6kl_disconnect_event(wmi->parent_dev, ev->disconn_reason,
855 ev->bssid, ev->assoc_resp_len, ev->assoc_info,
856 le16_to_cpu(ev->proto_reason_status));
857

--- 663 unchanged lines hidden (view full) ---

1521
1522int ath6kl_wmi_cmd_send(struct wmi *wmi, struct sk_buff *skb,
1523 enum wmi_cmd_id cmd_id, enum wmi_sync_flag sync_flag)
1524{
1525 struct wmi_cmd_hdr *cmd_hdr;
1526 enum htc_endpoint_id ep_id = wmi->ep_id;
1527 int ret;
1528
859 wmi->is_wmm_enabled = false;
860 wmi->pair_crypto_type = NONE_CRYPT;
861 wmi->grp_crypto_type = NONE_CRYPT;
862
863 ath6kl_disconnect_event(wmi->parent_dev, ev->disconn_reason,
864 ev->bssid, ev->assoc_resp_len, ev->assoc_info,
865 le16_to_cpu(ev->proto_reason_status));
866

--- 663 unchanged lines hidden (view full) ---

1530
1531int ath6kl_wmi_cmd_send(struct wmi *wmi, struct sk_buff *skb,
1532 enum wmi_cmd_id cmd_id, enum wmi_sync_flag sync_flag)
1533{
1534 struct wmi_cmd_hdr *cmd_hdr;
1535 enum htc_endpoint_id ep_id = wmi->ep_id;
1536 int ret;
1537
1529 ath6kl_dbg(ATH6KL_DBG_WMI, "%s: cmd_id=%d\n", __func__, cmd_id);
1530
1531 if (WARN_ON(skb == NULL))
1532 return -EINVAL;
1533
1538 if (WARN_ON(skb == NULL))
1539 return -EINVAL;
1540
1541 ath6kl_dbg(ATH6KL_DBG_WMI, "wmi tx id %d len %d flag %d\n",
1542 cmd_id, skb->len, sync_flag);
1543 ath6kl_dbg_dump(ATH6KL_DBG_WMI_DUMP, NULL, "wmi tx ",
1544 skb->data, skb->len);
1545
1534 if (sync_flag >= END_WMIFLAG) {
1535 dev_kfree_skb(skb);
1536 return -EINVAL;
1537 }
1538
1539 if ((sync_flag == SYNC_BEFORE_WMIFLAG) ||
1540 (sync_flag == SYNC_BOTH_WMIFLAG)) {
1541 /*

--- 42 unchanged lines hidden (view full) ---

1584 enum crypto_type group_crypto,
1585 u8 group_crypto_len, int ssid_len, u8 *ssid,
1586 u8 *bssid, u16 channel, u32 ctrl_flags)
1587{
1588 struct sk_buff *skb;
1589 struct wmi_connect_cmd *cc;
1590 int ret;
1591
1546 if (sync_flag >= END_WMIFLAG) {
1547 dev_kfree_skb(skb);
1548 return -EINVAL;
1549 }
1550
1551 if ((sync_flag == SYNC_BEFORE_WMIFLAG) ||
1552 (sync_flag == SYNC_BOTH_WMIFLAG)) {
1553 /*

--- 42 unchanged lines hidden (view full) ---

1596 enum crypto_type group_crypto,
1597 u8 group_crypto_len, int ssid_len, u8 *ssid,
1598 u8 *bssid, u16 channel, u32 ctrl_flags)
1599{
1600 struct sk_buff *skb;
1601 struct wmi_connect_cmd *cc;
1602 int ret;
1603
1604 ath6kl_dbg(ATH6KL_DBG_WMI,
1605 "wmi connect bssid %pM freq %d flags 0x%x ssid_len %d "
1606 "type %d dot11_auth %d auth %d pairwise %d group %d\n",
1607 bssid, channel, ctrl_flags, ssid_len, nw_type,
1608 dot11_auth_mode, auth_mode, pairwise_crypto, group_crypto);
1609 ath6kl_dbg_dump(ATH6KL_DBG_WMI, NULL, "ssid ", ssid, ssid_len);
1610
1592 wmi->traffic_class = 100;
1593
1594 if ((pairwise_crypto == NONE_CRYPT) && (group_crypto != NONE_CRYPT))
1595 return -EINVAL;
1596
1597 if ((pairwise_crypto != NONE_CRYPT) && (group_crypto == NONE_CRYPT))
1598 return -EINVAL;
1599

--- 29 unchanged lines hidden (view full) ---

1629}
1630
1631int ath6kl_wmi_reconnect_cmd(struct wmi *wmi, u8 *bssid, u16 channel)
1632{
1633 struct sk_buff *skb;
1634 struct wmi_reconnect_cmd *cc;
1635 int ret;
1636
1611 wmi->traffic_class = 100;
1612
1613 if ((pairwise_crypto == NONE_CRYPT) && (group_crypto != NONE_CRYPT))
1614 return -EINVAL;
1615
1616 if ((pairwise_crypto != NONE_CRYPT) && (group_crypto == NONE_CRYPT))
1617 return -EINVAL;
1618

--- 29 unchanged lines hidden (view full) ---

1648}
1649
1650int ath6kl_wmi_reconnect_cmd(struct wmi *wmi, u8 *bssid, u16 channel)
1651{
1652 struct sk_buff *skb;
1653 struct wmi_reconnect_cmd *cc;
1654 int ret;
1655
1656 ath6kl_dbg(ATH6KL_DBG_WMI, "wmi reconnect bssid %pM freq %d\n",
1657 bssid, channel);
1658
1637 wmi->traffic_class = 100;
1638
1639 skb = ath6kl_wmi_get_new_buf(sizeof(struct wmi_reconnect_cmd));
1640 if (!skb)
1641 return -ENOMEM;
1642
1643 cc = (struct wmi_reconnect_cmd *) skb->data;
1644 cc->channel = cpu_to_le16(channel);

--- 6 unchanged lines hidden (view full) ---

1651
1652 return ret;
1653}
1654
1655int ath6kl_wmi_disconnect_cmd(struct wmi *wmi)
1656{
1657 int ret;
1658
1659 wmi->traffic_class = 100;
1660
1661 skb = ath6kl_wmi_get_new_buf(sizeof(struct wmi_reconnect_cmd));
1662 if (!skb)
1663 return -ENOMEM;
1664
1665 cc = (struct wmi_reconnect_cmd *) skb->data;
1666 cc->channel = cpu_to_le16(channel);

--- 6 unchanged lines hidden (view full) ---

1673
1674 return ret;
1675}
1676
1677int ath6kl_wmi_disconnect_cmd(struct wmi *wmi)
1678{
1679 int ret;
1680
1681 ath6kl_dbg(ATH6KL_DBG_WMI, "wmi disconnect\n");
1682
1659 wmi->traffic_class = 100;
1660
1661 /* Disconnect command does not need to do a SYNC before. */
1662 ret = ath6kl_wmi_simple_cmd(wmi, WMI_DISCONNECT_CMDID);
1663
1664 return ret;
1665}
1666

--- 1136 unchanged lines hidden (view full) ---

2803
2804 skb_pull(skb, sizeof(struct wmix_cmd_hdr));
2805
2806 datap = skb->data;
2807 len = skb->len;
2808
2809 switch (id) {
2810 case WMIX_HB_CHALLENGE_RESP_EVENTID:
1683 wmi->traffic_class = 100;
1684
1685 /* Disconnect command does not need to do a SYNC before. */
1686 ret = ath6kl_wmi_simple_cmd(wmi, WMI_DISCONNECT_CMDID);
1687
1688 return ret;
1689}
1690

--- 1136 unchanged lines hidden (view full) ---

2827
2828 skb_pull(skb, sizeof(struct wmix_cmd_hdr));
2829
2830 datap = skb->data;
2831 len = skb->len;
2832
2833 switch (id) {
2834 case WMIX_HB_CHALLENGE_RESP_EVENTID:
2835 ath6kl_dbg(ATH6KL_DBG_WMI, "wmi event hb challenge resp\n");
2811 break;
2812 case WMIX_DBGLOG_EVENTID:
2836 break;
2837 case WMIX_DBGLOG_EVENTID:
2838 ath6kl_dbg(ATH6KL_DBG_WMI, "wmi event dbglog len %d\n", len);
2813 ath6kl_debug_fwlog_event(wmi->parent_dev, datap, len);
2814 break;
2815 default:
2839 ath6kl_debug_fwlog_event(wmi->parent_dev, datap, len);
2840 break;
2841 default:
2816 ath6kl_err("unknown cmd id 0x%x\n", id);
2842 ath6kl_warn("unknown cmd id 0x%x\n", id);
2817 wmi->stat.cmd_id_err++;
2818 ret = -EINVAL;
2819 break;
2820 }
2821
2822 return ret;
2823}
2824

--- 19 unchanged lines hidden (view full) ---

2844 cmd = (struct wmi_cmd_hdr *) skb->data;
2845 id = le16_to_cpu(cmd->cmd_id);
2846
2847 skb_pull(skb, sizeof(struct wmi_cmd_hdr));
2848
2849 datap = skb->data;
2850 len = skb->len;
2851
2843 wmi->stat.cmd_id_err++;
2844 ret = -EINVAL;
2845 break;
2846 }
2847
2848 return ret;
2849}
2850

--- 19 unchanged lines hidden (view full) ---

2870 cmd = (struct wmi_cmd_hdr *) skb->data;
2871 id = le16_to_cpu(cmd->cmd_id);
2872
2873 skb_pull(skb, sizeof(struct wmi_cmd_hdr));
2874
2875 datap = skb->data;
2876 len = skb->len;
2877
2852 ath6kl_dbg(ATH6KL_DBG_WMI, "%s: wmi id: %d\n", __func__, id);
2853 ath6kl_dbg_dump(ATH6KL_DBG_RAW_BYTES, "msg payload ", "wmi rx ",
2878 ath6kl_dbg(ATH6KL_DBG_WMI, "wmi rx id %d len %d\n", id, len);
2879 ath6kl_dbg_dump(ATH6KL_DBG_WMI_DUMP, NULL, "wmi rx ",
2854 datap, len);
2855
2856 switch (id) {
2857 case WMI_GET_BITRATE_CMDID:
2858 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_BITRATE_CMDID\n");
2859 ret = ath6kl_wmi_bitrate_reply_rx(wmi, datap, len);
2860 break;
2861 case WMI_GET_CHANNEL_LIST_CMDID:

--- 240 unchanged lines hidden ---
2880 datap, len);
2881
2882 switch (id) {
2883 case WMI_GET_BITRATE_CMDID:
2884 ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_GET_BITRATE_CMDID\n");
2885 ret = ath6kl_wmi_bitrate_reply_rx(wmi, datap, len);
2886 break;
2887 case WMI_GET_CHANNEL_LIST_CMDID:

--- 240 unchanged lines hidden ---