mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-03-21 06:24:12 +00:00
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6
This commit is contained in:
commit
dd50304046
11 changed files with 39 additions and 46 deletions
|
@ -1040,7 +1040,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;
|
||||||
|
@ -1158,7 +1158,7 @@ fail_resume:
|
||||||
#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
|
||||||
|
|
|
@ -1254,15 +1254,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;
|
||||||
|
|
||||||
|
|
|
@ -751,28 +751,47 @@ 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 */
|
||||||
#define AH_RX_TIME_QUANTUM 100 /* usec */
|
#define AH_RX_TIME_QUANTUM 100 /* 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;
|
||||||
|
|
|
@ -695,7 +695,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 */
|
||||||
|
|
|
@ -486,12 +486,12 @@ start_recv:
|
||||||
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);
|
||||||
|
@ -506,7 +506,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)
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
||||||
#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
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue