diff options
| -rw-r--r-- | drivers/net/wireless/b43/b43.h | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/main.c | 70 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-4965-rs.c | 3 | ||||
| -rw-r--r-- | drivers/net/wireless/rndis_wlan.c | 65 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00.h | 5 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00config.c | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00dev.c | 8 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00mac.c | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/rtl8180_grf5101.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/rtl8180_max2820.c | 5 | ||||
| -rw-r--r-- | drivers/net/wireless/rtl8180_sa2400.c | 2 | ||||
| -rw-r--r-- | net/mac80211/cfg.c | 4 | ||||
| -rw-r--r-- | net/mac80211/main.c | 2 | ||||
| -rw-r--r-- | net/mac80211/mlme.c | 29 | ||||
| -rw-r--r-- | net/mac80211/rx.c | 4 | ||||
| -rw-r--r-- | net/mac80211/util.c | 4 | ||||
| -rw-r--r-- | net/mac80211/wext.c | 11 |
17 files changed, 166 insertions, 51 deletions
diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h index 37783cdd301a..dfa4bdd5597c 100644 --- a/drivers/net/wireless/b43/b43.h +++ b/drivers/net/wireless/b43/b43.h | |||
| @@ -737,6 +737,7 @@ struct b43_wl { | |||
| 737 | struct ieee80211_tx_control beacon_txctl; | 737 | struct ieee80211_tx_control beacon_txctl; |
| 738 | bool beacon0_uploaded; | 738 | bool beacon0_uploaded; |
| 739 | bool beacon1_uploaded; | 739 | bool beacon1_uploaded; |
| 740 | bool beacon_templates_virgin; /* Never wrote the templates? */ | ||
| 740 | struct work_struct beacon_update_trigger; | 741 | struct work_struct beacon_update_trigger; |
| 741 | 742 | ||
| 742 | /* The current QOS parameters for the 4 queues. | 743 | /* The current QOS parameters for the 4 queues. |
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 8fdba9415c04..6c3d9ea0a9f8 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
| @@ -1544,6 +1544,30 @@ static void b43_write_probe_resp_template(struct b43_wldev *dev, | |||
| 1544 | kfree(probe_resp_data); | 1544 | kfree(probe_resp_data); |
| 1545 | } | 1545 | } |
| 1546 | 1546 | ||
| 1547 | static void b43_upload_beacon0(struct b43_wldev *dev) | ||
| 1548 | { | ||
| 1549 | struct b43_wl *wl = dev->wl; | ||
| 1550 | |||
| 1551 | if (wl->beacon0_uploaded) | ||
| 1552 | return; | ||
| 1553 | b43_write_beacon_template(dev, 0x68, 0x18); | ||
| 1554 | /* FIXME: Probe resp upload doesn't really belong here, | ||
| 1555 | * but we don't use that feature anyway. */ | ||
| 1556 | b43_write_probe_resp_template(dev, 0x268, 0x4A, | ||
| 1557 | &__b43_ratetable[3]); | ||
| 1558 | wl->beacon0_uploaded = 1; | ||
| 1559 | } | ||
| 1560 | |||
| 1561 | static void b43_upload_beacon1(struct b43_wldev *dev) | ||
| 1562 | { | ||
| 1563 | struct b43_wl *wl = dev->wl; | ||
| 1564 | |||
| 1565 | if (wl->beacon1_uploaded) | ||
| 1566 | return; | ||
| 1567 | b43_write_beacon_template(dev, 0x468, 0x1A); | ||
| 1568 | wl->beacon1_uploaded = 1; | ||
| 1569 | } | ||
| 1570 | |||
| 1547 | static void handle_irq_beacon(struct b43_wldev *dev) | 1571 | static void handle_irq_beacon(struct b43_wldev *dev) |
| 1548 | { | 1572 | { |
| 1549 | struct b43_wl *wl = dev->wl; | 1573 | struct b43_wl *wl = dev->wl; |
| @@ -1568,24 +1592,27 @@ static void handle_irq_beacon(struct b43_wldev *dev) | |||
| 1568 | return; | 1592 | return; |
| 1569 | } | 1593 | } |
| 1570 | 1594 | ||
| 1571 | if (!beacon0_valid) { | 1595 | if (unlikely(wl->beacon_templates_virgin)) { |
| 1572 | if (!wl->beacon0_uploaded) { | 1596 | /* We never uploaded a beacon before. |
| 1573 | b43_write_beacon_template(dev, 0x68, 0x18); | 1597 | * Upload both templates now, but only mark one valid. */ |
| 1574 | b43_write_probe_resp_template(dev, 0x268, 0x4A, | 1598 | wl->beacon_templates_virgin = 0; |
| 1575 | &__b43_ratetable[3]); | 1599 | b43_upload_beacon0(dev); |
| 1576 | wl->beacon0_uploaded = 1; | 1600 | b43_upload_beacon1(dev); |
| 1577 | } | ||
| 1578 | cmd = b43_read32(dev, B43_MMIO_MACCMD); | 1601 | cmd = b43_read32(dev, B43_MMIO_MACCMD); |
| 1579 | cmd |= B43_MACCMD_BEACON0_VALID; | 1602 | cmd |= B43_MACCMD_BEACON0_VALID; |
| 1580 | b43_write32(dev, B43_MMIO_MACCMD, cmd); | 1603 | b43_write32(dev, B43_MMIO_MACCMD, cmd); |
| 1581 | } else if (!beacon1_valid) { | 1604 | } else { |
| 1582 | if (!wl->beacon1_uploaded) { | 1605 | if (!beacon0_valid) { |
| 1583 | b43_write_beacon_template(dev, 0x468, 0x1A); | 1606 | b43_upload_beacon0(dev); |
| 1584 | wl->beacon1_uploaded = 1; | 1607 | cmd = b43_read32(dev, B43_MMIO_MACCMD); |
| 1608 | cmd |= B43_MACCMD_BEACON0_VALID; | ||
| 1609 | b43_write32(dev, B43_MMIO_MACCMD, cmd); | ||
| 1610 | } else if (!beacon1_valid) { | ||
| 1611 | b43_upload_beacon1(dev); | ||
| 1612 | cmd = b43_read32(dev, B43_MMIO_MACCMD); | ||
| 1613 | cmd |= B43_MACCMD_BEACON1_VALID; | ||
| 1614 | b43_write32(dev, B43_MMIO_MACCMD, cmd); | ||
| 1585 | } | 1615 | } |
| 1586 | cmd = b43_read32(dev, B43_MMIO_MACCMD); | ||
| 1587 | cmd |= B43_MACCMD_BEACON1_VALID; | ||
| 1588 | b43_write32(dev, B43_MMIO_MACCMD, cmd); | ||
| 1589 | } | 1616 | } |
| 1590 | } | 1617 | } |
| 1591 | 1618 | ||
| @@ -4073,6 +4100,9 @@ static int b43_op_start(struct ieee80211_hw *hw) | |||
| 4073 | wl->filter_flags = 0; | 4100 | wl->filter_flags = 0; |
| 4074 | wl->radiotap_enabled = 0; | 4101 | wl->radiotap_enabled = 0; |
| 4075 | b43_qos_clear(wl); | 4102 | b43_qos_clear(wl); |
| 4103 | wl->beacon0_uploaded = 0; | ||
| 4104 | wl->beacon1_uploaded = 0; | ||
| 4105 | wl->beacon_templates_virgin = 1; | ||
| 4076 | 4106 | ||
| 4077 | /* First register RFkill. | 4107 | /* First register RFkill. |
| 4078 | * LEDs that are registered later depend on it. */ | 4108 | * LEDs that are registered later depend on it. */ |
| @@ -4241,7 +4271,9 @@ static void b43_chip_reset(struct work_struct *work) | |||
| 4241 | goto out; | 4271 | goto out; |
| 4242 | } | 4272 | } |
| 4243 | } | 4273 | } |
| 4244 | out: | 4274 | out: |
| 4275 | if (err) | ||
| 4276 | wl->current_dev = NULL; /* Failed to init the dev. */ | ||
| 4245 | mutex_unlock(&wl->mutex); | 4277 | mutex_unlock(&wl->mutex); |
| 4246 | if (err) | 4278 | if (err) |
| 4247 | b43err(wl, "Controller restart FAILED\n"); | 4279 | b43err(wl, "Controller restart FAILED\n"); |
| @@ -4382,9 +4414,11 @@ static void b43_one_core_detach(struct ssb_device *dev) | |||
| 4382 | struct b43_wldev *wldev; | 4414 | struct b43_wldev *wldev; |
| 4383 | struct b43_wl *wl; | 4415 | struct b43_wl *wl; |
| 4384 | 4416 | ||
| 4417 | /* Do not cancel ieee80211-workqueue based work here. | ||
| 4418 | * See comment in b43_remove(). */ | ||
| 4419 | |||
| 4385 | wldev = ssb_get_drvdata(dev); | 4420 | wldev = ssb_get_drvdata(dev); |
| 4386 | wl = wldev->wl; | 4421 | wl = wldev->wl; |
| 4387 | cancel_work_sync(&wldev->restart_work); | ||
| 4388 | b43_debugfs_remove_device(wldev); | 4422 | b43_debugfs_remove_device(wldev); |
| 4389 | b43_wireless_core_detach(wldev); | 4423 | b43_wireless_core_detach(wldev); |
| 4390 | list_del(&wldev->list); | 4424 | list_del(&wldev->list); |
| @@ -4569,6 +4603,10 @@ static void b43_remove(struct ssb_device *dev) | |||
| 4569 | struct b43_wl *wl = ssb_get_devtypedata(dev); | 4603 | struct b43_wl *wl = ssb_get_devtypedata(dev); |
| 4570 | struct b43_wldev *wldev = ssb_get_drvdata(dev); | 4604 | struct b43_wldev *wldev = ssb_get_drvdata(dev); |
| 4571 | 4605 | ||
| 4606 | /* We must cancel any work here before unregistering from ieee80211, | ||
| 4607 | * as the ieee80211 unreg will destroy the workqueue. */ | ||
| 4608 | cancel_work_sync(&wldev->restart_work); | ||
| 4609 | |||
| 4572 | B43_WARN_ON(!wl); | 4610 | B43_WARN_ON(!wl); |
| 4573 | if (wl->current_dev == wldev) | 4611 | if (wl->current_dev == wldev) |
| 4574 | ieee80211_unregister_hw(wl->hw); | 4612 | ieee80211_unregister_hw(wl->hw); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965-rs.c b/drivers/net/wireless/iwlwifi/iwl-4965-rs.c index c9847b1a67f7..3a7f0cb710ec 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965-rs.c | |||
| @@ -1162,7 +1162,6 @@ static s32 rs_get_best_rate(struct iwl_priv *priv, | |||
| 1162 | 1162 | ||
| 1163 | /* Higher rate not available, use the original */ | 1163 | /* Higher rate not available, use the original */ |
| 1164 | } else { | 1164 | } else { |
| 1165 | new_rate = rate; | ||
| 1166 | break; | 1165 | break; |
| 1167 | } | 1166 | } |
| 1168 | } | 1167 | } |
| @@ -2009,7 +2008,7 @@ static void rs_rate_scale_perform(struct iwl_priv *priv, | |||
| 2009 | * 2) Not just finishing up a search | 2008 | * 2) Not just finishing up a search |
| 2010 | * 3) Allowing a new search | 2009 | * 3) Allowing a new search |
| 2011 | */ | 2010 | */ |
| 2012 | if (!update_lq && !done_search && !lq_sta->stay_in_tbl) { | 2011 | if (!update_lq && !done_search && !lq_sta->stay_in_tbl && window->counter) { |
| 2013 | /* Save current throughput to compare with "search" throughput*/ | 2012 | /* Save current throughput to compare with "search" throughput*/ |
| 2014 | lq_sta->last_tpt = current_tpt; | 2013 | lq_sta->last_tpt = current_tpt; |
| 2015 | 2014 | ||
diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c index d0b1fb15c709..18c9931e3267 100644 --- a/drivers/net/wireless/rndis_wlan.c +++ b/drivers/net/wireless/rndis_wlan.c | |||
| @@ -116,6 +116,7 @@ MODULE_PARM_DESC(workaround_interval, | |||
| 116 | #define OID_802_11_ENCRYPTION_STATUS ccpu2(0x0d01011b) | 116 | #define OID_802_11_ENCRYPTION_STATUS ccpu2(0x0d01011b) |
| 117 | #define OID_802_11_ADD_KEY ccpu2(0x0d01011d) | 117 | #define OID_802_11_ADD_KEY ccpu2(0x0d01011d) |
| 118 | #define OID_802_11_REMOVE_KEY ccpu2(0x0d01011e) | 118 | #define OID_802_11_REMOVE_KEY ccpu2(0x0d01011e) |
| 119 | #define OID_802_11_ASSOCIATION_INFORMATION ccpu2(0x0d01011f) | ||
| 119 | #define OID_802_11_PMKID ccpu2(0x0d010123) | 120 | #define OID_802_11_PMKID ccpu2(0x0d010123) |
| 120 | #define OID_802_11_NETWORK_TYPES_SUPPORTED ccpu2(0x0d010203) | 121 | #define OID_802_11_NETWORK_TYPES_SUPPORTED ccpu2(0x0d010203) |
| 121 | #define OID_802_11_NETWORK_TYPE_IN_USE ccpu2(0x0d010204) | 122 | #define OID_802_11_NETWORK_TYPE_IN_USE ccpu2(0x0d010204) |
| @@ -271,6 +272,26 @@ struct ndis_config_param { | |||
| 271 | __le32 value_length; | 272 | __le32 value_length; |
| 272 | } __attribute__((packed)); | 273 | } __attribute__((packed)); |
| 273 | 274 | ||
| 275 | struct ndis_80211_assoc_info { | ||
| 276 | __le32 length; | ||
| 277 | __le16 req_ies; | ||
| 278 | struct req_ie { | ||
| 279 | __le16 capa; | ||
| 280 | __le16 listen_interval; | ||
| 281 | u8 cur_ap_address[6]; | ||
| 282 | } req_ie; | ||
| 283 | __le32 req_ie_length; | ||
| 284 | __le32 offset_req_ies; | ||
| 285 | __le16 resp_ies; | ||
| 286 | struct resp_ie { | ||
| 287 | __le16 capa; | ||
| 288 | __le16 status_code; | ||
| 289 | __le16 assoc_id; | ||
| 290 | } resp_ie; | ||
| 291 | __le32 resp_ie_length; | ||
| 292 | __le32 offset_resp_ies; | ||
| 293 | } __attribute__((packed)); | ||
| 294 | |||
| 274 | /* these have to match what is in wpa_supplicant */ | 295 | /* these have to match what is in wpa_supplicant */ |
| 275 | enum wpa_alg { WPA_ALG_NONE, WPA_ALG_WEP, WPA_ALG_TKIP, WPA_ALG_CCMP }; | 296 | enum wpa_alg { WPA_ALG_NONE, WPA_ALG_WEP, WPA_ALG_TKIP, WPA_ALG_CCMP }; |
| 276 | enum wpa_cipher { CIPHER_NONE, CIPHER_WEP40, CIPHER_TKIP, CIPHER_CCMP, | 297 | enum wpa_cipher { CIPHER_NONE, CIPHER_WEP40, CIPHER_TKIP, CIPHER_CCMP, |
| @@ -674,6 +695,12 @@ static int get_bssid(struct usbnet *usbdev, u8 bssid[ETH_ALEN]) | |||
| 674 | return ret; | 695 | return ret; |
| 675 | } | 696 | } |
| 676 | 697 | ||
| 698 | static int get_association_info(struct usbnet *usbdev, | ||
| 699 | struct ndis_80211_assoc_info *info, int len) | ||
| 700 | { | ||
| 701 | return rndis_query_oid(usbdev, OID_802_11_ASSOCIATION_INFORMATION, | ||
| 702 | info, &len); | ||
| 703 | } | ||
| 677 | 704 | ||
| 678 | static int is_associated(struct usbnet *usbdev) | 705 | static int is_associated(struct usbnet *usbdev) |
| 679 | { | 706 | { |
| @@ -2182,11 +2209,40 @@ static void rndis_wext_worker(struct work_struct *work) | |||
| 2182 | struct usbnet *usbdev = priv->usbdev; | 2209 | struct usbnet *usbdev = priv->usbdev; |
| 2183 | union iwreq_data evt; | 2210 | union iwreq_data evt; |
| 2184 | unsigned char bssid[ETH_ALEN]; | 2211 | unsigned char bssid[ETH_ALEN]; |
| 2185 | int ret; | 2212 | struct ndis_80211_assoc_info *info; |
| 2213 | int assoc_size = sizeof(*info) + IW_CUSTOM_MAX + 32; | ||
| 2214 | int ret, offset; | ||
| 2186 | 2215 | ||
| 2187 | if (test_and_clear_bit(WORK_CONNECTION_EVENT, &priv->work_pending)) { | 2216 | if (test_and_clear_bit(WORK_CONNECTION_EVENT, &priv->work_pending)) { |
| 2188 | ret = get_bssid(usbdev, bssid); | 2217 | info = kzalloc(assoc_size, GFP_KERNEL); |
| 2218 | if (!info) | ||
| 2219 | goto get_bssid; | ||
| 2220 | |||
| 2221 | /* Get association info IEs from device and send them back to | ||
| 2222 | * userspace. */ | ||
| 2223 | ret = get_association_info(usbdev, info, assoc_size); | ||
| 2224 | if (!ret) { | ||
| 2225 | evt.data.length = le32_to_cpu(info->req_ie_length); | ||
| 2226 | if (evt.data.length > 0) { | ||
| 2227 | offset = le32_to_cpu(info->offset_req_ies); | ||
| 2228 | wireless_send_event(usbdev->net, | ||
| 2229 | IWEVASSOCREQIE, &evt, | ||
| 2230 | (char *)info + offset); | ||
| 2231 | } | ||
| 2232 | |||
| 2233 | evt.data.length = le32_to_cpu(info->resp_ie_length); | ||
| 2234 | if (evt.data.length > 0) { | ||
| 2235 | offset = le32_to_cpu(info->offset_resp_ies); | ||
| 2236 | wireless_send_event(usbdev->net, | ||
| 2237 | IWEVASSOCRESPIE, &evt, | ||
| 2238 | (char *)info + offset); | ||
| 2239 | } | ||
| 2240 | } | ||
| 2241 | |||
| 2242 | kfree(info); | ||
| 2189 | 2243 | ||
| 2244 | get_bssid: | ||
| 2245 | ret = get_bssid(usbdev, bssid); | ||
| 2190 | if (!ret) { | 2246 | if (!ret) { |
| 2191 | evt.data.flags = 0; | 2247 | evt.data.flags = 0; |
| 2192 | evt.data.length = 0; | 2248 | evt.data.length = 0; |
| @@ -2414,6 +2470,11 @@ static int bcm4320_early_init(struct usbnet *dev) | |||
| 2414 | else if (priv->param_power_save > 2) | 2470 | else if (priv->param_power_save > 2) |
| 2415 | priv->param_power_save = 2; | 2471 | priv->param_power_save = 2; |
| 2416 | 2472 | ||
| 2473 | if (priv->param_power_output < 0) | ||
| 2474 | priv->param_power_output = 0; | ||
| 2475 | else if (priv->param_power_output > 3) | ||
| 2476 | priv->param_power_output = 3; | ||
| 2477 | |||
| 2417 | if (priv->param_roamtrigger < -80) | 2478 | if (priv->param_roamtrigger < -80) |
| 2418 | priv->param_roamtrigger = -80; | 2479 | priv->param_roamtrigger = -80; |
| 2419 | else if (priv->param_roamtrigger > -60) | 2480 | else if (priv->param_roamtrigger > -60) |
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h index 57bdc153952f..611d98320593 100644 --- a/drivers/net/wireless/rt2x00/rt2x00.h +++ b/drivers/net/wireless/rt2x00/rt2x00.h | |||
| @@ -328,6 +328,11 @@ static inline int rt2x00_get_link_ant_rssi(struct link *link) | |||
| 328 | return DEFAULT_RSSI; | 328 | return DEFAULT_RSSI; |
| 329 | } | 329 | } |
| 330 | 330 | ||
| 331 | static inline void rt2x00_reset_link_ant_rssi(struct link *link) | ||
| 332 | { | ||
| 333 | link->ant.rssi_ant = 0; | ||
| 334 | } | ||
| 335 | |||
| 331 | static inline int rt2x00_get_link_ant_rssi_history(struct link *link, | 336 | static inline int rt2x00_get_link_ant_rssi_history(struct link *link, |
| 332 | enum antenna ant) | 337 | enum antenna ant) |
| 333 | { | 338 | { |
diff --git a/drivers/net/wireless/rt2x00/rt2x00config.c b/drivers/net/wireless/rt2x00/rt2x00config.c index a9930a03f450..48608e8cc8b4 100644 --- a/drivers/net/wireless/rt2x00/rt2x00config.c +++ b/drivers/net/wireless/rt2x00/rt2x00config.c | |||
| @@ -129,6 +129,7 @@ void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev, | |||
| 129 | */ | 129 | */ |
| 130 | rt2x00dev->ops->lib->config(rt2x00dev, &libconf, CONFIG_UPDATE_ANTENNA); | 130 | rt2x00dev->ops->lib->config(rt2x00dev, &libconf, CONFIG_UPDATE_ANTENNA); |
| 131 | rt2x00lib_reset_link_tuner(rt2x00dev); | 131 | rt2x00lib_reset_link_tuner(rt2x00dev); |
| 132 | rt2x00_reset_link_ant_rssi(&rt2x00dev->link); | ||
| 132 | 133 | ||
| 133 | rt2x00dev->link.ant.active.rx = libconf.ant.rx; | 134 | rt2x00dev->link.ant.active.rx = libconf.ant.rx; |
| 134 | rt2x00dev->link.ant.active.tx = libconf.ant.tx; | 135 | rt2x00dev->link.ant.active.tx = libconf.ant.tx; |
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index b22c02737185..2673d568bcac 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
| @@ -483,9 +483,9 @@ void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev) | |||
| 483 | if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags)) | 483 | if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags)) |
| 484 | return; | 484 | return; |
| 485 | 485 | ||
| 486 | ieee80211_iterate_active_interfaces(rt2x00dev->hw, | 486 | ieee80211_iterate_active_interfaces_atomic(rt2x00dev->hw, |
| 487 | rt2x00lib_beacondone_iter, | 487 | rt2x00lib_beacondone_iter, |
| 488 | rt2x00dev); | 488 | rt2x00dev); |
| 489 | 489 | ||
| 490 | queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->intf_work); | 490 | queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->intf_work); |
| 491 | } | 491 | } |
| @@ -507,7 +507,7 @@ void rt2x00lib_txdone(struct queue_entry *entry, | |||
| 507 | * Update TX statistics. | 507 | * Update TX statistics. |
| 508 | */ | 508 | */ |
| 509 | rt2x00dev->link.qual.tx_success += success; | 509 | rt2x00dev->link.qual.tx_success += success; |
| 510 | rt2x00dev->link.qual.tx_failed += txdesc->retry + fail; | 510 | rt2x00dev->link.qual.tx_failed += fail; |
| 511 | 511 | ||
| 512 | /* | 512 | /* |
| 513 | * Initialize TX status | 513 | * Initialize TX status |
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c index c206b5092070..87e280a21971 100644 --- a/drivers/net/wireless/rt2x00/rt2x00mac.c +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c | |||
| @@ -93,6 +93,7 @@ int rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
| 93 | */ | 93 | */ |
| 94 | if (!test_bit(DEVICE_PRESENT, &rt2x00dev->flags)) { | 94 | if (!test_bit(DEVICE_PRESENT, &rt2x00dev->flags)) { |
| 95 | ieee80211_stop_queues(hw); | 95 | ieee80211_stop_queues(hw); |
| 96 | dev_kfree_skb_any(skb); | ||
| 96 | return NETDEV_TX_OK; | 97 | return NETDEV_TX_OK; |
| 97 | } | 98 | } |
| 98 | 99 | ||
diff --git a/drivers/net/wireless/rtl8180_grf5101.c b/drivers/net/wireless/rtl8180_grf5101.c index 5d47935dbac3..947ee55f18b2 100644 --- a/drivers/net/wireless/rtl8180_grf5101.c +++ b/drivers/net/wireless/rtl8180_grf5101.c | |||
| @@ -88,7 +88,7 @@ static void grf5101_rf_set_channel(struct ieee80211_hw *dev, | |||
| 88 | write_grf5101(dev, 0x0B, chan); | 88 | write_grf5101(dev, 0x0B, chan); |
| 89 | write_grf5101(dev, 0x07, 0x1000); | 89 | write_grf5101(dev, 0x07, 0x1000); |
| 90 | 90 | ||
| 91 | grf5101_write_phy_antenna(dev, chan); | 91 | grf5101_write_phy_antenna(dev, channel); |
| 92 | } | 92 | } |
| 93 | 93 | ||
| 94 | static void grf5101_rf_stop(struct ieee80211_hw *dev) | 94 | static void grf5101_rf_stop(struct ieee80211_hw *dev) |
diff --git a/drivers/net/wireless/rtl8180_max2820.c b/drivers/net/wireless/rtl8180_max2820.c index a34dfd382b6d..6c825fd7f3b6 100644 --- a/drivers/net/wireless/rtl8180_max2820.c +++ b/drivers/net/wireless/rtl8180_max2820.c | |||
| @@ -78,7 +78,8 @@ static void max2820_rf_set_channel(struct ieee80211_hw *dev, | |||
| 78 | struct ieee80211_conf *conf) | 78 | struct ieee80211_conf *conf) |
| 79 | { | 79 | { |
| 80 | struct rtl8180_priv *priv = dev->priv; | 80 | struct rtl8180_priv *priv = dev->priv; |
| 81 | int channel = ieee80211_frequency_to_channel(conf->channel->center_freq); | 81 | int channel = conf ? |
| 82 | ieee80211_frequency_to_channel(conf->channel->center_freq) : 1; | ||
| 82 | unsigned int chan_idx = channel - 1; | 83 | unsigned int chan_idx = channel - 1; |
| 83 | u32 txpw = priv->channels[chan_idx].hw_value & 0xFF; | 84 | u32 txpw = priv->channels[chan_idx].hw_value & 0xFF; |
| 84 | u32 chan = max2820_chan[chan_idx]; | 85 | u32 chan = max2820_chan[chan_idx]; |
| @@ -87,7 +88,7 @@ static void max2820_rf_set_channel(struct ieee80211_hw *dev, | |||
| 87 | * sa2400, for MAXIM we do this directly from BB */ | 88 | * sa2400, for MAXIM we do this directly from BB */ |
| 88 | rtl8180_write_phy(dev, 3, txpw); | 89 | rtl8180_write_phy(dev, 3, txpw); |
| 89 | 90 | ||
| 90 | max2820_write_phy_antenna(dev, chan); | 91 | max2820_write_phy_antenna(dev, channel); |
| 91 | write_max2820(dev, 3, chan); | 92 | write_max2820(dev, 3, chan); |
| 92 | } | 93 | } |
| 93 | 94 | ||
diff --git a/drivers/net/wireless/rtl8180_sa2400.c b/drivers/net/wireless/rtl8180_sa2400.c index 0311b4ea124c..cea4e0ccb92d 100644 --- a/drivers/net/wireless/rtl8180_sa2400.c +++ b/drivers/net/wireless/rtl8180_sa2400.c | |||
| @@ -86,7 +86,7 @@ static void sa2400_rf_set_channel(struct ieee80211_hw *dev, | |||
| 86 | 86 | ||
| 87 | write_sa2400(dev, 7, txpw); | 87 | write_sa2400(dev, 7, txpw); |
| 88 | 88 | ||
| 89 | sa2400_write_phy_antenna(dev, chan); | 89 | sa2400_write_phy_antenna(dev, channel); |
| 90 | 90 | ||
| 91 | write_sa2400(dev, 0, chan); | 91 | write_sa2400(dev, 0, chan); |
| 92 | write_sa2400(dev, 1, 0xbb50); | 92 | write_sa2400(dev, 1, 0xbb50); |
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 699d97b8de5e..a9fce4afdf21 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
| @@ -672,7 +672,7 @@ static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev, | |||
| 672 | if (params->vlan) { | 672 | if (params->vlan) { |
| 673 | sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan); | 673 | sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan); |
| 674 | 674 | ||
| 675 | if (sdata->vif.type != IEEE80211_IF_TYPE_VLAN || | 675 | if (sdata->vif.type != IEEE80211_IF_TYPE_VLAN && |
| 676 | sdata->vif.type != IEEE80211_IF_TYPE_AP) | 676 | sdata->vif.type != IEEE80211_IF_TYPE_AP) |
| 677 | return -EINVAL; | 677 | return -EINVAL; |
| 678 | } else | 678 | } else |
| @@ -760,7 +760,7 @@ static int ieee80211_change_station(struct wiphy *wiphy, | |||
| 760 | if (params->vlan && params->vlan != sta->sdata->dev) { | 760 | if (params->vlan && params->vlan != sta->sdata->dev) { |
| 761 | vlansdata = IEEE80211_DEV_TO_SUB_IF(params->vlan); | 761 | vlansdata = IEEE80211_DEV_TO_SUB_IF(params->vlan); |
| 762 | 762 | ||
| 763 | if (vlansdata->vif.type != IEEE80211_IF_TYPE_VLAN || | 763 | if (vlansdata->vif.type != IEEE80211_IF_TYPE_VLAN && |
| 764 | vlansdata->vif.type != IEEE80211_IF_TYPE_AP) { | 764 | vlansdata->vif.type != IEEE80211_IF_TYPE_AP) { |
| 765 | rcu_read_unlock(); | 765 | rcu_read_unlock(); |
| 766 | return -EINVAL; | 766 | return -EINVAL; |
diff --git a/net/mac80211/main.c b/net/mac80211/main.c index 915afadb0602..5c876450b14c 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c | |||
| @@ -1313,7 +1313,7 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local, | |||
| 1313 | /* | 1313 | /* |
| 1314 | * Clear the TX filter mask for this STA when sending the next | 1314 | * Clear the TX filter mask for this STA when sending the next |
| 1315 | * packet. If the STA went to power save mode, this will happen | 1315 | * packet. If the STA went to power save mode, this will happen |
| 1316 | * happen when it wakes up for the next time. | 1316 | * when it wakes up for the next time. |
| 1317 | */ | 1317 | */ |
| 1318 | sta->flags |= WLAN_STA_CLEAR_PS_FILT; | 1318 | sta->flags |= WLAN_STA_CLEAR_PS_FILT; |
| 1319 | 1319 | ||
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 7cfd12e0d1e2..841278f1df8e 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
| @@ -1325,7 +1325,7 @@ static void ieee80211_sta_process_addba_request(struct net_device *dev, | |||
| 1325 | 1325 | ||
| 1326 | /* prepare reordering buffer */ | 1326 | /* prepare reordering buffer */ |
| 1327 | tid_agg_rx->reorder_buf = | 1327 | tid_agg_rx->reorder_buf = |
| 1328 | kmalloc(buf_size * sizeof(struct sk_buf *), GFP_ATOMIC); | 1328 | kmalloc(buf_size * sizeof(struct sk_buff *), GFP_ATOMIC); |
| 1329 | if (!tid_agg_rx->reorder_buf) { | 1329 | if (!tid_agg_rx->reorder_buf) { |
| 1330 | if (net_ratelimit()) | 1330 | if (net_ratelimit()) |
| 1331 | printk(KERN_ERR "can not allocate reordering buffer " | 1331 | printk(KERN_ERR "can not allocate reordering buffer " |
| @@ -1334,7 +1334,7 @@ static void ieee80211_sta_process_addba_request(struct net_device *dev, | |||
| 1334 | goto end; | 1334 | goto end; |
| 1335 | } | 1335 | } |
| 1336 | memset(tid_agg_rx->reorder_buf, 0, | 1336 | memset(tid_agg_rx->reorder_buf, 0, |
| 1337 | buf_size * sizeof(struct sk_buf *)); | 1337 | buf_size * sizeof(struct sk_buff *)); |
| 1338 | 1338 | ||
| 1339 | if (local->ops->ampdu_action) | 1339 | if (local->ops->ampdu_action) |
| 1340 | ret = local->ops->ampdu_action(hw, IEEE80211_AMPDU_RX_START, | 1340 | ret = local->ops->ampdu_action(hw, IEEE80211_AMPDU_RX_START, |
| @@ -1614,7 +1614,7 @@ void sta_addba_resp_timer_expired(unsigned long data) | |||
| 1614 | * only one argument, and both sta_info and TID are needed, so init | 1614 | * only one argument, and both sta_info and TID are needed, so init |
| 1615 | * flow in sta_info_create gives the TID as data, while the timer_to_id | 1615 | * flow in sta_info_create gives the TID as data, while the timer_to_id |
| 1616 | * array gives the sta through container_of */ | 1616 | * array gives the sta through container_of */ |
| 1617 | u16 tid = *(int *)data; | 1617 | u16 tid = *(u8 *)data; |
| 1618 | struct sta_info *temp_sta = container_of((void *)data, | 1618 | struct sta_info *temp_sta = container_of((void *)data, |
| 1619 | struct sta_info, timer_to_tid[tid]); | 1619 | struct sta_info, timer_to_tid[tid]); |
| 1620 | 1620 | ||
| @@ -1662,7 +1662,7 @@ timer_expired_exit: | |||
| 1662 | void sta_rx_agg_session_timer_expired(unsigned long data) | 1662 | void sta_rx_agg_session_timer_expired(unsigned long data) |
| 1663 | { | 1663 | { |
| 1664 | /* not an elegant detour, but there is no choice as the timer passes | 1664 | /* not an elegant detour, but there is no choice as the timer passes |
| 1665 | * only one argument, and verious sta_info are needed here, so init | 1665 | * only one argument, and various sta_info are needed here, so init |
| 1666 | * flow in sta_info_create gives the TID as data, while the timer_to_id | 1666 | * flow in sta_info_create gives the TID as data, while the timer_to_id |
| 1667 | * array gives the sta through container_of */ | 1667 | * array gives the sta through container_of */ |
| 1668 | u8 *ptid = (u8 *)data; | 1668 | u8 *ptid = (u8 *)data; |
| @@ -2479,8 +2479,6 @@ static int ieee80211_sta_join_ibss(struct net_device *dev, | |||
| 2479 | ifsta->state = IEEE80211_IBSS_JOINED; | 2479 | ifsta->state = IEEE80211_IBSS_JOINED; |
| 2480 | mod_timer(&ifsta->timer, jiffies + IEEE80211_IBSS_MERGE_INTERVAL); | 2480 | mod_timer(&ifsta->timer, jiffies + IEEE80211_IBSS_MERGE_INTERVAL); |
| 2481 | 2481 | ||
| 2482 | ieee80211_rx_bss_put(dev, bss); | ||
| 2483 | |||
| 2484 | return res; | 2482 | return res; |
| 2485 | } | 2483 | } |
| 2486 | 2484 | ||
| @@ -3523,6 +3521,7 @@ static int ieee80211_sta_create_ibss(struct net_device *dev, | |||
| 3523 | struct ieee80211_supported_band *sband; | 3521 | struct ieee80211_supported_band *sband; |
| 3524 | u8 bssid[ETH_ALEN], *pos; | 3522 | u8 bssid[ETH_ALEN], *pos; |
| 3525 | int i; | 3523 | int i; |
| 3524 | int ret; | ||
| 3526 | DECLARE_MAC_BUF(mac); | 3525 | DECLARE_MAC_BUF(mac); |
| 3527 | 3526 | ||
| 3528 | #if 0 | 3527 | #if 0 |
| @@ -3567,7 +3566,9 @@ static int ieee80211_sta_create_ibss(struct net_device *dev, | |||
| 3567 | *pos++ = (u8) (rate / 5); | 3566 | *pos++ = (u8) (rate / 5); |
| 3568 | } | 3567 | } |
| 3569 | 3568 | ||
| 3570 | return ieee80211_sta_join_ibss(dev, ifsta, bss); | 3569 | ret = ieee80211_sta_join_ibss(dev, ifsta, bss); |
| 3570 | ieee80211_rx_bss_put(dev, bss); | ||
| 3571 | return ret; | ||
| 3571 | } | 3572 | } |
| 3572 | 3573 | ||
| 3573 | 3574 | ||
| @@ -3615,10 +3616,13 @@ static int ieee80211_sta_find_ibss(struct net_device *dev, | |||
| 3615 | (bss = ieee80211_rx_bss_get(dev, bssid, | 3616 | (bss = ieee80211_rx_bss_get(dev, bssid, |
| 3616 | local->hw.conf.channel->center_freq, | 3617 | local->hw.conf.channel->center_freq, |
| 3617 | ifsta->ssid, ifsta->ssid_len))) { | 3618 | ifsta->ssid, ifsta->ssid_len))) { |
| 3619 | int ret; | ||
| 3618 | printk(KERN_DEBUG "%s: Selected IBSS BSSID %s" | 3620 | printk(KERN_DEBUG "%s: Selected IBSS BSSID %s" |
| 3619 | " based on configured SSID\n", | 3621 | " based on configured SSID\n", |
| 3620 | dev->name, print_mac(mac, bssid)); | 3622 | dev->name, print_mac(mac, bssid)); |
| 3621 | return ieee80211_sta_join_ibss(dev, ifsta, bss); | 3623 | ret = ieee80211_sta_join_ibss(dev, ifsta, bss); |
| 3624 | ieee80211_rx_bss_put(dev, bss); | ||
| 3625 | return ret; | ||
| 3622 | } | 3626 | } |
| 3623 | #ifdef CONFIG_MAC80211_IBSS_DEBUG | 3627 | #ifdef CONFIG_MAC80211_IBSS_DEBUG |
| 3624 | printk(KERN_DEBUG " did not try to join ibss\n"); | 3628 | printk(KERN_DEBUG " did not try to join ibss\n"); |
| @@ -4095,18 +4099,17 @@ ieee80211_sta_scan_result(struct net_device *dev, | |||
| 4095 | 4099 | ||
| 4096 | memset(&iwe, 0, sizeof(iwe)); | 4100 | memset(&iwe, 0, sizeof(iwe)); |
| 4097 | iwe.cmd = SIOCGIWFREQ; | 4101 | iwe.cmd = SIOCGIWFREQ; |
| 4098 | iwe.u.freq.m = bss->freq; | 4102 | iwe.u.freq.m = ieee80211_frequency_to_channel(bss->freq); |
| 4099 | iwe.u.freq.e = 6; | 4103 | iwe.u.freq.e = 0; |
| 4100 | current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, | 4104 | current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, |
| 4101 | IW_EV_FREQ_LEN); | 4105 | IW_EV_FREQ_LEN); |
| 4102 | 4106 | ||
| 4103 | memset(&iwe, 0, sizeof(iwe)); | 4107 | memset(&iwe, 0, sizeof(iwe)); |
| 4104 | iwe.cmd = SIOCGIWFREQ; | 4108 | iwe.cmd = SIOCGIWFREQ; |
| 4105 | iwe.u.freq.m = ieee80211_frequency_to_channel(bss->freq); | 4109 | iwe.u.freq.m = bss->freq; |
| 4106 | iwe.u.freq.e = 0; | 4110 | iwe.u.freq.e = 6; |
| 4107 | current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, | 4111 | current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, |
| 4108 | IW_EV_FREQ_LEN); | 4112 | IW_EV_FREQ_LEN); |
| 4109 | |||
| 4110 | memset(&iwe, 0, sizeof(iwe)); | 4113 | memset(&iwe, 0, sizeof(iwe)); |
| 4111 | iwe.cmd = IWEVQUAL; | 4114 | iwe.cmd = IWEVQUAL; |
| 4112 | iwe.u.qual.qual = bss->signal; | 4115 | iwe.u.qual.qual = bss->signal; |
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 1958bfb361c6..0941e5d6a522 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
| @@ -1091,7 +1091,7 @@ ieee80211_data_to_8023(struct ieee80211_rx_data *rx) | |||
| 1091 | u16 fc, hdrlen, ethertype; | 1091 | u16 fc, hdrlen, ethertype; |
| 1092 | u8 *payload; | 1092 | u8 *payload; |
| 1093 | u8 dst[ETH_ALEN]; | 1093 | u8 dst[ETH_ALEN]; |
| 1094 | u8 src[ETH_ALEN]; | 1094 | u8 src[ETH_ALEN] __aligned(2); |
| 1095 | struct sk_buff *skb = rx->skb; | 1095 | struct sk_buff *skb = rx->skb; |
| 1096 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 1096 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
| 1097 | DECLARE_MAC_BUF(mac); | 1097 | DECLARE_MAC_BUF(mac); |
| @@ -1234,7 +1234,7 @@ ieee80211_data_to_8023(struct ieee80211_rx_data *rx) | |||
| 1234 | */ | 1234 | */ |
| 1235 | static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx) | 1235 | static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx) |
| 1236 | { | 1236 | { |
| 1237 | static const u8 pae_group_addr[ETH_ALEN] | 1237 | static const u8 pae_group_addr[ETH_ALEN] __aligned(2) |
| 1238 | = { 0x01, 0x80, 0xC2, 0x00, 0x00, 0x03 }; | 1238 | = { 0x01, 0x80, 0xC2, 0x00, 0x00, 0x03 }; |
| 1239 | struct ethhdr *ehdr = (struct ethhdr *) rx->skb->data; | 1239 | struct ethhdr *ehdr = (struct ethhdr *) rx->skb->data; |
| 1240 | 1240 | ||
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 131e9e6c8a32..4e97b266f907 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
| @@ -34,11 +34,11 @@ void *mac80211_wiphy_privid = &mac80211_wiphy_privid; | |||
| 34 | 34 | ||
| 35 | /* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */ | 35 | /* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */ |
| 36 | /* Ethernet-II snap header (RFC1042 for most EtherTypes) */ | 36 | /* Ethernet-II snap header (RFC1042 for most EtherTypes) */ |
| 37 | const unsigned char rfc1042_header[] = | 37 | const unsigned char rfc1042_header[] __aligned(2) = |
| 38 | { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 }; | 38 | { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 }; |
| 39 | 39 | ||
| 40 | /* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */ | 40 | /* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */ |
| 41 | const unsigned char bridge_tunnel_header[] = | 41 | const unsigned char bridge_tunnel_header[] __aligned(2) = |
| 42 | { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 }; | 42 | { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 }; |
| 43 | 43 | ||
| 44 | 44 | ||
diff --git a/net/mac80211/wext.c b/net/mac80211/wext.c index 457ebf9e85ae..8311bb24f9f3 100644 --- a/net/mac80211/wext.c +++ b/net/mac80211/wext.c | |||
| @@ -489,9 +489,14 @@ static int ieee80211_ioctl_giwap(struct net_device *dev, | |||
| 489 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 489 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
| 490 | if (sdata->vif.type == IEEE80211_IF_TYPE_STA || | 490 | if (sdata->vif.type == IEEE80211_IF_TYPE_STA || |
| 491 | sdata->vif.type == IEEE80211_IF_TYPE_IBSS) { | 491 | sdata->vif.type == IEEE80211_IF_TYPE_IBSS) { |
| 492 | ap_addr->sa_family = ARPHRD_ETHER; | 492 | if (sdata->u.sta.state == IEEE80211_ASSOCIATED) { |
| 493 | memcpy(&ap_addr->sa_data, sdata->u.sta.bssid, ETH_ALEN); | 493 | ap_addr->sa_family = ARPHRD_ETHER; |
| 494 | return 0; | 494 | memcpy(&ap_addr->sa_data, sdata->u.sta.bssid, ETH_ALEN); |
| 495 | return 0; | ||
| 496 | } else { | ||
| 497 | memset(&ap_addr->sa_data, 0, ETH_ALEN); | ||
| 498 | return 0; | ||
| 499 | } | ||
| 495 | } else if (sdata->vif.type == IEEE80211_IF_TYPE_WDS) { | 500 | } else if (sdata->vif.type == IEEE80211_IF_TYPE_WDS) { |
| 496 | ap_addr->sa_family = ARPHRD_ETHER; | 501 | ap_addr->sa_family = ARPHRD_ETHER; |
| 497 | memcpy(&ap_addr->sa_data, sdata->u.wds.remote_addr, ETH_ALEN); | 502 | memcpy(&ap_addr->sa_data, sdata->u.wds.remote_addr, ETH_ALEN); |
