Commit 6e7e6213 authored by John W. Linville's avatar John W. Linville

Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6

Conflicts:
	net/mac80211/scan.c
parents 5ffaf8a3 c0ce77b8
...@@ -812,12 +812,11 @@ static void ath9k_hw_init_mode_gain_regs(struct ath_hw *ah) ...@@ -812,12 +812,11 @@ static void ath9k_hw_init_mode_gain_regs(struct ath_hw *ah)
} }
} }
static void ath9k_hw_init_11a_eeprom_fix(struct ath_hw *ah) static void ath9k_hw_init_eeprom_fix(struct ath_hw *ah)
{ {
u32 i, j; u32 i, j;
if ((ah->hw_version.devid == AR9280_DEVID_PCI) && if (ah->hw_version.devid == AR9280_DEVID_PCI) {
test_bit(ATH9K_MODE_11A, ah->caps.wireless_modes)) {
/* EEPROM Fixup */ /* EEPROM Fixup */
for (i = 0; i < ah->iniModes.ia_rows; i++) { for (i = 0; i < ah->iniModes.ia_rows; i++) {
...@@ -937,7 +936,7 @@ int ath9k_hw_init(struct ath_hw *ah) ...@@ -937,7 +936,7 @@ int ath9k_hw_init(struct ath_hw *ah)
if (r) if (r)
return r; return r;
ath9k_hw_init_11a_eeprom_fix(ah); ath9k_hw_init_eeprom_fix(ah);
r = ath9k_hw_init_macaddr(ah); r = ath9k_hw_init_macaddr(ah);
if (r) { if (r) {
......
...@@ -1472,10 +1472,10 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw, ...@@ -1472,10 +1472,10 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw,
(sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT)) { (sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT)) {
ath9k_ps_wakeup(sc); ath9k_ps_wakeup(sc);
ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq); ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq);
ath_beacon_return(sc, avp);
ath9k_ps_restore(sc); ath9k_ps_restore(sc);
} }
ath_beacon_return(sc, avp);
sc->sc_flags &= ~SC_OP_BEACONS; sc->sc_flags &= ~SC_OP_BEACONS;
for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++) { for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++) {
......
...@@ -115,6 +115,7 @@ ...@@ -115,6 +115,7 @@
#define B43_MMIO_TSF_2 0x636 /* core rev < 3 only */ #define B43_MMIO_TSF_2 0x636 /* core rev < 3 only */
#define B43_MMIO_TSF_3 0x638 /* core rev < 3 only */ #define B43_MMIO_TSF_3 0x638 /* core rev < 3 only */
#define B43_MMIO_RNG 0x65A #define B43_MMIO_RNG 0x65A
#define B43_MMIO_IFSSLOT 0x684 /* Interframe slot time */
#define B43_MMIO_IFSCTL 0x688 /* Interframe space control */ #define B43_MMIO_IFSCTL 0x688 /* Interframe space control */
#define B43_MMIO_IFSCTL_USE_EDCF 0x0004 #define B43_MMIO_IFSCTL_USE_EDCF 0x0004
#define B43_MMIO_POWERUP_DELAY 0x6A8 #define B43_MMIO_POWERUP_DELAY 0x6A8
......
...@@ -637,10 +637,17 @@ static void b43_upload_card_macaddress(struct b43_wldev *dev) ...@@ -637,10 +637,17 @@ static void b43_upload_card_macaddress(struct b43_wldev *dev)
static void b43_set_slot_time(struct b43_wldev *dev, u16 slot_time) static void b43_set_slot_time(struct b43_wldev *dev, u16 slot_time)
{ {
/* slot_time is in usec. */ /* slot_time is in usec. */
if (dev->phy.type != B43_PHYTYPE_G) /* This test used to exit for all but a G PHY. */
if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ)
return; return;
b43_write16(dev, 0x684, 510 + slot_time); b43_write16(dev, B43_MMIO_IFSSLOT, 510 + slot_time);
b43_shm_write16(dev, B43_SHM_SHARED, 0x0010, slot_time); /* Shared memory location 0x0010 is the slot time and should be
* set to slot_time; however, this register is initially 0 and changing
* the value adversely affects the transmit rate for BCM4311
* devices. Until this behavior is unterstood, delete this step
*
* b43_shm_write16(dev, B43_SHM_SHARED, 0x0010, slot_time);
*/
} }
static void b43_short_slot_timing_enable(struct b43_wldev *dev) static void b43_short_slot_timing_enable(struct b43_wldev *dev)
......
...@@ -2787,6 +2787,7 @@ int iwl_mac_config(struct ieee80211_hw *hw, u32 changed) ...@@ -2787,6 +2787,7 @@ int iwl_mac_config(struct ieee80211_hw *hw, u32 changed)
if ((le16_to_cpu(priv->staging_rxon.channel) != ch)) if ((le16_to_cpu(priv->staging_rxon.channel) != ch))
priv->staging_rxon.flags = 0; priv->staging_rxon.flags = 0;
iwl_set_rxon_ht(priv, ht_conf);
iwl_set_rxon_channel(priv, conf->channel); iwl_set_rxon_channel(priv, conf->channel);
iwl_set_flags_for_band(priv, conf->channel->band); iwl_set_flags_for_band(priv, conf->channel->band);
......
...@@ -339,7 +339,7 @@ u8 iwl_add_station(struct iwl_priv *priv, const u8 *addr, bool is_ap, u8 flags, ...@@ -339,7 +339,7 @@ u8 iwl_add_station(struct iwl_priv *priv, const u8 *addr, bool is_ap, u8 flags,
} }
EXPORT_SYMBOL(iwl_add_station); EXPORT_SYMBOL(iwl_add_station);
static void iwl_sta_ucode_deactivate(struct iwl_priv *priv, const char *addr) static void iwl_sta_ucode_deactivate(struct iwl_priv *priv, const u8 *addr)
{ {
unsigned long flags; unsigned long flags;
u8 sta_id = iwl_find_station(priv, addr); u8 sta_id = iwl_find_station(priv, addr);
...@@ -366,7 +366,7 @@ static void iwl_remove_sta_callback(struct iwl_priv *priv, ...@@ -366,7 +366,7 @@ static void iwl_remove_sta_callback(struct iwl_priv *priv,
{ {
struct iwl_rem_sta_cmd *rm_sta = struct iwl_rem_sta_cmd *rm_sta =
(struct iwl_rem_sta_cmd *)cmd->cmd.payload; (struct iwl_rem_sta_cmd *)cmd->cmd.payload;
const char *addr = rm_sta->addr; const u8 *addr = rm_sta->addr;
if (pkt->hdr.flags & IWL_CMD_FAILED_MSK) { if (pkt->hdr.flags & IWL_CMD_FAILED_MSK) {
IWL_ERR(priv, "Bad return from REPLY_REMOVE_STA (0x%08X)\n", IWL_ERR(priv, "Bad return from REPLY_REMOVE_STA (0x%08X)\n",
......
...@@ -494,8 +494,7 @@ static int ssb_devices_register(struct ssb_bus *bus) ...@@ -494,8 +494,7 @@ static int ssb_devices_register(struct ssb_bus *bus)
#endif #endif
break; break;
case SSB_BUSTYPE_SDIO: case SSB_BUSTYPE_SDIO:
#ifdef CONFIG_SSB_SDIO #ifdef CONFIG_SSB_SDIOHOST
sdev->irq = bus->host_sdio->dev.irq;
dev->parent = &bus->host_sdio->dev; dev->parent = &bus->host_sdio->dev;
#endif #endif
break; break;
......
...@@ -708,7 +708,7 @@ TRACE_EVENT(drv_ampdu_action, ...@@ -708,7 +708,7 @@ TRACE_EVENT(drv_ampdu_action,
__entry->ret = ret; __entry->ret = ret;
__entry->action = action; __entry->action = action;
__entry->tid = tid; __entry->tid = tid;
__entry->ssn = *ssn; __entry->ssn = ssn ? *ssn : 0;
), ),
TP_printk( TP_printk(
......
...@@ -652,7 +652,7 @@ static void ieee80211_rx_mgmt_probe_req(struct ieee80211_sub_if_data *sdata, ...@@ -652,7 +652,7 @@ static void ieee80211_rx_mgmt_probe_req(struct ieee80211_sub_if_data *sdata,
} }
if (pos[1] != 0 && if (pos[1] != 0 &&
(pos[1] != ifibss->ssid_len || (pos[1] != ifibss->ssid_len ||
!memcmp(pos + 2, ifibss->ssid, ifibss->ssid_len))) { memcmp(pos + 2, ifibss->ssid, ifibss->ssid_len))) {
/* Ignore ProbeReq for foreign SSID */ /* Ignore ProbeReq for foreign SSID */
return; return;
} }
......
...@@ -345,6 +345,13 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata, ...@@ -345,6 +345,13 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
if (local->scan_req) if (local->scan_req)
return -EBUSY; return -EBUSY;
if (!list_empty(&local->work_list)) {
/* wait for the work to finish/time out */
local->scan_req = req;
local->scan_sdata = sdata;
return 0;
}
if (local->ops->hw_scan) { if (local->ops->hw_scan) {
u8 *ies; u8 *ies;
...@@ -364,29 +371,33 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata, ...@@ -364,29 +371,33 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
local->hw_scan_req->ie = ies; local->hw_scan_req->ie = ies;
local->hw_scan_band = 0; local->hw_scan_band = 0;
/*
* After allocating local->hw_scan_req, we must
* go through until ieee80211_prep_hw_scan(), so
* anything that might be changed here and leave
* this function early must not go after this
* allocation.
*/
} }
local->scan_req = req; local->scan_req = req;
local->scan_sdata = sdata; local->scan_sdata = sdata;
if (!list_empty(&local->work_list)) {
/* wait for the work to finish/time out */
return 0;
}
if (local->ops->hw_scan) if (local->ops->hw_scan)
__set_bit(SCAN_HW_SCANNING, &local->scanning); __set_bit(SCAN_HW_SCANNING, &local->scanning);
else else
__set_bit(SCAN_SW_SCANNING, &local->scanning); __set_bit(SCAN_SW_SCANNING, &local->scanning);
/* /*
* Kicking off the scan need not be protected, * Kicking off the scan need not be protected,
* only the scan variable stuff, since now * only the scan variable stuff, since now
* local->scan_req is assigned and other callers * local->scan_req is assigned and other callers
* will abort their scan attempts. * will abort their scan attempts.
* *
* This avoids getting a scan_mtx -> iflist_mtx * This avoids too many locking dependencies
* dependency, so that the scan completed calls * so that the scan completed calls have more
* have more locking freedom. * locking freedom.
*/ */
ieee80211_recalc_idle(local); ieee80211_recalc_idle(local);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment