Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6
This commit is contained in:
commit
1725d409ca
|
@ -17,8 +17,7 @@
|
|||
</authorgroup>
|
||||
|
||||
<copyright>
|
||||
<year>2007</year>
|
||||
<year>2008</year>
|
||||
<year>2007-2009</year>
|
||||
<holder>Johannes Berg</holder>
|
||||
</copyright>
|
||||
|
||||
|
@ -165,8 +164,8 @@ usage should require reading the full document.
|
|||
!Pinclude/net/mac80211.h Frame format
|
||||
</sect1>
|
||||
<sect1>
|
||||
<title>Alignment issues</title>
|
||||
<para>TBD</para>
|
||||
<title>Packet alignment</title>
|
||||
!Pnet/mac80211/rx.c Packet alignment
|
||||
</sect1>
|
||||
<sect1>
|
||||
<title>Calling into mac80211 from interrupts</title>
|
||||
|
@ -223,6 +222,11 @@ usage should require reading the full document.
|
|||
!Finclude/net/mac80211.h ieee80211_key_flags
|
||||
</chapter>
|
||||
|
||||
<chapter id="powersave">
|
||||
<title>Powersave support</title>
|
||||
!Pinclude/net/mac80211.h Powersave support
|
||||
</chapter>
|
||||
|
||||
<chapter id="qos">
|
||||
<title>Multiple queues and QoS support</title>
|
||||
<para>TBD</para>
|
||||
|
|
|
@ -229,7 +229,9 @@ Who: Jan Engelhardt <jengelh@computergmbh.de>
|
|||
---------------------------
|
||||
|
||||
What: b43 support for firmware revision < 410
|
||||
When: July 2008
|
||||
When: The schedule was July 2008, but it was decided that we are going to keep the
|
||||
code as long as there are no major maintanance headaches.
|
||||
So it _could_ be removed _any_ time now, if it conflicts with something new.
|
||||
Why: The support code for the old firmware hurts code readability/maintainability
|
||||
and slightly hurts runtime performance. Bugfixes for the old firmware
|
||||
are not provided by Broadcom anymore.
|
||||
|
|
|
@ -151,6 +151,12 @@ config LIBERTAS_SDIO
|
|||
---help---
|
||||
A driver for Marvell Libertas 8385 and 8686 SDIO devices.
|
||||
|
||||
config LIBERTAS_SPI
|
||||
tristate "Marvell Libertas 8686 SPI 802.11b/g cards"
|
||||
depends on LIBERTAS && SPI && GENERIC_GPIO
|
||||
---help---
|
||||
A driver for Marvell Libertas 8686 SPI devices.
|
||||
|
||||
config LIBERTAS_DEBUG
|
||||
bool "Enable full debugging output in the Libertas module."
|
||||
depends on LIBERTAS
|
||||
|
@ -188,127 +194,6 @@ config AIRO
|
|||
|
||||
The driver can be compiled as a module and will be named "airo".
|
||||
|
||||
config HERMES
|
||||
tristate "Hermes chipset 802.11b support (Orinoco/Prism2/Symbol)"
|
||||
depends on (PPC_PMAC || PCI || PCMCIA) && WLAN_80211
|
||||
select WIRELESS_EXT
|
||||
select FW_LOADER
|
||||
select CRYPTO
|
||||
select CRYPTO_MICHAEL_MIC
|
||||
---help---
|
||||
A driver for 802.11b wireless cards based on the "Hermes" or
|
||||
Intersil HFA384x (Prism 2) MAC controller. This includes the vast
|
||||
majority of the PCMCIA 802.11b cards (which are nearly all rebadges)
|
||||
- except for the Cisco/Aironet cards. Cards supported include the
|
||||
Apple Airport (not a PCMCIA card), WavelanIEEE/Orinoco,
|
||||
Cabletron/EnteraSys Roamabout, ELSA AirLancer, MELCO Buffalo, Avaya,
|
||||
IBM High Rate Wireless, Farralon Syyline, Samsung MagicLAN, Netgear
|
||||
MA401, LinkSys WPC-11, D-Link DWL-650, 3Com AirConnect, Intel
|
||||
IPW2011, and Symbol Spectrum24 High Rate amongst others.
|
||||
|
||||
This option includes the guts of the driver, but in order to
|
||||
actually use a card you will also need to enable support for PCMCIA
|
||||
Hermes cards, PLX9052 based PCI adaptors or the Apple Airport below.
|
||||
|
||||
You will also very likely also need the Wireless Tools in order to
|
||||
configure your card and that /etc/pcmcia/wireless.opts works :
|
||||
<http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html>
|
||||
|
||||
config HERMES_CACHE_FW_ON_INIT
|
||||
bool "Cache Hermes firmware on driver initialisation"
|
||||
depends on HERMES
|
||||
default y
|
||||
---help---
|
||||
Say Y to cache any firmware required by the Hermes drivers
|
||||
on startup. The firmware will remain cached until the
|
||||
driver is unloaded. The cache uses 64K of RAM.
|
||||
|
||||
Otherwise load the firmware from userspace as required. In
|
||||
this case the driver should be unloaded and restarted
|
||||
whenever the firmware is changed.
|
||||
|
||||
If you are not sure, say Y.
|
||||
|
||||
config APPLE_AIRPORT
|
||||
tristate "Apple Airport support (built-in)"
|
||||
depends on PPC_PMAC && HERMES
|
||||
help
|
||||
Say Y here to support the Airport 802.11b wireless Ethernet hardware
|
||||
built into the Macintosh iBook and other recent PowerPC-based
|
||||
Macintosh machines. This is essentially a Lucent Orinoco card with
|
||||
a non-standard interface.
|
||||
|
||||
This driver does not support the Airport Extreme (802.11b/g). Use
|
||||
the BCM43xx driver for Airport Extreme cards.
|
||||
|
||||
config PLX_HERMES
|
||||
tristate "Hermes in PLX9052 based PCI adaptor support (Netgear MA301 etc.)"
|
||||
depends on PCI && HERMES
|
||||
help
|
||||
Enable support for PCMCIA cards supported by the "Hermes" (aka
|
||||
orinoco) driver when used in PLX9052 based PCI adaptors. These
|
||||
adaptors are not a full PCMCIA controller but act as a more limited
|
||||
PCI <-> PCMCIA bridge. Several vendors sell such adaptors so that
|
||||
802.11b PCMCIA cards can be used in desktop machines. The Netgear
|
||||
MA301 is such an adaptor.
|
||||
|
||||
config TMD_HERMES
|
||||
tristate "Hermes in TMD7160 based PCI adaptor support"
|
||||
depends on PCI && HERMES
|
||||
help
|
||||
Enable support for PCMCIA cards supported by the "Hermes" (aka
|
||||
orinoco) driver when used in TMD7160 based PCI adaptors. These
|
||||
adaptors are not a full PCMCIA controller but act as a more limited
|
||||
PCI <-> PCMCIA bridge. Several vendors sell such adaptors so that
|
||||
802.11b PCMCIA cards can be used in desktop machines.
|
||||
|
||||
config NORTEL_HERMES
|
||||
tristate "Nortel emobility PCI adaptor support"
|
||||
depends on PCI && HERMES
|
||||
help
|
||||
Enable support for PCMCIA cards supported by the "Hermes" (aka
|
||||
orinoco) driver when used in Nortel emobility PCI adaptors. These
|
||||
adaptors are not full PCMCIA controllers, but act as a more limited
|
||||
PCI <-> PCMCIA bridge.
|
||||
|
||||
config PCI_HERMES
|
||||
tristate "Prism 2.5 PCI 802.11b adaptor support"
|
||||
depends on PCI && HERMES
|
||||
help
|
||||
Enable support for PCI and mini-PCI 802.11b wireless NICs based on
|
||||
the Prism 2.5 chipset. These are true PCI cards, not the 802.11b
|
||||
PCMCIA cards bundled with PCI<->PCMCIA adaptors which are also
|
||||
common. Some of the built-in wireless adaptors in laptops are of
|
||||
this variety.
|
||||
|
||||
config PCMCIA_HERMES
|
||||
tristate "Hermes PCMCIA card support"
|
||||
depends on PCMCIA && HERMES
|
||||
---help---
|
||||
A driver for "Hermes" chipset based PCMCIA wireless adaptors, such
|
||||
as the Lucent WavelanIEEE/Orinoco cards and their OEM (Cabletron/
|
||||
EnteraSys RoamAbout 802.11, ELSA Airlancer, Melco Buffalo and
|
||||
others). It should also be usable on various Prism II based cards
|
||||
such as the Linksys, D-Link and Farallon Skyline. It should also
|
||||
work on Symbol cards such as the 3Com AirConnect and Ericsson WLAN.
|
||||
|
||||
You will very likely need the Wireless Tools in order to
|
||||
configure your card and that /etc/pcmcia/wireless.opts works:
|
||||
<http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html>.
|
||||
|
||||
config PCMCIA_SPECTRUM
|
||||
tristate "Symbol Spectrum24 Trilogy PCMCIA card support"
|
||||
depends on PCMCIA && HERMES
|
||||
---help---
|
||||
|
||||
This is a driver for 802.11b cards using RAM-loadable Symbol
|
||||
firmware, such as Symbol Wireless Networker LA4100, CompactFlash
|
||||
cards by Socket Communications and Intel PRO/Wireless 2011B.
|
||||
|
||||
This driver requires firmware download on startup. Utilities
|
||||
for downloading Symbol firmware are available at
|
||||
<http://sourceforge.net/projects/orinoco/>
|
||||
|
||||
config ATMEL
|
||||
tristate "Atmel at76c50x chipset 802.11b support"
|
||||
depends on (PCI || PCMCIA) && WLAN_80211
|
||||
|
@ -590,5 +475,6 @@ source "drivers/net/wireless/b43/Kconfig"
|
|||
source "drivers/net/wireless/b43legacy/Kconfig"
|
||||
source "drivers/net/wireless/zd1211rw/Kconfig"
|
||||
source "drivers/net/wireless/rt2x00/Kconfig"
|
||||
source "drivers/net/wireless/orinoco/Kconfig"
|
||||
|
||||
endmenu
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1206,6 +1206,7 @@ extern void ath5k_hw_set_rx_filter(struct ath5k_hw *ah, u32 filter);
|
|||
/* Beacon control functions */
|
||||
extern u32 ath5k_hw_get_tsf32(struct ath5k_hw *ah);
|
||||
extern u64 ath5k_hw_get_tsf64(struct ath5k_hw *ah);
|
||||
extern void ath5k_hw_set_tsf64(struct ath5k_hw *ah, u64 tsf64);
|
||||
extern void ath5k_hw_reset_tsf(struct ath5k_hw *ah);
|
||||
extern void ath5k_hw_init_beacon(struct ath5k_hw *ah, u32 next_beacon, u32 interval);
|
||||
#if 0
|
||||
|
|
|
@ -232,13 +232,14 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw,
|
|||
int mc_count, struct dev_mc_list *mclist);
|
||||
static int ath5k_set_key(struct ieee80211_hw *hw,
|
||||
enum set_key_cmd cmd,
|
||||
const u8 *local_addr, const u8 *addr,
|
||||
struct ieee80211_vif *vif, struct ieee80211_sta *sta,
|
||||
struct ieee80211_key_conf *key);
|
||||
static int ath5k_get_stats(struct ieee80211_hw *hw,
|
||||
struct ieee80211_low_level_stats *stats);
|
||||
static int ath5k_get_tx_stats(struct ieee80211_hw *hw,
|
||||
struct ieee80211_tx_queue_stats *stats);
|
||||
static u64 ath5k_get_tsf(struct ieee80211_hw *hw);
|
||||
static void ath5k_set_tsf(struct ieee80211_hw *hw, u64 tsf);
|
||||
static void ath5k_reset_tsf(struct ieee80211_hw *hw);
|
||||
static int ath5k_beacon_update(struct ath5k_softc *sc,
|
||||
struct sk_buff *skb);
|
||||
|
@ -261,6 +262,7 @@ static struct ieee80211_ops ath5k_hw_ops = {
|
|||
.conf_tx = NULL,
|
||||
.get_tx_stats = ath5k_get_tx_stats,
|
||||
.get_tsf = ath5k_get_tsf,
|
||||
.set_tsf = ath5k_set_tsf,
|
||||
.reset_tsf = ath5k_reset_tsf,
|
||||
.bss_info_changed = ath5k_bss_info_changed,
|
||||
};
|
||||
|
@ -347,9 +349,9 @@ static inline u64 ath5k_extend_tsf(struct ath5k_hw *ah, u32 rstamp)
|
|||
}
|
||||
|
||||
/* Interrupt handling */
|
||||
static int ath5k_init(struct ath5k_softc *sc, bool is_resume);
|
||||
static int ath5k_init(struct ath5k_softc *sc);
|
||||
static int ath5k_stop_locked(struct ath5k_softc *sc);
|
||||
static int ath5k_stop_hw(struct ath5k_softc *sc, bool is_suspend);
|
||||
static int ath5k_stop_hw(struct ath5k_softc *sc);
|
||||
static irqreturn_t ath5k_intr(int irq, void *dev_id);
|
||||
static void ath5k_tasklet_reset(unsigned long data);
|
||||
|
||||
|
@ -653,8 +655,6 @@ ath5k_pci_suspend(struct pci_dev *pdev, pm_message_t state)
|
|||
|
||||
ath5k_led_off(sc);
|
||||
|
||||
ath5k_stop_hw(sc, true);
|
||||
|
||||
free_irq(pdev->irq, sc);
|
||||
pci_save_state(pdev);
|
||||
pci_disable_device(pdev);
|
||||
|
@ -689,14 +689,9 @@ ath5k_pci_resume(struct pci_dev *pdev)
|
|||
goto err_no_irq;
|
||||
}
|
||||
|
||||
err = ath5k_init(sc, true);
|
||||
if (err)
|
||||
goto err_irq;
|
||||
ath5k_led_enable(sc);
|
||||
|
||||
return 0;
|
||||
err_irq:
|
||||
free_irq(pdev->irq, sc);
|
||||
|
||||
err_no_irq:
|
||||
pci_disable_device(pdev);
|
||||
return err;
|
||||
|
@ -1098,6 +1093,42 @@ ath5k_hw_to_driver_rix(struct ath5k_softc *sc, int hw_rix)
|
|||
* Buffers setup *
|
||||
\***************/
|
||||
|
||||
static
|
||||
struct sk_buff *ath5k_rx_skb_alloc(struct ath5k_softc *sc, dma_addr_t *skb_addr)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
unsigned int off;
|
||||
|
||||
/*
|
||||
* Allocate buffer with headroom_needed space for the
|
||||
* fake physical layer header at the start.
|
||||
*/
|
||||
skb = dev_alloc_skb(sc->rxbufsize + sc->cachelsz - 1);
|
||||
|
||||
if (!skb) {
|
||||
ATH5K_ERR(sc, "can't alloc skbuff of size %u\n",
|
||||
sc->rxbufsize + sc->cachelsz - 1);
|
||||
return NULL;
|
||||
}
|
||||
/*
|
||||
* Cache-line-align. This is important (for the
|
||||
* 5210 at least) as not doing so causes bogus data
|
||||
* in rx'd frames.
|
||||
*/
|
||||
off = ((unsigned long)skb->data) % sc->cachelsz;
|
||||
if (off != 0)
|
||||
skb_reserve(skb, sc->cachelsz - off);
|
||||
|
||||
*skb_addr = pci_map_single(sc->pdev,
|
||||
skb->data, sc->rxbufsize, PCI_DMA_FROMDEVICE);
|
||||
if (unlikely(pci_dma_mapping_error(sc->pdev, *skb_addr))) {
|
||||
ATH5K_ERR(sc, "%s: DMA mapping failed\n", __func__);
|
||||
dev_kfree_skb(skb);
|
||||
return NULL;
|
||||
}
|
||||
return skb;
|
||||
}
|
||||
|
||||
static int
|
||||
ath5k_rxbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
|
||||
{
|
||||
|
@ -1105,37 +1136,11 @@ ath5k_rxbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
|
|||
struct sk_buff *skb = bf->skb;
|
||||
struct ath5k_desc *ds;
|
||||
|
||||
if (likely(skb == NULL)) {
|
||||
unsigned int off;
|
||||
|
||||
/*
|
||||
* Allocate buffer with headroom_needed space for the
|
||||
* fake physical layer header at the start.
|
||||
*/
|
||||
skb = dev_alloc_skb(sc->rxbufsize + sc->cachelsz - 1);
|
||||
if (unlikely(skb == NULL)) {
|
||||
ATH5K_ERR(sc, "can't alloc skbuff of size %u\n",
|
||||
sc->rxbufsize + sc->cachelsz - 1);
|
||||
if (!skb) {
|
||||
skb = ath5k_rx_skb_alloc(sc, &bf->skbaddr);
|
||||
if (!skb)
|
||||
return -ENOMEM;
|
||||
}
|
||||
/*
|
||||
* Cache-line-align. This is important (for the
|
||||
* 5210 at least) as not doing so causes bogus data
|
||||
* in rx'd frames.
|
||||
*/
|
||||
off = ((unsigned long)skb->data) % sc->cachelsz;
|
||||
if (off != 0)
|
||||
skb_reserve(skb, sc->cachelsz - off);
|
||||
|
||||
bf->skb = skb;
|
||||
bf->skbaddr = pci_map_single(sc->pdev,
|
||||
skb->data, sc->rxbufsize, PCI_DMA_FROMDEVICE);
|
||||
if (unlikely(pci_dma_mapping_error(sc->pdev, bf->skbaddr))) {
|
||||
ATH5K_ERR(sc, "%s: DMA mapping failed\n", __func__);
|
||||
dev_kfree_skb(skb);
|
||||
bf->skb = NULL;
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1178,6 +1183,10 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
|
|||
struct ieee80211_rate *rate;
|
||||
unsigned int mrr_rate[3], mrr_tries[3];
|
||||
int i, ret;
|
||||
u16 hw_rate;
|
||||
u16 cts_rate = 0;
|
||||
u16 duration = 0;
|
||||
u8 rc_flags;
|
||||
|
||||
flags = AR5K_TXDESC_INTREQ | AR5K_TXDESC_CLRDMASK;
|
||||
|
||||
|
@ -1185,11 +1194,30 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
|
|||
bf->skbaddr = pci_map_single(sc->pdev, skb->data, skb->len,
|
||||
PCI_DMA_TODEVICE);
|
||||
|
||||
rate = ieee80211_get_tx_rate(sc->hw, info);
|
||||
|
||||
if (info->flags & IEEE80211_TX_CTL_NO_ACK)
|
||||
flags |= AR5K_TXDESC_NOACK;
|
||||
|
||||
rc_flags = info->control.rates[0].flags;
|
||||
hw_rate = (rc_flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE) ?
|
||||
rate->hw_value_short : rate->hw_value;
|
||||
|
||||
pktlen = skb->len;
|
||||
|
||||
if (rc_flags & IEEE80211_TX_RC_USE_RTS_CTS) {
|
||||
flags |= AR5K_TXDESC_RTSENA;
|
||||
cts_rate = ieee80211_get_rts_cts_rate(sc->hw, info)->hw_value;
|
||||
duration = le16_to_cpu(ieee80211_rts_duration(sc->hw,
|
||||
sc->vif, pktlen, info));
|
||||
}
|
||||
if (rc_flags & IEEE80211_TX_RC_USE_CTS_PROTECT) {
|
||||
flags |= AR5K_TXDESC_CTSENA;
|
||||
cts_rate = ieee80211_get_rts_cts_rate(sc->hw, info)->hw_value;
|
||||
duration = le16_to_cpu(ieee80211_ctstoself_duration(sc->hw,
|
||||
sc->vif, pktlen, info));
|
||||
}
|
||||
|
||||
if (info->control.hw_key) {
|
||||
keyidx = info->control.hw_key->hw_key_idx;
|
||||
pktlen += info->control.hw_key->icv_len;
|
||||
|
@ -1197,8 +1225,9 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
|
|||
ret = ah->ah_setup_tx_desc(ah, ds, pktlen,
|
||||
ieee80211_get_hdrlen_from_skb(skb), AR5K_PKT_TYPE_NORMAL,
|
||||
(sc->power_level * 2),
|
||||
ieee80211_get_tx_rate(sc->hw, info)->hw_value,
|
||||
info->control.rates[0].count, keyidx, 0, flags, 0, 0);
|
||||
hw_rate,
|
||||
info->control.rates[0].count, keyidx, 0, flags,
|
||||
cts_rate, duration);
|
||||
if (ret)
|
||||
goto err_unmap;
|
||||
|
||||
|
@ -1664,7 +1693,8 @@ ath5k_tasklet_rx(unsigned long data)
|
|||
{
|
||||
struct ieee80211_rx_status rxs = {};
|
||||
struct ath5k_rx_status rs = {};
|
||||
struct sk_buff *skb;
|
||||
struct sk_buff *skb, *next_skb;
|
||||
dma_addr_t next_skb_addr;
|
||||
struct ath5k_softc *sc = (void *)data;
|
||||
struct ath5k_buf *bf, *bf_last;
|
||||
struct ath5k_desc *ds;
|
||||
|
@ -1749,10 +1779,17 @@ ath5k_tasklet_rx(unsigned long data)
|
|||
goto next;
|
||||
}
|
||||
accept:
|
||||
next_skb = ath5k_rx_skb_alloc(sc, &next_skb_addr);
|
||||
|
||||
/*
|
||||
* If we can't replace bf->skb with a new skb under memory
|
||||
* pressure, just skip this packet
|
||||
*/
|
||||
if (!next_skb)
|
||||
goto next;
|
||||
|
||||
pci_unmap_single(sc->pdev, bf->skbaddr, sc->rxbufsize,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
bf->skb = NULL;
|
||||
|
||||
skb_put(skb, rs.rs_datalen);
|
||||
|
||||
/* The MAC header is padded to have 32-bit boundary if the
|
||||
|
@ -1825,6 +1862,9 @@ accept:
|
|||
ath5k_check_ibss_tsf(sc, skb, &rxs);
|
||||
|
||||
__ieee80211_rx(sc->hw, skb, &rxs);
|
||||
|
||||
bf->skb = next_skb;
|
||||
bf->skbaddr = next_skb_addr;
|
||||
next:
|
||||
list_move_tail(&bf->list, &sc->rxbuf);
|
||||
} while (ath5k_rxbuf_setup(sc, bf) == 0);
|
||||
|
@ -2207,18 +2247,13 @@ ath5k_beacon_config(struct ath5k_softc *sc)
|
|||
\********************/
|
||||
|
||||
static int
|
||||
ath5k_init(struct ath5k_softc *sc, bool is_resume)
|
||||
ath5k_init(struct ath5k_softc *sc)
|
||||
{
|
||||
struct ath5k_hw *ah = sc->ah;
|
||||
int ret, i;
|
||||
|
||||
mutex_lock(&sc->lock);
|
||||
|
||||
if (is_resume && !test_bit(ATH_STAT_STARTED, sc->status))
|
||||
goto out_ok;
|
||||
|
||||
__clear_bit(ATH_STAT_STARTED, sc->status);
|
||||
|
||||
ATH5K_DBG(sc, ATH5K_DEBUG_RESET, "mode %d\n", sc->opmode);
|
||||
|
||||
/*
|
||||
|
@ -2250,15 +2285,12 @@ ath5k_init(struct ath5k_softc *sc, bool is_resume)
|
|||
for (i = 0; i < AR5K_KEYTABLE_SIZE; i++)
|
||||
ath5k_hw_reset_key(ah, i);
|
||||
|
||||
__set_bit(ATH_STAT_STARTED, sc->status);
|
||||
|
||||
/* Set ack to be sent at low bit-rates */
|
||||
ath5k_hw_set_ack_bitrate_high(ah, false);
|
||||
|
||||
mod_timer(&sc->calib_tim, round_jiffies(jiffies +
|
||||
msecs_to_jiffies(ath5k_calinterval * 1000)));
|
||||
|
||||
out_ok:
|
||||
ret = 0;
|
||||
done:
|
||||
mmiowb();
|
||||
|
@ -2313,7 +2345,7 @@ ath5k_stop_locked(struct ath5k_softc *sc)
|
|||
* stop is preempted).
|
||||
*/
|
||||
static int
|
||||
ath5k_stop_hw(struct ath5k_softc *sc, bool is_suspend)
|
||||
ath5k_stop_hw(struct ath5k_softc *sc)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
@ -2344,8 +2376,6 @@ ath5k_stop_hw(struct ath5k_softc *sc, bool is_suspend)
|
|||
}
|
||||
}
|
||||
ath5k_txbuf_free(sc, sc->bbuf);
|
||||
if (!is_suspend)
|
||||
__clear_bit(ATH_STAT_STARTED, sc->status);
|
||||
|
||||
mmiowb();
|
||||
mutex_unlock(&sc->lock);
|
||||
|
@ -2598,6 +2628,17 @@ ath5k_init_leds(struct ath5k_softc *sc)
|
|||
sc->led_pin = 1;
|
||||
sc->led_on = 1; /* active high */
|
||||
}
|
||||
/*
|
||||
* Pin 3 on Foxconn chips used in Acer Aspire One (0x105b:e008) and
|
||||
* in emachines notebooks with AMBIT subsystem.
|
||||
*/
|
||||
if (pdev->subsystem_vendor == PCI_VENDOR_ID_FOXCONN ||
|
||||
pdev->subsystem_vendor == PCI_VENDOR_ID_AMBIT) {
|
||||
__set_bit(ATH_STAT_LEDSOFT, sc->status);
|
||||
sc->led_pin = 3;
|
||||
sc->led_on = 0; /* active low */
|
||||
}
|
||||
|
||||
if (!test_bit(ATH_STAT_LEDSOFT, sc->status))
|
||||
goto out;
|
||||
|
||||
|
@ -2745,12 +2786,12 @@ ath5k_reset_wake(struct ath5k_softc *sc)
|
|||
|
||||
static int ath5k_start(struct ieee80211_hw *hw)
|
||||
{
|
||||
return ath5k_init(hw->priv, false);
|
||||
return ath5k_init(hw->priv);
|
||||
}
|
||||
|
||||
static void ath5k_stop(struct ieee80211_hw *hw)
|
||||
{
|
||||
ath5k_stop_hw(hw->priv, false);
|
||||
ath5k_stop_hw(hw->priv);
|
||||
}
|
||||
|
||||
static int ath5k_add_interface(struct ieee80211_hw *hw,
|
||||
|
@ -2999,8 +3040,8 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw,
|
|||
|
||||
static int
|
||||
ath5k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
const u8 *local_addr, const u8 *addr,
|
||||
struct ieee80211_key_conf *key)
|
||||
struct ieee80211_vif *vif, struct ieee80211_sta *sta,
|
||||
struct ieee80211_key_conf *key)
|
||||
{
|
||||
struct ath5k_softc *sc = hw->priv;
|
||||
int ret = 0;
|
||||
|
@ -3023,7 +3064,8 @@ ath5k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
|||
|
||||
switch (cmd) {
|
||||
case SET_KEY:
|
||||
ret = ath5k_hw_set_key(sc->ah, key->keyidx, key, addr);
|
||||
ret = ath5k_hw_set_key(sc->ah, key->keyidx, key,
|
||||
sta ? sta->addr : NULL);
|
||||
if (ret) {
|
||||
ATH5K_ERR(sc, "can't set the key\n");
|
||||
goto unlock;
|
||||
|
@ -3082,6 +3124,14 @@ ath5k_get_tsf(struct ieee80211_hw *hw)
|
|||
return ath5k_hw_get_tsf64(sc->ah);
|
||||
}
|
||||
|
||||
static void
|
||||
ath5k_set_tsf(struct ieee80211_hw *hw, u64 tsf)
|
||||
{
|
||||
struct ath5k_softc *sc = hw->priv;
|
||||
|
||||
ath5k_hw_set_tsf64(sc->ah, tsf);
|
||||
}
|
||||
|
||||
static void
|
||||
ath5k_reset_tsf(struct ieee80211_hw *hw)
|
||||
{
|
||||
|
|
|
@ -148,8 +148,7 @@ struct ath5k_softc {
|
|||
u8 bssidmask[ETH_ALEN];
|
||||
|
||||
unsigned int led_pin, /* GPIO pin for driving LED */
|
||||
led_on, /* pin setting for LED on */
|
||||
led_off; /* off time for current blink */
|
||||
led_on; /* pin setting for LED on */
|
||||
|
||||
struct tasklet_struct restq; /* reset tasklet */
|
||||
|
||||
|
|
|
@ -85,7 +85,8 @@ int ath5k_hw_set_capabilities(struct ath5k_hw *ah)
|
|||
/* Enable 802.11b if a 2GHz capable radio (2111/5112) is
|
||||
* connected */
|
||||
if (AR5K_EEPROM_HDR_11B(ee_header) ||
|
||||
AR5K_EEPROM_HDR_11G(ee_header)) {
|
||||
(AR5K_EEPROM_HDR_11G(ee_header) &&
|
||||
ah->ah_version != AR5K_AR5211)) {
|
||||
/* 2312 */
|
||||
ah->ah_capabilities.cap_range.range_2ghz_min = 2412;
|
||||
ah->ah_capabilities.cap_range.range_2ghz_max = 2732;
|
||||
|
@ -94,7 +95,8 @@ int ath5k_hw_set_capabilities(struct ath5k_hw *ah)
|
|||
__set_bit(AR5K_MODE_11B,
|
||||
ah->ah_capabilities.cap_mode);
|
||||
|
||||
if (AR5K_EEPROM_HDR_11G(ee_header))
|
||||
if (AR5K_EEPROM_HDR_11G(ee_header) &&
|
||||
ah->ah_version != AR5K_AR5211)
|
||||
__set_bit(AR5K_MODE_11G,
|
||||
ah->ah_capabilities.cap_mode);
|
||||
}
|
||||
|
|
|
@ -193,43 +193,6 @@ static const struct file_operations fops_registers = {
|
|||
};
|
||||
|
||||
|
||||
/* debugfs: TSF */
|
||||
|
||||
static ssize_t read_file_tsf(struct file *file, char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ath5k_softc *sc = file->private_data;
|
||||
char buf[100];
|
||||
snprintf(buf, sizeof(buf), "0x%016llx\n",
|
||||
(unsigned long long)ath5k_hw_get_tsf64(sc->ah));
|
||||
return simple_read_from_buffer(user_buf, count, ppos, buf, 19);
|
||||
}
|
||||
|
||||
static ssize_t write_file_tsf(struct file *file,
|
||||
const char __user *userbuf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ath5k_softc *sc = file->private_data;
|
||||
char buf[20];
|
||||
|
||||
if (copy_from_user(buf, userbuf, min(count, sizeof(buf))))
|
||||
return -EFAULT;
|
||||
|
||||
if (strncmp(buf, "reset", 5) == 0) {
|
||||
ath5k_hw_reset_tsf(sc->ah);
|
||||
printk(KERN_INFO "debugfs reset TSF\n");
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
static const struct file_operations fops_tsf = {
|
||||
.read = read_file_tsf,
|
||||
.write = write_file_tsf,
|
||||
.open = ath5k_debugfs_open,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
|
||||
/* debugfs: beacons */
|
||||
|
||||
static ssize_t read_file_beacon(struct file *file, char __user *user_buf,
|
||||
|
@ -423,9 +386,6 @@ ath5k_debug_init_device(struct ath5k_softc *sc)
|
|||
sc->debug.debugfs_registers = debugfs_create_file("registers", S_IRUGO,
|
||||
sc->debug.debugfs_phydir, sc, &fops_registers);
|
||||
|
||||
sc->debug.debugfs_tsf = debugfs_create_file("tsf", S_IWUSR | S_IRUGO,
|
||||
sc->debug.debugfs_phydir, sc, &fops_tsf);
|
||||
|
||||
sc->debug.debugfs_beacon = debugfs_create_file("beacon", S_IWUSR | S_IRUGO,
|
||||
sc->debug.debugfs_phydir, sc, &fops_beacon);
|
||||
|
||||
|
@ -444,7 +404,6 @@ ath5k_debug_finish_device(struct ath5k_softc *sc)
|
|||
{
|
||||
debugfs_remove(sc->debug.debugfs_debug);
|
||||
debugfs_remove(sc->debug.debugfs_registers);
|
||||
debugfs_remove(sc->debug.debugfs_tsf);
|
||||
debugfs_remove(sc->debug.debugfs_beacon);
|
||||
debugfs_remove(sc->debug.debugfs_reset);
|
||||
debugfs_remove(sc->debug.debugfs_phydir);
|
||||
|
|
|
@ -72,7 +72,6 @@ struct ath5k_dbg_info {
|
|||
struct dentry *debugfs_phydir;
|
||||
struct dentry *debugfs_debug;
|
||||
struct dentry *debugfs_registers;
|
||||
struct dentry *debugfs_tsf;
|
||||
struct dentry *debugfs_beacon;
|
||||
struct dentry *debugfs_reset;
|
||||
};
|
||||
|
|
|
@ -137,6 +137,18 @@ ath5k_eeprom_init_header(struct ath5k_hw *ah)
|
|||
if (ah->ah_ee_version >= AR5K_EEPROM_VERSION_4_0) {
|
||||
AR5K_EEPROM_READ_HDR(AR5K_EEPROM_MISC0, ee_misc0);
|
||||
AR5K_EEPROM_READ_HDR(AR5K_EEPROM_MISC1, ee_misc1);
|
||||
|
||||
/* XXX: Don't know which versions include these two */
|
||||
AR5K_EEPROM_READ_HDR(AR5K_EEPROM_MISC2, ee_misc2);
|
||||
|
||||
if (ee->ee_version >= AR5K_EEPROM_VERSION_4_3)
|
||||
AR5K_EEPROM_READ_HDR(AR5K_EEPROM_MISC3, ee_misc3);
|
||||
|
||||
if (ee->ee_version >= AR5K_EEPROM_VERSION_5_0) {
|
||||
AR5K_EEPROM_READ_HDR(AR5K_EEPROM_MISC4, ee_misc4);
|
||||
AR5K_EEPROM_READ_HDR(AR5K_EEPROM_MISC5, ee_misc5);
|
||||
AR5K_EEPROM_READ_HDR(AR5K_EEPROM_MISC6, ee_misc6);
|
||||
}
|
||||
}
|
||||
|
||||
if (ah->ah_ee_version < AR5K_EEPROM_VERSION_3_3) {
|
||||
|
@ -213,7 +225,8 @@ static int ath5k_eeprom_read_ants(struct ath5k_hw *ah, u32 *offset,
|
|||
}
|
||||
|
||||
/*
|
||||
* Read supported modes from eeprom
|
||||
* Read supported modes and some mode-specific calibration data
|
||||
* from eeprom
|
||||
*/
|
||||
static int ath5k_eeprom_read_modes(struct ath5k_hw *ah, u32 *offset,
|
||||
unsigned int mode)
|
||||
|
@ -315,6 +328,9 @@ static int ath5k_eeprom_read_modes(struct ath5k_hw *ah, u32 *offset,
|
|||
if (ah->ah_ee_version < AR5K_EEPROM_VERSION_4_0)
|
||||
goto done;
|
||||
|
||||
/* Note: >= v5 have bg freq piers on another location
|
||||
* so these freq piers are ignored for >= v5 (should be 0xff
|
||||
* anyway) */
|
||||
switch(mode) {
|
||||
case AR5K_EEPROM_MODE_11A:
|
||||
if (ah->ah_ee_version < AR5K_EEPROM_VERSION_4_1)
|
||||
|
@ -442,7 +458,7 @@ ath5k_eeprom_read_turbo_modes(struct ath5k_hw *ah,
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Read mode-specific data (except power calibration data) */
|
||||
static int
|
||||
ath5k_eeprom_init_modes(struct ath5k_hw *ah)
|
||||
{
|
||||
|
@ -488,6 +504,16 @@ ath5k_eeprom_init_modes(struct ath5k_hw *ah)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Used to match PCDAC steps with power values on RF5111 chips
|
||||
* (eeprom versions < 4). For RF5111 we have 10 pre-defined PCDAC
|
||||
* steps that match with the power values we read from eeprom. On
|
||||
* older eeprom versions (< 3.2) these steps are equaly spaced at
|
||||
* 10% of the pcdac curve -until the curve reaches it's maximum-
|
||||
* (10 steps from 0 to 100%) but on newer eeprom versions (>= 3.2)
|
||||
* these 10 steps are spaced in a different way. This function returns
|
||||
* the pcdac steps based on eeprom version and curve min/max so that we
|
||||
* can have pcdac/pwr points.
|
||||
*/
|
||||
static inline void
|
||||
ath5k_get_pcdac_intercepts(struct ath5k_hw *ah, u8 min, u8 max, u8 *vp)
|
||||
{
|
||||
|
@ -507,37 +533,48 @@ ath5k_get_pcdac_intercepts(struct ath5k_hw *ah, u8 min, u8 max, u8 *vp)
|
|||
*vp++ = (ip[i] * max + (100 - ip[i]) * min) / 100;
|
||||
}
|
||||
|
||||
/* Read the frequency piers for each mode (mostly used on newer eeproms with 0xff
|
||||
* frequency mask) */
|
||||
static inline int
|
||||
ath5k_eeprom_read_freq_list(struct ath5k_hw *ah, int *offset, int max,
|
||||
struct ath5k_chan_pcal_info *pc, u8 *count)
|
||||
struct ath5k_chan_pcal_info *pc, unsigned int mode)
|
||||
{
|
||||
struct ath5k_eeprom_info *ee = &ah->ah_capabilities.cap_eeprom;
|
||||
int o = *offset;
|
||||
int i = 0;
|
||||
u8 f1, f2;
|
||||
u8 freq1, freq2;
|
||||
int ret;
|
||||
u16 val;
|
||||
|
||||
while(i < max) {
|
||||
AR5K_EEPROM_READ(o++, val);
|
||||
|
||||
f1 = (val >> 8) & 0xff;
|
||||
f2 = val & 0xff;
|
||||
freq1 = (val >> 8) & 0xff;
|
||||
freq2 = val & 0xff;
|
||||
|
||||
if (f1)
|
||||
pc[i++].freq = f1;
|
||||
if (freq1) {
|
||||
pc[i++].freq = ath5k_eeprom_bin2freq(ee,
|
||||
freq1, mode);
|
||||
ee->ee_n_piers[mode]++;
|
||||
}
|
||||
|
||||
if (f2)
|
||||
pc[i++].freq = f2;
|
||||
if (freq2) {
|
||||
pc[i++].freq = ath5k_eeprom_bin2freq(ee,
|
||||
freq2, mode);
|
||||
ee->ee_n_piers[mode]++;
|
||||
}
|
||||
|
||||
if (!f1 || !f2)
|
||||
if (!freq1 || !freq2)
|
||||
break;
|
||||
}
|
||||
|
||||
/* return new offset */
|
||||
*offset = o;
|
||||
*count = i;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Read frequency piers for 802.11a */
|
||||
static int
|
||||
ath5k_eeprom_init_11a_pcal_freq(struct ath5k_hw *ah, int offset)
|
||||
{
|
||||
|
@ -550,7 +587,7 @@ ath5k_eeprom_init_11a_pcal_freq(struct ath5k_hw *ah, int offset)
|
|||
if (ee->ee_version >= AR5K_EEPROM_VERSION_3_3) {
|
||||
ath5k_eeprom_read_freq_list(ah, &offset,
|
||||
AR5K_EEPROM_N_5GHZ_CHAN, pcal,
|
||||
&ee->ee_n_piers[AR5K_EEPROM_MODE_11A]);
|
||||
AR5K_EEPROM_MODE_11A);
|
||||
} else {
|
||||
mask = AR5K_EEPROM_FREQ_M(ah->ah_ee_version);
|
||||
|
||||
|
@ -577,23 +614,25 @@ ath5k_eeprom_init_11a_pcal_freq(struct ath5k_hw *ah, int offset)
|
|||
|
||||
AR5K_EEPROM_READ(offset++, val);
|
||||
pcal[9].freq |= (val >> 10) & 0x3f;
|
||||
ee->ee_n_piers[AR5K_EEPROM_MODE_11A] = 10;
|
||||
}
|
||||
|
||||
for(i = 0; i < AR5K_EEPROM_N_5GHZ_CHAN; i += 1) {
|
||||
pcal[i].freq = ath5k_eeprom_bin2freq(ee,
|
||||
/* Fixed number of piers */
|
||||
ee->ee_n_piers[AR5K_EEPROM_MODE_11A] = 10;
|
||||
|
||||
for (i = 0; i < AR5K_EEPROM_N_5GHZ_CHAN; i++) {
|
||||
pcal[i].freq = ath5k_eeprom_bin2freq(ee,
|
||||
pcal[i].freq, AR5K_EEPROM_MODE_11A);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Read frequency piers for 802.11bg on eeprom versions >= 5 and eemap >= 2 */
|
||||
static inline int
|
||||
ath5k_eeprom_init_11bg_2413(struct ath5k_hw *ah, unsigned int mode, int offset)
|
||||
{
|
||||
struct ath5k_eeprom_info *ee = &ah->ah_capabilities.cap_eeprom;
|
||||
struct ath5k_chan_pcal_info *pcal;
|
||||
int i;
|
||||
|
||||
switch(mode) {
|
||||
case AR5K_EEPROM_MODE_11B:
|
||||
|
@ -608,23 +647,25 @@ ath5k_eeprom_init_11bg_2413(struct ath5k_hw *ah, unsigned int mode, int offset)
|
|||
|
||||
ath5k_eeprom_read_freq_list(ah, &offset,
|
||||
AR5K_EEPROM_N_2GHZ_CHAN_2413, pcal,
|
||||
&ee->ee_n_piers[mode]);
|
||||
for(i = 0; i < AR5K_EEPROM_N_2GHZ_CHAN_2413; i += 1) {
|
||||
pcal[i].freq = ath5k_eeprom_bin2freq(ee,
|
||||
pcal[i].freq, mode);
|
||||
}
|
||||
mode);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Read power calibration for RF5111 chips
|
||||
* For RF5111 we have an XPD -eXternal Power Detector- curve
|
||||
* for each calibrated channel. Each curve has PCDAC steps on
|
||||
* x axis and power on y axis and looks like a logarithmic
|
||||
* function. To recreate the curve and pass the power values
|
||||
* on the pcdac table, we read 10 points here and interpolate later.
|
||||
*/
|
||||
static int
|
||||
ath5k_eeprom_read_pcal_info_5111(struct ath5k_hw *ah, int mode)
|
||||
{
|
||||
struct ath5k_eeprom_info *ee = &ah->ah_capabilities.cap_eeprom;
|
||||
struct ath5k_chan_pcal_info *pcal;
|
||||
int offset, ret;
|
||||
int i, j;
|
||||
int i;
|
||||
u16 val;
|
||||
|
||||
offset = AR5K_EEPROM_GROUPS_START(ee->ee_version);
|
||||
|
@ -704,16 +745,22 @@ ath5k_eeprom_read_pcal_info_5111(struct ath5k_hw *ah, int mode)
|
|||
|
||||
ath5k_get_pcdac_intercepts(ah, cdata->pcdac_min,
|
||||
cdata->pcdac_max, cdata->pcdac);
|
||||
|
||||
for (j = 0; j < AR5K_EEPROM_N_PCDAC; j++) {
|
||||
cdata->pwr[j] = (u16)
|
||||
(AR5K_EEPROM_POWER_STEP * cdata->pwr[j]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Read power calibration for RF5112 chips
|
||||
* For RF5112 we have 4 XPD -eXternal Power Detector- curves
|
||||
* for each calibrated channel on 0, -6, -12 and -18dbm but we only
|
||||
* use the higher (3) and the lower (0) curves. Each curve has PCDAC
|
||||
* steps on x axis and power on y axis and looks like a linear
|
||||
* function. To recreate the curve and pass the power values
|
||||
* on the pcdac table, we read 4 points for xpd 0 and 3 points
|
||||
* for xpd 3 here and interpolate later.
|
||||
*
|
||||
* Note: Many vendors just use xpd 0 so xpd 3 is zeroed.
|
||||
*/
|
||||
static int
|
||||
ath5k_eeprom_read_pcal_info_5112(struct ath5k_hw *ah, int mode)
|
||||
{
|
||||
|
@ -790,7 +837,7 @@ ath5k_eeprom_read_pcal_info_5112(struct ath5k_hw *ah, int mode)
|
|||
|
||||
/* PCDAC steps
|
||||
* corresponding to the above power
|
||||
* measurements (static) */
|
||||
* measurements (fixed) */
|
||||
chan_pcal_info->pcdac_x3[0] = 20;
|
||||
chan_pcal_info->pcdac_x3[1] = 35;
|
||||
chan_pcal_info->pcdac_x3[2] = 63;
|
||||
|
@ -814,6 +861,13 @@ ath5k_eeprom_read_pcal_info_5112(struct ath5k_hw *ah, int mode)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* For RF2413 power calibration data doesn't start on a fixed location and
|
||||
* if a mode is not supported, it's section is missing -not zeroed-.
|
||||
* So we need to calculate the starting offset for each section by using
|
||||
* these two functions */
|
||||
|
||||
/* Return the size of each section based on the mode and the number of pd
|
||||
* gains available (maximum 4). */
|
||||
static inline unsigned int
|
||||
ath5k_pdgains_size_2413(struct ath5k_eeprom_info *ee, unsigned int mode)
|
||||
{
|
||||
|
@ -826,6 +880,8 @@ ath5k_pdgains_size_2413(struct ath5k_eeprom_info *ee, unsigned int mode)
|
|||
return sz;
|
||||
}
|
||||
|
||||
/* Return the starting offset for a section based on the modes supported
|
||||
* and each section's size. */
|
||||
static unsigned int
|
||||
ath5k_cal_data_offset_2413(struct ath5k_eeprom_info *ee, int mode)
|
||||
{
|
||||
|
@ -834,11 +890,13 @@ ath5k_cal_data_offset_2413(struct ath5k_eeprom_info *ee, int mode)
|
|||
switch(mode) {
|
||||
case AR5K_EEPROM_MODE_11G:
|
||||
if (AR5K_EEPROM_HDR_11B(ee->ee_header))
|
||||
offset += ath5k_pdgains_size_2413(ee, AR5K_EEPROM_MODE_11B) + 2;
|
||||
offset += ath5k_pdgains_size_2413(ee, AR5K_EEPROM_MODE_11B) +
|
||||
AR5K_EEPROM_N_2GHZ_CHAN_2413 / 2;
|
||||
/* fall through */
|
||||
case AR5K_EEPROM_MODE_11B:
|
||||
if (AR5K_EEPROM_HDR_11A(ee->ee_header))
|
||||
offset += ath5k_pdgains_size_2413(ee, AR5K_EEPROM_MODE_11A) + 5;
|
||||
offset += ath5k_pdgains_size_2413(ee, AR5K_EEPROM_MODE_11A) +
|
||||
AR5K_EEPROM_N_5GHZ_CHAN / 2;
|
||||
/* fall through */
|
||||
case AR5K_EEPROM_MODE_11A:
|
||||
break;
|
||||
|
@ -849,6 +907,17 @@ ath5k_cal_data_offset_2413(struct ath5k_eeprom_info *ee, int mode)
|
|||
return offset;
|
||||
}
|
||||
|
||||
/* Read power calibration for RF2413 chips
|
||||
* For RF2413 we have a PDDAC table (Power Detector) instead
|
||||
* of a PCDAC and 4 pd gain curves for each calibrated channel.
|
||||
* Each curve has PDDAC steps on x axis and power on y axis and
|
||||
* looks like an exponential function. To recreate the curves
|
||||
* we read here the points and interpolate later. Note that
|
||||
* in most cases only higher and lower curves are used (like
|
||||
* RF5112) but vendors have the oportunity to include all 4
|
||||
* curves on eeprom. The final curve (higher power) has an extra
|
||||
* point for better accuracy like RF5112.
|
||||
*/
|
||||
static int
|
||||
ath5k_eeprom_read_pcal_info_2413(struct ath5k_hw *ah, int mode)
|
||||
{
|
||||
|
@ -868,6 +937,7 @@ ath5k_eeprom_read_pcal_info_2413(struct ath5k_hw *ah, int mode)
|
|||
ee->ee_pd_gains[mode] = pd_gains;
|
||||
|
||||
offset = ath5k_cal_data_offset_2413(ee, mode);
|
||||
ee->ee_n_piers[mode] = 0;
|
||||
switch (mode) {
|
||||
case AR5K_EEPROM_MODE_11A:
|
||||
if (!AR5K_EEPROM_HDR_11A(ee->ee_header))
|
||||
|
@ -1163,6 +1233,20 @@ static int ath5k_eeprom_read_target_rate_pwr_info(struct ath5k_hw *ah, unsigned
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read per channel calibration info from EEPROM
|
||||
*
|
||||
* This info is used to calibrate the baseband power table. Imagine
|
||||
* that for each channel there is a power curve that's hw specific
|
||||
* (depends on amplifier etc) and we try to "correct" this curve using
|
||||
* offests we pass on to phy chip (baseband -> before amplifier) so that
|
||||
* it can use accurate power values when setting tx power (takes amplifier's
|
||||
* performance on each channel into account).
|
||||
*
|
||||
* EEPROM provides us with the offsets for some pre-calibrated channels
|
||||
* and we have to interpolate to create the full table for these channels and
|
||||
* also the table for any channel.
|
||||
*/
|
||||
static int
|
||||
ath5k_eeprom_read_pcal_info(struct ath5k_hw *ah)
|
||||
{
|
||||
|
@ -1193,7 +1277,7 @@ ath5k_eeprom_read_pcal_info(struct ath5k_hw *ah)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Read conformance test limits */
|
||||
/* Read conformance test limits used for regulatory control */
|
||||
static int
|
||||
ath5k_eeprom_read_ctl_info(struct ath5k_hw *ah)
|
||||
{
|
||||
|
|
|
@ -83,7 +83,7 @@ void ath5k_hw_set_ledstate(struct ath5k_hw *ah, unsigned int state)
|
|||
int ath5k_hw_set_gpio_input(struct ath5k_hw *ah, u32 gpio)
|
||||
{
|
||||
ATH5K_TRACE(ah->ah_sc);
|
||||
if (gpio > AR5K_NUM_GPIO)
|
||||
if (gpio >= AR5K_NUM_GPIO)
|
||||
return -EINVAL;
|
||||
|
||||
ath5k_hw_reg_write(ah,
|
||||
|
@ -99,7 +99,7 @@ int ath5k_hw_set_gpio_input(struct ath5k_hw *ah, u32 gpio)
|
|||
int ath5k_hw_set_gpio_output(struct ath5k_hw *ah, u32 gpio)
|
||||
{
|
||||
ATH5K_TRACE(ah->ah_sc);
|
||||
if (gpio > AR5K_NUM_GPIO)
|
||||
if (gpio >= AR5K_NUM_GPIO)
|
||||
return -EINVAL;
|
||||
|
||||
ath5k_hw_reg_write(ah,
|
||||
|
@ -115,7 +115,7 @@ int ath5k_hw_set_gpio_output(struct ath5k_hw *ah, u32 gpio)
|
|||
u32 ath5k_hw_get_gpio(struct ath5k_hw *ah, u32 gpio)
|
||||
{
|
||||
ATH5K_TRACE(ah->ah_sc);
|
||||
if (gpio > AR5K_NUM_GPIO)
|
||||
if (gpio >= AR5K_NUM_GPIO)
|
||||
return 0xffffffff;
|
||||
|
||||
/* GPIO input magic */
|
||||
|
@ -131,7 +131,7 @@ int ath5k_hw_set_gpio(struct ath5k_hw *ah, u32 gpio, u32 val)
|
|||
u32 data;
|
||||
ATH5K_TRACE(ah->ah_sc);
|
||||
|
||||
if (gpio > AR5K_NUM_GPIO)
|
||||
if (gpio >= AR5K_NUM_GPIO)
|
||||
return -EINVAL;
|
||||
|
||||
/* GPIO output magic */
|
||||
|
@ -154,7 +154,7 @@ void ath5k_hw_set_gpio_intr(struct ath5k_hw *ah, unsigned int gpio,
|
|||
u32 data;
|
||||
|
||||
ATH5K_TRACE(ah->ah_sc);
|
||||
if (gpio > AR5K_NUM_GPIO)
|
||||
if (gpio >= AR5K_NUM_GPIO)
|
||||
return;
|
||||
|
||||
/*
|
||||
|
|
|
@ -645,6 +645,23 @@ u64 ath5k_hw_get_tsf64(struct ath5k_hw *ah)
|
|||
return ath5k_hw_reg_read(ah, AR5K_TSF_L32) | (tsf << 32);
|
||||
}
|
||||
|
||||
/**
|
||||
* ath5k_hw_set_tsf64 - Set a new 64bit TSF
|
||||
*
|
||||
* @ah: The &struct ath5k_hw
|
||||
* @tsf64: The new 64bit TSF
|
||||
*
|
||||
* Sets the new TSF
|
||||
*/
|
||||
void ath5k_hw_set_tsf64(struct ath5k_hw *ah, u64 tsf64)
|
||||
{
|
||||
ATH5K_TRACE(ah->ah_sc);
|
||||
|
||||
ath5k_hw_reg_write(ah, 0x00000000, AR5K_TSF_L32);
|
||||
ath5k_hw_reg_write(ah, (tsf64 >> 32) & 0xffffffff, AR5K_TSF_U32);
|
||||
ath5k_hw_reg_write(ah, tsf64 & 0xffffffff, AR5K_TSF_L32);
|
||||
}
|
||||
|
||||
/**
|
||||
* ath5k_hw_reset_tsf - Force a TSF reset
|
||||
*
|
||||
|
@ -1026,6 +1043,9 @@ int ath5k_keycache_type(const struct ieee80211_key_conf *key)
|
|||
return AR5K_KEYTABLE_TYPE_40;
|
||||
else if (key->keylen == LEN_WEP104)
|
||||
return AR5K_KEYTABLE_TYPE_104;
|
||||
return -EINVAL;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -1041,7 +1061,7 @@ int ath5k_hw_set_key(struct ath5k_hw *ah, u16 entry,
|
|||
__le32 key_v[5] = {};
|
||||
__le32 key0 = 0, key1 = 0;
|
||||
__le32 *rxmic, *txmic;
|
||||
u32 keytype;
|
||||
int keytype;
|
||||
u16 micentry = entry + AR5K_KEYTABLE_MIC_OFFSET;
|
||||
bool is_tkip;
|
||||
const u8 *key_ptr;
|
||||
|
@ -1139,7 +1159,7 @@ int ath5k_hw_set_key_lladdr(struct ath5k_hw *ah, u16 entry, const u8 *mac)
|
|||
|
||||
/* MAC may be NULL if it's a broadcast key. In this case no need to
|
||||
* to compute AR5K_LOW_ID and AR5K_HIGH_ID as we already know it. */
|
||||
if (unlikely(mac == NULL)) {
|
||||
if (!mac) {
|
||||
low_id = 0xffffffff;
|
||||
high_id = 0xffff | AR5K_KEYTABLE_VALID;
|
||||
} else {
|
||||
|
|
|
@ -148,6 +148,7 @@ int ath5k_hw_setup_tx_queue(struct ath5k_hw *ah, enum ath5k_tx_queue queue_type,
|
|||
*/
|
||||
u32 ath5k_hw_num_tx_pending(struct ath5k_hw *ah, unsigned int queue)
|
||||
{
|
||||
u32 pending;
|
||||
ATH5K_TRACE(ah->ah_sc);
|
||||
AR5K_ASSERT_ENTRY(queue, ah->ah_capabilities.cap_queues.q_tx_num);
|
||||
|
||||
|
@ -159,7 +160,15 @@ u32 ath5k_hw_num_tx_pending(struct ath5k_hw *ah, unsigned int queue)
|
|||
if (ah->ah_version == AR5K_AR5210)
|
||||
return false;
|
||||
|
||||
return AR5K_QUEUE_STATUS(queue) & AR5K_QCU_STS_FRMPENDCNT;
|
||||
pending = (AR5K_QUEUE_STATUS(queue) & AR5K_QCU_STS_FRMPENDCNT);
|
||||
|
||||
/* It's possible to have no frames pending even if TXE
|
||||
* is set. To indicate that q has not stopped return
|
||||
* true */
|
||||
if (!pending && AR5K_REG_READ_Q(ah, AR5K_QCU_TXE, queue))
|
||||
return true;
|
||||
|
||||
return pending;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -324,8 +333,18 @@ int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue)
|
|||
/*
|
||||
* Set misc registers
|
||||
*/
|
||||
ath5k_hw_reg_write(ah, AR5K_QCU_MISC_DCU_EARLY,
|
||||
AR5K_QUEUE_MISC(queue));
|
||||
/* Enable DCU early termination for this queue */
|
||||
AR5K_REG_ENABLE_BITS(ah, AR5K_QUEUE_MISC(queue),
|
||||
AR5K_QCU_MISC_DCU_EARLY);
|
||||
|
||||
/* Enable DCU to wait for next fragment from QCU */
|
||||
AR5K_REG_ENABLE_BITS(ah, AR5K_QUEUE_DFS_MISC(queue),
|
||||
AR5K_DCU_MISC_FRAG_WAIT);
|
||||
|
||||
/* On Maui and Spirit use the global seqnum on DCU */
|
||||
if (ah->ah_mac_version < AR5K_SREV_AR5211)
|
||||
AR5K_REG_ENABLE_BITS(ah, AR5K_QUEUE_DFS_MISC(queue),
|
||||
AR5K_DCU_MISC_SEQNUM_CTL);
|
||||
|
||||
if (tq->tqi_cbr_period) {
|
||||
ath5k_hw_reg_write(ah, AR5K_REG_SM(tq->tqi_cbr_period,
|
||||
|
@ -341,7 +360,8 @@ int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue)
|
|||
AR5K_QCU_MISC_CBR_THRES_ENABLE);
|
||||
}
|
||||
|
||||
if (tq->tqi_ready_time)
|
||||
if (tq->tqi_ready_time &&
|
||||
(tq->tqi_type != AR5K_TX_QUEUE_ID_CAB))
|
||||
ath5k_hw_reg_write(ah, AR5K_REG_SM(tq->tqi_ready_time,
|
||||
AR5K_QCU_RDYTIMECFG_INTVAL) |
|
||||
AR5K_QCU_RDYTIMECFG_ENABLE,
|
||||
|
@ -383,13 +403,6 @@ int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue)
|
|||
AR5K_DCU_MISC_ARBLOCK_CTL_S) |
|
||||
AR5K_DCU_MISC_POST_FR_BKOFF_DIS |
|
||||
AR5K_DCU_MISC_BCN_ENABLE);
|
||||
|
||||
ath5k_hw_reg_write(ah, ((AR5K_TUNE_BEACON_INTERVAL -
|
||||
(AR5K_TUNE_SW_BEACON_RESP -
|
||||
AR5K_TUNE_DMA_BEACON_RESP) -
|
||||
AR5K_TUNE_ADDITIONAL_SWBA_BACKOFF) * 1024) |
|
||||
AR5K_QCU_RDYTIMECFG_ENABLE,
|
||||
AR5K_QUEUE_RDYTIMECFG(queue));
|
||||
break;
|
||||
|
||||
case AR5K_TX_QUEUE_CAB:
|
||||
|
@ -398,6 +411,13 @@ int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue)
|
|||
AR5K_QCU_MISC_CBREXP_DIS |
|
||||
AR5K_QCU_MISC_CBREXP_BCN_DIS);
|
||||
|
||||
ath5k_hw_reg_write(ah, ((AR5K_TUNE_BEACON_INTERVAL -
|
||||
(AR5K_TUNE_SW_BEACON_RESP -
|
||||
AR5K_TUNE_DMA_BEACON_RESP) -
|
||||
AR5K_TUNE_ADDITIONAL_SWBA_BACKOFF) * 1024) |
|
||||
AR5K_QCU_RDYTIMECFG_ENABLE,
|
||||
AR5K_QUEUE_RDYTIMECFG(queue));
|
||||
|
||||
AR5K_REG_ENABLE_BITS(ah, AR5K_QUEUE_DFS_MISC(queue),
|
||||
(AR5K_DCU_MISC_ARBLOCK_CTL_GLOBAL <<
|
||||
AR5K_DCU_MISC_ARBLOCK_CTL_S));
|
||||
|
@ -413,6 +433,8 @@ int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue)
|
|||
break;
|
||||
}
|
||||
|
||||
/* TODO: Handle frame compression */
|
||||
|
||||
/*
|
||||
* Enable interrupts for this tx queue
|
||||
* in the secondary interrupt mask registers
|
||||
|
@ -483,6 +505,9 @@ int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue)
|
|||
* by setting AR5K_TXNOFRM to zero */
|
||||
if (ah->ah_txq_imr_nofrm == 0)
|
||||
ath5k_hw_reg_write(ah, 0, AR5K_TXNOFRM);
|
||||
|
||||
/* Set QCU mask for this DCU to save power */
|
||||
AR5K_REG_WRITE_Q(ah, AR5K_QUEUE_QCUMASK(queue), queue);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -11,6 +11,8 @@ ath9k-y += hw.o \
|
|||
xmit.o \
|
||||
rc.o
|
||||
|
||||
ath9k-$(CONFIG_PCI) += pci.o
|
||||
ath9k-$(CONFIG_ATHEROS_AR71XX) += ahb.o
|
||||
ath9k-$(CONFIG_ATH9K_DEBUG) += debug.o
|
||||
|
||||
obj-$(CONFIG_ATH9K) += ath9k.o
|
||||
|
|
|
@ -0,0 +1,187 @@
|
|||
/*
|
||||
* Copyright (c) 2008 Atheros Communications Inc.
|
||||
* Copyright (c) 2009 Gabor Juhos <juhosg@openwrt.org>
|
||||
* Copyright (c) 2009 Imre Kaloz <kaloz@openwrt.org>
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/nl80211.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/ath9k_platform.h>
|
||||
#include "core.h"
|
||||
#include "reg.h"
|
||||
#include "hw.h"
|
||||
|
||||
/* return bus cachesize in 4B word units */
|
||||
static void ath_ahb_read_cachesize(struct ath_softc *sc, int *csz)
|
||||
{
|
||||
*csz = L1_CACHE_BYTES >> 2;
|
||||
}
|
||||
|
||||
static void ath_ahb_cleanup(struct ath_softc *sc)
|
||||
{
|
||||
iounmap(sc->mem);
|
||||
}
|
||||
|
||||
static bool ath_ahb_eeprom_read(struct ath_hal *ah, u32 off, u16 *data)
|
||||
{
|
||||
struct ath_softc *sc = ah->ah_sc;
|
||||
struct platform_device *pdev = to_platform_device(sc->dev);
|
||||
struct ath9k_platform_data *pdata;
|
||||
|
||||
pdata = (struct ath9k_platform_data *) pdev->dev.platform_data;
|
||||
if (off >= (ARRAY_SIZE(pdata->eeprom_data))) {
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_FATAL,
|
||||
"%s: flash read failed, offset %08x is out of range\n",
|
||||
__func__, off);
|
||||
return false;
|
||||
}
|
||||
|
||||
*data = pdata->eeprom_data[off];
|
||||
return true;
|
||||
}
|
||||
|
||||
static struct ath_bus_ops ath_ahb_bus_ops = {
|
||||
.read_cachesize = ath_ahb_read_cachesize,
|
||||
.cleanup = ath_ahb_cleanup,
|
||||
|
||||
.eeprom_read = ath_ahb_eeprom_read,
|
||||
};
|
||||
|
||||
static int ath_ahb_probe(struct platform_device *pdev)
|
||||
{
|
||||
void __iomem *mem;
|
||||
struct ath_softc *sc;
|
||||
struct ieee80211_hw *hw;
|
||||
struct resource *res;
|
||||
int irq;
|
||||
int ret = 0;
|
||||
struct ath_hal *ah;
|
||||
|
||||
if (!pdev->dev.platform_data) {
|
||||
dev_err(&pdev->dev, "no platform data specified\n");
|
||||
ret = -EINVAL;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (res == NULL) {
|
||||
dev_err(&pdev->dev, "no memory resource found\n");
|
||||
ret = -ENXIO;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
mem = ioremap_nocache(res->start, res->end - res->start + 1);
|
||||
if (mem == NULL) {
|
||||
dev_err(&pdev->dev, "ioremap failed\n");
|
||||
ret = -ENOMEM;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
||||
if (res == NULL) {
|
||||
dev_err(&pdev->dev, "no IRQ resource found\n");
|
||||
ret = -ENXIO;
|
||||
goto err_iounmap;
|
||||
}
|
||||
|
||||
irq = res->start;
|
||||
|
||||
hw = ieee80211_alloc_hw(sizeof(struct ath_softc), &ath9k_ops);
|
||||
if (hw == NULL) {
|
||||
dev_err(&pdev->dev, "no memory for ieee80211_hw\n");
|
||||
ret = -ENOMEM;
|
||||
goto err_iounmap;
|
||||
}
|
||||
|
||||
SET_IEEE80211_DEV(hw, &pdev->dev);
|
||||
platform_set_drvdata(pdev, hw);
|
||||
|
||||
sc = hw->priv;
|
||||
sc->hw = hw;
|
||||
sc->dev = &pdev->dev;
|
||||
sc->mem = mem;
|
||||
sc->bus_ops = &ath_ahb_bus_ops;
|
||||
sc->irq = irq;
|
||||
|
||||
ret = ath_attach(AR5416_AR9100_DEVID, sc);
|
||||
if (ret != 0) {
|
||||
dev_err(&pdev->dev, "failed to attach device, err=%d\n", ret);
|
||||
ret = -ENODEV;
|
||||
goto err_free_hw;
|
||||
}
|
||||
|
||||
ret = request_irq(irq, ath_isr, IRQF_SHARED, "ath9k", sc);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "request_irq failed, err=%d\n", ret);
|
||||
ret = -EIO;
|
||||
goto err_detach;
|
||||
}
|
||||
|
||||
ah = sc->sc_ah;
|
||||
printk(KERN_INFO
|
||||
"%s: Atheros AR%s MAC/BB Rev:%x, "
|
||||
"AR%s RF Rev:%x, mem=0x%lx, irq=%d\n",
|
||||
wiphy_name(hw->wiphy),
|
||||
ath_mac_bb_name(ah->ah_macVersion),
|
||||
ah->ah_macRev,
|
||||
ath_rf_name((ah->ah_analog5GhzRev & AR_RADIO_SREV_MAJOR)),
|
||||
ah->ah_phyRev,
|
||||
(unsigned long)mem, irq);
|
||||
|
||||
return 0;
|
||||
|
||||
err_detach:
|
||||
ath_detach(sc);
|
||||
err_free_hw:
|
||||
ieee80211_free_hw(hw);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
err_iounmap:
|
||||
iounmap(mem);
|
||||
err_out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ath_ahb_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct ieee80211_hw *hw = platform_get_drvdata(pdev);
|
||||
|
||||
if (hw) {
|
||||
struct ath_softc *sc = hw->priv;
|
||||
|
||||
ath_cleanup(sc);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver ath_ahb_driver = {
|
||||
.probe = ath_ahb_probe,
|
||||
.remove = ath_ahb_remove,
|
||||
.driver = {
|
||||
.name = "ath9k",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
int ath_ahb_init(void)
|
||||
{
|
||||
return platform_driver_register(&ath_ahb_driver);
|
||||
}
|
||||
|
||||
void ath_ahb_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&ath_ahb_driver);
|
||||
}
|
|
@ -279,9 +279,8 @@ static void ath9k_ani_restart(struct ath_hal *ah)
|
|||
static void ath9k_hw_ani_ofdm_err_trigger(struct ath_hal *ah)
|
||||
{
|
||||
struct ath_hal_5416 *ahp = AH5416(ah);
|
||||
struct ath9k_channel *chan = ah->ah_curchan;
|
||||
struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
|
||||
struct ar5416AniState *aniState;
|
||||
enum wireless_mode mode;
|
||||
int32_t rssi;
|
||||
|
||||
if (!DO_ANI(ah))
|
||||
|
@ -336,8 +335,7 @@ static void ath9k_hw_ani_ofdm_err_trigger(struct ath_hal *ah)
|
|||
aniState->firstepLevel + 1);
|
||||
return;
|
||||
} else {
|
||||
mode = ath9k_hw_chan2wmode(ah, chan);
|
||||
if (mode == ATH9K_MODE_11G || mode == ATH9K_MODE_11B) {
|
||||
if (conf->channel->band == IEEE80211_BAND_2GHZ) {
|
||||
if (!aniState->ofdmWeakSigDetectOff)
|
||||
ath9k_hw_ani_control(ah,
|
||||
ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
|
||||
|
@ -353,9 +351,8 @@ static void ath9k_hw_ani_ofdm_err_trigger(struct ath_hal *ah)
|
|||
static void ath9k_hw_ani_cck_err_trigger(struct ath_hal *ah)
|
||||
{
|
||||
struct ath_hal_5416 *ahp = AH5416(ah);
|
||||
struct ath9k_channel *chan = ah->ah_curchan;
|
||||
struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
|
||||
struct ar5416AniState *aniState;
|
||||
enum wireless_mode mode;
|
||||
int32_t rssi;
|
||||
|
||||
if (!DO_ANI(ah))
|
||||
|
@ -381,8 +378,7 @@ static void ath9k_hw_ani_cck_err_trigger(struct ath_hal *ah)
|
|||
ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL,
|
||||
aniState->firstepLevel + 1);
|
||||
} else {
|
||||
mode = ath9k_hw_chan2wmode(ah, chan);
|
||||
if (mode == ATH9K_MODE_11G || mode == ATH9K_MODE_11B) {
|
||||
if (conf->channel->band == IEEE80211_BAND_2GHZ) {
|
||||
if (aniState->firstepLevel > 0)
|
||||
ath9k_hw_ani_control(ah,
|
||||
ATH9K_ANI_FIRSTEP_LEVEL, 0);
|
||||
|
@ -555,6 +551,9 @@ void ath9k_hw_ani_monitor(struct ath_hal *ah,
|
|||
struct ar5416AniState *aniState;
|
||||
int32_t listenTime;
|
||||
|
||||
if (!DO_ANI(ah))
|
||||
return;
|
||||
|
||||
aniState = ahp->ah_curani;
|
||||
ahp->ah_stats.ast_nodestats = *stats;
|
||||
|
||||
|
@ -614,9 +613,6 @@ void ath9k_hw_ani_monitor(struct ath_hal *ah,
|
|||
aniState->cckPhyErrCount = cckPhyErrCnt;
|
||||
}
|
||||
|
||||
if (!DO_ANI(ah))
|
||||
return;
|
||||
|
||||
if (aniState->listenTime > 5 * ahp->ah_aniPeriod) {
|
||||
if (aniState->ofdmPhyErrCount <= aniState->listenTime *
|
||||
aniState->ofdmTrigLow / 1000 &&
|
||||
|
|
|
@ -198,6 +198,7 @@ enum ath9k_hw_caps {
|
|||
ATH9K_HW_CAP_AUTOSLEEP = BIT(19),
|
||||
ATH9K_HW_CAP_4KB_SPLITTRANS = BIT(20),
|
||||
ATH9K_HW_CAP_WOW_MATCHPATTERN_EXACT = BIT(21),
|
||||
ATH9K_HW_CAP_BT_COEX = BIT(22)
|
||||
};
|
||||
|
||||
enum ath9k_capability_type {
|
||||
|
@ -453,24 +454,15 @@ struct ath9k_11n_rate_series {
|
|||
CHANNEL_HT40MINUS)
|
||||
|
||||
struct ath9k_channel {
|
||||
struct ieee80211_channel *chan;
|
||||
u16 channel;
|
||||
u32 channelFlags;
|
||||
u8 privFlags;
|
||||
int8_t maxRegTxPower;
|
||||
int8_t maxTxPower;
|
||||
int8_t minTxPower;
|
||||
u32 chanmode;
|
||||
int32_t CalValid;
|
||||
bool oneTimeCalsDone;
|
||||
int8_t iCoff;
|
||||
int8_t qCoff;
|
||||
int16_t rawNoiseFloor;
|
||||
int8_t antennaMax;
|
||||
u32 regDmnFlags;
|
||||
u32 conformanceTestLimit[3]; /* 0:11a, 1: 11b, 2:11g */
|
||||
#ifdef ATH_NF_PER_CHAN
|
||||
struct ath9k_nfcal_hist nfCalHist[NUM_NF_READINGS];
|
||||
#endif
|
||||
};
|
||||
|
||||
#define IS_CHAN_A(_c) ((((_c)->channelFlags & CHANNEL_A) == CHANNEL_A) || \
|
||||
|
@ -498,7 +490,6 @@ struct ath9k_channel {
|
|||
((_c)->chanmode == CHANNEL_G_HT40MINUS))
|
||||
#define IS_CHAN_HT(_c) (IS_CHAN_HT20((_c)) || IS_CHAN_HT40((_c)))
|
||||
|
||||
#define IS_CHAN_IN_PUBLIC_SAFETY_BAND(_c) ((_c) > 4940 && (_c) < 4990)
|
||||
#define IS_CHAN_A_5MHZ_SPACED(_c) \
|
||||
((((_c)->channelFlags & CHANNEL_5GHZ) != 0) && \
|
||||
(((_c)->channel % 20) != 0) && \
|
||||
|
@ -751,6 +742,7 @@ struct ath9k_node_stats {
|
|||
#define AR_GPIO_OUTPUT_MUX_AS_OUTPUT 0
|
||||
#define AR_GPIO_OUTPUT_MUX_AS_PCIE_ATTENTION_LED 1
|
||||
#define AR_GPIO_OUTPUT_MUX_AS_PCIE_POWER_LED 2
|
||||
#define AR_GPIO_OUTPUT_MUX_AS_TX_FRAME 3
|
||||
#define AR_GPIO_OUTPUT_MUX_AS_MAC_NETWORK_LED 5
|
||||
#define AR_GPIO_OUTPUT_MUX_AS_MAC_POWER_LED 6
|
||||
|
||||
|
@ -787,23 +779,24 @@ struct ath_hal {
|
|||
u16 ah_currentRD;
|
||||
u16 ah_currentRDExt;
|
||||
u16 ah_currentRDInUse;
|
||||
u16 ah_currentRD5G;
|
||||
u16 ah_currentRD2G;
|
||||
char ah_iso[4];
|
||||
char alpha2[2];
|
||||
struct reg_dmn_pair_mapping *regpair;
|
||||
enum ath9k_power_mode ah_power_mode;
|
||||
enum ath9k_power_mode ah_restore_mode;
|
||||
|
||||
struct ath9k_channel ah_channels[150];
|
||||
struct ath9k_channel ah_channels[38];
|
||||
struct ath9k_channel *ah_curchan;
|
||||
u32 ah_nchan;
|
||||
|
||||
bool ah_isPciExpress;
|
||||
u16 ah_txTrigLevel;
|
||||
u16 ah_rfsilent;
|
||||
u32 ah_rfkill_gpio;
|
||||
u32 ah_rfkill_polarity;
|
||||
|
||||
#ifndef ATH_NF_PER_CHAN
|
||||
u32 ah_btactive_gpio;
|
||||
u32 ah_wlanactive_gpio;
|
||||
struct ath9k_nfcal_hist nfCalHist[NUM_NF_READINGS];
|
||||
#endif
|
||||
|
||||
bool sw_mgmt_crypto;
|
||||
};
|
||||
|
||||
struct chan_centers {
|
||||
|
@ -816,8 +809,6 @@ struct ath_rate_table;
|
|||
|
||||
/* Helpers */
|
||||
|
||||
enum wireless_mode ath9k_hw_chan2wmode(struct ath_hal *ah,
|
||||
const struct ath9k_channel *chan);
|
||||
bool ath9k_hw_wait(struct ath_hal *ah, u32 reg, u32 mask, u32 val);
|
||||
u32 ath9k_hw_reverse_bits(u32 val, u32 n);
|
||||
bool ath9k_get_channel_edges(struct ath_hal *ah,
|
||||
|
@ -827,7 +818,6 @@ u16 ath9k_hw_computetxtime(struct ath_hal *ah,
|
|||
struct ath_rate_table *rates,
|
||||
u32 frameLen, u16 rateix,
|
||||
bool shortPreamble);
|
||||
u32 ath9k_hw_mhz2ieee(struct ath_hal *ah, u32 freq, u32 flags);
|
||||
void ath9k_hw_get_channel_centers(struct ath_hal *ah,
|
||||
struct ath9k_channel *chan,
|
||||
struct chan_centers *centers);
|
||||
|
@ -843,11 +833,8 @@ void ath9k_hw_rfdetach(struct ath_hal *ah);
|
|||
|
||||
/* HW Reset */
|
||||
|
||||
bool ath9k_hw_reset(struct ath_hal *ah, struct ath9k_channel *chan,
|
||||
enum ath9k_ht_macmode macmode,
|
||||
u8 txchainmask, u8 rxchainmask,
|
||||
enum ath9k_ht_extprotspacing extprotspacing,
|
||||
bool bChannelChange, int *status);
|
||||
int ath9k_hw_reset(struct ath_hal *ah, struct ath9k_channel *chan,
|
||||
bool bChannelChange);
|
||||
|
||||
/* Key Cache Management */
|
||||
|
||||
|
@ -887,7 +874,6 @@ void ath9k_hw_set_gpio(struct ath_hal *ah, u32 gpio, u32 val);
|
|||
#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
|
||||
void ath9k_enable_rfkill(struct ath_hal *ah);
|
||||
#endif
|
||||
int ath9k_hw_select_antconfig(struct ath_hal *ah, u32 cfg);
|
||||
u32 ath9k_hw_getdefantenna(struct ath_hal *ah);
|
||||
void ath9k_hw_setantenna(struct ath_hal *ah, u32 antenna);
|
||||
bool ath9k_hw_setantennaswitch(struct ath_hal *ah,
|
||||
|
@ -912,23 +898,25 @@ void ath9k_hw_getbssidmask(struct ath_hal *ah, u8 *mask);
|
|||
bool ath9k_hw_setbssidmask(struct ath_hal *ah, const u8 *mask);
|
||||
void ath9k_hw_write_associd(struct ath_hal *ah, const u8 *bssid, u16 assocId);
|
||||
u64 ath9k_hw_gettsf64(struct ath_hal *ah);
|
||||
void ath9k_hw_settsf64(struct ath_hal *ah, u64 tsf64);
|
||||
void ath9k_hw_reset_tsf(struct ath_hal *ah);
|
||||
bool ath9k_hw_set_tsfadjust(struct ath_hal *ah, u32 setting);
|
||||
bool ath9k_hw_setslottime(struct ath_hal *ah, u32 us);
|
||||
void ath9k_hw_set11nmac2040(struct ath_hal *ah, enum ath9k_ht_macmode mode);
|
||||
|
||||
/* Regulatory */
|
||||
u16 ath9k_regd_get_rd(struct ath_hal *ah);
|
||||
bool ath9k_is_world_regd(struct ath_hal *ah);
|
||||
const struct ieee80211_regdomain *ath9k_world_regdomain(struct ath_hal *ah);
|
||||
const struct ieee80211_regdomain *ath9k_default_world_regdomain(void);
|
||||
|
||||
bool ath9k_regd_is_public_safety_sku(struct ath_hal *ah);
|
||||
struct ath9k_channel* ath9k_regd_check_channel(struct ath_hal *ah,
|
||||
const struct ath9k_channel *c);
|
||||
void ath9k_reg_apply_world_flags(struct wiphy *wiphy, enum reg_set_by setby);
|
||||
void ath9k_reg_apply_radar_flags(struct wiphy *wiphy);
|
||||
|
||||
int ath9k_regd_init(struct ath_hal *ah);
|
||||
bool ath9k_regd_is_eeprom_valid(struct ath_hal *ah);
|
||||
u32 ath9k_regd_get_ctl(struct ath_hal *ah, struct ath9k_channel *chan);
|
||||
u32 ath9k_regd_get_antenna_allowed(struct ath_hal *ah,
|
||||
struct ath9k_channel *chan);
|
||||
bool ath9k_regd_init_channels(struct ath_hal *ah,
|
||||
u32 maxchans, u32 *nchans, u8 *regclassids,
|
||||
u32 maxregids, u32 *nregids, u16 cc,
|
||||
bool enableOutdoor, bool enableExtendedChannels);
|
||||
int ath9k_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request);
|
||||
|
||||
/* ANI */
|
||||
|
||||
|
@ -951,8 +939,7 @@ void ath9k_hw_ani_detach(struct ath_hal *ah);
|
|||
|
||||
/* Calibration */
|
||||
|
||||
void ath9k_hw_reset_calvalid(struct ath_hal *ah, struct ath9k_channel *chan,
|
||||
bool *isCalDone);
|
||||
bool ath9k_hw_reset_calvalid(struct ath_hal *ah);
|
||||
void ath9k_hw_start_nfcal(struct ath_hal *ah);
|
||||
void ath9k_hw_loadnf(struct ath_hal *ah, struct ath9k_channel *chan);
|
||||
int16_t ath9k_hw_getnf(struct ath_hal *ah,
|
||||
|
@ -987,9 +974,8 @@ bool ath9k_hw_set_power_cal_table(struct ath_hal *ah,
|
|||
int16_t *pTxPowerIndexOffset);
|
||||
bool ath9k_hw_eeprom_set_board_values(struct ath_hal *ah,
|
||||
struct ath9k_channel *chan);
|
||||
int ath9k_hw_get_eeprom_antenna_cfg(struct ath_hal *ah,
|
||||
struct ath9k_channel *chan,
|
||||
u8 index, u16 *config);
|
||||
u16 ath9k_hw_get_eeprom_antenna_cfg(struct ath_hal *ah,
|
||||
struct ath9k_channel *chan);
|
||||
u8 ath9k_hw_get_num_ant_config(struct ath_hal *ah,
|
||||
enum ieee80211_band freq_band);
|
||||
u16 ath9k_hw_eeprom_get_spur_chan(struct ath_hal *ah, u16 i, bool is2GHz);
|
||||
|
@ -1053,5 +1039,6 @@ void ath9k_hw_rxena(struct ath_hal *ah);
|
|||
void ath9k_hw_startpcureceive(struct ath_hal *ah);
|
||||
void ath9k_hw_stoppcurecv(struct ath_hal *ah);
|
||||
bool ath9k_hw_stopdmarecv(struct ath_hal *ah);
|
||||
void ath9k_hw_btcoex_enable(struct ath_hal *ah);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -164,9 +164,9 @@ static struct ath_buf *ath_beacon_generate(struct ath_softc *sc, int if_id)
|
|||
bf = avp->av_bcbuf;
|
||||
skb = (struct sk_buff *)bf->bf_mpdu;
|
||||
if (skb) {
|
||||
pci_unmap_single(sc->pdev, bf->bf_dmacontext,
|
||||
dma_unmap_single(sc->dev, bf->bf_dmacontext,
|
||||
skb->len,
|
||||
PCI_DMA_TODEVICE);
|
||||
DMA_TO_DEVICE);
|
||||
dev_kfree_skb_any(skb);
|
||||
}
|
||||
|
||||
|
@ -188,14 +188,14 @@ static struct ath_buf *ath_beacon_generate(struct ath_softc *sc, int if_id)
|
|||
}
|
||||
|
||||
bf->bf_buf_addr = bf->bf_dmacontext =
|
||||
pci_map_single(sc->pdev, skb->data,
|
||||
dma_map_single(sc->dev, skb->data,
|
||||
skb->len,
|
||||
PCI_DMA_TODEVICE);
|
||||
if (unlikely(pci_dma_mapping_error(sc->pdev, bf->bf_buf_addr))) {
|
||||
DMA_TO_DEVICE);
|
||||
if (unlikely(dma_mapping_error(sc->dev, bf->bf_buf_addr))) {
|
||||
dev_kfree_skb_any(skb);
|
||||
bf->bf_mpdu = NULL;
|
||||
DPRINTF(sc, ATH_DBG_CONFIG,
|
||||
"pci_dma_mapping_error() on beaconing\n");
|
||||
"dma_mapping_error() on beaconing\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -220,7 +220,7 @@ static struct ath_buf *ath_beacon_generate(struct ath_softc *sc, int if_id)
|
|||
* acquires txq lock inside.
|
||||
*/
|
||||
if (sc->sc_nvaps > 1) {
|
||||
ath_tx_draintxq(sc, cabq, false);
|
||||
ath_draintxq(sc, cabq, false);
|
||||
DPRINTF(sc, ATH_DBG_BEACON,
|
||||
"flush previous cabq traffic\n");
|
||||
}
|
||||
|
@ -343,9 +343,9 @@ int ath_beacon_alloc(struct ath_softc *sc, int if_id)
|
|||
bf = avp->av_bcbuf;
|
||||
if (bf->bf_mpdu != NULL) {
|
||||
skb = (struct sk_buff *)bf->bf_mpdu;
|
||||
pci_unmap_single(sc->pdev, bf->bf_dmacontext,
|
||||
dma_unmap_single(sc->dev, bf->bf_dmacontext,
|
||||
skb->len,
|
||||
PCI_DMA_TODEVICE);
|
||||
DMA_TO_DEVICE);
|
||||
dev_kfree_skb_any(skb);
|
||||
bf->bf_mpdu = NULL;
|
||||
}
|
||||
|
@ -402,14 +402,14 @@ int ath_beacon_alloc(struct ath_softc *sc, int if_id)
|
|||
|
||||
bf->bf_mpdu = skb;
|
||||
bf->bf_buf_addr = bf->bf_dmacontext =
|
||||
pci_map_single(sc->pdev, skb->data,
|
||||
dma_map_single(sc->dev, skb->data,
|
||||
skb->len,
|
||||
PCI_DMA_TODEVICE);
|
||||
if (unlikely(pci_dma_mapping_error(sc->pdev, bf->bf_buf_addr))) {
|
||||
DMA_TO_DEVICE);
|
||||
if (unlikely(dma_mapping_error(sc->dev, bf->bf_buf_addr))) {
|
||||
dev_kfree_skb_any(skb);
|
||||
bf->bf_mpdu = NULL;
|
||||
DPRINTF(sc, ATH_DBG_CONFIG,
|
||||
"pci_dma_mapping_error() on beacon alloc\n");
|
||||
"dma_mapping_error() on beacon alloc\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -429,9 +429,9 @@ void ath_beacon_return(struct ath_softc *sc, struct ath_vap *avp)
|
|||
bf = avp->av_bcbuf;
|
||||
if (bf->bf_mpdu != NULL) {
|
||||
struct sk_buff *skb = (struct sk_buff *)bf->bf_mpdu;
|
||||
pci_unmap_single(sc->pdev, bf->bf_dmacontext,
|
||||
dma_unmap_single(sc->dev, bf->bf_dmacontext,
|
||||
skb->len,
|
||||
PCI_DMA_TODEVICE);
|
||||
DMA_TO_DEVICE);
|
||||
dev_kfree_skb_any(skb);
|
||||
bf->bf_mpdu = NULL;
|
||||
}
|
||||
|
|
|
@ -19,8 +19,6 @@
|
|||
#include "reg.h"
|
||||
#include "phy.h"
|
||||
|
||||
static const int16_t NOISE_FLOOR[] = { -96, -93, -98, -96, -93, -96 };
|
||||
|
||||
/* We can tune this as we go by monitoring really low values */
|
||||
#define ATH9K_NF_TOO_LOW -60
|
||||
|
||||
|
@ -107,27 +105,29 @@ static void ath9k_hw_do_getnf(struct ath_hal *ah,
|
|||
"NF calibrated [ctl] [chain 0] is %d\n", nf);
|
||||
nfarray[0] = nf;
|
||||
|
||||
if (AR_SREV_9280_10_OR_LATER(ah))
|
||||
nf = MS(REG_READ(ah, AR_PHY_CH1_CCA),
|
||||
AR9280_PHY_CH1_MINCCA_PWR);
|
||||
else
|
||||
nf = MS(REG_READ(ah, AR_PHY_CH1_CCA),
|
||||
AR_PHY_CH1_MINCCA_PWR);
|
||||
if (!AR_SREV_9285(ah)) {
|
||||
if (AR_SREV_9280_10_OR_LATER(ah))
|
||||
nf = MS(REG_READ(ah, AR_PHY_CH1_CCA),
|
||||
AR9280_PHY_CH1_MINCCA_PWR);
|
||||
else
|
||||
nf = MS(REG_READ(ah, AR_PHY_CH1_CCA),
|
||||
AR_PHY_CH1_MINCCA_PWR);
|
||||
|
||||
if (nf & 0x100)
|
||||
nf = 0 - ((nf ^ 0x1ff) + 1);
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
|
||||
"NF calibrated [ctl] [chain 1] is %d\n", nf);
|
||||
nfarray[1] = nf;
|
||||
|
||||
if (!AR_SREV_9280(ah)) {
|
||||
nf = MS(REG_READ(ah, AR_PHY_CH2_CCA),
|
||||
AR_PHY_CH2_MINCCA_PWR);
|
||||
if (nf & 0x100)
|
||||
nf = 0 - ((nf ^ 0x1ff) + 1);
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
|
||||
"NF calibrated [ctl] [chain 2] is %d\n", nf);
|
||||
nfarray[2] = nf;
|
||||
"NF calibrated [ctl] [chain 1] is %d\n", nf);
|
||||
nfarray[1] = nf;
|
||||
|
||||
if (!AR_SREV_9280(ah)) {
|
||||
nf = MS(REG_READ(ah, AR_PHY_CH2_CCA),
|
||||
AR_PHY_CH2_MINCCA_PWR);
|
||||
if (nf & 0x100)
|
||||
nf = 0 - ((nf ^ 0x1ff) + 1);
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
|
||||
"NF calibrated [ctl] [chain 2] is %d\n", nf);
|
||||
nfarray[2] = nf;
|
||||
}
|
||||
}
|
||||
|
||||
if (AR_SREV_9280_10_OR_LATER(ah))
|
||||
|
@ -143,51 +143,45 @@ static void ath9k_hw_do_getnf(struct ath_hal *ah,
|
|||
"NF calibrated [ext] [chain 0] is %d\n", nf);
|
||||
nfarray[3] = nf;
|
||||
|
||||
if (AR_SREV_9280_10_OR_LATER(ah))
|
||||
nf = MS(REG_READ(ah, AR_PHY_CH1_EXT_CCA),
|
||||
AR9280_PHY_CH1_EXT_MINCCA_PWR);
|
||||
else
|
||||
nf = MS(REG_READ(ah, AR_PHY_CH1_EXT_CCA),
|
||||
AR_PHY_CH1_EXT_MINCCA_PWR);
|
||||
if (!AR_SREV_9285(ah)) {
|
||||
if (AR_SREV_9280_10_OR_LATER(ah))
|
||||
nf = MS(REG_READ(ah, AR_PHY_CH1_EXT_CCA),
|
||||
AR9280_PHY_CH1_EXT_MINCCA_PWR);
|
||||
else
|
||||
nf = MS(REG_READ(ah, AR_PHY_CH1_EXT_CCA),
|
||||
AR_PHY_CH1_EXT_MINCCA_PWR);
|
||||
|
||||
if (nf & 0x100)
|
||||
nf = 0 - ((nf ^ 0x1ff) + 1);
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
|
||||
"NF calibrated [ext] [chain 1] is %d\n", nf);
|
||||
nfarray[4] = nf;
|
||||
|
||||
if (!AR_SREV_9280(ah)) {
|
||||
nf = MS(REG_READ(ah, AR_PHY_CH2_EXT_CCA),
|
||||
AR_PHY_CH2_EXT_MINCCA_PWR);
|
||||
if (nf & 0x100)
|
||||
nf = 0 - ((nf ^ 0x1ff) + 1);
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
|
||||
"NF calibrated [ext] [chain 2] is %d\n", nf);
|
||||
nfarray[5] = nf;
|
||||
"NF calibrated [ext] [chain 1] is %d\n", nf);
|
||||
nfarray[4] = nf;
|
||||
|
||||
if (!AR_SREV_9280(ah)) {
|
||||
nf = MS(REG_READ(ah, AR_PHY_CH2_EXT_CCA),
|
||||
AR_PHY_CH2_EXT_MINCCA_PWR);
|
||||
if (nf & 0x100)
|
||||
nf = 0 - ((nf ^ 0x1ff) + 1);
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
|
||||
"NF calibrated [ext] [chain 2] is %d\n", nf);
|
||||
nfarray[5] = nf;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static bool getNoiseFloorThresh(struct ath_hal *ah,
|
||||
const struct ath9k_channel *chan,
|
||||
enum ieee80211_band band,
|
||||
int16_t *nft)
|
||||
{
|
||||
switch (chan->chanmode) {
|
||||
case CHANNEL_A:
|
||||
case CHANNEL_A_HT20:
|
||||
case CHANNEL_A_HT40PLUS:
|
||||
case CHANNEL_A_HT40MINUS:
|
||||
switch (band) {
|
||||
case IEEE80211_BAND_5GHZ:
|
||||
*nft = (int8_t)ath9k_hw_get_eeprom(ah, EEP_NFTHRESH_5);
|
||||
break;
|
||||
case CHANNEL_B:
|
||||
case CHANNEL_G:
|
||||
case CHANNEL_G_HT20:
|
||||
case CHANNEL_G_HT40PLUS:
|
||||
case CHANNEL_G_HT40MINUS:
|
||||
case IEEE80211_BAND_2GHZ:
|
||||
*nft = (int8_t)ath9k_hw_get_eeprom(ah, EEP_NFTHRESH_2);
|
||||
break;
|
||||
default:
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_CHANNEL,
|
||||
"invalid channel flags 0x%x\n", chan->channelFlags);
|
||||
BUG_ON(1);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -285,27 +279,24 @@ static void ath9k_hw_per_calibration(struct ath_hal *ah,
|
|||
}
|
||||
}
|
||||
|
||||
/* Assumes you are talking about the currently configured channel */
|
||||
static bool ath9k_hw_iscal_supported(struct ath_hal *ah,
|
||||
struct ath9k_channel *chan,
|
||||
enum hal_cal_types calType)
|
||||
{
|
||||
struct ath_hal_5416 *ahp = AH5416(ah);
|
||||
bool retval = false;
|
||||
struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
|
||||
|
||||
switch (calType & ahp->ah_suppCals) {
|
||||
case IQ_MISMATCH_CAL:
|
||||
if (!IS_CHAN_B(chan))
|
||||
retval = true;
|
||||
break;
|
||||
case IQ_MISMATCH_CAL: /* Both 2 GHz and 5 GHz support OFDM */
|
||||
return true;
|
||||
case ADC_GAIN_CAL:
|
||||
case ADC_DC_CAL:
|
||||
if (!IS_CHAN_B(chan)
|
||||
&& !(IS_CHAN_2GHZ(chan) && IS_CHAN_HT20(chan)))
|
||||
retval = true;
|
||||
if (conf->channel->band == IEEE80211_BAND_5GHZ &&
|
||||
conf_is_ht20(conf))
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
|
||||
return retval;
|
||||
return false;
|
||||
}
|
||||
|
||||
static void ath9k_hw_iqcal_collect(struct ath_hal *ah)
|
||||
|
@ -573,50 +564,40 @@ static void ath9k_hw_adc_dccal_calibrate(struct ath_hal *ah, u8 numChains)
|
|||
AR_PHY_NEW_ADC_DC_OFFSET_CORR_ENABLE);
|
||||
}
|
||||
|
||||
void ath9k_hw_reset_calvalid(struct ath_hal *ah, struct ath9k_channel *chan,
|
||||
bool *isCalDone)
|
||||
/* This is done for the currently configured channel */
|
||||
bool ath9k_hw_reset_calvalid(struct ath_hal *ah)
|
||||
{
|
||||
struct ath_hal_5416 *ahp = AH5416(ah);
|
||||
struct ath9k_channel *ichan =
|
||||
ath9k_regd_check_channel(ah, chan);
|
||||
struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
|
||||
struct hal_cal_list *currCal = ahp->ah_cal_list_curr;
|
||||
|
||||
*isCalDone = true;
|
||||
if (!ah->ah_curchan)
|
||||
return true;
|
||||
|
||||
if (!AR_SREV_9100(ah) && !AR_SREV_9160_10_OR_LATER(ah))
|
||||
return;
|
||||
return true;
|
||||
|
||||
if (currCal == NULL)
|
||||
return;
|
||||
|
||||
if (ichan == NULL) {
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
|
||||
"invalid channel %u/0x%x; no mapping\n",
|
||||
chan->channel, chan->channelFlags);
|
||||
return;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
if (currCal->calState != CAL_DONE) {
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
|
||||
"Calibration state incorrect, %d\n",
|
||||
currCal->calState);
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
if (!ath9k_hw_iscal_supported(ah, chan, currCal->calData->calType))
|
||||
return;
|
||||
if (!ath9k_hw_iscal_supported(ah, currCal->calData->calType))
|
||||
return true;
|
||||
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
|
||||
"Resetting Cal %d state for channel %u/0x%x\n",
|
||||
currCal->calData->calType, chan->channel,
|
||||
chan->channelFlags);
|
||||
"Resetting Cal %d state for channel %u\n",
|
||||
currCal->calData->calType, conf->channel->center_freq);
|
||||
|
||||
ichan->CalValid &= ~currCal->calData->calType;
|
||||
ah->ah_curchan->CalValid &= ~currCal->calData->calType;
|
||||
currCal->calState = CAL_WAITING;
|
||||
|
||||
*isCalDone = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
void ath9k_hw_start_nfcal(struct ath_hal *ah)
|
||||
|
@ -643,16 +624,14 @@ void ath9k_hw_loadnf(struct ath_hal *ah, struct ath9k_channel *chan)
|
|||
};
|
||||
u8 chainmask;
|
||||
|
||||
if (AR_SREV_9280(ah))
|
||||
if (AR_SREV_9285(ah))
|
||||
chainmask = 0x9;
|
||||
else if (AR_SREV_9280(ah))
|
||||
chainmask = 0x1B;
|
||||
else
|
||||
chainmask = 0x3F;
|
||||
|
||||
#ifdef ATH_NF_PER_CHAN
|
||||
h = chan->nfCalHist;
|
||||
#else
|
||||
h = ah->nfCalHist;
|
||||
#endif
|
||||
|
||||
for (i = 0; i < NUM_NF_READINGS; i++) {
|
||||
if (chainmask & (1 << i)) {
|
||||
|
@ -692,12 +671,7 @@ int16_t ath9k_hw_getnf(struct ath_hal *ah,
|
|||
int16_t nf, nfThresh;
|
||||
int16_t nfarray[NUM_NF_READINGS] = { 0 };
|
||||
struct ath9k_nfcal_hist *h;
|
||||
u8 chainmask;
|
||||
|
||||
if (AR_SREV_9280(ah))
|
||||
chainmask = 0x1B;
|
||||
else
|
||||
chainmask = 0x3F;
|
||||
struct ieee80211_channel *c = chan->chan;
|
||||
|
||||
chan->channelFlags &= (~CHANNEL_CW_INT);
|
||||
if (REG_READ(ah, AR_PHY_AGC_CONTROL) & AR_PHY_AGC_CONTROL_NF) {
|
||||
|
@ -709,7 +683,7 @@ int16_t ath9k_hw_getnf(struct ath_hal *ah,
|
|||
} else {
|
||||
ath9k_hw_do_getnf(ah, nfarray);
|
||||
nf = nfarray[0];
|
||||
if (getNoiseFloorThresh(ah, chan, &nfThresh)
|
||||
if (getNoiseFloorThresh(ah, c->band, &nfThresh)
|
||||
&& nf > nfThresh) {
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
|
||||
"noise floor failed detected; "
|
||||
|
@ -719,11 +693,7 @@ int16_t ath9k_hw_getnf(struct ath_hal *ah,
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef ATH_NF_PER_CHAN
|
||||
h = chan->nfCalHist;
|
||||
#else
|
||||
h = ah->nfCalHist;
|
||||
#endif
|
||||
|
||||
ath9k_hw_update_nfcal_hist_buffer(h, nfarray);
|
||||
chan->rawNoiseFloor = h[0].privNF;
|
||||
|
@ -750,21 +720,12 @@ void ath9k_init_nfcal_hist_buffer(struct ath_hal *ah)
|
|||
|
||||
s16 ath9k_hw_getchan_noise(struct ath_hal *ah, struct ath9k_channel *chan)
|
||||
{
|
||||
struct ath9k_channel *ichan;
|
||||
s16 nf;
|
||||
|
||||
ichan = ath9k_regd_check_channel(ah, chan);
|
||||
if (ichan == NULL) {
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
|
||||
"invalid channel %u/0x%x; no mapping\n",
|
||||
chan->channel, chan->channelFlags);
|
||||
return ATH_DEFAULT_NOISE_FLOOR;
|
||||
}
|
||||
if (ichan->rawNoiseFloor == 0) {
|
||||
enum wireless_mode mode = ath9k_hw_chan2wmode(ah, chan);
|
||||
nf = NOISE_FLOOR[mode];
|
||||
} else
|
||||
nf = ichan->rawNoiseFloor;
|
||||
if (chan->rawNoiseFloor == 0)
|
||||
nf = -96;
|
||||
else
|
||||
nf = chan->rawNoiseFloor;
|
||||
|
||||
if (!ath9k_hw_nf_in_range(ah, nf))
|
||||
nf = ATH_DEFAULT_NOISE_FLOOR;
|
||||
|
@ -778,21 +739,13 @@ bool ath9k_hw_calibrate(struct ath_hal *ah, struct ath9k_channel *chan,
|
|||
{
|
||||
struct ath_hal_5416 *ahp = AH5416(ah);
|
||||
struct hal_cal_list *currCal = ahp->ah_cal_list_curr;
|
||||
struct ath9k_channel *ichan = ath9k_regd_check_channel(ah, chan);
|
||||
|
||||
*isCalDone = true;
|
||||
|
||||
if (ichan == NULL) {
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_CHANNEL,
|
||||
"invalid channel %u/0x%x; no mapping\n",
|
||||
chan->channel, chan->channelFlags);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (currCal &&
|
||||
(currCal->calState == CAL_RUNNING ||
|
||||
currCal->calState == CAL_WAITING)) {
|
||||
ath9k_hw_per_calibration(ah, ichan, rxchainmask, currCal,
|
||||
ath9k_hw_per_calibration(ah, chan, rxchainmask, currCal,
|
||||
isCalDone);
|
||||
if (*isCalDone) {
|
||||
ahp->ah_cal_list_curr = currCal = currCal->calNext;
|
||||
|
@ -805,14 +758,12 @@ bool ath9k_hw_calibrate(struct ath_hal *ah, struct ath9k_channel *chan,
|
|||
}
|
||||
|
||||
if (longcal) {
|
||||
ath9k_hw_getnf(ah, ichan);
|
||||
ath9k_hw_getnf(ah, chan);
|
||||
ath9k_hw_loadnf(ah, ah->ah_curchan);
|
||||
ath9k_hw_start_nfcal(ah);
|
||||
|
||||
if ((ichan->channelFlags & CHANNEL_CW_INT) != 0) {
|
||||
chan->channelFlags |= CHANNEL_CW_INT;
|
||||
ichan->channelFlags &= ~CHANNEL_CW_INT;
|
||||
}
|
||||
if (chan->channelFlags & CHANNEL_CW_INT)
|
||||
chan->channelFlags &= ~CHANNEL_CW_INT;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -917,7 +868,6 @@ bool ath9k_hw_init_cal(struct ath_hal *ah,
|
|||
struct ath9k_channel *chan)
|
||||
{
|
||||
struct ath_hal_5416 *ahp = AH5416(ah);
|
||||
struct ath9k_channel *ichan = ath9k_regd_check_channel(ah, chan);
|
||||
|
||||
REG_WRITE(ah, AR_PHY_AGC_CONTROL,
|
||||
REG_READ(ah, AR_PHY_AGC_CONTROL) |
|
||||
|
@ -940,19 +890,19 @@ bool ath9k_hw_init_cal(struct ath_hal *ah,
|
|||
ahp->ah_cal_list = ahp->ah_cal_list_last = ahp->ah_cal_list_curr = NULL;
|
||||
|
||||
if (AR_SREV_9100(ah) || AR_SREV_9160_10_OR_LATER(ah)) {
|
||||
if (ath9k_hw_iscal_supported(ah, chan, ADC_GAIN_CAL)) {
|
||||
if (ath9k_hw_iscal_supported(ah, ADC_GAIN_CAL)) {
|
||||
INIT_CAL(&ahp->ah_adcGainCalData);
|
||||
INSERT_CAL(ahp, &ahp->ah_adcGainCalData);
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
|
||||
"enabling ADC Gain Calibration.\n");
|
||||
}
|
||||
if (ath9k_hw_iscal_supported(ah, chan, ADC_DC_CAL)) {
|
||||
if (ath9k_hw_iscal_supported(ah, ADC_DC_CAL)) {
|
||||
INIT_CAL(&ahp->ah_adcDcCalData);
|
||||
INSERT_CAL(ahp, &ahp->ah_adcDcCalData);
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
|
||||
"enabling ADC DC Calibration.\n");
|
||||
}
|
||||
if (ath9k_hw_iscal_supported(ah, chan, IQ_MISMATCH_CAL)) {
|
||||
if (ath9k_hw_iscal_supported(ah, IQ_MISMATCH_CAL)) {
|
||||
INIT_CAL(&ahp->ah_iqCalData);
|
||||
INSERT_CAL(ahp, &ahp->ah_iqCalData);
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
|
||||
|
@ -965,7 +915,7 @@ bool ath9k_hw_init_cal(struct ath_hal *ah,
|
|||
ath9k_hw_reset_calibration(ah, ahp->ah_cal_list_curr);
|
||||
}
|
||||
|
||||
ichan->CalValid = 0;
|
||||
chan->CalValid = 0;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#define CORE_H
|
||||
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/device.h>
|
||||
#include <net/mac80211.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/rfkill.h>
|
||||
|
@ -187,7 +187,6 @@ struct ath_config {
|
|||
#define ATH_TXBUF_RESET(_bf) do { \
|
||||
(_bf)->bf_status = 0; \
|
||||
(_bf)->bf_lastbf = NULL; \
|
||||
(_bf)->bf_lastfrm = NULL; \
|
||||
(_bf)->bf_next = NULL; \
|
||||
memset(&((_bf)->bf_state), 0, \
|
||||
sizeof(struct ath_buf_state)); \
|
||||
|
@ -245,10 +244,8 @@ struct ath_buf_state {
|
|||
*/
|
||||
struct ath_buf {
|
||||
struct list_head list;
|
||||
struct list_head *last;
|
||||
struct ath_buf *bf_lastbf; /* last buf of this unit (a frame or
|
||||
an aggregate) */
|
||||
struct ath_buf *bf_lastfrm; /* last buf of this frame */
|
||||
struct ath_buf *bf_next; /* next subframe in the aggregate */
|
||||
void *bf_mpdu; /* enclosing frame structure */
|
||||
struct ath_desc *bf_desc; /* virtual addr of desc */
|
||||
|
@ -261,13 +258,7 @@ struct ath_buf {
|
|||
};
|
||||
|
||||
#define ATH_RXBUF_RESET(_bf) ((_bf)->bf_status = 0)
|
||||
|
||||
/* hw processing complete, desc processed by hal */
|
||||
#define ATH_BUFSTATUS_DONE 0x00000001
|
||||
/* hw processing complete, desc hold for hw */
|
||||
#define ATH_BUFSTATUS_STALE 0x00000002
|
||||
/* Rx-only: OS is done with this packet and it's ok to queued it to hw */
|
||||
#define ATH_BUFSTATUS_FREE 0x00000004
|
||||
|
||||
/* DMA state for tx/rx descriptors */
|
||||
|
||||
|
@ -360,7 +351,6 @@ struct ath_txq {
|
|||
u32 *axq_link; /* link ptr in last TX desc */
|
||||
struct list_head axq_q; /* transmit queue */
|
||||
spinlock_t axq_lock;
|
||||
unsigned long axq_lockflags; /* intr state when must cli */
|
||||
u32 axq_depth; /* queue depth */
|
||||
u8 axq_aggr_depth; /* aggregates queued */
|
||||
u32 axq_totalqueued; /* total ever queued */
|
||||
|
@ -485,28 +475,22 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush);
|
|||
struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype);
|
||||
void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq);
|
||||
int ath_tx_setup(struct ath_softc *sc, int haltype);
|
||||
void ath_draintxq(struct ath_softc *sc, bool retry_tx);
|
||||
void ath_tx_draintxq(struct ath_softc *sc,
|
||||
void ath_drain_all_txq(struct ath_softc *sc, bool retry_tx);
|
||||
void ath_draintxq(struct ath_softc *sc,
|
||||
struct ath_txq *txq, bool retry_tx);
|
||||
void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an);
|
||||
void ath_tx_node_cleanup(struct ath_softc *sc, struct ath_node *an);
|
||||
void ath_tx_node_free(struct ath_softc *sc, struct ath_node *an);
|
||||
void ath_txq_schedule(struct ath_softc *sc, struct ath_txq *txq);
|
||||
int ath_tx_init(struct ath_softc *sc, int nbufs);
|
||||
int ath_tx_cleanup(struct ath_softc *sc);
|
||||
int ath_tx_get_qnum(struct ath_softc *sc, int qtype, int haltype);
|
||||
struct ath_txq *ath_test_get_txq(struct ath_softc *sc, struct sk_buff *skb);
|
||||
int ath_txq_update(struct ath_softc *sc, int qnum,
|
||||
struct ath9k_tx_queue_info *q);
|
||||
int ath_tx_start(struct ath_softc *sc, struct sk_buff *skb,
|
||||
struct ath_tx_control *txctl);
|
||||
void ath_tx_tasklet(struct ath_softc *sc);
|
||||
u32 ath_txq_depth(struct ath_softc *sc, int qnum);
|
||||
u32 ath_txq_aggr_depth(struct ath_softc *sc, int qnum);
|
||||
void ath_tx_cabq(struct ath_softc *sc, struct sk_buff *skb);
|
||||
void ath_tx_resume_tid(struct ath_softc *sc, struct ath_atx_tid *tid);
|
||||
bool ath_tx_aggr_check(struct ath_softc *sc, struct ath_node *an, u8 tidno);
|
||||
void ath_tx_aggr_teardown(struct ath_softc *sc, struct ath_node *an, u8 tidno);
|
||||
int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
|
||||
u16 tid, u16 *ssn);
|
||||
int ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid);
|
||||
|
@ -692,14 +676,22 @@ enum PROT_MODE {
|
|||
#define SC_OP_RFKILL_REGISTERED BIT(11)
|
||||
#define SC_OP_RFKILL_SW_BLOCKED BIT(12)
|
||||
#define SC_OP_RFKILL_HW_BLOCKED BIT(13)
|
||||
#define SC_OP_WAIT_FOR_BEACON BIT(14)
|
||||
|
||||
struct ath_bus_ops {
|
||||
void (*read_cachesize)(struct ath_softc *sc, int *csz);
|
||||
void (*cleanup)(struct ath_softc *sc);
|
||||
bool (*eeprom_read)(struct ath_hal *ah, u32 off, u16 *data);
|
||||
};
|
||||
|
||||
struct ath_softc {
|
||||
struct ieee80211_hw *hw;
|
||||
struct pci_dev *pdev;
|
||||
struct device *dev;
|
||||
struct tasklet_struct intr_tq;
|
||||
struct tasklet_struct bcon_tasklet;
|
||||
struct ath_hal *sc_ah;
|
||||
void __iomem *mem;
|
||||
int irq;
|
||||
spinlock_t sc_resetlock;
|
||||
struct mutex mutex;
|
||||
|
||||
|
@ -718,7 +710,7 @@ struct ath_softc {
|
|||
u32 sc_keymax;
|
||||
DECLARE_BITMAP(sc_keymap, ATH_KEYMAX);
|
||||
u8 sc_splitmic;
|
||||
u8 sc_protrix;
|
||||
atomic_t ps_usecount;
|
||||
enum ath9k_int sc_imask;
|
||||
enum PROT_MODE sc_protmode;
|
||||
enum ath9k_ht_extprotspacing sc_ht_extprotspacing;
|
||||
|
@ -732,7 +724,6 @@ struct ath_softc {
|
|||
struct ieee80211_rate rates[IEEE80211_NUM_BANDS][ATH_RATE_MAX];
|
||||
struct ath_rate_table *hw_rate_table[ATH9K_MODE_MAX];
|
||||
struct ath_rate_table *cur_rate_table;
|
||||
struct ieee80211_channel channels[IEEE80211_NUM_BANDS][ATH_CHAN_MAX];
|
||||
struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
|
||||
struct ath_led radio_led;
|
||||
struct ath_led assoc_led;
|
||||
|
@ -744,6 +735,7 @@ struct ath_softc {
|
|||
#ifdef CONFIG_ATH9K_DEBUG
|
||||
struct ath9k_debug sc_debug;
|
||||
#endif
|
||||
struct ath_bus_ops *bus_ops;
|
||||
};
|
||||
|
||||
int ath_reset(struct ath_softc *sc, bool retry_tx);
|
||||
|
@ -751,4 +743,55 @@ int ath_get_hal_qnum(u16 queue, struct ath_softc *sc);
|
|||
int ath_get_mac80211_qnum(u32 queue, struct ath_softc *sc);
|
||||
int ath_cabq_update(struct ath_softc *);
|
||||
|
||||
static inline void ath_read_cachesize(struct ath_softc *sc, int *csz)
|
||||
{
|
||||
sc->bus_ops->read_cachesize(sc, csz);
|
||||
}
|
||||
|
||||
static inline void ath_bus_cleanup(struct ath_softc *sc)
|
||||
{
|
||||
sc->bus_ops->cleanup(sc);
|
||||
}
|
||||
|
||||
extern struct ieee80211_ops ath9k_ops;
|
||||
|
||||
irqreturn_t ath_isr(int irq, void *dev);
|
||||
void ath_cleanup(struct ath_softc *sc);
|
||||
int ath_attach(u16 devid, struct ath_softc *sc);
|
||||
void ath_detach(struct ath_softc *sc);
|
||||
const char *ath_mac_bb_name(u32 mac_bb_version);
|
||||
const char *ath_rf_name(u16 rf_version);
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
int ath_pci_init(void);
|
||||
void ath_pci_exit(void);
|
||||
#else
|
||||
static inline int ath_pci_init(void) { return 0; };
|
||||
static inline void ath_pci_exit(void) {};
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ATHEROS_AR71XX
|
||||
int ath_ahb_init(void);
|
||||
void ath_ahb_exit(void);
|
||||
#else
|
||||
static inline int ath_ahb_init(void) { return 0; };
|
||||
static inline void ath_ahb_exit(void) {};
|
||||
#endif
|
||||
|
||||
static inline void ath9k_ps_wakeup(struct ath_softc *sc)
|
||||
{
|
||||
if (atomic_inc_return(&sc->ps_usecount) == 1)
|
||||
if (sc->sc_ah->ah_power_mode != ATH9K_PM_AWAKE) {
|
||||
sc->sc_ah->ah_restore_mode = sc->sc_ah->ah_power_mode;
|
||||
ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void ath9k_ps_restore(struct ath_softc *sc)
|
||||
{
|
||||
if (atomic_dec_and_test(&sc->ps_usecount))
|
||||
if (sc->hw->conf.flags & IEEE80211_CONF_PS)
|
||||
ath9k_hw_setpower(sc->sc_ah,
|
||||
sc->sc_ah->ah_restore_mode);
|
||||
}
|
||||
#endif /* CORE_H */
|
||||
|
|
|
@ -222,6 +222,7 @@ static const struct file_operations fops_interrupt = {
|
|||
.owner = THIS_MODULE
|
||||
};
|
||||
|
||||
|
||||
int ath9k_init_debug(struct ath_softc *sc)
|
||||
{
|
||||
sc->sc_debug.debug_mask = ath9k_debug;
|
||||
|
|
|
@ -91,53 +91,11 @@ static inline bool ath9k_hw_get_lower_upper_index(u8 target, u8 *pList,
|
|||
return false;
|
||||
}
|
||||
|
||||
static bool ath9k_hw_eeprom_read(struct ath_hal *ah, u32 off, u16 *data)
|
||||
{
|
||||
(void)REG_READ(ah, AR5416_EEPROM_OFFSET + (off << AR5416_EEPROM_S));
|
||||
|
||||
if (!ath9k_hw_wait(ah,
|
||||
AR_EEPROM_STATUS_DATA,
|
||||
AR_EEPROM_STATUS_DATA_BUSY |
|
||||
AR_EEPROM_STATUS_DATA_PROT_ACCESS, 0)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
*data = MS(REG_READ(ah, AR_EEPROM_STATUS_DATA),
|
||||
AR_EEPROM_STATUS_DATA_VAL);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int ath9k_hw_flash_map(struct ath_hal *ah)
|
||||
{
|
||||
struct ath_hal_5416 *ahp = AH5416(ah);
|
||||
|
||||
ahp->ah_cal_mem = ioremap(AR5416_EEPROM_START_ADDR, AR5416_EEPROM_MAX);
|
||||
|
||||
if (!ahp->ah_cal_mem) {
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_EEPROM,
|
||||
"cannot remap eeprom region \n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool ath9k_hw_flash_read(struct ath_hal *ah, u32 off, u16 *data)
|
||||
{
|
||||
struct ath_hal_5416 *ahp = AH5416(ah);
|
||||
|
||||
*data = ioread16(ahp->ah_cal_mem + off);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline bool ath9k_hw_nvram_read(struct ath_hal *ah, u32 off, u16 *data)
|
||||
{
|
||||
if (ath9k_hw_use_flash(ah))
|
||||
return ath9k_hw_flash_read(ah, off, data);
|
||||
else
|
||||
return ath9k_hw_eeprom_read(ah, off, data);
|
||||
struct ath_softc *sc = ah->ah_sc;
|
||||
|
||||
return sc->bus_ops->eeprom_read(ah, off, data);
|
||||
}
|
||||
|
||||
static bool ath9k_hw_fill_4k_eeprom(struct ath_hal *ah)
|
||||
|
@ -2121,19 +2079,19 @@ void ath9k_hw_set_addac(struct ath_hal *ah, struct ath9k_channel *chan)
|
|||
static bool ath9k_hw_eeprom_set_def_board_values(struct ath_hal *ah,
|
||||
struct ath9k_channel *chan)
|
||||
{
|
||||
#define AR5416_VER_MASK (eep->baseEepHeader.version & AR5416_EEP_VER_MINOR_MASK)
|
||||
struct modal_eep_header *pModal;
|
||||
struct ath_hal_5416 *ahp = AH5416(ah);
|
||||
struct ar5416_eeprom_def *eep = &ahp->ah_eeprom.def;
|
||||
int i, regChainOffset;
|
||||
u8 txRxAttenLocal;
|
||||
u16 ant_config;
|
||||
|
||||
pModal = &(eep->modalHeader[IS_CHAN_2GHZ(chan)]);
|
||||
|
||||
txRxAttenLocal = IS_CHAN_2GHZ(chan) ? 23 : 44;
|
||||
|
||||
ath9k_hw_get_eeprom_antenna_cfg(ah, chan, 0, &ant_config);
|
||||
REG_WRITE(ah, AR_PHY_SWITCH_COM, ant_config);
|
||||
REG_WRITE(ah, AR_PHY_SWITCH_COM,
|
||||
ath9k_hw_get_eeprom_antenna_cfg(ah, chan));
|
||||
|
||||
for (i = 0; i < AR5416_MAX_CHAINS; i++) {
|
||||
if (AR_SREV_9280(ah)) {
|
||||
|
@ -2163,9 +2121,7 @@ static bool ath9k_hw_eeprom_set_def_board_values(struct ath_hal *ah,
|
|||
AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF));
|
||||
|
||||
if ((i == 0) || AR_SREV_5416_V20_OR_LATER(ah)) {
|
||||
if ((eep->baseEepHeader.version &
|
||||
AR5416_EEP_VER_MINOR_MASK) >=
|
||||
AR5416_EEP_MINOR_VER_3) {
|
||||
if (AR5416_VER_MASK >= AR5416_EEP_MINOR_VER_3) {
|
||||
txRxAttenLocal = pModal->txRxAttenCh[i];
|
||||
if (AR_SREV_9280_10_OR_LATER(ah)) {
|
||||
REG_RMW_FIELD(ah,
|
||||
|
@ -2332,8 +2288,7 @@ static bool ath9k_hw_eeprom_set_def_board_values(struct ath_hal *ah,
|
|||
pModal->thresh62);
|
||||
}
|
||||
|
||||
if ((eep->baseEepHeader.version & AR5416_EEP_VER_MINOR_MASK) >=
|
||||
AR5416_EEP_MINOR_VER_2) {
|
||||
if (AR5416_VER_MASK >= AR5416_EEP_MINOR_VER_2) {
|
||||
REG_RMW_FIELD(ah, AR_PHY_RF_CTL2,
|
||||
AR_PHY_TX_END_DATA_START,
|
||||
pModal->txFrameToDataStart);
|
||||
|
@ -2341,15 +2296,29 @@ static bool ath9k_hw_eeprom_set_def_board_values(struct ath_hal *ah,
|
|||
pModal->txFrameToPaOn);
|
||||
}
|
||||
|
||||
if ((eep->baseEepHeader.version & AR5416_EEP_VER_MINOR_MASK) >=
|
||||
AR5416_EEP_MINOR_VER_3) {
|
||||
if (AR5416_VER_MASK >= AR5416_EEP_MINOR_VER_3) {
|
||||
if (IS_CHAN_HT40(chan))
|
||||
REG_RMW_FIELD(ah, AR_PHY_SETTLING,
|
||||
AR_PHY_SETTLING_SWITCH,
|
||||
pModal->swSettleHt40);
|
||||
}
|
||||
|
||||
if (AR_SREV_9280_20(ah) && AR5416_VER_MASK >= AR5416_EEP_MINOR_VER_20) {
|
||||
if (IS_CHAN_HT20(chan))
|
||||
REG_RMW_FIELD(ah, AR_AN_TOP1, AR_AN_TOP1_DACIPMODE,
|
||||
eep->baseEepHeader.dacLpMode);
|
||||
else if (eep->baseEepHeader.dacHiPwrMode_5G)
|
||||
REG_RMW_FIELD(ah, AR_AN_TOP1, AR_AN_TOP1_DACIPMODE, 0);
|
||||
else
|
||||
REG_RMW_FIELD(ah, AR_AN_TOP1, AR_AN_TOP1_DACIPMODE,
|
||||
eep->baseEepHeader.dacLpMode);
|
||||
|
||||
REG_RMW_FIELD(ah, AR_PHY_FRAME_CTL, AR_PHY_FRAME_CTL_TX_CLIP,
|
||||
pModal->miscBits >> 2);
|
||||
}
|
||||
|
||||
return true;
|
||||
#undef AR5416_VER_MASK
|
||||
}
|
||||
|
||||
static bool ath9k_hw_eeprom_set_4k_board_values(struct ath_hal *ah,
|
||||
|
@ -2360,7 +2329,6 @@ static bool ath9k_hw_eeprom_set_4k_board_values(struct ath_hal *ah,
|
|||
struct ar5416_eeprom_4k *eep = &ahp->ah_eeprom.map4k;
|
||||
int regChainOffset;
|
||||
u8 txRxAttenLocal;
|
||||
u16 ant_config = 0;
|
||||
u8 ob[5], db1[5], db2[5];
|
||||
u8 ant_div_control1, ant_div_control2;
|
||||
u32 regVal;
|
||||
|
@ -2370,8 +2338,8 @@ static bool ath9k_hw_eeprom_set_4k_board_values(struct ath_hal *ah,
|
|||
|
||||
txRxAttenLocal = 23;
|
||||
|
||||
ath9k_hw_get_eeprom_antenna_cfg(ah, chan, 0, &ant_config);
|
||||
REG_WRITE(ah, AR_PHY_SWITCH_COM, ant_config);
|
||||
REG_WRITE(ah, AR_PHY_SWITCH_COM,
|
||||
ath9k_hw_get_eeprom_antenna_cfg(ah, chan));
|
||||
|
||||
regChainOffset = 0;
|
||||
REG_WRITE(ah, AR_PHY_SWITCH_CHAIN_0 + regChainOffset,
|
||||
|
@ -2554,70 +2522,39 @@ bool ath9k_hw_eeprom_set_board_values(struct ath_hal *ah,
|
|||
return ath9k_eeprom_set_board_values[ahp->ah_eep_map](ah, chan);
|
||||
}
|
||||
|
||||
static int ath9k_hw_get_def_eeprom_antenna_cfg(struct ath_hal *ah,
|
||||
struct ath9k_channel *chan,
|
||||
u8 index, u16 *config)
|
||||
static u16 ath9k_hw_get_def_eeprom_antenna_cfg(struct ath_hal *ah,
|
||||
struct ath9k_channel *chan)
|
||||
{
|
||||
struct ath_hal_5416 *ahp = AH5416(ah);
|
||||
struct ar5416_eeprom_def *eep = &ahp->ah_eeprom.def;
|
||||
struct modal_eep_header *pModal =
|
||||
&(eep->modalHeader[IS_CHAN_2GHZ(chan)]);
|
||||
struct base_eep_header *pBase = &eep->baseEepHeader;
|
||||
|
||||
switch (index) {
|
||||
case 0:
|
||||
*config = pModal->antCtrlCommon & 0xFFFF;
|
||||
return 0;
|
||||
case 1:
|
||||
if (pBase->version >= 0x0E0D) {
|
||||
if (pModal->useAnt1) {
|
||||
*config =
|
||||
((pModal->antCtrlCommon & 0xFFFF0000) >> 16);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
return pModal->antCtrlCommon & 0xFFFF;
|
||||
}
|
||||
|
||||
static int ath9k_hw_get_4k_eeprom_antenna_cfg(struct ath_hal *ah,
|
||||
struct ath9k_channel *chan,
|
||||
u8 index, u16 *config)
|
||||
static u16 ath9k_hw_get_4k_eeprom_antenna_cfg(struct ath_hal *ah,
|
||||
struct ath9k_channel *chan)
|
||||
{
|
||||
struct ath_hal_5416 *ahp = AH5416(ah);
|
||||
struct ar5416_eeprom_4k *eep = &ahp->ah_eeprom.map4k;
|
||||
struct modal_eep_4k_header *pModal = &eep->modalHeader;
|
||||
|
||||
switch (index) {
|
||||
case 0:
|
||||
*config = pModal->antCtrlCommon & 0xFFFF;
|
||||
return 0;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
return pModal->antCtrlCommon & 0xFFFF;
|
||||
}
|
||||
|
||||
static int (*ath9k_get_eeprom_antenna_cfg[])(struct ath_hal *,
|
||||
struct ath9k_channel *,
|
||||
u8, u16 *) = {
|
||||
static u16 (*ath9k_get_eeprom_antenna_cfg[])(struct ath_hal *,
|
||||
struct ath9k_channel *) = {
|
||||
ath9k_hw_get_def_eeprom_antenna_cfg,
|
||||
ath9k_hw_get_4k_eeprom_antenna_cfg
|
||||
};
|
||||
|
||||
int ath9k_hw_get_eeprom_antenna_cfg(struct ath_hal *ah,
|
||||
struct ath9k_channel *chan,
|
||||
u8 index, u16 *config)
|
||||
u16 ath9k_hw_get_eeprom_antenna_cfg(struct ath_hal *ah,
|
||||
struct ath9k_channel *chan)
|
||||
{
|
||||
struct ath_hal_5416 *ahp = AH5416(ah);
|
||||
|
||||
return ath9k_get_eeprom_antenna_cfg[ahp->ah_eep_map](ah, chan,
|
||||
index, config);
|
||||
return ath9k_get_eeprom_antenna_cfg[ahp->ah_eep_map](ah, chan);
|
||||
}
|
||||
|
||||
static u8 ath9k_hw_get_4k_num_ant_config(struct ath_hal *ah,
|
||||
|
@ -2739,6 +2676,7 @@ static u32 ath9k_hw_get_eeprom_4k(struct ath_hal *ah,
|
|||
static u32 ath9k_hw_get_eeprom_def(struct ath_hal *ah,
|
||||
enum eeprom_param param)
|
||||
{
|
||||
#define AR5416_VER_MASK (pBase->version & AR5416_EEP_VER_MINOR_MASK)
|
||||
struct ath_hal_5416 *ahp = AH5416(ah);
|
||||
struct ar5416_eeprom_def *eep = &ahp->ah_eeprom.def;
|
||||
struct modal_eep_header *pModal = eep->modalHeader;
|
||||
|
@ -2774,7 +2712,7 @@ static u32 ath9k_hw_get_eeprom_def(struct ath_hal *ah,
|
|||
case EEP_DB_2:
|
||||
return pModal[1].db;
|
||||
case EEP_MINOR_REV:
|
||||
return pBase->version & AR5416_EEP_VER_MINOR_MASK;
|
||||
return AR5416_VER_MASK;
|
||||
case EEP_TX_MASK:
|
||||
return pBase->txMask;
|
||||
case EEP_RX_MASK:
|
||||
|
@ -2783,10 +2721,15 @@ static u32 ath9k_hw_get_eeprom_def(struct ath_hal *ah,
|
|||
return pBase->rxGainType;
|
||||
case EEP_TXGAIN_TYPE:
|
||||
return pBase->txGainType;
|
||||
|
||||
case EEP_DAC_HPWR_5G:
|
||||
if (AR5416_VER_MASK >= AR5416_EEP_MINOR_VER_20)
|
||||
return pBase->dacHiPwrMode_5G;
|
||||
else
|
||||
return 0;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
#undef AR5416_VER_MASK
|
||||
}
|
||||
|
||||
static u32 (*ath9k_get_eeprom[])(struct ath_hal *, enum eeprom_param) = {
|
||||
|
@ -2807,9 +2750,6 @@ int ath9k_hw_eeprom_attach(struct ath_hal *ah)
|
|||
int status;
|
||||
struct ath_hal_5416 *ahp = AH5416(ah);
|
||||
|
||||
if (ath9k_hw_use_flash(ah))
|
||||
ath9k_hw_flash_map(ah);
|
||||
|
||||
if (AR_SREV_9285(ah))
|
||||
ahp->ah_eep_map = EEP_MAP_4KBITS;
|
||||
else
|
||||
|
|
|
@ -23,15 +23,13 @@
|
|||
#include "phy.h"
|
||||
#include "initvals.h"
|
||||
|
||||
static const u8 CLOCK_RATE[] = { 40, 80, 22, 44, 88, 40 };
|
||||
static int btcoex_enable;
|
||||
module_param(btcoex_enable, bool, 0);
|
||||
MODULE_PARM_DESC(btcoex_enable, "Enable Bluetooth coexistence support");
|
||||
|
||||
extern struct hal_percal_data iq_cal_multi_sample;
|
||||
extern struct hal_percal_data iq_cal_single_sample;
|
||||
extern struct hal_percal_data adc_gain_cal_multi_sample;
|
||||
extern struct hal_percal_data adc_gain_cal_single_sample;
|
||||
extern struct hal_percal_data adc_dc_cal_multi_sample;
|
||||
extern struct hal_percal_data adc_dc_cal_single_sample;
|
||||
extern struct hal_percal_data adc_init_dc_cal;
|
||||
#define ATH9K_CLOCK_RATE_CCK 22
|
||||
#define ATH9K_CLOCK_RATE_5GHZ_OFDM 40
|
||||
#define ATH9K_CLOCK_RATE_2GHZ_OFDM 44
|
||||
|
||||
static bool ath9k_hw_set_reset_reg(struct ath_hal *ah, u32 type);
|
||||
static void ath9k_hw_set_regs(struct ath_hal *ah, struct ath9k_channel *chan,
|
||||
|
@ -48,17 +46,18 @@ static void ath9k_hw_spur_mitigate(struct ath_hal *ah, struct ath9k_channel *cha
|
|||
|
||||
static u32 ath9k_hw_mac_usec(struct ath_hal *ah, u32 clks)
|
||||
{
|
||||
if (ah->ah_curchan != NULL)
|
||||
return clks / CLOCK_RATE[ath9k_hw_chan2wmode(ah, ah->ah_curchan)];
|
||||
else
|
||||
return clks / CLOCK_RATE[ATH9K_MODE_11B];
|
||||
struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
|
||||
if (!ah->ah_curchan) /* should really check for CCK instead */
|
||||
return clks / ATH9K_CLOCK_RATE_CCK;
|
||||
if (conf->channel->band == IEEE80211_BAND_2GHZ)
|
||||
return clks / ATH9K_CLOCK_RATE_2GHZ_OFDM;
|
||||
return clks / ATH9K_CLOCK_RATE_5GHZ_OFDM;
|
||||
}
|
||||
|
||||
static u32 ath9k_hw_mac_to_usec(struct ath_hal *ah, u32 clks)
|
||||
{
|
||||
struct ath9k_channel *chan = ah->ah_curchan;
|
||||
|
||||
if (chan && IS_CHAN_HT40(chan))
|
||||
struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
|
||||
if (conf_is_ht40(conf))
|
||||
return ath9k_hw_mac_usec(ah, clks) / 2;
|
||||
else
|
||||
return ath9k_hw_mac_usec(ah, clks);
|
||||
|
@ -66,34 +65,23 @@ static u32 ath9k_hw_mac_to_usec(struct ath_hal *ah, u32 clks)
|
|||
|
||||
static u32 ath9k_hw_mac_clks(struct ath_hal *ah, u32 usecs)
|
||||
{
|
||||
if (ah->ah_curchan != NULL)
|
||||
return usecs * CLOCK_RATE[ath9k_hw_chan2wmode(ah,
|
||||
ah->ah_curchan)];
|
||||
else
|
||||
return usecs * CLOCK_RATE[ATH9K_MODE_11B];
|
||||
struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
|
||||
if (!ah->ah_curchan) /* should really check for CCK instead */
|
||||
return usecs *ATH9K_CLOCK_RATE_CCK;
|
||||
if (conf->channel->band == IEEE80211_BAND_2GHZ)
|
||||
return usecs *ATH9K_CLOCK_RATE_2GHZ_OFDM;
|
||||
return usecs *ATH9K_CLOCK_RATE_5GHZ_OFDM;
|
||||
}
|
||||
|
||||
static u32 ath9k_hw_mac_to_clks(struct ath_hal *ah, u32 usecs)
|
||||
{
|
||||
struct ath9k_channel *chan = ah->ah_curchan;
|
||||
|
||||
if (chan && IS_CHAN_HT40(chan))
|
||||
struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
|
||||
if (conf_is_ht40(conf))
|
||||
return ath9k_hw_mac_clks(ah, usecs) * 2;
|
||||
else
|
||||
return ath9k_hw_mac_clks(ah, usecs);
|
||||
}
|
||||
|
||||
enum wireless_mode ath9k_hw_chan2wmode(struct ath_hal *ah,
|
||||
const struct ath9k_channel *chan)
|
||||
{
|
||||
if (IS_CHAN_B(chan))
|
||||
return ATH9K_MODE_11B;
|
||||
if (IS_CHAN_G(chan))
|
||||
return ATH9K_MODE_11G;
|
||||
|
||||
return ATH9K_MODE_11A;
|
||||
}
|
||||
|
||||
bool ath9k_hw_wait(struct ath_hal *ah, u32 reg, u32 mask, u32 val)
|
||||
{
|
||||
int i;
|
||||
|
@ -199,46 +187,6 @@ u16 ath9k_hw_computetxtime(struct ath_hal *ah,
|
|||
return txTime;
|
||||
}
|
||||
|
||||
u32 ath9k_hw_mhz2ieee(struct ath_hal *ah, u32 freq, u32 flags)
|
||||
{
|
||||
if (flags & CHANNEL_2GHZ) {
|
||||
if (freq == 2484)
|
||||
return 14;
|
||||
if (freq < 2484)
|
||||
return (freq - 2407) / 5;
|
||||
else
|
||||
return 15 + ((freq - 2512) / 20);
|
||||
} else if (flags & CHANNEL_5GHZ) {
|
||||
if (ath9k_regd_is_public_safety_sku(ah) &&
|
||||
IS_CHAN_IN_PUBLIC_SAFETY_BAND(freq)) {
|
||||
return ((freq * 10) +
|
||||
(((freq % 5) == 2) ? 5 : 0) - 49400) / 5;
|
||||
} else if ((flags & CHANNEL_A) && (freq <= 5000)) {
|
||||
return (freq - 4000) / 5;
|
||||
} else {
|
||||
return (freq - 5000) / 5;
|
||||
}
|
||||
} else {
|
||||
if (freq == 2484)
|
||||
return 14;
|
||||
if (freq < 2484)
|
||||
return (freq - 2407) / 5;
|
||||
if (freq < 5000) {
|
||||
if (ath9k_regd_is_public_safety_sku(ah)
|
||||
&& IS_CHAN_IN_PUBLIC_SAFETY_BAND(freq)) {
|
||||
return ((freq * 10) +
|
||||
(((freq % 5) ==
|
||||
2) ? 5 : 0) - 49400) / 5;
|
||||
} else if (freq > 4900) {
|
||||
return (freq - 4000) / 5;
|
||||
} else {
|
||||
return 15 + ((freq - 2512) / 20);
|
||||
}
|
||||
}
|
||||
return (freq - 5000) / 5;
|
||||
}
|
||||
}
|
||||
|
||||
void ath9k_hw_get_channel_centers(struct ath_hal *ah,
|
||||
struct ath9k_channel *chan,
|
||||
struct chan_centers *centers)
|
||||
|
@ -389,6 +337,8 @@ static const char *ath9k_hw_devname(u16 devid)
|
|||
return "Atheros 5418";
|
||||
case AR9160_DEVID_PCI:
|
||||
return "Atheros 9160";
|
||||
case AR5416_AR9100_DEVID:
|
||||
return "Atheros 9100";
|
||||
case AR9280_DEVID_PCI:
|
||||
case AR9280_DEVID_PCIE:
|
||||
return "Atheros 9280";
|
||||
|
@ -1023,7 +973,7 @@ static void ath9k_hw_init_pll(struct ath_hal *ah,
|
|||
pll |= SM(0xb, AR_RTC_PLL_DIV);
|
||||
}
|
||||
}
|
||||
REG_WRITE(ah, (u16) (AR_RTC_PLL_CONTROL), pll);
|
||||
REG_WRITE(ah, AR_RTC_PLL_CONTROL, pll);
|
||||
|
||||
udelay(RTC_PLL_SETTLE_DELAY);
|
||||
|
||||
|
@ -1191,6 +1141,7 @@ struct ath_hal *ath9k_hw_attach(u16 devid, struct ath_softc *sc,
|
|||
switch (devid) {
|
||||
case AR5416_DEVID_PCI:
|
||||
case AR5416_DEVID_PCIE:
|
||||
case AR5416_AR9100_DEVID:
|
||||
case AR9160_DEVID_PCI:
|
||||
case AR9280_DEVID_PCI:
|
||||
case AR9280_DEVID_PCIE:
|
||||
|
@ -1279,6 +1230,7 @@ static int ath9k_hw_process_ini(struct ath_hal *ah,
|
|||
{
|
||||
int i, regWrites = 0;
|
||||
struct ath_hal_5416 *ahp = AH5416(ah);
|
||||
struct ieee80211_channel *channel = chan->chan;
|
||||
u32 modesIndex, freqIndex;
|
||||
int status;
|
||||
|
||||
|
@ -1383,9 +1335,8 @@ static int ath9k_hw_process_ini(struct ath_hal *ah,
|
|||
|
||||
status = ath9k_hw_set_txpower(ah, chan,
|
||||
ath9k_regd_get_ctl(ah, chan),
|
||||
ath9k_regd_get_antenna_allowed(ah,
|
||||
chan),
|
||||
chan->maxRegTxPower * 2,
|
||||
channel->max_antenna_gain * 2,
|
||||
channel->max_power * 2,
|
||||
min((u32) MAX_RATE_POWER,
|
||||
(u32) ah->ah_powerLimit));
|
||||
if (status != 0) {
|
||||
|
@ -1562,11 +1513,11 @@ static bool ath9k_hw_set_reset(struct ath_hal *ah, int type)
|
|||
rst_flags |= AR_RTC_RC_MAC_COLD;
|
||||
}
|
||||
|
||||
REG_WRITE(ah, (u16) (AR_RTC_RC), rst_flags);
|
||||
REG_WRITE(ah, AR_RTC_RC, rst_flags);
|
||||
udelay(50);
|
||||
|
||||
REG_WRITE(ah, (u16) (AR_RTC_RC), 0);
|
||||
if (!ath9k_hw_wait(ah, (u16) (AR_RTC_RC), AR_RTC_RC_M, 0)) {
|
||||
REG_WRITE(ah, AR_RTC_RC, 0);
|
||||
if (!ath9k_hw_wait(ah, AR_RTC_RC, AR_RTC_RC_M, 0)) {
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_RESET,
|
||||
"RTC stuck in MAC reset\n");
|
||||
return false;
|
||||
|
@ -1588,8 +1539,8 @@ static bool ath9k_hw_set_reset_power_on(struct ath_hal *ah)
|
|||
REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN |
|
||||
AR_RTC_FORCE_WAKE_ON_INT);
|
||||
|
||||
REG_WRITE(ah, (u16) (AR_RTC_RESET), 0);
|
||||
REG_WRITE(ah, (u16) (AR_RTC_RESET), 1);
|
||||
REG_WRITE(ah, AR_RTC_RESET, 0);
|
||||
REG_WRITE(ah, AR_RTC_RESET, 1);
|
||||
|
||||
if (!ath9k_hw_wait(ah,
|
||||
AR_RTC_STATUS,
|
||||
|
@ -1674,34 +1625,11 @@ static bool ath9k_hw_chip_reset(struct ath_hal *ah,
|
|||
return true;
|
||||
}
|
||||
|
||||
static struct ath9k_channel *ath9k_hw_check_chan(struct ath_hal *ah,
|
||||
struct ath9k_channel *chan)
|
||||
{
|
||||
if (!(IS_CHAN_2GHZ(chan) ^ IS_CHAN_5GHZ(chan))) {
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_CHANNEL,
|
||||
"invalid channel %u/0x%x; not marked as "
|
||||
"2GHz or 5GHz\n", chan->channel, chan->channelFlags);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!IS_CHAN_OFDM(chan) &&
|
||||
!IS_CHAN_B(chan) &&
|
||||
!IS_CHAN_HT20(chan) &&
|
||||
!IS_CHAN_HT40(chan)) {
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_CHANNEL,
|
||||
"invalid channel %u/0x%x; not marked as "
|
||||
"OFDM or CCK or HT20 or HT40PLUS or HT40MINUS\n",
|
||||
chan->channel, chan->channelFlags);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ath9k_regd_check_channel(ah, chan);
|
||||
}
|
||||
|
||||
static bool ath9k_hw_channel_change(struct ath_hal *ah,
|
||||
struct ath9k_channel *chan,
|
||||
enum ath9k_ht_macmode macmode)
|
||||
{
|
||||
struct ieee80211_channel *channel = chan->chan;
|
||||
u32 synthDelay, qnum;
|
||||
|
||||
for (qnum = 0; qnum < AR_NUM_QCU; qnum++) {
|
||||
|
@ -1738,8 +1666,8 @@ static bool ath9k_hw_channel_change(struct ath_hal *ah,
|
|||
|
||||
if (ath9k_hw_set_txpower(ah, chan,
|
||||
ath9k_regd_get_ctl(ah, chan),
|
||||
ath9k_regd_get_antenna_allowed(ah, chan),
|
||||
chan->maxRegTxPower * 2,
|
||||
channel->max_antenna_gain * 2,
|
||||
channel->max_power * 2,
|
||||
min((u32) MAX_RATE_POWER,
|
||||
(u32) ah->ah_powerLimit)) != 0) {
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_EEPROM,
|
||||
|
@ -1918,9 +1846,9 @@ static void ath9k_hw_9280_spur_mitigate(struct ath_hal *ah, struct ath9k_channel
|
|||
if ((cur_vit_mask > lower) && (cur_vit_mask < upper)) {
|
||||
|
||||
/* workaround for gcc bug #37014 */
|
||||
volatile int tmp = abs(cur_vit_mask - bin);
|
||||
volatile int tmp_v = abs(cur_vit_mask - bin);
|
||||
|
||||
if (tmp < 75)
|
||||
if (tmp_v < 75)
|
||||
mask_amt = 1;
|
||||
else
|
||||
mask_amt = 0;
|
||||
|
@ -2119,9 +2047,9 @@ static void ath9k_hw_spur_mitigate(struct ath_hal *ah, struct ath9k_channel *cha
|
|||
if ((cur_vit_mask > lower) && (cur_vit_mask < upper)) {
|
||||
|
||||
/* workaround for gcc bug #37014 */
|
||||
volatile int tmp = abs(cur_vit_mask - bin);
|
||||
volatile int tmp_v = abs(cur_vit_mask - bin);
|
||||
|
||||
if (tmp < 75)
|
||||
if (tmp_v < 75)
|
||||
mask_amt = 1;
|
||||
else
|
||||
mask_amt = 0;
|
||||
|
@ -2222,41 +2150,31 @@ static void ath9k_hw_spur_mitigate(struct ath_hal *ah, struct ath9k_channel *cha
|
|||
REG_WRITE(ah, AR_PHY_MASK2_P_61_45, tmp_mask);
|
||||
}
|
||||
|
||||
bool ath9k_hw_reset(struct ath_hal *ah, struct ath9k_channel *chan,
|
||||
enum ath9k_ht_macmode macmode,
|
||||
u8 txchainmask, u8 rxchainmask,
|
||||
enum ath9k_ht_extprotspacing extprotspacing,
|
||||
bool bChannelChange, int *status)
|
||||
int ath9k_hw_reset(struct ath_hal *ah, struct ath9k_channel *chan,
|
||||
bool bChannelChange)
|
||||
{
|
||||
u32 saveLedState;
|
||||
struct ath_softc *sc = ah->ah_sc;
|
||||
struct ath_hal_5416 *ahp = AH5416(ah);
|
||||
struct ath9k_channel *curchan = ah->ah_curchan;
|
||||
u32 saveDefAntenna;
|
||||
u32 macStaId1;
|
||||
int ecode;
|
||||
int i, rx_chainmask;
|
||||
int i, rx_chainmask, r;
|
||||
|
||||
ahp->ah_extprotspacing = extprotspacing;
|
||||
ahp->ah_txchainmask = txchainmask;
|
||||
ahp->ah_rxchainmask = rxchainmask;
|
||||
ahp->ah_extprotspacing = sc->sc_ht_extprotspacing;
|
||||
ahp->ah_txchainmask = sc->sc_tx_chainmask;
|
||||
ahp->ah_rxchainmask = sc->sc_rx_chainmask;
|
||||
|
||||
if (AR_SREV_9280(ah)) {
|
||||
if (AR_SREV_9285(ah)) {
|
||||
ahp->ah_txchainmask &= 0x1;
|
||||
ahp->ah_rxchainmask &= 0x1;
|
||||
} else if (AR_SREV_9280(ah)) {
|
||||
ahp->ah_txchainmask &= 0x3;
|
||||
ahp->ah_rxchainmask &= 0x3;
|
||||
}
|
||||
|
||||
if (ath9k_hw_check_chan(ah, chan) == NULL) {
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_CHANNEL,
|
||||
"invalid channel %u/0x%x; no mapping\n",
|
||||
chan->channel, chan->channelFlags);
|
||||
ecode = -EINVAL;
|
||||
goto bad;
|
||||
}
|
||||
|
||||
if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE)) {
|
||||
ecode = -EIO;
|
||||
goto bad;
|
||||
}
|
||||
if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
|
||||
return -EIO;
|
||||
|
||||
if (curchan)
|
||||
ath9k_hw_getnf(ah, curchan);
|
||||
|
@ -2270,10 +2188,10 @@ bool ath9k_hw_reset(struct ath_hal *ah, struct ath9k_channel *chan,
|
|||
(!AR_SREV_9280(ah) || (!IS_CHAN_A_5MHZ_SPACED(chan) &&
|
||||
!IS_CHAN_A_5MHZ_SPACED(ah->ah_curchan)))) {
|
||||
|
||||
if (ath9k_hw_channel_change(ah, chan, macmode)) {
|
||||
if (ath9k_hw_channel_change(ah, chan, sc->tx_chan_width)) {
|
||||
ath9k_hw_loadnf(ah, ah->ah_curchan);
|
||||
ath9k_hw_start_nfcal(ah);
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2291,28 +2209,32 @@ bool ath9k_hw_reset(struct ath_hal *ah, struct ath9k_channel *chan,
|
|||
|
||||
if (!ath9k_hw_chip_reset(ah, chan)) {
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_RESET, "chip reset failed\n");
|
||||
ecode = -EINVAL;
|
||||
goto bad;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (AR_SREV_9280(ah)) {
|
||||
REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL,
|
||||
AR_GPIO_JTAG_DISABLE);
|
||||
if (AR_SREV_9280_10_OR_LATER(ah))
|
||||
REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, AR_GPIO_JTAG_DISABLE);
|
||||
|
||||
if (test_bit(ATH9K_MODE_11A, ah->ah_caps.wireless_modes)) {
|
||||
if (IS_CHAN_5GHZ(chan))
|
||||
ath9k_hw_set_gpio(ah, 9, 0);
|
||||
else
|
||||
ath9k_hw_set_gpio(ah, 9, 1);
|
||||
}
|
||||
ath9k_hw_cfg_output(ah, 9, AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
|
||||
}
|
||||
r = ath9k_hw_process_ini(ah, chan, sc->tx_chan_width);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
ecode = ath9k_hw_process_ini(ah, chan, macmode);
|
||||
if (ecode != 0) {
|
||||
ecode = -EINVAL;
|
||||
goto bad;
|
||||
}
|
||||
/* Setup MFP options for CCMP */
|
||||
if (AR_SREV_9280_20_OR_LATER(ah)) {
|
||||
/* Mask Retry(b11), PwrMgt(b12), MoreData(b13) to 0 in mgmt
|
||||
* frames when constructing CCMP AAD. */
|
||||
REG_RMW_FIELD(ah, AR_AES_MUTE_MASK1, AR_AES_MUTE_MASK1_FC_MGMT,
|
||||
0xc7ff);
|
||||
ah->sw_mgmt_crypto = false;
|
||||
} else if (AR_SREV_9160_10_OR_LATER(ah)) {
|
||||
/* Disable hardware crypto for management frames */
|
||||
REG_CLR_BIT(ah, AR_PCU_MISC_MODE2,
|
||||
AR_PCU_MISC_MODE2_MGMT_CRYPTO_ENABLE);
|
||||
REG_SET_BIT(ah, AR_PCU_MISC_MODE2,
|
||||
AR_PCU_MISC_MODE2_NO_CRYPTO_FOR_NON_DATA_PKT);
|
||||
ah->sw_mgmt_crypto = true;
|
||||
} else
|
||||
ah->sw_mgmt_crypto = true;
|
||||
|
||||
if (IS_CHAN_OFDM(chan) || IS_CHAN_HT(chan))
|
||||
ath9k_hw_set_delta_slope(ah, chan);
|
||||
|
@ -2325,8 +2247,7 @@ bool ath9k_hw_reset(struct ath_hal *ah, struct ath9k_channel *chan,
|
|||
if (!ath9k_hw_eeprom_set_board_values(ah, chan)) {
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_EEPROM,
|
||||
"error setting board options\n");
|
||||
ecode = -EIO;
|
||||
goto bad;
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
ath9k_hw_decrease_chain_power(ah, chan);
|
||||
|
@ -2354,15 +2275,11 @@ bool ath9k_hw_reset(struct ath_hal *ah, struct ath9k_channel *chan,
|
|||
REG_WRITE(ah, AR_RSSI_THR, INIT_RSSI_THR);
|
||||
|
||||
if (AR_SREV_9280_10_OR_LATER(ah)) {
|
||||
if (!(ath9k_hw_ar9280_set_channel(ah, chan))) {
|
||||
ecode = -EIO;
|
||||
goto bad;
|
||||
}
|
||||
if (!(ath9k_hw_ar9280_set_channel(ah, chan)))
|
||||
return -EIO;
|
||||
} else {
|
||||
if (!(ath9k_hw_set_channel(ah, chan))) {
|
||||
ecode = -EIO;
|
||||
goto bad;
|
||||
}
|
||||
if (!(ath9k_hw_set_channel(ah, chan)))
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
for (i = 0; i < AR_NUM_DCU; i++)
|
||||
|
@ -2396,10 +2313,8 @@ bool ath9k_hw_reset(struct ath_hal *ah, struct ath9k_channel *chan,
|
|||
|
||||
ath9k_hw_init_bb(ah, chan);
|
||||
|
||||
if (!ath9k_hw_init_cal(ah, chan)){
|
||||
ecode = -EIO;;
|
||||
goto bad;
|
||||
}
|
||||
if (!ath9k_hw_init_cal(ah, chan))
|
||||
return -EIO;;
|
||||
|
||||
rx_chainmask = ahp->ah_rxchainmask;
|
||||
if ((rx_chainmask == 0x5) || (rx_chainmask == 0x3)) {
|
||||
|
@ -2428,11 +2343,7 @@ bool ath9k_hw_reset(struct ath_hal *ah, struct ath9k_channel *chan,
|
|||
#endif
|
||||
}
|
||||
|
||||
return true;
|
||||
bad:
|
||||
if (status)
|
||||
*status = ecode;
|
||||
return false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/************************/
|
||||
|
@ -2658,7 +2569,7 @@ static void ath9k_set_power_sleep(struct ath_hal *ah, int setChip)
|
|||
if (!AR_SREV_9100(ah))
|
||||
REG_WRITE(ah, AR_RC, AR_RC_AHB | AR_RC_HOSTIF);
|
||||
|
||||
REG_CLR_BIT(ah, (u16) (AR_RTC_RESET),
|
||||
REG_CLR_BIT(ah, (AR_RTC_RESET),
|
||||
AR_RTC_RESET_EN);
|
||||
}
|
||||
}
|
||||
|
@ -2734,7 +2645,7 @@ bool ath9k_hw_setpower(struct ath_hal *ah,
|
|||
int status = true, setChip = true;
|
||||
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_POWER_MGMT, "%s -> %s (%s)\n",
|
||||
modes[ahp->ah_powerMode], modes[mode],
|
||||
modes[ah->ah_power_mode], modes[mode],
|
||||
setChip ? "set chip " : "");
|
||||
|
||||
switch (mode) {
|
||||
|
@ -2753,7 +2664,7 @@ bool ath9k_hw_setpower(struct ath_hal *ah,
|
|||
"Unknown power mode %u\n", mode);
|
||||
return false;
|
||||
}
|
||||
ahp->ah_powerMode = mode;
|
||||
ah->ah_power_mode = mode;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
@ -3332,7 +3243,9 @@ bool ath9k_hw_fill_cap_info(struct ath_hal *ah)
|
|||
pCap->num_mr_retries = 4;
|
||||
pCap->tx_triglevel_max = MAX_TX_FIFO_THRESHOLD;
|
||||
|
||||
if (AR_SREV_9280_10_OR_LATER(ah))
|
||||
if (AR_SREV_9285_10_OR_LATER(ah))
|
||||
pCap->num_gpio_pins = AR9285_NUM_GPIO;
|
||||
else if (AR_SREV_9280_10_OR_LATER(ah))
|
||||
pCap->num_gpio_pins = AR928X_NUM_GPIO;
|
||||
else
|
||||
pCap->num_gpio_pins = AR_NUM_GPIO;
|
||||
|
@ -3399,6 +3312,12 @@ bool ath9k_hw_fill_cap_info(struct ath_hal *ah)
|
|||
pCap->num_antcfg_2ghz =
|
||||
ath9k_hw_get_num_ant_config(ah, ATH9K_HAL_FREQ_BAND_2GHZ);
|
||||
|
||||
if (AR_SREV_9280_10_OR_LATER(ah) && btcoex_enable) {
|
||||
pCap->hw_caps |= ATH9K_HW_CAP_BT_COEX;
|
||||
ah->ah_btactive_gpio = 6;
|
||||
ah->ah_wlanactive_gpio = 5;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3577,17 +3496,18 @@ void ath9k_hw_cfg_gpio_input(struct ath_hal *ah, u32 gpio)
|
|||
|
||||
u32 ath9k_hw_gpio_get(struct ath_hal *ah, u32 gpio)
|
||||
{
|
||||
#define MS_REG_READ(x, y) \
|
||||
(MS(REG_READ(ah, AR_GPIO_IN_OUT), x##_GPIO_IN_VAL) & (AR_GPIO_BIT(y)))
|
||||
|
||||
if (gpio >= ah->ah_caps.num_gpio_pins)
|
||||
return 0xffffffff;
|
||||
|
||||
if (AR_SREV_9280_10_OR_LATER(ah)) {
|
||||
return (MS
|
||||
(REG_READ(ah, AR_GPIO_IN_OUT),
|
||||
AR928X_GPIO_IN_VAL) & AR_GPIO_BIT(gpio)) != 0;
|
||||
} else {
|
||||
return (MS(REG_READ(ah, AR_GPIO_IN_OUT), AR_GPIO_IN_VAL) &
|
||||
AR_GPIO_BIT(gpio)) != 0;
|
||||
}
|
||||
if (AR_SREV_9285_10_OR_LATER(ah))
|
||||
return MS_REG_READ(AR9285, gpio) != 0;
|
||||
else if (AR_SREV_9280_10_OR_LATER(ah))
|
||||
return MS_REG_READ(AR928X, gpio) != 0;
|
||||
else
|
||||
return MS_REG_READ(AR, gpio) != 0;
|
||||
}
|
||||
|
||||
void ath9k_hw_cfg_output(struct ath_hal *ah, u32 gpio,
|
||||
|
@ -3625,27 +3545,6 @@ void ath9k_enable_rfkill(struct ath_hal *ah)
|
|||
}
|
||||
#endif
|
||||
|
||||
int ath9k_hw_select_antconfig(struct ath_hal *ah, u32 cfg)
|
||||
{
|
||||
struct ath9k_channel *chan = ah->ah_curchan;
|
||||
const struct ath9k_hw_capabilities *pCap = &ah->ah_caps;
|
||||
u16 ant_config;
|
||||
u32 halNumAntConfig;
|
||||
|
||||
halNumAntConfig = IS_CHAN_2GHZ(chan) ?
|
||||
pCap->num_antcfg_2ghz : pCap->num_antcfg_5ghz;
|
||||
|
||||
if (cfg < halNumAntConfig) {
|
||||
if (!ath9k_hw_get_eeprom_antenna_cfg(ah, chan,
|
||||
cfg, &ant_config)) {
|
||||
REG_WRITE(ah, AR_PHY_SWITCH_COM, ant_config);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
u32 ath9k_hw_getdefantenna(struct ath_hal *ah)
|
||||
{
|
||||
return REG_READ(ah, AR_DEF_ANTENNA) & 0x7;
|
||||
|
@ -3755,13 +3654,14 @@ bool ath9k_hw_disable(struct ath_hal *ah)
|
|||
bool ath9k_hw_set_txpowerlimit(struct ath_hal *ah, u32 limit)
|
||||
{
|
||||
struct ath9k_channel *chan = ah->ah_curchan;
|
||||
struct ieee80211_channel *channel = chan->chan;
|
||||
|
||||
ah->ah_powerLimit = min(limit, (u32) MAX_RATE_POWER);
|
||||
|
||||
if (ath9k_hw_set_txpower(ah, chan,
|
||||
ath9k_regd_get_ctl(ah, chan),
|
||||
ath9k_regd_get_antenna_allowed(ah, chan),
|
||||
chan->maxRegTxPower * 2,
|
||||
channel->max_antenna_gain * 2,
|
||||
channel->max_power * 2,
|
||||
min((u32) MAX_RATE_POWER,
|
||||
(u32) ah->ah_powerLimit)) != 0)
|
||||
return false;
|
||||
|
@ -3837,6 +3737,13 @@ u64 ath9k_hw_gettsf64(struct ath_hal *ah)
|
|||
return tsf;
|
||||
}
|
||||
|
||||
void ath9k_hw_settsf64(struct ath_hal *ah, u64 tsf64)
|
||||
{
|
||||
REG_WRITE(ah, AR_TSF_L32, 0x00000000);
|
||||
REG_WRITE(ah, AR_TSF_U32, (tsf64 >> 32) & 0xffffffff);
|
||||
REG_WRITE(ah, AR_TSF_L32, tsf64 & 0xffffffff);
|
||||
}
|
||||
|
||||
void ath9k_hw_reset_tsf(struct ath_hal *ah)
|
||||
{
|
||||
int count;
|
||||
|
@ -3893,3 +3800,30 @@ void ath9k_hw_set11nmac2040(struct ath_hal *ah, enum ath9k_ht_macmode mode)
|
|||
|
||||
REG_WRITE(ah, AR_2040_MODE, macmode);
|
||||
}
|
||||
|
||||
/***************************/
|
||||
/* Bluetooth Coexistence */
|
||||
/***************************/
|
||||
|
||||
void ath9k_hw_btcoex_enable(struct ath_hal *ah)
|
||||
{
|
||||
/* connect bt_active to baseband */
|
||||
REG_CLR_BIT(ah, AR_GPIO_INPUT_EN_VAL,
|
||||
(AR_GPIO_INPUT_EN_VAL_BT_PRIORITY_DEF |
|
||||
AR_GPIO_INPUT_EN_VAL_BT_FREQUENCY_DEF));
|
||||
|
||||
REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL,
|
||||
AR_GPIO_INPUT_EN_VAL_BT_ACTIVE_BB);
|
||||
|
||||
/* Set input mux for bt_active to gpio pin */
|
||||
REG_RMW_FIELD(ah, AR_GPIO_INPUT_MUX1,
|
||||
AR_GPIO_INPUT_MUX1_BT_ACTIVE,
|
||||
ah->ah_btactive_gpio);
|
||||
|
||||
/* Configure the desired gpio port for input */
|
||||
ath9k_hw_cfg_gpio_input(ah, ah->ah_btactive_gpio);
|
||||
|
||||
/* Configure the desired GPIO port for TX_FRAME output */
|
||||
ath9k_hw_cfg_output(ah, ah->ah_wlanactive_gpio,
|
||||
AR_GPIO_OUTPUT_MUX_AS_TX_FRAME);
|
||||
}
|
||||
|
|
|
@ -20,6 +20,14 @@
|
|||
#include <linux/if_ether.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
extern const struct hal_percal_data iq_cal_multi_sample;
|
||||
extern const struct hal_percal_data iq_cal_single_sample;
|
||||
extern const struct hal_percal_data adc_gain_cal_multi_sample;
|
||||
extern const struct hal_percal_data adc_gain_cal_single_sample;
|
||||
extern const struct hal_percal_data adc_dc_cal_multi_sample;
|
||||
extern const struct hal_percal_data adc_dc_cal_single_sample;
|
||||
extern const struct hal_percal_data adc_init_dc_cal;
|
||||
|
||||
struct ar5416_desc {
|
||||
u32 ds_link;
|
||||
u32 ds_data;
|
||||
|
@ -418,6 +426,7 @@ struct ar5416Stats {
|
|||
#define AR5416_EEP_MINOR_VER_16 0x10
|
||||
#define AR5416_EEP_MINOR_VER_17 0x11
|
||||
#define AR5416_EEP_MINOR_VER_19 0x13
|
||||
#define AR5416_EEP_MINOR_VER_20 0x14
|
||||
|
||||
#define AR5416_NUM_5G_CAL_PIERS 8
|
||||
#define AR5416_NUM_2G_CAL_PIERS 4
|
||||
|
@ -480,6 +489,7 @@ enum eeprom_param {
|
|||
EEP_RX_MASK,
|
||||
EEP_RXGAIN_TYPE,
|
||||
EEP_TXGAIN_TYPE,
|
||||
EEP_DAC_HPWR_5G,
|
||||
};
|
||||
|
||||
enum ar5416_rates {
|
||||
|
@ -518,9 +528,13 @@ struct base_eep_header {
|
|||
u8 pwdclkind;
|
||||
u8 futureBase_1[2];
|
||||
u8 rxGainType;
|
||||
u8 futureBase_2[3];
|
||||
u8 dacHiPwrMode_5G;
|
||||
u8 futureBase_2;
|
||||
u8 dacLpMode;
|
||||
u8 txGainType;
|
||||
u8 futureBase_3[25];
|
||||
u8 rcChainMask;
|
||||
u8 desiredScaleCCK;
|
||||
u8 futureBase_3[23];
|
||||
} __packed;
|
||||
|
||||
struct base_eep_header_4k {
|
||||
|
@ -587,7 +601,7 @@ struct modal_eep_header {
|
|||
force_xpaon:1,
|
||||
local_bias:1,
|
||||
femBandSelectUsed:1, xlnabufin:1, xlnaisel:2, xlnabufmode:1;
|
||||
u8 futureModalar9280;
|
||||
u8 miscBits;
|
||||
u16 xpaBiasLvlFreq[3];
|
||||
u8 futureModal[6];
|
||||
|
||||
|
@ -830,7 +844,6 @@ struct ath_hal_5416 {
|
|||
bool ah_chipFullSleep;
|
||||
u32 ah_atimWindow;
|
||||
u16 ah_antennaSwitchSwap;
|
||||
enum ath9k_power_mode ah_powerMode;
|
||||
enum ath9k_ant_setting ah_diversityControl;
|
||||
|
||||
/* Calibration */
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* AR5416 to Fowl ar5146.ini */
|
||||
static const u32 ar5416Modes_9100[][6] = {
|
||||
{ 0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160, 0x000001e0 },
|
||||
{ 0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c, 0x000001e0 },
|
||||
|
@ -659,10 +658,9 @@ static const u32 ar5416Addac_9100[][2] = {
|
|||
{0x0000989c, 0x00000000 },
|
||||
{0x0000989c, 0x00000000 },
|
||||
{0x0000989c, 0x00000000 },
|
||||
{0x000098c4, 0x00000000 },
|
||||
{0x000098cc, 0x00000000 },
|
||||
};
|
||||
|
||||
/* ar5416 - howl ar5416_howl.ini */
|
||||
static const u32 ar5416Modes[][6] = {
|
||||
{ 0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160, 0x000001e0 },
|
||||
{ 0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c, 0x000001e0 },
|
||||
|
@ -1313,7 +1311,6 @@ static const u32 ar5416Addac[][2] = {
|
|||
{0x000098cc, 0x00000000 },
|
||||
};
|
||||
|
||||
/* AR5416 9160 Sowl ar5416_sowl.ini */
|
||||
static const u32 ar5416Modes_9160[][6] = {
|
||||
{ 0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160, 0x000001e0 },
|
||||
{ 0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c, 0x000001e0 },
|
||||
|
@ -2549,6 +2546,8 @@ static const u32 ar9280Modes_9280_2[][6] = {
|
|||
{ 0x000010f0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000008 },
|
||||
{ 0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00, 0x06e006e0 },
|
||||
{ 0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b, 0x0988004f },
|
||||
{ 0x00008120, 0x08f04800, 0x08f04800, 0x08f04810, 0x08f04810, 0x08f04810 },
|
||||
{ 0x000081d0, 0x00003210, 0x00003210, 0x0000320a, 0x0000320a, 0x0000320a },
|
||||
{ 0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440, 0x00006880 },
|
||||
{ 0x00009804, 0x00000300, 0x000003c4, 0x000003c4, 0x00000300, 0x00000303 },
|
||||
{ 0x00009820, 0x02020200, 0x02020200, 0x02020200, 0x02020200, 0x02020200 },
|
||||
|
@ -2587,7 +2586,6 @@ static const u32 ar9280Modes_9280_2[][6] = {
|
|||
{ 0x0000a21c, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a },
|
||||
{ 0x0000a230, 0x00000000, 0x00000000, 0x00000210, 0x00000108, 0x00000000 },
|
||||
{ 0x0000a250, 0x001ff000, 0x001ff000, 0x0004a000, 0x0004a000, 0x0004a000 },
|
||||
{ 0x0000a274, 0x0a19c652, 0x0a19c652, 0x0a1aa652, 0x0a1aa652, 0x0a1aa652 },
|
||||
{ 0x0000a358, 0x7999aa02, 0x7999aa02, 0x7999aa0e, 0x7999aa0e, 0x7999aa0e },
|
||||
{ 0x0000a3d8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0x00007894, 0x5a508000, 0x5a508000, 0x5a508000, 0x5a508000, 0x5a508000 },
|
||||
|
@ -2719,7 +2717,6 @@ static const u32 ar9280Common_9280_2[][2] = {
|
|||
{ 0x00008110, 0x00000168 },
|
||||
{ 0x00008118, 0x000100aa },
|
||||
{ 0x0000811c, 0x00003210 },
|
||||
{ 0x00008120, 0x08f04800 },
|
||||
{ 0x00008124, 0x00000000 },
|
||||
{ 0x00008128, 0x00000000 },
|
||||
{ 0x0000812c, 0x00000000 },
|
||||
|
@ -2735,7 +2732,6 @@ static const u32 ar9280Common_9280_2[][2] = {
|
|||
{ 0x00008178, 0x00000100 },
|
||||
{ 0x0000817c, 0x00000000 },
|
||||
{ 0x000081c0, 0x00000000 },
|
||||
{ 0x000081d0, 0x00003210 },
|
||||
{ 0x000081ec, 0x00000000 },
|
||||
{ 0x000081f0, 0x00000000 },
|
||||
{ 0x000081f4, 0x00000000 },
|
||||
|
@ -2817,7 +2813,7 @@ static const u32 ar9280Common_9280_2[][2] = {
|
|||
{ 0x00009958, 0x2108ecff },
|
||||
{ 0x00009940, 0x14750604 },
|
||||
{ 0x0000c95c, 0x004b6a8e },
|
||||
{ 0x00009968, 0x000003ce },
|
||||
{ 0x0000c968, 0x000003ce },
|
||||
{ 0x00009970, 0x190fb515 },
|
||||
{ 0x00009974, 0x00000000 },
|
||||
{ 0x00009978, 0x00000001 },
|
||||
|
@ -2909,16 +2905,12 @@ static const u32 ar9280Common_9280_2[][2] = {
|
|||
{ 0x0000780c, 0x21084210 },
|
||||
{ 0x00007810, 0x6d801300 },
|
||||
{ 0x00007818, 0x07e41000 },
|
||||
{ 0x0000781c, 0x00392000 },
|
||||
{ 0x00007820, 0x92592480 },
|
||||
{ 0x00007824, 0x00040000 },
|
||||
{ 0x00007828, 0xdb005012 },
|
||||
{ 0x0000782c, 0x04924914 },
|
||||
{ 0x00007830, 0x21084210 },
|
||||
{ 0x00007834, 0x6d801300 },
|
||||
{ 0x0000783c, 0x07e40000 },
|
||||
{ 0x00007840, 0x00392000 },
|
||||
{ 0x00007844, 0x92592480 },
|
||||
{ 0x00007848, 0x00100000 },
|
||||
{ 0x0000784c, 0x773f0567 },
|
||||
{ 0x00007850, 0x54214514 },
|
||||
|
@ -2954,7 +2946,6 @@ static const u32 ar9280Modes_fast_clock_9280_2[][3] = {
|
|||
{ 0x00009844, 0x03721821, 0x03721821 },
|
||||
{ 0x00009914, 0x00000898, 0x00001130 },
|
||||
{ 0x00009918, 0x0000000b, 0x00000016 },
|
||||
{ 0x00009944, 0xdfbc1210, 0xdfbc1210 },
|
||||
};
|
||||
|
||||
static const u32 ar9280Modes_backoff_23db_rxgain_9280_2[][6] = {
|
||||
|
@ -3366,21 +3357,26 @@ static const u32 ar9280Modes_high_power_tx_gain_9280_2[][6] = {
|
|||
{ 0x0000a318, 0x0001504a, 0x0001504a, 0x0001820a, 0x0001820a, 0x0001820a },
|
||||
{ 0x0000a31c, 0x0001904c, 0x0001904c, 0x0001b211, 0x0001b211, 0x0001b211 },
|
||||
{ 0x0000a320, 0x0001c04e, 0x0001c04e, 0x0001e213, 0x0001e213, 0x0001e213 },
|
||||
{ 0x0000a324, 0x00020092, 0x00020092, 0x00022411, 0x00022411, 0x00022411 },
|
||||
{ 0x0000a328, 0x0002410a, 0x0002410a, 0x00025413, 0x00025413, 0x00025413 },
|
||||
{ 0x0000a32c, 0x0002710c, 0x0002710c, 0x00029811, 0x00029811, 0x00029811 },
|
||||
{ 0x0000a330, 0x0002b18b, 0x0002b18b, 0x0002c813, 0x0002c813, 0x0002c813 },
|
||||
{ 0x0000a334, 0x0002e1cc, 0x0002e1cc, 0x00030a14, 0x00030a14, 0x00030a14 },
|
||||
{ 0x0000a338, 0x000321ec, 0x000321ec, 0x00035a50, 0x00035a50, 0x00035a50 },
|
||||
{ 0x0000a33c, 0x000321ec, 0x000321ec, 0x00039c4c, 0x00039c4c, 0x00039c4c },
|
||||
{ 0x0000a340, 0x000321ec, 0x000321ec, 0x0003de8a, 0x0003de8a, 0x0003de8a },
|
||||
{ 0x0000a344, 0x000321ec, 0x000321ec, 0x00042e92, 0x00042e92, 0x00042e92 },
|
||||
{ 0x0000a348, 0x000321ec, 0x000321ec, 0x00046ed2, 0x00046ed2, 0x00046ed2 },
|
||||
{ 0x0000a34c, 0x000321ec, 0x000321ec, 0x0004bed5, 0x0004bed5, 0x0004bed5 },
|
||||
{ 0x0000a350, 0x000321ec, 0x000321ec, 0x0004ff54, 0x0004ff54, 0x0004ff54 },
|
||||
{ 0x0000a354, 0x000321ec, 0x000321ec, 0x00053fd5, 0x00053fd5, 0x00053fd5 },
|
||||
{ 0x0000a324, 0x00021092, 0x00021092, 0x00022411, 0x00022411, 0x00022411 },
|
||||
{ 0x0000a328, 0x0002510a, 0x0002510a, 0x00025413, 0x00025413, 0x00025413 },
|
||||
{ 0x0000a32c, 0x0002910c, 0x0002910c, 0x00029811, 0x00029811, 0x00029811 },
|
||||
{ 0x0000a330, 0x0002c18b, 0x0002c18b, 0x0002c813, 0x0002c813, 0x0002c813 },
|
||||
{ 0x0000a334, 0x0002f1cc, 0x0002f1cc, 0x00030a14, 0x00030a14, 0x00030a14 },
|
||||
{ 0x0000a338, 0x000321eb, 0x000321eb, 0x00035a50, 0x00035a50, 0x00035a50 },
|
||||
{ 0x0000a33c, 0x000341ec, 0x000341ec, 0x00039c4c, 0x00039c4c, 0x00039c4c },
|
||||
{ 0x0000a340, 0x000341ec, 0x000341ec, 0x0003de8a, 0x0003de8a, 0x0003de8a },
|
||||
{ 0x0000a344, 0x000341ec, 0x000341ec, 0x00042e92, 0x00042e92, 0x00042e92 },
|
||||
{ 0x0000a348, 0x000341ec, 0x000341ec, 0x00046ed2, 0x00046ed2, 0x00046ed2 },
|
||||
{ 0x0000a34c, 0x000341ec, 0x000341ec, 0x0004bed5, 0x0004bed5, 0x0004bed5 },
|
||||
{ 0x0000a350, 0x000341ec, 0x000341ec, 0x0004ff54, 0x0004ff54, 0x0004ff54 },
|
||||
{ 0x0000a354, 0x000341ec, 0x000341ec, 0x00055fd5, 0x00055fd5, 0x00055fd5 },
|
||||
{ 0x00007814, 0x00198eff, 0x00198eff, 0x00198eff, 0x00198eff, 0x00198eff },
|
||||
{ 0x00007838, 0x00198eff, 0x00198eff, 0x00198eff, 0x00198eff, 0x00198eff },
|
||||
{ 0x0000781c, 0x00172000, 0x00172000, 0x00172000, 0x00172000, 0x00172000 },
|
||||
{ 0x00007840, 0x00172000, 0x00172000, 0x00172000, 0x00172000, 0x00172000 },
|
||||
{ 0x00007820, 0xf258a480, 0xf258a480, 0xf258a480, 0xf258a480, 0xf258a480 },
|
||||
{ 0x00007844, 0xf258a480, 0xf258a480, 0xf258a480, 0xf258a480, 0xf258a480 },
|
||||
{ 0x0000a274, 0x0a19e652, 0x0a19e652, 0x0a1aa652, 0x0a1aa652, 0x0a1aa652 },
|
||||
{ 0x0000a27c, 0x050739ce, 0x050739ce, 0x050739ce, 0x050739ce, 0x050739ce },
|
||||
};
|
||||
|
||||
|
@ -3409,6 +3405,11 @@ static const u32 ar9280Modes_original_tx_gain_9280_2[][6] = {
|
|||
{ 0x0000a354, 0x000321ec, 0x000321ec, 0x0004bf42, 0x0004bf42, 0x0004bf42 },
|
||||
{ 0x00007814, 0x0019beff, 0x0019beff, 0x0019beff, 0x0019beff, 0x0019beff },
|
||||
{ 0x00007838, 0x0019beff, 0x0019beff, 0x0019beff, 0x0019beff, 0x0019beff },
|
||||
{ 0x0000781c, 0x00392000, 0x00392000, 0x00392000, 0x00392000, 0x00392000 },
|
||||
{ 0x00007840, 0x00392000, 0x00392000, 0x00392000, 0x00392000, 0x00392000 },
|
||||
{ 0x00007820, 0x92592480, 0x92592480, 0x92592480, 0x92592480, 0x92592480 },
|
||||
{ 0x00007844, 0x92592480, 0x92592480, 0x92592480, 0x92592480, 0x92592480 },
|
||||
{ 0x0000a274, 0x0a19c652, 0x0a19c652, 0x0a1aa652, 0x0a1aa652, 0x0a1aa652 },
|
||||
{ 0x0000a27c, 0x050701ce, 0x050701ce, 0x050701ce, 0x050701ce, 0x050701ce },
|
||||
};
|
||||
|
||||
|
@ -4135,11 +4136,11 @@ static const u_int32_t ar9285Modes_9285_1_2[][6] = {
|
|||
{ 0x00009834, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e },
|
||||
{ 0x00009838, 0x00000007, 0x00000007, 0x00000007, 0x00000007, 0x00000007 },
|
||||
{ 0x00009840, 0x206a012e, 0x206a012e, 0x206a012e, 0x206a012e, 0x206a012e },
|
||||
{ 0x00009844, 0x0372161e, 0x0372161e, 0x03720020, 0x03720020, 0x037216a0 },
|
||||
{ 0x00009848, 0x00001066, 0x00001066, 0x00000057, 0x00000057, 0x00001059 },
|
||||
{ 0x00009844, 0x0372161e, 0x0372161e, 0x03721620, 0x03721620, 0x037216a0 },
|
||||
{ 0x00009848, 0x00001066, 0x00001066, 0x00001053, 0x00001053, 0x00001059 },
|
||||
{ 0x00009850, 0x6d4000e2, 0x6d4000e2, 0x6d4000e2, 0x6d4000e2, 0x6d4000e2 },
|
||||
{ 0x00009858, 0x7ec84d2e, 0x7ec84d2e, 0x7ec84d2e, 0x7ec84d2e, 0x7ec84d2e },
|
||||
{ 0x0000985c, 0x3139605e, 0x3139605e, 0x3136605e, 0x3136605e, 0x3139605e },
|
||||
{ 0x0000985c, 0x3139605e, 0x3139605e, 0x3137605e, 0x3137605e, 0x3139605e },
|
||||
{ 0x00009860, 0x00058d18, 0x00058d18, 0x00058d20, 0x00058d20, 0x00058d18 },
|
||||
{ 0x00009864, 0x0000fe00, 0x0000fe00, 0x0001ce00, 0x0001ce00, 0x0001ce00 },
|
||||
{ 0x00009868, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0 },
|
||||
|
@ -4159,264 +4160,264 @@ static const u_int32_t ar9285Modes_9285_1_2[][6] = {
|
|||
{ 0x000099d0, 0x00046384, 0x00046384, 0x00046384, 0x00046384, 0x00046384 },
|
||||
{ 0x000099d4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0x000099d8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0x00009a00, 0x00000000, 0x00000000, 0x00068084, 0x00068084, 0x00000000 },
|
||||
{ 0x00009a04, 0x00000000, 0x00000000, 0x00068088, 0x00068088, 0x00000000 },
|
||||
{ 0x00009a08, 0x00000000, 0x00000000, 0x0006808c, 0x0006808c, 0x00000000 },
|
||||
{ 0x00009a0c, 0x00000000, 0x00000000, 0x00068100, 0x00068100, 0x00000000 },
|
||||
{ 0x00009a10, 0x00000000, 0x00000000, 0x00068104, 0x00068104, 0x00000000 },
|
||||
{ 0x00009a14, 0x00000000, 0x00000000, 0x00068108, 0x00068108, 0x00000000 },
|
||||
{ 0x00009a18, 0x00000000, 0x00000000, 0x0006810c, 0x0006810c, 0x00000000 },
|
||||
{ 0x00009a1c, 0x00000000, 0x00000000, 0x00068110, 0x00068110, 0x00000000 },
|
||||
{ 0x00009a20, 0x00000000, 0x00000000, 0x00068114, 0x00068114, 0x00000000 },
|
||||
{ 0x00009a24, 0x00000000, 0x00000000, 0x00068180, 0x00068180, 0x00000000 },
|
||||
{ 0x00009a28, 0x00000000, 0x00000000, 0x00068184, 0x00068184, 0x00000000 },
|
||||
{ 0x00009a2c, 0x00000000, 0x00000000, 0x00068188, 0x00068188, 0x00000000 },
|
||||
{ 0x00009a30, 0x00000000, 0x00000000, 0x0006818c, 0x0006818c, 0x00000000 },
|
||||
{ 0x00009a34, 0x00000000, 0x00000000, 0x00068190, 0x00068190, 0x00000000 },
|
||||
{ 0x00009a38, 0x00000000, 0x00000000, 0x00068194, 0x00068194, 0x00000000 },
|
||||
{ 0x00009a3c, 0x00000000, 0x00000000, 0x000681a0, 0x000681a0, 0x00000000 },
|
||||
{ 0x00009a40, 0x00000000, 0x00000000, 0x0006820c, 0x0006820c, 0x00000000 },
|
||||
{ 0x00009a44, 0x00000000, 0x00000000, 0x000681a8, 0x000681a8, 0x00000000 },
|
||||
{ 0x00009a48, 0x00000000, 0x00000000, 0x00068284, 0x00068284, 0x00000000 },
|
||||
{ 0x00009a4c, 0x00000000, 0x00000000, 0x00068288, 0x00068288, 0x00000000 },
|
||||
{ 0x00009a50, 0x00000000, 0x00000000, 0x00068220, 0x00068220, 0x00000000 },
|
||||
{ 0x00009a54, 0x00000000, 0x00000000, 0x00068290, 0x00068290, 0x00000000 },
|
||||
{ 0x00009a58, 0x00000000, 0x00000000, 0x00068300, 0x00068300, 0x00000000 },
|
||||
{ 0x00009a5c, 0x00000000, 0x00000000, 0x00068304, 0x00068304, 0x00000000 },
|
||||
{ 0x00009a60, 0x00000000, 0x00000000, 0x00068308, 0x00068308, 0x00000000 },
|
||||
{ 0x00009a64, 0x00000000, 0x00000000, 0x0006830c, 0x0006830c, 0x00000000 },
|
||||
{ 0x00009a68, 0x00000000, 0x00000000, 0x00068380, 0x00068380, 0x00000000 },
|
||||
{ 0x00009a6c, 0x00000000, 0x00000000, 0x00068384, 0x00068384, 0x00000000 },
|
||||
{ 0x00009a00, 0x00000000, 0x00000000, 0x00058084, 0x00058084, 0x00000000 },
|
||||
{ 0x00009a04, 0x00000000, 0x00000000, 0x00058088, 0x00058088, 0x00000000 },
|
||||
{ 0x00009a08, 0x00000000, 0x00000000, 0x0005808c, 0x0005808c, 0x00000000 },
|
||||
{ 0x00009a0c, 0x00000000, 0x00000000, 0x00058100, 0x00058100, 0x00000000 },
|
||||
{ 0x00009a10, 0x00000000, 0x00000000, 0x00058104, 0x00058104, 0x00000000 },
|
||||
{ 0x00009a14, 0x00000000, 0x00000000, 0x00058108, 0x00058108, 0x00000000 },
|
||||
{ 0x00009a18, 0x00000000, 0x00000000, 0x0005810c, 0x0005810c, 0x00000000 },
|
||||
{ 0x00009a1c, 0x00000000, 0x00000000, 0x00058110, 0x00058110, 0x00000000 },
|
||||
{ 0x00009a20, 0x00000000, 0x00000000, 0x00058114, 0x00058114, 0x00000000 },
|
||||
{ 0x00009a24, 0x00000000, 0x00000000, 0x00058180, 0x00058180, 0x00000000 },
|
||||
{ 0x00009a28, 0x00000000, 0x00000000, 0x00058184, 0x00058184, 0x00000000 },
|
||||
{ 0x00009a2c, 0x00000000, 0x00000000, 0x00058188, 0x00058188, 0x00000000 },
|
||||
{ 0x00009a30, 0x00000000, 0x00000000, 0x0005818c, 0x0005818c, 0x00000000 },
|
||||
{ 0x00009a34, 0x00000000, 0x00000000, 0x00058190, 0x00058190, 0x00000000 },
|
||||
{ 0x00009a38, 0x00000000, 0x00000000, 0x00058194, 0x00058194, 0x00000000 },
|
||||
{ 0x00009a3c, 0x00000000, 0x00000000, 0x000581a0, 0x000581a0, 0x00000000 },
|
||||
{ 0x00009a40, 0x00000000, 0x00000000, 0x0005820c, 0x0005820c, 0x00000000 },
|
||||
{ 0x00009a44, 0x00000000, 0x00000000, 0x000581a8, 0x000581a8, 0x00000000 },
|
||||
{ 0x00009a48, 0x00000000, 0x00000000, 0x00058284, 0x00058284, 0x00000000 },
|
||||
{ 0x00009a4c, 0x00000000, 0x00000000, 0x00058288, 0x00058288, 0x00000000 },
|
||||
{ 0x00009a50, 0x00000000, 0x00000000, 0x00058220, 0x00058220, 0x00000000 },
|
||||
{ 0x00009a54, 0x00000000, 0x00000000, 0x00058290, 0x00058290, 0x00000000 },
|
||||
{ 0x00009a58, 0x00000000, 0x00000000, 0x00058300, 0x00058300, 0x00000000 },
|
||||
{ 0x00009a5c, 0x00000000, 0x00000000, 0x00058304, 0x00058304, 0x00000000 },
|
||||
{ 0x00009a60, 0x00000000, 0x00000000, 0x00058308, 0x00058308, 0x00000000 },
|
||||
{ 0x00009a64, 0x00000000, 0x00000000, 0x0005830c, 0x0005830c, 0x00000000 },
|
||||
{ 0x00009a68, 0x00000000, 0x00000000, 0x00058380, 0x00058380, 0x00000000 },
|
||||
{ 0x00009a6c, 0x00000000, 0x00000000, 0x00058384, 0x00058384, 0x00000000 },
|
||||
{ 0x00009a70, 0x00000000, 0x00000000, 0x00068700, 0x00068700, 0x00000000 },
|
||||
{ 0x00009a74, 0x00000000, 0x00000000, 0x00068704, 0x00068704, 0x00000000 },
|
||||
{ 0x00009a78, 0x00000000, 0x00000000, 0x00068708, 0x00068708, 0x00000000 },
|
||||
{ 0x00009a7c, 0x00000000, 0x00000000, 0x0006870c, 0x0006870c, 0x00000000 },
|
||||
{ 0x00009a80, 0x00000000, 0x00000000, 0x00068780, 0x00068780, 0x00000000 },
|
||||
{ 0x00009a84, 0x00000000, 0x00000000, 0x00068784, 0x00068784, 0x00000000 },
|
||||
{ 0x00009a88, 0x00000000, 0x00000000, 0x00068b04, 0x00068b04, 0x00000000 },
|
||||
{ 0x00009a8c, 0x00000000, 0x00000000, 0x00068b08, 0x00068b08, 0x00000000 },
|
||||
{ 0x00009a90, 0x00000000, 0x00000000, 0x00068b08, 0x00068b08, 0x00000000 },
|
||||
{ 0x00009a94, 0x00000000, 0x00000000, 0x00068b0c, 0x00068b0c, 0x00000000 },
|
||||
{ 0x00009a98, 0x00000000, 0x00000000, 0x00068b80, 0x00068b80, 0x00000000 },
|
||||
{ 0x00009a9c, 0x00000000, 0x00000000, 0x00068b84, 0x00068b84, 0x00000000 },
|
||||
{ 0x00009aa0, 0x00000000, 0x00000000, 0x00068b88, 0x00068b88, 0x00000000 },
|
||||
{ 0x00009aa4, 0x00000000, 0x00000000, 0x00068b8c, 0x00068b8c, 0x00000000 },
|
||||
{ 0x00009aa8, 0x00000000, 0x00000000, 0x000b8b90, 0x000b8b90, 0x00000000 },
|
||||
{ 0x00009aac, 0x00000000, 0x00000000, 0x000b8f80, 0x000b8f80, 0x00000000 },
|
||||
{ 0x00009ab0, 0x00000000, 0x00000000, 0x000b8f84, 0x000b8f84, 0x00000000 },
|
||||
{ 0x00009ab4, 0x00000000, 0x00000000, 0x000b8f88, 0x000b8f88, 0x00000000 },
|
||||
{ 0x00009ab8, 0x00000000, 0x00000000, 0x000b8f8c, 0x000b8f8c, 0x00000000 },
|
||||
{ 0x00009abc, 0x00000000, 0x00000000, 0x000b8f90, 0x000b8f90, 0x00000000 },
|
||||
{ 0x00009ac0, 0x00000000, 0x00000000, 0x000bb30c, 0x000bb30c, 0x00000000 },
|
||||
{ 0x00009ac4, 0x00000000, 0x00000000, 0x000bb310, 0x000bb310, 0x00000000 },
|
||||
{ 0x00009ac8, 0x00000000, 0x00000000, 0x000bb384, 0x000bb384, 0x00000000 },
|
||||
{ 0x00009acc, 0x00000000, 0x00000000, 0x000bb388, 0x000bb388, 0x00000000 },
|
||||
{ 0x00009ad0, 0x00000000, 0x00000000, 0x000bb324, 0x000bb324, 0x00000000 },
|
||||
{ 0x00009ad4, 0x00000000, 0x00000000, 0x000bb704, 0x000bb704, 0x00000000 },
|
||||
{ 0x00009ad8, 0x00000000, 0x00000000, 0x000f96a4, 0x000f96a4, 0x00000000 },
|
||||
{ 0x00009adc, 0x00000000, 0x00000000, 0x000f96a8, 0x000f96a8, 0x00000000 },
|
||||
{ 0x00009ae0, 0x00000000, 0x00000000, 0x000f9710, 0x000f9710, 0x00000000 },
|
||||
{ 0x00009ae4, 0x00000000, 0x00000000, 0x000f9714, 0x000f9714, 0x00000000 },
|
||||
{ 0x00009ae8, 0x00000000, 0x00000000, 0x000f9720, 0x000f9720, 0x00000000 },
|
||||
{ 0x00009aec, 0x00000000, 0x00000000, 0x000f9724, 0x000f9724, 0x00000000 },
|
||||
{ 0x00009af0, 0x00000000, 0x00000000, 0x000f9728, 0x000f9728, 0x00000000 },
|
||||
{ 0x00009af4, 0x00000000, 0x00000000, 0x000f972c, 0x000f972c, 0x00000000 },
|
||||
{ 0x00009af8, 0x00000000, 0x00000000, 0x000f97a0, 0x000f97a0, 0x00000000 },
|
||||
{ 0x00009afc, 0x00000000, 0x00000000, 0x000f97a4, 0x000f97a4, 0x00000000 },
|
||||
{ 0x00009b00, 0x00000000, 0x00000000, 0x000fb7a8, 0x000fb7a8, 0x00000000 },
|
||||
{ 0x00009b04, 0x00000000, 0x00000000, 0x000fb7b0, 0x000fb7b0, 0x00000000 },
|
||||
{ 0x00009b08, 0x00000000, 0x00000000, 0x000fb7b4, 0x000fb7b4, 0x00000000 },
|
||||
{ 0x00009b0c, 0x00000000, 0x00000000, 0x000fb7b8, 0x000fb7b8, 0x00000000 },
|
||||
{ 0x00009b10, 0x00000000, 0x00000000, 0x000fb7a5, 0x000fb7a5, 0x00000000 },
|
||||
{ 0x00009b14, 0x00000000, 0x00000000, 0x000fb7a9, 0x000fb7a9, 0x00000000 },
|
||||
{ 0x00009b18, 0x00000000, 0x00000000, 0x000fb7ad, 0x000fb7ad, 0x00000000 },
|
||||
{ 0x00009b1c, 0x00000000, 0x00000000, 0x000fb7b1, 0x000fb7b1, 0x00000000 },
|
||||
{ 0x00009b20, 0x00000000, 0x00000000, 0x000fb7b5, 0x000fb7b5, 0x00000000 },
|
||||
{ 0x00009b24, 0x00000000, 0x00000000, 0x000fb7b9, 0x000fb7b9, 0x00000000 },
|
||||
{ 0x00009b28, 0x00000000, 0x00000000, 0x000fb7c5, 0x000fb7c5, 0x00000000 },
|
||||
{ 0x00009b2c, 0x00000000, 0x00000000, 0x000fb7c9, 0x000fb7c9, 0x00000000 },
|
||||
{ 0x00009b30, 0x00000000, 0x00000000, 0x000fb7d1, 0x000fb7d1, 0x00000000 },
|
||||
{ 0x00009b34, 0x00000000, 0x00000000, 0x000fb7d5, 0x000fb7d5, 0x00000000 },
|
||||
{ 0x00009b38, 0x00000000, 0x00000000, 0x000fb7d9, 0x000fb7d9, 0x00000000 },
|
||||
{ 0x00009b3c, 0x00000000, 0x00000000, 0x000fb7c6, 0x000fb7c6, 0x00000000 },
|
||||
{ 0x00009b40, 0x00000000, 0x00000000, 0x000fb7ca, 0x000fb7ca, 0x00000000 },
|
||||
{ 0x00009b44, 0x00000000, 0x00000000, 0x000fb7ce, 0x000fb7ce, 0x00000000 },
|
||||
{ 0x00009b48, 0x00000000, 0x00000000, 0x000fb7d2, 0x000fb7d2, 0x00000000 },
|
||||
{ 0x00009b4c, 0x00000000, 0x00000000, 0x000fb7d6, 0x000fb7d6, 0x00000000 },
|
||||
{ 0x00009b50, 0x00000000, 0x00000000, 0x000fb7c3, 0x000fb7c3, 0x00000000 },
|
||||
{ 0x00009b54, 0x00000000, 0x00000000, 0x000fb7c7, 0x000fb7c7, 0x00000000 },
|
||||
{ 0x00009b58, 0x00000000, 0x00000000, 0x000fb7cb, 0x000fb7cb, 0x00000000 },
|
||||
{ 0x00009b5c, 0x00000000, 0x00000000, 0x000fb7cf, 0x000fb7cf, 0x00000000 },
|
||||
{ 0x00009b60, 0x00000000, 0x00000000, 0x000fb7d7, 0x000fb7d7, 0x00000000 },
|
||||
{ 0x00009b64, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009b68, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009b6c, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009b70, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009b74, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009b78, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009b7c, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009b80, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009b84, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009b88, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009b8c, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009b90, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009b94, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009b98, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009b9c, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009ba0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009ba4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009ba8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009bac, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009bb0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009bb4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009bb8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009bbc, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009bc0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009bc4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009bc8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009bcc, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009bd0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009bd4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009bd8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009bdc, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009be0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009be4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009be8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009bec, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009bf0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009bf4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009bf8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x00009bfc, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 },
|
||||
{ 0x0000aa00, 0x00000000, 0x00000000, 0x0006801c, 0x0006801c, 0x00000000 },
|
||||
{ 0x0000aa04, 0x00000000, 0x00000000, 0x0006801c, 0x0006801c, 0x00000000 },
|
||||
{ 0x0000aa08, 0x00000000, 0x00000000, 0x0006801c, 0x0006801c, 0x00000000 },
|
||||
{ 0x0000aa0c, 0x00000000, 0x00000000, 0x00068080, 0x00068080, 0x00000000 },
|
||||
{ 0x0000aa10, 0x00000000, 0x00000000, 0x00068084, 0x00068084, 0x00000000 },
|
||||
{ 0x0000aa14, 0x00000000, 0x00000000, 0x00068088, 0x00068088, 0x00000000 },
|
||||
{ 0x0000aa18, 0x00000000, 0x00000000, 0x0006808c, 0x0006808c, 0x00000000 },
|
||||
{ 0x0000aa1c, 0x00000000, 0x00000000, 0x00068100, 0x00068100, 0x00000000 },
|
||||
{ 0x0000aa20, 0x00000000, 0x00000000, 0x00068104, 0x00068104, 0x00000000 },
|
||||
{ 0x0000aa24, 0x00000000, 0x00000000, 0x00068108, 0x00068108, 0x00000000 },
|
||||
{ 0x0000aa28, 0x00000000, 0x00000000, 0x0006810c, 0x0006810c, 0x00000000 },
|
||||
{ 0x0000aa2c, 0x00000000, 0x00000000, 0x00068110, 0x00068110, 0x00000000 },
|
||||
{ 0x0000aa30, 0x00000000, 0x00000000, 0x00068110, 0x00068110, 0x00000000 },
|
||||
{ 0x0000aa34, 0x00000000, 0x00000000, 0x00068180, 0x00068180, 0x00000000 },
|
||||
{ 0x0000aa38, 0x00000000, 0x00000000, 0x00068184, 0x00068184, 0x00000000 },
|
||||
{ 0x0000aa3c, 0x00000000, 0x00000000, 0x00068188, 0x00068188, 0x00000000 },
|
||||
{ 0x0000aa40, 0x00000000, 0x00000000, 0x0006818c, 0x0006818c, 0x00000000 },
|
||||
{ 0x0000aa44, 0x00000000, 0x00000000, 0x00068190, 0x00068190, 0x00000000 },
|
||||
{ 0x0000aa48, 0x00000000, 0x00000000, 0x00068194, 0x00068194, 0x00000000 },
|
||||
{ 0x0000aa4c, 0x00000000, 0x00000000, 0x000681a0, 0x000681a0, 0x00000000 },
|
||||
{ 0x0000aa50, 0x00000000, 0x00000000, 0x0006820c, 0x0006820c, 0x00000000 },
|
||||
{ 0x0000aa54, 0x00000000, 0x00000000, 0x000681a8, 0x000681a8, 0x00000000 },
|
||||
{ 0x0000aa58, 0x00000000, 0x00000000, 0x000681ac, 0x000681ac, 0x00000000 },
|
||||
{ 0x0000aa5c, 0x00000000, 0x00000000, 0x0006821c, 0x0006821c, 0x00000000 },
|
||||
{ 0x0000aa60, 0x00000000, 0x00000000, 0x00068224, 0x00068224, 0x00000000 },
|
||||
{ 0x0000aa64, 0x00000000, 0x00000000, 0x00068290, 0x00068290, 0x00000000 },
|
||||
{ 0x0000aa68, 0x00000000, 0x00000000, 0x00068300, 0x00068300, 0x00000000 },
|
||||
{ 0x0000aa6c, 0x00000000, 0x00000000, 0x00068308, 0x00068308, 0x00000000 },
|
||||
{ 0x0000aa70, 0x00000000, 0x00000000, 0x0006830c, 0x0006830c, 0x00000000 },
|
||||
{ 0x0000aa74, 0x00000000, 0x00000000, 0x00068310, 0x00068310, 0x00000000 },
|
||||
{ 0x0000aa78, 0x00000000, 0x00000000, 0x00068788, 0x00068788, 0x00000000 },
|
||||
{ 0x0000aa7c, 0x00000000, 0x00000000, 0x0006878c, 0x0006878c, 0x00000000 },
|
||||
{ 0x0000aa80, 0x00000000, 0x00000000, 0x00068790, 0x00068790, 0x00000000 },
|
||||
{ 0x0000aa84, 0x00000000, 0x00000000, 0x00068794, 0x00068794, 0x00000000 },
|
||||
{ 0x0000aa88, 0x00000000, 0x00000000, 0x00068798, 0x00068798, 0x00000000 },
|
||||
{ 0x0000aa8c, 0x00000000, 0x00000000, 0x0006879c, 0x0006879c, 0x00000000 },
|
||||
{ 0x0000aa90, 0x00000000, 0x00000000, 0x00068b89, 0x00068b89, 0x00000000 },
|
||||
{ 0x0000aa94, 0x00000000, 0x00000000, 0x00068b8d, 0x00068b8d, 0x00000000 },
|
||||
{ 0x0000aa98, 0x00000000, 0x00000000, 0x00068b91, 0x00068b91, 0x00000000 },
|
||||
{ 0x0000aa9c, 0x00000000, 0x00000000, 0x00068b95, 0x00068b95, 0x00000000 },
|
||||
{ 0x0000aaa0, 0x00000000, 0x00000000, 0x00068b99, 0x00068b99, 0x00000000 },
|
||||
{ 0x0000aaa4, 0x00000000, 0x00000000, 0x00068ba5, 0x00068ba5, 0x00000000 },
|
||||
{ 0x0000aaa8, 0x00000000, 0x00000000, 0x00068ba9, 0x00068ba9, 0x00000000 },
|
||||
{ 0x0000aaac, 0x00000000, 0x00000000, 0x00068bad, 0x00068bad, 0x00000000 },
|
||||
{ 0x0000aab0, 0x00000000, 0x00000000, 0x000b8b0c, 0x000b8b0c, 0x00000000 },
|
||||
{ 0x0000aab4, 0x00000000, 0x00000000, 0x000b8f10, 0x000b8f10, 0x00000000 },
|
||||
{ 0x0000aab8, 0x00000000, 0x00000000, 0x000b8f14, 0x000b8f14, 0x00000000 },
|
||||
{ 0x0000aabc, 0x00000000, 0x00000000, 0x000b8f84, 0x000b8f84, 0x00000000 },
|
||||
{ 0x0000aac0, 0x00000000, 0x00000000, 0x000b8f84, 0x000b8f84, 0x00000000 },
|
||||
{ 0x0000aac4, 0x00000000, 0x00000000, 0x000b8f88, 0x000b8f88, 0x00000000 },
|
||||
{ 0x0000aac8, 0x00000000, 0x00000000, 0x000bb380, 0x000bb380, 0x00000000 },
|
||||
{ 0x0000aacc, 0x00000000, 0x00000000, 0x000bb384, 0x000bb384, 0x00000000 },
|
||||
{ 0x0000aad0, 0x00000000, 0x00000000, 0x000bb388, 0x000bb388, 0x00000000 },
|
||||
{ 0x0000aad4, 0x00000000, 0x00000000, 0x000bb38c, 0x000bb38c, 0x00000000 },
|
||||
{ 0x0000aad8, 0x00000000, 0x00000000, 0x000bb394, 0x000bb394, 0x00000000 },
|
||||
{ 0x0000aadc, 0x00000000, 0x00000000, 0x000bb798, 0x000bb798, 0x00000000 },
|
||||
{ 0x0000aae0, 0x00000000, 0x00000000, 0x000f970c, 0x000f970c, 0x00000000 },
|
||||
{ 0x0000aae4, 0x00000000, 0x00000000, 0x000f9710, 0x000f9710, 0x00000000 },
|
||||
{ 0x0000aae8, 0x00000000, 0x00000000, 0x000f9714, 0x000f9714, 0x00000000 },
|
||||
{ 0x0000aaec, 0x00000000, 0x00000000, 0x000f9718, 0x000f9718, 0x00000000 },
|
||||
{ 0x0000aaf0, 0x00000000, 0x00000000, 0x000f9705, 0x000f9705, 0x00000000 },
|
||||
{ 0x0000aaf4, 0x00000000, 0x00000000, 0x000f9709, 0x000f9709, 0x00000000 },
|
||||
{ 0x0000aaf8, 0x00000000, 0x00000000, 0x000f970d, 0x000f970d, 0x00000000 },
|
||||
{ 0x0000aafc, 0x00000000, 0x00000000, 0x000f9711, 0x000f9711, 0x00000000 },
|
||||
{ 0x0000ab00, 0x00000000, 0x00000000, 0x000f9715, 0x000f9715, 0x00000000 },
|
||||
{ 0x0000ab04, 0x00000000, 0x00000000, 0x000f9719, 0x000f9719, 0x00000000 },
|
||||
{ 0x0000ab08, 0x00000000, 0x00000000, 0x000fb7a4, 0x000fb7a4, 0x00000000 },
|
||||
{ 0x0000ab0c, 0x00000000, 0x00000000, 0x000fb7a8, 0x000fb7a8, 0x00000000 },
|
||||
{ 0x0000ab10, 0x00000000, 0x00000000, 0x000fb7ac, 0x000fb7ac, 0x00000000 },
|
||||
{ 0x0000ab14, 0x00000000, 0x00000000, 0x000fb7ac, 0x000fb7ac, 0x00000000 },
|
||||
{ 0x0000ab18, 0x00000000, 0x00000000, 0x000fb7b0, 0x000fb7b0, 0x00000000 },
|
||||
{ 0x0000ab1c, 0x00000000, 0x00000000, 0x000fb7b8, 0x000fb7b8, 0x00000000 },
|
||||
{ 0x0000ab20, 0x00000000, 0x00000000, 0x000fb7bc, 0x000fb7bc, 0x00000000 },
|
||||
{ 0x0000ab24, 0x00000000, 0x00000000, 0x000fb7a1, 0x000fb7a1, 0x00000000 },
|
||||
{ 0x0000ab28, 0x00000000, 0x00000000, 0x000fb7a5, 0x000fb7a5, 0x00000000 },
|
||||
{ 0x0000ab2c, 0x00000000, 0x00000000, 0x000fb7a9, 0x000fb7a9, 0x00000000 },
|
||||
{ 0x0000ab30, 0x00000000, 0x00000000, 0x000fb7b1, 0x000fb7b1, 0x00000000 },
|
||||
{ 0x0000ab34, 0x00000000, 0x00000000, 0x000fb7b5, 0x000fb7b5, 0x00000000 },
|
||||
{ 0x0000ab38, 0x00000000, 0x00000000, 0x000fb7bd, 0x000fb7bd, 0x00000000 },
|
||||
{ 0x0000ab3c, 0x00000000, 0x00000000, 0x000fb7c9, 0x000fb7c9, 0x00000000 },
|
||||
{ 0x0000ab40, 0x00000000, 0x00000000, 0x000fb7cd, 0x000fb7cd, 0x00000000 },
|
||||
{ 0x0000ab44, 0x00000000, 0x00000000, 0x000fb7d1, 0x000fb7d1, 0x00000000 },
|
||||
{ 0x0000ab48, 0x00000000, 0x00000000, 0x000fb7d9, 0x000fb7d9, 0x00000000 },
|
||||
{ 0x0000ab4c, 0x00000000, 0x00000000, 0x000fb7c2, 0x000fb7c2, 0x00000000 },
|
||||
{ 0x0000ab50, 0x00000000, 0x00000000, 0x000fb7c6, 0x000fb7c6, 0x00000000 },
|
||||
{ 0x0000ab54, 0x00000000, 0x00000000, 0x000fb7ca, 0x000fb7ca, 0x00000000 },
|
||||
{ 0x0000ab58, 0x00000000, 0x00000000, 0x000fb7ce, 0x000fb7ce, 0x00000000 },
|
||||
{ 0x0000ab5c, 0x00000000, 0x00000000, 0x000fb7d2, 0x000fb7d2, 0x00000000 },
|
||||
{ 0x0000ab60, 0x00000000, 0x00000000, 0x000fb7d6, 0x000fb7d6, 0x00000000 },
|
||||
{ 0x0000ab64, 0x00000000, 0x00000000, 0x000fb7c3, 0x000fb7c3, 0x00000000 },
|
||||
{ 0x0000ab68, 0x00000000, 0x00000000, 0x000fb7cb, 0x000fb7cb, 0x00000000 },
|
||||
{ 0x0000ab6c, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000ab70, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000ab74, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000ab78, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000ab7c, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000ab80, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000ab84, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000ab88, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000ab8c, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000ab90, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000ab94, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000ab98, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000ab9c, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000aba0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000aba4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000aba8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000abac, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000abb0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000abb4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000abb8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000abbc, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000abc0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000abc4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000abc8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000abcc, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000abd0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000abd4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000abd8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000abdc, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000abe0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000abe4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000abe8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000abec, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000abf0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000abf4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000abf8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x0000abfc, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 },
|
||||
{ 0x00009a88, 0x00000000, 0x00000000, 0x00078b04, 0x00078b04, 0x00000000 },
|
||||
{ 0x00009a8c, 0x00000000, 0x00000000, 0x00078b08, 0x00078b08, 0x00000000 },
|
||||
{ 0x00009a90, 0x00000000, 0x00000000, 0x00078b08, 0x00078b08, 0x00000000 },
|
||||
{ 0x00009a94, 0x00000000, 0x00000000, 0x00078b0c, 0x00078b0c, 0x00000000 },
|
||||
{ 0x00009a98, 0x00000000, 0x00000000, 0x00078b80, 0x00078b80, 0x00000000 },
|
||||
{ 0x00009a9c, 0x00000000, 0x00000000, 0x00078b84, 0x00078b84, 0x00000000 },
|
||||
{ 0x00009aa0, 0x00000000, 0x00000000, 0x00078b88, 0x00078b88, 0x00000000 },
|
||||
{ 0x00009aa4, 0x00000000, 0x00000000, 0x00078b8c, 0x00078b8c, 0x00000000 },
|
||||
{ 0x00009aa8, 0x00000000, 0x00000000, 0x00078b90, 0x00078b90, 0x00000000 },
|
||||
{ 0x00009aac, 0x00000000, 0x00000000, 0x000caf80, 0x000caf80, 0x00000000 },
|
||||
{ 0x00009ab0, 0x00000000, 0x00000000, 0x000caf84, 0x000caf84, 0x00000000 },
|
||||
{ 0x00009ab4, 0x00000000, 0x00000000, 0x000caf88, 0x000caf88, 0x00000000 },
|
||||
{ 0x00009ab8, 0x00000000, 0x00000000, 0x000caf8c, 0x000caf8c, 0x00000000 },
|
||||
{ 0x00009abc, 0x00000000, 0x00000000, 0x000caf90, 0x000caf90, 0x00000000 },
|
||||
{ 0x00009ac0, 0x00000000, 0x00000000, 0x000db30c, 0x000db30c, 0x00000000 },
|
||||
{ 0x00009ac4, 0x00000000, 0x00000000, 0x000db310, 0x000db310, 0x00000000 },
|
||||
{ 0x00009ac8, 0x00000000, 0x00000000, 0x000db384, 0x000db384, 0x00000000 },
|
||||
{ 0x00009acc, 0x00000000, 0x00000000, 0x000db388, 0x000db388, 0x00000000 },
|
||||
{ 0x00009ad0, 0x00000000, 0x00000000, 0x000db324, 0x000db324, 0x00000000 },
|
||||
{ 0x00009ad4, 0x00000000, 0x00000000, 0x000eb704, 0x000eb704, 0x00000000 },
|
||||
{ 0x00009ad8, 0x00000000, 0x00000000, 0x000eb6a4, 0x000eb6a4, 0x00000000 },
|
||||
{ 0x00009adc, 0x00000000, 0x00000000, 0x000eb6a8, 0x000eb6a8, 0x00000000 },
|
||||
{ 0x00009ae0, 0x00000000, 0x00000000, 0x000eb710, 0x000eb710, 0x00000000 },
|
||||
{ 0x00009ae4, 0x00000000, 0x00000000, 0x000eb714, 0x000eb714, 0x00000000 },
|
||||
{ 0x00009ae8, 0x00000000, 0x00000000, 0x000eb720, 0x000eb720, 0x00000000 },
|
||||
{ 0x00009aec, 0x00000000, 0x00000000, 0x000eb724, 0x000eb724, 0x00000000 },
|
||||
{ 0x00009af0, 0x00000000, 0x00000000, 0x000eb728, 0x000eb728, 0x00000000 },
|
||||
{ 0x00009af4, 0x00000000, 0x00000000, 0x000eb72c, 0x000eb72c, 0x00000000 },
|
||||
{ 0x00009af8, 0x00000000, 0x00000000, 0x000eb7a0, 0x000eb7a0, 0x00000000 },
|
||||
{ 0x00009afc, 0x00000000, 0x00000000, 0x000eb7a4, 0x000eb7a4, 0x00000000 },
|
||||
{ 0x00009b00, 0x00000000, 0x00000000, 0x000eb7a8, 0x000eb7a8, 0x00000000 },
|
||||
{ 0x00009b04, 0x00000000, 0x00000000, 0x000eb7b0, 0x000eb7b0, 0x00000000 },
|
||||
{ 0x00009b08, 0x00000000, 0x00000000, 0x000eb7b4, 0x000eb7b4, 0x00000000 },
|
||||
{ 0x00009b0c, 0x00000000, 0x00000000, 0x000eb7b8, 0x000eb7b8, 0x00000000 },
|
||||
{ 0x00009b10, 0x00000000, 0x00000000, 0x000eb7a5, 0x000eb7a5, 0x00000000 },
|
||||
{ 0x00009b14, 0x00000000, 0x00000000, 0x000eb7a9, 0x000eb7a9, 0x00000000 },
|
||||
{ 0x00009b18, 0x00000000, 0x00000000, 0x000eb7ad, 0x000eb7ad, 0x00000000 },
|
||||
{ 0x00009b1c, 0x00000000, 0x00000000, 0x000eb7b1, 0x000eb7b1, 0x00000000 },
|
||||
{ 0x00009b20, 0x00000000, 0x00000000, 0x000eb7b5, 0x000eb7b5, 0x00000000 },
|
||||
{ 0x00009b24, 0x00000000, 0x00000000, 0x000eb7b9, 0x000eb7b9, 0x00000000 },
|
||||
{ 0x00009b28, 0x00000000, 0x00000000, 0x000eb7c5, 0x000eb7c5, 0x00000000 },
|
||||
{ 0x00009b2c, 0x00000000, 0x00000000, 0x000eb7c9, 0x000eb7c9, 0x00000000 },
|
||||
{ 0x00009b30, 0x00000000, 0x00000000, 0x000eb7d1, 0x000eb7d1, 0x00000000 },
|
||||
{ 0x00009b34, 0x00000000, 0x00000000, 0x000eb7d5, 0x000eb7d5, 0x00000000 },
|
||||
{ 0x00009b38, 0x00000000, 0x00000000, 0x000eb7d9, 0x000eb7d9, 0x00000000 },
|
||||
{ 0x00009b3c, 0x00000000, 0x00000000, 0x000eb7c6, 0x000eb7c6, 0x00000000 },
|
||||
{ 0x00009b40, 0x00000000, 0x00000000, 0x000eb7ca, 0x000eb7ca, 0x00000000 },
|
||||
{ 0x00009b44, 0x00000000, 0x00000000, 0x000eb7ce, 0x000eb7ce, 0x00000000 },
|
||||
{ 0x00009b48, 0x00000000, 0x00000000, 0x000eb7d2, 0x000eb7d2, 0x00000000 },
|
||||
{ 0x00009b4c, 0x00000000, 0x00000000, 0x000eb7d6, 0x000eb7d6, 0x00000000 },
|
||||
{ 0x00009b50, 0x00000000, 0x00000000, 0x000eb7c3, 0x000eb7c3, 0x00000000 },
|
||||
{ 0x00009b54, 0x00000000, 0x00000000, 0x000eb7c7, 0x000eb7c7, 0x00000000 },
|
||||
{ 0x00009b58, 0x00000000, 0x00000000, 0x000eb7cb, 0x000eb7cb, 0x00000000 },
|
||||
{ 0x00009b5c, 0x00000000, 0x00000000, 0x000eb7cf, 0x000eb7cf, 0x00000000 },
|
||||
{ 0x00009b60, 0x00000000, 0x00000000, 0x000eb7d7, 0x000eb7d7, 0x00000000 },
|
||||
{ 0x00009b64, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009b68, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009b6c, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009b70, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009b74, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009b78, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009b7c, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009b80, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009b84, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009b88, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009b8c, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009b90, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009b94, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009b98, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009b9c, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009ba0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009ba4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009ba8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009bac, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009bb0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009bb4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009bb8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009bbc, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009bc0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009bc4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009bc8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009bcc, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009bd0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009bd4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009bd8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009bdc, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009be0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009be4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009be8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009bec, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009bf0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009bf4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009bf8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x00009bfc, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000aa00, 0x00000000, 0x00000000, 0x00058084, 0x00058084, 0x00000000 },
|
||||
{ 0x0000aa04, 0x00000000, 0x00000000, 0x00058088, 0x00058088, 0x00000000 },
|
||||
{ 0x0000aa08, 0x00000000, 0x00000000, 0x0005808c, 0x0005808c, 0x00000000 },
|
||||
{ 0x0000aa0c, 0x00000000, 0x00000000, 0x00058100, 0x00058100, 0x00000000 },
|
||||
{ 0x0000aa10, 0x00000000, 0x00000000, 0x00058104, 0x00058104, 0x00000000 },
|
||||
{ 0x0000aa14, 0x00000000, 0x00000000, 0x00058108, 0x00058108, 0x00000000 },
|
||||
{ 0x0000aa18, 0x00000000, 0x00000000, 0x0005810c, 0x0005810c, 0x00000000 },
|
||||
{ 0x0000aa1c, 0x00000000, 0x00000000, 0x00058110, 0x00058110, 0x00000000 },
|
||||
{ 0x0000aa20, 0x00000000, 0x00000000, 0x00058114, 0x00058114, 0x00000000 },
|
||||
{ 0x0000aa24, 0x00000000, 0x00000000, 0x00058180, 0x00058180, 0x00000000 },
|
||||
{ 0x0000aa28, 0x00000000, 0x00000000, 0x00058184, 0x00058184, 0x00000000 },
|
||||
{ 0x0000aa2c, 0x00000000, 0x00000000, 0x00058188, 0x00058188, 0x00000000 },
|
||||
{ 0x0000aa30, 0x00000000, 0x00000000, 0x0005818c, 0x0005818c, 0x00000000 },
|
||||
{ 0x0000aa34, 0x00000000, 0x00000000, 0x00058190, 0x00058190, 0x00000000 },
|
||||
{ 0x0000aa38, 0x00000000, 0x00000000, 0x00058194, 0x00058194, 0x00000000 },
|
||||
{ 0x0000aa3c, 0x00000000, 0x00000000, 0x000581a0, 0x000581a0, 0x00000000 },
|
||||
{ 0x0000aa40, 0x00000000, 0x00000000, 0x0005820c, 0x0005820c, 0x00000000 },
|
||||
{ 0x0000aa44, 0x00000000, 0x00000000, 0x000581a8, 0x000581a8, 0x00000000 },
|
||||
{ 0x0000aa48, 0x00000000, 0x00000000, 0x00058284, 0x00058284, 0x00000000 },
|
||||
{ 0x0000aa4c, 0x00000000, 0x00000000, 0x00058288, 0x00058288, 0x00000000 },
|
||||
{ 0x0000aa50, 0x00000000, 0x00000000, 0x00058220, 0x00058220, 0x00000000 },
|
||||
{ 0x0000aa54, 0x00000000, 0x00000000, 0x00058290, 0x00058290, 0x00000000 },
|
||||
{ 0x0000aa58, 0x00000000, 0x00000000, 0x00058300, 0x00058300, 0x00000000 },
|
||||
{ 0x0000aa5c, 0x00000000, 0x00000000, 0x00058304, 0x00058304, 0x00000000 },
|
||||
{ 0x0000aa60, 0x00000000, 0x00000000, 0x00058308, 0x00058308, 0x00000000 },
|
||||
{ 0x0000aa64, 0x00000000, 0x00000000, 0x0005830c, 0x0005830c, 0x00000000 },
|
||||
{ 0x0000aa68, 0x00000000, 0x00000000, 0x00058380, 0x00058380, 0x00000000 },
|
||||
{ 0x0000aa6c, 0x00000000, 0x00000000, 0x00058384, 0x00058384, 0x00000000 },
|
||||
{ 0x0000aa70, 0x00000000, 0x00000000, 0x00068700, 0x00068700, 0x00000000 },
|
||||
{ 0x0000aa74, 0x00000000, 0x00000000, 0x00068704, 0x00068704, 0x00000000 },
|
||||
{ 0x0000aa78, 0x00000000, 0x00000000, 0x00068708, 0x00068708, 0x00000000 },
|
||||
{ 0x0000aa7c, 0x00000000, 0x00000000, 0x0006870c, 0x0006870c, 0x00000000 },
|
||||
{ 0x0000aa80, 0x00000000, 0x00000000, 0x00068780, 0x00068780, 0x00000000 },
|
||||
{ 0x0000aa84, 0x00000000, 0x00000000, 0x00068784, 0x00068784, 0x00000000 },
|
||||
{ 0x0000aa88, 0x00000000, 0x00000000, 0x00078b04, 0x00078b04, 0x00000000 },
|
||||
{ 0x0000aa8c, 0x00000000, 0x00000000, 0x00078b08, 0x00078b08, 0x00000000 },
|
||||
{ 0x0000aa90, 0x00000000, 0x00000000, 0x00078b08, 0x00078b08, 0x00000000 },
|
||||
{ 0x0000aa94, 0x00000000, 0x00000000, 0x00078b0c, 0x00078b0c, 0x00000000 },
|
||||
{ 0x0000aa98, 0x00000000, 0x00000000, 0x00078b80, 0x00078b80, 0x00000000 },
|
||||
{ 0x0000aa9c, 0x00000000, 0x00000000, 0x00078b84, 0x00078b84, 0x00000000 },
|
||||
{ 0x0000aaa0, 0x00000000, 0x00000000, 0x00078b88, 0x00078b88, 0x00000000 },
|
||||
{ 0x0000aaa4, 0x00000000, 0x00000000, 0x00078b8c, 0x00078b8c, 0x00000000 },
|
||||
{ 0x0000aaa8, 0x00000000, 0x00000000, 0x00078b90, 0x00078b90, 0x00000000 },
|
||||
{ 0x0000aaac, 0x00000000, 0x00000000, 0x000caf80, 0x000caf80, 0x00000000 },
|
||||
{ 0x0000aab0, 0x00000000, 0x00000000, 0x000caf84, 0x000caf84, 0x00000000 },
|
||||
{ 0x0000aab4, 0x00000000, 0x00000000, 0x000caf88, 0x000caf88, 0x00000000 },
|
||||
{ 0x0000aab8, 0x00000000, 0x00000000, 0x000caf8c, 0x000caf8c, 0x00000000 },
|
||||
{ 0x0000aabc, 0x00000000, 0x00000000, 0x000caf90, 0x000caf90, 0x00000000 },
|
||||
{ 0x0000aac0, 0x00000000, 0x00000000, 0x000db30c, 0x000db30c, 0x00000000 },
|
||||
{ 0x0000aac4, 0x00000000, 0x00000000, 0x000db310, 0x000db310, 0x00000000 },
|
||||
{ 0x0000aac8, 0x00000000, 0x00000000, 0x000db384, 0x000db384, 0x00000000 },
|
||||
{ 0x0000aacc, 0x00000000, 0x00000000, 0x000db388, 0x000db388, 0x00000000 },
|
||||
{ 0x0000aad0, 0x00000000, 0x00000000, 0x000db324, 0x000db324, 0x00000000 },
|
||||
{ 0x0000aad4, 0x00000000, 0x00000000, 0x000eb704, 0x000eb704, 0x00000000 },
|
||||
{ 0x0000aad8, 0x00000000, 0x00000000, 0x000eb6a4, 0x000eb6a4, 0x00000000 },
|
||||
{ 0x0000aadc, 0x00000000, 0x00000000, 0x000eb6a8, 0x000eb6a8, 0x00000000 },
|
||||
{ 0x0000aae0, 0x00000000, 0x00000000, 0x000eb710, 0x000eb710, 0x00000000 },
|
||||
{ 0x0000aae4, 0x00000000, 0x00000000, 0x000eb714, 0x000eb714, 0x00000000 },
|
||||
{ 0x0000aae8, 0x00000000, 0x00000000, 0x000eb720, 0x000eb720, 0x00000000 },
|
||||
{ 0x0000aaec, 0x00000000, 0x00000000, 0x000eb724, 0x000eb724, 0x00000000 },
|
||||
{ 0x0000aaf0, 0x00000000, 0x00000000, 0x000eb728, 0x000eb728, 0x00000000 },
|
||||
{ 0x0000aaf4, 0x00000000, 0x00000000, 0x000eb72c, 0x000eb72c, 0x00000000 },
|
||||
{ 0x0000aaf8, 0x00000000, 0x00000000, 0x000eb7a0, 0x000eb7a0, 0x00000000 },
|
||||
{ 0x0000aafc, 0x00000000, 0x00000000, 0x000eb7a4, 0x000eb7a4, 0x00000000 },
|
||||
{ 0x0000ab00, 0x00000000, 0x00000000, 0x000eb7a8, 0x000eb7a8, 0x00000000 },
|
||||
{ 0x0000ab04, 0x00000000, 0x00000000, 0x000eb7b0, 0x000eb7b0, 0x00000000 },
|
||||
{ 0x0000ab08, 0x00000000, 0x00000000, 0x000eb7b4, 0x000eb7b4, 0x00000000 },
|
||||
{ 0x0000ab0c, 0x00000000, 0x00000000, 0x000eb7b8, 0x000eb7b8, 0x00000000 },
|
||||
{ 0x0000ab10, 0x00000000, 0x00000000, 0x000eb7a5, 0x000eb7a5, 0x00000000 },
|
||||
{ 0x0000ab14, 0x00000000, 0x00000000, 0x000eb7a9, 0x000eb7a9, 0x00000000 },
|
||||
{ 0x0000ab18, 0x00000000, 0x00000000, 0x000eb7ad, 0x000eb7ad, 0x00000000 },
|
||||
{ 0x0000ab1c, 0x00000000, 0x00000000, 0x000eb7b1, 0x000eb7b1, 0x00000000 },
|
||||
{ 0x0000ab20, 0x00000000, 0x00000000, 0x000eb7b5, 0x000eb7b5, 0x00000000 },
|
||||
{ 0x0000ab24, 0x00000000, 0x00000000, 0x000eb7b9, 0x000eb7b9, 0x00000000 },
|
||||
{ 0x0000ab28, 0x00000000, 0x00000000, 0x000eb7c5, 0x000eb7c5, 0x00000000 },
|
||||
{ 0x0000ab2c, 0x00000000, 0x00000000, 0x000eb7c9, 0x000eb7c9, 0x00000000 },
|
||||
{ 0x0000ab30, 0x00000000, 0x00000000, 0x000eb7d1, 0x000eb7d1, 0x00000000 },
|
||||
{ 0x0000ab34, 0x00000000, 0x00000000, 0x000eb7d5, 0x000eb7d5, 0x00000000 },
|
||||
{ 0x0000ab38, 0x00000000, 0x00000000, 0x000eb7d9, 0x000eb7d9, 0x00000000 },
|
||||
{ 0x0000ab3c, 0x00000000, 0x00000000, 0x000eb7c6, 0x000eb7c6, 0x00000000 },
|
||||
{ 0x0000ab40, 0x00000000, 0x00000000, 0x000eb7ca, 0x000eb7ca, 0x00000000 },
|
||||
{ 0x0000ab44, 0x00000000, 0x00000000, 0x000eb7ce, 0x000eb7ce, 0x00000000 },
|
||||
{ 0x0000ab48, 0x00000000, 0x00000000, 0x000eb7d2, 0x000eb7d2, 0x00000000 },
|
||||
{ 0x0000ab4c, 0x00000000, 0x00000000, 0x000eb7d6, 0x000eb7d6, 0x00000000 },
|
||||
{ 0x0000ab50, 0x00000000, 0x00000000, 0x000eb7c3, 0x000eb7c3, 0x00000000 },
|
||||
{ 0x0000ab54, 0x00000000, 0x00000000, 0x000eb7c7, 0x000eb7c7, 0x00000000 },
|
||||
{ 0x0000ab58, 0x00000000, 0x00000000, 0x000eb7cb, 0x000eb7cb, 0x00000000 },
|
||||
{ 0x0000ab5c, 0x00000000, 0x00000000, 0x000eb7cf, 0x000eb7cf, 0x00000000 },
|
||||
{ 0x0000ab60, 0x00000000, 0x00000000, 0x000eb7d7, 0x000eb7d7, 0x00000000 },
|
||||
{ 0x0000ab64, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000ab68, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000ab6c, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000ab70, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000ab74, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000ab78, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000ab7c, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000ab80, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000ab84, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000ab88, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000ab8c, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000ab90, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000ab94, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000ab98, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000ab9c, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000aba0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000aba4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000aba8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000abac, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000abb0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000abb4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000abb8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000abbc, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000abc0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000abc4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000abc8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000abcc, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000abd0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000abd4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000abd8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000abdc, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000abe0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000abe4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000abe8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000abec, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000abf0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000abf4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000abf8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000abfc, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 },
|
||||
{ 0x0000a204, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004 },
|
||||
{ 0x0000a20c, 0x00000014, 0x00000014, 0x00000000, 0x00000000, 0x0001f000 },
|
||||
{ 0x0000a20c, 0x00000014, 0x00000014, 0x0001f000, 0x0001f000, 0x0001f000 },
|
||||
{ 0x0000a21c, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a },
|
||||
{ 0x0000a230, 0x00000000, 0x00000000, 0x00000210, 0x00000108, 0x00000000 },
|
||||
{ 0x0000a250, 0x0004f000, 0x0004f000, 0x0004a000, 0x0004a000, 0x0004a000 },
|
||||
|
@ -4679,7 +4680,7 @@ static const u_int32_t ar9285Common_9285_1_2[][2] = {
|
|||
{ 0x000099a0, 0x00000000 },
|
||||
{ 0x000099a4, 0x00000001 },
|
||||
{ 0x000099a8, 0x201fff00 },
|
||||
{ 0x000099ac, 0x2def1000 },
|
||||
{ 0x000099ac, 0x2def0400 },
|
||||
{ 0x000099b0, 0x03051000 },
|
||||
{ 0x000099b4, 0x00000820 },
|
||||
{ 0x000099dc, 0x00000000 },
|
||||
|
@ -4688,7 +4689,7 @@ static const u_int32_t ar9285Common_9285_1_2[][2] = {
|
|||
{ 0x000099e8, 0x3c466478 },
|
||||
{ 0x000099ec, 0x0cc80caa },
|
||||
{ 0x000099f0, 0x00000000 },
|
||||
{ 0x0000a208, 0x803e6788 },
|
||||
{ 0x0000a208, 0x803e68c8 },
|
||||
{ 0x0000a210, 0x4080a333 },
|
||||
{ 0x0000a214, 0x00206c10 },
|
||||
{ 0x0000a218, 0x009c4060 },
|
||||
|
|
|
@ -107,14 +107,32 @@ bool ath9k_hw_updatetxtriglevel(struct ath_hal *ah, bool bIncTrigLevel)
|
|||
|
||||
bool ath9k_hw_stoptxdma(struct ath_hal *ah, u32 q)
|
||||
{
|
||||
#define ATH9K_TX_STOP_DMA_TIMEOUT 4000 /* usec */
|
||||
#define ATH9K_TIME_QUANTUM 100 /* usec */
|
||||
|
||||
struct ath_hal_5416 *ahp = AH5416(ah);
|
||||
struct ath9k_hw_capabilities *pCap = &ah->ah_caps;
|
||||
struct ath9k_tx_queue_info *qi;
|
||||
u32 tsfLow, j, wait;
|
||||
u32 wait_time = ATH9K_TX_STOP_DMA_TIMEOUT / ATH9K_TIME_QUANTUM;
|
||||
|
||||
if (q >= pCap->total_queues) {
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_QUEUE, "invalid queue num %u\n", q);
|
||||
return false;
|
||||
}
|
||||
|
||||
qi = &ahp->ah_txq[q];
|
||||
if (qi->tqi_type == ATH9K_TX_QUEUE_INACTIVE) {
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_QUEUE, "inactive queue\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
REG_WRITE(ah, AR_Q_TXD, 1 << q);
|
||||
|
||||
for (wait = 1000; wait != 0; wait--) {
|
||||
for (wait = wait_time; wait != 0; wait--) {
|
||||
if (ath9k_hw_numtxpending(ah, q) == 0)
|
||||
break;
|
||||
udelay(100);
|
||||
udelay(ATH9K_TIME_QUANTUM);
|
||||
}
|
||||
|
||||
if (ath9k_hw_numtxpending(ah, q)) {
|
||||
|
@ -144,8 +162,7 @@ bool ath9k_hw_stoptxdma(struct ath_hal *ah, u32 q)
|
|||
udelay(200);
|
||||
REG_CLR_BIT(ah, AR_TIMER_MODE, AR_QUIET_TIMER_EN);
|
||||
|
||||
wait = 1000;
|
||||
|
||||
wait = wait_time;
|
||||
while (ath9k_hw_numtxpending(ah, q)) {
|
||||
if ((--wait) == 0) {
|
||||
DPRINTF(ah->ah_sc, ATH_DBG_XMIT,
|
||||
|
@ -153,15 +170,17 @@ bool ath9k_hw_stoptxdma(struct ath_hal *ah, u32 q)
|
|||
"msec after killing last frame\n");
|
||||
break;
|
||||
}
|
||||
udelay(100);
|
||||
udelay(ATH9K_TIME_QUANTUM);
|
||||
}
|
||||
|
||||
REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH);
|
||||
}
|
||||
|
||||
REG_WRITE(ah, AR_Q_TXD, 0);
|
||||
|
||||
return wait != 0;
|
||||
|
||||
#undef ATH9K_TX_STOP_DMA_TIMEOUT
|
||||
#undef ATH9K_TIME_QUANTUM
|
||||
}
|
||||
|
||||
bool ath9k_hw_filltxdesc(struct ath_hal *ah, struct ath_desc *ds,
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,305 @@
|
|||
/*
|
||||
* Copyright (c) 2008 Atheros Communications Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/nl80211.h>
|
||||
#include <linux/pci.h>
|
||||
#include "core.h"
|
||||
#include "reg.h"
|
||||
#include "hw.h"
|
||||
|
||||
static struct pci_device_id ath_pci_id_table[] __devinitdata = {
|
||||
{ PCI_VDEVICE(ATHEROS, 0x0023) }, /* PCI */
|
||||
{ PCI_VDEVICE(ATHEROS, 0x0024) }, /* PCI-E */
|
||||
{ PCI_VDEVICE(ATHEROS, 0x0027) }, /* PCI */
|
||||
{ PCI_VDEVICE(ATHEROS, 0x0029) }, /* PCI */
|
||||
{ PCI_VDEVICE(ATHEROS, 0x002A) }, /* PCI-E */
|
||||
{ PCI_VDEVICE(ATHEROS, 0x002B) }, /* PCI-E */
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
/* return bus cachesize in 4B word units */
|
||||
static void ath_pci_read_cachesize(struct ath_softc *sc, int *csz)
|
||||
{
|
||||
u8 u8tmp;
|
||||
|
||||
pci_read_config_byte(to_pci_dev(sc->dev), PCI_CACHE_LINE_SIZE,
|
||||
(u8 *)&u8tmp);
|
||||
*csz = (int)u8tmp;
|
||||
|
||||
/*
|
||||
* This check was put in to avoid "unplesant" consequences if
|
||||
* the bootrom has not fully initialized all PCI devices.
|
||||
* Sometimes the cache line size register is not set
|
||||
*/
|
||||
|
||||
if (*csz == 0)
|
||||
*csz = DEFAULT_CACHELINE >> 2; /* Use the default size */
|
||||
}
|
||||
|
||||
static void ath_pci_cleanup(struct ath_softc *sc)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(sc->dev);
|
||||
|
||||
pci_iounmap(pdev, sc->mem);
|
||||
pci_release_region(pdev, 0);
|
||||
pci_disable_device(pdev);
|
||||
}
|
||||
|
||||
static bool ath_pci_eeprom_read(struct ath_hal *ah, u32 off, u16 *data)
|
||||
{
|
||||
(void)REG_READ(ah, AR5416_EEPROM_OFFSET + (off << AR5416_EEPROM_S));
|
||||
|
||||
if (!ath9k_hw_wait(ah,
|
||||
AR_EEPROM_STATUS_DATA,
|
||||
AR_EEPROM_STATUS_DATA_BUSY |
|
||||
AR_EEPROM_STATUS_DATA_PROT_ACCESS, 0)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
*data = MS(REG_READ(ah, AR_EEPROM_STATUS_DATA),
|
||||
AR_EEPROM_STATUS_DATA_VAL);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static struct ath_bus_ops ath_pci_bus_ops = {
|
||||
.read_cachesize = ath_pci_read_cachesize,
|
||||
.cleanup = ath_pci_cleanup,
|
||||
.eeprom_read = ath_pci_eeprom_read,
|
||||
};
|
||||
|
||||
static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
{
|
||||
void __iomem *mem;
|
||||
struct ath_softc *sc;
|
||||
struct ieee80211_hw *hw;
|
||||
u8 csz;
|
||||
u32 val;
|
||||
int ret = 0;
|
||||
struct ath_hal *ah;
|
||||
|
||||
if (pci_enable_device(pdev))
|
||||
return -EIO;
|
||||
|
||||
ret = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
|
||||
|
||||
if (ret) {
|
||||
printk(KERN_ERR "ath9k: 32-bit DMA not available\n");
|
||||
goto bad;
|
||||
}
|
||||
|
||||
ret = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
|
||||
|
||||
if (ret) {
|
||||
printk(KERN_ERR "ath9k: 32-bit DMA consistent "
|
||||
"DMA enable failed\n");
|
||||
goto bad;
|
||||
}
|
||||
|
||||
/*
|
||||
* Cache line size is used to size and align various
|
||||
* structures used to communicate with the hardware.
|
||||
*/
|
||||
pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &csz);
|
||||
if (csz == 0) {
|
||||
/*
|
||||
* Linux 2.4.18 (at least) writes the cache line size
|
||||
* register as a 16-bit wide register which is wrong.
|
||||
* We must have this setup properly for rx buffer
|
||||
* DMA to work so force a reasonable value here if it
|
||||
* comes up zero.
|
||||
*/
|
||||
csz = L1_CACHE_BYTES / sizeof(u32);
|
||||
pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, csz);
|
||||
}
|
||||
/*
|
||||
* The default setting of latency timer yields poor results,
|
||||
* set it to the value used by other systems. It may be worth
|
||||
* tweaking this setting more.
|
||||
*/
|
||||
pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0xa8);
|
||||
|
||||
pci_set_master(pdev);
|
||||
|
||||
/*
|
||||
* Disable the RETRY_TIMEOUT register (0x41) to keep
|
||||
* PCI Tx retries from interfering with C3 CPU state.
|
||||
*/
|
||||
pci_read_config_dword(pdev, 0x40, &val);
|
||||
if ((val & 0x0000ff00) != 0)
|
||||
pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
|
||||
|
||||
ret = pci_request_region(pdev, 0, "ath9k");
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "PCI memory region reserve error\n");
|
||||
ret = -ENODEV;
|
||||
goto bad;
|
||||
}
|
||||
|
||||
mem = pci_iomap(pdev, 0, 0);
|
||||
if (!mem) {
|
||||
printk(KERN_ERR "PCI memory map error\n") ;
|
||||
ret = -EIO;
|
||||
goto bad1;
|
||||
}
|
||||
|
||||
hw = ieee80211_alloc_hw(sizeof(struct ath_softc), &ath9k_ops);
|
||||
if (hw == NULL) {
|
||||
printk(KERN_ERR "ath_pci: no memory for ieee80211_hw\n");
|
||||
goto bad2;
|
||||
}
|
||||
|
||||
SET_IEEE80211_DEV(hw, &pdev->dev);
|
||||
pci_set_drvdata(pdev, hw);
|
||||
|
||||
sc = hw->priv;
|
||||
sc->hw = hw;
|
||||
sc->dev = &pdev->dev;
|
||||
sc->mem = mem;
|
||||
sc->bus_ops = &ath_pci_bus_ops;
|
||||
|
||||
if (ath_attach(id->device, sc) != 0) {
|
||||
ret = -ENODEV;
|
||||
goto bad3;
|
||||
}
|
||||
|
||||
/* setup interrupt service routine */
|
||||
|
||||
if (request_irq(pdev->irq, ath_isr, IRQF_SHARED, "ath", sc)) {
|
||||
printk(KERN_ERR "%s: request_irq failed\n",
|
||||
wiphy_name(hw->wiphy));
|
||||
ret = -EIO;
|
||||
goto bad4;
|
||||
}
|
||||
|
||||
sc->irq = pdev->irq;
|
||||
|
||||
ah = sc->sc_ah;
|
||||
printk(KERN_INFO
|
||||
"%s: Atheros AR%s MAC/BB Rev:%x "
|
||||
"AR%s RF Rev:%x: mem=0x%lx, irq=%d\n",
|
||||
wiphy_name(hw->wiphy),
|
||||
ath_mac_bb_name(ah->ah_macVersion),
|
||||
ah->ah_macRev,
|
||||
ath_rf_name((ah->ah_analog5GhzRev & AR_RADIO_SREV_MAJOR)),
|
||||
ah->ah_phyRev,
|
||||
(unsigned long)mem, pdev->irq);
|
||||
|
||||
return 0;
|
||||
bad4:
|
||||
ath_detach(sc);
|
||||
bad3:
|
||||
ieee80211_free_hw(hw);
|
||||
bad2:
|
||||
pci_iounmap(pdev, mem);
|
||||
bad1:
|
||||
pci_release_region(pdev, 0);
|
||||
bad:
|
||||
pci_disable_device(pdev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void ath_pci_remove(struct pci_dev *pdev)
|
||||
{
|
||||
struct ieee80211_hw *hw = pci_get_drvdata(pdev);
|
||||
struct ath_softc *sc = hw->priv;
|
||||
|
||||
ath_cleanup(sc);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
static int ath_pci_suspend(struct pci_dev *pdev, pm_message_t state)
|
||||
{
|
||||
struct ieee80211_hw *hw = pci_get_drvdata(pdev);
|
||||
struct ath_softc *sc = hw->priv;
|
||||
|
||||
ath9k_hw_set_gpio(sc->sc_ah, ATH_LED_PIN, 1);
|
||||
|
||||
#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
|
||||
if (sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_RFSILENT)
|
||||
cancel_delayed_work_sync(&sc->rf_kill.rfkill_poll);
|
||||
#endif
|
||||
|
||||
pci_save_state(pdev);
|
||||
pci_disable_device(pdev);
|
||||
pci_set_power_state(pdev, PCI_D3hot);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ath_pci_resume(struct pci_dev *pdev)
|
||||
{
|
||||
struct ieee80211_hw *hw = pci_get_drvdata(pdev);
|
||||
struct ath_softc *sc = hw->priv;
|
||||
u32 val;
|
||||
int err;
|
||||
|
||||
err = pci_enable_device(pdev);
|
||||
if (err)
|
||||
return err;
|
||||
pci_restore_state(pdev);
|
||||
/*
|
||||
* Suspend/Resume resets the PCI configuration space, so we have to
|
||||
* re-disable the RETRY_TIMEOUT register (0x41) to keep
|
||||
* PCI Tx retries from interfering with C3 CPU state
|
||||
*/
|
||||
pci_read_config_dword(pdev, 0x40, &val);
|
||||
if ((val & 0x0000ff00) != 0)
|
||||
pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
|
||||
|
||||
/* Enable LED */
|
||||
ath9k_hw_cfg_output(sc->sc_ah, ATH_LED_PIN,
|
||||
AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
|
||||
ath9k_hw_set_gpio(sc->sc_ah, ATH_LED_PIN, 1);
|
||||
|
||||
#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
|
||||
/*
|
||||
* check the h/w rfkill state on resume
|
||||
* and start the rfkill poll timer
|
||||
*/
|
||||
if (sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_RFSILENT)
|
||||
queue_delayed_work(sc->hw->workqueue,
|
||||
&sc->rf_kill.rfkill_poll, 0);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
MODULE_DEVICE_TABLE(pci, ath_pci_id_table);
|
||||
|
||||
static struct pci_driver ath_pci_driver = {
|
||||
.name = "ath9k",
|
||||
.id_table = ath_pci_id_table,
|
||||
.probe = ath_pci_probe,
|
||||
.remove = ath_pci_remove,
|
||||
#ifdef CONFIG_PM
|
||||
.suspend = ath_pci_suspend,
|
||||
.resume = ath_pci_resume,
|
||||
#endif /* CONFIG_PM */
|
||||
};
|
||||
|
||||
int __init ath_pci_init(void)
|
||||
{
|
||||
return pci_register_driver(&ath_pci_driver);
|
||||
}
|
||||
|
||||
void ath_pci_exit(void)
|
||||
{
|
||||
pci_unregister_driver(&ath_pci_driver);
|
||||
}
|
|
@ -19,12 +19,11 @@
|
|||
|
||||
static struct ath_rate_table ar5416_11na_ratetable = {
|
||||
42,
|
||||
{0},
|
||||
{
|
||||
{ VALID, VALID, WLAN_RC_PHY_OFDM, 6000, /* 6 Mb */
|
||||
5400, 0x0b, 0x00, 12,
|
||||
0, 2, 1, 0, 0, 0, 0, 0 },
|
||||
{ VALID, VALID, WLAN_RC_PHY_OFDM, 9000, /* 9 Mb */
|
||||
{ VALID, VALID, WLAN_RC_PHY_OFDM, 9000, /* 9 Mb */
|
||||
7800, 0x0f, 0x00, 18,
|
||||
0, 3, 1, 1, 1, 1, 1, 0 },
|
||||
{ VALID, VALID, WLAN_RC_PHY_OFDM, 12000, /* 12 Mb */
|
||||
|
@ -158,7 +157,6 @@ static struct ath_rate_table ar5416_11na_ratetable = {
|
|||
|
||||
static struct ath_rate_table ar5416_11ng_ratetable = {
|
||||
46,
|
||||
{0},
|
||||
{
|
||||
{ VALID_ALL, VALID_ALL, WLAN_RC_PHY_CCK, 1000, /* 1 Mb */
|
||||
900, 0x1b, 0x00, 2,
|
||||
|
@ -306,7 +304,6 @@ static struct ath_rate_table ar5416_11ng_ratetable = {
|
|||
|
||||
static struct ath_rate_table ar5416_11a_ratetable = {
|
||||
8,
|
||||
{0},
|
||||
{
|
||||
{ VALID, VALID, WLAN_RC_PHY_OFDM, 6000, /* 6 Mb */
|
||||
5400, 0x0b, 0x00, (0x80|12),
|
||||
|
@ -340,7 +337,6 @@ static struct ath_rate_table ar5416_11a_ratetable = {
|
|||
|
||||
static struct ath_rate_table ar5416_11g_ratetable = {
|
||||
12,
|
||||
{0},
|
||||
{
|
||||
{ VALID, VALID, WLAN_RC_PHY_CCK, 1000, /* 1 Mb */
|
||||
900, 0x1b, 0x00, 2,
|
||||
|
@ -386,7 +382,6 @@ static struct ath_rate_table ar5416_11g_ratetable = {
|
|||
|
||||
static struct ath_rate_table ar5416_11b_ratetable = {
|
||||
4,
|
||||
{0},
|
||||
{
|
||||
{ VALID, VALID, WLAN_RC_PHY_CCK, 1000, /* 1 Mb */
|
||||
900, 0x1b, 0x00, (0x80|2),
|
||||
|
@ -875,7 +870,7 @@ static void ath_rc_ratefind(struct ath_softc *sc,
|
|||
* above conditions.
|
||||
*/
|
||||
if ((sc->hw->conf.channel->band == IEEE80211_BAND_2GHZ) &&
|
||||
(sc->hw->conf.ht.enabled)) {
|
||||
(conf_is_ht(&sc->hw->conf))) {
|
||||
u8 dot11rate = rate_table->info[rix].dot11rate;
|
||||
u8 phy = rate_table->info[rix].phy;
|
||||
if (i == 4 &&
|
||||
|
@ -1363,9 +1358,13 @@ static void ath_rc_init(struct ath_softc *sc,
|
|||
}
|
||||
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
ath_rc_priv->ht_cap = (WLAN_RC_HT_FLAG | WLAN_RC_DS_FLAG);
|
||||
ath_rc_priv->ht_cap = WLAN_RC_HT_FLAG;
|
||||
if (sc->sc_ah->ah_caps.tx_chainmask != 1)
|
||||
ath_rc_priv->ht_cap |= WLAN_RC_DS_FLAG;
|
||||
if (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
|
||||
ath_rc_priv->ht_cap |= WLAN_RC_40_FLAG;
|
||||
if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
|
||||
ath_rc_priv->ht_cap |= WLAN_RC_SGI_FLAG;
|
||||
}
|
||||
|
||||
/* Initial rate table size. Will change depending
|
||||
|
@ -1511,7 +1510,7 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,
|
|||
tx_info, &is_probe, false);
|
||||
|
||||
/* Check if aggregation has to be enabled for this tid */
|
||||
if (hw->conf.ht.enabled) {
|
||||
if (conf_is_ht(&hw->conf)) {
|
||||
if (ieee80211_is_data_qos(fc)) {
|
||||
u8 *qc, tid;
|
||||
struct ath_node *an;
|
||||
|
@ -1607,16 +1606,8 @@ static void ath_setup_rate_table(struct ath_softc *sc,
|
|||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 256; i++)
|
||||
rate_table->rateCodeToIndex[i] = (u8)-1;
|
||||
|
||||
for (i = 0; i < rate_table->rate_cnt; i++) {
|
||||
u8 code = rate_table->info[i].ratecode;
|
||||
u8 cix = rate_table->info[i].ctrl_rate;
|
||||
u8 sh = rate_table->info[i].short_preamble;
|
||||
|
||||
rate_table->rateCodeToIndex[code] = i;
|
||||
rate_table->rateCodeToIndex[code | sh] = i;
|
||||
|
||||
rate_table->info[i].lpAckDuration =
|
||||
ath9k_hw_computetxtime(sc->sc_ah, rate_table,
|
||||
|
|
|
@ -90,7 +90,6 @@ struct ath_softc;
|
|||
*/
|
||||
struct ath_rate_table {
|
||||
int rate_cnt;
|
||||
u8 rateCodeToIndex[256];
|
||||
struct {
|
||||
int valid;
|
||||
int valid_single_stream;
|
||||
|
|
|
@ -291,15 +291,15 @@ int ath_rx_init(struct ath_softc *sc, int nbufs)
|
|||
}
|
||||
|
||||
bf->bf_mpdu = skb;
|
||||
bf->bf_buf_addr = pci_map_single(sc->pdev, skb->data,
|
||||
bf->bf_buf_addr = dma_map_single(sc->dev, skb->data,
|
||||
sc->rx.bufsize,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
if (unlikely(pci_dma_mapping_error(sc->pdev,
|
||||
DMA_FROM_DEVICE);
|
||||
if (unlikely(dma_mapping_error(sc->dev,
|
||||
bf->bf_buf_addr))) {
|
||||
dev_kfree_skb_any(skb);
|
||||
bf->bf_mpdu = NULL;
|
||||
DPRINTF(sc, ATH_DBG_CONFIG,
|
||||
"pci_dma_mapping_error() on RX init\n");
|
||||
"dma_mapping_error() on RX init\n");
|
||||
error = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
|
@ -524,9 +524,9 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush)
|
|||
* 1. accessing the frame
|
||||
* 2. requeueing the same buffer to h/w
|
||||
*/
|
||||
pci_dma_sync_single_for_cpu(sc->pdev, bf->bf_buf_addr,
|
||||
dma_sync_single_for_cpu(sc->dev, bf->bf_buf_addr,
|
||||
sc->rx.bufsize,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
DMA_FROM_DEVICE);
|
||||
|
||||
/*
|
||||
* If we're asked to flush receive queue, directly
|
||||
|
@ -557,9 +557,9 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush)
|
|||
goto requeue;
|
||||
|
||||
/* Unmap the frame */
|
||||
pci_unmap_single(sc->pdev, bf->bf_buf_addr,
|
||||
dma_unmap_single(sc->dev, bf->bf_buf_addr,
|
||||
sc->rx.bufsize,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
DMA_FROM_DEVICE);
|
||||
|
||||
skb_put(skb, ds->ds_rxstat.rs_datalen);
|
||||
skb->protocol = cpu_to_be16(ETH_P_CONTROL);
|
||||
|
@ -593,21 +593,27 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush)
|
|||
if (test_bit(keyix, sc->sc_keymap))
|
||||
rx_status.flag |= RX_FLAG_DECRYPTED;
|
||||
}
|
||||
if (ah->sw_mgmt_crypto &&
|
||||
(rx_status.flag & RX_FLAG_DECRYPTED) &&
|
||||
ieee80211_is_mgmt(hdr->frame_control)) {
|
||||
/* Use software decrypt for management frames. */
|
||||
rx_status.flag &= ~RX_FLAG_DECRYPTED;
|
||||
}
|
||||
|
||||
/* Send the frame to mac80211 */
|
||||
__ieee80211_rx(sc->hw, skb, &rx_status);
|
||||
|
||||
/* We will now give hardware our shiny new allocated skb */
|
||||
bf->bf_mpdu = requeue_skb;
|
||||
bf->bf_buf_addr = pci_map_single(sc->pdev, requeue_skb->data,
|
||||
bf->bf_buf_addr = dma_map_single(sc->dev, requeue_skb->data,
|
||||
sc->rx.bufsize,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
if (unlikely(pci_dma_mapping_error(sc->pdev,
|
||||
DMA_FROM_DEVICE);
|
||||
if (unlikely(dma_mapping_error(sc->dev,
|
||||
bf->bf_buf_addr))) {
|
||||
dev_kfree_skb_any(requeue_skb);
|
||||
bf->bf_mpdu = NULL;
|
||||
DPRINTF(sc, ATH_DBG_CONFIG,
|
||||
"pci_dma_mapping_error() on RX\n");
|
||||
"dma_mapping_error() on RX\n");
|
||||
break;
|
||||
}
|
||||
bf->bf_dmacontext = bf->bf_buf_addr;
|
||||
|
@ -622,6 +628,12 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush)
|
|||
} else {
|
||||
sc->rx.rxotherant = 0;
|
||||
}
|
||||
|
||||
if (ieee80211_is_beacon(hdr->frame_control) &&
|
||||
(sc->sc_flags & SC_OP_WAIT_FOR_BEACON)) {
|
||||
sc->sc_flags &= ~SC_OP_WAIT_FOR_BEACON;
|
||||
ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_NETWORK_SLEEP);
|
||||
}
|
||||
requeue:
|
||||
list_move_tail(&bf->list, &sc->rx.rxbuf);
|
||||
ath_rx_buf_link(sc, bf);
|
||||
|
|
|
@ -875,12 +875,15 @@ enum {
|
|||
|
||||
#define AR_NUM_GPIO 14
|
||||
#define AR928X_NUM_GPIO 10
|
||||
#define AR9285_NUM_GPIO 12
|
||||
|
||||
#define AR_GPIO_IN_OUT 0x4048
|
||||
#define AR_GPIO_IN_VAL 0x0FFFC000
|
||||
#define AR_GPIO_IN_VAL_S 14
|
||||
#define AR928X_GPIO_IN_VAL 0x000FFC00
|
||||
#define AR928X_GPIO_IN_VAL_S 10
|
||||
#define AR9285_GPIO_IN_VAL 0x00FFF000
|
||||
#define AR9285_GPIO_IN_VAL_S 12
|
||||
|
||||
#define AR_GPIO_OE_OUT 0x404c
|
||||
#define AR_GPIO_OE_OUT_DRV 0x3
|
||||
|
@ -894,14 +897,24 @@ enum {
|
|||
#define AR_GPIO_INTR_POL_VAL_S 0
|
||||
|
||||
#define AR_GPIO_INPUT_EN_VAL 0x4054
|
||||
#define AR_GPIO_INPUT_EN_VAL_BT_PRIORITY_DEF 0x00000004
|
||||
#define AR_GPIO_INPUT_EN_VAL_BT_PRIORITY_S 2
|
||||
#define AR_GPIO_INPUT_EN_VAL_BT_FREQUENCY_DEF 0x00000008
|
||||
#define AR_GPIO_INPUT_EN_VAL_BT_FREQUENCY_S 3
|
||||
#define AR_GPIO_INPUT_EN_VAL_BT_ACTIVE_DEF 0x00000010
|
||||
#define AR_GPIO_INPUT_EN_VAL_BT_ACTIVE_S 4
|
||||
#define AR_GPIO_INPUT_EN_VAL_RFSILENT_DEF 0x00000080
|
||||
#define AR_GPIO_INPUT_EN_VAL_RFSILENT_DEF_S 7
|
||||
#define AR_GPIO_INPUT_EN_VAL_BT_ACTIVE_BB 0x00001000
|
||||
#define AR_GPIO_INPUT_EN_VAL_BT_ACTIVE_BB_S 12
|
||||
#define AR_GPIO_INPUT_EN_VAL_RFSILENT_BB 0x00008000
|
||||
#define AR_GPIO_INPUT_EN_VAL_RFSILENT_BB_S 15
|
||||
#define AR_GPIO_RTC_RESET_OVERRIDE_ENABLE 0x00010000
|
||||
#define AR_GPIO_JTAG_DISABLE 0x00020000
|
||||
|
||||
#define AR_GPIO_INPUT_MUX1 0x4058
|
||||
#define AR_GPIO_INPUT_MUX1_BT_ACTIVE 0x000f0000
|
||||
#define AR_GPIO_INPUT_MUX1_BT_ACTIVE_S 16
|
||||
|
||||
#define AR_GPIO_INPUT_MUX2 0x405c
|
||||
#define AR_GPIO_INPUT_MUX2_CLK25 0x0000000f
|
||||
|
@ -940,7 +953,7 @@ enum {
|
|||
|
||||
#define AR_RTC_BASE 0x00020000
|
||||
#define AR_RTC_RC \
|
||||
(AR_SREV_9100(ah)) ? (AR_RTC_BASE + 0x0000) : 0x7000
|
||||
((AR_SREV_9100(ah)) ? (AR_RTC_BASE + 0x0000) : 0x7000)
|
||||
#define AR_RTC_RC_M 0x00000003
|
||||
#define AR_RTC_RC_MAC_WARM 0x00000001
|
||||
#define AR_RTC_RC_MAC_COLD 0x00000002
|
||||
|
@ -948,7 +961,7 @@ enum {
|
|||
#define AR_RTC_RC_WARM_RESET 0x00000008
|
||||
|
||||
#define AR_RTC_PLL_CONTROL \
|
||||
(AR_SREV_9100(ah)) ? (AR_RTC_BASE + 0x0014) : 0x7014
|
||||
((AR_SREV_9100(ah)) ? (AR_RTC_BASE + 0x0014) : 0x7014)
|
||||
|
||||
#define AR_RTC_PLL_DIV 0x0000001f
|
||||
#define AR_RTC_PLL_DIV_S 0
|
||||
|
@ -1021,6 +1034,10 @@ enum {
|
|||
#define AR_AN_RF5G1_CH1_DB5 0x00380000
|
||||
#define AR_AN_RF5G1_CH1_DB5_S 19
|
||||
|
||||
#define AR_AN_TOP1 0x7890
|
||||
#define AR_AN_TOP1_DACIPMODE 0x00040000
|
||||
#define AR_AN_TOP1_DACIPMODE_S 18
|
||||
|
||||
#define AR_AN_TOP2 0x7894
|
||||
#define AR_AN_TOP2_XPABIAS_LVL 0xC0000000
|
||||
#define AR_AN_TOP2_XPABIAS_LVL_S 30
|
||||
|
@ -1236,6 +1253,8 @@ enum {
|
|||
|
||||
#define AR_AES_MUTE_MASK1 0x8060
|
||||
#define AR_AES_MUTE_MASK1_SEQ 0x0000FFFF
|
||||
#define AR_AES_MUTE_MASK1_FC_MGMT 0xFFFF0000
|
||||
#define AR_AES_MUTE_MASK1_FC_MGMT_S 16
|
||||
|
||||
#define AR_GATED_CLKS 0x8064
|
||||
#define AR_GATED_CLKS_TX 0x00000002
|
||||
|
@ -1460,6 +1479,10 @@ enum {
|
|||
#define AR_PCU_TXBUF_CTRL_USABLE_SIZE 0x700
|
||||
#define AR_9285_PCU_TXBUF_CTRL_USABLE_SIZE 0x380
|
||||
|
||||
#define AR_PCU_MISC_MODE2 0x8344
|
||||
#define AR_PCU_MISC_MODE2_MGMT_CRYPTO_ENABLE 0x00000002
|
||||
#define AR_PCU_MISC_MODE2_NO_CRYPTO_FOR_NON_DATA_PKT 0x00000004
|
||||
|
||||
#define AR_KEYTABLE_0 0x8800
|
||||
#define AR_KEYTABLE(_n) (AR_KEYTABLE_0 + ((_n)*32))
|
||||
#define AR_KEY_CACHE_SIZE 128
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -19,126 +19,14 @@
|
|||
|
||||
#include "ath9k.h"
|
||||
|
||||
#define BMLEN 2
|
||||
#define BMZERO {(u64) 0, (u64) 0}
|
||||
|
||||
#define BM(_fa, _fb, _fc, _fd, _fe, _ff, _fg, _fh, _fi, _fj, _fk, _fl) \
|
||||
{((((_fa >= 0) && (_fa < 64)) ? \
|
||||
(((u64) 1) << _fa) : (u64) 0) | \
|
||||
(((_fb >= 0) && (_fb < 64)) ? \
|
||||
(((u64) 1) << _fb) : (u64) 0) | \
|
||||
(((_fc >= 0) && (_fc < 64)) ? \
|
||||
(((u64) 1) << _fc) : (u64) 0) | \
|
||||
(((_fd >= 0) && (_fd < 64)) ? \
|
||||
(((u64) 1) << _fd) : (u64) 0) | \
|
||||
(((_fe >= 0) && (_fe < 64)) ? \
|
||||
(((u64) 1) << _fe) : (u64) 0) | \
|
||||
(((_ff >= 0) && (_ff < 64)) ? \
|
||||
(((u64) 1) << _ff) : (u64) 0) | \
|
||||
(((_fg >= 0) && (_fg < 64)) ? \
|
||||
(((u64) 1) << _fg) : (u64) 0) | \
|
||||
(((_fh >= 0) && (_fh < 64)) ? \
|
||||
(((u64) 1) << _fh) : (u64) 0) | \
|
||||
(((_fi >= 0) && (_fi < 64)) ? \
|
||||
(((u64) 1) << _fi) : (u64) 0) | \
|
||||
(((_fj >= 0) && (_fj < 64)) ? \
|
||||
(((u64) 1) << _fj) : (u64) 0) | \
|
||||
(((_fk >= 0) && (_fk < 64)) ? \
|
||||
(((u64) 1) << _fk) : (u64) 0) | \
|
||||
(((_fl >= 0) && (_fl < 64)) ? \
|
||||
(((u64) 1) << _fl) : (u64) 0) | \
|
||||
((((_fa > 63) && (_fa < 128)) ? \
|
||||
(((u64) 1) << (_fa - 64)) : (u64) 0) | \
|
||||
(((_fb > 63) && (_fb < 128)) ? \
|
||||
(((u64) 1) << (_fb - 64)) : (u64) 0) | \
|
||||
(((_fc > 63) && (_fc < 128)) ? \
|
||||
(((u64) 1) << (_fc - 64)) : (u64) 0) | \
|
||||
(((_fd > 63) && (_fd < 128)) ? \
|
||||
(((u64) 1) << (_fd - 64)) : (u64) 0) | \
|
||||
(((_fe > 63) && (_fe < 128)) ? \
|
||||
(((u64) 1) << (_fe - 64)) : (u64) 0) | \
|
||||
(((_ff > 63) && (_ff < 128)) ? \
|
||||
(((u64) 1) << (_ff - 64)) : (u64) 0) | \
|
||||
(((_fg > 63) && (_fg < 128)) ? \
|
||||
(((u64) 1) << (_fg - 64)) : (u64) 0) | \
|
||||
(((_fh > 63) && (_fh < 128)) ? \
|
||||
(((u64) 1) << (_fh - 64)) : (u64) 0) | \
|
||||
(((_fi > 63) && (_fi < 128)) ? \
|
||||
(((u64) 1) << (_fi - 64)) : (u64) 0) | \
|
||||
(((_fj > 63) && (_fj < 128)) ? \
|
||||
(((u64) 1) << (_fj - 64)) : (u64) 0) | \
|
||||
(((_fk > 63) && (_fk < 128)) ? \
|
||||
(((u64) 1) << (_fk - 64)) : (u64) 0) | \
|
||||
(((_fl > 63) && (_fl < 128)) ? \
|
||||
(((u64) 1) << (_fl - 64)) : (u64) 0)))}
|
||||
|
||||
#define DEF_REGDMN FCC1_FCCA
|
||||
#define DEF_DMN_5 FCC1
|
||||
#define DEF_DMN_2 FCCA
|
||||
#define COUNTRY_ERD_FLAG 0x8000
|
||||
#define WORLDWIDE_ROAMING_FLAG 0x4000
|
||||
#define SUPER_DOMAIN_MASK 0x0fff
|
||||
#define COUNTRY_CODE_MASK 0x3fff
|
||||
#define CF_INTERFERENCE (CHANNEL_CW_INT | CHANNEL_RADAR_INT)
|
||||
#define CHANNEL_14 (2484)
|
||||
#define IS_11G_CH14(_ch,_cf) \
|
||||
(((_ch) == CHANNEL_14) && ((_cf) == CHANNEL_G))
|
||||
|
||||
#define NO_PSCAN 0x0ULL
|
||||
#define PSCAN_FCC 0x0000000000000001ULL
|
||||
#define PSCAN_FCC_T 0x0000000000000002ULL
|
||||
#define PSCAN_ETSI 0x0000000000000004ULL
|
||||
#define PSCAN_MKK1 0x0000000000000008ULL
|
||||
#define PSCAN_MKK2 0x0000000000000010ULL
|
||||
#define PSCAN_MKKA 0x0000000000000020ULL
|
||||
#define PSCAN_MKKA_G 0x0000000000000040ULL
|
||||
#define PSCAN_ETSIA 0x0000000000000080ULL
|
||||
#define PSCAN_ETSIB 0x0000000000000100ULL
|
||||
#define PSCAN_ETSIC 0x0000000000000200ULL
|
||||
#define PSCAN_WWR 0x0000000000000400ULL
|
||||
#define PSCAN_MKKA1 0x0000000000000800ULL
|
||||
#define PSCAN_MKKA1_G 0x0000000000001000ULL
|
||||
#define PSCAN_MKKA2 0x0000000000002000ULL
|
||||
#define PSCAN_MKKA2_G 0x0000000000004000ULL
|
||||
#define PSCAN_MKK3 0x0000000000008000ULL
|
||||
#define PSCAN_DEFER 0x7FFFFFFFFFFFFFFFULL
|
||||
#define IS_ECM_CHAN 0x8000000000000000ULL
|
||||
|
||||
#define isWwrSKU(_ah) \
|
||||
(((ath9k_regd_get_eepromRD((_ah)) & WORLD_SKU_MASK) == \
|
||||
WORLD_SKU_PREFIX) || \
|
||||
(ath9k_regd_get_eepromRD(_ah) == WORLD))
|
||||
|
||||
#define isWwrSKU_NoMidband(_ah) \
|
||||
((ath9k_regd_get_eepromRD((_ah)) == WOR3_WORLD) || \
|
||||
(ath9k_regd_get_eepromRD(_ah) == WOR4_WORLD) || \
|
||||
(ath9k_regd_get_eepromRD(_ah) == WOR5_ETSIC))
|
||||
|
||||
#define isUNII1OddChan(ch) \
|
||||
((ch == 5170) || (ch == 5190) || (ch == 5210) || (ch == 5230))
|
||||
|
||||
#define IS_HT40_MODE(_mode) \
|
||||
(((_mode == ATH9K_MODE_11NA_HT40PLUS || \
|
||||
_mode == ATH9K_MODE_11NG_HT40PLUS || \
|
||||
_mode == ATH9K_MODE_11NA_HT40MINUS || \
|
||||
_mode == ATH9K_MODE_11NG_HT40MINUS) ? true : false))
|
||||
|
||||
#define CHAN_FLAGS (CHANNEL_ALL|CHANNEL_HALF|CHANNEL_QUARTER)
|
||||
|
||||
#define swap_array(_a, _b, _size) { \
|
||||
u8 *s = _b; \
|
||||
int i = _size; \
|
||||
do { \
|
||||
u8 tmp = *_a; \
|
||||
*_a++ = *s; \
|
||||
*s++ = tmp; \
|
||||
} while (--i); \
|
||||
_a -= _size; \
|
||||
}
|
||||
|
||||
|
||||
#define HALF_MAXCHANBW 10
|
||||
|
||||
#define MULTI_DOMAIN_MASK 0xFF00
|
||||
|
||||
#define WORLD_SKU_MASK 0x00F0
|
||||
|
@ -147,81 +35,16 @@
|
|||
#define CHANNEL_HALF_BW 10
|
||||
#define CHANNEL_QUARTER_BW 5
|
||||
|
||||
typedef int ath_hal_cmp_t(const void *, const void *);
|
||||
|
||||
struct reg_dmn_pair_mapping {
|
||||
u16 regDmnEnum;
|
||||
u16 regDmn5GHz;
|
||||
u16 regDmn2GHz;
|
||||
u32 flags5GHz;
|
||||
u32 flags2GHz;
|
||||
u64 pscanMask;
|
||||
u16 singleCC;
|
||||
};
|
||||
|
||||
struct ccmap {
|
||||
char isoName[3];
|
||||
u16 countryCode;
|
||||
u16 reg_5ghz_ctl;
|
||||
u16 reg_2ghz_ctl;
|
||||
};
|
||||
|
||||
struct country_code_to_enum_rd {
|
||||
u16 countryCode;
|
||||
u16 regDmnEnum;
|
||||
const char *isoName;
|
||||
const char *name;
|
||||
bool allow11g;
|
||||
bool allow11aTurbo;
|
||||
bool allow11gTurbo;
|
||||
bool allow11ng20;
|
||||
bool allow11ng40;
|
||||
bool allow11na20;
|
||||
bool allow11na40;
|
||||
u16 outdoorChanStart;
|
||||
};
|
||||
|
||||
struct RegDmnFreqBand {
|
||||
u16 lowChannel;
|
||||
u16 highChannel;
|
||||
u8 powerDfs;
|
||||
u8 antennaMax;
|
||||
u8 channelBW;
|
||||
u8 channelSep;
|
||||
u64 useDfs;
|
||||
u64 usePassScan;
|
||||
u8 regClassId;
|
||||
};
|
||||
|
||||
struct regDomain {
|
||||
u16 regDmnEnum;
|
||||
u8 conformanceTestLimit;
|
||||
u64 dfsMask;
|
||||
u64 pscan;
|
||||
u32 flags;
|
||||
u64 chan11a[BMLEN];
|
||||
u64 chan11a_turbo[BMLEN];
|
||||
u64 chan11a_dyn_turbo[BMLEN];
|
||||
u64 chan11b[BMLEN];
|
||||
u64 chan11g[BMLEN];
|
||||
u64 chan11g_turbo[BMLEN];
|
||||
};
|
||||
|
||||
struct cmode {
|
||||
u32 mode;
|
||||
u32 flags;
|
||||
};
|
||||
|
||||
#define YES true
|
||||
#define NO false
|
||||
|
||||
struct japan_bandcheck {
|
||||
u16 freqbandbit;
|
||||
u32 eepromflagtocheck;
|
||||
};
|
||||
|
||||
struct common_mode_power {
|
||||
u16 lchan;
|
||||
u16 hchan;
|
||||
u8 pwrlvl;
|
||||
};
|
||||
|
||||
enum CountryCode {
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -2204,9 +2204,6 @@ static int atmel_get_frag(struct net_device *dev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const long frequency_list[] = { 2412, 2417, 2422, 2427, 2432, 2437, 2442,
|
||||
2447, 2452, 2457, 2462, 2467, 2472, 2484 };
|
||||
|
||||
static int atmel_set_freq(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_freq *fwrq,
|
||||
|
@ -2216,16 +2213,12 @@ static int atmel_set_freq(struct net_device *dev,
|
|||
int rc = -EINPROGRESS; /* Call commit handler */
|
||||
|
||||
/* If setting by frequency, convert to a channel */
|
||||
if ((fwrq->e == 1) &&
|
||||
(fwrq->m >= (int) 241200000) &&
|
||||
(fwrq->m <= (int) 248700000)) {
|
||||
if (fwrq->e == 1) {
|
||||
int f = fwrq->m / 100000;
|
||||
int c = 0;
|
||||
while ((c < 14) && (f != frequency_list[c]))
|
||||
c++;
|
||||
|
||||
/* Hack to fall through... */
|
||||
fwrq->e = 0;
|
||||
fwrq->m = c + 1;
|
||||
fwrq->m = ieee80211_freq_to_dsss_chan(f);
|
||||
}
|
||||
/* Setting by channel number */
|
||||
if ((fwrq->m > 1000) || (fwrq->e > 0))
|
||||
|
@ -2384,8 +2377,11 @@ static int atmel_get_range(struct net_device *dev,
|
|||
if (range->num_channels != 0) {
|
||||
for (k = 0, i = channel_table[j].min; i <= channel_table[j].max; i++) {
|
||||
range->freq[k].i = i; /* List index */
|
||||
range->freq[k].m = frequency_list[i - 1] * 100000;
|
||||
range->freq[k++].e = 1; /* Values in table in MHz -> * 10^5 * 10 */
|
||||
|
||||
/* Values in MHz -> * 10^5 * 10 */
|
||||
range->freq[k].m = (ieee80211_dsss_chan_to_freq(i) *
|
||||
100000);
|
||||
range->freq[k++].e = 1;
|
||||
}
|
||||
range->num_frequency = k;
|
||||
}
|
||||
|
|
|
@ -110,10 +110,18 @@ config B43_DEBUG
|
|||
bool "Broadcom 43xx debugging"
|
||||
depends on B43
|
||||
---help---
|
||||
Broadcom 43xx debugging messages.
|
||||
Broadcom 43xx debugging.
|
||||
|
||||
Say Y, if you want to find out why the driver does not
|
||||
work for you.
|
||||
This adds additional runtime sanity checks and statistics to the driver.
|
||||
These checks and statistics might me expensive and hurt runtime performance
|
||||
of your system.
|
||||
This also adds the b43 debugfs interface.
|
||||
|
||||
Do not enable this, unless you are debugging the driver.
|
||||
|
||||
Say N, if you are a distributor or user building a release kernel
|
||||
for production use.
|
||||
Only say Y, if you are debugging a problem in the b43 driver sourcecode.
|
||||
|
||||
config B43_FORCE_PIO
|
||||
bool "Force usage of PIO instead of DMA"
|
||||
|
|
|
@ -655,10 +655,39 @@ struct b43_wl {
|
|||
struct work_struct txpower_adjust_work;
|
||||
};
|
||||
|
||||
/* The type of the firmware file. */
|
||||
enum b43_firmware_file_type {
|
||||
B43_FWTYPE_PROPRIETARY,
|
||||
B43_FWTYPE_OPENSOURCE,
|
||||
B43_NR_FWTYPES,
|
||||
};
|
||||
|
||||
/* Context data for fetching firmware. */
|
||||
struct b43_request_fw_context {
|
||||
/* The device we are requesting the fw for. */
|
||||
struct b43_wldev *dev;
|
||||
/* The type of firmware to request. */
|
||||
enum b43_firmware_file_type req_type;
|
||||
/* Error messages for each firmware type. */
|
||||
char errors[B43_NR_FWTYPES][128];
|
||||
/* Temporary buffer for storing the firmware name. */
|
||||
char fwname[64];
|
||||
/* A fatal error occured while requesting. Firmware reqest
|
||||
* can not continue, as any other reqest will also fail. */
|
||||
int fatal_failure;
|
||||
};
|
||||
|
||||
/* In-memory representation of a cached microcode file. */
|
||||
struct b43_firmware_file {
|
||||
const char *filename;
|
||||
const struct firmware *data;
|
||||
/* Type of the firmware file name. Note that this does only indicate
|
||||
* the type by the firmware name. NOT the file contents.
|
||||
* If you want to check for proprietary vs opensource, use (struct b43_firmware)->opensource
|
||||
* instead! The (struct b43_firmware)->opensource flag is derived from the actual firmware
|
||||
* binary code, not just the filename.
|
||||
*/
|
||||
enum b43_firmware_file_type type;
|
||||
};
|
||||
|
||||
/* Pointers to the firmware data and meta information about it. */
|
||||
|
@ -677,7 +706,8 @@ struct b43_firmware {
|
|||
/* Firmware patchlevel */
|
||||
u16 patch;
|
||||
|
||||
/* Set to true, if we are using an opensource firmware. */
|
||||
/* Set to true, if we are using an opensource firmware.
|
||||
* Use this to check for proprietary vs opensource. */
|
||||
bool opensource;
|
||||
/* Set to true, if the core needs a PCM firmware, but
|
||||
* we failed to load one. This is always false for
|
||||
|
@ -848,12 +878,9 @@ void b43err(struct b43_wl *wl, const char *fmt, ...)
|
|||
__attribute__ ((format(printf, 2, 3)));
|
||||
void b43warn(struct b43_wl *wl, const char *fmt, ...)
|
||||
__attribute__ ((format(printf, 2, 3)));
|
||||
#if B43_DEBUG
|
||||
void b43dbg(struct b43_wl *wl, const char *fmt, ...)
|
||||
__attribute__ ((format(printf, 2, 3)));
|
||||
#else /* DEBUG */
|
||||
# define b43dbg(wl, fmt...) do { /* nothing */ } while (0)
|
||||
#endif /* DEBUG */
|
||||
|
||||
|
||||
/* A WARN_ON variant that vanishes when b43 debugging is disabled.
|
||||
* This _also_ evaluates the arg with debugging disabled. */
|
||||
|
|
|
@ -367,34 +367,6 @@ static int mmio32write__write_file(struct b43_wldev *dev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* wl->irq_lock is locked */
|
||||
static ssize_t tsf_read_file(struct b43_wldev *dev,
|
||||
char *buf, size_t bufsize)
|
||||
{
|
||||
ssize_t count = 0;
|
||||
u64 tsf;
|
||||
|
||||
b43_tsf_read(dev, &tsf);
|
||||
fappend("0x%08x%08x\n",
|
||||
(unsigned int)((tsf & 0xFFFFFFFF00000000ULL) >> 32),
|
||||
(unsigned int)(tsf & 0xFFFFFFFFULL));
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/* wl->irq_lock is locked */
|
||||
static int tsf_write_file(struct b43_wldev *dev,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
u64 tsf;
|
||||
|
||||
if (sscanf(buf, "%llu", (unsigned long long *)(&tsf)) != 1)
|
||||
return -EINVAL;
|
||||
b43_tsf_write(dev, tsf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t txstat_read_file(struct b43_wldev *dev,
|
||||
char *buf, size_t bufsize)
|
||||
{
|
||||
|
@ -691,15 +663,23 @@ B43_DEBUGFS_FOPS(mmio16read, mmio16read__read_file, mmio16read__write_file, 1);
|
|||
B43_DEBUGFS_FOPS(mmio16write, NULL, mmio16write__write_file, 1);
|
||||
B43_DEBUGFS_FOPS(mmio32read, mmio32read__read_file, mmio32read__write_file, 1);
|
||||
B43_DEBUGFS_FOPS(mmio32write, NULL, mmio32write__write_file, 1);
|
||||
B43_DEBUGFS_FOPS(tsf, tsf_read_file, tsf_write_file, 1);
|
||||
B43_DEBUGFS_FOPS(txstat, txstat_read_file, NULL, 0);
|
||||
B43_DEBUGFS_FOPS(restart, NULL, restart_write_file, 1);
|
||||
B43_DEBUGFS_FOPS(loctls, loctls_read_file, NULL, 0);
|
||||
|
||||
|
||||
int b43_debug(struct b43_wldev *dev, enum b43_dyndbg feature)
|
||||
bool b43_debug(struct b43_wldev *dev, enum b43_dyndbg feature)
|
||||
{
|
||||
return !!(dev->dfsentry && dev->dfsentry->dyn_debug[feature]);
|
||||
bool enabled;
|
||||
|
||||
enabled = (dev->dfsentry && dev->dfsentry->dyn_debug[feature]);
|
||||
if (unlikely(enabled)) {
|
||||
/* Force full debugging messages, if the user enabled
|
||||
* some dynamic debugging feature. */
|
||||
b43_modparam_verbose = B43_VERBOSITY_MAX;
|
||||
}
|
||||
|
||||
return enabled;
|
||||
}
|
||||
|
||||
static void b43_remove_dynamic_debug(struct b43_wldev *dev)
|
||||
|
@ -805,7 +785,6 @@ void b43_debugfs_add_device(struct b43_wldev *dev)
|
|||
ADD_FILE(mmio16write, 0200);
|
||||
ADD_FILE(mmio32read, 0600);
|
||||
ADD_FILE(mmio32write, 0200);
|
||||
ADD_FILE(tsf, 0600);
|
||||
ADD_FILE(txstat, 0400);
|
||||
ADD_FILE(restart, 0200);
|
||||
ADD_FILE(loctls, 0400);
|
||||
|
@ -834,7 +813,6 @@ void b43_debugfs_remove_device(struct b43_wldev *dev)
|
|||
debugfs_remove(e->file_mmio16write.dentry);
|
||||
debugfs_remove(e->file_mmio32read.dentry);
|
||||
debugfs_remove(e->file_mmio32write.dentry);
|
||||
debugfs_remove(e->file_tsf.dentry);
|
||||
debugfs_remove(e->file_txstat.dentry);
|
||||
debugfs_remove(e->file_restart.dentry);
|
||||
debugfs_remove(e->file_loctls.dentry);
|
||||
|
|
|
@ -46,7 +46,6 @@ struct b43_dfsentry {
|
|||
struct b43_dfs_file file_mmio16write;
|
||||
struct b43_dfs_file file_mmio32read;
|
||||
struct b43_dfs_file file_mmio32write;
|
||||
struct b43_dfs_file file_tsf;
|
||||
struct b43_dfs_file file_txstat;
|
||||
struct b43_dfs_file file_txpower_g;
|
||||
struct b43_dfs_file file_restart;
|
||||
|
@ -72,7 +71,7 @@ struct b43_dfsentry {
|
|||
struct dentry *dyn_debug_dentries[__B43_NR_DYNDBG];
|
||||
};
|
||||
|
||||
int b43_debug(struct b43_wldev *dev, enum b43_dyndbg feature);
|
||||
bool b43_debug(struct b43_wldev *dev, enum b43_dyndbg feature);
|
||||
|
||||
void b43_debugfs_init(void);
|
||||
void b43_debugfs_exit(void);
|
||||
|
@ -83,7 +82,7 @@ void b43_debugfs_log_txstat(struct b43_wldev *dev,
|
|||
|
||||
#else /* CONFIG_B43_DEBUG */
|
||||
|
||||
static inline int b43_debug(struct b43_wldev *dev, enum b43_dyndbg feature)
|
||||
static inline bool b43_debug(struct b43_wldev *dev, enum b43_dyndbg feature)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
Copyright (c) 2005 Martin Langer <martin-langer@gmx.de>
|
||||
Copyright (c) 2005 Stefano Brivio <stefano.brivio@polimi.it>
|
||||
Copyright (c) 2005, 2006 Michael Buesch <mb@bu3sch.de>
|
||||
Copyright (c) 2005-2009 Michael Buesch <mb@bu3sch.de>
|
||||
Copyright (c) 2005 Danny van Dyk <kugelfang@gentoo.org>
|
||||
Copyright (c) 2005 Andreas Jaggi <andreas.jaggi@waterwave.ch>
|
||||
|
||||
|
@ -88,6 +88,10 @@ static int modparam_btcoex = 1;
|
|||
module_param_named(btcoex, modparam_btcoex, int, 0444);
|
||||
MODULE_PARM_DESC(btcoex, "Enable Bluetooth coexistance (default on)");
|
||||
|
||||
int b43_modparam_verbose = B43_VERBOSITY_DEFAULT;
|
||||
module_param_named(verbose, b43_modparam_verbose, int, 0644);
|
||||
MODULE_PARM_DESC(verbose, "Log message verbosity: 0=error, 1=warn, 2=info(default), 3=debug");
|
||||
|
||||
|
||||
static const struct ssb_device_id b43_ssb_tbl[] = {
|
||||
SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 5),
|
||||
|
@ -97,6 +101,8 @@ static const struct ssb_device_id b43_ssb_tbl[] = {
|
|||
SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 10),
|
||||
SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 11),
|
||||
SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 13),
|
||||
SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 15),
|
||||
SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 16),
|
||||
SSB_DEVTABLE_END
|
||||
};
|
||||
|
||||
|
@ -298,6 +304,8 @@ void b43info(struct b43_wl *wl, const char *fmt, ...)
|
|||
{
|
||||
va_list args;
|
||||
|
||||
if (b43_modparam_verbose < B43_VERBOSITY_INFO)
|
||||
return;
|
||||
if (!b43_ratelimit(wl))
|
||||
return;
|
||||
va_start(args, fmt);
|
||||
|
@ -311,6 +319,8 @@ void b43err(struct b43_wl *wl, const char *fmt, ...)
|
|||
{
|
||||
va_list args;
|
||||
|
||||
if (b43_modparam_verbose < B43_VERBOSITY_ERROR)
|
||||
return;
|
||||
if (!b43_ratelimit(wl))
|
||||
return;
|
||||
va_start(args, fmt);
|
||||
|
@ -324,6 +334,8 @@ void b43warn(struct b43_wl *wl, const char *fmt, ...)
|
|||
{
|
||||
va_list args;
|
||||
|
||||
if (b43_modparam_verbose < B43_VERBOSITY_WARN)
|
||||
return;
|
||||
if (!b43_ratelimit(wl))
|
||||
return;
|
||||
va_start(args, fmt);
|
||||
|
@ -333,18 +345,18 @@ void b43warn(struct b43_wl *wl, const char *fmt, ...)
|
|||
va_end(args);
|
||||
}
|
||||
|
||||
#if B43_DEBUG
|
||||
void b43dbg(struct b43_wl *wl, const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
if (b43_modparam_verbose < B43_VERBOSITY_DEBUG)
|
||||
return;
|
||||
va_start(args, fmt);
|
||||
printk(KERN_DEBUG "b43-%s debug: ",
|
||||
(wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan");
|
||||
vprintk(fmt, args);
|
||||
va_end(args);
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
static void b43_ram_write(struct b43_wldev *dev, u16 offset, u32 val)
|
||||
{
|
||||
|
@ -526,52 +538,20 @@ void b43_hf_write(struct b43_wldev *dev, u64 value)
|
|||
b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTFHI, hi);
|
||||
}
|
||||
|
||||
void b43_tsf_read(struct b43_wldev *dev, u64 * tsf)
|
||||
void b43_tsf_read(struct b43_wldev *dev, u64 *tsf)
|
||||
{
|
||||
/* We need to be careful. As we read the TSF from multiple
|
||||
* registers, we should take care of register overflows.
|
||||
* In theory, the whole tsf read process should be atomic.
|
||||
* We try to be atomic here, by restaring the read process,
|
||||
* if any of the high registers changed (overflew).
|
||||
*/
|
||||
if (dev->dev->id.revision >= 3) {
|
||||
u32 low, high, high2;
|
||||
u32 low, high;
|
||||
|
||||
do {
|
||||
high = b43_read32(dev, B43_MMIO_REV3PLUS_TSF_HIGH);
|
||||
low = b43_read32(dev, B43_MMIO_REV3PLUS_TSF_LOW);
|
||||
high2 = b43_read32(dev, B43_MMIO_REV3PLUS_TSF_HIGH);
|
||||
} while (unlikely(high != high2));
|
||||
B43_WARN_ON(dev->dev->id.revision < 3);
|
||||
|
||||
*tsf = high;
|
||||
*tsf <<= 32;
|
||||
*tsf |= low;
|
||||
} else {
|
||||
u64 tmp;
|
||||
u16 v0, v1, v2, v3;
|
||||
u16 test1, test2, test3;
|
||||
/* The hardware guarantees us an atomic read, if we
|
||||
* read the low register first. */
|
||||
low = b43_read32(dev, B43_MMIO_REV3PLUS_TSF_LOW);
|
||||
high = b43_read32(dev, B43_MMIO_REV3PLUS_TSF_HIGH);
|
||||
|
||||
do {
|
||||
v3 = b43_read16(dev, B43_MMIO_TSF_3);
|
||||
v2 = b43_read16(dev, B43_MMIO_TSF_2);
|
||||
v1 = b43_read16(dev, B43_MMIO_TSF_1);
|
||||
v0 = b43_read16(dev, B43_MMIO_TSF_0);
|
||||
|
||||
test3 = b43_read16(dev, B43_MMIO_TSF_3);
|
||||
test2 = b43_read16(dev, B43_MMIO_TSF_2);
|
||||
test1 = b43_read16(dev, B43_MMIO_TSF_1);
|
||||
} while (v3 != test3 || v2 != test2 || v1 != test1);
|
||||
|
||||
*tsf = v3;
|
||||
*tsf <<= 48;
|
||||
tmp = v2;
|
||||
tmp <<= 32;
|
||||
*tsf |= tmp;
|
||||
tmp = v1;
|
||||
tmp <<= 16;
|
||||
*tsf |= tmp;
|
||||
*tsf |= v0;
|
||||
}
|
||||
*tsf = high;
|
||||
*tsf <<= 32;
|
||||
*tsf |= low;
|
||||
}
|
||||
|
||||
static void b43_time_lock(struct b43_wldev *dev)
|
||||
|
@ -598,35 +578,18 @@ static void b43_time_unlock(struct b43_wldev *dev)
|
|||
|
||||
static void b43_tsf_write_locked(struct b43_wldev *dev, u64 tsf)
|
||||
{
|
||||
/* Be careful with the in-progress timer.
|
||||
* First zero out the low register, so we have a full
|
||||
* register-overflow duration to complete the operation.
|
||||
*/
|
||||
if (dev->dev->id.revision >= 3) {
|
||||
u32 lo = (tsf & 0x00000000FFFFFFFFULL);
|
||||
u32 hi = (tsf & 0xFFFFFFFF00000000ULL) >> 32;
|
||||
u32 low, high;
|
||||
|
||||
b43_write32(dev, B43_MMIO_REV3PLUS_TSF_LOW, 0);
|
||||
mmiowb();
|
||||
b43_write32(dev, B43_MMIO_REV3PLUS_TSF_HIGH, hi);
|
||||
mmiowb();
|
||||
b43_write32(dev, B43_MMIO_REV3PLUS_TSF_LOW, lo);
|
||||
} else {
|
||||
u16 v0 = (tsf & 0x000000000000FFFFULL);
|
||||
u16 v1 = (tsf & 0x00000000FFFF0000ULL) >> 16;
|
||||
u16 v2 = (tsf & 0x0000FFFF00000000ULL) >> 32;
|
||||
u16 v3 = (tsf & 0xFFFF000000000000ULL) >> 48;
|
||||
B43_WARN_ON(dev->dev->id.revision < 3);
|
||||
|
||||
b43_write16(dev, B43_MMIO_TSF_0, 0);
|
||||
mmiowb();
|
||||
b43_write16(dev, B43_MMIO_TSF_3, v3);
|
||||
mmiowb();
|
||||
b43_write16(dev, B43_MMIO_TSF_2, v2);
|
||||
mmiowb();
|
||||
b43_write16(dev, B43_MMIO_TSF_1, v1);
|
||||
mmiowb();
|
||||
b43_write16(dev, B43_MMIO_TSF_0, v0);
|
||||
}
|
||||
low = tsf;
|
||||
high = (tsf >> 32);
|
||||
/* The hardware guarantees us an atomic write, if we
|
||||
* write the low register first. */
|
||||
b43_write32(dev, B43_MMIO_REV3PLUS_TSF_LOW, low);
|
||||
mmiowb();
|
||||
b43_write32(dev, B43_MMIO_REV3PLUS_TSF_HIGH, high);
|
||||
mmiowb();
|
||||
}
|
||||
|
||||
void b43_tsf_write(struct b43_wldev *dev, u64 tsf)
|
||||
|
@ -937,8 +900,7 @@ static int b43_key_write(struct b43_wldev *dev,
|
|||
B43_WARN_ON(dev->key[i].keyconf == keyconf);
|
||||
}
|
||||
if (index < 0) {
|
||||
/* Either pairwise key or address is 00:00:00:00:00:00
|
||||
* for transmit-only keys. Search the index. */
|
||||
/* Pairwise key. Get an empty slot for the key. */
|
||||
if (b43_new_kidx_api(dev))
|
||||
sta_keys_start = 4;
|
||||
else
|
||||
|
@ -951,7 +913,7 @@ static int b43_key_write(struct b43_wldev *dev,
|
|||
}
|
||||
}
|
||||
if (index < 0) {
|
||||
b43err(dev->wl, "Out of hardware key memory\n");
|
||||
b43warn(dev->wl, "Out of hardware key memory\n");
|
||||
return -ENOSPC;
|
||||
}
|
||||
} else
|
||||
|
@ -1982,7 +1944,7 @@ static irqreturn_t b43_interrupt_handler(int irq, void *dev_id)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void do_release_fw(struct b43_firmware_file *fw)
|
||||
void b43_do_release_fw(struct b43_firmware_file *fw)
|
||||
{
|
||||
release_firmware(fw->data);
|
||||
fw->data = NULL;
|
||||
|
@ -1991,10 +1953,10 @@ static void do_release_fw(struct b43_firmware_file *fw)
|
|||
|
||||
static void b43_release_firmware(struct b43_wldev *dev)
|
||||
{
|
||||
do_release_fw(&dev->fw.ucode);
|
||||
do_release_fw(&dev->fw.pcm);
|
||||
do_release_fw(&dev->fw.initvals);
|
||||
do_release_fw(&dev->fw.initvals_band);
|
||||
b43_do_release_fw(&dev->fw.ucode);
|
||||
b43_do_release_fw(&dev->fw.pcm);
|
||||
b43_do_release_fw(&dev->fw.initvals);
|
||||
b43_do_release_fw(&dev->fw.initvals_band);
|
||||
}
|
||||
|
||||
static void b43_print_fw_helptext(struct b43_wl *wl, bool error)
|
||||
|
@ -2002,20 +1964,19 @@ static void b43_print_fw_helptext(struct b43_wl *wl, bool error)
|
|||
const char *text;
|
||||
|
||||
text = "You must go to "
|
||||
"http://linuxwireless.org/en/users/Drivers/b43#devicefirmware "
|
||||
"and download the latest firmware (version 4).\n";
|
||||
"http://wireless.kernel.org/en/users/Drivers/b43#devicefirmware "
|
||||
"and download the correct firmware for this driver version. "
|
||||
"Please carefully read all instructions on this website.\n";
|
||||
if (error)
|
||||
b43err(wl, text);
|
||||
else
|
||||
b43warn(wl, text);
|
||||
}
|
||||
|
||||
static int do_request_fw(struct b43_wldev *dev,
|
||||
const char *name,
|
||||
struct b43_firmware_file *fw,
|
||||
bool silent)
|
||||
int b43_do_request_fw(struct b43_request_fw_context *ctx,
|
||||
const char *name,
|
||||
struct b43_firmware_file *fw)
|
||||
{
|
||||
char path[sizeof(modparam_fwpostfix) + 32];
|
||||
const struct firmware *blob;
|
||||
struct b43_fw_header *hdr;
|
||||
u32 size;
|
||||
|
@ -2023,29 +1984,49 @@ static int do_request_fw(struct b43_wldev *dev,
|
|||
|
||||
if (!name) {
|
||||
/* Don't fetch anything. Free possibly cached firmware. */
|
||||
do_release_fw(fw);
|
||||
/* FIXME: We should probably keep it anyway, to save some headache
|
||||
* on suspend/resume with multiband devices. */
|
||||
b43_do_release_fw(fw);
|
||||
return 0;
|
||||
}
|
||||
if (fw->filename) {
|
||||
if (strcmp(fw->filename, name) == 0)
|
||||
if ((fw->type == ctx->req_type) &&
|
||||
(strcmp(fw->filename, name) == 0))
|
||||
return 0; /* Already have this fw. */
|
||||
/* Free the cached firmware first. */
|
||||
do_release_fw(fw);
|
||||
/* FIXME: We should probably do this later after we successfully
|
||||
* got the new fw. This could reduce headache with multiband devices.
|
||||
* We could also redesign this to cache the firmware for all possible
|
||||
* bands all the time. */
|
||||
b43_do_release_fw(fw);
|
||||
}
|
||||
|
||||
snprintf(path, ARRAY_SIZE(path),
|
||||
"b43%s/%s.fw",
|
||||
modparam_fwpostfix, name);
|
||||
err = request_firmware(&blob, path, dev->dev->dev);
|
||||
switch (ctx->req_type) {
|
||||
case B43_FWTYPE_PROPRIETARY:
|
||||
snprintf(ctx->fwname, sizeof(ctx->fwname),
|
||||
"b43%s/%s.fw",
|
||||
modparam_fwpostfix, name);
|
||||
break;
|
||||
case B43_FWTYPE_OPENSOURCE:
|
||||
snprintf(ctx->fwname, sizeof(ctx->fwname),
|
||||
"b43-open%s/%s.fw",
|
||||
modparam_fwpostfix, name);
|
||||
break;
|
||||
default:
|
||||
B43_WARN_ON(1);
|
||||
return -ENOSYS;
|
||||
}
|
||||
err = request_firmware(&blob, ctx->fwname, ctx->dev->dev->dev);
|
||||
if (err == -ENOENT) {
|
||||
if (!silent) {
|
||||
b43err(dev->wl, "Firmware file \"%s\" not found\n",
|
||||
path);
|
||||
}
|
||||
snprintf(ctx->errors[ctx->req_type],
|
||||
sizeof(ctx->errors[ctx->req_type]),
|
||||
"Firmware file \"%s\" not found\n", ctx->fwname);
|
||||
return err;
|
||||
} else if (err) {
|
||||
b43err(dev->wl, "Firmware file \"%s\" request failed (err=%d)\n",
|
||||
path, err);
|
||||
snprintf(ctx->errors[ctx->req_type],
|
||||
sizeof(ctx->errors[ctx->req_type]),
|
||||
"Firmware file \"%s\" request failed (err=%d)\n",
|
||||
ctx->fwname, err);
|
||||
return err;
|
||||
}
|
||||
if (blob->size < sizeof(struct b43_fw_header))
|
||||
|
@ -2068,20 +2049,24 @@ static int do_request_fw(struct b43_wldev *dev,
|
|||
|
||||
fw->data = blob;
|
||||
fw->filename = name;
|
||||
fw->type = ctx->req_type;
|
||||
|
||||
return 0;
|
||||
|
||||
err_format:
|
||||
b43err(dev->wl, "Firmware file \"%s\" format error.\n", path);
|
||||
snprintf(ctx->errors[ctx->req_type],
|
||||
sizeof(ctx->errors[ctx->req_type]),
|
||||
"Firmware file \"%s\" format error.\n", ctx->fwname);
|
||||
release_firmware(blob);
|
||||
|
||||
return -EPROTO;
|
||||
}
|
||||
|
||||
static int b43_request_firmware(struct b43_wldev *dev)
|
||||
static int b43_try_request_fw(struct b43_request_fw_context *ctx)
|
||||
{
|
||||
struct b43_firmware *fw = &dev->fw;
|
||||
const u8 rev = dev->dev->id.revision;
|
||||
struct b43_wldev *dev = ctx->dev;
|
||||
struct b43_firmware *fw = &ctx->dev->fw;
|
||||
const u8 rev = ctx->dev->dev->id.revision;
|
||||
const char *filename;
|
||||
u32 tmshigh;
|
||||
int err;
|
||||
|
@ -2096,7 +2081,7 @@ static int b43_request_firmware(struct b43_wldev *dev)
|
|||
filename = "ucode13";
|
||||
else
|
||||
goto err_no_ucode;
|
||||
err = do_request_fw(dev, filename, &fw->ucode, 0);
|
||||
err = b43_do_request_fw(ctx, filename, &fw->ucode);
|
||||
if (err)
|
||||
goto err_load;
|
||||
|
||||
|
@ -2108,7 +2093,7 @@ static int b43_request_firmware(struct b43_wldev *dev)
|
|||
else
|
||||
goto err_no_pcm;
|
||||
fw->pcm_request_failed = 0;
|
||||
err = do_request_fw(dev, filename, &fw->pcm, 1);
|
||||
err = b43_do_request_fw(ctx, filename, &fw->pcm);
|
||||
if (err == -ENOENT) {
|
||||
/* We did not find a PCM file? Not fatal, but
|
||||
* core rev <= 10 must do without hwcrypto then. */
|
||||
|
@ -2144,7 +2129,7 @@ static int b43_request_firmware(struct b43_wldev *dev)
|
|||
default:
|
||||
goto err_no_initvals;
|
||||
}
|
||||
err = do_request_fw(dev, filename, &fw->initvals, 0);
|
||||
err = b43_do_request_fw(ctx, filename, &fw->initvals);
|
||||
if (err)
|
||||
goto err_load;
|
||||
|
||||
|
@ -2178,30 +2163,34 @@ static int b43_request_firmware(struct b43_wldev *dev)
|
|||
default:
|
||||
goto err_no_initvals;
|
||||
}
|
||||
err = do_request_fw(dev, filename, &fw->initvals_band, 0);
|
||||
err = b43_do_request_fw(ctx, filename, &fw->initvals_band);
|
||||
if (err)
|
||||
goto err_load;
|
||||
|
||||
return 0;
|
||||
|
||||
err_load:
|
||||
b43_print_fw_helptext(dev->wl, 1);
|
||||
goto error;
|
||||
|
||||
err_no_ucode:
|
||||
err = -ENODEV;
|
||||
b43err(dev->wl, "No microcode available for core rev %u\n", rev);
|
||||
err = ctx->fatal_failure = -EOPNOTSUPP;
|
||||
b43err(dev->wl, "The driver does not know which firmware (ucode) "
|
||||
"is required for your device (wl-core rev %u)\n", rev);
|
||||
goto error;
|
||||
|
||||
err_no_pcm:
|
||||
err = -ENODEV;
|
||||
b43err(dev->wl, "No PCM available for core rev %u\n", rev);
|
||||
err = ctx->fatal_failure = -EOPNOTSUPP;
|
||||
b43err(dev->wl, "The driver does not know which firmware (PCM) "
|
||||
"is required for your device (wl-core rev %u)\n", rev);
|
||||
goto error;
|
||||
|
||||
err_no_initvals:
|
||||
err = -ENODEV;
|
||||
b43err(dev->wl, "No Initial Values firmware file for PHY %u, "
|
||||
"core rev %u\n", dev->phy.type, rev);
|
||||
err = ctx->fatal_failure = -EOPNOTSUPP;
|
||||
b43err(dev->wl, "The driver does not know which firmware (initvals) "
|
||||
"is required for your device (wl-core rev %u)\n", rev);
|
||||
goto error;
|
||||
|
||||
err_load:
|
||||
/* We failed to load this firmware image. The error message
|
||||
* already is in ctx->errors. Return and let our caller decide
|
||||
* what to do. */
|
||||
goto error;
|
||||
|
||||
error:
|
||||
|
@ -2209,6 +2198,48 @@ error:
|
|||
return err;
|
||||
}
|
||||
|
||||
static int b43_request_firmware(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_request_fw_context *ctx;
|
||||
unsigned int i;
|
||||
int err;
|
||||
const char *errmsg;
|
||||
|
||||
ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
|
||||
if (!ctx)
|
||||
return -ENOMEM;
|
||||
ctx->dev = dev;
|
||||
|
||||
ctx->req_type = B43_FWTYPE_PROPRIETARY;
|
||||
err = b43_try_request_fw(ctx);
|
||||
if (!err)
|
||||
goto out; /* Successfully loaded it. */
|
||||
err = ctx->fatal_failure;
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
ctx->req_type = B43_FWTYPE_OPENSOURCE;
|
||||
err = b43_try_request_fw(ctx);
|
||||
if (!err)
|
||||
goto out; /* Successfully loaded it. */
|
||||
err = ctx->fatal_failure;
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
/* Could not find a usable firmware. Print the errors. */
|
||||
for (i = 0; i < B43_NR_FWTYPES; i++) {
|
||||
errmsg = ctx->errors[i];
|
||||
if (strlen(errmsg))
|
||||
b43err(dev->wl, errmsg);
|
||||
}
|
||||
b43_print_fw_helptext(dev->wl, 1);
|
||||
err = -ENOENT;
|
||||
|
||||
out:
|
||||
kfree(ctx);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int b43_upload_microcode(struct b43_wldev *dev)
|
||||
{
|
||||
const size_t hdr_len = sizeof(struct b43_fw_header);
|
||||
|
@ -2319,8 +2350,11 @@ static int b43_upload_microcode(struct b43_wldev *dev)
|
|||
}
|
||||
|
||||
if (b43_is_old_txhdr_format(dev)) {
|
||||
/* We're over the deadline, but we keep support for old fw
|
||||
* until it turns out to be in major conflict with something new. */
|
||||
b43warn(dev->wl, "You are using an old firmware image. "
|
||||
"Support for old firmware will be removed in July 2008.\n");
|
||||
"Support for old firmware will be removed soon "
|
||||
"(official deadline was July 2008).\n");
|
||||
b43_print_fw_helptext(dev->wl, 0);
|
||||
}
|
||||
|
||||
|
@ -3221,6 +3255,43 @@ static int b43_op_get_stats(struct ieee80211_hw *hw,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static u64 b43_op_get_tsf(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct b43_wl *wl = hw_to_b43_wl(hw);
|
||||
struct b43_wldev *dev;
|
||||
u64 tsf;
|
||||
|
||||
mutex_lock(&wl->mutex);
|
||||
spin_lock_irq(&wl->irq_lock);
|
||||
dev = wl->current_dev;
|
||||
|
||||
if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED))
|
||||
b43_tsf_read(dev, &tsf);
|
||||
else
|
||||
tsf = 0;
|
||||
|
||||
spin_unlock_irq(&wl->irq_lock);
|
||||
mutex_unlock(&wl->mutex);
|
||||
|
||||
return tsf;
|
||||
}
|
||||
|
||||
static void b43_op_set_tsf(struct ieee80211_hw *hw, u64 tsf)
|
||||
{
|
||||
struct b43_wl *wl = hw_to_b43_wl(hw);
|
||||
struct b43_wldev *dev;
|
||||
|
||||
mutex_lock(&wl->mutex);
|
||||
spin_lock_irq(&wl->irq_lock);
|
||||
dev = wl->current_dev;
|
||||
|
||||
if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED))
|
||||
b43_tsf_write(dev, tsf);
|
||||
|
||||
spin_unlock_irq(&wl->irq_lock);
|
||||
mutex_unlock(&wl->mutex);
|
||||
}
|
||||
|
||||
static void b43_put_phy_into_reset(struct b43_wldev *dev)
|
||||
{
|
||||
struct ssb_device *sdev = dev->dev;
|
||||
|
@ -3442,7 +3513,7 @@ out_unlock_mutex:
|
|||
return err;
|
||||
}
|
||||
|
||||
static void b43_update_basic_rates(struct b43_wldev *dev, u64 brates)
|
||||
static void b43_update_basic_rates(struct b43_wldev *dev, u32 brates)
|
||||
{
|
||||
struct ieee80211_supported_band *sband =
|
||||
dev->wl->hw->wiphy->bands[b43_current_band(dev->wl)];
|
||||
|
@ -3520,21 +3591,29 @@ out_unlock_mutex:
|
|||
}
|
||||
|
||||
static int b43_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
const u8 *local_addr, const u8 *addr,
|
||||
struct ieee80211_key_conf *key)
|
||||
struct ieee80211_vif *vif, struct ieee80211_sta *sta,
|
||||
struct ieee80211_key_conf *key)
|
||||
{
|
||||
struct b43_wl *wl = hw_to_b43_wl(hw);
|
||||
struct b43_wldev *dev;
|
||||
unsigned long flags;
|
||||
u8 algorithm;
|
||||
u8 index;
|
||||
int err;
|
||||
static const u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
||||
|
||||
if (modparam_nohwcrypt)
|
||||
return -ENOSPC; /* User disabled HW-crypto */
|
||||
|
||||
mutex_lock(&wl->mutex);
|
||||
spin_lock_irqsave(&wl->irq_lock, flags);
|
||||
spin_lock_irq(&wl->irq_lock);
|
||||
write_lock(&wl->tx_lock);
|
||||
/* Why do we need all this locking here?
|
||||
* mutex -> Every config operation must take it.
|
||||
* irq_lock -> We modify the dev->key array, which is accessed
|
||||
* in the IRQ handlers.
|
||||
* tx_lock -> We modify the dev->key array, which is accessed
|
||||
* in the TX handler.
|
||||
*/
|
||||
|
||||
dev = wl->current_dev;
|
||||
err = -ENODEV;
|
||||
|
@ -3551,7 +3630,7 @@ static int b43_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
|||
err = -EINVAL;
|
||||
switch (key->alg) {
|
||||
case ALG_WEP:
|
||||
if (key->keylen == 5)
|
||||
if (key->keylen == LEN_WEP40)
|
||||
algorithm = B43_SEC_ALGO_WEP40;
|
||||
else
|
||||
algorithm = B43_SEC_ALGO_WEP104;
|
||||
|
@ -3578,17 +3657,19 @@ static int b43_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
|||
goto out_unlock;
|
||||
}
|
||||
|
||||
if (is_broadcast_ether_addr(addr)) {
|
||||
/* addr is FF:FF:FF:FF:FF:FF for default keys */
|
||||
if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
|
||||
if (WARN_ON(!sta)) {
|
||||
err = -EOPNOTSUPP;
|
||||
goto out_unlock;
|
||||
}
|
||||
/* Pairwise key with an assigned MAC address. */
|
||||
err = b43_key_write(dev, -1, algorithm,
|
||||
key->key, key->keylen,
|
||||
sta->addr, key);
|
||||
} else {
|
||||
/* Group key */
|
||||
err = b43_key_write(dev, index, algorithm,
|
||||
key->key, key->keylen, NULL, key);
|
||||
} else {
|
||||
/*
|
||||
* either pairwise key or address is 00:00:00:00:00:00
|
||||
* for transmit-only keys
|
||||
*/
|
||||
err = b43_key_write(dev, -1, algorithm,
|
||||
key->key, key->keylen, addr, key);
|
||||
}
|
||||
if (err)
|
||||
goto out_unlock;
|
||||
|
@ -3617,10 +3698,11 @@ out_unlock:
|
|||
b43dbg(wl, "%s hardware based encryption for keyidx: %d, "
|
||||
"mac: %pM\n",
|
||||
cmd == SET_KEY ? "Using" : "Disabling", key->keyidx,
|
||||
addr);
|
||||
sta ? sta->addr : bcast_addr);
|
||||
b43_dump_keymemory(dev);
|
||||
}
|
||||
spin_unlock_irqrestore(&wl->irq_lock, flags);
|
||||
write_unlock(&wl->tx_lock);
|
||||
spin_unlock_irq(&wl->irq_lock);
|
||||
mutex_unlock(&wl->mutex);
|
||||
|
||||
return err;
|
||||
|
@ -3796,6 +3878,12 @@ static int b43_phy_versioning(struct b43_wldev *dev)
|
|||
break;
|
||||
#ifdef CONFIG_B43_NPHY
|
||||
case B43_PHYTYPE_N:
|
||||
if (phy_rev > 4)
|
||||
unsupported = 1;
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_B43_PHY_LP
|
||||
case B43_PHYTYPE_LP:
|
||||
if (phy_rev > 1)
|
||||
unsupported = 1;
|
||||
break;
|
||||
|
@ -3849,7 +3937,11 @@ static int b43_phy_versioning(struct b43_wldev *dev)
|
|||
unsupported = 1;
|
||||
break;
|
||||
case B43_PHYTYPE_N:
|
||||
if (radio_ver != 0x2055)
|
||||
if (radio_ver != 0x2055 && radio_ver != 0x2056)
|
||||
unsupported = 1;
|
||||
break;
|
||||
case B43_PHYTYPE_LP:
|
||||
if (radio_ver != 0x2062)
|
||||
unsupported = 1;
|
||||
break;
|
||||
default:
|
||||
|
@ -4317,6 +4409,8 @@ static const struct ieee80211_ops b43_hw_ops = {
|
|||
.set_key = b43_op_set_key,
|
||||
.get_stats = b43_op_get_stats,
|
||||
.get_tx_stats = b43_op_get_tx_stats,
|
||||
.get_tsf = b43_op_get_tsf,
|
||||
.set_tsf = b43_op_set_tsf,
|
||||
.start = b43_op_start,
|
||||
.stop = b43_op_stop,
|
||||
.set_tim = b43_op_beacon_set_tim,
|
||||
|
@ -4446,6 +4540,7 @@ static int b43_wireless_core_attach(struct b43_wldev *dev)
|
|||
break;
|
||||
case B43_PHYTYPE_G:
|
||||
case B43_PHYTYPE_N:
|
||||
case B43_PHYTYPE_LP:
|
||||
have_2ghz_phy = 1;
|
||||
break;
|
||||
default:
|
||||
|
@ -4657,9 +4752,10 @@ static int b43_wireless_init(struct ssb_device *dev)
|
|||
INIT_WORK(&wl->txpower_adjust_work, b43_phy_txpower_adjust_work);
|
||||
|
||||
ssb_set_devtypedata(dev, wl);
|
||||
b43info(wl, "Broadcom %04X WLAN found\n", dev->bus->chip_id);
|
||||
b43info(wl, "Broadcom %04X WLAN found (core revision %u)\n",
|
||||
dev->bus->chip_id, dev->id.revision);
|
||||
err = 0;
|
||||
out:
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -40,6 +40,24 @@
|
|||
|
||||
|
||||
extern int b43_modparam_qos;
|
||||
extern int b43_modparam_verbose;
|
||||
|
||||
/* Logmessage verbosity levels. Update the b43_modparam_verbose helptext, if
|
||||
* you add or remove levels. */
|
||||
enum b43_verbosity {
|
||||
B43_VERBOSITY_ERROR,
|
||||
B43_VERBOSITY_WARN,
|
||||
B43_VERBOSITY_INFO,
|
||||
B43_VERBOSITY_DEBUG,
|
||||
__B43_VERBOSITY_AFTERLAST, /* keep last */
|
||||
|
||||
B43_VERBOSITY_MAX = __B43_VERBOSITY_AFTERLAST - 1,
|
||||
#if B43_DEBUG
|
||||
B43_VERBOSITY_DEFAULT = B43_VERBOSITY_DEBUG,
|
||||
#else
|
||||
B43_VERBOSITY_DEFAULT = B43_VERBOSITY_INFO,
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
/* Lightweight function to convert a frequency (in Mhz) to a channel number. */
|
||||
|
@ -121,4 +139,11 @@ void b43_power_saving_ctl_bits(struct b43_wldev *dev, unsigned int ps_flags);
|
|||
void b43_mac_suspend(struct b43_wldev *dev);
|
||||
void b43_mac_enable(struct b43_wldev *dev);
|
||||
|
||||
|
||||
struct b43_request_fw_context;
|
||||
int b43_do_request_fw(struct b43_request_fw_context *ctx,
|
||||
const char *name,
|
||||
struct b43_firmware_file *fw);
|
||||
void b43_do_release_fw(struct b43_firmware_file *fw);
|
||||
|
||||
#endif /* B43_MAIN_H_ */
|
||||
|
|
|
@ -3191,6 +3191,7 @@ static enum b43_txpwr_result b43_gphy_op_recalc_txpower(struct b43_wldev *dev,
|
|||
* Baseband attennuation. Subtract it. */
|
||||
bbatt_delta -= 4 * rfatt_delta;
|
||||
|
||||
#if B43_DEBUG
|
||||
if (b43_debug(dev, B43_DBG_XMITPOWER)) {
|
||||
int dbm = pwr_adjust < 0 ? -pwr_adjust : pwr_adjust;
|
||||
b43dbg(dev->wl,
|
||||
|
@ -3199,6 +3200,8 @@ static enum b43_txpwr_result b43_gphy_op_recalc_txpower(struct b43_wldev *dev,
|
|||
(pwr_adjust < 0 ? "-" : ""), Q52_ARG(dbm),
|
||||
bbatt_delta, rfatt_delta);
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
/* So do we finally need to adjust something in hardware? */
|
||||
if ((rfatt_delta == 0) && (bbatt_delta == 0))
|
||||
goto no_adjustment_needed;
|
||||
|
|
|
@ -2650,7 +2650,7 @@ out_unlock_mutex:
|
|||
return err;
|
||||
}
|
||||
|
||||
static void b43legacy_update_basic_rates(struct b43legacy_wldev *dev, u64 brates)
|
||||
static void b43legacy_update_basic_rates(struct b43legacy_wldev *dev, u32 brates)
|
||||
{
|
||||
struct ieee80211_supported_band *sband =
|
||||
dev->wl->hw->wiphy->bands[IEEE80211_BAND_2GHZ];
|
||||
|
|
|
@ -1,25 +1,26 @@
|
|||
config IWLWIFI
|
||||
tristate
|
||||
bool "Intel Wireless Wifi"
|
||||
depends on PCI && MAC80211 && WLAN_80211 && EXPERIMENTAL
|
||||
default y
|
||||
|
||||
config IWLCORE
|
||||
tristate "Intel Wireless Wifi Core"
|
||||
depends on PCI && MAC80211 && WLAN_80211 && EXPERIMENTAL
|
||||
depends on IWLWIFI
|
||||
select LIB80211
|
||||
select IWLWIFI
|
||||
select MAC80211_LEDS if IWLWIFI_LEDS
|
||||
select LEDS_CLASS if IWLWIFI_LEDS
|
||||
select RFKILL if IWLWIFI_RFKILL
|
||||
|
||||
config IWLWIFI_LEDS
|
||||
bool
|
||||
default n
|
||||
bool "Enable LED support in iwlagn driver"
|
||||
depends on IWLCORE
|
||||
|
||||
config IWLWIFI_RFKILL
|
||||
boolean "Iwlwifi RF kill support"
|
||||
bool "Enable RF kill support in iwlagn driver"
|
||||
depends on IWLCORE
|
||||
|
||||
config IWLWIFI_DEBUG
|
||||
bool "Enable full debugging output in iwlagn driver"
|
||||
bool "Enable full debugging output in iwlagn and iwl3945 drivers"
|
||||
depends on IWLCORE
|
||||
---help---
|
||||
This option will enable debug tracing output for the iwlwifi drivers
|
||||
|
@ -51,7 +52,7 @@ config IWLWIFI_DEBUGFS
|
|||
|
||||
config IWLAGN
|
||||
tristate "Intel Wireless WiFi Next Gen AGN"
|
||||
depends on PCI && MAC80211 && WLAN_80211 && EXPERIMENTAL
|
||||
depends on IWLWIFI
|
||||
select FW_LOADER
|
||||
select IWLCORE
|
||||
---help---
|
||||
|
@ -104,13 +105,12 @@ config IWL5000
|
|||
|
||||
config IWL3945
|
||||
tristate "Intel PRO/Wireless 3945ABG/BG Network Connection"
|
||||
depends on PCI && MAC80211 && WLAN_80211 && EXPERIMENTAL
|
||||
depends on IWLWIFI
|
||||
select FW_LOADER
|
||||
select LIB80211
|
||||
select IWLWIFI
|
||||
select MAC80211_LEDS if IWL3945_LEDS
|
||||
select LEDS_CLASS if IWL3945_LEDS
|
||||
select RFKILL if IWL3945_RFKILL
|
||||
select RFKILL if IWLWIFI_RFKILL
|
||||
---help---
|
||||
Select to build the driver supporting the:
|
||||
|
||||
|
@ -133,10 +133,6 @@ config IWL3945
|
|||
say M here and read <file:Documentation/kbuild/modules.txt>. The
|
||||
module will be called iwl3945.ko.
|
||||
|
||||
config IWL3945_RFKILL
|
||||
bool "Enable RF kill support in iwl3945 drivers"
|
||||
depends on IWL3945
|
||||
|
||||
config IWL3945_SPECTRUM_MEASUREMENT
|
||||
bool "Enable Spectrum Measurement in iwl3945 drivers"
|
||||
depends on IWL3945
|
||||
|
@ -148,30 +144,3 @@ config IWL3945_LEDS
|
|||
depends on IWL3945
|
||||
---help---
|
||||
This option enables LEDS for the iwl3945 driver.
|
||||
|
||||
config IWL3945_DEBUG
|
||||
bool "Enable full debugging output in iwl3945 driver"
|
||||
depends on IWL3945
|
||||
---help---
|
||||
This option will enable debug tracing output for the iwl3945
|
||||
driver.
|
||||
|
||||
This will result in the kernel module being ~100k larger. You can
|
||||
control which debug output is sent to the kernel log by setting the
|
||||
value in
|
||||
|
||||
/sys/bus/pci/drivers/${DRIVER}/debug_level
|
||||
|
||||
This entry will only exist if this option is enabled.
|
||||
|
||||
To set a value, simply echo an 8-byte hex value to the same file:
|
||||
|
||||
% echo 0x43fff > /sys/bus/pci/drivers/${DRIVER}/debug_level
|
||||
|
||||
You can find the list of debug mask values in:
|
||||
drivers/net/wireless/iwlwifi/iwl-3945-debug.h
|
||||
|
||||
If this is your first time using this driver, you should say Y here
|
||||
as the debug information can assist others in helping you resolve
|
||||
any problems you may encounter.
|
||||
|
||||
|
|
|
@ -12,6 +12,8 @@ iwlagn-objs := iwl-agn.o iwl-agn-rs.o iwl-agn-hcmd-check.o
|
|||
|
||||
iwlagn-$(CONFIG_IWL4965) += iwl-4965.o
|
||||
iwlagn-$(CONFIG_IWL5000) += iwl-5000.o
|
||||
iwlagn-$(CONFIG_IWL5000) += iwl-6000.o
|
||||
iwlagn-$(CONFIG_IWL5000) += iwl-100.o
|
||||
|
||||
obj-$(CONFIG_IWL3945) += iwl3945.o
|
||||
iwl3945-objs := iwl3945-base.o iwl-3945.o iwl-3945-rs.o
|
||||
|
|
|
@ -0,0 +1,70 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2008-2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* Intel Linux Wireless <ilw@linux.intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/wireless.h>
|
||||
#include <net/mac80211.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
#include "iwl-eeprom.h"
|
||||
#include "iwl-dev.h"
|
||||
#include "iwl-core.h"
|
||||
#include "iwl-io.h"
|
||||
#include "iwl-sta.h"
|
||||
#include "iwl-helpers.h"
|
||||
#include "iwl-5000-hw.h"
|
||||
|
||||
/* Highest firmware API version supported */
|
||||
#define IWL100_UCODE_API_MAX 1
|
||||
|
||||
/* Lowest firmware API version supported */
|
||||
#define IWL100_UCODE_API_MIN 1
|
||||
|
||||
#define IWL100_FW_PRE "iwlwifi-100-"
|
||||
#define _IWL100_MODULE_FIRMWARE(api) IWL100_FW_PRE #api ".ucode"
|
||||
#define IWL100_MODULE_FIRMWARE(api) _IWL100_MODULE_FIRMWARE(api)
|
||||
|
||||
struct iwl_cfg iwl100_bgn_cfg = {
|
||||
.name = "100 Series BGN",
|
||||
.fw_name_pre = IWL100_FW_PRE,
|
||||
.ucode_api_max = IWL100_UCODE_API_MAX,
|
||||
.ucode_api_min = IWL100_UCODE_API_MIN,
|
||||
.sku = IWL_SKU_G|IWL_SKU_N,
|
||||
.ops = &iwl5000_ops,
|
||||
.eeprom_size = IWL_5000_EEPROM_IMG_SIZE,
|
||||
.eeprom_ver = EEPROM_5000_EEPROM_VERSION,
|
||||
.eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION,
|
||||
.mod_params = &iwl50_mod_params,
|
||||
};
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -1,167 +0,0 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* Portions of this file are derived from the ipw3945 project.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* Intel Linux Wireless <ilw@linux.intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __iwl3945_debug_h__
|
||||
#define __iwl3945_debug_h__
|
||||
|
||||
#ifdef CONFIG_IWL3945_DEBUG
|
||||
extern u32 iwl3945_debug_level;
|
||||
#define IWL_DEBUG(level, fmt, args...) \
|
||||
do { if (iwl3945_debug_level & (level)) \
|
||||
printk(KERN_ERR DRV_NAME": %c %s " fmt, \
|
||||
in_interrupt() ? 'I' : 'U', __func__ , ## args); } while (0)
|
||||
|
||||
#define IWL_DEBUG_LIMIT(level, fmt, args...) \
|
||||
do { if ((iwl3945_debug_level & (level)) && net_ratelimit()) \
|
||||
printk(KERN_ERR DRV_NAME": %c %s " fmt, \
|
||||
in_interrupt() ? 'I' : 'U', __func__ , ## args); } while (0)
|
||||
|
||||
static inline void iwl3945_print_hex_dump(int level, void *p, u32 len)
|
||||
{
|
||||
if (!(iwl3945_debug_level & level))
|
||||
return;
|
||||
|
||||
print_hex_dump(KERN_DEBUG, "iwl data: ", DUMP_PREFIX_OFFSET, 16, 1,
|
||||
p, len, 1);
|
||||
}
|
||||
#else
|
||||
static inline void IWL_DEBUG(int level, const char *fmt, ...)
|
||||
{
|
||||
}
|
||||
static inline void IWL_DEBUG_LIMIT(int level, const char *fmt, ...)
|
||||
{
|
||||
}
|
||||
static inline void iwl3945_print_hex_dump(int level, void *p, u32 len)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_IWL3945_DEBUG */
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* To use the debug system;
|
||||
*
|
||||
* If you are defining a new debug classification, simply add it to the #define
|
||||
* list here in the form of:
|
||||
*
|
||||
* #define IWL_DL_xxxx VALUE
|
||||
*
|
||||
* shifting value to the left one bit from the previous entry. xxxx should be
|
||||
* the name of the classification (for example, WEP)
|
||||
*
|
||||
* You then need to either add a IWL_xxxx_DEBUG() macro definition for your
|
||||
* classification, or use IWL_DEBUG(IWL_DL_xxxx, ...) whenever you want
|
||||
* to send output to that classification.
|
||||
*
|
||||
* To add your debug level to the list of levels seen when you perform
|
||||
*
|
||||
* % cat /proc/net/iwl/debug_level
|
||||
*
|
||||
* you simply need to add your entry to the iwl3945_debug_levels array.
|
||||
*
|
||||
* If you do not see debug_level in /proc/net/iwl then you do not have
|
||||
* CONFIG_IWL3945_DEBUG defined in your kernel configuration
|
||||
*
|
||||
*/
|
||||
|
||||
#define IWL_DL_INFO (1 << 0)
|
||||
#define IWL_DL_MAC80211 (1 << 1)
|
||||
#define IWL_DL_HOST_COMMAND (1 << 2)
|
||||
#define IWL_DL_STATE (1 << 3)
|
||||
|
||||
#define IWL_DL_RADIO (1 << 7)
|
||||
#define IWL_DL_POWER (1 << 8)
|
||||
#define IWL_DL_TEMP (1 << 9)
|
||||
|
||||
#define IWL_DL_NOTIF (1 << 10)
|
||||
#define IWL_DL_SCAN (1 << 11)
|
||||
#define IWL_DL_ASSOC (1 << 12)
|
||||
#define IWL_DL_DROP (1 << 13)
|
||||
|
||||
#define IWL_DL_TXPOWER (1 << 14)
|
||||
|
||||
#define IWL_DL_AP (1 << 15)
|
||||
|
||||
#define IWL_DL_FW (1 << 16)
|
||||
#define IWL_DL_RF_KILL (1 << 17)
|
||||
#define IWL_DL_FW_ERRORS (1 << 18)
|
||||
|
||||
#define IWL_DL_LED (1 << 19)
|
||||
|
||||
#define IWL_DL_RATE (1 << 20)
|
||||
|
||||
#define IWL_DL_CALIB (1 << 21)
|
||||
#define IWL_DL_WEP (1 << 22)
|
||||
#define IWL_DL_TX (1 << 23)
|
||||
#define IWL_DL_RX (1 << 24)
|
||||
#define IWL_DL_ISR (1 << 25)
|
||||
#define IWL_DL_HT (1 << 26)
|
||||
#define IWL_DL_IO (1 << 27)
|
||||
#define IWL_DL_11H (1 << 28)
|
||||
|
||||
#define IWL_DL_STATS (1 << 29)
|
||||
#define IWL_DL_TX_REPLY (1 << 30)
|
||||
#define IWL_DL_QOS (1 << 31)
|
||||
|
||||
#define IWL_ERROR(f, a...) printk(KERN_ERR DRV_NAME ": " f, ## a)
|
||||
#define IWL_WARNING(f, a...) printk(KERN_WARNING DRV_NAME ": " f, ## a)
|
||||
#define IWL_DEBUG_INFO(f, a...) IWL_DEBUG(IWL_DL_INFO, f, ## a)
|
||||
|
||||
#define IWL_DEBUG_MAC80211(f, a...) IWL_DEBUG(IWL_DL_MAC80211, f, ## a)
|
||||
#define IWL_DEBUG_TEMP(f, a...) IWL_DEBUG(IWL_DL_TEMP, f, ## a)
|
||||
#define IWL_DEBUG_SCAN(f, a...) IWL_DEBUG(IWL_DL_SCAN, f, ## a)
|
||||
#define IWL_DEBUG_RX(f, a...) IWL_DEBUG(IWL_DL_RX, f, ## a)
|
||||
#define IWL_DEBUG_TX(f, a...) IWL_DEBUG(IWL_DL_TX, f, ## a)
|
||||
#define IWL_DEBUG_ISR(f, a...) IWL_DEBUG(IWL_DL_ISR, f, ## a)
|
||||
#define IWL_DEBUG_LED(f, a...) IWL_DEBUG(IWL_DL_LED, f, ## a)
|
||||
#define IWL_DEBUG_WEP(f, a...) IWL_DEBUG(IWL_DL_WEP, f, ## a)
|
||||
#define IWL_DEBUG_HC(f, a...) IWL_DEBUG(IWL_DL_HOST_COMMAND, f, ## a)
|
||||
#define IWL_DEBUG_CALIB(f, a...) IWL_DEBUG(IWL_DL_CALIB, f, ## a)
|
||||
#define IWL_DEBUG_FW(f, a...) IWL_DEBUG(IWL_DL_FW, f, ## a)
|
||||
#define IWL_DEBUG_RF_KILL(f, a...) IWL_DEBUG(IWL_DL_RF_KILL, f, ## a)
|
||||
#define IWL_DEBUG_DROP(f, a...) IWL_DEBUG(IWL_DL_DROP, f, ## a)
|
||||
#define IWL_DEBUG_DROP_LIMIT(f, a...) IWL_DEBUG_LIMIT(IWL_DL_DROP, f, ## a)
|
||||
#define IWL_DEBUG_AP(f, a...) IWL_DEBUG(IWL_DL_AP, f, ## a)
|
||||
#define IWL_DEBUG_TXPOWER(f, a...) IWL_DEBUG(IWL_DL_TXPOWER, f, ## a)
|
||||
#define IWL_DEBUG_IO(f, a...) IWL_DEBUG(IWL_DL_IO, f, ## a)
|
||||
#define IWL_DEBUG_RATE(f, a...) IWL_DEBUG(IWL_DL_RATE, f, ## a)
|
||||
#define IWL_DEBUG_RATE_LIMIT(f, a...) IWL_DEBUG_LIMIT(IWL_DL_RATE, f, ## a)
|
||||
#define IWL_DEBUG_NOTIF(f, a...) IWL_DEBUG(IWL_DL_NOTIF, f, ## a)
|
||||
#define IWL_DEBUG_ASSOC(f, a...) IWL_DEBUG(IWL_DL_ASSOC | IWL_DL_INFO, f, ## a)
|
||||
#define IWL_DEBUG_ASSOC_LIMIT(f, a...) \
|
||||
IWL_DEBUG_LIMIT(IWL_DL_ASSOC | IWL_DL_INFO, f, ## a)
|
||||
#define IWL_DEBUG_HT(f, a...) IWL_DEBUG(IWL_DL_HT, f, ## a)
|
||||
#define IWL_DEBUG_STATS(f, a...) IWL_DEBUG(IWL_DL_STATS, f, ## a)
|
||||
#define IWL_DEBUG_STATS_LIMIT(f, a...) IWL_DEBUG_LIMIT(IWL_DL_STATS, f, ## a)
|
||||
#define IWL_DEBUG_TX_REPLY(f, a...) IWL_DEBUG(IWL_DL_TX_REPLY, f, ## a)
|
||||
#define IWL_DEBUG_QOS(f, a...) IWL_DEBUG(IWL_DL_QOS, f, ## a)
|
||||
#define IWL_DEBUG_RADIO(f, a...) IWL_DEBUG(IWL_DL_RADIO, f, ## a)
|
||||
#define IWL_DEBUG_POWER(f, a...) IWL_DEBUG(IWL_DL_POWER, f, ## a)
|
||||
#define IWL_DEBUG_11H(f, a...) IWL_DEBUG(IWL_DL_11H, f, ## a)
|
||||
|
||||
#endif
|
|
@ -0,0 +1,188 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
* redistributing this file, you may do so under either license.
|
||||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
|
||||
* USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution
|
||||
* in the file called LICENSE.GPL.
|
||||
*
|
||||
* Contact Information:
|
||||
* Intel Linux Wireless <ilw@linux.intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name Intel Corporation nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __iwl_3945_fh_h__
|
||||
#define __iwl_3945_fh_h__
|
||||
|
||||
/************************************/
|
||||
/* iwl3945 Flow Handler Definitions */
|
||||
/************************************/
|
||||
|
||||
/**
|
||||
* This I/O area is directly read/writable by driver (e.g. Linux uses writel())
|
||||
* Addresses are offsets from device's PCI hardware base address.
|
||||
*/
|
||||
#define FH39_MEM_LOWER_BOUND (0x0800)
|
||||
#define FH39_MEM_UPPER_BOUND (0x1000)
|
||||
|
||||
#define FH39_CBCC_TABLE (FH39_MEM_LOWER_BOUND + 0x140)
|
||||
#define FH39_TFDB_TABLE (FH39_MEM_LOWER_BOUND + 0x180)
|
||||
#define FH39_RCSR_TABLE (FH39_MEM_LOWER_BOUND + 0x400)
|
||||
#define FH39_RSSR_TABLE (FH39_MEM_LOWER_BOUND + 0x4c0)
|
||||
#define FH39_TCSR_TABLE (FH39_MEM_LOWER_BOUND + 0x500)
|
||||
#define FH39_TSSR_TABLE (FH39_MEM_LOWER_BOUND + 0x680)
|
||||
|
||||
/* TFDB (Transmit Frame Buffer Descriptor) */
|
||||
#define FH39_TFDB(_ch, buf) (FH39_TFDB_TABLE + \
|
||||
((_ch) * 2 + (buf)) * 0x28)
|
||||
#define FH39_TFDB_CHNL_BUF_CTRL_REG(_ch) (FH39_TFDB_TABLE + 0x50 * (_ch))
|
||||
|
||||
/* CBCC channel is [0,2] */
|
||||
#define FH39_CBCC(_ch) (FH39_CBCC_TABLE + (_ch) * 0x8)
|
||||
#define FH39_CBCC_CTRL(_ch) (FH39_CBCC(_ch) + 0x00)
|
||||
#define FH39_CBCC_BASE(_ch) (FH39_CBCC(_ch) + 0x04)
|
||||
|
||||
/* RCSR channel is [0,2] */
|
||||
#define FH39_RCSR(_ch) (FH39_RCSR_TABLE + (_ch) * 0x40)
|
||||
#define FH39_RCSR_CONFIG(_ch) (FH39_RCSR(_ch) + 0x00)
|
||||
#define FH39_RCSR_RBD_BASE(_ch) (FH39_RCSR(_ch) + 0x04)
|
||||
#define FH39_RCSR_WPTR(_ch) (FH39_RCSR(_ch) + 0x20)
|
||||
#define FH39_RCSR_RPTR_ADDR(_ch) (FH39_RCSR(_ch) + 0x24)
|
||||
|
||||
#define FH39_RSCSR_CHNL0_WPTR (FH39_RCSR_WPTR(0))
|
||||
|
||||
/* RSSR */
|
||||
#define FH39_RSSR_CTRL (FH39_RSSR_TABLE + 0x000)
|
||||
#define FH39_RSSR_STATUS (FH39_RSSR_TABLE + 0x004)
|
||||
|
||||
/* TCSR */
|
||||
#define FH39_TCSR(_ch) (FH39_TCSR_TABLE + (_ch) * 0x20)
|
||||
#define FH39_TCSR_CONFIG(_ch) (FH39_TCSR(_ch) + 0x00)
|
||||
#define FH39_TCSR_CREDIT(_ch) (FH39_TCSR(_ch) + 0x04)
|
||||
#define FH39_TCSR_BUFF_STTS(_ch) (FH39_TCSR(_ch) + 0x08)
|
||||
|
||||
/* TSSR */
|
||||
#define FH39_TSSR_CBB_BASE (FH39_TSSR_TABLE + 0x000)
|
||||
#define FH39_TSSR_MSG_CONFIG (FH39_TSSR_TABLE + 0x008)
|
||||
#define FH39_TSSR_TX_STATUS (FH39_TSSR_TABLE + 0x010)
|
||||
|
||||
|
||||
/* DBM */
|
||||
|
||||
#define FH39_SRVC_CHNL (6)
|
||||
|
||||
#define FH39_RCSR_RX_CONFIG_REG_POS_RBDC_SIZE (20)
|
||||
#define FH39_RCSR_RX_CONFIG_REG_POS_IRQ_RBTH (4)
|
||||
|
||||
#define FH39_RCSR_RX_CONFIG_REG_BIT_WR_STTS_EN (0x08000000)
|
||||
|
||||
#define FH39_RCSR_RX_CONFIG_REG_VAL_DMA_CHNL_EN_ENABLE (0x80000000)
|
||||
|
||||
#define FH39_RCSR_RX_CONFIG_REG_VAL_RDRBD_EN_ENABLE (0x20000000)
|
||||
|
||||
#define FH39_RCSR_RX_CONFIG_REG_VAL_MAX_FRAG_SIZE_128 (0x01000000)
|
||||
|
||||
#define FH39_RCSR_RX_CONFIG_REG_VAL_IRQ_DEST_INT_HOST (0x00001000)
|
||||
|
||||
#define FH39_RCSR_RX_CONFIG_REG_VAL_MSG_MODE_FH (0x00000000)
|
||||
|
||||
#define FH39_TCSR_TX_CONFIG_REG_VAL_MSG_MODE_TXF (0x00000000)
|
||||
#define FH39_TCSR_TX_CONFIG_REG_VAL_MSG_MODE_DRIVER (0x00000001)
|
||||
|
||||
#define FH39_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_DISABLE_VAL (0x00000000)
|
||||
#define FH39_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_ENABLE_VAL (0x00000008)
|
||||
|
||||
#define FH39_TCSR_TX_CONFIG_REG_VAL_CIRQ_HOST_IFTFD (0x00200000)
|
||||
|
||||
#define FH39_TCSR_TX_CONFIG_REG_VAL_CIRQ_RTC_NOINT (0x00000000)
|
||||
|
||||
#define FH39_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_PAUSE (0x00000000)
|
||||
#define FH39_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_ENABLE (0x80000000)
|
||||
|
||||
#define FH39_TCSR_CHNL_TX_BUF_STS_REG_VAL_TFDB_VALID (0x00004000)
|
||||
|
||||
#define FH39_TCSR_CHNL_TX_BUF_STS_REG_BIT_TFDB_WPTR (0x00000001)
|
||||
|
||||
#define FH39_TSSR_TX_MSG_CONFIG_REG_VAL_SNOOP_RD_TXPD_ON (0xFF000000)
|
||||
#define FH39_TSSR_TX_MSG_CONFIG_REG_VAL_ORDER_RD_TXPD_ON (0x00FF0000)
|
||||
|
||||
#define FH39_TSSR_TX_MSG_CONFIG_REG_VAL_MAX_FRAG_SIZE_128B (0x00000400)
|
||||
|
||||
#define FH39_TSSR_TX_MSG_CONFIG_REG_VAL_SNOOP_RD_TFD_ON (0x00000100)
|
||||
#define FH39_TSSR_TX_MSG_CONFIG_REG_VAL_ORDER_RD_CBB_ON (0x00000080)
|
||||
|
||||
#define FH39_TSSR_TX_MSG_CONFIG_REG_VAL_ORDER_RSP_WAIT_TH (0x00000020)
|
||||
#define FH39_TSSR_TX_MSG_CONFIG_REG_VAL_RSP_WAIT_TH (0x00000005)
|
||||
|
||||
#define FH39_TSSR_TX_STATUS_REG_BIT_BUFS_EMPTY(_ch) (BIT(_ch) << 24)
|
||||
#define FH39_TSSR_TX_STATUS_REG_BIT_NO_PEND_REQ(_ch) (BIT(_ch) << 16)
|
||||
|
||||
#define FH39_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(_ch) \
|
||||
(FH39_TSSR_TX_STATUS_REG_BIT_BUFS_EMPTY(_ch) | \
|
||||
FH39_TSSR_TX_STATUS_REG_BIT_NO_PEND_REQ(_ch))
|
||||
|
||||
#define FH39_RSSR_CHNL0_RX_STATUS_CHNL_IDLE (0x01000000)
|
||||
|
||||
struct iwl3945_tfd_tb {
|
||||
__le32 addr;
|
||||
__le32 len;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl3945_tfd {
|
||||
__le32 control_flags;
|
||||
struct iwl3945_tfd_tb tbs[4];
|
||||
u8 __pad[28];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
|
||||
#endif /* __iwl_3945_fh_h__ */
|
||||
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -30,7 +30,7 @@
|
|||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -69,77 +69,26 @@
|
|||
#ifndef __iwl_3945_hw__
|
||||
#define __iwl_3945_hw__
|
||||
|
||||
#include "iwl-eeprom.h"
|
||||
|
||||
/*
|
||||
* uCode queue management definitions ...
|
||||
* Queue #4 is the command queue for 3945 and 4965.
|
||||
*/
|
||||
#define IWL_CMD_QUEUE_NUM 4
|
||||
|
||||
/* Tx rates */
|
||||
#define IWL_CCK_RATES 4
|
||||
#define IWL_OFDM_RATES 8
|
||||
#define IWL_HT_RATES 0
|
||||
#define IWL_MAX_RATES (IWL_CCK_RATES+IWL_OFDM_RATES+IWL_HT_RATES)
|
||||
#define IWL_CMD_QUEUE_NUM 4
|
||||
|
||||
/* Time constants */
|
||||
#define SHORT_SLOT_TIME 9
|
||||
#define LONG_SLOT_TIME 20
|
||||
|
||||
/* RSSI to dBm */
|
||||
#define IWL_RSSI_OFFSET 95
|
||||
#define IWL39_RSSI_OFFSET 95
|
||||
|
||||
/*
|
||||
* EEPROM related constants, enums, and structures.
|
||||
*/
|
||||
|
||||
/*
|
||||
* EEPROM access time values:
|
||||
*
|
||||
* Driver initiates EEPROM read by writing byte address << 1 to CSR_EEPROM_REG,
|
||||
* then clearing (with subsequent read/modify/write) CSR_EEPROM_REG bit
|
||||
* CSR_EEPROM_REG_BIT_CMD (0x2).
|
||||
* Driver then polls CSR_EEPROM_REG for CSR_EEPROM_REG_READ_VALID_MSK (0x1).
|
||||
* When polling, wait 10 uSec between polling loops, up to a maximum 5000 uSec.
|
||||
* Driver reads 16-bit value from bits 31-16 of CSR_EEPROM_REG.
|
||||
*/
|
||||
#define IWL_EEPROM_ACCESS_TIMEOUT 5000 /* uSec */
|
||||
|
||||
/*
|
||||
* Regulatory channel usage flags in EEPROM struct iwl_eeprom_channel.flags.
|
||||
*
|
||||
* IBSS and/or AP operation is allowed *only* on those channels with
|
||||
* (VALID && IBSS && ACTIVE && !RADAR). This restriction is in place because
|
||||
* RADAR detection is not supported by the 3945 driver, but is a
|
||||
* requirement for establishing a new network for legal operation on channels
|
||||
* requiring RADAR detection or restricting ACTIVE scanning.
|
||||
*
|
||||
* NOTE: "WIDE" flag indicates that 20 MHz channel is supported;
|
||||
* 3945 does not support FAT 40 MHz-wide channels.
|
||||
*
|
||||
* NOTE: Using a channel inappropriately will result in a uCode error!
|
||||
*/
|
||||
enum {
|
||||
EEPROM_CHANNEL_VALID = (1 << 0), /* usable for this SKU/geo */
|
||||
EEPROM_CHANNEL_IBSS = (1 << 1), /* usable as an IBSS channel */
|
||||
/* Bit 2 Reserved */
|
||||
EEPROM_CHANNEL_ACTIVE = (1 << 3), /* active scanning allowed */
|
||||
EEPROM_CHANNEL_RADAR = (1 << 4), /* radar detection required */
|
||||
EEPROM_CHANNEL_WIDE = (1 << 5), /* 20 MHz channel okay */
|
||||
/* Bit 6 Reserved (was Narrow Channel) */
|
||||
EEPROM_CHANNEL_DFS = (1 << 7), /* dynamic freq selection candidate */
|
||||
};
|
||||
|
||||
/* SKU Capabilities */
|
||||
#define EEPROM_SKU_CAP_SW_RF_KILL_ENABLE (1 << 0)
|
||||
#define EEPROM_SKU_CAP_HW_RF_KILL_ENABLE (1 << 1)
|
||||
#define EEPROM_SKU_CAP_OP_MODE_MRC (1 << 7)
|
||||
|
||||
/* *regulatory* channel data from eeprom, one for each channel */
|
||||
struct iwl3945_eeprom_channel {
|
||||
u8 flags; /* flags copied from EEPROM */
|
||||
s8 max_power_avg; /* max power (dBm) on this chnl, limit 31 */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/*
|
||||
* Mapping of a Tx power level, at factory calibration temperature,
|
||||
* to a radio/DSP gain table index.
|
||||
|
@ -233,7 +182,7 @@ struct iwl3945_eeprom {
|
|||
* 2.4 GHz channels 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
|
||||
*/
|
||||
u16 band_1_count; /* abs.ofs: 196 */
|
||||
struct iwl3945_eeprom_channel band_1_channels[14]; /* abs.ofs: 196 */
|
||||
struct iwl_eeprom_channel band_1_channels[14]; /* abs.ofs: 198 */
|
||||
|
||||
/*
|
||||
* 4.9 GHz channels 183, 184, 185, 187, 188, 189, 192, 196,
|
||||
|
@ -241,28 +190,28 @@ struct iwl3945_eeprom {
|
|||
* (4915-5080MHz) (none of these is ever supported)
|
||||
*/
|
||||
u16 band_2_count; /* abs.ofs: 226 */
|
||||
struct iwl3945_eeprom_channel band_2_channels[13]; /* abs.ofs: 228 */
|
||||
struct iwl_eeprom_channel band_2_channels[13]; /* abs.ofs: 228 */
|
||||
|
||||
/*
|
||||
* 5.2 GHz channels 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64
|
||||
* (5170-5320MHz)
|
||||
*/
|
||||
u16 band_3_count; /* abs.ofs: 254 */
|
||||
struct iwl3945_eeprom_channel band_3_channels[12]; /* abs.ofs: 256 */
|
||||
struct iwl_eeprom_channel band_3_channels[12]; /* abs.ofs: 256 */
|
||||
|
||||
/*
|
||||
* 5.5 GHz channels 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140
|
||||
* (5500-5700MHz)
|
||||
*/
|
||||
u16 band_4_count; /* abs.ofs: 280 */
|
||||
struct iwl3945_eeprom_channel band_4_channels[11]; /* abs.ofs: 282 */
|
||||
struct iwl_eeprom_channel band_4_channels[11]; /* abs.ofs: 282 */
|
||||
|
||||
/*
|
||||
* 5.7 GHz channels 145, 149, 153, 157, 161, 165
|
||||
* (5725-5825MHz)
|
||||
*/
|
||||
u16 band_5_count; /* abs.ofs: 304 */
|
||||
struct iwl3945_eeprom_channel band_5_channels[6]; /* abs.ofs: 306 */
|
||||
struct iwl_eeprom_channel band_5_channels[6]; /* abs.ofs: 306 */
|
||||
|
||||
u8 reserved9[194];
|
||||
|
||||
|
@ -276,125 +225,21 @@ struct iwl3945_eeprom {
|
|||
u8 reserved16[172]; /* fill out to full 1024 byte block */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define IWL_EEPROM_IMAGE_SIZE 1024
|
||||
#define IWL3945_EEPROM_IMG_SIZE 1024
|
||||
|
||||
/* End of EEPROM */
|
||||
|
||||
|
||||
#include "iwl-3945-commands.h"
|
||||
|
||||
#define PCI_LINK_CTRL 0x0F0
|
||||
#define PCI_POWER_SOURCE 0x0C8
|
||||
#define PCI_REG_WUM8 0x0E8
|
||||
#define PCI_CFG_PMC_PME_FROM_D3COLD_SUPPORT (0x80000000)
|
||||
|
||||
/*=== FH (data Flow Handler) ===*/
|
||||
#define FH_BASE (0x800)
|
||||
|
||||
#define FH_CBCC_TABLE (FH_BASE+0x140)
|
||||
#define FH_TFDB_TABLE (FH_BASE+0x180)
|
||||
#define FH_RCSR_TABLE (FH_BASE+0x400)
|
||||
#define FH_RSSR_TABLE (FH_BASE+0x4c0)
|
||||
#define FH_TCSR_TABLE (FH_BASE+0x500)
|
||||
#define FH_TSSR_TABLE (FH_BASE+0x680)
|
||||
|
||||
/* TFDB (Transmit Frame Buffer Descriptor) */
|
||||
#define FH_TFDB(_channel, buf) \
|
||||
(FH_TFDB_TABLE+((_channel)*2+(buf))*0x28)
|
||||
#define ALM_FH_TFDB_CHNL_BUF_CTRL_REG(_channel) \
|
||||
(FH_TFDB_TABLE + 0x50 * _channel)
|
||||
/* CBCC _channel is [0,2] */
|
||||
#define FH_CBCC(_channel) (FH_CBCC_TABLE+(_channel)*0x8)
|
||||
#define FH_CBCC_CTRL(_channel) (FH_CBCC(_channel)+0x00)
|
||||
#define FH_CBCC_BASE(_channel) (FH_CBCC(_channel)+0x04)
|
||||
|
||||
/* RCSR _channel is [0,2] */
|
||||
#define FH_RCSR(_channel) (FH_RCSR_TABLE+(_channel)*0x40)
|
||||
#define FH_RCSR_CONFIG(_channel) (FH_RCSR(_channel)+0x00)
|
||||
#define FH_RCSR_RBD_BASE(_channel) (FH_RCSR(_channel)+0x04)
|
||||
#define FH_RCSR_WPTR(_channel) (FH_RCSR(_channel)+0x20)
|
||||
#define FH_RCSR_RPTR_ADDR(_channel) (FH_RCSR(_channel)+0x24)
|
||||
|
||||
#define FH_RSCSR_CHNL0_WPTR (FH_RCSR_WPTR(0))
|
||||
|
||||
/* RSSR */
|
||||
#define FH_RSSR_CTRL (FH_RSSR_TABLE+0x000)
|
||||
#define FH_RSSR_STATUS (FH_RSSR_TABLE+0x004)
|
||||
#define FH_RSSR_CHNL0_RX_STATUS_CHNL_IDLE (0x01000000)
|
||||
/* TCSR */
|
||||
#define FH_TCSR(_channel) (FH_TCSR_TABLE+(_channel)*0x20)
|
||||
#define FH_TCSR_CONFIG(_channel) (FH_TCSR(_channel)+0x00)
|
||||
#define FH_TCSR_CREDIT(_channel) (FH_TCSR(_channel)+0x04)
|
||||
#define FH_TCSR_BUFF_STTS(_channel) (FH_TCSR(_channel)+0x08)
|
||||
/* TSSR */
|
||||
#define FH_TSSR_CBB_BASE (FH_TSSR_TABLE+0x000)
|
||||
#define FH_TSSR_MSG_CONFIG (FH_TSSR_TABLE+0x008)
|
||||
#define FH_TSSR_TX_STATUS (FH_TSSR_TABLE+0x010)
|
||||
|
||||
|
||||
/* DBM */
|
||||
|
||||
#define ALM_FH_SRVC_CHNL (6)
|
||||
|
||||
#define ALM_FH_RCSR_RX_CONFIG_REG_POS_RBDC_SIZE (20)
|
||||
#define ALM_FH_RCSR_RX_CONFIG_REG_POS_IRQ_RBTH (4)
|
||||
|
||||
#define ALM_FH_RCSR_RX_CONFIG_REG_BIT_WR_STTS_EN (0x08000000)
|
||||
|
||||
#define ALM_FH_RCSR_RX_CONFIG_REG_VAL_DMA_CHNL_EN_ENABLE (0x80000000)
|
||||
|
||||
#define ALM_FH_RCSR_RX_CONFIG_REG_VAL_RDRBD_EN_ENABLE (0x20000000)
|
||||
|
||||
#define ALM_FH_RCSR_RX_CONFIG_REG_VAL_MAX_FRAG_SIZE_128 (0x01000000)
|
||||
|
||||
#define ALM_FH_RCSR_RX_CONFIG_REG_VAL_IRQ_DEST_INT_HOST (0x00001000)
|
||||
|
||||
#define ALM_FH_RCSR_RX_CONFIG_REG_VAL_MSG_MODE_FH (0x00000000)
|
||||
|
||||
#define ALM_FH_TCSR_TX_CONFIG_REG_VAL_MSG_MODE_TXF (0x00000000)
|
||||
#define ALM_FH_TCSR_TX_CONFIG_REG_VAL_MSG_MODE_DRIVER (0x00000001)
|
||||
|
||||
#define ALM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_DISABLE_VAL (0x00000000)
|
||||
#define ALM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_ENABLE_VAL (0x00000008)
|
||||
|
||||
#define ALM_FH_TCSR_TX_CONFIG_REG_VAL_CIRQ_HOST_IFTFD (0x00200000)
|
||||
|
||||
#define ALM_FH_TCSR_TX_CONFIG_REG_VAL_CIRQ_RTC_NOINT (0x00000000)
|
||||
|
||||
#define ALM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_PAUSE (0x00000000)
|
||||
#define ALM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_ENABLE (0x80000000)
|
||||
|
||||
#define ALM_FH_TCSR_CHNL_TX_BUF_STS_REG_VAL_TFDB_VALID (0x00004000)
|
||||
|
||||
#define ALM_FH_TCSR_CHNL_TX_BUF_STS_REG_BIT_TFDB_WPTR (0x00000001)
|
||||
|
||||
#define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_SNOOP_RD_TXPD_ON (0xFF000000)
|
||||
#define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_ORDER_RD_TXPD_ON (0x00FF0000)
|
||||
|
||||
#define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_MAX_FRAG_SIZE_128B (0x00000400)
|
||||
|
||||
#define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_SNOOP_RD_TFD_ON (0x00000100)
|
||||
#define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_ORDER_RD_CBB_ON (0x00000080)
|
||||
|
||||
#define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_ORDER_RSP_WAIT_TH (0x00000020)
|
||||
#define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_RSP_WAIT_TH (0x00000005)
|
||||
|
||||
#define ALM_TB_MAX_BYTES_COUNT (0xFFF0)
|
||||
|
||||
#define ALM_FH_TSSR_TX_STATUS_REG_BIT_BUFS_EMPTY(_channel) \
|
||||
((1LU << _channel) << 24)
|
||||
#define ALM_FH_TSSR_TX_STATUS_REG_BIT_NO_PEND_REQ(_channel) \
|
||||
((1LU << _channel) << 16)
|
||||
|
||||
#define ALM_FH_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(_channel) \
|
||||
(ALM_FH_TSSR_TX_STATUS_REG_BIT_BUFS_EMPTY(_channel) | \
|
||||
ALM_FH_TSSR_TX_STATUS_REG_BIT_NO_PEND_REQ(_channel))
|
||||
#define PCI_CFG_REV_ID_BIT_BASIC_SKU (0x40) /* bit 6 */
|
||||
#define PCI_CFG_REV_ID_BIT_RTP (0x80) /* bit 7 */
|
||||
|
||||
#define TFD_QUEUE_MIN 0
|
||||
#define TFD_QUEUE_MAX 6
|
||||
#define TFD_QUEUE_SIZE_MAX (256)
|
||||
|
||||
#define IWL_NUM_SCAN_RATES (2)
|
||||
|
||||
|
@ -416,12 +261,6 @@ struct iwl3945_eeprom {
|
|||
#define TFD_CTL_PAD_SET(n) (n << 28)
|
||||
#define TFD_CTL_PAD_GET(ctl) (ctl >> 28)
|
||||
|
||||
#define TFD_TX_CMD_SLOTS 256
|
||||
#define TFD_CMD_SLOTS 32
|
||||
|
||||
#define TFD_MAX_PAYLOAD_SIZE (sizeof(struct iwl3945_cmd) - \
|
||||
sizeof(struct iwl3945_cmd_meta))
|
||||
|
||||
/*
|
||||
* RX related structures and functions
|
||||
*/
|
||||
|
@ -430,45 +269,35 @@ struct iwl3945_eeprom {
|
|||
|
||||
/* Sizes and addresses for instruction and data memory (SRAM) in
|
||||
* 3945's embedded processor. Driver access is via HBUS_TARG_MEM_* regs. */
|
||||
#define RTC_INST_LOWER_BOUND (0x000000)
|
||||
#define ALM_RTC_INST_UPPER_BOUND (0x014000)
|
||||
#define IWL39_RTC_INST_LOWER_BOUND (0x000000)
|
||||
#define IWL39_RTC_INST_UPPER_BOUND (0x014000)
|
||||
|
||||
#define RTC_DATA_LOWER_BOUND (0x800000)
|
||||
#define ALM_RTC_DATA_UPPER_BOUND (0x808000)
|
||||
#define IWL39_RTC_DATA_LOWER_BOUND (0x800000)
|
||||
#define IWL39_RTC_DATA_UPPER_BOUND (0x808000)
|
||||
|
||||
#define ALM_RTC_INST_SIZE (ALM_RTC_INST_UPPER_BOUND - RTC_INST_LOWER_BOUND)
|
||||
#define ALM_RTC_DATA_SIZE (ALM_RTC_DATA_UPPER_BOUND - RTC_DATA_LOWER_BOUND)
|
||||
#define IWL39_RTC_INST_SIZE (IWL39_RTC_INST_UPPER_BOUND - \
|
||||
IWL39_RTC_INST_LOWER_BOUND)
|
||||
#define IWL39_RTC_DATA_SIZE (IWL39_RTC_DATA_UPPER_BOUND - \
|
||||
IWL39_RTC_DATA_LOWER_BOUND)
|
||||
|
||||
#define IWL_MAX_INST_SIZE ALM_RTC_INST_SIZE
|
||||
#define IWL_MAX_DATA_SIZE ALM_RTC_DATA_SIZE
|
||||
#define IWL39_MAX_INST_SIZE IWL39_RTC_INST_SIZE
|
||||
#define IWL39_MAX_DATA_SIZE IWL39_RTC_DATA_SIZE
|
||||
|
||||
/* Size of uCode instruction memory in bootstrap state machine */
|
||||
#define IWL_MAX_BSM_SIZE ALM_RTC_INST_SIZE
|
||||
#define IWL39_MAX_BSM_SIZE IWL39_RTC_INST_SIZE
|
||||
|
||||
#define IWL39_MAX_NUM_QUEUES 8
|
||||
|
||||
static inline int iwl3945_hw_valid_rtc_data_addr(u32 addr)
|
||||
{
|
||||
return (addr >= RTC_DATA_LOWER_BOUND) &&
|
||||
(addr < ALM_RTC_DATA_UPPER_BOUND);
|
||||
return (addr >= IWL39_RTC_DATA_LOWER_BOUND) &&
|
||||
(addr < IWL39_RTC_DATA_UPPER_BOUND);
|
||||
}
|
||||
|
||||
/* Base physical address of iwl3945_shared is provided to FH_TSSR_CBB_BASE
|
||||
* and &iwl3945_shared.rx_read_ptr[0] is provided to FH_RCSR_RPTR_ADDR(0) */
|
||||
struct iwl3945_shared {
|
||||
__le32 tx_base_ptr[8];
|
||||
__le32 rx_read_ptr[3];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl3945_tfd_frame_data {
|
||||
__le32 addr;
|
||||
__le32 len;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl3945_tfd_frame {
|
||||
__le32 control_flags;
|
||||
struct iwl3945_tfd_frame_data pa[4];
|
||||
u8 reserved[28];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
static inline u8 iwl3945_hw_get_rate(__le16 rate_n_flags)
|
||||
|
|
|
@ -1,404 +0,0 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* Portions of this file are derived from the ipw3945 project.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* Intel Linux Wireless <ilw@linux.intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __iwl3945_io_h__
|
||||
#define __iwl3945_io_h__
|
||||
|
||||
#include <linux/io.h>
|
||||
|
||||
#include "iwl-3945-debug.h"
|
||||
|
||||
/*
|
||||
* IO, register, and NIC memory access functions
|
||||
*
|
||||
* NOTE on naming convention and macro usage for these
|
||||
*
|
||||
* A single _ prefix before a an access function means that no state
|
||||
* check or debug information is printed when that function is called.
|
||||
*
|
||||
* A double __ prefix before an access function means that state is checked
|
||||
* and the current line number is printed in addition to any other debug output.
|
||||
*
|
||||
* The non-prefixed name is the #define that maps the caller into a
|
||||
* #define that provides the caller's __LINE__ to the double prefix version.
|
||||
*
|
||||
* If you wish to call the function without any debug or state checking,
|
||||
* you should use the single _ prefix version (as is used by dependent IO
|
||||
* routines, for example _iwl3945_read_direct32 calls the non-check version of
|
||||
* _iwl3945_read32.)
|
||||
*
|
||||
* These declarations are *extremely* useful in quickly isolating code deltas
|
||||
* which result in misconfiguration of the hardware I/O. In combination with
|
||||
* git-bisect and the IO debug level you can quickly determine the specific
|
||||
* commit which breaks the IO sequence to the hardware.
|
||||
*
|
||||
*/
|
||||
|
||||
#define _iwl3945_write32(priv, ofs, val) iowrite32((val), (priv)->hw_base + (ofs))
|
||||
#ifdef CONFIG_IWL3945_DEBUG
|
||||
static inline void __iwl3945_write32(const char *f, u32 l, struct iwl3945_priv *priv,
|
||||
u32 ofs, u32 val)
|
||||
{
|
||||
IWL_DEBUG_IO("write32(0x%08X, 0x%08X) - %s %d\n", ofs, val, f, l);
|
||||
_iwl3945_write32(priv, ofs, val);
|
||||
}
|
||||
#define iwl3945_write32(priv, ofs, val) \
|
||||
__iwl3945_write32(__FILE__, __LINE__, priv, ofs, val)
|
||||
#else
|
||||
#define iwl3945_write32(priv, ofs, val) _iwl3945_write32(priv, ofs, val)
|
||||
#endif
|
||||
|
||||
#define _iwl3945_read32(priv, ofs) ioread32((priv)->hw_base + (ofs))
|
||||
#ifdef CONFIG_IWL3945_DEBUG
|
||||
static inline u32 __iwl3945_read32(char *f, u32 l, struct iwl3945_priv *priv, u32 ofs)
|
||||
{
|
||||
IWL_DEBUG_IO("read_direct32(0x%08X) - %s %d\n", ofs, f, l);
|
||||
return _iwl3945_read32(priv, ofs);
|
||||
}
|
||||
#define iwl3945_read32(priv, ofs)__iwl3945_read32(__FILE__, __LINE__, priv, ofs)
|
||||
#else
|
||||
#define iwl3945_read32(p, o) _iwl3945_read32(p, o)
|
||||
#endif
|
||||
|
||||
static inline int _iwl3945_poll_bit(struct iwl3945_priv *priv, u32 addr,
|
||||
u32 bits, u32 mask, int timeout)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
do {
|
||||
if ((_iwl3945_read32(priv, addr) & mask) == (bits & mask))
|
||||
return i;
|
||||
udelay(10);
|
||||
i += 10;
|
||||
} while (i < timeout);
|
||||
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
#ifdef CONFIG_IWL3945_DEBUG
|
||||
static inline int __iwl3945_poll_bit(const char *f, u32 l,
|
||||
struct iwl3945_priv *priv, u32 addr,
|
||||
u32 bits, u32 mask, int timeout)
|
||||
{
|
||||
int ret = _iwl3945_poll_bit(priv, addr, bits, mask, timeout);
|
||||
IWL_DEBUG_IO("poll_bit(0x%08X, 0x%08X, 0x%08X) - %s- %s %d\n",
|
||||
addr, bits, mask,
|
||||
unlikely(ret == -ETIMEDOUT) ? "timeout" : "", f, l);
|
||||
return ret;
|
||||
}
|
||||
#define iwl3945_poll_bit(priv, addr, bits, mask, timeout) \
|
||||
__iwl3945_poll_bit(__FILE__, __LINE__, priv, addr, bits, mask, timeout)
|
||||
#else
|
||||
#define iwl3945_poll_bit(p, a, b, m, t) _iwl3945_poll_bit(p, a, b, m, t)
|
||||
#endif
|
||||
|
||||
static inline void _iwl3945_set_bit(struct iwl3945_priv *priv, u32 reg, u32 mask)
|
||||
{
|
||||
_iwl3945_write32(priv, reg, _iwl3945_read32(priv, reg) | mask);
|
||||
}
|
||||
#ifdef CONFIG_IWL3945_DEBUG
|
||||
static inline void __iwl3945_set_bit(const char *f, u32 l,
|
||||
struct iwl3945_priv *priv, u32 reg, u32 mask)
|
||||
{
|
||||
u32 val = _iwl3945_read32(priv, reg) | mask;
|
||||
IWL_DEBUG_IO("set_bit(0x%08X, 0x%08X) = 0x%08X\n", reg, mask, val);
|
||||
_iwl3945_write32(priv, reg, val);
|
||||
}
|
||||
#define iwl3945_set_bit(p, r, m) __iwl3945_set_bit(__FILE__, __LINE__, p, r, m)
|
||||
#else
|
||||
#define iwl3945_set_bit(p, r, m) _iwl3945_set_bit(p, r, m)
|
||||
#endif
|
||||
|
||||
static inline void _iwl3945_clear_bit(struct iwl3945_priv *priv, u32 reg, u32 mask)
|
||||
{
|
||||
_iwl3945_write32(priv, reg, _iwl3945_read32(priv, reg) & ~mask);
|
||||
}
|
||||
#ifdef CONFIG_IWL3945_DEBUG
|
||||
static inline void __iwl3945_clear_bit(const char *f, u32 l,
|
||||
struct iwl3945_priv *priv, u32 reg, u32 mask)
|
||||
{
|
||||
u32 val = _iwl3945_read32(priv, reg) & ~mask;
|
||||
IWL_DEBUG_IO("clear_bit(0x%08X, 0x%08X) = 0x%08X\n", reg, mask, val);
|
||||
_iwl3945_write32(priv, reg, val);
|
||||
}
|
||||
#define iwl3945_clear_bit(p, r, m) __iwl3945_clear_bit(__FILE__, __LINE__, p, r, m)
|
||||
#else
|
||||
#define iwl3945_clear_bit(p, r, m) _iwl3945_clear_bit(p, r, m)
|
||||
#endif
|
||||
|
||||
static inline int _iwl3945_grab_nic_access(struct iwl3945_priv *priv)
|
||||
{
|
||||
int ret;
|
||||
#ifdef CONFIG_IWL3945_DEBUG
|
||||
if (atomic_read(&priv->restrict_refcnt))
|
||||
return 0;
|
||||
#endif
|
||||
/* this bit wakes up the NIC */
|
||||
_iwl3945_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
|
||||
ret = _iwl3945_poll_bit(priv, CSR_GP_CNTRL,
|
||||
CSR_GP_CNTRL_REG_VAL_MAC_ACCESS_EN,
|
||||
(CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY |
|
||||
CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP), 50);
|
||||
if (ret < 0) {
|
||||
IWL_ERROR("MAC is in deep sleep!\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IWL3945_DEBUG
|
||||
atomic_inc(&priv->restrict_refcnt);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IWL3945_DEBUG
|
||||
static inline int __iwl3945_grab_nic_access(const char *f, u32 l,
|
||||
struct iwl3945_priv *priv)
|
||||
{
|
||||
if (atomic_read(&priv->restrict_refcnt))
|
||||
IWL_DEBUG_INFO("Grabbing access while already held at "
|
||||
"line %d.\n", l);
|
||||
|
||||
IWL_DEBUG_IO("grabbing nic access - %s %d\n", f, l);
|
||||
return _iwl3945_grab_nic_access(priv);
|
||||
}
|
||||
#define iwl3945_grab_nic_access(priv) \
|
||||
__iwl3945_grab_nic_access(__FILE__, __LINE__, priv)
|
||||
#else
|
||||
#define iwl3945_grab_nic_access(priv) \
|
||||
_iwl3945_grab_nic_access(priv)
|
||||
#endif
|
||||
|
||||
static inline void _iwl3945_release_nic_access(struct iwl3945_priv *priv)
|
||||
{
|
||||
#ifdef CONFIG_IWL3945_DEBUG
|
||||
if (atomic_dec_and_test(&priv->restrict_refcnt))
|
||||
#endif
|
||||
_iwl3945_clear_bit(priv, CSR_GP_CNTRL,
|
||||
CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
|
||||
}
|
||||
#ifdef CONFIG_IWL3945_DEBUG
|
||||
static inline void __iwl3945_release_nic_access(const char *f, u32 l,
|
||||
struct iwl3945_priv *priv)
|
||||
{
|
||||
if (atomic_read(&priv->restrict_refcnt) <= 0)
|
||||
IWL_ERROR("Release unheld nic access at line %d.\n", l);
|
||||
|
||||
IWL_DEBUG_IO("releasing nic access - %s %d\n", f, l);
|
||||
_iwl3945_release_nic_access(priv);
|
||||
}
|
||||
#define iwl3945_release_nic_access(priv) \
|
||||
__iwl3945_release_nic_access(__FILE__, __LINE__, priv)
|
||||
#else
|
||||
#define iwl3945_release_nic_access(priv) \
|
||||
_iwl3945_release_nic_access(priv)
|
||||
#endif
|
||||
|
||||
static inline u32 _iwl3945_read_direct32(struct iwl3945_priv *priv, u32 reg)
|
||||
{
|
||||
return _iwl3945_read32(priv, reg);
|
||||
}
|
||||
#ifdef CONFIG_IWL3945_DEBUG
|
||||
static inline u32 __iwl3945_read_direct32(const char *f, u32 l,
|
||||
struct iwl3945_priv *priv, u32 reg)
|
||||
{
|
||||
u32 value = _iwl3945_read_direct32(priv, reg);
|
||||
if (!atomic_read(&priv->restrict_refcnt))
|
||||
IWL_ERROR("Nic access not held from %s %d\n", f, l);
|
||||
IWL_DEBUG_IO("read_direct32(0x%4X) = 0x%08x - %s %d \n", reg, value,
|
||||
f, l);
|
||||
return value;
|
||||
}
|
||||
#define iwl3945_read_direct32(priv, reg) \
|
||||
__iwl3945_read_direct32(__FILE__, __LINE__, priv, reg)
|
||||
#else
|
||||
#define iwl3945_read_direct32 _iwl3945_read_direct32
|
||||
#endif
|
||||
|
||||
static inline void _iwl3945_write_direct32(struct iwl3945_priv *priv,
|
||||
u32 reg, u32 value)
|
||||
{
|
||||
_iwl3945_write32(priv, reg, value);
|
||||
}
|
||||
#ifdef CONFIG_IWL3945_DEBUG
|
||||
static void __iwl3945_write_direct32(u32 line,
|
||||
struct iwl3945_priv *priv, u32 reg, u32 value)
|
||||
{
|
||||
if (!atomic_read(&priv->restrict_refcnt))
|
||||
IWL_ERROR("Nic access not held from line %d\n", line);
|
||||
_iwl3945_write_direct32(priv, reg, value);
|
||||
}
|
||||
#define iwl3945_write_direct32(priv, reg, value) \
|
||||
__iwl3945_write_direct32(__LINE__, priv, reg, value)
|
||||
#else
|
||||
#define iwl3945_write_direct32 _iwl3945_write_direct32
|
||||
#endif
|
||||
|
||||
static inline void iwl3945_write_reg_buf(struct iwl3945_priv *priv,
|
||||
u32 reg, u32 len, u32 *values)
|
||||
{
|
||||
u32 count = sizeof(u32);
|
||||
|
||||
if ((priv != NULL) && (values != NULL)) {
|
||||
for (; 0 < len; len -= count, reg += count, values++)
|
||||
_iwl3945_write_direct32(priv, reg, *values);
|
||||
}
|
||||
}
|
||||
|
||||
static inline int _iwl3945_poll_direct_bit(struct iwl3945_priv *priv,
|
||||
u32 addr, u32 mask, int timeout)
|
||||
{
|
||||
return _iwl3945_poll_bit(priv, addr, mask, mask, timeout);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IWL3945_DEBUG
|
||||
static inline int __iwl3945_poll_direct_bit(const char *f, u32 l,
|
||||
struct iwl3945_priv *priv,
|
||||
u32 addr, u32 mask, int timeout)
|
||||
{
|
||||
int ret = _iwl3945_poll_direct_bit(priv, addr, mask, timeout);
|
||||
|
||||
if (unlikely(ret == -ETIMEDOUT))
|
||||
IWL_DEBUG_IO("poll_direct_bit(0x%08X, 0x%08X) - "
|
||||
"timedout - %s %d\n", addr, mask, f, l);
|
||||
else
|
||||
IWL_DEBUG_IO("poll_direct_bit(0x%08X, 0x%08X) = 0x%08X "
|
||||
"- %s %d\n", addr, mask, ret, f, l);
|
||||
return ret;
|
||||
}
|
||||
#define iwl3945_poll_direct_bit(priv, addr, mask, timeout) \
|
||||
__iwl3945_poll_direct_bit(__FILE__, __LINE__, priv, addr, mask, timeout)
|
||||
#else
|
||||
#define iwl3945_poll_direct_bit _iwl3945_poll_direct_bit
|
||||
#endif
|
||||
|
||||
static inline u32 _iwl3945_read_prph(struct iwl3945_priv *priv, u32 reg)
|
||||
{
|
||||
_iwl3945_write_direct32(priv, HBUS_TARG_PRPH_RADDR, reg | (3 << 24));
|
||||
rmb();
|
||||
return _iwl3945_read_direct32(priv, HBUS_TARG_PRPH_RDAT);
|
||||
}
|
||||
#ifdef CONFIG_IWL3945_DEBUG
|
||||
static inline u32 __iwl3945_read_prph(u32 line, struct iwl3945_priv *priv, u32 reg)
|
||||
{
|
||||
if (!atomic_read(&priv->restrict_refcnt))
|
||||
IWL_ERROR("Nic access not held from line %d\n", line);
|
||||
return _iwl3945_read_prph(priv, reg);
|
||||
}
|
||||
|
||||
#define iwl3945_read_prph(priv, reg) \
|
||||
__iwl3945_read_prph(__LINE__, priv, reg)
|
||||
#else
|
||||
#define iwl3945_read_prph _iwl3945_read_prph
|
||||
#endif
|
||||
|
||||
static inline void _iwl3945_write_prph(struct iwl3945_priv *priv,
|
||||
u32 addr, u32 val)
|
||||
{
|
||||
_iwl3945_write_direct32(priv, HBUS_TARG_PRPH_WADDR,
|
||||
((addr & 0x0000FFFF) | (3 << 24)));
|
||||
wmb();
|
||||
_iwl3945_write_direct32(priv, HBUS_TARG_PRPH_WDAT, val);
|
||||
}
|
||||
#ifdef CONFIG_IWL3945_DEBUG
|
||||
static inline void __iwl3945_write_prph(u32 line, struct iwl3945_priv *priv,
|
||||
u32 addr, u32 val)
|
||||
{
|
||||
if (!atomic_read(&priv->restrict_refcnt))
|
||||
IWL_ERROR("Nic access from line %d\n", line);
|
||||
_iwl3945_write_prph(priv, addr, val);
|
||||
}
|
||||
|
||||
#define iwl3945_write_prph(priv, addr, val) \
|
||||
__iwl3945_write_prph(__LINE__, priv, addr, val);
|
||||
#else
|
||||
#define iwl3945_write_prph _iwl3945_write_prph
|
||||
#endif
|
||||
|
||||
#define _iwl3945_set_bits_prph(priv, reg, mask) \
|
||||
_iwl3945_write_prph(priv, reg, (_iwl3945_read_prph(priv, reg) | mask))
|
||||
#ifdef CONFIG_IWL3945_DEBUG
|
||||
static inline void __iwl3945_set_bits_prph(u32 line, struct iwl3945_priv *priv,
|
||||
u32 reg, u32 mask)
|
||||
{
|
||||
if (!atomic_read(&priv->restrict_refcnt))
|
||||
IWL_ERROR("Nic access not held from line %d\n", line);
|
||||
|
||||
_iwl3945_set_bits_prph(priv, reg, mask);
|
||||
}
|
||||
#define iwl3945_set_bits_prph(priv, reg, mask) \
|
||||
__iwl3945_set_bits_prph(__LINE__, priv, reg, mask)
|
||||
#else
|
||||
#define iwl3945_set_bits_prph _iwl3945_set_bits_prph
|
||||
#endif
|
||||
|
||||
#define _iwl3945_set_bits_mask_prph(priv, reg, bits, mask) \
|
||||
_iwl3945_write_prph(priv, reg, ((_iwl3945_read_prph(priv, reg) & mask) | bits))
|
||||
|
||||
#ifdef CONFIG_IWL3945_DEBUG
|
||||
static inline void __iwl3945_set_bits_mask_prph(u32 line,
|
||||
struct iwl3945_priv *priv, u32 reg, u32 bits, u32 mask)
|
||||
{
|
||||
if (!atomic_read(&priv->restrict_refcnt))
|
||||
IWL_ERROR("Nic access not held from line %d\n", line);
|
||||
_iwl3945_set_bits_mask_prph(priv, reg, bits, mask);
|
||||
}
|
||||
#define iwl3945_set_bits_mask_prph(priv, reg, bits, mask) \
|
||||
__iwl3945_set_bits_mask_prph(__LINE__, priv, reg, bits, mask)
|
||||
#else
|
||||
#define iwl3945_set_bits_mask_prph _iwl3945_set_bits_mask_prph
|
||||
#endif
|
||||
|
||||
static inline void iwl3945_clear_bits_prph(struct iwl3945_priv
|
||||
*priv, u32 reg, u32 mask)
|
||||
{
|
||||
u32 val = _iwl3945_read_prph(priv, reg);
|
||||
_iwl3945_write_prph(priv, reg, (val & ~mask));
|
||||
}
|
||||
|
||||
static inline u32 iwl3945_read_targ_mem(struct iwl3945_priv *priv, u32 addr)
|
||||
{
|
||||
iwl3945_write_direct32(priv, HBUS_TARG_MEM_RADDR, addr);
|
||||
rmb();
|
||||
return iwl3945_read_direct32(priv, HBUS_TARG_MEM_RDAT);
|
||||
}
|
||||
|
||||
static inline void iwl3945_write_targ_mem(struct iwl3945_priv *priv, u32 addr, u32 val)
|
||||
{
|
||||
iwl3945_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr);
|
||||
wmb();
|
||||
iwl3945_write_direct32(priv, HBUS_TARG_MEM_WDAT, val);
|
||||
}
|
||||
|
||||
static inline void iwl3945_write_targ_mem_buf(struct iwl3945_priv *priv, u32 addr,
|
||||
u32 len, u32 *values)
|
||||
{
|
||||
iwl3945_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr);
|
||||
wmb();
|
||||
for (; 0 < len; len -= sizeof(u32), values++)
|
||||
iwl3945_write_direct32(priv, HBUS_TARG_MEM_WDAT, *values);
|
||||
}
|
||||
#endif
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2003 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -38,8 +38,10 @@
|
|||
#include <linux/etherdevice.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
#include "iwl-commands.h"
|
||||
#include "iwl-3945.h"
|
||||
#include "iwl-helpers.h"
|
||||
#include "iwl-core.h"
|
||||
#include "iwl-dev.h"
|
||||
|
||||
|
||||
static const struct {
|
||||
|
@ -67,8 +69,8 @@ static const struct {
|
|||
#define IWL_MAX_BLINK_TBL (ARRAY_SIZE(blink_tbl) - 1) /*Exclude Solid on*/
|
||||
#define IWL_SOLID_BLINK_IDX (ARRAY_SIZE(blink_tbl) - 1)
|
||||
|
||||
static int iwl3945_led_cmd_callback(struct iwl3945_priv *priv,
|
||||
struct iwl3945_cmd *cmd,
|
||||
static int iwl3945_led_cmd_callback(struct iwl_priv *priv,
|
||||
struct iwl_cmd *cmd,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
return 1;
|
||||
|
@ -80,27 +82,27 @@ static inline int iwl3945_brightness_to_idx(enum led_brightness brightness)
|
|||
}
|
||||
|
||||
/* Send led command */
|
||||
static int iwl_send_led_cmd(struct iwl3945_priv *priv,
|
||||
struct iwl3945_led_cmd *led_cmd)
|
||||
static int iwl_send_led_cmd(struct iwl_priv *priv,
|
||||
struct iwl_led_cmd *led_cmd)
|
||||
{
|
||||
struct iwl3945_host_cmd cmd = {
|
||||
struct iwl_host_cmd cmd = {
|
||||
.id = REPLY_LEDS_CMD,
|
||||
.len = sizeof(struct iwl3945_led_cmd),
|
||||
.len = sizeof(struct iwl_led_cmd),
|
||||
.data = led_cmd,
|
||||
.meta.flags = CMD_ASYNC,
|
||||
.meta.u.callback = iwl3945_led_cmd_callback,
|
||||
};
|
||||
|
||||
return iwl3945_send_cmd(priv, &cmd);
|
||||
return iwl_send_cmd(priv, &cmd);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Set led on command */
|
||||
static int iwl3945_led_pattern(struct iwl3945_priv *priv, int led_id,
|
||||
static int iwl3945_led_pattern(struct iwl_priv *priv, int led_id,
|
||||
unsigned int idx)
|
||||
{
|
||||
struct iwl3945_led_cmd led_cmd = {
|
||||
struct iwl_led_cmd led_cmd = {
|
||||
.id = led_id,
|
||||
.interval = IWL_DEF_LED_INTRVL
|
||||
};
|
||||
|
@ -114,11 +116,10 @@ static int iwl3945_led_pattern(struct iwl3945_priv *priv, int led_id,
|
|||
}
|
||||
|
||||
|
||||
#if 1
|
||||
/* Set led on command */
|
||||
static int iwl3945_led_on(struct iwl3945_priv *priv, int led_id)
|
||||
static int iwl3945_led_on(struct iwl_priv *priv, int led_id)
|
||||
{
|
||||
struct iwl3945_led_cmd led_cmd = {
|
||||
struct iwl_led_cmd led_cmd = {
|
||||
.id = led_id,
|
||||
.on = IWL_LED_SOLID,
|
||||
.off = 0,
|
||||
|
@ -128,9 +129,9 @@ static int iwl3945_led_on(struct iwl3945_priv *priv, int led_id)
|
|||
}
|
||||
|
||||
/* Set led off command */
|
||||
static int iwl3945_led_off(struct iwl3945_priv *priv, int led_id)
|
||||
static int iwl3945_led_off(struct iwl_priv *priv, int led_id)
|
||||
{
|
||||
struct iwl3945_led_cmd led_cmd = {
|
||||
struct iwl_led_cmd led_cmd = {
|
||||
.id = led_id,
|
||||
.on = 0,
|
||||
.off = 0,
|
||||
|
@ -139,13 +140,11 @@ static int iwl3945_led_off(struct iwl3945_priv *priv, int led_id)
|
|||
IWL_DEBUG_LED("led off %d\n", led_id);
|
||||
return iwl_send_led_cmd(priv, &led_cmd);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* brightness call back function for Tx/Rx LED
|
||||
*/
|
||||
static int iwl3945_led_associated(struct iwl3945_priv *priv, int led_id)
|
||||
static int iwl3945_led_associated(struct iwl_priv *priv, int led_id)
|
||||
{
|
||||
if (test_bit(STATUS_EXIT_PENDING, &priv->status) ||
|
||||
!test_bit(STATUS_READY, &priv->status))
|
||||
|
@ -166,7 +165,7 @@ static void iwl3945_led_brightness_set(struct led_classdev *led_cdev,
|
|||
{
|
||||
struct iwl3945_led *led = container_of(led_cdev,
|
||||
struct iwl3945_led, led_dev);
|
||||
struct iwl3945_priv *priv = led->priv;
|
||||
struct iwl_priv *priv = led->priv;
|
||||
|
||||
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||
return;
|
||||
|
@ -202,7 +201,7 @@ static void iwl3945_led_brightness_set(struct led_classdev *led_cdev,
|
|||
/*
|
||||
* Register led class with the system
|
||||
*/
|
||||
static int iwl3945_led_register_led(struct iwl3945_priv *priv,
|
||||
static int iwl3945_led_register_led(struct iwl_priv *priv,
|
||||
struct iwl3945_led *led,
|
||||
enum led_type type, u8 set_led,
|
||||
char *trigger)
|
||||
|
@ -219,7 +218,7 @@ static int iwl3945_led_register_led(struct iwl3945_priv *priv,
|
|||
|
||||
ret = led_classdev_register(device, &led->led_dev);
|
||||
if (ret) {
|
||||
IWL_ERROR("Error: failed to register led handler.\n");
|
||||
IWL_ERR(priv, "Error: failed to register led handler.\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -234,7 +233,7 @@ static int iwl3945_led_register_led(struct iwl3945_priv *priv,
|
|||
/*
|
||||
* calculate blink rate according to last 2 sec Tx/Rx activities
|
||||
*/
|
||||
static inline u8 get_blink_rate(struct iwl3945_priv *priv)
|
||||
static inline u8 get_blink_rate(struct iwl_priv *priv)
|
||||
{
|
||||
int index;
|
||||
u64 current_tpt = priv->rxtxpackets;
|
||||
|
@ -253,7 +252,7 @@ static inline u8 get_blink_rate(struct iwl3945_priv *priv)
|
|||
return index;
|
||||
}
|
||||
|
||||
static inline int is_rf_kill(struct iwl3945_priv *priv)
|
||||
static inline int is_rf_kill(struct iwl_priv *priv)
|
||||
{
|
||||
return test_bit(STATUS_RF_KILL_HW, &priv->status) ||
|
||||
test_bit(STATUS_RF_KILL_SW, &priv->status);
|
||||
|
@ -264,7 +263,7 @@ static inline int is_rf_kill(struct iwl3945_priv *priv)
|
|||
* happen very frequent we postpone led command to be called from
|
||||
* REPLY handler so we know ucode is up
|
||||
*/
|
||||
void iwl3945_led_background(struct iwl3945_priv *priv)
|
||||
void iwl3945_led_background(struct iwl_priv *priv)
|
||||
{
|
||||
u8 blink_idx;
|
||||
|
||||
|
@ -304,7 +303,7 @@ void iwl3945_led_background(struct iwl3945_priv *priv)
|
|||
|
||||
|
||||
/* Register all led handler */
|
||||
int iwl3945_led_register(struct iwl3945_priv *priv)
|
||||
int iwl3945_led_register(struct iwl_priv *priv)
|
||||
{
|
||||
char *trigger;
|
||||
int ret;
|
||||
|
@ -316,66 +315,66 @@ int iwl3945_led_register(struct iwl3945_priv *priv)
|
|||
priv->allow_blinking = 0;
|
||||
|
||||
trigger = ieee80211_get_radio_led_name(priv->hw);
|
||||
snprintf(priv->led[IWL_LED_TRG_RADIO].name,
|
||||
sizeof(priv->led[IWL_LED_TRG_RADIO].name), "iwl-%s:radio",
|
||||
snprintf(priv->led39[IWL_LED_TRG_RADIO].name,
|
||||
sizeof(priv->led39[IWL_LED_TRG_RADIO].name), "iwl-%s:radio",
|
||||
wiphy_name(priv->hw->wiphy));
|
||||
|
||||
priv->led[IWL_LED_TRG_RADIO].led_on = iwl3945_led_on;
|
||||
priv->led[IWL_LED_TRG_RADIO].led_off = iwl3945_led_off;
|
||||
priv->led[IWL_LED_TRG_RADIO].led_pattern = NULL;
|
||||
priv->led39[IWL_LED_TRG_RADIO].led_on = iwl3945_led_on;
|
||||
priv->led39[IWL_LED_TRG_RADIO].led_off = iwl3945_led_off;
|
||||
priv->led39[IWL_LED_TRG_RADIO].led_pattern = NULL;
|
||||
|
||||
ret = iwl3945_led_register_led(priv,
|
||||
&priv->led[IWL_LED_TRG_RADIO],
|
||||
&priv->led39[IWL_LED_TRG_RADIO],
|
||||
IWL_LED_TRG_RADIO, 1, trigger);
|
||||
|
||||
if (ret)
|
||||
goto exit_fail;
|
||||
|
||||
trigger = ieee80211_get_assoc_led_name(priv->hw);
|
||||
snprintf(priv->led[IWL_LED_TRG_ASSOC].name,
|
||||
sizeof(priv->led[IWL_LED_TRG_ASSOC].name), "iwl-%s:assoc",
|
||||
snprintf(priv->led39[IWL_LED_TRG_ASSOC].name,
|
||||
sizeof(priv->led39[IWL_LED_TRG_ASSOC].name), "iwl-%s:assoc",
|
||||
wiphy_name(priv->hw->wiphy));
|
||||
|
||||
ret = iwl3945_led_register_led(priv,
|
||||
&priv->led[IWL_LED_TRG_ASSOC],
|
||||
&priv->led39[IWL_LED_TRG_ASSOC],
|
||||
IWL_LED_TRG_ASSOC, 0, trigger);
|
||||
|
||||
/* for assoc always turn led on */
|
||||
priv->led[IWL_LED_TRG_ASSOC].led_on = iwl3945_led_on;
|
||||
priv->led[IWL_LED_TRG_ASSOC].led_off = iwl3945_led_on;
|
||||
priv->led[IWL_LED_TRG_ASSOC].led_pattern = NULL;
|
||||
priv->led39[IWL_LED_TRG_ASSOC].led_on = iwl3945_led_on;
|
||||
priv->led39[IWL_LED_TRG_ASSOC].led_off = iwl3945_led_on;
|
||||
priv->led39[IWL_LED_TRG_ASSOC].led_pattern = NULL;
|
||||
|
||||
if (ret)
|
||||
goto exit_fail;
|
||||
|
||||
trigger = ieee80211_get_rx_led_name(priv->hw);
|
||||
snprintf(priv->led[IWL_LED_TRG_RX].name,
|
||||
sizeof(priv->led[IWL_LED_TRG_RX].name), "iwl-%s:RX",
|
||||
snprintf(priv->led39[IWL_LED_TRG_RX].name,
|
||||
sizeof(priv->led39[IWL_LED_TRG_RX].name), "iwl-%s:RX",
|
||||
wiphy_name(priv->hw->wiphy));
|
||||
|
||||
ret = iwl3945_led_register_led(priv,
|
||||
&priv->led[IWL_LED_TRG_RX],
|
||||
&priv->led39[IWL_LED_TRG_RX],
|
||||
IWL_LED_TRG_RX, 0, trigger);
|
||||
|
||||
priv->led[IWL_LED_TRG_RX].led_on = iwl3945_led_associated;
|
||||
priv->led[IWL_LED_TRG_RX].led_off = iwl3945_led_associated;
|
||||
priv->led[IWL_LED_TRG_RX].led_pattern = iwl3945_led_pattern;
|
||||
priv->led39[IWL_LED_TRG_RX].led_on = iwl3945_led_associated;
|
||||
priv->led39[IWL_LED_TRG_RX].led_off = iwl3945_led_associated;
|
||||
priv->led39[IWL_LED_TRG_RX].led_pattern = iwl3945_led_pattern;
|
||||
|
||||
if (ret)
|
||||
goto exit_fail;
|
||||
|
||||
trigger = ieee80211_get_tx_led_name(priv->hw);
|
||||
snprintf(priv->led[IWL_LED_TRG_TX].name,
|
||||
sizeof(priv->led[IWL_LED_TRG_TX].name), "iwl-%s:TX",
|
||||
snprintf(priv->led39[IWL_LED_TRG_TX].name,
|
||||
sizeof(priv->led39[IWL_LED_TRG_TX].name), "iwl-%s:TX",
|
||||
wiphy_name(priv->hw->wiphy));
|
||||
|
||||
ret = iwl3945_led_register_led(priv,
|
||||
&priv->led[IWL_LED_TRG_TX],
|
||||
&priv->led39[IWL_LED_TRG_TX],
|
||||
IWL_LED_TRG_TX, 0, trigger);
|
||||
|
||||
priv->led[IWL_LED_TRG_TX].led_on = iwl3945_led_associated;
|
||||
priv->led[IWL_LED_TRG_TX].led_off = iwl3945_led_associated;
|
||||
priv->led[IWL_LED_TRG_TX].led_pattern = iwl3945_led_pattern;
|
||||
priv->led39[IWL_LED_TRG_TX].led_on = iwl3945_led_associated;
|
||||
priv->led39[IWL_LED_TRG_TX].led_off = iwl3945_led_associated;
|
||||
priv->led39[IWL_LED_TRG_TX].led_pattern = iwl3945_led_pattern;
|
||||
|
||||
if (ret)
|
||||
goto exit_fail;
|
||||
|
@ -402,11 +401,11 @@ static void iwl3945_led_unregister_led(struct iwl3945_led *led, u8 set_led)
|
|||
}
|
||||
|
||||
/* Unregister all led handlers */
|
||||
void iwl3945_led_unregister(struct iwl3945_priv *priv)
|
||||
void iwl3945_led_unregister(struct iwl_priv *priv)
|
||||
{
|
||||
iwl3945_led_unregister_led(&priv->led[IWL_LED_TRG_ASSOC], 0);
|
||||
iwl3945_led_unregister_led(&priv->led[IWL_LED_TRG_RX], 0);
|
||||
iwl3945_led_unregister_led(&priv->led[IWL_LED_TRG_TX], 0);
|
||||
iwl3945_led_unregister_led(&priv->led[IWL_LED_TRG_RADIO], 1);
|
||||
iwl3945_led_unregister_led(&priv->led39[IWL_LED_TRG_ASSOC], 0);
|
||||
iwl3945_led_unregister_led(&priv->led39[IWL_LED_TRG_RX], 0);
|
||||
iwl3945_led_unregister_led(&priv->led39[IWL_LED_TRG_TX], 0);
|
||||
iwl3945_led_unregister_led(&priv->led39[IWL_LED_TRG_RADIO], 1);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2003 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -27,48 +27,34 @@
|
|||
#ifndef IWL3945_LEDS_H
|
||||
#define IWL3945_LEDS_H
|
||||
|
||||
struct iwl3945_priv;
|
||||
struct iwl_priv;
|
||||
|
||||
#ifdef CONFIG_IWL3945_LEDS
|
||||
#define IWL_LED_SOLID 11
|
||||
#define IWL_LED_NAME_LEN 31
|
||||
#define IWL_DEF_LED_INTRVL __constant_cpu_to_le32(1000)
|
||||
|
||||
#define IWL_LED_ACTIVITY (0<<1)
|
||||
#define IWL_LED_LINK (1<<1)
|
||||
|
||||
enum led_type {
|
||||
IWL_LED_TRG_TX,
|
||||
IWL_LED_TRG_RX,
|
||||
IWL_LED_TRG_ASSOC,
|
||||
IWL_LED_TRG_RADIO,
|
||||
IWL_LED_TRG_MAX,
|
||||
};
|
||||
|
||||
#include <linux/leds.h>
|
||||
#include "iwl-led.h"
|
||||
|
||||
struct iwl3945_led {
|
||||
struct iwl3945_priv *priv;
|
||||
struct iwl_priv *priv;
|
||||
struct led_classdev led_dev;
|
||||
char name[32];
|
||||
|
||||
int (*led_on) (struct iwl3945_priv *priv, int led_id);
|
||||
int (*led_off) (struct iwl3945_priv *priv, int led_id);
|
||||
int (*led_pattern) (struct iwl3945_priv *priv, int led_id,
|
||||
int (*led_on) (struct iwl_priv *priv, int led_id);
|
||||
int (*led_off) (struct iwl_priv *priv, int led_id);
|
||||
int (*led_pattern) (struct iwl_priv *priv, int led_id,
|
||||
unsigned int idx);
|
||||
|
||||
enum led_type type;
|
||||
unsigned int registered;
|
||||
};
|
||||
|
||||
extern int iwl3945_led_register(struct iwl3945_priv *priv);
|
||||
extern void iwl3945_led_unregister(struct iwl3945_priv *priv);
|
||||
extern void iwl3945_led_background(struct iwl3945_priv *priv);
|
||||
extern int iwl3945_led_register(struct iwl_priv *priv);
|
||||
extern void iwl3945_led_unregister(struct iwl_priv *priv);
|
||||
extern void iwl3945_led_background(struct iwl_priv *priv);
|
||||
|
||||
#else
|
||||
static inline int iwl3945_led_register(struct iwl3945_priv *priv) { return 0; }
|
||||
static inline void iwl3945_led_unregister(struct iwl3945_priv *priv) {}
|
||||
static inline void iwl3945_led_background(struct iwl3945_priv *priv) {}
|
||||
static inline int iwl3945_led_register(struct iwl_priv *priv) { return 0; }
|
||||
static inline void iwl3945_led_unregister(struct iwl_priv *priv) {}
|
||||
static inline void iwl3945_led_background(struct iwl_priv *priv) {}
|
||||
#endif /* CONFIG_IWL3945_LEDS */
|
||||
|
||||
#endif /* IWL3945_LEDS_H */
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -36,6 +36,7 @@
|
|||
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
#include "iwl-commands.h"
|
||||
#include "iwl-3945.h"
|
||||
|
||||
#define RS_NAME "iwl-3945-rs"
|
||||
|
@ -51,6 +52,7 @@ struct iwl3945_rate_scale_data {
|
|||
|
||||
struct iwl3945_rs_sta {
|
||||
spinlock_t lock;
|
||||
struct iwl_priv *priv;
|
||||
s32 *expected_tpt;
|
||||
unsigned long last_partial_flush;
|
||||
unsigned long last_flush;
|
||||
|
@ -62,7 +64,7 @@ struct iwl3945_rs_sta {
|
|||
u8 start_rate;
|
||||
u8 ibss_sta_added;
|
||||
struct timer_list rate_scale_flush;
|
||||
struct iwl3945_rate_scale_data win[IWL_RATE_COUNT];
|
||||
struct iwl3945_rate_scale_data win[IWL_RATE_COUNT_3945];
|
||||
#ifdef CONFIG_MAC80211_DEBUGFS
|
||||
struct dentry *rs_sta_dbgfs_stats_table_file;
|
||||
#endif
|
||||
|
@ -71,19 +73,19 @@ struct iwl3945_rs_sta {
|
|||
int last_txrate_idx;
|
||||
};
|
||||
|
||||
static s32 iwl3945_expected_tpt_g[IWL_RATE_COUNT] = {
|
||||
static s32 iwl3945_expected_tpt_g[IWL_RATE_COUNT_3945] = {
|
||||
7, 13, 35, 58, 0, 0, 76, 104, 130, 168, 191, 202
|
||||
};
|
||||
|
||||
static s32 iwl3945_expected_tpt_g_prot[IWL_RATE_COUNT] = {
|
||||
static s32 iwl3945_expected_tpt_g_prot[IWL_RATE_COUNT_3945] = {
|
||||
7, 13, 35, 58, 0, 0, 0, 80, 93, 113, 123, 125
|
||||
};
|
||||
|
||||
static s32 iwl3945_expected_tpt_a[IWL_RATE_COUNT] = {
|
||||
static s32 iwl3945_expected_tpt_a[IWL_RATE_COUNT_3945] = {
|
||||
0, 0, 0, 0, 40, 57, 72, 98, 121, 154, 177, 186
|
||||
};
|
||||
|
||||
static s32 iwl3945_expected_tpt_b[IWL_RATE_COUNT] = {
|
||||
static s32 iwl3945_expected_tpt_b[IWL_RATE_COUNT_3945] = {
|
||||
7, 13, 35, 58, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
|
@ -119,7 +121,7 @@ static struct iwl3945_tpt_entry iwl3945_tpt_table_g[] = {
|
|||
#define IWL_RATE_MAX_WINDOW 62
|
||||
#define IWL_RATE_FLUSH (3*HZ)
|
||||
#define IWL_RATE_WIN_FLUSH (HZ/2)
|
||||
#define IWL_RATE_HIGH_TH 11520
|
||||
#define IWL39_RATE_HIGH_TH 11520
|
||||
#define IWL_SUCCESS_UP_TH 8960
|
||||
#define IWL_SUCCESS_DOWN_TH 10880
|
||||
#define IWL_RATE_MIN_FAILURE_TH 8
|
||||
|
@ -165,7 +167,7 @@ static void iwl3945_clear_window(struct iwl3945_rate_scale_data *window)
|
|||
window->success_counter = 0;
|
||||
window->success_ratio = -1;
|
||||
window->counter = 0;
|
||||
window->average_tpt = IWL_INV_TPT;
|
||||
window->average_tpt = IWL_INVALID_VALUE;
|
||||
window->stamp = 0;
|
||||
}
|
||||
|
||||
|
@ -181,13 +183,14 @@ static int iwl3945_rate_scale_flush_windows(struct iwl3945_rs_sta *rs_sta)
|
|||
int unflushed = 0;
|
||||
int i;
|
||||
unsigned long flags;
|
||||
struct iwl_priv *priv = rs_sta->priv;
|
||||
|
||||
/*
|
||||
* For each rate, if we have collected data on that rate
|
||||
* and it has been more than IWL_RATE_WIN_FLUSH
|
||||
* since we flushed, clear out the gathered statistics
|
||||
*/
|
||||
for (i = 0; i < IWL_RATE_COUNT; i++) {
|
||||
for (i = 0; i < IWL_RATE_COUNT_3945; i++) {
|
||||
if (!rs_sta->win[i].counter)
|
||||
continue;
|
||||
|
||||
|
@ -213,6 +216,7 @@ static int iwl3945_rate_scale_flush_windows(struct iwl3945_rs_sta *rs_sta)
|
|||
static void iwl3945_bg_rate_scale_flush(unsigned long data)
|
||||
{
|
||||
struct iwl3945_rs_sta *rs_sta = (void *)data;
|
||||
struct iwl_priv *priv = rs_sta->priv;
|
||||
int unflushed = 0;
|
||||
unsigned long flags;
|
||||
u32 packet_count, duration, pps;
|
||||
|
@ -286,6 +290,7 @@ static void iwl3945_collect_tx_data(struct iwl3945_rs_sta *rs_sta,
|
|||
{
|
||||
unsigned long flags;
|
||||
s32 fail_count;
|
||||
struct iwl_priv *priv = rs_sta->priv;
|
||||
|
||||
if (!retries) {
|
||||
IWL_DEBUG_RATE("leave: retries == 0 -- should be at least 1\n");
|
||||
|
@ -329,7 +334,7 @@ static void iwl3945_collect_tx_data(struct iwl3945_rs_sta *rs_sta,
|
|||
window->average_tpt = ((window->success_ratio *
|
||||
rs_sta->expected_tpt[index] + 64) / 128);
|
||||
else
|
||||
window->average_tpt = IWL_INV_TPT;
|
||||
window->average_tpt = IWL_INVALID_VALUE;
|
||||
|
||||
spin_unlock_irqrestore(&rs_sta->lock, flags);
|
||||
|
||||
|
@ -339,7 +344,7 @@ static void rs_rate_init(void *priv_r, struct ieee80211_supported_band *sband,
|
|||
struct ieee80211_sta *sta, void *priv_sta)
|
||||
{
|
||||
struct iwl3945_rs_sta *rs_sta = priv_sta;
|
||||
struct iwl3945_priv *priv = (struct iwl3945_priv *)priv_r;
|
||||
struct iwl_priv *priv = (struct iwl_priv *)priv_r;
|
||||
int i;
|
||||
|
||||
IWL_DEBUG_RATE("enter\n");
|
||||
|
@ -379,10 +384,11 @@ static void rs_free(void *priv)
|
|||
return;
|
||||
}
|
||||
|
||||
static void *rs_alloc_sta(void *priv, struct ieee80211_sta *sta, gfp_t gfp)
|
||||
static void *rs_alloc_sta(void *iwl_priv, struct ieee80211_sta *sta, gfp_t gfp)
|
||||
{
|
||||
struct iwl3945_rs_sta *rs_sta;
|
||||
struct iwl3945_sta_priv *psta = (void *) sta->drv_priv;
|
||||
struct iwl_priv *priv = iwl_priv;
|
||||
int i;
|
||||
|
||||
/*
|
||||
|
@ -402,6 +408,8 @@ static void *rs_alloc_sta(void *priv, struct ieee80211_sta *sta, gfp_t gfp)
|
|||
|
||||
spin_lock_init(&rs_sta->lock);
|
||||
|
||||
rs_sta->priv = priv;
|
||||
|
||||
rs_sta->start_rate = IWL_RATE_INVALID;
|
||||
|
||||
/* default to just 802.11b */
|
||||
|
@ -417,7 +425,7 @@ static void *rs_alloc_sta(void *priv, struct ieee80211_sta *sta, gfp_t gfp)
|
|||
rs_sta->rate_scale_flush.data = (unsigned long)rs_sta;
|
||||
rs_sta->rate_scale_flush.function = &iwl3945_bg_rate_scale_flush;
|
||||
|
||||
for (i = 0; i < IWL_RATE_COUNT; i++)
|
||||
for (i = 0; i < IWL_RATE_COUNT_3945; i++)
|
||||
iwl3945_clear_window(&rs_sta->win[i]);
|
||||
|
||||
IWL_DEBUG_RATE("leave\n");
|
||||
|
@ -425,11 +433,12 @@ static void *rs_alloc_sta(void *priv, struct ieee80211_sta *sta, gfp_t gfp)
|
|||
return rs_sta;
|
||||
}
|
||||
|
||||
static void rs_free_sta(void *priv, struct ieee80211_sta *sta,
|
||||
static void rs_free_sta(void *iwl_priv, struct ieee80211_sta *sta,
|
||||
void *priv_sta)
|
||||
{
|
||||
struct iwl3945_sta_priv *psta = (void *) sta->drv_priv;
|
||||
struct iwl3945_rs_sta *rs_sta = priv_sta;
|
||||
struct iwl_priv *priv = rs_sta->priv;
|
||||
|
||||
psta->rs_sta = NULL;
|
||||
|
||||
|
@ -443,7 +452,7 @@ static void rs_free_sta(void *priv, struct ieee80211_sta *sta,
|
|||
/**
|
||||
* rs_tx_status - Update rate control values based on Tx results
|
||||
*
|
||||
* NOTE: Uses iwl3945_priv->retry_rate for the # of retries attempted by
|
||||
* NOTE: Uses iwl_priv->retry_rate for the # of retries attempted by
|
||||
* the hardware for each rate.
|
||||
*/
|
||||
static void rs_tx_status(void *priv_rate, struct ieee80211_supported_band *sband,
|
||||
|
@ -453,7 +462,7 @@ static void rs_tx_status(void *priv_rate, struct ieee80211_supported_band *sband
|
|||
s8 retries = 0, current_count;
|
||||
int scale_rate_index, first_index, last_index;
|
||||
unsigned long flags;
|
||||
struct iwl3945_priv *priv = (struct iwl3945_priv *)priv_rate;
|
||||
struct iwl_priv *priv = (struct iwl_priv *)priv_rate;
|
||||
struct iwl3945_rs_sta *rs_sta = priv_sta;
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
|
||||
|
@ -462,7 +471,7 @@ static void rs_tx_status(void *priv_rate, struct ieee80211_supported_band *sband
|
|||
retries = info->status.rates[0].count;
|
||||
|
||||
first_index = sband->bitrates[info->status.rates[0].idx].hw_value;
|
||||
if ((first_index < 0) || (first_index >= IWL_RATE_COUNT)) {
|
||||
if ((first_index < 0) || (first_index >= IWL_RATE_COUNT_3945)) {
|
||||
IWL_DEBUG_RATE("leave: Rate out of bounds: %d\n", first_index);
|
||||
return;
|
||||
}
|
||||
|
@ -547,6 +556,7 @@ static u16 iwl3945_get_adjacent_rate(struct iwl3945_rs_sta *rs_sta,
|
|||
{
|
||||
u8 high = IWL_RATE_INVALID;
|
||||
u8 low = IWL_RATE_INVALID;
|
||||
struct iwl_priv *priv = rs_sta->priv;
|
||||
|
||||
/* 802.11A walks to the next literal adjacent rate in
|
||||
* the rate table */
|
||||
|
@ -565,7 +575,8 @@ static u16 iwl3945_get_adjacent_rate(struct iwl3945_rs_sta *rs_sta,
|
|||
|
||||
/* Find the next rate that is in the rate mask */
|
||||
i = index + 1;
|
||||
for (mask = (1 << i); i < IWL_RATE_COUNT; i++, mask <<= 1) {
|
||||
for (mask = (1 << i); i < IWL_RATE_COUNT_3945;
|
||||
i++, mask <<= 1) {
|
||||
if (rate_mask & mask) {
|
||||
high = i;
|
||||
break;
|
||||
|
@ -631,16 +642,17 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta,
|
|||
int index;
|
||||
struct iwl3945_rs_sta *rs_sta = priv_sta;
|
||||
struct iwl3945_rate_scale_data *window = NULL;
|
||||
int current_tpt = IWL_INV_TPT;
|
||||
int low_tpt = IWL_INV_TPT;
|
||||
int high_tpt = IWL_INV_TPT;
|
||||
int current_tpt = IWL_INVALID_VALUE;
|
||||
int low_tpt = IWL_INVALID_VALUE;
|
||||
int high_tpt = IWL_INVALID_VALUE;
|
||||
u32 fail_count;
|
||||
s8 scale_action = 0;
|
||||
unsigned long flags;
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
u16 fc;
|
||||
u16 rate_mask = 0;
|
||||
struct iwl3945_priv *priv = (struct iwl3945_priv *)priv_r;
|
||||
s8 max_rate_idx = -1;
|
||||
struct iwl_priv *priv = (struct iwl_priv *)priv_r;
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
|
||||
IWL_DEBUG_RATE("enter\n");
|
||||
|
@ -664,7 +676,14 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta,
|
|||
return;
|
||||
}
|
||||
|
||||
index = min(rs_sta->last_txrate_idx & 0xffff, IWL_RATE_COUNT - 1);
|
||||
/* get user max rate if set */
|
||||
max_rate_idx = txrc->max_rate_idx;
|
||||
if ((sband->band == IEEE80211_BAND_5GHZ) && (max_rate_idx != -1))
|
||||
max_rate_idx += IWL_FIRST_OFDM_RATE;
|
||||
if ((max_rate_idx < 0) || (max_rate_idx >= IWL_RATE_COUNT))
|
||||
max_rate_idx = -1;
|
||||
|
||||
index = min(rs_sta->last_txrate_idx & 0xffff, IWL_RATE_COUNT_3945 - 1);
|
||||
|
||||
if (sband->band == IEEE80211_BAND_5GHZ)
|
||||
rate_mask = rate_mask << IWL_FIRST_OFDM_RATE;
|
||||
|
@ -695,6 +714,12 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta,
|
|||
rs_sta->start_rate = IWL_RATE_INVALID;
|
||||
}
|
||||
|
||||
/* force user max rate if set by user */
|
||||
if ((max_rate_idx != -1) && (max_rate_idx < index)) {
|
||||
if (rate_mask & (1 << max_rate_idx))
|
||||
index = max_rate_idx;
|
||||
}
|
||||
|
||||
window = &(rs_sta->win[index]);
|
||||
|
||||
fail_count = window->counter - window->success_counter;
|
||||
|
@ -721,6 +746,10 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta,
|
|||
low = high_low & 0xff;
|
||||
high = (high_low >> 8) & 0xff;
|
||||
|
||||
/* If user set max rate, dont allow higher than user constrain */
|
||||
if ((max_rate_idx != -1) && (max_rate_idx < high))
|
||||
high = IWL_RATE_INVALID;
|
||||
|
||||
if (low != IWL_RATE_INVALID)
|
||||
low_tpt = rs_sta->win[low].average_tpt;
|
||||
|
||||
|
@ -734,16 +763,18 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta,
|
|||
if ((window->success_ratio < IWL_RATE_DECREASE_TH) || !current_tpt) {
|
||||
IWL_DEBUG_RATE("decrease rate because of low success_ratio\n");
|
||||
scale_action = -1;
|
||||
} else if ((low_tpt == IWL_INV_TPT) && (high_tpt == IWL_INV_TPT))
|
||||
} else if ((low_tpt == IWL_INVALID_VALUE) &&
|
||||
(high_tpt == IWL_INVALID_VALUE))
|
||||
scale_action = 1;
|
||||
else if ((low_tpt != IWL_INV_TPT) && (high_tpt != IWL_INV_TPT) &&
|
||||
else if ((low_tpt != IWL_INVALID_VALUE) &&
|
||||
(high_tpt != IWL_INVALID_VALUE) &&
|
||||
(low_tpt < current_tpt) && (high_tpt < current_tpt)) {
|
||||
IWL_DEBUG_RATE("No action -- low [%d] & high [%d] < "
|
||||
"current_tpt [%d]\n",
|
||||
low_tpt, high_tpt, current_tpt);
|
||||
scale_action = 0;
|
||||
} else {
|
||||
if (high_tpt != IWL_INV_TPT) {
|
||||
if (high_tpt != IWL_INVALID_VALUE) {
|
||||
if (high_tpt > current_tpt)
|
||||
scale_action = 1;
|
||||
else {
|
||||
|
@ -751,7 +782,7 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta,
|
|||
("decrease rate because of high tpt\n");
|
||||
scale_action = -1;
|
||||
}
|
||||
} else if (low_tpt != IWL_INV_TPT) {
|
||||
} else if (low_tpt != IWL_INVALID_VALUE) {
|
||||
if (low_tpt > current_tpt) {
|
||||
IWL_DEBUG_RATE
|
||||
("decrease rate because of low tpt\n");
|
||||
|
@ -825,7 +856,7 @@ static ssize_t iwl3945_sta_dbgfs_stats_table_read(struct file *file,
|
|||
lq_sta->tx_packets,
|
||||
lq_sta->last_txrate_idx,
|
||||
lq_sta->start_rate, jiffies_to_msecs(lq_sta->flush_time));
|
||||
for (j = 0; j < IWL_RATE_COUNT; j++) {
|
||||
for (j = 0; j < IWL_RATE_COUNT_3945; j++) {
|
||||
desc += sprintf(buff+desc,
|
||||
"counter=%d success=%d %%=%d\n",
|
||||
lq_sta->win[j].counter,
|
||||
|
@ -877,7 +908,7 @@ static struct rate_control_ops rs_ops = {
|
|||
|
||||
void iwl3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id)
|
||||
{
|
||||
struct iwl3945_priv *priv = hw->priv;
|
||||
struct iwl_priv *priv = hw->priv;
|
||||
s32 rssi = 0;
|
||||
unsigned long flags;
|
||||
struct iwl3945_rs_sta *rs_sta;
|
||||
|
@ -888,7 +919,7 @@ void iwl3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id)
|
|||
|
||||
rcu_read_lock();
|
||||
|
||||
sta = ieee80211_find_sta(hw, priv->stations[sta_id].sta.sta.addr);
|
||||
sta = ieee80211_find_sta(hw, priv->stations_39[sta_id].sta.sta.addr);
|
||||
if (!sta) {
|
||||
rcu_read_unlock();
|
||||
return;
|
||||
|
@ -903,7 +934,7 @@ void iwl3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id)
|
|||
switch (priv->band) {
|
||||
case IEEE80211_BAND_2GHZ:
|
||||
/* TODO: this always does G, not a regression */
|
||||
if (priv->active_rxon.flags & RXON_FLG_TGG_PROTECT_MSK) {
|
||||
if (priv->active39_rxon.flags & RXON_FLG_TGG_PROTECT_MSK) {
|
||||
rs_sta->tgg = 1;
|
||||
rs_sta->expected_tpt = iwl3945_expected_tpt_g_prot;
|
||||
} else
|
||||
|
|
|
@ -1,206 +0,0 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* Intel Linux Wireless <ilw@linux.intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __iwl_3945_rs_h__
|
||||
#define __iwl_3945_rs_h__
|
||||
|
||||
struct iwl3945_rate_info {
|
||||
u8 plcp; /* uCode API: IWL_RATE_6M_PLCP, etc. */
|
||||
u8 ieee; /* MAC header: IWL_RATE_6M_IEEE, etc. */
|
||||
u8 prev_ieee; /* previous rate in IEEE speeds */
|
||||
u8 next_ieee; /* next rate in IEEE speeds */
|
||||
u8 prev_rs; /* previous rate used in rs algo */
|
||||
u8 next_rs; /* next rate used in rs algo */
|
||||
u8 prev_rs_tgg; /* previous rate used in TGG rs algo */
|
||||
u8 next_rs_tgg; /* next rate used in TGG rs algo */
|
||||
u8 table_rs_index; /* index in rate scale table cmd */
|
||||
u8 prev_table_rs; /* prev in rate table cmd */
|
||||
};
|
||||
|
||||
/*
|
||||
* These serve as indexes into
|
||||
* struct iwl3945_rate_info iwl3945_rates[IWL_RATE_COUNT];
|
||||
*/
|
||||
enum {
|
||||
IWL_RATE_1M_INDEX = 0,
|
||||
IWL_RATE_2M_INDEX,
|
||||
IWL_RATE_5M_INDEX,
|
||||
IWL_RATE_11M_INDEX,
|
||||
IWL_RATE_6M_INDEX,
|
||||
IWL_RATE_9M_INDEX,
|
||||
IWL_RATE_12M_INDEX,
|
||||
IWL_RATE_18M_INDEX,
|
||||
IWL_RATE_24M_INDEX,
|
||||
IWL_RATE_36M_INDEX,
|
||||
IWL_RATE_48M_INDEX,
|
||||
IWL_RATE_54M_INDEX,
|
||||
IWL_RATE_COUNT,
|
||||
IWL_RATE_INVM_INDEX,
|
||||
IWL_RATE_INVALID = IWL_RATE_INVM_INDEX
|
||||
};
|
||||
|
||||
enum {
|
||||
IWL_RATE_6M_INDEX_TABLE = 0,
|
||||
IWL_RATE_9M_INDEX_TABLE,
|
||||
IWL_RATE_12M_INDEX_TABLE,
|
||||
IWL_RATE_18M_INDEX_TABLE,
|
||||
IWL_RATE_24M_INDEX_TABLE,
|
||||
IWL_RATE_36M_INDEX_TABLE,
|
||||
IWL_RATE_48M_INDEX_TABLE,
|
||||
IWL_RATE_54M_INDEX_TABLE,
|
||||
IWL_RATE_1M_INDEX_TABLE,
|
||||
IWL_RATE_2M_INDEX_TABLE,
|
||||
IWL_RATE_5M_INDEX_TABLE,
|
||||
IWL_RATE_11M_INDEX_TABLE,
|
||||
IWL_RATE_INVM_INDEX_TABLE = IWL_RATE_INVM_INDEX,
|
||||
};
|
||||
|
||||
enum {
|
||||
IWL_FIRST_OFDM_RATE = IWL_RATE_6M_INDEX,
|
||||
IWL_LAST_OFDM_RATE = IWL_RATE_54M_INDEX,
|
||||
IWL_FIRST_CCK_RATE = IWL_RATE_1M_INDEX,
|
||||
IWL_LAST_CCK_RATE = IWL_RATE_11M_INDEX,
|
||||
};
|
||||
|
||||
/* #define vs. enum to keep from defaulting to 'large integer' */
|
||||
#define IWL_RATE_6M_MASK (1 << IWL_RATE_6M_INDEX)
|
||||
#define IWL_RATE_9M_MASK (1 << IWL_RATE_9M_INDEX)
|
||||
#define IWL_RATE_12M_MASK (1 << IWL_RATE_12M_INDEX)
|
||||
#define IWL_RATE_18M_MASK (1 << IWL_RATE_18M_INDEX)
|
||||
#define IWL_RATE_24M_MASK (1 << IWL_RATE_24M_INDEX)
|
||||
#define IWL_RATE_36M_MASK (1 << IWL_RATE_36M_INDEX)
|
||||
#define IWL_RATE_48M_MASK (1 << IWL_RATE_48M_INDEX)
|
||||
#define IWL_RATE_54M_MASK (1 << IWL_RATE_54M_INDEX)
|
||||
#define IWL_RATE_1M_MASK (1 << IWL_RATE_1M_INDEX)
|
||||
#define IWL_RATE_2M_MASK (1 << IWL_RATE_2M_INDEX)
|
||||
#define IWL_RATE_5M_MASK (1 << IWL_RATE_5M_INDEX)
|
||||
#define IWL_RATE_11M_MASK (1 << IWL_RATE_11M_INDEX)
|
||||
|
||||
/* 3945 uCode API values for (legacy) bit rates, both OFDM and CCK */
|
||||
enum {
|
||||
IWL_RATE_6M_PLCP = 13,
|
||||
IWL_RATE_9M_PLCP = 15,
|
||||
IWL_RATE_12M_PLCP = 5,
|
||||
IWL_RATE_18M_PLCP = 7,
|
||||
IWL_RATE_24M_PLCP = 9,
|
||||
IWL_RATE_36M_PLCP = 11,
|
||||
IWL_RATE_48M_PLCP = 1,
|
||||
IWL_RATE_54M_PLCP = 3,
|
||||
IWL_RATE_1M_PLCP = 10,
|
||||
IWL_RATE_2M_PLCP = 20,
|
||||
IWL_RATE_5M_PLCP = 55,
|
||||
IWL_RATE_11M_PLCP = 110,
|
||||
};
|
||||
|
||||
/* MAC header values for bit rates */
|
||||
enum {
|
||||
IWL_RATE_6M_IEEE = 12,
|
||||
IWL_RATE_9M_IEEE = 18,
|
||||
IWL_RATE_12M_IEEE = 24,
|
||||
IWL_RATE_18M_IEEE = 36,
|
||||
IWL_RATE_24M_IEEE = 48,
|
||||
IWL_RATE_36M_IEEE = 72,
|
||||
IWL_RATE_48M_IEEE = 96,
|
||||
IWL_RATE_54M_IEEE = 108,
|
||||
IWL_RATE_1M_IEEE = 2,
|
||||
IWL_RATE_2M_IEEE = 4,
|
||||
IWL_RATE_5M_IEEE = 11,
|
||||
IWL_RATE_11M_IEEE = 22,
|
||||
};
|
||||
|
||||
#define IWL_CCK_BASIC_RATES_MASK \
|
||||
(IWL_RATE_1M_MASK | \
|
||||
IWL_RATE_2M_MASK)
|
||||
|
||||
#define IWL_CCK_RATES_MASK \
|
||||
(IWL_BASIC_RATES_MASK | \
|
||||
IWL_RATE_5M_MASK | \
|
||||
IWL_RATE_11M_MASK)
|
||||
|
||||
#define IWL_OFDM_BASIC_RATES_MASK \
|
||||
(IWL_RATE_6M_MASK | \
|
||||
IWL_RATE_12M_MASK | \
|
||||
IWL_RATE_24M_MASK)
|
||||
|
||||
#define IWL_OFDM_RATES_MASK \
|
||||
(IWL_OFDM_BASIC_RATES_MASK | \
|
||||
IWL_RATE_9M_MASK | \
|
||||
IWL_RATE_18M_MASK | \
|
||||
IWL_RATE_36M_MASK | \
|
||||
IWL_RATE_48M_MASK | \
|
||||
IWL_RATE_54M_MASK)
|
||||
|
||||
#define IWL_BASIC_RATES_MASK \
|
||||
(IWL_OFDM_BASIC_RATES_MASK | \
|
||||
IWL_CCK_BASIC_RATES_MASK)
|
||||
|
||||
#define IWL_RATES_MASK ((1 << IWL_RATE_COUNT) - 1)
|
||||
|
||||
#define IWL_INV_TPT -1
|
||||
|
||||
#define IWL_MIN_RSSI_VAL -100
|
||||
#define IWL_MAX_RSSI_VAL 0
|
||||
|
||||
extern const struct iwl3945_rate_info iwl3945_rates[IWL_RATE_COUNT];
|
||||
|
||||
static inline u8 iwl3945_get_prev_ieee_rate(u8 rate_index)
|
||||
{
|
||||
u8 rate = iwl3945_rates[rate_index].prev_ieee;
|
||||
|
||||
if (rate == IWL_RATE_INVALID)
|
||||
rate = rate_index;
|
||||
return rate;
|
||||
}
|
||||
|
||||
/**
|
||||
* iwl3945_rate_scale_init - Initialize the rate scale table based on assoc info
|
||||
*
|
||||
* The specific throughput table used is based on the type of network
|
||||
* the associated with, including A, B, G, and G w/ TGG protection
|
||||
*/
|
||||
extern void iwl3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id);
|
||||
|
||||
/**
|
||||
* iwl3945_rate_control_register - Register the rate control algorithm callbacks
|
||||
*
|
||||
* Since the rate control algorithm is hardware specific, there is no need
|
||||
* or reason to place it as a stand alone module. The driver can call
|
||||
* iwl3945_rate_control_register in order to register the rate control callbacks
|
||||
* with the mac80211 subsystem. This should be performed prior to calling
|
||||
* ieee80211_register_hw
|
||||
*
|
||||
*/
|
||||
extern int iwl3945_rate_control_register(void);
|
||||
|
||||
/**
|
||||
* iwl3945_rate_control_unregister - Unregister the rate control callbacks
|
||||
*
|
||||
* This should be called after calling ieee80211_unregister_hw, but before
|
||||
* the driver is unloaded.
|
||||
*/
|
||||
extern void iwl3945_rate_control_unregister(void);
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2003 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -43,11 +43,13 @@
|
|||
/* Hardware specific file defines the PCI IDs table for that hardware module */
|
||||
extern struct pci_device_id iwl3945_hw_card_ids[];
|
||||
|
||||
#define DRV_NAME "iwl3945"
|
||||
#include "iwl-csr.h"
|
||||
#include "iwl-prph.h"
|
||||
#include "iwl-fh.h"
|
||||
#include "iwl-3945-hw.h"
|
||||
#include "iwl-3945-debug.h"
|
||||
#include "iwl-debug.h"
|
||||
#include "iwl-power.h"
|
||||
#include "iwl-dev.h"
|
||||
#include "iwl-3945-led.h"
|
||||
|
||||
/* Highest firmware API version supported */
|
||||
|
@ -74,8 +76,7 @@ extern struct pci_device_id iwl3945_hw_card_ids[];
|
|||
#define IWL_NOISE_MEAS_NOT_AVAILABLE (-127)
|
||||
|
||||
/* Module parameters accessible from iwl-*.c */
|
||||
extern int iwl3945_param_hwcrypto;
|
||||
extern int iwl3945_param_queues_num;
|
||||
extern struct iwl_mod_params iwl3945_mod_params;
|
||||
|
||||
struct iwl3945_sta_priv {
|
||||
struct iwl3945_rs_sta *rs_sta;
|
||||
|
@ -95,7 +96,6 @@ enum iwl3945_antenna {
|
|||
* else RTS for data/management frames where MPDU is larger
|
||||
* than RTS value.
|
||||
*/
|
||||
#define IWL_RX_BUF_SIZE 3000U
|
||||
#define DEFAULT_RTS_THRESHOLD 2347U
|
||||
#define MIN_RTS_THRESHOLD 0U
|
||||
#define MAX_RTS_THRESHOLD 2347U
|
||||
|
@ -105,136 +105,7 @@ enum iwl3945_antenna {
|
|||
#define DEFAULT_SHORT_RETRY_LIMIT 7U
|
||||
#define DEFAULT_LONG_RETRY_LIMIT 4U
|
||||
|
||||
struct iwl3945_rx_mem_buffer {
|
||||
dma_addr_t dma_addr;
|
||||
struct sk_buff *skb;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
/*
|
||||
* Generic queue structure
|
||||
*
|
||||
* Contains common data for Rx and Tx queues
|
||||
*/
|
||||
struct iwl3945_queue {
|
||||
int n_bd; /* number of BDs in this queue */
|
||||
int write_ptr; /* 1-st empty entry (index) host_w*/
|
||||
int read_ptr; /* last used entry (index) host_r*/
|
||||
dma_addr_t dma_addr; /* physical addr for BD's */
|
||||
int n_window; /* safe queue window */
|
||||
u32 id;
|
||||
int low_mark; /* low watermark, resume queue if free
|
||||
* space more than this */
|
||||
int high_mark; /* high watermark, stop queue if free
|
||||
* space less than this */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
int iwl3945_queue_space(const struct iwl3945_queue *q);
|
||||
int iwl3945_x2_queue_used(const struct iwl3945_queue *q, int i);
|
||||
|
||||
#define MAX_NUM_OF_TBS (20)
|
||||
|
||||
/* One for each TFD */
|
||||
struct iwl3945_tx_info {
|
||||
struct sk_buff *skb[MAX_NUM_OF_TBS];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iwl3945_tx_queue - Tx Queue for DMA
|
||||
* @q: generic Rx/Tx queue descriptor
|
||||
* @bd: base of circular buffer of TFDs
|
||||
* @cmd: array of command/Tx buffers
|
||||
* @dma_addr_cmd: physical address of cmd/tx buffer array
|
||||
* @txb: array of per-TFD driver data
|
||||
* @need_update: indicates need to update read/write index
|
||||
*
|
||||
* A Tx queue consists of circular buffer of BDs (a.k.a. TFDs, transmit frame
|
||||
* descriptors) and required locking structures.
|
||||
*/
|
||||
struct iwl3945_tx_queue {
|
||||
struct iwl3945_queue q;
|
||||
struct iwl3945_tfd_frame *bd;
|
||||
struct iwl3945_cmd *cmd;
|
||||
dma_addr_t dma_addr_cmd;
|
||||
struct iwl3945_tx_info *txb;
|
||||
int need_update;
|
||||
int active;
|
||||
};
|
||||
|
||||
#define IWL_NUM_SCAN_RATES (2)
|
||||
|
||||
struct iwl3945_channel_tgd_info {
|
||||
u8 type;
|
||||
s8 max_power;
|
||||
};
|
||||
|
||||
struct iwl3945_channel_tgh_info {
|
||||
s64 last_radar_time;
|
||||
};
|
||||
|
||||
/* current Tx power values to use, one for each rate for each channel.
|
||||
* requested power is limited by:
|
||||
* -- regulatory EEPROM limits for this channel
|
||||
* -- hardware capabilities (clip-powers)
|
||||
* -- spectrum management
|
||||
* -- user preference (e.g. iwconfig)
|
||||
* when requested power is set, base power index must also be set. */
|
||||
struct iwl3945_channel_power_info {
|
||||
struct iwl3945_tx_power tpc; /* actual radio and DSP gain settings */
|
||||
s8 power_table_index; /* actual (compenst'd) index into gain table */
|
||||
s8 base_power_index; /* gain index for power at factory temp. */
|
||||
s8 requested_power; /* power (dBm) requested for this chnl/rate */
|
||||
};
|
||||
|
||||
/* current scan Tx power values to use, one for each scan rate for each
|
||||
* channel. */
|
||||
struct iwl3945_scan_power_info {
|
||||
struct iwl3945_tx_power tpc; /* actual radio and DSP gain settings */
|
||||
s8 power_table_index; /* actual (compenst'd) index into gain table */
|
||||
s8 requested_power; /* scan pwr (dBm) requested for chnl/rate */
|
||||
};
|
||||
|
||||
/*
|
||||
* One for each channel, holds all channel setup data
|
||||
* Some of the fields (e.g. eeprom and flags/max_power_avg) are redundant
|
||||
* with one another!
|
||||
*/
|
||||
#define IWL4965_MAX_RATE (33)
|
||||
|
||||
struct iwl3945_channel_info {
|
||||
struct iwl3945_channel_tgd_info tgd;
|
||||
struct iwl3945_channel_tgh_info tgh;
|
||||
struct iwl3945_eeprom_channel eeprom; /* EEPROM regulatory limit */
|
||||
struct iwl3945_eeprom_channel fat_eeprom; /* EEPROM regulatory limit for
|
||||
* FAT channel */
|
||||
|
||||
u8 channel; /* channel number */
|
||||
u8 flags; /* flags copied from EEPROM */
|
||||
s8 max_power_avg; /* (dBm) regul. eeprom, normal Tx, any rate */
|
||||
s8 curr_txpow; /* (dBm) regulatory/spectrum/user (not h/w) */
|
||||
s8 min_power; /* always 0 */
|
||||
s8 scan_power; /* (dBm) regul. eeprom, direct scans, any rate */
|
||||
|
||||
u8 group_index; /* 0-4, maps channel to group1/2/3/4/5 */
|
||||
u8 band_index; /* 0-4, maps channel to band1/2/3/4/5 */
|
||||
enum ieee80211_band band;
|
||||
|
||||
/* Radio/DSP gain settings for each "normal" data Tx rate.
|
||||
* These include, in addition to RF and DSP gain, a few fields for
|
||||
* remembering/modifying gain settings (indexes). */
|
||||
struct iwl3945_channel_power_info power_info[IWL4965_MAX_RATE];
|
||||
|
||||
/* Radio/DSP gain settings for each scan rate, for directed scans. */
|
||||
struct iwl3945_scan_power_info scan_pwr_info[IWL_NUM_SCAN_RATES];
|
||||
};
|
||||
|
||||
struct iwl3945_clip_group {
|
||||
/* maximum power level to prevent clipping for each rate, derived by
|
||||
* us from this band's saturation power in EEPROM */
|
||||
const s8 clip_powers[IWL_MAX_RATES];
|
||||
};
|
||||
|
||||
#include "iwl-3945-rs.h"
|
||||
#include "iwl-agn-rs.h"
|
||||
|
||||
#define IWL_TX_FIFO_AC0 0
|
||||
#define IWL_TX_FIFO_AC1 1
|
||||
|
@ -247,33 +118,6 @@ struct iwl3945_clip_group {
|
|||
/* Minimum number of queues. MAX_NUM is defined in hw specific files */
|
||||
#define IWL_MIN_NUM_QUEUES 4
|
||||
|
||||
/* Power management (not Tx power) structures */
|
||||
|
||||
struct iwl3945_power_vec_entry {
|
||||
struct iwl3945_powertable_cmd cmd;
|
||||
u8 no_dtim;
|
||||
};
|
||||
#define IWL_POWER_RANGE_0 (0)
|
||||
#define IWL_POWER_RANGE_1 (1)
|
||||
|
||||
#define IWL_POWER_MODE_CAM 0x00 /* Continuously Aware Mode, always on */
|
||||
#define IWL_POWER_INDEX_3 0x03
|
||||
#define IWL_POWER_INDEX_5 0x05
|
||||
#define IWL_POWER_AC 0x06
|
||||
#define IWL_POWER_BATTERY 0x07
|
||||
#define IWL_POWER_LIMIT 0x07
|
||||
#define IWL_POWER_MASK 0x0F
|
||||
#define IWL_POWER_ENABLED 0x10
|
||||
#define IWL_POWER_LEVEL(x) ((x) & IWL_POWER_MASK)
|
||||
|
||||
struct iwl3945_power_mgr {
|
||||
spinlock_t lock;
|
||||
struct iwl3945_power_vec_entry pwr_range_0[IWL_POWER_AC];
|
||||
struct iwl3945_power_vec_entry pwr_range_1[IWL_POWER_AC];
|
||||
u8 active_index;
|
||||
u32 dtim_val;
|
||||
};
|
||||
|
||||
#define IEEE80211_DATA_LEN 2304
|
||||
#define IEEE80211_4ADDR_LEN 30
|
||||
#define IEEE80211_HLEN (IEEE80211_4ADDR_LEN)
|
||||
|
@ -289,81 +133,10 @@ struct iwl3945_frame {
|
|||
struct list_head list;
|
||||
};
|
||||
|
||||
#define SEQ_TO_QUEUE(x) ((x >> 8) & 0xbf)
|
||||
#define QUEUE_TO_SEQ(x) ((x & 0xbf) << 8)
|
||||
#define SEQ_TO_INDEX(x) ((u8)(x & 0xff))
|
||||
#define INDEX_TO_SEQ(x) ((u8)(x & 0xff))
|
||||
#define SEQ_HUGE_FRAME (0x4000)
|
||||
#define SEQ_RX_FRAME __constant_cpu_to_le16(0x8000)
|
||||
#define SEQ_TO_SN(seq) (((seq) & IEEE80211_SCTL_SEQ) >> 4)
|
||||
#define SN_TO_SEQ(ssn) (((ssn) << 4) & IEEE80211_SCTL_SEQ)
|
||||
#define MAX_SN ((IEEE80211_SCTL_SEQ) >> 4)
|
||||
|
||||
enum {
|
||||
/* CMD_SIZE_NORMAL = 0, */
|
||||
CMD_SIZE_HUGE = (1 << 0),
|
||||
/* CMD_SYNC = 0, */
|
||||
CMD_ASYNC = (1 << 1),
|
||||
/* CMD_NO_SKB = 0, */
|
||||
CMD_WANT_SKB = (1 << 2),
|
||||
};
|
||||
|
||||
struct iwl3945_cmd;
|
||||
struct iwl3945_priv;
|
||||
|
||||
struct iwl3945_cmd_meta {
|
||||
struct iwl3945_cmd_meta *source;
|
||||
union {
|
||||
struct sk_buff *skb;
|
||||
int (*callback)(struct iwl3945_priv *priv,
|
||||
struct iwl3945_cmd *cmd, struct sk_buff *skb);
|
||||
} __attribute__ ((packed)) u;
|
||||
|
||||
/* The CMD_SIZE_HUGE flag bit indicates that the command
|
||||
* structure is stored at the end of the shared queue memory. */
|
||||
u32 flags;
|
||||
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/**
|
||||
* struct iwl3945_cmd
|
||||
*
|
||||
* For allocation of the command and tx queues, this establishes the overall
|
||||
* size of the largest command we send to uCode, except for a scan command
|
||||
* (which is relatively huge; space is allocated separately).
|
||||
*/
|
||||
struct iwl3945_cmd {
|
||||
struct iwl3945_cmd_meta meta;
|
||||
struct iwl3945_cmd_header hdr;
|
||||
union {
|
||||
struct iwl3945_addsta_cmd addsta;
|
||||
struct iwl3945_led_cmd led;
|
||||
u32 flags;
|
||||
u8 val8;
|
||||
u16 val16;
|
||||
u32 val32;
|
||||
struct iwl3945_bt_cmd bt;
|
||||
struct iwl3945_rxon_time_cmd rxon_time;
|
||||
struct iwl3945_powertable_cmd powertable;
|
||||
struct iwl3945_qosparam_cmd qosparam;
|
||||
struct iwl3945_tx_cmd tx;
|
||||
struct iwl3945_tx_beacon_cmd tx_beacon;
|
||||
struct iwl3945_rxon_assoc_cmd rxon_assoc;
|
||||
u8 *indirect;
|
||||
u8 payload[360];
|
||||
} __attribute__ ((packed)) cmd;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl3945_host_cmd {
|
||||
u8 id;
|
||||
u16 len;
|
||||
struct iwl3945_cmd_meta meta;
|
||||
const void *data;
|
||||
};
|
||||
|
||||
#define TFD_MAX_PAYLOAD_SIZE (sizeof(struct iwl3945_cmd) - \
|
||||
sizeof(struct iwl3945_cmd_meta))
|
||||
|
||||
/*
|
||||
* RX related structures and functions
|
||||
*/
|
||||
|
@ -374,33 +147,6 @@ struct iwl3945_host_cmd {
|
|||
#define SUP_RATE_11B_MAX_NUM_CHANNELS 4
|
||||
#define SUP_RATE_11G_MAX_NUM_CHANNELS 12
|
||||
|
||||
/**
|
||||
* struct iwl3945_rx_queue - Rx queue
|
||||
* @processed: Internal index to last handled Rx packet
|
||||
* @read: Shared index to newest available Rx buffer
|
||||
* @write: Shared index to oldest written Rx packet
|
||||
* @free_count: Number of pre-allocated buffers in rx_free
|
||||
* @rx_free: list of free SKBs for use
|
||||
* @rx_used: List of Rx buffers with no SKB
|
||||
* @need_update: flag to indicate we need to update read/write index
|
||||
*
|
||||
* NOTE: rx_free and rx_used are used as a FIFO for iwl3945_rx_mem_buffers
|
||||
*/
|
||||
struct iwl3945_rx_queue {
|
||||
__le32 *bd;
|
||||
dma_addr_t dma_addr;
|
||||
struct iwl3945_rx_mem_buffer pool[RX_QUEUE_SIZE + RX_FREE_BUFFERS];
|
||||
struct iwl3945_rx_mem_buffer *queue[RX_QUEUE_SIZE];
|
||||
u32 processed;
|
||||
u32 read;
|
||||
u32 write;
|
||||
u32 free_count;
|
||||
struct list_head rx_free;
|
||||
struct list_head rx_used;
|
||||
int need_update;
|
||||
spinlock_t lock;
|
||||
};
|
||||
|
||||
#define IWL_SUPPORTED_RATES_IE_LEN 8
|
||||
|
||||
#define SCAN_INTERVAL 100
|
||||
|
@ -430,87 +176,9 @@ struct iwl3945_rx_queue {
|
|||
#define IWL_INVALID_RATE 0xFF
|
||||
#define IWL_INVALID_VALUE -1
|
||||
|
||||
struct iwl3945_tid_data {
|
||||
u16 seq_number;
|
||||
};
|
||||
|
||||
struct iwl3945_hw_key {
|
||||
enum ieee80211_key_alg alg;
|
||||
int keylen;
|
||||
u8 key[32];
|
||||
};
|
||||
|
||||
union iwl3945_ht_rate_supp {
|
||||
u16 rates;
|
||||
struct {
|
||||
u8 siso_rate;
|
||||
u8 mimo_rate;
|
||||
};
|
||||
};
|
||||
|
||||
union iwl3945_qos_capabity {
|
||||
struct {
|
||||
u8 edca_count:4; /* bit 0-3 */
|
||||
u8 q_ack:1; /* bit 4 */
|
||||
u8 queue_request:1; /* bit 5 */
|
||||
u8 txop_request:1; /* bit 6 */
|
||||
u8 reserved:1; /* bit 7 */
|
||||
} q_AP;
|
||||
struct {
|
||||
u8 acvo_APSD:1; /* bit 0 */
|
||||
u8 acvi_APSD:1; /* bit 1 */
|
||||
u8 ac_bk_APSD:1; /* bit 2 */
|
||||
u8 ac_be_APSD:1; /* bit 3 */
|
||||
u8 q_ack:1; /* bit 4 */
|
||||
u8 max_len:2; /* bit 5-6 */
|
||||
u8 more_data_ack:1; /* bit 7 */
|
||||
} q_STA;
|
||||
u8 val;
|
||||
};
|
||||
|
||||
/* QoS structures */
|
||||
struct iwl3945_qos_info {
|
||||
int qos_active;
|
||||
union iwl3945_qos_capabity qos_cap;
|
||||
struct iwl3945_qosparam_cmd def_qos_parm;
|
||||
};
|
||||
|
||||
#define STA_PS_STATUS_WAKE 0
|
||||
#define STA_PS_STATUS_SLEEP 1
|
||||
|
||||
struct iwl3945_station_entry {
|
||||
struct iwl3945_addsta_cmd sta;
|
||||
struct iwl3945_tid_data tid[MAX_TID_COUNT];
|
||||
union {
|
||||
struct {
|
||||
u8 rate;
|
||||
u8 flags;
|
||||
} s;
|
||||
u16 rate_n_flags;
|
||||
} current_rate;
|
||||
u8 used;
|
||||
u8 ps_status;
|
||||
struct iwl3945_hw_key keyinfo;
|
||||
};
|
||||
|
||||
/* one for each uCode image (inst/data, boot/init/runtime) */
|
||||
struct fw_desc {
|
||||
void *v_addr; /* access by driver */
|
||||
dma_addr_t p_addr; /* access by card's busmaster DMA */
|
||||
u32 len; /* bytes */
|
||||
};
|
||||
|
||||
/* uCode file layout */
|
||||
struct iwl3945_ucode {
|
||||
__le32 ver; /* major/minor/API/serial */
|
||||
__le32 inst_size; /* bytes of runtime instructions */
|
||||
__le32 data_size; /* bytes of runtime data */
|
||||
__le32 init_size; /* bytes of initialization instructions */
|
||||
__le32 init_data_size; /* bytes of initialization data */
|
||||
__le32 boot_size; /* bytes of bootstrap instructions */
|
||||
u8 data[0]; /* data in same order as "size" elements */
|
||||
};
|
||||
|
||||
struct iwl3945_ibss_seq {
|
||||
u8 mac[ETH_ALEN];
|
||||
u16 seq_num;
|
||||
|
@ -519,34 +187,6 @@ struct iwl3945_ibss_seq {
|
|||
struct list_head list;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iwl3945_driver_hw_info
|
||||
* @max_txq_num: Max # Tx queues supported
|
||||
* @tx_cmd_len: Size of Tx command (but not including frame itself)
|
||||
* @tx_ant_num: Number of TX antennas
|
||||
* @max_rxq_size: Max # Rx frames in Rx queue (must be power-of-2)
|
||||
* @rx_buf_size:
|
||||
* @max_pkt_size:
|
||||
* @max_rxq_log: Log-base-2 of max_rxq_size
|
||||
* @max_stations:
|
||||
* @bcast_sta_id:
|
||||
* @shared_virt: Pointer to driver/uCode shared Tx Byte Counts and Rx status
|
||||
* @shared_phys: Physical Pointer to Tx Byte Counts and Rx status
|
||||
*/
|
||||
struct iwl3945_driver_hw_info {
|
||||
u16 max_txq_num;
|
||||
u16 tx_cmd_len;
|
||||
u16 tx_ant_num;
|
||||
u16 max_rxq_size;
|
||||
u32 rx_buf_size;
|
||||
u32 max_pkt_size;
|
||||
u16 max_rxq_log;
|
||||
u8 max_stations;
|
||||
u8 bcast_sta_id;
|
||||
void *shared_virt;
|
||||
dma_addr_t shared_phys;
|
||||
};
|
||||
|
||||
#define IWL_RX_HDR(x) ((struct iwl3945_rx_frame_hdr *)(\
|
||||
x->u.rx_frame.stats.payload + \
|
||||
x->u.rx_frame.stats.phy_count))
|
||||
|
@ -564,40 +204,33 @@ struct iwl3945_driver_hw_info {
|
|||
*
|
||||
*****************************************************************************/
|
||||
struct iwl3945_addsta_cmd;
|
||||
extern int iwl3945_send_add_station(struct iwl3945_priv *priv,
|
||||
extern int iwl3945_send_add_station(struct iwl_priv *priv,
|
||||
struct iwl3945_addsta_cmd *sta, u8 flags);
|
||||
extern u8 iwl3945_add_station(struct iwl3945_priv *priv, const u8 *bssid,
|
||||
extern u8 iwl3945_add_station(struct iwl_priv *priv, const u8 *bssid,
|
||||
int is_ap, u8 flags);
|
||||
extern int iwl3945_power_init_handle(struct iwl3945_priv *priv);
|
||||
extern int iwl3945_eeprom_init(struct iwl3945_priv *priv);
|
||||
extern int iwl3945_rx_queue_alloc(struct iwl3945_priv *priv);
|
||||
extern void iwl3945_rx_queue_reset(struct iwl3945_priv *priv,
|
||||
struct iwl3945_rx_queue *rxq);
|
||||
extern int iwl3945_power_init_handle(struct iwl_priv *priv);
|
||||
extern int iwl3945_eeprom_init(struct iwl_priv *priv);
|
||||
extern int iwl3945_calc_db_from_ratio(int sig_ratio);
|
||||
extern int iwl3945_calc_sig_qual(int rssi_dbm, int noise_dbm);
|
||||
extern int iwl3945_tx_queue_init(struct iwl3945_priv *priv,
|
||||
struct iwl3945_tx_queue *txq, int count, u32 id);
|
||||
extern int iwl3945_tx_queue_init(struct iwl_priv *priv,
|
||||
struct iwl_tx_queue *txq, int count, u32 id);
|
||||
extern void iwl3945_rx_replenish(void *data);
|
||||
extern void iwl3945_tx_queue_free(struct iwl3945_priv *priv, struct iwl3945_tx_queue *txq);
|
||||
extern int iwl3945_send_cmd_pdu(struct iwl3945_priv *priv, u8 id, u16 len,
|
||||
extern void iwl3945_tx_queue_free(struct iwl_priv *priv, struct iwl_tx_queue *txq);
|
||||
extern int iwl3945_send_cmd_pdu(struct iwl_priv *priv, u8 id, u16 len,
|
||||
const void *data);
|
||||
extern int __must_check iwl3945_send_cmd(struct iwl3945_priv *priv,
|
||||
struct iwl3945_host_cmd *cmd);
|
||||
extern unsigned int iwl3945_fill_beacon_frame(struct iwl3945_priv *priv,
|
||||
extern int __must_check iwl3945_send_cmd(struct iwl_priv *priv,
|
||||
struct iwl_host_cmd *cmd);
|
||||
extern unsigned int iwl3945_fill_beacon_frame(struct iwl_priv *priv,
|
||||
struct ieee80211_hdr *hdr,int left);
|
||||
extern int iwl3945_rx_queue_update_write_ptr(struct iwl3945_priv *priv,
|
||||
struct iwl3945_rx_queue *q);
|
||||
extern int iwl3945_send_statistics_request(struct iwl3945_priv *priv);
|
||||
extern void iwl3945_set_decrypted_flag(struct iwl3945_priv *priv, struct sk_buff *skb,
|
||||
extern void iwl3945_set_decrypted_flag(struct iwl_priv *priv, struct sk_buff *skb,
|
||||
u32 decrypt_res,
|
||||
struct ieee80211_rx_status *stats);
|
||||
extern const u8 iwl3945_broadcast_addr[ETH_ALEN];
|
||||
|
||||
/*
|
||||
* Currently used by iwl-3945-rs... look at restructuring so that it doesn't
|
||||
* call this... todo... fix that.
|
||||
*/
|
||||
extern u8 iwl3945_sync_station(struct iwl3945_priv *priv, int sta_id,
|
||||
extern u8 iwl3945_sync_station(struct iwl_priv *priv, int sta_id,
|
||||
u16 tx_rate, u8 flags);
|
||||
|
||||
/******************************************************************************
|
||||
|
@ -616,36 +249,37 @@ extern u8 iwl3945_sync_station(struct iwl3945_priv *priv, int sta_id,
|
|||
* iwl3945_mac_ <-- mac80211 callback
|
||||
*
|
||||
****************************************************************************/
|
||||
extern void iwl3945_hw_rx_handler_setup(struct iwl3945_priv *priv);
|
||||
extern void iwl3945_hw_setup_deferred_work(struct iwl3945_priv *priv);
|
||||
extern void iwl3945_hw_cancel_deferred_work(struct iwl3945_priv *priv);
|
||||
extern int iwl3945_hw_rxq_stop(struct iwl3945_priv *priv);
|
||||
extern int iwl3945_hw_set_hw_setting(struct iwl3945_priv *priv);
|
||||
extern int iwl3945_hw_nic_init(struct iwl3945_priv *priv);
|
||||
extern int iwl3945_hw_nic_stop_master(struct iwl3945_priv *priv);
|
||||
extern void iwl3945_hw_txq_ctx_free(struct iwl3945_priv *priv);
|
||||
extern void iwl3945_hw_txq_ctx_stop(struct iwl3945_priv *priv);
|
||||
extern int iwl3945_hw_nic_reset(struct iwl3945_priv *priv);
|
||||
extern int iwl3945_hw_txq_attach_buf_to_tfd(struct iwl3945_priv *priv, void *tfd,
|
||||
dma_addr_t addr, u16 len);
|
||||
extern int iwl3945_hw_txq_free_tfd(struct iwl3945_priv *priv, struct iwl3945_tx_queue *txq);
|
||||
extern int iwl3945_hw_get_temperature(struct iwl3945_priv *priv);
|
||||
extern int iwl3945_hw_tx_queue_init(struct iwl3945_priv *priv,
|
||||
struct iwl3945_tx_queue *txq);
|
||||
extern unsigned int iwl3945_hw_get_beacon_cmd(struct iwl3945_priv *priv,
|
||||
extern void iwl3945_hw_rx_handler_setup(struct iwl_priv *priv);
|
||||
extern void iwl3945_hw_setup_deferred_work(struct iwl_priv *priv);
|
||||
extern void iwl3945_hw_cancel_deferred_work(struct iwl_priv *priv);
|
||||
extern int iwl3945_hw_rxq_stop(struct iwl_priv *priv);
|
||||
extern int iwl3945_hw_set_hw_params(struct iwl_priv *priv);
|
||||
extern int iwl3945_hw_nic_init(struct iwl_priv *priv);
|
||||
extern int iwl3945_hw_nic_stop_master(struct iwl_priv *priv);
|
||||
extern void iwl3945_hw_txq_ctx_free(struct iwl_priv *priv);
|
||||
extern void iwl3945_hw_txq_ctx_stop(struct iwl_priv *priv);
|
||||
extern int iwl3945_hw_nic_reset(struct iwl_priv *priv);
|
||||
extern int iwl3945_hw_txq_attach_buf_to_tfd(struct iwl_priv *priv,
|
||||
struct iwl_tx_queue *txq,
|
||||
dma_addr_t addr, u16 len,
|
||||
u8 reset, u8 pad);
|
||||
extern void iwl3945_hw_txq_free_tfd(struct iwl_priv *priv,
|
||||
struct iwl_tx_queue *txq);
|
||||
extern int iwl3945_hw_get_temperature(struct iwl_priv *priv);
|
||||
extern int iwl3945_hw_tx_queue_init(struct iwl_priv *priv,
|
||||
struct iwl_tx_queue *txq);
|
||||
extern unsigned int iwl3945_hw_get_beacon_cmd(struct iwl_priv *priv,
|
||||
struct iwl3945_frame *frame, u8 rate);
|
||||
extern int iwl3945_hw_get_rx_read(struct iwl3945_priv *priv);
|
||||
extern void iwl3945_hw_build_tx_cmd_rate(struct iwl3945_priv *priv,
|
||||
struct iwl3945_cmd *cmd,
|
||||
void iwl3945_hw_build_tx_cmd_rate(struct iwl_priv *priv, struct iwl_cmd *cmd,
|
||||
struct ieee80211_tx_info *info,
|
||||
struct ieee80211_hdr *hdr,
|
||||
int sta_id, int tx_id);
|
||||
extern int iwl3945_hw_reg_send_txpower(struct iwl3945_priv *priv);
|
||||
extern int iwl3945_hw_reg_set_txpower(struct iwl3945_priv *priv, s8 power);
|
||||
extern void iwl3945_hw_rx_statistics(struct iwl3945_priv *priv,
|
||||
struct iwl3945_rx_mem_buffer *rxb);
|
||||
extern void iwl3945_disable_events(struct iwl3945_priv *priv);
|
||||
extern int iwl4965_get_temperature(const struct iwl3945_priv *priv);
|
||||
extern int iwl3945_hw_reg_send_txpower(struct iwl_priv *priv);
|
||||
extern int iwl3945_hw_reg_set_txpower(struct iwl_priv *priv, s8 power);
|
||||
extern void iwl3945_hw_rx_statistics(struct iwl_priv *priv,
|
||||
struct iwl_rx_mem_buffer *rxb);
|
||||
extern void iwl3945_disable_events(struct iwl_priv *priv);
|
||||
extern int iwl4965_get_temperature(const struct iwl_priv *priv);
|
||||
|
||||
/**
|
||||
* iwl3945_hw_find_station - Find station id for a given BSSID
|
||||
|
@ -655,302 +289,31 @@ extern int iwl4965_get_temperature(const struct iwl3945_priv *priv);
|
|||
* not yet been merged into a single common layer for managing the
|
||||
* station tables.
|
||||
*/
|
||||
extern u8 iwl3945_hw_find_station(struct iwl3945_priv *priv, const u8 *bssid);
|
||||
extern u8 iwl3945_hw_find_station(struct iwl_priv *priv, const u8 *bssid);
|
||||
|
||||
extern int iwl3945_hw_channel_switch(struct iwl3945_priv *priv, u16 channel);
|
||||
extern int iwl3945_hw_channel_switch(struct iwl_priv *priv, u16 channel);
|
||||
|
||||
/*
|
||||
* Forward declare iwl-3945.c functions for iwl-base.c
|
||||
*/
|
||||
extern __le32 iwl3945_get_antenna_flags(const struct iwl3945_priv *priv);
|
||||
extern int iwl3945_init_hw_rate_table(struct iwl3945_priv *priv);
|
||||
extern void iwl3945_reg_txpower_periodic(struct iwl3945_priv *priv);
|
||||
extern int iwl3945_txpower_set_from_eeprom(struct iwl3945_priv *priv);
|
||||
extern u8 iwl3945_sync_sta(struct iwl3945_priv *priv, int sta_id,
|
||||
extern __le32 iwl3945_get_antenna_flags(const struct iwl_priv *priv);
|
||||
extern int iwl3945_init_hw_rate_table(struct iwl_priv *priv);
|
||||
extern void iwl3945_reg_txpower_periodic(struct iwl_priv *priv);
|
||||
extern int iwl3945_txpower_set_from_eeprom(struct iwl_priv *priv);
|
||||
extern u8 iwl3945_sync_sta(struct iwl_priv *priv, int sta_id,
|
||||
u16 tx_rate, u8 flags);
|
||||
|
||||
|
||||
#ifdef CONFIG_IWL3945_SPECTRUM_MEASUREMENT
|
||||
|
||||
enum {
|
||||
MEASUREMENT_READY = (1 << 0),
|
||||
MEASUREMENT_ACTIVE = (1 << 1),
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_IWL3945_RFKILL
|
||||
struct iwl3945_priv;
|
||||
|
||||
void iwl3945_rfkill_set_hw_state(struct iwl3945_priv *priv);
|
||||
void iwl3945_rfkill_unregister(struct iwl3945_priv *priv);
|
||||
int iwl3945_rfkill_init(struct iwl3945_priv *priv);
|
||||
#else
|
||||
static inline void iwl3945_rfkill_set_hw_state(struct iwl3945_priv *priv) {}
|
||||
static inline void iwl3945_rfkill_unregister(struct iwl3945_priv *priv) {}
|
||||
static inline int iwl3945_rfkill_init(struct iwl3945_priv *priv) { return 0; }
|
||||
#endif
|
||||
|
||||
#define IWL_MAX_NUM_QUEUES IWL39_MAX_NUM_QUEUES
|
||||
|
||||
struct iwl3945_priv {
|
||||
|
||||
/* ieee device used by generic ieee processing code */
|
||||
struct ieee80211_hw *hw;
|
||||
struct ieee80211_channel *ieee_channels;
|
||||
struct ieee80211_rate *ieee_rates;
|
||||
struct iwl_3945_cfg *cfg; /* device configuration */
|
||||
|
||||
/* temporary frame storage list */
|
||||
struct list_head free_frames;
|
||||
int frames_count;
|
||||
|
||||
enum ieee80211_band band;
|
||||
int alloc_rxb_skb;
|
||||
|
||||
void (*rx_handlers[REPLY_MAX])(struct iwl3945_priv *priv,
|
||||
struct iwl3945_rx_mem_buffer *rxb);
|
||||
|
||||
struct ieee80211_supported_band bands[IEEE80211_NUM_BANDS];
|
||||
|
||||
#ifdef CONFIG_IWL3945_SPECTRUM_MEASUREMENT
|
||||
/* spectrum measurement report caching */
|
||||
struct iwl3945_spectrum_notification measure_report;
|
||||
u8 measurement_status;
|
||||
#endif
|
||||
/* ucode beacon time */
|
||||
u32 ucode_beacon_time;
|
||||
|
||||
/* we allocate array of iwl3945_channel_info for NIC's valid channels.
|
||||
* Access via channel # using indirect index array */
|
||||
struct iwl3945_channel_info *channel_info; /* channel info array */
|
||||
u8 channel_count; /* # of channels */
|
||||
|
||||
/* each calibration channel group in the EEPROM has a derived
|
||||
* clip setting for each rate. */
|
||||
const struct iwl3945_clip_group clip_groups[5];
|
||||
|
||||
/* thermal calibration */
|
||||
s32 temperature; /* degrees Kelvin */
|
||||
s32 last_temperature;
|
||||
|
||||
/* Scan related variables */
|
||||
unsigned long last_scan_jiffies;
|
||||
unsigned long next_scan_jiffies;
|
||||
unsigned long scan_start;
|
||||
unsigned long scan_pass_start;
|
||||
unsigned long scan_start_tsf;
|
||||
int scan_bands;
|
||||
int one_direct_scan;
|
||||
u8 direct_ssid_len;
|
||||
u8 direct_ssid[IW_ESSID_MAX_SIZE];
|
||||
struct iwl3945_scan_cmd *scan;
|
||||
|
||||
/* spinlock */
|
||||
spinlock_t lock; /* protect general shared data */
|
||||
spinlock_t hcmd_lock; /* protect hcmd */
|
||||
struct mutex mutex;
|
||||
|
||||
/* basic pci-network driver stuff */
|
||||
struct pci_dev *pci_dev;
|
||||
|
||||
/* pci hardware address support */
|
||||
void __iomem *hw_base;
|
||||
|
||||
/* uCode images, save to reload in case of failure */
|
||||
u32 ucode_ver; /* ucode version, copy of
|
||||
iwl3945_ucode.ver */
|
||||
struct fw_desc ucode_code; /* runtime inst */
|
||||
struct fw_desc ucode_data; /* runtime data original */
|
||||
struct fw_desc ucode_data_backup; /* runtime data save/restore */
|
||||
struct fw_desc ucode_init; /* initialization inst */
|
||||
struct fw_desc ucode_init_data; /* initialization data */
|
||||
struct fw_desc ucode_boot; /* bootstrap inst */
|
||||
|
||||
|
||||
struct iwl3945_rxon_time_cmd rxon_timing;
|
||||
|
||||
/* We declare this const so it can only be
|
||||
* changed via explicit cast within the
|
||||
* routines that actually update the physical
|
||||
* hardware */
|
||||
const struct iwl3945_rxon_cmd active_rxon;
|
||||
struct iwl3945_rxon_cmd staging_rxon;
|
||||
|
||||
int error_recovering;
|
||||
struct iwl3945_rxon_cmd recovery_rxon;
|
||||
|
||||
/* 1st responses from initialize and runtime uCode images.
|
||||
* 4965's initialize alive response contains some calibration data. */
|
||||
struct iwl3945_init_alive_resp card_alive_init;
|
||||
struct iwl3945_alive_resp card_alive;
|
||||
|
||||
#ifdef CONFIG_IWL3945_RFKILL
|
||||
struct rfkill *rfkill;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_IWL3945_LEDS
|
||||
struct iwl3945_led led[IWL_LED_TRG_MAX];
|
||||
unsigned long last_blink_time;
|
||||
u8 last_blink_rate;
|
||||
u8 allow_blinking;
|
||||
unsigned int rxtxpackets;
|
||||
u64 led_tpt;
|
||||
#endif
|
||||
|
||||
|
||||
u16 active_rate;
|
||||
u16 active_rate_basic;
|
||||
|
||||
u32 sta_supp_rates;
|
||||
|
||||
u8 call_post_assoc_from_beacon;
|
||||
/* Rate scaling data */
|
||||
s8 data_retry_limit;
|
||||
u8 retry_rate;
|
||||
|
||||
wait_queue_head_t wait_command_queue;
|
||||
|
||||
int activity_timer_active;
|
||||
|
||||
/* Rx and Tx DMA processing queues */
|
||||
struct iwl3945_rx_queue rxq;
|
||||
struct iwl3945_tx_queue txq[IWL_MAX_NUM_QUEUES];
|
||||
|
||||
unsigned long status;
|
||||
|
||||
int last_rx_rssi; /* From Rx packet statisitics */
|
||||
int last_rx_noise; /* From beacon statistics */
|
||||
|
||||
struct iwl3945_power_mgr power_data;
|
||||
|
||||
struct iwl3945_notif_statistics statistics;
|
||||
unsigned long last_statistics_time;
|
||||
|
||||
/* context information */
|
||||
u16 rates_mask;
|
||||
|
||||
u32 power_mode;
|
||||
u32 antenna;
|
||||
u8 bssid[ETH_ALEN];
|
||||
u16 rts_threshold;
|
||||
u8 mac_addr[ETH_ALEN];
|
||||
|
||||
/*station table variables */
|
||||
spinlock_t sta_lock;
|
||||
int num_stations;
|
||||
struct iwl3945_station_entry stations[IWL_STATION_COUNT];
|
||||
|
||||
/* Indication if ieee80211_ops->open has been called */
|
||||
u8 is_open;
|
||||
|
||||
u8 mac80211_registered;
|
||||
|
||||
/* Rx'd packet timing information */
|
||||
u32 last_beacon_time;
|
||||
u64 last_tsf;
|
||||
|
||||
/* eeprom */
|
||||
struct iwl3945_eeprom eeprom;
|
||||
|
||||
enum nl80211_iftype iw_mode;
|
||||
|
||||
struct sk_buff *ibss_beacon;
|
||||
|
||||
/* Last Rx'd beacon timestamp */
|
||||
u32 timestamp0;
|
||||
u32 timestamp1;
|
||||
u16 beacon_int;
|
||||
struct iwl3945_driver_hw_info hw_setting;
|
||||
struct ieee80211_vif *vif;
|
||||
|
||||
/* Current association information needed to configure the
|
||||
* hardware */
|
||||
u16 assoc_id;
|
||||
u16 assoc_capability;
|
||||
u8 ps_mode;
|
||||
|
||||
struct iwl3945_qos_info qos_data;
|
||||
|
||||
struct workqueue_struct *workqueue;
|
||||
|
||||
struct work_struct up;
|
||||
struct work_struct restart;
|
||||
struct work_struct calibrated_work;
|
||||
struct work_struct scan_completed;
|
||||
struct work_struct rx_replenish;
|
||||
struct work_struct rf_kill;
|
||||
struct work_struct abort_scan;
|
||||
struct work_struct update_link_led;
|
||||
struct work_struct auth_work;
|
||||
struct work_struct report_work;
|
||||
struct work_struct request_scan;
|
||||
struct work_struct beacon_update;
|
||||
|
||||
struct tasklet_struct irq_tasklet;
|
||||
|
||||
struct delayed_work init_alive_start;
|
||||
struct delayed_work alive_start;
|
||||
struct delayed_work activity_timer;
|
||||
struct delayed_work thermal_periodic;
|
||||
struct delayed_work gather_stats;
|
||||
struct delayed_work scan_check;
|
||||
|
||||
#define IWL_DEFAULT_TX_POWER 0x0F
|
||||
s8 user_txpower_limit;
|
||||
s8 max_channel_txpower_limit;
|
||||
|
||||
|
||||
#ifdef CONFIG_IWL3945_DEBUG
|
||||
/* debugging info */
|
||||
u32 framecnt_to_us;
|
||||
atomic_t restrict_refcnt;
|
||||
#endif
|
||||
}; /*iwl3945_priv */
|
||||
|
||||
static inline int iwl3945_is_associated(struct iwl3945_priv *priv)
|
||||
static inline int iwl3945_is_associated(struct iwl_priv *priv)
|
||||
{
|
||||
return (priv->active_rxon.filter_flags & RXON_FILTER_ASSOC_MSK) ? 1 : 0;
|
||||
return (priv->active39_rxon.filter_flags & RXON_FILTER_ASSOC_MSK) ? 1 : 0;
|
||||
}
|
||||
|
||||
static inline int is_channel_valid(const struct iwl3945_channel_info *ch_info)
|
||||
{
|
||||
if (ch_info == NULL)
|
||||
return 0;
|
||||
return (ch_info->flags & EEPROM_CHANNEL_VALID) ? 1 : 0;
|
||||
}
|
||||
extern const struct iwl_channel_info *iwl3945_get_channel_info(
|
||||
const struct iwl_priv *priv, enum ieee80211_band band, u16 channel);
|
||||
|
||||
static inline int is_channel_radar(const struct iwl3945_channel_info *ch_info)
|
||||
{
|
||||
return (ch_info->flags & EEPROM_CHANNEL_RADAR) ? 1 : 0;
|
||||
}
|
||||
extern int iwl3945_rs_next_rate(struct iwl_priv *priv, int rate);
|
||||
|
||||
static inline u8 is_channel_a_band(const struct iwl3945_channel_info *ch_info)
|
||||
{
|
||||
return ch_info->band == IEEE80211_BAND_5GHZ;
|
||||
}
|
||||
|
||||
static inline u8 is_channel_bg_band(const struct iwl3945_channel_info *ch_info)
|
||||
{
|
||||
return ch_info->band == IEEE80211_BAND_2GHZ;
|
||||
}
|
||||
|
||||
static inline int is_channel_passive(const struct iwl3945_channel_info *ch)
|
||||
{
|
||||
return (!(ch->flags & EEPROM_CHANNEL_ACTIVE)) ? 1 : 0;
|
||||
}
|
||||
|
||||
static inline int is_channel_ibss(const struct iwl3945_channel_info *ch)
|
||||
{
|
||||
return ((ch->flags & EEPROM_CHANNEL_IBSS)) ? 1 : 0;
|
||||
}
|
||||
|
||||
extern const struct iwl3945_channel_info *iwl3945_get_channel_info(
|
||||
const struct iwl3945_priv *priv, enum ieee80211_band band, u16 channel);
|
||||
|
||||
extern int iwl3945_rs_next_rate(struct iwl3945_priv *priv, int rate);
|
||||
|
||||
/* Requires full declaration of iwl3945_priv before including */
|
||||
#include "iwl-3945-io.h"
|
||||
/* Requires full declaration of iwl_priv before including */
|
||||
#include "iwl-io.h"
|
||||
|
||||
#endif
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -30,7 +30,7 @@
|
|||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -89,7 +89,7 @@
|
|||
#define LONG_SLOT_TIME 20
|
||||
|
||||
/* RSSI to dBm */
|
||||
#define IWL_RSSI_OFFSET 44
|
||||
#define IWL49_RSSI_OFFSET 44
|
||||
|
||||
|
||||
|
||||
|
@ -110,43 +110,29 @@
|
|||
|
||||
#define IWL_DEFAULT_TX_RETRY 15
|
||||
|
||||
#define RX_QUEUE_SIZE 256
|
||||
#define RX_QUEUE_MASK 255
|
||||
#define RX_QUEUE_SIZE_LOG 8
|
||||
|
||||
#define TFD_TX_CMD_SLOTS 256
|
||||
#define TFD_CMD_SLOTS 32
|
||||
|
||||
/*
|
||||
* RX related structures and functions
|
||||
*/
|
||||
#define RX_FREE_BUFFERS 64
|
||||
#define RX_LOW_WATERMARK 8
|
||||
|
||||
/* Size of one Rx buffer in host DRAM */
|
||||
#define IWL_RX_BUF_SIZE_4K (4 * 1024)
|
||||
#define IWL_RX_BUF_SIZE_8K (8 * 1024)
|
||||
|
||||
/* Sizes and addresses for instruction and data memory (SRAM) in
|
||||
* 4965's embedded processor. Driver access is via HBUS_TARG_MEM_* regs. */
|
||||
#define RTC_INST_LOWER_BOUND (0x000000)
|
||||
#define IWL49_RTC_INST_LOWER_BOUND (0x000000)
|
||||
#define IWL49_RTC_INST_UPPER_BOUND (0x018000)
|
||||
|
||||
#define RTC_DATA_LOWER_BOUND (0x800000)
|
||||
#define IWL49_RTC_DATA_LOWER_BOUND (0x800000)
|
||||
#define IWL49_RTC_DATA_UPPER_BOUND (0x80A000)
|
||||
|
||||
#define IWL49_RTC_INST_SIZE (IWL49_RTC_INST_UPPER_BOUND - RTC_INST_LOWER_BOUND)
|
||||
#define IWL49_RTC_DATA_SIZE (IWL49_RTC_DATA_UPPER_BOUND - RTC_DATA_LOWER_BOUND)
|
||||
#define IWL49_RTC_INST_SIZE (IWL49_RTC_INST_UPPER_BOUND - \
|
||||
IWL49_RTC_INST_LOWER_BOUND)
|
||||
#define IWL49_RTC_DATA_SIZE (IWL49_RTC_DATA_UPPER_BOUND - \
|
||||
IWL49_RTC_DATA_LOWER_BOUND)
|
||||
|
||||
#define IWL_MAX_INST_SIZE IWL49_RTC_INST_SIZE
|
||||
#define IWL_MAX_DATA_SIZE IWL49_RTC_DATA_SIZE
|
||||
#define IWL49_MAX_INST_SIZE IWL49_RTC_INST_SIZE
|
||||
#define IWL49_MAX_DATA_SIZE IWL49_RTC_DATA_SIZE
|
||||
|
||||
/* Size of uCode instruction memory in bootstrap state machine */
|
||||
#define IWL_MAX_BSM_SIZE BSM_SRAM_SIZE
|
||||
#define IWL49_MAX_BSM_SIZE BSM_SRAM_SIZE
|
||||
|
||||
static inline int iwl4965_hw_valid_rtc_data_addr(u32 addr)
|
||||
{
|
||||
return (addr >= RTC_DATA_LOWER_BOUND) &&
|
||||
return (addr >= IWL49_RTC_DATA_LOWER_BOUND) &&
|
||||
(addr < IWL49_RTC_DATA_UPPER_BOUND);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2003 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -85,7 +85,7 @@ static int iwl4965_verify_bsm(struct iwl_priv *priv)
|
|||
reg += sizeof(u32), image++) {
|
||||
val = iwl_read_prph(priv, reg);
|
||||
if (val != le32_to_cpu(*image)) {
|
||||
IWL_ERROR("BSM uCode verification failed at "
|
||||
IWL_ERR(priv, "BSM uCode verification failed at "
|
||||
"addr 0x%08X+%u (of %u), is 0x%x, s/b 0x%x\n",
|
||||
BSM_SRAM_LOWER_BOUND,
|
||||
reg - BSM_SRAM_LOWER_BOUND, len,
|
||||
|
@ -149,7 +149,7 @@ static int iwl4965_load_bsm(struct iwl_priv *priv)
|
|||
priv->ucode_type = UCODE_RT;
|
||||
|
||||
/* make sure bootstrap program is no larger than BSM's SRAM size */
|
||||
if (len > IWL_MAX_BSM_SIZE)
|
||||
if (len > IWL49_MAX_BSM_SIZE)
|
||||
return -EINVAL;
|
||||
|
||||
/* Tell bootstrap uCode where to find the "Initialize" uCode
|
||||
|
@ -186,7 +186,7 @@ static int iwl4965_load_bsm(struct iwl_priv *priv)
|
|||
|
||||
/* Tell BSM to copy from BSM SRAM into instruction SRAM, when asked */
|
||||
iwl_write_prph(priv, BSM_WR_MEM_SRC_REG, 0x0);
|
||||
iwl_write_prph(priv, BSM_WR_MEM_DST_REG, RTC_INST_LOWER_BOUND);
|
||||
iwl_write_prph(priv, BSM_WR_MEM_DST_REG, IWL49_RTC_INST_LOWER_BOUND);
|
||||
iwl_write_prph(priv, BSM_WR_DWCOUNT_REG, len / sizeof(u32));
|
||||
|
||||
/* Load bootstrap code into instruction SRAM now,
|
||||
|
@ -203,7 +203,7 @@ static int iwl4965_load_bsm(struct iwl_priv *priv)
|
|||
if (i < 100)
|
||||
IWL_DEBUG_INFO("BSM write complete, poll %d iterations\n", i);
|
||||
else {
|
||||
IWL_ERROR("BSM write did not complete!\n");
|
||||
IWL_ERR(priv, "BSM write did not complete!\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
@ -523,7 +523,8 @@ static void iwl4965_chain_noise_reset(struct iwl_priv *priv)
|
|||
cmd.diff_gain_c = 0;
|
||||
if (iwl_send_cmd_pdu(priv, REPLY_PHY_CALIBRATION_CMD,
|
||||
sizeof(cmd), &cmd))
|
||||
IWL_ERROR("Could not send REPLY_PHY_CALIBRATION_CMD\n");
|
||||
IWL_ERR(priv,
|
||||
"Could not send REPLY_PHY_CALIBRATION_CMD\n");
|
||||
data->state = IWL_CHAIN_NOISE_ACCUMULATE;
|
||||
IWL_DEBUG_CALIB("Run chain_noise_calibrate\n");
|
||||
}
|
||||
|
@ -804,8 +805,9 @@ static int iwl4965_hw_set_hw_params(struct iwl_priv *priv)
|
|||
|
||||
if ((priv->cfg->mod_params->num_of_queues > IWL49_NUM_QUEUES) ||
|
||||
(priv->cfg->mod_params->num_of_queues < IWL_MIN_NUM_QUEUES)) {
|
||||
IWL_ERROR("invalid queues_num, should be between %d and %d\n",
|
||||
IWL_MIN_NUM_QUEUES, IWL49_NUM_QUEUES);
|
||||
IWL_ERR(priv,
|
||||
"invalid queues_num, should be between %d and %d\n",
|
||||
IWL_MIN_NUM_QUEUES, IWL49_NUM_QUEUES);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -813,6 +815,7 @@ static int iwl4965_hw_set_hw_params(struct iwl_priv *priv)
|
|||
priv->hw_params.dma_chnl_num = FH49_TCSR_CHNL_NUM;
|
||||
priv->hw_params.scd_bc_tbls_size =
|
||||
IWL49_NUM_QUEUES * sizeof(struct iwl4965_scd_bc_tbl);
|
||||
priv->hw_params.tfd_size = sizeof(struct iwl_tfd);
|
||||
priv->hw_params.max_stations = IWL4965_STATION_COUNT;
|
||||
priv->hw_params.bcast_sta_id = IWL4965_BROADCAST_ID;
|
||||
priv->hw_params.max_data_size = IWL49_RTC_DATA_SIZE;
|
||||
|
@ -820,6 +823,8 @@ static int iwl4965_hw_set_hw_params(struct iwl_priv *priv)
|
|||
priv->hw_params.max_bsm_size = BSM_SRAM_SIZE;
|
||||
priv->hw_params.fat_channel = BIT(IEEE80211_BAND_5GHZ);
|
||||
|
||||
priv->hw_params.rx_wrt_ptr_reg = FH_RSCSR_CHNL0_WPTR;
|
||||
|
||||
priv->hw_params.tx_chains_num = 2;
|
||||
priv->hw_params.rx_chains_num = 2;
|
||||
priv->hw_params.valid_tx_ant = ANT_A | ANT_B;
|
||||
|
@ -902,7 +907,6 @@ static s32 iwl4965_get_tx_atten_grp(u16 channel)
|
|||
channel <= CALIB_IWL_TX_ATTEN_GR4_LCH)
|
||||
return CALIB_CH_GROUP_4;
|
||||
|
||||
IWL_ERROR("Can't find txatten group for channel %d.\n", channel);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -956,7 +960,7 @@ static int iwl4965_interpolate_chan(struct iwl_priv *priv, u32 channel,
|
|||
|
||||
s = iwl4965_get_sub_band(priv, channel);
|
||||
if (s >= EEPROM_TX_POWER_BANDS) {
|
||||
IWL_ERROR("Tx Power can not find channel %d\n", channel);
|
||||
IWL_ERR(priv, "Tx Power can not find channel %d\n", channel);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -1303,7 +1307,7 @@ static int iwl4965_fill_txpower_tbl(struct iwl_priv *priv, u8 band, u16 channel,
|
|||
s32 factory_actual_pwr[2];
|
||||
s32 power_index;
|
||||
|
||||
/* user_txpower_limit is in dBm, convert to half-dBm (half-dB units
|
||||
/* tx_power_user_lmt is in dBm, convert to half-dBm (half-dB units
|
||||
* are used for indexing into txpower table) */
|
||||
user_target_power = 2 * priv->tx_power_user_lmt;
|
||||
|
||||
|
@ -1319,8 +1323,11 @@ static int iwl4965_fill_txpower_tbl(struct iwl_priv *priv, u8 band, u16 channel,
|
|||
/* get txatten group, used to select 1) thermal txpower adjustment
|
||||
* and 2) mimo txpower balance between Tx chains. */
|
||||
txatten_grp = iwl4965_get_tx_atten_grp(channel);
|
||||
if (txatten_grp < 0)
|
||||
if (txatten_grp < 0) {
|
||||
IWL_ERR(priv, "Can't find txatten group for channel %d.\n",
|
||||
channel);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
IWL_DEBUG_TXPOWER("channel %d belongs to txatten group %d\n",
|
||||
channel, txatten_grp);
|
||||
|
@ -1483,12 +1490,12 @@ static int iwl4965_fill_txpower_tbl(struct iwl_priv *priv, u8 band, u16 channel,
|
|||
|
||||
/* stay within the table! */
|
||||
if (power_index > 107) {
|
||||
IWL_WARNING("txpower index %d > 107\n",
|
||||
IWL_WARN(priv, "txpower index %d > 107\n",
|
||||
power_index);
|
||||
power_index = 107;
|
||||
}
|
||||
if (power_index < 0) {
|
||||
IWL_WARNING("txpower index %d < 0\n",
|
||||
IWL_WARN(priv, "txpower index %d < 0\n",
|
||||
power_index);
|
||||
power_index = 0;
|
||||
}
|
||||
|
@ -1531,7 +1538,7 @@ static int iwl4965_send_tx_power(struct iwl_priv *priv)
|
|||
/* If this gets hit a lot, switch it to a BUG() and catch
|
||||
* the stack trace to find out who is calling this during
|
||||
* a scan. */
|
||||
IWL_WARNING("TX Power requested while scanning!\n");
|
||||
IWL_WARN(priv, "TX Power requested while scanning!\n");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
|
@ -1725,7 +1732,7 @@ static int iwl4965_hw_get_temperature(const struct iwl_priv *priv)
|
|||
IWL_DEBUG_TEMP("Calib values R[1-3]: %d %d %d R4: %d\n", R1, R2, R3, vt);
|
||||
|
||||
if (R3 == R1) {
|
||||
IWL_ERROR("Calibration conflict R1 == R3\n");
|
||||
IWL_ERR(priv, "Calibration conflict R1 == R3\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -1837,7 +1844,8 @@ static int iwl4965_txq_agg_disable(struct iwl_priv *priv, u16 txq_id,
|
|||
|
||||
if ((IWL49_FIRST_AMPDU_QUEUE > txq_id) ||
|
||||
(IWL49_FIRST_AMPDU_QUEUE + IWL49_NUM_AMPDU_QUEUES <= txq_id)) {
|
||||
IWL_WARNING("queue number out of range: %d, must be %d to %d\n",
|
||||
IWL_WARN(priv,
|
||||
"queue number out of range: %d, must be %d to %d\n",
|
||||
txq_id, IWL49_FIRST_AMPDU_QUEUE,
|
||||
IWL49_FIRST_AMPDU_QUEUE + IWL49_NUM_AMPDU_QUEUES - 1);
|
||||
return -EINVAL;
|
||||
|
@ -1908,7 +1916,8 @@ static int iwl4965_txq_agg_enable(struct iwl_priv *priv, int txq_id,
|
|||
|
||||
if ((IWL49_FIRST_AMPDU_QUEUE > txq_id) ||
|
||||
(IWL49_FIRST_AMPDU_QUEUE + IWL49_NUM_AMPDU_QUEUES <= txq_id)) {
|
||||
IWL_WARNING("queue number out of range: %d, must be %d to %d\n",
|
||||
IWL_WARN(priv,
|
||||
"queue number out of range: %d, must be %d to %d\n",
|
||||
txq_id, IWL49_FIRST_AMPDU_QUEUE,
|
||||
IWL49_FIRST_AMPDU_QUEUE + IWL49_NUM_AMPDU_QUEUES - 1);
|
||||
return -EINVAL;
|
||||
|
@ -2067,10 +2076,10 @@ static int iwl4965_tx_status_reply_tx(struct iwl_priv *priv,
|
|||
|
||||
sc = le16_to_cpu(hdr->seq_ctrl);
|
||||
if (idx != (SEQ_TO_SN(sc) & 0xff)) {
|
||||
IWL_ERROR("BUG_ON idx doesn't match seq control"
|
||||
" idx=%d, seq_idx=%d, seq=%d\n",
|
||||
idx, SEQ_TO_SN(sc),
|
||||
hdr->seq_ctrl);
|
||||
IWL_ERR(priv,
|
||||
"BUG_ON idx doesn't match seq control"
|
||||
" idx=%d, seq_idx=%d, seq=%d\n",
|
||||
idx, SEQ_TO_SN(sc), hdr->seq_ctrl);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -2129,7 +2138,7 @@ static void iwl4965_rx_reply_tx(struct iwl_priv *priv,
|
|||
u8 *qc = NULL;
|
||||
|
||||
if ((index >= txq->q.n_bd) || (iwl_queue_used(&txq->q, index) == 0)) {
|
||||
IWL_ERROR("Read index for DMA queue txq_id (%d) index %d "
|
||||
IWL_ERR(priv, "Read index for DMA queue txq_id (%d) index %d "
|
||||
"is out of range [0-%d] %d %d\n", txq_id,
|
||||
index, txq->q.n_bd, txq->q.write_ptr,
|
||||
txq->q.read_ptr);
|
||||
|
@ -2147,7 +2156,7 @@ static void iwl4965_rx_reply_tx(struct iwl_priv *priv,
|
|||
|
||||
sta_id = iwl_get_ra_sta_id(priv, hdr);
|
||||
if (txq->sched_retry && unlikely(sta_id == IWL_INVALID_STATION)) {
|
||||
IWL_ERROR("Station not known\n");
|
||||
IWL_ERR(priv, "Station not known\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -2210,7 +2219,7 @@ static void iwl4965_rx_reply_tx(struct iwl_priv *priv,
|
|||
iwl_txq_check_empty(priv, sta_id, tid, txq_id);
|
||||
|
||||
if (iwl_check_bits(status, TX_ABORT_REQUIRED_MSK))
|
||||
IWL_ERROR("TODO: Implement Tx ABORT REQUIRED!!!\n");
|
||||
IWL_ERR(priv, "TODO: Implement Tx ABORT REQUIRED!!!\n");
|
||||
}
|
||||
|
||||
static int iwl4965_calc_rssi(struct iwl_priv *priv,
|
||||
|
@ -2244,7 +2253,7 @@ static int iwl4965_calc_rssi(struct iwl_priv *priv,
|
|||
|
||||
/* dBm = max_rssi dB - agc dB - constant.
|
||||
* Higher AGC (higher radio gain) means lower signal. */
|
||||
return max_rssi - agc - IWL_RSSI_OFFSET;
|
||||
return max_rssi - agc - IWL49_RSSI_OFFSET;
|
||||
}
|
||||
|
||||
|
||||
|
@ -2287,6 +2296,9 @@ static struct iwl_lib_ops iwl4965_lib = {
|
|||
.txq_set_sched = iwl4965_txq_set_sched,
|
||||
.txq_agg_enable = iwl4965_txq_agg_enable,
|
||||
.txq_agg_disable = iwl4965_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 = iwl4965_rx_handler_setup,
|
||||
.setup_deferred_work = iwl4965_setup_deferred_work,
|
||||
.cancel_deferred_work = iwl4965_cancel_deferred_work,
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2007 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -30,7 +30,7 @@
|
|||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -68,10 +68,16 @@
|
|||
#ifndef __iwl_5000_hw_h__
|
||||
#define __iwl_5000_hw_h__
|
||||
|
||||
#define IWL50_RTC_INST_LOWER_BOUND (0x000000)
|
||||
#define IWL50_RTC_INST_UPPER_BOUND (0x020000)
|
||||
|
||||
#define IWL50_RTC_DATA_LOWER_BOUND (0x800000)
|
||||
#define IWL50_RTC_DATA_UPPER_BOUND (0x80C000)
|
||||
#define IWL50_RTC_INST_SIZE (IWL50_RTC_INST_UPPER_BOUND - RTC_INST_LOWER_BOUND)
|
||||
#define IWL50_RTC_DATA_SIZE (IWL50_RTC_DATA_UPPER_BOUND - RTC_DATA_LOWER_BOUND)
|
||||
|
||||
#define IWL50_RTC_INST_SIZE (IWL50_RTC_INST_UPPER_BOUND - \
|
||||
IWL50_RTC_INST_LOWER_BOUND)
|
||||
#define IWL50_RTC_DATA_SIZE (IWL50_RTC_DATA_UPPER_BOUND - \
|
||||
IWL50_RTC_DATA_LOWER_BOUND)
|
||||
|
||||
/* EEPROM */
|
||||
#define IWL_5000_EEPROM_IMG_SIZE 2048
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007-2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -289,7 +289,7 @@ static u32 eeprom_indirect_address(const struct iwl_priv *priv, u32 address)
|
|||
offset = iwl_eeprom_query16(priv, EEPROM_5000_LINK_OTHERS);
|
||||
break;
|
||||
default:
|
||||
IWL_ERROR("illegal indirect type: 0x%X\n",
|
||||
IWL_ERR(priv, "illegal indirect type: 0x%X\n",
|
||||
address & INDIRECT_TYPE_MSK);
|
||||
break;
|
||||
}
|
||||
|
@ -384,7 +384,8 @@ static void iwl5000_chain_noise_reset(struct iwl_priv *priv)
|
|||
ret = iwl_send_cmd_pdu(priv, REPLY_PHY_CALIBRATION_CMD,
|
||||
sizeof(cmd), &cmd);
|
||||
if (ret)
|
||||
IWL_ERROR("Could not send REPLY_PHY_CALIBRATION_CMD\n");
|
||||
IWL_ERR(priv,
|
||||
"Could not send REPLY_PHY_CALIBRATION_CMD\n");
|
||||
data->state = IWL_CHAIN_NOISE_ACCUMULATE;
|
||||
IWL_DEBUG_CALIB("Run chain_noise_calibrate\n");
|
||||
}
|
||||
|
@ -507,7 +508,7 @@ static void iwl5000_rx_calib_result(struct iwl_priv *priv,
|
|||
index = IWL_CALIB_BASE_BAND;
|
||||
break;
|
||||
default:
|
||||
IWL_ERROR("Unknown calibration notification %d\n",
|
||||
IWL_ERR(priv, "Unknown calibration notification %d\n",
|
||||
hdr->op_code);
|
||||
return;
|
||||
}
|
||||
|
@ -580,7 +581,8 @@ static int iwl5000_load_given_ucode(struct iwl_priv *priv,
|
|||
{
|
||||
int ret = 0;
|
||||
|
||||
ret = iwl5000_load_section(priv, inst_image, RTC_INST_LOWER_BOUND);
|
||||
ret = iwl5000_load_section(priv, inst_image,
|
||||
IWL50_RTC_INST_LOWER_BOUND);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
@ -588,19 +590,19 @@ static int iwl5000_load_given_ucode(struct iwl_priv *priv,
|
|||
ret = wait_event_interruptible_timeout(priv->wait_command_queue,
|
||||
priv->ucode_write_complete, 5 * HZ);
|
||||
if (ret == -ERESTARTSYS) {
|
||||
IWL_ERROR("Could not load the INST uCode section due "
|
||||
IWL_ERR(priv, "Could not load the INST uCode section due "
|
||||
"to interrupt\n");
|
||||
return ret;
|
||||
}
|
||||
if (!ret) {
|
||||
IWL_ERROR("Could not load the INST uCode section\n");
|
||||
IWL_ERR(priv, "Could not load the INST uCode section\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
priv->ucode_write_complete = 0;
|
||||
|
||||
ret = iwl5000_load_section(
|
||||
priv, data_image, RTC_DATA_LOWER_BOUND);
|
||||
priv, data_image, IWL50_RTC_DATA_LOWER_BOUND);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
@ -609,11 +611,11 @@ static int iwl5000_load_given_ucode(struct iwl_priv *priv,
|
|||
ret = wait_event_interruptible_timeout(priv->wait_command_queue,
|
||||
priv->ucode_write_complete, 5 * HZ);
|
||||
if (ret == -ERESTARTSYS) {
|
||||
IWL_ERROR("Could not load the INST uCode section due "
|
||||
IWL_ERR(priv, "Could not load the INST uCode section due "
|
||||
"to interrupt\n");
|
||||
return ret;
|
||||
} else if (!ret) {
|
||||
IWL_ERROR("Could not load the DATA uCode section\n");
|
||||
IWL_ERR(priv, "Could not load the DATA uCode section\n");
|
||||
return -ETIMEDOUT;
|
||||
} else
|
||||
ret = 0;
|
||||
|
@ -675,7 +677,8 @@ static void iwl5000_init_alive_start(struct iwl_priv *priv)
|
|||
iwl_clear_stations_table(priv);
|
||||
ret = priv->cfg->ops->lib->alive_notify(priv);
|
||||
if (ret) {
|
||||
IWL_WARNING("Could not complete ALIVE transition: %d\n", ret);
|
||||
IWL_WARN(priv,
|
||||
"Could not complete ALIVE transition: %d\n", ret);
|
||||
goto restart;
|
||||
}
|
||||
|
||||
|
@ -824,8 +827,9 @@ static int iwl5000_hw_set_hw_params(struct iwl_priv *priv)
|
|||
{
|
||||
if ((priv->cfg->mod_params->num_of_queues > IWL50_NUM_QUEUES) ||
|
||||
(priv->cfg->mod_params->num_of_queues < IWL_MIN_NUM_QUEUES)) {
|
||||
IWL_ERROR("invalid queues_num, should be between %d and %d\n",
|
||||
IWL_MIN_NUM_QUEUES, IWL50_NUM_QUEUES);
|
||||
IWL_ERR(priv,
|
||||
"invalid queues_num, should be between %d and %d\n",
|
||||
IWL_MIN_NUM_QUEUES, IWL50_NUM_QUEUES);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -833,6 +837,7 @@ static int iwl5000_hw_set_hw_params(struct iwl_priv *priv)
|
|||
priv->hw_params.dma_chnl_num = FH50_TCSR_CHNL_NUM;
|
||||
priv->hw_params.scd_bc_tbls_size =
|
||||
IWL50_NUM_QUEUES * sizeof(struct iwl5000_scd_bc_tbl);
|
||||
priv->hw_params.tfd_size = sizeof(struct iwl_tfd);
|
||||
priv->hw_params.max_stations = IWL5000_STATION_COUNT;
|
||||
priv->hw_params.bcast_sta_id = IWL5000_BROADCAST_ID;
|
||||
priv->hw_params.max_data_size = IWL50_RTC_DATA_SIZE;
|
||||
|
@ -840,6 +845,8 @@ static int iwl5000_hw_set_hw_params(struct iwl_priv *priv)
|
|||
priv->hw_params.max_bsm_size = 0;
|
||||
priv->hw_params.fat_channel = BIT(IEEE80211_BAND_2GHZ) |
|
||||
BIT(IEEE80211_BAND_5GHZ);
|
||||
priv->hw_params.rx_wrt_ptr_reg = FH_RSCSR_CHNL0_WPTR;
|
||||
|
||||
priv->hw_params.sens = &iwl5000_sensitivity;
|
||||
|
||||
switch (priv->hw_rev & CSR_HW_REV_TYPE_MSK) {
|
||||
|
@ -1011,7 +1018,8 @@ static int iwl5000_txq_agg_enable(struct iwl_priv *priv, int txq_id,
|
|||
|
||||
if ((IWL50_FIRST_AMPDU_QUEUE > txq_id) ||
|
||||
(IWL50_FIRST_AMPDU_QUEUE + IWL50_NUM_AMPDU_QUEUES <= txq_id)) {
|
||||
IWL_WARNING("queue number out of range: %d, must be %d to %d\n",
|
||||
IWL_WARN(priv,
|
||||
"queue number out of range: %d, must be %d to %d\n",
|
||||
txq_id, IWL50_FIRST_AMPDU_QUEUE,
|
||||
IWL50_FIRST_AMPDU_QUEUE + IWL50_NUM_AMPDU_QUEUES - 1);
|
||||
return -EINVAL;
|
||||
|
@ -1076,7 +1084,8 @@ static int iwl5000_txq_agg_disable(struct iwl_priv *priv, u16 txq_id,
|
|||
|
||||
if ((IWL50_FIRST_AMPDU_QUEUE > txq_id) ||
|
||||
(IWL50_FIRST_AMPDU_QUEUE + IWL50_NUM_AMPDU_QUEUES <= txq_id)) {
|
||||
IWL_WARNING("queue number out of range: %d, must be %d to %d\n",
|
||||
IWL_WARN(priv,
|
||||
"queue number out of range: %d, must be %d to %d\n",
|
||||
txq_id, IWL50_FIRST_AMPDU_QUEUE,
|
||||
IWL50_FIRST_AMPDU_QUEUE + IWL50_NUM_AMPDU_QUEUES - 1);
|
||||
return -EINVAL;
|
||||
|
@ -1197,8 +1206,9 @@ static int iwl5000_tx_status_reply_tx(struct iwl_priv *priv,
|
|||
|
||||
sc = le16_to_cpu(hdr->seq_ctrl);
|
||||
if (idx != (SEQ_TO_SN(sc) & 0xff)) {
|
||||
IWL_ERROR("BUG_ON idx doesn't match seq control"
|
||||
" idx=%d, seq_idx=%d, seq=%d\n",
|
||||
IWL_ERR(priv,
|
||||
"BUG_ON idx doesn't match seq control"
|
||||
" idx=%d, seq_idx=%d, seq=%d\n",
|
||||
idx, SEQ_TO_SN(sc),
|
||||
hdr->seq_ctrl);
|
||||
return -1;
|
||||
|
@ -1254,7 +1264,7 @@ static void iwl5000_rx_reply_tx(struct iwl_priv *priv,
|
|||
int freed;
|
||||
|
||||
if ((index >= txq->q.n_bd) || (iwl_queue_used(&txq->q, index) == 0)) {
|
||||
IWL_ERROR("Read index for DMA queue txq_id (%d) index %d "
|
||||
IWL_ERR(priv, "Read index for DMA queue txq_id (%d) index %d "
|
||||
"is out of range [0-%d] %d %d\n", txq_id,
|
||||
index, txq->q.n_bd, txq->q.write_ptr,
|
||||
txq->q.read_ptr);
|
||||
|
@ -1328,7 +1338,7 @@ static void iwl5000_rx_reply_tx(struct iwl_priv *priv,
|
|||
iwl_txq_check_empty(priv, sta_id, tid, txq_id);
|
||||
|
||||
if (iwl_check_bits(status, TX_ABORT_REQUIRED_MSK))
|
||||
IWL_ERROR("TODO: Implement Tx ABORT REQUIRED!!!\n");
|
||||
IWL_ERR(priv, "TODO: Implement Tx ABORT REQUIRED!!!\n");
|
||||
}
|
||||
|
||||
/* Currently 5000 is the superset of everything */
|
||||
|
@ -1356,7 +1366,7 @@ static void iwl5000_rx_handler_setup(struct iwl_priv *priv)
|
|||
|
||||
static int iwl5000_hw_valid_rtc_data_addr(u32 addr)
|
||||
{
|
||||
return (addr >= RTC_DATA_LOWER_BOUND) &&
|
||||
return (addr >= IWL50_RTC_DATA_LOWER_BOUND) &&
|
||||
(addr < IWL50_RTC_DATA_UPPER_BOUND);
|
||||
}
|
||||
|
||||
|
@ -1460,7 +1470,7 @@ static int iwl5000_calc_rssi(struct iwl_priv *priv,
|
|||
|
||||
/* dBm = max_rssi dB - agc dB - constant.
|
||||
* Higher AGC (higher radio gain) means lower signal. */
|
||||
return max_rssi - agc - IWL_RSSI_OFFSET;
|
||||
return max_rssi - agc - IWL49_RSSI_OFFSET;
|
||||
}
|
||||
|
||||
static struct iwl_hcmd_ops iwl5000_hcmd = {
|
||||
|
@ -1483,6 +1493,9 @@ static struct iwl_lib_ops iwl5000_lib = {
|
|||
.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,
|
||||
|
@ -1517,13 +1530,13 @@ static struct iwl_lib_ops iwl5000_lib = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct iwl_ops iwl5000_ops = {
|
||||
struct iwl_ops iwl5000_ops = {
|
||||
.lib = &iwl5000_lib,
|
||||
.hcmd = &iwl5000_hcmd,
|
||||
.utils = &iwl5000_hcmd_utils,
|
||||
};
|
||||
|
||||
static struct iwl_mod_params iwl50_mod_params = {
|
||||
struct iwl_mod_params iwl50_mod_params = {
|
||||
.num_of_queues = IWL50_NUM_QUEUES,
|
||||
.num_of_ampdu_queues = IWL50_NUM_AMPDU_QUEUES,
|
||||
.amsdu_size_8K = 1,
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -30,7 +30,7 @@
|
|||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -58,47 +58,24 @@
|
|||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __iwl_3945_dev_h__
|
||||
#define __iwl_3945_dev_h__
|
||||
|
||||
#define IWL_PCI_DEVICE(dev, subdev, cfg) \
|
||||
.vendor = PCI_VENDOR_ID_INTEL, .device = (dev), \
|
||||
.subvendor = PCI_ANY_ID, .subdevice = (subdev), \
|
||||
.driver_data = (kernel_ulong_t)&(cfg)
|
||||
|
||||
#define IWL_SKU_G 0x1
|
||||
#define IWL_SKU_A 0x2
|
||||
|
||||
/**
|
||||
* struct iwl_3945_cfg
|
||||
* @fw_name_pre: Firmware filename prefix. The api version and extension
|
||||
* (.ucode) will be added to filename before loading from disk. The
|
||||
* filename is constructed as fw_name_pre<api>.ucode.
|
||||
* @ucode_api_max: Highest version of uCode API supported by driver.
|
||||
* @ucode_api_min: Lowest version of uCode API supported by driver.
|
||||
*
|
||||
* We enable the driver to be backward compatible wrt API version. The
|
||||
* driver specifies which APIs it supports (with @ucode_api_max being the
|
||||
* highest and @ucode_api_min the lowest). Firmware will only be loaded if
|
||||
* it has a supported API version. The firmware's API version will be
|
||||
* stored in @iwl_priv, enabling the driver to make runtime changes based
|
||||
* on firmware version used.
|
||||
*
|
||||
* For example,
|
||||
* if (IWL_UCODE_API(priv->ucode_ver) >= 2) {
|
||||
* Driver interacts with Firmware API version >= 2.
|
||||
* } else {
|
||||
* Driver interacts with Firmware API version 1.
|
||||
* }
|
||||
/*
|
||||
* Please use this file (iwl-6000-hw.h) only for hardware-related definitions.
|
||||
* Use iwl-5000-commands.h for uCode API definitions.
|
||||
*/
|
||||
struct iwl_3945_cfg {
|
||||
const char *name;
|
||||
const char *fw_name_pre;
|
||||
const unsigned int ucode_api_max;
|
||||
const unsigned int ucode_api_min;
|
||||
unsigned int sku;
|
||||
};
|
||||
|
||||
#endif /* __iwl_dev_h__ */
|
||||
#ifndef __iwl_6000_hw_h__
|
||||
#define __iwl_6000_hw_h__
|
||||
|
||||
#define IWL60_RTC_INST_LOWER_BOUND (0x000000)
|
||||
#define IWL60_RTC_INST_UPPER_BOUND (0x040000)
|
||||
#define IWL60_RTC_DATA_LOWER_BOUND (0x800000)
|
||||
#define IWL60_RTC_DATA_UPPER_BOUND (0x814000)
|
||||
#define IWL60_RTC_INST_SIZE \
|
||||
(IWL60_RTC_INST_UPPER_BOUND - IWL60_RTC_INST_LOWER_BOUND)
|
||||
#define IWL60_RTC_DATA_SIZE \
|
||||
(IWL60_RTC_DATA_UPPER_BOUND - IWL60_RTC_DATA_LOWER_BOUND)
|
||||
|
||||
#endif /* __iwl_6000_hw_h__ */
|
||||
|
|
@ -0,0 +1,130 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2008-2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* Intel Linux Wireless <ilw@linux.intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/wireless.h>
|
||||
#include <net/mac80211.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
#include "iwl-eeprom.h"
|
||||
#include "iwl-dev.h"
|
||||
#include "iwl-core.h"
|
||||
#include "iwl-io.h"
|
||||
#include "iwl-sta.h"
|
||||
#include "iwl-helpers.h"
|
||||
#include "iwl-5000-hw.h"
|
||||
|
||||
/* Highest firmware API version supported */
|
||||
#define IWL6000_UCODE_API_MAX 1
|
||||
#define IWL6050_UCODE_API_MAX 1
|
||||
|
||||
/* Lowest firmware API version supported */
|
||||
#define IWL6000_UCODE_API_MIN 1
|
||||
#define IWL6050_UCODE_API_MIN 1
|
||||
|
||||
#define IWL6000_FW_PRE "iwlwifi-6000-"
|
||||
#define _IWL6000_MODULE_FIRMWARE(api) IWL6000_FW_PRE #api ".ucode"
|
||||
#define IWL6000_MODULE_FIRMWARE(api) _IWL6000_MODULE_FIRMWARE(api)
|
||||
|
||||
#define IWL6050_FW_PRE "iwlwifi-6050-"
|
||||
#define _IWL6050_MODULE_FIRMWARE(api) IWL6050_FW_PRE #api ".ucode"
|
||||
#define IWL6050_MODULE_FIRMWARE(api) _IWL6050_MODULE_FIRMWARE(api)
|
||||
|
||||
struct iwl_cfg iwl6000_2ag_cfg = {
|
||||
.name = "6000 Series 2x2 AG",
|
||||
.fw_name_pre = IWL6000_FW_PRE,
|
||||
.ucode_api_max = IWL6000_UCODE_API_MAX,
|
||||
.ucode_api_min = IWL6000_UCODE_API_MIN,
|
||||
.sku = IWL_SKU_A|IWL_SKU_G,
|
||||
.ops = &iwl5000_ops,
|
||||
.eeprom_size = IWL_5000_EEPROM_IMG_SIZE,
|
||||
.eeprom_ver = EEPROM_5000_EEPROM_VERSION,
|
||||
.eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION,
|
||||
.mod_params = &iwl50_mod_params,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6000_2agn_cfg = {
|
||||
.name = "6000 Series 2x2 AGN",
|
||||
.fw_name_pre = IWL6000_FW_PRE,
|
||||
.ucode_api_max = IWL6000_UCODE_API_MAX,
|
||||
.ucode_api_min = IWL6000_UCODE_API_MIN,
|
||||
.sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N,
|
||||
.ops = &iwl5000_ops,
|
||||
.eeprom_size = IWL_5000_EEPROM_IMG_SIZE,
|
||||
.eeprom_ver = EEPROM_5000_EEPROM_VERSION,
|
||||
.eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION,
|
||||
.mod_params = &iwl50_mod_params,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6050_2agn_cfg = {
|
||||
.name = "6050 Series 2x2 AGN",
|
||||
.fw_name_pre = IWL6050_FW_PRE,
|
||||
.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 = &iwl5000_ops,
|
||||
.eeprom_size = IWL_5000_EEPROM_IMG_SIZE,
|
||||
.eeprom_ver = EEPROM_5000_EEPROM_VERSION,
|
||||
.eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION,
|
||||
.mod_params = &iwl50_mod_params,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6000_3agn_cfg = {
|
||||
.name = "6000 Series 3x3 AGN",
|
||||
.fw_name_pre = IWL6000_FW_PRE,
|
||||
.ucode_api_max = IWL6000_UCODE_API_MAX,
|
||||
.ucode_api_min = IWL6000_UCODE_API_MIN,
|
||||
.sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N,
|
||||
.ops = &iwl5000_ops,
|
||||
.eeprom_size = IWL_5000_EEPROM_IMG_SIZE,
|
||||
.eeprom_ver = EEPROM_5000_EEPROM_VERSION,
|
||||
.eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION,
|
||||
.mod_params = &iwl50_mod_params,
|
||||
};
|
||||
|
||||
struct iwl_cfg iwl6050_3agn_cfg = {
|
||||
.name = "6050 Series 3x3 AGN",
|
||||
.fw_name_pre = IWL6050_FW_PRE,
|
||||
.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 = &iwl5000_ops,
|
||||
.eeprom_size = IWL_5000_EEPROM_IMG_SIZE,
|
||||
.eeprom_ver = EEPROM_5000_EEPROM_VERSION,
|
||||
.eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION,
|
||||
.mod_params = &iwl50_mod_params,
|
||||
};
|
||||
|
||||
MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX));
|
||||
MODULE_FIRMWARE(IWL6050_MODULE_FIRMWARE(IWL6050_UCODE_API_MAX));
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2008 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -40,67 +40,68 @@
|
|||
* be #ifdef'd out once the driver is stable and folks aren't actively
|
||||
* making changes
|
||||
*/
|
||||
int iwl_agn_check_rxon_cmd(struct iwl_rxon_cmd *rxon)
|
||||
int iwl_agn_check_rxon_cmd(struct iwl_priv *priv)
|
||||
{
|
||||
int error = 0;
|
||||
int counter = 1;
|
||||
struct iwl_rxon_cmd *rxon = &priv->staging_rxon;
|
||||
|
||||
if (rxon->flags & RXON_FLG_BAND_24G_MSK) {
|
||||
error |= le32_to_cpu(rxon->flags &
|
||||
(RXON_FLG_TGJ_NARROW_BAND_MSK |
|
||||
RXON_FLG_RADAR_DETECT_MSK));
|
||||
if (error)
|
||||
IWL_WARNING("check 24G fields %d | %d\n",
|
||||
IWL_WARN(priv, "check 24G fields %d | %d\n",
|
||||
counter++, error);
|
||||
} else {
|
||||
error |= (rxon->flags & RXON_FLG_SHORT_SLOT_MSK) ?
|
||||
0 : le32_to_cpu(RXON_FLG_SHORT_SLOT_MSK);
|
||||
if (error)
|
||||
IWL_WARNING("check 52 fields %d | %d\n",
|
||||
IWL_WARN(priv, "check 52 fields %d | %d\n",
|
||||
counter++, error);
|
||||
error |= le32_to_cpu(rxon->flags & RXON_FLG_CCK_MSK);
|
||||
if (error)
|
||||
IWL_WARNING("check 52 CCK %d | %d\n",
|
||||
IWL_WARN(priv, "check 52 CCK %d | %d\n",
|
||||
counter++, error);
|
||||
}
|
||||
error |= (rxon->node_addr[0] | rxon->bssid_addr[0]) & 0x1;
|
||||
if (error)
|
||||
IWL_WARNING("check mac addr %d | %d\n", counter++, error);
|
||||
IWL_WARN(priv, "check mac addr %d | %d\n", counter++, error);
|
||||
|
||||
/* make sure basic rates 6Mbps and 1Mbps are supported */
|
||||
error |= (((rxon->ofdm_basic_rates & IWL_RATE_6M_MASK) == 0) &&
|
||||
((rxon->cck_basic_rates & IWL_RATE_1M_MASK) == 0));
|
||||
if (error)
|
||||
IWL_WARNING("check basic rate %d | %d\n", counter++, error);
|
||||
IWL_WARN(priv, "check basic rate %d | %d\n", counter++, error);
|
||||
|
||||
error |= (le16_to_cpu(rxon->assoc_id) > 2007);
|
||||
if (error)
|
||||
IWL_WARNING("check assoc id %d | %d\n", counter++, error);
|
||||
IWL_WARN(priv, "check assoc id %d | %d\n", counter++, error);
|
||||
|
||||
error |= ((rxon->flags & (RXON_FLG_CCK_MSK | RXON_FLG_SHORT_SLOT_MSK))
|
||||
== (RXON_FLG_CCK_MSK | RXON_FLG_SHORT_SLOT_MSK));
|
||||
if (error)
|
||||
IWL_WARNING("check CCK and short slot %d | %d\n",
|
||||
IWL_WARN(priv, "check CCK and short slot %d | %d\n",
|
||||
counter++, error);
|
||||
|
||||
error |= ((rxon->flags & (RXON_FLG_CCK_MSK | RXON_FLG_AUTO_DETECT_MSK))
|
||||
== (RXON_FLG_CCK_MSK | RXON_FLG_AUTO_DETECT_MSK));
|
||||
if (error)
|
||||
IWL_WARNING("check CCK & auto detect %d | %d\n",
|
||||
IWL_WARN(priv, "check CCK & auto detect %d | %d\n",
|
||||
counter++, error);
|
||||
|
||||
error |= ((rxon->flags & (RXON_FLG_AUTO_DETECT_MSK |
|
||||
RXON_FLG_TGG_PROTECT_MSK)) == RXON_FLG_TGG_PROTECT_MSK);
|
||||
if (error)
|
||||
IWL_WARNING("check TGG and auto detect %d | %d\n",
|
||||
IWL_WARN(priv, "check TGG and auto detect %d | %d\n",
|
||||
counter++, error);
|
||||
|
||||
if (error)
|
||||
IWL_WARNING("Tuning to channel %d\n",
|
||||
IWL_WARN(priv, "Tuning to channel %d\n",
|
||||
le16_to_cpu(rxon->channel));
|
||||
|
||||
if (error) {
|
||||
IWL_ERROR("Not a valid iwl4965_rxon_assoc_cmd field values\n");
|
||||
IWL_ERR(priv, "Not a valid iwl_rxon_assoc_cmd field values\n");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -49,6 +49,8 @@
|
|||
#define IWL_RATE_MIN_FAILURE_TH 6 /* min failures to calc tpt */
|
||||
#define IWL_RATE_MIN_SUCCESS_TH 8 /* min successes to calc tpt */
|
||||
|
||||
/* max allowed rate miss before sync LQ cmd */
|
||||
#define IWL_MISSED_RATE_MAX 15
|
||||
/* max time to accum history 2 seconds */
|
||||
#define IWL_RATE_SCALE_FLUSH_INTVL (2*HZ)
|
||||
|
||||
|
@ -148,6 +150,8 @@ struct iwl_lq_sta {
|
|||
u16 active_mimo2_rate;
|
||||
u16 active_mimo3_rate;
|
||||
u16 active_rate_basic;
|
||||
s8 max_rate_idx; /* Max rate set by user */
|
||||
u8 missed_rate_counter;
|
||||
|
||||
struct iwl_link_quality_cmd lq;
|
||||
struct iwl_scale_tbl_info lq_info[LQ_SIZE]; /* "active", "search" */
|
||||
|
@ -463,8 +467,9 @@ static int rs_collect_tx_data(struct iwl_rate_scale_data *windows,
|
|||
* Fill uCode API rate_n_flags field, based on "search" or "active" table.
|
||||
*/
|
||||
/* FIXME:RS:remove this function and put the flags statically in the table */
|
||||
static u32 rate_n_flags_from_tbl(struct iwl_scale_tbl_info *tbl,
|
||||
int index, u8 use_green)
|
||||
static u32 rate_n_flags_from_tbl(struct iwl_priv *priv,
|
||||
struct iwl_scale_tbl_info *tbl,
|
||||
int index, u8 use_green)
|
||||
{
|
||||
u32 rate_n_flags = 0;
|
||||
|
||||
|
@ -475,7 +480,7 @@ static u32 rate_n_flags_from_tbl(struct iwl_scale_tbl_info *tbl,
|
|||
|
||||
} else if (is_Ht(tbl->lq_type)) {
|
||||
if (index > IWL_LAST_OFDM_RATE) {
|
||||
IWL_ERROR("invalid HT rate index %d\n", index);
|
||||
IWL_ERR(priv, "Invalid HT rate index %d\n", index);
|
||||
index = IWL_LAST_OFDM_RATE;
|
||||
}
|
||||
rate_n_flags = RATE_MCS_HT_MSK;
|
||||
|
@ -487,7 +492,7 @@ static u32 rate_n_flags_from_tbl(struct iwl_scale_tbl_info *tbl,
|
|||
else
|
||||
rate_n_flags |= iwl_rates[index].plcp_mimo3;
|
||||
} else {
|
||||
IWL_ERROR("Invalid tbl->lq_type %d\n", tbl->lq_type);
|
||||
IWL_ERR(priv, "Invalid tbl->lq_type %d\n", tbl->lq_type);
|
||||
}
|
||||
|
||||
rate_n_flags |= ((tbl->ant_type << RATE_MCS_ANT_POS) &
|
||||
|
@ -507,7 +512,7 @@ static u32 rate_n_flags_from_tbl(struct iwl_scale_tbl_info *tbl,
|
|||
rate_n_flags |= RATE_MCS_GF_MSK;
|
||||
if (is_siso(tbl->lq_type) && tbl->is_SGI) {
|
||||
rate_n_flags &= ~RATE_MCS_SGI_MSK;
|
||||
IWL_ERROR("GF was set with SGI:SISO\n");
|
||||
IWL_ERR(priv, "GF was set with SGI:SISO\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -758,7 +763,7 @@ static u32 rs_get_lower_rate(struct iwl_lq_sta *lq_sta,
|
|||
low = scale_index;
|
||||
|
||||
out:
|
||||
return rate_n_flags_from_tbl(tbl, low, is_green);
|
||||
return rate_n_flags_from_tbl(lq_sta->drv, tbl, low, is_green);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -839,10 +844,15 @@ static void rs_tx_status(void *priv_r, struct ieee80211_supported_band *sband,
|
|||
/* the last LQ command could failed so the LQ in ucode not
|
||||
* the same in driver sync up
|
||||
*/
|
||||
iwl_send_lq_cmd(priv, &lq_sta->lq, CMD_ASYNC);
|
||||
lq_sta->missed_rate_counter++;
|
||||
if (lq_sta->missed_rate_counter > IWL_MISSED_RATE_MAX) {
|
||||
lq_sta->missed_rate_counter = 0;
|
||||
iwl_send_lq_cmd(priv, &lq_sta->lq, CMD_ASYNC);
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
|
||||
lq_sta->missed_rate_counter = 0;
|
||||
/* Update frame history window with "failure" for each Tx retry. */
|
||||
while (retries) {
|
||||
/* Look up the rate and other info used for each tx attempt.
|
||||
|
@ -1129,7 +1139,7 @@ static int rs_switch_to_mimo2(struct iwl_priv *priv,
|
|||
s32 rate;
|
||||
s8 is_green = lq_sta->is_green;
|
||||
|
||||
if (!conf->ht.enabled || !sta->ht_cap.ht_supported)
|
||||
if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
|
||||
return -1;
|
||||
|
||||
if (((sta->ht_cap.cap & IEEE80211_HT_CAP_SM_PS) >> 2)
|
||||
|
@ -1176,7 +1186,7 @@ static int rs_switch_to_mimo2(struct iwl_priv *priv,
|
|||
rate, rate_mask);
|
||||
return -1;
|
||||
}
|
||||
tbl->current_rate = rate_n_flags_from_tbl(tbl, rate, is_green);
|
||||
tbl->current_rate = rate_n_flags_from_tbl(priv, tbl, rate, is_green);
|
||||
|
||||
IWL_DEBUG_RATE("LQ: Switch to new mcs %X index is green %X\n",
|
||||
tbl->current_rate, is_green);
|
||||
|
@ -1196,7 +1206,7 @@ static int rs_switch_to_siso(struct iwl_priv *priv,
|
|||
u8 is_green = lq_sta->is_green;
|
||||
s32 rate;
|
||||
|
||||
if (!conf->ht.enabled || !sta->ht_cap.ht_supported)
|
||||
if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
|
||||
return -1;
|
||||
|
||||
IWL_DEBUG_RATE("LQ: try to switch to SISO\n");
|
||||
|
@ -1236,7 +1246,7 @@ static int rs_switch_to_siso(struct iwl_priv *priv,
|
|||
rate, rate_mask);
|
||||
return -1;
|
||||
}
|
||||
tbl->current_rate = rate_n_flags_from_tbl(tbl, rate, is_green);
|
||||
tbl->current_rate = rate_n_flags_from_tbl(priv, tbl, rate, is_green);
|
||||
IWL_DEBUG_RATE("LQ: Switch to new mcs %X index is green %X\n",
|
||||
tbl->current_rate, is_green);
|
||||
return 0;
|
||||
|
@ -1430,7 +1440,8 @@ static int rs_move_siso_to_other(struct iwl_priv *priv,
|
|||
if (!tbl->is_SGI)
|
||||
break;
|
||||
else
|
||||
IWL_ERROR("SGI was set in GF+SISO\n");
|
||||
IWL_ERR(priv,
|
||||
"SGI was set in GF+SISO\n");
|
||||
}
|
||||
search_tbl->is_SGI = !tbl->is_SGI;
|
||||
rs_set_expected_tpt_table(lq_sta, search_tbl);
|
||||
|
@ -1439,8 +1450,9 @@ static int rs_move_siso_to_other(struct iwl_priv *priv,
|
|||
if (tpt >= search_tbl->expected_tpt[index])
|
||||
break;
|
||||
}
|
||||
search_tbl->current_rate = rate_n_flags_from_tbl(
|
||||
search_tbl, index, is_green);
|
||||
search_tbl->current_rate =
|
||||
rate_n_flags_from_tbl(priv, search_tbl,
|
||||
index, is_green);
|
||||
goto out;
|
||||
}
|
||||
tbl->action++;
|
||||
|
@ -1551,8 +1563,9 @@ static int rs_move_mimo_to_other(struct iwl_priv *priv,
|
|||
if (tpt >= search_tbl->expected_tpt[index])
|
||||
break;
|
||||
}
|
||||
search_tbl->current_rate = rate_n_flags_from_tbl(
|
||||
search_tbl, index, is_green);
|
||||
search_tbl->current_rate =
|
||||
rate_n_flags_from_tbl(priv, search_tbl,
|
||||
index, is_green);
|
||||
goto out;
|
||||
|
||||
}
|
||||
|
@ -1745,16 +1758,25 @@ static void rs_rate_scale_perform(struct iwl_priv *priv,
|
|||
rate_scale_index_msk = rate_mask;
|
||||
|
||||
if (!((1 << index) & rate_scale_index_msk)) {
|
||||
IWL_ERROR("Current Rate is not valid\n");
|
||||
IWL_ERR(priv, "Current Rate is not valid\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Get expected throughput table and history window for current rate */
|
||||
if (!tbl->expected_tpt) {
|
||||
IWL_ERROR("tbl->expected_tpt is NULL\n");
|
||||
IWL_ERR(priv, "tbl->expected_tpt is NULL\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* force user max rate if set by user */
|
||||
if ((lq_sta->max_rate_idx != -1) &&
|
||||
(lq_sta->max_rate_idx < index)) {
|
||||
index = lq_sta->max_rate_idx;
|
||||
update_lq = 1;
|
||||
window = &(tbl->win[index]);
|
||||
goto lq_update;
|
||||
}
|
||||
|
||||
window = &(tbl->win[index]);
|
||||
|
||||
/*
|
||||
|
@ -1846,6 +1868,11 @@ static void rs_rate_scale_perform(struct iwl_priv *priv,
|
|||
low = high_low & 0xff;
|
||||
high = (high_low >> 8) & 0xff;
|
||||
|
||||
/* If user set max rate, dont allow higher than user constrain */
|
||||
if ((lq_sta->max_rate_idx != -1) &&
|
||||
(lq_sta->max_rate_idx < high))
|
||||
high = IWL_RATE_INVALID;
|
||||
|
||||
sr = window->success_ratio;
|
||||
|
||||
/* Collect measured throughputs for current and adjacent rates */
|
||||
|
@ -1944,7 +1971,7 @@ static void rs_rate_scale_perform(struct iwl_priv *priv,
|
|||
lq_update:
|
||||
/* Replace uCode's rate table for the destination station. */
|
||||
if (update_lq) {
|
||||
rate = rate_n_flags_from_tbl(tbl, index, is_green);
|
||||
rate = rate_n_flags_from_tbl(priv, tbl, index, is_green);
|
||||
rs_fill_link_cmd(priv, lq_sta, rate);
|
||||
iwl_send_lq_cmd(priv, &lq_sta->lq, CMD_ASYNC);
|
||||
}
|
||||
|
@ -1993,7 +2020,7 @@ lq_update:
|
|||
* stay with best antenna legacy modulation for a while
|
||||
* before next round of mode comparisons. */
|
||||
tbl1 = &(lq_sta->lq_info[lq_sta->active_tbl]);
|
||||
if (is_legacy(tbl1->lq_type) && !conf->ht.enabled &&
|
||||
if (is_legacy(tbl1->lq_type) && !conf_is_ht(conf) &&
|
||||
lq_sta->action_counter >= 1) {
|
||||
lq_sta->action_counter = 0;
|
||||
IWL_DEBUG_RATE("LQ: STAY in legacy table\n");
|
||||
|
@ -2028,7 +2055,7 @@ lq_update:
|
|||
}
|
||||
|
||||
out:
|
||||
tbl->current_rate = rate_n_flags_from_tbl(tbl, index, is_green);
|
||||
tbl->current_rate = rate_n_flags_from_tbl(priv, tbl, index, is_green);
|
||||
i = index;
|
||||
lq_sta->last_txrate_idx = i;
|
||||
|
||||
|
@ -2081,7 +2108,7 @@ static void rs_initialize_lq(struct iwl_priv *priv,
|
|||
if (!rs_is_valid_ant(valid_tx_ant, tbl->ant_type))
|
||||
rs_toggle_antenna(valid_tx_ant, &rate, tbl);
|
||||
|
||||
rate = rate_n_flags_from_tbl(tbl, rate_idx, use_green);
|
||||
rate = rate_n_flags_from_tbl(priv, tbl, rate_idx, use_green);
|
||||
tbl->current_rate = rate;
|
||||
rs_set_expected_tpt_table(lq_sta, tbl);
|
||||
rs_fill_link_cmd(NULL, lq_sta, rate);
|
||||
|
@ -2106,6 +2133,17 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta, void *priv_sta,
|
|||
|
||||
IWL_DEBUG_RATE_LIMIT("rate scale calculate new rate for skb\n");
|
||||
|
||||
/* Get max rate if user set max rate */
|
||||
if (lq_sta) {
|
||||
lq_sta->max_rate_idx = txrc->max_rate_idx;
|
||||
if ((sband->band == IEEE80211_BAND_5GHZ) &&
|
||||
(lq_sta->max_rate_idx != -1))
|
||||
lq_sta->max_rate_idx += IWL_FIRST_OFDM_RATE;
|
||||
if ((lq_sta->max_rate_idx < 0) ||
|
||||
(lq_sta->max_rate_idx >= IWL_RATE_COUNT))
|
||||
lq_sta->max_rate_idx = -1;
|
||||
}
|
||||
|
||||
if (sta)
|
||||
mask_bit = sta->supp_rates[sband->band];
|
||||
|
||||
|
@ -2182,6 +2220,8 @@ static void rs_rate_init(void *priv_r, struct ieee80211_supported_band *sband,
|
|||
struct ieee80211_conf *conf = &priv->hw->conf;
|
||||
struct iwl_lq_sta *lq_sta = priv_sta;
|
||||
u16 mask_bit = 0;
|
||||
int count;
|
||||
int start_rate = 0;
|
||||
|
||||
lq_sta->flush_timer = 0;
|
||||
lq_sta->supp_rates = sta->supp_rates[sband->band];
|
||||
|
@ -2216,6 +2256,8 @@ static void rs_rate_init(void *priv_r, struct ieee80211_supported_band *sband,
|
|||
}
|
||||
|
||||
lq_sta->is_dup = 0;
|
||||
lq_sta->max_rate_idx = -1;
|
||||
lq_sta->missed_rate_counter = IWL_MISSED_RATE_MAX;
|
||||
lq_sta->is_green = rs_use_green(priv, conf);
|
||||
lq_sta->active_legacy_rate = priv->active_rate & ~(0x1000);
|
||||
lq_sta->active_rate_basic = priv->active_rate_basic;
|
||||
|
@ -2254,16 +2296,20 @@ static void rs_rate_init(void *priv_r, struct ieee80211_supported_band *sband,
|
|||
lq_sta->drv = priv;
|
||||
|
||||
/* Find highest tx rate supported by hardware and destination station */
|
||||
mask_bit = sta->supp_rates[sband->band] & lq_sta->active_legacy_rate;
|
||||
lq_sta->last_txrate_idx = 3;
|
||||
for (i = 0; i < sband->n_bitrates; i++)
|
||||
mask_bit = sta->supp_rates[sband->band];
|
||||
count = sband->n_bitrates;
|
||||
if (sband->band == IEEE80211_BAND_5GHZ) {
|
||||
count += IWL_FIRST_OFDM_RATE;
|
||||
start_rate = IWL_FIRST_OFDM_RATE;
|
||||
mask_bit <<= IWL_FIRST_OFDM_RATE;
|
||||
}
|
||||
|
||||
mask_bit = mask_bit & lq_sta->active_legacy_rate;
|
||||
lq_sta->last_txrate_idx = 4;
|
||||
for (i = start_rate; i < count; i++)
|
||||
if (mask_bit & BIT(i))
|
||||
lq_sta->last_txrate_idx = i;
|
||||
|
||||
/* For MODE_IEEE80211A, skip over cck rates in global rate table */
|
||||
if (sband->band == IEEE80211_BAND_5GHZ)
|
||||
lq_sta->last_txrate_idx += IWL_FIRST_OFDM_RATE;
|
||||
|
||||
rs_initialize_lq(priv, conf, sta, lq_sta);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2003 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -27,8 +27,6 @@
|
|||
#ifndef __iwl_agn_rs_h__
|
||||
#define __iwl_agn_rs_h__
|
||||
|
||||
#include "iwl-dev.h"
|
||||
|
||||
struct iwl_rate_info {
|
||||
u8 plcp; /* uCode API: IWL_RATE_6M_PLCP, etc. */
|
||||
u8 plcp_siso; /* uCode API: IWL_RATE_SISO_6M_PLCP, etc. */
|
||||
|
@ -43,6 +41,19 @@ struct iwl_rate_info {
|
|||
u8 next_rs_tgg; /* next rate used in TGG rs algo */
|
||||
};
|
||||
|
||||
struct iwl3945_rate_info {
|
||||
u8 plcp; /* uCode API: IWL_RATE_6M_PLCP, etc. */
|
||||
u8 ieee; /* MAC header: IWL_RATE_6M_IEEE, etc. */
|
||||
u8 prev_ieee; /* previous rate in IEEE speeds */
|
||||
u8 next_ieee; /* next rate in IEEE speeds */
|
||||
u8 prev_rs; /* previous rate used in rs algo */
|
||||
u8 next_rs; /* next rate used in rs algo */
|
||||
u8 prev_rs_tgg; /* previous rate used in TGG rs algo */
|
||||
u8 next_rs_tgg; /* next rate used in TGG rs algo */
|
||||
u8 table_rs_index; /* index in rate scale table cmd */
|
||||
u8 prev_table_rs; /* prev in rate table cmd */
|
||||
};
|
||||
|
||||
/*
|
||||
* These serve as indexes into
|
||||
* struct iwl_rate_info iwl_rates[IWL_RATE_COUNT];
|
||||
|
@ -62,12 +73,30 @@ enum {
|
|||
IWL_RATE_54M_INDEX,
|
||||
IWL_RATE_60M_INDEX,
|
||||
IWL_RATE_COUNT, /*FIXME:RS:change to IWL_RATE_INDEX_COUNT,*/
|
||||
IWL_RATE_COUNT_3945 = IWL_RATE_COUNT - 1,
|
||||
IWL_RATE_INVM_INDEX = IWL_RATE_COUNT,
|
||||
IWL_RATE_INVALID = IWL_RATE_COUNT,
|
||||
};
|
||||
|
||||
enum {
|
||||
IWL_RATE_6M_INDEX_TABLE = 0,
|
||||
IWL_RATE_9M_INDEX_TABLE,
|
||||
IWL_RATE_12M_INDEX_TABLE,
|
||||
IWL_RATE_18M_INDEX_TABLE,
|
||||
IWL_RATE_24M_INDEX_TABLE,
|
||||
IWL_RATE_36M_INDEX_TABLE,
|
||||
IWL_RATE_48M_INDEX_TABLE,
|
||||
IWL_RATE_54M_INDEX_TABLE,
|
||||
IWL_RATE_1M_INDEX_TABLE,
|
||||
IWL_RATE_2M_INDEX_TABLE,
|
||||
IWL_RATE_5M_INDEX_TABLE,
|
||||
IWL_RATE_11M_INDEX_TABLE,
|
||||
IWL_RATE_INVM_INDEX_TABLE = IWL_RATE_INVM_INDEX - 1,
|
||||
};
|
||||
|
||||
enum {
|
||||
IWL_FIRST_OFDM_RATE = IWL_RATE_6M_INDEX,
|
||||
IWL39_LAST_OFDM_RATE = IWL_RATE_54M_INDEX,
|
||||
IWL_LAST_OFDM_RATE = IWL_RATE_60M_INDEX,
|
||||
IWL_FIRST_CCK_RATE = IWL_RATE_1M_INDEX,
|
||||
IWL_LAST_CCK_RATE = IWL_RATE_11M_INDEX,
|
||||
|
@ -248,6 +277,7 @@ enum {
|
|||
#define TIME_WRAP_AROUND(x, y) (((y) > (x)) ? (y) - (x) : (0-(x)) + (y))
|
||||
|
||||
extern const struct iwl_rate_info iwl_rates[IWL_RATE_COUNT];
|
||||
extern const struct iwl3945_rate_info iwl3945_rates[IWL_RATE_COUNT_3945];
|
||||
|
||||
enum iwl_table_type {
|
||||
LQ_NONE,
|
||||
|
@ -303,6 +333,23 @@ static inline u8 iwl_get_prev_ieee_rate(u8 rate_index)
|
|||
return rate;
|
||||
}
|
||||
|
||||
static inline u8 iwl3945_get_prev_ieee_rate(u8 rate_index)
|
||||
{
|
||||
u8 rate = iwl3945_rates[rate_index].prev_ieee;
|
||||
|
||||
if (rate == IWL_RATE_INVALID)
|
||||
rate = rate_index;
|
||||
return rate;
|
||||
}
|
||||
|
||||
/**
|
||||
* iwl3945_rate_scale_init - Initialize the rate scale table based on assoc info
|
||||
*
|
||||
* The specific throughput table used is based on the type of network
|
||||
* the associated with, including A, B, G, and G w/ TGG protection
|
||||
*/
|
||||
extern void iwl3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id);
|
||||
|
||||
/**
|
||||
* iwl_rate_control_register - Register the rate control algorithm callbacks
|
||||
*
|
||||
|
@ -314,6 +361,7 @@ static inline u8 iwl_get_prev_ieee_rate(u8 rate_index)
|
|||
*
|
||||
*/
|
||||
extern int iwlagn_rate_control_register(void);
|
||||
extern int iwl3945_rate_control_register(void);
|
||||
|
||||
/**
|
||||
* iwl_rate_control_unregister - Unregister the rate control callbacks
|
||||
|
@ -322,5 +370,6 @@ extern int iwlagn_rate_control_register(void);
|
|||
* the driver is unloaded.
|
||||
*/
|
||||
extern void iwlagn_rate_control_unregister(void);
|
||||
extern void iwl3945_rate_control_unregister(void);
|
||||
|
||||
#endif /* __iwl_agn__rs__ */
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2008 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -30,7 +30,7 @@
|
|||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -102,7 +102,7 @@ int iwl_send_calib_results(struct iwl_priv *priv)
|
|||
|
||||
return 0;
|
||||
err:
|
||||
IWL_ERROR("Error %d iteration %d\n", ret, i);
|
||||
IWL_ERR(priv, "Error %d iteration %d\n", ret, i);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_send_calib_results);
|
||||
|
@ -483,7 +483,7 @@ static int iwl_sensitivity_write(struct iwl_priv *priv)
|
|||
|
||||
ret = iwl_send_cmd(priv, &cmd_out);
|
||||
if (ret)
|
||||
IWL_ERROR("SENSITIVITY_CMD failed\n");
|
||||
IWL_ERR(priv, "SENSITIVITY_CMD failed\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2008 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -30,7 +30,7 @@
|
|||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -30,7 +30,7 @@
|
|||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -69,12 +69,20 @@
|
|||
#ifndef __iwl_commands_h__
|
||||
#define __iwl_commands_h__
|
||||
|
||||
struct iwl_priv;
|
||||
|
||||
/* uCode version contains 4 values: Major/Minor/API/Serial */
|
||||
#define IWL_UCODE_MAJOR(ver) (((ver) & 0xFF000000) >> 24)
|
||||
#define IWL_UCODE_MINOR(ver) (((ver) & 0x00FF0000) >> 16)
|
||||
#define IWL_UCODE_API(ver) (((ver) & 0x0000FF00) >> 8)
|
||||
#define IWL_UCODE_SERIAL(ver) ((ver) & 0x000000FF)
|
||||
|
||||
|
||||
/* Tx rates */
|
||||
#define IWL_CCK_RATES 4
|
||||
#define IWL_OFDM_RATES 8
|
||||
#define IWL_MAX_RATES (IWL_CCK_RATES + IWL_OFDM_RATES)
|
||||
|
||||
enum {
|
||||
REPLY_ALIVE = 0x1,
|
||||
REPLY_ERROR = 0x2,
|
||||
|
@ -219,6 +227,37 @@ struct iwl_cmd_header {
|
|||
u8 data[0];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
|
||||
/**
|
||||
* struct iwl3945_tx_power
|
||||
*
|
||||
* Used in REPLY_TX_PWR_TABLE_CMD, REPLY_SCAN_CMD, REPLY_CHANNEL_SWITCH
|
||||
*
|
||||
* Each entry contains two values:
|
||||
* 1) DSP gain (or sometimes called DSP attenuation). This is a fine-grained
|
||||
* linear value that multiplies the output of the digital signal processor,
|
||||
* before being sent to the analog radio.
|
||||
* 2) Radio gain. This sets the analog gain of the radio Tx path.
|
||||
* It is a coarser setting, and behaves in a logarithmic (dB) fashion.
|
||||
*
|
||||
* Driver obtains values from struct iwl3945_tx_power power_gain_table[][].
|
||||
*/
|
||||
struct iwl3945_tx_power {
|
||||
u8 tx_gain; /* gain for analog radio */
|
||||
u8 dsp_atten; /* gain for DSP */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/**
|
||||
* struct iwl3945_power_per_rate
|
||||
*
|
||||
* Used in REPLY_TX_PWR_TABLE_CMD, REPLY_CHANNEL_SWITCH
|
||||
*/
|
||||
struct iwl3945_power_per_rate {
|
||||
u8 rate; /* plcp */
|
||||
struct iwl3945_tx_power tpc;
|
||||
u8 reserved;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/**
|
||||
* iwlagn rate_n_flags bit fields
|
||||
*
|
||||
|
@ -300,11 +339,12 @@ struct iwl_cmd_header {
|
|||
* 5350 has 3 transmitters
|
||||
* bit14:16
|
||||
*/
|
||||
#define RATE_MCS_ANT_POS 14
|
||||
#define RATE_MCS_ANT_A_MSK 0x04000
|
||||
#define RATE_MCS_ANT_B_MSK 0x08000
|
||||
#define RATE_MCS_ANT_C_MSK 0x10000
|
||||
#define RATE_MCS_ANT_ABC_MSK 0x1C000
|
||||
#define RATE_MCS_ANT_POS 14
|
||||
#define RATE_MCS_ANT_A_MSK 0x04000
|
||||
#define RATE_MCS_ANT_B_MSK 0x08000
|
||||
#define RATE_MCS_ANT_C_MSK 0x10000
|
||||
#define RATE_MCS_ANT_AB_MSK (RATE_MCS_ANT_A_MSK | RATE_MCS_ANT_B_MSK)
|
||||
#define RATE_MCS_ANT_ABC_MSK (RATE_MCS_ANT_AB_MSK | RATE_MCS_ANT_C_MSK)
|
||||
#define RATE_ANT_NUM 3
|
||||
|
||||
#define POWER_TABLE_NUM_ENTRIES 33
|
||||
|
@ -492,8 +532,6 @@ struct iwl_alive_resp {
|
|||
__le32 is_valid;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* REPLY_ERROR = 0x2 (response only, not a command)
|
||||
*/
|
||||
|
@ -525,6 +563,7 @@ enum {
|
|||
|
||||
|
||||
#define RXON_RX_CHAIN_DRIVER_FORCE_MSK cpu_to_le16(0x1 << 0)
|
||||
#define RXON_RX_CHAIN_DRIVER_FORCE_POS (0)
|
||||
#define RXON_RX_CHAIN_VALID_MSK cpu_to_le16(0x7 << 1)
|
||||
#define RXON_RX_CHAIN_VALID_POS (1)
|
||||
#define RXON_RX_CHAIN_FORCE_SEL_MSK cpu_to_le16(0x7 << 4)
|
||||
|
@ -611,6 +650,26 @@ enum {
|
|||
* issue a new REPLY_TX_PWR_TABLE_CMD after each REPLY_RXON (0x10),
|
||||
* regardless of whether RXON_FILTER_ASSOC_MSK is set.
|
||||
*/
|
||||
|
||||
struct iwl3945_rxon_cmd {
|
||||
u8 node_addr[6];
|
||||
__le16 reserved1;
|
||||
u8 bssid_addr[6];
|
||||
__le16 reserved2;
|
||||
u8 wlap_bssid_addr[6];
|
||||
__le16 reserved3;
|
||||
u8 dev_type;
|
||||
u8 air_propagation;
|
||||
__le16 reserved4;
|
||||
u8 ofdm_basic_rates;
|
||||
u8 cck_basic_rates;
|
||||
__le16 assoc_id;
|
||||
__le32 flags;
|
||||
__le32 filter_flags;
|
||||
__le16 channel;
|
||||
__le16 reserved5;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl4965_rxon_cmd {
|
||||
u8 node_addr[6];
|
||||
__le16 reserved1;
|
||||
|
@ -656,6 +715,28 @@ struct iwl_rxon_cmd {
|
|||
__le16 reserved6;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/*
|
||||
* REPLY_RXON_ASSOC = 0x11 (command, has simple generic response)
|
||||
*/
|
||||
struct iwl3945_rxon_assoc_cmd {
|
||||
__le32 flags;
|
||||
__le32 filter_flags;
|
||||
u8 ofdm_basic_rates;
|
||||
u8 cck_basic_rates;
|
||||
__le16 reserved;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl4965_rxon_assoc_cmd {
|
||||
__le32 flags;
|
||||
__le32 filter_flags;
|
||||
u8 ofdm_basic_rates;
|
||||
u8 cck_basic_rates;
|
||||
u8 ofdm_ht_single_stream_basic_rates;
|
||||
u8 ofdm_ht_dual_stream_basic_rates;
|
||||
__le16 rx_chain_select_flags;
|
||||
__le16 reserved;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl5000_rxon_assoc_cmd {
|
||||
__le32 flags;
|
||||
__le32 filter_flags;
|
||||
|
@ -671,20 +752,6 @@ struct iwl5000_rxon_assoc_cmd {
|
|||
__le32 reserved3;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/*
|
||||
* REPLY_RXON_ASSOC = 0x11 (command, has simple generic response)
|
||||
*/
|
||||
struct iwl4965_rxon_assoc_cmd {
|
||||
__le32 flags;
|
||||
__le32 filter_flags;
|
||||
u8 ofdm_basic_rates;
|
||||
u8 cck_basic_rates;
|
||||
u8 ofdm_ht_single_stream_basic_rates;
|
||||
u8 ofdm_ht_dual_stream_basic_rates;
|
||||
__le16 rx_chain_select_flags;
|
||||
__le16 reserved;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define IWL_CONN_MAX_LISTEN_INTERVAL 10
|
||||
|
||||
/*
|
||||
|
@ -702,6 +769,16 @@ struct iwl_rxon_time_cmd {
|
|||
/*
|
||||
* REPLY_CHANNEL_SWITCH = 0x72 (command, has simple generic response)
|
||||
*/
|
||||
struct iwl3945_channel_switch_cmd {
|
||||
u8 band;
|
||||
u8 expect_beacon;
|
||||
__le16 channel;
|
||||
__le32 rxon_flags;
|
||||
__le32 rxon_filter_flags;
|
||||
__le32 switch_time;
|
||||
struct iwl3945_power_per_rate power[IWL_MAX_RATES];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl_channel_switch_cmd {
|
||||
u8 band;
|
||||
u8 expect_beacon;
|
||||
|
@ -783,6 +860,8 @@ struct iwl_qosparam_cmd {
|
|||
#define IWL_AP_ID 0
|
||||
#define IWL_MULTICAST_ID 1
|
||||
#define IWL_STA_ID 2
|
||||
#define IWL3945_BROADCAST_ID 24
|
||||
#define IWL3945_STATION_COUNT 25
|
||||
#define IWL4965_BROADCAST_ID 31
|
||||
#define IWL4965_STATION_COUNT 32
|
||||
#define IWL5000_BROADCAST_ID 15
|
||||
|
@ -791,6 +870,8 @@ struct iwl_qosparam_cmd {
|
|||
#define IWL_STATION_COUNT 32 /* MAX(3945,4965)*/
|
||||
#define IWL_INVALID_STATION 255
|
||||
|
||||
#define STA_FLG_TX_RATE_MSK cpu_to_le32(1 << 2);
|
||||
#define STA_FLG_PWR_SAVE_MSK cpu_to_le32(1 << 8);
|
||||
#define STA_FLG_PWR_SAVE_MSK cpu_to_le32(1 << 8);
|
||||
#define STA_FLG_RTS_MIMO_PROT_MSK cpu_to_le32(1 << 17)
|
||||
#define STA_FLG_AGG_MPDU_8US_MSK cpu_to_le32(1 << 18)
|
||||
|
@ -901,6 +982,35 @@ struct sta_id_modify {
|
|||
* used as AP, or in an IBSS network, driver must set up station table
|
||||
* entries for all STAs in network, starting with index IWL_STA_ID.
|
||||
*/
|
||||
|
||||
struct iwl3945_addsta_cmd {
|
||||
u8 mode; /* 1: modify existing, 0: add new station */
|
||||
u8 reserved[3];
|
||||
struct sta_id_modify sta;
|
||||
struct iwl4965_keyinfo key;
|
||||
__le32 station_flags; /* STA_FLG_* */
|
||||
__le32 station_flags_msk; /* STA_FLG_* */
|
||||
|
||||
/* bit field to disable (1) or enable (0) Tx for Traffic ID (TID)
|
||||
* corresponding to bit (e.g. bit 5 controls TID 5).
|
||||
* Set modify_mask bit STA_MODIFY_TID_DISABLE_TX to use this field. */
|
||||
__le16 tid_disable_tx;
|
||||
|
||||
__le16 rate_n_flags;
|
||||
|
||||
/* TID for which to add block-ack support.
|
||||
* Set modify_mask bit STA_MODIFY_ADDBA_TID_MSK to use this field. */
|
||||
u8 add_immediate_ba_tid;
|
||||
|
||||
/* TID for which to remove block-ack support.
|
||||
* Set modify_mask bit STA_MODIFY_DELBA_TID_MSK to use this field. */
|
||||
u8 remove_immediate_ba_tid;
|
||||
|
||||
/* Starting Sequence Number for added block-ack support.
|
||||
* Set modify_mask bit STA_MODIFY_ADDBA_TID_MSK to use this field. */
|
||||
__le16 add_immediate_ba_ssn;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl4965_addsta_cmd {
|
||||
u8 mode; /* 1: modify existing, 0: add new station */
|
||||
u8 reserved[3];
|
||||
|
@ -1054,6 +1164,48 @@ struct iwl_wep_cmd {
|
|||
#define RX_MPDU_RES_STATUS_TTAK_OK (1 << 7)
|
||||
#define RX_MPDU_RES_STATUS_DEC_DONE_MSK (0x800)
|
||||
|
||||
|
||||
struct iwl3945_rx_frame_stats {
|
||||
u8 phy_count;
|
||||
u8 id;
|
||||
u8 rssi;
|
||||
u8 agc;
|
||||
__le16 sig_avg;
|
||||
__le16 noise_diff;
|
||||
u8 payload[0];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl3945_rx_frame_hdr {
|
||||
__le16 channel;
|
||||
__le16 phy_flags;
|
||||
u8 reserved1;
|
||||
u8 rate;
|
||||
__le16 len;
|
||||
u8 payload[0];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl3945_rx_frame_end {
|
||||
__le32 status;
|
||||
__le64 timestamp;
|
||||
__le32 beacon_timestamp;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/*
|
||||
* REPLY_3945_RX = 0x1b (response only, not a command)
|
||||
*
|
||||
* NOTE: DO NOT dereference from casts to this structure
|
||||
* It is provided only for calculating minimum data set size.
|
||||
* The actual offsets of the hdr and end are dynamic based on
|
||||
* stats.phy_count
|
||||
*/
|
||||
struct iwl3945_rx_frame {
|
||||
struct iwl3945_rx_frame_stats stats;
|
||||
struct iwl3945_rx_frame_hdr hdr;
|
||||
struct iwl3945_rx_frame_end end;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define IWL39_RX_FRAME_SIZE (4 + sizeof(struct iwl3945_rx_frame))
|
||||
|
||||
/* Fixed (non-configurable) rx data from phy */
|
||||
|
||||
#define IWL49_RX_RES_PHY_CNT 14
|
||||
|
@ -1233,6 +1385,84 @@ struct iwl4965_rx_mpdu_res_start {
|
|||
#define CCMP_MIC_LEN 8
|
||||
#define TKIP_ICV_LEN 4
|
||||
|
||||
/*
|
||||
* REPLY_TX = 0x1c (command)
|
||||
*/
|
||||
|
||||
struct iwl3945_tx_cmd {
|
||||
/*
|
||||
* MPDU byte count:
|
||||
* MAC header (24/26/30/32 bytes) + 2 bytes pad if 26/30 header size,
|
||||
* + 8 byte IV for CCM or TKIP (not used for WEP)
|
||||
* + Data payload
|
||||
* + 8-byte MIC (not used for CCM/WEP)
|
||||
* NOTE: Does not include Tx command bytes, post-MAC pad bytes,
|
||||
* MIC (CCM) 8 bytes, ICV (WEP/TKIP/CKIP) 4 bytes, CRC 4 bytes.i
|
||||
* Range: 14-2342 bytes.
|
||||
*/
|
||||
__le16 len;
|
||||
|
||||
/*
|
||||
* MPDU or MSDU byte count for next frame.
|
||||
* Used for fragmentation and bursting, but not 11n aggregation.
|
||||
* Same as "len", but for next frame. Set to 0 if not applicable.
|
||||
*/
|
||||
__le16 next_frame_len;
|
||||
|
||||
__le32 tx_flags; /* TX_CMD_FLG_* */
|
||||
|
||||
u8 rate;
|
||||
|
||||
/* Index of recipient station in uCode's station table */
|
||||
u8 sta_id;
|
||||
u8 tid_tspec;
|
||||
u8 sec_ctl;
|
||||
u8 key[16];
|
||||
union {
|
||||
u8 byte[8];
|
||||
__le16 word[4];
|
||||
__le32 dw[2];
|
||||
} tkip_mic;
|
||||
__le32 next_frame_info;
|
||||
union {
|
||||
__le32 life_time;
|
||||
__le32 attempt;
|
||||
} stop_time;
|
||||
u8 supp_rates[2];
|
||||
u8 rts_retry_limit; /*byte 50 */
|
||||
u8 data_retry_limit; /*byte 51 */
|
||||
union {
|
||||
__le16 pm_frame_timeout;
|
||||
__le16 attempt_duration;
|
||||
} timeout;
|
||||
|
||||
/*
|
||||
* Duration of EDCA burst Tx Opportunity, in 32-usec units.
|
||||
* Set this if txop time is not specified by HCCA protocol (e.g. by AP).
|
||||
*/
|
||||
__le16 driver_txop;
|
||||
|
||||
/*
|
||||
* MAC header goes here, followed by 2 bytes padding if MAC header
|
||||
* length is 26 or 30 bytes, followed by payload data
|
||||
*/
|
||||
u8 payload[0];
|
||||
struct ieee80211_hdr hdr[0];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/*
|
||||
* REPLY_TX = 0x1c (response)
|
||||
*/
|
||||
struct iwl3945_tx_resp {
|
||||
u8 failure_rts;
|
||||
u8 failure_frame;
|
||||
u8 bt_kill_count;
|
||||
u8 rate;
|
||||
__le32 wireless_media_time;
|
||||
__le32 status; /* TX status */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
|
||||
/*
|
||||
* 4965 uCode updates these Tx attempt count values in host DRAM.
|
||||
* Used for managing Tx retries when expecting block-acks.
|
||||
|
@ -1244,9 +1474,6 @@ struct iwl_dram_scratch {
|
|||
__le16 reserved;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/*
|
||||
* REPLY_TX = 0x1c (command)
|
||||
*/
|
||||
struct iwl_tx_cmd {
|
||||
/*
|
||||
* MPDU byte count:
|
||||
|
@ -1584,6 +1811,14 @@ struct iwl_compressed_ba_resp {
|
|||
*
|
||||
* See details under "TXPOWER" in iwl-4965-hw.h.
|
||||
*/
|
||||
|
||||
struct iwl3945_txpowertable_cmd {
|
||||
u8 band; /* 0: 5 GHz, 1: 2.4 GHz */
|
||||
u8 reserved;
|
||||
__le16 channel;
|
||||
struct iwl3945_power_per_rate power[IWL_MAX_RATES];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl4965_txpowertable_cmd {
|
||||
u8 band; /* 0: 5 GHz, 1: 2.4 GHz */
|
||||
u8 reserved;
|
||||
|
@ -1591,6 +1826,35 @@ struct iwl4965_txpowertable_cmd {
|
|||
struct iwl4965_tx_power_db tx_power;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
|
||||
/**
|
||||
* struct iwl3945_rate_scaling_cmd - Rate Scaling Command & Response
|
||||
*
|
||||
* REPLY_RATE_SCALE = 0x47 (command, has simple generic response)
|
||||
*
|
||||
* NOTE: The table of rates passed to the uCode via the
|
||||
* RATE_SCALE command sets up the corresponding order of
|
||||
* rates used for all related commands, including rate
|
||||
* masks, etc.
|
||||
*
|
||||
* For example, if you set 9MB (PLCP 0x0f) as the first
|
||||
* rate in the rate table, the bit mask for that rate
|
||||
* when passed through ofdm_basic_rates on the REPLY_RXON
|
||||
* command would be bit 0 (1 << 0)
|
||||
*/
|
||||
struct iwl3945_rate_scaling_info {
|
||||
__le16 rate_n_flags;
|
||||
u8 try_cnt;
|
||||
u8 next_rate_index;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl3945_rate_scaling_cmd {
|
||||
u8 table_id;
|
||||
u8 reserved[3];
|
||||
struct iwl3945_rate_scaling_info table[IWL_MAX_RATES];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
|
||||
/*RS_NEW_API: only TLC_RTS remains and moved to bit 0 */
|
||||
#define LINK_QUAL_FLAGS_SET_STA_TLC_RTS_MSK (1 << 0)
|
||||
|
||||
|
@ -2044,15 +2308,23 @@ struct iwl_spectrum_notification {
|
|||
*/
|
||||
#define IWL_POWER_VEC_SIZE 5
|
||||
|
||||
#define IWL_POWER_DRIVER_ALLOW_SLEEP_MSK cpu_to_le16(1 << 0)
|
||||
#define IWL_POWER_SLEEP_OVER_DTIM_MSK cpu_to_le16(1 << 2)
|
||||
#define IWL_POWER_PCI_PM_MSK cpu_to_le16(1 << 3)
|
||||
#define IWL_POWER_FAST_PD cpu_to_le16(1 << 4)
|
||||
#define IWL_POWER_DRIVER_ALLOW_SLEEP_MSK cpu_to_le16(BIT(0))
|
||||
#define IWL_POWER_SLEEP_OVER_DTIM_MSK cpu_to_le16(BIT(2))
|
||||
#define IWL_POWER_PCI_PM_MSK cpu_to_le16(BIT(3))
|
||||
#define IWL_POWER_FAST_PD cpu_to_le16(BIT(4))
|
||||
|
||||
struct iwl3945_powertable_cmd {
|
||||
__le16 flags;
|
||||
u8 reserved[2];
|
||||
__le32 rx_data_timeout;
|
||||
__le32 tx_data_timeout;
|
||||
__le32 sleep_interval[IWL_POWER_VEC_SIZE];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl_powertable_cmd {
|
||||
__le16 flags;
|
||||
u8 keep_alive_seconds;
|
||||
u8 debug_flags;
|
||||
u8 keep_alive_seconds; /* 3945 reserved */
|
||||
u8 debug_flags; /* 3945 reserved */
|
||||
__le32 rx_data_timeout;
|
||||
__le32 tx_data_timeout;
|
||||
__le32 sleep_interval[IWL_POWER_VEC_SIZE];
|
||||
|
@ -2143,6 +2415,26 @@ struct iwl_ct_kill_config {
|
|||
* passive_dwell < max_out_time
|
||||
* active_dwell < max_out_time
|
||||
*/
|
||||
|
||||
/* FIXME: rename to AP1, remove tpc */
|
||||
struct iwl3945_scan_channel {
|
||||
/*
|
||||
* type is defined as:
|
||||
* 0:0 1 = active, 0 = passive
|
||||
* 1:4 SSID direct bit map; if a bit is set, then corresponding
|
||||
* SSID IE is transmitted in probe request.
|
||||
* 5:7 reserved
|
||||
*/
|
||||
u8 type;
|
||||
u8 channel; /* band is selected by iwl3945_scan_cmd "flags" field */
|
||||
struct iwl3945_tx_power tpc;
|
||||
__le16 active_dwell; /* in 1024-uSec TU (time units), typ 5-50 */
|
||||
__le16 passive_dwell; /* in 1024-uSec TU (time units), typ 20-500 */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* set number of direct probes u8 type */
|
||||
#define IWL39_SCAN_PROBE_MASK(n) ((BIT(n) | (BIT(n) - BIT(1))))
|
||||
|
||||
struct iwl_scan_channel {
|
||||
/*
|
||||
* type is defined as:
|
||||
|
@ -2159,6 +2451,9 @@ struct iwl_scan_channel {
|
|||
__le16 passive_dwell; /* in 1024-uSec TU (time units), typ 20-500 */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* set number of direct probes __le32 type */
|
||||
#define IWL_SCAN_PROBE_MASK(n) cpu_to_le32((BIT(n) | (BIT(n) - BIT(1))))
|
||||
|
||||
/**
|
||||
* struct iwl_ssid_ie - directed scan network information element
|
||||
*
|
||||
|
@ -2172,6 +2467,7 @@ struct iwl_ssid_ie {
|
|||
u8 ssid[32];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define PROBE_OPTION_MAX_API1 0x4
|
||||
#define PROBE_OPTION_MAX 0x14
|
||||
#define TX_CMD_LIFE_TIME_INFINITE cpu_to_le32(0xFFFFFFFF)
|
||||
#define IWL_GOOD_CRC_TH cpu_to_le16(1)
|
||||
|
@ -2229,6 +2525,51 @@ struct iwl_ssid_ie {
|
|||
* To avoid uCode errors, see timing restrictions described under
|
||||
* struct iwl_scan_channel.
|
||||
*/
|
||||
|
||||
struct iwl3945_scan_cmd {
|
||||
__le16 len;
|
||||
u8 reserved0;
|
||||
u8 channel_count; /* # channels in channel list */
|
||||
__le16 quiet_time; /* dwell only this # millisecs on quiet channel
|
||||
* (only for active scan) */
|
||||
__le16 quiet_plcp_th; /* quiet chnl is < this # pkts (typ. 1) */
|
||||
__le16 good_CRC_th; /* passive -> active promotion threshold */
|
||||
__le16 reserved1;
|
||||
__le32 max_out_time; /* max usec to be away from associated (service)
|
||||
* channel */
|
||||
__le32 suspend_time; /* pause scan this long (in "extended beacon
|
||||
* format") when returning to service channel:
|
||||
* 3945; 31:24 # beacons, 19:0 additional usec,
|
||||
* 4965; 31:22 # beacons, 21:0 additional usec.
|
||||
*/
|
||||
__le32 flags; /* RXON_FLG_* */
|
||||
__le32 filter_flags; /* RXON_FILTER_* */
|
||||
|
||||
/* For active scans (set to all-0s for passive scans).
|
||||
* Does not include payload. Must specify Tx rate; no rate scaling. */
|
||||
struct iwl3945_tx_cmd tx_cmd;
|
||||
|
||||
/* For directed active scans (set to all-0s otherwise) */
|
||||
struct iwl_ssid_ie direct_scan[PROBE_OPTION_MAX_API1];
|
||||
|
||||
/*
|
||||
* Probe request frame, followed by channel list.
|
||||
*
|
||||
* Size of probe request frame is specified by byte count in tx_cmd.
|
||||
* Channel list follows immediately after probe request frame.
|
||||
* Number of channels in list is specified by channel_count.
|
||||
* Each channel in list is of type:
|
||||
*
|
||||
* struct iwl3945_scan_channel channels[0];
|
||||
*
|
||||
* NOTE: Only one band of channels can be scanned per pass. You
|
||||
* must not mix 2.4GHz channels and 5.2GHz channels, and you must wait
|
||||
* for one scan to complete (i.e. receive SCAN_COMPLETE_NOTIFICATION)
|
||||
* before requesting another scan.
|
||||
*/
|
||||
u8 data[0];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl_scan_cmd {
|
||||
__le16 len;
|
||||
u8 reserved0;
|
||||
|
@ -2336,6 +2677,14 @@ struct iwl_scancomplete_notification {
|
|||
/*
|
||||
* BEACON_NOTIFICATION = 0x90 (notification only, not a command)
|
||||
*/
|
||||
|
||||
struct iwl3945_beacon_notif {
|
||||
struct iwl3945_tx_resp beacon_notify_hdr;
|
||||
__le32 low_tsf;
|
||||
__le32 high_tsf;
|
||||
__le32 ibss_mgr_status;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl4965_beacon_notif {
|
||||
struct iwl4965_tx_resp beacon_notify_hdr;
|
||||
__le32 low_tsf;
|
||||
|
@ -2346,6 +2695,15 @@ struct iwl4965_beacon_notif {
|
|||
/*
|
||||
* REPLY_TX_BEACON = 0x91 (command, has simple generic response)
|
||||
*/
|
||||
|
||||
struct iwl3945_tx_beacon_cmd {
|
||||
struct iwl3945_tx_cmd tx;
|
||||
__le16 tim_idx;
|
||||
u8 tim_size;
|
||||
u8 reserved1;
|
||||
struct ieee80211_hdr frame[0]; /* beacon frame */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl_tx_beacon_cmd {
|
||||
struct iwl_tx_cmd tx;
|
||||
__le16 tim_idx;
|
||||
|
@ -2382,6 +2740,76 @@ struct rate_histogram {
|
|||
|
||||
/* statistics command response */
|
||||
|
||||
struct iwl39_statistics_rx_phy {
|
||||
__le32 ina_cnt;
|
||||
__le32 fina_cnt;
|
||||
__le32 plcp_err;
|
||||
__le32 crc32_err;
|
||||
__le32 overrun_err;
|
||||
__le32 early_overrun_err;
|
||||
__le32 crc32_good;
|
||||
__le32 false_alarm_cnt;
|
||||
__le32 fina_sync_err_cnt;
|
||||
__le32 sfd_timeout;
|
||||
__le32 fina_timeout;
|
||||
__le32 unresponded_rts;
|
||||
__le32 rxe_frame_limit_overrun;
|
||||
__le32 sent_ack_cnt;
|
||||
__le32 sent_cts_cnt;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl39_statistics_rx_non_phy {
|
||||
__le32 bogus_cts; /* CTS received when not expecting CTS */
|
||||
__le32 bogus_ack; /* ACK received when not expecting ACK */
|
||||
__le32 non_bssid_frames; /* number of frames with BSSID that
|
||||
* doesn't belong to the STA BSSID */
|
||||
__le32 filtered_frames; /* count frames that were dumped in the
|
||||
* filtering process */
|
||||
__le32 non_channel_beacons; /* beacons with our bss id but not on
|
||||
* our serving channel */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl39_statistics_rx {
|
||||
struct iwl39_statistics_rx_phy ofdm;
|
||||
struct iwl39_statistics_rx_phy cck;
|
||||
struct iwl39_statistics_rx_non_phy general;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl39_statistics_tx {
|
||||
__le32 preamble_cnt;
|
||||
__le32 rx_detected_cnt;
|
||||
__le32 bt_prio_defer_cnt;
|
||||
__le32 bt_prio_kill_cnt;
|
||||
__le32 few_bytes_cnt;
|
||||
__le32 cts_timeout;
|
||||
__le32 ack_timeout;
|
||||
__le32 expected_ack_cnt;
|
||||
__le32 actual_ack_cnt;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct statistics_dbg {
|
||||
__le32 burst_check;
|
||||
__le32 burst_count;
|
||||
__le32 reserved[4];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl39_statistics_div {
|
||||
__le32 tx_on_a;
|
||||
__le32 tx_on_b;
|
||||
__le32 exec_time;
|
||||
__le32 probe_time;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl39_statistics_general {
|
||||
__le32 temperature;
|
||||
struct statistics_dbg dbg;
|
||||
__le32 sleep_time;
|
||||
__le32 slots_out;
|
||||
__le32 slots_idle;
|
||||
__le32 ttl_timestamp;
|
||||
struct iwl39_statistics_div div;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct statistics_rx_phy {
|
||||
__le32 ina_cnt;
|
||||
__le32 fina_cnt;
|
||||
|
@ -2493,11 +2921,6 @@ struct statistics_tx {
|
|||
struct statistics_tx_non_phy_agg agg;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct statistics_dbg {
|
||||
__le32 burst_check;
|
||||
__le32 burst_count;
|
||||
__le32 reserved[4];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct statistics_div {
|
||||
__le32 tx_on_a;
|
||||
|
@ -2561,6 +2984,14 @@ struct iwl_statistics_cmd {
|
|||
*/
|
||||
#define STATISTICS_REPLY_FLG_BAND_24G_MSK cpu_to_le32(0x2)
|
||||
#define STATISTICS_REPLY_FLG_FAT_MODE_MSK cpu_to_le32(0x8)
|
||||
|
||||
struct iwl3945_notif_statistics {
|
||||
__le32 flag;
|
||||
struct iwl39_statistics_rx rx;
|
||||
struct iwl39_statistics_tx tx;
|
||||
struct iwl39_statistics_general general;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl_notif_statistics {
|
||||
__le32 flag;
|
||||
struct statistics_rx rx;
|
||||
|
@ -3012,6 +3443,10 @@ struct iwl_rx_packet {
|
|||
__le32 len;
|
||||
struct iwl_cmd_header hdr;
|
||||
union {
|
||||
struct iwl3945_rx_frame rx_frame;
|
||||
struct iwl3945_tx_resp tx_resp;
|
||||
struct iwl3945_beacon_notif beacon_status;
|
||||
|
||||
struct iwl_alive_resp alive_frame;
|
||||
struct iwl_spectrum_notification spectrum_notif;
|
||||
struct iwl_csa_notification csa_notif;
|
||||
|
@ -3029,6 +3464,6 @@ struct iwl_rx_packet {
|
|||
} u;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
int iwl_agn_check_rxon_cmd(struct iwl_rxon_cmd *rxon);
|
||||
int iwl_agn_check_rxon_cmd(struct iwl_priv *priv);
|
||||
|
||||
#endif /* __iwl_commands_h__ */
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2008 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -170,7 +170,8 @@ struct ieee80211_hw *iwl_alloc_all(struct iwl_cfg *cfg,
|
|||
struct ieee80211_hw *hw =
|
||||
ieee80211_alloc_hw(sizeof(struct iwl_priv), hw_ops);
|
||||
if (hw == NULL) {
|
||||
IWL_ERROR("Can not allocate network device\n");
|
||||
printk(KERN_ERR "%s: Can not allocate network device\n",
|
||||
cfg->name);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
@ -210,7 +211,7 @@ int iwl_hw_nic_init(struct iwl_priv *priv)
|
|||
if (!rxq->bd) {
|
||||
ret = iwl_rx_queue_alloc(priv);
|
||||
if (ret) {
|
||||
IWL_ERROR("Unable to initialize Rx queue\n");
|
||||
IWL_ERR(priv, "Unable to initialize Rx queue\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
} else
|
||||
|
@ -405,7 +406,7 @@ static void iwlcore_init_hw_rates(struct iwl_priv *priv,
|
|||
/**
|
||||
* iwlcore_init_geos - Initialize mac80211's geo/channel info based from eeprom
|
||||
*/
|
||||
static int iwlcore_init_geos(struct iwl_priv *priv)
|
||||
int iwlcore_init_geos(struct iwl_priv *priv)
|
||||
{
|
||||
struct iwl_channel_info *ch;
|
||||
struct ieee80211_supported_band *sband;
|
||||
|
@ -457,8 +458,6 @@ static int iwlcore_init_geos(struct iwl_priv *priv)
|
|||
priv->ieee_channels = channels;
|
||||
priv->ieee_rates = rates;
|
||||
|
||||
iwlcore_init_hw_rates(priv, rates);
|
||||
|
||||
for (i = 0; i < priv->channel_count; i++) {
|
||||
ch = &priv->channel_info[i];
|
||||
|
||||
|
@ -510,33 +509,33 @@ static int iwlcore_init_geos(struct iwl_priv *priv)
|
|||
|
||||
if ((priv->bands[IEEE80211_BAND_5GHZ].n_channels == 0) &&
|
||||
priv->cfg->sku & IWL_SKU_A) {
|
||||
printk(KERN_INFO DRV_NAME
|
||||
": Incorrectly detected BG card as ABG. Please send "
|
||||
"your PCI ID 0x%04X:0x%04X to maintainer.\n",
|
||||
priv->pci_dev->device, priv->pci_dev->subsystem_device);
|
||||
IWL_INFO(priv, "Incorrectly detected BG card as ABG. "
|
||||
"Please send your PCI ID 0x%04X:0x%04X to maintainer.\n",
|
||||
priv->pci_dev->device,
|
||||
priv->pci_dev->subsystem_device);
|
||||
priv->cfg->sku &= ~IWL_SKU_A;
|
||||
}
|
||||
|
||||
printk(KERN_INFO DRV_NAME
|
||||
": Tunable channels: %d 802.11bg, %d 802.11a channels\n",
|
||||
priv->bands[IEEE80211_BAND_2GHZ].n_channels,
|
||||
priv->bands[IEEE80211_BAND_5GHZ].n_channels);
|
||||
|
||||
IWL_INFO(priv, "Tunable channels: %d 802.11bg, %d 802.11a channels\n",
|
||||
priv->bands[IEEE80211_BAND_2GHZ].n_channels,
|
||||
priv->bands[IEEE80211_BAND_5GHZ].n_channels);
|
||||
|
||||
set_bit(STATUS_GEO_CONFIGURED, &priv->status);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(iwlcore_init_geos);
|
||||
|
||||
/*
|
||||
* iwlcore_free_geos - undo allocations in iwlcore_init_geos
|
||||
*/
|
||||
static void iwlcore_free_geos(struct iwl_priv *priv)
|
||||
void iwlcore_free_geos(struct iwl_priv *priv)
|
||||
{
|
||||
kfree(priv->ieee_channels);
|
||||
kfree(priv->ieee_rates);
|
||||
clear_bit(STATUS_GEO_CONFIGURED, &priv->status);
|
||||
}
|
||||
EXPORT_SYMBOL(iwlcore_free_geos);
|
||||
|
||||
static bool is_single_rx_stream(struct iwl_priv *priv)
|
||||
{
|
||||
|
@ -679,7 +678,7 @@ static int iwl_get_idle_rx_chain_count(struct iwl_priv *priv, int active_cnt)
|
|||
break;
|
||||
case WLAN_HT_CAP_SM_PS_INVALID:
|
||||
default:
|
||||
IWL_ERROR("invalid mimo ps mode %d\n",
|
||||
IWL_ERR(priv, "invalid mimo ps mode %d\n",
|
||||
priv->current_ht_config.sm_ps);
|
||||
WARN_ON(1);
|
||||
idle_cnt = -1;
|
||||
|
@ -699,6 +698,18 @@ static u8 iwl_count_chain_bitmap(u32 chain_bitmap)
|
|||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* iwl_is_monitor_mode - Determine if interface in monitor mode
|
||||
*
|
||||
* priv->iw_mode is set in add_interface, but add_interface is
|
||||
* never called for monitor mode. The only way mac80211 informs us about
|
||||
* monitor mode is through configuring filters (call to configure_filter).
|
||||
*/
|
||||
static bool iwl_is_monitor_mode(struct iwl_priv *priv)
|
||||
{
|
||||
return !!(priv->staging_rxon.filter_flags & RXON_FILTER_PROMISC_MSK);
|
||||
}
|
||||
|
||||
/**
|
||||
* iwl_set_rxon_chain - Set up Rx chain usage in "staging" RXON image
|
||||
*
|
||||
|
@ -742,6 +753,19 @@ void iwl_set_rxon_chain(struct iwl_priv *priv)
|
|||
rx_chain |= active_rx_cnt << RXON_RX_CHAIN_MIMO_CNT_POS;
|
||||
rx_chain |= idle_rx_cnt << RXON_RX_CHAIN_CNT_POS;
|
||||
|
||||
/* copied from 'iwl_bg_request_scan()' */
|
||||
/* Force use of chains B and C (0x6) for Rx for 4965
|
||||
* Avoid A (0x1) because of its off-channel reception on A-band.
|
||||
* MIMO is not used here, but value is required */
|
||||
if (iwl_is_monitor_mode(priv) &&
|
||||
!(priv->staging_rxon.flags & RXON_FLG_BAND_24G_MSK) &&
|
||||
((priv->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_4965)) {
|
||||
rx_chain = 0x07 << RXON_RX_CHAIN_VALID_POS;
|
||||
rx_chain |= 0x06 << RXON_RX_CHAIN_FORCE_SEL_POS;
|
||||
rx_chain |= 0x07 << RXON_RX_CHAIN_FORCE_MIMO_SEL_POS;
|
||||
rx_chain |= 0x01 << RXON_RX_CHAIN_DRIVER_FORCE_POS;
|
||||
}
|
||||
|
||||
priv->staging_rxon.rx_chain = cpu_to_le16(rx_chain);
|
||||
|
||||
if (!is_single && (active_rx_cnt >= IWL_NUM_RX_CHAINS_SINGLE) && is_cam)
|
||||
|
@ -806,12 +830,13 @@ int iwl_setup_mac(struct iwl_priv *priv)
|
|||
/* Tell mac80211 our characteristics */
|
||||
hw->flags = IEEE80211_HW_SIGNAL_DBM |
|
||||
IEEE80211_HW_NOISE_DBM |
|
||||
IEEE80211_HW_AMPDU_AGGREGATION;
|
||||
IEEE80211_HW_AMPDU_AGGREGATION |
|
||||
IEEE80211_HW_SUPPORTS_PS;
|
||||
hw->wiphy->interface_modes =
|
||||
BIT(NL80211_IFTYPE_STATION) |
|
||||
BIT(NL80211_IFTYPE_ADHOC);
|
||||
|
||||
hw->wiphy->fw_handles_regulatory = true;
|
||||
hw->wiphy->custom_regulatory = true;
|
||||
|
||||
/* Default value; 4 EDCA QOS priorities */
|
||||
hw->queues = 4;
|
||||
|
@ -831,7 +856,7 @@ int iwl_setup_mac(struct iwl_priv *priv)
|
|||
|
||||
ret = ieee80211_register_hw(priv->hw);
|
||||
if (ret) {
|
||||
IWL_ERROR("Failed to register hw (error %d)\n", ret);
|
||||
IWL_ERR(priv, "Failed to register hw (error %d)\n", ret);
|
||||
return ret;
|
||||
}
|
||||
priv->mac80211_registered = 1;
|
||||
|
@ -863,7 +888,6 @@ int iwl_init_drv(struct iwl_priv *priv)
|
|||
{
|
||||
int ret;
|
||||
|
||||
priv->retry_rate = 1;
|
||||
priv->ibss_beacon = NULL;
|
||||
|
||||
spin_lock_init(&priv->lock);
|
||||
|
@ -903,15 +927,16 @@ int iwl_init_drv(struct iwl_priv *priv)
|
|||
|
||||
ret = iwl_init_channel_map(priv);
|
||||
if (ret) {
|
||||
IWL_ERROR("initializing regulatory failed: %d\n", ret);
|
||||
IWL_ERR(priv, "initializing regulatory failed: %d\n", ret);
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = iwlcore_init_geos(priv);
|
||||
if (ret) {
|
||||
IWL_ERROR("initializing geos failed: %d\n", ret);
|
||||
IWL_ERR(priv, "initializing geos failed: %d\n", ret);
|
||||
goto err_free_channel_map;
|
||||
}
|
||||
iwlcore_init_hw_rates(priv, priv->ieee_rates);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -926,13 +951,13 @@ int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force)
|
|||
{
|
||||
int ret = 0;
|
||||
if (tx_power < IWL_TX_POWER_TARGET_POWER_MIN) {
|
||||
IWL_WARNING("Requested user TXPOWER %d below limit.\n",
|
||||
IWL_WARN(priv, "Requested user TXPOWER %d below limit.\n",
|
||||
priv->tx_power_user_lmt);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (tx_power > IWL_TX_POWER_TARGET_POWER_MAX) {
|
||||
IWL_WARNING("Requested user TXPOWER %d above limit.\n",
|
||||
IWL_WARN(priv, "Requested user TXPOWER %d above limit.\n",
|
||||
priv->tx_power_user_lmt);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -982,6 +1007,21 @@ void iwl_enable_interrupts(struct iwl_priv *priv)
|
|||
}
|
||||
EXPORT_SYMBOL(iwl_enable_interrupts);
|
||||
|
||||
int iwl_send_bt_config(struct iwl_priv *priv)
|
||||
{
|
||||
struct iwl_bt_cmd bt_cmd = {
|
||||
.flags = 3,
|
||||
.lead_time = 0xAA,
|
||||
.max_kill = 1,
|
||||
.kill_ack_mask = 0,
|
||||
.kill_cts_mask = 0,
|
||||
};
|
||||
|
||||
return iwl_send_cmd_pdu(priv, REPLY_BT_CONFIG,
|
||||
sizeof(struct iwl_bt_cmd), &bt_cmd);
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_send_bt_config);
|
||||
|
||||
int iwl_send_statistics_request(struct iwl_priv *priv, u8 flags)
|
||||
{
|
||||
u32 stat_flags = 0;
|
||||
|
@ -1018,7 +1058,7 @@ static int iwlcore_verify_inst_sparse(struct iwl_priv *priv, __le32 *image, u32
|
|||
/* NOTE: Use the debugless read so we don't flood kernel log
|
||||
* if IWL_DL_IO is set */
|
||||
iwl_write_direct32(priv, HBUS_TARG_MEM_RADDR,
|
||||
i + RTC_INST_LOWER_BOUND);
|
||||
i + IWL49_RTC_INST_LOWER_BOUND);
|
||||
val = _iwl_read_direct32(priv, HBUS_TARG_MEM_RDAT);
|
||||
if (val != le32_to_cpu(*image)) {
|
||||
ret = -EIO;
|
||||
|
@ -1051,7 +1091,8 @@ static int iwl_verify_inst_full(struct iwl_priv *priv, __le32 *image,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
iwl_write_direct32(priv, HBUS_TARG_MEM_RADDR, RTC_INST_LOWER_BOUND);
|
||||
iwl_write_direct32(priv, HBUS_TARG_MEM_RADDR,
|
||||
IWL49_RTC_INST_LOWER_BOUND);
|
||||
|
||||
errcnt = 0;
|
||||
for (; len > 0; len -= sizeof(u32), image++) {
|
||||
|
@ -1060,7 +1101,7 @@ static int iwl_verify_inst_full(struct iwl_priv *priv, __le32 *image,
|
|||
* if IWL_DL_IO is set */
|
||||
val = _iwl_read_direct32(priv, HBUS_TARG_MEM_RDAT);
|
||||
if (val != le32_to_cpu(*image)) {
|
||||
IWL_ERROR("uCode INST section is invalid at "
|
||||
IWL_ERR(priv, "uCode INST section is invalid at "
|
||||
"offset 0x%x, is 0x%x, s/b 0x%x\n",
|
||||
save_len - len, val, le32_to_cpu(*image));
|
||||
ret = -EIO;
|
||||
|
@ -1116,7 +1157,7 @@ int iwl_verify_ucode(struct iwl_priv *priv)
|
|||
return 0;
|
||||
}
|
||||
|
||||
IWL_ERROR("NO VALID UCODE IMAGE IN INSTRUCTION SRAM!!\n");
|
||||
IWL_ERR(priv, "NO VALID UCODE IMAGE IN INSTRUCTION SRAM!!\n");
|
||||
|
||||
/* Since nothing seems to match, show first several data entries in
|
||||
* instruction SRAM, so maybe visual inspection will give a clue.
|
||||
|
@ -1188,21 +1229,22 @@ void iwl_dump_nic_error_log(struct iwl_priv *priv)
|
|||
base = le32_to_cpu(priv->card_alive.error_event_table_ptr);
|
||||
|
||||
if (!priv->cfg->ops->lib->is_valid_rtc_data_addr(base)) {
|
||||
IWL_ERROR("Not valid error log pointer 0x%08X\n", base);
|
||||
IWL_ERR(priv, "Not valid error log pointer 0x%08X\n", base);
|
||||
return;
|
||||
}
|
||||
|
||||
ret = iwl_grab_nic_access(priv);
|
||||
if (ret) {
|
||||
IWL_WARNING("Can not read from adapter at this time.\n");
|
||||
IWL_WARN(priv, "Can not read from adapter at this time.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
count = iwl_read_targ_mem(priv, base);
|
||||
|
||||
if (ERROR_START_OFFSET <= count * ERROR_ELEM_SIZE) {
|
||||
IWL_ERROR("Start IWL Error Log Dump:\n");
|
||||
IWL_ERROR("Status: 0x%08lX, count: %d\n", priv->status, count);
|
||||
IWL_ERR(priv, "Start IWL Error Log Dump:\n");
|
||||
IWL_ERR(priv, "Status: 0x%08lX, count: %d\n",
|
||||
priv->status, count);
|
||||
}
|
||||
|
||||
desc = iwl_read_targ_mem(priv, base + 1 * sizeof(u32));
|
||||
|
@ -1215,12 +1257,12 @@ void iwl_dump_nic_error_log(struct iwl_priv *priv)
|
|||
line = iwl_read_targ_mem(priv, base + 9 * sizeof(u32));
|
||||
time = iwl_read_targ_mem(priv, base + 11 * sizeof(u32));
|
||||
|
||||
IWL_ERROR("Desc Time "
|
||||
IWL_ERR(priv, "Desc Time "
|
||||
"data1 data2 line\n");
|
||||
IWL_ERROR("%-28s (#%02d) %010u 0x%08X 0x%08X %u\n",
|
||||
IWL_ERR(priv, "%-28s (#%02d) %010u 0x%08X 0x%08X %u\n",
|
||||
desc_lookup(desc), desc, time, data1, data2, line);
|
||||
IWL_ERROR("blink1 blink2 ilink1 ilink2\n");
|
||||
IWL_ERROR("0x%05X 0x%05X 0x%05X 0x%05X\n", blink1, blink2,
|
||||
IWL_ERR(priv, "blink1 blink2 ilink1 ilink2\n");
|
||||
IWL_ERR(priv, "0x%05X 0x%05X 0x%05X 0x%05X\n", blink1, blink2,
|
||||
ilink1, ilink2);
|
||||
|
||||
iwl_release_nic_access(priv);
|
||||
|
@ -1266,11 +1308,11 @@ static void iwl_print_event_log(struct iwl_priv *priv, u32 start_idx,
|
|||
ptr += sizeof(u32);
|
||||
if (mode == 0) {
|
||||
/* data, ev */
|
||||
IWL_ERROR("EVT_LOG:0x%08x:%04u\n", time, ev);
|
||||
IWL_ERR(priv, "EVT_LOG:0x%08x:%04u\n", time, ev);
|
||||
} else {
|
||||
data = iwl_read_targ_mem(priv, ptr);
|
||||
ptr += sizeof(u32);
|
||||
IWL_ERROR("EVT_LOGT:%010u:0x%08x:%04u\n",
|
||||
IWL_ERR(priv, "EVT_LOGT:%010u:0x%08x:%04u\n",
|
||||
time, data, ev);
|
||||
}
|
||||
}
|
||||
|
@ -1292,13 +1334,13 @@ void iwl_dump_nic_event_log(struct iwl_priv *priv)
|
|||
base = le32_to_cpu(priv->card_alive.log_event_table_ptr);
|
||||
|
||||
if (!priv->cfg->ops->lib->is_valid_rtc_data_addr(base)) {
|
||||
IWL_ERROR("Invalid event log pointer 0x%08X\n", base);
|
||||
IWL_ERR(priv, "Invalid event log pointer 0x%08X\n", base);
|
||||
return;
|
||||
}
|
||||
|
||||
ret = iwl_grab_nic_access(priv);
|
||||
if (ret) {
|
||||
IWL_WARNING("Can not read from adapter at this time.\n");
|
||||
IWL_WARN(priv, "Can not read from adapter at this time.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1312,12 +1354,12 @@ void iwl_dump_nic_event_log(struct iwl_priv *priv)
|
|||
|
||||
/* bail out if nothing in log */
|
||||
if (size == 0) {
|
||||
IWL_ERROR("Start IWL Event Log Dump: nothing in log\n");
|
||||
IWL_ERR(priv, "Start IWL Event Log Dump: nothing in log\n");
|
||||
iwl_release_nic_access(priv);
|
||||
return;
|
||||
}
|
||||
|
||||
IWL_ERROR("Start IWL Event Log Dump: display count %d, wraps %d\n",
|
||||
IWL_ERR(priv, "Start IWL Event Log Dump: display count %d, wraps %d\n",
|
||||
size, num_wraps);
|
||||
|
||||
/* if uCode has wrapped back to top of log, start at the oldest entry,
|
||||
|
@ -1349,7 +1391,7 @@ void iwl_rf_kill_ct_config(struct iwl_priv *priv)
|
|||
ret = iwl_send_cmd_pdu(priv, REPLY_CT_KILL_CONFIG_CMD,
|
||||
sizeof(cmd), &cmd);
|
||||
if (ret)
|
||||
IWL_ERROR("REPLY_CT_KILL_CONFIG_CMD failed\n");
|
||||
IWL_ERR(priv, "REPLY_CT_KILL_CONFIG_CMD failed\n");
|
||||
else
|
||||
IWL_DEBUG_INFO("REPLY_CT_KILL_CONFIG_CMD succeeded, "
|
||||
"critical temperature is %d\n",
|
||||
|
@ -1368,7 +1410,7 @@ EXPORT_SYMBOL(iwl_rf_kill_ct_config);
|
|||
* When in the 'halt' state, the card is shut down and must be fully
|
||||
* restarted to come back on.
|
||||
*/
|
||||
static int iwl_send_card_state(struct iwl_priv *priv, u32 flags, u8 meta_flag)
|
||||
int iwl_send_card_state(struct iwl_priv *priv, u32 flags, u8 meta_flag)
|
||||
{
|
||||
struct iwl_host_cmd cmd = {
|
||||
.id = REPLY_CARD_STATE_CMD,
|
||||
|
@ -1379,6 +1421,7 @@ static int iwl_send_card_state(struct iwl_priv *priv, u32 flags, u8 meta_flag)
|
|||
|
||||
return iwl_send_cmd(priv, &cmd);
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_send_card_state);
|
||||
|
||||
void iwl_radio_kill_sw_disable_radio(struct iwl_priv *priv)
|
||||
{
|
||||
|
@ -1463,3 +1506,39 @@ int iwl_radio_kill_sw_enable_radio(struct iwl_priv *priv)
|
|||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_radio_kill_sw_enable_radio);
|
||||
|
||||
void iwl_bg_rf_kill(struct work_struct *work)
|
||||
{
|
||||
struct iwl_priv *priv = container_of(work, struct iwl_priv, rf_kill);
|
||||
|
||||
wake_up_interruptible(&priv->wait_command_queue);
|
||||
|
||||
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||
return;
|
||||
|
||||
mutex_lock(&priv->mutex);
|
||||
|
||||
if (!iwl_is_rfkill(priv)) {
|
||||
IWL_DEBUG(IWL_DL_RF_KILL,
|
||||
"HW and/or SW RF Kill no longer active, restarting "
|
||||
"device\n");
|
||||
if (!test_bit(STATUS_EXIT_PENDING, &priv->status) &&
|
||||
test_bit(STATUS_ALIVE, &priv->status))
|
||||
queue_work(priv->workqueue, &priv->restart);
|
||||
} else {
|
||||
/* make sure mac80211 stop sending Tx frame */
|
||||
if (priv->mac80211_registered)
|
||||
ieee80211_stop_queues(priv->hw);
|
||||
|
||||
if (!test_bit(STATUS_RF_KILL_HW, &priv->status))
|
||||
IWL_DEBUG_RF_KILL("Can not turn radio back on - "
|
||||
"disabled by SW switch\n");
|
||||
else
|
||||
IWL_WARN(priv, "Radio Frequency Kill Switch is On:\n"
|
||||
"Kill switch must be turned off for "
|
||||
"wireless networking to work.\n");
|
||||
}
|
||||
mutex_unlock(&priv->mutex);
|
||||
iwl_rfkill_set_hw_state(priv);
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_bg_rf_kill);
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2008 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -30,7 +30,7 @@
|
|||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -71,7 +71,7 @@ struct iwl_cmd;
|
|||
|
||||
|
||||
#define IWLWIFI_VERSION "1.3.27k"
|
||||
#define DRV_COPYRIGHT "Copyright(c) 2003-2008 Intel Corporation"
|
||||
#define DRV_COPYRIGHT "Copyright(c) 2003-2009 Intel Corporation"
|
||||
#define DRV_AUTHOR "<ilw@linux.intel.com>"
|
||||
|
||||
#define IWL_PCI_DEVICE(dev, subdev, cfg) \
|
||||
|
@ -110,6 +110,14 @@ struct iwl_lib_ops {
|
|||
void (*txq_inval_byte_cnt_tbl)(struct iwl_priv *priv,
|
||||
struct iwl_tx_queue *txq);
|
||||
void (*txq_set_sched)(struct iwl_priv *priv, u32 mask);
|
||||
int (*txq_attach_buf_to_tfd)(struct iwl_priv *priv,
|
||||
struct iwl_tx_queue *txq,
|
||||
dma_addr_t addr,
|
||||
u16 len, u8 reset, u8 pad);
|
||||
void (*txq_free_tfd)(struct iwl_priv *priv,
|
||||
struct iwl_tx_queue *txq);
|
||||
int (*txq_init)(struct iwl_priv *priv,
|
||||
struct iwl_tx_queue *txq);
|
||||
/* aggregations */
|
||||
int (*txq_agg_enable)(struct iwl_priv *priv, int txq_id, int tx_fifo,
|
||||
int sta_id, int tid, u16 ssn_idx);
|
||||
|
@ -252,9 +260,18 @@ void iwl_rx_statistics(struct iwl_priv *priv,
|
|||
* TX
|
||||
******************************************************/
|
||||
int iwl_txq_ctx_reset(struct iwl_priv *priv);
|
||||
void iwl_hw_txq_free_tfd(struct iwl_priv *priv, struct iwl_tx_queue *txq);
|
||||
int iwl_hw_txq_attach_buf_to_tfd(struct iwl_priv *priv,
|
||||
struct iwl_tx_queue *txq,
|
||||
dma_addr_t addr, u16 len, u8 reset, u8 pad);
|
||||
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);
|
||||
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);
|
||||
int iwl_tx_agg_start(struct iwl_priv *priv, const u8 *ra, u16 tid, u16 *ssn);
|
||||
int iwl_tx_agg_stop(struct iwl_priv *priv , const u8 *ra, u16 tid);
|
||||
int iwl_txq_check_empty(struct iwl_priv *priv, int sta_id, u8 tid, int txq_id);
|
||||
|
@ -267,7 +284,7 @@ int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force);
|
|||
* RF -Kill - here and not in iwl-rfkill.h to be available when
|
||||
* RF-kill subsystem is not compiled.
|
||||
****************************************************/
|
||||
void iwl_rf_kill(struct iwl_priv *priv);
|
||||
void iwl_bg_rf_kill(struct work_struct *work);
|
||||
void iwl_radio_kill_sw_disable_radio(struct iwl_priv *priv);
|
||||
int iwl_radio_kill_sw_enable_radio(struct iwl_priv *priv);
|
||||
|
||||
|
@ -306,8 +323,29 @@ void iwl_init_scan_params(struct iwl_priv *priv);
|
|||
int iwl_scan_cancel(struct iwl_priv *priv);
|
||||
int iwl_scan_cancel_timeout(struct iwl_priv *priv, unsigned long ms);
|
||||
int iwl_scan_initiate(struct iwl_priv *priv);
|
||||
u16 iwl_fill_probe_req(struct iwl_priv *priv, enum ieee80211_band band,
|
||||
struct ieee80211_mgmt *frame, int left);
|
||||
void iwl_setup_rx_scan_handlers(struct iwl_priv *priv);
|
||||
u16 iwl_get_active_dwell_time(struct iwl_priv *priv,
|
||||
enum ieee80211_band band,
|
||||
u8 n_probes);
|
||||
u16 iwl_get_passive_dwell_time(struct iwl_priv *priv,
|
||||
enum ieee80211_band band);
|
||||
void iwl_bg_scan_check(struct work_struct *data);
|
||||
void iwl_bg_abort_scan(struct work_struct *work);
|
||||
void iwl_bg_scan_completed(struct work_struct *work);
|
||||
void iwl_setup_scan_deferred_work(struct iwl_priv *priv);
|
||||
int iwl_send_scan_abort(struct iwl_priv *priv);
|
||||
|
||||
/* For faster active scanning, scan will move to the next channel if fewer than
|
||||
* PLCP_QUIET_THRESH packets are heard on this channel within
|
||||
* ACTIVE_QUIET_TIME after sending probe request. This shortens the dwell
|
||||
* time if it's a quiet channel (nothing responded to our probe, and there's
|
||||
* no other traffic).
|
||||
* Disable "quiet" feature by setting PLCP_QUIET_THRESH to 0. */
|
||||
#define IWL_ACTIVE_QUIET_TIME __constant_cpu_to_le16(10) /* msec */
|
||||
#define IWL_PLCP_QUIET_THRESH __constant_cpu_to_le16(1) /* packets */
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* Calibrations - implemented in iwl-calib.c
|
||||
|
@ -342,6 +380,9 @@ int iwl_send_cmd_pdu_async(struct iwl_priv *priv, u8 id, u16 len,
|
|||
|
||||
int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd);
|
||||
|
||||
int iwl_send_card_state(struct iwl_priv *priv, u32 flags,
|
||||
u8 meta_flag);
|
||||
|
||||
/*****************************************************
|
||||
* PCI *
|
||||
*****************************************************/
|
||||
|
@ -354,6 +395,11 @@ void iwl_enable_interrupts(struct iwl_priv *priv);
|
|||
void iwl_dump_nic_error_log(struct iwl_priv *priv);
|
||||
void iwl_dump_nic_event_log(struct iwl_priv *priv);
|
||||
|
||||
/*****************************************************
|
||||
* GEOS
|
||||
******************************************************/
|
||||
int iwlcore_init_geos(struct iwl_priv *priv);
|
||||
void iwlcore_free_geos(struct iwl_priv *priv);
|
||||
|
||||
/*************** DRIVER STATUS FUNCTIONS *****/
|
||||
|
||||
|
@ -422,6 +468,7 @@ static inline int iwl_is_ready_rf(struct iwl_priv *priv)
|
|||
}
|
||||
|
||||
extern void iwl_rf_kill_ct_config(struct iwl_priv *priv);
|
||||
extern int iwl_send_bt_config(struct iwl_priv *priv);
|
||||
extern int iwl_send_statistics_request(struct iwl_priv *priv, u8 flags);
|
||||
extern int iwl_verify_ucode(struct iwl_priv *priv);
|
||||
extern int iwl_send_lq_cmd(struct iwl_priv *priv,
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -30,7 +30,7 @@
|
|||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2003 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* Portions of this file are derived from the ipw3945 project.
|
||||
*
|
||||
|
@ -29,16 +29,27 @@
|
|||
#ifndef __iwl_debug_h__
|
||||
#define __iwl_debug_h__
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||
#define IWL_DEBUG(level, fmt, args...) \
|
||||
do { if (priv->debug_level & (level)) \
|
||||
dev_printk(KERN_ERR, &(priv->hw->wiphy->dev), "%c %s " fmt, \
|
||||
in_interrupt() ? 'I' : 'U', __func__ , ## args); } while (0)
|
||||
struct iwl_priv;
|
||||
|
||||
#define IWL_DEBUG_LIMIT(level, fmt, args...) \
|
||||
do { if ((priv->debug_level & (level)) && net_ratelimit()) \
|
||||
dev_printk(KERN_ERR, &(priv->hw->wiphy->dev), "%c %s " fmt, \
|
||||
in_interrupt() ? 'I' : 'U', __func__ , ## args); } while (0)
|
||||
#define IWL_ERR(p, f, a...) dev_err(&((p)->pci_dev->dev), f, ## a)
|
||||
#define IWL_WARN(p, f, a...) dev_warn(&((p)->pci_dev->dev), f, ## a)
|
||||
#define IWL_INFO(p, f, a...) dev_info(&((p)->pci_dev->dev), f, ## a)
|
||||
#define IWL_CRIT(p, f, a...) dev_crit(&((p)->pci_dev->dev), f, ## a)
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||
#define IWL_DEBUG(level, fmt, args...) \
|
||||
do { \
|
||||
if (priv->debug_level & (level)) \
|
||||
dev_printk(KERN_ERR, &(priv->hw->wiphy->dev), "%c %s " fmt, \
|
||||
in_interrupt() ? 'I' : 'U', __func__ , ## args); \
|
||||
} while (0)
|
||||
|
||||
#define IWL_DEBUG_LIMIT(level, fmt, args...) \
|
||||
do { \
|
||||
if ((priv->debug_level & (level)) && net_ratelimit()) \
|
||||
dev_printk(KERN_ERR, &(priv->hw->wiphy->dev), "%c %s " fmt, \
|
||||
in_interrupt() ? 'I' : 'U', __func__ , ## args); \
|
||||
} while (0)
|
||||
|
||||
#define iwl_print_hex_dump(priv, level, p, len) \
|
||||
do { \
|
||||
|
@ -61,6 +72,7 @@ struct iwl_debugfs {
|
|||
struct dentry *file_tx_statistics;
|
||||
struct dentry *file_log_event;
|
||||
struct dentry *file_channels;
|
||||
struct dentry *file_status;
|
||||
} dbgfs_data_files;
|
||||
struct dir_rf_files {
|
||||
struct dentry *file_disable_sensitivity;
|
||||
|
@ -117,84 +129,82 @@ static inline void iwl_dbgfs_unregister(struct iwl_priv *priv)
|
|||
* when CONFIG_IWLWIFI_DEBUG=y.
|
||||
*/
|
||||
|
||||
/* 0x0000000F - 0x00000001 */
|
||||
#define IWL_DL_INFO (1 << 0)
|
||||
#define IWL_DL_MAC80211 (1 << 1)
|
||||
#define IWL_DL_HCMD (1 << 2)
|
||||
#define IWL_DL_STATE (1 << 3)
|
||||
/* 0x000000F0 - 0x00000010 */
|
||||
#define IWL_DL_MACDUMP (1 << 4)
|
||||
#define IWL_DL_HCMD_DUMP (1 << 5)
|
||||
#define IWL_DL_RADIO (1 << 7)
|
||||
#define IWL_DL_POWER (1 << 8)
|
||||
#define IWL_DL_TEMP (1 << 9)
|
||||
#define IWL_DL_RADIO (1 << 7)
|
||||
/* 0x00000F00 - 0x00000100 */
|
||||
#define IWL_DL_POWER (1 << 8)
|
||||
#define IWL_DL_TEMP (1 << 9)
|
||||
#define IWL_DL_NOTIF (1 << 10)
|
||||
#define IWL_DL_SCAN (1 << 11)
|
||||
/* 0x0000F000 - 0x00001000 */
|
||||
#define IWL_DL_ASSOC (1 << 12)
|
||||
#define IWL_DL_DROP (1 << 13)
|
||||
#define IWL_DL_TXPOWER (1 << 14)
|
||||
#define IWL_DL_AP (1 << 15)
|
||||
/* 0x000F0000 - 0x00010000 */
|
||||
#define IWL_DL_FW (1 << 16)
|
||||
#define IWL_DL_RF_KILL (1 << 17)
|
||||
#define IWL_DL_FW_ERRORS (1 << 18)
|
||||
#define IWL_DL_LED (1 << 19)
|
||||
/* 0x00F00000 - 0x00100000 */
|
||||
#define IWL_DL_RATE (1 << 20)
|
||||
#define IWL_DL_CALIB (1 << 21)
|
||||
#define IWL_DL_WEP (1 << 22)
|
||||
#define IWL_DL_TX (1 << 23)
|
||||
/* 0x0F000000 - 0x01000000 */
|
||||
#define IWL_DL_RX (1 << 24)
|
||||
#define IWL_DL_ISR (1 << 25)
|
||||
#define IWL_DL_HT (1 << 26)
|
||||
#define IWL_DL_IO (1 << 27)
|
||||
/* 0xF0000000 - 0x10000000 */
|
||||
#define IWL_DL_11H (1 << 28)
|
||||
#define IWL_DL_STATS (1 << 29)
|
||||
#define IWL_DL_TX_REPLY (1 << 30)
|
||||
#define IWL_DL_QOS (1 << 31)
|
||||
|
||||
#define IWL_DL_NOTIF (1 << 10)
|
||||
#define IWL_DL_SCAN (1 << 11)
|
||||
#define IWL_DL_ASSOC (1 << 12)
|
||||
#define IWL_DL_DROP (1 << 13)
|
||||
|
||||
#define IWL_DL_TXPOWER (1 << 14)
|
||||
|
||||
#define IWL_DL_AP (1 << 15)
|
||||
|
||||
#define IWL_DL_FW (1 << 16)
|
||||
#define IWL_DL_RF_KILL (1 << 17)
|
||||
#define IWL_DL_FW_ERRORS (1 << 18)
|
||||
|
||||
#define IWL_DL_LED (1 << 19)
|
||||
|
||||
#define IWL_DL_RATE (1 << 20)
|
||||
|
||||
#define IWL_DL_CALIB (1 << 21)
|
||||
#define IWL_DL_WEP (1 << 22)
|
||||
#define IWL_DL_TX (1 << 23)
|
||||
#define IWL_DL_RX (1 << 24)
|
||||
#define IWL_DL_ISR (1 << 25)
|
||||
#define IWL_DL_HT (1 << 26)
|
||||
#define IWL_DL_IO (1 << 27)
|
||||
#define IWL_DL_11H (1 << 28)
|
||||
|
||||
#define IWL_DL_STATS (1 << 29)
|
||||
#define IWL_DL_TX_REPLY (1 << 30)
|
||||
#define IWL_DL_QOS (1 << 31)
|
||||
|
||||
#define IWL_ERROR(f, a...) printk(KERN_ERR DRV_NAME ": " f, ## a)
|
||||
#define IWL_WARNING(f, a...) printk(KERN_WARNING DRV_NAME ": " f, ## a)
|
||||
#define IWL_DEBUG_INFO(f, a...) IWL_DEBUG(IWL_DL_INFO, f, ## a)
|
||||
|
||||
#define IWL_DEBUG_MAC80211(f, a...) IWL_DEBUG(IWL_DL_MAC80211, f, ## a)
|
||||
#define IWL_DEBUG_MACDUMP(f, a...) IWL_DEBUG(IWL_DL_MACDUMP, f, ## a)
|
||||
#define IWL_DEBUG_TEMP(f, a...) IWL_DEBUG(IWL_DL_TEMP, f, ## a)
|
||||
#define IWL_DEBUG_SCAN(f, a...) IWL_DEBUG(IWL_DL_SCAN, f, ## a)
|
||||
#define IWL_DEBUG_RX(f, a...) IWL_DEBUG(IWL_DL_RX, f, ## a)
|
||||
#define IWL_DEBUG_TX(f, a...) IWL_DEBUG(IWL_DL_TX, f, ## a)
|
||||
#define IWL_DEBUG_ISR(f, a...) IWL_DEBUG(IWL_DL_ISR, f, ## a)
|
||||
#define IWL_DEBUG_LED(f, a...) IWL_DEBUG(IWL_DL_LED, f, ## a)
|
||||
#define IWL_DEBUG_WEP(f, a...) IWL_DEBUG(IWL_DL_WEP, f, ## a)
|
||||
#define IWL_DEBUG_HC(f, a...) IWL_DEBUG(IWL_DL_HCMD, f, ## a)
|
||||
#define IWL_DEBUG_HC_DUMP(f, a...) IWL_DEBUG(IWL_DL_HCMD_DUMP, f, ## a)
|
||||
#define IWL_DEBUG_CALIB(f, a...) IWL_DEBUG(IWL_DL_CALIB, f, ## a)
|
||||
#define IWL_DEBUG_FW(f, a...) IWL_DEBUG(IWL_DL_FW, f, ## a)
|
||||
#define IWL_DEBUG_RF_KILL(f, a...) IWL_DEBUG(IWL_DL_RF_KILL, f, ## a)
|
||||
#define IWL_DEBUG_DROP(f, a...) IWL_DEBUG(IWL_DL_DROP, f, ## a)
|
||||
#define IWL_DEBUG_DROP_LIMIT(f, a...) IWL_DEBUG_LIMIT(IWL_DL_DROP, f, ## a)
|
||||
#define IWL_DEBUG_AP(f, a...) IWL_DEBUG(IWL_DL_AP, f, ## a)
|
||||
#define IWL_DEBUG_TXPOWER(f, a...) IWL_DEBUG(IWL_DL_TXPOWER, f, ## a)
|
||||
#define IWL_DEBUG_IO(f, a...) IWL_DEBUG(IWL_DL_IO, f, ## a)
|
||||
#define IWL_DEBUG_RATE(f, a...) IWL_DEBUG(IWL_DL_RATE, f, ## a)
|
||||
#define IWL_DEBUG_RATE_LIMIT(f, a...) IWL_DEBUG_LIMIT(IWL_DL_RATE, f, ## a)
|
||||
#define IWL_DEBUG_NOTIF(f, a...) IWL_DEBUG(IWL_DL_NOTIF, f, ## a)
|
||||
#define IWL_DEBUG_ASSOC(f, a...) IWL_DEBUG(IWL_DL_ASSOC | IWL_DL_INFO, f, ## a)
|
||||
#define IWL_DEBUG_ASSOC_LIMIT(f, a...) \
|
||||
IWL_DEBUG_LIMIT(IWL_DL_ASSOC | IWL_DL_INFO, f, ## a)
|
||||
#define IWL_DEBUG_HT(f, a...) IWL_DEBUG(IWL_DL_HT, f, ## a)
|
||||
#define IWL_DEBUG_STATS(f, a...) IWL_DEBUG(IWL_DL_STATS, f, ## a)
|
||||
#define IWL_DEBUG_STATS_LIMIT(f, a...) IWL_DEBUG_LIMIT(IWL_DL_STATS, f, ## a)
|
||||
#define IWL_DEBUG_TX_REPLY(f, a...) IWL_DEBUG(IWL_DL_TX_REPLY, f, ## a)
|
||||
#define IWL_DEBUG_INFO(f, a...) IWL_DEBUG(IWL_DL_INFO, f, ## a)
|
||||
#define IWL_DEBUG_MAC80211(f, a...) IWL_DEBUG(IWL_DL_MAC80211, f, ## a)
|
||||
#define IWL_DEBUG_MACDUMP(f, a...) IWL_DEBUG(IWL_DL_MACDUMP, f, ## a)
|
||||
#define IWL_DEBUG_TEMP(f, a...) IWL_DEBUG(IWL_DL_TEMP, f, ## a)
|
||||
#define IWL_DEBUG_SCAN(f, a...) IWL_DEBUG(IWL_DL_SCAN, f, ## a)
|
||||
#define IWL_DEBUG_RX(f, a...) IWL_DEBUG(IWL_DL_RX, f, ## a)
|
||||
#define IWL_DEBUG_TX(f, a...) IWL_DEBUG(IWL_DL_TX, f, ## a)
|
||||
#define IWL_DEBUG_ISR(f, a...) IWL_DEBUG(IWL_DL_ISR, f, ## a)
|
||||
#define IWL_DEBUG_LED(f, a...) IWL_DEBUG(IWL_DL_LED, f, ## a)
|
||||
#define IWL_DEBUG_WEP(f, a...) IWL_DEBUG(IWL_DL_WEP, f, ## a)
|
||||
#define IWL_DEBUG_HC(f, a...) IWL_DEBUG(IWL_DL_HCMD, f, ## a)
|
||||
#define IWL_DEBUG_HC_DUMP(f, a...) IWL_DEBUG(IWL_DL_HCMD_DUMP, f, ## a)
|
||||
#define IWL_DEBUG_CALIB(f, a...) IWL_DEBUG(IWL_DL_CALIB, f, ## a)
|
||||
#define IWL_DEBUG_FW(f, a...) IWL_DEBUG(IWL_DL_FW, f, ## a)
|
||||
#define IWL_DEBUG_RF_KILL(f, a...) IWL_DEBUG(IWL_DL_RF_KILL, f, ## a)
|
||||
#define IWL_DEBUG_DROP(f, a...) IWL_DEBUG(IWL_DL_DROP, f, ## a)
|
||||
#define IWL_DEBUG_DROP_LIMIT(f, a...) IWL_DEBUG_LIMIT(IWL_DL_DROP, f, ## a)
|
||||
#define IWL_DEBUG_AP(f, a...) IWL_DEBUG(IWL_DL_AP, f, ## a)
|
||||
#define IWL_DEBUG_TXPOWER(f, a...) IWL_DEBUG(IWL_DL_TXPOWER, f, ## a)
|
||||
#define IWL_DEBUG_IO(f, a...) IWL_DEBUG(IWL_DL_IO, f, ## a)
|
||||
#define IWL_DEBUG_RATE(f, a...) IWL_DEBUG(IWL_DL_RATE, f, ## a)
|
||||
#define IWL_DEBUG_RATE_LIMIT(f, a...) IWL_DEBUG_LIMIT(IWL_DL_RATE, f, ## a)
|
||||
#define IWL_DEBUG_NOTIF(f, a...) IWL_DEBUG(IWL_DL_NOTIF, f, ## a)
|
||||
#define IWL_DEBUG_ASSOC(f, a...) \
|
||||
IWL_DEBUG(IWL_DL_ASSOC | IWL_DL_INFO, f, ## a)
|
||||
#define IWL_DEBUG_ASSOC_LIMIT(f, a...) \
|
||||
IWL_DEBUG_LIMIT(IWL_DL_ASSOC | IWL_DL_INFO, f, ## a)
|
||||
#define IWL_DEBUG_HT(f, a...) IWL_DEBUG(IWL_DL_HT, f, ## a)
|
||||
#define IWL_DEBUG_STATS(f, a...) IWL_DEBUG(IWL_DL_STATS, f, ## a)
|
||||
#define IWL_DEBUG_STATS_LIMIT(f, a...) IWL_DEBUG_LIMIT(IWL_DL_STATS, f, ## a)
|
||||
#define IWL_DEBUG_TX_REPLY(f, a...) IWL_DEBUG(IWL_DL_TX_REPLY, f, ## a)
|
||||
#define IWL_DEBUG_TX_REPLY_LIMIT(f, a...) \
|
||||
IWL_DEBUG_LIMIT(IWL_DL_TX_REPLY, f, ## a)
|
||||
#define IWL_DEBUG_QOS(f, a...) IWL_DEBUG(IWL_DL_QOS, f, ## a)
|
||||
#define IWL_DEBUG_RADIO(f, a...) IWL_DEBUG(IWL_DL_RADIO, f, ## a)
|
||||
#define IWL_DEBUG_POWER(f, a...) IWL_DEBUG(IWL_DL_POWER, f, ## a)
|
||||
#define IWL_DEBUG_11H(f, a...) IWL_DEBUG(IWL_DL_11H, f, ## a)
|
||||
IWL_DEBUG_LIMIT(IWL_DL_TX_REPLY, f, ## a)
|
||||
#define IWL_DEBUG_QOS(f, a...) IWL_DEBUG(IWL_DL_QOS, f, ## a)
|
||||
#define IWL_DEBUG_RADIO(f, a...) IWL_DEBUG(IWL_DL_RADIO, f, ## a)
|
||||
#define IWL_DEBUG_POWER(f, a...) IWL_DEBUG(IWL_DL_POWER, f, ## a)
|
||||
#define IWL_DEBUG_11H(f, a...) IWL_DEBUG(IWL_DL_11H, f, ## a)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2008 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -63,6 +63,14 @@
|
|||
goto err; \
|
||||
} while (0)
|
||||
|
||||
#define DEBUGFS_ADD_X32(name, parent, ptr) do { \
|
||||
dbgfs->dbgfs_##parent##_files.file_##name = \
|
||||
debugfs_create_x32(#name, 0444, dbgfs->dir_##parent, ptr); \
|
||||
if (IS_ERR(dbgfs->dbgfs_##parent##_files.file_##name) \
|
||||
|| !dbgfs->dbgfs_##parent##_files.file_##name) \
|
||||
goto err; \
|
||||
} while (0)
|
||||
|
||||
#define DEBUGFS_REMOVE(name) do { \
|
||||
debugfs_remove(name); \
|
||||
name = NULL; \
|
||||
|
@ -164,9 +172,6 @@ static ssize_t iwl_dbgfs_sram_read(struct file *file,
|
|||
struct iwl_priv *priv = (struct iwl_priv *)file->private_data;
|
||||
const size_t bufsz = sizeof(buf);
|
||||
|
||||
printk(KERN_DEBUG "offset is: 0x%x\tlen is: 0x%x\n",
|
||||
priv->dbgfs->sram_offset, priv->dbgfs->sram_len);
|
||||
|
||||
iwl_grab_nic_access(priv);
|
||||
for (i = priv->dbgfs->sram_len; i > 0; i -= 4) {
|
||||
val = iwl_read_targ_mem(priv, priv->dbgfs->sram_offset + \
|
||||
|
@ -301,14 +306,14 @@ static ssize_t iwl_dbgfs_eeprom_read(struct file *file,
|
|||
buf_size = 4 * eeprom_len + 256;
|
||||
|
||||
if (eeprom_len % 16) {
|
||||
IWL_ERROR("EEPROM size is not multiple of 16.\n");
|
||||
IWL_ERR(priv, "EEPROM size is not multiple of 16.\n");
|
||||
return -ENODATA;
|
||||
}
|
||||
|
||||
/* 4 characters for byte 0xYY */
|
||||
buf = kzalloc(buf_size, GFP_KERNEL);
|
||||
if (!buf) {
|
||||
IWL_ERROR("Can not allocate Buffer\n");
|
||||
IWL_ERR(priv, "Can not allocate Buffer\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -365,7 +370,7 @@ static ssize_t iwl_dbgfs_channels_read(struct file *file, char __user *user_buf,
|
|||
|
||||
buf = kzalloc(bufsz, GFP_KERNEL);
|
||||
if (!buf) {
|
||||
IWL_ERROR("Can not allocate Buffer\n");
|
||||
IWL_ERR(priv, "Can not allocate Buffer\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -420,7 +425,6 @@ static ssize_t iwl_dbgfs_channels_read(struct file *file, char __user *user_buf,
|
|||
return ret;
|
||||
}
|
||||
|
||||
|
||||
DEBUGFS_READ_WRITE_FILE_OPS(sram);
|
||||
DEBUGFS_WRITE_FILE_OPS(log_event);
|
||||
DEBUGFS_READ_FILE_OPS(eeprom);
|
||||
|
@ -462,6 +466,7 @@ int iwl_dbgfs_register(struct iwl_priv *priv, const char *name)
|
|||
DEBUGFS_ADD_FILE(rx_statistics, data);
|
||||
DEBUGFS_ADD_FILE(tx_statistics, data);
|
||||
DEBUGFS_ADD_FILE(channels, data);
|
||||
DEBUGFS_ADD_X32(status, data, (u32 *)&priv->status);
|
||||
DEBUGFS_ADD_BOOL(disable_sensitivity, rf, &priv->disable_sens_cal);
|
||||
DEBUGFS_ADD_BOOL(disable_chain_noise, rf,
|
||||
&priv->disable_chain_noise_cal);
|
||||
|
@ -469,7 +474,7 @@ int iwl_dbgfs_register(struct iwl_priv *priv, const char *name)
|
|||
return 0;
|
||||
|
||||
err:
|
||||
IWL_ERROR("Can't open the debugfs directory\n");
|
||||
IWL_ERR(priv, "Can't open the debugfs directory\n");
|
||||
iwl_dbgfs_unregister(priv);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2003 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -36,13 +36,15 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <net/ieee80211_radiotap.h>
|
||||
|
||||
#define DRV_NAME "iwlagn"
|
||||
#include "iwl-rfkill.h"
|
||||
#include "iwl-eeprom.h"
|
||||
#include "iwl-4965-hw.h"
|
||||
#include "iwl-csr.h"
|
||||
#include "iwl-prph.h"
|
||||
#include "iwl-fh.h"
|
||||
#include "iwl-debug.h"
|
||||
#include "iwl-rfkill.h"
|
||||
#include "iwl-4965-hw.h"
|
||||
#include "iwl-3945-hw.h"
|
||||
#include "iwl-3945-led.h"
|
||||
#include "iwl-led.h"
|
||||
#include "iwl-power.h"
|
||||
#include "iwl-agn-rs.h"
|
||||
|
@ -55,6 +57,16 @@ extern struct iwl_cfg iwl5350_agn_cfg;
|
|||
extern struct iwl_cfg iwl5100_bg_cfg;
|
||||
extern struct iwl_cfg iwl5100_abg_cfg;
|
||||
extern struct iwl_cfg iwl5150_agn_cfg;
|
||||
extern struct iwl_cfg iwl6000_2ag_cfg;
|
||||
extern struct iwl_cfg iwl6000_2agn_cfg;
|
||||
extern struct iwl_cfg iwl6000_3agn_cfg;
|
||||
extern struct iwl_cfg iwl6050_2agn_cfg;
|
||||
extern struct iwl_cfg iwl6050_3agn_cfg;
|
||||
extern struct iwl_cfg iwl100_bgn_cfg;
|
||||
|
||||
/* shared structures from iwl-5000.c */
|
||||
extern struct iwl_mod_params iwl50_mod_params;
|
||||
extern struct iwl_ops iwl5000_ops;
|
||||
|
||||
/* CT-KILL constants */
|
||||
#define CT_KILL_THRESHOLD 110 /* in Celsius */
|
||||
|
@ -132,9 +144,12 @@ struct iwl_tx_info {
|
|||
* A Tx queue consists of circular buffer of BDs (a.k.a. TFDs, transmit frame
|
||||
* descriptors) and required locking structures.
|
||||
*/
|
||||
#define TFD_TX_CMD_SLOTS 256
|
||||
#define TFD_CMD_SLOTS 32
|
||||
|
||||
struct iwl_tx_queue {
|
||||
struct iwl_queue q;
|
||||
struct iwl_tfd *tfds;
|
||||
void *tfds;
|
||||
struct iwl_cmd *cmd[TFD_TX_CMD_SLOTS];
|
||||
struct iwl_tx_info *txb;
|
||||
u8 need_update;
|
||||
|
@ -154,6 +169,36 @@ struct iwl4965_channel_tgh_info {
|
|||
s64 last_radar_time;
|
||||
};
|
||||
|
||||
#define IWL4965_MAX_RATE (33)
|
||||
|
||||
struct iwl3945_clip_group {
|
||||
/* maximum power level to prevent clipping for each rate, derived by
|
||||
* us from this band's saturation power in EEPROM */
|
||||
const s8 clip_powers[IWL_MAX_RATES];
|
||||
};
|
||||
|
||||
/* current Tx power values to use, one for each rate for each channel.
|
||||
* requested power is limited by:
|
||||
* -- regulatory EEPROM limits for this channel
|
||||
* -- hardware capabilities (clip-powers)
|
||||
* -- spectrum management
|
||||
* -- user preference (e.g. iwconfig)
|
||||
* when requested power is set, base power index must also be set. */
|
||||
struct iwl3945_channel_power_info {
|
||||
struct iwl3945_tx_power tpc; /* actual radio and DSP gain settings */
|
||||
s8 power_table_index; /* actual (compenst'd) index into gain table */
|
||||
s8 base_power_index; /* gain index for power at factory temp. */
|
||||
s8 requested_power; /* power (dBm) requested for this chnl/rate */
|
||||
};
|
||||
|
||||
/* current scan Tx power values to use, one for each scan rate for each
|
||||
* channel. */
|
||||
struct iwl3945_scan_power_info {
|
||||
struct iwl3945_tx_power tpc; /* actual radio and DSP gain settings */
|
||||
s8 power_table_index; /* actual (compenst'd) index into gain table */
|
||||
s8 requested_power; /* scan pwr (dBm) requested for chnl/rate */
|
||||
};
|
||||
|
||||
/*
|
||||
* One for each channel, holds all channel setup data
|
||||
* Some of the fields (e.g. eeprom and flags/max_power_avg) are redundant
|
||||
|
@ -184,8 +229,15 @@ struct iwl_channel_info {
|
|||
s8 fat_scan_power; /* (dBm) eeprom, direct scans, any rate */
|
||||
u8 fat_flags; /* flags copied from EEPROM */
|
||||
u8 fat_extension_channel; /* HT_IE_EXT_CHANNEL_* */
|
||||
};
|
||||
|
||||
/* Radio/DSP gain settings for each "normal" data Tx rate.
|
||||
* These include, in addition to RF and DSP gain, a few fields for
|
||||
* remembering/modifying gain settings (indexes). */
|
||||
struct iwl3945_channel_power_info power_info[IWL4965_MAX_RATE];
|
||||
|
||||
/* Radio/DSP gain settings for each scan rate, for directed scans. */
|
||||
struct iwl3945_scan_power_info scan_pwr_info[IWL_NUM_SCAN_RATES];
|
||||
};
|
||||
|
||||
#define IWL_TX_FIFO_AC0 0
|
||||
#define IWL_TX_FIFO_AC1 1
|
||||
|
@ -370,7 +422,7 @@ struct iwl_hw_key {
|
|||
u8 key[32];
|
||||
};
|
||||
|
||||
union iwl4965_ht_rate_supp {
|
||||
union iwl_ht_rate_supp {
|
||||
u16 rates;
|
||||
struct {
|
||||
u8 siso_rate;
|
||||
|
@ -430,6 +482,24 @@ struct iwl_qos_info {
|
|||
#define STA_PS_STATUS_WAKE 0
|
||||
#define STA_PS_STATUS_SLEEP 1
|
||||
|
||||
struct iwl3945_tid_data {
|
||||
u16 seq_number;
|
||||
};
|
||||
|
||||
struct iwl3945_hw_key {
|
||||
enum ieee80211_key_alg alg;
|
||||
int keylen;
|
||||
u8 key[32];
|
||||
};
|
||||
|
||||
struct iwl3945_station_entry {
|
||||
struct iwl3945_addsta_cmd sta;
|
||||
struct iwl3945_tid_data tid[MAX_TID_COUNT];
|
||||
u8 used;
|
||||
u8 ps_status;
|
||||
struct iwl3945_hw_key keyinfo;
|
||||
};
|
||||
|
||||
struct iwl_station_entry {
|
||||
struct iwl_addsta_cmd sta;
|
||||
struct iwl_tid_data tid[MAX_TID_COUNT];
|
||||
|
@ -497,11 +567,13 @@ struct iwl_sensitivity_ranges {
|
|||
* @max_txq_num: Max # Tx queues supported
|
||||
* @dma_chnl_num: Number of Tx DMA/FIFO channels
|
||||
* @scd_bc_tbls_size: size of scheduler byte count tables
|
||||
* @tfd_size: TFD size
|
||||
* @tx/rx_chains_num: Number of TX/RX chains
|
||||
* @valid_tx/rx_ant: usable antennas
|
||||
* @max_rxq_size: Max # Rx frames in Rx queue (must be power-of-2)
|
||||
* @max_rxq_log: Log-base-2 of max_rxq_size
|
||||
* @rx_buf_size: Rx buffer size
|
||||
* @rx_wrt_ptr_reg: FH{39}_RSCSR_CHNL0_WPTR
|
||||
* @max_stations:
|
||||
* @bcast_sta_id:
|
||||
* @fat_channel: is 40MHz width possible in band 2.4
|
||||
|
@ -516,6 +588,7 @@ struct iwl_hw_params {
|
|||
u8 max_txq_num;
|
||||
u8 dma_chnl_num;
|
||||
u16 scd_bc_tbls_size;
|
||||
u32 tfd_size;
|
||||
u8 tx_chains_num;
|
||||
u8 rx_chains_num;
|
||||
u8 valid_tx_ant;
|
||||
|
@ -523,6 +596,7 @@ struct iwl_hw_params {
|
|||
u16 max_rxq_size;
|
||||
u16 max_rxq_log;
|
||||
u32 rx_buf_size;
|
||||
u32 rx_wrt_ptr_reg;
|
||||
u32 max_pkt_size;
|
||||
u8 max_stations;
|
||||
u8 bcast_sta_id;
|
||||
|
@ -755,7 +829,7 @@ struct iwl_priv {
|
|||
|
||||
struct ieee80211_supported_band bands[IEEE80211_NUM_BANDS];
|
||||
|
||||
#ifdef CONFIG_IWLAGN_SPECTRUM_MEASUREMENT
|
||||
#if defined(CONFIG_IWLAGN_SPECTRUM_MEASUREMENT) || defined(CONFIG_IWL3945_SPECTRUM_MEASUREMENT)
|
||||
/* spectrum measurement report caching */
|
||||
struct iwl_spectrum_notification measure_report;
|
||||
u8 measurement_status;
|
||||
|
@ -768,6 +842,10 @@ struct iwl_priv {
|
|||
struct iwl_channel_info *channel_info; /* channel info array */
|
||||
u8 channel_count; /* # of channels */
|
||||
|
||||
/* each calibration channel group in the EEPROM has a derived
|
||||
* clip setting for each rate. 3945 only.*/
|
||||
const struct iwl3945_clip_group clip39_groups[5];
|
||||
|
||||
/* thermal calibration */
|
||||
s32 temperature; /* degrees Kelvin */
|
||||
s32 last_temperature;
|
||||
|
@ -781,7 +859,7 @@ struct iwl_priv {
|
|||
unsigned long scan_start;
|
||||
unsigned long scan_pass_start;
|
||||
unsigned long scan_start_tsf;
|
||||
struct iwl_scan_cmd *scan;
|
||||
void *scan;
|
||||
int scan_bands;
|
||||
int one_direct_scan;
|
||||
u8 direct_ssid_len;
|
||||
|
@ -832,18 +910,25 @@ struct iwl_priv {
|
|||
* 4965's initialize alive response contains some calibration data. */
|
||||
struct iwl_init_alive_resp card_alive_init;
|
||||
struct iwl_alive_resp card_alive;
|
||||
#ifdef CONFIG_IWLWIFI_RFKILL
|
||||
#if defined(CONFIG_IWLWIFI_RFKILL) || defined(CONFIG_IWL3945_RFKILL)
|
||||
struct rfkill *rfkill;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_LEDS
|
||||
struct iwl_led led[IWL_LED_TRG_MAX];
|
||||
#if defined(CONFIG_IWLWIFI_LEDS) || defined(CONFIG_IWL3945_LEDS)
|
||||
unsigned long last_blink_time;
|
||||
u8 last_blink_rate;
|
||||
u8 allow_blinking;
|
||||
u64 led_tpt;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_LEDS
|
||||
struct iwl_led led[IWL_LED_TRG_MAX];
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_IWL3945_LEDS
|
||||
struct iwl3945_led led39[IWL_LED_TRG_MAX];
|
||||
unsigned int rxtxpackets;
|
||||
#endif
|
||||
u16 active_rate;
|
||||
u16 active_rate_basic;
|
||||
|
||||
|
@ -893,7 +978,6 @@ struct iwl_priv {
|
|||
u16 rates_mask;
|
||||
|
||||
u32 power_mode;
|
||||
u32 antenna;
|
||||
u8 bssid[ETH_ALEN];
|
||||
u16 rts_threshold;
|
||||
u8 mac_addr[ETH_ALEN];
|
||||
|
@ -929,6 +1013,10 @@ struct iwl_priv {
|
|||
u16 beacon_int;
|
||||
struct ieee80211_vif *vif;
|
||||
|
||||
/*Added for 3945 */
|
||||
void *shared_virt;
|
||||
dma_addr_t shared_phys;
|
||||
/*End*/
|
||||
struct iwl_hw_params hw_params;
|
||||
|
||||
|
||||
|
@ -960,6 +1048,11 @@ struct iwl_priv {
|
|||
struct delayed_work init_alive_start;
|
||||
struct delayed_work alive_start;
|
||||
struct delayed_work scan_check;
|
||||
|
||||
/*For 3945 only*/
|
||||
struct delayed_work thermal_periodic;
|
||||
struct delayed_work rfkill_poll;
|
||||
|
||||
/* TX Power */
|
||||
s8 tx_power_user_lmt;
|
||||
s8 tx_power_channel_lmt;
|
||||
|
@ -982,6 +1075,22 @@ struct iwl_priv {
|
|||
u32 disable_tx_power_cal;
|
||||
struct work_struct run_time_calib_work;
|
||||
struct timer_list statistics_periodic;
|
||||
|
||||
/*For 3945*/
|
||||
#define IWL_DEFAULT_TX_POWER 0x0F
|
||||
/* We declare this const so it can only be
|
||||
* changed via explicit cast within the
|
||||
* routines that actually update the physical
|
||||
* hardware */
|
||||
const struct iwl3945_rxon_cmd active39_rxon;
|
||||
struct iwl3945_rxon_cmd staging39_rxon;
|
||||
struct iwl3945_rxon_cmd recovery39_rxon;
|
||||
|
||||
struct iwl3945_notif_statistics statistics_39;
|
||||
|
||||
struct iwl3945_station_entry stations_39[IWL_STATION_COUNT];
|
||||
|
||||
u32 sta_supp_rates;
|
||||
}; /*iwl_priv */
|
||||
|
||||
static inline void iwl_txq_ctx_activate(struct iwl_priv *priv, int txq_id)
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2008 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -30,7 +30,7 @@
|
|||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -145,7 +145,7 @@ int iwlcore_eeprom_verify_signature(struct iwl_priv *priv)
|
|||
{
|
||||
u32 gp = iwl_read32(priv, CSR_EEPROM_GP);
|
||||
if ((gp & CSR_EEPROM_GP_VALID_MSK) == CSR_EEPROM_GP_BAD_SIGNATURE) {
|
||||
IWL_ERROR("EEPROM not found, EEPROM_GP=0x%08x\n", gp);
|
||||
IWL_ERR(priv, "EEPROM not found, EEPROM_GP=0x%08x\n", gp);
|
||||
return -ENOENT;
|
||||
}
|
||||
return 0;
|
||||
|
@ -223,7 +223,7 @@ int iwl_eeprom_init(struct iwl_priv *priv)
|
|||
|
||||
ret = priv->cfg->ops->lib->eeprom_ops.verify_signature(priv);
|
||||
if (ret < 0) {
|
||||
IWL_ERROR("EEPROM not found, EEPROM_GP=0x%08x\n", gp);
|
||||
IWL_ERR(priv, "EEPROM not found, EEPROM_GP=0x%08x\n", gp);
|
||||
ret = -ENOENT;
|
||||
goto err;
|
||||
}
|
||||
|
@ -231,7 +231,7 @@ int iwl_eeprom_init(struct iwl_priv *priv)
|
|||
/* Make sure driver (instead of uCode) is allowed to read EEPROM */
|
||||
ret = priv->cfg->ops->lib->eeprom_ops.acquire_semaphore(priv);
|
||||
if (ret < 0) {
|
||||
IWL_ERROR("Failed to acquire EEPROM semaphore.\n");
|
||||
IWL_ERR(priv, "Failed to acquire EEPROM semaphore.\n");
|
||||
ret = -ENOENT;
|
||||
goto err;
|
||||
}
|
||||
|
@ -247,7 +247,7 @@ int iwl_eeprom_init(struct iwl_priv *priv)
|
|||
CSR_EEPROM_REG_READ_VALID_MSK,
|
||||
IWL_EEPROM_ACCESS_TIMEOUT);
|
||||
if (ret < 0) {
|
||||
IWL_ERROR("Time out reading EEPROM[%d]\n", addr);
|
||||
IWL_ERR(priv, "Time out reading EEPROM[%d]\n", addr);
|
||||
goto done;
|
||||
}
|
||||
r = _iwl_read_direct32(priv, CSR_EEPROM_REG);
|
||||
|
@ -285,7 +285,7 @@ int iwl_eeprom_check_version(struct iwl_priv *priv)
|
|||
|
||||
return 0;
|
||||
err:
|
||||
IWL_ERROR("Unsupported EEPROM VER=0x%x < 0x%x CALIB=0x%x < 0x%x\n",
|
||||
IWL_ERR(priv, "Unsupported EEPROM VER=0x%x < 0x%x CALIB=0x%x < 0x%x\n",
|
||||
eeprom_ver, priv->cfg->eeprom_ver,
|
||||
calib_ver, priv->cfg->eeprom_calib_ver);
|
||||
return -EINVAL;
|
||||
|
@ -450,7 +450,7 @@ int iwl_init_channel_map(struct iwl_priv *priv)
|
|||
priv->channel_info = kzalloc(sizeof(struct iwl_channel_info) *
|
||||
priv->channel_count, GFP_KERNEL);
|
||||
if (!priv->channel_info) {
|
||||
IWL_ERROR("Could not allocate channel_info\n");
|
||||
IWL_ERR(priv, "Could not allocate channel_info\n");
|
||||
priv->channel_count = 0;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
@ -520,7 +520,7 @@ int iwl_init_channel_map(struct iwl_priv *priv)
|
|||
flags & EEPROM_CHANNEL_RADAR))
|
||||
? "" : "not ");
|
||||
|
||||
/* Set the user_txpower_limit to the highest power
|
||||
/* 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)
|
||||
|
@ -531,6 +531,13 @@ int iwl_init_channel_map(struct iwl_priv *priv)
|
|||
}
|
||||
}
|
||||
|
||||
/* Check if we do have FAT channels */
|
||||
if (priv->cfg->ops->lib->eeprom_ops.regulatory_bands[5] >=
|
||||
priv->cfg->eeprom_size &&
|
||||
priv->cfg->ops->lib->eeprom_ops.regulatory_bands[6] >=
|
||||
priv->cfg->eeprom_size)
|
||||
return 0;
|
||||
|
||||
/* Two additional EEPROM bands for 2.4 and 5 GHz FAT channels */
|
||||
for (band = 6; band <= 7; band++) {
|
||||
enum ieee80211_band ieeeband;
|
||||
|
@ -582,6 +589,7 @@ void iwl_free_channel_map(struct iwl_priv *priv)
|
|||
kfree(priv->channel_info);
|
||||
priv->channel_count = 0;
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_free_channel_map);
|
||||
|
||||
/**
|
||||
* iwl_get_channel_info - Find driver's private channel info
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2008 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -30,7 +30,7 @@
|
|||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -118,6 +118,9 @@ struct iwl_eeprom_channel {
|
|||
s8 max_power_avg; /* max power (dBm) on this chnl, limit 31 */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* 3945 Specific */
|
||||
#define EEPROM_3945_EEPROM_VERSION (0x2f)
|
||||
|
||||
/* 4965 has two radio transmitters (and 3 radio receivers) */
|
||||
#define EEPROM_TX_POWER_TX_CHAINS (2)
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -30,7 +30,7 @@
|
|||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -399,6 +399,21 @@
|
|||
*/
|
||||
#define FH_TX_CHICKEN_BITS_SCD_AUTO_RETRY_EN (0x00000002)
|
||||
|
||||
#define RX_QUEUE_SIZE 256
|
||||
#define RX_QUEUE_MASK 255
|
||||
#define RX_QUEUE_SIZE_LOG 8
|
||||
|
||||
/*
|
||||
* RX related structures and functions
|
||||
*/
|
||||
#define RX_FREE_BUFFERS 64
|
||||
#define RX_LOW_WATERMARK 8
|
||||
|
||||
/* Size of one Rx buffer in host DRAM */
|
||||
#define IWL_RX_BUF_SIZE_3K (3 * 1000) /* 3945 only */
|
||||
#define IWL_RX_BUF_SIZE_4K (4 * 1024)
|
||||
#define IWL_RX_BUF_SIZE_8K (8 * 1024)
|
||||
|
||||
/**
|
||||
* struct iwl_rb_status - reseve buffer status
|
||||
* host memory mapped FH registers
|
||||
|
@ -414,6 +429,7 @@ struct iwl_rb_status {
|
|||
__le16 closed_fr_num;
|
||||
__le16 finished_rb_num;
|
||||
__le16 finished_fr_nam;
|
||||
__le32 __unused; /* 3945 only */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
|
||||
|
@ -477,7 +493,6 @@ struct iwl_tfd {
|
|||
__le32 __pad;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
|
||||
/* Keep Warm Size */
|
||||
#define IWL_KW_SIZE 0x1000 /* 4k */
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2008 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -109,14 +109,14 @@ static int iwl_generic_cmd_callback(struct iwl_priv *priv,
|
|||
struct iwl_rx_packet *pkt = NULL;
|
||||
|
||||
if (!skb) {
|
||||
IWL_ERROR("Error: Response NULL in %s.\n",
|
||||
IWL_ERR(priv, "Error: Response NULL in %s.\n",
|
||||
get_cmd_string(cmd->hdr.cmd));
|
||||
return 1;
|
||||
}
|
||||
|
||||
pkt = (struct iwl_rx_packet *)skb->data;
|
||||
if (pkt->hdr.flags & IWL_CMD_FAILED_MSK) {
|
||||
IWL_ERROR("Bad return from %s (0x%08X)\n",
|
||||
IWL_ERR(priv, "Bad return from %s (0x%08X)\n",
|
||||
get_cmd_string(cmd->hdr.cmd), pkt->hdr.flags);
|
||||
return 1;
|
||||
}
|
||||
|
@ -156,7 +156,7 @@ static int iwl_send_cmd_async(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
|
|||
|
||||
ret = iwl_enqueue_hcmd(priv, cmd);
|
||||
if (ret < 0) {
|
||||
IWL_ERROR("Error sending %s: enqueue_hcmd failed: %d\n",
|
||||
IWL_ERR(priv, "Error sending %s: enqueue_hcmd failed: %d\n",
|
||||
get_cmd_string(cmd->id), ret);
|
||||
return ret;
|
||||
}
|
||||
|
@ -174,8 +174,9 @@ int iwl_send_cmd_sync(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
|
|||
BUG_ON(cmd->meta.u.callback != NULL);
|
||||
|
||||
if (test_and_set_bit(STATUS_HCMD_SYNC_ACTIVE, &priv->status)) {
|
||||
IWL_ERROR("Error sending %s: Already sending a host command\n",
|
||||
get_cmd_string(cmd->id));
|
||||
IWL_ERR(priv,
|
||||
"Error sending %s: Already sending a host command\n",
|
||||
get_cmd_string(cmd->id));
|
||||
ret = -EBUSY;
|
||||
goto out;
|
||||
}
|
||||
|
@ -188,7 +189,7 @@ int iwl_send_cmd_sync(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
|
|||
cmd_idx = iwl_enqueue_hcmd(priv, cmd);
|
||||
if (cmd_idx < 0) {
|
||||
ret = cmd_idx;
|
||||
IWL_ERROR("Error sending %s: enqueue_hcmd failed: %d\n",
|
||||
IWL_ERR(priv, "Error sending %s: enqueue_hcmd failed: %d\n",
|
||||
get_cmd_string(cmd->id), ret);
|
||||
goto out;
|
||||
}
|
||||
|
@ -198,9 +199,10 @@ int iwl_send_cmd_sync(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
|
|||
HOST_COMPLETE_TIMEOUT);
|
||||
if (!ret) {
|
||||
if (test_bit(STATUS_HCMD_ACTIVE, &priv->status)) {
|
||||
IWL_ERROR("Error sending %s: time out after %dms.\n",
|
||||
get_cmd_string(cmd->id),
|
||||
jiffies_to_msecs(HOST_COMPLETE_TIMEOUT));
|
||||
IWL_ERR(priv,
|
||||
"Error sending %s: time out after %dms.\n",
|
||||
get_cmd_string(cmd->id),
|
||||
jiffies_to_msecs(HOST_COMPLETE_TIMEOUT));
|
||||
|
||||
clear_bit(STATUS_HCMD_ACTIVE, &priv->status);
|
||||
ret = -ETIMEDOUT;
|
||||
|
@ -221,7 +223,7 @@ int iwl_send_cmd_sync(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
|
|||
goto fail;
|
||||
}
|
||||
if ((cmd->meta.flags & CMD_WANT_SKB) && !cmd->meta.u.skb) {
|
||||
IWL_ERROR("Error: Response NULL in '%s'\n",
|
||||
IWL_ERR(priv, "Error: Response NULL in '%s'\n",
|
||||
get_cmd_string(cmd->id));
|
||||
ret = -EIO;
|
||||
goto cancel;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2003 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* Portions of this file are derived from the ipw3945 project, as well
|
||||
* as portions of the ieee80211 subsystem header files.
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2003 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* Portions of this file are derived from the ipw3945 project.
|
||||
*
|
||||
|
@ -165,9 +165,9 @@ static inline int _iwl_grab_nic_access(struct iwl_priv *priv)
|
|||
ret = _iwl_poll_bit(priv, CSR_GP_CNTRL,
|
||||
CSR_GP_CNTRL_REG_VAL_MAC_ACCESS_EN,
|
||||
(CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY |
|
||||
CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP), 50);
|
||||
CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP), 15000);
|
||||
if (ret < 0) {
|
||||
IWL_ERROR("MAC is in deep sleep!\n");
|
||||
IWL_ERR(priv, "MAC is in deep sleep!\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
@ -182,7 +182,7 @@ static inline int __iwl_grab_nic_access(const char *f, u32 l,
|
|||
struct iwl_priv *priv)
|
||||
{
|
||||
if (atomic_read(&priv->restrict_refcnt))
|
||||
IWL_ERROR("Grabbing access while already held %s %d.\n", f, l);
|
||||
IWL_ERR(priv, "Grabbing access while already held %s %d.\n", f, l);
|
||||
|
||||
IWL_DEBUG_IO("grabbing nic access - %s %d\n", f, l);
|
||||
return _iwl_grab_nic_access(priv);
|
||||
|
@ -207,7 +207,7 @@ static inline void __iwl_release_nic_access(const char *f, u32 l,
|
|||
struct iwl_priv *priv)
|
||||
{
|
||||
if (atomic_read(&priv->restrict_refcnt) <= 0)
|
||||
IWL_ERROR("Release unheld nic access at line %s %d.\n", f, l);
|
||||
IWL_ERR(priv, "Release unheld nic access at line %s %d.\n", f, l);
|
||||
|
||||
IWL_DEBUG_IO("releasing nic access - %s %d\n", f, l);
|
||||
_iwl_release_nic_access(priv);
|
||||
|
@ -229,7 +229,7 @@ static inline u32 __iwl_read_direct32(const char *f, u32 l,
|
|||
{
|
||||
u32 value = _iwl_read_direct32(priv, reg);
|
||||
if (!atomic_read(&priv->restrict_refcnt))
|
||||
IWL_ERROR("Nic access not held from %s %d\n", f, l);
|
||||
IWL_ERR(priv, "Nic access not held from %s %d\n", f, l);
|
||||
IWL_DEBUG_IO("read_direct32(0x%4X) = 0x%08x - %s %d \n", reg, value,
|
||||
f, l);
|
||||
return value;
|
||||
|
@ -250,7 +250,7 @@ static void __iwl_write_direct32(const char *f , u32 line,
|
|||
struct iwl_priv *priv, u32 reg, u32 value)
|
||||
{
|
||||
if (!atomic_read(&priv->restrict_refcnt))
|
||||
IWL_ERROR("Nic access not held from %s line %d\n", f, line);
|
||||
IWL_ERR(priv, "Nic access not held from %s line %d\n", f, line);
|
||||
_iwl_write_direct32(priv, reg, value);
|
||||
}
|
||||
#define iwl_write_direct32(priv, reg, value) \
|
||||
|
@ -308,7 +308,7 @@ static inline u32 __iwl_read_prph(const char *f, u32 line,
|
|||
struct iwl_priv *priv, u32 reg)
|
||||
{
|
||||
if (!atomic_read(&priv->restrict_refcnt))
|
||||
IWL_ERROR("Nic access not held from %s line %d\n", f, line);
|
||||
IWL_ERR(priv, "Nic access not held from %s line %d\n", f, line);
|
||||
return _iwl_read_prph(priv, reg);
|
||||
}
|
||||
|
||||
|
@ -331,7 +331,7 @@ static inline void __iwl_write_prph(const char *f, u32 line,
|
|||
struct iwl_priv *priv, u32 addr, u32 val)
|
||||
{
|
||||
if (!atomic_read(&priv->restrict_refcnt))
|
||||
IWL_ERROR("Nic access not held from %s line %d\n", f, line);
|
||||
IWL_ERR(priv, "Nic access not held from %s line %d\n", f, line);
|
||||
_iwl_write_prph(priv, addr, val);
|
||||
}
|
||||
|
||||
|
@ -349,7 +349,7 @@ static inline void __iwl_set_bits_prph(const char *f, u32 line,
|
|||
u32 reg, u32 mask)
|
||||
{
|
||||
if (!atomic_read(&priv->restrict_refcnt))
|
||||
IWL_ERROR("Nic access not held from %s line %d\n", f, line);
|
||||
IWL_ERR(priv, "Nic access not held from %s line %d\n", f, line);
|
||||
|
||||
_iwl_set_bits_prph(priv, reg, mask);
|
||||
}
|
||||
|
@ -367,7 +367,7 @@ static inline void __iwl_set_bits_mask_prph(const char *f, u32 line,
|
|||
struct iwl_priv *priv, u32 reg, u32 bits, u32 mask)
|
||||
{
|
||||
if (!atomic_read(&priv->restrict_refcnt))
|
||||
IWL_ERROR("Nic access not held from %s line %d\n", f, line);
|
||||
IWL_ERR(priv, "Nic access not held from %s line %d\n", f, line);
|
||||
_iwl_set_bits_mask_prph(priv, reg, bits, mask);
|
||||
}
|
||||
#define iwl_set_bits_mask_prph(priv, reg, bits, mask) \
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2003 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -254,7 +254,7 @@ static int iwl_leds_register_led(struct iwl_priv *priv, struct iwl_led *led,
|
|||
|
||||
ret = led_classdev_register(device, &led->led_dev);
|
||||
if (ret) {
|
||||
IWL_ERROR("Error: failed to register led handler.\n");
|
||||
IWL_ERR(priv, "Error: failed to register led handler.\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2003 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -30,7 +30,7 @@
|
|||
|
||||
struct iwl_priv;
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_LEDS
|
||||
#if defined(CONFIG_IWLWIFI_LEDS) || defined(CONFIG_IWL3945_LEDS)
|
||||
#include <linux/leds.h>
|
||||
|
||||
#define IWL_LED_SOLID 11
|
||||
|
@ -47,7 +47,9 @@ enum led_type {
|
|||
IWL_LED_TRG_RADIO,
|
||||
IWL_LED_TRG_MAX,
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_LEDS
|
||||
|
||||
struct iwl_led {
|
||||
struct iwl_priv *priv;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* Portions of this file are derived from the ipw3945 project, as well
|
||||
* as portions of the ieee80211 subsystem header files.
|
||||
|
@ -60,14 +60,6 @@
|
|||
#define IWL_POWER_RANGE_1_MAX (10)
|
||||
|
||||
|
||||
#define NOSLP __constant_cpu_to_le16(0), 0, 0
|
||||
#define SLP IWL_POWER_DRIVER_ALLOW_SLEEP_MSK, 0, 0
|
||||
#define SLP_TOUT(T) __constant_cpu_to_le32((T) * MSEC_TO_USEC)
|
||||
#define SLP_VEC(X0, X1, X2, X3, X4) {__constant_cpu_to_le32(X0), \
|
||||
__constant_cpu_to_le32(X1), \
|
||||
__constant_cpu_to_le32(X2), \
|
||||
__constant_cpu_to_le32(X3), \
|
||||
__constant_cpu_to_le32(X4)}
|
||||
|
||||
#define IWL_POWER_ON_BATTERY IWL_POWER_INDEX_5
|
||||
#define IWL_POWER_ON_AC_DISASSOC IWL_POWER_MODE_CAM
|
||||
|
@ -149,7 +141,7 @@ static u16 iwl_get_auto_power_mode(struct iwl_priv *priv)
|
|||
}
|
||||
|
||||
/* initialize to default */
|
||||
static int iwl_power_init_handle(struct iwl_priv *priv)
|
||||
static void iwl_power_init_handle(struct iwl_priv *priv)
|
||||
{
|
||||
struct iwl_power_mgr *pow_data;
|
||||
int size = sizeof(struct iwl_power_vec_entry) * IWL_POWER_MAX;
|
||||
|
@ -159,7 +151,7 @@ static int iwl_power_init_handle(struct iwl_priv *priv)
|
|||
|
||||
IWL_DEBUG_POWER("Initialize power \n");
|
||||
|
||||
pow_data = &(priv->power_data);
|
||||
pow_data = &priv->power_data;
|
||||
|
||||
memset(pow_data, 0, sizeof(*pow_data));
|
||||
|
||||
|
@ -179,26 +171,25 @@ static int iwl_power_init_handle(struct iwl_priv *priv)
|
|||
else
|
||||
cmd->flags |= IWL_POWER_PCI_PM_MSK;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* adjust power command according to DTIM period and power level*/
|
||||
static int iwl_update_power_command(struct iwl_priv *priv,
|
||||
struct iwl_powertable_cmd *cmd,
|
||||
u16 mode)
|
||||
static int iwl_update_power_cmd(struct iwl_priv *priv,
|
||||
struct iwl_powertable_cmd *cmd, u16 mode)
|
||||
{
|
||||
int ret = 0, i;
|
||||
u8 skip;
|
||||
u32 max_sleep = 0;
|
||||
struct iwl_power_vec_entry *range;
|
||||
u8 period = 0;
|
||||
struct iwl_power_mgr *pow_data;
|
||||
int i;
|
||||
u32 max_sleep = 0;
|
||||
u8 period;
|
||||
bool skip;
|
||||
|
||||
if (mode > IWL_POWER_INDEX_5) {
|
||||
IWL_DEBUG_POWER("Error invalid power mode \n");
|
||||
return -1;
|
||||
return -EINVAL;
|
||||
}
|
||||
pow_data = &(priv->power_data);
|
||||
|
||||
pow_data = &priv->power_data;
|
||||
|
||||
if (pow_data->dtim_period <= IWL_POWER_RANGE_0_MAX)
|
||||
range = &pow_data->pwr_range_0[0];
|
||||
|
@ -212,14 +203,12 @@ static int iwl_update_power_command(struct iwl_priv *priv,
|
|||
|
||||
if (period == 0) {
|
||||
period = 1;
|
||||
skip = 0;
|
||||
} else
|
||||
skip = range[mode].no_dtim;
|
||||
|
||||
if (skip == 0) {
|
||||
max_sleep = period;
|
||||
cmd->flags &= ~IWL_POWER_SLEEP_OVER_DTIM_MSK;
|
||||
skip = false;
|
||||
} else {
|
||||
skip = !!range[mode].no_dtim;
|
||||
}
|
||||
|
||||
if (skip) {
|
||||
__le32 slp_itrvl = cmd->sleep_interval[IWL_POWER_VEC_SIZE - 1];
|
||||
max_sleep = le32_to_cpu(slp_itrvl);
|
||||
if (max_sleep == 0xFF)
|
||||
|
@ -227,12 +216,14 @@ static int iwl_update_power_command(struct iwl_priv *priv,
|
|||
else if (max_sleep > period)
|
||||
max_sleep = (le32_to_cpu(slp_itrvl) / period) * period;
|
||||
cmd->flags |= IWL_POWER_SLEEP_OVER_DTIM_MSK;
|
||||
} else {
|
||||
max_sleep = period;
|
||||
cmd->flags &= ~IWL_POWER_SLEEP_OVER_DTIM_MSK;
|
||||
}
|
||||
|
||||
for (i = 0; i < IWL_POWER_VEC_SIZE; i++) {
|
||||
for (i = 0; i < IWL_POWER_VEC_SIZE; i++)
|
||||
if (le32_to_cpu(cmd->sleep_interval[i]) > max_sleep)
|
||||
cmd->sleep_interval[i] = cpu_to_le32(max_sleep);
|
||||
}
|
||||
|
||||
IWL_DEBUG_POWER("Flags value = 0x%08X\n", cmd->flags);
|
||||
IWL_DEBUG_POWER("Tx timeout = %u\n", le32_to_cpu(cmd->tx_data_timeout));
|
||||
|
@ -244,7 +235,7 @@ static int iwl_update_power_command(struct iwl_priv *priv,
|
|||
le32_to_cpu(cmd->sleep_interval[3]),
|
||||
le32_to_cpu(cmd->sleep_interval[4]));
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -295,7 +286,7 @@ int iwl_power_update_mode(struct iwl_priv *priv, bool force)
|
|||
if (final_mode != IWL_POWER_MODE_CAM)
|
||||
set_bit(STATUS_POWER_PMI, &priv->status);
|
||||
|
||||
iwl_update_power_command(priv, &cmd, final_mode);
|
||||
iwl_update_power_cmd(priv, &cmd, final_mode);
|
||||
cmd.keep_alive_beacons = 0;
|
||||
|
||||
if (final_mode == IWL_POWER_INDEX_5)
|
||||
|
@ -392,13 +383,11 @@ EXPORT_SYMBOL(iwl_power_set_system_mode);
|
|||
/* initialize to default */
|
||||
void iwl_power_initialize(struct iwl_priv *priv)
|
||||
{
|
||||
|
||||
iwl_power_init_handle(priv);
|
||||
priv->power_data.user_power_setting = IWL_POWER_AUTO;
|
||||
priv->power_data.power_disabled = 0;
|
||||
priv->power_data.system_power_setting = IWL_POWER_SYS_AUTO;
|
||||
priv->power_data.is_battery_active = 0;
|
||||
priv->power_data.power_disabled = 0;
|
||||
priv->power_data.is_battery_active = 0;
|
||||
priv->power_data.critical_power_setting = 0;
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_power_initialize);
|
||||
|
@ -407,8 +396,8 @@ EXPORT_SYMBOL(iwl_power_initialize);
|
|||
int iwl_power_temperature_change(struct iwl_priv *priv)
|
||||
{
|
||||
int ret = 0;
|
||||
u16 new_critical = priv->power_data.critical_power_setting;
|
||||
s32 temperature = KELVIN_TO_CELSIUS(priv->last_temperature);
|
||||
u16 new_critical = priv->power_data.critical_power_setting;
|
||||
|
||||
if (temperature > IWL_CT_KILL_TEMPERATURE)
|
||||
return 0;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* Portions of this file are derived from the ipw3945 project, as well
|
||||
* as portions of the ieee80211 subsystem header files.
|
||||
|
@ -42,7 +42,10 @@ enum {
|
|||
IWL_POWER_INDEX_5,
|
||||
IWL_POWER_AUTO,
|
||||
IWL_POWER_MAX = IWL_POWER_AUTO,
|
||||
IWL39_POWER_AC = IWL_POWER_AUTO, /* 0x06 */
|
||||
IWL_POWER_AC,
|
||||
IWL39_POWER_BATTERY = IWL_POWER_AC, /* 0x07 */
|
||||
IWL39_POWER_LIMIT = IWL_POWER_AC,
|
||||
IWL_POWER_BATTERY,
|
||||
};
|
||||
|
||||
|
@ -56,8 +59,21 @@ enum {
|
|||
#define IWL_POWER_MASK 0x0F
|
||||
#define IWL_POWER_ENABLED 0x10
|
||||
|
||||
#define IWL_POWER_RANGE_0 (0)
|
||||
#define IWL_POWER_RANGE_1 (1)
|
||||
|
||||
#define IWL_POWER_LEVEL(x) ((x) & IWL_POWER_MASK)
|
||||
|
||||
/* Power management (not Tx power) structures */
|
||||
|
||||
#define NOSLP __constant_cpu_to_le16(0), 0, 0
|
||||
#define SLP IWL_POWER_DRIVER_ALLOW_SLEEP_MSK, 0, 0
|
||||
#define SLP_TOUT(T) __constant_cpu_to_le32((T) * MSEC_TO_USEC)
|
||||
#define SLP_VEC(X0, X1, X2, X3, X4) {__constant_cpu_to_le32(X0), \
|
||||
__constant_cpu_to_le32(X1), \
|
||||
__constant_cpu_to_le32(X2), \
|
||||
__constant_cpu_to_le32(X3), \
|
||||
__constant_cpu_to_le32(X4)}
|
||||
struct iwl_power_vec_entry {
|
||||
struct iwl_powertable_cmd cmd;
|
||||
u8 no_dtim;
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -30,7 +30,7 @@
|
|||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2003 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* Portions of this file are derived from the ipw3945 project, as well
|
||||
* as portions of the ieee80211 subsystem header files.
|
||||
|
@ -62,7 +62,8 @@ static int iwl_rfkill_soft_rf_kill(void *data, enum rfkill_state state)
|
|||
iwl_radio_kill_sw_disable_radio(priv);
|
||||
break;
|
||||
default:
|
||||
IWL_WARNING("we received unexpected RFKILL state %d\n", state);
|
||||
IWL_WARN(priv, "we received unexpected RFKILL state %d\n",
|
||||
state);
|
||||
break;
|
||||
}
|
||||
out_unlock:
|
||||
|
@ -81,7 +82,7 @@ int iwl_rfkill_init(struct iwl_priv *priv)
|
|||
IWL_DEBUG_RF_KILL("Initializing RFKILL.\n");
|
||||
priv->rfkill = rfkill_allocate(device, RFKILL_TYPE_WLAN);
|
||||
if (!priv->rfkill) {
|
||||
IWL_ERROR("Unable to allocate RFKILL device.\n");
|
||||
IWL_ERR(priv, "Unable to allocate RFKILL device.\n");
|
||||
ret = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
|
@ -97,7 +98,7 @@ int iwl_rfkill_init(struct iwl_priv *priv)
|
|||
|
||||
ret = rfkill_register(priv->rfkill);
|
||||
if (ret) {
|
||||
IWL_ERROR("Unable to register RFKILL: %d\n", ret);
|
||||
IWL_ERR(priv, "Unable to register RFKILL: %d\n", ret);
|
||||
goto free_rfkill;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2007 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* Portions of this file are derived from the ipw3945 project, as well
|
||||
* as portions of the ieee80211 subsystem header files.
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2003 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* Portions of this file are derived from the ipw3945 project, as well
|
||||
* as portions of the ieee80211 subsystem header files.
|
||||
|
@ -125,9 +125,10 @@ EXPORT_SYMBOL(iwl_rx_queue_space);
|
|||
*/
|
||||
int iwl_rx_queue_update_write_ptr(struct iwl_priv *priv, struct iwl_rx_queue *q)
|
||||
{
|
||||
u32 reg = 0;
|
||||
int ret = 0;
|
||||
unsigned long flags;
|
||||
u32 rx_wrt_ptr_reg = priv->hw_params.rx_wrt_ptr_reg;
|
||||
u32 reg;
|
||||
int ret = 0;
|
||||
|
||||
spin_lock_irqsave(&q->lock, flags);
|
||||
|
||||
|
@ -149,15 +150,14 @@ int iwl_rx_queue_update_write_ptr(struct iwl_priv *priv, struct iwl_rx_queue *q)
|
|||
goto exit_unlock;
|
||||
|
||||
/* Device expects a multiple of 8 */
|
||||
iwl_write_direct32(priv, FH_RSCSR_CHNL0_WPTR,
|
||||
q->write & ~0x7);
|
||||
iwl_write_direct32(priv, rx_wrt_ptr_reg, q->write & ~0x7);
|
||||
iwl_release_nic_access(priv);
|
||||
|
||||
/* Else device is assumed to be awake */
|
||||
} else
|
||||
} else {
|
||||
/* Device expects a multiple of 8 */
|
||||
iwl_write32(priv, FH_RSCSR_CHNL0_WPTR, q->write & ~0x7);
|
||||
|
||||
iwl_write32(priv, rx_wrt_ptr_reg, q->write & ~0x7);
|
||||
}
|
||||
|
||||
q->need_update = 0;
|
||||
|
||||
|
@ -262,8 +262,7 @@ void iwl_rx_allocate(struct iwl_priv *priv)
|
|||
rxb->skb = alloc_skb(priv->hw_params.rx_buf_size + 256,
|
||||
GFP_KERNEL);
|
||||
if (!rxb->skb) {
|
||||
printk(KERN_CRIT DRV_NAME
|
||||
"Can not allocate SKB buffers\n");
|
||||
IWL_CRIT(priv, "Can not allocate SKB buffers\n");
|
||||
/* We don't reschedule replenish work here -- we will
|
||||
* call the restock method and if it still needs
|
||||
* more buffers it will schedule replenish */
|
||||
|
@ -895,7 +894,7 @@ static void iwl_pass_packet_to_mac80211(struct iwl_priv *priv,
|
|||
rx_start = (struct iwl_rx_phy_res *)&priv->last_phy_res[1];
|
||||
|
||||
if (!rx_start) {
|
||||
IWL_ERROR("MPDU frame without a PHY data\n");
|
||||
IWL_ERR(priv, "MPDU frame without a PHY data\n");
|
||||
return;
|
||||
}
|
||||
if (include_phy) {
|
||||
|
@ -1021,7 +1020,7 @@ void iwl_rx_reply_rx(struct iwl_priv *priv,
|
|||
}
|
||||
|
||||
if (!rx_start) {
|
||||
IWL_ERROR("MPDU frame without a PHY data\n");
|
||||
IWL_ERR(priv, "MPDU frame without a PHY data\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2008 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -46,15 +46,6 @@
|
|||
#define IWL_ACTIVE_DWELL_FACTOR_24GHZ (3)
|
||||
#define IWL_ACTIVE_DWELL_FACTOR_52GHZ (2)
|
||||
|
||||
/* For faster active scanning, scan will move to the next channel if fewer than
|
||||
* PLCP_QUIET_THRESH packets are heard on this channel within
|
||||
* ACTIVE_QUIET_TIME after sending probe request. This shortens the dwell
|
||||
* time if it's a quiet channel (nothing responded to our probe, and there's
|
||||
* no other traffic).
|
||||
* Disable "quiet" feature by setting PLCP_QUIET_THRESH to 0. */
|
||||
#define IWL_PLCP_QUIET_THRESH __constant_cpu_to_le16(1) /* packets */
|
||||
#define IWL_ACTIVE_QUIET_TIME __constant_cpu_to_le16(10) /* msec */
|
||||
|
||||
/* For passive scan, listen PASSIVE_DWELL_TIME (msec) on each channel.
|
||||
* Must be set longer than active dwell time.
|
||||
* For the most reliable scan, set > AP beacon interval (typically 100msec). */
|
||||
|
@ -63,7 +54,6 @@
|
|||
#define IWL_PASSIVE_DWELL_BASE (100)
|
||||
#define IWL_CHANNEL_TUNE_TIME 5
|
||||
|
||||
#define IWL_SCAN_PROBE_MASK(n) cpu_to_le32((BIT(n) | (BIT(n) - BIT(1))))
|
||||
|
||||
|
||||
/**
|
||||
|
@ -119,7 +109,7 @@ int iwl_scan_cancel_timeout(struct iwl_priv *priv, unsigned long ms)
|
|||
}
|
||||
EXPORT_SYMBOL(iwl_scan_cancel_timeout);
|
||||
|
||||
static int iwl_send_scan_abort(struct iwl_priv *priv)
|
||||
int iwl_send_scan_abort(struct iwl_priv *priv)
|
||||
{
|
||||
int ret = 0;
|
||||
struct iwl_rx_packet *res;
|
||||
|
@ -160,7 +150,7 @@ static int iwl_send_scan_abort(struct iwl_priv *priv)
|
|||
|
||||
return ret;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(iwl_send_scan_abort);
|
||||
|
||||
/* Service response to REPLY_SCAN_CMD (0x80) */
|
||||
static void iwl_rx_reply_scan(struct iwl_priv *priv,
|
||||
|
@ -296,9 +286,9 @@ void iwl_setup_rx_scan_handlers(struct iwl_priv *priv)
|
|||
}
|
||||
EXPORT_SYMBOL(iwl_setup_rx_scan_handlers);
|
||||
|
||||
static inline u16 iwl_get_active_dwell_time(struct iwl_priv *priv,
|
||||
enum ieee80211_band band,
|
||||
u8 n_probes)
|
||||
inline u16 iwl_get_active_dwell_time(struct iwl_priv *priv,
|
||||
enum ieee80211_band band,
|
||||
u8 n_probes)
|
||||
{
|
||||
if (band == IEEE80211_BAND_5GHZ)
|
||||
return IWL_ACTIVE_DWELL_TIME_52 +
|
||||
|
@ -307,9 +297,10 @@ static inline u16 iwl_get_active_dwell_time(struct iwl_priv *priv,
|
|||
return IWL_ACTIVE_DWELL_TIME_24 +
|
||||
IWL_ACTIVE_DWELL_FACTOR_24GHZ * (n_probes + 1);
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_get_active_dwell_time);
|
||||
|
||||
static u16 iwl_get_passive_dwell_time(struct iwl_priv *priv,
|
||||
enum ieee80211_band band)
|
||||
u16 iwl_get_passive_dwell_time(struct iwl_priv *priv,
|
||||
enum ieee80211_band band)
|
||||
{
|
||||
u16 passive = (band == IEEE80211_BAND_2GHZ) ?
|
||||
IWL_PASSIVE_DWELL_BASE + IWL_PASSIVE_DWELL_TIME_24 :
|
||||
|
@ -327,6 +318,7 @@ static u16 iwl_get_passive_dwell_time(struct iwl_priv *priv,
|
|||
|
||||
return passive;
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_get_passive_dwell_time);
|
||||
|
||||
static int iwl_get_channels_for_scan(struct iwl_priv *priv,
|
||||
enum ieee80211_band band,
|
||||
|
@ -450,7 +442,7 @@ EXPORT_SYMBOL(iwl_scan_initiate);
|
|||
|
||||
#define IWL_SCAN_CHECK_WATCHDOG (7 * HZ)
|
||||
|
||||
static void iwl_bg_scan_check(struct work_struct *data)
|
||||
void iwl_bg_scan_check(struct work_struct *data)
|
||||
{
|
||||
struct iwl_priv *priv =
|
||||
container_of(data, struct iwl_priv, scan_check.work);
|
||||
|
@ -470,6 +462,8 @@ static void iwl_bg_scan_check(struct work_struct *data)
|
|||
}
|
||||
mutex_unlock(&priv->mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_bg_scan_check);
|
||||
|
||||
/**
|
||||
* iwl_supported_rate_to_ie - fill in the supported rate in IE field
|
||||
*
|
||||
|
@ -527,10 +521,10 @@ static void iwl_ht_cap_to_ie(const struct ieee80211_supported_band *sband,
|
|||
* iwl_fill_probe_req - fill in all required fields and IE for probe request
|
||||
*/
|
||||
|
||||
static u16 iwl_fill_probe_req(struct iwl_priv *priv,
|
||||
enum ieee80211_band band,
|
||||
struct ieee80211_mgmt *frame,
|
||||
int left)
|
||||
u16 iwl_fill_probe_req(struct iwl_priv *priv,
|
||||
enum ieee80211_band band,
|
||||
struct ieee80211_mgmt *frame,
|
||||
int left)
|
||||
{
|
||||
int len = 0;
|
||||
u8 *pos = NULL;
|
||||
|
@ -624,6 +618,7 @@ static u16 iwl_fill_probe_req(struct iwl_priv *priv,
|
|||
|
||||
return (u16)len;
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_fill_probe_req);
|
||||
|
||||
static void iwl_bg_request_scan(struct work_struct *data)
|
||||
{
|
||||
|
@ -650,7 +645,7 @@ static void iwl_bg_request_scan(struct work_struct *data)
|
|||
mutex_lock(&priv->mutex);
|
||||
|
||||
if (!iwl_is_ready(priv)) {
|
||||
IWL_WARNING("request scan called when driver not ready.\n");
|
||||
IWL_WARN(priv, "request scan called when driver not ready.\n");
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
@ -773,7 +768,7 @@ static void iwl_bg_request_scan(struct work_struct *data)
|
|||
if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_4965)
|
||||
rx_chain = 0x6;
|
||||
} else {
|
||||
IWL_WARNING("Invalid scan band count\n");
|
||||
IWL_WARN(priv, "Invalid scan band count\n");
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
@ -839,7 +834,7 @@ static void iwl_bg_request_scan(struct work_struct *data)
|
|||
mutex_unlock(&priv->mutex);
|
||||
}
|
||||
|
||||
static void iwl_bg_abort_scan(struct work_struct *work)
|
||||
void iwl_bg_abort_scan(struct work_struct *work)
|
||||
{
|
||||
struct iwl_priv *priv = container_of(work, struct iwl_priv, abort_scan);
|
||||
|
||||
|
@ -853,8 +848,9 @@ static void iwl_bg_abort_scan(struct work_struct *work)
|
|||
|
||||
mutex_unlock(&priv->mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_bg_abort_scan);
|
||||
|
||||
static void iwl_bg_scan_completed(struct work_struct *work)
|
||||
void iwl_bg_scan_completed(struct work_struct *work)
|
||||
{
|
||||
struct iwl_priv *priv =
|
||||
container_of(work, struct iwl_priv, scan_completed);
|
||||
|
@ -872,7 +868,7 @@ static void iwl_bg_scan_completed(struct work_struct *work)
|
|||
iwl_set_tx_power(priv, priv->tx_power_user_lmt, true);
|
||||
mutex_unlock(&priv->mutex);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(iwl_bg_scan_completed);
|
||||
|
||||
void iwl_setup_scan_deferred_work(struct iwl_priv *priv)
|
||||
{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2003 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* Portions of this file are derived from the ipw3945 project, as well
|
||||
* as portions of the ieee80211 subsystem header files.
|
||||
|
@ -146,7 +146,7 @@ static int iwl_get_measurement(struct iwl_priv *priv,
|
|||
|
||||
res = (struct iwl_rx_packet *)cmd.meta.u.skb->data;
|
||||
if (res->hdr.flags & IWL_CMD_FAILED_MSK) {
|
||||
IWL_ERROR("Bad return from REPLY_RX_ON_ASSOC command\n");
|
||||
IWL_ERR(priv, "Bad return from REPLY_RX_ON_ASSOC command\n");
|
||||
rc = -EIO;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2003 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* Portions of this file are derived from the ieee80211 subsystem header files.
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2003 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* Portions of this file are derived from the ipw3945 project, as well
|
||||
* as portions of the ieee80211 subsystem header files.
|
||||
|
@ -86,8 +86,10 @@ static void iwl_sta_ucode_activate(struct iwl_priv *priv, u8 sta_id)
|
|||
|
||||
spin_lock_irqsave(&priv->sta_lock, flags);
|
||||
|
||||
if (!(priv->stations[sta_id].used & IWL_STA_DRIVER_ACTIVE))
|
||||
IWL_ERROR("ACTIVATE a non DRIVER active station %d\n", sta_id);
|
||||
if (!(priv->stations[sta_id].used & IWL_STA_DRIVER_ACTIVE) &&
|
||||
!(priv->stations_39[sta_id].used & IWL_STA_DRIVER_ACTIVE))
|
||||
IWL_ERR(priv, "ACTIVATE a non DRIVER active station %d\n",
|
||||
sta_id);
|
||||
|
||||
priv->stations[sta_id].used |= IWL_STA_UCODE_ACTIVE;
|
||||
IWL_DEBUG_ASSOC("Added STA to Ucode: %pM\n",
|
||||
|
@ -105,13 +107,13 @@ static int iwl_add_sta_callback(struct iwl_priv *priv,
|
|||
u8 sta_id = addsta->sta.sta_id;
|
||||
|
||||
if (!skb) {
|
||||
IWL_ERROR("Error: Response NULL in REPLY_ADD_STA.\n");
|
||||
IWL_ERR(priv, "Error: Response NULL in REPLY_ADD_STA.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
res = (struct iwl_rx_packet *)skb->data;
|
||||
if (res->hdr.flags & IWL_CMD_FAILED_MSK) {
|
||||
IWL_ERROR("Bad return from REPLY_ADD_STA (0x%08X)\n",
|
||||
IWL_ERR(priv, "Bad return from REPLY_ADD_STA (0x%08X)\n",
|
||||
res->hdr.flags);
|
||||
return 1;
|
||||
}
|
||||
|
@ -130,7 +132,7 @@ static int iwl_add_sta_callback(struct iwl_priv *priv,
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int iwl_send_add_sta(struct iwl_priv *priv,
|
||||
int iwl_send_add_sta(struct iwl_priv *priv,
|
||||
struct iwl_addsta_cmd *sta, u8 flags)
|
||||
{
|
||||
struct iwl_rx_packet *res = NULL;
|
||||
|
@ -155,7 +157,7 @@ static int iwl_send_add_sta(struct iwl_priv *priv,
|
|||
|
||||
res = (struct iwl_rx_packet *)cmd.meta.u.skb->data;
|
||||
if (res->hdr.flags & IWL_CMD_FAILED_MSK) {
|
||||
IWL_ERROR("Bad return from REPLY_ADD_STA (0x%08X)\n",
|
||||
IWL_ERR(priv, "Bad return from REPLY_ADD_STA (0x%08X)\n",
|
||||
res->hdr.flags);
|
||||
ret = -EIO;
|
||||
}
|
||||
|
@ -168,7 +170,7 @@ static int iwl_send_add_sta(struct iwl_priv *priv,
|
|||
break;
|
||||
default:
|
||||
ret = -EIO;
|
||||
IWL_WARNING("REPLY_ADD_STA failed\n");
|
||||
IWL_WARN(priv, "REPLY_ADD_STA failed\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -178,6 +180,7 @@ static int iwl_send_add_sta(struct iwl_priv *priv,
|
|||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_send_add_sta);
|
||||
|
||||
static void iwl_set_ht_add_station(struct iwl_priv *priv, u8 index,
|
||||
struct ieee80211_sta_ht_cap *sta_ht_inf)
|
||||
|
@ -204,7 +207,7 @@ static void iwl_set_ht_add_station(struct iwl_priv *priv, u8 index,
|
|||
case WLAN_HT_CAP_SM_PS_DISABLED:
|
||||
break;
|
||||
default:
|
||||
IWL_WARNING("Invalid MIMO PS mode %d\n", mimo_ps_mode);
|
||||
IWL_WARN(priv, "Invalid MIMO PS mode %d\n", mimo_ps_mode);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -307,7 +310,7 @@ static void iwl_sta_ucode_deactivate(struct iwl_priv *priv, const char *addr)
|
|||
|
||||
/* Ucode must be active and driver must be non active */
|
||||
if (priv->stations[sta_id].used != IWL_STA_UCODE_ACTIVE)
|
||||
IWL_ERROR("removed non active STA %d\n", sta_id);
|
||||
IWL_ERR(priv, "removed non active STA %d\n", sta_id);
|
||||
|
||||
priv->stations[sta_id].used &= ~IWL_STA_UCODE_ACTIVE;
|
||||
|
||||
|
@ -324,13 +327,13 @@ static int iwl_remove_sta_callback(struct iwl_priv *priv,
|
|||
const char *addr = rm_sta->addr;
|
||||
|
||||
if (!skb) {
|
||||
IWL_ERROR("Error: Response NULL in REPLY_REMOVE_STA.\n");
|
||||
IWL_ERR(priv, "Error: Response NULL in REPLY_REMOVE_STA.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
res = (struct iwl_rx_packet *)skb->data;
|
||||
if (res->hdr.flags & IWL_CMD_FAILED_MSK) {
|
||||
IWL_ERROR("Bad return from REPLY_REMOVE_STA (0x%08X)\n",
|
||||
IWL_ERR(priv, "Bad return from REPLY_REMOVE_STA (0x%08X)\n",
|
||||
res->hdr.flags);
|
||||
return 1;
|
||||
}
|
||||
|
@ -340,7 +343,7 @@ static int iwl_remove_sta_callback(struct iwl_priv *priv,
|
|||
iwl_sta_ucode_deactivate(priv, addr);
|
||||
break;
|
||||
default:
|
||||
IWL_ERROR("REPLY_REMOVE_STA failed\n");
|
||||
IWL_ERR(priv, "REPLY_REMOVE_STA failed\n");
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -378,7 +381,7 @@ static int iwl_send_remove_station(struct iwl_priv *priv, const u8 *addr,
|
|||
|
||||
res = (struct iwl_rx_packet *)cmd.meta.u.skb->data;
|
||||
if (res->hdr.flags & IWL_CMD_FAILED_MSK) {
|
||||
IWL_ERROR("Bad return from REPLY_REMOVE_STA (0x%08X)\n",
|
||||
IWL_ERR(priv, "Bad return from REPLY_REMOVE_STA (0x%08X)\n",
|
||||
res->hdr.flags);
|
||||
ret = -EIO;
|
||||
}
|
||||
|
@ -391,7 +394,7 @@ static int iwl_send_remove_station(struct iwl_priv *priv, const u8 *addr,
|
|||
break;
|
||||
default:
|
||||
ret = -EIO;
|
||||
IWL_ERROR("REPLY_REMOVE_STA failed\n");
|
||||
IWL_ERR(priv, "REPLY_REMOVE_STA failed\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -433,13 +436,13 @@ int iwl_remove_station(struct iwl_priv *priv, const u8 *addr, int is_ap)
|
|||
sta_id, addr);
|
||||
|
||||
if (!(priv->stations[sta_id].used & IWL_STA_DRIVER_ACTIVE)) {
|
||||
IWL_ERROR("Removing %pM but non DRIVER active\n",
|
||||
IWL_ERR(priv, "Removing %pM but non DRIVER active\n",
|
||||
addr);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!(priv->stations[sta_id].used & IWL_STA_UCODE_ACTIVE)) {
|
||||
IWL_ERROR("Removing %pM but non UCODE active\n",
|
||||
IWL_ERR(priv, "Removing %pM but non UCODE active\n",
|
||||
addr);
|
||||
goto out;
|
||||
}
|
||||
|
@ -475,7 +478,7 @@ void iwl_clear_stations_table(struct iwl_priv *priv)
|
|||
if (iwl_is_alive(priv) &&
|
||||
!test_bit(STATUS_EXIT_PENDING, &priv->status) &&
|
||||
iwl_send_cmd_pdu_async(priv, REPLY_REMOVE_ALL_STA, 0, NULL, NULL))
|
||||
IWL_ERROR("Couldn't clear the station table\n");
|
||||
IWL_ERR(priv, "Couldn't clear the station table\n");
|
||||
|
||||
priv->num_stations = 0;
|
||||
memset(priv->stations, 0, sizeof(priv->stations));
|
||||
|
@ -548,7 +551,7 @@ int iwl_remove_default_wep_key(struct iwl_priv *priv,
|
|||
spin_lock_irqsave(&priv->sta_lock, flags);
|
||||
|
||||
if (!test_and_clear_bit(keyconf->keyidx, &priv->ucode_key_table))
|
||||
IWL_ERROR("index %d not used in uCode key table.\n",
|
||||
IWL_ERR(priv, "index %d not used in uCode key table.\n",
|
||||
keyconf->keyidx);
|
||||
|
||||
priv->default_wep_key--;
|
||||
|
@ -582,7 +585,7 @@ int iwl_set_default_wep_key(struct iwl_priv *priv,
|
|||
priv->default_wep_key++;
|
||||
|
||||
if (test_and_set_bit(keyconf->keyidx, &priv->ucode_key_table))
|
||||
IWL_ERROR("index %d already used in uCode key table.\n",
|
||||
IWL_ERR(priv, "index %d already used in uCode key table.\n",
|
||||
keyconf->keyidx);
|
||||
|
||||
priv->wep_keys[keyconf->keyidx].key_size = keyconf->keylen;
|
||||
|
@ -638,7 +641,7 @@ static int iwl_set_wep_dynamic_key_info(struct iwl_priv *priv,
|
|||
* in uCode. */
|
||||
|
||||
WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET,
|
||||
"no space for new kew");
|
||||
"no space for a new key");
|
||||
|
||||
priv->stations[sta_id].sta.key.key_flags = key_flags;
|
||||
priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK;
|
||||
|
@ -686,7 +689,7 @@ static int iwl_set_ccmp_dynamic_key_info(struct iwl_priv *priv,
|
|||
* in uCode. */
|
||||
|
||||
WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET,
|
||||
"no space for new kew");
|
||||
"no space for a new key");
|
||||
|
||||
priv->stations[sta_id].sta.key.key_flags = key_flags;
|
||||
priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK;
|
||||
|
@ -722,7 +725,7 @@ static int iwl_set_tkip_dynamic_key_info(struct iwl_priv *priv,
|
|||
* in uCode. */
|
||||
|
||||
WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET,
|
||||
"no space for new kew");
|
||||
"no space for a new key");
|
||||
|
||||
/* This copy is acutally not needed: we get the key with each TX */
|
||||
memcpy(priv->stations[sta_id].keyinfo.key, keyconf->key, 16);
|
||||
|
@ -812,7 +815,7 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv,
|
|||
}
|
||||
|
||||
if (priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET) {
|
||||
IWL_WARNING("Removing wrong key %d 0x%x\n",
|
||||
IWL_WARN(priv, "Removing wrong key %d 0x%x\n",
|
||||
keyconf->keyidx, key_flags);
|
||||
spin_unlock_irqrestore(&priv->sta_lock, flags);
|
||||
return 0;
|
||||
|
@ -820,7 +823,7 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv,
|
|||
|
||||
if (!test_and_clear_bit(priv->stations[sta_id].sta.key.key_offset,
|
||||
&priv->ucode_key_table))
|
||||
IWL_ERROR("index %d not used in uCode key table.\n",
|
||||
IWL_ERR(priv, "index %d not used in uCode key table.\n",
|
||||
priv->stations[sta_id].sta.key.key_offset);
|
||||
memset(&priv->stations[sta_id].keyinfo, 0,
|
||||
sizeof(struct iwl_hw_key));
|
||||
|
@ -857,7 +860,8 @@ int iwl_set_dynamic_key(struct iwl_priv *priv,
|
|||
ret = iwl_set_wep_dynamic_key_info(priv, keyconf, sta_id);
|
||||
break;
|
||||
default:
|
||||
IWL_ERROR("Unknown alg: %s alg = %d\n", __func__, keyconf->alg);
|
||||
IWL_ERR(priv,
|
||||
"Unknown alg: %s alg = %d\n", __func__, keyconf->alg);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -1069,7 +1073,8 @@ int iwl_get_sta_id(struct iwl_priv *priv, struct ieee80211_hdr *hdr)
|
|||
return priv->hw_params.bcast_sta_id;
|
||||
|
||||
default:
|
||||
IWL_WARNING("Unknown mode of operation: %d\n", priv->iw_mode);
|
||||
IWL_WARN(priv, "Unknown mode of operation: %d\n",
|
||||
priv->iw_mode);
|
||||
return priv->hw_params.bcast_sta_id;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2003 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* Portions of this file are derived from the ipw3945 project, as well
|
||||
* as portions of the ieee80211 subsystem header files.
|
||||
|
@ -56,6 +56,8 @@ int iwl_remove_station(struct iwl_priv *priv, const u8 *addr, int is_ap);
|
|||
void iwl_clear_stations_table(struct iwl_priv *priv);
|
||||
int iwl_get_sta_id(struct iwl_priv *priv, struct ieee80211_hdr *hdr);
|
||||
int iwl_get_ra_sta_id(struct iwl_priv *priv, struct ieee80211_hdr *hdr);
|
||||
int iwl_send_add_sta(struct iwl_priv *priv,
|
||||
struct iwl_addsta_cmd *sta, u8 flags);
|
||||
u8 iwl_add_station_flags(struct iwl_priv *priv, const u8 *addr,
|
||||
int is_ap, u8 flags,
|
||||
struct ieee80211_sta_ht_cap *ht_info);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2008 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2003 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* Portions of this file are derived from the ipw3945 project, as well
|
||||
* as portions of the ieee80211 subsystem header files.
|
||||
|
@ -76,116 +76,6 @@ static inline void iwl_free_dma_ptr(struct iwl_priv *priv,
|
|||
memset(ptr, 0, sizeof(*ptr));
|
||||
}
|
||||
|
||||
static inline dma_addr_t iwl_tfd_tb_get_addr(struct iwl_tfd *tfd, u8 idx)
|
||||
{
|
||||
struct iwl_tfd_tb *tb = &tfd->tbs[idx];
|
||||
|
||||
dma_addr_t addr = get_unaligned_le32(&tb->lo);
|
||||
if (sizeof(dma_addr_t) > sizeof(u32))
|
||||
addr |=
|
||||
((dma_addr_t)(le16_to_cpu(tb->hi_n_len) & 0xF) << 16) << 16;
|
||||
|
||||
return addr;
|
||||
}
|
||||
|
||||
static inline u16 iwl_tfd_tb_get_len(struct iwl_tfd *tfd, u8 idx)
|
||||
{
|
||||
struct iwl_tfd_tb *tb = &tfd->tbs[idx];
|
||||
|
||||
return le16_to_cpu(tb->hi_n_len) >> 4;
|
||||
}
|
||||
|
||||
static inline void iwl_tfd_set_tb(struct iwl_tfd *tfd, u8 idx,
|
||||
dma_addr_t addr, u16 len)
|
||||
{
|
||||
struct iwl_tfd_tb *tb = &tfd->tbs[idx];
|
||||
u16 hi_n_len = len << 4;
|
||||
|
||||
put_unaligned_le32(addr, &tb->lo);
|
||||
if (sizeof(dma_addr_t) > sizeof(u32))
|
||||
hi_n_len |= ((addr >> 16) >> 16) & 0xF;
|
||||
|
||||
tb->hi_n_len = cpu_to_le16(hi_n_len);
|
||||
|
||||
tfd->num_tbs = idx + 1;
|
||||
}
|
||||
|
||||
static inline u8 iwl_tfd_get_num_tbs(struct iwl_tfd *tfd)
|
||||
{
|
||||
return tfd->num_tbs & 0x1f;
|
||||
}
|
||||
|
||||
/**
|
||||
* iwl_hw_txq_free_tfd - Free all chunks referenced by TFD [txq->q.read_ptr]
|
||||
* @priv - driver private data
|
||||
* @txq - tx queue
|
||||
*
|
||||
* Does NOT advance any TFD circular buffer read/write indexes
|
||||
* Does NOT free the TFD itself (which is within circular buffer)
|
||||
*/
|
||||
static void iwl_hw_txq_free_tfd(struct iwl_priv *priv, struct iwl_tx_queue *txq)
|
||||
{
|
||||
struct iwl_tfd *tfd_tmp = (struct iwl_tfd *)&txq->tfds[0];
|
||||
struct iwl_tfd *tfd;
|
||||
struct pci_dev *dev = priv->pci_dev;
|
||||
int index = txq->q.read_ptr;
|
||||
int i;
|
||||
int num_tbs;
|
||||
|
||||
tfd = &tfd_tmp[index];
|
||||
|
||||
/* Sanity check on number of chunks */
|
||||
num_tbs = iwl_tfd_get_num_tbs(tfd);
|
||||
|
||||
if (num_tbs >= IWL_NUM_OF_TBS) {
|
||||
IWL_ERROR("Too many chunks: %i\n", num_tbs);
|
||||
/* @todo issue fatal error, it is quite serious situation */
|
||||
return;
|
||||
}
|
||||
|
||||
/* Unmap tx_cmd */
|
||||
if (num_tbs)
|
||||
pci_unmap_single(dev,
|
||||
pci_unmap_addr(&txq->cmd[index]->meta, mapping),
|
||||
pci_unmap_len(&txq->cmd[index]->meta, len),
|
||||
PCI_DMA_TODEVICE);
|
||||
|
||||
/* Unmap chunks, if any. */
|
||||
for (i = 1; i < num_tbs; i++) {
|
||||
pci_unmap_single(dev, iwl_tfd_tb_get_addr(tfd, i),
|
||||
iwl_tfd_tb_get_len(tfd, i), PCI_DMA_TODEVICE);
|
||||
|
||||
if (txq->txb) {
|
||||
dev_kfree_skb(txq->txb[txq->q.read_ptr].skb[i - 1]);
|
||||
txq->txb[txq->q.read_ptr].skb[i - 1] = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int iwl_hw_txq_attach_buf_to_tfd(struct iwl_priv *priv,
|
||||
struct iwl_tfd *tfd,
|
||||
dma_addr_t addr, u16 len)
|
||||
{
|
||||
|
||||
u32 num_tbs = iwl_tfd_get_num_tbs(tfd);
|
||||
|
||||
/* Each TFD can point to a maximum 20 Tx buffers */
|
||||
if (num_tbs >= IWL_NUM_OF_TBS) {
|
||||
IWL_ERROR("Error can not send more than %d chunks\n",
|
||||
IWL_NUM_OF_TBS);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
BUG_ON(addr & ~DMA_BIT_MASK(36));
|
||||
if (unlikely(addr & ~IWL_TX_DMA_MASK))
|
||||
IWL_ERROR("Unaligned address = %llx\n",
|
||||
(unsigned long long)addr);
|
||||
|
||||
iwl_tfd_set_tb(tfd, num_tbs, addr, len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* iwl_txq_update_write_ptr - Send new write index to hardware
|
||||
*/
|
||||
|
@ -241,7 +131,7 @@ EXPORT_SYMBOL(iwl_txq_update_write_ptr);
|
|||
* Free all buffers.
|
||||
* 0-fill, but do not free "txq" descriptor structure.
|
||||
*/
|
||||
static void iwl_tx_queue_free(struct iwl_priv *priv, int txq_id)
|
||||
void iwl_tx_queue_free(struct iwl_priv *priv, int txq_id)
|
||||
{
|
||||
struct iwl_tx_queue *txq = &priv->txq[txq_id];
|
||||
struct iwl_queue *q = &txq->q;
|
||||
|
@ -254,7 +144,7 @@ static void iwl_tx_queue_free(struct iwl_priv *priv, int txq_id)
|
|||
/* first, empty all BD's */
|
||||
for (; q->write_ptr != q->read_ptr;
|
||||
q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd))
|
||||
iwl_hw_txq_free_tfd(priv, txq);
|
||||
priv->cfg->ops->lib->txq_free_tfd(priv, txq);
|
||||
|
||||
len = sizeof(struct iwl_cmd) * q->n_window;
|
||||
|
||||
|
@ -264,7 +154,7 @@ static void iwl_tx_queue_free(struct iwl_priv *priv, int txq_id)
|
|||
|
||||
/* De-alloc circular buffer of TFDs */
|
||||
if (txq->q.n_bd)
|
||||
pci_free_consistent(dev, sizeof(struct iwl_tfd) *
|
||||
pci_free_consistent(dev, priv->hw_params.tfd_size *
|
||||
txq->q.n_bd, txq->tfds, txq->q.dma_addr);
|
||||
|
||||
/* De-alloc array of per-TFD driver data */
|
||||
|
@ -274,7 +164,7 @@ static void iwl_tx_queue_free(struct iwl_priv *priv, int txq_id)
|
|||
/* 0-fill queue descriptor structure */
|
||||
memset(txq, 0, sizeof(*txq));
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(iwl_tx_queue_free);
|
||||
|
||||
/**
|
||||
* iwl_cmd_queue_free - Deallocate DMA queue.
|
||||
|
@ -388,6 +278,7 @@ static int iwl_tx_queue_alloc(struct iwl_priv *priv,
|
|||
struct iwl_tx_queue *txq, u32 id)
|
||||
{
|
||||
struct pci_dev *dev = priv->pci_dev;
|
||||
size_t tfd_sz = priv->hw_params.tfd_size * TFD_QUEUE_SIZE_MAX;
|
||||
|
||||
/* Driver private data, only for Tx (not command) queues,
|
||||
* not shared with device. */
|
||||
|
@ -395,22 +286,20 @@ static int iwl_tx_queue_alloc(struct iwl_priv *priv,
|
|||
txq->txb = kmalloc(sizeof(txq->txb[0]) *
|
||||
TFD_QUEUE_SIZE_MAX, GFP_KERNEL);
|
||||
if (!txq->txb) {
|
||||
IWL_ERROR("kmalloc for auxiliary BD "
|
||||
IWL_ERR(priv, "kmalloc for auxiliary BD "
|
||||
"structures failed\n");
|
||||
goto error;
|
||||
}
|
||||
} else
|
||||
} else {
|
||||
txq->txb = NULL;
|
||||
}
|
||||
|
||||
/* Circular buffer of transmit frame descriptors (TFDs),
|
||||
* shared with device */
|
||||
txq->tfds = pci_alloc_consistent(dev,
|
||||
sizeof(txq->tfds[0]) * TFD_QUEUE_SIZE_MAX,
|
||||
&txq->q.dma_addr);
|
||||
txq->tfds = pci_alloc_consistent(dev, tfd_sz, &txq->q.dma_addr);
|
||||
|
||||
if (!txq->tfds) {
|
||||
IWL_ERROR("pci_alloc_consistent(%zd) failed\n",
|
||||
sizeof(txq->tfds[0]) * TFD_QUEUE_SIZE_MAX);
|
||||
IWL_ERR(priv, "pci_alloc_consistent(%zd) failed\n", tfd_sz);
|
||||
goto error;
|
||||
}
|
||||
txq->q.id = id;
|
||||
|
@ -424,42 +313,11 @@ static int iwl_tx_queue_alloc(struct iwl_priv *priv,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/*
|
||||
* Tell nic where to find circular buffer of Tx Frame Descriptors for
|
||||
* given Tx queue, and enable the DMA channel used for that queue.
|
||||
*
|
||||
* 4965 supports up to 16 Tx queues in DRAM, mapped to up to 8 Tx DMA
|
||||
* channels supported in hardware.
|
||||
*/
|
||||
static int iwl_hw_tx_queue_init(struct iwl_priv *priv,
|
||||
struct iwl_tx_queue *txq)
|
||||
{
|
||||
int ret;
|
||||
unsigned long flags;
|
||||
int txq_id = txq->q.id;
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
ret = iwl_grab_nic_access(priv);
|
||||
if (ret) {
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Circular buffer (TFD queue in DRAM) physical base address */
|
||||
iwl_write_direct32(priv, FH_MEM_CBBC_QUEUE(txq_id),
|
||||
txq->q.dma_addr >> 8);
|
||||
|
||||
iwl_release_nic_access(priv);
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* iwl_tx_queue_init - Allocate and initialize one tx/cmd queue
|
||||
*/
|
||||
static int iwl_tx_queue_init(struct iwl_priv *priv, struct iwl_tx_queue *txq,
|
||||
int slots_num, u32 txq_id)
|
||||
int iwl_tx_queue_init(struct iwl_priv *priv, struct iwl_tx_queue *txq,
|
||||
int slots_num, u32 txq_id)
|
||||
{
|
||||
int i, len;
|
||||
int ret;
|
||||
|
@ -501,7 +359,7 @@ static int iwl_tx_queue_init(struct iwl_priv *priv, struct iwl_tx_queue *txq,
|
|||
iwl_queue_init(priv, &txq->q, TFD_QUEUE_SIZE_MAX, slots_num, txq_id);
|
||||
|
||||
/* Tell device where to find queue */
|
||||
iwl_hw_tx_queue_init(priv, txq);
|
||||
priv->cfg->ops->lib->txq_init(priv, txq);
|
||||
|
||||
return 0;
|
||||
err:
|
||||
|
@ -516,6 +374,8 @@ err:
|
|||
}
|
||||
return -ENOMEM;
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_tx_queue_init);
|
||||
|
||||
/**
|
||||
* iwl_hw_txq_ctx_free - Free TXQ Context
|
||||
*
|
||||
|
@ -557,13 +417,13 @@ int iwl_txq_ctx_reset(struct iwl_priv *priv)
|
|||
ret = iwl_alloc_dma_ptr(priv, &priv->scd_bc_tbls,
|
||||
priv->hw_params.scd_bc_tbls_size);
|
||||
if (ret) {
|
||||
IWL_ERROR("Scheduler BC Table allocation failed\n");
|
||||
IWL_ERR(priv, "Scheduler BC Table allocation failed\n");
|
||||
goto error_bc_tbls;
|
||||
}
|
||||
/* Alloc keep-warm buffer */
|
||||
ret = iwl_alloc_dma_ptr(priv, &priv->kw, IWL_KW_SIZE);
|
||||
if (ret) {
|
||||
IWL_ERROR("Keep Warm allocation failed\n");
|
||||
IWL_ERR(priv, "Keep Warm allocation failed\n");
|
||||
goto error_kw;
|
||||
}
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
|
@ -589,7 +449,7 @@ int iwl_txq_ctx_reset(struct iwl_priv *priv)
|
|||
ret = iwl_tx_queue_init(priv, &priv->txq[txq_id], slots_num,
|
||||
txq_id);
|
||||
if (ret) {
|
||||
IWL_ERROR("Tx %d queue init failed\n", txq_id);
|
||||
IWL_ERR(priv, "Tx %d queue init failed\n", txq_id);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
@ -802,7 +662,7 @@ static void iwl_tx_cmd_build_hwcrypto(struct iwl_priv *priv,
|
|||
break;
|
||||
|
||||
default:
|
||||
printk(KERN_ERR "Unknown encode alg %d\n", keyconf->alg);
|
||||
IWL_ERR(priv, "Unknown encode alg %d\n", keyconf->alg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -822,7 +682,6 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
|||
{
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
struct iwl_tfd *tfd;
|
||||
struct iwl_tx_queue *txq;
|
||||
struct iwl_queue *q;
|
||||
struct iwl_cmd *out_cmd;
|
||||
|
@ -850,7 +709,7 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
|||
|
||||
if ((ieee80211_get_tx_rate(priv->hw, info)->hw_value & 0xFF) ==
|
||||
IWL_INVALID_RATE) {
|
||||
IWL_ERROR("ERROR: No TX rate available.\n");
|
||||
IWL_ERR(priv, "ERROR: No TX rate available.\n");
|
||||
goto drop_unlock;
|
||||
}
|
||||
|
||||
|
@ -913,10 +772,6 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
|||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
|
||||
/* Set up first empty TFD within this queue's circular TFD buffer */
|
||||
tfd = &txq->tfds[q->write_ptr];
|
||||
memset(tfd, 0, sizeof(*tfd));
|
||||
|
||||
/* Set up driver data for this TFD */
|
||||
memset(&(txq->txb[q->write_ptr]), 0, sizeof(struct iwl_tx_info));
|
||||
txq->txb[q->write_ptr].skb[0] = skb;
|
||||
|
@ -970,7 +825,8 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
|||
/* Add buffer containing Tx command and MAC(!) header to TFD's
|
||||
* first entry */
|
||||
txcmd_phys += offsetof(struct iwl_cmd, hdr);
|
||||
iwl_hw_txq_attach_buf_to_tfd(priv, tfd, txcmd_phys, len);
|
||||
priv->cfg->ops->lib->txq_attach_buf_to_tfd(priv, txq,
|
||||
txcmd_phys, len, 1, 0);
|
||||
|
||||
if (info->control.hw_key)
|
||||
iwl_tx_cmd_build_hwcrypto(priv, info, tx_cmd, skb, sta_id);
|
||||
|
@ -981,7 +837,9 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
|||
if (len) {
|
||||
phys_addr = pci_map_single(priv->pci_dev, skb->data + hdr_len,
|
||||
len, PCI_DMA_TODEVICE);
|
||||
iwl_hw_txq_attach_buf_to_tfd(priv, tfd, phys_addr, len);
|
||||
priv->cfg->ops->lib->txq_attach_buf_to_tfd(priv, txq,
|
||||
phys_addr, len,
|
||||
0, 0);
|
||||
}
|
||||
|
||||
/* Tell NIC about any 2-byte padding after MAC header */
|
||||
|
@ -1063,7 +921,6 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
|
|||
{
|
||||
struct iwl_tx_queue *txq = &priv->txq[IWL_CMD_QUEUE_NUM];
|
||||
struct iwl_queue *q = &txq->q;
|
||||
struct iwl_tfd *tfd;
|
||||
struct iwl_cmd *out_cmd;
|
||||
dma_addr_t phys_addr;
|
||||
unsigned long flags;
|
||||
|
@ -1086,16 +943,12 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
|
|||
}
|
||||
|
||||
if (iwl_queue_space(q) < ((cmd->meta.flags & CMD_ASYNC) ? 2 : 1)) {
|
||||
IWL_ERROR("No space for Tx\n");
|
||||
IWL_ERR(priv, "No space for Tx\n");
|
||||
return -ENOSPC;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&priv->hcmd_lock, flags);
|
||||
|
||||
tfd = &txq->tfds[q->write_ptr];
|
||||
memset(tfd, 0, sizeof(*tfd));
|
||||
|
||||
|
||||
idx = get_cmd_index(q, q->write_ptr, cmd->meta.flags & CMD_SIZE_HUGE);
|
||||
out_cmd = txq->cmd[idx];
|
||||
|
||||
|
@ -1120,7 +973,9 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
|
|||
pci_unmap_len_set(&out_cmd->meta, len, len);
|
||||
phys_addr += offsetof(struct iwl_cmd, hdr);
|
||||
|
||||
iwl_hw_txq_attach_buf_to_tfd(priv, tfd, phys_addr, fix_size);
|
||||
priv->cfg->ops->lib->txq_attach_buf_to_tfd(priv, txq,
|
||||
phys_addr, fix_size, 1,
|
||||
U32_PAD(cmd->len));
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||
switch (out_cmd->hdr.cmd) {
|
||||
|
@ -1144,8 +999,9 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
|
|||
#endif
|
||||
txq->need_update = 1;
|
||||
|
||||
/* Set up entry in queue's byte count circular buffer */
|
||||
priv->cfg->ops->lib->txq_update_byte_cnt_tbl(priv, txq, 0);
|
||||
if (priv->cfg->ops->lib->txq_update_byte_cnt_tbl)
|
||||
/* Set up entry in queue's byte count circular buffer */
|
||||
priv->cfg->ops->lib->txq_update_byte_cnt_tbl(priv, txq, 0);
|
||||
|
||||
/* Increment and update queue's write index */
|
||||
q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd);
|
||||
|
@ -1163,7 +1019,7 @@ int iwl_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index)
|
|||
int nfreed = 0;
|
||||
|
||||
if ((index >= q->n_bd) || (iwl_queue_used(q, index) == 0)) {
|
||||
IWL_ERROR("Read index for DMA queue txq id (%d), index %d, "
|
||||
IWL_ERR(priv, "Read index for DMA queue txq id (%d), index %d, "
|
||||
"is out of range [0-%d] %d %d.\n", txq_id,
|
||||
index, q->n_bd, q->write_ptr, q->read_ptr);
|
||||
return 0;
|
||||
|
@ -1180,7 +1036,7 @@ int iwl_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index)
|
|||
if (priv->cfg->ops->lib->txq_inval_byte_cnt_tbl)
|
||||
priv->cfg->ops->lib->txq_inval_byte_cnt_tbl(priv, txq);
|
||||
|
||||
iwl_hw_txq_free_tfd(priv, txq);
|
||||
priv->cfg->ops->lib->txq_free_tfd(priv, txq);
|
||||
nfreed++;
|
||||
}
|
||||
return nfreed;
|
||||
|
@ -1203,7 +1059,7 @@ static void iwl_hcmd_queue_reclaim(struct iwl_priv *priv, int txq_id,
|
|||
int nfreed = 0;
|
||||
|
||||
if ((idx >= q->n_bd) || (iwl_queue_used(q, idx) == 0)) {
|
||||
IWL_ERROR("Read index for DMA queue txq id (%d), index %d, "
|
||||
IWL_ERR(priv, "Read index for DMA queue txq id (%d), index %d, "
|
||||
"is out of range [0-%d] %d %d.\n", txq_id,
|
||||
idx, q->n_bd, q->write_ptr, q->read_ptr);
|
||||
return;
|
||||
|
@ -1218,7 +1074,7 @@ static void iwl_hcmd_queue_reclaim(struct iwl_priv *priv, int txq_id,
|
|||
q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd)) {
|
||||
|
||||
if (nfreed++ > 0) {
|
||||
IWL_ERROR("HCMD skipped: index (%d) %d %d\n", idx,
|
||||
IWL_ERR(priv, "HCMD skipped: index (%d) %d %d\n", idx,
|
||||
q->write_ptr, q->read_ptr);
|
||||
queue_work(priv->workqueue, &priv->restart);
|
||||
}
|
||||
|
@ -1306,7 +1162,7 @@ int iwl_tx_agg_start(struct iwl_priv *priv, const u8 *ra, u16 tid, u16 *ssn)
|
|||
else
|
||||
return -EINVAL;
|
||||
|
||||
IWL_WARNING("%s on ra = %pM tid = %d\n",
|
||||
IWL_WARN(priv, "%s on ra = %pM tid = %d\n",
|
||||
__func__, ra, tid);
|
||||
|
||||
sta_id = iwl_find_station(priv, ra);
|
||||
|
@ -1314,7 +1170,7 @@ int iwl_tx_agg_start(struct iwl_priv *priv, const u8 *ra, u16 tid, u16 *ssn)
|
|||
return -ENXIO;
|
||||
|
||||
if (priv->stations[sta_id].tid[tid].agg.state != IWL_AGG_OFF) {
|
||||
IWL_ERROR("Start AGG when state is not IWL_AGG_OFF !\n");
|
||||
IWL_ERR(priv, "Start AGG when state is not IWL_AGG_OFF !\n");
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
|
@ -1334,7 +1190,7 @@ int iwl_tx_agg_start(struct iwl_priv *priv, const u8 *ra, u16 tid, u16 *ssn)
|
|||
return ret;
|
||||
|
||||
if (tid_data->tfds_in_queue == 0) {
|
||||
printk(KERN_ERR "HW queue is empty\n");
|
||||
IWL_ERR(priv, "HW queue is empty\n");
|
||||
tid_data->agg.state = IWL_AGG_ON;
|
||||
ieee80211_start_tx_ba_cb_irqsafe(priv->hw, ra, tid);
|
||||
} else {
|
||||
|
@ -1354,7 +1210,7 @@ int iwl_tx_agg_stop(struct iwl_priv *priv , const u8 *ra, u16 tid)
|
|||
unsigned long flags;
|
||||
|
||||
if (!ra) {
|
||||
IWL_ERROR("ra = NULL\n");
|
||||
IWL_ERR(priv, "ra = NULL\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -1369,7 +1225,7 @@ int iwl_tx_agg_stop(struct iwl_priv *priv , const u8 *ra, u16 tid)
|
|||
return -ENXIO;
|
||||
|
||||
if (priv->stations[sta_id].tid[tid].agg.state != IWL_AGG_ON)
|
||||
IWL_WARNING("Stopping AGG while state not IWL_AGG_ON\n");
|
||||
IWL_WARN(priv, "Stopping AGG while state not IWL_AGG_ON\n");
|
||||
|
||||
tid_data = &priv->stations[sta_id].tid[tid];
|
||||
ssn = (tid_data->seq_number & IEEE80211_SCTL_SEQ) >> 4;
|
||||
|
@ -1455,7 +1311,7 @@ static int iwl_tx_status_reply_compressed_ba(struct iwl_priv *priv,
|
|||
struct ieee80211_tx_info *info;
|
||||
|
||||
if (unlikely(!agg->wait_for_ba)) {
|
||||
IWL_ERROR("Received BA when not expected\n");
|
||||
IWL_ERR(priv, "Received BA when not expected\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -1528,7 +1384,8 @@ void iwl_rx_reply_compressed_ba(struct iwl_priv *priv,
|
|||
u16 ba_resp_scd_ssn = le16_to_cpu(ba_resp->scd_ssn);
|
||||
|
||||
if (scd_flow >= priv->hw_params.max_txq_num) {
|
||||
IWL_ERROR("BUG_ON scd_flow is bigger than number of queues\n");
|
||||
IWL_ERR(priv,
|
||||
"BUG_ON scd_flow is bigger than number of queues\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue