Upgrade b43 and mac80211.
This also temporarly disables hostapd support for mac80211, as hostapd needs patches to compile against latest mac80211. Will do that in a seperate patch. SVN-Revision: 10466
This commit is contained in:
@@ -23,11 +23,11 @@ PKG_FWV4_SOURCE_URL:=http://downloads.openwrt.org/sources/
|
||||
PKG_FWV4_MD5SUM:=a7d8dde3ce474c361143b83e1d9890b1
|
||||
|
||||
PKG_FWCUTTER_NAME:=b43-fwcutter
|
||||
PKG_FWCUTTER_VERSION=008
|
||||
PKG_FWCUTTER_VERSION=011
|
||||
|
||||
PKG_FWCUTTER_SOURCE:=$(PKG_FWCUTTER_NAME)-$(PKG_FWCUTTER_VERSION).tar.bz2
|
||||
PKG_FWCUTTER_SOURCE_URL:=http://download.berlios.de/bcm43xx/
|
||||
PKG_FWCUTTER_MD5SUM:=3f7fbf4f8dcd296c6d1b0d42eab0f9ac
|
||||
PKG_FWCUTTER_SOURCE_URL:=http://bu3sch.de/b43/fwcutter/
|
||||
PKG_FWCUTTER_MD5SUM:=3db2f4de85a459451f5b391cf67a8d44
|
||||
|
||||
define KernelPackage/b43
|
||||
SUBMENU:=Wireless Drivers
|
||||
@@ -43,7 +43,6 @@ endef
|
||||
|
||||
EXTRA_KCONFIG:= \
|
||||
CONFIG_B43=m \
|
||||
CONFIG_B43_DMA=y \
|
||||
$(if $(CONFIG_LEDS_TRIGGERS),CONFIG_B43_LEDS=y) \
|
||||
|
||||
|
||||
@@ -73,6 +72,8 @@ define Build/Prepare
|
||||
$(CP) ./src/* $(PKG_BUILD_DIR)/
|
||||
tar xjf "$(DL_DIR)/$(PKG_FWV4_SOURCE)" -C "$(PKG_BUILD_DIR)"
|
||||
tar xjf "$(DL_DIR)/$(PKG_FWCUTTER_SOURCE)" -C "$(PKG_BUILD_DIR)"
|
||||
$(Build/Patch)
|
||||
$(if $(QUILT),touch $(PKG_BUILD_DIR)/.quilt_used)
|
||||
endef
|
||||
|
||||
define Build/Configure
|
||||
|
||||
@@ -61,16 +61,28 @@ config B43_PCMCIA
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
# LED support
|
||||
config B43_NPHY
|
||||
bool "Pre IEEE 802.11n support (BROKEN)"
|
||||
depends on B43 && EXPERIMENTAL && BROKEN
|
||||
---help---
|
||||
Support for the IEEE 802.11n draft.
|
||||
|
||||
THIS IS BROKEN AND DOES NOT WORK YET.
|
||||
|
||||
SAY N.
|
||||
|
||||
# This config option automatically enables b43 LEDS support,
|
||||
# if it's possible.
|
||||
config B43_LEDS
|
||||
bool
|
||||
depends on B43 && MAC80211_LEDS
|
||||
depends on B43 && MAC80211_LEDS && (LEDS_CLASS = y || LEDS_CLASS = B43)
|
||||
default y
|
||||
|
||||
# RFKILL support
|
||||
# This config option automatically enables b43 RFKILL support,
|
||||
# if it's possible.
|
||||
config B43_RFKILL
|
||||
bool
|
||||
depends on B43 && RFKILL && RFKILL_INPUT && INPUT_POLLDEV
|
||||
depends on B43 && (RFKILL = y || RFKILL = B43) && RFKILL_INPUT && (INPUT_POLLDEV = y || INPUT_POLLDEV = B43)
|
||||
default y
|
||||
|
||||
config B43_DEBUG
|
||||
@@ -81,51 +93,3 @@ config B43_DEBUG
|
||||
|
||||
Say Y, if you want to find out why the driver does not
|
||||
work for you.
|
||||
|
||||
config B43_DMA
|
||||
bool
|
||||
depends on B43
|
||||
config B43_PIO
|
||||
bool
|
||||
depends on B43
|
||||
|
||||
choice
|
||||
prompt "Broadcom 43xx data transfer mode"
|
||||
depends on B43
|
||||
default B43_DMA_AND_PIO_MODE
|
||||
|
||||
config B43_DMA_AND_PIO_MODE
|
||||
bool "DMA + PIO"
|
||||
select B43_DMA
|
||||
select B43_PIO
|
||||
---help---
|
||||
Include both, Direct Memory Access (DMA) and Programmed I/O (PIO)
|
||||
data transfer modes.
|
||||
The actually used mode is selectable through the module
|
||||
parameter "pio". If the module parameter is pio=0, DMA is used.
|
||||
Otherwise PIO is used. DMA is default.
|
||||
|
||||
If unsure, choose this option.
|
||||
|
||||
config B43_DMA_MODE
|
||||
bool "DMA (Direct Memory Access) only"
|
||||
select B43_DMA
|
||||
---help---
|
||||
Only include Direct Memory Access (DMA).
|
||||
This reduces the size of the driver module, by omitting the PIO code.
|
||||
|
||||
config B43_PIO_MODE
|
||||
bool "PIO (Programmed I/O) only"
|
||||
select B43_PIO
|
||||
---help---
|
||||
Only include Programmed I/O (PIO).
|
||||
This reduces the size of the driver module, by omitting the DMA code.
|
||||
Please note that PIO transfers are slow (compared to DMA).
|
||||
|
||||
Also note that not all devices of the 43xx series support PIO.
|
||||
The 4306 (Apple Airport Extreme and others) supports PIO, while
|
||||
the 4318 is known to _not_ support PIO.
|
||||
|
||||
Only use PIO, if DMA does not work for you.
|
||||
|
||||
endchoice
|
||||
|
||||
@@ -1,20 +1,16 @@
|
||||
# b43 core
|
||||
b43-y += main.o
|
||||
b43-y += tables.o
|
||||
b43-y += tables_nphy.o
|
||||
b43-y += phy.o
|
||||
b43-y += nphy.o
|
||||
b43-y += sysfs.o
|
||||
b43-y += xmit.o
|
||||
b43-y += lo.o
|
||||
# b43 RFKILL button support
|
||||
b43-y += wa.o
|
||||
b43-y += dma.o
|
||||
b43-$(CONFIG_B43_RFKILL) += rfkill.o
|
||||
# b43 LED support
|
||||
b43-$(CONFIG_B43_LEDS) += leds.o
|
||||
# b43 PCMCIA support
|
||||
b43-$(CONFIG_B43_PCMCIA) += pcmcia.o
|
||||
# b43 debugging
|
||||
b43-$(CONFIG_B43_DEBUG) += debugfs.o
|
||||
# b43 DMA and PIO
|
||||
b43-$(CONFIG_B43_DMA) += dma.o
|
||||
b43-$(CONFIG_B43_PIO) += pio.o
|
||||
|
||||
obj-$(CONFIG_B43) += b43.o
|
||||
|
||||
@@ -35,8 +35,8 @@
|
||||
#define B43_MMIO_DMA4_IRQ_MASK 0x44
|
||||
#define B43_MMIO_DMA5_REASON 0x48
|
||||
#define B43_MMIO_DMA5_IRQ_MASK 0x4C
|
||||
#define B43_MMIO_MACCTL 0x120
|
||||
#define B43_MMIO_STATUS2_BITFIELD 0x124
|
||||
#define B43_MMIO_MACCTL 0x120 /* MAC control */
|
||||
#define B43_MMIO_MACCMD 0x124 /* MAC command */
|
||||
#define B43_MMIO_GEN_IRQ_REASON 0x128
|
||||
#define B43_MMIO_GEN_IRQ_MASK 0x12C
|
||||
#define B43_MMIO_RAM_CONTROL 0x130
|
||||
@@ -50,6 +50,9 @@
|
||||
#define B43_MMIO_XMITSTAT_1 0x174
|
||||
#define B43_MMIO_REV3PLUS_TSF_LOW 0x180 /* core rev >= 3 only */
|
||||
#define B43_MMIO_REV3PLUS_TSF_HIGH 0x184 /* core rev >= 3 only */
|
||||
#define B43_MMIO_TSF_CFP_REP 0x188
|
||||
#define B43_MMIO_TSF_CFP_START 0x18C
|
||||
#define B43_MMIO_TSF_CFP_MAXDUR 0x190
|
||||
|
||||
/* 32-bit DMA */
|
||||
#define B43_MMIO_DMA32_BASE0 0x200
|
||||
@@ -65,11 +68,6 @@
|
||||
#define B43_MMIO_DMA64_BASE3 0x2C0
|
||||
#define B43_MMIO_DMA64_BASE4 0x300
|
||||
#define B43_MMIO_DMA64_BASE5 0x340
|
||||
/* PIO */
|
||||
#define B43_MMIO_PIO1_BASE 0x300
|
||||
#define B43_MMIO_PIO2_BASE 0x310
|
||||
#define B43_MMIO_PIO3_BASE 0x320
|
||||
#define B43_MMIO_PIO4_BASE 0x330
|
||||
|
||||
#define B43_MMIO_PHY_VER 0x3E0
|
||||
#define B43_MMIO_PHY_RADIO 0x3E2
|
||||
@@ -88,6 +86,8 @@
|
||||
#define B43_MMIO_RADIO_HWENABLED_LO 0x49A
|
||||
#define B43_MMIO_GPIO_CONTROL 0x49C
|
||||
#define B43_MMIO_GPIO_MASK 0x49E
|
||||
#define B43_MMIO_TSF_CFP_START_LOW 0x604
|
||||
#define B43_MMIO_TSF_CFP_START_HIGH 0x606
|
||||
#define B43_MMIO_TSF_0 0x632 /* core rev < 3 only */
|
||||
#define B43_MMIO_TSF_1 0x634 /* core rev < 3 only */
|
||||
#define B43_MMIO_TSF_2 0x636 /* core rev < 3 only */
|
||||
@@ -170,14 +170,17 @@ enum {
|
||||
#define B43_SHM_SH_SLOTT 0x0010 /* Slot time */
|
||||
#define B43_SHM_SH_DTIMPER 0x0012 /* DTIM period */
|
||||
#define B43_SHM_SH_NOSLPZNATDTIM 0x004C /* NOSLPZNAT DTIM */
|
||||
/* SHM_SHARED beacon variables */
|
||||
/* SHM_SHARED beacon/AP variables */
|
||||
#define B43_SHM_SH_BTL0 0x0018 /* Beacon template length 0 */
|
||||
#define B43_SHM_SH_BTL1 0x001A /* Beacon template length 1 */
|
||||
#define B43_SHM_SH_BTSFOFF 0x001C /* Beacon TSF offset */
|
||||
#define B43_SHM_SH_TIMBPOS 0x001E /* TIM B position in beacon */
|
||||
#define B43_SHM_SH_DTIMP 0x0012 /* DTIP period */
|
||||
#define B43_SHM_SH_MCASTCOOKIE 0x00A8 /* Last bcast/mcast frame ID */
|
||||
#define B43_SHM_SH_SFFBLIM 0x0044 /* Short frame fallback retry limit */
|
||||
#define B43_SHM_SH_LFFBLIM 0x0046 /* Long frame fallback retry limit */
|
||||
#define B43_SHM_SH_BEACPHYCTL 0x0054 /* Beacon PHY TX control word (see PHY TX control) */
|
||||
#define B43_SHM_SH_EXTNPHYCTL 0x00B0 /* Extended bytes for beacon PHY control (N) */
|
||||
/* SHM_SHARED ACK/CTS control */
|
||||
#define B43_SHM_SH_ACKCTSPHYCTL 0x0022 /* ACK/CTS PHY control word (see PHY TX control) */
|
||||
/* SHM_SHARED probe response variables */
|
||||
@@ -273,6 +276,8 @@ enum {
|
||||
#define B43_PHYTYPE_A 0x00
|
||||
#define B43_PHYTYPE_B 0x01
|
||||
#define B43_PHYTYPE_G 0x02
|
||||
#define B43_PHYTYPE_N 0x04
|
||||
#define B43_PHYTYPE_LP 0x05
|
||||
|
||||
/* PHYRegisters */
|
||||
#define B43_PHY_ILT_A_CTRL 0x0072
|
||||
@@ -319,17 +324,29 @@ enum {
|
||||
#define B43_MACCTL_DISCPMQ 0x40000000 /* Discard Power Management Queue */
|
||||
#define B43_MACCTL_GMODE 0x80000000 /* G Mode */
|
||||
|
||||
/* 802.11 core specific TM State Low flags */
|
||||
/* MAC Command bitfield */
|
||||
#define B43_MACCMD_BEACON0_VALID 0x00000001 /* Beacon 0 in template RAM is busy/valid */
|
||||
#define B43_MACCMD_BEACON1_VALID 0x00000002 /* Beacon 1 in template RAM is busy/valid */
|
||||
#define B43_MACCMD_DFQ_VALID 0x00000004 /* Directed frame queue valid (IBSS PS mode, ATIM) */
|
||||
#define B43_MACCMD_CCA 0x00000008 /* Clear channel assessment */
|
||||
#define B43_MACCMD_BGNOISE 0x00000010 /* Background noise */
|
||||
|
||||
/* 802.11 core specific TM State Low (SSB_TMSLOW) flags */
|
||||
#define B43_TMSLOW_GMODE 0x20000000 /* G Mode Enable */
|
||||
#define B43_TMSLOW_PLLREFSEL 0x00200000 /* PLL Frequency Reference Select */
|
||||
#define B43_TMSLOW_PHYCLKSPEED 0x00C00000 /* PHY clock speed mask (N-PHY only) */
|
||||
#define B43_TMSLOW_PHYCLKSPEED_40MHZ 0x00000000 /* 40 MHz PHY */
|
||||
#define B43_TMSLOW_PHYCLKSPEED_80MHZ 0x00400000 /* 80 MHz PHY */
|
||||
#define B43_TMSLOW_PHYCLKSPEED_160MHZ 0x00800000 /* 160 MHz PHY */
|
||||
#define B43_TMSLOW_PLLREFSEL 0x00200000 /* PLL Frequency Reference Select (rev >= 5) */
|
||||
#define B43_TMSLOW_MACPHYCLKEN 0x00100000 /* MAC PHY Clock Control Enable (rev >= 5) */
|
||||
#define B43_TMSLOW_PHYRESET 0x00080000 /* PHY Reset */
|
||||
#define B43_TMSLOW_PHYCLKEN 0x00040000 /* PHY Clock Enable */
|
||||
|
||||
/* 802.11 core specific TM State High flags */
|
||||
/* 802.11 core specific TM State High (SSB_TMSHIGH) flags */
|
||||
#define B43_TMSHIGH_DUALBAND_PHY 0x00080000 /* Dualband PHY available */
|
||||
#define B43_TMSHIGH_FCLOCK 0x00040000 /* Fast Clock Available (rev >= 5) */
|
||||
#define B43_TMSHIGH_APHY 0x00020000 /* A-PHY available (rev >= 5) */
|
||||
#define B43_TMSHIGH_GPHY 0x00010000 /* G-PHY available (rev >= 5) */
|
||||
#define B43_TMSHIGH_HAVE_5GHZ_PHY 0x00020000 /* 5 GHz PHY available (rev >= 5) */
|
||||
#define B43_TMSHIGH_HAVE_2GHZ_PHY 0x00010000 /* 2.4 GHz PHY available (rev >= 5) */
|
||||
|
||||
/* Generic-Interrupt reasons. */
|
||||
#define B43_IRQ_MAC_SUSPENDED 0x00000001
|
||||
@@ -391,6 +408,8 @@ enum {
|
||||
#define B43_DEFAULT_SHORT_RETRY_LIMIT 7
|
||||
#define B43_DEFAULT_LONG_RETRY_LIMIT 4
|
||||
|
||||
#define B43_PHY_TX_BADNESS_LIMIT 1000
|
||||
|
||||
/* Max size of a security key */
|
||||
#define B43_SEC_KEYSIZE 16
|
||||
/* Security algorithms. */
|
||||
@@ -443,10 +462,6 @@ struct b43_phy {
|
||||
u8 possible_phymodes;
|
||||
/* GMODE bit enabled? */
|
||||
bool gmode;
|
||||
/* Possible ieee80211 subsystem hwmodes for this PHY.
|
||||
* Which mode is selected, depends on thr GMODE enabled bit */
|
||||
#define B43_MAX_PHYHWMODES 2
|
||||
struct ieee80211_hw_mode hwmodes[B43_MAX_PHYHWMODES];
|
||||
|
||||
/* Analog Type */
|
||||
u8 analog;
|
||||
@@ -460,7 +475,6 @@ struct b43_phy {
|
||||
u16 radio_ver; /* Radio version */
|
||||
u8 radio_rev; /* Radio revision */
|
||||
|
||||
bool locked; /* Only used in b43_phy_{un}lock() */
|
||||
bool dyn_tssi_tbl; /* tssi2dbm is kmalloc()ed. */
|
||||
|
||||
/* ACI (adjacent channel interference) flags. */
|
||||
@@ -497,11 +511,6 @@ struct b43_phy {
|
||||
s16 lna_gain; /* LNA */
|
||||
s16 pga_gain; /* PGA */
|
||||
|
||||
/* PHY lock for core.rev < 3
|
||||
* This lock is only used by b43_phy_{un}lock()
|
||||
*/
|
||||
spinlock_t lock;
|
||||
|
||||
/* Desired TX power level (in dBm).
|
||||
* This is set by the user and adjusted in b43_phy_xmitpower(). */
|
||||
u8 power_level;
|
||||
@@ -512,9 +521,7 @@ struct b43_phy {
|
||||
struct b43_bbatt bbatt;
|
||||
struct b43_rfatt rfatt;
|
||||
u8 tx_control; /* B43_TXCTL_XXX */
|
||||
#ifdef CONFIG_B43_DEBUG
|
||||
bool manual_txpower_control; /* Manual TX-power control enabled? */
|
||||
#endif
|
||||
|
||||
/* Hardware Power Control enabled? */
|
||||
bool hardware_power_control;
|
||||
|
||||
@@ -542,6 +549,26 @@ struct b43_phy {
|
||||
u16 lofcal;
|
||||
|
||||
u16 initval; //FIXME rename?
|
||||
|
||||
/* PHY TX errors counter. */
|
||||
atomic_t txerr_cnt;
|
||||
|
||||
/* The device does address auto increment for the OFDM tables.
|
||||
* We cache the previously used address here and omit the address
|
||||
* write on the next table access, if possible. */
|
||||
u16 ofdmtab_addr; /* The address currently set in hardware. */
|
||||
enum { /* The last data flow direction. */
|
||||
B43_OFDMTAB_DIRECTION_UNKNOWN = 0,
|
||||
B43_OFDMTAB_DIRECTION_READ,
|
||||
B43_OFDMTAB_DIRECTION_WRITE,
|
||||
} ofdmtab_addr_direction;
|
||||
|
||||
#if B43_DEBUG
|
||||
/* Manual TX-power control enabled? */
|
||||
bool manual_txpower_control;
|
||||
/* PHY registers locked by b43_phy_lock()? */
|
||||
bool phy_locked;
|
||||
#endif /* B43_DEBUG */
|
||||
};
|
||||
|
||||
/* Data structures for DMA transmission, per 80211 core. */
|
||||
@@ -557,14 +584,6 @@ struct b43_dma {
|
||||
struct b43_dmaring *rx_ring3; /* only available on core.rev < 5 */
|
||||
};
|
||||
|
||||
/* Data structures for PIO transmission, per 80211 core. */
|
||||
struct b43_pio {
|
||||
struct b43_pioqueue *queue0;
|
||||
struct b43_pioqueue *queue1;
|
||||
struct b43_pioqueue *queue2;
|
||||
struct b43_pioqueue *queue3;
|
||||
};
|
||||
|
||||
/* Context information for a noise calculation (Link Quality). */
|
||||
struct b43_noise_calculation {
|
||||
u8 channel_at_start;
|
||||
@@ -597,18 +616,18 @@ struct b43_wl {
|
||||
/* Pointer to the ieee80211 hardware data structure */
|
||||
struct ieee80211_hw *hw;
|
||||
|
||||
spinlock_t irq_lock;
|
||||
struct mutex mutex;
|
||||
spinlock_t irq_lock;
|
||||
/* Lock for LEDs access. */
|
||||
spinlock_t leds_lock;
|
||||
/* Lock for SHM access. */
|
||||
spinlock_t shm_lock;
|
||||
|
||||
/* We can only have one operating interface (802.11 core)
|
||||
* at a time. General information about this interface follows.
|
||||
*/
|
||||
|
||||
/* Opaque ID of the operating interface from the ieee80211
|
||||
* subsystem. Do not modify.
|
||||
*/
|
||||
int if_id;
|
||||
struct ieee80211_vif *vif;
|
||||
/* The MAC address of the operating interface. */
|
||||
u8 mac_addr[ETH_ALEN];
|
||||
/* Current BSSID */
|
||||
@@ -632,18 +651,33 @@ struct b43_wl {
|
||||
/* List of all wireless devices on this chip */
|
||||
struct list_head devlist;
|
||||
u8 nr_devs;
|
||||
|
||||
bool radiotap_enabled;
|
||||
|
||||
/* The beacon we are currently using (AP or IBSS mode).
|
||||
* This beacon stuff is protected by the irq_lock. */
|
||||
struct sk_buff *current_beacon;
|
||||
bool beacon0_uploaded;
|
||||
bool beacon1_uploaded;
|
||||
};
|
||||
|
||||
/* In-memory representation of a cached microcode file. */
|
||||
struct b43_firmware_file {
|
||||
const char *filename;
|
||||
const struct firmware *data;
|
||||
};
|
||||
|
||||
/* Pointers to the firmware data and meta information about it. */
|
||||
struct b43_firmware {
|
||||
/* Microcode */
|
||||
const struct firmware *ucode;
|
||||
struct b43_firmware_file ucode;
|
||||
/* PCM code */
|
||||
const struct firmware *pcm;
|
||||
struct b43_firmware_file pcm;
|
||||
/* Initial MMIO values for the firmware */
|
||||
const struct firmware *initvals;
|
||||
struct b43_firmware_file initvals;
|
||||
/* Initial MMIO values for the firmware, band-specific */
|
||||
const struct firmware *initvals_band;
|
||||
struct b43_firmware_file initvals_band;
|
||||
|
||||
/* Firmware revision */
|
||||
u16 rev;
|
||||
/* Firmware patchlevel */
|
||||
@@ -681,21 +715,16 @@ struct b43_wldev {
|
||||
/* Saved init status for handling suspend. */
|
||||
int suspend_init_status;
|
||||
|
||||
bool __using_pio; /* Internal, use b43_using_pio(). */
|
||||
bool bad_frames_preempt; /* Use "Bad Frames Preemption" (default off) */
|
||||
bool reg124_set_0x4; /* Some variable to keep track of IRQ stuff. */
|
||||
bool short_preamble; /* TRUE, if short preamble is enabled. */
|
||||
bool dfq_valid; /* Directed frame queue valid (IBSS PS mode, ATIM) */
|
||||
bool short_slot; /* TRUE, if short slot timing is enabled. */
|
||||
bool radio_hw_enable; /* saved state of radio hardware enabled state */
|
||||
|
||||
/* PHY/Radio device. */
|
||||
struct b43_phy phy;
|
||||
union {
|
||||
/* DMA engines. */
|
||||
struct b43_dma dma;
|
||||
/* PIO engines. */
|
||||
struct b43_pio pio;
|
||||
};
|
||||
|
||||
/* DMA engines. */
|
||||
struct b43_dma dma;
|
||||
|
||||
/* Various statistics about the physical device. */
|
||||
struct b43_stats stats;
|
||||
@@ -730,9 +759,6 @@ struct b43_wldev {
|
||||
u8 max_nr_keys;
|
||||
struct b43_key key[58];
|
||||
|
||||
/* Cached beacon template while uploading the template. */
|
||||
struct sk_buff *cached_beacon;
|
||||
|
||||
/* Firmware data */
|
||||
struct b43_firmware fw;
|
||||
|
||||
@@ -750,28 +776,6 @@ static inline struct b43_wl *hw_to_b43_wl(struct ieee80211_hw *hw)
|
||||
return hw->priv;
|
||||
}
|
||||
|
||||
/* Helper function, which returns a boolean.
|
||||
* TRUE, if PIO is used; FALSE, if DMA is used.
|
||||
*/
|
||||
#if defined(CONFIG_B43_DMA) && defined(CONFIG_B43_PIO)
|
||||
static inline int b43_using_pio(struct b43_wldev *dev)
|
||||
{
|
||||
return dev->__using_pio;
|
||||
}
|
||||
#elif defined(CONFIG_B43_DMA)
|
||||
static inline int b43_using_pio(struct b43_wldev *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#elif defined(CONFIG_B43_PIO)
|
||||
static inline int b43_using_pio(struct b43_wldev *dev)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
#else
|
||||
# error "Using neither DMA nor PIO? Confused..."
|
||||
#endif
|
||||
|
||||
static inline struct b43_wldev *dev_to_b43_wldev(struct device *dev)
|
||||
{
|
||||
struct ssb_device *ssb_dev = dev_to_ssb_dev(dev);
|
||||
|
||||
@@ -34,7 +34,6 @@
|
||||
#include "main.h"
|
||||
#include "debugfs.h"
|
||||
#include "dma.h"
|
||||
#include "pio.h"
|
||||
#include "xmit.h"
|
||||
|
||||
|
||||
@@ -128,7 +127,7 @@ static ssize_t shm_read_file(struct b43_wldev *dev,
|
||||
__le16 *le16buf = (__le16 *)buf;
|
||||
|
||||
for (i = 0; i < 0x1000; i++) {
|
||||
if (bufsize <= 0)
|
||||
if (bufsize < sizeof(tmp))
|
||||
break;
|
||||
tmp = b43_shm_read16(dev, B43_SHM_SHARED, 2 * i);
|
||||
le16buf[i] = cpu_to_le16(tmp);
|
||||
@@ -223,8 +222,6 @@ out:
|
||||
static int txpower_g_write_file(struct b43_wldev *dev,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
unsigned long phy_flags;
|
||||
|
||||
if (dev->phy.type != B43_PHYTYPE_G)
|
||||
return -ENODEV;
|
||||
if ((count >= 4) && (memcmp(buf, "auto", 4) == 0)) {
|
||||
@@ -248,12 +245,12 @@ static int txpower_g_write_file(struct b43_wldev *dev,
|
||||
dev->phy.tx_control |= B43_TXCTL_PA2DB;
|
||||
if (pa3db)
|
||||
dev->phy.tx_control |= B43_TXCTL_PA3DB;
|
||||
b43_phy_lock(dev, phy_flags);
|
||||
b43_phy_lock(dev);
|
||||
b43_radio_lock(dev);
|
||||
b43_set_txpower_g(dev, &dev->phy.bbatt,
|
||||
&dev->phy.rfatt, dev->phy.tx_control);
|
||||
b43_radio_unlock(dev);
|
||||
b43_phy_unlock(dev, phy_flags);
|
||||
b43_phy_unlock(dev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -352,7 +349,7 @@ static ssize_t b43_debugfs_read(struct file *file, char __user *userbuf,
|
||||
struct b43_wldev *dev;
|
||||
struct b43_debugfs_fops *dfops;
|
||||
struct b43_dfs_file *dfile;
|
||||
ssize_t ret;
|
||||
ssize_t uninitialized_var(ret);
|
||||
char *buf;
|
||||
const size_t bufsize = 1024 * 128;
|
||||
const size_t buforder = get_order(bufsize);
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/etherdevice.h>
|
||||
|
||||
|
||||
/* 32bit DMA ops. */
|
||||
static
|
||||
@@ -165,7 +167,7 @@ static void op64_fill_descriptor(struct b43_dmaring *ring,
|
||||
addrhi = (((u64) dmaaddr >> 32) & ~SSB_DMA_TRANSLATION_MASK);
|
||||
addrext = (((u64) dmaaddr >> 32) & SSB_DMA_TRANSLATION_MASK)
|
||||
>> SSB_DMA_TRANSLATION_SHIFT;
|
||||
addrhi |= ssb_dma_translation(ring->dev->dev);
|
||||
addrhi |= (ssb_dma_translation(ring->dev->dev) << 1);
|
||||
if (slot == ring->nr_slots - 1)
|
||||
ctl0 |= B43_DMA64_DCTL0_DTABLEEND;
|
||||
if (start)
|
||||
@@ -315,29 +317,27 @@ static struct b43_dmaring *priority_to_txring(struct b43_wldev *dev,
|
||||
case 3:
|
||||
ring = dev->dma.tx_ring0;
|
||||
break;
|
||||
case 4:
|
||||
ring = dev->dma.tx_ring4;
|
||||
break;
|
||||
case 5:
|
||||
ring = dev->dma.tx_ring5;
|
||||
break;
|
||||
}
|
||||
|
||||
return ring;
|
||||
}
|
||||
|
||||
/* Bcm43xx-ring to mac80211-queue mapping */
|
||||
/* b43-ring to mac80211-queue mapping */
|
||||
static inline int txring_to_priority(struct b43_dmaring *ring)
|
||||
{
|
||||
static const u8 idx_to_prio[] = { 3, 2, 1, 0, 4, 5, };
|
||||
static const u8 idx_to_prio[] = { 3, 2, 1, 0, };
|
||||
unsigned int index;
|
||||
|
||||
/*FIXME: have only one queue, for now */
|
||||
return 0;
|
||||
|
||||
return idx_to_prio[ring->index];
|
||||
index = ring->index;
|
||||
if (B43_WARN_ON(index >= ARRAY_SIZE(idx_to_prio)))
|
||||
index = 0;
|
||||
return idx_to_prio[index];
|
||||
}
|
||||
|
||||
u16 b43_dmacontroller_base(int dma64bit, int controller_idx)
|
||||
static u16 b43_dmacontroller_base(enum b43_dmatype type, int controller_idx)
|
||||
{
|
||||
static const u16 map64[] = {
|
||||
B43_MMIO_DMA64_BASE0,
|
||||
@@ -356,7 +356,7 @@ u16 b43_dmacontroller_base(int dma64bit, int controller_idx)
|
||||
B43_MMIO_DMA32_BASE5,
|
||||
};
|
||||
|
||||
if (dma64bit) {
|
||||
if (type == B43_DMA_64BIT) {
|
||||
B43_WARN_ON(!(controller_idx >= 0 &&
|
||||
controller_idx < ARRAY_SIZE(map64)));
|
||||
return map64[controller_idx];
|
||||
@@ -426,9 +426,21 @@ static inline
|
||||
static int alloc_ringmemory(struct b43_dmaring *ring)
|
||||
{
|
||||
struct device *dev = ring->dev->dev->dev;
|
||||
gfp_t flags = GFP_KERNEL;
|
||||
|
||||
/* The specs call for 4K buffers for 30- and 32-bit DMA with 4K
|
||||
* alignment and 8K buffers for 64-bit DMA with 8K alignment. Testing
|
||||
* has shown that 4K is sufficient for the latter as long as the buffer
|
||||
* does not cross an 8K boundary.
|
||||
*
|
||||
* For unknown reasons - possibly a hardware error - the BCM4311 rev
|
||||
* 02, which uses 64-bit DMA, needs the ring buffer in very low memory,
|
||||
* which accounts for the GFP_DMA flag below.
|
||||
*/
|
||||
if (ring->type == B43_DMA_64BIT)
|
||||
flags |= GFP_DMA;
|
||||
ring->descbase = dma_alloc_coherent(dev, B43_DMA_RINGMEMSIZE,
|
||||
&(ring->dmabase), GFP_KERNEL);
|
||||
&(ring->dmabase), flags);
|
||||
if (!ring->descbase) {
|
||||
b43err(ring->dev->wl, "DMA ringmemory allocation failed\n");
|
||||
return -ENOMEM;
|
||||
@@ -447,7 +459,8 @@ static void free_ringmemory(struct b43_dmaring *ring)
|
||||
}
|
||||
|
||||
/* Reset the RX DMA channel */
|
||||
int b43_dmacontroller_rx_reset(struct b43_wldev *dev, u16 mmio_base, int dma64)
|
||||
static int b43_dmacontroller_rx_reset(struct b43_wldev *dev, u16 mmio_base,
|
||||
enum b43_dmatype type)
|
||||
{
|
||||
int i;
|
||||
u32 value;
|
||||
@@ -455,12 +468,13 @@ int b43_dmacontroller_rx_reset(struct b43_wldev *dev, u16 mmio_base, int dma64)
|
||||
|
||||
might_sleep();
|
||||
|
||||
offset = dma64 ? B43_DMA64_RXCTL : B43_DMA32_RXCTL;
|
||||
offset = (type == B43_DMA_64BIT) ? B43_DMA64_RXCTL : B43_DMA32_RXCTL;
|
||||
b43_write32(dev, mmio_base + offset, 0);
|
||||
for (i = 0; i < 10; i++) {
|
||||
offset = dma64 ? B43_DMA64_RXSTATUS : B43_DMA32_RXSTATUS;
|
||||
offset = (type == B43_DMA_64BIT) ? B43_DMA64_RXSTATUS :
|
||||
B43_DMA32_RXSTATUS;
|
||||
value = b43_read32(dev, mmio_base + offset);
|
||||
if (dma64) {
|
||||
if (type == B43_DMA_64BIT) {
|
||||
value &= B43_DMA64_RXSTAT;
|
||||
if (value == B43_DMA64_RXSTAT_DISABLED) {
|
||||
i = -1;
|
||||
@@ -483,8 +497,9 @@ int b43_dmacontroller_rx_reset(struct b43_wldev *dev, u16 mmio_base, int dma64)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Reset the RX DMA channel */
|
||||
int b43_dmacontroller_tx_reset(struct b43_wldev *dev, u16 mmio_base, int dma64)
|
||||
/* Reset the TX DMA channel */
|
||||
static int b43_dmacontroller_tx_reset(struct b43_wldev *dev, u16 mmio_base,
|
||||
enum b43_dmatype type)
|
||||
{
|
||||
int i;
|
||||
u32 value;
|
||||
@@ -493,9 +508,10 @@ int b43_dmacontroller_tx_reset(struct b43_wldev *dev, u16 mmio_base, int dma64)
|
||||
might_sleep();
|
||||
|
||||
for (i = 0; i < 10; i++) {
|
||||
offset = dma64 ? B43_DMA64_TXSTATUS : B43_DMA32_TXSTATUS;
|
||||
offset = (type == B43_DMA_64BIT) ? B43_DMA64_TXSTATUS :
|
||||
B43_DMA32_TXSTATUS;
|
||||
value = b43_read32(dev, mmio_base + offset);
|
||||
if (dma64) {
|
||||
if (type == B43_DMA_64BIT) {
|
||||
value &= B43_DMA64_TXSTAT;
|
||||
if (value == B43_DMA64_TXSTAT_DISABLED ||
|
||||
value == B43_DMA64_TXSTAT_IDLEWAIT ||
|
||||
@@ -510,12 +526,13 @@ int b43_dmacontroller_tx_reset(struct b43_wldev *dev, u16 mmio_base, int dma64)
|
||||
}
|
||||
msleep(1);
|
||||
}
|
||||
offset = dma64 ? B43_DMA64_TXCTL : B43_DMA32_TXCTL;
|
||||
offset = (type == B43_DMA_64BIT) ? B43_DMA64_TXCTL : B43_DMA32_TXCTL;
|
||||
b43_write32(dev, mmio_base + offset, 0);
|
||||
for (i = 0; i < 10; i++) {
|
||||
offset = dma64 ? B43_DMA64_TXSTATUS : B43_DMA32_TXSTATUS;
|
||||
offset = (type == B43_DMA_64BIT) ? B43_DMA64_TXSTATUS :
|
||||
B43_DMA32_TXSTATUS;
|
||||
value = b43_read32(dev, mmio_base + offset);
|
||||
if (dma64) {
|
||||
if (type == B43_DMA_64BIT) {
|
||||
value &= B43_DMA64_TXSTAT;
|
||||
if (value == B43_DMA64_TXSTAT_DISABLED) {
|
||||
i = -1;
|
||||
@@ -540,6 +557,33 @@ int b43_dmacontroller_tx_reset(struct b43_wldev *dev, u16 mmio_base, int dma64)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Check if a DMA mapping address is invalid. */
|
||||
static bool b43_dma_mapping_error(struct b43_dmaring *ring,
|
||||
dma_addr_t addr,
|
||||
size_t buffersize)
|
||||
{
|
||||
if (unlikely(dma_mapping_error(addr)))
|
||||
return 1;
|
||||
|
||||
switch (ring->type) {
|
||||
case B43_DMA_30BIT:
|
||||
if ((u64)addr + buffersize > (1ULL << 30))
|
||||
return 1;
|
||||
break;
|
||||
case B43_DMA_32BIT:
|
||||
if ((u64)addr + buffersize > (1ULL << 32))
|
||||
return 1;
|
||||
break;
|
||||
case B43_DMA_64BIT:
|
||||
/* Currently we can't have addresses beyond
|
||||
* 64bit in the kernel. */
|
||||
break;
|
||||
}
|
||||
|
||||
/* The address is OK. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int setup_rx_descbuffer(struct b43_dmaring *ring,
|
||||
struct b43_dmadesc_generic *desc,
|
||||
struct b43_dmadesc_meta *meta, gfp_t gfp_flags)
|
||||
@@ -555,7 +599,7 @@ static int setup_rx_descbuffer(struct b43_dmaring *ring,
|
||||
if (unlikely(!skb))
|
||||
return -ENOMEM;
|
||||
dmaaddr = map_descbuffer(ring, skb->data, ring->rx_buffersize, 0);
|
||||
if (dma_mapping_error(dmaaddr)) {
|
||||
if (b43_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize)) {
|
||||
/* ugh. try to realloc in zone_dma */
|
||||
gfp_flags |= GFP_DMA;
|
||||
|
||||
@@ -568,7 +612,7 @@ static int setup_rx_descbuffer(struct b43_dmaring *ring,
|
||||
ring->rx_buffersize, 0);
|
||||
}
|
||||
|
||||
if (dma_mapping_error(dmaaddr)) {
|
||||
if (b43_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize)) {
|
||||
dev_kfree_skb_any(skb);
|
||||
return -EIO;
|
||||
}
|
||||
@@ -633,7 +677,7 @@ static int dmacontroller_setup(struct b43_dmaring *ring)
|
||||
u32 trans = ssb_dma_translation(ring->dev->dev);
|
||||
|
||||
if (ring->tx) {
|
||||
if (ring->dma64) {
|
||||
if (ring->type == B43_DMA_64BIT) {
|
||||
u64 ringbase = (u64) (ring->dmabase);
|
||||
|
||||
addrext = ((ringbase >> 32) & SSB_DMA_TRANSLATION_MASK)
|
||||
@@ -647,7 +691,7 @@ static int dmacontroller_setup(struct b43_dmaring *ring)
|
||||
b43_dma_write(ring, B43_DMA64_TXRINGHI,
|
||||
((ringbase >> 32) &
|
||||
~SSB_DMA_TRANSLATION_MASK)
|
||||
| trans);
|
||||
| (trans << 1));
|
||||
} else {
|
||||
u32 ringbase = (u32) (ring->dmabase);
|
||||
|
||||
@@ -665,7 +709,7 @@ static int dmacontroller_setup(struct b43_dmaring *ring)
|
||||
err = alloc_initial_descbuffers(ring);
|
||||
if (err)
|
||||
goto out;
|
||||
if (ring->dma64) {
|
||||
if (ring->type == B43_DMA_64BIT) {
|
||||
u64 ringbase = (u64) (ring->dmabase);
|
||||
|
||||
addrext = ((ringbase >> 32) & SSB_DMA_TRANSLATION_MASK)
|
||||
@@ -680,8 +724,9 @@ static int dmacontroller_setup(struct b43_dmaring *ring)
|
||||
b43_dma_write(ring, B43_DMA64_RXRINGHI,
|
||||
((ringbase >> 32) &
|
||||
~SSB_DMA_TRANSLATION_MASK)
|
||||
| trans);
|
||||
b43_dma_write(ring, B43_DMA64_RXINDEX, 200);
|
||||
| (trans << 1));
|
||||
b43_dma_write(ring, B43_DMA64_RXINDEX, ring->nr_slots *
|
||||
sizeof(struct b43_dmadesc64));
|
||||
} else {
|
||||
u32 ringbase = (u32) (ring->dmabase);
|
||||
|
||||
@@ -695,11 +740,12 @@ static int dmacontroller_setup(struct b43_dmaring *ring)
|
||||
b43_dma_write(ring, B43_DMA32_RXRING,
|
||||
(ringbase & ~SSB_DMA_TRANSLATION_MASK)
|
||||
| trans);
|
||||
b43_dma_write(ring, B43_DMA32_RXINDEX, 200);
|
||||
b43_dma_write(ring, B43_DMA32_RXINDEX, ring->nr_slots *
|
||||
sizeof(struct b43_dmadesc32));
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -708,16 +754,16 @@ static void dmacontroller_cleanup(struct b43_dmaring *ring)
|
||||
{
|
||||
if (ring->tx) {
|
||||
b43_dmacontroller_tx_reset(ring->dev, ring->mmio_base,
|
||||
ring->dma64);
|
||||
if (ring->dma64) {
|
||||
ring->type);
|
||||
if (ring->type == B43_DMA_64BIT) {
|
||||
b43_dma_write(ring, B43_DMA64_TXRINGLO, 0);
|
||||
b43_dma_write(ring, B43_DMA64_TXRINGHI, 0);
|
||||
} else
|
||||
b43_dma_write(ring, B43_DMA32_TXRING, 0);
|
||||
} else {
|
||||
b43_dmacontroller_rx_reset(ring->dev, ring->mmio_base,
|
||||
ring->dma64);
|
||||
if (ring->dma64) {
|
||||
ring->type);
|
||||
if (ring->type == B43_DMA_64BIT) {
|
||||
b43_dma_write(ring, B43_DMA64_RXRINGLO, 0);
|
||||
b43_dma_write(ring, B43_DMA64_RXRINGHI, 0);
|
||||
} else
|
||||
@@ -772,7 +818,8 @@ static u64 supported_dma_mask(struct b43_wldev *dev)
|
||||
static
|
||||
struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev,
|
||||
int controller_index,
|
||||
int for_tx, int dma64)
|
||||
int for_tx,
|
||||
enum b43_dmatype type)
|
||||
{
|
||||
struct b43_dmaring *ring;
|
||||
int err;
|
||||
@@ -782,6 +829,7 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev,
|
||||
ring = kzalloc(sizeof(*ring), GFP_KERNEL);
|
||||
if (!ring)
|
||||
goto out;
|
||||
ring->type = type;
|
||||
|
||||
nr_slots = B43_RXRING_SLOTS;
|
||||
if (for_tx)
|
||||
@@ -793,7 +841,7 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev,
|
||||
goto err_kfree_ring;
|
||||
if (for_tx) {
|
||||
ring->txhdr_cache = kcalloc(nr_slots,
|
||||
sizeof(struct b43_txhdr_fw4),
|
||||
b43_txhdr_size(dev),
|
||||
GFP_KERNEL);
|
||||
if (!ring->txhdr_cache)
|
||||
goto err_kfree_meta;
|
||||
@@ -801,39 +849,38 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev,
|
||||
/* test for ability to dma to txhdr_cache */
|
||||
dma_test = dma_map_single(dev->dev->dev,
|
||||
ring->txhdr_cache,
|
||||
sizeof(struct b43_txhdr_fw4),
|
||||
b43_txhdr_size(dev),
|
||||
DMA_TO_DEVICE);
|
||||
|
||||
if (dma_mapping_error(dma_test)) {
|
||||
if (b43_dma_mapping_error(ring, dma_test, b43_txhdr_size(dev))) {
|
||||
/* ugh realloc */
|
||||
kfree(ring->txhdr_cache);
|
||||
ring->txhdr_cache = kcalloc(nr_slots,
|
||||
sizeof(struct
|
||||
b43_txhdr_fw4),
|
||||
b43_txhdr_size(dev),
|
||||
GFP_KERNEL | GFP_DMA);
|
||||
if (!ring->txhdr_cache)
|
||||
goto err_kfree_meta;
|
||||
|
||||
dma_test = dma_map_single(dev->dev->dev,
|
||||
ring->txhdr_cache,
|
||||
sizeof(struct b43_txhdr_fw4),
|
||||
b43_txhdr_size(dev),
|
||||
DMA_TO_DEVICE);
|
||||
|
||||
if (dma_mapping_error(dma_test))
|
||||
if (b43_dma_mapping_error(ring, dma_test,
|
||||
b43_txhdr_size(dev)))
|
||||
goto err_kfree_txhdr_cache;
|
||||
}
|
||||
|
||||
dma_unmap_single(dev->dev->dev,
|
||||
dma_test, sizeof(struct b43_txhdr_fw4),
|
||||
dma_test, b43_txhdr_size(dev),
|
||||
DMA_TO_DEVICE);
|
||||
}
|
||||
|
||||
ring->dev = dev;
|
||||
ring->nr_slots = nr_slots;
|
||||
ring->mmio_base = b43_dmacontroller_base(dma64, controller_index);
|
||||
ring->mmio_base = b43_dmacontroller_base(type, controller_index);
|
||||
ring->index = controller_index;
|
||||
ring->dma64 = !!dma64;
|
||||
if (dma64)
|
||||
if (type == B43_DMA_64BIT)
|
||||
ring->ops = &dma64_ops;
|
||||
else
|
||||
ring->ops = &dma32_ops;
|
||||
@@ -883,8 +930,8 @@ static void b43_destroy_dmaring(struct b43_dmaring *ring)
|
||||
if (!ring)
|
||||
return;
|
||||
|
||||
b43dbg(ring->dev->wl, "DMA-%s 0x%04X (%s) max used slots: %d/%d\n",
|
||||
(ring->dma64) ? "64" : "32",
|
||||
b43dbg(ring->dev->wl, "DMA-%u 0x%04X (%s) max used slots: %d/%d\n",
|
||||
(unsigned int)(ring->type),
|
||||
ring->mmio_base,
|
||||
(ring->tx) ? "TX" : "RX", ring->max_used_slots, ring->nr_slots);
|
||||
/* Device IRQs are disabled prior entering this function,
|
||||
@@ -901,11 +948,7 @@ static void b43_destroy_dmaring(struct b43_dmaring *ring)
|
||||
|
||||
void b43_dma_free(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_dma *dma;
|
||||
|
||||
if (b43_using_pio(dev))
|
||||
return;
|
||||
dma = &dev->dma;
|
||||
struct b43_dma *dma = &dev->dma;
|
||||
|
||||
b43_destroy_dmaring(dma->rx_ring3);
|
||||
dma->rx_ring3 = NULL;
|
||||
@@ -932,74 +975,78 @@ int b43_dma_init(struct b43_wldev *dev)
|
||||
struct b43_dmaring *ring;
|
||||
int err;
|
||||
u64 dmamask;
|
||||
int dma64 = 0;
|
||||
enum b43_dmatype type;
|
||||
|
||||
dmamask = supported_dma_mask(dev);
|
||||
if (dmamask == DMA_64BIT_MASK)
|
||||
dma64 = 1;
|
||||
|
||||
switch (dmamask) {
|
||||
default:
|
||||
B43_WARN_ON(1);
|
||||
case DMA_30BIT_MASK:
|
||||
type = B43_DMA_30BIT;
|
||||
break;
|
||||
case DMA_32BIT_MASK:
|
||||
type = B43_DMA_32BIT;
|
||||
break;
|
||||
case DMA_64BIT_MASK:
|
||||
type = B43_DMA_64BIT;
|
||||
break;
|
||||
}
|
||||
err = ssb_dma_set_mask(dev->dev, dmamask);
|
||||
if (err) {
|
||||
#ifdef B43_PIO
|
||||
b43warn(dev->wl, "DMA for this device not supported. "
|
||||
"Falling back to PIO\n");
|
||||
dev->__using_pio = 1;
|
||||
return -EAGAIN;
|
||||
#else
|
||||
b43err(dev->wl, "DMA for this device not supported and "
|
||||
"no PIO support compiled in\n");
|
||||
b43err(dev->wl, "The machine/kernel does not support "
|
||||
"the required DMA mask (0x%08X%08X)\n",
|
||||
(unsigned int)((dmamask & 0xFFFFFFFF00000000ULL) >> 32),
|
||||
(unsigned int)(dmamask & 0x00000000FFFFFFFFULL));
|
||||
return -EOPNOTSUPP;
|
||||
#endif
|
||||
}
|
||||
|
||||
err = -ENOMEM;
|
||||
/* setup TX DMA channels. */
|
||||
ring = b43_setup_dmaring(dev, 0, 1, dma64);
|
||||
ring = b43_setup_dmaring(dev, 0, 1, type);
|
||||
if (!ring)
|
||||
goto out;
|
||||
dma->tx_ring0 = ring;
|
||||
|
||||
ring = b43_setup_dmaring(dev, 1, 1, dma64);
|
||||
ring = b43_setup_dmaring(dev, 1, 1, type);
|
||||
if (!ring)
|
||||
goto err_destroy_tx0;
|
||||
dma->tx_ring1 = ring;
|
||||
|
||||
ring = b43_setup_dmaring(dev, 2, 1, dma64);
|
||||
ring = b43_setup_dmaring(dev, 2, 1, type);
|
||||
if (!ring)
|
||||
goto err_destroy_tx1;
|
||||
dma->tx_ring2 = ring;
|
||||
|
||||
ring = b43_setup_dmaring(dev, 3, 1, dma64);
|
||||
ring = b43_setup_dmaring(dev, 3, 1, type);
|
||||
if (!ring)
|
||||
goto err_destroy_tx2;
|
||||
dma->tx_ring3 = ring;
|
||||
|
||||
ring = b43_setup_dmaring(dev, 4, 1, dma64);
|
||||
ring = b43_setup_dmaring(dev, 4, 1, type);
|
||||
if (!ring)
|
||||
goto err_destroy_tx3;
|
||||
dma->tx_ring4 = ring;
|
||||
|
||||
ring = b43_setup_dmaring(dev, 5, 1, dma64);
|
||||
ring = b43_setup_dmaring(dev, 5, 1, type);
|
||||
if (!ring)
|
||||
goto err_destroy_tx4;
|
||||
dma->tx_ring5 = ring;
|
||||
|
||||
/* setup RX DMA channels. */
|
||||
ring = b43_setup_dmaring(dev, 0, 0, dma64);
|
||||
ring = b43_setup_dmaring(dev, 0, 0, type);
|
||||
if (!ring)
|
||||
goto err_destroy_tx5;
|
||||
dma->rx_ring0 = ring;
|
||||
|
||||
if (dev->dev->id.revision < 5) {
|
||||
ring = b43_setup_dmaring(dev, 3, 0, dma64);
|
||||
ring = b43_setup_dmaring(dev, 3, 0, type);
|
||||
if (!ring)
|
||||
goto err_destroy_rx0;
|
||||
dma->rx_ring3 = ring;
|
||||
}
|
||||
|
||||
b43dbg(dev->wl, "%d-bit DMA initialized\n",
|
||||
(dmamask == DMA_64BIT_MASK) ? 64 :
|
||||
(dmamask == DMA_32BIT_MASK) ? 32 : 30);
|
||||
b43dbg(dev->wl, "%u-bit DMA initialized\n",
|
||||
(unsigned int)type);
|
||||
err = 0;
|
||||
out:
|
||||
return err;
|
||||
@@ -1038,26 +1085,30 @@ static u16 generate_cookie(struct b43_dmaring *ring, int slot)
|
||||
* in the lower 12 bits.
|
||||
* Note that the cookie must never be 0, as this
|
||||
* is a special value used in RX path.
|
||||
* It can also not be 0xFFFF because that is special
|
||||
* for multicast frames.
|
||||
*/
|
||||
switch (ring->index) {
|
||||
case 0:
|
||||
cookie = 0xA000;
|
||||
cookie = 0x1000;
|
||||
break;
|
||||
case 1:
|
||||
cookie = 0xB000;
|
||||
cookie = 0x2000;
|
||||
break;
|
||||
case 2:
|
||||
cookie = 0xC000;
|
||||
cookie = 0x3000;
|
||||
break;
|
||||
case 3:
|
||||
cookie = 0xD000;
|
||||
cookie = 0x4000;
|
||||
break;
|
||||
case 4:
|
||||
cookie = 0xE000;
|
||||
cookie = 0x5000;
|
||||
break;
|
||||
case 5:
|
||||
cookie = 0xF000;
|
||||
cookie = 0x6000;
|
||||
break;
|
||||
default:
|
||||
B43_WARN_ON(1);
|
||||
}
|
||||
B43_WARN_ON(slot & ~0x0FFF);
|
||||
cookie |= (u16) slot;
|
||||
@@ -1073,22 +1124,22 @@ struct b43_dmaring *parse_cookie(struct b43_wldev *dev, u16 cookie, int *slot)
|
||||
struct b43_dmaring *ring = NULL;
|
||||
|
||||
switch (cookie & 0xF000) {
|
||||
case 0xA000:
|
||||
case 0x1000:
|
||||
ring = dma->tx_ring0;
|
||||
break;
|
||||
case 0xB000:
|
||||
case 0x2000:
|
||||
ring = dma->tx_ring1;
|
||||
break;
|
||||
case 0xC000:
|
||||
case 0x3000:
|
||||
ring = dma->tx_ring2;
|
||||
break;
|
||||
case 0xD000:
|
||||
case 0x4000:
|
||||
ring = dma->tx_ring3;
|
||||
break;
|
||||
case 0xE000:
|
||||
case 0x5000:
|
||||
ring = dma->tx_ring4;
|
||||
break;
|
||||
case 0xF000:
|
||||
case 0x6000:
|
||||
ring = dma->tx_ring5;
|
||||
break;
|
||||
default:
|
||||
@@ -1106,32 +1157,45 @@ static int dma_tx_fragment(struct b43_dmaring *ring,
|
||||
{
|
||||
const struct b43_dma_ops *ops = ring->ops;
|
||||
u8 *header;
|
||||
int slot;
|
||||
int slot, old_top_slot, old_used_slots;
|
||||
int err;
|
||||
struct b43_dmadesc_generic *desc;
|
||||
struct b43_dmadesc_meta *meta;
|
||||
struct b43_dmadesc_meta *meta_hdr;
|
||||
struct sk_buff *bounce_skb;
|
||||
u16 cookie;
|
||||
size_t hdrsize = b43_txhdr_size(ring->dev);
|
||||
|
||||
#define SLOTS_PER_PACKET 2
|
||||
B43_WARN_ON(skb_shinfo(skb)->nr_frags);
|
||||
|
||||
old_top_slot = ring->current_slot;
|
||||
old_used_slots = ring->used_slots;
|
||||
|
||||
/* Get a slot for the header. */
|
||||
slot = request_slot(ring);
|
||||
desc = ops->idx2desc(ring, slot, &meta_hdr);
|
||||
memset(meta_hdr, 0, sizeof(*meta_hdr));
|
||||
|
||||
header = &(ring->txhdr_cache[slot * sizeof(struct b43_txhdr_fw4)]);
|
||||
b43_generate_txhdr(ring->dev, header,
|
||||
skb->data, skb->len, ctl,
|
||||
generate_cookie(ring, slot));
|
||||
header = &(ring->txhdr_cache[slot * hdrsize]);
|
||||
cookie = generate_cookie(ring, slot);
|
||||
err = b43_generate_txhdr(ring->dev, header,
|
||||
skb->data, skb->len, ctl, cookie);
|
||||
if (unlikely(err)) {
|
||||
ring->current_slot = old_top_slot;
|
||||
ring->used_slots = old_used_slots;
|
||||
return err;
|
||||
}
|
||||
|
||||
meta_hdr->dmaaddr = map_descbuffer(ring, (unsigned char *)header,
|
||||
sizeof(struct b43_txhdr_fw4), 1);
|
||||
if (dma_mapping_error(meta_hdr->dmaaddr))
|
||||
hdrsize, 1);
|
||||
if (b43_dma_mapping_error(ring, meta_hdr->dmaaddr, hdrsize)) {
|
||||
ring->current_slot = old_top_slot;
|
||||
ring->used_slots = old_used_slots;
|
||||
return -EIO;
|
||||
}
|
||||
ops->fill_descriptor(ring, desc, meta_hdr->dmaaddr,
|
||||
sizeof(struct b43_txhdr_fw4), 1, 0, 0);
|
||||
hdrsize, 1, 0, 0);
|
||||
|
||||
/* Get a slot for the payload. */
|
||||
slot = request_slot(ring);
|
||||
@@ -1144,9 +1208,11 @@ static int dma_tx_fragment(struct b43_dmaring *ring,
|
||||
|
||||
meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1);
|
||||
/* create a bounce buffer in zone_dma on mapping failure. */
|
||||
if (dma_mapping_error(meta->dmaaddr)) {
|
||||
if (b43_dma_mapping_error(ring, meta->dmaaddr, skb->len)) {
|
||||
bounce_skb = __dev_alloc_skb(skb->len, GFP_ATOMIC | GFP_DMA);
|
||||
if (!bounce_skb) {
|
||||
ring->current_slot = old_top_slot;
|
||||
ring->used_slots = old_used_slots;
|
||||
err = -ENOMEM;
|
||||
goto out_unmap_hdr;
|
||||
}
|
||||
@@ -1156,7 +1222,9 @@ static int dma_tx_fragment(struct b43_dmaring *ring,
|
||||
skb = bounce_skb;
|
||||
meta->skb = skb;
|
||||
meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1);
|
||||
if (dma_mapping_error(meta->dmaaddr)) {
|
||||
if (b43_dma_mapping_error(ring, meta->dmaaddr, skb->len)) {
|
||||
ring->current_slot = old_top_slot;
|
||||
ring->used_slots = old_used_slots;
|
||||
err = -EIO;
|
||||
goto out_free_bounce;
|
||||
}
|
||||
@@ -1164,16 +1232,22 @@ static int dma_tx_fragment(struct b43_dmaring *ring,
|
||||
|
||||
ops->fill_descriptor(ring, desc, meta->dmaaddr, skb->len, 0, 1, 1);
|
||||
|
||||
if (ctl->flags & IEEE80211_TXCTL_SEND_AFTER_DTIM) {
|
||||
/* Tell the firmware about the cookie of the last
|
||||
* mcast frame, so it can clear the more-data bit in it. */
|
||||
b43_shm_write16(ring->dev, B43_SHM_SHARED,
|
||||
B43_SHM_SH_MCASTCOOKIE, cookie);
|
||||
}
|
||||
/* Now transfer the whole frame. */
|
||||
wmb();
|
||||
ops->poke_tx(ring, next_slot(ring, slot));
|
||||
return 0;
|
||||
|
||||
out_free_bounce:
|
||||
out_free_bounce:
|
||||
dev_kfree_skb_any(skb);
|
||||
out_unmap_hdr:
|
||||
out_unmap_hdr:
|
||||
unmap_descbuffer(ring, meta_hdr->dmaaddr,
|
||||
sizeof(struct b43_txhdr_fw4), 1);
|
||||
hdrsize, 1);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1202,10 +1276,27 @@ int b43_dma_tx(struct b43_wldev *dev,
|
||||
struct sk_buff *skb, struct ieee80211_tx_control *ctl)
|
||||
{
|
||||
struct b43_dmaring *ring;
|
||||
struct ieee80211_hdr *hdr;
|
||||
int err = 0;
|
||||
unsigned long flags;
|
||||
|
||||
ring = priority_to_txring(dev, ctl->queue);
|
||||
if (unlikely(skb->len < 2 + 2 + 6)) {
|
||||
/* Too short, this can't be a valid frame. */
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
hdr = (struct ieee80211_hdr *)skb->data;
|
||||
if (ctl->flags & IEEE80211_TXCTL_SEND_AFTER_DTIM) {
|
||||
/* The multicast ring will be sent after the DTIM */
|
||||
ring = dev->dma.tx_ring4;
|
||||
/* Set the more-data bit. Ucode will clear it on
|
||||
* the last frame for us. */
|
||||
hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_MOREDATA);
|
||||
} else {
|
||||
/* Decide by priority where to put this frame. */
|
||||
ring = priority_to_txring(dev, ctl->queue);
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&ring->lock, flags);
|
||||
B43_WARN_ON(!ring->tx);
|
||||
if (unlikely(free_slots(ring) < SLOTS_PER_PACKET)) {
|
||||
@@ -1219,6 +1310,13 @@ int b43_dma_tx(struct b43_wldev *dev,
|
||||
B43_WARN_ON(ring->stopped);
|
||||
|
||||
err = dma_tx_fragment(ring, skb, ctl);
|
||||
if (unlikely(err == -ENOKEY)) {
|
||||
/* Drop this packet, as we don't have the encryption key
|
||||
* anymore and must not transmit it unencrypted. */
|
||||
dev_kfree_skb_any(skb);
|
||||
err = 0;
|
||||
goto out_unlock;
|
||||
}
|
||||
if (unlikely(err)) {
|
||||
b43err(dev->wl, "DMA tx mapping failure\n");
|
||||
goto out_unlock;
|
||||
@@ -1233,7 +1331,7 @@ int b43_dma_tx(struct b43_wldev *dev,
|
||||
b43dbg(dev->wl, "Stopped TX ring %d\n", ring->index);
|
||||
}
|
||||
}
|
||||
out_unlock:
|
||||
out_unlock:
|
||||
spin_unlock_irqrestore(&ring->lock, flags);
|
||||
|
||||
return err;
|
||||
@@ -1265,7 +1363,7 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev,
|
||||
1);
|
||||
else
|
||||
unmap_descbuffer(ring, meta->dmaaddr,
|
||||
sizeof(struct b43_txhdr_fw4), 1);
|
||||
b43_txhdr_size(dev), 1);
|
||||
|
||||
if (meta->is_last_fragment) {
|
||||
B43_WARN_ON(!meta->skb);
|
||||
|
||||
@@ -170,8 +170,6 @@ struct b43_dmadesc_generic {
|
||||
#define B43_DMA0_RX_BUFFERSIZE (2304 + 100)
|
||||
#define B43_DMA3_RX_BUFFERSIZE 16
|
||||
|
||||
#ifdef CONFIG_B43_DMA
|
||||
|
||||
struct sk_buff;
|
||||
struct b43_private;
|
||||
struct b43_txstatus;
|
||||
@@ -205,6 +203,12 @@ struct b43_dma_ops {
|
||||
void (*set_current_rxslot) (struct b43_dmaring * ring, int slot);
|
||||
};
|
||||
|
||||
enum b43_dmatype {
|
||||
B43_DMA_30BIT = 30,
|
||||
B43_DMA_32BIT = 32,
|
||||
B43_DMA_64BIT = 64,
|
||||
};
|
||||
|
||||
struct b43_dmaring {
|
||||
/* Lowlevel DMA ops. */
|
||||
const struct b43_dma_ops *ops;
|
||||
@@ -237,8 +241,8 @@ struct b43_dmaring {
|
||||
int index;
|
||||
/* Boolean. Is this a TX ring? */
|
||||
bool tx;
|
||||
/* Boolean. 64bit DMA if true, 32bit DMA otherwise. */
|
||||
bool dma64;
|
||||
/* The type of DMA engine used. */
|
||||
enum b43_dmatype type;
|
||||
/* Boolean. Is this ring stopped at ieee80211 level? */
|
||||
bool stopped;
|
||||
/* Lock, only used for TX. */
|
||||
@@ -257,8 +261,7 @@ static inline u32 b43_dma_read(struct b43_dmaring *ring, u16 offset)
|
||||
return b43_read32(ring->dev, ring->mmio_base + offset);
|
||||
}
|
||||
|
||||
static inline
|
||||
void b43_dma_write(struct b43_dmaring *ring, u16 offset, u32 value)
|
||||
static inline void b43_dma_write(struct b43_dmaring *ring, u16 offset, u32 value)
|
||||
{
|
||||
b43_write32(ring->dev, ring->mmio_base + offset, value);
|
||||
}
|
||||
@@ -266,13 +269,6 @@ static inline
|
||||
int b43_dma_init(struct b43_wldev *dev);
|
||||
void b43_dma_free(struct b43_wldev *dev);
|
||||
|
||||
int b43_dmacontroller_rx_reset(struct b43_wldev *dev,
|
||||
u16 dmacontroller_mmio_base, int dma64);
|
||||
int b43_dmacontroller_tx_reset(struct b43_wldev *dev,
|
||||
u16 dmacontroller_mmio_base, int dma64);
|
||||
|
||||
u16 b43_dmacontroller_base(int dma64bit, int dmacontroller_idx);
|
||||
|
||||
void b43_dma_tx_suspend(struct b43_wldev *dev);
|
||||
void b43_dma_tx_resume(struct b43_wldev *dev);
|
||||
|
||||
@@ -286,52 +282,4 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev,
|
||||
|
||||
void b43_dma_rx(struct b43_dmaring *ring);
|
||||
|
||||
#else /* CONFIG_B43_DMA */
|
||||
|
||||
static inline int b43_dma_init(struct b43_wldev *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void b43_dma_free(struct b43_wldev *dev)
|
||||
{
|
||||
}
|
||||
static inline
|
||||
int b43_dmacontroller_rx_reset(struct b43_wldev *dev,
|
||||
u16 dmacontroller_mmio_base, int dma64)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline
|
||||
int b43_dmacontroller_tx_reset(struct b43_wldev *dev,
|
||||
u16 dmacontroller_mmio_base, int dma64)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline
|
||||
void b43_dma_get_tx_stats(struct b43_wldev *dev,
|
||||
struct ieee80211_tx_queue_stats *stats)
|
||||
{
|
||||
}
|
||||
static inline
|
||||
int b43_dma_tx(struct b43_wldev *dev,
|
||||
struct sk_buff *skb, struct ieee80211_tx_control *ctl)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline
|
||||
void b43_dma_handle_txstatus(struct b43_wldev *dev,
|
||||
const struct b43_txstatus *status)
|
||||
{
|
||||
}
|
||||
static inline void b43_dma_rx(struct b43_dmaring *ring)
|
||||
{
|
||||
}
|
||||
static inline void b43_dma_tx_suspend(struct b43_wldev *dev)
|
||||
{
|
||||
}
|
||||
static inline void b43_dma_tx_resume(struct b43_wldev *dev)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_B43_DMA */
|
||||
#endif /* B43_DMA_H_ */
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
LED control
|
||||
|
||||
Copyright (c) 2005 Martin Langer <martin-langer@gmx.de>,
|
||||
Copyright (c) 2005 Stefano Brivio <st3@riseup.net>
|
||||
Copyright (c) 2005 Stefano Brivio <stefano.brivio@polimi.it>
|
||||
Copyright (c) 2005-2007 Michael Buesch <mb@bu3sch.de>
|
||||
Copyright (c) 2005 Danny van Dyk <kugelfang@gentoo.org>
|
||||
Copyright (c) 2005 Andreas Jaggi <andreas.jaggi@waterwave.ch>
|
||||
@@ -163,6 +163,9 @@ static void b43_map_led(struct b43_wldev *dev,
|
||||
b43_register_led(dev, &dev->led_radio, name,
|
||||
b43_rfkill_led_name(dev),
|
||||
led_index, activelow);
|
||||
/* Sync the RF-kill LED state with the switch state. */
|
||||
if (dev->radio_hw_enable)
|
||||
b43_led_turn_on(dev, led_index, activelow);
|
||||
break;
|
||||
case B43_LED_WEIRD:
|
||||
case B43_LED_ASSOC:
|
||||
@@ -187,10 +190,10 @@ void b43_leds_init(struct b43_wldev *dev)
|
||||
enum b43_led_behaviour behaviour;
|
||||
bool activelow;
|
||||
|
||||
sprom[0] = bus->sprom.r1.gpio0;
|
||||
sprom[1] = bus->sprom.r1.gpio1;
|
||||
sprom[2] = bus->sprom.r1.gpio2;
|
||||
sprom[3] = bus->sprom.r1.gpio3;
|
||||
sprom[0] = bus->sprom.gpio0;
|
||||
sprom[1] = bus->sprom.gpio1;
|
||||
sprom[2] = bus->sprom.gpio2;
|
||||
sprom[3] = bus->sprom.gpio3;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (sprom[i] == 0xFF) {
|
||||
@@ -232,4 +235,5 @@ void b43_leds_exit(struct b43_wldev *dev)
|
||||
b43_unregister_led(&dev->led_tx);
|
||||
b43_unregister_led(&dev->led_rx);
|
||||
b43_unregister_led(&dev->led_assoc);
|
||||
b43_unregister_led(&dev->led_radio);
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
G PHY LO (LocalOscillator) Measuring and Control routines
|
||||
|
||||
Copyright (c) 2005 Martin Langer <martin-langer@gmx.de>,
|
||||
Copyright (c) 2005, 2006 Stefano Brivio <st3@riseup.net>
|
||||
Copyright (c) 2005, 2006 Stefano Brivio <stefano.brivio@polimi.it>
|
||||
Copyright (c) 2005-2007 Michael Buesch <mb@bu3sch.de>
|
||||
Copyright (c) 2005, 2006 Danny van Dyk <kugelfang@gentoo.org>
|
||||
Copyright (c) 2005, 2006 Andreas Jaggi <andreas.jaggi@waterwave.ch>
|
||||
@@ -264,8 +264,8 @@ static u16 lo_measure_feedthrough(struct b43_wldev *dev,
|
||||
rfover |= pga;
|
||||
rfover |= lna;
|
||||
rfover |= trsw_rx;
|
||||
if ((dev->dev->bus->sprom.r1.boardflags_lo & B43_BFL_EXTLNA) &&
|
||||
phy->rev > 6)
|
||||
if ((dev->dev->bus->sprom.boardflags_lo & B43_BFL_EXTLNA)
|
||||
&& phy->rev > 6)
|
||||
rfover |= B43_PHY_RFOVERVAL_EXTLNA;
|
||||
|
||||
b43_phy_write(dev, B43_PHY_PGACTL, 0xE300);
|
||||
@@ -555,20 +555,20 @@ struct lo_g_saved_values {
|
||||
u16 phy_extg_01;
|
||||
u16 phy_dacctl_hwpctl;
|
||||
u16 phy_dacctl;
|
||||
u16 phy_base_14;
|
||||
u16 phy_cck_14;
|
||||
u16 phy_hpwr_tssictl;
|
||||
u16 phy_analogover;
|
||||
u16 phy_analogoverval;
|
||||
u16 phy_rfover;
|
||||
u16 phy_rfoverval;
|
||||
u16 phy_classctl;
|
||||
u16 phy_base_3E;
|
||||
u16 phy_cck_3E;
|
||||
u16 phy_crs0;
|
||||
u16 phy_pgactl;
|
||||
u16 phy_base_2A;
|
||||
u16 phy_cck_2A;
|
||||
u16 phy_syncctl;
|
||||
u16 phy_base_30;
|
||||
u16 phy_base_06;
|
||||
u16 phy_cck_30;
|
||||
u16 phy_cck_06;
|
||||
|
||||
/* Radio registers */
|
||||
u16 radio_43;
|
||||
@@ -588,7 +588,7 @@ static void lo_measure_setup(struct b43_wldev *dev,
|
||||
sav->phy_lo_mask = b43_phy_read(dev, B43_PHY_LO_MASK);
|
||||
sav->phy_extg_01 = b43_phy_read(dev, B43_PHY_EXTG(0x01));
|
||||
sav->phy_dacctl_hwpctl = b43_phy_read(dev, B43_PHY_DACCTL);
|
||||
sav->phy_base_14 = b43_phy_read(dev, B43_PHY_BASE(0x14));
|
||||
sav->phy_cck_14 = b43_phy_read(dev, B43_PHY_CCK(0x14));
|
||||
sav->phy_hpwr_tssictl = b43_phy_read(dev, B43_PHY_HPWR_TSSICTL);
|
||||
|
||||
b43_phy_write(dev, B43_PHY_HPWR_TSSICTL,
|
||||
@@ -600,14 +600,14 @@ static void lo_measure_setup(struct b43_wldev *dev,
|
||||
b43_phy_write(dev, B43_PHY_DACCTL,
|
||||
b43_phy_read(dev, B43_PHY_DACCTL)
|
||||
| 0x40);
|
||||
b43_phy_write(dev, B43_PHY_BASE(0x14),
|
||||
b43_phy_read(dev, B43_PHY_BASE(0x14))
|
||||
b43_phy_write(dev, B43_PHY_CCK(0x14),
|
||||
b43_phy_read(dev, B43_PHY_CCK(0x14))
|
||||
| 0x200);
|
||||
}
|
||||
if (phy->type == B43_PHYTYPE_B &&
|
||||
phy->radio_ver == 0x2050 && phy->radio_rev < 6) {
|
||||
b43_phy_write(dev, B43_PHY_BASE(0x16), 0x410);
|
||||
b43_phy_write(dev, B43_PHY_BASE(0x17), 0x820);
|
||||
b43_phy_write(dev, B43_PHY_CCK(0x16), 0x410);
|
||||
b43_phy_write(dev, B43_PHY_CCK(0x17), 0x820);
|
||||
}
|
||||
if (!lo->rebuild && b43_has_hardware_pctl(phy))
|
||||
lo_read_power_vector(dev);
|
||||
@@ -618,7 +618,7 @@ static void lo_measure_setup(struct b43_wldev *dev,
|
||||
sav->phy_rfover = b43_phy_read(dev, B43_PHY_RFOVER);
|
||||
sav->phy_rfoverval = b43_phy_read(dev, B43_PHY_RFOVERVAL);
|
||||
sav->phy_classctl = b43_phy_read(dev, B43_PHY_CLASSCTL);
|
||||
sav->phy_base_3E = b43_phy_read(dev, B43_PHY_BASE(0x3E));
|
||||
sav->phy_cck_3E = b43_phy_read(dev, B43_PHY_CCK(0x3E));
|
||||
sav->phy_crs0 = b43_phy_read(dev, B43_PHY_CRS0);
|
||||
|
||||
b43_phy_write(dev, B43_PHY_CLASSCTL,
|
||||
@@ -634,7 +634,7 @@ static void lo_measure_setup(struct b43_wldev *dev,
|
||||
& 0xFFFC);
|
||||
if (phy->type == B43_PHYTYPE_G) {
|
||||
if ((phy->rev >= 7) &&
|
||||
(sprom->r1.boardflags_lo & B43_BFL_EXTLNA)) {
|
||||
(sprom->boardflags_lo & B43_BFL_EXTLNA)) {
|
||||
b43_phy_write(dev, B43_PHY_RFOVER, 0x933);
|
||||
} else {
|
||||
b43_phy_write(dev, B43_PHY_RFOVER, 0x133);
|
||||
@@ -642,14 +642,14 @@ static void lo_measure_setup(struct b43_wldev *dev,
|
||||
} else {
|
||||
b43_phy_write(dev, B43_PHY_RFOVER, 0);
|
||||
}
|
||||
b43_phy_write(dev, B43_PHY_BASE(0x3E), 0);
|
||||
b43_phy_write(dev, B43_PHY_CCK(0x3E), 0);
|
||||
}
|
||||
sav->reg_3F4 = b43_read16(dev, 0x3F4);
|
||||
sav->reg_3E2 = b43_read16(dev, 0x3E2);
|
||||
sav->radio_43 = b43_radio_read16(dev, 0x43);
|
||||
sav->radio_7A = b43_radio_read16(dev, 0x7A);
|
||||
sav->phy_pgactl = b43_phy_read(dev, B43_PHY_PGACTL);
|
||||
sav->phy_base_2A = b43_phy_read(dev, B43_PHY_BASE(0x2A));
|
||||
sav->phy_cck_2A = b43_phy_read(dev, B43_PHY_CCK(0x2A));
|
||||
sav->phy_syncctl = b43_phy_read(dev, B43_PHY_SYNCCTL);
|
||||
sav->phy_dacctl = b43_phy_read(dev, B43_PHY_DACCTL);
|
||||
|
||||
@@ -658,10 +658,10 @@ static void lo_measure_setup(struct b43_wldev *dev,
|
||||
sav->radio_52 &= 0x00F0;
|
||||
}
|
||||
if (phy->type == B43_PHYTYPE_B) {
|
||||
sav->phy_base_30 = b43_phy_read(dev, B43_PHY_BASE(0x30));
|
||||
sav->phy_base_06 = b43_phy_read(dev, B43_PHY_BASE(0x06));
|
||||
b43_phy_write(dev, B43_PHY_BASE(0x30), 0x00FF);
|
||||
b43_phy_write(dev, B43_PHY_BASE(0x06), 0x3F3F);
|
||||
sav->phy_cck_30 = b43_phy_read(dev, B43_PHY_CCK(0x30));
|
||||
sav->phy_cck_06 = b43_phy_read(dev, B43_PHY_CCK(0x06));
|
||||
b43_phy_write(dev, B43_PHY_CCK(0x30), 0x00FF);
|
||||
b43_phy_write(dev, B43_PHY_CCK(0x06), 0x3F3F);
|
||||
} else {
|
||||
b43_write16(dev, 0x3E2, b43_read16(dev, 0x3E2)
|
||||
| 0x8000);
|
||||
@@ -670,7 +670,7 @@ static void lo_measure_setup(struct b43_wldev *dev,
|
||||
& 0xF000);
|
||||
|
||||
tmp =
|
||||
(phy->type == B43_PHYTYPE_G) ? B43_PHY_LO_MASK : B43_PHY_BASE(0x2E);
|
||||
(phy->type == B43_PHYTYPE_G) ? B43_PHY_LO_MASK : B43_PHY_CCK(0x2E);
|
||||
b43_phy_write(dev, tmp, 0x007F);
|
||||
|
||||
tmp = sav->phy_syncctl;
|
||||
@@ -678,26 +678,26 @@ static void lo_measure_setup(struct b43_wldev *dev,
|
||||
tmp = sav->radio_7A;
|
||||
b43_radio_write16(dev, 0x007A, tmp & 0xFFF0);
|
||||
|
||||
b43_phy_write(dev, B43_PHY_BASE(0x2A), 0x8A3);
|
||||
b43_phy_write(dev, B43_PHY_CCK(0x2A), 0x8A3);
|
||||
if (phy->type == B43_PHYTYPE_G ||
|
||||
(phy->type == B43_PHYTYPE_B &&
|
||||
phy->radio_ver == 0x2050 && phy->radio_rev >= 6)) {
|
||||
b43_phy_write(dev, B43_PHY_BASE(0x2B), 0x1003);
|
||||
b43_phy_write(dev, B43_PHY_CCK(0x2B), 0x1003);
|
||||
} else
|
||||
b43_phy_write(dev, B43_PHY_BASE(0x2B), 0x0802);
|
||||
b43_phy_write(dev, B43_PHY_CCK(0x2B), 0x0802);
|
||||
if (phy->rev >= 2)
|
||||
b43_dummy_transmission(dev);
|
||||
b43_radio_selectchannel(dev, 6, 0);
|
||||
b43_radio_read16(dev, 0x51); /* dummy read */
|
||||
if (phy->type == B43_PHYTYPE_G)
|
||||
b43_phy_write(dev, B43_PHY_BASE(0x2F), 0);
|
||||
b43_phy_write(dev, B43_PHY_CCK(0x2F), 0);
|
||||
if (lo->rebuild)
|
||||
lo_measure_txctl_values(dev);
|
||||
if (phy->type == B43_PHYTYPE_G && phy->rev >= 3) {
|
||||
b43_phy_write(dev, B43_PHY_LO_MASK, 0xC078);
|
||||
} else {
|
||||
if (phy->type == B43_PHYTYPE_B)
|
||||
b43_phy_write(dev, B43_PHY_BASE(0x2E), 0x8078);
|
||||
b43_phy_write(dev, B43_PHY_CCK(0x2E), 0x8078);
|
||||
else
|
||||
b43_phy_write(dev, B43_PHY_LO_MASK, 0x8078);
|
||||
}
|
||||
@@ -732,17 +732,17 @@ static void lo_measure_restore(struct b43_wldev *dev,
|
||||
}
|
||||
if (phy->type == B43_PHYTYPE_G) {
|
||||
if (phy->rev >= 3)
|
||||
b43_phy_write(dev, B43_PHY_BASE(0x2E), 0xC078);
|
||||
b43_phy_write(dev, B43_PHY_CCK(0x2E), 0xC078);
|
||||
else
|
||||
b43_phy_write(dev, B43_PHY_BASE(0x2E), 0x8078);
|
||||
b43_phy_write(dev, B43_PHY_CCK(0x2E), 0x8078);
|
||||
if (phy->rev >= 2)
|
||||
b43_phy_write(dev, B43_PHY_BASE(0x2F), 0x0202);
|
||||
b43_phy_write(dev, B43_PHY_CCK(0x2F), 0x0202);
|
||||
else
|
||||
b43_phy_write(dev, B43_PHY_BASE(0x2F), 0x0101);
|
||||
b43_phy_write(dev, B43_PHY_CCK(0x2F), 0x0101);
|
||||
}
|
||||
b43_write16(dev, 0x3F4, sav->reg_3F4);
|
||||
b43_phy_write(dev, B43_PHY_PGACTL, sav->phy_pgactl);
|
||||
b43_phy_write(dev, B43_PHY_BASE(0x2A), sav->phy_base_2A);
|
||||
b43_phy_write(dev, B43_PHY_CCK(0x2A), sav->phy_cck_2A);
|
||||
b43_phy_write(dev, B43_PHY_SYNCCTL, sav->phy_syncctl);
|
||||
b43_phy_write(dev, B43_PHY_DACCTL, sav->phy_dacctl);
|
||||
b43_radio_write16(dev, 0x43, sav->radio_43);
|
||||
@@ -755,8 +755,8 @@ static void lo_measure_restore(struct b43_wldev *dev,
|
||||
b43_write16(dev, 0x3E2, sav->reg_3E2);
|
||||
if (phy->type == B43_PHYTYPE_B &&
|
||||
phy->radio_ver == 0x2050 && phy->radio_rev <= 5) {
|
||||
b43_phy_write(dev, B43_PHY_BASE(0x30), sav->phy_base_30);
|
||||
b43_phy_write(dev, B43_PHY_BASE(0x06), sav->phy_base_06);
|
||||
b43_phy_write(dev, B43_PHY_CCK(0x30), sav->phy_cck_30);
|
||||
b43_phy_write(dev, B43_PHY_CCK(0x06), sav->phy_cck_06);
|
||||
}
|
||||
if (phy->rev >= 2) {
|
||||
b43_phy_write(dev, B43_PHY_ANALOGOVER, sav->phy_analogover);
|
||||
@@ -765,7 +765,7 @@ static void lo_measure_restore(struct b43_wldev *dev,
|
||||
b43_phy_write(dev, B43_PHY_CLASSCTL, sav->phy_classctl);
|
||||
b43_phy_write(dev, B43_PHY_RFOVER, sav->phy_rfover);
|
||||
b43_phy_write(dev, B43_PHY_RFOVERVAL, sav->phy_rfoverval);
|
||||
b43_phy_write(dev, B43_PHY_BASE(0x3E), sav->phy_base_3E);
|
||||
b43_phy_write(dev, B43_PHY_CCK(0x3E), sav->phy_cck_3E);
|
||||
b43_phy_write(dev, B43_PHY_CRS0, sav->phy_crs0);
|
||||
}
|
||||
if (b43_has_hardware_pctl(phy)) {
|
||||
@@ -773,7 +773,7 @@ static void lo_measure_restore(struct b43_wldev *dev,
|
||||
b43_phy_write(dev, B43_PHY_LO_MASK, tmp);
|
||||
b43_phy_write(dev, B43_PHY_EXTG(0x01), sav->phy_extg_01);
|
||||
b43_phy_write(dev, B43_PHY_DACCTL, sav->phy_dacctl_hwpctl);
|
||||
b43_phy_write(dev, B43_PHY_BASE(0x14), sav->phy_base_14);
|
||||
b43_phy_write(dev, B43_PHY_CCK(0x14), sav->phy_cck_14);
|
||||
b43_phy_write(dev, B43_PHY_HPWR_TSSICTL, sav->phy_hpwr_tssictl);
|
||||
}
|
||||
b43_radio_selectchannel(dev, sav->old_channel, 1);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3,7 +3,7 @@
|
||||
Broadcom B43 wireless driver
|
||||
|
||||
Copyright (c) 2005 Martin Langer <martin-langer@gmx.de>,
|
||||
Stefano Brivio <st3@riseup.net>
|
||||
Stefano Brivio <stefano.brivio@polimi.it>
|
||||
Michael Buesch <mb@bu3sch.de>
|
||||
Danny van Dyk <kugelfang@gentoo.org>
|
||||
Andreas Jaggi <andreas.jaggi@waterwave.ch>
|
||||
@@ -39,11 +39,11 @@
|
||||
#define PAD_BYTES(nr_bytes) P4D_BYTES( __LINE__ , (nr_bytes))
|
||||
|
||||
/* Lightweight function to convert a frequency (in Mhz) to a channel number. */
|
||||
static inline u8 b43_freq_to_channel_a(int freq)
|
||||
static inline u8 b43_freq_to_channel_5ghz(int freq)
|
||||
{
|
||||
return ((freq - 5000) / 5);
|
||||
}
|
||||
static inline u8 b43_freq_to_channel_bg(int freq)
|
||||
static inline u8 b43_freq_to_channel_2ghz(int freq)
|
||||
{
|
||||
u8 channel;
|
||||
|
||||
@@ -54,19 +54,13 @@ static inline u8 b43_freq_to_channel_bg(int freq)
|
||||
|
||||
return channel;
|
||||
}
|
||||
static inline u8 b43_freq_to_channel(struct b43_wldev *dev, int freq)
|
||||
{
|
||||
if (dev->phy.type == B43_PHYTYPE_A)
|
||||
return b43_freq_to_channel_a(freq);
|
||||
return b43_freq_to_channel_bg(freq);
|
||||
}
|
||||
|
||||
/* Lightweight function to convert a channel number to a frequency (in Mhz). */
|
||||
static inline int b43_channel_to_freq_a(u8 channel)
|
||||
static inline int b43_channel_to_freq_5ghz(u8 channel)
|
||||
{
|
||||
return (5000 + (5 * channel));
|
||||
}
|
||||
static inline int b43_channel_to_freq_bg(u8 channel)
|
||||
static inline int b43_channel_to_freq_2ghz(u8 channel)
|
||||
{
|
||||
int freq;
|
||||
|
||||
@@ -77,12 +71,6 @@ static inline int b43_channel_to_freq_bg(u8 channel)
|
||||
|
||||
return freq;
|
||||
}
|
||||
static inline int b43_channel_to_freq(struct b43_wldev *dev, u8 channel)
|
||||
{
|
||||
if (dev->phy.type == B43_PHYTYPE_A)
|
||||
return b43_channel_to_freq_a(channel);
|
||||
return b43_channel_to_freq_bg(channel);
|
||||
}
|
||||
|
||||
static inline int b43_is_cck_rate(int rate)
|
||||
{
|
||||
@@ -96,6 +84,9 @@ static inline int b43_is_ofdm_rate(int rate)
|
||||
return !b43_is_cck_rate(rate);
|
||||
}
|
||||
|
||||
u8 b43_ieee80211_antenna_sanitize(struct b43_wldev *dev,
|
||||
u8 antenna_nr);
|
||||
|
||||
void b43_tsf_read(struct b43_wldev *dev, u64 * tsf);
|
||||
void b43_tsf_write(struct b43_wldev *dev, u64 tsf);
|
||||
|
||||
|
||||
489
package/b43/src/nphy.c
Normal file
489
package/b43/src/nphy.c
Normal file
@@ -0,0 +1,489 @@
|
||||
/*
|
||||
|
||||
Broadcom B43 wireless driver
|
||||
IEEE 802.11n PHY support
|
||||
|
||||
Copyright (c) 2008 Michael Buesch <mb@bu3sch.de>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
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; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
|
||||
Boston, MA 02110-1301, USA.
|
||||
|
||||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include "b43.h"
|
||||
#include "nphy.h"
|
||||
#include "tables_nphy.h"
|
||||
|
||||
#include <linux/delay.h>
|
||||
|
||||
|
||||
void b43_nphy_set_rxantenna(struct b43_wldev *dev, int antenna)
|
||||
{//TODO
|
||||
}
|
||||
|
||||
void b43_nphy_xmitpower(struct b43_wldev *dev)
|
||||
{//TODO
|
||||
}
|
||||
|
||||
static void b43_chantab_radio_upload(struct b43_wldev *dev,
|
||||
const struct b43_nphy_channeltab_entry *e)
|
||||
{
|
||||
b43_radio_write16(dev, B2055_PLL_REF, e->radio_pll_ref);
|
||||
b43_radio_write16(dev, B2055_RF_PLLMOD0, e->radio_rf_pllmod0);
|
||||
b43_radio_write16(dev, B2055_RF_PLLMOD1, e->radio_rf_pllmod1);
|
||||
b43_radio_write16(dev, B2055_VCO_CAPTAIL, e->radio_vco_captail);
|
||||
b43_radio_write16(dev, B2055_VCO_CAL1, e->radio_vco_cal1);
|
||||
b43_radio_write16(dev, B2055_VCO_CAL2, e->radio_vco_cal2);
|
||||
b43_radio_write16(dev, B2055_PLL_LFC1, e->radio_pll_lfc1);
|
||||
b43_radio_write16(dev, B2055_PLL_LFR1, e->radio_pll_lfr1);
|
||||
b43_radio_write16(dev, B2055_PLL_LFC2, e->radio_pll_lfc2);
|
||||
b43_radio_write16(dev, B2055_LGBUF_CENBUF, e->radio_lgbuf_cenbuf);
|
||||
b43_radio_write16(dev, B2055_LGEN_TUNE1, e->radio_lgen_tune1);
|
||||
b43_radio_write16(dev, B2055_LGEN_TUNE2, e->radio_lgen_tune2);
|
||||
b43_radio_write16(dev, B2055_C1_LGBUF_ATUNE, e->radio_c1_lgbuf_atune);
|
||||
b43_radio_write16(dev, B2055_C1_LGBUF_GTUNE, e->radio_c1_lgbuf_gtune);
|
||||
b43_radio_write16(dev, B2055_C1_RX_RFR1, e->radio_c1_rx_rfr1);
|
||||
b43_radio_write16(dev, B2055_C1_TX_PGAPADTN, e->radio_c1_tx_pgapadtn);
|
||||
b43_radio_write16(dev, B2055_C1_TX_MXBGTRIM, e->radio_c1_tx_mxbgtrim);
|
||||
b43_radio_write16(dev, B2055_C2_LGBUF_ATUNE, e->radio_c2_lgbuf_atune);
|
||||
b43_radio_write16(dev, B2055_C2_LGBUF_GTUNE, e->radio_c2_lgbuf_gtune);
|
||||
b43_radio_write16(dev, B2055_C2_RX_RFR1, e->radio_c2_rx_rfr1);
|
||||
b43_radio_write16(dev, B2055_C2_TX_PGAPADTN, e->radio_c2_tx_pgapadtn);
|
||||
b43_radio_write16(dev, B2055_C2_TX_MXBGTRIM, e->radio_c2_tx_mxbgtrim);
|
||||
}
|
||||
|
||||
static void b43_chantab_phy_upload(struct b43_wldev *dev,
|
||||
const struct b43_nphy_channeltab_entry *e)
|
||||
{
|
||||
b43_phy_write(dev, B43_NPHY_BW1A, e->phy_bw1a);
|
||||
b43_phy_write(dev, B43_NPHY_BW2, e->phy_bw2);
|
||||
b43_phy_write(dev, B43_NPHY_BW3, e->phy_bw3);
|
||||
b43_phy_write(dev, B43_NPHY_BW4, e->phy_bw4);
|
||||
b43_phy_write(dev, B43_NPHY_BW5, e->phy_bw5);
|
||||
b43_phy_write(dev, B43_NPHY_BW6, e->phy_bw6);
|
||||
}
|
||||
|
||||
static void b43_nphy_tx_power_fix(struct b43_wldev *dev)
|
||||
{
|
||||
//TODO
|
||||
}
|
||||
|
||||
/* Tune the hardware to a new channel. Don't call this directly.
|
||||
* Use b43_radio_selectchannel() */
|
||||
int b43_nphy_selectchannel(struct b43_wldev *dev, u8 channel)
|
||||
{
|
||||
const struct b43_nphy_channeltab_entry *tabent;
|
||||
|
||||
tabent = b43_nphy_get_chantabent(dev, channel);
|
||||
if (!tabent)
|
||||
return -ESRCH;
|
||||
|
||||
//FIXME enable/disable band select upper20 in RXCTL
|
||||
if (0 /*FIXME 5Ghz*/)
|
||||
b43_radio_maskset(dev, B2055_MASTER1, 0xFF8F, 0x20);
|
||||
else
|
||||
b43_radio_maskset(dev, B2055_MASTER1, 0xFF8F, 0x50);
|
||||
b43_chantab_radio_upload(dev, tabent);
|
||||
udelay(50);
|
||||
b43_radio_write16(dev, B2055_VCO_CAL10, 5);
|
||||
b43_radio_write16(dev, B2055_VCO_CAL10, 45);
|
||||
b43_radio_write16(dev, B2055_VCO_CAL10, 65);
|
||||
udelay(300);
|
||||
if (0 /*FIXME 5Ghz*/)
|
||||
b43_phy_set(dev, B43_NPHY_BANDCTL, B43_NPHY_BANDCTL_5GHZ);
|
||||
else
|
||||
b43_phy_mask(dev, B43_NPHY_BANDCTL, ~B43_NPHY_BANDCTL_5GHZ);
|
||||
b43_chantab_phy_upload(dev, tabent);
|
||||
b43_nphy_tx_power_fix(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void b43_radio_init2055_pre(struct b43_wldev *dev)
|
||||
{
|
||||
b43_phy_mask(dev, B43_NPHY_RFCTL_CMD,
|
||||
~B43_NPHY_RFCTL_CMD_PORFORCE);
|
||||
b43_phy_set(dev, B43_NPHY_RFCTL_CMD,
|
||||
B43_NPHY_RFCTL_CMD_CHIP0PU |
|
||||
B43_NPHY_RFCTL_CMD_OEPORFORCE);
|
||||
b43_phy_set(dev, B43_NPHY_RFCTL_CMD,
|
||||
B43_NPHY_RFCTL_CMD_PORFORCE);
|
||||
}
|
||||
|
||||
static void b43_radio_init2055_post(struct b43_wldev *dev)
|
||||
{
|
||||
struct ssb_sprom *sprom = &(dev->dev->bus->sprom);
|
||||
struct ssb_boardinfo *binfo = &(dev->dev->bus->boardinfo);
|
||||
int i;
|
||||
u16 val;
|
||||
|
||||
b43_radio_mask(dev, B2055_MASTER1, 0xFFF3);
|
||||
msleep(1);
|
||||
if ((sprom->revision != 4) || !(sprom->boardflags_hi & 0x0002)) {
|
||||
if ((binfo->vendor != PCI_VENDOR_ID_BROADCOM) ||
|
||||
(binfo->type != 0x46D) ||
|
||||
(binfo->rev < 0x41)) {
|
||||
b43_radio_mask(dev, B2055_C1_RX_BB_REG, 0x7F);
|
||||
b43_radio_mask(dev, B2055_C1_RX_BB_REG, 0x7F);
|
||||
msleep(1);
|
||||
}
|
||||
}
|
||||
b43_radio_maskset(dev, B2055_RRCCAL_NOPTSEL, 0x3F, 0x2C);
|
||||
msleep(1);
|
||||
b43_radio_write16(dev, B2055_CAL_MISC, 0x3C);
|
||||
msleep(1);
|
||||
b43_radio_mask(dev, B2055_CAL_MISC, 0xFFBE);
|
||||
msleep(1);
|
||||
b43_radio_set(dev, B2055_CAL_LPOCTL, 0x80);
|
||||
msleep(1);
|
||||
b43_radio_set(dev, B2055_CAL_MISC, 0x1);
|
||||
msleep(1);
|
||||
b43_radio_set(dev, B2055_CAL_MISC, 0x40);
|
||||
msleep(1);
|
||||
for (i = 0; i < 100; i++) {
|
||||
val = b43_radio_read16(dev, B2055_CAL_COUT2);
|
||||
if (val & 0x80)
|
||||
break;
|
||||
udelay(10);
|
||||
}
|
||||
msleep(1);
|
||||
b43_radio_mask(dev, B2055_CAL_LPOCTL, 0xFF7F);
|
||||
msleep(1);
|
||||
b43_radio_selectchannel(dev, dev->phy.channel, 0);
|
||||
b43_radio_write16(dev, B2055_C1_RX_BB_LPF, 0x9);
|
||||
b43_radio_write16(dev, B2055_C2_RX_BB_LPF, 0x9);
|
||||
b43_radio_write16(dev, B2055_C1_RX_BB_MIDACHP, 0x83);
|
||||
b43_radio_write16(dev, B2055_C2_RX_BB_MIDACHP, 0x83);
|
||||
}
|
||||
|
||||
/* Initialize a Broadcom 2055 N-radio */
|
||||
static void b43_radio_init2055(struct b43_wldev *dev)
|
||||
{
|
||||
b43_radio_init2055_pre(dev);
|
||||
if (b43_status(dev) < B43_STAT_INITIALIZED)
|
||||
b2055_upload_inittab(dev, 0, 1);
|
||||
else
|
||||
b2055_upload_inittab(dev, 0/*FIXME on 5ghz band*/, 0);
|
||||
b43_radio_init2055_post(dev);
|
||||
}
|
||||
|
||||
void b43_nphy_radio_turn_on(struct b43_wldev *dev)
|
||||
{
|
||||
b43_radio_init2055(dev);
|
||||
}
|
||||
|
||||
void b43_nphy_radio_turn_off(struct b43_wldev *dev)
|
||||
{
|
||||
b43_phy_mask(dev, B43_NPHY_RFCTL_CMD,
|
||||
~B43_NPHY_RFCTL_CMD_EN);
|
||||
}
|
||||
|
||||
#define ntab_upload(dev, offset, data) do { \
|
||||
unsigned int i; \
|
||||
for (i = 0; i < (offset##_SIZE); i++) \
|
||||
b43_ntab_write(dev, (offset) + i, (data)[i]); \
|
||||
} while (0)
|
||||
|
||||
/* Upload the N-PHY tables. */
|
||||
static void b43_nphy_tables_init(struct b43_wldev *dev)
|
||||
{
|
||||
/* Static tables */
|
||||
ntab_upload(dev, B43_NTAB_FRAMESTRUCT, b43_ntab_framestruct);
|
||||
ntab_upload(dev, B43_NTAB_FRAMELT, b43_ntab_framelookup);
|
||||
ntab_upload(dev, B43_NTAB_TMAP, b43_ntab_tmap);
|
||||
ntab_upload(dev, B43_NTAB_TDTRN, b43_ntab_tdtrn);
|
||||
ntab_upload(dev, B43_NTAB_INTLEVEL, b43_ntab_intlevel);
|
||||
ntab_upload(dev, B43_NTAB_PILOT, b43_ntab_pilot);
|
||||
ntab_upload(dev, B43_NTAB_PILOTLT, b43_ntab_pilotlt);
|
||||
ntab_upload(dev, B43_NTAB_TDI20A0, b43_ntab_tdi20a0);
|
||||
ntab_upload(dev, B43_NTAB_TDI20A1, b43_ntab_tdi20a1);
|
||||
ntab_upload(dev, B43_NTAB_TDI40A0, b43_ntab_tdi40a0);
|
||||
ntab_upload(dev, B43_NTAB_TDI40A1, b43_ntab_tdi40a1);
|
||||
ntab_upload(dev, B43_NTAB_BDI, b43_ntab_bdi);
|
||||
ntab_upload(dev, B43_NTAB_CHANEST, b43_ntab_channelest);
|
||||
ntab_upload(dev, B43_NTAB_MCS, b43_ntab_mcs);
|
||||
|
||||
/* Volatile tables */
|
||||
ntab_upload(dev, B43_NTAB_NOISEVAR10, b43_ntab_noisevar10);
|
||||
ntab_upload(dev, B43_NTAB_NOISEVAR11, b43_ntab_noisevar11);
|
||||
ntab_upload(dev, B43_NTAB_C0_ESTPLT, b43_ntab_estimatepowerlt0);
|
||||
ntab_upload(dev, B43_NTAB_C1_ESTPLT, b43_ntab_estimatepowerlt1);
|
||||
ntab_upload(dev, B43_NTAB_C0_ADJPLT, b43_ntab_adjustpower0);
|
||||
ntab_upload(dev, B43_NTAB_C1_ADJPLT, b43_ntab_adjustpower1);
|
||||
ntab_upload(dev, B43_NTAB_C0_GAINCTL, b43_ntab_gainctl0);
|
||||
ntab_upload(dev, B43_NTAB_C1_GAINCTL, b43_ntab_gainctl1);
|
||||
ntab_upload(dev, B43_NTAB_C0_IQLT, b43_ntab_iqlt0);
|
||||
ntab_upload(dev, B43_NTAB_C1_IQLT, b43_ntab_iqlt1);
|
||||
ntab_upload(dev, B43_NTAB_C0_LOFEEDTH, b43_ntab_loftlt0);
|
||||
ntab_upload(dev, B43_NTAB_C1_LOFEEDTH, b43_ntab_loftlt1);
|
||||
}
|
||||
|
||||
static void b43_nphy_workarounds(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_phy *phy = &dev->phy;
|
||||
unsigned int i;
|
||||
|
||||
b43_phy_set(dev, B43_NPHY_IQFLIP,
|
||||
B43_NPHY_IQFLIP_ADC1 | B43_NPHY_IQFLIP_ADC2);
|
||||
//FIXME the following condition is different in the specs.
|
||||
if (1 /* FIXME band is 2.4GHz */) {
|
||||
b43_phy_set(dev, B43_NPHY_CLASSCTL,
|
||||
B43_NPHY_CLASSCTL_CCKEN);
|
||||
} else {
|
||||
b43_phy_mask(dev, B43_NPHY_CLASSCTL,
|
||||
~B43_NPHY_CLASSCTL_CCKEN);
|
||||
}
|
||||
b43_radio_set(dev, B2055_C1_TX_RF_SPARE, 0x8);
|
||||
b43_phy_write(dev, B43_NPHY_TXFRAMEDELAY, 8);
|
||||
|
||||
/* Fixup some tables */
|
||||
b43_ntab_write(dev, B43_NTAB16(8, 0x00), 0xA);
|
||||
b43_ntab_write(dev, B43_NTAB16(8, 0x10), 0xA);
|
||||
b43_ntab_write(dev, B43_NTAB16(8, 0x02), 0xCDAA);
|
||||
b43_ntab_write(dev, B43_NTAB16(8, 0x12), 0xCDAA);
|
||||
b43_ntab_write(dev, B43_NTAB16(8, 0x08), 0);
|
||||
b43_ntab_write(dev, B43_NTAB16(8, 0x18), 0);
|
||||
b43_ntab_write(dev, B43_NTAB16(8, 0x07), 0x7AAB);
|
||||
b43_ntab_write(dev, B43_NTAB16(8, 0x17), 0x7AAB);
|
||||
b43_ntab_write(dev, B43_NTAB16(8, 0x06), 0x800);
|
||||
b43_ntab_write(dev, B43_NTAB16(8, 0x16), 0x800);
|
||||
|
||||
b43_phy_write(dev, B43_NPHY_RFCTL_LUT_TRSW_LO1, 0x2D8);
|
||||
b43_phy_write(dev, B43_NPHY_RFCTL_LUT_TRSW_UP1, 0x301);
|
||||
b43_phy_write(dev, B43_NPHY_RFCTL_LUT_TRSW_LO2, 0x2D8);
|
||||
b43_phy_write(dev, B43_NPHY_RFCTL_LUT_TRSW_UP2, 0x301);
|
||||
|
||||
//TODO set RF sequence
|
||||
|
||||
/* Set narrowband clip threshold */
|
||||
b43_phy_write(dev, B43_NPHY_C1_NBCLIPTHRES, 66);
|
||||
b43_phy_write(dev, B43_NPHY_C2_NBCLIPTHRES, 66);
|
||||
|
||||
/* Set wideband clip 2 threshold */
|
||||
b43_phy_maskset(dev, B43_NPHY_C1_CLIPWBTHRES,
|
||||
~B43_NPHY_C1_CLIPWBTHRES_CLIP2,
|
||||
21 << B43_NPHY_C1_CLIPWBTHRES_CLIP2_SHIFT);
|
||||
b43_phy_maskset(dev, B43_NPHY_C2_CLIPWBTHRES,
|
||||
~B43_NPHY_C2_CLIPWBTHRES_CLIP2,
|
||||
21 << B43_NPHY_C2_CLIPWBTHRES_CLIP2_SHIFT);
|
||||
|
||||
/* Set Clip 2 detect */
|
||||
b43_phy_set(dev, B43_NPHY_C1_CGAINI,
|
||||
B43_NPHY_C1_CGAINI_CL2DETECT);
|
||||
b43_phy_set(dev, B43_NPHY_C2_CGAINI,
|
||||
B43_NPHY_C2_CGAINI_CL2DETECT);
|
||||
|
||||
if (0 /*FIXME*/) {
|
||||
/* Set dwell lengths */
|
||||
b43_phy_write(dev, B43_NPHY_CLIP1_NBDWELL_LEN, 43);
|
||||
b43_phy_write(dev, B43_NPHY_CLIP2_NBDWELL_LEN, 43);
|
||||
b43_phy_write(dev, B43_NPHY_W1CLIP1_DWELL_LEN, 9);
|
||||
b43_phy_write(dev, B43_NPHY_W1CLIP2_DWELL_LEN, 9);
|
||||
|
||||
/* Set gain backoff */
|
||||
b43_phy_maskset(dev, B43_NPHY_C1_CGAINI,
|
||||
~B43_NPHY_C1_CGAINI_GAINBKOFF,
|
||||
1 << B43_NPHY_C1_CGAINI_GAINBKOFF_SHIFT);
|
||||
b43_phy_maskset(dev, B43_NPHY_C2_CGAINI,
|
||||
~B43_NPHY_C2_CGAINI_GAINBKOFF,
|
||||
1 << B43_NPHY_C2_CGAINI_GAINBKOFF_SHIFT);
|
||||
|
||||
/* Set HPVGA2 index */
|
||||
b43_phy_maskset(dev, B43_NPHY_C1_INITGAIN,
|
||||
~B43_NPHY_C1_INITGAIN_HPVGA2,
|
||||
6 << B43_NPHY_C1_INITGAIN_HPVGA2_SHIFT);
|
||||
b43_phy_maskset(dev, B43_NPHY_C2_INITGAIN,
|
||||
~B43_NPHY_C2_INITGAIN_HPVGA2,
|
||||
6 << B43_NPHY_C2_INITGAIN_HPVGA2_SHIFT);
|
||||
|
||||
//FIXME verify that the specs really mean to use autoinc here.
|
||||
for (i = 0; i < 3; i++)
|
||||
b43_ntab_write(dev, B43_NTAB16(7, 0x106) + i, 0x673);
|
||||
}
|
||||
|
||||
/* Set minimum gain value */
|
||||
b43_phy_maskset(dev, B43_NPHY_C1_MINMAX_GAIN,
|
||||
~B43_NPHY_C1_MINGAIN,
|
||||
23 << B43_NPHY_C1_MINGAIN_SHIFT);
|
||||
b43_phy_maskset(dev, B43_NPHY_C2_MINMAX_GAIN,
|
||||
~B43_NPHY_C2_MINGAIN,
|
||||
23 << B43_NPHY_C2_MINGAIN_SHIFT);
|
||||
|
||||
if (phy->rev < 2) {
|
||||
b43_phy_mask(dev, B43_NPHY_SCRAM_SIGCTL,
|
||||
~B43_NPHY_SCRAM_SIGCTL_SCM);
|
||||
}
|
||||
|
||||
/* Set phase track alpha and beta */
|
||||
b43_phy_write(dev, B43_NPHY_PHASETR_A0, 0x125);
|
||||
b43_phy_write(dev, B43_NPHY_PHASETR_A1, 0x1B3);
|
||||
b43_phy_write(dev, B43_NPHY_PHASETR_A2, 0x105);
|
||||
b43_phy_write(dev, B43_NPHY_PHASETR_B0, 0x16E);
|
||||
b43_phy_write(dev, B43_NPHY_PHASETR_B1, 0xCD);
|
||||
b43_phy_write(dev, B43_NPHY_PHASETR_B2, 0x20);
|
||||
}
|
||||
|
||||
static void b43_nphy_reset_cca(struct b43_wldev *dev)
|
||||
{
|
||||
u16 bbcfg;
|
||||
|
||||
ssb_write32(dev->dev, SSB_TMSLOW,
|
||||
ssb_read32(dev->dev, SSB_TMSLOW) | SSB_TMSLOW_FGC);
|
||||
bbcfg = b43_phy_read(dev, B43_NPHY_BBCFG);
|
||||
b43_phy_set(dev, B43_NPHY_BBCFG, B43_NPHY_BBCFG_RSTCCA);
|
||||
b43_phy_write(dev, B43_NPHY_BBCFG,
|
||||
bbcfg & ~B43_NPHY_BBCFG_RSTCCA);
|
||||
ssb_write32(dev->dev, SSB_TMSLOW,
|
||||
ssb_read32(dev->dev, SSB_TMSLOW) & ~SSB_TMSLOW_FGC);
|
||||
}
|
||||
|
||||
enum b43_nphy_rf_sequence {
|
||||
B43_RFSEQ_RX2TX,
|
||||
B43_RFSEQ_TX2RX,
|
||||
B43_RFSEQ_RESET2RX,
|
||||
B43_RFSEQ_UPDATE_GAINH,
|
||||
B43_RFSEQ_UPDATE_GAINL,
|
||||
B43_RFSEQ_UPDATE_GAINU,
|
||||
};
|
||||
|
||||
static void b43_nphy_force_rf_sequence(struct b43_wldev *dev,
|
||||
enum b43_nphy_rf_sequence seq)
|
||||
{
|
||||
static const u16 trigger[] = {
|
||||
[B43_RFSEQ_RX2TX] = B43_NPHY_RFSEQTR_RX2TX,
|
||||
[B43_RFSEQ_TX2RX] = B43_NPHY_RFSEQTR_TX2RX,
|
||||
[B43_RFSEQ_RESET2RX] = B43_NPHY_RFSEQTR_RST2RX,
|
||||
[B43_RFSEQ_UPDATE_GAINH] = B43_NPHY_RFSEQTR_UPGH,
|
||||
[B43_RFSEQ_UPDATE_GAINL] = B43_NPHY_RFSEQTR_UPGL,
|
||||
[B43_RFSEQ_UPDATE_GAINU] = B43_NPHY_RFSEQTR_UPGU,
|
||||
};
|
||||
int i;
|
||||
|
||||
B43_WARN_ON(seq >= ARRAY_SIZE(trigger));
|
||||
|
||||
b43_phy_set(dev, B43_NPHY_RFSEQMODE,
|
||||
B43_NPHY_RFSEQMODE_CAOVER | B43_NPHY_RFSEQMODE_TROVER);
|
||||
b43_phy_set(dev, B43_NPHY_RFSEQTR, trigger[seq]);
|
||||
for (i = 0; i < 200; i++) {
|
||||
if (!(b43_phy_read(dev, B43_NPHY_RFSEQST) & trigger[seq]))
|
||||
goto ok;
|
||||
msleep(1);
|
||||
}
|
||||
b43err(dev->wl, "RF sequence status timeout\n");
|
||||
ok:
|
||||
b43_phy_mask(dev, B43_NPHY_RFSEQMODE,
|
||||
~(B43_NPHY_RFSEQMODE_CAOVER | B43_NPHY_RFSEQMODE_TROVER));
|
||||
}
|
||||
|
||||
static void b43_nphy_bphy_init(struct b43_wldev *dev)
|
||||
{
|
||||
unsigned int i;
|
||||
u16 val;
|
||||
|
||||
val = 0x1E1F;
|
||||
for (i = 0; i < 14; i++) {
|
||||
b43_phy_write(dev, B43_PHY_N_BMODE(0x88 + i), val);
|
||||
val -= 0x202;
|
||||
}
|
||||
val = 0x3E3F;
|
||||
for (i = 0; i < 16; i++) {
|
||||
b43_phy_write(dev, B43_PHY_N_BMODE(0x97 + i), val);
|
||||
val -= 0x202;
|
||||
}
|
||||
b43_phy_write(dev, B43_PHY_N_BMODE(0x38), 0x668);
|
||||
}
|
||||
|
||||
/* RSSI Calibration */
|
||||
static void b43_nphy_rssi_cal(struct b43_wldev *dev, u8 type)
|
||||
{
|
||||
//TODO
|
||||
}
|
||||
|
||||
int b43_phy_initn(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_phy *phy = &dev->phy;
|
||||
u16 tmp;
|
||||
|
||||
//TODO: Spectral management
|
||||
b43_nphy_tables_init(dev);
|
||||
|
||||
/* Clear all overrides */
|
||||
b43_phy_write(dev, B43_NPHY_RFCTL_OVER, 0);
|
||||
b43_phy_write(dev, B43_NPHY_RFCTL_INTC1, 0);
|
||||
b43_phy_write(dev, B43_NPHY_RFCTL_INTC2, 0);
|
||||
b43_phy_write(dev, B43_NPHY_RFCTL_INTC3, 0);
|
||||
b43_phy_write(dev, B43_NPHY_RFCTL_INTC4, 0);
|
||||
b43_phy_mask(dev, B43_NPHY_RFSEQMODE,
|
||||
~(B43_NPHY_RFSEQMODE_CAOVER |
|
||||
B43_NPHY_RFSEQMODE_TROVER));
|
||||
b43_phy_write(dev, B43_NPHY_AFECTL_OVER, 0);
|
||||
|
||||
tmp = (phy->rev < 2) ? 64 : 59;
|
||||
b43_phy_maskset(dev, B43_NPHY_BPHY_CTL3,
|
||||
~B43_NPHY_BPHY_CTL3_SCALE,
|
||||
tmp << B43_NPHY_BPHY_CTL3_SCALE_SHIFT);
|
||||
|
||||
b43_phy_write(dev, B43_NPHY_AFESEQ_TX2RX_PUD_20M, 0x20);
|
||||
b43_phy_write(dev, B43_NPHY_AFESEQ_TX2RX_PUD_40M, 0x20);
|
||||
|
||||
b43_phy_write(dev, B43_NPHY_TXREALFD, 184);
|
||||
b43_phy_write(dev, B43_NPHY_MIMO_CRSTXEXT, 200);
|
||||
b43_phy_write(dev, B43_NPHY_PLOAD_CSENSE_EXTLEN, 80);
|
||||
b43_phy_write(dev, B43_NPHY_C2_BCLIPBKOFF, 511);
|
||||
|
||||
//TODO MIMO-Config
|
||||
//TODO Update TX/RX chain
|
||||
|
||||
if (phy->rev < 2) {
|
||||
b43_phy_write(dev, B43_NPHY_DUP40_GFBL, 0xAA8);
|
||||
b43_phy_write(dev, B43_NPHY_DUP40_BL, 0x9A4);
|
||||
}
|
||||
b43_nphy_workarounds(dev);
|
||||
b43_nphy_reset_cca(dev);
|
||||
|
||||
ssb_write32(dev->dev, SSB_TMSLOW,
|
||||
ssb_read32(dev->dev, SSB_TMSLOW) | B43_TMSLOW_MACPHYCLKEN);
|
||||
b43_nphy_force_rf_sequence(dev, B43_RFSEQ_RX2TX);
|
||||
b43_nphy_force_rf_sequence(dev, B43_RFSEQ_RESET2RX);
|
||||
|
||||
b43_phy_read(dev, B43_NPHY_CLASSCTL); /* dummy read */
|
||||
//TODO read core1/2 clip1 thres regs
|
||||
|
||||
if (1 /* FIXME Band is 2.4GHz */)
|
||||
b43_nphy_bphy_init(dev);
|
||||
//TODO disable TX power control
|
||||
//TODO Fix the TX power settings
|
||||
//TODO Init periodic calibration with reason 3
|
||||
b43_nphy_rssi_cal(dev, 2);
|
||||
b43_nphy_rssi_cal(dev, 0);
|
||||
b43_nphy_rssi_cal(dev, 1);
|
||||
//TODO get TX gain
|
||||
//TODO init superswitch
|
||||
//TODO calibrate LO
|
||||
//TODO idle TSSI TX pctl
|
||||
//TODO TX power control power setup
|
||||
//TODO table writes
|
||||
//TODO TX power control coefficients
|
||||
//TODO enable TX power control
|
||||
//TODO control antenna selection
|
||||
//TODO init radar detection
|
||||
//TODO reset channel if changed
|
||||
|
||||
b43err(dev->wl, "IEEE 802.11n devices are not supported, yet.\n");
|
||||
return 0;
|
||||
}
|
||||
932
package/b43/src/nphy.h
Normal file
932
package/b43/src/nphy.h
Normal file
@@ -0,0 +1,932 @@
|
||||
#ifndef B43_NPHY_H_
|
||||
#define B43_NPHY_H_
|
||||
|
||||
#include "phy.h"
|
||||
|
||||
|
||||
/* N-PHY registers. */
|
||||
|
||||
#define B43_NPHY_BBCFG B43_PHY_N(0x001) /* BB config */
|
||||
#define B43_NPHY_BBCFG_RSTCCA 0x4000 /* Reset CCA */
|
||||
#define B43_NPHY_BBCFG_RSTRX 0x8000 /* Reset RX */
|
||||
#define B43_NPHY_CHANNEL B43_PHY_N(0x005) /* Channel */
|
||||
#define B43_NPHY_TXERR B43_PHY_N(0x007) /* TX error */
|
||||
#define B43_NPHY_BANDCTL B43_PHY_N(0x009) /* Band control */
|
||||
#define B43_NPHY_BANDCTL_5GHZ 0x0001 /* Use the 5GHz band */
|
||||
#define B43_NPHY_4WI_ADDR B43_PHY_N(0x00B) /* Four-wire bus address */
|
||||
#define B43_NPHY_4WI_DATAHI B43_PHY_N(0x00C) /* Four-wire bus data high */
|
||||
#define B43_NPHY_4WI_DATALO B43_PHY_N(0x00D) /* Four-wire bus data low */
|
||||
#define B43_NPHY_BIST_STAT0 B43_PHY_N(0x00E) /* Built-in self test status 0 */
|
||||
#define B43_NPHY_BIST_STAT1 B43_PHY_N(0x00F) /* Built-in self test status 1 */
|
||||
|
||||
#define B43_NPHY_C1_DESPWR B43_PHY_N(0x018) /* Core 1 desired power */
|
||||
#define B43_NPHY_C1_CCK_DESPWR B43_PHY_N(0x019) /* Core 1 CCK desired power */
|
||||
#define B43_NPHY_C1_BCLIPBKOFF B43_PHY_N(0x01A) /* Core 1 barely clip backoff */
|
||||
#define B43_NPHY_C1_CCK_BCLIPBKOFF B43_PHY_N(0x01B) /* Core 1 CCK barely clip backoff */
|
||||
#define B43_NPHY_C1_CGAINI B43_PHY_N(0x01C) /* Core 1 compute gain info */
|
||||
#define B43_NPHY_C1_CGAINI_GAINBKOFF 0x001F /* Gain backoff */
|
||||
#define B43_NPHY_C1_CGAINI_GAINBKOFF_SHIFT 0
|
||||
#define B43_NPHY_C1_CGAINI_CLIPGBKOFF 0x03E0 /* Clip gain backoff */
|
||||
#define B43_NPHY_C1_CGAINI_CLIPGBKOFF_SHIFT 5
|
||||
#define B43_NPHY_C1_CGAINI_GAINSTEP 0x1C00 /* Gain step */
|
||||
#define B43_NPHY_C1_CGAINI_GAINSTEP_SHIFT 10
|
||||
#define B43_NPHY_C1_CGAINI_CL2DETECT 0x2000 /* Clip 2 detect mask */
|
||||
#define B43_NPHY_C1_CCK_CGAINI B43_PHY_N(0x01D) /* Core 1 CCK compute gain info */
|
||||
#define B43_NPHY_C1_CCK_CGAINI_GAINBKOFF 0x001F /* Gain backoff */
|
||||
#define B43_NPHY_C1_CCK_CGAINI_CLIPGBKOFF 0x01E0 /* CCK barely clip gain backoff */
|
||||
#define B43_NPHY_C1_MINMAX_GAIN B43_PHY_N(0x01E) /* Core 1 min/max gain */
|
||||
#define B43_NPHY_C1_MINGAIN 0x00FF /* Minimum gain */
|
||||
#define B43_NPHY_C1_MINGAIN_SHIFT 0
|
||||
#define B43_NPHY_C1_MAXGAIN 0xFF00 /* Maximum gain */
|
||||
#define B43_NPHY_C1_MAXGAIN_SHIFT 8
|
||||
#define B43_NPHY_C1_CCK_MINMAX_GAIN B43_PHY_N(0x01F) /* Core 1 CCK min/max gain */
|
||||
#define B43_NPHY_C1_CCK_MINGAIN 0x00FF /* Minimum gain */
|
||||
#define B43_NPHY_C1_CCK_MINGAIN_SHIFT 0
|
||||
#define B43_NPHY_C1_CCK_MAXGAIN 0xFF00 /* Maximum gain */
|
||||
#define B43_NPHY_C1_CCK_MAXGAIN_SHIFT 8
|
||||
#define B43_NPHY_C1_INITGAIN B43_PHY_N(0x020) /* Core 1 initial gain code */
|
||||
#define B43_NPHY_C1_INITGAIN_EXTLNA 0x0001 /* External LNA index */
|
||||
#define B43_NPHY_C1_INITGAIN_LNA 0x0006 /* LNA index */
|
||||
#define B43_NPHY_C1_INITGAIN_LNAIDX_SHIFT 1
|
||||
#define B43_NPHY_C1_INITGAIN_HPVGA1 0x0078 /* HPVGA1 index */
|
||||
#define B43_NPHY_C1_INITGAIN_HPVGA1_SHIFT 3
|
||||
#define B43_NPHY_C1_INITGAIN_HPVGA2 0x0F80 /* HPVGA2 index */
|
||||
#define B43_NPHY_C1_INITGAIN_HPVGA2_SHIFT 7
|
||||
#define B43_NPHY_C1_INITGAIN_TRRX 0x1000 /* TR RX index */
|
||||
#define B43_NPHY_C1_INITGAIN_TRTX 0x2000 /* TR TX index */
|
||||
#define B43_NPHY_C1_CLIP1_HIGAIN B43_PHY_N(0x021) /* Core 1 clip1 high gain code */
|
||||
#define B43_NPHY_C1_CLIP1_MEDGAIN B43_PHY_N(0x022) /* Core 1 clip1 medium gain code */
|
||||
#define B43_NPHY_C1_CLIP1_LOGAIN B43_PHY_N(0x023) /* Core 1 clip1 low gain code */
|
||||
#define B43_NPHY_C1_CLIP2_GAIN B43_PHY_N(0x024) /* Core 1 clip2 gain code */
|
||||
#define B43_NPHY_C1_FILTERGAIN B43_PHY_N(0x025) /* Core 1 filter gain */
|
||||
#define B43_NPHY_C1_LPF_QHPF_BW B43_PHY_N(0x026) /* Core 1 LPF Q HP F bandwidth */
|
||||
#define B43_NPHY_C1_CLIPWBTHRES B43_PHY_N(0x027) /* Core 1 clip wideband threshold */
|
||||
#define B43_NPHY_C1_CLIPWBTHRES_CLIP2 0x003F /* Clip 2 */
|
||||
#define B43_NPHY_C1_CLIPWBTHRES_CLIP2_SHIFT 0
|
||||
#define B43_NPHY_C1_CLIPWBTHRES_CLIP1 0x0FC0 /* Clip 1 */
|
||||
#define B43_NPHY_C1_CLIPWBTHRES_CLIP1_SHIFT 6
|
||||
#define B43_NPHY_C1_W1THRES B43_PHY_N(0x028) /* Core 1 W1 threshold */
|
||||
#define B43_NPHY_C1_EDTHRES B43_PHY_N(0x029) /* Core 1 ED threshold */
|
||||
#define B43_NPHY_C1_SMSIGTHRES B43_PHY_N(0x02A) /* Core 1 small sig threshold */
|
||||
#define B43_NPHY_C1_NBCLIPTHRES B43_PHY_N(0x02B) /* Core 1 NB clip threshold */
|
||||
#define B43_NPHY_C1_CLIP1THRES B43_PHY_N(0x02C) /* Core 1 clip1 threshold */
|
||||
#define B43_NPHY_C1_CLIP2THRES B43_PHY_N(0x02D) /* Core 1 clip2 threshold */
|
||||
|
||||
#define B43_NPHY_C2_DESPWR B43_PHY_N(0x02E) /* Core 2 desired power */
|
||||
#define B43_NPHY_C2_CCK_DESPWR B43_PHY_N(0x02F) /* Core 2 CCK desired power */
|
||||
#define B43_NPHY_C2_BCLIPBKOFF B43_PHY_N(0x030) /* Core 2 barely clip backoff */
|
||||
#define B43_NPHY_C2_CCK_BCLIPBKOFF B43_PHY_N(0x031) /* Core 2 CCK barely clip backoff */
|
||||
#define B43_NPHY_C2_CGAINI B43_PHY_N(0x032) /* Core 2 compute gain info */
|
||||
#define B43_NPHY_C2_CGAINI_GAINBKOFF 0x001F /* Gain backoff */
|
||||
#define B43_NPHY_C2_CGAINI_GAINBKOFF_SHIFT 0
|
||||
#define B43_NPHY_C2_CGAINI_CLIPGBKOFF 0x03E0 /* Clip gain backoff */
|
||||
#define B43_NPHY_C2_CGAINI_CLIPGBKOFF_SHIFT 5
|
||||
#define B43_NPHY_C2_CGAINI_GAINSTEP 0x1C00 /* Gain step */
|
||||
#define B43_NPHY_C2_CGAINI_GAINSTEP_SHIFT 10
|
||||
#define B43_NPHY_C2_CGAINI_CL2DETECT 0x2000 /* Clip 2 detect mask */
|
||||
#define B43_NPHY_C2_CCK_CGAINI B43_PHY_N(0x033) /* Core 2 CCK compute gain info */
|
||||
#define B43_NPHY_C2_CCK_CGAINI_GAINBKOFF 0x001F /* Gain backoff */
|
||||
#define B43_NPHY_C2_CCK_CGAINI_CLIPGBKOFF 0x01E0 /* CCK barely clip gain backoff */
|
||||
#define B43_NPHY_C2_MINMAX_GAIN B43_PHY_N(0x034) /* Core 2 min/max gain */
|
||||
#define B43_NPHY_C2_MINGAIN 0x00FF /* Minimum gain */
|
||||
#define B43_NPHY_C2_MINGAIN_SHIFT 0
|
||||
#define B43_NPHY_C2_MAXGAIN 0xFF00 /* Maximum gain */
|
||||
#define B43_NPHY_C2_MAXGAIN_SHIFT 8
|
||||
#define B43_NPHY_C2_CCK_MINMAX_GAIN B43_PHY_N(0x035) /* Core 2 CCK min/max gain */
|
||||
#define B43_NPHY_C2_CCK_MINGAIN 0x00FF /* Minimum gain */
|
||||
#define B43_NPHY_C2_CCK_MINGAIN_SHIFT 0
|
||||
#define B43_NPHY_C2_CCK_MAXGAIN 0xFF00 /* Maximum gain */
|
||||
#define B43_NPHY_C2_CCK_MAXGAIN_SHIFT 8
|
||||
#define B43_NPHY_C2_INITGAIN B43_PHY_N(0x036) /* Core 2 initial gain code */
|
||||
#define B43_NPHY_C2_INITGAIN_EXTLNA 0x0001 /* External LNA index */
|
||||
#define B43_NPHY_C2_INITGAIN_LNA 0x0006 /* LNA index */
|
||||
#define B43_NPHY_C2_INITGAIN_LNAIDX_SHIFT 1
|
||||
#define B43_NPHY_C2_INITGAIN_HPVGA1 0x0078 /* HPVGA1 index */
|
||||
#define B43_NPHY_C2_INITGAIN_HPVGA1_SHIFT 3
|
||||
#define B43_NPHY_C2_INITGAIN_HPVGA2 0x0F80 /* HPVGA2 index */
|
||||
#define B43_NPHY_C2_INITGAIN_HPVGA2_SHIFT 7
|
||||
#define B43_NPHY_C2_INITGAIN_TRRX 0x1000 /* TR RX index */
|
||||
#define B43_NPHY_C2_INITGAIN_TRTX 0x2000 /* TR TX index */
|
||||
#define B43_NPHY_C2_CLIP1_HIGAIN B43_PHY_N(0x037) /* Core 2 clip1 high gain code */
|
||||
#define B43_NPHY_C2_CLIP1_MEDGAIN B43_PHY_N(0x038) /* Core 2 clip1 medium gain code */
|
||||
#define B43_NPHY_C2_CLIP1_LOGAIN B43_PHY_N(0x039) /* Core 2 clip1 low gain code */
|
||||
#define B43_NPHY_C2_CLIP2_GAIN B43_PHY_N(0x03A) /* Core 2 clip2 gain code */
|
||||
#define B43_NPHY_C2_FILTERGAIN B43_PHY_N(0x03B) /* Core 2 filter gain */
|
||||
#define B43_NPHY_C2_LPF_QHPF_BW B43_PHY_N(0x03C) /* Core 2 LPF Q HP F bandwidth */
|
||||
#define B43_NPHY_C2_CLIPWBTHRES B43_PHY_N(0x03D) /* Core 2 clip wideband threshold */
|
||||
#define B43_NPHY_C2_CLIPWBTHRES_CLIP2 0x003F /* Clip 2 */
|
||||
#define B43_NPHY_C2_CLIPWBTHRES_CLIP2_SHIFT 0
|
||||
#define B43_NPHY_C2_CLIPWBTHRES_CLIP1 0x0FC0 /* Clip 1 */
|
||||
#define B43_NPHY_C2_CLIPWBTHRES_CLIP1_SHIFT 6
|
||||
#define B43_NPHY_C2_W1THRES B43_PHY_N(0x03E) /* Core 2 W1 threshold */
|
||||
#define B43_NPHY_C2_EDTHRES B43_PHY_N(0x03F) /* Core 2 ED threshold */
|
||||
#define B43_NPHY_C2_SMSIGTHRES B43_PHY_N(0x040) /* Core 2 small sig threshold */
|
||||
#define B43_NPHY_C2_NBCLIPTHRES B43_PHY_N(0x041) /* Core 2 NB clip threshold */
|
||||
#define B43_NPHY_C2_CLIP1THRES B43_PHY_N(0x042) /* Core 2 clip1 threshold */
|
||||
#define B43_NPHY_C2_CLIP2THRES B43_PHY_N(0x043) /* Core 2 clip2 threshold */
|
||||
|
||||
#define B43_NPHY_CRS_THRES1 B43_PHY_N(0x044) /* CRS threshold 1 */
|
||||
#define B43_NPHY_CRS_THRES2 B43_PHY_N(0x045) /* CRS threshold 2 */
|
||||
#define B43_NPHY_CRS_THRES3 B43_PHY_N(0x046) /* CRS threshold 3 */
|
||||
#define B43_NPHY_CRSCTL B43_PHY_N(0x047) /* CRS control */
|
||||
#define B43_NPHY_DCFADDR B43_PHY_N(0x048) /* DC filter address */
|
||||
#define B43_NPHY_RXF20_NUM0 B43_PHY_N(0x049) /* RX filter 20 numerator 0 */
|
||||
#define B43_NPHY_RXF20_NUM1 B43_PHY_N(0x04A) /* RX filter 20 numerator 1 */
|
||||
#define B43_NPHY_RXF20_NUM2 B43_PHY_N(0x04B) /* RX filter 20 numerator 2 */
|
||||
#define B43_NPHY_RXF20_DENOM0 B43_PHY_N(0x04C) /* RX filter 20 denominator 0 */
|
||||
#define B43_NPHY_RXF20_DENOM1 B43_PHY_N(0x04D) /* RX filter 20 denominator 1 */
|
||||
#define B43_NPHY_RXF20_NUM10 B43_PHY_N(0x04E) /* RX filter 20 numerator 10 */
|
||||
#define B43_NPHY_RXF20_NUM11 B43_PHY_N(0x04F) /* RX filter 20 numerator 11 */
|
||||
#define B43_NPHY_RXF20_NUM12 B43_PHY_N(0x050) /* RX filter 20 numerator 12 */
|
||||
#define B43_NPHY_RXF20_DENOM10 B43_PHY_N(0x051) /* RX filter 20 denominator 10 */
|
||||
#define B43_NPHY_RXF20_DENOM11 B43_PHY_N(0x052) /* RX filter 20 denominator 11 */
|
||||
#define B43_NPHY_RXF40_NUM0 B43_PHY_N(0x053) /* RX filter 40 numerator 0 */
|
||||
#define B43_NPHY_RXF40_NUM1 B43_PHY_N(0x054) /* RX filter 40 numerator 1 */
|
||||
#define B43_NPHY_RXF40_NUM2 B43_PHY_N(0x055) /* RX filter 40 numerator 2 */
|
||||
#define B43_NPHY_RXF40_DENOM0 B43_PHY_N(0x056) /* RX filter 40 denominator 0 */
|
||||
#define B43_NPHY_RXF40_DENOM1 B43_PHY_N(0x057) /* RX filter 40 denominator 1 */
|
||||
#define B43_NPHY_RXF40_NUM10 B43_PHY_N(0x058) /* RX filter 40 numerator 10 */
|
||||
#define B43_NPHY_RXF40_NUM11 B43_PHY_N(0x059) /* RX filter 40 numerator 11 */
|
||||
#define B43_NPHY_RXF40_NUM12 B43_PHY_N(0x05A) /* RX filter 40 numerator 12 */
|
||||
#define B43_NPHY_RXF40_DENOM10 B43_PHY_N(0x05B) /* RX filter 40 denominator 10 */
|
||||
#define B43_NPHY_RXF40_DENOM11 B43_PHY_N(0x05C) /* RX filter 40 denominator 11 */
|
||||
#define B43_NPHY_PPROC_RSTLEN B43_PHY_N(0x060) /* Packet processing reset length */
|
||||
#define B43_NPHY_INITCARR_DLEN B43_PHY_N(0x061) /* Initial carrier detection length */
|
||||
#define B43_NPHY_CLIP1CARR_DLEN B43_PHY_N(0x062) /* Clip1 carrier detection length */
|
||||
#define B43_NPHY_CLIP2CARR_DLEN B43_PHY_N(0x063) /* Clip2 carrier detection length */
|
||||
#define B43_NPHY_INITGAIN_SLEN B43_PHY_N(0x064) /* Initial gain settle length */
|
||||
#define B43_NPHY_CLIP1GAIN_SLEN B43_PHY_N(0x065) /* Clip1 gain settle length */
|
||||
#define B43_NPHY_CLIP2GAIN_SLEN B43_PHY_N(0x066) /* Clip2 gain settle length */
|
||||
#define B43_NPHY_PACKGAIN_SLEN B43_PHY_N(0x067) /* Packet gain settle length */
|
||||
#define B43_NPHY_CARRSRC_TLEN B43_PHY_N(0x068) /* Carrier search timeout length */
|
||||
#define B43_NPHY_TISRC_TLEN B43_PHY_N(0x069) /* Timing search timeout length */
|
||||
#define B43_NPHY_ENDROP_TLEN B43_PHY_N(0x06A) /* Energy drop timeout length */
|
||||
#define B43_NPHY_CLIP1_NBDWELL_LEN B43_PHY_N(0x06B) /* Clip1 NB dwell length */
|
||||
#define B43_NPHY_CLIP2_NBDWELL_LEN B43_PHY_N(0x06C) /* Clip2 NB dwell length */
|
||||
#define B43_NPHY_W1CLIP1_DWELL_LEN B43_PHY_N(0x06D) /* W1 clip1 dwell length */
|
||||
#define B43_NPHY_W1CLIP2_DWELL_LEN B43_PHY_N(0x06E) /* W1 clip2 dwell length */
|
||||
#define B43_NPHY_W2CLIP1_DWELL_LEN B43_PHY_N(0x06F) /* W2 clip1 dwell length */
|
||||
#define B43_NPHY_PLOAD_CSENSE_EXTLEN B43_PHY_N(0x070) /* Payload carrier sense extension length */
|
||||
#define B43_NPHY_EDROP_CSENSE_EXTLEN B43_PHY_N(0x071) /* Energy drop carrier sense extension length */
|
||||
#define B43_NPHY_TABLE_ADDR B43_PHY_N(0x072) /* Table address */
|
||||
#define B43_NPHY_TABLE_DATALO B43_PHY_N(0x073) /* Table data low */
|
||||
#define B43_NPHY_TABLE_DATAHI B43_PHY_N(0x074) /* Table data high */
|
||||
#define B43_NPHY_WWISE_LENIDX B43_PHY_N(0x075) /* WWiSE length index */
|
||||
#define B43_NPHY_TGNSYNC_LENIDX B43_PHY_N(0x076) /* TGNsync length index */
|
||||
#define B43_NPHY_TXMACIF_HOLDOFF B43_PHY_N(0x077) /* TX MAC IF Hold off */
|
||||
#define B43_NPHY_RFCTL_CMD B43_PHY_N(0x078) /* RF control (command) */
|
||||
#define B43_NPHY_RFCTL_CMD_START 0x0001 /* Start sequence */
|
||||
#define B43_NPHY_RFCTL_CMD_RXTX 0x0002 /* RX/TX */
|
||||
#define B43_NPHY_RFCTL_CMD_CORESEL 0x0038 /* Core select */
|
||||
#define B43_NPHY_RFCTL_CMD_CORESEL_SHIFT 3
|
||||
#define B43_NPHY_RFCTL_CMD_PORFORCE 0x0040 /* POR force */
|
||||
#define B43_NPHY_RFCTL_CMD_OEPORFORCE 0x0080 /* OE POR force */
|
||||
#define B43_NPHY_RFCTL_CMD_RXEN 0x0100 /* RX enable */
|
||||
#define B43_NPHY_RFCTL_CMD_TXEN 0x0200 /* TX enable */
|
||||
#define B43_NPHY_RFCTL_CMD_CHIP0PU 0x0400 /* Chip0 PU */
|
||||
#define B43_NPHY_RFCTL_CMD_EN 0x0800 /* Radio enabled */
|
||||
#define B43_NPHY_RFCTL_CMD_SEQENCORE 0xF000 /* Seq en core */
|
||||
#define B43_NPHY_RFCTL_CMD_SEQENCORE_SHIFT 12
|
||||
#define B43_NPHY_RFCTL_RSSIO1 B43_PHY_N(0x07A) /* RF control (RSSI others 1) */
|
||||
#define B43_NPHY_RFCTL_RSSIO1_RXPD 0x0001 /* RX PD */
|
||||
#define B43_NPHY_RFCTL_RSSIO1_TXPD 0x0002 /* TX PD */
|
||||
#define B43_NPHY_RFCTL_RSSIO1_PAPD 0x0004 /* PA PD */
|
||||
#define B43_NPHY_RFCTL_RSSIO1_RSSICTL 0x0030 /* RSSI control */
|
||||
#define B43_NPHY_RFCTL_RSSIO1_LPFBW 0x00C0 /* LPF bandwidth */
|
||||
#define B43_NPHY_RFCTL_RSSIO1_HPFBWHI 0x0100 /* HPF bandwidth high */
|
||||
#define B43_NPHY_RFCTL_RSSIO1_HIQDISCO 0x0200 /* HIQ dis core */
|
||||
#define B43_NPHY_RFCTL_RXG1 B43_PHY_N(0x07B) /* RF control (RX gain 1) */
|
||||
#define B43_NPHY_RFCTL_TXG1 B43_PHY_N(0x07C) /* RF control (TX gain 1) */
|
||||
#define B43_NPHY_RFCTL_RSSIO2 B43_PHY_N(0x07D) /* RF control (RSSI others 2) */
|
||||
#define B43_NPHY_RFCTL_RSSIO2_RXPD 0x0001 /* RX PD */
|
||||
#define B43_NPHY_RFCTL_RSSIO2_TXPD 0x0002 /* TX PD */
|
||||
#define B43_NPHY_RFCTL_RSSIO2_PAPD 0x0004 /* PA PD */
|
||||
#define B43_NPHY_RFCTL_RSSIO2_RSSICTL 0x0030 /* RSSI control */
|
||||
#define B43_NPHY_RFCTL_RSSIO2_LPFBW 0x00C0 /* LPF bandwidth */
|
||||
#define B43_NPHY_RFCTL_RSSIO2_HPFBWHI 0x0100 /* HPF bandwidth high */
|
||||
#define B43_NPHY_RFCTL_RSSIO2_HIQDISCO 0x0200 /* HIQ dis core */
|
||||
#define B43_NPHY_RFCTL_RXG2 B43_PHY_N(0x07E) /* RF control (RX gain 2) */
|
||||
#define B43_NPHY_RFCTL_TXG2 B43_PHY_N(0x07F) /* RF control (TX gain 2) */
|
||||
#define B43_NPHY_RFCTL_RSSIO3 B43_PHY_N(0x080) /* RF control (RSSI others 3) */
|
||||
#define B43_NPHY_RFCTL_RSSIO3_RXPD 0x0001 /* RX PD */
|
||||
#define B43_NPHY_RFCTL_RSSIO3_TXPD 0x0002 /* TX PD */
|
||||
#define B43_NPHY_RFCTL_RSSIO3_PAPD 0x0004 /* PA PD */
|
||||
#define B43_NPHY_RFCTL_RSSIO3_RSSICTL 0x0030 /* RSSI control */
|
||||
#define B43_NPHY_RFCTL_RSSIO3_LPFBW 0x00C0 /* LPF bandwidth */
|
||||
#define B43_NPHY_RFCTL_RSSIO3_HPFBWHI 0x0100 /* HPF bandwidth high */
|
||||
#define B43_NPHY_RFCTL_RSSIO3_HIQDISCO 0x0200 /* HIQ dis core */
|
||||
#define B43_NPHY_RFCTL_RXG3 B43_PHY_N(0x081) /* RF control (RX gain 3) */
|
||||
#define B43_NPHY_RFCTL_TXG3 B43_PHY_N(0x082) /* RF control (TX gain 3) */
|
||||
#define B43_NPHY_RFCTL_RSSIO4 B43_PHY_N(0x083) /* RF control (RSSI others 4) */
|
||||
#define B43_NPHY_RFCTL_RSSIO4_RXPD 0x0001 /* RX PD */
|
||||
#define B43_NPHY_RFCTL_RSSIO4_TXPD 0x0002 /* TX PD */
|
||||
#define B43_NPHY_RFCTL_RSSIO4_PAPD 0x0004 /* PA PD */
|
||||
#define B43_NPHY_RFCTL_RSSIO4_RSSICTL 0x0030 /* RSSI control */
|
||||
#define B43_NPHY_RFCTL_RSSIO4_LPFBW 0x00C0 /* LPF bandwidth */
|
||||
#define B43_NPHY_RFCTL_RSSIO4_HPFBWHI 0x0100 /* HPF bandwidth high */
|
||||
#define B43_NPHY_RFCTL_RSSIO4_HIQDISCO 0x0200 /* HIQ dis core */
|
||||
#define B43_NPHY_RFCTL_RXG4 B43_PHY_N(0x084) /* RF control (RX gain 4) */
|
||||
#define B43_NPHY_RFCTL_TXG4 B43_PHY_N(0x085) /* RF control (TX gain 4) */
|
||||
#define B43_NPHY_C1_TXIQ_COMP_OFF B43_PHY_N(0x087) /* Core 1 TX I/Q comp offset */
|
||||
#define B43_NPHY_C2_TXIQ_COMP_OFF B43_PHY_N(0x088) /* Core 2 TX I/Q comp offset */
|
||||
#define B43_NPHY_C1_TXCTL B43_PHY_N(0x08B) /* Core 1 TX control */
|
||||
#define B43_NPHY_C2_TXCTL B43_PHY_N(0x08C) /* Core 2 TX control */
|
||||
#define B43_NPHY_SCRAM_SIGCTL B43_PHY_N(0x090) /* Scram signal control */
|
||||
#define B43_NPHY_SCRAM_SIGCTL_INITST 0x007F /* Initial state value */
|
||||
#define B43_NPHY_SCRAM_SIGCTL_INITST_SHIFT 0
|
||||
#define B43_NPHY_SCRAM_SIGCTL_SCM 0x0080 /* Scram control mode */
|
||||
#define B43_NPHY_SCRAM_SIGCTL_SICE 0x0100 /* Scram index control enable */
|
||||
#define B43_NPHY_SCRAM_SIGCTL_START 0xFE00 /* Scram start bit */
|
||||
#define B43_NPHY_SCRAM_SIGCTL_START_SHIFT 9
|
||||
#define B43_NPHY_RFCTL_INTC1 B43_PHY_N(0x091) /* RF control (intc 1) */
|
||||
#define B43_NPHY_RFCTL_INTC2 B43_PHY_N(0x092) /* RF control (intc 2) */
|
||||
#define B43_NPHY_RFCTL_INTC3 B43_PHY_N(0x093) /* RF control (intc 3) */
|
||||
#define B43_NPHY_RFCTL_INTC4 B43_PHY_N(0x094) /* RF control (intc 4) */
|
||||
#define B43_NPHY_NRDTO_WWISE B43_PHY_N(0x095) /* # datatones WWiSE */
|
||||
#define B43_NPHY_NRDTO_TGNSYNC B43_PHY_N(0x096) /* # datatones TGNsync */
|
||||
#define B43_NPHY_SIGFMOD_WWISE B43_PHY_N(0x097) /* Signal field mod WWiSE */
|
||||
#define B43_NPHY_LEG_SIGFMOD_11N B43_PHY_N(0x098) /* Legacy signal field mod 11n */
|
||||
#define B43_NPHY_HT_SIGFMOD_11N B43_PHY_N(0x099) /* HT signal field mod 11n */
|
||||
#define B43_NPHY_C1_RXIQ_COMPA0 B43_PHY_N(0x09A) /* Core 1 RX I/Q comp A0 */
|
||||
#define B43_NPHY_C1_RXIQ_COMPB0 B43_PHY_N(0x09B) /* Core 1 RX I/Q comp B0 */
|
||||
#define B43_NPHY_C2_RXIQ_COMPA1 B43_PHY_N(0x09C) /* Core 2 RX I/Q comp A1 */
|
||||
#define B43_NPHY_C2_RXIQ_COMPB1 B43_PHY_N(0x09D) /* Core 2 RX I/Q comp B1 */
|
||||
#define B43_NPHY_RXCTL B43_PHY_N(0x0A0) /* RX control */
|
||||
#define B43_NPHY_RXCTL_BSELU20 0x0010 /* Band select upper 20 */
|
||||
#define B43_NPHY_RXCTL_RIFSEN 0x0080 /* RIFS enable */
|
||||
#define B43_NPHY_RFSEQMODE B43_PHY_N(0x0A1) /* RF seq mode */
|
||||
#define B43_NPHY_RFSEQMODE_CAOVER 0x0001 /* Core active override */
|
||||
#define B43_NPHY_RFSEQMODE_TROVER 0x0002 /* Trigger override */
|
||||
#define B43_NPHY_RFSEQCA B43_PHY_N(0x0A2) /* RF seq core active */
|
||||
#define B43_NPHY_RFSEQCA_TXEN 0x000F /* TX enable */
|
||||
#define B43_NPHY_RFSEQCA_TXEN_SHIFT 0
|
||||
#define B43_NPHY_RFSEQCA_RXEN 0x00F0 /* RX enable */
|
||||
#define B43_NPHY_RFSEQCA_RXEN_SHIFT 4
|
||||
#define B43_NPHY_RFSEQCA_TXDIS 0x0F00 /* TX disable */
|
||||
#define B43_NPHY_RFSEQCA_TXDIS_SHIFT 8
|
||||
#define B43_NPHY_RFSEQCA_RXDIS 0xF000 /* RX disable */
|
||||
#define B43_NPHY_RFSEQCA_RXDIS_SHIFT 12
|
||||
#define B43_NPHY_RFSEQTR B43_PHY_N(0x0A3) /* RF seq trigger */
|
||||
#define B43_NPHY_RFSEQTR_RX2TX 0x0001 /* RX2TX */
|
||||
#define B43_NPHY_RFSEQTR_TX2RX 0x0002 /* TX2RX */
|
||||
#define B43_NPHY_RFSEQTR_UPGH 0x0004 /* Update gain H */
|
||||
#define B43_NPHY_RFSEQTR_UPGL 0x0008 /* Update gain L */
|
||||
#define B43_NPHY_RFSEQTR_UPGU 0x0010 /* Update gain U */
|
||||
#define B43_NPHY_RFSEQTR_RST2RX 0x0020 /* Reset to RX */
|
||||
#define B43_NPHY_RFSEQST B43_PHY_N(0x0A4) /* RF seq status. Values same as trigger. */
|
||||
#define B43_NPHY_AFECTL_OVER B43_PHY_N(0x0A5) /* AFE control override */
|
||||
#define B43_NPHY_AFECTL_C1 B43_PHY_N(0x0A6) /* AFE control core 1 */
|
||||
#define B43_NPHY_AFECTL_C2 B43_PHY_N(0x0A7) /* AFE control core 2 */
|
||||
#define B43_NPHY_AFECTL_C3 B43_PHY_N(0x0A8) /* AFE control core 3 */
|
||||
#define B43_NPHY_AFECTL_C4 B43_PHY_N(0x0A9) /* AFE control core 4 */
|
||||
#define B43_NPHY_AFECTL_DACGAIN1 B43_PHY_N(0x0AA) /* AFE control DAC gain 1 */
|
||||
#define B43_NPHY_AFECTL_DACGAIN2 B43_PHY_N(0x0AB) /* AFE control DAC gain 2 */
|
||||
#define B43_NPHY_AFECTL_DACGAIN3 B43_PHY_N(0x0AC) /* AFE control DAC gain 3 */
|
||||
#define B43_NPHY_AFECTL_DACGAIN4 B43_PHY_N(0x0AD) /* AFE control DAC gain 4 */
|
||||
#define B43_NPHY_STR_ADDR1 B43_PHY_N(0x0AE) /* STR address 1 */
|
||||
#define B43_NPHY_STR_ADDR2 B43_PHY_N(0x0AF) /* STR address 2 */
|
||||
#define B43_NPHY_CLASSCTL B43_PHY_N(0x0B0) /* Classifier control */
|
||||
#define B43_NPHY_CLASSCTL_CCKEN 0x0001 /* CCK enable */
|
||||
#define B43_NPHY_CLASSCTL_OFDMEN 0x0002 /* OFDM enable */
|
||||
#define B43_NPHY_CLASSCTL_WAITEDEN 0x0004 /* Waited enable */
|
||||
#define B43_NPHY_IQFLIP B43_PHY_N(0x0B1) /* I/Q flip */
|
||||
#define B43_NPHY_IQFLIP_ADC1 0x0001 /* ADC1 */
|
||||
#define B43_NPHY_IQFLIP_ADC2 0x0010 /* ADC2 */
|
||||
#define B43_NPHY_SISO_SNR_THRES B43_PHY_N(0x0B2) /* SISO SNR threshold */
|
||||
#define B43_NPHY_SIGMA_N_MULT B43_PHY_N(0x0B3) /* Sigma N multiplier */
|
||||
#define B43_NPHY_TXMACDELAY B43_PHY_N(0x0B4) /* TX MAC delay */
|
||||
#define B43_NPHY_TXFRAMEDELAY B43_PHY_N(0x0B5) /* TX frame delay */
|
||||
#define B43_NPHY_MLPARM B43_PHY_N(0x0B6) /* ML parameters */
|
||||
#define B43_NPHY_MLCTL B43_PHY_N(0x0B7) /* ML control */
|
||||
#define B43_NPHY_WWISE_20NCYCDAT B43_PHY_N(0x0B8) /* WWiSE 20 N cyc data */
|
||||
#define B43_NPHY_WWISE_40NCYCDAT B43_PHY_N(0x0B9) /* WWiSE 40 N cyc data */
|
||||
#define B43_NPHY_TGNSYNC_20NCYCDAT B43_PHY_N(0x0BA) /* TGNsync 20 N cyc data */
|
||||
#define B43_NPHY_TGNSYNC_40NCYCDAT B43_PHY_N(0x0BB) /* TGNsync 40 N cyc data */
|
||||
#define B43_NPHY_INITSWIZP B43_PHY_N(0x0BC) /* Initial swizzle pattern */
|
||||
#define B43_NPHY_TXTAILCNT B43_PHY_N(0x0BD) /* TX tail count value */
|
||||
#define B43_NPHY_BPHY_CTL1 B43_PHY_N(0x0BE) /* B PHY control 1 */
|
||||
#define B43_NPHY_BPHY_CTL2 B43_PHY_N(0x0BF) /* B PHY control 2 */
|
||||
#define B43_NPHY_BPHY_CTL2_LUT 0x001F /* LUT index */
|
||||
#define B43_NPHY_BPHY_CTL2_LUT_SHIFT 0
|
||||
#define B43_NPHY_BPHY_CTL2_MACDEL 0x7FE0 /* MAC delay */
|
||||
#define B43_NPHY_BPHY_CTL2_MACDEL_SHIFT 5
|
||||
#define B43_NPHY_IQLOCAL_CMD B43_PHY_N(0x0C0) /* I/Q LO cal command */
|
||||
#define B43_NPHY_IQLOCAL_CMD_EN 0x8000
|
||||
#define B43_NPHY_IQLOCAL_CMDNNUM B43_PHY_N(0x0C1) /* I/Q LO cal command N num */
|
||||
#define B43_NPHY_IQLOCAL_CMDGCTL B43_PHY_N(0x0C2) /* I/Q LO cal command G control */
|
||||
#define B43_NPHY_SAMP_CMD B43_PHY_N(0x0C3) /* Sample command */
|
||||
#define B43_NPHY_SAMP_CMD_STOP 0x0002 /* Stop */
|
||||
#define B43_NPHY_SAMP_LOOPCNT B43_PHY_N(0x0C4) /* Sample loop count */
|
||||
#define B43_NPHY_SAMP_WAITCNT B43_PHY_N(0x0C5) /* Sample wait count */
|
||||
#define B43_NPHY_SAMP_DEPCNT B43_PHY_N(0x0C6) /* Sample depth count */
|
||||
#define B43_NPHY_SAMP_STAT B43_PHY_N(0x0C7) /* Sample status */
|
||||
#define B43_NPHY_GPIO_LOOEN B43_PHY_N(0x0C8) /* GPIO low out enable */
|
||||
#define B43_NPHY_GPIO_HIOEN B43_PHY_N(0x0C9) /* GPIO high out enable */
|
||||
#define B43_NPHY_GPIO_SEL B43_PHY_N(0x0CA) /* GPIO select */
|
||||
#define B43_NPHY_GPIO_CLKCTL B43_PHY_N(0x0CB) /* GPIO clock control */
|
||||
#define B43_NPHY_TXF_20CO_AS0 B43_PHY_N(0x0CC) /* TX filter 20 coeff A stage 0 */
|
||||
#define B43_NPHY_TXF_20CO_AS1 B43_PHY_N(0x0CD) /* TX filter 20 coeff A stage 1 */
|
||||
#define B43_NPHY_TXF_20CO_AS2 B43_PHY_N(0x0CE) /* TX filter 20 coeff A stage 2 */
|
||||
#define B43_NPHY_TXF_20CO_B32S0 B43_PHY_N(0x0CF) /* TX filter 20 coeff B32 stage 0 */
|
||||
#define B43_NPHY_TXF_20CO_B1S0 B43_PHY_N(0x0D0) /* TX filter 20 coeff B1 stage 0 */
|
||||
#define B43_NPHY_TXF_20CO_B32S1 B43_PHY_N(0x0D1) /* TX filter 20 coeff B32 stage 1 */
|
||||
#define B43_NPHY_TXF_20CO_B1S1 B43_PHY_N(0x0D2) /* TX filter 20 coeff B1 stage 1 */
|
||||
#define B43_NPHY_TXF_20CO_B32S2 B43_PHY_N(0x0D3) /* TX filter 20 coeff B32 stage 2 */
|
||||
#define B43_NPHY_TXF_20CO_B1S2 B43_PHY_N(0x0D4) /* TX filter 20 coeff B1 stage 2 */
|
||||
#define B43_NPHY_SIGFLDTOL B43_PHY_N(0x0D5) /* Signal fld tolerance */
|
||||
#define B43_NPHY_TXSERFLD B43_PHY_N(0x0D6) /* TX service field */
|
||||
#define B43_NPHY_AFESEQ_RX2TX_PUD B43_PHY_N(0x0D7) /* AFE seq RX2TX power up/down delay */
|
||||
#define B43_NPHY_AFESEQ_TX2RX_PUD B43_PHY_N(0x0D8) /* AFE seq TX2RX power up/down delay */
|
||||
#define B43_NPHY_TGNSYNC_SCRAMI0 B43_PHY_N(0x0D9) /* TGNsync scram init 0 */
|
||||
#define B43_NPHY_TGNSYNC_SCRAMI1 B43_PHY_N(0x0DA) /* TGNsync scram init 1 */
|
||||
#define B43_NPHY_INITSWIZPATTLEG B43_PHY_N(0x0DB) /* Initial swizzle pattern leg */
|
||||
#define B43_NPHY_BPHY_CTL3 B43_PHY_N(0x0DC) /* B PHY control 3 */
|
||||
#define B43_NPHY_BPHY_CTL3_SCALE 0x00FF /* Scale */
|
||||
#define B43_NPHY_BPHY_CTL3_SCALE_SHIFT 0
|
||||
#define B43_NPHY_BPHY_CTL3_FSC 0xFF00 /* Frame start count value */
|
||||
#define B43_NPHY_BPHY_CTL3_FSC_SHIFT 8
|
||||
#define B43_NPHY_BPHY_CTL4 B43_PHY_N(0x0DD) /* B PHY control 4 */
|
||||
#define B43_NPHY_C1_TXBBMULT B43_PHY_N(0x0DE) /* Core 1 TX BB multiplier */
|
||||
#define B43_NPHY_C2_TXBBMULT B43_PHY_N(0x0DF) /* Core 2 TX BB multiplier */
|
||||
#define B43_NPHY_TXF_40CO_AS0 B43_PHY_N(0x0E1) /* TX filter 40 coeff A stage 0 */
|
||||
#define B43_NPHY_TXF_40CO_AS1 B43_PHY_N(0x0E2) /* TX filter 40 coeff A stage 1 */
|
||||
#define B43_NPHY_TXF_40CO_AS2 B43_PHY_N(0x0E3) /* TX filter 40 coeff A stage 2 */
|
||||
#define B43_NPHY_TXF_40CO_B32S0 B43_PHY_N(0x0E4) /* TX filter 40 coeff B32 stage 0 */
|
||||
#define B43_NPHY_TXF_40CO_B1S0 B43_PHY_N(0x0E5) /* TX filter 40 coeff B1 stage 0 */
|
||||
#define B43_NPHY_TXF_40CO_B32S1 B43_PHY_N(0x0E6) /* TX filter 40 coeff B32 stage 1 */
|
||||
#define B43_NPHY_TXF_40CO_B1S1 B43_PHY_N(0x0E7) /* TX filter 40 coeff B1 stage 1 */
|
||||
#define B43_NPHY_TXF_40CO_B32S2 B43_PHY_N(0x0E8) /* TX filter 40 coeff B32 stage 2 */
|
||||
#define B43_NPHY_TXF_40CO_B1S2 B43_PHY_N(0x0E9) /* TX filter 40 coeff B1 stage 2 */
|
||||
#define B43_NPHY_BIST_STAT2 B43_PHY_N(0x0EA) /* BIST status 2 */
|
||||
#define B43_NPHY_BIST_STAT3 B43_PHY_N(0x0EB) /* BIST status 3 */
|
||||
#define B43_NPHY_RFCTL_OVER B43_PHY_N(0x0EC) /* RF control override */
|
||||
#define B43_NPHY_MIMOCFG B43_PHY_N(0x0ED) /* MIMO config */
|
||||
#define B43_NPHY_MIMOCFG_GFMIX 0x0004 /* Greenfield or mixed mode */
|
||||
#define B43_NPHY_MIMOCFG_AUTO 0x0100 /* Greenfield/mixed mode auto */
|
||||
#define B43_NPHY_RADAR_BLNKCTL B43_PHY_N(0x0EE) /* Radar blank control */
|
||||
#define B43_NPHY_A0RADAR_FIFOCTL B43_PHY_N(0x0EF) /* Antenna 0 radar FIFO control */
|
||||
#define B43_NPHY_A1RADAR_FIFOCTL B43_PHY_N(0x0F0) /* Antenna 1 radar FIFO control */
|
||||
#define B43_NPHY_A0RADAR_FIFODAT B43_PHY_N(0x0F1) /* Antenna 0 radar FIFO data */
|
||||
#define B43_NPHY_A1RADAR_FIFODAT B43_PHY_N(0x0F2) /* Antenna 1 radar FIFO data */
|
||||
#define B43_NPHY_RADAR_THRES0 B43_PHY_N(0x0F3) /* Radar threshold 0 */
|
||||
#define B43_NPHY_RADAR_THRES1 B43_PHY_N(0x0F4) /* Radar threshold 1 */
|
||||
#define B43_NPHY_RADAR_THRES0R B43_PHY_N(0x0F5) /* Radar threshold 0R */
|
||||
#define B43_NPHY_RADAR_THRES1R B43_PHY_N(0x0F6) /* Radar threshold 1R */
|
||||
#define B43_NPHY_CSEN_20IN40_DLEN B43_PHY_N(0x0F7) /* Carrier sense 20 in 40 dwell length */
|
||||
#define B43_NPHY_RFCTL_LUT_TRSW_LO1 B43_PHY_N(0x0F8) /* RF control LUT TRSW lower 1 */
|
||||
#define B43_NPHY_RFCTL_LUT_TRSW_UP1 B43_PHY_N(0x0F9) /* RF control LUT TRSW upper 1 */
|
||||
#define B43_NPHY_RFCTL_LUT_TRSW_LO2 B43_PHY_N(0x0FA) /* RF control LUT TRSW lower 2 */
|
||||
#define B43_NPHY_RFCTL_LUT_TRSW_UP2 B43_PHY_N(0x0FB) /* RF control LUT TRSW upper 2 */
|
||||
#define B43_NPHY_RFCTL_LUT_TRSW_LO3 B43_PHY_N(0x0FC) /* RF control LUT TRSW lower 3 */
|
||||
#define B43_NPHY_RFCTL_LUT_TRSW_UP3 B43_PHY_N(0x0FD) /* RF control LUT TRSW upper 3 */
|
||||
#define B43_NPHY_RFCTL_LUT_TRSW_LO4 B43_PHY_N(0x0FE) /* RF control LUT TRSW lower 4 */
|
||||
#define B43_NPHY_RFCTL_LUT_TRSW_UP4 B43_PHY_N(0x0FF) /* RF control LUT TRSW upper 4 */
|
||||
#define B43_NPHY_RFCTL_LUT_LNAPA1 B43_PHY_N(0x100) /* RF control LUT LNA PA 1 */
|
||||
#define B43_NPHY_RFCTL_LUT_LNAPA2 B43_PHY_N(0x101) /* RF control LUT LNA PA 2 */
|
||||
#define B43_NPHY_RFCTL_LUT_LNAPA3 B43_PHY_N(0x102) /* RF control LUT LNA PA 3 */
|
||||
#define B43_NPHY_RFCTL_LUT_LNAPA4 B43_PHY_N(0x103) /* RF control LUT LNA PA 4 */
|
||||
#define B43_NPHY_TGNSYNC_CRCM0 B43_PHY_N(0x104) /* TGNsync CRC mask 0 */
|
||||
#define B43_NPHY_TGNSYNC_CRCM1 B43_PHY_N(0x105) /* TGNsync CRC mask 1 */
|
||||
#define B43_NPHY_TGNSYNC_CRCM2 B43_PHY_N(0x106) /* TGNsync CRC mask 2 */
|
||||
#define B43_NPHY_TGNSYNC_CRCM3 B43_PHY_N(0x107) /* TGNsync CRC mask 3 */
|
||||
#define B43_NPHY_TGNSYNC_CRCM4 B43_PHY_N(0x108) /* TGNsync CRC mask 4 */
|
||||
#define B43_NPHY_CRCPOLY B43_PHY_N(0x109) /* CRC polynomial */
|
||||
#define B43_NPHY_SIGCNT B43_PHY_N(0x10A) /* # sig count */
|
||||
#define B43_NPHY_SIGSTARTBIT_CTL B43_PHY_N(0x10B) /* Sig start bit control */
|
||||
#define B43_NPHY_CRCPOLY_ORDER B43_PHY_N(0x10C) /* CRC polynomial order */
|
||||
#define B43_NPHY_RFCTL_CST0 B43_PHY_N(0x10D) /* RF control core swap table 0 */
|
||||
#define B43_NPHY_RFCTL_CST1 B43_PHY_N(0x10E) /* RF control core swap table 1 */
|
||||
#define B43_NPHY_RFCTL_CST2O B43_PHY_N(0x10F) /* RF control core swap table 2 + others */
|
||||
#define B43_NPHY_BPHY_CTL5 B43_PHY_N(0x111) /* B PHY control 5 */
|
||||
#define B43_NPHY_RFSEQ_LPFBW B43_PHY_N(0x112) /* RF seq LPF bandwidth */
|
||||
#define B43_NPHY_TSSIBIAS1 B43_PHY_N(0x114) /* TSSI bias val 1 */
|
||||
#define B43_NPHY_TSSIBIAS2 B43_PHY_N(0x115) /* TSSI bias val 2 */
|
||||
#define B43_NPHY_TSSIBIAS_BIAS 0x00FF /* Bias */
|
||||
#define B43_NPHY_TSSIBIAS_BIAS_SHIFT 0
|
||||
#define B43_NPHY_TSSIBIAS_VAL 0xFF00 /* Value */
|
||||
#define B43_NPHY_TSSIBIAS_VAL_SHIFT 8
|
||||
#define B43_NPHY_ESTPWR1 B43_PHY_N(0x118) /* Estimated power 1 */
|
||||
#define B43_NPHY_ESTPWR2 B43_PHY_N(0x119) /* Estimated power 2 */
|
||||
#define B43_NPHY_ESTPWR_PWR 0x00FF /* Estimated power */
|
||||
#define B43_NPHY_ESTPWR_PWR_SHIFT 0
|
||||
#define B43_NPHY_ESTPWR_VALID 0x0100 /* Estimated power valid */
|
||||
#define B43_NPHY_TSSI_MAXTXFDT B43_PHY_N(0x11C) /* TSSI max TX frame delay time */
|
||||
#define B43_NPHY_TSSI_MAXTXFDT_VAL 0x00FF /* max TX frame delay time */
|
||||
#define B43_NPHY_TSSI_MAXTXFDT_VAL_SHIFT 0
|
||||
#define B43_NPHY_TSSI_MAXTDT B43_PHY_N(0x11D) /* TSSI max TSSI delay time */
|
||||
#define B43_NPHY_TSSI_MAXTDT_VAL 0x00FF /* max TSSI delay time */
|
||||
#define B43_NPHY_TSSI_MAXTDT_VAL_SHIFT 0
|
||||
#define B43_NPHY_ITSSI1 B43_PHY_N(0x11E) /* TSSI idle 1 */
|
||||
#define B43_NPHY_ITSSI2 B43_PHY_N(0x11F) /* TSSI idle 2 */
|
||||
#define B43_NPHY_ITSSI_VAL 0x00FF /* Idle TSSI */
|
||||
#define B43_NPHY_ITSSI_VAL_SHIFT 0
|
||||
#define B43_NPHY_TSSIMODE B43_PHY_N(0x122) /* TSSI mode */
|
||||
#define B43_NPHY_TSSIMODE_EN 0x0001 /* TSSI enable */
|
||||
#define B43_NPHY_TSSIMODE_PDEN 0x0002 /* Power det enable */
|
||||
#define B43_NPHY_RXMACIFM B43_PHY_N(0x123) /* RX Macif mode */
|
||||
#define B43_NPHY_CRSIT_COCNT_LO B43_PHY_N(0x124) /* CRS idle time CRS-on count (low) */
|
||||
#define B43_NPHY_CRSIT_COCNT_HI B43_PHY_N(0x125) /* CRS idle time CRS-on count (high) */
|
||||
#define B43_NPHY_CRSIT_MTCNT_LO B43_PHY_N(0x126) /* CRS idle time measure time count (low) */
|
||||
#define B43_NPHY_CRSIT_MTCNT_HI B43_PHY_N(0x127) /* CRS idle time measure time count (high) */
|
||||
#define B43_NPHY_SAMTWC B43_PHY_N(0x128) /* Sample tail wait count */
|
||||
#define B43_NPHY_IQEST_CMD B43_PHY_N(0x129) /* I/Q estimate command */
|
||||
#define B43_NPHY_IQEST_CMD_START 0x0001 /* Start */
|
||||
#define B43_NPHY_IQEST_CMD_MODE 0x0002 /* Mode */
|
||||
#define B43_NPHY_IQEST_WT B43_PHY_N(0x12A) /* I/Q estimate wait time */
|
||||
#define B43_NPHY_IQEST_WT_VAL 0x00FF /* Wait time */
|
||||
#define B43_NPHY_IQEST_WT_VAL_SHIFT 0
|
||||
#define B43_NPHY_IQEST_SAMCNT B43_PHY_N(0x12B) /* I/Q estimate sample count */
|
||||
#define B43_NPHY_IQEST_IQACC_LO0 B43_PHY_N(0x12C) /* I/Q estimate I/Q acc lo 0 */
|
||||
#define B43_NPHY_IQEST_IQACC_HI0 B43_PHY_N(0x12D) /* I/Q estimate I/Q acc hi 0 */
|
||||
#define B43_NPHY_IQEST_IPACC_LO0 B43_PHY_N(0x12E) /* I/Q estimate I power acc lo 0 */
|
||||
#define B43_NPHY_IQEST_IPACC_HI0 B43_PHY_N(0x12F) /* I/Q estimate I power acc hi 0 */
|
||||
#define B43_NPHY_IQEST_QPACC_LO0 B43_PHY_N(0x130) /* I/Q estimate Q power acc lo 0 */
|
||||
#define B43_NPHY_IQEST_QPACC_HI0 B43_PHY_N(0x131) /* I/Q estimate Q power acc hi 0 */
|
||||
#define B43_NPHY_IQEST_IQACC_LO1 B43_PHY_N(0x134) /* I/Q estimate I/Q acc lo 1 */
|
||||
#define B43_NPHY_IQEST_IQACC_HI1 B43_PHY_N(0x135) /* I/Q estimate I/Q acc hi 1 */
|
||||
#define B43_NPHY_IQEST_IPACC_LO1 B43_PHY_N(0x136) /* I/Q estimate I power acc lo 1 */
|
||||
#define B43_NPHY_IQEST_IPACC_HI1 B43_PHY_N(0x137) /* I/Q estimate I power acc hi 1 */
|
||||
#define B43_NPHY_IQEST_QPACC_LO1 B43_PHY_N(0x138) /* I/Q estimate Q power acc lo 1 */
|
||||
#define B43_NPHY_IQEST_QPACC_HI1 B43_PHY_N(0x139) /* I/Q estimate Q power acc hi 1 */
|
||||
#define B43_NPHY_MIMO_CRSTXEXT B43_PHY_N(0x13A) /* MIMO PHY CRS TX extension */
|
||||
#define B43_NPHY_PWRDET1 B43_PHY_N(0x13B) /* Power det 1 */
|
||||
#define B43_NPHY_PWRDET2 B43_PHY_N(0x13C) /* Power det 2 */
|
||||
#define B43_NPHY_MAXRSSI_DTIME B43_PHY_N(0x13F) /* RSSI max RSSI delay time */
|
||||
#define B43_NPHY_PIL_DW0 B43_PHY_N(0x141) /* Pilot data weight 0 */
|
||||
#define B43_NPHY_PIL_DW1 B43_PHY_N(0x142) /* Pilot data weight 1 */
|
||||
#define B43_NPHY_PIL_DW2 B43_PHY_N(0x143) /* Pilot data weight 2 */
|
||||
#define B43_NPHY_PIL_DW_BPSK 0x000F /* BPSK */
|
||||
#define B43_NPHY_PIL_DW_BPSK_SHIFT 0
|
||||
#define B43_NPHY_PIL_DW_QPSK 0x00F0 /* QPSK */
|
||||
#define B43_NPHY_PIL_DW_QPSK_SHIFT 4
|
||||
#define B43_NPHY_PIL_DW_16QAM 0x0F00 /* 16-QAM */
|
||||
#define B43_NPHY_PIL_DW_16QAM_SHIFT 8
|
||||
#define B43_NPHY_PIL_DW_64QAM 0xF000 /* 64-QAM */
|
||||
#define B43_NPHY_PIL_DW_64QAM_SHIFT 12
|
||||
#define B43_NPHY_FMDEM_CFG B43_PHY_N(0x144) /* FM demodulation config */
|
||||
#define B43_NPHY_PHASETR_A0 B43_PHY_N(0x145) /* Phase track alpha 0 */
|
||||
#define B43_NPHY_PHASETR_A1 B43_PHY_N(0x146) /* Phase track alpha 1 */
|
||||
#define B43_NPHY_PHASETR_A2 B43_PHY_N(0x147) /* Phase track alpha 2 */
|
||||
#define B43_NPHY_PHASETR_B0 B43_PHY_N(0x148) /* Phase track beta 0 */
|
||||
#define B43_NPHY_PHASETR_B1 B43_PHY_N(0x149) /* Phase track beta 1 */
|
||||
#define B43_NPHY_PHASETR_B2 B43_PHY_N(0x14A) /* Phase track beta 2 */
|
||||
#define B43_NPHY_PHASETR_CHG0 B43_PHY_N(0x14B) /* Phase track change 0 */
|
||||
#define B43_NPHY_PHASETR_CHG1 B43_PHY_N(0x14C) /* Phase track change 1 */
|
||||
#define B43_NPHY_PHASETW_OFF B43_PHY_N(0x14D) /* Phase track offset */
|
||||
#define B43_NPHY_RFCTL_DBG B43_PHY_N(0x14E) /* RF control debug */
|
||||
#define B43_NPHY_CCK_SHIFTB_REF B43_PHY_N(0x150) /* CCK shiftbits reference var */
|
||||
#define B43_NPHY_OVER_DGAIN0 B43_PHY_N(0x152) /* Override digital gain 0 */
|
||||
#define B43_NPHY_OVER_DGAIN1 B43_PHY_N(0x153) /* Override digital gain 1 */
|
||||
#define B43_NPHY_OVER_DGAIN_FDGV 0x0007 /* Force digital gain value */
|
||||
#define B43_NPHY_OVER_DGAIN_FDGV_SHIFT 0
|
||||
#define B43_NPHY_OVER_DGAIN_FDGEN 0x0008 /* Force digital gain enable */
|
||||
#define B43_NPHY_OVER_DGAIN_CCKDGECV 0xFF00 /* CCK digital gain enable count value */
|
||||
#define B43_NPHY_OVER_DGAIN_CCKDGECV_SHIFT 8
|
||||
#define B43_NPHY_BIST_STAT4 B43_PHY_N(0x156) /* BIST status 4 */
|
||||
#define B43_NPHY_RADAR_MAL B43_PHY_N(0x157) /* Radar MA length */
|
||||
#define B43_NPHY_RADAR_SRCCTL B43_PHY_N(0x158) /* Radar search control */
|
||||
#define B43_NPHY_VLD_DTSIG B43_PHY_N(0x159) /* VLD data tones sig */
|
||||
#define B43_NPHY_VLD_DTDAT B43_PHY_N(0x15A) /* VLD data tones data */
|
||||
#define B43_NPHY_C1_BPHY_RXIQCA0 B43_PHY_N(0x15B) /* Core 1 B PHY RX I/Q comp A0 */
|
||||
#define B43_NPHY_C1_BPHY_RXIQCB0 B43_PHY_N(0x15C) /* Core 1 B PHY RX I/Q comp B0 */
|
||||
#define B43_NPHY_C2_BPHY_RXIQCA1 B43_PHY_N(0x15D) /* Core 2 B PHY RX I/Q comp A1 */
|
||||
#define B43_NPHY_C2_BPHY_RXIQCB1 B43_PHY_N(0x15E) /* Core 2 B PHY RX I/Q comp B1 */
|
||||
#define B43_NPHY_FREQGAIN0 B43_PHY_N(0x160) /* Frequency gain 0 */
|
||||
#define B43_NPHY_FREQGAIN1 B43_PHY_N(0x161) /* Frequency gain 1 */
|
||||
#define B43_NPHY_FREQGAIN2 B43_PHY_N(0x162) /* Frequency gain 2 */
|
||||
#define B43_NPHY_FREQGAIN3 B43_PHY_N(0x163) /* Frequency gain 3 */
|
||||
#define B43_NPHY_FREQGAIN4 B43_PHY_N(0x164) /* Frequency gain 4 */
|
||||
#define B43_NPHY_FREQGAIN5 B43_PHY_N(0x165) /* Frequency gain 5 */
|
||||
#define B43_NPHY_FREQGAIN6 B43_PHY_N(0x166) /* Frequency gain 6 */
|
||||
#define B43_NPHY_FREQGAIN7 B43_PHY_N(0x167) /* Frequency gain 7 */
|
||||
#define B43_NPHY_FREQGAIN_BYPASS B43_PHY_N(0x168) /* Frequency gain bypass */
|
||||
#define B43_NPHY_TRLOSS B43_PHY_N(0x169) /* TR loss value */
|
||||
#define B43_NPHY_C1_ADCCLIP B43_PHY_N(0x16A) /* Core 1 ADC clip */
|
||||
#define B43_NPHY_C2_ADCCLIP B43_PHY_N(0x16B) /* Core 2 ADC clip */
|
||||
#define B43_NPHY_LTRN_OFFGAIN B43_PHY_N(0x16F) /* LTRN offset gain */
|
||||
#define B43_NPHY_LTRN_OFF B43_PHY_N(0x170) /* LTRN offset */
|
||||
#define B43_NPHY_NRDATAT_WWISE20SIG B43_PHY_N(0x171) /* # data tones WWiSE 20 sig */
|
||||
#define B43_NPHY_NRDATAT_WWISE40SIG B43_PHY_N(0x172) /* # data tones WWiSE 40 sig */
|
||||
#define B43_NPHY_NRDATAT_TGNSYNC20SIG B43_PHY_N(0x173) /* # data tones TGNsync 20 sig */
|
||||
#define B43_NPHY_NRDATAT_TGNSYNC40SIG B43_PHY_N(0x174) /* # data tones TGNsync 40 sig */
|
||||
#define B43_NPHY_WWISE_CRCM0 B43_PHY_N(0x175) /* WWiSE CRC mask 0 */
|
||||
#define B43_NPHY_WWISE_CRCM1 B43_PHY_N(0x176) /* WWiSE CRC mask 1 */
|
||||
#define B43_NPHY_WWISE_CRCM2 B43_PHY_N(0x177) /* WWiSE CRC mask 2 */
|
||||
#define B43_NPHY_WWISE_CRCM3 B43_PHY_N(0x178) /* WWiSE CRC mask 3 */
|
||||
#define B43_NPHY_WWISE_CRCM4 B43_PHY_N(0x179) /* WWiSE CRC mask 4 */
|
||||
#define B43_NPHY_CHANEST_CDDSH B43_PHY_N(0x17A) /* Channel estimate CDD shift */
|
||||
#define B43_NPHY_HTAGC_WCNT B43_PHY_N(0x17B) /* HT ADC wait counters */
|
||||
#define B43_NPHY_SQPARM B43_PHY_N(0x17C) /* SQ params */
|
||||
#define B43_NPHY_MCSDUP6M B43_PHY_N(0x17D) /* MCS dup 6M */
|
||||
#define B43_NPHY_NDATAT_DUP40 B43_PHY_N(0x17E) /* # data tones dup 40 */
|
||||
#define B43_NPHY_DUP40_TGNSYNC_CYCD B43_PHY_N(0x17F) /* Dup40 TGNsync cycle data */
|
||||
#define B43_NPHY_DUP40_GFBL B43_PHY_N(0x180) /* Dup40 GF format BL address */
|
||||
#define B43_NPHY_DUP40_BL B43_PHY_N(0x181) /* Dup40 format BL address */
|
||||
#define B43_NPHY_LEGDUP_FTA B43_PHY_N(0x182) /* Legacy dup frm table address */
|
||||
#define B43_NPHY_PACPROC_DBG B43_PHY_N(0x183) /* Packet processing debug */
|
||||
#define B43_NPHY_PIL_CYC1 B43_PHY_N(0x184) /* Pilot cycle counter 1 */
|
||||
#define B43_NPHY_PIL_CYC2 B43_PHY_N(0x185) /* Pilot cycle counter 2 */
|
||||
#define B43_NPHY_TXF_20CO_S0A1 B43_PHY_N(0x186) /* TX filter 20 coeff stage 0 A1 */
|
||||
#define B43_NPHY_TXF_20CO_S0A2 B43_PHY_N(0x187) /* TX filter 20 coeff stage 0 A2 */
|
||||
#define B43_NPHY_TXF_20CO_S1A1 B43_PHY_N(0x188) /* TX filter 20 coeff stage 1 A1 */
|
||||
#define B43_NPHY_TXF_20CO_S1A2 B43_PHY_N(0x189) /* TX filter 20 coeff stage 1 A2 */
|
||||
#define B43_NPHY_TXF_20CO_S2A1 B43_PHY_N(0x18A) /* TX filter 20 coeff stage 2 A1 */
|
||||
#define B43_NPHY_TXF_20CO_S2A2 B43_PHY_N(0x18B) /* TX filter 20 coeff stage 2 A2 */
|
||||
#define B43_NPHY_TXF_20CO_S0B1 B43_PHY_N(0x18C) /* TX filter 20 coeff stage 0 B1 */
|
||||
#define B43_NPHY_TXF_20CO_S0B2 B43_PHY_N(0x18D) /* TX filter 20 coeff stage 0 B2 */
|
||||
#define B43_NPHY_TXF_20CO_S0B3 B43_PHY_N(0x18E) /* TX filter 20 coeff stage 0 B3 */
|
||||
#define B43_NPHY_TXF_20CO_S1B1 B43_PHY_N(0x18F) /* TX filter 20 coeff stage 1 B1 */
|
||||
#define B43_NPHY_TXF_20CO_S1B2 B43_PHY_N(0x190) /* TX filter 20 coeff stage 1 B2 */
|
||||
#define B43_NPHY_TXF_20CO_S1B3 B43_PHY_N(0x191) /* TX filter 20 coeff stage 1 B3 */
|
||||
#define B43_NPHY_TXF_20CO_S2B1 B43_PHY_N(0x192) /* TX filter 20 coeff stage 2 B1 */
|
||||
#define B43_NPHY_TXF_20CO_S2B2 B43_PHY_N(0x193) /* TX filter 20 coeff stage 2 B2 */
|
||||
#define B43_NPHY_TXF_20CO_S2B3 B43_PHY_N(0x194) /* TX filter 20 coeff stage 2 B3 */
|
||||
#define B43_NPHY_TXF_40CO_S0A1 B43_PHY_N(0x195) /* TX filter 40 coeff stage 0 A1 */
|
||||
#define B43_NPHY_TXF_40CO_S0A2 B43_PHY_N(0x196) /* TX filter 40 coeff stage 0 A2 */
|
||||
#define B43_NPHY_TXF_40CO_S1A1 B43_PHY_N(0x197) /* TX filter 40 coeff stage 1 A1 */
|
||||
#define B43_NPHY_TXF_40CO_S1A2 B43_PHY_N(0x198) /* TX filter 40 coeff stage 1 A2 */
|
||||
#define B43_NPHY_TXF_40CO_S2A1 B43_PHY_N(0x199) /* TX filter 40 coeff stage 2 A1 */
|
||||
#define B43_NPHY_TXF_40CO_S2A2 B43_PHY_N(0x19A) /* TX filter 40 coeff stage 2 A2 */
|
||||
#define B43_NPHY_TXF_40CO_S0B1 B43_PHY_N(0x19B) /* TX filter 40 coeff stage 0 B1 */
|
||||
#define B43_NPHY_TXF_40CO_S0B2 B43_PHY_N(0x19C) /* TX filter 40 coeff stage 0 B2 */
|
||||
#define B43_NPHY_TXF_40CO_S0B3 B43_PHY_N(0x19D) /* TX filter 40 coeff stage 0 B3 */
|
||||
#define B43_NPHY_TXF_40CO_S1B1 B43_PHY_N(0x19E) /* TX filter 40 coeff stage 1 B1 */
|
||||
#define B43_NPHY_TXF_40CO_S1B2 B43_PHY_N(0x19F) /* TX filter 40 coeff stage 1 B2 */
|
||||
#define B43_NPHY_TXF_40CO_S1B3 B43_PHY_N(0x1A0) /* TX filter 40 coeff stage 1 B3 */
|
||||
#define B43_NPHY_TXF_40CO_S2B1 B43_PHY_N(0x1A1) /* TX filter 40 coeff stage 2 B1 */
|
||||
#define B43_NPHY_TXF_40CO_S2B2 B43_PHY_N(0x1A2) /* TX filter 40 coeff stage 2 B2 */
|
||||
#define B43_NPHY_TXF_40CO_S2B3 B43_PHY_N(0x1A3) /* TX filter 40 coeff stage 2 B3 */
|
||||
#define B43_NPHY_RSSIMC_0I_RSSI_X B43_PHY_N(0x1A4) /* RSSI multiplication coefficient 0 I RSSI X */
|
||||
#define B43_NPHY_RSSIMC_0I_RSSI_Y B43_PHY_N(0x1A5) /* RSSI multiplication coefficient 0 I RSSI Y */
|
||||
#define B43_NPHY_RSSIMC_0I_RSSI_Z B43_PHY_N(0x1A6) /* RSSI multiplication coefficient 0 I RSSI Z */
|
||||
#define B43_NPHY_RSSIMC_0I_TBD B43_PHY_N(0x1A7) /* RSSI multiplication coefficient 0 I TBD */
|
||||
#define B43_NPHY_RSSIMC_0I_PWRDET B43_PHY_N(0x1A8) /* RSSI multiplication coefficient 0 I power det */
|
||||
#define B43_NPHY_RSSIMC_0I_TSSI B43_PHY_N(0x1A9) /* RSSI multiplication coefficient 0 I TSSI */
|
||||
#define B43_NPHY_RSSIMC_0Q_RSSI_X B43_PHY_N(0x1AA) /* RSSI multiplication coefficient 0 Q RSSI X */
|
||||
#define B43_NPHY_RSSIMC_0Q_RSSI_Y B43_PHY_N(0x1AB) /* RSSI multiplication coefficient 0 Q RSSI Y */
|
||||
#define B43_NPHY_RSSIMC_0Q_RSSI_Z B43_PHY_N(0x1AC) /* RSSI multiplication coefficient 0 Q RSSI Z */
|
||||
#define B43_NPHY_RSSIMC_0Q_TBD B43_PHY_N(0x1AD) /* RSSI multiplication coefficient 0 Q TBD */
|
||||
#define B43_NPHY_RSSIMC_0Q_PWRDET B43_PHY_N(0x1AE) /* RSSI multiplication coefficient 0 Q power det */
|
||||
#define B43_NPHY_RSSIMC_0Q_TSSI B43_PHY_N(0x1AF) /* RSSI multiplication coefficient 0 Q TSSI */
|
||||
#define B43_NPHY_RSSIMC_1I_RSSI_X B43_PHY_N(0x1B0) /* RSSI multiplication coefficient 1 I RSSI X */
|
||||
#define B43_NPHY_RSSIMC_1I_RSSI_Y B43_PHY_N(0x1B1) /* RSSI multiplication coefficient 1 I RSSI Y */
|
||||
#define B43_NPHY_RSSIMC_1I_RSSI_Z B43_PHY_N(0x1B2) /* RSSI multiplication coefficient 1 I RSSI Z */
|
||||
#define B43_NPHY_RSSIMC_1I_TBD B43_PHY_N(0x1B3) /* RSSI multiplication coefficient 1 I TBD */
|
||||
#define B43_NPHY_RSSIMC_1I_PWRDET B43_PHY_N(0x1B4) /* RSSI multiplication coefficient 1 I power det */
|
||||
#define B43_NPHY_RSSIMC_1I_TSSI B43_PHY_N(0x1B5) /* RSSI multiplication coefficient 1 I TSSI */
|
||||
#define B43_NPHY_RSSIMC_1Q_RSSI_X B43_PHY_N(0x1B6) /* RSSI multiplication coefficient 1 Q RSSI X */
|
||||
#define B43_NPHY_RSSIMC_1Q_RSSI_Y B43_PHY_N(0x1B7) /* RSSI multiplication coefficient 1 Q RSSI Y */
|
||||
#define B43_NPHY_RSSIMC_1Q_RSSI_Z B43_PHY_N(0x1B8) /* RSSI multiplication coefficient 1 Q RSSI Z */
|
||||
#define B43_NPHY_RSSIMC_1Q_TBD B43_PHY_N(0x1B9) /* RSSI multiplication coefficient 1 Q TBD */
|
||||
#define B43_NPHY_RSSIMC_1Q_PWRDET B43_PHY_N(0x1BA) /* RSSI multiplication coefficient 1 Q power det */
|
||||
#define B43_NPHY_RSSIMC_1Q_TSSI B43_PHY_N(0x1BB) /* RSSI multiplication coefficient 1 Q TSSI */
|
||||
#define B43_NPHY_SAMC_WCNT B43_PHY_N(0x1BC) /* Sample collect wait counter */
|
||||
#define B43_NPHY_PTHROUGH_CNT B43_PHY_N(0x1BD) /* Pass-through counter */
|
||||
#define B43_NPHY_LTRN_OFF_G20L B43_PHY_N(0x1C4) /* LTRN offset gain 20L */
|
||||
#define B43_NPHY_LTRN_OFF_20L B43_PHY_N(0x1C5) /* LTRN offset 20L */
|
||||
#define B43_NPHY_LTRN_OFF_G20U B43_PHY_N(0x1C6) /* LTRN offset gain 20U */
|
||||
#define B43_NPHY_LTRN_OFF_20U B43_PHY_N(0x1C7) /* LTRN offset 20U */
|
||||
#define B43_NPHY_DSSSCCK_GAINSL B43_PHY_N(0x1C8) /* DSSS/CCK gain settle length */
|
||||
#define B43_NPHY_GPIO_LOOUT B43_PHY_N(0x1C9) /* GPIO low out */
|
||||
#define B43_NPHY_GPIO_HIOUT B43_PHY_N(0x1CA) /* GPIO high out */
|
||||
#define B43_NPHY_CRS_CHECK B43_PHY_N(0x1CB) /* CRS check */
|
||||
#define B43_NPHY_ML_LOGSS_RAT B43_PHY_N(0x1CC) /* ML/logss ratio */
|
||||
#define B43_NPHY_DUPSCALE B43_PHY_N(0x1CD) /* Dup scale */
|
||||
#define B43_NPHY_BW1A B43_PHY_N(0x1CE) /* BW 1A */
|
||||
#define B43_NPHY_BW2 B43_PHY_N(0x1CF) /* BW 2 */
|
||||
#define B43_NPHY_BW3 B43_PHY_N(0x1D0) /* BW 3 */
|
||||
#define B43_NPHY_BW4 B43_PHY_N(0x1D1) /* BW 4 */
|
||||
#define B43_NPHY_BW5 B43_PHY_N(0x1D2) /* BW 5 */
|
||||
#define B43_NPHY_BW6 B43_PHY_N(0x1D3) /* BW 6 */
|
||||
#define B43_NPHY_COALEN0 B43_PHY_N(0x1D4) /* Coarse length 0 */
|
||||
#define B43_NPHY_COALEN1 B43_PHY_N(0x1D5) /* Coarse length 1 */
|
||||
#define B43_NPHY_CRSTHRES_1U B43_PHY_N(0x1D6) /* CRS threshold 1 U */
|
||||
#define B43_NPHY_CRSTHRES_2U B43_PHY_N(0x1D7) /* CRS threshold 2 U */
|
||||
#define B43_NPHY_CRSTHRES_3U B43_PHY_N(0x1D8) /* CRS threshold 3 U */
|
||||
#define B43_NPHY_CRSCTL_U B43_PHY_N(0x1D9) /* CRS control U */
|
||||
#define B43_NPHY_CRSTHRES_1L B43_PHY_N(0x1DA) /* CRS threshold 1 L */
|
||||
#define B43_NPHY_CRSTHRES_2L B43_PHY_N(0x1DB) /* CRS threshold 2 L */
|
||||
#define B43_NPHY_CRSTHRES_3L B43_PHY_N(0x1DC) /* CRS threshold 3 L */
|
||||
#define B43_NPHY_CRSCTL_L B43_PHY_N(0x1DD) /* CRS control L */
|
||||
#define B43_NPHY_STRA_1U B43_PHY_N(0x1DE) /* STR address 1 U */
|
||||
#define B43_NPHY_STRA_2U B43_PHY_N(0x1DF) /* STR address 2 U */
|
||||
#define B43_NPHY_STRA_1L B43_PHY_N(0x1E0) /* STR address 1 L */
|
||||
#define B43_NPHY_STRA_2L B43_PHY_N(0x1E1) /* STR address 2 L */
|
||||
#define B43_NPHY_CRSCHECK1 B43_PHY_N(0x1E2) /* CRS check 1 */
|
||||
#define B43_NPHY_CRSCHECK2 B43_PHY_N(0x1E3) /* CRS check 2 */
|
||||
#define B43_NPHY_CRSCHECK3 B43_PHY_N(0x1E4) /* CRS check 3 */
|
||||
#define B43_NPHY_JMPSTP0 B43_PHY_N(0x1E5) /* Jump step 0 */
|
||||
#define B43_NPHY_JMPSTP1 B43_PHY_N(0x1E6) /* Jump step 1 */
|
||||
#define B43_NPHY_TXPCTL_CMD B43_PHY_N(0x1E7) /* TX power control command */
|
||||
#define B43_NPHY_TXPCTL_CMD_INIT 0x007F /* Init */
|
||||
#define B43_NPHY_TXPCTL_CMD_INIT_SHIFT 0
|
||||
#define B43_NPHY_TXPCTL_CMD_COEFF 0x2000 /* Power control coefficients */
|
||||
#define B43_NPHY_TXPCTL_CMD_HWPCTLEN 0x4000 /* Hardware TX power control enable */
|
||||
#define B43_NPHY_TXPCTL_CMD_PCTLEN 0x8000 /* TX power control enable */
|
||||
#define B43_NPHY_TXPCTL_N B43_PHY_N(0x1E8) /* TX power control N num */
|
||||
#define B43_NPHY_TXPCTL_N_TSSID 0x00FF /* N TSSI delay */
|
||||
#define B43_NPHY_TXPCTL_N_TSSID_SHIFT 0
|
||||
#define B43_NPHY_TXPCTL_N_NPTIL2 0x0700 /* N PT integer log2 */
|
||||
#define B43_NPHY_TXPCTL_N_NPTIL2_SHIFT 8
|
||||
#define B43_NPHY_TXPCTL_ITSSI B43_PHY_N(0x1E9) /* TX power control idle TSSI */
|
||||
#define B43_NPHY_TXPCTL_ITSSI_0 0x003F /* Idle TSSI 0 */
|
||||
#define B43_NPHY_TXPCTL_ITSSI_0_SHIFT 0
|
||||
#define B43_NPHY_TXPCTL_ITSSI_1 0x3F00 /* Idle TSSI 1 */
|
||||
#define B43_NPHY_TXPCTL_ITSSI_1_SHIFT 8
|
||||
#define B43_NPHY_TXPCTL_ITSSI_BINF 0x8000 /* Raw TSSI offset bin format */
|
||||
#define B43_NPHY_TXPCTL_TPWR B43_PHY_N(0x1EA) /* TX power control target power */
|
||||
#define B43_NPHY_TXPCTL_TPWR_0 0x00FF /* Power 0 */
|
||||
#define B43_NPHY_TXPCTL_TPWR_0_SHIFT 0
|
||||
#define B43_NPHY_TXPCTL_TPWR_1 0xFF00 /* Power 1 */
|
||||
#define B43_NPHY_TXPCTL_TPWR_1_SHIFT 8
|
||||
#define B43_NPHY_TXPCTL_BIDX B43_PHY_N(0x1EB) /* TX power control base index */
|
||||
#define B43_NPHY_TXPCTL_BIDX_0 0x007F /* uC base index 0 */
|
||||
#define B43_NPHY_TXPCTL_BIDX_0_SHIFT 0
|
||||
#define B43_NPHY_TXPCTL_BIDX_1 0x7F00 /* uC base index 1 */
|
||||
#define B43_NPHY_TXPCTL_BIDX_1_SHIFT 8
|
||||
#define B43_NPHY_TXPCTL_BIDX_LOAD 0x8000 /* Load base index */
|
||||
#define B43_NPHY_TXPCTL_PIDX B43_PHY_N(0x1EC) /* TX power control power index */
|
||||
#define B43_NPHY_TXPCTL_PIDX_0 0x007F /* uC power index 0 */
|
||||
#define B43_NPHY_TXPCTL_PIDX_0_SHIFT 0
|
||||
#define B43_NPHY_TXPCTL_PIDX_1 0x7F00 /* uC power index 1 */
|
||||
#define B43_NPHY_TXPCTL_PIDX_1_SHIFT 8
|
||||
#define B43_NPHY_C1_TXPCTL_STAT B43_PHY_N(0x1ED) /* Core 1 TX power control status */
|
||||
#define B43_NPHY_C2_TXPCTL_STAT B43_PHY_N(0x1EE) /* Core 2 TX power control status */
|
||||
#define B43_NPHY_TXPCTL_STAT_EST 0x00FF /* Estimated power */
|
||||
#define B43_NPHY_TXPCTL_STAT_EST_SHIFT 0
|
||||
#define B43_NPHY_TXPCTL_STAT_BIDX 0x7F00 /* Base index */
|
||||
#define B43_NPHY_TXPCTL_STAT_BIDX_SHIFT 8
|
||||
#define B43_NPHY_TXPCTL_STAT_ESTVALID 0x8000 /* Estimated power valid */
|
||||
#define B43_NPHY_SMALLSGS_LEN B43_PHY_N(0x1EF) /* Small sig gain settle length */
|
||||
#define B43_NPHY_PHYSTAT_GAIN0 B43_PHY_N(0x1F0) /* PHY stats gain info 0 */
|
||||
#define B43_NPHY_PHYSTAT_GAIN1 B43_PHY_N(0x1F1) /* PHY stats gain info 1 */
|
||||
#define B43_NPHY_PHYSTAT_FREQEST B43_PHY_N(0x1F2) /* PHY stats frequency estimate */
|
||||
#define B43_NPHY_PHYSTAT_ADVRET B43_PHY_N(0x1F3) /* PHY stats ADV retard */
|
||||
#define B43_NPHY_PHYLB_MODE B43_PHY_N(0x1F4) /* PHY loopback mode */
|
||||
#define B43_NPHY_TONE_MIDX20_1 B43_PHY_N(0x1F5) /* Tone map index 20/1 */
|
||||
#define B43_NPHY_TONE_MIDX20_2 B43_PHY_N(0x1F6) /* Tone map index 20/2 */
|
||||
#define B43_NPHY_TONE_MIDX20_3 B43_PHY_N(0x1F7) /* Tone map index 20/3 */
|
||||
#define B43_NPHY_TONE_MIDX40_1 B43_PHY_N(0x1F8) /* Tone map index 40/1 */
|
||||
#define B43_NPHY_TONE_MIDX40_2 B43_PHY_N(0x1F9) /* Tone map index 40/2 */
|
||||
#define B43_NPHY_TONE_MIDX40_3 B43_PHY_N(0x1FA) /* Tone map index 40/3 */
|
||||
#define B43_NPHY_TONE_MIDX40_4 B43_PHY_N(0x1FB) /* Tone map index 40/4 */
|
||||
#define B43_NPHY_PILTONE_MIDX1 B43_PHY_N(0x1FC) /* Pilot tone map index 1 */
|
||||
#define B43_NPHY_PILTONE_MIDX2 B43_PHY_N(0x1FD) /* Pilot tone map index 2 */
|
||||
#define B43_NPHY_PILTONE_MIDX3 B43_PHY_N(0x1FE) /* Pilot tone map index 3 */
|
||||
#define B43_NPHY_TXRIFS_FRDEL B43_PHY_N(0x1FF) /* TX RIFS frame delay */
|
||||
#define B43_NPHY_AFESEQ_RX2TX_PUD_40M B43_PHY_N(0x200) /* AFE seq rx2tx power up/down delay 40M */
|
||||
#define B43_NPHY_AFESEQ_TX2RX_PUD_40M B43_PHY_N(0x201) /* AFE seq tx2rx power up/down delay 40M */
|
||||
#define B43_NPHY_AFESEQ_RX2TX_PUD_20M B43_PHY_N(0x202) /* AFE seq rx2tx power up/down delay 20M */
|
||||
#define B43_NPHY_AFESEQ_TX2RX_PUD_20M B43_PHY_N(0x203) /* AFE seq tx2rx power up/down delay 20M */
|
||||
#define B43_NPHY_RX_SIGCTL B43_PHY_N(0x204) /* RX signal control */
|
||||
#define B43_NPHY_RXPIL_CYCNT0 B43_PHY_N(0x205) /* RX pilot cycle counter 0 */
|
||||
#define B43_NPHY_RXPIL_CYCNT1 B43_PHY_N(0x206) /* RX pilot cycle counter 1 */
|
||||
#define B43_NPHY_RXPIL_CYCNT2 B43_PHY_N(0x207) /* RX pilot cycle counter 2 */
|
||||
#define B43_NPHY_AFESEQ_RX2TX_PUD_10M B43_PHY_N(0x208) /* AFE seq rx2tx power up/down delay 10M */
|
||||
#define B43_NPHY_AFESEQ_TX2RX_PUD_10M B43_PHY_N(0x209) /* AFE seq tx2rx power up/down delay 10M */
|
||||
#define B43_NPHY_DSSSCCK_CRSEXTL B43_PHY_N(0x20A) /* DSSS/CCK CRS extension length */
|
||||
#define B43_NPHY_ML_LOGSS_RATSLOPE B43_PHY_N(0x20B) /* ML/logss ratio slope */
|
||||
#define B43_NPHY_RIFS_SRCTL B43_PHY_N(0x20C) /* RIFS search timeout length */
|
||||
#define B43_NPHY_TXREALFD B43_PHY_N(0x20D) /* TX real frame delay */
|
||||
#define B43_NPHY_HPANT_SWTHRES B43_PHY_N(0x20E) /* High power antenna switch threshold */
|
||||
#define B43_NPHY_EDCRS_ASSTHRES0 B43_PHY_N(0x210) /* ED CRS assert threshold 0 */
|
||||
#define B43_NPHY_EDCRS_ASSTHRES1 B43_PHY_N(0x211) /* ED CRS assert threshold 1 */
|
||||
#define B43_NPHY_EDCRS_DEASSTHRES0 B43_PHY_N(0x212) /* ED CRS deassert threshold 0 */
|
||||
#define B43_NPHY_EDCRS_DEASSTHRES1 B43_PHY_N(0x213) /* ED CRS deassert threshold 1 */
|
||||
#define B43_NPHY_STR_WTIME20U B43_PHY_N(0x214) /* STR wait time 20U */
|
||||
#define B43_NPHY_STR_WTIME20L B43_PHY_N(0x215) /* STR wait time 20L */
|
||||
#define B43_NPHY_TONE_MIDX657M B43_PHY_N(0x216) /* Tone map index 657M */
|
||||
#define B43_NPHY_HTSIGTONES B43_PHY_N(0x217) /* HT signal tones */
|
||||
#define B43_NPHY_RSSI1 B43_PHY_N(0x219) /* RSSI value 1 */
|
||||
#define B43_NPHY_RSSI2 B43_PHY_N(0x21A) /* RSSI value 2 */
|
||||
#define B43_NPHY_CHAN_ESTHANG B43_PHY_N(0x21D) /* Channel estimate hang */
|
||||
#define B43_NPHY_FINERX2_CGC B43_PHY_N(0x221) /* Fine RX 2 clock gate control */
|
||||
#define B43_NPHY_FINERX2_CGC_DECGC 0x0008 /* Decode gated clocks */
|
||||
#define B43_NPHY_TXPCTL_INIT B43_PHY_N(0x222) /* TX power controll init */
|
||||
#define B43_NPHY_TXPCTL_INIT_PIDXI1 0x00FF /* Power index init 1 */
|
||||
#define B43_NPHY_TXPCTL_INIT_PIDXI1_SHIFT 0
|
||||
|
||||
|
||||
|
||||
/* Broadcom 2055 radio registers */
|
||||
|
||||
#define B2055_GEN_SPARE 0x00 /* GEN spare */
|
||||
#define B2055_SP_PINPD 0x02 /* SP PIN PD */
|
||||
#define B2055_C1_SP_RSSI 0x03 /* SP RSSI Core 1 */
|
||||
#define B2055_C1_SP_PDMISC 0x04 /* SP PD MISC Core 1 */
|
||||
#define B2055_C2_SP_RSSI 0x05 /* SP RSSI Core 2 */
|
||||
#define B2055_C2_SP_PDMISC 0x06 /* SP PD MISC Core 2 */
|
||||
#define B2055_C1_SP_RXGC1 0x07 /* SP RX GC1 Core 1 */
|
||||
#define B2055_C1_SP_RXGC2 0x08 /* SP RX GC2 Core 1 */
|
||||
#define B2055_C2_SP_RXGC1 0x09 /* SP RX GC1 Core 2 */
|
||||
#define B2055_C2_SP_RXGC2 0x0A /* SP RX GC2 Core 2 */
|
||||
#define B2055_C1_SP_LPFBWSEL 0x0B /* SP LPF BW select Core 1 */
|
||||
#define B2055_C2_SP_LPFBWSEL 0x0C /* SP LPF BW select Core 2 */
|
||||
#define B2055_C1_SP_TXGC1 0x0D /* SP TX GC1 Core 1 */
|
||||
#define B2055_C1_SP_TXGC2 0x0E /* SP TX GC2 Core 1 */
|
||||
#define B2055_C2_SP_TXGC1 0x0F /* SP TX GC1 Core 2 */
|
||||
#define B2055_C2_SP_TXGC2 0x10 /* SP TX GC2 Core 2 */
|
||||
#define B2055_MASTER1 0x11 /* Master control 1 */
|
||||
#define B2055_MASTER2 0x12 /* Master control 2 */
|
||||
#define B2055_PD_LGEN 0x13 /* PD LGEN */
|
||||
#define B2055_PD_PLLTS 0x14 /* PD PLL TS */
|
||||
#define B2055_C1_PD_LGBUF 0x15 /* PD Core 1 LGBUF */
|
||||
#define B2055_C1_PD_TX 0x16 /* PD Core 1 TX */
|
||||
#define B2055_C1_PD_RXTX 0x17 /* PD Core 1 RXTX */
|
||||
#define B2055_C1_PD_RSSIMISC 0x18 /* PD Core 1 RSSI MISC */
|
||||
#define B2055_C2_PD_LGBUF 0x19 /* PD Core 2 LGBUF */
|
||||
#define B2055_C2_PD_TX 0x1A /* PD Core 2 TX */
|
||||
#define B2055_C2_PD_RXTX 0x1B /* PD Core 2 RXTX */
|
||||
#define B2055_C2_PD_RSSIMISC 0x1C /* PD Core 2 RSSI MISC */
|
||||
#define B2055_PWRDET_LGEN 0x1D /* PWRDET LGEN */
|
||||
#define B2055_C1_PWRDET_LGBUF 0x1E /* PWRDET LGBUF Core 1 */
|
||||
#define B2055_C1_PWRDET_RXTX 0x1F /* PWRDET RXTX Core 1 */
|
||||
#define B2055_C2_PWRDET_LGBUF 0x20 /* PWRDET LGBUF Core 2 */
|
||||
#define B2055_C2_PWRDET_RXTX 0x21 /* PWRDET RXTX Core 2 */
|
||||
#define B2055_RRCCAL_CS 0x22 /* RRCCAL Control spare */
|
||||
#define B2055_RRCCAL_NOPTSEL 0x23 /* RRCCAL N OPT SEL */
|
||||
#define B2055_CAL_MISC 0x24 /* CAL MISC */
|
||||
#define B2055_CAL_COUT 0x25 /* CAL Counter out */
|
||||
#define B2055_CAL_COUT2 0x26 /* CAL Counter out 2 */
|
||||
#define B2055_CAL_CVARCTL 0x27 /* CAL CVAR Control */
|
||||
#define B2055_CAL_RVARCTL 0x28 /* CAL RVAR Control */
|
||||
#define B2055_CAL_LPOCTL 0x29 /* CAL LPO Control */
|
||||
#define B2055_CAL_TS 0x2A /* CAL TS */
|
||||
#define B2055_CAL_RCCALRTS 0x2B /* CAL RCCAL READ TS */
|
||||
#define B2055_CAL_RCALRTS 0x2C /* CAL RCAL READ TS */
|
||||
#define B2055_PADDRV 0x2D /* PAD driver */
|
||||
#define B2055_XOCTL1 0x2E /* XO Control 1 */
|
||||
#define B2055_XOCTL2 0x2F /* XO Control 2 */
|
||||
#define B2055_XOREGUL 0x30 /* XO Regulator */
|
||||
#define B2055_XOMISC 0x31 /* XO misc */
|
||||
#define B2055_PLL_LFC1 0x32 /* PLL LF C1 */
|
||||
#define B2055_PLL_CALVTH 0x33 /* PLL CAL VTH */
|
||||
#define B2055_PLL_LFC2 0x34 /* PLL LF C2 */
|
||||
#define B2055_PLL_REF 0x35 /* PLL reference */
|
||||
#define B2055_PLL_LFR1 0x36 /* PLL LF R1 */
|
||||
#define B2055_PLL_PFDCP 0x37 /* PLL PFD CP */
|
||||
#define B2055_PLL_IDAC_CPOPAMP 0x38 /* PLL IDAC CPOPAMP */
|
||||
#define B2055_PLL_CPREG 0x39 /* PLL CP Regulator */
|
||||
#define B2055_PLL_RCAL 0x3A /* PLL RCAL */
|
||||
#define B2055_RF_PLLMOD0 0x3B /* RF PLL MOD0 */
|
||||
#define B2055_RF_PLLMOD1 0x3C /* RF PLL MOD1 */
|
||||
#define B2055_RF_MMDIDAC1 0x3D /* RF MMD IDAC 1 */
|
||||
#define B2055_RF_MMDIDAC0 0x3E /* RF MMD IDAC 0 */
|
||||
#define B2055_RF_MMDSP 0x3F /* RF MMD spare */
|
||||
#define B2055_VCO_CAL1 0x40 /* VCO cal 1 */
|
||||
#define B2055_VCO_CAL2 0x41 /* VCO cal 2 */
|
||||
#define B2055_VCO_CAL3 0x42 /* VCO cal 3 */
|
||||
#define B2055_VCO_CAL4 0x43 /* VCO cal 4 */
|
||||
#define B2055_VCO_CAL5 0x44 /* VCO cal 5 */
|
||||
#define B2055_VCO_CAL6 0x45 /* VCO cal 6 */
|
||||
#define B2055_VCO_CAL7 0x46 /* VCO cal 7 */
|
||||
#define B2055_VCO_CAL8 0x47 /* VCO cal 8 */
|
||||
#define B2055_VCO_CAL9 0x48 /* VCO cal 9 */
|
||||
#define B2055_VCO_CAL10 0x49 /* VCO cal 10 */
|
||||
#define B2055_VCO_CAL11 0x4A /* VCO cal 11 */
|
||||
#define B2055_VCO_CAL12 0x4B /* VCO cal 12 */
|
||||
#define B2055_VCO_CAL13 0x4C /* VCO cal 13 */
|
||||
#define B2055_VCO_CAL14 0x4D /* VCO cal 14 */
|
||||
#define B2055_VCO_CAL15 0x4E /* VCO cal 15 */
|
||||
#define B2055_VCO_CAL16 0x4F /* VCO cal 16 */
|
||||
#define B2055_VCO_KVCO 0x50 /* VCO KVCO */
|
||||
#define B2055_VCO_CAPTAIL 0x51 /* VCO CAP TAIL */
|
||||
#define B2055_VCO_IDACVCO 0x52 /* VCO IDAC VCO */
|
||||
#define B2055_VCO_REG 0x53 /* VCO Regulator */
|
||||
#define B2055_PLL_RFVTH 0x54 /* PLL RF VTH */
|
||||
#define B2055_LGBUF_CENBUF 0x55 /* LGBUF CEN BUF */
|
||||
#define B2055_LGEN_TUNE1 0x56 /* LGEN tune 1 */
|
||||
#define B2055_LGEN_TUNE2 0x57 /* LGEN tune 2 */
|
||||
#define B2055_LGEN_IDAC1 0x58 /* LGEN IDAC 1 */
|
||||
#define B2055_LGEN_IDAC2 0x59 /* LGEN IDAC 2 */
|
||||
#define B2055_LGEN_BIASC 0x5A /* LGEN BIAS counter */
|
||||
#define B2055_LGEN_BIASIDAC 0x5B /* LGEN BIAS IDAC */
|
||||
#define B2055_LGEN_RCAL 0x5C /* LGEN RCAL */
|
||||
#define B2055_LGEN_DIV 0x5D /* LGEN div */
|
||||
#define B2055_LGEN_SPARE2 0x5E /* LGEN spare 2 */
|
||||
#define B2055_C1_LGBUF_ATUNE 0x5F /* Core 1 LGBUF A tune */
|
||||
#define B2055_C1_LGBUF_GTUNE 0x60 /* Core 1 LGBUF G tune */
|
||||
#define B2055_C1_LGBUF_DIV 0x61 /* Core 1 LGBUF div */
|
||||
#define B2055_C1_LGBUF_AIDAC 0x62 /* Core 1 LGBUF A IDAC */
|
||||
#define B2055_C1_LGBUF_GIDAC 0x63 /* Core 1 LGBUF G IDAC */
|
||||
#define B2055_C1_LGBUF_IDACFO 0x64 /* Core 1 LGBUF IDAC filter override */
|
||||
#define B2055_C1_LGBUF_SPARE 0x65 /* Core 1 LGBUF spare */
|
||||
#define B2055_C1_RX_RFSPC1 0x66 /* Core 1 RX RF SPC1 */
|
||||
#define B2055_C1_RX_RFR1 0x67 /* Core 1 RX RF reg 1 */
|
||||
#define B2055_C1_RX_RFR2 0x68 /* Core 1 RX RF reg 2 */
|
||||
#define B2055_C1_RX_RFRCAL 0x69 /* Core 1 RX RF RCAL */
|
||||
#define B2055_C1_RX_BB_BLCMP 0x6A /* Core 1 RX Baseband BUFI LPF CMP */
|
||||
#define B2055_C1_RX_BB_LPF 0x6B /* Core 1 RX Baseband LPF */
|
||||
#define B2055_C1_RX_BB_MIDACHP 0x6C /* Core 1 RX Baseband MIDAC High-pass */
|
||||
#define B2055_C1_RX_BB_VGA1IDAC 0x6D /* Core 1 RX Baseband VGA1 IDAC */
|
||||
#define B2055_C1_RX_BB_VGA2IDAC 0x6E /* Core 1 RX Baseband VGA2 IDAC */
|
||||
#define B2055_C1_RX_BB_VGA3IDAC 0x6F /* Core 1 RX Baseband VGA3 IDAC */
|
||||
#define B2055_C1_RX_BB_BUFOCTL 0x70 /* Core 1 RX Baseband BUFO Control */
|
||||
#define B2055_C1_RX_BB_RCCALCTL 0x71 /* Core 1 RX Baseband RCCAL Control */
|
||||
#define B2055_C1_RX_BB_RSSICTL1 0x72 /* Core 1 RX Baseband RSSI Control 1 */
|
||||
#define B2055_C1_RX_BB_RSSICTL2 0x73 /* Core 1 RX Baseband RSSI Control 2 */
|
||||
#define B2055_C1_RX_BB_RSSICTL3 0x74 /* Core 1 RX Baseband RSSI Control 3 */
|
||||
#define B2055_C1_RX_BB_RSSICTL4 0x75 /* Core 1 RX Baseband RSSI Control 4 */
|
||||
#define B2055_C1_RX_BB_RSSICTL5 0x76 /* Core 1 RX Baseband RSSI Control 5 */
|
||||
#define B2055_C1_RX_BB_REG 0x77 /* Core 1 RX Baseband Regulator */
|
||||
#define B2055_C1_RX_BB_SPARE1 0x78 /* Core 1 RX Baseband spare 1 */
|
||||
#define B2055_C1_RX_TXBBRCAL 0x79 /* Core 1 RX TX BB RCAL */
|
||||
#define B2055_C1_TX_RF_SPGA 0x7A /* Core 1 TX RF SGM PGA */
|
||||
#define B2055_C1_TX_RF_SPAD 0x7B /* Core 1 TX RF SGM PAD */
|
||||
#define B2055_C1_TX_RF_CNTPGA1 0x7C /* Core 1 TX RF counter PGA 1 */
|
||||
#define B2055_C1_TX_RF_CNTPAD1 0x7D /* Core 1 TX RF counter PAD 1 */
|
||||
#define B2055_C1_TX_RF_PGAIDAC 0x7E /* Core 1 TX RF PGA IDAC */
|
||||
#define B2055_C1_TX_PGAPADTN 0x7F /* Core 1 TX PGA PAD TN */
|
||||
#define B2055_C1_TX_PADIDAC1 0x80 /* Core 1 TX PAD IDAC 1 */
|
||||
#define B2055_C1_TX_PADIDAC2 0x81 /* Core 1 TX PAD IDAC 2 */
|
||||
#define B2055_C1_TX_MXBGTRIM 0x82 /* Core 1 TX MX B/G TRIM */
|
||||
#define B2055_C1_TX_RF_RCAL 0x83 /* Core 1 TX RF RCAL */
|
||||
#define B2055_C1_TX_RF_PADTSSI1 0x84 /* Core 1 TX RF PAD TSSI1 */
|
||||
#define B2055_C1_TX_RF_PADTSSI2 0x85 /* Core 1 TX RF PAD TSSI2 */
|
||||
#define B2055_C1_TX_RF_SPARE 0x86 /* Core 1 TX RF spare */
|
||||
#define B2055_C1_TX_RF_IQCAL1 0x87 /* Core 1 TX RF I/Q CAL 1 */
|
||||
#define B2055_C1_TX_RF_IQCAL2 0x88 /* Core 1 TX RF I/Q CAL 2 */
|
||||
#define B2055_C1_TXBB_RCCAL 0x89 /* Core 1 TXBB RC CAL Control */
|
||||
#define B2055_C1_TXBB_LPF1 0x8A /* Core 1 TXBB LPF 1 */
|
||||
#define B2055_C1_TX_VOSCNCL 0x8B /* Core 1 TX VOS CNCL */
|
||||
#define B2055_C1_TX_LPF_MXGMIDAC 0x8C /* Core 1 TX LPF MXGM IDAC */
|
||||
#define B2055_C1_TX_BB_MXGM 0x8D /* Core 1 TX BB MXGM */
|
||||
#define B2055_C2_LGBUF_ATUNE 0x8E /* Core 2 LGBUF A tune */
|
||||
#define B2055_C2_LGBUF_GTUNE 0x8F /* Core 2 LGBUF G tune */
|
||||
#define B2055_C2_LGBUF_DIV 0x90 /* Core 2 LGBUF div */
|
||||
#define B2055_C2_LGBUF_AIDAC 0x91 /* Core 2 LGBUF A IDAC */
|
||||
#define B2055_C2_LGBUF_GIDAC 0x92 /* Core 2 LGBUF G IDAC */
|
||||
#define B2055_C2_LGBUF_IDACFO 0x93 /* Core 2 LGBUF IDAC filter override */
|
||||
#define B2055_C2_LGBUF_SPARE 0x94 /* Core 2 LGBUF spare */
|
||||
#define B2055_C2_RX_RFSPC1 0x95 /* Core 2 RX RF SPC1 */
|
||||
#define B2055_C2_RX_RFR1 0x96 /* Core 2 RX RF reg 1 */
|
||||
#define B2055_C2_RX_RFR2 0x97 /* Core 2 RX RF reg 2 */
|
||||
#define B2055_C2_RX_RFRCAL 0x98 /* Core 2 RX RF RCAL */
|
||||
#define B2055_C2_RX_BB_BLCMP 0x99 /* Core 2 RX Baseband BUFI LPF CMP */
|
||||
#define B2055_C2_RX_BB_LPF 0x9A /* Core 2 RX Baseband LPF */
|
||||
#define B2055_C2_RX_BB_MIDACHP 0x9B /* Core 2 RX Baseband MIDAC High-pass */
|
||||
#define B2055_C2_RX_BB_VGA1IDAC 0x9C /* Core 2 RX Baseband VGA1 IDAC */
|
||||
#define B2055_C2_RX_BB_VGA2IDAC 0x9D /* Core 2 RX Baseband VGA2 IDAC */
|
||||
#define B2055_C2_RX_BB_VGA3IDAC 0x9E /* Core 2 RX Baseband VGA3 IDAC */
|
||||
#define B2055_C2_RX_BB_BUFOCTL 0x9F /* Core 2 RX Baseband BUFO Control */
|
||||
#define B2055_C2_RX_BB_RCCALCTL 0xA0 /* Core 2 RX Baseband RCCAL Control */
|
||||
#define B2055_C2_RX_BB_RSSICTL1 0xA1 /* Core 2 RX Baseband RSSI Control 1 */
|
||||
#define B2055_C2_RX_BB_RSSICTL2 0xA2 /* Core 2 RX Baseband RSSI Control 2 */
|
||||
#define B2055_C2_RX_BB_RSSICTL3 0xA3 /* Core 2 RX Baseband RSSI Control 3 */
|
||||
#define B2055_C2_RX_BB_RSSICTL4 0xA4 /* Core 2 RX Baseband RSSI Control 4 */
|
||||
#define B2055_C2_RX_BB_RSSICTL5 0xA5 /* Core 2 RX Baseband RSSI Control 5 */
|
||||
#define B2055_C2_RX_BB_REG 0xA6 /* Core 2 RX Baseband Regulator */
|
||||
#define B2055_C2_RX_BB_SPARE1 0xA7 /* Core 2 RX Baseband spare 1 */
|
||||
#define B2055_C2_RX_TXBBRCAL 0xA8 /* Core 2 RX TX BB RCAL */
|
||||
#define B2055_C2_TX_RF_SPGA 0xA9 /* Core 2 TX RF SGM PGA */
|
||||
#define B2055_C2_TX_RF_SPAD 0xAA /* Core 2 TX RF SGM PAD */
|
||||
#define B2055_C2_TX_RF_CNTPGA1 0xAB /* Core 2 TX RF counter PGA 1 */
|
||||
#define B2055_C2_TX_RF_CNTPAD1 0xAC /* Core 2 TX RF counter PAD 1 */
|
||||
#define B2055_C2_TX_RF_PGAIDAC 0xAD /* Core 2 TX RF PGA IDAC */
|
||||
#define B2055_C2_TX_PGAPADTN 0xAE /* Core 2 TX PGA PAD TN */
|
||||
#define B2055_C2_TX_PADIDAC1 0xAF /* Core 2 TX PAD IDAC 1 */
|
||||
#define B2055_C2_TX_PADIDAC2 0xB0 /* Core 2 TX PAD IDAC 2 */
|
||||
#define B2055_C2_TX_MXBGTRIM 0xB1 /* Core 2 TX MX B/G TRIM */
|
||||
#define B2055_C2_TX_RF_RCAL 0xB2 /* Core 2 TX RF RCAL */
|
||||
#define B2055_C2_TX_RF_PADTSSI1 0xB3 /* Core 2 TX RF PAD TSSI1 */
|
||||
#define B2055_C2_TX_RF_PADTSSI2 0xB4 /* Core 2 TX RF PAD TSSI2 */
|
||||
#define B2055_C2_TX_RF_SPARE 0xB5 /* Core 2 TX RF spare */
|
||||
#define B2055_C2_TX_RF_IQCAL1 0xB6 /* Core 2 TX RF I/Q CAL 1 */
|
||||
#define B2055_C2_TX_RF_IQCAL2 0xB7 /* Core 2 TX RF I/Q CAL 2 */
|
||||
#define B2055_C2_TXBB_RCCAL 0xB8 /* Core 2 TXBB RC CAL Control */
|
||||
#define B2055_C2_TXBB_LPF1 0xB9 /* Core 2 TXBB LPF 1 */
|
||||
#define B2055_C2_TX_VOSCNCL 0xBA /* Core 2 TX VOS CNCL */
|
||||
#define B2055_C2_TX_LPF_MXGMIDAC 0xBB /* Core 2 TX LPF MXGM IDAC */
|
||||
#define B2055_C2_TX_BB_MXGM 0xBC /* Core 2 TX BB MXGM */
|
||||
#define B2055_PRG_GCHP21 0xBD /* PRG GC HPVGA23 21 */
|
||||
#define B2055_PRG_GCHP22 0xBE /* PRG GC HPVGA23 22 */
|
||||
#define B2055_PRG_GCHP23 0xBF /* PRG GC HPVGA23 23 */
|
||||
#define B2055_PRG_GCHP24 0xC0 /* PRG GC HPVGA23 24 */
|
||||
#define B2055_PRG_GCHP25 0xC1 /* PRG GC HPVGA23 25 */
|
||||
#define B2055_PRG_GCHP26 0xC2 /* PRG GC HPVGA23 26 */
|
||||
#define B2055_PRG_GCHP27 0xC3 /* PRG GC HPVGA23 27 */
|
||||
#define B2055_PRG_GCHP28 0xC4 /* PRG GC HPVGA23 28 */
|
||||
#define B2055_PRG_GCHP29 0xC5 /* PRG GC HPVGA23 29 */
|
||||
#define B2055_PRG_GCHP30 0xC6 /* PRG GC HPVGA23 30 */
|
||||
#define B2055_C1_LNA_GAINBST 0xCD /* Core 1 LNA GAINBST */
|
||||
#define B2055_C1_B0NB_RSSIVCM 0xD2 /* Core 1 B0 narrow-band RSSI VCM */
|
||||
#define B2055_C1_GENSPARE2 0xD6 /* Core 1 GEN spare 2 */
|
||||
#define B2055_C2_LNA_GAINBST 0xD9 /* Core 2 LNA GAINBST */
|
||||
#define B2055_C2_B0NB_RSSIVCM 0xDE /* Core 2 B0 narrow-band RSSI VCM */
|
||||
#define B2055_C2_GENSPARE2 0xE2 /* Core 2 GEN spare 2 */
|
||||
|
||||
|
||||
|
||||
struct b43_wldev;
|
||||
|
||||
int b43_phy_initn(struct b43_wldev *dev);
|
||||
|
||||
void b43_nphy_radio_turn_on(struct b43_wldev *dev);
|
||||
void b43_nphy_radio_turn_off(struct b43_wldev *dev);
|
||||
|
||||
int b43_nphy_selectchannel(struct b43_wldev *dev, u8 channel);
|
||||
|
||||
void b43_nphy_xmitpower(struct b43_wldev *dev);
|
||||
void b43_nphy_set_rxantenna(struct b43_wldev *dev, int antenna);
|
||||
|
||||
#endif /* B43_NPHY_H_ */
|
||||
@@ -65,12 +65,12 @@ static int __devinit b43_pcmcia_probe(struct pcmcia_device *dev)
|
||||
tuple_t tuple;
|
||||
cisparse_t parse;
|
||||
int err = -ENOMEM;
|
||||
int res;
|
||||
int res = 0;
|
||||
unsigned char buf[64];
|
||||
|
||||
ssb = kzalloc(sizeof(*ssb), GFP_KERNEL);
|
||||
if (!ssb)
|
||||
goto out;
|
||||
goto out_error;
|
||||
|
||||
err = -ENODEV;
|
||||
tuple.DesiredTuple = CISTPL_CONFIG;
|
||||
@@ -96,10 +96,12 @@ static int __devinit b43_pcmcia_probe(struct pcmcia_device *dev)
|
||||
dev->io.NumPorts2 = 0;
|
||||
dev->io.Attributes2 = 0;
|
||||
|
||||
win.Attributes = WIN_MEMORY_TYPE_CM | WIN_ENABLE | WIN_USE_WAIT;
|
||||
win.Attributes = WIN_ADDR_SPACE_MEM | WIN_MEMORY_TYPE_CM |
|
||||
WIN_ENABLE | WIN_DATA_WIDTH_16 |
|
||||
WIN_USE_WAIT;
|
||||
win.Base = 0;
|
||||
win.Size = SSB_CORE_SIZE;
|
||||
win.AccessSpeed = 1000;
|
||||
win.AccessSpeed = 250;
|
||||
res = pcmcia_request_window(&dev, &win, &dev->win);
|
||||
if (res != CS_SUCCESS)
|
||||
goto err_kfree_ssb;
|
||||
@@ -108,21 +110,34 @@ static int __devinit b43_pcmcia_probe(struct pcmcia_device *dev)
|
||||
mem.Page = 0;
|
||||
res = pcmcia_map_mem_page(dev->win, &mem);
|
||||
if (res != CS_SUCCESS)
|
||||
goto err_kfree_ssb;
|
||||
goto err_disable;
|
||||
|
||||
dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING | IRQ_FIRST_SHARED;
|
||||
dev->irq.IRQInfo1 = IRQ_LEVEL_ID | IRQ_SHARE_ID;
|
||||
dev->irq.Handler = NULL; /* The handler is registered later. */
|
||||
dev->irq.Instance = NULL;
|
||||
res = pcmcia_request_irq(dev, &dev->irq);
|
||||
if (res != CS_SUCCESS)
|
||||
goto err_disable;
|
||||
|
||||
res = pcmcia_request_configuration(dev, &dev->conf);
|
||||
if (res != CS_SUCCESS)
|
||||
goto err_disable;
|
||||
|
||||
err = ssb_bus_pcmciabus_register(ssb, dev, win.Base);
|
||||
if (err)
|
||||
goto err_disable;
|
||||
dev->priv = ssb;
|
||||
|
||||
out:
|
||||
return err;
|
||||
err_disable:
|
||||
return 0;
|
||||
|
||||
err_disable:
|
||||
pcmcia_disable_device(dev);
|
||||
err_kfree_ssb:
|
||||
err_kfree_ssb:
|
||||
kfree(ssb);
|
||||
out_error:
|
||||
printk(KERN_ERR "b43-pcmcia: Initialization failed (%d, %d)\n",
|
||||
res, err);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -131,22 +146,21 @@ static void __devexit b43_pcmcia_remove(struct pcmcia_device *dev)
|
||||
struct ssb_bus *ssb = dev->priv;
|
||||
|
||||
ssb_bus_unregister(ssb);
|
||||
pcmcia_release_window(dev->win);
|
||||
pcmcia_disable_device(dev);
|
||||
kfree(ssb);
|
||||
dev->priv = NULL;
|
||||
}
|
||||
|
||||
static struct pcmcia_driver b43_pcmcia_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.drv = {
|
||||
.name = "b43-pcmcia",
|
||||
},
|
||||
.id_table = b43_pcmcia_tbl,
|
||||
.probe = b43_pcmcia_probe,
|
||||
.remove = b43_pcmcia_remove,
|
||||
.suspend = b43_pcmcia_suspend,
|
||||
.resume = b43_pcmcia_resume,
|
||||
.owner = THIS_MODULE,
|
||||
.drv = {
|
||||
.name = "b43-pcmcia",
|
||||
},
|
||||
.id_table = b43_pcmcia_tbl,
|
||||
.probe = b43_pcmcia_probe,
|
||||
.remove = __devexit_p(b43_pcmcia_remove),
|
||||
.suspend = b43_pcmcia_suspend,
|
||||
.resume = b43_pcmcia_resume,
|
||||
};
|
||||
|
||||
int b43_pcmcia_init(void)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -9,14 +9,21 @@ struct b43_phy;
|
||||
/*** PHY Registers ***/
|
||||
|
||||
/* Routing */
|
||||
#define B43_PHYROUTE_OFDM_GPHY 0x400
|
||||
#define B43_PHYROUTE_EXT_GPHY 0x800
|
||||
#define B43_PHYROUTE 0x0C00 /* PHY register routing bits mask */
|
||||
#define B43_PHYROUTE_BASE 0x0000 /* Base registers */
|
||||
#define B43_PHYROUTE_OFDM_GPHY 0x0400 /* OFDM register routing for G-PHYs */
|
||||
#define B43_PHYROUTE_EXT_GPHY 0x0800 /* Extended G-PHY registers */
|
||||
#define B43_PHYROUTE_N_BMODE 0x0C00 /* N-PHY BMODE registers */
|
||||
|
||||
/* Base registers. */
|
||||
#define B43_PHY_BASE(reg) (reg)
|
||||
/* OFDM (A) registers of a G-PHY */
|
||||
/* CCK (B-PHY) registers. */
|
||||
#define B43_PHY_CCK(reg) ((reg) | B43_PHYROUTE_BASE)
|
||||
/* N-PHY registers. */
|
||||
#define B43_PHY_N(reg) ((reg) | B43_PHYROUTE_BASE)
|
||||
/* N-PHY BMODE registers. */
|
||||
#define B43_PHY_N_BMODE(reg) ((reg) | B43_PHYROUTE_N_BMODE)
|
||||
/* OFDM (A-PHY) registers. */
|
||||
#define B43_PHY_OFDM(reg) ((reg) | B43_PHYROUTE_OFDM_GPHY)
|
||||
/* Extended G-PHY registers */
|
||||
/* Extended G-PHY registers. */
|
||||
#define B43_PHY_EXTG(reg) ((reg) | B43_PHYROUTE_EXT_GPHY)
|
||||
|
||||
/* OFDM (A) PHY Registers */
|
||||
@@ -25,10 +32,13 @@ struct b43_phy;
|
||||
#define B43_PHY_BBANDCFG_RXANT 0x180 /* RX Antenna selection */
|
||||
#define B43_PHY_BBANDCFG_RXANT_SHIFT 7
|
||||
#define B43_PHY_PWRDOWN B43_PHY_OFDM(0x03) /* Powerdown */
|
||||
#define B43_PHY_CRSTHRES1 B43_PHY_OFDM(0x06) /* CRS Threshold 1 */
|
||||
#define B43_PHY_CRSTHRES1_R1 B43_PHY_OFDM(0x06) /* CRS Threshold 1 (phy.rev 1 only) */
|
||||
#define B43_PHY_LNAHPFCTL B43_PHY_OFDM(0x1C) /* LNA/HPF control */
|
||||
#define B43_PHY_LPFGAINCTL B43_PHY_OFDM(0x20) /* LPF Gain control */
|
||||
#define B43_PHY_ADIVRELATED B43_PHY_OFDM(0x27) /* FIXME rename */
|
||||
#define B43_PHY_CRS0 B43_PHY_OFDM(0x29)
|
||||
#define B43_PHY_CRS0_EN 0x4000
|
||||
#define B43_PHY_PEAK_COUNT B43_PHY_OFDM(0x30)
|
||||
#define B43_PHY_ANTDWELL B43_PHY_OFDM(0x2B) /* Antenna dwell */
|
||||
#define B43_PHY_ANTDWELL_AUTODIV1 0x0100 /* Automatic RX diversity start antenna */
|
||||
#define B43_PHY_ENCORE B43_PHY_OFDM(0x49) /* "Encore" (RangeMax / BroadRange) */
|
||||
@@ -37,6 +47,7 @@ struct b43_phy;
|
||||
#define B43_PHY_OFDM61 B43_PHY_OFDM(0x61) /* FIXME rename */
|
||||
#define B43_PHY_OFDM61_10 0x0010 /* FIXME rename */
|
||||
#define B43_PHY_IQBAL B43_PHY_OFDM(0x69) /* I/Q balance */
|
||||
#define B43_PHY_BBTXDC_BIAS B43_PHY_OFDM(0x6B) /* Baseband TX DC bias */
|
||||
#define B43_PHY_OTABLECTL B43_PHY_OFDM(0x72) /* OFDM table control (see below) */
|
||||
#define B43_PHY_OTABLEOFF 0x03FF /* OFDM table offset (see below) */
|
||||
#define B43_PHY_OTABLENR 0xFC00 /* OFDM table number (see below) */
|
||||
@@ -44,6 +55,9 @@ struct b43_phy;
|
||||
#define B43_PHY_OTABLEI B43_PHY_OFDM(0x73) /* OFDM table data I */
|
||||
#define B43_PHY_OTABLEQ B43_PHY_OFDM(0x74) /* OFDM table data Q */
|
||||
#define B43_PHY_HPWR_TSSICTL B43_PHY_OFDM(0x78) /* Hardware power TSSI control */
|
||||
#define B43_PHY_ADCCTL B43_PHY_OFDM(0x7A) /* ADC control */
|
||||
#define B43_PHY_IDLE_TSSI B43_PHY_OFDM(0x7B)
|
||||
#define B43_PHY_A_TEMP_SENSE B43_PHY_OFDM(0x7C) /* A PHY temperature sense */
|
||||
#define B43_PHY_NRSSITHRES B43_PHY_OFDM(0x8A) /* NRSSI threshold */
|
||||
#define B43_PHY_ANTWRSETT B43_PHY_OFDM(0x8C) /* Antenna WR settle */
|
||||
#define B43_PHY_ANTWRSETT_ARXDIV 0x2000 /* Automatic RX diversity enabled */
|
||||
@@ -54,33 +68,35 @@ struct b43_phy;
|
||||
#define B43_PHY_N1N2GAIN B43_PHY_OFDM(0xA2)
|
||||
#define B43_PHY_CLIPTHRES B43_PHY_OFDM(0xA3)
|
||||
#define B43_PHY_CLIPN1P2THRES B43_PHY_OFDM(0xA4)
|
||||
#define B43_PHY_CCKSHIFTBITS_WA B43_PHY_OFDM(0xA5) /* CCK shiftbits workaround, FIXME rename */
|
||||
#define B43_PHY_CCKSHIFTBITS B43_PHY_OFDM(0xA7) /* FIXME rename */
|
||||
#define B43_PHY_DIVSRCHIDX B43_PHY_OFDM(0xA8) /* Divider search gain/index */
|
||||
#define B43_PHY_CLIPP2THRES B43_PHY_OFDM(0xA9)
|
||||
#define B43_PHY_CLIPP3THRES B43_PHY_OFDM(0xAA)
|
||||
#define B43_PHY_DIVP1P2GAIN B43_PHY_OFDM(0xAB)
|
||||
#define B43_PHY_DIVSRCHGAINBACK B43_PHY_OFDM(0xAD) /* Divider search gain back */
|
||||
#define B43_PHY_DIVSRCHGAINCHNG B43_PHY_OFDM(0xAE) /* Divider search gain change */
|
||||
#define B43_PHY_CRSTHRES1_R1 B43_PHY_OFDM(0xC0) /* CRS Threshold 1 (rev 1 only) */
|
||||
#define B43_PHY_CRSTHRES2_R1 B43_PHY_OFDM(0xC1) /* CRS Threshold 2 (rev 1 only) */
|
||||
#define B43_PHY_CRSTHRES1 B43_PHY_OFDM(0xC0) /* CRS Threshold 1 (phy.rev >= 2 only) */
|
||||
#define B43_PHY_CRSTHRES2 B43_PHY_OFDM(0xC1) /* CRS Threshold 2 (phy.rev >= 2 only) */
|
||||
#define B43_PHY_TSSIP_LTBASE B43_PHY_OFDM(0x380) /* TSSI power lookup table base */
|
||||
#define B43_PHY_DC_LTBASE B43_PHY_OFDM(0x3A0) /* DC lookup table base */
|
||||
#define B43_PHY_GAIN_LTBASE B43_PHY_OFDM(0x3C0) /* Gain lookup table base */
|
||||
|
||||
/* CCK (B) PHY Registers */
|
||||
#define B43_PHY_VERSION_CCK B43_PHY_BASE(0x00) /* Versioning register for B-PHY */
|
||||
#define B43_PHY_CCKBBANDCFG B43_PHY_BASE(0x01) /* Contains antenna 0/1 control bit */
|
||||
#define B43_PHY_PGACTL B43_PHY_BASE(0x15) /* PGA control */
|
||||
#define B43_PHY_VERSION_CCK B43_PHY_CCK(0x00) /* Versioning register for B-PHY */
|
||||
#define B43_PHY_CCKBBANDCFG B43_PHY_CCK(0x01) /* Contains antenna 0/1 control bit */
|
||||
#define B43_PHY_PGACTL B43_PHY_CCK(0x15) /* PGA control */
|
||||
#define B43_PHY_PGACTL_LPF 0x1000 /* Low pass filter (?) */
|
||||
#define B43_PHY_PGACTL_LOWBANDW 0x0040 /* Low bandwidth flag */
|
||||
#define B43_PHY_PGACTL_UNKNOWN 0xEFA0
|
||||
#define B43_PHY_FBCTL1 B43_PHY_BASE(0x18) /* Frequency bandwidth control 1 */
|
||||
#define B43_PHY_ITSSI B43_PHY_BASE(0x29) /* Idle TSSI */
|
||||
#define B43_PHY_LO_LEAKAGE B43_PHY_BASE(0x2D) /* Measured LO leakage */
|
||||
#define B43_PHY_ENERGY B43_PHY_BASE(0x33) /* Energy */
|
||||
#define B43_PHY_SYNCCTL B43_PHY_BASE(0x35)
|
||||
#define B43_PHY_FBCTL2 B43_PHY_BASE(0x38) /* Frequency bandwidth control 2 */
|
||||
#define B43_PHY_DACCTL B43_PHY_BASE(0x60) /* DAC control */
|
||||
#define B43_PHY_RCCALOVER B43_PHY_BASE(0x78) /* RC calibration override */
|
||||
#define B43_PHY_FBCTL1 B43_PHY_CCK(0x18) /* Frequency bandwidth control 1 */
|
||||
#define B43_PHY_ITSSI B43_PHY_CCK(0x29) /* Idle TSSI */
|
||||
#define B43_PHY_LO_LEAKAGE B43_PHY_CCK(0x2D) /* Measured LO leakage */
|
||||
#define B43_PHY_ENERGY B43_PHY_CCK(0x33) /* Energy */
|
||||
#define B43_PHY_SYNCCTL B43_PHY_CCK(0x35)
|
||||
#define B43_PHY_FBCTL2 B43_PHY_CCK(0x38) /* Frequency bandwidth control 2 */
|
||||
#define B43_PHY_DACCTL B43_PHY_CCK(0x60) /* DAC control */
|
||||
#define B43_PHY_RCCALOVER B43_PHY_CCK(0x78) /* RC calibration override */
|
||||
|
||||
/* Extended G-PHY Registers */
|
||||
#define B43_PHY_CLASSCTL B43_PHY_EXTG(0x02) /* Classify control */
|
||||
@@ -125,13 +141,14 @@ struct b43_phy;
|
||||
#define B43_OFDMTAB_DC B43_OFDMTAB(0x0E, 7)
|
||||
#define B43_OFDMTAB_PWRDYN2 B43_OFDMTAB(0x0E, 12)
|
||||
#define B43_OFDMTAB_LNAGAIN B43_OFDMTAB(0x0E, 13)
|
||||
//TODO
|
||||
#define B43_OFDMTAB_UNKNOWN_0F B43_OFDMTAB(0x0F, 0) //TODO rename
|
||||
#define B43_OFDMTAB_UNKNOWN_APHY B43_OFDMTAB(0x0F, 7) //TODO rename
|
||||
#define B43_OFDMTAB_LPFGAIN B43_OFDMTAB(0x0F, 12)
|
||||
#define B43_OFDMTAB_RSSI B43_OFDMTAB(0x10, 0)
|
||||
//TODO
|
||||
#define B43_OFDMTAB_UNKNOWN_11 B43_OFDMTAB(0x11, 4) //TODO rename
|
||||
#define B43_OFDMTAB_AGC1_R1 B43_OFDMTAB(0x13, 0)
|
||||
#define B43_OFDMTAB_GAINX_R1 B43_OFDMTAB(0x14, 0) //TODO rename
|
||||
#define B43_OFDMTAB_MINSIGSQ B43_OFDMTAB(0x14, 1)
|
||||
#define B43_OFDMTAB_GAINX_R1 B43_OFDMTAB(0x14, 0) //TODO remove!
|
||||
#define B43_OFDMTAB_MINSIGSQ B43_OFDMTAB(0x14, 0)
|
||||
#define B43_OFDMTAB_AGC3_R1 B43_OFDMTAB(0x15, 0)
|
||||
#define B43_OFDMTAB_WRSSI_R1 B43_OFDMTAB(0x15, 4)
|
||||
#define B43_OFDMTAB_TSSI B43_OFDMTAB(0x15, 0)
|
||||
@@ -163,6 +180,8 @@ enum {
|
||||
B43_ANTENNA1, /* Antenna 0 */
|
||||
B43_ANTENNA_AUTO1, /* Automatic, starting with antenna 1 */
|
||||
B43_ANTENNA_AUTO0, /* Automatic, starting with antenna 0 */
|
||||
B43_ANTENNA2,
|
||||
B43_ANTENNA3 = 8,
|
||||
|
||||
B43_ANTENNA_AUTO = B43_ANTENNA_AUTO0,
|
||||
B43_ANTENNA_DEFAULT = B43_ANTENNA_AUTO,
|
||||
@@ -182,21 +201,21 @@ enum {
|
||||
#define B43_PHYVER_TYPE_SHIFT 8
|
||||
#define B43_PHYVER_VERSION 0x00FF
|
||||
|
||||
void b43_raw_phy_lock(struct b43_wldev *dev);
|
||||
#define b43_phy_lock(dev, flags) \
|
||||
do { \
|
||||
local_irq_save(flags); \
|
||||
b43_raw_phy_lock(dev); \
|
||||
} while (0)
|
||||
void b43_raw_phy_unlock(struct b43_wldev *dev);
|
||||
#define b43_phy_unlock(dev, flags) \
|
||||
do { \
|
||||
b43_raw_phy_unlock(dev); \
|
||||
local_irq_restore(flags); \
|
||||
} while (0)
|
||||
void b43_phy_lock(struct b43_wldev *dev);
|
||||
void b43_phy_unlock(struct b43_wldev *dev);
|
||||
|
||||
|
||||
/* Read a value from a PHY register */
|
||||
u16 b43_phy_read(struct b43_wldev *dev, u16 offset);
|
||||
/* Write a value to a PHY register */
|
||||
void b43_phy_write(struct b43_wldev *dev, u16 offset, u16 val);
|
||||
/* Mask a PHY register with a mask */
|
||||
void b43_phy_mask(struct b43_wldev *dev, u16 offset, u16 mask);
|
||||
/* OR a PHY register with a bitmap */
|
||||
void b43_phy_set(struct b43_wldev *dev, u16 offset, u16 set);
|
||||
/* Mask and OR a PHY register with a mask and bitmap */
|
||||
void b43_phy_maskset(struct b43_wldev *dev, u16 offset, u16 mask, u16 set);
|
||||
|
||||
|
||||
int b43_phy_init_tssi2dbm_table(struct b43_wldev *dev);
|
||||
|
||||
@@ -260,8 +279,18 @@ extern const u8 b43_radio_channel_codes_bg[];
|
||||
void b43_radio_lock(struct b43_wldev *dev);
|
||||
void b43_radio_unlock(struct b43_wldev *dev);
|
||||
|
||||
|
||||
/* Read a value from a 16bit radio register */
|
||||
u16 b43_radio_read16(struct b43_wldev *dev, u16 offset);
|
||||
/* Write a value to a 16bit radio register */
|
||||
void b43_radio_write16(struct b43_wldev *dev, u16 offset, u16 val);
|
||||
/* Mask a 16bit radio register with a mask */
|
||||
void b43_radio_mask(struct b43_wldev *dev, u16 offset, u16 mask);
|
||||
/* OR a 16bit radio register with a bitmap */
|
||||
void b43_radio_set(struct b43_wldev *dev, u16 offset, u16 set);
|
||||
/* Mask and OR a PHY register with a mask and bitmap */
|
||||
void b43_radio_maskset(struct b43_wldev *dev, u16 offset, u16 mask, u16 set);
|
||||
|
||||
|
||||
u16 b43_radio_init2050(struct b43_wldev *dev);
|
||||
void b43_radio_init2060(struct b43_wldev *dev);
|
||||
|
||||
@@ -1,652 +0,0 @@
|
||||
/*
|
||||
|
||||
Broadcom B43 wireless driver
|
||||
|
||||
PIO Transmission
|
||||
|
||||
Copyright (c) 2005 Michael Buesch <mb@bu3sch.de>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
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; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
|
||||
Boston, MA 02110-1301, USA.
|
||||
|
||||
*/
|
||||
|
||||
#include "b43.h"
|
||||
#include "pio.h"
|
||||
#include "main.h"
|
||||
#include "xmit.h"
|
||||
|
||||
#include <linux/delay.h>
|
||||
|
||||
static void tx_start(struct b43_pioqueue *queue)
|
||||
{
|
||||
b43_pio_write(queue, B43_PIO_TXCTL, B43_PIO_TXCTL_INIT);
|
||||
}
|
||||
|
||||
static void tx_octet(struct b43_pioqueue *queue, u8 octet)
|
||||
{
|
||||
if (queue->need_workarounds) {
|
||||
b43_pio_write(queue, B43_PIO_TXDATA, octet);
|
||||
b43_pio_write(queue, B43_PIO_TXCTL, B43_PIO_TXCTL_WRITELO);
|
||||
} else {
|
||||
b43_pio_write(queue, B43_PIO_TXCTL, B43_PIO_TXCTL_WRITELO);
|
||||
b43_pio_write(queue, B43_PIO_TXDATA, octet);
|
||||
}
|
||||
}
|
||||
|
||||
static u16 tx_get_next_word(const u8 * txhdr,
|
||||
const u8 * packet,
|
||||
size_t txhdr_size, unsigned int *pos)
|
||||
{
|
||||
const u8 *source;
|
||||
unsigned int i = *pos;
|
||||
u16 ret;
|
||||
|
||||
if (i < txhdr_size) {
|
||||
source = txhdr;
|
||||
} else {
|
||||
source = packet;
|
||||
i -= txhdr_size;
|
||||
}
|
||||
ret = le16_to_cpu(*((__le16 *)(source + i)));
|
||||
*pos += 2;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void tx_data(struct b43_pioqueue *queue,
|
||||
u8 * txhdr, const u8 * packet, unsigned int octets)
|
||||
{
|
||||
u16 data;
|
||||
unsigned int i = 0;
|
||||
|
||||
if (queue->need_workarounds) {
|
||||
data = tx_get_next_word(txhdr, packet,
|
||||
sizeof(struct b43_txhdr_fw4), &i);
|
||||
b43_pio_write(queue, B43_PIO_TXDATA, data);
|
||||
}
|
||||
b43_pio_write(queue, B43_PIO_TXCTL,
|
||||
B43_PIO_TXCTL_WRITELO | B43_PIO_TXCTL_WRITEHI);
|
||||
while (i < octets - 1) {
|
||||
data = tx_get_next_word(txhdr, packet,
|
||||
sizeof(struct b43_txhdr_fw4), &i);
|
||||
b43_pio_write(queue, B43_PIO_TXDATA, data);
|
||||
}
|
||||
if (octets % 2)
|
||||
tx_octet(queue,
|
||||
packet[octets - sizeof(struct b43_txhdr_fw4) - 1]);
|
||||
}
|
||||
|
||||
static void tx_complete(struct b43_pioqueue *queue, struct sk_buff *skb)
|
||||
{
|
||||
if (queue->need_workarounds) {
|
||||
b43_pio_write(queue, B43_PIO_TXDATA, skb->data[skb->len - 1]);
|
||||
b43_pio_write(queue, B43_PIO_TXCTL,
|
||||
B43_PIO_TXCTL_WRITELO | B43_PIO_TXCTL_COMPLETE);
|
||||
} else {
|
||||
b43_pio_write(queue, B43_PIO_TXCTL, B43_PIO_TXCTL_COMPLETE);
|
||||
}
|
||||
}
|
||||
|
||||
static u16 generate_cookie(struct b43_pioqueue *queue,
|
||||
struct b43_pio_txpacket *packet)
|
||||
{
|
||||
u16 cookie = 0x0000;
|
||||
u16 packetindex;
|
||||
|
||||
/* We use the upper 4 bits for the PIO
|
||||
* controller ID and the lower 12 bits
|
||||
* for the packet index (in the cache).
|
||||
*/
|
||||
switch (queue->mmio_base) {
|
||||
case B43_MMIO_PIO1_BASE:
|
||||
break;
|
||||
case B43_MMIO_PIO2_BASE:
|
||||
cookie = 0x1000;
|
||||
break;
|
||||
case B43_MMIO_PIO3_BASE:
|
||||
cookie = 0x2000;
|
||||
break;
|
||||
case B43_MMIO_PIO4_BASE:
|
||||
cookie = 0x3000;
|
||||
break;
|
||||
default:
|
||||
B43_WARN_ON(1);
|
||||
}
|
||||
packetindex = packet->index;
|
||||
B43_WARN_ON(packetindex & ~0x0FFF);
|
||||
cookie |= (u16) packetindex;
|
||||
|
||||
return cookie;
|
||||
}
|
||||
|
||||
static
|
||||
struct b43_pioqueue *parse_cookie(struct b43_wldev *dev,
|
||||
u16 cookie, struct b43_pio_txpacket **packet)
|
||||
{
|
||||
struct b43_pio *pio = &dev->pio;
|
||||
struct b43_pioqueue *queue = NULL;
|
||||
int packetindex;
|
||||
|
||||
switch (cookie & 0xF000) {
|
||||
case 0x0000:
|
||||
queue = pio->queue0;
|
||||
break;
|
||||
case 0x1000:
|
||||
queue = pio->queue1;
|
||||
break;
|
||||
case 0x2000:
|
||||
queue = pio->queue2;
|
||||
break;
|
||||
case 0x3000:
|
||||
queue = pio->queue3;
|
||||
break;
|
||||
default:
|
||||
B43_WARN_ON(1);
|
||||
}
|
||||
packetindex = (cookie & 0x0FFF);
|
||||
B43_WARN_ON(!(packetindex >= 0 && packetindex < B43_PIO_MAXTXPACKETS));
|
||||
*packet = &(queue->tx_packets_cache[packetindex]);
|
||||
|
||||
return queue;
|
||||
}
|
||||
|
||||
union txhdr_union {
|
||||
struct b43_txhdr_fw4 txhdr_fw4;
|
||||
};
|
||||
|
||||
static void pio_tx_write_fragment(struct b43_pioqueue *queue,
|
||||
struct sk_buff *skb,
|
||||
struct b43_pio_txpacket *packet,
|
||||
size_t txhdr_size)
|
||||
{
|
||||
union txhdr_union txhdr_data;
|
||||
u8 *txhdr = NULL;
|
||||
unsigned int octets;
|
||||
|
||||
txhdr = (u8 *) (&txhdr_data.txhdr_fw4);
|
||||
|
||||
B43_WARN_ON(skb_shinfo(skb)->nr_frags);
|
||||
b43_generate_txhdr(queue->dev,
|
||||
txhdr, skb->data, skb->len,
|
||||
&packet->txstat.control,
|
||||
generate_cookie(queue, packet));
|
||||
|
||||
tx_start(queue);
|
||||
octets = skb->len + txhdr_size;
|
||||
if (queue->need_workarounds)
|
||||
octets--;
|
||||
tx_data(queue, txhdr, (u8 *) skb->data, octets);
|
||||
tx_complete(queue, skb);
|
||||
}
|
||||
|
||||
static void free_txpacket(struct b43_pio_txpacket *packet)
|
||||
{
|
||||
struct b43_pioqueue *queue = packet->queue;
|
||||
|
||||
if (packet->skb)
|
||||
dev_kfree_skb_any(packet->skb);
|
||||
list_move(&packet->list, &queue->txfree);
|
||||
queue->nr_txfree++;
|
||||
}
|
||||
|
||||
static int pio_tx_packet(struct b43_pio_txpacket *packet)
|
||||
{
|
||||
struct b43_pioqueue *queue = packet->queue;
|
||||
struct sk_buff *skb = packet->skb;
|
||||
u16 octets;
|
||||
|
||||
octets = (u16) skb->len + sizeof(struct b43_txhdr_fw4);
|
||||
if (queue->tx_devq_size < octets) {
|
||||
b43warn(queue->dev->wl, "PIO queue too small. "
|
||||
"Dropping packet.\n");
|
||||
/* Drop it silently (return success) */
|
||||
free_txpacket(packet);
|
||||
return 0;
|
||||
}
|
||||
B43_WARN_ON(queue->tx_devq_packets > B43_PIO_MAXTXDEVQPACKETS);
|
||||
B43_WARN_ON(queue->tx_devq_used > queue->tx_devq_size);
|
||||
/* Check if there is sufficient free space on the device
|
||||
* TX queue. If not, return and let the TX tasklet
|
||||
* retry later.
|
||||
*/
|
||||
if (queue->tx_devq_packets == B43_PIO_MAXTXDEVQPACKETS)
|
||||
return -EBUSY;
|
||||
if (queue->tx_devq_used + octets > queue->tx_devq_size)
|
||||
return -EBUSY;
|
||||
/* Now poke the device. */
|
||||
pio_tx_write_fragment(queue, skb, packet, sizeof(struct b43_txhdr_fw4));
|
||||
|
||||
/* Account for the packet size.
|
||||
* (We must not overflow the device TX queue)
|
||||
*/
|
||||
queue->tx_devq_packets++;
|
||||
queue->tx_devq_used += octets;
|
||||
|
||||
/* Transmission started, everything ok, move the
|
||||
* packet to the txrunning list.
|
||||
*/
|
||||
list_move_tail(&packet->list, &queue->txrunning);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void tx_tasklet(unsigned long d)
|
||||
{
|
||||
struct b43_pioqueue *queue = (struct b43_pioqueue *)d;
|
||||
struct b43_wldev *dev = queue->dev;
|
||||
unsigned long flags;
|
||||
struct b43_pio_txpacket *packet, *tmp_packet;
|
||||
int err;
|
||||
u16 txctl;
|
||||
|
||||
spin_lock_irqsave(&dev->wl->irq_lock, flags);
|
||||
if (queue->tx_frozen)
|
||||
goto out_unlock;
|
||||
txctl = b43_pio_read(queue, B43_PIO_TXCTL);
|
||||
if (txctl & B43_PIO_TXCTL_SUSPEND)
|
||||
goto out_unlock;
|
||||
|
||||
list_for_each_entry_safe(packet, tmp_packet, &queue->txqueue, list) {
|
||||
/* Try to transmit the packet. This can fail, if
|
||||
* the device queue is full. In case of failure, the
|
||||
* packet is left in the txqueue.
|
||||
* If transmission succeed, the packet is moved to txrunning.
|
||||
* If it is impossible to transmit the packet, it
|
||||
* is dropped.
|
||||
*/
|
||||
err = pio_tx_packet(packet);
|
||||
if (err)
|
||||
break;
|
||||
}
|
||||
out_unlock:
|
||||
spin_unlock_irqrestore(&dev->wl->irq_lock, flags);
|
||||
}
|
||||
|
||||
static void setup_txqueues(struct b43_pioqueue *queue)
|
||||
{
|
||||
struct b43_pio_txpacket *packet;
|
||||
int i;
|
||||
|
||||
queue->nr_txfree = B43_PIO_MAXTXPACKETS;
|
||||
for (i = 0; i < B43_PIO_MAXTXPACKETS; i++) {
|
||||
packet = &(queue->tx_packets_cache[i]);
|
||||
|
||||
packet->queue = queue;
|
||||
INIT_LIST_HEAD(&packet->list);
|
||||
packet->index = i;
|
||||
|
||||
list_add(&packet->list, &queue->txfree);
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
struct b43_pioqueue *b43_setup_pioqueue(struct b43_wldev *dev,
|
||||
u16 pio_mmio_base)
|
||||
{
|
||||
struct b43_pioqueue *queue;
|
||||
u16 qsize;
|
||||
|
||||
queue = kzalloc(sizeof(*queue), GFP_KERNEL);
|
||||
if (!queue)
|
||||
goto out;
|
||||
|
||||
queue->dev = dev;
|
||||
queue->mmio_base = pio_mmio_base;
|
||||
queue->need_workarounds = (dev->dev->id.revision < 3);
|
||||
|
||||
INIT_LIST_HEAD(&queue->txfree);
|
||||
INIT_LIST_HEAD(&queue->txqueue);
|
||||
INIT_LIST_HEAD(&queue->txrunning);
|
||||
tasklet_init(&queue->txtask, tx_tasklet, (unsigned long)queue);
|
||||
|
||||
b43_write32(dev, B43_MMIO_MACCTL, b43_read32(dev, B43_MMIO_MACCTL)
|
||||
& ~B43_MACCTL_BE);
|
||||
|
||||
qsize = b43_read16(dev, queue->mmio_base + B43_PIO_TXQBUFSIZE);
|
||||
if (qsize == 0) {
|
||||
b43err(dev->wl, "This card does not support PIO "
|
||||
"operation mode. Please use DMA mode "
|
||||
"(module parameter pio=0).\n");
|
||||
goto err_freequeue;
|
||||
}
|
||||
if (qsize <= B43_PIO_TXQADJUST) {
|
||||
b43err(dev->wl, "PIO tx device-queue too small (%u)\n", qsize);
|
||||
goto err_freequeue;
|
||||
}
|
||||
qsize -= B43_PIO_TXQADJUST;
|
||||
queue->tx_devq_size = qsize;
|
||||
|
||||
setup_txqueues(queue);
|
||||
|
||||
out:
|
||||
return queue;
|
||||
|
||||
err_freequeue:
|
||||
kfree(queue);
|
||||
queue = NULL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
static void cancel_transfers(struct b43_pioqueue *queue)
|
||||
{
|
||||
struct b43_pio_txpacket *packet, *tmp_packet;
|
||||
|
||||
tasklet_disable(&queue->txtask);
|
||||
|
||||
list_for_each_entry_safe(packet, tmp_packet, &queue->txrunning, list)
|
||||
free_txpacket(packet);
|
||||
list_for_each_entry_safe(packet, tmp_packet, &queue->txqueue, list)
|
||||
free_txpacket(packet);
|
||||
}
|
||||
|
||||
static void b43_destroy_pioqueue(struct b43_pioqueue *queue)
|
||||
{
|
||||
if (!queue)
|
||||
return;
|
||||
|
||||
cancel_transfers(queue);
|
||||
kfree(queue);
|
||||
}
|
||||
|
||||
void b43_pio_free(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_pio *pio;
|
||||
|
||||
if (!b43_using_pio(dev))
|
||||
return;
|
||||
pio = &dev->pio;
|
||||
|
||||
b43_destroy_pioqueue(pio->queue3);
|
||||
pio->queue3 = NULL;
|
||||
b43_destroy_pioqueue(pio->queue2);
|
||||
pio->queue2 = NULL;
|
||||
b43_destroy_pioqueue(pio->queue1);
|
||||
pio->queue1 = NULL;
|
||||
b43_destroy_pioqueue(pio->queue0);
|
||||
pio->queue0 = NULL;
|
||||
}
|
||||
|
||||
int b43_pio_init(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_pio *pio = &dev->pio;
|
||||
struct b43_pioqueue *queue;
|
||||
int err = -ENOMEM;
|
||||
|
||||
queue = b43_setup_pioqueue(dev, B43_MMIO_PIO1_BASE);
|
||||
if (!queue)
|
||||
goto out;
|
||||
pio->queue0 = queue;
|
||||
|
||||
queue = b43_setup_pioqueue(dev, B43_MMIO_PIO2_BASE);
|
||||
if (!queue)
|
||||
goto err_destroy0;
|
||||
pio->queue1 = queue;
|
||||
|
||||
queue = b43_setup_pioqueue(dev, B43_MMIO_PIO3_BASE);
|
||||
if (!queue)
|
||||
goto err_destroy1;
|
||||
pio->queue2 = queue;
|
||||
|
||||
queue = b43_setup_pioqueue(dev, B43_MMIO_PIO4_BASE);
|
||||
if (!queue)
|
||||
goto err_destroy2;
|
||||
pio->queue3 = queue;
|
||||
|
||||
if (dev->dev->id.revision < 3)
|
||||
dev->irq_savedstate |= B43_IRQ_PIO_WORKAROUND;
|
||||
|
||||
b43dbg(dev->wl, "PIO initialized\n");
|
||||
err = 0;
|
||||
out:
|
||||
return err;
|
||||
|
||||
err_destroy2:
|
||||
b43_destroy_pioqueue(pio->queue2);
|
||||
pio->queue2 = NULL;
|
||||
err_destroy1:
|
||||
b43_destroy_pioqueue(pio->queue1);
|
||||
pio->queue1 = NULL;
|
||||
err_destroy0:
|
||||
b43_destroy_pioqueue(pio->queue0);
|
||||
pio->queue0 = NULL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
int b43_pio_tx(struct b43_wldev *dev,
|
||||
struct sk_buff *skb, struct ieee80211_tx_control *ctl)
|
||||
{
|
||||
struct b43_pioqueue *queue = dev->pio.queue1;
|
||||
struct b43_pio_txpacket *packet;
|
||||
|
||||
B43_WARN_ON(queue->tx_suspended);
|
||||
B43_WARN_ON(list_empty(&queue->txfree));
|
||||
|
||||
packet = list_entry(queue->txfree.next, struct b43_pio_txpacket, list);
|
||||
packet->skb = skb;
|
||||
|
||||
memset(&packet->txstat, 0, sizeof(packet->txstat));
|
||||
memcpy(&packet->txstat.control, ctl, sizeof(*ctl));
|
||||
|
||||
list_move_tail(&packet->list, &queue->txqueue);
|
||||
queue->nr_txfree--;
|
||||
queue->nr_tx_packets++;
|
||||
B43_WARN_ON(queue->nr_txfree >= B43_PIO_MAXTXPACKETS);
|
||||
|
||||
tasklet_schedule(&queue->txtask);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void b43_pio_handle_txstatus(struct b43_wldev *dev,
|
||||
const struct b43_txstatus *status)
|
||||
{
|
||||
struct b43_pioqueue *queue;
|
||||
struct b43_pio_txpacket *packet;
|
||||
|
||||
queue = parse_cookie(dev, status->cookie, &packet);
|
||||
if (B43_WARN_ON(!queue))
|
||||
return;
|
||||
|
||||
queue->tx_devq_packets--;
|
||||
queue->tx_devq_used -=
|
||||
(packet->skb->len + sizeof(struct b43_txhdr_fw4));
|
||||
|
||||
if (status->acked) {
|
||||
packet->txstat.flags |= IEEE80211_TX_STATUS_ACK;
|
||||
} else {
|
||||
if (!(packet->txstat.control.flags & IEEE80211_TXCTL_NO_ACK))
|
||||
packet->txstat.excessive_retries = 1;
|
||||
}
|
||||
if (status->frame_count == 0) {
|
||||
/* The frame was not transmitted at all. */
|
||||
packet->txstat.retry_count = 0;
|
||||
} else
|
||||
packet->txstat.retry_count = status->frame_count - 1;
|
||||
ieee80211_tx_status_irqsafe(dev->wl->hw, packet->skb,
|
||||
&(packet->txstat));
|
||||
packet->skb = NULL;
|
||||
|
||||
free_txpacket(packet);
|
||||
/* If there are packets on the txqueue, poke the tasklet
|
||||
* to transmit them.
|
||||
*/
|
||||
if (!list_empty(&queue->txqueue))
|
||||
tasklet_schedule(&queue->txtask);
|
||||
}
|
||||
|
||||
void b43_pio_get_tx_stats(struct b43_wldev *dev,
|
||||
struct ieee80211_tx_queue_stats *stats)
|
||||
{
|
||||
struct b43_pio *pio = &dev->pio;
|
||||
struct b43_pioqueue *queue;
|
||||
struct ieee80211_tx_queue_stats_data *data;
|
||||
|
||||
queue = pio->queue1;
|
||||
data = &(stats->data[0]);
|
||||
data->len = B43_PIO_MAXTXPACKETS - queue->nr_txfree;
|
||||
data->limit = B43_PIO_MAXTXPACKETS;
|
||||
data->count = queue->nr_tx_packets;
|
||||
}
|
||||
|
||||
static void pio_rx_error(struct b43_pioqueue *queue,
|
||||
int clear_buffers, const char *error)
|
||||
{
|
||||
int i;
|
||||
|
||||
b43err(queue->dev->wl, "PIO RX error: %s\n", error);
|
||||
b43_pio_write(queue, B43_PIO_RXCTL, B43_PIO_RXCTL_READY);
|
||||
if (clear_buffers) {
|
||||
B43_WARN_ON(queue->mmio_base != B43_MMIO_PIO1_BASE);
|
||||
for (i = 0; i < 15; i++) {
|
||||
/* Dummy read. */
|
||||
b43_pio_read(queue, B43_PIO_RXDATA);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void b43_pio_rx(struct b43_pioqueue *queue)
|
||||
{
|
||||
__le16 preamble[21] = { 0 };
|
||||
struct b43_rxhdr_fw4 *rxhdr;
|
||||
u16 tmp, len;
|
||||
u32 macstat;
|
||||
int i, preamble_readwords;
|
||||
struct sk_buff *skb;
|
||||
|
||||
tmp = b43_pio_read(queue, B43_PIO_RXCTL);
|
||||
if (!(tmp & B43_PIO_RXCTL_DATAAVAILABLE))
|
||||
return;
|
||||
b43_pio_write(queue, B43_PIO_RXCTL, B43_PIO_RXCTL_DATAAVAILABLE);
|
||||
|
||||
for (i = 0; i < 10; i++) {
|
||||
tmp = b43_pio_read(queue, B43_PIO_RXCTL);
|
||||
if (tmp & B43_PIO_RXCTL_READY)
|
||||
goto data_ready;
|
||||
udelay(10);
|
||||
}
|
||||
b43dbg(queue->dev->wl, "PIO RX timed out\n");
|
||||
return;
|
||||
data_ready:
|
||||
|
||||
len = b43_pio_read(queue, B43_PIO_RXDATA);
|
||||
if (unlikely(len > 0x700)) {
|
||||
pio_rx_error(queue, 0, "len > 0x700");
|
||||
return;
|
||||
}
|
||||
if (unlikely(len == 0 && queue->mmio_base != B43_MMIO_PIO4_BASE)) {
|
||||
pio_rx_error(queue, 0, "len == 0");
|
||||
return;
|
||||
}
|
||||
preamble[0] = cpu_to_le16(len);
|
||||
if (queue->mmio_base == B43_MMIO_PIO4_BASE)
|
||||
preamble_readwords = 14 / sizeof(u16);
|
||||
else
|
||||
preamble_readwords = 18 / sizeof(u16);
|
||||
for (i = 0; i < preamble_readwords; i++) {
|
||||
tmp = b43_pio_read(queue, B43_PIO_RXDATA);
|
||||
preamble[i + 1] = cpu_to_le16(tmp);
|
||||
}
|
||||
rxhdr = (struct b43_rxhdr_fw4 *)preamble;
|
||||
macstat = le32_to_cpu(rxhdr->mac_status);
|
||||
if (macstat & B43_RX_MAC_FCSERR) {
|
||||
pio_rx_error(queue,
|
||||
(queue->mmio_base == B43_MMIO_PIO1_BASE),
|
||||
"Frame FCS error");
|
||||
return;
|
||||
}
|
||||
if (queue->mmio_base == B43_MMIO_PIO4_BASE) {
|
||||
/* We received an xmit status. */
|
||||
struct b43_hwtxstatus *hw;
|
||||
|
||||
hw = (struct b43_hwtxstatus *)(preamble + 1);
|
||||
b43_handle_hwtxstatus(queue->dev, hw);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
skb = dev_alloc_skb(len);
|
||||
if (unlikely(!skb)) {
|
||||
pio_rx_error(queue, 1, "OOM");
|
||||
return;
|
||||
}
|
||||
skb_put(skb, len);
|
||||
for (i = 0; i < len - 1; i += 2) {
|
||||
tmp = b43_pio_read(queue, B43_PIO_RXDATA);
|
||||
*((__le16 *)(skb->data + i)) = cpu_to_le16(tmp);
|
||||
}
|
||||
if (len % 2) {
|
||||
tmp = b43_pio_read(queue, B43_PIO_RXDATA);
|
||||
skb->data[len - 1] = (tmp & 0x00FF);
|
||||
/* The specs say the following is required, but
|
||||
* it is wrong and corrupts the PLCP. If we don't do
|
||||
* this, the PLCP seems to be correct. So ifdef it out for now.
|
||||
*/
|
||||
#if 0
|
||||
if (rxflags2 & B43_RXHDR_FLAGS2_TYPE2FRAME)
|
||||
skb->data[2] = (tmp & 0xFF00) >> 8;
|
||||
else
|
||||
skb->data[0] = (tmp & 0xFF00) >> 8;
|
||||
#endif
|
||||
}
|
||||
b43_rx(queue->dev, skb, rxhdr);
|
||||
}
|
||||
|
||||
void b43_pio_tx_suspend(struct b43_pioqueue *queue)
|
||||
{
|
||||
b43_power_saving_ctl_bits(queue->dev, B43_PS_AWAKE);
|
||||
b43_pio_write(queue, B43_PIO_TXCTL, b43_pio_read(queue, B43_PIO_TXCTL)
|
||||
| B43_PIO_TXCTL_SUSPEND);
|
||||
}
|
||||
|
||||
void b43_pio_tx_resume(struct b43_pioqueue *queue)
|
||||
{
|
||||
b43_pio_write(queue, B43_PIO_TXCTL, b43_pio_read(queue, B43_PIO_TXCTL)
|
||||
& ~B43_PIO_TXCTL_SUSPEND);
|
||||
b43_power_saving_ctl_bits(queue->dev, 0);
|
||||
tasklet_schedule(&queue->txtask);
|
||||
}
|
||||
|
||||
void b43_pio_freeze_txqueues(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_pio *pio;
|
||||
|
||||
B43_WARN_ON(!b43_using_pio(dev));
|
||||
pio = &dev->pio;
|
||||
pio->queue0->tx_frozen = 1;
|
||||
pio->queue1->tx_frozen = 1;
|
||||
pio->queue2->tx_frozen = 1;
|
||||
pio->queue3->tx_frozen = 1;
|
||||
}
|
||||
|
||||
void b43_pio_thaw_txqueues(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_pio *pio;
|
||||
|
||||
B43_WARN_ON(!b43_using_pio(dev));
|
||||
pio = &dev->pio;
|
||||
pio->queue0->tx_frozen = 0;
|
||||
pio->queue1->tx_frozen = 0;
|
||||
pio->queue2->tx_frozen = 0;
|
||||
pio->queue3->tx_frozen = 0;
|
||||
if (!list_empty(&pio->queue0->txqueue))
|
||||
tasklet_schedule(&pio->queue0->txtask);
|
||||
if (!list_empty(&pio->queue1->txqueue))
|
||||
tasklet_schedule(&pio->queue1->txtask);
|
||||
if (!list_empty(&pio->queue2->txqueue))
|
||||
tasklet_schedule(&pio->queue2->txtask);
|
||||
if (!list_empty(&pio->queue3->txqueue))
|
||||
tasklet_schedule(&pio->queue3->txtask);
|
||||
}
|
||||
@@ -1,153 +0,0 @@
|
||||
#ifndef B43_PIO_H_
|
||||
#define B43_PIO_H_
|
||||
|
||||
#include "b43.h"
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
#define B43_PIO_TXCTL 0x00
|
||||
#define B43_PIO_TXDATA 0x02
|
||||
#define B43_PIO_TXQBUFSIZE 0x04
|
||||
#define B43_PIO_RXCTL 0x08
|
||||
#define B43_PIO_RXDATA 0x0A
|
||||
|
||||
#define B43_PIO_TXCTL_WRITELO (1 << 0)
|
||||
#define B43_PIO_TXCTL_WRITEHI (1 << 1)
|
||||
#define B43_PIO_TXCTL_COMPLETE (1 << 2)
|
||||
#define B43_PIO_TXCTL_INIT (1 << 3)
|
||||
#define B43_PIO_TXCTL_SUSPEND (1 << 7)
|
||||
|
||||
#define B43_PIO_RXCTL_DATAAVAILABLE (1 << 0)
|
||||
#define B43_PIO_RXCTL_READY (1 << 1)
|
||||
|
||||
/* PIO constants */
|
||||
#define B43_PIO_MAXTXDEVQPACKETS 31
|
||||
#define B43_PIO_TXQADJUST 80
|
||||
|
||||
/* PIO tuning knobs */
|
||||
#define B43_PIO_MAXTXPACKETS 256
|
||||
|
||||
#ifdef CONFIG_B43_PIO
|
||||
|
||||
struct b43_pioqueue;
|
||||
struct b43_xmitstatus;
|
||||
|
||||
struct b43_pio_txpacket {
|
||||
struct b43_pioqueue *queue;
|
||||
struct sk_buff *skb;
|
||||
struct ieee80211_tx_status txstat;
|
||||
struct list_head list;
|
||||
u16 index; /* Index in the tx_packets_cache */
|
||||
};
|
||||
|
||||
struct b43_pioqueue {
|
||||
struct b43_wldev *dev;
|
||||
u16 mmio_base;
|
||||
|
||||
bool tx_suspended;
|
||||
bool tx_frozen;
|
||||
bool need_workarounds; /* Workarounds needed for core.rev < 3 */
|
||||
|
||||
/* Adjusted size of the device internal TX buffer. */
|
||||
u16 tx_devq_size;
|
||||
/* Used octets of the device internal TX buffer. */
|
||||
u16 tx_devq_used;
|
||||
/* Used packet slots in the device internal TX buffer. */
|
||||
u8 tx_devq_packets;
|
||||
/* Packets from the txfree list can
|
||||
* be taken on incoming TX requests.
|
||||
*/
|
||||
struct list_head txfree;
|
||||
unsigned int nr_txfree;
|
||||
/* Packets on the txqueue are queued,
|
||||
* but not completely written to the chip, yet.
|
||||
*/
|
||||
struct list_head txqueue;
|
||||
/* Packets on the txrunning queue are completely
|
||||
* posted to the device. We are waiting for the txstatus.
|
||||
*/
|
||||
struct list_head txrunning;
|
||||
/* Total number or packets sent.
|
||||
* (This counter can obviously wrap).
|
||||
*/
|
||||
unsigned int nr_tx_packets;
|
||||
struct tasklet_struct txtask;
|
||||
struct b43_pio_txpacket tx_packets_cache[B43_PIO_MAXTXPACKETS];
|
||||
};
|
||||
|
||||
static inline u16 b43_pio_read(struct b43_pioqueue *queue, u16 offset)
|
||||
{
|
||||
return b43_read16(queue->dev, queue->mmio_base + offset);
|
||||
}
|
||||
|
||||
static inline
|
||||
void b43_pio_write(struct b43_pioqueue *queue, u16 offset, u16 value)
|
||||
{
|
||||
b43_write16(queue->dev, queue->mmio_base + offset, value);
|
||||
mmiowb();
|
||||
}
|
||||
|
||||
int b43_pio_init(struct b43_wldev *dev);
|
||||
void b43_pio_free(struct b43_wldev *dev);
|
||||
|
||||
int b43_pio_tx(struct b43_wldev *dev,
|
||||
struct sk_buff *skb, struct ieee80211_tx_control *ctl);
|
||||
void b43_pio_handle_txstatus(struct b43_wldev *dev,
|
||||
const struct b43_txstatus *status);
|
||||
void b43_pio_get_tx_stats(struct b43_wldev *dev,
|
||||
struct ieee80211_tx_queue_stats *stats);
|
||||
void b43_pio_rx(struct b43_pioqueue *queue);
|
||||
|
||||
/* Suspend TX queue in hardware. */
|
||||
void b43_pio_tx_suspend(struct b43_pioqueue *queue);
|
||||
void b43_pio_tx_resume(struct b43_pioqueue *queue);
|
||||
/* Suspend (freeze) the TX tasklet (software level). */
|
||||
void b43_pio_freeze_txqueues(struct b43_wldev *dev);
|
||||
void b43_pio_thaw_txqueues(struct b43_wldev *dev);
|
||||
|
||||
#else /* CONFIG_B43_PIO */
|
||||
|
||||
static inline int b43_pio_init(struct b43_wldev *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void b43_pio_free(struct b43_wldev *dev)
|
||||
{
|
||||
}
|
||||
static inline
|
||||
int b43_pio_tx(struct b43_wldev *dev,
|
||||
struct sk_buff *skb, struct ieee80211_tx_control *ctl)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline
|
||||
void b43_pio_handle_txstatus(struct b43_wldev *dev,
|
||||
const struct b43_txstatus *status)
|
||||
{
|
||||
}
|
||||
static inline
|
||||
void b43_pio_get_tx_stats(struct b43_wldev *dev,
|
||||
struct ieee80211_tx_queue_stats *stats)
|
||||
{
|
||||
}
|
||||
static inline void b43_pio_rx(struct b43_pioqueue *queue)
|
||||
{
|
||||
}
|
||||
static inline void b43_pio_tx_suspend(struct b43_pioqueue *queue)
|
||||
{
|
||||
}
|
||||
static inline void b43_pio_tx_resume(struct b43_pioqueue *queue)
|
||||
{
|
||||
}
|
||||
static inline void b43_pio_freeze_txqueues(struct b43_wldev *dev)
|
||||
{
|
||||
}
|
||||
static inline void b43_pio_thaw_txqueues(struct b43_wldev *dev)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_B43_PIO */
|
||||
#endif /* B43_PIO_H_ */
|
||||
@@ -25,6 +25,8 @@
|
||||
#include "rfkill.h"
|
||||
#include "b43.h"
|
||||
|
||||
#include <linux/kmod.h>
|
||||
|
||||
|
||||
/* Returns TRUE, if the radio is enabled in hardware. */
|
||||
static bool b43_is_hw_radio_enabled(struct b43_wldev *dev)
|
||||
@@ -47,32 +49,44 @@ static void b43_rfkill_poll(struct input_polled_dev *poll_dev)
|
||||
struct b43_wldev *dev = poll_dev->private;
|
||||
struct b43_wl *wl = dev->wl;
|
||||
bool enabled;
|
||||
bool report_change = 0;
|
||||
|
||||
mutex_lock(&wl->mutex);
|
||||
B43_WARN_ON(b43_status(dev) < B43_STAT_INITIALIZED);
|
||||
if (unlikely(b43_status(dev) < B43_STAT_INITIALIZED)) {
|
||||
mutex_unlock(&wl->mutex);
|
||||
return;
|
||||
}
|
||||
enabled = b43_is_hw_radio_enabled(dev);
|
||||
if (unlikely(enabled != dev->radio_hw_enable)) {
|
||||
dev->radio_hw_enable = enabled;
|
||||
report_change = 1;
|
||||
b43info(wl, "Radio hardware status changed to %s\n",
|
||||
enabled ? "ENABLED" : "DISABLED");
|
||||
mutex_unlock(&wl->mutex);
|
||||
input_report_key(poll_dev->input, KEY_WLAN, enabled);
|
||||
} else
|
||||
mutex_unlock(&wl->mutex);
|
||||
}
|
||||
mutex_unlock(&wl->mutex);
|
||||
|
||||
/* send the radio switch event to the system - note both a key press
|
||||
* and a release are required */
|
||||
if (unlikely(report_change)) {
|
||||
input_report_key(poll_dev->input, KEY_WLAN, 1);
|
||||
input_report_key(poll_dev->input, KEY_WLAN, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Called when the RFKILL toggled in software.
|
||||
* This is called without locking. */
|
||||
/* Called when the RFKILL toggled in software. */
|
||||
static int b43_rfkill_soft_toggle(void *data, enum rfkill_state state)
|
||||
{
|
||||
struct b43_wldev *dev = data;
|
||||
struct b43_wl *wl = dev->wl;
|
||||
int err = 0;
|
||||
int err = -EBUSY;
|
||||
|
||||
if (!wl->rfkill.registered)
|
||||
return 0;
|
||||
|
||||
mutex_lock(&wl->mutex);
|
||||
if (b43_status(dev) < B43_STAT_INITIALIZED)
|
||||
goto out_unlock;
|
||||
|
||||
err = 0;
|
||||
switch (state) {
|
||||
case RFKILL_STATE_ON:
|
||||
if (!dev->radio_hw_enable) {
|
||||
@@ -89,7 +103,6 @@ static int b43_rfkill_soft_toggle(void *data, enum rfkill_state state)
|
||||
b43_radio_turn_off(dev, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
out_unlock:
|
||||
mutex_unlock(&wl->mutex);
|
||||
|
||||
@@ -98,11 +111,11 @@ out_unlock:
|
||||
|
||||
char * b43_rfkill_led_name(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_wl *wl = dev->wl;
|
||||
struct b43_rfkill *rfk = &(dev->wl->rfkill);
|
||||
|
||||
if (!wl->rfkill.rfkill)
|
||||
if (!rfk->registered)
|
||||
return NULL;
|
||||
return rfkill_get_led_name(wl->rfkill.rfkill);
|
||||
return rfkill_get_led_name(rfk->rfkill);
|
||||
}
|
||||
|
||||
void b43_rfkill_init(struct b43_wldev *dev)
|
||||
@@ -111,53 +124,13 @@ void b43_rfkill_init(struct b43_wldev *dev)
|
||||
struct b43_rfkill *rfk = &(wl->rfkill);
|
||||
int err;
|
||||
|
||||
if (rfk->rfkill) {
|
||||
err = rfkill_register(rfk->rfkill);
|
||||
if (err) {
|
||||
b43warn(wl, "Failed to register RF-kill button\n");
|
||||
goto err_free_rfk;
|
||||
}
|
||||
}
|
||||
if (rfk->poll_dev) {
|
||||
err = input_register_polled_device(rfk->poll_dev);
|
||||
if (err) {
|
||||
b43warn(wl, "Failed to register RF-kill polldev\n");
|
||||
goto err_free_polldev;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
err_free_rfk:
|
||||
rfkill_free(rfk->rfkill);
|
||||
rfk->rfkill = NULL;
|
||||
err_free_polldev:
|
||||
input_free_polled_device(rfk->poll_dev);
|
||||
rfk->poll_dev = NULL;
|
||||
}
|
||||
|
||||
void b43_rfkill_exit(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_rfkill *rfk = &(dev->wl->rfkill);
|
||||
|
||||
if (rfk->poll_dev)
|
||||
input_unregister_polled_device(rfk->poll_dev);
|
||||
if (rfk->rfkill)
|
||||
rfkill_unregister(rfk->rfkill);
|
||||
}
|
||||
|
||||
void b43_rfkill_alloc(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_wl *wl = dev->wl;
|
||||
struct b43_rfkill *rfk = &(wl->rfkill);
|
||||
|
||||
snprintf(rfk->name, sizeof(rfk->name),
|
||||
"b43-%s", wiphy_name(wl->hw->wiphy));
|
||||
rfk->registered = 0;
|
||||
|
||||
rfk->rfkill = rfkill_allocate(dev->dev->dev, RFKILL_TYPE_WLAN);
|
||||
if (!rfk->rfkill) {
|
||||
b43warn(wl, "Failed to allocate RF-kill button\n");
|
||||
return;
|
||||
}
|
||||
if (!rfk->rfkill)
|
||||
goto out_error;
|
||||
snprintf(rfk->name, sizeof(rfk->name),
|
||||
"b43-%s", wiphy_name(wl->hw->wiphy));
|
||||
rfk->rfkill->name = rfk->name;
|
||||
rfk->rfkill->state = RFKILL_STATE_ON;
|
||||
rfk->rfkill->data = dev;
|
||||
@@ -165,20 +138,64 @@ void b43_rfkill_alloc(struct b43_wldev *dev)
|
||||
rfk->rfkill->user_claim_unsupported = 1;
|
||||
|
||||
rfk->poll_dev = input_allocate_polled_device();
|
||||
if (rfk->poll_dev) {
|
||||
rfk->poll_dev->private = dev;
|
||||
rfk->poll_dev->poll = b43_rfkill_poll;
|
||||
rfk->poll_dev->poll_interval = 1000; /* msecs */
|
||||
} else
|
||||
b43warn(wl, "Failed to allocate RF-kill polldev\n");
|
||||
if (!rfk->poll_dev) {
|
||||
rfkill_free(rfk->rfkill);
|
||||
goto err_freed_rfk;
|
||||
}
|
||||
|
||||
rfk->poll_dev->private = dev;
|
||||
rfk->poll_dev->poll = b43_rfkill_poll;
|
||||
rfk->poll_dev->poll_interval = 1000; /* msecs */
|
||||
|
||||
rfk->poll_dev->input->name = rfk->name;
|
||||
rfk->poll_dev->input->id.bustype = BUS_HOST;
|
||||
rfk->poll_dev->input->id.vendor = dev->dev->bus->boardinfo.vendor;
|
||||
rfk->poll_dev->input->evbit[0] = BIT(EV_KEY);
|
||||
set_bit(KEY_WLAN, rfk->poll_dev->input->keybit);
|
||||
|
||||
err = rfkill_register(rfk->rfkill);
|
||||
if (err)
|
||||
goto err_free_polldev;
|
||||
|
||||
#ifdef CONFIG_RFKILL_INPUT_MODULE
|
||||
/* B43 RF-kill isn't useful without the rfkill-input subsystem.
|
||||
* Try to load the module. */
|
||||
err = request_module("rfkill-input");
|
||||
if (err)
|
||||
b43warn(wl, "Failed to load the rfkill-input module. "
|
||||
"The built-in radio LED will not work.\n");
|
||||
#endif /* CONFIG_RFKILL_INPUT */
|
||||
|
||||
err = input_register_polled_device(rfk->poll_dev);
|
||||
if (err)
|
||||
goto err_unreg_rfk;
|
||||
|
||||
rfk->registered = 1;
|
||||
|
||||
return;
|
||||
err_unreg_rfk:
|
||||
rfkill_unregister(rfk->rfkill);
|
||||
err_free_polldev:
|
||||
input_free_polled_device(rfk->poll_dev);
|
||||
rfk->poll_dev = NULL;
|
||||
err_freed_rfk:
|
||||
rfk->rfkill = NULL;
|
||||
out_error:
|
||||
rfk->registered = 0;
|
||||
b43warn(wl, "RF-kill button init failed\n");
|
||||
}
|
||||
|
||||
void b43_rfkill_free(struct b43_wldev *dev)
|
||||
void b43_rfkill_exit(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_rfkill *rfk = &(dev->wl->rfkill);
|
||||
|
||||
if (!rfk->registered)
|
||||
return;
|
||||
rfk->registered = 0;
|
||||
|
||||
input_unregister_polled_device(rfk->poll_dev);
|
||||
rfkill_unregister(rfk->rfkill);
|
||||
input_free_polled_device(rfk->poll_dev);
|
||||
rfk->poll_dev = NULL;
|
||||
rfkill_free(rfk->rfkill);
|
||||
rfk->rfkill = NULL;
|
||||
}
|
||||
|
||||
@@ -15,14 +15,14 @@ struct b43_rfkill {
|
||||
struct rfkill *rfkill;
|
||||
/* The poll device for the RFKILL input button */
|
||||
struct input_polled_dev *poll_dev;
|
||||
/* Did initialization succeed? Used for freeing. */
|
||||
bool registered;
|
||||
/* The unique name of this rfkill switch */
|
||||
char name[32];
|
||||
char name[sizeof("b43-phy4294967295")];
|
||||
};
|
||||
|
||||
/* All the init functions return void, because we are not interested
|
||||
/* The init function returns void, because we are not interested
|
||||
* in failing the b43 init process when rfkill init failed. */
|
||||
void b43_rfkill_alloc(struct b43_wldev *dev);
|
||||
void b43_rfkill_free(struct b43_wldev *dev);
|
||||
void b43_rfkill_init(struct b43_wldev *dev);
|
||||
void b43_rfkill_exit(struct b43_wldev *dev);
|
||||
|
||||
@@ -36,12 +36,6 @@ struct b43_rfkill {
|
||||
/* empty */
|
||||
};
|
||||
|
||||
static inline void b43_rfkill_alloc(struct b43_wldev *dev)
|
||||
{
|
||||
}
|
||||
static inline void b43_rfkill_free(struct b43_wldev *dev)
|
||||
{
|
||||
}
|
||||
static inline void b43_rfkill_init(struct b43_wldev *dev)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -47,29 +47,6 @@ static int get_integer(const char *buf, size_t count)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int get_boolean(const char *buf, size_t count)
|
||||
{
|
||||
if (count != 0) {
|
||||
if (buf[0] == '1')
|
||||
return 1;
|
||||
if (buf[0] == '0')
|
||||
return 0;
|
||||
if (count >= 4 && memcmp(buf, "true", 4) == 0)
|
||||
return 1;
|
||||
if (count >= 5 && memcmp(buf, "false", 5) == 0)
|
||||
return 0;
|
||||
if (count >= 3 && memcmp(buf, "yes", 3) == 0)
|
||||
return 1;
|
||||
if (count >= 2 && memcmp(buf, "no", 2) == 0)
|
||||
return 0;
|
||||
if (count >= 2 && memcmp(buf, "on", 2) == 0)
|
||||
return 1;
|
||||
if (count >= 3 && memcmp(buf, "off", 3) == 0)
|
||||
return 0;
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static ssize_t b43_attr_interfmode_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
@@ -155,82 +132,18 @@ static ssize_t b43_attr_interfmode_store(struct device *dev,
|
||||
static DEVICE_ATTR(interference, 0644,
|
||||
b43_attr_interfmode_show, b43_attr_interfmode_store);
|
||||
|
||||
static ssize_t b43_attr_preamble_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct b43_wldev *wldev = dev_to_b43_wldev(dev);
|
||||
ssize_t count;
|
||||
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
mutex_lock(&wldev->wl->mutex);
|
||||
|
||||
if (wldev->short_preamble)
|
||||
count =
|
||||
snprintf(buf, PAGE_SIZE, "1 (Short Preamble enabled)\n");
|
||||
else
|
||||
count =
|
||||
snprintf(buf, PAGE_SIZE, "0 (Short Preamble disabled)\n");
|
||||
|
||||
mutex_unlock(&wldev->wl->mutex);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t b43_attr_preamble_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct b43_wldev *wldev = dev_to_b43_wldev(dev);
|
||||
unsigned long flags;
|
||||
int value;
|
||||
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
value = get_boolean(buf, count);
|
||||
if (value < 0)
|
||||
return value;
|
||||
mutex_lock(&wldev->wl->mutex);
|
||||
spin_lock_irqsave(&wldev->wl->irq_lock, flags);
|
||||
|
||||
wldev->short_preamble = !!value;
|
||||
|
||||
spin_unlock_irqrestore(&wldev->wl->irq_lock, flags);
|
||||
mutex_unlock(&wldev->wl->mutex);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(shortpreamble, 0644,
|
||||
b43_attr_preamble_show, b43_attr_preamble_store);
|
||||
|
||||
int b43_sysfs_register(struct b43_wldev *wldev)
|
||||
{
|
||||
struct device *dev = wldev->dev->dev;
|
||||
int err;
|
||||
|
||||
B43_WARN_ON(b43_status(wldev) != B43_STAT_INITIALIZED);
|
||||
|
||||
err = device_create_file(dev, &dev_attr_interference);
|
||||
if (err)
|
||||
goto out;
|
||||
err = device_create_file(dev, &dev_attr_shortpreamble);
|
||||
if (err)
|
||||
goto err_remove_interfmode;
|
||||
|
||||
out:
|
||||
return err;
|
||||
err_remove_interfmode:
|
||||
device_remove_file(dev, &dev_attr_interference);
|
||||
goto out;
|
||||
return device_create_file(dev, &dev_attr_interference);
|
||||
}
|
||||
|
||||
void b43_sysfs_unregister(struct b43_wldev *wldev)
|
||||
{
|
||||
struct device *dev = wldev->dev->dev;
|
||||
|
||||
device_remove_file(dev, &dev_attr_shortpreamble);
|
||||
device_remove_file(dev, &dev_attr_interference);
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
Broadcom B43 wireless driver
|
||||
|
||||
Copyright (c) 2005 Martin Langer <martin-langer@gmx.de>,
|
||||
Copyright (c) 2005 Stefano Brivio <st3@riseup.net>
|
||||
Copyright (c) 2005-2007 Stefano Brivio <stefano.brivio@polimi.it>
|
||||
Copyright (c) 2006, 2006 Michael Buesch <mb@bu3sch.de>
|
||||
Copyright (c) 2005 Danny van Dyk <kugelfang@gentoo.org>
|
||||
Copyright (c) 2005 Andreas Jaggi <andreas.jaggi@waterwave.ch>
|
||||
@@ -229,7 +229,7 @@ const u16 b43_tab_noisea2[] = {
|
||||
};
|
||||
|
||||
const u16 b43_tab_noisea3[] = {
|
||||
0x4C4C, 0x4C4C, 0x4C4C, 0x2D36,
|
||||
0x5E5E, 0x5E5E, 0x5E5E, 0x3F48,
|
||||
0x4C4C, 0x4C4C, 0x4C4C, 0x2D36,
|
||||
};
|
||||
|
||||
@@ -243,6 +243,26 @@ const u16 b43_tab_noiseg2[] = {
|
||||
0x0000, 0x0000, 0x0000, 0x0000,
|
||||
};
|
||||
|
||||
const u16 b43_tab_noisescalea2[] = {
|
||||
0x6767, 0x6767, 0x6767, 0x6767, /* 0 */
|
||||
0x6767, 0x6767, 0x6767, 0x6767,
|
||||
0x6767, 0x6767, 0x6767, 0x6767,
|
||||
0x6767, 0x6700, 0x6767, 0x6767,
|
||||
0x6767, 0x6767, 0x6767, 0x6767, /* 16 */
|
||||
0x6767, 0x6767, 0x6767, 0x6767,
|
||||
0x6767, 0x6767, 0x0067,
|
||||
};
|
||||
|
||||
const u16 b43_tab_noisescalea3[] = {
|
||||
0x2323, 0x2323, 0x2323, 0x2323, /* 0 */
|
||||
0x2323, 0x2323, 0x2323, 0x2323,
|
||||
0x2323, 0x2323, 0x2323, 0x2323,
|
||||
0x2323, 0x2300, 0x2323, 0x2323,
|
||||
0x2323, 0x2323, 0x2323, 0x2323, /* 16 */
|
||||
0x2323, 0x2323, 0x2323, 0x2323,
|
||||
0x2323, 0x2323, 0x0023,
|
||||
};
|
||||
|
||||
const u16 b43_tab_noisescaleg1[] = {
|
||||
0x6C77, 0x5162, 0x3B40, 0x3335, /* 0 */
|
||||
0x2F2D, 0x2A2A, 0x2527, 0x1F21,
|
||||
@@ -254,7 +274,7 @@ const u16 b43_tab_noisescaleg1[] = {
|
||||
};
|
||||
|
||||
const u16 b43_tab_noisescaleg2[] = {
|
||||
0xD8DD, 0xCBD4, 0xBCC0, 0XB6B7, /* 0 */
|
||||
0xD8DD, 0xCBD4, 0xBCC0, 0xB6B7, /* 0 */
|
||||
0xB2B0, 0xADAD, 0xA7A9, 0x9FA1,
|
||||
0x969B, 0x9195, 0x8F8F, 0x8A8A,
|
||||
0x8A8A, 0x8A00, 0x8A8A, 0x8F8A,
|
||||
@@ -307,6 +327,28 @@ const u16 b43_tab_sigmasqr2[] = {
|
||||
0x00DE,
|
||||
};
|
||||
|
||||
const u16 b43_tab_rssiagc1[] = {
|
||||
0xFFF8, 0xFFF8, 0xFFF8, 0xFFF8, /* 0 */
|
||||
0xFFF8, 0xFFF9, 0xFFFC, 0xFFFE,
|
||||
0xFFF8, 0xFFF8, 0xFFF8, 0xFFF8,
|
||||
0xFFF8, 0xFFF8, 0xFFF8, 0xFFF8,
|
||||
};
|
||||
|
||||
const u16 b43_tab_rssiagc2[] = {
|
||||
0x0820, 0x0820, 0x0920, 0x0C38, /* 0 */
|
||||
0x0820, 0x0820, 0x0820, 0x0820,
|
||||
0x0820, 0x0820, 0x0920, 0x0A38,
|
||||
0x0820, 0x0820, 0x0820, 0x0820,
|
||||
0x0820, 0x0820, 0x0920, 0x0A38, /* 16 */
|
||||
0x0820, 0x0820, 0x0820, 0x0820,
|
||||
0x0820, 0x0820, 0x0920, 0x0A38,
|
||||
0x0820, 0x0820, 0x0820, 0x0820,
|
||||
0x0820, 0x0820, 0x0920, 0x0A38, /* 32 */
|
||||
0x0820, 0x0820, 0x0820, 0x0820,
|
||||
0x0820, 0x0820, 0x0920, 0x0A38,
|
||||
0x0820, 0x0820, 0x0820, 0x0820,
|
||||
};
|
||||
|
||||
static inline void assert_sizes(void)
|
||||
{
|
||||
BUILD_BUG_ON(B43_TAB_ROTOR_SIZE != ARRAY_SIZE(b43_tab_rotor));
|
||||
@@ -317,36 +359,73 @@ static inline void assert_sizes(void)
|
||||
BUILD_BUG_ON(B43_TAB_NOISEA3_SIZE != ARRAY_SIZE(b43_tab_noisea3));
|
||||
BUILD_BUG_ON(B43_TAB_NOISEG1_SIZE != ARRAY_SIZE(b43_tab_noiseg1));
|
||||
BUILD_BUG_ON(B43_TAB_NOISEG2_SIZE != ARRAY_SIZE(b43_tab_noiseg2));
|
||||
BUILD_BUG_ON(B43_TAB_NOISESCALEG_SIZE !=
|
||||
BUILD_BUG_ON(B43_TAB_NOISESCALE_SIZE !=
|
||||
ARRAY_SIZE(b43_tab_noisescalea2));
|
||||
BUILD_BUG_ON(B43_TAB_NOISESCALE_SIZE !=
|
||||
ARRAY_SIZE(b43_tab_noisescalea3));
|
||||
BUILD_BUG_ON(B43_TAB_NOISESCALE_SIZE !=
|
||||
ARRAY_SIZE(b43_tab_noisescaleg1));
|
||||
BUILD_BUG_ON(B43_TAB_NOISESCALEG_SIZE !=
|
||||
BUILD_BUG_ON(B43_TAB_NOISESCALE_SIZE !=
|
||||
ARRAY_SIZE(b43_tab_noisescaleg2));
|
||||
BUILD_BUG_ON(B43_TAB_NOISESCALEG_SIZE !=
|
||||
BUILD_BUG_ON(B43_TAB_NOISESCALE_SIZE !=
|
||||
ARRAY_SIZE(b43_tab_noisescaleg3));
|
||||
BUILD_BUG_ON(B43_TAB_SIGMASQR_SIZE != ARRAY_SIZE(b43_tab_sigmasqr1));
|
||||
BUILD_BUG_ON(B43_TAB_SIGMASQR_SIZE != ARRAY_SIZE(b43_tab_sigmasqr2));
|
||||
BUILD_BUG_ON(B43_TAB_RSSIAGC1_SIZE != ARRAY_SIZE(b43_tab_rssiagc1));
|
||||
BUILD_BUG_ON(B43_TAB_RSSIAGC2_SIZE != ARRAY_SIZE(b43_tab_rssiagc2));
|
||||
}
|
||||
|
||||
u16 b43_ofdmtab_read16(struct b43_wldev *dev, u16 table, u16 offset)
|
||||
{
|
||||
assert_sizes();
|
||||
struct b43_phy *phy = &dev->phy;
|
||||
u16 addr;
|
||||
|
||||
addr = table + offset;
|
||||
if ((phy->ofdmtab_addr_direction != B43_OFDMTAB_DIRECTION_READ) ||
|
||||
(addr - 1 != phy->ofdmtab_addr)) {
|
||||
/* The hardware has a different address in memory. Update it. */
|
||||
b43_phy_write(dev, B43_PHY_OTABLECTL, addr);
|
||||
phy->ofdmtab_addr_direction = B43_OFDMTAB_DIRECTION_READ;
|
||||
}
|
||||
phy->ofdmtab_addr = addr;
|
||||
|
||||
b43_phy_write(dev, B43_PHY_OTABLECTL, table + offset);
|
||||
return b43_phy_read(dev, B43_PHY_OTABLEI);
|
||||
|
||||
/* Some compiletime assertions... */
|
||||
assert_sizes();
|
||||
}
|
||||
|
||||
void b43_ofdmtab_write16(struct b43_wldev *dev, u16 table,
|
||||
u16 offset, u16 value)
|
||||
{
|
||||
b43_phy_write(dev, B43_PHY_OTABLECTL, table + offset);
|
||||
struct b43_phy *phy = &dev->phy;
|
||||
u16 addr;
|
||||
|
||||
addr = table + offset;
|
||||
if ((phy->ofdmtab_addr_direction != B43_OFDMTAB_DIRECTION_WRITE) ||
|
||||
(addr - 1 != phy->ofdmtab_addr)) {
|
||||
/* The hardware has a different address in memory. Update it. */
|
||||
b43_phy_write(dev, B43_PHY_OTABLECTL, addr);
|
||||
phy->ofdmtab_addr_direction = B43_OFDMTAB_DIRECTION_WRITE;
|
||||
}
|
||||
phy->ofdmtab_addr = addr;
|
||||
b43_phy_write(dev, B43_PHY_OTABLEI, value);
|
||||
}
|
||||
|
||||
u32 b43_ofdmtab_read32(struct b43_wldev *dev, u16 table, u16 offset)
|
||||
{
|
||||
struct b43_phy *phy = &dev->phy;
|
||||
u32 ret;
|
||||
u16 addr;
|
||||
|
||||
b43_phy_write(dev, B43_PHY_OTABLECTL, table + offset);
|
||||
addr = table + offset;
|
||||
if ((phy->ofdmtab_addr_direction != B43_OFDMTAB_DIRECTION_READ) ||
|
||||
(addr - 1 != phy->ofdmtab_addr)) {
|
||||
/* The hardware has a different address in memory. Update it. */
|
||||
b43_phy_write(dev, B43_PHY_OTABLECTL, addr);
|
||||
phy->ofdmtab_addr_direction = B43_OFDMTAB_DIRECTION_READ;
|
||||
}
|
||||
phy->ofdmtab_addr = addr;
|
||||
ret = b43_phy_read(dev, B43_PHY_OTABLEQ);
|
||||
ret <<= 16;
|
||||
ret |= b43_phy_read(dev, B43_PHY_OTABLEI);
|
||||
@@ -357,7 +436,18 @@ u32 b43_ofdmtab_read32(struct b43_wldev *dev, u16 table, u16 offset)
|
||||
void b43_ofdmtab_write32(struct b43_wldev *dev, u16 table,
|
||||
u16 offset, u32 value)
|
||||
{
|
||||
b43_phy_write(dev, B43_PHY_OTABLECTL, table + offset);
|
||||
struct b43_phy *phy = &dev->phy;
|
||||
u16 addr;
|
||||
|
||||
addr = table + offset;
|
||||
if ((phy->ofdmtab_addr_direction != B43_OFDMTAB_DIRECTION_WRITE) ||
|
||||
(addr - 1 != phy->ofdmtab_addr)) {
|
||||
/* The hardware has a different address in memory. Update it. */
|
||||
b43_phy_write(dev, B43_PHY_OTABLECTL, addr);
|
||||
phy->ofdmtab_addr_direction = B43_OFDMTAB_DIRECTION_WRITE;
|
||||
}
|
||||
phy->ofdmtab_addr = addr;
|
||||
|
||||
b43_phy_write(dev, B43_PHY_OTABLEI, value);
|
||||
b43_phy_write(dev, B43_PHY_OTABLEQ, (value >> 16));
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#ifndef B43_TABLES_H_
|
||||
#define B43_TABLES_H_
|
||||
|
||||
#define B43_TAB_ROTOR_SIZE 53
|
||||
#define B43_TAB_ROTOR_SIZE 53
|
||||
extern const u32 b43_tab_rotor[];
|
||||
#define B43_TAB_RETARD_SIZE 53
|
||||
#define B43_TAB_RETARD_SIZE 53
|
||||
extern const u32 b43_tab_retard[];
|
||||
#define B43_TAB_FINEFREQA_SIZE 256
|
||||
extern const u16 b43_tab_finefreqa[];
|
||||
@@ -17,12 +17,18 @@ extern const u16 b43_tab_noisea3[];
|
||||
extern const u16 b43_tab_noiseg1[];
|
||||
#define B43_TAB_NOISEG2_SIZE 8
|
||||
extern const u16 b43_tab_noiseg2[];
|
||||
#define B43_TAB_NOISESCALEG_SIZE 27
|
||||
#define B43_TAB_NOISESCALE_SIZE 27
|
||||
extern const u16 b43_tab_noisescalea2[];
|
||||
extern const u16 b43_tab_noisescalea3[];
|
||||
extern const u16 b43_tab_noisescaleg1[];
|
||||
extern const u16 b43_tab_noisescaleg2[];
|
||||
extern const u16 b43_tab_noisescaleg3[];
|
||||
#define B43_TAB_SIGMASQR_SIZE 53
|
||||
extern const u16 b43_tab_sigmasqr1[];
|
||||
extern const u16 b43_tab_sigmasqr2[];
|
||||
#define B43_TAB_RSSIAGC1_SIZE 16
|
||||
extern const u16 b43_tab_rssiagc1[];
|
||||
#define B43_TAB_RSSIAGC2_SIZE 48
|
||||
extern const u16 b43_tab_rssiagc2[];
|
||||
|
||||
#endif /* B43_TABLES_H_ */
|
||||
|
||||
2476
package/b43/src/tables_nphy.c
Normal file
2476
package/b43/src/tables_nphy.c
Normal file
File diff suppressed because it is too large
Load Diff
159
package/b43/src/tables_nphy.h
Normal file
159
package/b43/src/tables_nphy.h
Normal file
@@ -0,0 +1,159 @@
|
||||
#ifndef B43_TABLES_NPHY_H_
|
||||
#define B43_TABLES_NPHY_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
|
||||
struct b43_nphy_channeltab_entry {
|
||||
/* The channel number */
|
||||
u8 channel;
|
||||
/* Radio register values on channelswitch */
|
||||
u8 radio_pll_ref;
|
||||
u8 radio_rf_pllmod0;
|
||||
u8 radio_rf_pllmod1;
|
||||
u8 radio_vco_captail;
|
||||
u8 radio_vco_cal1;
|
||||
u8 radio_vco_cal2;
|
||||
u8 radio_pll_lfc1;
|
||||
u8 radio_pll_lfr1;
|
||||
u8 radio_pll_lfc2;
|
||||
u8 radio_lgbuf_cenbuf;
|
||||
u8 radio_lgen_tune1;
|
||||
u8 radio_lgen_tune2;
|
||||
u8 radio_c1_lgbuf_atune;
|
||||
u8 radio_c1_lgbuf_gtune;
|
||||
u8 radio_c1_rx_rfr1;
|
||||
u8 radio_c1_tx_pgapadtn;
|
||||
u8 radio_c1_tx_mxbgtrim;
|
||||
u8 radio_c2_lgbuf_atune;
|
||||
u8 radio_c2_lgbuf_gtune;
|
||||
u8 radio_c2_rx_rfr1;
|
||||
u8 radio_c2_tx_pgapadtn;
|
||||
u8 radio_c2_tx_mxbgtrim;
|
||||
/* PHY register values on channelswitch */
|
||||
u16 phy_bw1a;
|
||||
u16 phy_bw2;
|
||||
u16 phy_bw3;
|
||||
u16 phy_bw4;
|
||||
u16 phy_bw5;
|
||||
u16 phy_bw6;
|
||||
/* The channel frequency in MHz */
|
||||
u16 freq;
|
||||
/* An unknown value */
|
||||
u16 unk2;
|
||||
};
|
||||
|
||||
|
||||
struct b43_wldev;
|
||||
|
||||
/* Upload the default register value table.
|
||||
* If "ghz5" is true, we upload the 5Ghz table. Otherwise the 2.4Ghz
|
||||
* table is uploaded. If "ignore_uploadflag" is true, we upload any value
|
||||
* and ignore the "UPLOAD" flag. */
|
||||
void b2055_upload_inittab(struct b43_wldev *dev,
|
||||
bool ghz5, bool ignore_uploadflag);
|
||||
|
||||
|
||||
/* Get the NPHY Channel Switch Table entry for a channel number.
|
||||
* Returns NULL on failure to find an entry. */
|
||||
const struct b43_nphy_channeltab_entry *
|
||||
b43_nphy_get_chantabent(struct b43_wldev *dev, u8 channel);
|
||||
|
||||
|
||||
/* The N-PHY tables. */
|
||||
|
||||
#define B43_NTAB_TYPEMASK 0xF0000000
|
||||
#define B43_NTAB_8BIT 0x10000000
|
||||
#define B43_NTAB_16BIT 0x20000000
|
||||
#define B43_NTAB_32BIT 0x30000000
|
||||
#define B43_NTAB8(table, offset) (((table) << 10) | (offset) | B43_NTAB_8BIT)
|
||||
#define B43_NTAB16(table, offset) (((table) << 10) | (offset) | B43_NTAB_16BIT)
|
||||
#define B43_NTAB32(table, offset) (((table) << 10) | (offset) | B43_NTAB_32BIT)
|
||||
|
||||
/* Static N-PHY tables */
|
||||
#define B43_NTAB_FRAMESTRUCT B43_NTAB32(0x0A, 0x000) /* Frame Struct Table */
|
||||
#define B43_NTAB_FRAMESTRUCT_SIZE 832
|
||||
#define B43_NTAB_FRAMELT B43_NTAB8 (0x18, 0x000) /* Frame Lookup Table */
|
||||
#define B43_NTAB_FRAMELT_SIZE 32
|
||||
#define B43_NTAB_TMAP B43_NTAB32(0x0C, 0x000) /* T Map Table */
|
||||
#define B43_NTAB_TMAP_SIZE 448
|
||||
#define B43_NTAB_TDTRN B43_NTAB32(0x0E, 0x000) /* TDTRN Table */
|
||||
#define B43_NTAB_TDTRN_SIZE 704
|
||||
#define B43_NTAB_INTLEVEL B43_NTAB32(0x0D, 0x000) /* Int Level Table */
|
||||
#define B43_NTAB_INTLEVEL_SIZE 7
|
||||
#define B43_NTAB_PILOT B43_NTAB16(0x0B, 0x000) /* Pilot Table */
|
||||
#define B43_NTAB_PILOT_SIZE 88
|
||||
#define B43_NTAB_PILOTLT B43_NTAB32(0x14, 0x000) /* Pilot Lookup Table */
|
||||
#define B43_NTAB_PILOTLT_SIZE 6
|
||||
#define B43_NTAB_TDI20A0 B43_NTAB32(0x13, 0x080) /* TDI Table 20 Antenna 0 */
|
||||
#define B43_NTAB_TDI20A0_SIZE 55
|
||||
#define B43_NTAB_TDI20A1 B43_NTAB32(0x13, 0x100) /* TDI Table 20 Antenna 1 */
|
||||
#define B43_NTAB_TDI20A1_SIZE 55
|
||||
#define B43_NTAB_TDI40A0 B43_NTAB32(0x13, 0x280) /* TDI Table 40 Antenna 0 */
|
||||
#define B43_NTAB_TDI40A0_SIZE 110
|
||||
#define B43_NTAB_TDI40A1 B43_NTAB32(0x13, 0x300) /* TDI Table 40 Antenna 1 */
|
||||
#define B43_NTAB_TDI40A1_SIZE 110
|
||||
#define B43_NTAB_BDI B43_NTAB16(0x15, 0x000) /* BDI Table */
|
||||
#define B43_NTAB_BDI_SIZE 6
|
||||
#define B43_NTAB_CHANEST B43_NTAB32(0x16, 0x000) /* Channel Estimate Table */
|
||||
#define B43_NTAB_CHANEST_SIZE 96
|
||||
#define B43_NTAB_MCS B43_NTAB8 (0x12, 0x000) /* MCS Table */
|
||||
#define B43_NTAB_MCS_SIZE 128
|
||||
|
||||
/* Volatile N-PHY tables */
|
||||
#define B43_NTAB_NOISEVAR10 B43_NTAB32(0x10, 0x000) /* Noise Var Table 10 */
|
||||
#define B43_NTAB_NOISEVAR10_SIZE 256
|
||||
#define B43_NTAB_NOISEVAR11 B43_NTAB32(0x10, 0x080) /* Noise Var Table 11 */
|
||||
#define B43_NTAB_NOISEVAR11_SIZE 256
|
||||
#define B43_NTAB_C0_ESTPLT B43_NTAB8 (0x1A, 0x000) /* Estimate Power Lookup Table Core 0 */
|
||||
#define B43_NTAB_C0_ESTPLT_SIZE 64
|
||||
#define B43_NTAB_C1_ESTPLT B43_NTAB8 (0x1B, 0x000) /* Estimate Power Lookup Table Core 1 */
|
||||
#define B43_NTAB_C1_ESTPLT_SIZE 64
|
||||
#define B43_NTAB_C0_ADJPLT B43_NTAB8 (0x1A, 0x040) /* Adjust Power Lookup Table Core 0 */
|
||||
#define B43_NTAB_C0_ADJPLT_SIZE 128
|
||||
#define B43_NTAB_C1_ADJPLT B43_NTAB8 (0x1B, 0x040) /* Adjust Power Lookup Table Core 1 */
|
||||
#define B43_NTAB_C1_ADJPLT_SIZE 128
|
||||
#define B43_NTAB_C0_GAINCTL B43_NTAB32(0x1A, 0x0C0) /* Gain Control Lookup Table Core 0 */
|
||||
#define B43_NTAB_C0_GAINCTL_SIZE 128
|
||||
#define B43_NTAB_C1_GAINCTL B43_NTAB32(0x1B, 0x0C0) /* Gain Control Lookup Table Core 1 */
|
||||
#define B43_NTAB_C1_GAINCTL_SIZE 128
|
||||
#define B43_NTAB_C0_IQLT B43_NTAB32(0x1A, 0x140) /* IQ Lookup Table Core 0 */
|
||||
#define B43_NTAB_C0_IQLT_SIZE 128
|
||||
#define B43_NTAB_C1_IQLT B43_NTAB32(0x1B, 0x140) /* IQ Lookup Table Core 1 */
|
||||
#define B43_NTAB_C1_IQLT_SIZE 128
|
||||
#define B43_NTAB_C0_LOFEEDTH B43_NTAB16(0x1A, 0x1C0) /* Local Oscillator Feed Through Lookup Table Core 0 */
|
||||
#define B43_NTAB_C0_LOFEEDTH_SIZE 128
|
||||
#define B43_NTAB_C1_LOFEEDTH B43_NTAB16(0x1B, 0x1C0) /* Local Oscillator Feed Through Lookup Table Core 1 */
|
||||
#define B43_NTAB_C1_LOFEEDTH_SIZE 128
|
||||
|
||||
void b43_ntab_write(struct b43_wldev *dev, u32 offset, u32 value);
|
||||
|
||||
extern const u8 b43_ntab_adjustpower0[];
|
||||
extern const u8 b43_ntab_adjustpower1[];
|
||||
extern const u16 b43_ntab_bdi[];
|
||||
extern const u32 b43_ntab_channelest[];
|
||||
extern const u8 b43_ntab_estimatepowerlt0[];
|
||||
extern const u8 b43_ntab_estimatepowerlt1[];
|
||||
extern const u8 b43_ntab_framelookup[];
|
||||
extern const u32 b43_ntab_framestruct[];
|
||||
extern const u32 b43_ntab_gainctl0[];
|
||||
extern const u32 b43_ntab_gainctl1[];
|
||||
extern const u32 b43_ntab_intlevel[];
|
||||
extern const u32 b43_ntab_iqlt0[];
|
||||
extern const u32 b43_ntab_iqlt1[];
|
||||
extern const u16 b43_ntab_loftlt0[];
|
||||
extern const u16 b43_ntab_loftlt1[];
|
||||
extern const u8 b43_ntab_mcs[];
|
||||
extern const u32 b43_ntab_noisevar10[];
|
||||
extern const u32 b43_ntab_noisevar11[];
|
||||
extern const u16 b43_ntab_pilot[];
|
||||
extern const u32 b43_ntab_pilotlt[];
|
||||
extern const u32 b43_ntab_tdi20a0[];
|
||||
extern const u32 b43_ntab_tdi20a1[];
|
||||
extern const u32 b43_ntab_tdi40a0[];
|
||||
extern const u32 b43_ntab_tdi40a1[];
|
||||
extern const u32 b43_ntab_tdtrn[];
|
||||
extern const u32 b43_ntab_tmap[];
|
||||
|
||||
|
||||
#endif /* B43_TABLES_NPHY_H_ */
|
||||
674
package/b43/src/wa.c
Normal file
674
package/b43/src/wa.c
Normal file
@@ -0,0 +1,674 @@
|
||||
/*
|
||||
|
||||
Broadcom B43 wireless driver
|
||||
|
||||
PHY workarounds.
|
||||
|
||||
Copyright (c) 2005-2007 Stefano Brivio <stefano.brivio@polimi.it>
|
||||
Copyright (c) 2005-2007 Michael Buesch <mbuesch@freenet.de>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
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; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
|
||||
Boston, MA 02110-1301, USA.
|
||||
|
||||
*/
|
||||
|
||||
#include "b43.h"
|
||||
#include "main.h"
|
||||
#include "tables.h"
|
||||
#include "phy.h"
|
||||
#include "wa.h"
|
||||
|
||||
static void b43_wa_papd(struct b43_wldev *dev)
|
||||
{
|
||||
u16 backup;
|
||||
|
||||
backup = b43_ofdmtab_read16(dev, B43_OFDMTAB_PWRDYN2, 0);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_PWRDYN2, 0, 7);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_UNKNOWN_APHY, 0, 0);
|
||||
b43_dummy_transmission(dev);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_PWRDYN2, 0, backup);
|
||||
}
|
||||
|
||||
static void b43_wa_auxclipthr(struct b43_wldev *dev)
|
||||
{
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x8E), 0x3800);
|
||||
}
|
||||
|
||||
static void b43_wa_afcdac(struct b43_wldev *dev)
|
||||
{
|
||||
b43_phy_write(dev, 0x0035, 0x03FF);
|
||||
b43_phy_write(dev, 0x0036, 0x0400);
|
||||
}
|
||||
|
||||
static void b43_wa_txdc_offset(struct b43_wldev *dev)
|
||||
{
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_DC, 0, 0x0051);
|
||||
}
|
||||
|
||||
void b43_wa_initgains(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_phy *phy = &dev->phy;
|
||||
|
||||
b43_phy_write(dev, B43_PHY_LNAHPFCTL, 0x1FF9);
|
||||
b43_phy_write(dev, B43_PHY_LPFGAINCTL,
|
||||
b43_phy_read(dev, B43_PHY_LPFGAINCTL) & 0xFF0F);
|
||||
if (phy->rev <= 2)
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_LPFGAIN, 0, 0x1FBF);
|
||||
b43_radio_write16(dev, 0x0002, 0x1FBF);
|
||||
|
||||
b43_phy_write(dev, 0x0024, 0x4680);
|
||||
b43_phy_write(dev, 0x0020, 0x0003);
|
||||
b43_phy_write(dev, 0x001D, 0x0F40);
|
||||
b43_phy_write(dev, 0x001F, 0x1C00);
|
||||
if (phy->rev <= 3)
|
||||
b43_phy_write(dev, 0x002A,
|
||||
(b43_phy_read(dev, 0x002A) & 0x00FF) | 0x0400);
|
||||
else if (phy->rev == 5) {
|
||||
b43_phy_write(dev, 0x002A,
|
||||
(b43_phy_read(dev, 0x002A) & 0x00FF) | 0x1A00);
|
||||
b43_phy_write(dev, 0x00CC, 0x2121);
|
||||
}
|
||||
if (phy->rev >= 3)
|
||||
b43_phy_write(dev, 0x00BA, 0x3ED5);
|
||||
}
|
||||
|
||||
static void b43_wa_divider(struct b43_wldev *dev)
|
||||
{
|
||||
b43_phy_write(dev, 0x002B, b43_phy_read(dev, 0x002B) & ~0x0100);
|
||||
b43_phy_write(dev, 0x008E, 0x58C1);
|
||||
}
|
||||
|
||||
static void b43_wa_gt(struct b43_wldev *dev) /* Gain table. */
|
||||
{
|
||||
if (dev->phy.rev <= 2) {
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN2, 0, 15);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN2, 1, 31);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN2, 2, 42);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN2, 3, 48);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN2, 4, 58);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN0, 0, 19);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN0, 1, 19);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN0, 2, 19);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN0, 3, 19);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN0, 4, 21);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN0, 5, 21);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN0, 6, 25);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN1, 0, 3);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN1, 1, 3);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN1, 2, 7);
|
||||
} else {
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN0, 0, 19);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN0, 1, 19);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN0, 2, 19);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN0, 3, 19);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN0, 4, 21);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN0, 5, 21);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAIN0, 6, 25);
|
||||
}
|
||||
}
|
||||
|
||||
static void b43_wa_rssi_lt(struct b43_wldev *dev) /* RSSI lookup table */
|
||||
{
|
||||
int i;
|
||||
|
||||
if (0 /* FIXME: For APHY.rev=2 this might be needed */) {
|
||||
for (i = 0; i < 8; i++)
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_RSSI, i, i + 8);
|
||||
for (i = 8; i < 16; i++)
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_RSSI, i, i - 8);
|
||||
} else {
|
||||
for (i = 0; i < 64; i++)
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_RSSI, i, i);
|
||||
}
|
||||
}
|
||||
|
||||
static void b43_wa_analog(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_phy *phy = &dev->phy;
|
||||
u16 ofdmrev;
|
||||
|
||||
ofdmrev = b43_phy_read(dev, B43_PHY_VERSION_OFDM) & B43_PHYVER_VERSION;
|
||||
if (ofdmrev > 2) {
|
||||
if (phy->type == B43_PHYTYPE_A)
|
||||
b43_phy_write(dev, B43_PHY_PWRDOWN, 0x1808);
|
||||
else
|
||||
b43_phy_write(dev, B43_PHY_PWRDOWN, 0x1000);
|
||||
} else {
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_DAC, 3, 0x1044);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_DAC, 4, 0x7201);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_DAC, 6, 0x0040);
|
||||
}
|
||||
}
|
||||
|
||||
static void b43_wa_dac(struct b43_wldev *dev)
|
||||
{
|
||||
if (dev->phy.analog == 1)
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_DAC, 1,
|
||||
(b43_ofdmtab_read16(dev, B43_OFDMTAB_DAC, 1) & ~0x0034) | 0x0008);
|
||||
else
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_DAC, 1,
|
||||
(b43_ofdmtab_read16(dev, B43_OFDMTAB_DAC, 1) & ~0x0078) | 0x0010);
|
||||
}
|
||||
|
||||
static void b43_wa_fft(struct b43_wldev *dev) /* Fine frequency table */
|
||||
{
|
||||
int i;
|
||||
|
||||
if (dev->phy.type == B43_PHYTYPE_A)
|
||||
for (i = 0; i < B43_TAB_FINEFREQA_SIZE; i++)
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_DACRFPABB, i, b43_tab_finefreqa[i]);
|
||||
else
|
||||
for (i = 0; i < B43_TAB_FINEFREQG_SIZE; i++)
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_DACRFPABB, i, b43_tab_finefreqg[i]);
|
||||
}
|
||||
|
||||
static void b43_wa_nft(struct b43_wldev *dev) /* Noise figure table */
|
||||
{
|
||||
struct b43_phy *phy = &dev->phy;
|
||||
int i;
|
||||
|
||||
if (phy->type == B43_PHYTYPE_A) {
|
||||
if (phy->rev == 2)
|
||||
for (i = 0; i < B43_TAB_NOISEA2_SIZE; i++)
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC2, i, b43_tab_noisea2[i]);
|
||||
else
|
||||
for (i = 0; i < B43_TAB_NOISEA3_SIZE; i++)
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC2, i, b43_tab_noisea3[i]);
|
||||
} else {
|
||||
if (phy->rev == 1)
|
||||
for (i = 0; i < B43_TAB_NOISEG1_SIZE; i++)
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC2, i, b43_tab_noiseg1[i]);
|
||||
else
|
||||
for (i = 0; i < B43_TAB_NOISEG2_SIZE; i++)
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC2, i, b43_tab_noiseg2[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static void b43_wa_rt(struct b43_wldev *dev) /* Rotor table */
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < B43_TAB_ROTOR_SIZE; i++)
|
||||
b43_ofdmtab_write32(dev, B43_OFDMTAB_ROTOR, i, b43_tab_rotor[i]);
|
||||
}
|
||||
|
||||
static void b43_wa_nst(struct b43_wldev *dev) /* Noise scale table */
|
||||
{
|
||||
struct b43_phy *phy = &dev->phy;
|
||||
int i;
|
||||
|
||||
if (phy->type == B43_PHYTYPE_A) {
|
||||
if (phy->rev <= 1)
|
||||
for (i = 0; i < B43_TAB_NOISESCALE_SIZE; i++)
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_NOISESCALE,
|
||||
i, 0);
|
||||
else if (phy->rev == 2)
|
||||
for (i = 0; i < B43_TAB_NOISESCALE_SIZE; i++)
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_NOISESCALE,
|
||||
i, b43_tab_noisescalea2[i]);
|
||||
else if (phy->rev == 3)
|
||||
for (i = 0; i < B43_TAB_NOISESCALE_SIZE; i++)
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_NOISESCALE,
|
||||
i, b43_tab_noisescalea3[i]);
|
||||
else
|
||||
for (i = 0; i < B43_TAB_NOISESCALE_SIZE; i++)
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_NOISESCALE,
|
||||
i, b43_tab_noisescaleg3[i]);
|
||||
} else {
|
||||
if (phy->rev >= 6) {
|
||||
if (b43_phy_read(dev, B43_PHY_ENCORE) & B43_PHY_ENCORE_EN)
|
||||
for (i = 0; i < B43_TAB_NOISESCALE_SIZE; i++)
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_NOISESCALE,
|
||||
i, b43_tab_noisescaleg3[i]);
|
||||
else
|
||||
for (i = 0; i < B43_TAB_NOISESCALE_SIZE; i++)
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_NOISESCALE,
|
||||
i, b43_tab_noisescaleg2[i]);
|
||||
} else {
|
||||
for (i = 0; i < B43_TAB_NOISESCALE_SIZE; i++)
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_NOISESCALE,
|
||||
i, b43_tab_noisescaleg1[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void b43_wa_art(struct b43_wldev *dev) /* ADV retard table */
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < B43_TAB_RETARD_SIZE; i++)
|
||||
b43_ofdmtab_write32(dev, B43_OFDMTAB_ADVRETARD,
|
||||
i, b43_tab_retard[i]);
|
||||
}
|
||||
|
||||
static void b43_wa_txlna_gain(struct b43_wldev *dev)
|
||||
{
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_DC, 13, 0x0000);
|
||||
}
|
||||
|
||||
static void b43_wa_crs_reset(struct b43_wldev *dev)
|
||||
{
|
||||
b43_phy_write(dev, 0x002C, 0x0064);
|
||||
}
|
||||
|
||||
static void b43_wa_2060txlna_gain(struct b43_wldev *dev)
|
||||
{
|
||||
b43_hf_write(dev, b43_hf_read(dev) |
|
||||
B43_HF_2060W);
|
||||
}
|
||||
|
||||
static void b43_wa_lms(struct b43_wldev *dev)
|
||||
{
|
||||
b43_phy_write(dev, 0x0055,
|
||||
(b43_phy_read(dev, 0x0055) & 0xFFC0) | 0x0004);
|
||||
}
|
||||
|
||||
static void b43_wa_mixedsignal(struct b43_wldev *dev)
|
||||
{
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_DAC, 1, 3);
|
||||
}
|
||||
|
||||
static void b43_wa_msst(struct b43_wldev *dev) /* Min sigma square table */
|
||||
{
|
||||
struct b43_phy *phy = &dev->phy;
|
||||
int i;
|
||||
const u16 *tab;
|
||||
|
||||
if (phy->type == B43_PHYTYPE_A) {
|
||||
tab = b43_tab_sigmasqr1;
|
||||
} else if (phy->type == B43_PHYTYPE_G) {
|
||||
tab = b43_tab_sigmasqr2;
|
||||
} else {
|
||||
B43_WARN_ON(1);
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < B43_TAB_SIGMASQR_SIZE; i++) {
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_MINSIGSQ,
|
||||
i, tab[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static void b43_wa_iqadc(struct b43_wldev *dev)
|
||||
{
|
||||
if (dev->phy.analog == 4)
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_DAC, 0,
|
||||
b43_ofdmtab_read16(dev, B43_OFDMTAB_DAC, 0) & ~0xF000);
|
||||
}
|
||||
|
||||
static void b43_wa_crs_ed(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_phy *phy = &dev->phy;
|
||||
|
||||
if (phy->rev == 1) {
|
||||
b43_phy_write(dev, B43_PHY_CRSTHRES1_R1, 0x4F19);
|
||||
} else if (phy->rev == 2) {
|
||||
b43_phy_write(dev, B43_PHY_CRSTHRES1, 0x1861);
|
||||
b43_phy_write(dev, B43_PHY_CRSTHRES2, 0x0271);
|
||||
b43_phy_write(dev, B43_PHY_ANTDWELL,
|
||||
b43_phy_read(dev, B43_PHY_ANTDWELL)
|
||||
| 0x0800);
|
||||
} else {
|
||||
b43_phy_write(dev, B43_PHY_CRSTHRES1, 0x0098);
|
||||
b43_phy_write(dev, B43_PHY_CRSTHRES2, 0x0070);
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0xC9), 0x0080);
|
||||
b43_phy_write(dev, B43_PHY_ANTDWELL,
|
||||
b43_phy_read(dev, B43_PHY_ANTDWELL)
|
||||
| 0x0800);
|
||||
}
|
||||
}
|
||||
|
||||
static void b43_wa_crs_thr(struct b43_wldev *dev)
|
||||
{
|
||||
b43_phy_write(dev, B43_PHY_CRS0,
|
||||
(b43_phy_read(dev, B43_PHY_CRS0) & ~0x03C0) | 0xD000);
|
||||
}
|
||||
|
||||
static void b43_wa_crs_blank(struct b43_wldev *dev)
|
||||
{
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x2C), 0x005A);
|
||||
}
|
||||
|
||||
static void b43_wa_cck_shiftbits(struct b43_wldev *dev)
|
||||
{
|
||||
b43_phy_write(dev, B43_PHY_CCKSHIFTBITS, 0x0026);
|
||||
}
|
||||
|
||||
static void b43_wa_wrssi_offset(struct b43_wldev *dev)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (dev->phy.rev == 1) {
|
||||
for (i = 0; i < 16; i++) {
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_WRSSI_R1,
|
||||
i, 0x0020);
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < 32; i++) {
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_WRSSI,
|
||||
i, 0x0820);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void b43_wa_txpuoff_rxpuon(struct b43_wldev *dev)
|
||||
{
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_UNKNOWN_0F, 2, 15);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_UNKNOWN_0F, 3, 20);
|
||||
}
|
||||
|
||||
static void b43_wa_altagc(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_phy *phy = &dev->phy;
|
||||
|
||||
if (phy->rev == 1) {
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC1_R1, 0, 254);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC1_R1, 1, 13);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC1_R1, 2, 19);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC1_R1, 3, 25);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC2, 0, 0x2710);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC2, 1, 0x9B83);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC2, 2, 0x9B83);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC2, 3, 0x0F8D);
|
||||
b43_phy_write(dev, B43_PHY_LMS, 4);
|
||||
} else {
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC1, 0, 254);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC1, 1, 13);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC1, 2, 19);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC1, 3, 25);
|
||||
}
|
||||
|
||||
b43_phy_write(dev, B43_PHY_CCKSHIFTBITS_WA,
|
||||
(b43_phy_read(dev, B43_PHY_CCKSHIFTBITS_WA) & ~0xFF00) | 0x5700);
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x1A),
|
||||
(b43_phy_read(dev, B43_PHY_OFDM(0x1A)) & ~0x007F) | 0x000F);
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x1A),
|
||||
(b43_phy_read(dev, B43_PHY_OFDM(0x1A)) & ~0x3F80) | 0x2B80);
|
||||
b43_phy_write(dev, B43_PHY_ANTWRSETT,
|
||||
(b43_phy_read(dev, B43_PHY_ANTWRSETT) & 0xF0FF) | 0x0300);
|
||||
b43_radio_write16(dev, 0x7A,
|
||||
b43_radio_read16(dev, 0x7A) | 0x0008);
|
||||
b43_phy_write(dev, B43_PHY_N1P1GAIN,
|
||||
(b43_phy_read(dev, B43_PHY_N1P1GAIN) & ~0x000F) | 0x0008);
|
||||
b43_phy_write(dev, B43_PHY_P1P2GAIN,
|
||||
(b43_phy_read(dev, B43_PHY_P1P2GAIN) & ~0x0F00) | 0x0600);
|
||||
b43_phy_write(dev, B43_PHY_N1N2GAIN,
|
||||
(b43_phy_read(dev, B43_PHY_N1N2GAIN) & ~0x0F00) | 0x0700);
|
||||
b43_phy_write(dev, B43_PHY_N1P1GAIN,
|
||||
(b43_phy_read(dev, B43_PHY_N1P1GAIN) & ~0x0F00) | 0x0100);
|
||||
if (phy->rev == 1) {
|
||||
b43_phy_write(dev, B43_PHY_N1N2GAIN,
|
||||
(b43_phy_read(dev, B43_PHY_N1N2GAIN)
|
||||
& ~0x000F) | 0x0007);
|
||||
}
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x88),
|
||||
(b43_phy_read(dev, B43_PHY_OFDM(0x88)) & ~0x00FF) | 0x001C);
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x88),
|
||||
(b43_phy_read(dev, B43_PHY_OFDM(0x88)) & ~0x3F00) | 0x0200);
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x96),
|
||||
(b43_phy_read(dev, B43_PHY_OFDM(0x96)) & ~0x00FF) | 0x001C);
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x89),
|
||||
(b43_phy_read(dev, B43_PHY_OFDM(0x89)) & ~0x00FF) | 0x0020);
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x89),
|
||||
(b43_phy_read(dev, B43_PHY_OFDM(0x89)) & ~0x3F00) | 0x0200);
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x82),
|
||||
(b43_phy_read(dev, B43_PHY_OFDM(0x82)) & ~0x00FF) | 0x002E);
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x96),
|
||||
(b43_phy_read(dev, B43_PHY_OFDM(0x96)) & ~0xFF00) | 0x1A00);
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x81),
|
||||
(b43_phy_read(dev, B43_PHY_OFDM(0x81)) & ~0x00FF) | 0x0028);
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x81),
|
||||
(b43_phy_read(dev, B43_PHY_OFDM(0x81)) & ~0xFF00) | 0x2C00);
|
||||
if (phy->rev == 1) {
|
||||
b43_phy_write(dev, B43_PHY_PEAK_COUNT, 0x092B);
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x1B),
|
||||
(b43_phy_read(dev, B43_PHY_OFDM(0x1B)) & ~0x001E) | 0x0002);
|
||||
} else {
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x1B),
|
||||
b43_phy_read(dev, B43_PHY_OFDM(0x1B)) & ~0x001E);
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x1F), 0x287A);
|
||||
b43_phy_write(dev, B43_PHY_LPFGAINCTL,
|
||||
(b43_phy_read(dev, B43_PHY_LPFGAINCTL) & ~0x000F) | 0x0004);
|
||||
if (phy->rev >= 6) {
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x22), 0x287A);
|
||||
b43_phy_write(dev, B43_PHY_LPFGAINCTL,
|
||||
(b43_phy_read(dev, B43_PHY_LPFGAINCTL) & ~0xF000) | 0x3000);
|
||||
}
|
||||
}
|
||||
b43_phy_write(dev, B43_PHY_DIVSRCHIDX,
|
||||
(b43_phy_read(dev, B43_PHY_DIVSRCHIDX) & 0x8080) | 0x7874);
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x8E), 0x1C00);
|
||||
if (phy->rev == 1) {
|
||||
b43_phy_write(dev, B43_PHY_DIVP1P2GAIN,
|
||||
(b43_phy_read(dev, B43_PHY_DIVP1P2GAIN) & ~0x0F00) | 0x0600);
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x8B), 0x005E);
|
||||
b43_phy_write(dev, B43_PHY_ANTWRSETT,
|
||||
(b43_phy_read(dev, B43_PHY_ANTWRSETT) & ~0x00FF) | 0x001E);
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x8D), 0x0002);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC3_R1, 0, 0);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC3_R1, 1, 7);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC3_R1, 2, 16);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC3_R1, 3, 28);
|
||||
} else {
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC3, 0, 0);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC3, 1, 7);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC3, 2, 16);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC3, 3, 28);
|
||||
}
|
||||
if (phy->rev >= 6) {
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x26),
|
||||
b43_phy_read(dev, B43_PHY_OFDM(0x26)) & ~0x0003);
|
||||
b43_phy_write(dev, B43_PHY_OFDM(0x26),
|
||||
b43_phy_read(dev, B43_PHY_OFDM(0x26)) & ~0x1000);
|
||||
}
|
||||
b43_phy_read(dev, B43_PHY_VERSION_OFDM); /* Dummy read */
|
||||
}
|
||||
|
||||
static void b43_wa_tr_ltov(struct b43_wldev *dev) /* TR Lookup Table Original Values */
|
||||
{
|
||||
b43_gtab_write(dev, B43_GTAB_ORIGTR, 0, 0xC480);
|
||||
}
|
||||
|
||||
static void b43_wa_cpll_nonpilot(struct b43_wldev *dev)
|
||||
{
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_UNKNOWN_11, 0, 0);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_UNKNOWN_11, 1, 0);
|
||||
}
|
||||
|
||||
static void b43_wa_rssi_adc(struct b43_wldev *dev)
|
||||
{
|
||||
if (dev->phy.analog == 4)
|
||||
b43_phy_write(dev, 0x00DC, 0x7454);
|
||||
}
|
||||
|
||||
static void b43_wa_boards_a(struct b43_wldev *dev)
|
||||
{
|
||||
struct ssb_bus *bus = dev->dev->bus;
|
||||
|
||||
if (bus->boardinfo.vendor == SSB_BOARDVENDOR_BCM &&
|
||||
bus->boardinfo.type == SSB_BOARD_BU4306 &&
|
||||
bus->boardinfo.rev < 0x30) {
|
||||
b43_phy_write(dev, 0x0010, 0xE000);
|
||||
b43_phy_write(dev, 0x0013, 0x0140);
|
||||
b43_phy_write(dev, 0x0014, 0x0280);
|
||||
} else {
|
||||
if (bus->boardinfo.type == SSB_BOARD_MP4318 &&
|
||||
bus->boardinfo.rev < 0x20) {
|
||||
b43_phy_write(dev, 0x0013, 0x0210);
|
||||
b43_phy_write(dev, 0x0014, 0x0840);
|
||||
} else {
|
||||
b43_phy_write(dev, 0x0013, 0x0140);
|
||||
b43_phy_write(dev, 0x0014, 0x0280);
|
||||
}
|
||||
if (dev->phy.rev <= 4)
|
||||
b43_phy_write(dev, 0x0010, 0xE000);
|
||||
else
|
||||
b43_phy_write(dev, 0x0010, 0x2000);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_DC, 1, 0x0039);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_UNKNOWN_APHY, 7, 0x0040);
|
||||
}
|
||||
}
|
||||
|
||||
static void b43_wa_boards_g(struct b43_wldev *dev)
|
||||
{
|
||||
struct ssb_bus *bus = dev->dev->bus;
|
||||
struct b43_phy *phy = &dev->phy;
|
||||
|
||||
if (bus->boardinfo.vendor != SSB_BOARDVENDOR_BCM ||
|
||||
bus->boardinfo.type != SSB_BOARD_BU4306 ||
|
||||
bus->boardinfo.rev != 0x17) {
|
||||
if (phy->rev < 2) {
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAINX_R1, 1, 0x0002);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAINX_R1, 2, 0x0001);
|
||||
} else {
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAINX, 1, 0x0002);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAINX, 2, 0x0001);
|
||||
if ((bus->sprom.boardflags_lo & B43_BFL_EXTLNA) &&
|
||||
(phy->rev >= 7)) {
|
||||
b43_phy_write(dev, B43_PHY_EXTG(0x11),
|
||||
b43_phy_read(dev, B43_PHY_EXTG(0x11)) & 0xF7FF);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAINX, 0x0020, 0x0001);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAINX, 0x0021, 0x0001);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAINX, 0x0022, 0x0001);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAINX, 0x0023, 0x0000);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAINX, 0x0000, 0x0000);
|
||||
b43_ofdmtab_write16(dev, B43_OFDMTAB_GAINX, 0x0003, 0x0002);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (bus->sprom.boardflags_lo & B43_BFL_FEM) {
|
||||
b43_phy_write(dev, B43_PHY_GTABCTL, 0x3120);
|
||||
b43_phy_write(dev, B43_PHY_GTABDATA, 0xC480);
|
||||
}
|
||||
}
|
||||
|
||||
void b43_wa_all(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_phy *phy = &dev->phy;
|
||||
|
||||
if (phy->type == B43_PHYTYPE_A) {
|
||||
switch (phy->rev) {
|
||||
case 2:
|
||||
b43_wa_papd(dev);
|
||||
b43_wa_auxclipthr(dev);
|
||||
b43_wa_afcdac(dev);
|
||||
b43_wa_txdc_offset(dev);
|
||||
b43_wa_initgains(dev);
|
||||
b43_wa_divider(dev);
|
||||
b43_wa_gt(dev);
|
||||
b43_wa_rssi_lt(dev);
|
||||
b43_wa_analog(dev);
|
||||
b43_wa_dac(dev);
|
||||
b43_wa_fft(dev);
|
||||
b43_wa_nft(dev);
|
||||
b43_wa_rt(dev);
|
||||
b43_wa_nst(dev);
|
||||
b43_wa_art(dev);
|
||||
b43_wa_txlna_gain(dev);
|
||||
b43_wa_crs_reset(dev);
|
||||
b43_wa_2060txlna_gain(dev);
|
||||
b43_wa_lms(dev);
|
||||
break;
|
||||
case 3:
|
||||
b43_wa_papd(dev);
|
||||
b43_wa_mixedsignal(dev);
|
||||
b43_wa_rssi_lt(dev);
|
||||
b43_wa_txdc_offset(dev);
|
||||
b43_wa_initgains(dev);
|
||||
b43_wa_dac(dev);
|
||||
b43_wa_nft(dev);
|
||||
b43_wa_nst(dev);
|
||||
b43_wa_msst(dev);
|
||||
b43_wa_analog(dev);
|
||||
b43_wa_gt(dev);
|
||||
b43_wa_txpuoff_rxpuon(dev);
|
||||
b43_wa_txlna_gain(dev);
|
||||
break;
|
||||
case 5:
|
||||
b43_wa_iqadc(dev);
|
||||
case 6:
|
||||
b43_wa_papd(dev);
|
||||
b43_wa_rssi_lt(dev);
|
||||
b43_wa_txdc_offset(dev);
|
||||
b43_wa_initgains(dev);
|
||||
b43_wa_dac(dev);
|
||||
b43_wa_nft(dev);
|
||||
b43_wa_nst(dev);
|
||||
b43_wa_msst(dev);
|
||||
b43_wa_analog(dev);
|
||||
b43_wa_gt(dev);
|
||||
b43_wa_txpuoff_rxpuon(dev);
|
||||
b43_wa_txlna_gain(dev);
|
||||
break;
|
||||
case 7:
|
||||
b43_wa_iqadc(dev);
|
||||
b43_wa_papd(dev);
|
||||
b43_wa_rssi_lt(dev);
|
||||
b43_wa_txdc_offset(dev);
|
||||
b43_wa_initgains(dev);
|
||||
b43_wa_dac(dev);
|
||||
b43_wa_nft(dev);
|
||||
b43_wa_nst(dev);
|
||||
b43_wa_msst(dev);
|
||||
b43_wa_analog(dev);
|
||||
b43_wa_gt(dev);
|
||||
b43_wa_txpuoff_rxpuon(dev);
|
||||
b43_wa_txlna_gain(dev);
|
||||
b43_wa_rssi_adc(dev);
|
||||
default:
|
||||
B43_WARN_ON(1);
|
||||
}
|
||||
b43_wa_boards_a(dev);
|
||||
} else if (phy->type == B43_PHYTYPE_G) {
|
||||
switch (phy->rev) {
|
||||
case 1://XXX review rev1
|
||||
b43_wa_crs_ed(dev);
|
||||
b43_wa_crs_thr(dev);
|
||||
b43_wa_crs_blank(dev);
|
||||
b43_wa_cck_shiftbits(dev);
|
||||
b43_wa_fft(dev);
|
||||
b43_wa_nft(dev);
|
||||
b43_wa_rt(dev);
|
||||
b43_wa_nst(dev);
|
||||
b43_wa_art(dev);
|
||||
b43_wa_wrssi_offset(dev);
|
||||
b43_wa_altagc(dev);
|
||||
break;
|
||||
case 2:
|
||||
case 6:
|
||||
case 7:
|
||||
case 8:
|
||||
case 9:
|
||||
b43_wa_tr_ltov(dev);
|
||||
b43_wa_crs_ed(dev);
|
||||
b43_wa_rssi_lt(dev);
|
||||
b43_wa_nft(dev);
|
||||
b43_wa_nst(dev);
|
||||
b43_wa_msst(dev);
|
||||
b43_wa_wrssi_offset(dev);
|
||||
b43_wa_altagc(dev);
|
||||
b43_wa_analog(dev);
|
||||
b43_wa_txpuoff_rxpuon(dev);
|
||||
break;
|
||||
default:
|
||||
B43_WARN_ON(1);
|
||||
}
|
||||
b43_wa_boards_g(dev);
|
||||
} else { /* No N PHY support so far */
|
||||
B43_WARN_ON(1);
|
||||
}
|
||||
|
||||
b43_wa_cpll_nonpilot(dev);
|
||||
}
|
||||
7
package/b43/src/wa.h
Normal file
7
package/b43/src/wa.h
Normal file
@@ -0,0 +1,7 @@
|
||||
#ifndef B43_WA_H_
|
||||
#define B43_WA_H_
|
||||
|
||||
void b43_wa_initgains(struct b43_wldev *dev);
|
||||
void b43_wa_all(struct b43_wldev *dev);
|
||||
|
||||
#endif /* B43_WA_H_ */
|
||||
@@ -5,7 +5,7 @@
|
||||
Transmission (TX/RX) related functions.
|
||||
|
||||
Copyright (C) 2005 Martin Langer <martin-langer@gmx.de>
|
||||
Copyright (C) 2005 Stefano Brivio <st3@riseup.net>
|
||||
Copyright (C) 2005 Stefano Brivio <stefano.brivio@polimi.it>
|
||||
Copyright (C) 2005, 2006 Michael Buesch <mb@bu3sch.de>
|
||||
Copyright (C) 2005 Danny van Dyk <kugelfang@gentoo.org>
|
||||
Copyright (C) 2005 Andreas Jaggi <andreas.jaggi@waterwave.ch>
|
||||
@@ -30,48 +30,50 @@
|
||||
#include "xmit.h"
|
||||
#include "phy.h"
|
||||
#include "dma.h"
|
||||
#include "pio.h"
|
||||
|
||||
/* Extract the bitrate out of a CCK PLCP header. */
|
||||
static u8 b43_plcp_get_bitrate_cck(struct b43_plcp_hdr6 *plcp)
|
||||
|
||||
/* Extract the bitrate index out of a CCK PLCP header. */
|
||||
static int b43_plcp_get_bitrate_idx_cck(struct b43_plcp_hdr6 *plcp)
|
||||
{
|
||||
switch (plcp->raw[0]) {
|
||||
case 0x0A:
|
||||
return B43_CCK_RATE_1MB;
|
||||
return 0;
|
||||
case 0x14:
|
||||
return B43_CCK_RATE_2MB;
|
||||
return 1;
|
||||
case 0x37:
|
||||
return B43_CCK_RATE_5MB;
|
||||
return 2;
|
||||
case 0x6E:
|
||||
return B43_CCK_RATE_11MB;
|
||||
return 3;
|
||||
}
|
||||
B43_WARN_ON(1);
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Extract the bitrate out of an OFDM PLCP header. */
|
||||
static u8 b43_plcp_get_bitrate_ofdm(struct b43_plcp_hdr6 *plcp)
|
||||
/* Extract the bitrate index out of an OFDM PLCP header. */
|
||||
static u8 b43_plcp_get_bitrate_idx_ofdm(struct b43_plcp_hdr6 *plcp, bool aphy)
|
||||
{
|
||||
int base = aphy ? 0 : 4;
|
||||
|
||||
switch (plcp->raw[0] & 0xF) {
|
||||
case 0xB:
|
||||
return B43_OFDM_RATE_6MB;
|
||||
return base + 0;
|
||||
case 0xF:
|
||||
return B43_OFDM_RATE_9MB;
|
||||
return base + 1;
|
||||
case 0xA:
|
||||
return B43_OFDM_RATE_12MB;
|
||||
return base + 2;
|
||||
case 0xE:
|
||||
return B43_OFDM_RATE_18MB;
|
||||
return base + 3;
|
||||
case 0x9:
|
||||
return B43_OFDM_RATE_24MB;
|
||||
return base + 4;
|
||||
case 0xD:
|
||||
return B43_OFDM_RATE_36MB;
|
||||
return base + 5;
|
||||
case 0x8:
|
||||
return B43_OFDM_RATE_48MB;
|
||||
return base + 6;
|
||||
case 0xC:
|
||||
return B43_OFDM_RATE_54MB;
|
||||
return base + 7;
|
||||
}
|
||||
B43_WARN_ON(1);
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
u8 b43_plcp_get_ratecode_cck(const u8 bitrate)
|
||||
@@ -177,18 +179,21 @@ static u8 b43_calc_fallback_rate(u8 bitrate)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void generate_txhdr_fw4(struct b43_wldev *dev,
|
||||
struct b43_txhdr_fw4 *txhdr,
|
||||
const unsigned char *fragment_data,
|
||||
unsigned int fragment_len,
|
||||
const struct ieee80211_tx_control *txctl,
|
||||
u16 cookie)
|
||||
/* Generate a TX data header. */
|
||||
int b43_generate_txhdr(struct b43_wldev *dev,
|
||||
u8 *_txhdr,
|
||||
const unsigned char *fragment_data,
|
||||
unsigned int fragment_len,
|
||||
const struct ieee80211_tx_control *txctl,
|
||||
u16 cookie)
|
||||
{
|
||||
struct b43_txhdr *txhdr = (struct b43_txhdr *)_txhdr;
|
||||
const struct b43_phy *phy = &dev->phy;
|
||||
const struct ieee80211_hdr *wlhdr =
|
||||
(const struct ieee80211_hdr *)fragment_data;
|
||||
int use_encryption = (!(txctl->flags & IEEE80211_TXCTL_DO_NOT_ENCRYPT));
|
||||
u16 fctl = le16_to_cpu(wlhdr->frame_control);
|
||||
struct ieee80211_rate *fbrate;
|
||||
u8 rate, rate_fb;
|
||||
int rate_ofdm, rate_fb_ofdm;
|
||||
unsigned int plcp_fragment_len;
|
||||
@@ -198,9 +203,11 @@ static void generate_txhdr_fw4(struct b43_wldev *dev,
|
||||
|
||||
memset(txhdr, 0, sizeof(*txhdr));
|
||||
|
||||
rate = txctl->tx_rate;
|
||||
WARN_ON(!txctl->tx_rate);
|
||||
rate = txctl->tx_rate ? txctl->tx_rate->hw_value : B43_CCK_RATE_1MB;
|
||||
rate_ofdm = b43_is_ofdm_rate(rate);
|
||||
rate_fb = (txctl->alt_retry_rate == -1) ? rate : txctl->alt_retry_rate;
|
||||
fbrate = txctl->alt_retry_rate ? : txctl->tx_rate;
|
||||
rate_fb = fbrate->hw_value;
|
||||
rate_fb_ofdm = b43_is_ofdm_rate(rate_fb);
|
||||
|
||||
if (rate_ofdm)
|
||||
@@ -219,11 +226,10 @@ static void generate_txhdr_fw4(struct b43_wldev *dev,
|
||||
* use the original dur_id field. */
|
||||
txhdr->dur_fb = wlhdr->duration_id;
|
||||
} else {
|
||||
int fbrate_base100kbps = B43_RATE_TO_BASE100KBPS(rate_fb);
|
||||
txhdr->dur_fb = ieee80211_generic_frame_duration(dev->wl->hw,
|
||||
dev->wl->if_id,
|
||||
txctl->vif,
|
||||
fragment_len,
|
||||
fbrate_base100kbps);
|
||||
fbrate);
|
||||
}
|
||||
|
||||
plcp_fragment_len = fragment_len + FCS_LEN;
|
||||
@@ -235,29 +241,44 @@ static void generate_txhdr_fw4(struct b43_wldev *dev,
|
||||
|
||||
B43_WARN_ON(key_idx >= dev->max_nr_keys);
|
||||
key = &(dev->key[key_idx]);
|
||||
B43_WARN_ON(!key->keyconf);
|
||||
|
||||
if (unlikely(!key->keyconf)) {
|
||||
/* This key is invalid. This might only happen
|
||||
* in a short timeframe after machine resume before
|
||||
* we were able to reconfigure keys.
|
||||
* Drop this packet completely. Do not transmit it
|
||||
* unencrypted to avoid leaking information. */
|
||||
return -ENOKEY;
|
||||
}
|
||||
|
||||
/* Hardware appends ICV. */
|
||||
plcp_fragment_len += txctl->icv_len;
|
||||
|
||||
key_idx = b43_kidx_to_fw(dev, key_idx);
|
||||
mac_ctl |= (key_idx << B43_TX4_MAC_KEYIDX_SHIFT) &
|
||||
B43_TX4_MAC_KEYIDX;
|
||||
mac_ctl |= (key->algorithm << B43_TX4_MAC_KEYALG_SHIFT) &
|
||||
B43_TX4_MAC_KEYALG;
|
||||
mac_ctl |= (key_idx << B43_TXH_MAC_KEYIDX_SHIFT) &
|
||||
B43_TXH_MAC_KEYIDX;
|
||||
mac_ctl |= (key->algorithm << B43_TXH_MAC_KEYALG_SHIFT) &
|
||||
B43_TXH_MAC_KEYALG;
|
||||
wlhdr_len = ieee80211_get_hdrlen(fctl);
|
||||
iv_len = min((size_t) txctl->iv_len,
|
||||
ARRAY_SIZE(txhdr->iv));
|
||||
memcpy(txhdr->iv, ((u8 *) wlhdr) + wlhdr_len, iv_len);
|
||||
}
|
||||
b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->plcp),
|
||||
plcp_fragment_len, rate);
|
||||
if (b43_is_old_txhdr_format(dev)) {
|
||||
b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->old_format.plcp),
|
||||
plcp_fragment_len, rate);
|
||||
} else {
|
||||
b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->new_format.plcp),
|
||||
plcp_fragment_len, rate);
|
||||
}
|
||||
b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->plcp_fb),
|
||||
plcp_fragment_len, rate_fb);
|
||||
|
||||
/* Extra Frame Types */
|
||||
if (rate_fb_ofdm)
|
||||
extra_ft |= B43_TX4_EFT_FBOFDM;
|
||||
extra_ft |= B43_TXH_EFT_FB_OFDM;
|
||||
else
|
||||
extra_ft |= B43_TXH_EFT_FB_CCK;
|
||||
|
||||
/* Set channel radio code. Note that the micrcode ORs 0x100 to
|
||||
* this value before comparing it to the value in SHM, if this
|
||||
@@ -267,18 +288,27 @@ static void generate_txhdr_fw4(struct b43_wldev *dev,
|
||||
|
||||
/* PHY TX Control word */
|
||||
if (rate_ofdm)
|
||||
phy_ctl |= B43_TX4_PHY_OFDM;
|
||||
if (dev->short_preamble)
|
||||
phy_ctl |= B43_TX4_PHY_SHORTPRMBL;
|
||||
switch (txctl->antenna_sel_tx) {
|
||||
case 0:
|
||||
phy_ctl |= B43_TX4_PHY_ANTLAST;
|
||||
phy_ctl |= B43_TXH_PHY_ENC_OFDM;
|
||||
else
|
||||
phy_ctl |= B43_TXH_PHY_ENC_CCK;
|
||||
if (txctl->flags & IEEE80211_TXCTL_SHORT_PREAMBLE)
|
||||
phy_ctl |= B43_TXH_PHY_SHORTPRMBL;
|
||||
|
||||
switch (b43_ieee80211_antenna_sanitize(dev, txctl->antenna_sel_tx)) {
|
||||
case 0: /* Default */
|
||||
phy_ctl |= B43_TXH_PHY_ANT01AUTO;
|
||||
break;
|
||||
case 1:
|
||||
phy_ctl |= B43_TX4_PHY_ANT0;
|
||||
case 1: /* Antenna 0 */
|
||||
phy_ctl |= B43_TXH_PHY_ANT0;
|
||||
break;
|
||||
case 2:
|
||||
phy_ctl |= B43_TX4_PHY_ANT1;
|
||||
case 2: /* Antenna 1 */
|
||||
phy_ctl |= B43_TXH_PHY_ANT1;
|
||||
break;
|
||||
case 3: /* Antenna 2 */
|
||||
phy_ctl |= B43_TXH_PHY_ANT2;
|
||||
break;
|
||||
case 4: /* Antenna 3 */
|
||||
phy_ctl |= B43_TXH_PHY_ANT3;
|
||||
break;
|
||||
default:
|
||||
B43_WARN_ON(1);
|
||||
@@ -286,14 +316,16 @@ static void generate_txhdr_fw4(struct b43_wldev *dev,
|
||||
|
||||
/* MAC control */
|
||||
if (!(txctl->flags & IEEE80211_TXCTL_NO_ACK))
|
||||
mac_ctl |= B43_TX4_MAC_ACK;
|
||||
mac_ctl |= B43_TXH_MAC_ACK;
|
||||
if (!(((fctl & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) &&
|
||||
((fctl & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PSPOLL)))
|
||||
mac_ctl |= B43_TX4_MAC_HWSEQ;
|
||||
mac_ctl |= B43_TXH_MAC_HWSEQ;
|
||||
if (txctl->flags & IEEE80211_TXCTL_FIRST_FRAGMENT)
|
||||
mac_ctl |= B43_TX4_MAC_STMSDU;
|
||||
mac_ctl |= B43_TXH_MAC_STMSDU;
|
||||
if (phy->type == B43_PHYTYPE_A)
|
||||
mac_ctl |= B43_TX4_MAC_5GHZ;
|
||||
mac_ctl |= B43_TXH_MAC_5GHZ;
|
||||
if (txctl->flags & IEEE80211_TXCTL_LONG_RETRY_LIMIT)
|
||||
mac_ctl |= B43_TXH_MAC_LONGFRAME;
|
||||
|
||||
/* Generate the RTS or CTS-to-self frame */
|
||||
if ((txctl->flags & IEEE80211_TXCTL_USE_RTS_CTS) ||
|
||||
@@ -302,66 +334,94 @@ static void generate_txhdr_fw4(struct b43_wldev *dev,
|
||||
struct ieee80211_hdr *hdr;
|
||||
int rts_rate, rts_rate_fb;
|
||||
int rts_rate_ofdm, rts_rate_fb_ofdm;
|
||||
struct b43_plcp_hdr6 *plcp;
|
||||
|
||||
rts_rate = txctl->rts_cts_rate;
|
||||
WARN_ON(!txctl->rts_cts_rate);
|
||||
rts_rate = txctl->rts_cts_rate ? txctl->rts_cts_rate->hw_value : B43_CCK_RATE_1MB;
|
||||
rts_rate_ofdm = b43_is_ofdm_rate(rts_rate);
|
||||
rts_rate_fb = b43_calc_fallback_rate(rts_rate);
|
||||
rts_rate_fb_ofdm = b43_is_ofdm_rate(rts_rate_fb);
|
||||
|
||||
if (txctl->flags & IEEE80211_TXCTL_USE_CTS_PROTECT) {
|
||||
ieee80211_ctstoself_get(dev->wl->hw, dev->wl->if_id,
|
||||
struct ieee80211_cts *cts;
|
||||
|
||||
if (b43_is_old_txhdr_format(dev)) {
|
||||
cts = (struct ieee80211_cts *)
|
||||
(txhdr->old_format.rts_frame);
|
||||
} else {
|
||||
cts = (struct ieee80211_cts *)
|
||||
(txhdr->new_format.rts_frame);
|
||||
}
|
||||
ieee80211_ctstoself_get(dev->wl->hw, txctl->vif,
|
||||
fragment_data, fragment_len,
|
||||
txctl,
|
||||
(struct ieee80211_cts *)(txhdr->
|
||||
rts_frame));
|
||||
mac_ctl |= B43_TX4_MAC_SENDCTS;
|
||||
txctl, cts);
|
||||
mac_ctl |= B43_TXH_MAC_SENDCTS;
|
||||
len = sizeof(struct ieee80211_cts);
|
||||
} else {
|
||||
ieee80211_rts_get(dev->wl->hw, dev->wl->if_id,
|
||||
fragment_data, fragment_len, txctl,
|
||||
(struct ieee80211_rts *)(txhdr->
|
||||
rts_frame));
|
||||
mac_ctl |= B43_TX4_MAC_SENDRTS;
|
||||
struct ieee80211_rts *rts;
|
||||
|
||||
if (b43_is_old_txhdr_format(dev)) {
|
||||
rts = (struct ieee80211_rts *)
|
||||
(txhdr->old_format.rts_frame);
|
||||
} else {
|
||||
rts = (struct ieee80211_rts *)
|
||||
(txhdr->new_format.rts_frame);
|
||||
}
|
||||
ieee80211_rts_get(dev->wl->hw, txctl->vif,
|
||||
fragment_data, fragment_len,
|
||||
txctl, rts);
|
||||
mac_ctl |= B43_TXH_MAC_SENDRTS;
|
||||
len = sizeof(struct ieee80211_rts);
|
||||
}
|
||||
len += FCS_LEN;
|
||||
b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->
|
||||
rts_plcp), len,
|
||||
rts_rate);
|
||||
b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->
|
||||
rts_plcp_fb),
|
||||
|
||||
/* Generate the PLCP headers for the RTS/CTS frame */
|
||||
if (b43_is_old_txhdr_format(dev))
|
||||
plcp = &txhdr->old_format.rts_plcp;
|
||||
else
|
||||
plcp = &txhdr->new_format.rts_plcp;
|
||||
b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)plcp,
|
||||
len, rts_rate);
|
||||
plcp = &txhdr->rts_plcp_fb;
|
||||
b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)plcp,
|
||||
len, rts_rate_fb);
|
||||
hdr = (struct ieee80211_hdr *)(&txhdr->rts_frame);
|
||||
|
||||
if (b43_is_old_txhdr_format(dev)) {
|
||||
hdr = (struct ieee80211_hdr *)
|
||||
(&txhdr->old_format.rts_frame);
|
||||
} else {
|
||||
hdr = (struct ieee80211_hdr *)
|
||||
(&txhdr->new_format.rts_frame);
|
||||
}
|
||||
txhdr->rts_dur_fb = hdr->duration_id;
|
||||
|
||||
if (rts_rate_ofdm) {
|
||||
extra_ft |= B43_TX4_EFT_RTSOFDM;
|
||||
extra_ft |= B43_TXH_EFT_RTS_OFDM;
|
||||
txhdr->phy_rate_rts =
|
||||
b43_plcp_get_ratecode_ofdm(rts_rate);
|
||||
} else
|
||||
} else {
|
||||
extra_ft |= B43_TXH_EFT_RTS_CCK;
|
||||
txhdr->phy_rate_rts =
|
||||
b43_plcp_get_ratecode_cck(rts_rate);
|
||||
}
|
||||
if (rts_rate_fb_ofdm)
|
||||
extra_ft |= B43_TX4_EFT_RTSFBOFDM;
|
||||
mac_ctl |= B43_TX4_MAC_LONGFRAME;
|
||||
extra_ft |= B43_TXH_EFT_RTSFB_OFDM;
|
||||
else
|
||||
extra_ft |= B43_TXH_EFT_RTSFB_CCK;
|
||||
}
|
||||
|
||||
/* Magic cookie */
|
||||
txhdr->cookie = cpu_to_le16(cookie);
|
||||
if (b43_is_old_txhdr_format(dev))
|
||||
txhdr->old_format.cookie = cpu_to_le16(cookie);
|
||||
else
|
||||
txhdr->new_format.cookie = cpu_to_le16(cookie);
|
||||
|
||||
/* Apply the bitfields */
|
||||
txhdr->mac_ctl = cpu_to_le32(mac_ctl);
|
||||
txhdr->phy_ctl = cpu_to_le16(phy_ctl);
|
||||
txhdr->extra_ft = extra_ft;
|
||||
}
|
||||
|
||||
void b43_generate_txhdr(struct b43_wldev *dev,
|
||||
u8 * txhdr,
|
||||
const unsigned char *fragment_data,
|
||||
unsigned int fragment_len,
|
||||
const struct ieee80211_tx_control *txctl, u16 cookie)
|
||||
{
|
||||
generate_txhdr_fw4(dev, (struct b43_txhdr_fw4 *)txhdr,
|
||||
fragment_data, fragment_len, txctl, cookie);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static s8 b43_rssi_postprocess(struct b43_wldev *dev,
|
||||
@@ -384,7 +444,7 @@ static s8 b43_rssi_postprocess(struct b43_wldev *dev,
|
||||
else
|
||||
tmp -= 3;
|
||||
} else {
|
||||
if (dev->dev->bus->sprom.r1.
|
||||
if (dev->dev->bus->sprom.
|
||||
boardflags_lo & B43_BFL_RSSI) {
|
||||
if (in_rssi > 63)
|
||||
in_rssi = 63;
|
||||
@@ -451,6 +511,7 @@ void b43_rx(struct b43_wldev *dev, struct sk_buff *skb, const void *_rxhdr)
|
||||
u16 phystat0, phystat3, chanstat, mactime;
|
||||
u32 macstat;
|
||||
u16 chanid;
|
||||
u16 phytype;
|
||||
u8 jssi;
|
||||
int padding;
|
||||
|
||||
@@ -463,6 +524,7 @@ void b43_rx(struct b43_wldev *dev, struct sk_buff *skb, const void *_rxhdr)
|
||||
macstat = le32_to_cpu(rxhdr->mac_status);
|
||||
mactime = le16_to_cpu(rxhdr->mac_time);
|
||||
chanstat = le16_to_cpu(rxhdr->channel);
|
||||
phytype = chanstat & B43_RX_CHAN_PHYTYPE;
|
||||
|
||||
if (macstat & B43_RX_MAC_FCSERR)
|
||||
dev->wl->ieee_stats.dot11FCSErrorCount++;
|
||||
@@ -488,7 +550,6 @@ void b43_rx(struct b43_wldev *dev, struct sk_buff *skb, const void *_rxhdr)
|
||||
}
|
||||
wlhdr = (struct ieee80211_hdr *)(skb->data);
|
||||
fctl = le16_to_cpu(wlhdr->frame_control);
|
||||
skb_trim(skb, skb->len - FCS_LEN);
|
||||
|
||||
if (macstat & B43_RX_MAC_DEC) {
|
||||
unsigned int keyidx;
|
||||
@@ -521,31 +582,59 @@ void b43_rx(struct b43_wldev *dev, struct sk_buff *skb, const void *_rxhdr)
|
||||
/* the next line looks wrong, but is what mac80211 wants */
|
||||
status.signal = (jssi * 100) / B43_RX_MAX_SSI;
|
||||
if (phystat0 & B43_RX_PHYST0_OFDM)
|
||||
status.rate = b43_plcp_get_bitrate_ofdm(plcp);
|
||||
status.rate_idx = b43_plcp_get_bitrate_idx_ofdm(plcp,
|
||||
phytype == B43_PHYTYPE_A);
|
||||
else
|
||||
status.rate = b43_plcp_get_bitrate_cck(plcp);
|
||||
status.rate_idx = b43_plcp_get_bitrate_idx_cck(plcp);
|
||||
status.antenna = !!(phystat0 & B43_RX_PHYST0_ANT);
|
||||
status.mactime = mactime;
|
||||
|
||||
/*
|
||||
* If monitors are present get full 64-bit timestamp. This
|
||||
* code assumes we get to process the packet within 16 bits
|
||||
* of timestamp, i.e. about 65 milliseconds after the PHY
|
||||
* received the first symbol.
|
||||
*/
|
||||
if (dev->wl->radiotap_enabled) {
|
||||
u16 low_mactime_now;
|
||||
|
||||
b43_tsf_read(dev, &status.mactime);
|
||||
low_mactime_now = status.mactime;
|
||||
status.mactime = status.mactime & ~0xFFFFULL;
|
||||
status.mactime += mactime;
|
||||
if (low_mactime_now <= mactime)
|
||||
status.mactime -= 0x10000;
|
||||
status.flag |= RX_FLAG_TSFT;
|
||||
}
|
||||
|
||||
chanid = (chanstat & B43_RX_CHAN_ID) >> B43_RX_CHAN_ID_SHIFT;
|
||||
switch (chanstat & B43_RX_CHAN_PHYTYPE) {
|
||||
case B43_PHYTYPE_A:
|
||||
status.phymode = MODE_IEEE80211A;
|
||||
status.freq = chanid;
|
||||
status.channel = b43_freq_to_channel_a(chanid);
|
||||
break;
|
||||
case B43_PHYTYPE_B:
|
||||
status.phymode = MODE_IEEE80211B;
|
||||
status.freq = chanid + 2400;
|
||||
status.channel = b43_freq_to_channel_bg(chanid + 2400);
|
||||
status.band = IEEE80211_BAND_5GHZ;
|
||||
B43_WARN_ON(1);
|
||||
/* FIXME: We don't really know which value the "chanid" contains.
|
||||
* So the following assignment might be wrong. */
|
||||
status.freq = b43_channel_to_freq_5ghz(chanid);
|
||||
break;
|
||||
case B43_PHYTYPE_G:
|
||||
status.phymode = MODE_IEEE80211G;
|
||||
status.band = IEEE80211_BAND_2GHZ;
|
||||
/* chanid is the radio channel cookie value as used
|
||||
* to tune the radio. */
|
||||
status.freq = chanid + 2400;
|
||||
status.channel = b43_freq_to_channel_bg(chanid + 2400);
|
||||
break;
|
||||
case B43_PHYTYPE_N:
|
||||
/* chanid is the SHM channel cookie. Which is the plain
|
||||
* channel number in b43. */
|
||||
if (chanstat & B43_RX_CHAN_5GHZ) {
|
||||
status.band = IEEE80211_BAND_5GHZ;
|
||||
status.freq = b43_freq_to_channel_5ghz(chanid);
|
||||
} else {
|
||||
status.band = IEEE80211_BAND_2GHZ;
|
||||
status.freq = b43_freq_to_channel_2ghz(chanid);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
B43_WARN_ON(1);
|
||||
goto drop;
|
||||
}
|
||||
|
||||
dev->stats.last_rx = jiffies;
|
||||
@@ -575,10 +664,7 @@ void b43_handle_txstatus(struct b43_wldev *dev,
|
||||
dev->wl->ieee_stats.dot11RTSSuccessCount++;
|
||||
}
|
||||
|
||||
if (b43_using_pio(dev))
|
||||
b43_pio_handle_txstatus(dev, status);
|
||||
else
|
||||
b43_dma_handle_txstatus(dev, status);
|
||||
b43_dma_handle_txstatus(dev, status);
|
||||
}
|
||||
|
||||
/* Handle TX status report as received through DMA/PIO queues */
|
||||
@@ -607,19 +693,13 @@ void b43_handle_hwtxstatus(struct b43_wldev *dev,
|
||||
/* Stop any TX operation on the device (suspend the hardware queues) */
|
||||
void b43_tx_suspend(struct b43_wldev *dev)
|
||||
{
|
||||
if (b43_using_pio(dev))
|
||||
b43_pio_freeze_txqueues(dev);
|
||||
else
|
||||
b43_dma_tx_suspend(dev);
|
||||
b43_dma_tx_suspend(dev);
|
||||
}
|
||||
|
||||
/* Resume any TX operation on the device (resume the hardware queues) */
|
||||
void b43_tx_resume(struct b43_wldev *dev)
|
||||
{
|
||||
if (b43_using_pio(dev))
|
||||
b43_pio_thaw_txqueues(dev);
|
||||
else
|
||||
b43_dma_tx_resume(dev);
|
||||
b43_dma_tx_resume(dev);
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
||||
@@ -19,74 +19,166 @@ _b43_declare_plcp_hdr(6);
|
||||
#undef _b43_declare_plcp_hdr
|
||||
|
||||
/* TX header for v4 firmware */
|
||||
struct b43_txhdr_fw4 {
|
||||
__le32 mac_ctl; /* MAC TX control */
|
||||
__le16 mac_frame_ctl; /* Copy of the FrameControl field */
|
||||
struct b43_txhdr {
|
||||
__le32 mac_ctl; /* MAC TX control */
|
||||
__le16 mac_frame_ctl; /* Copy of the FrameControl field */
|
||||
__le16 tx_fes_time_norm; /* TX FES Time Normal */
|
||||
__le16 phy_ctl; /* PHY TX control */
|
||||
__le16 phy_ctl_0; /* Unused */
|
||||
__le16 phy_ctl_1; /* Unused */
|
||||
__le16 phy_ctl_rts_0; /* Unused */
|
||||
__le16 phy_ctl_rts_1; /* Unused */
|
||||
__u8 phy_rate; /* PHY rate */
|
||||
__u8 phy_rate_rts; /* PHY rate for RTS/CTS */
|
||||
__u8 extra_ft; /* Extra Frame Types */
|
||||
__u8 chan_radio_code; /* Channel Radio Code */
|
||||
__u8 iv[16]; /* Encryption IV */
|
||||
__u8 tx_receiver[6]; /* TX Frame Receiver address */
|
||||
__le16 tx_fes_time_fb; /* TX FES Time Fallback */
|
||||
struct b43_plcp_hdr6 rts_plcp_fb; /* RTS fallback PLCP */
|
||||
__le16 rts_dur_fb; /* RTS fallback duration */
|
||||
struct b43_plcp_hdr6 plcp_fb; /* Fallback PLCP */
|
||||
__le16 dur_fb; /* Fallback duration */
|
||||
__le16 mm_dur_time; /* Unused */
|
||||
__le16 mm_dur_time_fb; /* Unused */
|
||||
__le32 time_stamp; /* Timestamp */
|
||||
PAD_BYTES(2);
|
||||
__le16 cookie; /* TX frame cookie */
|
||||
__le16 tx_status; /* TX status */
|
||||
struct b43_plcp_hdr6 rts_plcp; /* RTS PLCP */
|
||||
__u8 rts_frame[16]; /* The RTS frame (if used) */
|
||||
PAD_BYTES(2);
|
||||
struct b43_plcp_hdr6 plcp; /* Main PLCP */
|
||||
__le16 phy_ctl; /* PHY TX control */
|
||||
__le16 phy_ctl1; /* PHY TX control word 1 */
|
||||
__le16 phy_ctl1_fb; /* PHY TX control word 1 for fallback rates */
|
||||
__le16 phy_ctl1_rts; /* PHY TX control word 1 RTS */
|
||||
__le16 phy_ctl1_rts_fb; /* PHY TX control word 1 RTS for fallback rates */
|
||||
__u8 phy_rate; /* PHY rate */
|
||||
__u8 phy_rate_rts; /* PHY rate for RTS/CTS */
|
||||
__u8 extra_ft; /* Extra Frame Types */
|
||||
__u8 chan_radio_code; /* Channel Radio Code */
|
||||
__u8 iv[16]; /* Encryption IV */
|
||||
__u8 tx_receiver[6]; /* TX Frame Receiver address */
|
||||
__le16 tx_fes_time_fb; /* TX FES Time Fallback */
|
||||
struct b43_plcp_hdr6 rts_plcp_fb; /* RTS fallback PLCP header */
|
||||
__le16 rts_dur_fb; /* RTS fallback duration */
|
||||
struct b43_plcp_hdr6 plcp_fb; /* Fallback PLCP header */
|
||||
__le16 dur_fb; /* Fallback duration */
|
||||
__le16 mimo_modelen; /* MIMO mode length */
|
||||
__le16 mimo_ratelen_fb; /* MIMO fallback rate length */
|
||||
__le32 timeout; /* Timeout */
|
||||
|
||||
union {
|
||||
/* The new r410 format. */
|
||||
struct {
|
||||
__le16 mimo_antenna; /* MIMO antenna select */
|
||||
__le16 preload_size; /* Preload size */
|
||||
PAD_BYTES(2);
|
||||
__le16 cookie; /* TX frame cookie */
|
||||
__le16 tx_status; /* TX status */
|
||||
struct b43_plcp_hdr6 rts_plcp; /* RTS PLCP header */
|
||||
__u8 rts_frame[16]; /* The RTS frame (if used) */
|
||||
PAD_BYTES(2);
|
||||
struct b43_plcp_hdr6 plcp; /* Main PLCP header */
|
||||
} new_format __attribute__ ((__packed__));
|
||||
|
||||
/* The old r351 format. */
|
||||
struct {
|
||||
PAD_BYTES(2);
|
||||
__le16 cookie; /* TX frame cookie */
|
||||
__le16 tx_status; /* TX status */
|
||||
struct b43_plcp_hdr6 rts_plcp; /* RTS PLCP header */
|
||||
__u8 rts_frame[16]; /* The RTS frame (if used) */
|
||||
PAD_BYTES(2);
|
||||
struct b43_plcp_hdr6 plcp; /* Main PLCP header */
|
||||
} old_format __attribute__ ((__packed__));
|
||||
|
||||
} __attribute__ ((__packed__));
|
||||
} __attribute__ ((__packed__));
|
||||
|
||||
/* MAC TX control */
|
||||
#define B43_TX4_MAC_KEYIDX 0x0FF00000 /* Security key index */
|
||||
#define B43_TX4_MAC_KEYIDX_SHIFT 20
|
||||
#define B43_TX4_MAC_KEYALG 0x00070000 /* Security key algorithm */
|
||||
#define B43_TX4_MAC_KEYALG_SHIFT 16
|
||||
#define B43_TX4_MAC_LIFETIME 0x00001000
|
||||
#define B43_TX4_MAC_FRAMEBURST 0x00000800
|
||||
#define B43_TX4_MAC_SENDCTS 0x00000400
|
||||
#define B43_TX4_MAC_AMPDU 0x00000300
|
||||
#define B43_TX4_MAC_AMPDU_SHIFT 8
|
||||
#define B43_TX4_MAC_5GHZ 0x00000080
|
||||
#define B43_TX4_MAC_IGNPMQ 0x00000020
|
||||
#define B43_TX4_MAC_HWSEQ 0x00000010 /* Use Hardware Sequence Number */
|
||||
#define B43_TX4_MAC_STMSDU 0x00000008 /* Start MSDU */
|
||||
#define B43_TX4_MAC_SENDRTS 0x00000004
|
||||
#define B43_TX4_MAC_LONGFRAME 0x00000002
|
||||
#define B43_TX4_MAC_ACK 0x00000001
|
||||
#define B43_TXH_MAC_USEFBR 0x10000000 /* Use fallback rate for this AMPDU */
|
||||
#define B43_TXH_MAC_KEYIDX 0x0FF00000 /* Security key index */
|
||||
#define B43_TXH_MAC_KEYIDX_SHIFT 20
|
||||
#define B43_TXH_MAC_KEYALG 0x00070000 /* Security key algorithm */
|
||||
#define B43_TXH_MAC_KEYALG_SHIFT 16
|
||||
#define B43_TXH_MAC_AMIC 0x00008000 /* AMIC */
|
||||
#define B43_TXH_MAC_RIFS 0x00004000 /* Use RIFS */
|
||||
#define B43_TXH_MAC_LIFETIME 0x00002000 /* Lifetime */
|
||||
#define B43_TXH_MAC_FRAMEBURST 0x00001000 /* Frameburst */
|
||||
#define B43_TXH_MAC_SENDCTS 0x00000800 /* Send CTS-to-self */
|
||||
#define B43_TXH_MAC_AMPDU 0x00000600 /* AMPDU status */
|
||||
#define B43_TXH_MAC_AMPDU_MPDU 0x00000000 /* Regular MPDU, not an AMPDU */
|
||||
#define B43_TXH_MAC_AMPDU_FIRST 0x00000200 /* First MPDU or AMPDU */
|
||||
#define B43_TXH_MAC_AMPDU_INTER 0x00000400 /* Intermediate MPDU or AMPDU */
|
||||
#define B43_TXH_MAC_AMPDU_LAST 0x00000600 /* Last (or only) MPDU of AMPDU */
|
||||
#define B43_TXH_MAC_40MHZ 0x00000100 /* Use 40 MHz bandwidth */
|
||||
#define B43_TXH_MAC_5GHZ 0x00000080 /* 5GHz band */
|
||||
#define B43_TXH_MAC_DFCS 0x00000040 /* DFCS */
|
||||
#define B43_TXH_MAC_IGNPMQ 0x00000020 /* Ignore PMQ */
|
||||
#define B43_TXH_MAC_HWSEQ 0x00000010 /* Use Hardware Sequence Number */
|
||||
#define B43_TXH_MAC_STMSDU 0x00000008 /* Start MSDU */
|
||||
#define B43_TXH_MAC_SENDRTS 0x00000004 /* Send RTS */
|
||||
#define B43_TXH_MAC_LONGFRAME 0x00000002 /* Long frame */
|
||||
#define B43_TXH_MAC_ACK 0x00000001 /* Immediate ACK */
|
||||
|
||||
/* Extra Frame Types */
|
||||
#define B43_TX4_EFT_FBOFDM 0x0001 /* Data frame fallback rate type */
|
||||
#define B43_TX4_EFT_RTSOFDM 0x0004 /* RTS/CTS rate type */
|
||||
#define B43_TX4_EFT_RTSFBOFDM 0x0010 /* RTS/CTS fallback rate type */
|
||||
#define B43_TXH_EFT_FB 0x03 /* Data frame fallback encoding */
|
||||
#define B43_TXH_EFT_FB_CCK 0x00 /* CCK */
|
||||
#define B43_TXH_EFT_FB_OFDM 0x01 /* OFDM */
|
||||
#define B43_TXH_EFT_FB_EWC 0x02 /* EWC */
|
||||
#define B43_TXH_EFT_FB_N 0x03 /* N */
|
||||
#define B43_TXH_EFT_RTS 0x0C /* RTS/CTS encoding */
|
||||
#define B43_TXH_EFT_RTS_CCK 0x00 /* CCK */
|
||||
#define B43_TXH_EFT_RTS_OFDM 0x04 /* OFDM */
|
||||
#define B43_TXH_EFT_RTS_EWC 0x08 /* EWC */
|
||||
#define B43_TXH_EFT_RTS_N 0x0C /* N */
|
||||
#define B43_TXH_EFT_RTSFB 0x30 /* RTS/CTS fallback encoding */
|
||||
#define B43_TXH_EFT_RTSFB_CCK 0x00 /* CCK */
|
||||
#define B43_TXH_EFT_RTSFB_OFDM 0x10 /* OFDM */
|
||||
#define B43_TXH_EFT_RTSFB_EWC 0x20 /* EWC */
|
||||
#define B43_TXH_EFT_RTSFB_N 0x30 /* N */
|
||||
|
||||
/* PHY TX control word */
|
||||
#define B43_TX4_PHY_OFDM 0x0001 /* Data frame rate type */
|
||||
#define B43_TX4_PHY_SHORTPRMBL 0x0010 /* Use short preamble */
|
||||
#define B43_TX4_PHY_ANT 0x03C0 /* Antenna selection */
|
||||
#define B43_TX4_PHY_ANT0 0x0000 /* Use antenna 0 */
|
||||
#define B43_TX4_PHY_ANT1 0x0100 /* Use antenna 1 */
|
||||
#define B43_TX4_PHY_ANTLAST 0x0300 /* Use last used antenna */
|
||||
#define B43_TXH_PHY_ENC 0x0003 /* Data frame encoding */
|
||||
#define B43_TXH_PHY_ENC_CCK 0x0000 /* CCK */
|
||||
#define B43_TXH_PHY_ENC_OFDM 0x0001 /* OFDM */
|
||||
#define B43_TXH_PHY_ENC_EWC 0x0002 /* EWC */
|
||||
#define B43_TXH_PHY_ENC_N 0x0003 /* N */
|
||||
#define B43_TXH_PHY_SHORTPRMBL 0x0010 /* Use short preamble */
|
||||
#define B43_TXH_PHY_ANT 0x03C0 /* Antenna selection */
|
||||
#define B43_TXH_PHY_ANT0 0x0000 /* Use antenna 0 */
|
||||
#define B43_TXH_PHY_ANT1 0x0040 /* Use antenna 1 */
|
||||
#define B43_TXH_PHY_ANT01AUTO 0x00C0 /* Use antenna 0/1 auto */
|
||||
#define B43_TXH_PHY_ANT2 0x0100 /* Use antenna 2 */
|
||||
#define B43_TXH_PHY_ANT3 0x0200 /* Use antenna 3 */
|
||||
#define B43_TXH_PHY_TXPWR 0xFC00 /* TX power */
|
||||
#define B43_TXH_PHY_TXPWR_SHIFT 10
|
||||
|
||||
void b43_generate_txhdr(struct b43_wldev *dev,
|
||||
u8 * txhdr,
|
||||
const unsigned char *fragment_data,
|
||||
unsigned int fragment_len,
|
||||
const struct ieee80211_tx_control *txctl, u16 cookie);
|
||||
/* PHY TX control word 1 */
|
||||
#define B43_TXH_PHY1_BW 0x0007 /* Bandwidth */
|
||||
#define B43_TXH_PHY1_BW_10 0x0000 /* 10 MHz */
|
||||
#define B43_TXH_PHY1_BW_10U 0x0001 /* 10 MHz upper */
|
||||
#define B43_TXH_PHY1_BW_20 0x0002 /* 20 MHz */
|
||||
#define B43_TXH_PHY1_BW_20U 0x0003 /* 20 MHz upper */
|
||||
#define B43_TXH_PHY1_BW_40 0x0004 /* 40 MHz */
|
||||
#define B43_TXH_PHY1_BW_40DUP 0x0005 /* 50 MHz duplicate */
|
||||
#define B43_TXH_PHY1_MODE 0x0038 /* Mode */
|
||||
#define B43_TXH_PHY1_MODE_SISO 0x0000 /* SISO */
|
||||
#define B43_TXH_PHY1_MODE_CDD 0x0008 /* CDD */
|
||||
#define B43_TXH_PHY1_MODE_STBC 0x0010 /* STBC */
|
||||
#define B43_TXH_PHY1_MODE_SDM 0x0018 /* SDM */
|
||||
#define B43_TXH_PHY1_CRATE 0x0700 /* Coding rate */
|
||||
#define B43_TXH_PHY1_CRATE_1_2 0x0000 /* 1/2 */
|
||||
#define B43_TXH_PHY1_CRATE_2_3 0x0100 /* 2/3 */
|
||||
#define B43_TXH_PHY1_CRATE_3_4 0x0200 /* 3/4 */
|
||||
#define B43_TXH_PHY1_CRATE_4_5 0x0300 /* 4/5 */
|
||||
#define B43_TXH_PHY1_CRATE_5_6 0x0400 /* 5/6 */
|
||||
#define B43_TXH_PHY1_CRATE_7_8 0x0600 /* 7/8 */
|
||||
#define B43_TXH_PHY1_MODUL 0x3800 /* Modulation scheme */
|
||||
#define B43_TXH_PHY1_MODUL_BPSK 0x0000 /* BPSK */
|
||||
#define B43_TXH_PHY1_MODUL_QPSK 0x0800 /* QPSK */
|
||||
#define B43_TXH_PHY1_MODUL_QAM16 0x1000 /* QAM16 */
|
||||
#define B43_TXH_PHY1_MODUL_QAM64 0x1800 /* QAM64 */
|
||||
#define B43_TXH_PHY1_MODUL_QAM256 0x2000 /* QAM256 */
|
||||
|
||||
|
||||
/* r351 firmware compatibility stuff. */
|
||||
static inline
|
||||
bool b43_is_old_txhdr_format(struct b43_wldev *dev)
|
||||
{
|
||||
return (dev->fw.rev <= 351);
|
||||
}
|
||||
|
||||
static inline
|
||||
size_t b43_txhdr_size(struct b43_wldev *dev)
|
||||
{
|
||||
if (b43_is_old_txhdr_format(dev))
|
||||
return 100 + sizeof(struct b43_plcp_hdr6);
|
||||
return 104 + sizeof(struct b43_plcp_hdr6);
|
||||
}
|
||||
|
||||
|
||||
int b43_generate_txhdr(struct b43_wldev *dev,
|
||||
u8 * txhdr,
|
||||
const unsigned char *fragment_data,
|
||||
unsigned int fragment_len,
|
||||
const struct ieee80211_tx_control *txctl, u16 cookie);
|
||||
|
||||
/* Transmit Status */
|
||||
struct b43_txstatus {
|
||||
@@ -142,49 +234,56 @@ struct b43_rxhdr_fw4 {
|
||||
} __attribute__ ((__packed__));
|
||||
|
||||
/* PHY RX Status 0 */
|
||||
#define B43_RX_PHYST0_GAINCTL 0x4000 /* Gain Control */
|
||||
#define B43_RX_PHYST0_PLCPHCF 0x0200
|
||||
#define B43_RX_PHYST0_PLCPFV 0x0100
|
||||
#define B43_RX_PHYST0_SHORTPRMBL 0x0080 /* Received with Short Preamble */
|
||||
#define B43_RX_PHYST0_GAINCTL 0x4000 /* Gain Control */
|
||||
#define B43_RX_PHYST0_PLCPHCF 0x0200
|
||||
#define B43_RX_PHYST0_PLCPFV 0x0100
|
||||
#define B43_RX_PHYST0_SHORTPRMBL 0x0080 /* Received with Short Preamble */
|
||||
#define B43_RX_PHYST0_LCRS 0x0040
|
||||
#define B43_RX_PHYST0_ANT 0x0020 /* Antenna */
|
||||
#define B43_RX_PHYST0_UNSRATE 0x0010
|
||||
#define B43_RX_PHYST0_ANT 0x0020 /* Antenna */
|
||||
#define B43_RX_PHYST0_UNSRATE 0x0010
|
||||
#define B43_RX_PHYST0_CLIP 0x000C
|
||||
#define B43_RX_PHYST0_CLIP_SHIFT 2
|
||||
#define B43_RX_PHYST0_FTYPE 0x0003 /* Frame type */
|
||||
#define B43_RX_PHYST0_CCK 0x0000 /* Frame type: CCK */
|
||||
#define B43_RX_PHYST0_OFDM 0x0001 /* Frame type: OFDM */
|
||||
#define B43_RX_PHYST0_PRE_N 0x0002 /* Pre-standard N-PHY frame */
|
||||
#define B43_RX_PHYST0_STD_N 0x0003 /* Standard N-PHY frame */
|
||||
#define B43_RX_PHYST0_FTYPE 0x0003 /* Frame type */
|
||||
#define B43_RX_PHYST0_CCK 0x0000 /* Frame type: CCK */
|
||||
#define B43_RX_PHYST0_OFDM 0x0001 /* Frame type: OFDM */
|
||||
#define B43_RX_PHYST0_PRE_N 0x0002 /* Pre-standard N-PHY frame */
|
||||
#define B43_RX_PHYST0_STD_N 0x0003 /* Standard N-PHY frame */
|
||||
|
||||
/* PHY RX Status 2 */
|
||||
#define B43_RX_PHYST2_LNAG 0xC000 /* LNA Gain */
|
||||
#define B43_RX_PHYST2_LNAG 0xC000 /* LNA Gain */
|
||||
#define B43_RX_PHYST2_LNAG_SHIFT 14
|
||||
#define B43_RX_PHYST2_PNAG 0x3C00 /* PNA Gain */
|
||||
#define B43_RX_PHYST2_PNAG 0x3C00 /* PNA Gain */
|
||||
#define B43_RX_PHYST2_PNAG_SHIFT 10
|
||||
#define B43_RX_PHYST2_FOFF 0x03FF /* F offset */
|
||||
#define B43_RX_PHYST2_FOFF 0x03FF /* F offset */
|
||||
|
||||
/* PHY RX Status 3 */
|
||||
#define B43_RX_PHYST3_DIGG 0x1800 /* DIG Gain */
|
||||
#define B43_RX_PHYST3_DIGG 0x1800 /* DIG Gain */
|
||||
#define B43_RX_PHYST3_DIGG_SHIFT 11
|
||||
#define B43_RX_PHYST3_TRSTATE 0x0400 /* TR state */
|
||||
#define B43_RX_PHYST3_TRSTATE 0x0400 /* TR state */
|
||||
|
||||
/* MAC RX Status */
|
||||
#define B43_RX_MAC_BEACONSENT 0x00008000 /* Beacon send flag */
|
||||
#define B43_RX_MAC_KEYIDX 0x000007E0 /* Key index */
|
||||
#define B43_RX_MAC_KEYIDX_SHIFT 5
|
||||
#define B43_RX_MAC_DECERR 0x00000010 /* Decrypt error */
|
||||
#define B43_RX_MAC_DEC 0x00000008 /* Decryption attempted */
|
||||
#define B43_RX_MAC_PADDING 0x00000004 /* Pad bytes present */
|
||||
#define B43_RX_MAC_RESP 0x00000002 /* Response frame transmitted */
|
||||
#define B43_RX_MAC_FCSERR 0x00000001 /* FCS error */
|
||||
#define B43_RX_MAC_RXST_VALID 0x01000000 /* PHY RXST valid */
|
||||
#define B43_RX_MAC_TKIP_MICERR 0x00100000 /* TKIP MIC error */
|
||||
#define B43_RX_MAC_TKIP_MICATT 0x00080000 /* TKIP MIC attempted */
|
||||
#define B43_RX_MAC_AGGTYPE 0x00060000 /* Aggregation type */
|
||||
#define B43_RX_MAC_AGGTYPE_SHIFT 17
|
||||
#define B43_RX_MAC_AMSDU 0x00010000 /* A-MSDU mask */
|
||||
#define B43_RX_MAC_BEACONSENT 0x00008000 /* Beacon sent flag */
|
||||
#define B43_RX_MAC_KEYIDX 0x000007E0 /* Key index */
|
||||
#define B43_RX_MAC_KEYIDX_SHIFT 5
|
||||
#define B43_RX_MAC_DECERR 0x00000010 /* Decrypt error */
|
||||
#define B43_RX_MAC_DEC 0x00000008 /* Decryption attempted */
|
||||
#define B43_RX_MAC_PADDING 0x00000004 /* Pad bytes present */
|
||||
#define B43_RX_MAC_RESP 0x00000002 /* Response frame transmitted */
|
||||
#define B43_RX_MAC_FCSERR 0x00000001 /* FCS error */
|
||||
|
||||
/* RX channel */
|
||||
#define B43_RX_CHAN_GAIN 0xFC00 /* Gain */
|
||||
#define B43_RX_CHAN_GAIN_SHIFT 10
|
||||
#define B43_RX_CHAN_ID 0x03FC /* Channel ID */
|
||||
#define B43_RX_CHAN_ID_SHIFT 2
|
||||
#define B43_RX_CHAN_PHYTYPE 0x0003 /* PHY type */
|
||||
#define B43_RX_CHAN_40MHZ 0x1000 /* 40 Mhz channel width */
|
||||
#define B43_RX_CHAN_5GHZ 0x0800 /* 5 Ghz band */
|
||||
#define B43_RX_CHAN_ID 0x07F8 /* Channel ID */
|
||||
#define B43_RX_CHAN_ID_SHIFT 3
|
||||
#define B43_RX_CHAN_PHYTYPE 0x0007 /* PHY type */
|
||||
|
||||
|
||||
u8 b43_plcp_get_ratecode_cck(const u8 bitrate);
|
||||
u8 b43_plcp_get_ratecode_ofdm(const u8 bitrate);
|
||||
|
||||
Reference in New Issue
Block a user