diff options
| author | David S. Miller <davem@davemloft.net> | 2014-07-02 02:47:33 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2014-07-02 02:47:33 -0400 |
| commit | eb608d2b99d993a4b4ee9cb70e6cf66f96bb1168 (patch) | |
| tree | 0f6dfa1dd1616bed670de8b0bed540a37adfa66f | |
| parent | b758858c5ceb1b30ae7d04dea6c74821bd7c7d69 (diff) | |
| parent | f9fa39e9ace5a8abbe9597c2970828ced67261da (diff) | |
Merge branch 'for-davem' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
John W. Linville says:
====================
pull request: wireless 2014-06-27
Please pull the following batch of fixes for the 3.16 stream...
For the mac80211 bits, Johannes says:
"We have a fix from Eliad for a time calculation, a fix from Max for
head/tailroom when sending authentication packets, a revert that Felix
requested since the patch in question broke regulatory and a fix from
myself for an issue with a new command that we advertised in the wrong
place."
For the bluetooth bits, Gustavo says:
"A few fixes for 3.16. This pull request contains a NULL dereference fix,
and some security/pairing fixes."
For the iwlwifi bits, Emmanuel says:
"I have here a fix from Eliad for scheduled scan: it fixes a firmware
assertion. Arik reverts a patch I made that didn't take into account
that 3160 doesn't have UAPSD and hence, we can't assume that all
newer firmwares support the feature. Here too, the visible effect
is a firmware assertion. Along with that, we have a few fixes and
additions to the device list."
For the ath10k bits, Kalle says:
"Bartosz fixed an issue where we were not able to create 8 vdevs when
using DFS. Michal removed a false warning which was just confusing
people."
On top of that...
Arend van Spriel fixes a 'divide by zero' regression in brcmfmac.
Amitkumar Karwar corrects a transmit timeout in mwifiex.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | drivers/bluetooth/ath3k.c | 2 | ||||
| -rw-r--r-- | drivers/bluetooth/btusb.c | 1 | ||||
| -rw-r--r-- | drivers/bluetooth/hci_h5.c | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath10k/core.c | 6 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath10k/htt_rx.c | 18 | ||||
| -rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/usb.c | 5 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-fw.h | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/mac80211.c | 7 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/scan.c | 65 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/drv.c | 3 | ||||
| -rw-r--r-- | drivers/net/wireless/mwifiex/main.c | 1 | ||||
| -rw-r--r-- | net/bluetooth/hci_conn.c | 12 | ||||
| -rw-r--r-- | net/bluetooth/smp.c | 60 | ||||
| -rw-r--r-- | net/mac80211/util.c | 5 | ||||
| -rw-r--r-- | net/wireless/core.h | 2 | ||||
| -rw-r--r-- | net/wireless/nl80211.c | 11 | ||||
| -rw-r--r-- | net/wireless/reg.c | 22 |
17 files changed, 112 insertions, 110 deletions
diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c index f98380648cb3..f50dffc0374f 100644 --- a/drivers/bluetooth/ath3k.c +++ b/drivers/bluetooth/ath3k.c | |||
| @@ -90,7 +90,6 @@ static const struct usb_device_id ath3k_table[] = { | |||
| 90 | { USB_DEVICE(0x0b05, 0x17d0) }, | 90 | { USB_DEVICE(0x0b05, 0x17d0) }, |
| 91 | { USB_DEVICE(0x0CF3, 0x0036) }, | 91 | { USB_DEVICE(0x0CF3, 0x0036) }, |
| 92 | { USB_DEVICE(0x0CF3, 0x3004) }, | 92 | { USB_DEVICE(0x0CF3, 0x3004) }, |
| 93 | { USB_DEVICE(0x0CF3, 0x3005) }, | ||
| 94 | { USB_DEVICE(0x0CF3, 0x3008) }, | 93 | { USB_DEVICE(0x0CF3, 0x3008) }, |
| 95 | { USB_DEVICE(0x0CF3, 0x311D) }, | 94 | { USB_DEVICE(0x0CF3, 0x311D) }, |
| 96 | { USB_DEVICE(0x0CF3, 0x311E) }, | 95 | { USB_DEVICE(0x0CF3, 0x311E) }, |
| @@ -140,7 +139,6 @@ static const struct usb_device_id ath3k_blist_tbl[] = { | |||
| 140 | { USB_DEVICE(0x0b05, 0x17d0), .driver_info = BTUSB_ATH3012 }, | 139 | { USB_DEVICE(0x0b05, 0x17d0), .driver_info = BTUSB_ATH3012 }, |
| 141 | { USB_DEVICE(0x0CF3, 0x0036), .driver_info = BTUSB_ATH3012 }, | 140 | { USB_DEVICE(0x0CF3, 0x0036), .driver_info = BTUSB_ATH3012 }, |
| 142 | { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 }, | 141 | { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 }, |
| 143 | { USB_DEVICE(0x0cf3, 0x3005), .driver_info = BTUSB_ATH3012 }, | ||
| 144 | { USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 }, | 142 | { USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 }, |
| 145 | { USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 }, | 143 | { USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 }, |
| 146 | { USB_DEVICE(0x0cf3, 0x311E), .driver_info = BTUSB_ATH3012 }, | 144 | { USB_DEVICE(0x0cf3, 0x311E), .driver_info = BTUSB_ATH3012 }, |
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index a1c80b0c7663..6250fc2fb93a 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c | |||
| @@ -162,7 +162,6 @@ static const struct usb_device_id blacklist_table[] = { | |||
| 162 | { USB_DEVICE(0x0b05, 0x17d0), .driver_info = BTUSB_ATH3012 }, | 162 | { USB_DEVICE(0x0b05, 0x17d0), .driver_info = BTUSB_ATH3012 }, |
| 163 | { USB_DEVICE(0x0cf3, 0x0036), .driver_info = BTUSB_ATH3012 }, | 163 | { USB_DEVICE(0x0cf3, 0x0036), .driver_info = BTUSB_ATH3012 }, |
| 164 | { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 }, | 164 | { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 }, |
| 165 | { USB_DEVICE(0x0cf3, 0x3005), .driver_info = BTUSB_ATH3012 }, | ||
| 166 | { USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 }, | 165 | { USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 }, |
| 167 | { USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 }, | 166 | { USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 }, |
| 168 | { USB_DEVICE(0x0cf3, 0x311e), .driver_info = BTUSB_ATH3012 }, | 167 | { USB_DEVICE(0x0cf3, 0x311e), .driver_info = BTUSB_ATH3012 }, |
diff --git a/drivers/bluetooth/hci_h5.c b/drivers/bluetooth/hci_h5.c index 04680ead9275..fede8ca7147c 100644 --- a/drivers/bluetooth/hci_h5.c +++ b/drivers/bluetooth/hci_h5.c | |||
| @@ -406,6 +406,7 @@ static int h5_rx_3wire_hdr(struct hci_uart *hu, unsigned char c) | |||
| 406 | H5_HDR_PKT_TYPE(hdr) != HCI_3WIRE_LINK_PKT) { | 406 | H5_HDR_PKT_TYPE(hdr) != HCI_3WIRE_LINK_PKT) { |
| 407 | BT_ERR("Non-link packet received in non-active state"); | 407 | BT_ERR("Non-link packet received in non-active state"); |
| 408 | h5_reset_rx(h5); | 408 | h5_reset_rx(h5); |
| 409 | return 0; | ||
| 409 | } | 410 | } |
| 410 | 411 | ||
| 411 | h5->rx_func = h5_rx_payload; | 412 | h5->rx_func = h5_rx_payload; |
diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c index 82017f56e661..e6c56c5bb0f6 100644 --- a/drivers/net/wireless/ath/ath10k/core.c +++ b/drivers/net/wireless/ath/ath10k/core.c | |||
| @@ -795,7 +795,11 @@ int ath10k_core_start(struct ath10k *ar) | |||
| 795 | if (status) | 795 | if (status) |
| 796 | goto err_htc_stop; | 796 | goto err_htc_stop; |
| 797 | 797 | ||
| 798 | ar->free_vdev_map = (1 << TARGET_NUM_VDEVS) - 1; | 798 | if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) |
| 799 | ar->free_vdev_map = (1 << TARGET_10X_NUM_VDEVS) - 1; | ||
| 800 | else | ||
| 801 | ar->free_vdev_map = (1 << TARGET_NUM_VDEVS) - 1; | ||
| 802 | |||
| 799 | INIT_LIST_HEAD(&ar->arvifs); | 803 | INIT_LIST_HEAD(&ar->arvifs); |
| 800 | 804 | ||
| 801 | if (!test_bit(ATH10K_FLAG_FIRST_BOOT_DONE, &ar->dev_flags)) | 805 | if (!test_bit(ATH10K_FLAG_FIRST_BOOT_DONE, &ar->dev_flags)) |
diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c index 6c102b1312ff..eebc860c3655 100644 --- a/drivers/net/wireless/ath/ath10k/htt_rx.c +++ b/drivers/net/wireless/ath/ath10k/htt_rx.c | |||
| @@ -312,7 +312,6 @@ static int ath10k_htt_rx_amsdu_pop(struct ath10k_htt *htt, | |||
| 312 | int msdu_len, msdu_chaining = 0; | 312 | int msdu_len, msdu_chaining = 0; |
| 313 | struct sk_buff *msdu; | 313 | struct sk_buff *msdu; |
| 314 | struct htt_rx_desc *rx_desc; | 314 | struct htt_rx_desc *rx_desc; |
| 315 | bool corrupted = false; | ||
| 316 | 315 | ||
| 317 | lockdep_assert_held(&htt->rx_ring.lock); | 316 | lockdep_assert_held(&htt->rx_ring.lock); |
| 318 | 317 | ||
| @@ -439,9 +438,6 @@ static int ath10k_htt_rx_amsdu_pop(struct ath10k_htt *htt, | |||
| 439 | last_msdu = __le32_to_cpu(rx_desc->msdu_end.info0) & | 438 | last_msdu = __le32_to_cpu(rx_desc->msdu_end.info0) & |
| 440 | RX_MSDU_END_INFO0_LAST_MSDU; | 439 | RX_MSDU_END_INFO0_LAST_MSDU; |
| 441 | 440 | ||
| 442 | if (msdu_chaining && !last_msdu) | ||
| 443 | corrupted = true; | ||
| 444 | |||
| 445 | if (last_msdu) { | 441 | if (last_msdu) { |
| 446 | msdu->next = NULL; | 442 | msdu->next = NULL; |
| 447 | break; | 443 | break; |
| @@ -457,20 +453,6 @@ static int ath10k_htt_rx_amsdu_pop(struct ath10k_htt *htt, | |||
| 457 | msdu_chaining = -1; | 453 | msdu_chaining = -1; |
| 458 | 454 | ||
| 459 | /* | 455 | /* |
| 460 | * Apparently FW sometimes reports weird chained MSDU sequences with | ||
| 461 | * more than one rx descriptor. This seems like a bug but needs more | ||
| 462 | * analyzing. For the time being fix it by dropping such sequences to | ||
| 463 | * avoid blowing up the host system. | ||
| 464 | */ | ||
| 465 | if (corrupted) { | ||
| 466 | ath10k_warn("failed to pop chained msdus, dropping\n"); | ||
| 467 | ath10k_htt_rx_free_msdu_chain(*head_msdu); | ||
| 468 | *head_msdu = NULL; | ||
| 469 | *tail_msdu = NULL; | ||
| 470 | msdu_chaining = -EINVAL; | ||
| 471 | } | ||
| 472 | |||
| 473 | /* | ||
| 474 | * Don't refill the ring yet. | 456 | * Don't refill the ring yet. |
| 475 | * | 457 | * |
| 476 | * First, the elements popped here are still in use - it is not | 458 | * First, the elements popped here are still in use - it is not |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/brcm80211/brcmfmac/usb.c index 6db51a666f61..d06fcb05adf2 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c | |||
| @@ -1184,8 +1184,6 @@ static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo) | |||
| 1184 | bus->bus_priv.usb = bus_pub; | 1184 | bus->bus_priv.usb = bus_pub; |
| 1185 | dev_set_drvdata(dev, bus); | 1185 | dev_set_drvdata(dev, bus); |
| 1186 | bus->ops = &brcmf_usb_bus_ops; | 1186 | bus->ops = &brcmf_usb_bus_ops; |
| 1187 | bus->chip = bus_pub->devid; | ||
| 1188 | bus->chiprev = bus_pub->chiprev; | ||
| 1189 | bus->proto_type = BRCMF_PROTO_BCDC; | 1187 | bus->proto_type = BRCMF_PROTO_BCDC; |
| 1190 | bus->always_use_fws_queue = true; | 1188 | bus->always_use_fws_queue = true; |
| 1191 | 1189 | ||
| @@ -1194,6 +1192,9 @@ static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo) | |||
| 1194 | if (ret) | 1192 | if (ret) |
| 1195 | goto fail; | 1193 | goto fail; |
| 1196 | } | 1194 | } |
| 1195 | bus->chip = bus_pub->devid; | ||
| 1196 | bus->chiprev = bus_pub->chiprev; | ||
| 1197 | |||
| 1197 | /* request firmware here */ | 1198 | /* request firmware here */ |
| 1198 | brcmf_fw_get_firmwares(dev, 0, brcmf_usb_get_fwname(devinfo), NULL, | 1199 | brcmf_fw_get_firmwares(dev, 0, brcmf_usb_get_fwname(devinfo), NULL, |
| 1199 | brcmf_usb_probe_phase2); | 1200 | brcmf_usb_probe_phase2); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-fw.h b/drivers/net/wireless/iwlwifi/iwl-fw.h index 0aa7c0085c9f..b1a33322b9ba 100644 --- a/drivers/net/wireless/iwlwifi/iwl-fw.h +++ b/drivers/net/wireless/iwlwifi/iwl-fw.h | |||
| @@ -88,6 +88,7 @@ | |||
| 88 | * P2P client interfaces simultaneously if they are in different bindings. | 88 | * P2P client interfaces simultaneously if they are in different bindings. |
| 89 | * @IWL_UCODE_TLV_FLAGS_P2P_BSS_PS_SCM: support power save on BSS station and | 89 | * @IWL_UCODE_TLV_FLAGS_P2P_BSS_PS_SCM: support power save on BSS station and |
| 90 | * P2P client interfaces simultaneously if they are in same bindings. | 90 | * P2P client interfaces simultaneously if they are in same bindings. |
| 91 | * @IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT: General support for uAPSD | ||
| 91 | * @IWL_UCODE_TLV_FLAGS_P2P_PS_UAPSD: P2P client supports uAPSD power save | 92 | * @IWL_UCODE_TLV_FLAGS_P2P_PS_UAPSD: P2P client supports uAPSD power save |
| 92 | * @IWL_UCODE_TLV_FLAGS_BCAST_FILTERING: uCode supports broadcast filtering. | 93 | * @IWL_UCODE_TLV_FLAGS_BCAST_FILTERING: uCode supports broadcast filtering. |
| 93 | * @IWL_UCODE_TLV_FLAGS_GO_UAPSD: AP/GO interfaces support uAPSD clients | 94 | * @IWL_UCODE_TLV_FLAGS_GO_UAPSD: AP/GO interfaces support uAPSD clients |
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c index 7215f5980186..1cef708cb74d 100644 --- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c +++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c | |||
| @@ -303,6 +303,13 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm) | |||
| 303 | hw->uapsd_max_sp_len = IWL_UAPSD_MAX_SP; | 303 | hw->uapsd_max_sp_len = IWL_UAPSD_MAX_SP; |
| 304 | } | 304 | } |
| 305 | 305 | ||
| 306 | if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT && | ||
| 307 | !iwlwifi_mod_params.uapsd_disable) { | ||
| 308 | hw->flags |= IEEE80211_HW_SUPPORTS_UAPSD; | ||
| 309 | hw->uapsd_queues = IWL_UAPSD_AC_INFO; | ||
| 310 | hw->uapsd_max_sp_len = IWL_UAPSD_MAX_SP; | ||
| 311 | } | ||
| 312 | |||
| 306 | hw->sta_data_size = sizeof(struct iwl_mvm_sta); | 313 | hw->sta_data_size = sizeof(struct iwl_mvm_sta); |
| 307 | hw->vif_data_size = sizeof(struct iwl_mvm_vif); | 314 | hw->vif_data_size = sizeof(struct iwl_mvm_vif); |
| 308 | hw->chanctx_data_size = sizeof(u16); | 315 | hw->chanctx_data_size = sizeof(u16); |
diff --git a/drivers/net/wireless/iwlwifi/mvm/scan.c b/drivers/net/wireless/iwlwifi/mvm/scan.c index 4b6c7d4bd199..eac2b424f6a0 100644 --- a/drivers/net/wireless/iwlwifi/mvm/scan.c +++ b/drivers/net/wireless/iwlwifi/mvm/scan.c | |||
| @@ -588,9 +588,7 @@ static void iwl_build_scan_cmd(struct iwl_mvm *mvm, | |||
| 588 | struct iwl_scan_offload_cmd *scan, | 588 | struct iwl_scan_offload_cmd *scan, |
| 589 | struct iwl_mvm_scan_params *params) | 589 | struct iwl_mvm_scan_params *params) |
| 590 | { | 590 | { |
| 591 | scan->channel_count = | 591 | scan->channel_count = req->n_channels; |
| 592 | mvm->nvm_data->bands[IEEE80211_BAND_2GHZ].n_channels + | ||
| 593 | mvm->nvm_data->bands[IEEE80211_BAND_5GHZ].n_channels; | ||
| 594 | scan->quiet_time = cpu_to_le16(IWL_ACTIVE_QUIET_TIME); | 592 | scan->quiet_time = cpu_to_le16(IWL_ACTIVE_QUIET_TIME); |
| 595 | scan->quiet_plcp_th = cpu_to_le16(IWL_PLCP_QUIET_THRESH); | 593 | scan->quiet_plcp_th = cpu_to_le16(IWL_PLCP_QUIET_THRESH); |
| 596 | scan->good_CRC_th = IWL_GOOD_CRC_TH_DEFAULT; | 594 | scan->good_CRC_th = IWL_GOOD_CRC_TH_DEFAULT; |
| @@ -669,61 +667,37 @@ static void iwl_build_channel_cfg(struct iwl_mvm *mvm, | |||
| 669 | struct cfg80211_sched_scan_request *req, | 667 | struct cfg80211_sched_scan_request *req, |
| 670 | struct iwl_scan_channel_cfg *channels, | 668 | struct iwl_scan_channel_cfg *channels, |
| 671 | enum ieee80211_band band, | 669 | enum ieee80211_band band, |
| 672 | int *head, int *tail, | 670 | int *head, |
| 673 | u32 ssid_bitmap, | 671 | u32 ssid_bitmap, |
| 674 | struct iwl_mvm_scan_params *params) | 672 | struct iwl_mvm_scan_params *params) |
| 675 | { | 673 | { |
| 676 | struct ieee80211_supported_band *s_band; | 674 | int i, index = 0; |
| 677 | int n_channels = req->n_channels; | ||
| 678 | int i, j, index = 0; | ||
| 679 | bool partial; | ||
| 680 | 675 | ||
| 681 | /* | 676 | for (i = 0; i < req->n_channels; i++) { |
| 682 | * We have to configure all supported channels, even if we don't want to | 677 | struct ieee80211_channel *chan = req->channels[i]; |
| 683 | * scan on them, but we have to send channels in the order that we want | 678 | |
| 684 | * to scan. So add requested channels to head of the list and others to | 679 | if (chan->band != band) |
| 685 | * the end. | 680 | continue; |
| 686 | */ | 681 | |
| 687 | s_band = &mvm->nvm_data->bands[band]; | 682 | index = *head; |
| 688 | 683 | (*head)++; | |
| 689 | for (i = 0; i < s_band->n_channels && *head <= *tail; i++) { | 684 | |
| 690 | partial = false; | 685 | channels->channel_number[index] = cpu_to_le16(chan->hw_value); |
| 691 | for (j = 0; j < n_channels; j++) | ||
| 692 | if (s_band->channels[i].center_freq == | ||
| 693 | req->channels[j]->center_freq) { | ||
| 694 | index = *head; | ||
| 695 | (*head)++; | ||
| 696 | /* | ||
| 697 | * Channels that came with the request will be | ||
| 698 | * in partial scan . | ||
| 699 | */ | ||
| 700 | partial = true; | ||
| 701 | break; | ||
| 702 | } | ||
| 703 | if (!partial) { | ||
| 704 | index = *tail; | ||
| 705 | (*tail)--; | ||
| 706 | } | ||
| 707 | channels->channel_number[index] = | ||
| 708 | cpu_to_le16(ieee80211_frequency_to_channel( | ||
| 709 | s_band->channels[i].center_freq)); | ||
| 710 | channels->dwell_time[index][0] = params->dwell[band].active; | 686 | channels->dwell_time[index][0] = params->dwell[band].active; |
| 711 | channels->dwell_time[index][1] = params->dwell[band].passive; | 687 | channels->dwell_time[index][1] = params->dwell[band].passive; |
| 712 | 688 | ||
| 713 | channels->iter_count[index] = cpu_to_le16(1); | 689 | channels->iter_count[index] = cpu_to_le16(1); |
| 714 | channels->iter_interval[index] = 0; | 690 | channels->iter_interval[index] = 0; |
| 715 | 691 | ||
| 716 | if (!(s_band->channels[i].flags & IEEE80211_CHAN_NO_IR)) | 692 | if (!(chan->flags & IEEE80211_CHAN_NO_IR)) |
| 717 | channels->type[index] |= | 693 | channels->type[index] |= |
| 718 | cpu_to_le32(IWL_SCAN_OFFLOAD_CHANNEL_ACTIVE); | 694 | cpu_to_le32(IWL_SCAN_OFFLOAD_CHANNEL_ACTIVE); |
| 719 | 695 | ||
| 720 | channels->type[index] |= | 696 | channels->type[index] |= |
| 721 | cpu_to_le32(IWL_SCAN_OFFLOAD_CHANNEL_FULL); | 697 | cpu_to_le32(IWL_SCAN_OFFLOAD_CHANNEL_FULL | |
| 722 | if (partial) | 698 | IWL_SCAN_OFFLOAD_CHANNEL_PARTIAL); |
| 723 | channels->type[index] |= | ||
| 724 | cpu_to_le32(IWL_SCAN_OFFLOAD_CHANNEL_PARTIAL); | ||
| 725 | 699 | ||
| 726 | if (s_band->channels[i].flags & IEEE80211_CHAN_NO_HT40) | 700 | if (chan->flags & IEEE80211_CHAN_NO_HT40) |
| 727 | channels->type[index] |= | 701 | channels->type[index] |= |
| 728 | cpu_to_le32(IWL_SCAN_OFFLOAD_CHANNEL_NARROW); | 702 | cpu_to_le32(IWL_SCAN_OFFLOAD_CHANNEL_NARROW); |
| 729 | 703 | ||
| @@ -740,7 +714,6 @@ int iwl_mvm_config_sched_scan(struct iwl_mvm *mvm, | |||
| 740 | int band_2ghz = mvm->nvm_data->bands[IEEE80211_BAND_2GHZ].n_channels; | 714 | int band_2ghz = mvm->nvm_data->bands[IEEE80211_BAND_2GHZ].n_channels; |
| 741 | int band_5ghz = mvm->nvm_data->bands[IEEE80211_BAND_5GHZ].n_channels; | 715 | int band_5ghz = mvm->nvm_data->bands[IEEE80211_BAND_5GHZ].n_channels; |
| 742 | int head = 0; | 716 | int head = 0; |
| 743 | int tail = band_2ghz + band_5ghz - 1; | ||
| 744 | u32 ssid_bitmap; | 717 | u32 ssid_bitmap; |
| 745 | int cmd_len; | 718 | int cmd_len; |
| 746 | int ret; | 719 | int ret; |
| @@ -772,7 +745,7 @@ int iwl_mvm_config_sched_scan(struct iwl_mvm *mvm, | |||
| 772 | &scan_cfg->scan_cmd.tx_cmd[0], | 745 | &scan_cfg->scan_cmd.tx_cmd[0], |
| 773 | scan_cfg->data); | 746 | scan_cfg->data); |
| 774 | iwl_build_channel_cfg(mvm, req, &scan_cfg->channel_cfg, | 747 | iwl_build_channel_cfg(mvm, req, &scan_cfg->channel_cfg, |
| 775 | IEEE80211_BAND_2GHZ, &head, &tail, | 748 | IEEE80211_BAND_2GHZ, &head, |
| 776 | ssid_bitmap, ¶ms); | 749 | ssid_bitmap, ¶ms); |
| 777 | } | 750 | } |
| 778 | if (band_5ghz) { | 751 | if (band_5ghz) { |
| @@ -782,7 +755,7 @@ int iwl_mvm_config_sched_scan(struct iwl_mvm *mvm, | |||
| 782 | scan_cfg->data + | 755 | scan_cfg->data + |
| 783 | SCAN_OFFLOAD_PROBE_REQ_SIZE); | 756 | SCAN_OFFLOAD_PROBE_REQ_SIZE); |
| 784 | iwl_build_channel_cfg(mvm, req, &scan_cfg->channel_cfg, | 757 | iwl_build_channel_cfg(mvm, req, &scan_cfg->channel_cfg, |
| 785 | IEEE80211_BAND_5GHZ, &head, &tail, | 758 | IEEE80211_BAND_5GHZ, &head, |
| 786 | ssid_bitmap, ¶ms); | 759 | ssid_bitmap, ¶ms); |
| 787 | } | 760 | } |
| 788 | 761 | ||
diff --git a/drivers/net/wireless/iwlwifi/pcie/drv.c b/drivers/net/wireless/iwlwifi/pcie/drv.c index 7091a18d5a72..98950e45c7b0 100644 --- a/drivers/net/wireless/iwlwifi/pcie/drv.c +++ b/drivers/net/wireless/iwlwifi/pcie/drv.c | |||
| @@ -367,6 +367,7 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = { | |||
| 367 | {IWL_PCI_DEVICE(0x095A, 0x5012, iwl7265_2ac_cfg)}, | 367 | {IWL_PCI_DEVICE(0x095A, 0x5012, iwl7265_2ac_cfg)}, |
| 368 | {IWL_PCI_DEVICE(0x095A, 0x5412, iwl7265_2ac_cfg)}, | 368 | {IWL_PCI_DEVICE(0x095A, 0x5412, iwl7265_2ac_cfg)}, |
| 369 | {IWL_PCI_DEVICE(0x095A, 0x5410, iwl7265_2ac_cfg)}, | 369 | {IWL_PCI_DEVICE(0x095A, 0x5410, iwl7265_2ac_cfg)}, |
| 370 | {IWL_PCI_DEVICE(0x095A, 0x5510, iwl7265_2ac_cfg)}, | ||
| 370 | {IWL_PCI_DEVICE(0x095A, 0x5400, iwl7265_2ac_cfg)}, | 371 | {IWL_PCI_DEVICE(0x095A, 0x5400, iwl7265_2ac_cfg)}, |
| 371 | {IWL_PCI_DEVICE(0x095A, 0x1010, iwl7265_2ac_cfg)}, | 372 | {IWL_PCI_DEVICE(0x095A, 0x1010, iwl7265_2ac_cfg)}, |
| 372 | {IWL_PCI_DEVICE(0x095A, 0x5000, iwl7265_2n_cfg)}, | 373 | {IWL_PCI_DEVICE(0x095A, 0x5000, iwl7265_2n_cfg)}, |
| @@ -380,7 +381,7 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = { | |||
| 380 | {IWL_PCI_DEVICE(0x095A, 0x9110, iwl7265_2ac_cfg)}, | 381 | {IWL_PCI_DEVICE(0x095A, 0x9110, iwl7265_2ac_cfg)}, |
| 381 | {IWL_PCI_DEVICE(0x095A, 0x9112, iwl7265_2ac_cfg)}, | 382 | {IWL_PCI_DEVICE(0x095A, 0x9112, iwl7265_2ac_cfg)}, |
| 382 | {IWL_PCI_DEVICE(0x095A, 0x9210, iwl7265_2ac_cfg)}, | 383 | {IWL_PCI_DEVICE(0x095A, 0x9210, iwl7265_2ac_cfg)}, |
| 383 | {IWL_PCI_DEVICE(0x095A, 0x9200, iwl7265_2ac_cfg)}, | 384 | {IWL_PCI_DEVICE(0x095B, 0x9200, iwl7265_2ac_cfg)}, |
| 384 | {IWL_PCI_DEVICE(0x095A, 0x9510, iwl7265_2ac_cfg)}, | 385 | {IWL_PCI_DEVICE(0x095A, 0x9510, iwl7265_2ac_cfg)}, |
| 385 | {IWL_PCI_DEVICE(0x095A, 0x9310, iwl7265_2ac_cfg)}, | 386 | {IWL_PCI_DEVICE(0x095A, 0x9310, iwl7265_2ac_cfg)}, |
| 386 | {IWL_PCI_DEVICE(0x095A, 0x9410, iwl7265_2ac_cfg)}, | 387 | {IWL_PCI_DEVICE(0x095A, 0x9410, iwl7265_2ac_cfg)}, |
diff --git a/drivers/net/wireless/mwifiex/main.c b/drivers/net/wireless/mwifiex/main.c index cbabc12fbda3..e91cd0fa5ca8 100644 --- a/drivers/net/wireless/mwifiex/main.c +++ b/drivers/net/wireless/mwifiex/main.c | |||
| @@ -645,6 +645,7 @@ mwifiex_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 645 | } | 645 | } |
| 646 | 646 | ||
| 647 | tx_info = MWIFIEX_SKB_TXCB(skb); | 647 | tx_info = MWIFIEX_SKB_TXCB(skb); |
| 648 | memset(tx_info, 0, sizeof(*tx_info)); | ||
| 648 | tx_info->bss_num = priv->bss_num; | 649 | tx_info->bss_num = priv->bss_num; |
| 649 | tx_info->bss_type = priv->bss_type; | 650 | tx_info->bss_type = priv->bss_type; |
| 650 | tx_info->pkt_len = skb->len; | 651 | tx_info->pkt_len = skb->len; |
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index ca01d1861854..a7a27bc2c0b1 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c | |||
| @@ -289,10 +289,20 @@ static void hci_conn_timeout(struct work_struct *work) | |||
| 289 | { | 289 | { |
| 290 | struct hci_conn *conn = container_of(work, struct hci_conn, | 290 | struct hci_conn *conn = container_of(work, struct hci_conn, |
| 291 | disc_work.work); | 291 | disc_work.work); |
| 292 | int refcnt = atomic_read(&conn->refcnt); | ||
| 292 | 293 | ||
| 293 | BT_DBG("hcon %p state %s", conn, state_to_string(conn->state)); | 294 | BT_DBG("hcon %p state %s", conn, state_to_string(conn->state)); |
| 294 | 295 | ||
| 295 | if (atomic_read(&conn->refcnt)) | 296 | WARN_ON(refcnt < 0); |
| 297 | |||
| 298 | /* FIXME: It was observed that in pairing failed scenario, refcnt | ||
| 299 | * drops below 0. Probably this is because l2cap_conn_del calls | ||
| 300 | * l2cap_chan_del for each channel, and inside l2cap_chan_del conn is | ||
| 301 | * dropped. After that loop hci_chan_del is called which also drops | ||
| 302 | * conn. For now make sure that ACL is alive if refcnt is higher then 0, | ||
| 303 | * otherwise drop it. | ||
| 304 | */ | ||
| 305 | if (refcnt > 0) | ||
| 296 | return; | 306 | return; |
| 297 | 307 | ||
| 298 | switch (conn->state) { | 308 | switch (conn->state) { |
diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c index f2829a7932e2..e33a982161c1 100644 --- a/net/bluetooth/smp.c +++ b/net/bluetooth/smp.c | |||
| @@ -385,6 +385,16 @@ static const u8 gen_method[5][5] = { | |||
| 385 | { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, OVERLAP }, | 385 | { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, OVERLAP }, |
| 386 | }; | 386 | }; |
| 387 | 387 | ||
| 388 | static u8 get_auth_method(struct smp_chan *smp, u8 local_io, u8 remote_io) | ||
| 389 | { | ||
| 390 | /* If either side has unknown io_caps, use JUST WORKS */ | ||
| 391 | if (local_io > SMP_IO_KEYBOARD_DISPLAY || | ||
| 392 | remote_io > SMP_IO_KEYBOARD_DISPLAY) | ||
| 393 | return JUST_WORKS; | ||
| 394 | |||
| 395 | return gen_method[remote_io][local_io]; | ||
| 396 | } | ||
| 397 | |||
| 388 | static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth, | 398 | static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth, |
| 389 | u8 local_io, u8 remote_io) | 399 | u8 local_io, u8 remote_io) |
| 390 | { | 400 | { |
| @@ -401,14 +411,11 @@ static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth, | |||
| 401 | BT_DBG("tk_request: auth:%d lcl:%d rem:%d", auth, local_io, remote_io); | 411 | BT_DBG("tk_request: auth:%d lcl:%d rem:%d", auth, local_io, remote_io); |
| 402 | 412 | ||
| 403 | /* If neither side wants MITM, use JUST WORKS */ | 413 | /* If neither side wants MITM, use JUST WORKS */ |
| 404 | /* If either side has unknown io_caps, use JUST WORKS */ | ||
| 405 | /* Otherwise, look up method from the table */ | 414 | /* Otherwise, look up method from the table */ |
| 406 | if (!(auth & SMP_AUTH_MITM) || | 415 | if (!(auth & SMP_AUTH_MITM)) |
| 407 | local_io > SMP_IO_KEYBOARD_DISPLAY || | ||
| 408 | remote_io > SMP_IO_KEYBOARD_DISPLAY) | ||
| 409 | method = JUST_WORKS; | 416 | method = JUST_WORKS; |
| 410 | else | 417 | else |
| 411 | method = gen_method[remote_io][local_io]; | 418 | method = get_auth_method(smp, local_io, remote_io); |
| 412 | 419 | ||
| 413 | /* If not bonding, don't ask user to confirm a Zero TK */ | 420 | /* If not bonding, don't ask user to confirm a Zero TK */ |
| 414 | if (!(auth & SMP_AUTH_BONDING) && method == JUST_CFM) | 421 | if (!(auth & SMP_AUTH_BONDING) && method == JUST_CFM) |
| @@ -669,7 +676,7 @@ static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb) | |||
| 669 | { | 676 | { |
| 670 | struct smp_cmd_pairing rsp, *req = (void *) skb->data; | 677 | struct smp_cmd_pairing rsp, *req = (void *) skb->data; |
| 671 | struct smp_chan *smp; | 678 | struct smp_chan *smp; |
| 672 | u8 key_size, auth; | 679 | u8 key_size, auth, sec_level; |
| 673 | int ret; | 680 | int ret; |
| 674 | 681 | ||
| 675 | BT_DBG("conn %p", conn); | 682 | BT_DBG("conn %p", conn); |
| @@ -695,7 +702,19 @@ static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb) | |||
| 695 | /* We didn't start the pairing, so match remote */ | 702 | /* We didn't start the pairing, so match remote */ |
| 696 | auth = req->auth_req; | 703 | auth = req->auth_req; |
| 697 | 704 | ||
| 698 | conn->hcon->pending_sec_level = authreq_to_seclevel(auth); | 705 | sec_level = authreq_to_seclevel(auth); |
| 706 | if (sec_level > conn->hcon->pending_sec_level) | ||
| 707 | conn->hcon->pending_sec_level = sec_level; | ||
| 708 | |||
| 709 | /* If we need MITM check that it can be acheived */ | ||
| 710 | if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) { | ||
| 711 | u8 method; | ||
| 712 | |||
| 713 | method = get_auth_method(smp, conn->hcon->io_capability, | ||
| 714 | req->io_capability); | ||
| 715 | if (method == JUST_WORKS || method == JUST_CFM) | ||
| 716 | return SMP_AUTH_REQUIREMENTS; | ||
| 717 | } | ||
| 699 | 718 | ||
| 700 | build_pairing_cmd(conn, req, &rsp, auth); | 719 | build_pairing_cmd(conn, req, &rsp, auth); |
| 701 | 720 | ||
| @@ -743,6 +762,16 @@ static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb) | |||
| 743 | if (check_enc_key_size(conn, key_size)) | 762 | if (check_enc_key_size(conn, key_size)) |
| 744 | return SMP_ENC_KEY_SIZE; | 763 | return SMP_ENC_KEY_SIZE; |
| 745 | 764 | ||
| 765 | /* If we need MITM check that it can be acheived */ | ||
| 766 | if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) { | ||
| 767 | u8 method; | ||
| 768 | |||
| 769 | method = get_auth_method(smp, req->io_capability, | ||
| 770 | rsp->io_capability); | ||
| 771 | if (method == JUST_WORKS || method == JUST_CFM) | ||
| 772 | return SMP_AUTH_REQUIREMENTS; | ||
| 773 | } | ||
| 774 | |||
| 746 | get_random_bytes(smp->prnd, sizeof(smp->prnd)); | 775 | get_random_bytes(smp->prnd, sizeof(smp->prnd)); |
| 747 | 776 | ||
| 748 | smp->prsp[0] = SMP_CMD_PAIRING_RSP; | 777 | smp->prsp[0] = SMP_CMD_PAIRING_RSP; |
| @@ -838,6 +867,7 @@ static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb) | |||
| 838 | struct smp_cmd_pairing cp; | 867 | struct smp_cmd_pairing cp; |
| 839 | struct hci_conn *hcon = conn->hcon; | 868 | struct hci_conn *hcon = conn->hcon; |
| 840 | struct smp_chan *smp; | 869 | struct smp_chan *smp; |
| 870 | u8 sec_level; | ||
| 841 | 871 | ||
| 842 | BT_DBG("conn %p", conn); | 872 | BT_DBG("conn %p", conn); |
| 843 | 873 | ||
| @@ -847,7 +877,9 @@ static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb) | |||
| 847 | if (!(conn->hcon->link_mode & HCI_LM_MASTER)) | 877 | if (!(conn->hcon->link_mode & HCI_LM_MASTER)) |
| 848 | return SMP_CMD_NOTSUPP; | 878 | return SMP_CMD_NOTSUPP; |
| 849 | 879 | ||
| 850 | hcon->pending_sec_level = authreq_to_seclevel(rp->auth_req); | 880 | sec_level = authreq_to_seclevel(rp->auth_req); |
| 881 | if (sec_level > hcon->pending_sec_level) | ||
| 882 | hcon->pending_sec_level = sec_level; | ||
| 851 | 883 | ||
| 852 | if (smp_ltk_encrypt(conn, hcon->pending_sec_level)) | 884 | if (smp_ltk_encrypt(conn, hcon->pending_sec_level)) |
| 853 | return 0; | 885 | return 0; |
| @@ -901,9 +933,12 @@ int smp_conn_security(struct hci_conn *hcon, __u8 sec_level) | |||
| 901 | if (smp_sufficient_security(hcon, sec_level)) | 933 | if (smp_sufficient_security(hcon, sec_level)) |
| 902 | return 1; | 934 | return 1; |
| 903 | 935 | ||
| 936 | if (sec_level > hcon->pending_sec_level) | ||
| 937 | hcon->pending_sec_level = sec_level; | ||
| 938 | |||
| 904 | if (hcon->link_mode & HCI_LM_MASTER) | 939 | if (hcon->link_mode & HCI_LM_MASTER) |
| 905 | if (smp_ltk_encrypt(conn, sec_level)) | 940 | if (smp_ltk_encrypt(conn, hcon->pending_sec_level)) |
| 906 | goto done; | 941 | return 0; |
| 907 | 942 | ||
| 908 | if (test_and_set_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags)) | 943 | if (test_and_set_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags)) |
| 909 | return 0; | 944 | return 0; |
| @@ -918,7 +953,7 @@ int smp_conn_security(struct hci_conn *hcon, __u8 sec_level) | |||
| 918 | * requires it. | 953 | * requires it. |
| 919 | */ | 954 | */ |
| 920 | if (hcon->io_capability != HCI_IO_NO_INPUT_OUTPUT || | 955 | if (hcon->io_capability != HCI_IO_NO_INPUT_OUTPUT || |
| 921 | sec_level > BT_SECURITY_MEDIUM) | 956 | hcon->pending_sec_level > BT_SECURITY_MEDIUM) |
| 922 | authreq |= SMP_AUTH_MITM; | 957 | authreq |= SMP_AUTH_MITM; |
| 923 | 958 | ||
| 924 | if (hcon->link_mode & HCI_LM_MASTER) { | 959 | if (hcon->link_mode & HCI_LM_MASTER) { |
| @@ -937,9 +972,6 @@ int smp_conn_security(struct hci_conn *hcon, __u8 sec_level) | |||
| 937 | 972 | ||
| 938 | set_bit(SMP_FLAG_INITIATOR, &smp->flags); | 973 | set_bit(SMP_FLAG_INITIATOR, &smp->flags); |
| 939 | 974 | ||
| 940 | done: | ||
| 941 | hcon->pending_sec_level = sec_level; | ||
| 942 | |||
| 943 | return 0; | 975 | return 0; |
| 944 | } | 976 | } |
| 945 | 977 | ||
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 6886601afe1c..a6cda52ed920 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
| @@ -1096,11 +1096,12 @@ void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata, | |||
| 1096 | int err; | 1096 | int err; |
| 1097 | 1097 | ||
| 1098 | /* 24 + 6 = header + auth_algo + auth_transaction + status_code */ | 1098 | /* 24 + 6 = header + auth_algo + auth_transaction + status_code */ |
| 1099 | skb = dev_alloc_skb(local->hw.extra_tx_headroom + 24 + 6 + extra_len); | 1099 | skb = dev_alloc_skb(local->hw.extra_tx_headroom + IEEE80211_WEP_IV_LEN + |
| 1100 | 24 + 6 + extra_len + IEEE80211_WEP_ICV_LEN); | ||
| 1100 | if (!skb) | 1101 | if (!skb) |
| 1101 | return; | 1102 | return; |
| 1102 | 1103 | ||
| 1103 | skb_reserve(skb, local->hw.extra_tx_headroom); | 1104 | skb_reserve(skb, local->hw.extra_tx_headroom + IEEE80211_WEP_IV_LEN); |
| 1104 | 1105 | ||
| 1105 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24 + 6); | 1106 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24 + 6); |
| 1106 | memset(mgmt, 0, 24 + 6); | 1107 | memset(mgmt, 0, 24 + 6); |
diff --git a/net/wireless/core.h b/net/wireless/core.h index e9afbf10e756..7e3a3cef7df9 100644 --- a/net/wireless/core.h +++ b/net/wireless/core.h | |||
| @@ -424,7 +424,7 @@ static inline unsigned int elapsed_jiffies_msecs(unsigned long start) | |||
| 424 | if (end >= start) | 424 | if (end >= start) |
| 425 | return jiffies_to_msecs(end - start); | 425 | return jiffies_to_msecs(end - start); |
| 426 | 426 | ||
| 427 | return jiffies_to_msecs(end + (MAX_JIFFY_OFFSET - start) + 1); | 427 | return jiffies_to_msecs(end + (ULONG_MAX - start) + 1); |
| 428 | } | 428 | } |
| 429 | 429 | ||
| 430 | void | 430 | void |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index ba4f1723c83a..6668daf69326 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
| @@ -1497,18 +1497,17 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, | |||
| 1497 | } | 1497 | } |
| 1498 | CMD(start_p2p_device, START_P2P_DEVICE); | 1498 | CMD(start_p2p_device, START_P2P_DEVICE); |
| 1499 | CMD(set_mcast_rate, SET_MCAST_RATE); | 1499 | CMD(set_mcast_rate, SET_MCAST_RATE); |
| 1500 | #ifdef CONFIG_NL80211_TESTMODE | ||
| 1501 | CMD(testmode_cmd, TESTMODE); | ||
| 1502 | #endif | ||
| 1500 | if (state->split) { | 1503 | if (state->split) { |
| 1501 | CMD(crit_proto_start, CRIT_PROTOCOL_START); | 1504 | CMD(crit_proto_start, CRIT_PROTOCOL_START); |
| 1502 | CMD(crit_proto_stop, CRIT_PROTOCOL_STOP); | 1505 | CMD(crit_proto_stop, CRIT_PROTOCOL_STOP); |
| 1503 | if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH) | 1506 | if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH) |
| 1504 | CMD(channel_switch, CHANNEL_SWITCH); | 1507 | CMD(channel_switch, CHANNEL_SWITCH); |
| 1508 | CMD(set_qos_map, SET_QOS_MAP); | ||
| 1505 | } | 1509 | } |
| 1506 | CMD(set_qos_map, SET_QOS_MAP); | 1510 | /* add into the if now */ |
| 1507 | |||
| 1508 | #ifdef CONFIG_NL80211_TESTMODE | ||
| 1509 | CMD(testmode_cmd, TESTMODE); | ||
| 1510 | #endif | ||
| 1511 | |||
| 1512 | #undef CMD | 1511 | #undef CMD |
| 1513 | 1512 | ||
| 1514 | if (rdev->ops->connect || rdev->ops->auth) { | 1513 | if (rdev->ops->connect || rdev->ops->auth) { |
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 558b0e3a02d8..1afdf45db38f 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
| @@ -935,7 +935,7 @@ freq_reg_info_regd(struct wiphy *wiphy, u32 center_freq, | |||
| 935 | if (!band_rule_found) | 935 | if (!band_rule_found) |
| 936 | band_rule_found = freq_in_rule_band(fr, center_freq); | 936 | band_rule_found = freq_in_rule_band(fr, center_freq); |
| 937 | 937 | ||
| 938 | bw_fits = reg_does_bw_fit(fr, center_freq, MHZ_TO_KHZ(5)); | 938 | bw_fits = reg_does_bw_fit(fr, center_freq, MHZ_TO_KHZ(20)); |
| 939 | 939 | ||
| 940 | if (band_rule_found && bw_fits) | 940 | if (band_rule_found && bw_fits) |
| 941 | return rr; | 941 | return rr; |
| @@ -1019,10 +1019,10 @@ static void chan_reg_rule_print_dbg(const struct ieee80211_regdomain *regd, | |||
| 1019 | } | 1019 | } |
| 1020 | #endif | 1020 | #endif |
| 1021 | 1021 | ||
| 1022 | /* Find an ieee80211_reg_rule such that a 5MHz channel with frequency | 1022 | /* |
| 1023 | * chan->center_freq fits there. | 1023 | * Note that right now we assume the desired channel bandwidth |
| 1024 | * If there is no such reg_rule, disable the channel, otherwise set the | 1024 | * is always 20 MHz for each individual channel (HT40 uses 20 MHz |
| 1025 | * flags corresponding to the bandwidths allowed in the particular reg_rule | 1025 | * per channel, the primary and the extension channel). |
| 1026 | */ | 1026 | */ |
| 1027 | static void handle_channel(struct wiphy *wiphy, | 1027 | static void handle_channel(struct wiphy *wiphy, |
| 1028 | enum nl80211_reg_initiator initiator, | 1028 | enum nl80211_reg_initiator initiator, |
| @@ -1083,12 +1083,8 @@ static void handle_channel(struct wiphy *wiphy, | |||
| 1083 | if (reg_rule->flags & NL80211_RRF_AUTO_BW) | 1083 | if (reg_rule->flags & NL80211_RRF_AUTO_BW) |
| 1084 | max_bandwidth_khz = reg_get_max_bandwidth(regd, reg_rule); | 1084 | max_bandwidth_khz = reg_get_max_bandwidth(regd, reg_rule); |
| 1085 | 1085 | ||
| 1086 | if (max_bandwidth_khz < MHZ_TO_KHZ(10)) | ||
| 1087 | bw_flags = IEEE80211_CHAN_NO_10MHZ; | ||
| 1088 | if (max_bandwidth_khz < MHZ_TO_KHZ(20)) | ||
| 1089 | bw_flags |= IEEE80211_CHAN_NO_20MHZ; | ||
| 1090 | if (max_bandwidth_khz < MHZ_TO_KHZ(40)) | 1086 | if (max_bandwidth_khz < MHZ_TO_KHZ(40)) |
| 1091 | bw_flags |= IEEE80211_CHAN_NO_HT40; | 1087 | bw_flags = IEEE80211_CHAN_NO_HT40; |
| 1092 | if (max_bandwidth_khz < MHZ_TO_KHZ(80)) | 1088 | if (max_bandwidth_khz < MHZ_TO_KHZ(80)) |
| 1093 | bw_flags |= IEEE80211_CHAN_NO_80MHZ; | 1089 | bw_flags |= IEEE80211_CHAN_NO_80MHZ; |
| 1094 | if (max_bandwidth_khz < MHZ_TO_KHZ(160)) | 1090 | if (max_bandwidth_khz < MHZ_TO_KHZ(160)) |
| @@ -1522,12 +1518,8 @@ static void handle_channel_custom(struct wiphy *wiphy, | |||
| 1522 | if (reg_rule->flags & NL80211_RRF_AUTO_BW) | 1518 | if (reg_rule->flags & NL80211_RRF_AUTO_BW) |
| 1523 | max_bandwidth_khz = reg_get_max_bandwidth(regd, reg_rule); | 1519 | max_bandwidth_khz = reg_get_max_bandwidth(regd, reg_rule); |
| 1524 | 1520 | ||
| 1525 | if (max_bandwidth_khz < MHZ_TO_KHZ(10)) | ||
| 1526 | bw_flags = IEEE80211_CHAN_NO_10MHZ; | ||
| 1527 | if (max_bandwidth_khz < MHZ_TO_KHZ(20)) | ||
| 1528 | bw_flags |= IEEE80211_CHAN_NO_20MHZ; | ||
| 1529 | if (max_bandwidth_khz < MHZ_TO_KHZ(40)) | 1521 | if (max_bandwidth_khz < MHZ_TO_KHZ(40)) |
| 1530 | bw_flags |= IEEE80211_CHAN_NO_HT40; | 1522 | bw_flags = IEEE80211_CHAN_NO_HT40; |
| 1531 | if (max_bandwidth_khz < MHZ_TO_KHZ(80)) | 1523 | if (max_bandwidth_khz < MHZ_TO_KHZ(80)) |
| 1532 | bw_flags |= IEEE80211_CHAN_NO_80MHZ; | 1524 | bw_flags |= IEEE80211_CHAN_NO_80MHZ; |
| 1533 | if (max_bandwidth_khz < MHZ_TO_KHZ(160)) | 1525 | if (max_bandwidth_khz < MHZ_TO_KHZ(160)) |
