diff options
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/eeprom_9287.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/hif_usb.c | 9 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_drv_init.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/init.c | 3 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/reg.h | 8 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/carl9170/usb.c | 4 | ||||
| -rw-r--r-- | include/net/cfg80211.h | 2 | ||||
| -rw-r--r-- | net/wireless/chan.c | 54 |
9 files changed, 78 insertions, 8 deletions
diff --git a/drivers/net/wireless/ath/ath9k/eeprom_9287.c b/drivers/net/wireless/ath/ath9k/eeprom_9287.c index 966b9496a9dd..195406db3bd8 100644 --- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c +++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c | |||
| @@ -37,7 +37,7 @@ static bool ath9k_hw_ar9287_fill_eeprom(struct ath_hw *ah) | |||
| 37 | int addr, eep_start_loc; | 37 | int addr, eep_start_loc; |
| 38 | eep_data = (u16 *)eep; | 38 | eep_data = (u16 *)eep; |
| 39 | 39 | ||
| 40 | if (ah->hw_version.devid == 0x7015) | 40 | if (AR9287_HTC_DEVID(ah)) |
| 41 | eep_start_loc = AR9287_HTC_EEP_START_LOC; | 41 | eep_start_loc = AR9287_HTC_EEP_START_LOC; |
| 42 | else | 42 | else |
| 43 | eep_start_loc = AR9287_EEP_START_LOC; | 43 | eep_start_loc = AR9287_EEP_START_LOC; |
diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c index f7ec31b4ddd3..dfb6560dab92 100644 --- a/drivers/net/wireless/ath/ath9k/hif_usb.c +++ b/drivers/net/wireless/ath/ath9k/hif_usb.c | |||
| @@ -36,8 +36,13 @@ static struct usb_device_id ath9k_hif_usb_ids[] = { | |||
| 36 | { USB_DEVICE(0x13D3, 0x3327) }, /* Azurewave */ | 36 | { USB_DEVICE(0x13D3, 0x3327) }, /* Azurewave */ |
| 37 | { USB_DEVICE(0x13D3, 0x3328) }, /* Azurewave */ | 37 | { USB_DEVICE(0x13D3, 0x3328) }, /* Azurewave */ |
| 38 | { USB_DEVICE(0x13D3, 0x3346) }, /* IMC Networks */ | 38 | { USB_DEVICE(0x13D3, 0x3346) }, /* IMC Networks */ |
| 39 | { USB_DEVICE(0x13D3, 0x3348) }, /* Azurewave */ | ||
| 40 | { USB_DEVICE(0x13D3, 0x3349) }, /* Azurewave */ | ||
| 41 | { USB_DEVICE(0x13D3, 0x3350) }, /* Azurewave */ | ||
| 39 | { USB_DEVICE(0x04CA, 0x4605) }, /* Liteon */ | 42 | { USB_DEVICE(0x04CA, 0x4605) }, /* Liteon */ |
| 40 | { USB_DEVICE(0x083A, 0xA704) }, /* SMC Networks */ | 43 | { USB_DEVICE(0x083A, 0xA704) }, /* SMC Networks */ |
| 44 | { USB_DEVICE(0x040D, 0x3801) }, /* VIA */ | ||
| 45 | { USB_DEVICE(0x1668, 0x1200) }, /* Verizon */ | ||
| 41 | { }, | 46 | { }, |
| 42 | }; | 47 | }; |
| 43 | 48 | ||
| @@ -806,6 +811,8 @@ static int ath9k_hif_usb_download_fw(struct hif_device_usb *hif_dev) | |||
| 806 | case 0x7010: | 811 | case 0x7010: |
| 807 | case 0x7015: | 812 | case 0x7015: |
| 808 | case 0x9018: | 813 | case 0x9018: |
| 814 | case 0xA704: | ||
| 815 | case 0x1200: | ||
| 809 | firm_offset = AR7010_FIRMWARE_TEXT; | 816 | firm_offset = AR7010_FIRMWARE_TEXT; |
| 810 | break; | 817 | break; |
| 811 | default: | 818 | default: |
| @@ -928,6 +935,8 @@ static int ath9k_hif_usb_probe(struct usb_interface *interface, | |||
| 928 | case 0x7010: | 935 | case 0x7010: |
| 929 | case 0x7015: | 936 | case 0x7015: |
| 930 | case 0x9018: | 937 | case 0x9018: |
| 938 | case 0xA704: | ||
| 939 | case 0x1200: | ||
| 931 | if (le16_to_cpu(udev->descriptor.bcdDevice) == 0x0202) | 940 | if (le16_to_cpu(udev->descriptor.bcdDevice) == 0x0202) |
| 932 | hif_dev->fw_name = FIRMWARE_AR7010_1_1; | 941 | hif_dev->fw_name = FIRMWARE_AR7010_1_1; |
| 933 | else | 942 | else |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c b/drivers/net/wireless/ath/ath9k/htc_drv_init.c index 3d7b97f1b3ae..7c8a38d04561 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c | |||
| @@ -249,6 +249,8 @@ static int ath9k_init_htc_services(struct ath9k_htc_priv *priv, u16 devid) | |||
| 249 | case 0x7010: | 249 | case 0x7010: |
| 250 | case 0x7015: | 250 | case 0x7015: |
| 251 | case 0x9018: | 251 | case 0x9018: |
| 252 | case 0xA704: | ||
| 253 | case 0x1200: | ||
| 252 | priv->htc->credits = 45; | 254 | priv->htc->credits = 45; |
| 253 | break; | 255 | break; |
| 254 | default: | 256 | default: |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c index 3d19b5bc937f..29d80ca78393 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | |||
| @@ -121,7 +121,7 @@ int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, struct sk_buff *skb) | |||
| 121 | tx_hdr.data_type = ATH9K_HTC_NORMAL; | 121 | tx_hdr.data_type = ATH9K_HTC_NORMAL; |
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | if (ieee80211_is_data(fc)) { | 124 | if (ieee80211_is_data_qos(fc)) { |
| 125 | qc = ieee80211_get_qos_ctl(hdr); | 125 | qc = ieee80211_get_qos_ctl(hdr); |
| 126 | tx_hdr.tidno = qc[0] & IEEE80211_QOS_CTL_TID_MASK; | 126 | tx_hdr.tidno = qc[0] & IEEE80211_QOS_CTL_TID_MASK; |
| 127 | } | 127 | } |
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c index 6a0d99eff404..92bc5c5f4876 100644 --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c | |||
| @@ -817,8 +817,6 @@ void ath9k_deinit_device(struct ath_softc *sc) | |||
| 817 | 817 | ||
| 818 | ath9k_ps_wakeup(sc); | 818 | ath9k_ps_wakeup(sc); |
| 819 | 819 | ||
| 820 | pm_qos_remove_request(&ath9k_pm_qos_req); | ||
| 821 | |||
| 822 | wiphy_rfkill_stop_polling(sc->hw->wiphy); | 820 | wiphy_rfkill_stop_polling(sc->hw->wiphy); |
| 823 | ath_deinit_leds(sc); | 821 | ath_deinit_leds(sc); |
| 824 | 822 | ||
| @@ -832,6 +830,7 @@ void ath9k_deinit_device(struct ath_softc *sc) | |||
| 832 | } | 830 | } |
| 833 | 831 | ||
| 834 | ieee80211_unregister_hw(hw); | 832 | ieee80211_unregister_hw(hw); |
| 833 | pm_qos_remove_request(&ath9k_pm_qos_req); | ||
| 835 | ath_rx_cleanup(sc); | 834 | ath_rx_cleanup(sc); |
| 836 | ath_tx_cleanup(sc); | 835 | ath_tx_cleanup(sc); |
| 837 | ath9k_deinit_softc(sc); | 836 | ath9k_deinit_softc(sc); |
diff --git a/drivers/net/wireless/ath/ath9k/reg.h b/drivers/net/wireless/ath/ath9k/reg.h index fa05b711e5cd..dddf579aacf1 100644 --- a/drivers/net/wireless/ath/ath9k/reg.h +++ b/drivers/net/wireless/ath/ath9k/reg.h | |||
| @@ -866,7 +866,13 @@ | |||
| 866 | #define AR_DEVID_7010(_ah) \ | 866 | #define AR_DEVID_7010(_ah) \ |
| 867 | (((_ah)->hw_version.devid == 0x7010) || \ | 867 | (((_ah)->hw_version.devid == 0x7010) || \ |
| 868 | ((_ah)->hw_version.devid == 0x7015) || \ | 868 | ((_ah)->hw_version.devid == 0x7015) || \ |
| 869 | ((_ah)->hw_version.devid == 0x9018)) | 869 | ((_ah)->hw_version.devid == 0x9018) || \ |
| 870 | ((_ah)->hw_version.devid == 0xA704) || \ | ||
| 871 | ((_ah)->hw_version.devid == 0x1200)) | ||
| 872 | |||
| 873 | #define AR9287_HTC_DEVID(_ah) \ | ||
| 874 | (((_ah)->hw_version.devid == 0x7015) || \ | ||
| 875 | ((_ah)->hw_version.devid == 0x1200)) | ||
| 870 | 876 | ||
| 871 | #define AR_RADIO_SREV_MAJOR 0xf0 | 877 | #define AR_RADIO_SREV_MAJOR 0xf0 |
| 872 | #define AR_RAD5133_SREV_MAJOR 0xc0 | 878 | #define AR_RAD5133_SREV_MAJOR 0xc0 |
diff --git a/drivers/net/wireless/ath/carl9170/usb.c b/drivers/net/wireless/ath/carl9170/usb.c index 3317039cd28f..7504ed14c725 100644 --- a/drivers/net/wireless/ath/carl9170/usb.c +++ b/drivers/net/wireless/ath/carl9170/usb.c | |||
| @@ -553,12 +553,12 @@ static int carl9170_usb_flush(struct ar9170 *ar) | |||
| 553 | usb_free_urb(urb); | 553 | usb_free_urb(urb); |
| 554 | } | 554 | } |
| 555 | 555 | ||
| 556 | ret = usb_wait_anchor_empty_timeout(&ar->tx_cmd, HZ); | 556 | ret = usb_wait_anchor_empty_timeout(&ar->tx_cmd, 1000); |
| 557 | if (ret == 0) | 557 | if (ret == 0) |
| 558 | err = -ETIMEDOUT; | 558 | err = -ETIMEDOUT; |
| 559 | 559 | ||
| 560 | /* lets wait a while until the tx - queues are dried out */ | 560 | /* lets wait a while until the tx - queues are dried out */ |
| 561 | ret = usb_wait_anchor_empty_timeout(&ar->tx_anch, HZ); | 561 | ret = usb_wait_anchor_empty_timeout(&ar->tx_anch, 1000); |
| 562 | if (ret == 0) | 562 | if (ret == 0) |
| 563 | err = -ETIMEDOUT; | 563 | err = -ETIMEDOUT; |
| 564 | 564 | ||
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 2a7936d7851d..97b8b7c9b63c 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
| @@ -1355,7 +1355,7 @@ enum wiphy_flags { | |||
| 1355 | WIPHY_FLAG_4ADDR_AP = BIT(5), | 1355 | WIPHY_FLAG_4ADDR_AP = BIT(5), |
| 1356 | WIPHY_FLAG_4ADDR_STATION = BIT(6), | 1356 | WIPHY_FLAG_4ADDR_STATION = BIT(6), |
| 1357 | WIPHY_FLAG_CONTROL_PORT_PROTOCOL = BIT(7), | 1357 | WIPHY_FLAG_CONTROL_PORT_PROTOCOL = BIT(7), |
| 1358 | WIPHY_FLAG_IBSS_RSN = BIT(7), | 1358 | WIPHY_FLAG_IBSS_RSN = BIT(8), |
| 1359 | }; | 1359 | }; |
| 1360 | 1360 | ||
| 1361 | struct mac_address { | 1361 | struct mac_address { |
diff --git a/net/wireless/chan.c b/net/wireless/chan.c index d0c92dddb26b..17cd0c04d139 100644 --- a/net/wireless/chan.c +++ b/net/wireless/chan.c | |||
| @@ -44,6 +44,38 @@ rdev_freq_to_chan(struct cfg80211_registered_device *rdev, | |||
| 44 | return chan; | 44 | return chan; |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | static bool can_beacon_sec_chan(struct wiphy *wiphy, | ||
| 48 | struct ieee80211_channel *chan, | ||
| 49 | enum nl80211_channel_type channel_type) | ||
| 50 | { | ||
| 51 | struct ieee80211_channel *sec_chan; | ||
| 52 | int diff; | ||
| 53 | |||
| 54 | switch (channel_type) { | ||
| 55 | case NL80211_CHAN_HT40PLUS: | ||
| 56 | diff = 20; | ||
| 57 | break; | ||
| 58 | case NL80211_CHAN_HT40MINUS: | ||
| 59 | diff = -20; | ||
| 60 | break; | ||
| 61 | default: | ||
| 62 | return false; | ||
| 63 | } | ||
| 64 | |||
| 65 | sec_chan = ieee80211_get_channel(wiphy, chan->center_freq + diff); | ||
| 66 | if (!sec_chan) | ||
| 67 | return false; | ||
| 68 | |||
| 69 | /* we'll need a DFS capability later */ | ||
| 70 | if (sec_chan->flags & (IEEE80211_CHAN_DISABLED | | ||
| 71 | IEEE80211_CHAN_PASSIVE_SCAN | | ||
| 72 | IEEE80211_CHAN_NO_IBSS | | ||
| 73 | IEEE80211_CHAN_RADAR)) | ||
| 74 | return false; | ||
| 75 | |||
| 76 | return true; | ||
| 77 | } | ||
| 78 | |||
| 47 | int cfg80211_set_freq(struct cfg80211_registered_device *rdev, | 79 | int cfg80211_set_freq(struct cfg80211_registered_device *rdev, |
| 48 | struct wireless_dev *wdev, int freq, | 80 | struct wireless_dev *wdev, int freq, |
| 49 | enum nl80211_channel_type channel_type) | 81 | enum nl80211_channel_type channel_type) |
| @@ -68,6 +100,28 @@ int cfg80211_set_freq(struct cfg80211_registered_device *rdev, | |||
| 68 | if (!chan) | 100 | if (!chan) |
| 69 | return -EINVAL; | 101 | return -EINVAL; |
| 70 | 102 | ||
| 103 | /* Both channels should be able to initiate communication */ | ||
| 104 | if (wdev && (wdev->iftype == NL80211_IFTYPE_ADHOC || | ||
| 105 | wdev->iftype == NL80211_IFTYPE_AP || | ||
| 106 | wdev->iftype == NL80211_IFTYPE_AP_VLAN || | ||
| 107 | wdev->iftype == NL80211_IFTYPE_MESH_POINT || | ||
| 108 | wdev->iftype == NL80211_IFTYPE_P2P_GO)) { | ||
| 109 | switch (channel_type) { | ||
| 110 | case NL80211_CHAN_HT40PLUS: | ||
| 111 | case NL80211_CHAN_HT40MINUS: | ||
| 112 | if (!can_beacon_sec_chan(&rdev->wiphy, chan, | ||
| 113 | channel_type)) { | ||
| 114 | printk(KERN_DEBUG | ||
| 115 | "cfg80211: Secondary channel not " | ||
| 116 | "allowed to initiate communication\n"); | ||
| 117 | return -EINVAL; | ||
| 118 | } | ||
| 119 | break; | ||
| 120 | default: | ||
| 121 | break; | ||
| 122 | } | ||
| 123 | } | ||
| 124 | |||
| 71 | result = rdev->ops->set_channel(&rdev->wiphy, | 125 | result = rdev->ops->set_channel(&rdev->wiphy, |
| 72 | wdev ? wdev->netdev : NULL, | 126 | wdev ? wdev->netdev : NULL, |
| 73 | chan, channel_type); | 127 | chan, channel_type); |
