mirror of
https://github.com/a52xq-dev/kernel.git
synced 2026-10-18 21:58:11 +07:00
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6
Conflicts: drivers/net/wireless/iwlwifi/iwl-core.h drivers/net/wireless/rt2x00/rt2800pci.c
This commit is contained in:
commit
19bc291c99
104 changed files with 3097 additions and 1621 deletions
|
|
@ -5978,7 +5978,7 @@ S: Maintained
|
|||
F: drivers/input/misc/wistron_btns.c
|
||||
|
||||
WL1251 WIRELESS DRIVER
|
||||
M: Kalle Valo <kalle.valo@nokia.com>
|
||||
M: Kalle Valo <kalle.valo@iki.fi>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
W: http://wireless.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
|
||||
|
|
|
|||
|
|
@ -112,6 +112,7 @@ config AIRO_CS
|
|||
depends on PCMCIA && (BROKEN || !M32R)
|
||||
select WIRELESS_EXT
|
||||
select WEXT_SPY
|
||||
select WEXT_PRIV
|
||||
select CRYPTO
|
||||
select CRYPTO_AES
|
||||
---help---
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@
|
|||
#include <linux/freezer.h>
|
||||
|
||||
#include <linux/ieee80211.h>
|
||||
#include <net/iw_handler.h>
|
||||
|
||||
#include "airo.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -2329,54 +2329,55 @@ out:
|
|||
return err;
|
||||
}
|
||||
|
||||
static void ar9170_sta_notify(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
enum sta_notify_cmd cmd,
|
||||
struct ieee80211_sta *sta)
|
||||
static int ar9170_sta_add(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ar9170 *ar = hw->priv;
|
||||
struct ar9170_sta_info *sta_info = (void *) sta->drv_priv;
|
||||
unsigned int i;
|
||||
|
||||
switch (cmd) {
|
||||
case STA_NOTIFY_ADD:
|
||||
memset(sta_info, 0, sizeof(*sta_info));
|
||||
memset(sta_info, 0, sizeof(*sta_info));
|
||||
|
||||
if (!sta->ht_cap.ht_supported)
|
||||
break;
|
||||
if (!sta->ht_cap.ht_supported)
|
||||
return 0;
|
||||
|
||||
if (sta->ht_cap.ampdu_density > ar->global_ampdu_density)
|
||||
ar->global_ampdu_density = sta->ht_cap.ampdu_density;
|
||||
if (sta->ht_cap.ampdu_density > ar->global_ampdu_density)
|
||||
ar->global_ampdu_density = sta->ht_cap.ampdu_density;
|
||||
|
||||
if (sta->ht_cap.ampdu_factor < ar->global_ampdu_factor)
|
||||
ar->global_ampdu_factor = sta->ht_cap.ampdu_factor;
|
||||
if (sta->ht_cap.ampdu_factor < ar->global_ampdu_factor)
|
||||
ar->global_ampdu_factor = sta->ht_cap.ampdu_factor;
|
||||
|
||||
for (i = 0; i < AR9170_NUM_TID; i++) {
|
||||
sta_info->agg[i].state = AR9170_TID_STATE_SHUTDOWN;
|
||||
sta_info->agg[i].active = false;
|
||||
sta_info->agg[i].ssn = 0;
|
||||
sta_info->agg[i].tid = i;
|
||||
INIT_LIST_HEAD(&sta_info->agg[i].list);
|
||||
skb_queue_head_init(&sta_info->agg[i].queue);
|
||||
}
|
||||
|
||||
sta_info->ampdu_max_len = 1 << (3 + sta->ht_cap.ampdu_factor);
|
||||
break;
|
||||
|
||||
case STA_NOTIFY_REMOVE:
|
||||
if (!sta->ht_cap.ht_supported)
|
||||
break;
|
||||
|
||||
for (i = 0; i < AR9170_NUM_TID; i++) {
|
||||
sta_info->agg[i].state = AR9170_TID_STATE_INVALID;
|
||||
skb_queue_purge(&sta_info->agg[i].queue);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
for (i = 0; i < AR9170_NUM_TID; i++) {
|
||||
sta_info->agg[i].state = AR9170_TID_STATE_SHUTDOWN;
|
||||
sta_info->agg[i].active = false;
|
||||
sta_info->agg[i].ssn = 0;
|
||||
sta_info->agg[i].tid = i;
|
||||
INIT_LIST_HEAD(&sta_info->agg[i].list);
|
||||
skb_queue_head_init(&sta_info->agg[i].queue);
|
||||
}
|
||||
|
||||
sta_info->ampdu_max_len = 1 << (3 + sta->ht_cap.ampdu_factor);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ar9170_sta_remove(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ar9170_sta_info *sta_info = (void *) sta->drv_priv;
|
||||
unsigned int i;
|
||||
|
||||
if (!sta->ht_cap.ht_supported)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < AR9170_NUM_TID; i++) {
|
||||
sta_info->agg[i].state = AR9170_TID_STATE_INVALID;
|
||||
skb_queue_purge(&sta_info->agg[i].queue);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ar9170_get_stats(struct ieee80211_hw *hw,
|
||||
|
|
@ -2495,7 +2496,8 @@ static const struct ieee80211_ops ar9170_ops = {
|
|||
.bss_info_changed = ar9170_op_bss_info_changed,
|
||||
.get_tsf = ar9170_op_get_tsf,
|
||||
.set_key = ar9170_set_key,
|
||||
.sta_notify = ar9170_sta_notify,
|
||||
.sta_add = ar9170_sta_add,
|
||||
.sta_remove = ar9170_sta_remove,
|
||||
.get_stats = ar9170_get_stats,
|
||||
.ampdu_action = ar9170_ampdu_action,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ int ath_beaconq_config(struct ath_softc *sc)
|
|||
* Beacons are always sent out at the lowest rate, and are not retried.
|
||||
*/
|
||||
static void ath_beacon_setup(struct ath_softc *sc, struct ath_vif *avp,
|
||||
struct ath_buf *bf)
|
||||
struct ath_buf *bf, int rateidx)
|
||||
{
|
||||
struct sk_buff *skb = bf->bf_mpdu;
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
|
|
@ -96,9 +96,9 @@ static void ath_beacon_setup(struct ath_softc *sc, struct ath_vif *avp,
|
|||
ds->ds_data = bf->bf_buf_addr;
|
||||
|
||||
sband = &sc->sbands[common->hw->conf.channel->band];
|
||||
rate = sband->bitrates[0].hw_value;
|
||||
rate = sband->bitrates[rateidx].hw_value;
|
||||
if (sc->sc_flags & SC_OP_PREAMBLE_SHORT)
|
||||
rate |= sband->bitrates[0].hw_value_short;
|
||||
rate |= sband->bitrates[rateidx].hw_value_short;
|
||||
|
||||
ath9k_hw_set11n_txdesc(ah, ds, skb->len + FCS_LEN,
|
||||
ATH9K_PKT_TYPE_BEACON,
|
||||
|
|
@ -206,7 +206,7 @@ static struct ath_buf *ath_beacon_generate(struct ieee80211_hw *hw,
|
|||
}
|
||||
}
|
||||
|
||||
ath_beacon_setup(sc, avp, bf);
|
||||
ath_beacon_setup(sc, avp, bf, info->control.rates[0].idx);
|
||||
|
||||
while (skb) {
|
||||
ath_tx_cabq(hw, skb);
|
||||
|
|
@ -237,7 +237,7 @@ static void ath_beacon_start_adhoc(struct ath_softc *sc,
|
|||
bf = avp->av_bcbuf;
|
||||
skb = bf->bf_mpdu;
|
||||
|
||||
ath_beacon_setup(sc, avp, bf);
|
||||
ath_beacon_setup(sc, avp, bf, 0);
|
||||
|
||||
/* NB: caller is known to have already stopped tx dma */
|
||||
ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bf->bf_daddr);
|
||||
|
|
@ -526,16 +526,13 @@ static void ath_beacon_config_ap(struct ath_softc *sc,
|
|||
{
|
||||
u32 nexttbtt, intval;
|
||||
|
||||
/* Configure the timers only when the TSF has to be reset */
|
||||
|
||||
if (!(sc->sc_flags & SC_OP_TSF_RESET))
|
||||
return;
|
||||
|
||||
/* NB: the beacon interval is kept internally in TU's */
|
||||
intval = conf->beacon_interval & ATH9K_BEACON_PERIOD;
|
||||
intval /= ATH_BCBUF; /* for staggered beacons */
|
||||
nexttbtt = intval;
|
||||
intval |= ATH9K_BEACON_RESET_TSF;
|
||||
|
||||
if (sc->sc_flags & SC_OP_TSF_RESET)
|
||||
intval |= ATH9K_BEACON_RESET_TSF;
|
||||
|
||||
/*
|
||||
* In AP mode we enable the beacon timers and SWBA interrupts to
|
||||
|
|
|
|||
|
|
@ -1684,24 +1684,28 @@ static void ath9k_configure_filter(struct ieee80211_hw *hw,
|
|||
"Set HW RX filter: 0x%x\n", rfilt);
|
||||
}
|
||||
|
||||
static void ath9k_sta_notify(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
enum sta_notify_cmd cmd,
|
||||
struct ieee80211_sta *sta)
|
||||
static int ath9k_sta_add(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ath_wiphy *aphy = hw->priv;
|
||||
struct ath_softc *sc = aphy->sc;
|
||||
|
||||
switch (cmd) {
|
||||
case STA_NOTIFY_ADD:
|
||||
ath_node_attach(sc, sta);
|
||||
break;
|
||||
case STA_NOTIFY_REMOVE:
|
||||
ath_node_detach(sc, sta);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
ath_node_attach(sc, sta);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ath9k_sta_remove(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ath_wiphy *aphy = hw->priv;
|
||||
struct ath_softc *sc = aphy->sc;
|
||||
|
||||
ath_node_detach(sc, sta);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ath9k_conf_tx(struct ieee80211_hw *hw, u16 queue,
|
||||
|
|
@ -2045,7 +2049,8 @@ struct ieee80211_ops ath9k_ops = {
|
|||
.remove_interface = ath9k_remove_interface,
|
||||
.config = ath9k_config,
|
||||
.configure_filter = ath9k_configure_filter,
|
||||
.sta_notify = ath9k_sta_notify,
|
||||
.sta_add = ath9k_sta_add,
|
||||
.sta_remove = ath9k_sta_remove,
|
||||
.conf_tx = ath9k_conf_tx,
|
||||
.bss_info_changed = ath9k_bss_info_changed,
|
||||
.set_key = ath9k_set_key,
|
||||
|
|
|
|||
|
|
@ -668,7 +668,7 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,
|
|||
struct ieee80211_tx_rate *rates = tx_info->control.rates;
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
__le16 fc = hdr->frame_control;
|
||||
u8 try_per_rate, i = 0, rix, nrix;
|
||||
u8 try_per_rate, i = 0, rix;
|
||||
int is_probe = 0;
|
||||
|
||||
if (rate_control_send_low(sta, priv_sta, txrc))
|
||||
|
|
@ -688,26 +688,25 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,
|
|||
|
||||
rate_table = sc->cur_rate_table;
|
||||
rix = ath_rc_get_highest_rix(sc, ath_rc_priv, rate_table, &is_probe);
|
||||
nrix = rix;
|
||||
|
||||
if (is_probe) {
|
||||
/* set one try for probe rates. For the
|
||||
* probes don't enable rts */
|
||||
ath_rc_rate_set_series(rate_table, &rates[i++], txrc,
|
||||
1, nrix, 0);
|
||||
1, rix, 0);
|
||||
|
||||
/* Get the next tried/allowed rate. No RTS for the next series
|
||||
* after the probe rate
|
||||
*/
|
||||
ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &nrix);
|
||||
ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &rix);
|
||||
ath_rc_rate_set_series(rate_table, &rates[i++], txrc,
|
||||
try_per_rate, nrix, 0);
|
||||
try_per_rate, rix, 0);
|
||||
|
||||
tx_info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE;
|
||||
} else {
|
||||
/* Set the choosen rate. No RTS for first series entry. */
|
||||
ath_rc_rate_set_series(rate_table, &rates[i++], txrc,
|
||||
try_per_rate, nrix, 0);
|
||||
try_per_rate, rix, 0);
|
||||
}
|
||||
|
||||
/* Fill in the other rates for multirate retry */
|
||||
|
|
@ -716,10 +715,10 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,
|
|||
if (i + 1 == 4)
|
||||
try_per_rate = 8;
|
||||
|
||||
ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &nrix);
|
||||
ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &rix);
|
||||
/* All other rates in the series have RTS enabled */
|
||||
ath_rc_rate_set_series(rate_table, &rates[i], txrc,
|
||||
try_per_rate, nrix, 1);
|
||||
try_per_rate, rix, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ enum b43legacy_led_behaviour {
|
|||
void b43legacy_leds_init(struct b43legacy_wldev *dev);
|
||||
void b43legacy_leds_exit(struct b43legacy_wldev *dev);
|
||||
|
||||
#else /* CONFIG_B43EGACY_LEDS */
|
||||
#else /* CONFIG_B43LEGACY_LEDS */
|
||||
/* LED support disabled */
|
||||
|
||||
struct b43legacy_led {
|
||||
|
|
|
|||
|
|
@ -793,13 +793,6 @@ static struct pcmcia_device_id hostap_cs_ids[] = {
|
|||
0x4b801a17),
|
||||
PCMCIA_MFC_DEVICE_PROD_ID12(0, "SanDisk", "ConnectPlus",
|
||||
0x7a954bd9, 0x74be00c6),
|
||||
PCMCIA_DEVICE_PROD_ID123(
|
||||
"Intersil", "PRISM 2_5 PCMCIA ADAPTER", "ISL37300P",
|
||||
0x4b801a17, 0x6345a0bf, 0xc9049a39),
|
||||
/* D-Link DWL-650 Rev. P1; manfid 0x000b, 0x7110 */
|
||||
PCMCIA_DEVICE_PROD_ID123(
|
||||
"D-Link", "DWL-650 Wireless PC Card RevP", "ISL37101P-10",
|
||||
0x1a424a1c, 0x6ea57632, 0xdd97a26b),
|
||||
PCMCIA_DEVICE_PROD_ID123(
|
||||
"Addtron", "AWP-100 Wireless PCMCIA", "Version 01.02",
|
||||
0xe6ec52ce, 0x08649af2, 0x4b74baa0),
|
||||
|
|
@ -833,15 +826,13 @@ static struct pcmcia_device_id hostap_cs_ids[] = {
|
|||
"Allied Telesyn", "AT-WCL452 Wireless PCMCIA Radio",
|
||||
"Ver. 1.00",
|
||||
0x5cd01705, 0x4271660f, 0x9d08ee12),
|
||||
PCMCIA_DEVICE_PROD_ID123(
|
||||
"corega", "WL PCCL-11", "ISL37300P",
|
||||
0xa21501a, 0x59868926, 0xc9049a39),
|
||||
PCMCIA_DEVICE_PROD_ID123(
|
||||
"The Linksys Group, Inc.", "Wireless Network CF Card", "ISL37300P",
|
||||
0xa5f472c2, 0x9c05598d, 0xc9049a39),
|
||||
PCMCIA_DEVICE_PROD_ID123(
|
||||
"Wireless LAN" , "11Mbps PC Card", "Version 01.02",
|
||||
0x4b8870ff, 0x70e946d1, 0x4b74baa0),
|
||||
PCMCIA_DEVICE_PROD_ID3("HFA3863", 0x355cb092),
|
||||
PCMCIA_DEVICE_PROD_ID3("ISL37100P", 0x630d52b2),
|
||||
PCMCIA_DEVICE_PROD_ID3("ISL37101P-10", 0xdd97a26b),
|
||||
PCMCIA_DEVICE_PROD_ID3("ISL37300P", 0xc9049a39),
|
||||
PCMCIA_DEVICE_NULL
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pcmcia, hostap_cs_ids);
|
||||
|
|
|
|||
|
|
@ -246,7 +246,7 @@ struct iwl_cfg iwl1000_bgn_cfg = {
|
|||
.use_rts_for_ht = true, /* use rts/cts protection */
|
||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||
.support_ct_kill_exit = true,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_EXT_LONG_THRESHOLD_DEF,
|
||||
.chain_noise_scale = 1000,
|
||||
};
|
||||
|
||||
|
|
@ -274,7 +274,7 @@ struct iwl_cfg iwl1000_bg_cfg = {
|
|||
.led_compensation = 51,
|
||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||
.support_ct_kill_exit = true,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
|
||||
.plcp_delta_threshold = IWL_MAX_PLCP_ERR_EXT_LONG_THRESHOLD_DEF,
|
||||
.chain_noise_scale = 1000,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -45,8 +45,8 @@
|
|||
#include "iwl-sta.h"
|
||||
#include "iwl-3945.h"
|
||||
#include "iwl-eeprom.h"
|
||||
#include "iwl-helpers.h"
|
||||
#include "iwl-core.h"
|
||||
#include "iwl-helpers.h"
|
||||
#include "iwl-led.h"
|
||||
#include "iwl-3945-led.h"
|
||||
|
||||
|
|
@ -2470,11 +2470,9 @@ int iwl3945_hw_set_hw_params(struct iwl_priv *priv)
|
|||
memset((void *)&priv->hw_params, 0,
|
||||
sizeof(struct iwl_hw_params));
|
||||
|
||||
priv->shared_virt =
|
||||
pci_alloc_consistent(priv->pci_dev,
|
||||
sizeof(struct iwl3945_shared),
|
||||
&priv->shared_phys);
|
||||
|
||||
priv->shared_virt = dma_alloc_coherent(&priv->pci_dev->dev,
|
||||
sizeof(struct iwl3945_shared),
|
||||
&priv->shared_phys, GFP_KERNEL);
|
||||
if (!priv->shared_virt) {
|
||||
IWL_ERR(priv, "failed to allocate pci memory\n");
|
||||
mutex_unlock(&priv->mutex);
|
||||
|
|
|
|||
|
|
@ -171,24 +171,6 @@ struct iwl3945_frame {
|
|||
|
||||
#define SCAN_INTERVAL 100
|
||||
|
||||
#define STATUS_HCMD_ACTIVE 0 /* host command in progress */
|
||||
#define STATUS_HCMD_SYNC_ACTIVE 1 /* sync host command in progress */
|
||||
#define STATUS_INT_ENABLED 2
|
||||
#define STATUS_RF_KILL_HW 3
|
||||
#define STATUS_INIT 5
|
||||
#define STATUS_ALIVE 6
|
||||
#define STATUS_READY 7
|
||||
#define STATUS_TEMPERATURE 8
|
||||
#define STATUS_GEO_CONFIGURED 9
|
||||
#define STATUS_EXIT_PENDING 10
|
||||
#define STATUS_STATISTICS 12
|
||||
#define STATUS_SCANNING 13
|
||||
#define STATUS_SCAN_ABORTING 14
|
||||
#define STATUS_SCAN_HW 15
|
||||
#define STATUS_POWER_PMI 16
|
||||
#define STATUS_FW_ERROR 17
|
||||
#define STATUS_CONF_PENDING 18
|
||||
|
||||
#define MAX_TID_COUNT 9
|
||||
|
||||
#define IWL_INVALID_RATE 0xFF
|
||||
|
|
|
|||
|
|
@ -581,6 +581,13 @@ static int iwl4965_alive_notify(struct iwl_priv *priv)
|
|||
|
||||
iwl4965_set_wr_ptrs(priv, IWL_CMD_QUEUE_NUM, 0);
|
||||
|
||||
/* make sure all queue are not stopped */
|
||||
memset(&priv->queue_stopped[0], 0, sizeof(priv->queue_stopped));
|
||||
for (i = 0; i < 4; i++)
|
||||
atomic_set(&priv->queue_stop_count[i], 0);
|
||||
|
||||
/* reset to 0 to enable all the queue first */
|
||||
priv->txq_ctx_active_msk = 0;
|
||||
/* Map each Tx/cmd queue to its corresponding fifo */
|
||||
for (i = 0; i < ARRAY_SIZE(default_queue_to_tx_fifo); i++) {
|
||||
int ac = default_queue_to_tx_fifo[i];
|
||||
|
|
|
|||
|
|
@ -648,6 +648,13 @@ int iwl5000_alive_notify(struct iwl_priv *priv)
|
|||
|
||||
iwl5000_set_wr_ptrs(priv, IWL_CMD_QUEUE_NUM, 0);
|
||||
|
||||
/* make sure all queue are not stopped */
|
||||
memset(&priv->queue_stopped[0], 0, sizeof(priv->queue_stopped));
|
||||
for (i = 0; i < 4; i++)
|
||||
atomic_set(&priv->queue_stop_count[i], 0);
|
||||
|
||||
/* reset to 0 to enable all the queue first */
|
||||
priv->txq_ctx_active_msk = 0;
|
||||
/* map qos queues to fifos one-to-one */
|
||||
for (i = 0; i < ARRAY_SIZE(iwl5000_default_queue_to_tx_fifo); i++) {
|
||||
int ac = iwl5000_default_queue_to_tx_fifo[i];
|
||||
|
|
|
|||
|
|
@ -70,6 +70,14 @@ static void iwl6000_set_ct_threshold(struct iwl_priv *priv)
|
|||
priv->hw_params.ct_kill_exit_threshold = CT_KILL_EXIT_THRESHOLD;
|
||||
}
|
||||
|
||||
/* Indicate calibration version to uCode. */
|
||||
static void iwl6050_set_calib_version(struct iwl_priv *priv)
|
||||
{
|
||||
if (priv->cfg->ops->lib->eeprom_ops.calib_version(priv) >= 6)
|
||||
iwl_set_bit(priv, CSR_GP_DRIVER_REG,
|
||||
CSR_GP_DRIVER_REG_BIT_CALIB_VERSION6);
|
||||
}
|
||||
|
||||
/* NIC configuration for 6000 series */
|
||||
static void iwl6000_nic_config(struct iwl_priv *priv)
|
||||
{
|
||||
|
|
@ -96,6 +104,8 @@ static void iwl6000_nic_config(struct iwl_priv *priv)
|
|||
CSR_GP_DRIVER_REG_BIT_RADIO_SKU_2x2_IPA);
|
||||
}
|
||||
/* else do nothing, uCode configured */
|
||||
if (priv->cfg->ops->lib->temp_ops.set_calib_version)
|
||||
priv->cfg->ops->lib->temp_ops.set_calib_version(priv);
|
||||
}
|
||||
|
||||
static struct iwl_sensitivity_ranges iwl6000_sensitivity = {
|
||||
|
|
@ -277,6 +287,71 @@ static const struct iwl_ops iwl6000_ops = {
|
|||
.led = &iwlagn_led_ops,
|
||||
};
|
||||
|
||||
static struct iwl_lib_ops iwl6050_lib = {
|
||||
.set_hw_params = iwl6000_hw_set_hw_params,
|
||||
.txq_update_byte_cnt_tbl = iwl5000_txq_update_byte_cnt_tbl,
|
||||
.txq_inval_byte_cnt_tbl = iwl5000_txq_inval_byte_cnt_tbl,
|
||||
.txq_set_sched = iwl5000_txq_set_sched,
|
||||
.txq_agg_enable = iwl5000_txq_agg_enable,
|
||||
.txq_agg_disable = iwl5000_txq_agg_disable,
|
||||
.txq_attach_buf_to_tfd = iwl_hw_txq_attach_buf_to_tfd,
|
||||
.txq_free_tfd = iwl_hw_txq_free_tfd,
|
||||
.txq_init = iwl_hw_tx_queue_init,
|
||||
.rx_handler_setup = iwl5000_rx_handler_setup,
|
||||
.setup_deferred_work = iwl5000_setup_deferred_work,
|
||||
.is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr,
|
||||
.load_ucode = iwl5000_load_ucode,
|
||||
.dump_nic_event_log = iwl_dump_nic_event_log,
|
||||
.dump_nic_error_log = iwl_dump_nic_error_log,
|
||||
.dump_csr = iwl_dump_csr,
|
||||
.dump_fh = iwl_dump_fh,
|
||||
.init_alive_start = iwl5000_init_alive_start,
|
||||
.alive_notify = iwl5000_alive_notify,
|
||||
.send_tx_power = iwl5000_send_tx_power,
|
||||
.update_chain_flags = iwl_update_chain_flags,
|
||||
.set_channel_switch = iwl6000_hw_channel_switch,
|
||||
.apm_ops = {
|
||||
.init = iwl_apm_init,
|
||||
.stop = iwl_apm_stop,
|
||||
.config = iwl6000_nic_config,
|
||||
.set_pwr_src = iwl_set_pwr_src,
|
||||
},
|
||||
.eeprom_ops = {
|
||||
.regulatory_bands = {
|
||||
EEPROM_5000_REG_BAND_1_CHANNELS,
|
||||
EEPROM_5000_REG_BAND_2_CHANNELS,
|
||||
EEPROM_5000_REG_BAND_3_CHANNELS,
|
||||
EEPROM_5000_REG_BAND_4_CHANNELS,
|
||||
EEPROM_5000_REG_BAND_5_CHANNELS,
|
||||
EEPROM_5000_REG_BAND_24_HT40_CHANNELS,
|
||||
EEPROM_5000_REG_BAND_52_HT40_CHANNELS
|
||||
},
|
||||
.verify_signature = iwlcore_eeprom_verify_signature,
|
||||
.acquire_semaphore = iwlcore_eeprom_acquire_semaphore,
|
||||
.release_semaphore = iwlcore_eeprom_release_semaphore,
|
||||
.calib_version = iwl5000_eeprom_calib_version,
|
||||
.query_addr = iwl5000_eeprom_query_addr,
|
||||
.update_enhanced_txpower = iwlcore_eeprom_enhanced_txpower,
|
||||
},
|
||||
.post_associate = iwl_post_associate,
|
||||
.isr = iwl_isr_ict,
|
||||
.config_ap = iwl_config_ap,
|
||||
.temp_ops = {
|
||||
.temperature = iwl5000_temperature,
|
||||
.set_ct_kill = iwl6000_set_ct_threshold,
|
||||
.set_calib_version = iwl6050_set_calib_version,
|
||||
},
|
||||
.add_bcast_station = iwl_add_bcast_station,
|
||||
};
|
||||
|
||||
static const struct iwl_ops iwl6050_ops = {
|
||||
.ucode = &iwl5000_ucode,
|
||||
.lib = &iwl6050_lib,
|
||||
.hcmd = &iwl5000_hcmd,
|
||||
.utils = &iwl5000_hcmd_utils,
|
||||
.led = &iwlagn_led_ops,
|
||||
};
|
||||
|
||||
/*
|
||||
* "i": Internal configuration, use internal Power Amplifier
|
||||
*/
|
||||
|
|
@ -380,7 +455,7 @@ struct iwl_cfg iwl6050_2agn_cfg = {
|
|||
.ucode_api_max = IWL6050_UCODE_API_MAX,
|
||||
.ucode_api_min = IWL6050_UCODE_API_MIN,
|
||||
.sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N,
|
||||
.ops = &iwl6000_ops,
|
||||
.ops = &iwl6050_ops,
|
||||
.eeprom_size = OTP_LOW_IMAGE_SIZE,
|
||||
.eeprom_ver = EEPROM_6050_EEPROM_VERSION,
|
||||
.eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION,
|
||||
|
|
@ -412,7 +487,7 @@ struct iwl_cfg iwl6050_2abg_cfg = {
|
|||
.ucode_api_max = IWL6050_UCODE_API_MAX,
|
||||
.ucode_api_min = IWL6050_UCODE_API_MIN,
|
||||
.sku = IWL_SKU_A|IWL_SKU_G,
|
||||
.ops = &iwl6000_ops,
|
||||
.ops = &iwl6050_ops,
|
||||
.eeprom_size = OTP_LOW_IMAGE_SIZE,
|
||||
.eeprom_ver = EEPROM_6050_EEPROM_VERSION,
|
||||
.eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION,
|
||||
|
|
|
|||
|
|
@ -298,10 +298,23 @@ static void rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv,
|
|||
struct iwl_lq_sta *lq_data, u8 tid,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (rs_tl_get_load(lq_data, tid) > IWL_AGG_LOAD_THRESHOLD) {
|
||||
IWL_DEBUG_HT(priv, "Starting Tx agg: STA: %pM tid: %d\n",
|
||||
sta->addr, tid);
|
||||
ieee80211_start_tx_ba_session(sta, tid);
|
||||
ret = ieee80211_start_tx_ba_session(sta, tid);
|
||||
if (ret == -EAGAIN) {
|
||||
/*
|
||||
* driver and mac80211 is out of sync
|
||||
* this might be cause by reloading firmware
|
||||
* stop the tx ba session here
|
||||
*/
|
||||
IWL_DEBUG_HT(priv, "Fail start Tx agg on tid: %d\n",
|
||||
tid);
|
||||
ret = ieee80211_stop_tx_ba_session(sta, tid,
|
||||
WLAN_BACK_INITIATOR);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2941,10 +2941,21 @@ static int iwl_mac_ampdu_action(struct ieee80211_hw *hw,
|
|||
return ret;
|
||||
case IEEE80211_AMPDU_TX_START:
|
||||
IWL_DEBUG_HT(priv, "start Tx\n");
|
||||
return iwl_tx_agg_start(priv, sta->addr, tid, ssn);
|
||||
ret = iwl_tx_agg_start(priv, sta->addr, tid, ssn);
|
||||
if (ret == 0) {
|
||||
priv->agg_tids_count++;
|
||||
IWL_DEBUG_HT(priv, "priv->agg_tids_count = %u\n",
|
||||
priv->agg_tids_count);
|
||||
}
|
||||
return ret;
|
||||
case IEEE80211_AMPDU_TX_STOP:
|
||||
IWL_DEBUG_HT(priv, "stop Tx\n");
|
||||
ret = iwl_tx_agg_stop(priv, sta->addr, tid);
|
||||
if ((ret == 0) && (priv->agg_tids_count > 0)) {
|
||||
priv->agg_tids_count--;
|
||||
IWL_DEBUG_HT(priv, "priv->agg_tids_count = %u\n",
|
||||
priv->agg_tids_count);
|
||||
}
|
||||
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||
return 0;
|
||||
else
|
||||
|
|
@ -3353,6 +3364,7 @@ static int iwl_init_drv(struct iwl_priv *priv)
|
|||
INIT_LIST_HEAD(&priv->free_frames);
|
||||
|
||||
mutex_init(&priv->mutex);
|
||||
mutex_init(&priv->sync_cmd_mutex);
|
||||
|
||||
/* Clear the driver's (not device's) station table */
|
||||
iwl_clear_stations_table(priv);
|
||||
|
|
@ -3364,6 +3376,13 @@ static int iwl_init_drv(struct iwl_priv *priv)
|
|||
priv->iw_mode = NL80211_IFTYPE_STATION;
|
||||
priv->current_ht_config.smps = IEEE80211_SMPS_STATIC;
|
||||
priv->missed_beacon_threshold = IWL_MISSED_BEACON_THRESHOLD_DEF;
|
||||
priv->agg_tids_count = 0;
|
||||
|
||||
/* initialize force reset */
|
||||
priv->force_reset[IWL_RF_RESET].reset_duration =
|
||||
IWL_DELAY_NEXT_FORCE_RF_RESET;
|
||||
priv->force_reset[IWL_FW_RESET].reset_duration =
|
||||
IWL_DELAY_NEXT_FORCE_FW_RELOAD;
|
||||
|
||||
/* Choose which receivers/antennas to use */
|
||||
if (priv->cfg->ops->hcmd->set_rxon_chain)
|
||||
|
|
@ -3540,6 +3559,14 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
*/
|
||||
spin_lock_init(&priv->reg_lock);
|
||||
spin_lock_init(&priv->lock);
|
||||
|
||||
/*
|
||||
* stop and reset the on-board processor just in case it is in a
|
||||
* strange state ... like being left stranded by a primary kernel
|
||||
* and this is now the kdump kernel trying to start up
|
||||
*/
|
||||
iwl_write32(priv, CSR_RESET, CSR_RESET_REG_FLAG_NEVO_RESET);
|
||||
|
||||
iwl_hw_detect(priv);
|
||||
IWL_INFO(priv, "Detected Intel Wireless WiFi Link %s REV=0x%X\n",
|
||||
priv->cfg->name, priv->hw_rev);
|
||||
|
|
|
|||
|
|
@ -3470,11 +3470,7 @@ enum {
|
|||
IWL_PHY_CALIBRATE_DIFF_GAIN_CMD = 7,
|
||||
IWL_PHY_CALIBRATE_DC_CMD = 8,
|
||||
IWL_PHY_CALIBRATE_LO_CMD = 9,
|
||||
IWL_PHY_CALIBRATE_RX_BB_CMD = 10,
|
||||
IWL_PHY_CALIBRATE_TX_IQ_CMD = 11,
|
||||
IWL_PHY_CALIBRATE_RX_IQ_CMD = 12,
|
||||
IWL_PHY_CALIBRATION_NOISE_CMD = 13,
|
||||
IWL_PHY_CALIBRATE_AGC_TABLE_CMD = 14,
|
||||
IWL_PHY_CALIBRATE_CRYSTAL_FRQ_CMD = 15,
|
||||
IWL_PHY_CALIBRATE_BASE_BAND_CMD = 16,
|
||||
IWL_PHY_CALIBRATE_TX_IQ_PERD_CMD = 17,
|
||||
|
|
|
|||
|
|
@ -1670,9 +1670,9 @@ EXPORT_SYMBOL(iwl_set_tx_power);
|
|||
void iwl_free_isr_ict(struct iwl_priv *priv)
|
||||
{
|
||||
if (priv->ict_tbl_vir) {
|
||||
pci_free_consistent(priv->pci_dev, (sizeof(u32) * ICT_COUNT) +
|
||||
PAGE_SIZE, priv->ict_tbl_vir,
|
||||
priv->ict_tbl_dma);
|
||||
dma_free_coherent(&priv->pci_dev->dev,
|
||||
(sizeof(u32) * ICT_COUNT) + PAGE_SIZE,
|
||||
priv->ict_tbl_vir, priv->ict_tbl_dma);
|
||||
priv->ict_tbl_vir = NULL;
|
||||
}
|
||||
}
|
||||
|
|
@ -1688,9 +1688,9 @@ int iwl_alloc_isr_ict(struct iwl_priv *priv)
|
|||
if (priv->cfg->use_isr_legacy)
|
||||
return 0;
|
||||
/* allocate shrared data table */
|
||||
priv->ict_tbl_vir = pci_alloc_consistent(priv->pci_dev, (sizeof(u32) *
|
||||
ICT_COUNT) + PAGE_SIZE,
|
||||
&priv->ict_tbl_dma);
|
||||
priv->ict_tbl_vir = dma_alloc_coherent(&priv->pci_dev->dev,
|
||||
(sizeof(u32) * ICT_COUNT) + PAGE_SIZE,
|
||||
&priv->ict_tbl_dma, GFP_KERNEL);
|
||||
if (!priv->ict_tbl_vir)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
@ -3334,7 +3334,7 @@ int iwl_dump_fh(struct iwl_priv *priv, char **buf, bool display)
|
|||
}
|
||||
EXPORT_SYMBOL(iwl_dump_fh);
|
||||
|
||||
void iwl_force_rf_reset(struct iwl_priv *priv)
|
||||
static void iwl_force_rf_reset(struct iwl_priv *priv)
|
||||
{
|
||||
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||
return;
|
||||
|
|
@ -3356,7 +3356,50 @@ void iwl_force_rf_reset(struct iwl_priv *priv)
|
|||
iwl_internal_short_hw_scan(priv);
|
||||
return;
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_force_rf_reset);
|
||||
|
||||
|
||||
int iwl_force_reset(struct iwl_priv *priv, int mode)
|
||||
{
|
||||
struct iwl_force_reset *force_reset;
|
||||
|
||||
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||
return -EINVAL;
|
||||
|
||||
if (mode >= IWL_MAX_FORCE_RESET) {
|
||||
IWL_DEBUG_INFO(priv, "invalid reset request.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
force_reset = &priv->force_reset[mode];
|
||||
force_reset->reset_request_count++;
|
||||
if (force_reset->last_force_reset_jiffies &&
|
||||
time_after(force_reset->last_force_reset_jiffies +
|
||||
force_reset->reset_duration, jiffies)) {
|
||||
IWL_DEBUG_INFO(priv, "force reset rejected\n");
|
||||
force_reset->reset_reject_count++;
|
||||
return -EAGAIN;
|
||||
}
|
||||
force_reset->reset_success_count++;
|
||||
force_reset->last_force_reset_jiffies = jiffies;
|
||||
IWL_DEBUG_INFO(priv, "perform force reset (%d)\n", mode);
|
||||
switch (mode) {
|
||||
case IWL_RF_RESET:
|
||||
iwl_force_rf_reset(priv);
|
||||
break;
|
||||
case IWL_FW_RESET:
|
||||
IWL_ERR(priv, "On demand firmware reload\n");
|
||||
/* Set the FW error flag -- cleared on iwl_down */
|
||||
set_bit(STATUS_FW_ERROR, &priv->status);
|
||||
wake_up_interruptible(&priv->wait_command_queue);
|
||||
/*
|
||||
* Keep the restart process from trying to send host
|
||||
* commands by clearing the INIT status bit
|
||||
*/
|
||||
clear_bit(STATUS_READY, &priv->status);
|
||||
queue_work(priv->workqueue, &priv->restart);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
|
|
|
|||
|
|
@ -117,6 +117,7 @@ struct iwl_apm_ops {
|
|||
struct iwl_temp_ops {
|
||||
void (*temperature)(struct iwl_priv *priv);
|
||||
void (*set_ct_kill)(struct iwl_priv *priv);
|
||||
void (*set_calib_version)(struct iwl_priv *priv);
|
||||
};
|
||||
|
||||
struct iwl_ucode_ops {
|
||||
|
|
@ -414,13 +415,13 @@ void iwl_rx_queue_free(struct iwl_priv *priv, struct iwl_rx_queue *rxq);
|
|||
void iwl_cmd_queue_free(struct iwl_priv *priv);
|
||||
int iwl_rx_queue_alloc(struct iwl_priv *priv);
|
||||
void iwl_rx_handle(struct iwl_priv *priv);
|
||||
int iwl_rx_queue_update_write_ptr(struct iwl_priv *priv,
|
||||
void iwl_rx_queue_update_write_ptr(struct iwl_priv *priv,
|
||||
struct iwl_rx_queue *q);
|
||||
void iwl_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq);
|
||||
void iwl_rx_replenish(struct iwl_priv *priv);
|
||||
void iwl_rx_replenish_now(struct iwl_priv *priv);
|
||||
int iwl_rx_init(struct iwl_priv *priv, struct iwl_rx_queue *rxq);
|
||||
int iwl_rx_queue_restock(struct iwl_priv *priv);
|
||||
void iwl_rx_queue_restock(struct iwl_priv *priv);
|
||||
int iwl_rx_queue_space(const struct iwl_rx_queue *q);
|
||||
void iwl_rx_allocate(struct iwl_priv *priv, gfp_t priority);
|
||||
void iwl_tx_cmd_complete(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb);
|
||||
|
|
@ -450,9 +451,9 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb);
|
|||
void iwl_hw_txq_ctx_free(struct iwl_priv *priv);
|
||||
int iwl_hw_tx_queue_init(struct iwl_priv *priv,
|
||||
struct iwl_tx_queue *txq);
|
||||
int iwl_txq_update_write_ptr(struct iwl_priv *priv, struct iwl_tx_queue *txq);
|
||||
void iwl_free_tfds_in_queue(struct iwl_priv *priv,
|
||||
int sta_id, int tid, int freed);
|
||||
void iwl_txq_update_write_ptr(struct iwl_priv *priv, struct iwl_tx_queue *txq);
|
||||
int iwl_tx_queue_init(struct iwl_priv *priv, struct iwl_tx_queue *txq,
|
||||
int slots_num, u32 txq_id);
|
||||
void iwl_tx_queue_free(struct iwl_priv *priv, int txq_id);
|
||||
|
|
@ -503,7 +504,7 @@ int iwl_scan_cancel(struct iwl_priv *priv);
|
|||
int iwl_scan_cancel_timeout(struct iwl_priv *priv, unsigned long ms);
|
||||
int iwl_mac_hw_scan(struct ieee80211_hw *hw, struct cfg80211_scan_request *req);
|
||||
int iwl_internal_short_hw_scan(struct iwl_priv *priv);
|
||||
void iwl_force_rf_reset(struct iwl_priv *priv);
|
||||
int iwl_force_reset(struct iwl_priv *priv, int mode);
|
||||
u16 iwl_fill_probe_req(struct iwl_priv *priv, struct ieee80211_mgmt *frame,
|
||||
const u8 *ie, int ie_len, int left);
|
||||
void iwl_setup_rx_scan_handlers(struct iwl_priv *priv);
|
||||
|
|
@ -605,7 +606,7 @@ void iwlcore_free_geos(struct iwl_priv *priv);
|
|||
/*************** DRIVER STATUS FUNCTIONS *****/
|
||||
|
||||
#define STATUS_HCMD_ACTIVE 0 /* host command in progress */
|
||||
#define STATUS_HCMD_SYNC_ACTIVE 1 /* sync host command in progress */
|
||||
/* 1 is unused (used to be STATUS_HCMD_SYNC_ACTIVE) */
|
||||
#define STATUS_INT_ENABLED 2
|
||||
#define STATUS_RF_KILL_HW 3
|
||||
#define STATUS_CT_KILL 4
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue