diff options
author | Rafał Miłecki <zajec5@gmail.com> | 2010-02-27 07:03:40 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-03-09 15:06:56 -0500 |
commit | 1b69ec7bac9cc0688ecf1411d167d1b8a34aeb07 (patch) | |
tree | a73e67e1170a11b79fd84648cd92fed1a55ce0e7 /drivers/net/wireless/b43/phy_n.c | |
parent | 7955de0caf70e4aefd51d68e42f78d4bd82f26a2 (diff) |
b43: N-PHY: implement chanspec setup
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/b43/phy_n.c')
-rw-r--r-- | drivers/net/wireless/b43/phy_n.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/drivers/net/wireless/b43/phy_n.c b/drivers/net/wireless/b43/phy_n.c index ffe262270664..862223fdde4d 100644 --- a/drivers/net/wireless/b43/phy_n.c +++ b/drivers/net/wireless/b43/phy_n.c | |||
@@ -3282,6 +3282,68 @@ int b43_phy_initn(struct b43_wldev *dev) | |||
3282 | return 0; | 3282 | return 0; |
3283 | } | 3283 | } |
3284 | 3284 | ||
3285 | /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/ChanspecSetup */ | ||
3286 | static void b43_nphy_chanspec_setup(struct b43_wldev *dev, | ||
3287 | const struct b43_nphy_channeltab_entry *e, | ||
3288 | struct b43_chanspec chanspec) | ||
3289 | { | ||
3290 | struct b43_phy *phy = &dev->phy; | ||
3291 | struct b43_phy_n *nphy = dev->phy.n; | ||
3292 | |||
3293 | u16 tmp; | ||
3294 | u32 tmp32; | ||
3295 | |||
3296 | tmp = b43_phy_read(dev, B43_NPHY_BANDCTL) & B43_NPHY_BANDCTL_5GHZ; | ||
3297 | if (chanspec.b_freq == 1 && tmp == 0) { | ||
3298 | tmp32 = b43_read32(dev, B43_MMIO_PSM_PHY_HDR); | ||
3299 | b43_write32(dev, B43_MMIO_PSM_PHY_HDR, tmp32 | 4); | ||
3300 | b43_phy_set(dev, B43_PHY_B_BBCFG, 0xC000); | ||
3301 | b43_write32(dev, B43_MMIO_PSM_PHY_HDR, tmp32); | ||
3302 | b43_phy_set(dev, B43_NPHY_BANDCTL, B43_NPHY_BANDCTL_5GHZ); | ||
3303 | } else if (chanspec.b_freq == 1) { | ||
3304 | b43_phy_mask(dev, B43_NPHY_BANDCTL, ~B43_NPHY_BANDCTL_5GHZ); | ||
3305 | tmp32 = b43_read32(dev, B43_MMIO_PSM_PHY_HDR); | ||
3306 | b43_write32(dev, B43_MMIO_PSM_PHY_HDR, tmp32 | 4); | ||
3307 | b43_phy_mask(dev, B43_PHY_B_BBCFG, (u16)~0xC000); | ||
3308 | b43_write32(dev, B43_MMIO_PSM_PHY_HDR, tmp32); | ||
3309 | } | ||
3310 | |||
3311 | b43_chantab_phy_upload(dev, e); | ||
3312 | |||
3313 | tmp = chanspec.channel; | ||
3314 | if (chanspec.b_freq == 1) | ||
3315 | tmp |= 0x0100; | ||
3316 | if (chanspec.b_width == 3) | ||
3317 | tmp |= 0x0200; | ||
3318 | b43_shm_write16(dev, B43_SHM_SHARED, 0xA0, tmp); | ||
3319 | |||
3320 | if (nphy->radio_chanspec.channel == 14) { | ||
3321 | b43_nphy_classifier(dev, 2, 0); | ||
3322 | b43_phy_set(dev, B43_PHY_B_TEST, 0x0800); | ||
3323 | } else { | ||
3324 | b43_nphy_classifier(dev, 2, 2); | ||
3325 | if (chanspec.b_freq == 2) | ||
3326 | b43_phy_mask(dev, B43_PHY_B_TEST, ~0x840); | ||
3327 | } | ||
3328 | |||
3329 | if (nphy->txpwrctrl) | ||
3330 | b43_nphy_tx_power_fix(dev); | ||
3331 | |||
3332 | if (dev->phy.rev < 3) | ||
3333 | b43_nphy_adjust_lna_gain_table(dev); | ||
3334 | |||
3335 | b43_nphy_tx_lp_fbw(dev); | ||
3336 | |||
3337 | if (dev->phy.rev >= 3 && 0) { | ||
3338 | /* TODO */ | ||
3339 | } | ||
3340 | |||
3341 | b43_phy_write(dev, B43_NPHY_NDATAT_DUP40, 0x3830); | ||
3342 | |||
3343 | if (phy->rev >= 3) | ||
3344 | b43_nphy_spur_workaround(dev); | ||
3345 | } | ||
3346 | |||
3285 | static int b43_nphy_op_allocate(struct b43_wldev *dev) | 3347 | static int b43_nphy_op_allocate(struct b43_wldev *dev) |
3286 | { | 3348 | { |
3287 | struct b43_phy_n *nphy; | 3349 | struct b43_phy_n *nphy; |