b43: Add NPHY radio init code
PATCH 1/1 b43: Add NPHY radio init code
This adds some code to init the 2055 radio.
This patch adds two files "tables_nphy.h" and "tables_nphy.c"
Signed-off-by Michael Buesch <[email protected]>
---
For 2.6.25.
drivers/net/wireless/b43/nphy.c +97 -1
@@ -21,14 +21,110 @@Boston, MA 02110-1301, USA. */ #include "b43.h" #include "nphy.h" +#include "tables_nphy.h" +void b43_nphy_set_rxantenna (struct b43_wldev *dev,int antenna) +{//TODO +} + +void b43_nphy_xmitpower (struct b43_wldev *dev) +{//TODO +} + +/* Tune the hardware to a new channel. Don't call this directly. +* Use b43_radio_selectchannel() */ +void b43_nphy_selectchannel (struct b43_wldev *dev,u8 channel) +{ + +//TODO +} + +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 ); +} +int b43_phy_initn (struct b43_wldev *dev) {b43err (dev->wl,"IEEE 802.11n devices are not supported, yet.\n" ); -return -EOPNOTSUPP ; +return 0 ; }
drivers/net/wireless/b43/nphy.h +9 -0
@@ -174,12 +174,13 @@#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 */
@@ -910,7 +911,15 @@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); + +void 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_ */
drivers/net/wireless/b43/phy.c +73 -8
212 lines not on this page · raw message
drivers/net/wireless/b43/phy.h +20 -0
@@ -201,14 +201,24 @@ enum {#define B43_PHYVER_TYPE_SHIFT 8#define B43_PHYVER_VERSION 0x00FFvoid 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);void b43_phy_early_init (struct b43_wldev *dev);int b43_phy_init (struct b43_wldev *dev);
@@ -266,14 +276,24 @@ void b43_phy_set_baseband_attenuation(stextern 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);void b43_radio_turn_on (struct b43_wldev *dev);void b43_radio_turn_off (struct b43_wldev *dev,bool force);
drivers/net/wireless/b43/Makefile +1 -0
@@ -1,8 +1,9 @@ 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-y += wa.o
drivers/net/wireless/b43/tables_nphy.c new file +292 -0
292 lines not on this page · raw message
drivers/net/wireless/b43/tables_nphy.h new file +17 -0
@@ -0,0 +1,17 @@ +#ifndef B43_TABLES_NPHY_H_ +#define B43_TABLES_NPHY_H_ + +#include <linux/types.h> + + +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); + + +#endif /* B43_TABLES_NPHY_H_ */
drivers/net/wireless/b43/main.c +3 -0
@@ -2129,12 +2129,13 @@ static void b43_rate_memory_write(structstatic void b43_rate_memory_init (struct b43_wldev *dev) {switch (dev->phy.type) {case B43_PHYTYPE_A :case B43_PHYTYPE_G : +case B43_PHYTYPE_N :b43_rate_memory_write (dev,B43_OFDM_RATE_6MB ,1 );b43_rate_memory_write (dev,B43_OFDM_RATE_12MB ,1 );b43_rate_memory_write (dev,B43_OFDM_RATE_18MB ,1 );b43_rate_memory_write (dev,B43_OFDM_RATE_24MB ,1 );b43_rate_memory_write (dev,B43_OFDM_RATE_36MB ,1 );b43_rate_memory_write (dev,B43_OFDM_RATE_48MB ,1 );
@@ -2317,12 +2318,14 @@ static void b43_periodic_every120sec(str }static void b43_periodic_every60sec (struct b43_wldev *dev) {struct b43_phy *phy = &dev->phy; +if (phy->type !=B43_PHYTYPE_G ) +return ;if (!b43_has_hardware_pctl (phy))b43_lo_g_ctl_mark_all_unused (dev);if (dev->dev->bus->sprom.boardflags_lo &B43_BFL_RSSI ) {b43_mac_suspend (dev);b43_calc_nrssi_slope (dev);if ((phy->radio_ver ==0x2050 ) && (phy->radio_rev ==8 )) {