Commit 429576b9 authored by John W. Linville's avatar John W. Linville
parents 9835a30e 069f40fc
...@@ -1178,7 +1178,7 @@ static int ath9k_hif_usb_probe(struct usb_interface *interface, ...@@ -1178,7 +1178,7 @@ static int ath9k_hif_usb_probe(struct usb_interface *interface,
} }
ret = ath9k_htc_hw_init(hif_dev->htc_handle, ret = ath9k_htc_hw_init(hif_dev->htc_handle,
&hif_dev->udev->dev, hif_dev->device_id, &interface->dev, hif_dev->device_id,
hif_dev->udev->product, id->driver_info); hif_dev->udev->product, id->driver_info);
if (ret) { if (ret) {
ret = -EINVAL; ret = -EINVAL;
...@@ -1296,7 +1296,7 @@ static int ath9k_hif_usb_resume(struct usb_interface *interface) ...@@ -1296,7 +1296,7 @@ static int ath9k_hif_usb_resume(struct usb_interface *interface)
#endif #endif
static struct usb_driver ath9k_hif_usb_driver = { static struct usb_driver ath9k_hif_usb_driver = {
.name = "ath9k_hif_usb", .name = KBUILD_MODNAME,
.probe = ath9k_hif_usb_probe, .probe = ath9k_hif_usb_probe,
.disconnect = ath9k_hif_usb_disconnect, .disconnect = ath9k_hif_usb_disconnect,
#ifdef CONFIG_PM #ifdef CONFIG_PM
......
...@@ -1320,15 +1320,6 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, ...@@ -1320,15 +1320,6 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
ah->txchainmask = common->tx_chainmask; ah->txchainmask = common->tx_chainmask;
ah->rxchainmask = common->rx_chainmask; ah->rxchainmask = common->rx_chainmask;
if ((common->bus_ops->ath_bus_type != ATH_USB) && !ah->chip_fullsleep) {
ath9k_hw_abortpcurecv(ah);
if (!ath9k_hw_stopdmarecv(ah)) {
ath_dbg(common, ATH_DBG_XMIT,
"Failed to stop receive dma\n");
bChannelChange = false;
}
}
if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE)) if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
return -EIO; return -EIO;
......
...@@ -710,27 +710,46 @@ void ath9k_hw_abortpcurecv(struct ath_hw *ah) ...@@ -710,27 +710,46 @@ void ath9k_hw_abortpcurecv(struct ath_hw *ah)
} }
EXPORT_SYMBOL(ath9k_hw_abortpcurecv); EXPORT_SYMBOL(ath9k_hw_abortpcurecv);
bool ath9k_hw_stopdmarecv(struct ath_hw *ah) bool ath9k_hw_stopdmarecv(struct ath_hw *ah, bool *reset)
{ {
#define AH_RX_STOP_DMA_TIMEOUT 10000 /* usec */ #define AH_RX_STOP_DMA_TIMEOUT 10000 /* usec */
struct ath_common *common = ath9k_hw_common(ah); struct ath_common *common = ath9k_hw_common(ah);
u32 mac_status, last_mac_status = 0;
int i; int i;
/* Enable access to the DMA observation bus */
REG_WRITE(ah, AR_MACMISC,
((AR_MACMISC_DMA_OBS_LINE_8 << AR_MACMISC_DMA_OBS_S) |
(AR_MACMISC_MISC_OBS_BUS_1 <<
AR_MACMISC_MISC_OBS_BUS_MSB_S)));
REG_WRITE(ah, AR_CR, AR_CR_RXD); REG_WRITE(ah, AR_CR, AR_CR_RXD);
/* Wait for rx enable bit to go low */ /* Wait for rx enable bit to go low */
for (i = AH_RX_STOP_DMA_TIMEOUT / AH_TIME_QUANTUM; i != 0; i--) { for (i = AH_RX_STOP_DMA_TIMEOUT / AH_TIME_QUANTUM; i != 0; i--) {
if ((REG_READ(ah, AR_CR) & AR_CR_RXE) == 0) if ((REG_READ(ah, AR_CR) & AR_CR_RXE) == 0)
break; break;
if (!AR_SREV_9300_20_OR_LATER(ah)) {
mac_status = REG_READ(ah, AR_DMADBG_7) & 0x7f0;
if (mac_status == 0x1c0 && mac_status == last_mac_status) {
*reset = true;
break;
}
last_mac_status = mac_status;
}
udelay(AH_TIME_QUANTUM); udelay(AH_TIME_QUANTUM);
} }
if (i == 0) { if (i == 0) {
ath_err(common, ath_err(common,
"DMA failed to stop in %d ms AR_CR=0x%08x AR_DIAG_SW=0x%08x\n", "DMA failed to stop in %d ms AR_CR=0x%08x AR_DIAG_SW=0x%08x DMADBG_7=0x%08x\n",
AH_RX_STOP_DMA_TIMEOUT / 1000, AH_RX_STOP_DMA_TIMEOUT / 1000,
REG_READ(ah, AR_CR), REG_READ(ah, AR_CR),
REG_READ(ah, AR_DIAG_SW)); REG_READ(ah, AR_DIAG_SW),
REG_READ(ah, AR_DMADBG_7));
return false; return false;
} else { } else {
return true; return true;
......
...@@ -694,7 +694,7 @@ bool ath9k_hw_setrxabort(struct ath_hw *ah, bool set); ...@@ -694,7 +694,7 @@ bool ath9k_hw_setrxabort(struct ath_hw *ah, bool set);
void ath9k_hw_putrxbuf(struct ath_hw *ah, u32 rxdp); void ath9k_hw_putrxbuf(struct ath_hw *ah, u32 rxdp);
void ath9k_hw_startpcureceive(struct ath_hw *ah, bool is_scanning); void ath9k_hw_startpcureceive(struct ath_hw *ah, bool is_scanning);
void ath9k_hw_abortpcurecv(struct ath_hw *ah); void ath9k_hw_abortpcurecv(struct ath_hw *ah);
bool ath9k_hw_stopdmarecv(struct ath_hw *ah); bool ath9k_hw_stopdmarecv(struct ath_hw *ah, bool *reset);
int ath9k_hw_beaconq_setup(struct ath_hw *ah); int ath9k_hw_beaconq_setup(struct ath_hw *ah);
/* Interrupt Handling */ /* Interrupt Handling */
......
...@@ -1371,7 +1371,6 @@ static void ath9k_calculate_summary_state(struct ieee80211_hw *hw, ...@@ -1371,7 +1371,6 @@ static void ath9k_calculate_summary_state(struct ieee80211_hw *hw,
ath9k_calculate_iter_data(hw, vif, &iter_data); ath9k_calculate_iter_data(hw, vif, &iter_data);
ath9k_ps_wakeup(sc);
/* Set BSSID mask. */ /* Set BSSID mask. */
memcpy(common->bssidmask, iter_data.mask, ETH_ALEN); memcpy(common->bssidmask, iter_data.mask, ETH_ALEN);
ath_hw_setbssidmask(common); ath_hw_setbssidmask(common);
...@@ -1406,7 +1405,6 @@ static void ath9k_calculate_summary_state(struct ieee80211_hw *hw, ...@@ -1406,7 +1405,6 @@ static void ath9k_calculate_summary_state(struct ieee80211_hw *hw,
} }
ath9k_hw_set_interrupts(ah, ah->imask); ath9k_hw_set_interrupts(ah, ah->imask);
ath9k_ps_restore(sc);
/* Set up ANI */ /* Set up ANI */
if ((iter_data.naps + iter_data.nadhocs) > 0) { if ((iter_data.naps + iter_data.nadhocs) > 0) {
...@@ -1451,6 +1449,7 @@ static int ath9k_add_interface(struct ieee80211_hw *hw, ...@@ -1451,6 +1449,7 @@ static int ath9k_add_interface(struct ieee80211_hw *hw,
struct ath_common *common = ath9k_hw_common(ah); struct ath_common *common = ath9k_hw_common(ah);
int ret = 0; int ret = 0;
ath9k_ps_wakeup(sc);
mutex_lock(&sc->mutex); mutex_lock(&sc->mutex);
switch (vif->type) { switch (vif->type) {
...@@ -1494,6 +1493,7 @@ static int ath9k_add_interface(struct ieee80211_hw *hw, ...@@ -1494,6 +1493,7 @@ static int ath9k_add_interface(struct ieee80211_hw *hw,
ath9k_do_vif_add_setup(hw, vif); ath9k_do_vif_add_setup(hw, vif);
out: out:
mutex_unlock(&sc->mutex); mutex_unlock(&sc->mutex);
ath9k_ps_restore(sc);
return ret; return ret;
} }
...@@ -1508,6 +1508,7 @@ static int ath9k_change_interface(struct ieee80211_hw *hw, ...@@ -1508,6 +1508,7 @@ static int ath9k_change_interface(struct ieee80211_hw *hw,
ath_dbg(common, ATH_DBG_CONFIG, "Change Interface\n"); ath_dbg(common, ATH_DBG_CONFIG, "Change Interface\n");
mutex_lock(&sc->mutex); mutex_lock(&sc->mutex);
ath9k_ps_wakeup(sc);
/* See if new interface type is valid. */ /* See if new interface type is valid. */
if ((new_type == NL80211_IFTYPE_ADHOC) && if ((new_type == NL80211_IFTYPE_ADHOC) &&
...@@ -1537,6 +1538,7 @@ static int ath9k_change_interface(struct ieee80211_hw *hw, ...@@ -1537,6 +1538,7 @@ static int ath9k_change_interface(struct ieee80211_hw *hw,
ath9k_do_vif_add_setup(hw, vif); ath9k_do_vif_add_setup(hw, vif);
out: out:
ath9k_ps_restore(sc);
mutex_unlock(&sc->mutex); mutex_unlock(&sc->mutex);
return ret; return ret;
} }
...@@ -1549,6 +1551,7 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw, ...@@ -1549,6 +1551,7 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw,
ath_dbg(common, ATH_DBG_CONFIG, "Detach Interface\n"); ath_dbg(common, ATH_DBG_CONFIG, "Detach Interface\n");
ath9k_ps_wakeup(sc);
mutex_lock(&sc->mutex); mutex_lock(&sc->mutex);
sc->nvifs--; sc->nvifs--;
...@@ -1560,6 +1563,7 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw, ...@@ -1560,6 +1563,7 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw,
ath9k_calculate_summary_state(hw, NULL); ath9k_calculate_summary_state(hw, NULL);
mutex_unlock(&sc->mutex); mutex_unlock(&sc->mutex);
ath9k_ps_restore(sc);
} }
static void ath9k_enable_ps(struct ath_softc *sc) static void ath9k_enable_ps(struct ath_softc *sc)
...@@ -1840,6 +1844,7 @@ static int ath9k_conf_tx(struct ieee80211_hw *hw, u16 queue, ...@@ -1840,6 +1844,7 @@ static int ath9k_conf_tx(struct ieee80211_hw *hw, u16 queue,
txq = sc->tx.txq_map[queue]; txq = sc->tx.txq_map[queue];
ath9k_ps_wakeup(sc);
mutex_lock(&sc->mutex); mutex_lock(&sc->mutex);
memset(&qi, 0, sizeof(struct ath9k_tx_queue_info)); memset(&qi, 0, sizeof(struct ath9k_tx_queue_info));
...@@ -1863,6 +1868,7 @@ static int ath9k_conf_tx(struct ieee80211_hw *hw, u16 queue, ...@@ -1863,6 +1868,7 @@ static int ath9k_conf_tx(struct ieee80211_hw *hw, u16 queue,
ath_beaconq_config(sc); ath_beaconq_config(sc);
mutex_unlock(&sc->mutex); mutex_unlock(&sc->mutex);
ath9k_ps_restore(sc);
return ret; return ret;
} }
...@@ -2021,6 +2027,7 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw, ...@@ -2021,6 +2027,7 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
int slottime; int slottime;
int error; int error;
ath9k_ps_wakeup(sc);
mutex_lock(&sc->mutex); mutex_lock(&sc->mutex);
if (changed & BSS_CHANGED_BSSID) { if (changed & BSS_CHANGED_BSSID) {
...@@ -2106,6 +2113,7 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw, ...@@ -2106,6 +2113,7 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
} }
mutex_unlock(&sc->mutex); mutex_unlock(&sc->mutex);
ath9k_ps_restore(sc);
} }
static u64 ath9k_get_tsf(struct ieee80211_hw *hw) static u64 ath9k_get_tsf(struct ieee80211_hw *hw)
......
...@@ -483,12 +483,12 @@ int ath_startrecv(struct ath_softc *sc) ...@@ -483,12 +483,12 @@ int ath_startrecv(struct ath_softc *sc)
bool ath_stoprecv(struct ath_softc *sc) bool ath_stoprecv(struct ath_softc *sc)
{ {
struct ath_hw *ah = sc->sc_ah; struct ath_hw *ah = sc->sc_ah;
bool stopped; bool stopped, reset = false;
spin_lock_bh(&sc->rx.rxbuflock); spin_lock_bh(&sc->rx.rxbuflock);
ath9k_hw_abortpcurecv(ah); ath9k_hw_abortpcurecv(ah);
ath9k_hw_setrxfilter(ah, 0); ath9k_hw_setrxfilter(ah, 0);
stopped = ath9k_hw_stopdmarecv(ah); stopped = ath9k_hw_stopdmarecv(ah, &reset);
if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
ath_edma_stop_recv(sc); ath_edma_stop_recv(sc);
...@@ -503,7 +503,7 @@ bool ath_stoprecv(struct ath_softc *sc) ...@@ -503,7 +503,7 @@ bool ath_stoprecv(struct ath_softc *sc)
"confusing the DMA engine when we start RX up\n"); "confusing the DMA engine when we start RX up\n");
ATH_DBG_WARN_ON_ONCE(!stopped); ATH_DBG_WARN_ON_ONCE(!stopped);
} }
return stopped; return stopped && !reset;
} }
void ath_flushrecv(struct ath_softc *sc) void ath_flushrecv(struct ath_softc *sc)
......
config IWLWIFI_LEGACY config IWLWIFI_LEGACY
tristate "Intel Wireless Wifi legacy devices" tristate
depends on PCI && MAC80211
select FW_LOADER select FW_LOADER
select NEW_LEDS select NEW_LEDS
select LEDS_CLASS select LEDS_CLASS
...@@ -65,7 +64,8 @@ endmenu ...@@ -65,7 +64,8 @@ endmenu
config IWL4965 config IWL4965
tristate "Intel Wireless WiFi 4965AGN (iwl4965)" tristate "Intel Wireless WiFi 4965AGN (iwl4965)"
depends on IWLWIFI_LEGACY depends on PCI && MAC80211
select IWLWIFI_LEGACY
---help--- ---help---
This option enables support for This option enables support for
...@@ -92,7 +92,8 @@ config IWL4965 ...@@ -92,7 +92,8 @@ config IWL4965
config IWL3945 config IWL3945
tristate "Intel PRO/Wireless 3945ABG/BG Network Connection (iwl3945)" tristate "Intel PRO/Wireless 3945ABG/BG Network Connection (iwl3945)"
depends on IWLWIFI_LEGACY depends on PCI && MAC80211
select IWLWIFI_LEGACY
---help--- ---help---
Select to build the driver supporting the: Select to build the driver supporting the:
......
...@@ -74,8 +74,6 @@ ...@@ -74,8 +74,6 @@
/* RSSI to dBm */ /* RSSI to dBm */
#define IWL39_RSSI_OFFSET 95 #define IWL39_RSSI_OFFSET 95
#define IWL_DEFAULT_TX_POWER 0x0F
/* /*
* EEPROM related constants, enums, and structures. * EEPROM related constants, enums, and structures.
*/ */
......
...@@ -804,9 +804,6 @@ struct iwl4965_scd_bc_tbl { ...@@ -804,9 +804,6 @@ struct iwl4965_scd_bc_tbl {
#define IWL4965_DEFAULT_TX_RETRY 15 #define IWL4965_DEFAULT_TX_RETRY 15
/* Limit range of txpower output target to be between these values */
#define IWL4965_TX_POWER_TARGET_POWER_MIN (0) /* 0 dBm: 1 milliwatt */
/* EEPROM */ /* EEPROM */
#define IWL4965_FIRST_AMPDU_QUEUE 10 #define IWL4965_FIRST_AMPDU_QUEUE 10
......
...@@ -1127,12 +1127,16 @@ int iwl4965_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index) ...@@ -1127,12 +1127,16 @@ int iwl4965_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index)
q->read_ptr = iwl_legacy_queue_inc_wrap(q->read_ptr, q->n_bd)) { q->read_ptr = iwl_legacy_queue_inc_wrap(q->read_ptr, q->n_bd)) {
tx_info = &txq->txb[txq->q.read_ptr]; tx_info = &txq->txb[txq->q.read_ptr];
iwl4965_tx_status(priv, tx_info,
txq_id >= IWL4965_FIRST_AMPDU_QUEUE); if (WARN_ON_ONCE(tx_info->skb == NULL))
continue;
hdr = (struct ieee80211_hdr *)tx_info->skb->data; hdr = (struct ieee80211_hdr *)tx_info->skb->data;
if (hdr && ieee80211_is_data_qos(hdr->frame_control)) if (ieee80211_is_data_qos(hdr->frame_control))
nfreed++; nfreed++;
iwl4965_tx_status(priv, tx_info,
txq_id >= IWL4965_FIRST_AMPDU_QUEUE);
tx_info->skb = NULL; tx_info->skb = NULL;
priv->cfg->ops->lib->txq_free_tfd(priv, txq); priv->cfg->ops->lib->txq_free_tfd(priv, txq);
......
...@@ -160,6 +160,7 @@ int iwl_legacy_init_geos(struct iwl_priv *priv) ...@@ -160,6 +160,7 @@ int iwl_legacy_init_geos(struct iwl_priv *priv)
struct ieee80211_channel *geo_ch; struct ieee80211_channel *geo_ch;
struct ieee80211_rate *rates; struct ieee80211_rate *rates;
int i = 0; int i = 0;
s8 max_tx_power = 0;
if (priv->bands[IEEE80211_BAND_2GHZ].n_bitrates || if (priv->bands[IEEE80211_BAND_2GHZ].n_bitrates ||
priv->bands[IEEE80211_BAND_5GHZ].n_bitrates) { priv->bands[IEEE80211_BAND_5GHZ].n_bitrates) {
...@@ -235,8 +236,8 @@ int iwl_legacy_init_geos(struct iwl_priv *priv) ...@@ -235,8 +236,8 @@ int iwl_legacy_init_geos(struct iwl_priv *priv)
geo_ch->flags |= ch->ht40_extension_channel; geo_ch->flags |= ch->ht40_extension_channel;
if (ch->max_power_avg > priv->tx_power_device_lmt) if (ch->max_power_avg > max_tx_power)
priv->tx_power_device_lmt = ch->max_power_avg; max_tx_power = ch->max_power_avg;
} else { } else {
geo_ch->flags |= IEEE80211_CHAN_DISABLED; geo_ch->flags |= IEEE80211_CHAN_DISABLED;
} }
...@@ -249,6 +250,10 @@ int iwl_legacy_init_geos(struct iwl_priv *priv) ...@@ -249,6 +250,10 @@ int iwl_legacy_init_geos(struct iwl_priv *priv)
geo_ch->flags); geo_ch->flags);
} }
priv->tx_power_device_lmt = max_tx_power;
priv->tx_power_user_lmt = max_tx_power;
priv->tx_power_next = max_tx_power;
if ((priv->bands[IEEE80211_BAND_5GHZ].n_channels == 0) && if ((priv->bands[IEEE80211_BAND_5GHZ].n_channels == 0) &&
priv->cfg->sku & IWL_SKU_A) { priv->cfg->sku & IWL_SKU_A) {
IWL_INFO(priv, "Incorrectly detected BG card as ABG. " IWL_INFO(priv, "Incorrectly detected BG card as ABG. "
...@@ -1124,11 +1129,11 @@ int iwl_legacy_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force) ...@@ -1124,11 +1129,11 @@ int iwl_legacy_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force)
if (!priv->cfg->ops->lib->send_tx_power) if (!priv->cfg->ops->lib->send_tx_power)
return -EOPNOTSUPP; return -EOPNOTSUPP;
if (tx_power < IWL4965_TX_POWER_TARGET_POWER_MIN) { /* 0 dBm mean 1 milliwatt */
if (tx_power < 0) {
IWL_WARN(priv, IWL_WARN(priv,
"Requested user TXPOWER %d below lower limit %d.\n", "Requested user TXPOWER %d below 1 mW.\n",
tx_power, tx_power);
IWL4965_TX_POWER_TARGET_POWER_MIN);
return -EINVAL; return -EINVAL;
} }
......
...@@ -471,13 +471,6 @@ int iwl_legacy_init_channel_map(struct iwl_priv *priv) ...@@ -471,13 +471,6 @@ int iwl_legacy_init_channel_map(struct iwl_priv *priv)
flags & EEPROM_CHANNEL_RADAR)) flags & EEPROM_CHANNEL_RADAR))
? "" : "not "); ? "" : "not ");
/* Set the tx_power_user_lmt to the highest power
* supported by any channel */
if (eeprom_ch_info[ch].max_power_avg >
priv->tx_power_user_lmt)
priv->tx_power_user_lmt =
eeprom_ch_info[ch].max_power_avg;
ch_info++; ch_info++;
} }
} }
......
...@@ -3825,10 +3825,6 @@ static int iwl3945_init_drv(struct iwl_priv *priv) ...@@ -3825,10 +3825,6 @@ static int iwl3945_init_drv(struct iwl_priv *priv)
priv->force_reset[IWL_FW_RESET].reset_duration = priv->force_reset[IWL_FW_RESET].reset_duration =
IWL_DELAY_NEXT_FORCE_FW_RELOAD; IWL_DELAY_NEXT_FORCE_FW_RELOAD;
priv->tx_power_user_lmt = IWL_DEFAULT_TX_POWER;
priv->tx_power_next = IWL_DEFAULT_TX_POWER;
if (eeprom->version < EEPROM_3945_EEPROM_VERSION) { if (eeprom->version < EEPROM_3945_EEPROM_VERSION) {
IWL_WARN(priv, "Unsupported EEPROM version: 0x%04X\n", IWL_WARN(priv, "Unsupported EEPROM version: 0x%04X\n",
eeprom->version); eeprom->version);
......
...@@ -3140,12 +3140,6 @@ static int iwl4965_init_drv(struct iwl_priv *priv) ...@@ -3140,12 +3140,6 @@ static int iwl4965_init_drv(struct iwl_priv *priv)
iwl_legacy_init_scan_params(priv); iwl_legacy_init_scan_params(priv);
/* Set the tx_power_user_lmt to the lowest power level
* this value will get overwritten by channel max power avg
* from eeprom */
priv->tx_power_user_lmt = IWL4965_TX_POWER_TARGET_POWER_MIN;
priv->tx_power_next = IWL4965_TX_POWER_TARGET_POWER_MIN;
ret = iwl_legacy_init_channel_map(priv); ret = iwl_legacy_init_channel_map(priv);
if (ret) { if (ret) {
IWL_ERR(priv, "initializing regulatory failed: %d\n", ret); IWL_ERR(priv, "initializing regulatory failed: %d\n", ret);
......
...@@ -333,7 +333,6 @@ int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed) ...@@ -333,7 +333,6 @@ int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed)
struct ieee80211_channel *channel = conf->channel; struct ieee80211_channel *channel = conf->channel;
const struct iwl_channel_info *ch_info; const struct iwl_channel_info *ch_info;
int ret = 0; int ret = 0;
bool ht_changed[NUM_IWL_RXON_CTX] = {};
IWL_DEBUG_MAC80211(priv, "changed %#x", changed); IWL_DEBUG_MAC80211(priv, "changed %#x", changed);
...@@ -381,10 +380,8 @@ int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed) ...@@ -381,10 +380,8 @@ int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed)
for_each_context(priv, ctx) { for_each_context(priv, ctx) {
/* Configure HT40 channels */ /* Configure HT40 channels */
if (ctx->ht.enabled != conf_is_ht(conf)) { if (ctx->ht.enabled != conf_is_ht(conf))
ctx->ht.enabled = conf_is_ht(conf); ctx->ht.enabled = conf_is_ht(conf);
ht_changed[ctx->ctxid] = true;
}
if (ctx->ht.enabled) { if (ctx->ht.enabled) {
if (conf_is_ht40_minus(conf)) { if (conf_is_ht40_minus(conf)) {
...@@ -453,8 +450,6 @@ int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed) ...@@ -453,8 +450,6 @@ int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed)
if (!memcmp(&ctx->staging, &ctx->active, sizeof(ctx->staging))) if (!memcmp(&ctx->staging, &ctx->active, sizeof(ctx->staging)))
continue; continue;
iwlagn_commit_rxon(priv, ctx); iwlagn_commit_rxon(priv, ctx);
if (ht_changed[ctx->ctxid])
iwlagn_update_qos(priv, ctx);
} }
out: out:
mutex_unlock(&priv->mutex); mutex_unlock(&priv->mutex);
......
...@@ -1236,12 +1236,16 @@ int iwlagn_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index) ...@@ -1236,12 +1236,16 @@ int iwlagn_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index)
q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd)) { q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd)) {
tx_info = &txq->txb[txq->q.read_ptr]; tx_info = &txq->txb[txq->q.read_ptr];
iwlagn_tx_status(priv, tx_info,
txq_id >= IWLAGN_FIRST_AMPDU_QUEUE); if (WARN_ON_ONCE(tx_info->skb == NULL))
continue;
hdr = (struct ieee80211_hdr *)tx_info->skb->data; hdr = (struct ieee80211_hdr *)tx_info->skb->data;
if (hdr && ieee80211_is_data_qos(hdr->frame_control)) if (ieee80211_is_data_qos(hdr->frame_control))
nfreed++; nfreed++;
iwlagn_tx_status(priv, tx_info,
txq_id >= IWLAGN_FIRST_AMPDU_QUEUE);
tx_info->skb = NULL; tx_info->skb = NULL;
if (priv->cfg->ops->lib->txq_inval_byte_cnt_tbl) if (priv->cfg->ops->lib->txq_inval_byte_cnt_tbl)
......
...@@ -703,7 +703,7 @@ void p54_tx_80211(struct ieee80211_hw *dev, struct sk_buff *skb) ...@@ -703,7 +703,7 @@ void p54_tx_80211(struct ieee80211_hw *dev, struct sk_buff *skb)
struct p54_tx_info *p54info; struct p54_tx_info *p54info;
struct p54_hdr *hdr; struct p54_hdr *hdr;
struct p54_tx_data *txhdr; struct p54_tx_data *txhdr;
unsigned int padding, len, extra_len; unsigned int padding, len, extra_len = 0;
int i, j, ridx; int i, j, ridx;
u16 hdr_flags = 0, aid = 0; u16 hdr_flags = 0, aid = 0;
u8 rate, queue = 0, crypt_offset = 0; u8 rate, queue = 0, crypt_offset = 0;
......
...@@ -586,10 +586,8 @@ static int hci_dev_do_close(struct hci_dev *hdev) ...@@ -586,10 +586,8 @@ static int hci_dev_do_close(struct hci_dev *hdev)
hci_req_cancel(hdev, ENODEV); hci_req_cancel(hdev, ENODEV);
hci_req_lock(hdev); hci_req_lock(hdev);
/* Stop timer, it might be running */
del_timer_sync(&hdev->cmd_timer);
if (!test_and_clear_bit(HCI_UP, &hdev->flags)) { if (!test_and_clear_bit(HCI_UP, &hdev->flags)) {
del_timer_sync(&hdev->cmd_timer);
hci_req_unlock(hdev); hci_req_unlock(hdev);
return 0; return 0;
} }
...@@ -628,6 +626,7 @@ static int hci_dev_do_close(struct hci_dev *hdev) ...@@ -628,6 +626,7 @@ static int hci_dev_do_close(struct hci_dev *hdev)
/* Drop last sent command */ /* Drop last sent command */
if (hdev->sent_cmd) { if (hdev->sent_cmd) {
del_timer_sync(&hdev->cmd_timer);
kfree_skb(hdev->sent_cmd); kfree_skb(hdev->sent_cmd);
hdev->sent_cmd = NULL; hdev->sent_cmd = NULL;
} }
......
...@@ -2419,8 +2419,6 @@ static inline void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *s ...@@ -2419,8 +2419,6 @@ static inline void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *s
if (!conn) if (!conn)
goto unlock; goto unlock;
hci_conn_hold(conn);
conn->remote_cap = ev->capability; conn->remote_cap = ev->capability;
conn->remote_oob = ev->oob_data; conn->remote_oob = ev->oob_data;
conn->remote_auth = ev->authentication; conn->remote_auth = ev->authentication;
......
...@@ -1079,6 +1079,7 @@ static void l2cap_retransmit_one_frame(struct l2cap_chan *chan, u8 tx_seq) ...@@ -1079,6 +1079,7 @@ static void l2cap_retransmit_one_frame(struct l2cap_chan *chan, u8 tx_seq)
tx_skb = skb_clone(skb, GFP_ATOMIC); tx_skb = skb_clone(skb, GFP_ATOMIC);
bt_cb(skb)->retries++; bt_cb(skb)->retries++;
control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE); control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE);
control &= L2CAP_CTRL_SAR;
if (chan->conn_state & L2CAP_CONN_SEND_FBIT) { if (chan->conn_state & L2CAP_CONN_SEND_FBIT) {
control |= L2CAP_CTRL_FINAL; control |= L2CAP_CTRL_FINAL;
......
...@@ -369,6 +369,15 @@ static void __sco_sock_close(struct sock *sk) ...@@ -369,6 +369,15 @@ static void __sco_sock_close(struct sock *sk)
case BT_CONNECTED: case BT_CONNECTED:
case BT_CONFIG: case BT_CONFIG:
if (sco_pi(sk)->conn) {
sk->sk_state = BT_DISCONN;
sco_sock_set_timer(sk, SCO_DISCONN_TIMEOUT);
hci_conn_put(sco_pi(sk)->conn->hcon);
sco_pi(sk)->conn = NULL;
} else
sco_chan_del(sk, ECONNRESET);
break;
case BT_CONNECT: case BT_CONNECT:
case BT_DISCONN: case BT_DISCONN:
sco_chan_del(sk, ECONNRESET); sco_chan_del(sk, ECONNRESET);
......
...@@ -1526,6 +1526,8 @@ int __ieee80211_request_smps(struct ieee80211_sub_if_data *sdata, ...@@ -1526,6 +1526,8 @@ int __ieee80211_request_smps(struct ieee80211_sub_if_data *sdata,
enum ieee80211_smps_mode old_req; enum ieee80211_smps_mode old_req;
int err; int err;
lockdep_assert_held(&sdata->u.mgd.mtx);
old_req = sdata->u.mgd.req_smps; old_req = sdata->u.mgd.req_smps;
sdata->u.mgd.req_smps = smps_mode; sdata->u.mgd.req_smps = smps_mode;
......
...@@ -177,9 +177,9 @@ static int ieee80211_set_smps(struct ieee80211_sub_if_data *sdata, ...@@ -177,9 +177,9 @@ static int ieee80211_set_smps(struct ieee80211_sub_if_data *sdata,
if (sdata->vif.type != NL80211_IFTYPE_STATION) if (sdata->vif.type != NL80211_IFTYPE_STATION)
return -EOPNOTSUPP; return -EOPNOTSUPP;
mutex_lock(&local->iflist_mtx); mutex_lock(&sdata->u.mgd.mtx);
err = __ieee80211_request_smps(sdata, smps_mode); err = __ieee80211_request_smps(sdata, smps_mode);
mutex_unlock(&local->iflist_mtx); mutex_unlock(&sdata->u.mgd.mtx);
return err; return err;
} }
......
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