diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-02 23:53:45 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-02 23:53:45 -0400 |
commit | cd6362befe4cc7bf589a5236d2a780af2d47bcc9 (patch) | |
tree | 3bd4e13ec3f92a00dc4f6c3d65e820b54dbfe46e /drivers/net/wireless/mwifiex/cfg80211.c | |
parent | 0f1b1e6d73cb989ce2c071edc57deade3b084dfe (diff) | |
parent | b1586f099ba897542ece36e8a23c1a62907261ef (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
Pull networking updates from David Miller:
"Here is my initial pull request for the networking subsystem during
this merge window:
1) Support for ESN in AH (RFC 4302) from Fan Du.
2) Add full kernel doc for ethtool command structures, from Ben
Hutchings.
3) Add BCM7xxx PHY driver, from Florian Fainelli.
4) Export computed TCP rate information in netlink socket dumps, from
Eric Dumazet.
5) Allow IPSEC SA to be dumped partially using a filter, from Nicolas
Dichtel.
6) Convert many drivers to pci_enable_msix_range(), from Alexander
Gordeev.
7) Record SKB timestamps more efficiently, from Eric Dumazet.
8) Switch to microsecond resolution for TCP round trip times, also
from Eric Dumazet.
9) Clean up and fix 6lowpan fragmentation handling by making use of
the existing inet_frag api for it's implementation.
10) Add TX grant mapping to xen-netback driver, from Zoltan Kiss.
11) Auto size SKB lengths when composing netlink messages based upon
past message sizes used, from Eric Dumazet.
12) qdisc dumps can take a long time, add a cond_resched(), From Eric
Dumazet.
13) Sanitize netpoll core and drivers wrt. SKB handling semantics.
Get rid of never-used-in-tree netpoll RX handling. From Eric W
Biederman.
14) Support inter-address-family and namespace changing in VTI tunnel
driver(s). From Steffen Klassert.
15) Add Altera TSE driver, from Vince Bridgers.
16) Optimizing csum_replace2() so that it doesn't adjust the checksum
by checksumming the entire header, from Eric Dumazet.
17) Expand BPF internal implementation for faster interpreting, more
direct translations into JIT'd code, and much cleaner uses of BPF
filtering in non-socket ocntexts. From Daniel Borkmann and Alexei
Starovoitov"
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next: (1976 commits)
netpoll: Use skb_irq_freeable to make zap_completion_queue safe.
net: Add a test to see if a skb is freeable in irq context
qlcnic: Fix build failure due to undefined reference to `vxlan_get_rx_port'
net: ptp: move PTP classifier in its own file
net: sxgbe: make "core_ops" static
net: sxgbe: fix logical vs bitwise operation
net: sxgbe: sxgbe_mdio_register() frees the bus
Call efx_set_channels() before efx->type->dimension_resources()
xen-netback: disable rogue vif in kthread context
net/mlx4: Set proper build dependancy with vxlan
be2net: fix build dependency on VxLAN
mac802154: make csma/cca parameters per-wpan
mac802154: allow only one WPAN to be up at any given time
net: filter: minor: fix kdoc in __sk_run_filter
netlink: don't compare the nul-termination in nla_strcmp
can: c_can: Avoid led toggling for every packet.
can: c_can: Simplify TX interrupt cleanup
can: c_can: Store dlc private
can: c_can: Reduce register access
can: c_can: Make the code readable
...
Diffstat (limited to 'drivers/net/wireless/mwifiex/cfg80211.c')
-rw-r--r-- | drivers/net/wireless/mwifiex/cfg80211.c | 403 |
1 files changed, 303 insertions, 100 deletions
diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c index 8bfc07cd330e..21ee27ab7b74 100644 --- a/drivers/net/wireless/mwifiex/cfg80211.c +++ b/drivers/net/wireless/mwifiex/cfg80211.c | |||
@@ -252,9 +252,9 @@ mwifiex_cfg80211_mgmt_frame_register(struct wiphy *wiphy, | |||
252 | 252 | ||
253 | if (mask != priv->mgmt_frame_mask) { | 253 | if (mask != priv->mgmt_frame_mask) { |
254 | priv->mgmt_frame_mask = mask; | 254 | priv->mgmt_frame_mask = mask; |
255 | mwifiex_send_cmd_async(priv, HostCmd_CMD_MGMT_FRAME_REG, | 255 | mwifiex_send_cmd(priv, HostCmd_CMD_MGMT_FRAME_REG, |
256 | HostCmd_ACT_GEN_SET, 0, | 256 | HostCmd_ACT_GEN_SET, 0, |
257 | &priv->mgmt_frame_mask); | 257 | &priv->mgmt_frame_mask, false); |
258 | wiphy_dbg(wiphy, "info: mgmt frame registered\n"); | 258 | wiphy_dbg(wiphy, "info: mgmt frame registered\n"); |
259 | } | 259 | } |
260 | } | 260 | } |
@@ -515,8 +515,8 @@ static int mwifiex_send_domain_info_cmd_fw(struct wiphy *wiphy) | |||
515 | 515 | ||
516 | priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY); | 516 | priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY); |
517 | 517 | ||
518 | if (mwifiex_send_cmd_async(priv, HostCmd_CMD_802_11D_DOMAIN_INFO, | 518 | if (mwifiex_send_cmd(priv, HostCmd_CMD_802_11D_DOMAIN_INFO, |
519 | HostCmd_ACT_GEN_SET, 0, NULL)) { | 519 | HostCmd_ACT_GEN_SET, 0, NULL, false)) { |
520 | wiphy_err(wiphy, "11D: setting domain info in FW\n"); | 520 | wiphy_err(wiphy, "11D: setting domain info in FW\n"); |
521 | return -1; | 521 | return -1; |
522 | } | 522 | } |
@@ -580,9 +580,9 @@ mwifiex_set_frag(struct mwifiex_private *priv, u32 frag_thr) | |||
580 | frag_thr > MWIFIEX_FRAG_MAX_VALUE) | 580 | frag_thr > MWIFIEX_FRAG_MAX_VALUE) |
581 | frag_thr = MWIFIEX_FRAG_MAX_VALUE; | 581 | frag_thr = MWIFIEX_FRAG_MAX_VALUE; |
582 | 582 | ||
583 | return mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_SNMP_MIB, | 583 | return mwifiex_send_cmd(priv, HostCmd_CMD_802_11_SNMP_MIB, |
584 | HostCmd_ACT_GEN_SET, FRAG_THRESH_I, | 584 | HostCmd_ACT_GEN_SET, FRAG_THRESH_I, |
585 | &frag_thr); | 585 | &frag_thr, true); |
586 | } | 586 | } |
587 | 587 | ||
588 | /* | 588 | /* |
@@ -597,9 +597,9 @@ mwifiex_set_rts(struct mwifiex_private *priv, u32 rts_thr) | |||
597 | if (rts_thr < MWIFIEX_RTS_MIN_VALUE || rts_thr > MWIFIEX_RTS_MAX_VALUE) | 597 | if (rts_thr < MWIFIEX_RTS_MIN_VALUE || rts_thr > MWIFIEX_RTS_MAX_VALUE) |
598 | rts_thr = MWIFIEX_RTS_MAX_VALUE; | 598 | rts_thr = MWIFIEX_RTS_MAX_VALUE; |
599 | 599 | ||
600 | return mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_SNMP_MIB, | 600 | return mwifiex_send_cmd(priv, HostCmd_CMD_802_11_SNMP_MIB, |
601 | HostCmd_ACT_GEN_SET, RTS_THRESH_I, | 601 | HostCmd_ACT_GEN_SET, RTS_THRESH_I, |
602 | &rts_thr); | 602 | &rts_thr, true); |
603 | } | 603 | } |
604 | 604 | ||
605 | /* | 605 | /* |
@@ -637,20 +637,19 @@ mwifiex_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed) | |||
637 | 637 | ||
638 | bss_started = priv->bss_started; | 638 | bss_started = priv->bss_started; |
639 | 639 | ||
640 | ret = mwifiex_send_cmd_sync(priv, | 640 | ret = mwifiex_send_cmd(priv, HostCmd_CMD_UAP_BSS_STOP, |
641 | HostCmd_CMD_UAP_BSS_STOP, | 641 | HostCmd_ACT_GEN_SET, 0, |
642 | HostCmd_ACT_GEN_SET, 0, | 642 | NULL, true); |
643 | NULL); | ||
644 | if (ret) { | 643 | if (ret) { |
645 | wiphy_err(wiphy, "Failed to stop the BSS\n"); | 644 | wiphy_err(wiphy, "Failed to stop the BSS\n"); |
646 | kfree(bss_cfg); | 645 | kfree(bss_cfg); |
647 | return ret; | 646 | return ret; |
648 | } | 647 | } |
649 | 648 | ||
650 | ret = mwifiex_send_cmd_async(priv, | 649 | ret = mwifiex_send_cmd(priv, HostCmd_CMD_UAP_SYS_CONFIG, |
651 | HostCmd_CMD_UAP_SYS_CONFIG, | 650 | HostCmd_ACT_GEN_SET, |
652 | HostCmd_ACT_GEN_SET, | 651 | UAP_BSS_PARAMS_I, bss_cfg, |
653 | UAP_BSS_PARAMS_I, bss_cfg); | 652 | false); |
654 | 653 | ||
655 | kfree(bss_cfg); | 654 | kfree(bss_cfg); |
656 | 655 | ||
@@ -662,10 +661,9 @@ mwifiex_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed) | |||
662 | if (!bss_started) | 661 | if (!bss_started) |
663 | break; | 662 | break; |
664 | 663 | ||
665 | ret = mwifiex_send_cmd_async(priv, | 664 | ret = mwifiex_send_cmd(priv, HostCmd_CMD_UAP_BSS_START, |
666 | HostCmd_CMD_UAP_BSS_START, | 665 | HostCmd_ACT_GEN_SET, 0, |
667 | HostCmd_ACT_GEN_SET, 0, | 666 | NULL, false); |
668 | NULL); | ||
669 | if (ret) { | 667 | if (ret) { |
670 | wiphy_err(wiphy, "Failed to start BSS\n"); | 668 | wiphy_err(wiphy, "Failed to start BSS\n"); |
671 | return ret; | 669 | return ret; |
@@ -700,8 +698,8 @@ mwifiex_cfg80211_deinit_p2p(struct mwifiex_private *priv) | |||
700 | if (GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_STA) | 698 | if (GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_STA) |
701 | mwifiex_set_bss_role(priv, MWIFIEX_BSS_ROLE_STA); | 699 | mwifiex_set_bss_role(priv, MWIFIEX_BSS_ROLE_STA); |
702 | 700 | ||
703 | if (mwifiex_send_cmd_sync(priv, HostCmd_CMD_P2P_MODE_CFG, | 701 | if (mwifiex_send_cmd(priv, HostCmd_CMD_P2P_MODE_CFG, |
704 | HostCmd_ACT_GEN_SET, 0, &mode)) | 702 | HostCmd_ACT_GEN_SET, 0, &mode, true)) |
705 | return -1; | 703 | return -1; |
706 | 704 | ||
707 | return 0; | 705 | return 0; |
@@ -721,13 +719,13 @@ mwifiex_cfg80211_init_p2p_client(struct mwifiex_private *priv) | |||
721 | return -1; | 719 | return -1; |
722 | 720 | ||
723 | mode = P2P_MODE_DEVICE; | 721 | mode = P2P_MODE_DEVICE; |
724 | if (mwifiex_send_cmd_sync(priv, HostCmd_CMD_P2P_MODE_CFG, | 722 | if (mwifiex_send_cmd(priv, HostCmd_CMD_P2P_MODE_CFG, |
725 | HostCmd_ACT_GEN_SET, 0, &mode)) | 723 | HostCmd_ACT_GEN_SET, 0, &mode, true)) |
726 | return -1; | 724 | return -1; |
727 | 725 | ||
728 | mode = P2P_MODE_CLIENT; | 726 | mode = P2P_MODE_CLIENT; |
729 | if (mwifiex_send_cmd_sync(priv, HostCmd_CMD_P2P_MODE_CFG, | 727 | if (mwifiex_send_cmd(priv, HostCmd_CMD_P2P_MODE_CFG, |
730 | HostCmd_ACT_GEN_SET, 0, &mode)) | 728 | HostCmd_ACT_GEN_SET, 0, &mode, true)) |
731 | return -1; | 729 | return -1; |
732 | 730 | ||
733 | return 0; | 731 | return 0; |
@@ -747,13 +745,13 @@ mwifiex_cfg80211_init_p2p_go(struct mwifiex_private *priv) | |||
747 | return -1; | 745 | return -1; |
748 | 746 | ||
749 | mode = P2P_MODE_DEVICE; | 747 | mode = P2P_MODE_DEVICE; |
750 | if (mwifiex_send_cmd_sync(priv, HostCmd_CMD_P2P_MODE_CFG, | 748 | if (mwifiex_send_cmd(priv, HostCmd_CMD_P2P_MODE_CFG, |
751 | HostCmd_ACT_GEN_SET, 0, &mode)) | 749 | HostCmd_ACT_GEN_SET, 0, &mode, true)) |
752 | return -1; | 750 | return -1; |
753 | 751 | ||
754 | mode = P2P_MODE_GO; | 752 | mode = P2P_MODE_GO; |
755 | if (mwifiex_send_cmd_sync(priv, HostCmd_CMD_P2P_MODE_CFG, | 753 | if (mwifiex_send_cmd(priv, HostCmd_CMD_P2P_MODE_CFG, |
756 | HostCmd_ACT_GEN_SET, 0, &mode)) | 754 | HostCmd_ACT_GEN_SET, 0, &mode, true)) |
757 | return -1; | 755 | return -1; |
758 | 756 | ||
759 | if (GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_UAP) | 757 | if (GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_UAP) |
@@ -853,8 +851,8 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy, | |||
853 | 851 | ||
854 | priv->sec_info.authentication_mode = NL80211_AUTHTYPE_OPEN_SYSTEM; | 852 | priv->sec_info.authentication_mode = NL80211_AUTHTYPE_OPEN_SYSTEM; |
855 | 853 | ||
856 | ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_SET_BSS_MODE, | 854 | ret = mwifiex_send_cmd(priv, HostCmd_CMD_SET_BSS_MODE, |
857 | HostCmd_ACT_GEN_SET, 0, NULL); | 855 | HostCmd_ACT_GEN_SET, 0, NULL, true); |
858 | 856 | ||
859 | return ret; | 857 | return ret; |
860 | } | 858 | } |
@@ -942,8 +940,8 @@ mwifiex_dump_station_info(struct mwifiex_private *priv, | |||
942 | STATION_INFO_SIGNAL | STATION_INFO_SIGNAL_AVG; | 940 | STATION_INFO_SIGNAL | STATION_INFO_SIGNAL_AVG; |
943 | 941 | ||
944 | /* Get signal information from the firmware */ | 942 | /* Get signal information from the firmware */ |
945 | if (mwifiex_send_cmd_sync(priv, HostCmd_CMD_RSSI_INFO, | 943 | if (mwifiex_send_cmd(priv, HostCmd_CMD_RSSI_INFO, |
946 | HostCmd_ACT_GEN_GET, 0, NULL)) { | 944 | HostCmd_ACT_GEN_GET, 0, NULL, true)) { |
947 | dev_err(priv->adapter->dev, "failed to get signal information\n"); | 945 | dev_err(priv->adapter->dev, "failed to get signal information\n"); |
948 | return -EFAULT; | 946 | return -EFAULT; |
949 | } | 947 | } |
@@ -954,9 +952,9 @@ mwifiex_dump_station_info(struct mwifiex_private *priv, | |||
954 | } | 952 | } |
955 | 953 | ||
956 | /* Get DTIM period information from firmware */ | 954 | /* Get DTIM period information from firmware */ |
957 | mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_SNMP_MIB, | 955 | mwifiex_send_cmd(priv, HostCmd_CMD_802_11_SNMP_MIB, |
958 | HostCmd_ACT_GEN_GET, DTIM_PERIOD_I, | 956 | HostCmd_ACT_GEN_GET, DTIM_PERIOD_I, |
959 | &priv->dtim_period); | 957 | &priv->dtim_period, true); |
960 | 958 | ||
961 | mwifiex_parse_htinfo(priv, priv->tx_htinfo, &sinfo->txrate); | 959 | mwifiex_parse_htinfo(priv, priv->tx_htinfo, &sinfo->txrate); |
962 | 960 | ||
@@ -1160,9 +1158,10 @@ static int mwifiex_cfg80211_set_bitrate_mask(struct wiphy *wiphy, | |||
1160 | struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); | 1158 | struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); |
1161 | u16 bitmap_rates[MAX_BITMAP_RATES_SIZE]; | 1159 | u16 bitmap_rates[MAX_BITMAP_RATES_SIZE]; |
1162 | enum ieee80211_band band; | 1160 | enum ieee80211_band band; |
1161 | struct mwifiex_adapter *adapter = priv->adapter; | ||
1163 | 1162 | ||
1164 | if (!priv->media_connected) { | 1163 | if (!priv->media_connected) { |
1165 | dev_err(priv->adapter->dev, | 1164 | dev_err(adapter->dev, |
1166 | "Can not set Tx data rate in disconnected state\n"); | 1165 | "Can not set Tx data rate in disconnected state\n"); |
1167 | return -EINVAL; | 1166 | return -EINVAL; |
1168 | } | 1167 | } |
@@ -1183,11 +1182,18 @@ static int mwifiex_cfg80211_set_bitrate_mask(struct wiphy *wiphy, | |||
1183 | 1182 | ||
1184 | /* Fill HT MCS rates */ | 1183 | /* Fill HT MCS rates */ |
1185 | bitmap_rates[2] = mask->control[band].ht_mcs[0]; | 1184 | bitmap_rates[2] = mask->control[band].ht_mcs[0]; |
1186 | if (priv->adapter->hw_dev_mcs_support == HT_STREAM_2X2) | 1185 | if (adapter->hw_dev_mcs_support == HT_STREAM_2X2) |
1187 | bitmap_rates[2] |= mask->control[band].ht_mcs[1] << 8; | 1186 | bitmap_rates[2] |= mask->control[band].ht_mcs[1] << 8; |
1188 | 1187 | ||
1189 | return mwifiex_send_cmd_sync(priv, HostCmd_CMD_TX_RATE_CFG, | 1188 | /* Fill VHT MCS rates */ |
1190 | HostCmd_ACT_GEN_SET, 0, bitmap_rates); | 1189 | if (adapter->fw_api_ver == MWIFIEX_FW_V15) { |
1190 | bitmap_rates[10] = mask->control[band].vht_mcs[0]; | ||
1191 | if (adapter->hw_dev_mcs_support == HT_STREAM_2X2) | ||
1192 | bitmap_rates[11] = mask->control[band].vht_mcs[1]; | ||
1193 | } | ||
1194 | |||
1195 | return mwifiex_send_cmd(priv, HostCmd_CMD_TX_RATE_CFG, | ||
1196 | HostCmd_ACT_GEN_SET, 0, bitmap_rates, true); | ||
1191 | } | 1197 | } |
1192 | 1198 | ||
1193 | /* | 1199 | /* |
@@ -1216,14 +1222,14 @@ static int mwifiex_cfg80211_set_cqm_rssi_config(struct wiphy *wiphy, | |||
1216 | subsc_evt.bcn_h_rssi_cfg.abs_value = abs(rssi_thold); | 1222 | subsc_evt.bcn_h_rssi_cfg.abs_value = abs(rssi_thold); |
1217 | subsc_evt.bcn_l_rssi_cfg.evt_freq = 1; | 1223 | subsc_evt.bcn_l_rssi_cfg.evt_freq = 1; |
1218 | subsc_evt.bcn_h_rssi_cfg.evt_freq = 1; | 1224 | subsc_evt.bcn_h_rssi_cfg.evt_freq = 1; |
1219 | return mwifiex_send_cmd_sync(priv, | 1225 | return mwifiex_send_cmd(priv, |
1220 | HostCmd_CMD_802_11_SUBSCRIBE_EVENT, | 1226 | HostCmd_CMD_802_11_SUBSCRIBE_EVENT, |
1221 | 0, 0, &subsc_evt); | 1227 | 0, 0, &subsc_evt, true); |
1222 | } else { | 1228 | } else { |
1223 | subsc_evt.action = HostCmd_ACT_BITWISE_CLR; | 1229 | subsc_evt.action = HostCmd_ACT_BITWISE_CLR; |
1224 | return mwifiex_send_cmd_sync(priv, | 1230 | return mwifiex_send_cmd(priv, |
1225 | HostCmd_CMD_802_11_SUBSCRIBE_EVENT, | 1231 | HostCmd_CMD_802_11_SUBSCRIBE_EVENT, |
1226 | 0, 0, &subsc_evt); | 1232 | 0, 0, &subsc_evt, true); |
1227 | } | 1233 | } |
1228 | 1234 | ||
1229 | return 0; | 1235 | return 0; |
@@ -1276,10 +1282,9 @@ mwifiex_cfg80211_del_station(struct wiphy *wiphy, struct net_device *dev, | |||
1276 | if (!mac || is_broadcast_ether_addr(mac)) { | 1282 | if (!mac || is_broadcast_ether_addr(mac)) { |
1277 | wiphy_dbg(wiphy, "%s: NULL/broadcast mac address\n", __func__); | 1283 | wiphy_dbg(wiphy, "%s: NULL/broadcast mac address\n", __func__); |
1278 | list_for_each_entry(sta_node, &priv->sta_list, list) { | 1284 | list_for_each_entry(sta_node, &priv->sta_list, list) { |
1279 | if (mwifiex_send_cmd_sync(priv, | 1285 | if (mwifiex_send_cmd(priv, HostCmd_CMD_UAP_STA_DEAUTH, |
1280 | HostCmd_CMD_UAP_STA_DEAUTH, | 1286 | HostCmd_ACT_GEN_SET, 0, |
1281 | HostCmd_ACT_GEN_SET, 0, | 1287 | sta_node->mac_addr, true)) |
1282 | sta_node->mac_addr)) | ||
1283 | return -1; | 1288 | return -1; |
1284 | mwifiex_uap_del_sta_data(priv, sta_node); | 1289 | mwifiex_uap_del_sta_data(priv, sta_node); |
1285 | } | 1290 | } |
@@ -1289,10 +1294,9 @@ mwifiex_cfg80211_del_station(struct wiphy *wiphy, struct net_device *dev, | |||
1289 | sta_node = mwifiex_get_sta_entry(priv, mac); | 1294 | sta_node = mwifiex_get_sta_entry(priv, mac); |
1290 | spin_unlock_irqrestore(&priv->sta_list_spinlock, flags); | 1295 | spin_unlock_irqrestore(&priv->sta_list_spinlock, flags); |
1291 | if (sta_node) { | 1296 | if (sta_node) { |
1292 | if (mwifiex_send_cmd_sync(priv, | 1297 | if (mwifiex_send_cmd(priv, HostCmd_CMD_UAP_STA_DEAUTH, |
1293 | HostCmd_CMD_UAP_STA_DEAUTH, | 1298 | HostCmd_ACT_GEN_SET, 0, |
1294 | HostCmd_ACT_GEN_SET, 0, | 1299 | sta_node->mac_addr, true)) |
1295 | sta_node->mac_addr)) | ||
1296 | return -1; | 1300 | return -1; |
1297 | mwifiex_uap_del_sta_data(priv, sta_node); | 1301 | mwifiex_uap_del_sta_data(priv, sta_node); |
1298 | } | 1302 | } |
@@ -1328,13 +1332,40 @@ mwifiex_cfg80211_set_antenna(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant) | |||
1328 | tx_ant = RF_ANTENNA_AUTO; | 1332 | tx_ant = RF_ANTENNA_AUTO; |
1329 | rx_ant = RF_ANTENNA_AUTO; | 1333 | rx_ant = RF_ANTENNA_AUTO; |
1330 | } | 1334 | } |
1335 | } else { | ||
1336 | struct ieee80211_sta_ht_cap *ht_info; | ||
1337 | int rx_mcs_supp; | ||
1338 | enum ieee80211_band band; | ||
1339 | |||
1340 | if ((tx_ant == 0x1 && rx_ant == 0x1)) { | ||
1341 | adapter->user_dev_mcs_support = HT_STREAM_1X1; | ||
1342 | if (adapter->is_hw_11ac_capable) | ||
1343 | adapter->usr_dot_11ac_mcs_support = | ||
1344 | MWIFIEX_11AC_MCS_MAP_1X1; | ||
1345 | } else { | ||
1346 | adapter->user_dev_mcs_support = HT_STREAM_2X2; | ||
1347 | if (adapter->is_hw_11ac_capable) | ||
1348 | adapter->usr_dot_11ac_mcs_support = | ||
1349 | MWIFIEX_11AC_MCS_MAP_2X2; | ||
1350 | } | ||
1351 | |||
1352 | for (band = 0; band < IEEE80211_NUM_BANDS; band++) { | ||
1353 | if (!adapter->wiphy->bands[band]) | ||
1354 | continue; | ||
1355 | |||
1356 | ht_info = &adapter->wiphy->bands[band]->ht_cap; | ||
1357 | rx_mcs_supp = | ||
1358 | GET_RXMCSSUPP(adapter->user_dev_mcs_support); | ||
1359 | memset(&ht_info->mcs, 0, adapter->number_of_antenna); | ||
1360 | memset(&ht_info->mcs, 0xff, rx_mcs_supp); | ||
1361 | } | ||
1331 | } | 1362 | } |
1332 | 1363 | ||
1333 | ant_cfg.tx_ant = tx_ant; | 1364 | ant_cfg.tx_ant = tx_ant; |
1334 | ant_cfg.rx_ant = rx_ant; | 1365 | ant_cfg.rx_ant = rx_ant; |
1335 | 1366 | ||
1336 | return mwifiex_send_cmd_sync(priv, HostCmd_CMD_RF_ANTENNA, | 1367 | return mwifiex_send_cmd(priv, HostCmd_CMD_RF_ANTENNA, |
1337 | HostCmd_ACT_GEN_SET, 0, &ant_cfg); | 1368 | HostCmd_ACT_GEN_SET, 0, &ant_cfg, true); |
1338 | } | 1369 | } |
1339 | 1370 | ||
1340 | /* cfg80211 operation handler for stop ap. | 1371 | /* cfg80211 operation handler for stop ap. |
@@ -1349,8 +1380,8 @@ static int mwifiex_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *dev) | |||
1349 | 1380 | ||
1350 | priv->ap_11n_enabled = 0; | 1381 | priv->ap_11n_enabled = 0; |
1351 | 1382 | ||
1352 | if (mwifiex_send_cmd_sync(priv, HostCmd_CMD_UAP_BSS_STOP, | 1383 | if (mwifiex_send_cmd(priv, HostCmd_CMD_UAP_BSS_STOP, |
1353 | HostCmd_ACT_GEN_SET, 0, NULL)) { | 1384 | HostCmd_ACT_GEN_SET, 0, NULL, true)) { |
1354 | wiphy_err(wiphy, "Failed to stop the BSS\n"); | 1385 | wiphy_err(wiphy, "Failed to stop the BSS\n"); |
1355 | return -1; | 1386 | return -1; |
1356 | } | 1387 | } |
@@ -1416,9 +1447,6 @@ static int mwifiex_cfg80211_start_ap(struct wiphy *wiphy, | |||
1416 | 1447 | ||
1417 | if (params->chandef.width > NL80211_CHAN_WIDTH_20_NOHT) | 1448 | if (params->chandef.width > NL80211_CHAN_WIDTH_20_NOHT) |
1418 | config_bands |= BAND_GN; | 1449 | config_bands |= BAND_GN; |
1419 | |||
1420 | if (params->chandef.width > NL80211_CHAN_WIDTH_40) | ||
1421 | config_bands |= BAND_GAC; | ||
1422 | } else { | 1450 | } else { |
1423 | bss_cfg->band_cfg = BAND_CONFIG_A; | 1451 | bss_cfg->band_cfg = BAND_CONFIG_A; |
1424 | config_bands = BAND_A; | 1452 | config_bands = BAND_A; |
@@ -1464,16 +1492,16 @@ static int mwifiex_cfg80211_start_ap(struct wiphy *wiphy, | |||
1464 | bss_cfg->ps_sta_ao_timer = 10 * params->inactivity_timeout; | 1492 | bss_cfg->ps_sta_ao_timer = 10 * params->inactivity_timeout; |
1465 | } | 1493 | } |
1466 | 1494 | ||
1467 | if (mwifiex_send_cmd_sync(priv, HostCmd_CMD_UAP_BSS_STOP, | 1495 | if (mwifiex_send_cmd(priv, HostCmd_CMD_UAP_BSS_STOP, |
1468 | HostCmd_ACT_GEN_SET, 0, NULL)) { | 1496 | HostCmd_ACT_GEN_SET, 0, NULL, true)) { |
1469 | wiphy_err(wiphy, "Failed to stop the BSS\n"); | 1497 | wiphy_err(wiphy, "Failed to stop the BSS\n"); |
1470 | kfree(bss_cfg); | 1498 | kfree(bss_cfg); |
1471 | return -1; | 1499 | return -1; |
1472 | } | 1500 | } |
1473 | 1501 | ||
1474 | if (mwifiex_send_cmd_async(priv, HostCmd_CMD_UAP_SYS_CONFIG, | 1502 | if (mwifiex_send_cmd(priv, HostCmd_CMD_UAP_SYS_CONFIG, |
1475 | HostCmd_ACT_GEN_SET, | 1503 | HostCmd_ACT_GEN_SET, |
1476 | UAP_BSS_PARAMS_I, bss_cfg)) { | 1504 | UAP_BSS_PARAMS_I, bss_cfg, false)) { |
1477 | wiphy_err(wiphy, "Failed to set the SSID\n"); | 1505 | wiphy_err(wiphy, "Failed to set the SSID\n"); |
1478 | kfree(bss_cfg); | 1506 | kfree(bss_cfg); |
1479 | return -1; | 1507 | return -1; |
@@ -1481,8 +1509,8 @@ static int mwifiex_cfg80211_start_ap(struct wiphy *wiphy, | |||
1481 | 1509 | ||
1482 | kfree(bss_cfg); | 1510 | kfree(bss_cfg); |
1483 | 1511 | ||
1484 | if (mwifiex_send_cmd_async(priv, HostCmd_CMD_UAP_BSS_START, | 1512 | if (mwifiex_send_cmd(priv, HostCmd_CMD_UAP_BSS_START, |
1485 | HostCmd_ACT_GEN_SET, 0, NULL)) { | 1513 | HostCmd_ACT_GEN_SET, 0, NULL, false)) { |
1486 | wiphy_err(wiphy, "Failed to start the BSS\n"); | 1514 | wiphy_err(wiphy, "Failed to start the BSS\n"); |
1487 | return -1; | 1515 | return -1; |
1488 | } | 1516 | } |
@@ -1492,9 +1520,9 @@ static int mwifiex_cfg80211_start_ap(struct wiphy *wiphy, | |||
1492 | else | 1520 | else |
1493 | priv->curr_pkt_filter &= ~HostCmd_ACT_MAC_WEP_ENABLE; | 1521 | priv->curr_pkt_filter &= ~HostCmd_ACT_MAC_WEP_ENABLE; |
1494 | 1522 | ||
1495 | if (mwifiex_send_cmd_sync(priv, HostCmd_CMD_MAC_CONTROL, | 1523 | if (mwifiex_send_cmd(priv, HostCmd_CMD_MAC_CONTROL, |
1496 | HostCmd_ACT_GEN_SET, 0, | 1524 | HostCmd_ACT_GEN_SET, 0, |
1497 | &priv->curr_pkt_filter)) | 1525 | &priv->curr_pkt_filter, true)) |
1498 | return -1; | 1526 | return -1; |
1499 | 1527 | ||
1500 | return 0; | 1528 | return 0; |
@@ -1583,8 +1611,9 @@ static int mwifiex_cfg80211_inform_ibss_bss(struct mwifiex_private *priv) | |||
1583 | * the function notifies the CFG802.11 subsystem of the new BSS connection. | 1611 | * the function notifies the CFG802.11 subsystem of the new BSS connection. |
1584 | */ | 1612 | */ |
1585 | static int | 1613 | static int |
1586 | mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, u8 *ssid, | 1614 | mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, |
1587 | u8 *bssid, int mode, struct ieee80211_channel *channel, | 1615 | const u8 *ssid, const u8 *bssid, int mode, |
1616 | struct ieee80211_channel *channel, | ||
1588 | struct cfg80211_connect_params *sme, bool privacy) | 1617 | struct cfg80211_connect_params *sme, bool privacy) |
1589 | { | 1618 | { |
1590 | struct cfg80211_ssid req_ssid; | 1619 | struct cfg80211_ssid req_ssid; |
@@ -1881,7 +1910,8 @@ mwifiex_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev, | |||
1881 | params->privacy); | 1910 | params->privacy); |
1882 | done: | 1911 | done: |
1883 | if (!ret) { | 1912 | if (!ret) { |
1884 | cfg80211_ibss_joined(priv->netdev, priv->cfg_bssid, GFP_KERNEL); | 1913 | cfg80211_ibss_joined(priv->netdev, priv->cfg_bssid, |
1914 | params->chandef.chan, GFP_KERNEL); | ||
1885 | dev_dbg(priv->adapter->dev, | 1915 | dev_dbg(priv->adapter->dev, |
1886 | "info: joined/created adhoc network with bssid" | 1916 | "info: joined/created adhoc network with bssid" |
1887 | " %pM successfully\n", priv->cfg_bssid); | 1917 | " %pM successfully\n", priv->cfg_bssid); |
@@ -2070,10 +2100,10 @@ mwifiex_setup_ht_caps(struct ieee80211_sta_ht_cap *ht_info, | |||
2070 | else | 2100 | else |
2071 | ht_info->cap &= ~IEEE80211_HT_CAP_SGI_40; | 2101 | ht_info->cap &= ~IEEE80211_HT_CAP_SGI_40; |
2072 | 2102 | ||
2073 | if (ISSUPP_RXSTBC(adapter->hw_dot_11n_dev_cap)) | 2103 | if (adapter->user_dev_mcs_support == HT_STREAM_2X2) |
2074 | ht_info->cap |= 1 << IEEE80211_HT_CAP_RX_STBC_SHIFT; | 2104 | ht_info->cap |= 3 << IEEE80211_HT_CAP_RX_STBC_SHIFT; |
2075 | else | 2105 | else |
2076 | ht_info->cap &= ~(3 << IEEE80211_HT_CAP_RX_STBC_SHIFT); | 2106 | ht_info->cap |= 1 << IEEE80211_HT_CAP_RX_STBC_SHIFT; |
2077 | 2107 | ||
2078 | if (ISSUPP_TXSTBC(adapter->hw_dot_11n_dev_cap)) | 2108 | if (ISSUPP_TXSTBC(adapter->hw_dot_11n_dev_cap)) |
2079 | ht_info->cap |= IEEE80211_HT_CAP_TX_STBC; | 2109 | ht_info->cap |= IEEE80211_HT_CAP_TX_STBC; |
@@ -2098,8 +2128,8 @@ mwifiex_setup_ht_caps(struct ieee80211_sta_ht_cap *ht_info, | |||
2098 | ht_info->cap &= ~IEEE80211_HT_CAP_MAX_AMSDU; | 2128 | ht_info->cap &= ~IEEE80211_HT_CAP_MAX_AMSDU; |
2099 | ht_info->cap |= IEEE80211_HT_CAP_SM_PS; | 2129 | ht_info->cap |= IEEE80211_HT_CAP_SM_PS; |
2100 | 2130 | ||
2101 | rx_mcs_supp = GET_RXMCSSUPP(adapter->hw_dev_mcs_support); | 2131 | rx_mcs_supp = GET_RXMCSSUPP(adapter->user_dev_mcs_support); |
2102 | /* Set MCS for 1x1 */ | 2132 | /* Set MCS for 1x1/2x2 */ |
2103 | memset(mcs, 0xff, rx_mcs_supp); | 2133 | memset(mcs, 0xff, rx_mcs_supp); |
2104 | /* Clear all the other values */ | 2134 | /* Clear all the other values */ |
2105 | memset(&mcs[rx_mcs_supp], 0, | 2135 | memset(&mcs[rx_mcs_supp], 0, |
@@ -2460,9 +2490,8 @@ static int mwifiex_cfg80211_suspend(struct wiphy *wiphy, | |||
2460 | MWIFIEX_CRITERIA_UNICAST | | 2490 | MWIFIEX_CRITERIA_UNICAST | |
2461 | MWIFIEX_CRITERIA_MULTICAST; | 2491 | MWIFIEX_CRITERIA_MULTICAST; |
2462 | 2492 | ||
2463 | ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_MEF_CFG, | 2493 | ret = mwifiex_send_cmd(priv, HostCmd_CMD_MEF_CFG, |
2464 | HostCmd_ACT_GEN_SET, 0, | 2494 | HostCmd_ACT_GEN_SET, 0, &mef_cfg, true); |
2465 | &mef_cfg); | ||
2466 | 2495 | ||
2467 | kfree(mef_entry); | 2496 | kfree(mef_entry); |
2468 | return ret; | 2497 | return ret; |
@@ -2574,9 +2603,9 @@ static int mwifiex_cfg80211_set_coalesce(struct wiphy *wiphy, | |||
2574 | if (!coalesce) { | 2603 | if (!coalesce) { |
2575 | dev_dbg(adapter->dev, | 2604 | dev_dbg(adapter->dev, |
2576 | "Disable coalesce and reset all previous rules\n"); | 2605 | "Disable coalesce and reset all previous rules\n"); |
2577 | return mwifiex_send_cmd_sync(priv, HostCmd_CMD_COALESCE_CFG, | 2606 | return mwifiex_send_cmd(priv, HostCmd_CMD_COALESCE_CFG, |
2578 | HostCmd_ACT_GEN_SET, 0, | 2607 | HostCmd_ACT_GEN_SET, 0, |
2579 | &coalesce_cfg); | 2608 | &coalesce_cfg, true); |
2580 | } | 2609 | } |
2581 | 2610 | ||
2582 | coalesce_cfg.num_of_rules = coalesce->n_rules; | 2611 | coalesce_cfg.num_of_rules = coalesce->n_rules; |
@@ -2591,8 +2620,172 @@ static int mwifiex_cfg80211_set_coalesce(struct wiphy *wiphy, | |||
2591 | } | 2620 | } |
2592 | } | 2621 | } |
2593 | 2622 | ||
2594 | return mwifiex_send_cmd_sync(priv, HostCmd_CMD_COALESCE_CFG, | 2623 | return mwifiex_send_cmd(priv, HostCmd_CMD_COALESCE_CFG, |
2595 | HostCmd_ACT_GEN_SET, 0, &coalesce_cfg); | 2624 | HostCmd_ACT_GEN_SET, 0, &coalesce_cfg, true); |
2625 | } | ||
2626 | |||
2627 | /* cfg80211 ops handler for tdls_mgmt. | ||
2628 | * Function prepares TDLS action frame packets and forwards them to FW | ||
2629 | */ | ||
2630 | static int | ||
2631 | mwifiex_cfg80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev, | ||
2632 | u8 *peer, u8 action_code, u8 dialog_token, | ||
2633 | u16 status_code, u32 peer_capability, | ||
2634 | const u8 *extra_ies, size_t extra_ies_len) | ||
2635 | { | ||
2636 | struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); | ||
2637 | int ret; | ||
2638 | |||
2639 | if (!(wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS)) | ||
2640 | return -ENOTSUPP; | ||
2641 | |||
2642 | /* make sure we are in station mode and connected */ | ||
2643 | if (!(priv->bss_type == MWIFIEX_BSS_TYPE_STA && priv->media_connected)) | ||
2644 | return -ENOTSUPP; | ||
2645 | |||
2646 | switch (action_code) { | ||
2647 | case WLAN_TDLS_SETUP_REQUEST: | ||
2648 | dev_dbg(priv->adapter->dev, | ||
2649 | "Send TDLS Setup Request to %pM status_code=%d\n", peer, | ||
2650 | status_code); | ||
2651 | ret = mwifiex_send_tdls_data_frame(priv, peer, action_code, | ||
2652 | dialog_token, status_code, | ||
2653 | extra_ies, extra_ies_len); | ||
2654 | break; | ||
2655 | case WLAN_TDLS_SETUP_RESPONSE: | ||
2656 | dev_dbg(priv->adapter->dev, | ||
2657 | "Send TDLS Setup Response to %pM status_code=%d\n", | ||
2658 | peer, status_code); | ||
2659 | ret = mwifiex_send_tdls_data_frame(priv, peer, action_code, | ||
2660 | dialog_token, status_code, | ||
2661 | extra_ies, extra_ies_len); | ||
2662 | break; | ||
2663 | case WLAN_TDLS_SETUP_CONFIRM: | ||
2664 | dev_dbg(priv->adapter->dev, | ||
2665 | "Send TDLS Confirm to %pM status_code=%d\n", peer, | ||
2666 | status_code); | ||
2667 | ret = mwifiex_send_tdls_data_frame(priv, peer, action_code, | ||
2668 | dialog_token, status_code, | ||
2669 | extra_ies, extra_ies_len); | ||
2670 | break; | ||
2671 | case WLAN_TDLS_TEARDOWN: | ||
2672 | dev_dbg(priv->adapter->dev, "Send TDLS Tear down to %pM\n", | ||
2673 | peer); | ||
2674 | ret = mwifiex_send_tdls_data_frame(priv, peer, action_code, | ||
2675 | dialog_token, status_code, | ||
2676 | extra_ies, extra_ies_len); | ||
2677 | break; | ||
2678 | case WLAN_TDLS_DISCOVERY_REQUEST: | ||
2679 | dev_dbg(priv->adapter->dev, | ||
2680 | "Send TDLS Discovery Request to %pM\n", peer); | ||
2681 | ret = mwifiex_send_tdls_data_frame(priv, peer, action_code, | ||
2682 | dialog_token, status_code, | ||
2683 | extra_ies, extra_ies_len); | ||
2684 | break; | ||
2685 | case WLAN_PUB_ACTION_TDLS_DISCOVER_RES: | ||
2686 | dev_dbg(priv->adapter->dev, | ||
2687 | "Send TDLS Discovery Response to %pM\n", peer); | ||
2688 | ret = mwifiex_send_tdls_action_frame(priv, peer, action_code, | ||
2689 | dialog_token, status_code, | ||
2690 | extra_ies, extra_ies_len); | ||
2691 | break; | ||
2692 | default: | ||
2693 | dev_warn(priv->adapter->dev, | ||
2694 | "Unknown TDLS mgmt/action frame %pM\n", peer); | ||
2695 | ret = -EINVAL; | ||
2696 | break; | ||
2697 | } | ||
2698 | |||
2699 | return ret; | ||
2700 | } | ||
2701 | |||
2702 | static int | ||
2703 | mwifiex_cfg80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev, | ||
2704 | u8 *peer, enum nl80211_tdls_operation action) | ||
2705 | { | ||
2706 | struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); | ||
2707 | |||
2708 | if (!(wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS) || | ||
2709 | !(wiphy->flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) | ||
2710 | return -ENOTSUPP; | ||
2711 | |||
2712 | /* make sure we are in station mode and connected */ | ||
2713 | if (!(priv->bss_type == MWIFIEX_BSS_TYPE_STA && priv->media_connected)) | ||
2714 | return -ENOTSUPP; | ||
2715 | |||
2716 | dev_dbg(priv->adapter->dev, | ||
2717 | "TDLS peer=%pM, oper=%d\n", peer, action); | ||
2718 | |||
2719 | switch (action) { | ||
2720 | case NL80211_TDLS_ENABLE_LINK: | ||
2721 | action = MWIFIEX_TDLS_ENABLE_LINK; | ||
2722 | break; | ||
2723 | case NL80211_TDLS_DISABLE_LINK: | ||
2724 | action = MWIFIEX_TDLS_DISABLE_LINK; | ||
2725 | break; | ||
2726 | case NL80211_TDLS_TEARDOWN: | ||
2727 | /* shouldn't happen!*/ | ||
2728 | dev_warn(priv->adapter->dev, | ||
2729 | "tdls_oper: teardown from driver not supported\n"); | ||
2730 | return -EINVAL; | ||
2731 | case NL80211_TDLS_SETUP: | ||
2732 | /* shouldn't happen!*/ | ||
2733 | dev_warn(priv->adapter->dev, | ||
2734 | "tdls_oper: setup from driver not supported\n"); | ||
2735 | return -EINVAL; | ||
2736 | case NL80211_TDLS_DISCOVERY_REQ: | ||
2737 | /* shouldn't happen!*/ | ||
2738 | dev_warn(priv->adapter->dev, | ||
2739 | "tdls_oper: discovery from driver not supported\n"); | ||
2740 | return -EINVAL; | ||
2741 | default: | ||
2742 | dev_err(priv->adapter->dev, | ||
2743 | "tdls_oper: operation not supported\n"); | ||
2744 | return -ENOTSUPP; | ||
2745 | } | ||
2746 | |||
2747 | return mwifiex_tdls_oper(priv, peer, action); | ||
2748 | } | ||
2749 | |||
2750 | static int | ||
2751 | mwifiex_cfg80211_add_station(struct wiphy *wiphy, | ||
2752 | struct net_device *dev, | ||
2753 | u8 *mac, struct station_parameters *params) | ||
2754 | { | ||
2755 | struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); | ||
2756 | |||
2757 | if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) | ||
2758 | return -ENOTSUPP; | ||
2759 | |||
2760 | /* make sure we are in station mode and connected */ | ||
2761 | if ((priv->bss_type != MWIFIEX_BSS_TYPE_STA) || !priv->media_connected) | ||
2762 | return -ENOTSUPP; | ||
2763 | |||
2764 | return mwifiex_tdls_oper(priv, mac, MWIFIEX_TDLS_CREATE_LINK); | ||
2765 | } | ||
2766 | |||
2767 | static int | ||
2768 | mwifiex_cfg80211_change_station(struct wiphy *wiphy, | ||
2769 | struct net_device *dev, | ||
2770 | u8 *mac, struct station_parameters *params) | ||
2771 | { | ||
2772 | int ret; | ||
2773 | struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); | ||
2774 | |||
2775 | /* we support change_station handler only for TDLS peers*/ | ||
2776 | if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) | ||
2777 | return -ENOTSUPP; | ||
2778 | |||
2779 | /* make sure we are in station mode and connected */ | ||
2780 | if ((priv->bss_type != MWIFIEX_BSS_TYPE_STA) || !priv->media_connected) | ||
2781 | return -ENOTSUPP; | ||
2782 | |||
2783 | priv->sta_params = params; | ||
2784 | |||
2785 | ret = mwifiex_tdls_oper(priv, mac, MWIFIEX_TDLS_CONFIG_LINK); | ||
2786 | priv->sta_params = NULL; | ||
2787 | |||
2788 | return ret; | ||
2596 | } | 2789 | } |
2597 | 2790 | ||
2598 | /* station cfg80211 operations */ | 2791 | /* station cfg80211 operations */ |
@@ -2630,6 +2823,10 @@ static struct cfg80211_ops mwifiex_cfg80211_ops = { | |||
2630 | .set_wakeup = mwifiex_cfg80211_set_wakeup, | 2823 | .set_wakeup = mwifiex_cfg80211_set_wakeup, |
2631 | #endif | 2824 | #endif |
2632 | .set_coalesce = mwifiex_cfg80211_set_coalesce, | 2825 | .set_coalesce = mwifiex_cfg80211_set_coalesce, |
2826 | .tdls_mgmt = mwifiex_cfg80211_tdls_mgmt, | ||
2827 | .tdls_oper = mwifiex_cfg80211_tdls_oper, | ||
2828 | .add_station = mwifiex_cfg80211_add_station, | ||
2829 | .change_station = mwifiex_cfg80211_change_station, | ||
2633 | }; | 2830 | }; |
2634 | 2831 | ||
2635 | #ifdef CONFIG_PM | 2832 | #ifdef CONFIG_PM |
@@ -2715,6 +2912,11 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter) | |||
2715 | WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD | | 2912 | WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD | |
2716 | WIPHY_FLAG_AP_UAPSD | | 2913 | WIPHY_FLAG_AP_UAPSD | |
2717 | WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; | 2914 | WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; |
2915 | |||
2916 | if (ISSUPP_TDLS_ENABLED(adapter->fw_cap_info)) | ||
2917 | wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS | | ||
2918 | WIPHY_FLAG_TDLS_EXTERNAL_SETUP; | ||
2919 | |||
2718 | wiphy->regulatory_flags |= | 2920 | wiphy->regulatory_flags |= |
2719 | REGULATORY_CUSTOM_REG | | 2921 | REGULATORY_CUSTOM_REG | |
2720 | REGULATORY_STRICT_REG; | 2922 | REGULATORY_STRICT_REG; |
@@ -2736,7 +2938,8 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter) | |||
2736 | 2938 | ||
2737 | wiphy->features |= NL80211_FEATURE_HT_IBSS | | 2939 | wiphy->features |= NL80211_FEATURE_HT_IBSS | |
2738 | NL80211_FEATURE_INACTIVITY_TIMER | | 2940 | NL80211_FEATURE_INACTIVITY_TIMER | |
2739 | NL80211_FEATURE_LOW_PRIORITY_SCAN; | 2941 | NL80211_FEATURE_LOW_PRIORITY_SCAN | |
2942 | NL80211_FEATURE_NEED_OBSS_SCAN; | ||
2740 | 2943 | ||
2741 | /* Reserve space for mwifiex specific private data for BSS */ | 2944 | /* Reserve space for mwifiex specific private data for BSS */ |
2742 | wiphy->bss_priv_size = sizeof(struct mwifiex_bss_priv); | 2945 | wiphy->bss_priv_size = sizeof(struct mwifiex_bss_priv); |
@@ -2767,17 +2970,17 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter) | |||
2767 | country_code); | 2970 | country_code); |
2768 | } | 2971 | } |
2769 | 2972 | ||
2770 | mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_SNMP_MIB, | 2973 | mwifiex_send_cmd(priv, HostCmd_CMD_802_11_SNMP_MIB, |
2771 | HostCmd_ACT_GEN_GET, FRAG_THRESH_I, &thr); | 2974 | HostCmd_ACT_GEN_GET, FRAG_THRESH_I, &thr, true); |
2772 | wiphy->frag_threshold = thr; | 2975 | wiphy->frag_threshold = thr; |
2773 | mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_SNMP_MIB, | 2976 | mwifiex_send_cmd(priv, HostCmd_CMD_802_11_SNMP_MIB, |
2774 | HostCmd_ACT_GEN_GET, RTS_THRESH_I, &thr); | 2977 | HostCmd_ACT_GEN_GET, RTS_THRESH_I, &thr, true); |
2775 | wiphy->rts_threshold = thr; | 2978 | wiphy->rts_threshold = thr; |
2776 | mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_SNMP_MIB, | 2979 | mwifiex_send_cmd(priv, HostCmd_CMD_802_11_SNMP_MIB, |
2777 | HostCmd_ACT_GEN_GET, SHORT_RETRY_LIM_I, &retry); | 2980 | HostCmd_ACT_GEN_GET, SHORT_RETRY_LIM_I, &retry, true); |
2778 | wiphy->retry_short = (u8) retry; | 2981 | wiphy->retry_short = (u8) retry; |
2779 | mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_SNMP_MIB, | 2982 | mwifiex_send_cmd(priv, HostCmd_CMD_802_11_SNMP_MIB, |
2780 | HostCmd_ACT_GEN_GET, LONG_RETRY_LIM_I, &retry); | 2983 | HostCmd_ACT_GEN_GET, LONG_RETRY_LIM_I, &retry, true); |
2781 | wiphy->retry_long = (u8) retry; | 2984 | wiphy->retry_long = (u8) retry; |
2782 | 2985 | ||
2783 | adapter->wiphy = wiphy; | 2986 | adapter->wiphy = wiphy; |