Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 285041 Details for
Bug 412861
b43 regression in kernel-2.6.23.8-63.fc8
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
diff of b43 between 2.6.23.1-49 and 2.6.23.8-63
linux_1-49to8-63_b43.diff (text/x-patch), 76.35 KB, created by
Brennan Ashton
on 2007-12-12 04:59:00 UTC
(
hide
)
Description:
diff of b43 between 2.6.23.1-49 and 2.6.23.8-63
Filename:
MIME Type:
Creator:
Brennan Ashton
Created:
2007-12-12 04:59:00 UTC
Size:
76.35 KB
patch
obsolete
>diff -uNrp kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/b43.h kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/b43.h >--- kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/b43.h 2007-12-11 20:19:58.000000000 -0800 >+++ kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/b43.h 2007-12-11 20:23:31.000000000 -0800 >@@ -542,6 +542,10 @@ struct b43_phy { > u16 lofcal; > > u16 initval; //FIXME rename? >+ >+ /* OFDM address read/write caching for hardware auto-increment. */ >+ u16 ofdm_addr; >+ u8 ofdm_valid; /* 0: invalid, 1: read, 2: write */ > }; > > /* Data structures for DMA transmission, per 80211 core. */ >diff -uNrp kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/debugfs.c kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/debugfs.c >--- kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/debugfs.c 2007-12-11 20:19:58.000000000 -0800 >+++ kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/debugfs.c 2007-12-11 20:23:31.000000000 -0800 >@@ -352,7 +352,7 @@ static ssize_t b43_debugfs_read(struct f > 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); >diff -uNrp kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/dma.c kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/dma.c >--- kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/dma.c 2007-12-11 20:19:58.000000000 -0800 >+++ kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/dma.c 2007-12-11 20:23:32.000000000 -0800 >@@ -165,7 +165,7 @@ static void op64_fill_descriptor(struct > 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) >@@ -426,9 +426,20 @@ 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 >+ * and 8K buffers for 64-bit DMA; however, 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->dma64) >+ 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; >@@ -483,7 +494,7 @@ int b43_dmacontroller_rx_reset(struct b4 > return 0; > } > >-/* Reset the RX DMA channel */ >+/* Reset the TX DMA channel */ > int b43_dmacontroller_tx_reset(struct b43_wldev *dev, u16 mmio_base, int dma64) > { > int i; >@@ -636,18 +647,12 @@ static int dmacontroller_setup(struct b4 > if (ring->dma64) { > u64 ringbase = (u64) (ring->dmabase); > >- addrext = ((ringbase >> 32) & SSB_DMA_TRANSLATION_MASK) >- >> SSB_DMA_TRANSLATION_SHIFT; >- value = B43_DMA64_TXENABLE; >- value |= (addrext << B43_DMA64_TXADDREXT_SHIFT) >- & B43_DMA64_TXADDREXT_MASK; >- b43_dma_write(ring, B43_DMA64_TXCTL, value); >+ b43_dma_write(ring, B43_DMA64_TXCTL, >+ B43_DMA64_TXENABLE); > b43_dma_write(ring, B43_DMA64_TXRINGLO, > (ringbase & 0xFFFFFFFF)); > b43_dma_write(ring, B43_DMA64_TXRINGHI, >- ((ringbase >> 32) & >- ~SSB_DMA_TRANSLATION_MASK) >- | trans); >+ (ringbase >> 32)); > } else { > u32 ringbase = (u32) (ring->dmabase); > >@@ -668,20 +673,15 @@ static int dmacontroller_setup(struct b4 > if (ring->dma64) { > u64 ringbase = (u64) (ring->dmabase); > >- addrext = ((ringbase >> 32) & SSB_DMA_TRANSLATION_MASK) >- >> SSB_DMA_TRANSLATION_SHIFT; >- value = (ring->frameoffset << B43_DMA64_RXFROFF_SHIFT); >- value |= B43_DMA64_RXENABLE; >- value |= (addrext << B43_DMA64_RXADDREXT_SHIFT) >- & B43_DMA64_RXADDREXT_MASK; >+ value = (ring->frameoffset << B43_DMA64_RXFROFF_SHIFT) >+ | B43_DMA64_RXENABLE; > b43_dma_write(ring, B43_DMA64_RXCTL, value); > b43_dma_write(ring, B43_DMA64_RXRINGLO, > (ringbase & 0xFFFFFFFF)); > b43_dma_write(ring, B43_DMA64_RXRINGHI, >- ((ringbase >> 32) & >- ~SSB_DMA_TRANSLATION_MASK) >- | trans); >- b43_dma_write(ring, B43_DMA64_RXINDEX, 200); >+ (ringbase >> 32)); >+ b43_dma_write(ring, B43_DMA64_RXINDEX, ring->nr_slots * >+ sizeof(struct b43_dmadesc64)); > } else { > u32 ringbase = (u32) (ring->dmabase); > >@@ -695,11 +695,12 @@ static int dmacontroller_setup(struct b4 > 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; > } > >@@ -954,19 +955,21 @@ int b43_dma_init(struct b43_wldev *dev) > > err = -ENOMEM; > /* setup TX DMA channels. */ >- ring = b43_setup_dmaring(dev, 0, 1, dma64); >+ ring = b43_setup_dmaring(dev, 1, 1, dma64); > if (!ring) > goto out; >- dma->tx_ring0 = ring; >+ dma->tx_ring1 = ring; > >- ring = b43_setup_dmaring(dev, 1, 1, dma64); >+ /* The driver only uses ring1 for TX - skip setup for the rest */ >+#if 0 >+ ring = b43_setup_dmaring(dev, 0, 1, dma64); > if (!ring) >- goto err_destroy_tx0; >- dma->tx_ring1 = ring; >+ goto err_destroy_tx1; >+ dma->tx_ring0 = ring; > > ring = b43_setup_dmaring(dev, 2, 1, dma64); > if (!ring) >- goto err_destroy_tx1; >+ goto err_destroy_tx0; > dma->tx_ring2 = ring; > > ring = b43_setup_dmaring(dev, 3, 1, dma64); >@@ -983,6 +986,7 @@ int b43_dma_init(struct b43_wldev *dev) > if (!ring) > goto err_destroy_tx4; > dma->tx_ring5 = ring; >+#endif > > /* setup RX DMA channels. */ > ring = b43_setup_dmaring(dev, 0, 0, dma64); >@@ -1001,30 +1005,32 @@ int b43_dma_init(struct b43_wldev *dev) > (dmamask == DMA_64BIT_MASK) ? 64 : > (dmamask == DMA_32BIT_MASK) ? 32 : 30); > err = 0; >- out: >+out: > return err; > >- err_destroy_rx0: >+err_destroy_rx0: > b43_destroy_dmaring(dma->rx_ring0); > dma->rx_ring0 = NULL; >- err_destroy_tx5: >+err_destroy_tx5: >+#if 0 > b43_destroy_dmaring(dma->tx_ring5); > dma->tx_ring5 = NULL; >- err_destroy_tx4: >+err_destroy_tx4: > b43_destroy_dmaring(dma->tx_ring4); > dma->tx_ring4 = NULL; >- err_destroy_tx3: >+err_destroy_tx3: > b43_destroy_dmaring(dma->tx_ring3); > dma->tx_ring3 = NULL; >- err_destroy_tx2: >+err_destroy_tx2: > b43_destroy_dmaring(dma->tx_ring2); > dma->tx_ring2 = NULL; >- err_destroy_tx1: >- b43_destroy_dmaring(dma->tx_ring1); >- dma->tx_ring1 = NULL; >- err_destroy_tx0: >+err_destroy_tx0: > b43_destroy_dmaring(dma->tx_ring0); > dma->tx_ring0 = NULL; >+err_destroy_tx1: >+#endif >+ b43_destroy_dmaring(dma->tx_ring1); >+ dma->tx_ring1 = NULL; > goto out; > } > >diff -uNrp kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/leds.c kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/leds.c >--- kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/leds.c 2007-12-11 20:19:58.000000000 -0800 >+++ kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/leds.c 2007-12-11 20:23:31.000000000 -0800 >@@ -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> >@@ -186,10 +186,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) { >diff -uNrp kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/lo.c kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/lo.c >--- kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/lo.c 2007-12-11 20:19:58.000000000 -0800 >+++ kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/lo.c 2007-12-11 20:23:31.000000000 -0800 >@@ -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 > 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); >@@ -634,7 +634,7 @@ static void lo_measure_setup(struct b43_ > & 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); >diff -uNrp kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/main.c kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/main.c >--- kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/main.c 2007-12-11 20:19:58.000000000 -0800 >+++ kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/main.c 2007-12-11 20:23:32.000000000 -0800 >@@ -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 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> >@@ -93,6 +93,7 @@ static const struct ssb_device_id b43_ss > SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 7), > SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 9), > SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 10), >+ SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 13), > SSB_DEVTABLE_END > }; > >@@ -1924,7 +1925,7 @@ static int b43_gpio_init(struct b43_wlde > mask |= 0x0180; > set |= 0x0180; > } >- if (dev->dev->bus->sprom.r1.boardflags_lo & B43_BFL_PACTRL) { >+ if (dev->dev->bus->sprom.boardflags_lo & B43_BFL_PACTRL) { > b43_write16(dev, B43_MMIO_GPIO_MASK, > b43_read16(dev, B43_MMIO_GPIO_MASK) > | 0x0200); >@@ -2256,6 +2257,9 @@ static int b43_chip_init(struct b43_wlde > b43_write16(dev, B43_MMIO_POWERUP_DELAY, > dev->dev->bus->chipco.fast_pwrup_delay); > >+ /* OFDM address caching. */ >+ phy->ofdm_valid = 0; >+ > err = 0; > b43dbg(dev->wl, "Chip initialized\n"); > out: >@@ -2289,7 +2293,7 @@ static void b43_periodic_every60sec(stru > > if (!b43_has_hardware_pctl(phy)) > b43_lo_g_ctl_mark_all_unused(dev); >- if (dev->dev->bus->sprom.r1.boardflags_lo & B43_BFL_RSSI) { >+ 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)) { >@@ -3060,7 +3064,7 @@ static int b43_phy_versioning(struct b43 > unsupported = 1; > break; > case B43_PHYTYPE_G: >- if (phy_rev > 8) >+ if (phy_rev > 9) > unsupported = 1; > break; > default: >@@ -3207,13 +3211,13 @@ static void b43_bluetooth_coext_enable(s > struct ssb_sprom *sprom = &dev->dev->bus->sprom; > u32 hf; > >- if (!(sprom->r1.boardflags_lo & B43_BFL_BTCOEXIST)) >+ if (!(sprom->boardflags_lo & B43_BFL_BTCOEXIST)) > return; > if (dev->phy.type != B43_PHYTYPE_B && !dev->phy.gmode) > return; > > hf = b43_hf_read(dev); >- if (sprom->r1.boardflags_lo & B43_BFL_BTCMOD) >+ if (sprom->boardflags_lo & B43_BFL_BTCMOD) > hf |= B43_HF_BTCOEXALT; > else > hf |= B43_HF_BTCOEX; >@@ -3347,7 +3351,7 @@ static int b43_wireless_core_init(struct > hf |= B43_HF_SYMW; > if (phy->rev == 1) > hf |= B43_HF_GDCW; >- if (sprom->r1.boardflags_lo & B43_BFL_PACTRL) >+ if (sprom->boardflags_lo & B43_BFL_PACTRL) > hf |= B43_HF_OFDMPABOOST; > } else if (phy->type == B43_PHYTYPE_B) { > hf |= B43_HF_SYMW; >@@ -3858,20 +3862,20 @@ static void b43_sprom_fixup(struct ssb_b > /* boardflags workarounds */ > if (bus->boardinfo.vendor == SSB_BOARDVENDOR_DELL && > bus->chip_id == 0x4301 && bus->boardinfo.rev == 0x74) >- bus->sprom.r1.boardflags_lo |= B43_BFL_BTCOEXIST; >+ bus->sprom.boardflags_lo |= B43_BFL_BTCOEXIST; > if (bus->boardinfo.vendor == PCI_VENDOR_ID_APPLE && > bus->boardinfo.type == 0x4E && bus->boardinfo.rev > 0x40) >- bus->sprom.r1.boardflags_lo |= B43_BFL_PACTRL; >+ bus->sprom.boardflags_lo |= B43_BFL_PACTRL; > > /* Handle case when gain is not set in sprom */ >- if (bus->sprom.r1.antenna_gain_a == 0xFF) >- bus->sprom.r1.antenna_gain_a = 2; >- if (bus->sprom.r1.antenna_gain_bg == 0xFF) >- bus->sprom.r1.antenna_gain_bg = 2; >+ if (bus->sprom.antenna_gain_a == 0xFF) >+ bus->sprom.antenna_gain_a = 2; >+ if (bus->sprom.antenna_gain_bg == 0xFF) >+ bus->sprom.antenna_gain_bg = 2; > > /* Convert Antennagain values to Q5.2 */ >- bus->sprom.r1.antenna_gain_a <<= 2; >- bus->sprom.r1.antenna_gain_bg <<= 2; >+ bus->sprom.antenna_gain_a <<= 2; >+ bus->sprom.antenna_gain_bg <<= 2; > } > > static void b43_wireless_exit(struct ssb_device *dev, struct b43_wl *wl) >@@ -3904,10 +3908,10 @@ static int b43_wireless_init(struct ssb_ > hw->max_noise = -110; > hw->queues = 1; /* FIXME: hardware has more queues */ > SET_IEEE80211_DEV(hw, dev->dev); >- if (is_valid_ether_addr(sprom->r1.et1mac)) >- SET_IEEE80211_PERM_ADDR(hw, sprom->r1.et1mac); >+ if (is_valid_ether_addr(sprom->et1mac)) >+ SET_IEEE80211_PERM_ADDR(hw, sprom->et1mac); > else >- SET_IEEE80211_PERM_ADDR(hw, sprom->r1.il0mac); >+ SET_IEEE80211_PERM_ADDR(hw, sprom->il0mac); > > /* Get and initialize struct b43_wl */ > wl = hw_to_b43_wl(hw); >diff -uNrp kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/main.h kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/main.h >--- kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/main.h 2007-12-11 20:19:58.000000000 -0800 >+++ kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/main.h 2007-12-11 20:23:31.000000000 -0800 >@@ -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> >diff -uNrp kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/Makefile kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/Makefile >--- kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/Makefile 2007-12-11 20:19:58.000000000 -0800 >+++ kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/Makefile 2007-12-11 20:23:31.000000000 -0800 >@@ -5,6 +5,7 @@ b43-y += phy.o > b43-y += sysfs.o > b43-y += xmit.o > b43-y += lo.o >+b43-y += wa.o > # b43 RFKILL button support > b43-$(CONFIG_B43_RFKILL) += rfkill.o > # b43 LED support >diff -uNrp kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/phy.c kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/phy.c >--- kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/phy.c 2007-12-11 20:19:58.000000000 -0800 >+++ kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/phy.c 2007-12-11 20:23:31.000000000 -0800 >@@ -3,7 +3,7 @@ > Broadcom B43 wireless driver > > Copyright (c) 2005 Martin Langer <martin-langer@gmx.de>, >- Copyright (c) 2005, 2006 Stefano Brivio <st3@riseup.net> >+ Copyright (c) 2005-2007 Stefano Brivio <stefano.brivio@polimi.it> > Copyright (c) 2005, 2006 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> >@@ -33,6 +33,8 @@ > #include "main.h" > #include "tables.h" > #include "lo.h" >+#include "wa.h" >+ > > static const s8 b43_tssi2dbm_b_table[] = { > 0x4D, 0x4C, 0x4B, 0x4A, >@@ -302,8 +304,6 @@ void b43_phy_write(struct b43_wldev *dev > b43_write16(dev, B43_MMIO_PHY_DATA, val); > } > >-static void b43_radio_set_txpower_a(struct b43_wldev *dev, u16 txpower); >- > /* Adjust the transmission power output (G-PHY) */ > void b43_set_txpower_g(struct b43_wldev *dev, > const struct b43_bbatt *bbatt, >@@ -762,366 +762,96 @@ static void b43_phy_init_pctl(struct b43 > b43_shm_clear_tssi(dev); > } > >-static void b43_phy_agcsetup(struct b43_wldev *dev) >-{ >- struct b43_phy *phy = &dev->phy; >- u16 offset = 0x0000; >- >- if (phy->rev == 1) >- offset = 0x4C00; >- >- b43_ofdmtab_write16(dev, offset, 0, 0x00FE); >- b43_ofdmtab_write16(dev, offset, 1, 0x000D); >- b43_ofdmtab_write16(dev, offset, 2, 0x0013); >- b43_ofdmtab_write16(dev, offset, 3, 0x0019); >- >- if (phy->rev == 1) { >- b43_ofdmtab_write16(dev, 0x1800, 0, 0x2710); >- b43_ofdmtab_write16(dev, 0x1801, 0, 0x9B83); >- b43_ofdmtab_write16(dev, 0x1802, 0, 0x9B83); >- b43_ofdmtab_write16(dev, 0x1803, 0, 0x0F8D); >- b43_phy_write(dev, 0x0455, 0x0004); >- } >- >- b43_phy_write(dev, 0x04A5, (b43_phy_read(dev, 0x04A5) >- & 0x00FF) | 0x5700); >- b43_phy_write(dev, 0x041A, (b43_phy_read(dev, 0x041A) >- & 0xFF80) | 0x000F); >- b43_phy_write(dev, 0x041A, (b43_phy_read(dev, 0x041A) >- & 0xC07F) | 0x2B80); >- b43_phy_write(dev, 0x048C, (b43_phy_read(dev, 0x048C) >- & 0xF0FF) | 0x0300); >- >- b43_radio_write16(dev, 0x007A, b43_radio_read16(dev, 0x007A) >- | 0x0008); >- >- b43_phy_write(dev, 0x04A0, (b43_phy_read(dev, 0x04A0) >- & 0xFFF0) | 0x0008); >- b43_phy_write(dev, 0x04A1, (b43_phy_read(dev, 0x04A1) >- & 0xF0FF) | 0x0600); >- b43_phy_write(dev, 0x04A2, (b43_phy_read(dev, 0x04A2) >- & 0xF0FF) | 0x0700); >- b43_phy_write(dev, 0x04A0, (b43_phy_read(dev, 0x04A0) >- & 0xF0FF) | 0x0100); >- >- if (phy->rev == 1) { >- b43_phy_write(dev, 0x04A2, (b43_phy_read(dev, 0x04A2) >- & 0xFFF0) | 0x0007); >- } >- >- b43_phy_write(dev, 0x0488, (b43_phy_read(dev, 0x0488) >- & 0xFF00) | 0x001C); >- b43_phy_write(dev, 0x0488, (b43_phy_read(dev, 0x0488) >- & 0xC0FF) | 0x0200); >- b43_phy_write(dev, 0x0496, (b43_phy_read(dev, 0x0496) >- & 0xFF00) | 0x001C); >- b43_phy_write(dev, 0x0489, (b43_phy_read(dev, 0x0489) >- & 0xFF00) | 0x0020); >- b43_phy_write(dev, 0x0489, (b43_phy_read(dev, 0x0489) >- & 0xC0FF) | 0x0200); >- b43_phy_write(dev, 0x0482, (b43_phy_read(dev, 0x0482) >- & 0xFF00) | 0x002E); >- b43_phy_write(dev, 0x0496, (b43_phy_read(dev, 0x0496) >- & 0x00FF) | 0x1A00); >- b43_phy_write(dev, 0x0481, (b43_phy_read(dev, 0x0481) >- & 0xFF00) | 0x0028); >- b43_phy_write(dev, 0x0481, (b43_phy_read(dev, 0x0481) >- & 0x00FF) | 0x2C00); >- >- if (phy->rev == 1) { >- b43_phy_write(dev, 0x0430, 0x092B); >- b43_phy_write(dev, 0x041B, (b43_phy_read(dev, 0x041B) >- & 0xFFE1) | 0x0002); >- } else { >- b43_phy_write(dev, 0x041B, b43_phy_read(dev, 0x041B) >- & 0xFFE1); >- b43_phy_write(dev, 0x041F, 0x287A); >- b43_phy_write(dev, 0x0420, (b43_phy_read(dev, 0x0420) >- & 0xFFF0) | 0x0004); >- } >- >- if (phy->rev >= 6) { >- b43_phy_write(dev, 0x0422, 0x287A); >- b43_phy_write(dev, 0x0420, (b43_phy_read(dev, 0x0420) >- & 0x0FFF) | 0x3000); >- } >- >- b43_phy_write(dev, 0x04A8, (b43_phy_read(dev, 0x04A8) >- & 0x8080) | 0x7874); >- b43_phy_write(dev, 0x048E, 0x1C00); >- >- offset = 0x0800; >- if (phy->rev == 1) { >- offset = 0x5400; >- b43_phy_write(dev, 0x04AB, (b43_phy_read(dev, 0x04AB) >- & 0xF0FF) | 0x0600); >- b43_phy_write(dev, 0x048B, 0x005E); >- b43_phy_write(dev, 0x048C, (b43_phy_read(dev, 0x048C) >- & 0xFF00) | 0x001E); >- b43_phy_write(dev, 0x048D, 0x0002); >- } >- b43_ofdmtab_write16(dev, offset, 0, 0x00); >- b43_ofdmtab_write16(dev, offset, 1, 0x07); >- b43_ofdmtab_write16(dev, offset, 2, 0x10); >- b43_ofdmtab_write16(dev, offset, 3, 0x1C); >- >- if (phy->rev >= 6) { >- b43_phy_write(dev, 0x0426, b43_phy_read(dev, 0x0426) >- & 0xFFFC); >- b43_phy_write(dev, 0x0426, b43_phy_read(dev, 0x0426) >- & 0xEFFF); >- } >-} >- >-static void b43_phy_setupg(struct b43_wldev *dev) >-{ >- struct ssb_bus *bus = dev->dev->bus; >- struct b43_phy *phy = &dev->phy; >- u16 i; >- >- B43_WARN_ON(phy->type != B43_PHYTYPE_G); >- if (phy->rev == 1) { >- b43_phy_write(dev, 0x0406, 0x4F19); >- b43_phy_write(dev, B43_PHY_G_CRS, >- (b43_phy_read(dev, B43_PHY_G_CRS) & 0xFC3F) | >- 0x0340); >- b43_phy_write(dev, 0x042C, 0x005A); >- b43_phy_write(dev, 0x0427, 0x001A); >- >- for (i = 0; i < B43_TAB_FINEFREQG_SIZE; i++) >- b43_ofdmtab_write16(dev, 0x5800, i, >- b43_tab_finefreqg[i]); >- for (i = 0; i < B43_TAB_NOISEG1_SIZE; i++) >- b43_ofdmtab_write16(dev, 0x1800, i, b43_tab_noiseg1[i]); >- for (i = 0; i < B43_TAB_ROTOR_SIZE; i++) >- b43_ofdmtab_write16(dev, 0x2000, i, b43_tab_rotor[i]); >- } else { >- /* nrssi values are signed 6-bit values. Not sure why we write 0x7654 here... */ >- b43_nrssi_hw_write(dev, 0xBA98, (s16) 0x7654); >- >- if (phy->rev == 2) { >- b43_phy_write(dev, 0x04C0, 0x1861); >- b43_phy_write(dev, 0x04C1, 0x0271); >- } else if (phy->rev > 2) { >- b43_phy_write(dev, 0x04C0, 0x0098); >- b43_phy_write(dev, 0x04C1, 0x0070); >- b43_phy_write(dev, 0x04C9, 0x0080); >- } >- b43_phy_write(dev, 0x042B, b43_phy_read(dev, 0x042B) | 0x800); >- >- for (i = 0; i < 64; i++) >- b43_ofdmtab_write16(dev, 0x4000, i, i); >- for (i = 0; i < B43_TAB_NOISEG2_SIZE; i++) >- b43_ofdmtab_write16(dev, 0x1800, i, b43_tab_noiseg2[i]); >- } >- >- if (phy->rev <= 2) >- for (i = 0; i < B43_TAB_NOISESCALEG_SIZE; i++) >- b43_ofdmtab_write16(dev, 0x1400, i, >- b43_tab_noisescaleg1[i]); >- else if ((phy->rev >= 7) && (b43_phy_read(dev, 0x0449) & 0x0200)) >- for (i = 0; i < B43_TAB_NOISESCALEG_SIZE; i++) >- b43_ofdmtab_write16(dev, 0x1400, i, >- b43_tab_noisescaleg3[i]); >- else >- for (i = 0; i < B43_TAB_NOISESCALEG_SIZE; i++) >- b43_ofdmtab_write16(dev, 0x1400, i, >- b43_tab_noisescaleg2[i]); >- >- if (phy->rev == 2) >- for (i = 0; i < B43_TAB_SIGMASQR_SIZE; i++) >- b43_ofdmtab_write16(dev, 0x5000, i, >- b43_tab_sigmasqr1[i]); >- else if ((phy->rev > 2) && (phy->rev <= 8)) >- for (i = 0; i < B43_TAB_SIGMASQR_SIZE; i++) >- b43_ofdmtab_write16(dev, 0x5000, i, >- b43_tab_sigmasqr2[i]); >- >- if (phy->rev == 1) { >- for (i = 0; i < B43_TAB_RETARD_SIZE; i++) >- b43_ofdmtab_write32(dev, 0x2400, i, b43_tab_retard[i]); >- for (i = 4; i < 20; i++) >- b43_ofdmtab_write16(dev, 0x5400, i, 0x0020); >- b43_phy_agcsetup(dev); >- >- if ((bus->boardinfo.vendor == SSB_BOARDVENDOR_BCM) && >- (bus->boardinfo.type == SSB_BOARD_BU4306) && >- (bus->boardinfo.rev == 0x17)) >- return; >- >- b43_ofdmtab_write16(dev, 0x5001, 0, 0x0002); >- b43_ofdmtab_write16(dev, 0x5002, 0, 0x0001); >- } else { >- for (i = 0; i < 0x20; i++) >- b43_ofdmtab_write16(dev, 0x1000, i, 0x0820); >- b43_phy_agcsetup(dev); >- b43_phy_read(dev, 0x0400); /* dummy read */ >- b43_phy_write(dev, 0x0403, 0x1000); >- b43_ofdmtab_write16(dev, 0x3C02, 0, 0x000F); >- b43_ofdmtab_write16(dev, 0x3C03, 0, 0x0014); >- >- if ((bus->boardinfo.vendor == SSB_BOARDVENDOR_BCM) && >- (bus->boardinfo.type == SSB_BOARD_BU4306) && >- (bus->boardinfo.rev == 0x17)) >- return; >- >- b43_ofdmtab_write16(dev, 0x0401, 0, 0x0002); >- b43_ofdmtab_write16(dev, 0x0402, 0, 0x0001); >- } >-} >- >-/* Initialize the noisescaletable for APHY */ >-static void b43_phy_init_noisescaletbl(struct b43_wldev *dev) >+static void b43_phy_rssiagc(struct b43_wldev *dev, u8 enable) > { >- struct b43_phy *phy = &dev->phy; > int i; > >- for (i = 0; i < 12; i++) { >- if (phy->rev == 2) >- b43_ofdmtab_write16(dev, 0x1400, i, 0x6767); >+ if (dev->phy.rev < 3) { >+ if (enable) >+ for (i = 0; i < B43_TAB_RSSIAGC1_SIZE; i++) { >+ b43_ofdmtab_write16(dev, >+ B43_OFDMTAB_LNAHPFGAIN1, i, 0xFFF8); >+ b43_ofdmtab_write16(dev, >+ B43_OFDMTAB_WRSSI, i, 0xFFF8); >+ } > else >- b43_ofdmtab_write16(dev, 0x1400, i, 0x2323); >- } >- if (phy->rev == 2) >- b43_ofdmtab_write16(dev, 0x1400, i, 0x6700); >- else >- b43_ofdmtab_write16(dev, 0x1400, i, 0x2300); >- for (i = 0; i < 11; i++) { >- if (phy->rev == 2) >- b43_ofdmtab_write16(dev, 0x1400, i, 0x6767); >+ for (i = 0; i < B43_TAB_RSSIAGC1_SIZE; i++) { >+ b43_ofdmtab_write16(dev, >+ B43_OFDMTAB_LNAHPFGAIN1, i, b43_tab_rssiagc1[i]); >+ b43_ofdmtab_write16(dev, >+ B43_OFDMTAB_WRSSI, i, b43_tab_rssiagc1[i]); >+ } >+ } else { >+ if (enable) >+ for (i = 0; i < B43_TAB_RSSIAGC1_SIZE; i++) >+ b43_ofdmtab_write16(dev, >+ B43_OFDMTAB_WRSSI, i, 0x0820); > else >- b43_ofdmtab_write16(dev, 0x1400, i, 0x2323); >+ for (i = 0; i < B43_TAB_RSSIAGC2_SIZE; i++) >+ b43_ofdmtab_write16(dev, >+ B43_OFDMTAB_WRSSI, i, b43_tab_rssiagc2[i]); > } >- if (phy->rev == 2) >- b43_ofdmtab_write16(dev, 0x1400, i, 0x0067); >- else >- b43_ofdmtab_write16(dev, 0x1400, i, 0x0023); > } > >-static void b43_phy_setupa(struct b43_wldev *dev) >+static void b43_phy_ww(struct b43_wldev *dev) > { >- struct b43_phy *phy = &dev->phy; >- u16 i; >- >- B43_WARN_ON(phy->type != B43_PHYTYPE_A); >- switch (phy->rev) { >- case 2: >- b43_phy_write(dev, 0x008E, 0x3800); >- b43_phy_write(dev, 0x0035, 0x03FF); >- b43_phy_write(dev, 0x0036, 0x0400); >- >- b43_ofdmtab_write16(dev, 0x3807, 0, 0x0051); >- >- b43_phy_write(dev, 0x001C, 0x0FF9); >- b43_phy_write(dev, 0x0020, b43_phy_read(dev, 0x0020) & 0xFF0F); >- b43_ofdmtab_write16(dev, 0x3C0C, 0, 0x07BF); >- b43_radio_write16(dev, 0x0002, 0x07BF); >- >- b43_phy_write(dev, 0x0024, 0x4680); >- b43_phy_write(dev, 0x0020, 0x0003); >- b43_phy_write(dev, 0x001D, 0x0F40); >- b43_phy_write(dev, 0x001F, 0x1C00); >- >- b43_phy_write(dev, 0x002A, (b43_phy_read(dev, 0x002A) >- & 0x00FF) | 0x0400); >- b43_phy_write(dev, 0x002B, b43_phy_read(dev, 0x002B) >- & 0xFBFF); >- b43_phy_write(dev, 0x008E, 0x58C1); >- >- b43_ofdmtab_write16(dev, 0x0803, 0, 0x000F); >- b43_ofdmtab_write16(dev, 0x0804, 0, 0x001F); >- b43_ofdmtab_write16(dev, 0x0805, 0, 0x002A); >- b43_ofdmtab_write16(dev, 0x0805, 0, 0x0030); >- b43_ofdmtab_write16(dev, 0x0807, 0, 0x003A); >- >- b43_ofdmtab_write16(dev, 0x0000, 0, 0x0013); >- b43_ofdmtab_write16(dev, 0x0000, 1, 0x0013); >- b43_ofdmtab_write16(dev, 0x0000, 2, 0x0013); >- b43_ofdmtab_write16(dev, 0x0000, 3, 0x0013); >- b43_ofdmtab_write16(dev, 0x0000, 4, 0x0015); >- b43_ofdmtab_write16(dev, 0x0000, 5, 0x0015); >- b43_ofdmtab_write16(dev, 0x0000, 6, 0x0019); >- >- b43_ofdmtab_write16(dev, 0x0404, 0, 0x0003); >- b43_ofdmtab_write16(dev, 0x0405, 0, 0x0003); >- b43_ofdmtab_write16(dev, 0x0406, 0, 0x0007); >- >- for (i = 0; i < 16; i++) >- b43_ofdmtab_write16(dev, 0x4000, i, (0x8 + i) & 0x000F); >- >- b43_ofdmtab_write16(dev, 0x3003, 0, 0x1044); >- b43_ofdmtab_write16(dev, 0x3004, 0, 0x7201); >- b43_ofdmtab_write16(dev, 0x3006, 0, 0x0040); >- b43_ofdmtab_write16(dev, 0x3001, 0, >- (b43_ofdmtab_read16(dev, 0x3001, 0) & >- 0x0010) | 0x0008); >- >- for (i = 0; i < B43_TAB_FINEFREQA_SIZE; i++) >- b43_ofdmtab_write16(dev, 0x5800, i, >- b43_tab_finefreqa[i]); >- for (i = 0; i < B43_TAB_NOISEA2_SIZE; i++) >- b43_ofdmtab_write16(dev, 0x1800, i, b43_tab_noisea2[i]); >- for (i = 0; i < B43_TAB_ROTOR_SIZE; i++) >- b43_ofdmtab_write32(dev, 0x2000, i, b43_tab_rotor[i]); >- b43_phy_init_noisescaletbl(dev); >- for (i = 0; i < B43_TAB_RETARD_SIZE; i++) >- b43_ofdmtab_write32(dev, 0x2400, i, b43_tab_retard[i]); >- break; >- case 3: >- for (i = 0; i < 64; i++) >- b43_ofdmtab_write16(dev, 0x4000, i, i); >- >- b43_ofdmtab_write16(dev, 0x3807, 0, 0x0051); >- >- b43_phy_write(dev, 0x001C, 0x0FF9); >- b43_phy_write(dev, 0x0020, b43_phy_read(dev, 0x0020) & 0xFF0F); >- b43_radio_write16(dev, 0x0002, 0x07BF); >- >- b43_phy_write(dev, 0x0024, 0x4680); >- b43_phy_write(dev, 0x0020, 0x0003); >- b43_phy_write(dev, 0x001D, 0x0F40); >- b43_phy_write(dev, 0x001F, 0x1C00); >- b43_phy_write(dev, 0x002A, (b43_phy_read(dev, 0x002A) >- & 0x00FF) | 0x0400); >- >- b43_ofdmtab_write16(dev, 0x3000, 1, >- (b43_ofdmtab_read16(dev, 0x3000, 1) >- & 0x0010) | 0x0008); >- for (i = 0; i < B43_TAB_NOISEA3_SIZE; i++) { >- b43_ofdmtab_write16(dev, 0x1800, i, b43_tab_noisea3[i]); >- } >- b43_phy_init_noisescaletbl(dev); >- for (i = 0; i < B43_TAB_SIGMASQR_SIZE; i++) { >- b43_ofdmtab_write16(dev, 0x5000, i, >- b43_tab_sigmasqr1[i]); >- } >- >- b43_phy_write(dev, 0x0003, 0x1808); >- >- b43_ofdmtab_write16(dev, 0x0803, 0, 0x000F); >- b43_ofdmtab_write16(dev, 0x0804, 0, 0x001F); >- b43_ofdmtab_write16(dev, 0x0805, 0, 0x002A); >- b43_ofdmtab_write16(dev, 0x0805, 0, 0x0030); >- b43_ofdmtab_write16(dev, 0x0807, 0, 0x003A); >- >- b43_ofdmtab_write16(dev, 0x0000, 0, 0x0013); >- b43_ofdmtab_write16(dev, 0x0001, 0, 0x0013); >- b43_ofdmtab_write16(dev, 0x0002, 0, 0x0013); >- b43_ofdmtab_write16(dev, 0x0003, 0, 0x0013); >- b43_ofdmtab_write16(dev, 0x0004, 0, 0x0015); >- b43_ofdmtab_write16(dev, 0x0005, 0, 0x0015); >- b43_ofdmtab_write16(dev, 0x0006, 0, 0x0019); >- >- b43_ofdmtab_write16(dev, 0x0404, 0, 0x0003); >- b43_ofdmtab_write16(dev, 0x0405, 0, 0x0003); >- b43_ofdmtab_write16(dev, 0x0406, 0, 0x0007); >+ u16 b, curr_s, best_s = 0xFFFF; >+ int i; > >- b43_ofdmtab_write16(dev, 0x3C02, 0, 0x000F); >- b43_ofdmtab_write16(dev, 0x3C03, 0, 0x0014); >- break; >- default: >- B43_WARN_ON(1); >- } >+ b43_phy_write(dev, B43_PHY_CRS0, >+ b43_phy_read(dev, B43_PHY_CRS0) & ~B43_PHY_CRS0_EN); >+ b43_phy_write(dev, B43_PHY_OFDM(0x1B), >+ b43_phy_read(dev, B43_PHY_OFDM(0x1B)) | 0x1000); >+ b43_phy_write(dev, B43_PHY_OFDM(0x82), >+ (b43_phy_read(dev, B43_PHY_OFDM(0x82)) & 0xF0FF) | 0x0300); >+ b43_radio_write16(dev, 0x0009, >+ b43_radio_read16(dev, 0x0009) | 0x0080); >+ b43_radio_write16(dev, 0x0012, >+ (b43_radio_read16(dev, 0x0012) & 0xFFFC) | 0x0002); >+ b43_wa_initgains(dev); >+ b43_phy_write(dev, B43_PHY_OFDM(0xBA), 0x3ED5); >+ b = b43_phy_read(dev, B43_PHY_PWRDOWN); >+ b43_phy_write(dev, B43_PHY_PWRDOWN, (b & 0xFFF8) | 0x0005); >+ b43_radio_write16(dev, 0x0004, >+ b43_radio_read16(dev, 0x0004) | 0x0004); >+ for (i = 0x10; i <= 0x20; i++) { >+ b43_radio_write16(dev, 0x0013, i); >+ curr_s = b43_phy_read(dev, B43_PHY_OTABLEQ) & 0x00FF; >+ if (!curr_s) { >+ best_s = 0x0000; >+ break; >+ } else if (curr_s >= 0x0080) >+ curr_s = 0x0100 - curr_s; >+ if (curr_s < best_s) >+ best_s = curr_s; >+ } >+ b43_phy_write(dev, B43_PHY_PWRDOWN, b); >+ b43_radio_write16(dev, 0x0004, >+ b43_radio_read16(dev, 0x0004) & 0xFFFB); >+ b43_radio_write16(dev, 0x0013, best_s); >+ b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC1_R1, 0, 0xFFEC); >+ b43_phy_write(dev, B43_PHY_OFDM(0xB7), 0x1E80); >+ b43_phy_write(dev, B43_PHY_OFDM(0xB6), 0x1C00); >+ b43_phy_write(dev, B43_PHY_OFDM(0xB5), 0x0EC0); >+ b43_phy_write(dev, B43_PHY_OFDM(0xB2), 0x00C0); >+ b43_phy_write(dev, B43_PHY_OFDM(0xB9), 0x1FFF); >+ b43_phy_write(dev, B43_PHY_OFDM(0xBB), >+ (b43_phy_read(dev, B43_PHY_OFDM(0xBB)) & 0xF000) | 0x0053); >+ b43_phy_write(dev, B43_PHY_OFDM61, >+ (b43_phy_read(dev, B43_PHY_OFDM61 & 0xFE1F)) | 0x0120); >+ b43_phy_write(dev, B43_PHY_OFDM(0x13), >+ (b43_phy_read(dev, B43_PHY_OFDM(0x13)) & 0x0FFF) | 0x3000); >+ b43_phy_write(dev, B43_PHY_OFDM(0x14), >+ (b43_phy_read(dev, B43_PHY_OFDM(0x14)) & 0x0FFF) | 0x3000); >+ b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC1, 6, 0x0017); >+ for (i = 0; i < 6; i++) >+ b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC1, i, 0x000F); >+ b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC1, 0x0D, 0x000E); >+ b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC1, 0x0E, 0x0011); >+ b43_ofdmtab_write16(dev, B43_OFDMTAB_AGC1, 0x0F, 0x0013); >+ b43_phy_write(dev, B43_PHY_OFDM(0x33), 0x5030); >+ b43_phy_write(dev, B43_PHY_CRS0, >+ b43_phy_read(dev, B43_PHY_CRS0) | B43_PHY_CRS0_EN); > } > > /* Initialize APHY. This is also called for the GPHY in some cases. */ >@@ -1129,64 +859,54 @@ static void b43_phy_inita(struct b43_wld > { > struct ssb_bus *bus = dev->dev->bus; > struct b43_phy *phy = &dev->phy; >- u16 tval; > > might_sleep(); > >- if (phy->type == B43_PHYTYPE_A) { >- b43_phy_setupa(dev); >- } else { >- b43_phy_setupg(dev); >- if (phy->gmode && >- (dev->dev->bus->sprom.r1.boardflags_lo & B43_BFL_PACTRL)) >- b43_phy_write(dev, 0x046E, 0x03CF); >- return; >+ if (phy->rev >= 6) { >+ if (phy->type == B43_PHYTYPE_A) >+ b43_phy_write(dev, B43_PHY_OFDM(0x1B), >+ b43_phy_read(dev, B43_PHY_OFDM(0x1B)) & ~0x1000); >+ if (b43_phy_read(dev, B43_PHY_ENCORE) & B43_PHY_ENCORE_EN) >+ b43_phy_write(dev, B43_PHY_ENCORE, >+ b43_phy_read(dev, B43_PHY_ENCORE) | 0x0010); >+ else >+ b43_phy_write(dev, B43_PHY_ENCORE, >+ b43_phy_read(dev, B43_PHY_ENCORE) & ~0x1010); > } > >- b43_phy_write(dev, B43_PHY_A_CRS, >- (b43_phy_read(dev, B43_PHY_A_CRS) & 0xF83C) | 0x0340); >- b43_phy_write(dev, 0x0034, 0x0001); >- >- //TODO: RSSI AGC >- b43_phy_write(dev, B43_PHY_A_CRS, >- b43_phy_read(dev, B43_PHY_A_CRS) | (1 << 14)); >- b43_radio_init2060(dev); >+ b43_wa_all(dev); > >- if ((bus->boardinfo.vendor == SSB_BOARDVENDOR_BCM) && >- ((bus->boardinfo.type == SSB_BOARD_BU4306) || >- (bus->boardinfo.type == SSB_BOARD_BU4309))) { >- if (phy->lofcal == 0xFFFF) { >- //TODO: LOF Cal >- b43_radio_set_tx_iq(dev); >- } else >- b43_radio_write16(dev, 0x001E, phy->lofcal); >- } >+ if (phy->type == B43_PHYTYPE_A) { >+ if (phy->gmode && (phy->rev < 3)) >+ b43_phy_write(dev, 0x0034, >+ b43_phy_read(dev, 0x0034) | 0x0001); >+ b43_phy_rssiagc(dev, 0); > >- b43_phy_write(dev, 0x007A, 0xF111); >+ b43_phy_write(dev, B43_PHY_CRS0, >+ b43_phy_read(dev, B43_PHY_CRS0) | B43_PHY_CRS0_EN); > >- if (phy->cur_idle_tssi == 0) { >- b43_radio_write16(dev, 0x0019, 0x0000); >- b43_radio_write16(dev, 0x0017, 0x0020); >+ b43_radio_init2060(dev); > >- tval = b43_ofdmtab_read16(dev, 0x3001, 0); >- if (phy->rev == 1) { >- b43_ofdmtab_write16(dev, 0x3001, 0, >- (b43_ofdmtab_read16(dev, 0x3001, 0) >- & 0xFF87) >- | 0x0058); >- } else { >- b43_ofdmtab_write16(dev, 0x3001, 0, >- (b43_ofdmtab_read16(dev, 0x3001, 0) >- & 0xFFC3) >- | 0x002C); >+ if ((bus->boardinfo.vendor == SSB_BOARDVENDOR_BCM) && >+ ((bus->boardinfo.type == SSB_BOARD_BU4306) || >+ (bus->boardinfo.type == SSB_BOARD_BU4309))) { >+ ; //TODO: A PHY LO > } >- b43_dummy_transmission(dev); >- phy->cur_idle_tssi = b43_phy_read(dev, B43_PHY_A_PCTL); >- b43_ofdmtab_write16(dev, 0x3001, 0, tval); > >- b43_radio_set_txpower_a(dev, 0x0018); >+ if (phy->rev >= 3) >+ b43_phy_ww(dev); >+ >+ hardware_pctl_init_aphy(dev); >+ >+ //TODO: radar detection >+ } >+ >+ if ((phy->type == B43_PHYTYPE_G) && >+ (dev->dev->bus->sprom.boardflags_lo & B43_BFL_PACTRL)) { >+ b43_phy_write(dev, B43_PHY_OFDM(0x6E), >+ (b43_phy_read(dev, B43_PHY_OFDM(0x6E)) >+ & 0xE000) | 0x3CF); > } >- b43_shm_clear_tssi(dev); > } > > static void b43_phy_initb2(struct b43_wldev *dev) >@@ -1285,7 +1005,7 @@ static void b43_phy_initb4(struct b43_wl > if (phy->radio_ver == 0x2050) > b43_phy_write(dev, 0x002A, 0x88C2); > b43_set_txpower_g(dev, &phy->bbatt, &phy->rfatt, phy->tx_control); >- if (dev->dev->bus->sprom.r1.boardflags_lo & B43_BFL_RSSI) { >+ if (dev->dev->bus->sprom.boardflags_lo & B43_BFL_RSSI) { > b43_calc_nrssi_slope(dev); > b43_calc_nrssi_threshold(dev); > } >@@ -1432,7 +1152,7 @@ static void b43_phy_initb6(struct b43_wl > b43_radio_write16(dev, 0x5A, 0x88); > b43_radio_write16(dev, 0x5B, 0x6B); > b43_radio_write16(dev, 0x5C, 0x0F); >- if (dev->dev->bus->sprom.r1.boardflags_lo & B43_BFL_ALTIQ) { >+ if (dev->dev->bus->sprom.boardflags_lo & B43_BFL_ALTIQ) { > b43_radio_write16(dev, 0x5D, 0xFA); > b43_radio_write16(dev, 0x5E, 0xD8); > } else { >@@ -1524,7 +1244,7 @@ static void b43_phy_initb6(struct b43_wl > b43_phy_write(dev, 0x0062, 0x0007); > b43_radio_init2050(dev); > b43_lo_g_measure(dev); >- if (dev->dev->bus->sprom.r1.boardflags_lo & B43_BFL_RSSI) { >+ if (dev->dev->bus->sprom.boardflags_lo & B43_BFL_RSSI) { > b43_calc_nrssi_slope(dev); > b43_calc_nrssi_threshold(dev); > } >@@ -1644,7 +1364,7 @@ static void b43_calc_loopback_gain(struc > b43_phy_write(dev, B43_PHY_RFOVERVAL, > b43_phy_read(dev, B43_PHY_RFOVERVAL) & 0xCFFF); > >- if (dev->dev->bus->sprom.r1.boardflags_lo & B43_BFL_EXTLNA) { >+ if (dev->dev->bus->sprom.boardflags_lo & B43_BFL_EXTLNA) { > if (phy->rev >= 7) { > b43_phy_write(dev, B43_PHY_RFOVER, > b43_phy_read(dev, B43_PHY_RFOVER) >@@ -1811,7 +1531,7 @@ static void b43_phy_initg(struct b43_wld > & 0x0FFF) | (phy->lo_control-> > tx_bias << 12)); > } >- if (dev->dev->bus->sprom.r1.boardflags_lo & B43_BFL_PACTRL) >+ if (dev->dev->bus->sprom.boardflags_lo & B43_BFL_PACTRL) > b43_phy_write(dev, B43_PHY_BASE(0x2E), 0x8075); > else > b43_phy_write(dev, B43_PHY_BASE(0x2E), 0x807F); >@@ -1825,7 +1545,7 @@ static void b43_phy_initg(struct b43_wld > b43_phy_write(dev, B43_PHY_LO_MASK, 0x8078); > } > >- if (!(dev->dev->bus->sprom.r1.boardflags_lo & B43_BFL_RSSI)) { >+ if (!(dev->dev->bus->sprom.boardflags_lo & B43_BFL_RSSI)) { > /* The specs state to update the NRSSI LT with > * the value 0x7FFFFFFF here. I think that is some weird > * compiler optimization in the original driver. >@@ -2035,16 +1755,15 @@ void b43_phy_xmitpower(struct b43_wldev > estimated_pwr = > b43_phy_estimate_power_out(dev, average); > >- max_pwr = dev->dev->bus->sprom.r1.maxpwr_bg; >- if ((dev->dev->bus->sprom.r1. >- boardflags_lo & B43_BFL_PACTRL) >- && (phy->type == B43_PHYTYPE_G)) >+ max_pwr = dev->dev->bus->sprom.maxpwr_bg; >+ if ((dev->dev->bus->sprom.boardflags_lo >+ & B43_BFL_PACTRL) && (phy->type == B43_PHYTYPE_G)) > max_pwr -= 0x3; > if (unlikely(max_pwr <= 0)) { > b43warn(dev->wl, > "Invalid max-TX-power value in SPROM.\n"); > max_pwr = 60; /* fake it */ >- dev->dev->bus->sprom.r1.maxpwr_bg = max_pwr; >+ dev->dev->bus->sprom.maxpwr_bg = max_pwr; > } > > /*TODO: >@@ -2102,7 +1821,7 @@ void b43_phy_xmitpower(struct b43_wldev > B43_TXCTL_TXMIX; > rfatt += 2; > bbatt += 2; >- } else if (dev->dev->bus->sprom.r1. >+ } else if (dev->dev->bus->sprom. > boardflags_lo & > B43_BFL_PACTRL) { > bbatt += 4 * (rfatt - 2); >@@ -2178,13 +1897,13 @@ int b43_phy_init_tssi2dbm_table(struct b > s8 *dyn_tssi2dbm; > > if (phy->type == B43_PHYTYPE_A) { >- pab0 = (s16) (dev->dev->bus->sprom.r1.pa1b0); >- pab1 = (s16) (dev->dev->bus->sprom.r1.pa1b1); >- pab2 = (s16) (dev->dev->bus->sprom.r1.pa1b2); >- } else { >- pab0 = (s16) (dev->dev->bus->sprom.r1.pa0b0); >- pab1 = (s16) (dev->dev->bus->sprom.r1.pa0b1); >- pab2 = (s16) (dev->dev->bus->sprom.r1.pa0b2); >+ pab0 = (s16) (dev->dev->bus->sprom.pa1b0); >+ pab1 = (s16) (dev->dev->bus->sprom.pa1b1); >+ pab2 = (s16) (dev->dev->bus->sprom.pa1b2); >+ } else { >+ pab0 = (s16) (dev->dev->bus->sprom.pa0b0); >+ pab1 = (s16) (dev->dev->bus->sprom.pa0b1); >+ pab2 = (s16) (dev->dev->bus->sprom.pa0b2); > } > > if ((dev->dev->bus->chip_id == 0x4301) && (phy->radio_ver != 0x2050)) { >@@ -2197,17 +1916,17 @@ int b43_phy_init_tssi2dbm_table(struct b > pab0 != -1 && pab1 != -1 && pab2 != -1) { > /* The pabX values are set in SPROM. Use them. */ > if (phy->type == B43_PHYTYPE_A) { >- if ((s8) dev->dev->bus->sprom.r1.itssi_a != 0 && >- (s8) dev->dev->bus->sprom.r1.itssi_a != -1) >+ if ((s8) dev->dev->bus->sprom.itssi_a != 0 && >+ (s8) dev->dev->bus->sprom.itssi_a != -1) > phy->tgt_idle_tssi = >- (s8) (dev->dev->bus->sprom.r1.itssi_a); >+ (s8) (dev->dev->bus->sprom.itssi_a); > else > phy->tgt_idle_tssi = 62; > } else { >- if ((s8) dev->dev->bus->sprom.r1.itssi_bg != 0 && >- (s8) dev->dev->bus->sprom.r1.itssi_bg != -1) >+ if ((s8) dev->dev->bus->sprom.itssi_bg != 0 && >+ (s8) dev->dev->bus->sprom.itssi_bg != -1) > phy->tgt_idle_tssi = >- (s8) (dev->dev->bus->sprom.r1.itssi_bg); >+ (s8) (dev->dev->bus->sprom.itssi_bg); > else > phy->tgt_idle_tssi = 62; > } >@@ -3113,7 +2832,7 @@ void b43_calc_nrssi_threshold(struct b43 > if (phy->radio_ver != 0x2050) > return; > if (! >- (dev->dev->bus->sprom.r1. >+ (dev->dev->bus->sprom. > boardflags_lo & B43_BFL_RSSI)) > return; > >@@ -3144,7 +2863,7 @@ void b43_calc_nrssi_threshold(struct b43 > } > case B43_PHYTYPE_G: > if (!phy->gmode || >- !(dev->dev->bus->sprom.r1.boardflags_lo & B43_BFL_RSSI)) { >+ !(dev->dev->bus->sprom.boardflags_lo & B43_BFL_RSSI)) { > tmp16 = b43_nrssi_hw_read(dev, 0x20); > if (tmp16 >= 0x20) > tmp16 -= 0x40; >@@ -3666,7 +3385,7 @@ static u16 radio2050_rfover_val(struct b > } > > if ((phy->rev < 7) || >- !(sprom->r1.boardflags_lo & B43_BFL_EXTLNA)) { >+ !(sprom->boardflags_lo & B43_BFL_EXTLNA)) { > if (phy_register == B43_PHY_RFOVER) { > return 0x1B3; > } else if (phy_register == B43_PHY_RFOVERVAL) { >@@ -3706,7 +3425,7 @@ static u16 radio2050_rfover_val(struct b > } > } else { > if ((phy->rev < 7) || >- !(sprom->r1.boardflags_lo & B43_BFL_EXTLNA)) { >+ !(sprom->boardflags_lo & B43_BFL_EXTLNA)) { > if (phy_register == B43_PHY_RFOVER) { > return 0x1B3; > } else if (phy_register == B43_PHY_RFOVERVAL) { >@@ -4185,7 +3904,7 @@ int b43_radio_selectchannel(struct b43_w > b43_write16(dev, B43_MMIO_CHANNEL, channel2freq_bg(channel)); > > if (channel == 14) { >- if (dev->dev->bus->sprom.r1.country_code == >+ if (dev->dev->bus->sprom.country_code == > SSB_SPROM1CCODE_JAPAN) > b43_hf_write(dev, > b43_hf_read(dev) & ~B43_HF_ACPR); >@@ -4209,103 +3928,6 @@ int b43_radio_selectchannel(struct b43_w > return 0; > } > >-/* http://bcm-specs.sipsolutions.net/TX_Gain_Base_Band */ >-static u16 b43_get_txgain_base_band(u16 txpower) >-{ >- u16 ret; >- >- B43_WARN_ON(txpower > 63); >- >- if (txpower >= 54) >- ret = 2; >- else if (txpower >= 49) >- ret = 4; >- else if (txpower >= 44) >- ret = 5; >- else >- ret = 6; >- >- return ret; >-} >- >-/* http://bcm-specs.sipsolutions.net/TX_Gain_Radio_Frequency_Power_Amplifier */ >-static u16 b43_get_txgain_freq_power_amp(u16 txpower) >-{ >- u16 ret; >- >- B43_WARN_ON(txpower > 63); >- >- if (txpower >= 32) >- ret = 0; >- else if (txpower >= 25) >- ret = 1; >- else if (txpower >= 20) >- ret = 2; >- else if (txpower >= 12) >- ret = 3; >- else >- ret = 4; >- >- return ret; >-} >- >-/* http://bcm-specs.sipsolutions.net/TX_Gain_Digital_Analog_Converter */ >-static u16 b43_get_txgain_dac(u16 txpower) >-{ >- u16 ret; >- >- B43_WARN_ON(txpower > 63); >- >- if (txpower >= 54) >- ret = txpower - 53; >- else if (txpower >= 49) >- ret = txpower - 42; >- else if (txpower >= 44) >- ret = txpower - 37; >- else if (txpower >= 32) >- ret = txpower - 32; >- else if (txpower >= 25) >- ret = txpower - 20; >- else if (txpower >= 20) >- ret = txpower - 13; >- else if (txpower >= 12) >- ret = txpower - 8; >- else >- ret = txpower; >- >- return ret; >-} >- >-static void b43_radio_set_txpower_a(struct b43_wldev *dev, u16 txpower) >-{ >- struct b43_phy *phy = &dev->phy; >- u16 pamp, base, dac, t; >- >- txpower = limit_value(txpower, 0, 63); >- >- pamp = b43_get_txgain_freq_power_amp(txpower); >- pamp <<= 5; >- pamp &= 0x00E0; >- b43_phy_write(dev, 0x0019, pamp); >- >- base = b43_get_txgain_base_band(txpower); >- base &= 0x000F; >- b43_phy_write(dev, 0x0017, base | 0x0020); >- >- t = b43_ofdmtab_read16(dev, 0x3000, 1); >- t &= 0x0007; >- >- dac = b43_get_txgain_dac(txpower); >- dac <<= 3; >- dac |= t; >- >- b43_ofdmtab_write16(dev, 0x3000, 1, dac); >- >- phy->txpwr_offset = txpower; >- >- //TODO: FuncPlaceholder (Adjust BB loft cancel) >-} >- > void b43_radio_turn_on(struct b43_wldev *dev) > { > struct b43_phy *phy = &dev->phy; >diff -uNrp kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/phy.h kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/phy.h >--- kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/phy.h 2007-12-11 20:19:58.000000000 -0800 >+++ kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/phy.h 2007-12-11 20:23:31.000000000 -0800 >@@ -27,8 +27,11 @@ struct b43_phy; > #define B43_PHY_PWRDOWN B43_PHY_OFDM(0x03) /* Powerdown */ > #define B43_PHY_CRSTHRES1 B43_PHY_OFDM(0x06) /* CRS Threshold 1 */ > #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 +40,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 +48,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,6 +61,8 @@ 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) >@@ -125,13 +134,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) >diff -uNrp kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/tables.c kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/tables.c >--- kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/tables.c 2007-12-11 20:19:58.000000000 -0800 >+++ kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/tables.c 2007-12-11 20:23:31.000000000 -0800 >@@ -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,65 @@ 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 (addr - 1 != phy->ofdm_addr || phy->ofdm_valid != 1) { >+ b43_phy_write(dev, B43_PHY_OTABLECTL, addr); >+ phy->ofdm_valid = 1; >+ } >+ phy->ofdm_addr = addr; > >- b43_phy_write(dev, B43_PHY_OTABLECTL, table + offset); > return b43_phy_read(dev, B43_PHY_OTABLEI); >+ 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 (addr - 1 != phy->ofdm_addr || phy->ofdm_valid != 2) { >+ b43_phy_write(dev, B43_PHY_OTABLECTL, addr); >+ phy->ofdm_valid = 2; >+ } >+ phy->ofdm_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 (addr - 1 != phy->ofdm_addr || phy->ofdm_valid != 1) { >+ b43_phy_write(dev, B43_PHY_OTABLECTL, addr); >+ phy->ofdm_valid = 1; >+ } >+ phy->ofdm_addr = addr; > ret = b43_phy_read(dev, B43_PHY_OTABLEQ); > ret <<= 16; > ret |= b43_phy_read(dev, B43_PHY_OTABLEI); >@@ -357,9 +428,17 @@ u32 b43_ofdmtab_read32(struct b43_wldev > 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 (addr - 1 != phy->ofdm_addr || phy->ofdm_valid != 2) { >+ b43_phy_write(dev, B43_PHY_OTABLECTL, addr); >+ phy->ofdm_valid = 2; >+ } >+ phy->ofdm_addr = addr; >+ > b43_phy_write(dev, B43_PHY_OTABLEI, value); >- b43_phy_write(dev, B43_PHY_OTABLEQ, (value >> 16)); > } > > u16 b43_gtab_read(struct b43_wldev *dev, u16 table, u16 offset) >diff -uNrp kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/tables.h kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/tables.h >--- kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/tables.h 2007-12-11 20:19:58.000000000 -0800 >+++ kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/tables.h 2007-12-11 20:23:31.000000000 -0800 >@@ -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_ */ >diff -uNrp kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/wa.c kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/wa.c >--- kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/wa.c 1969-12-31 16:00:00.000000000 -0800 >+++ kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/wa.c 2007-12-11 20:23:32.000000000 -0800 >@@ -0,0 +1,666 @@ >+/* >+ >+ 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; >+ >+ 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); >+} >+ >+static void b43_wa_analog(struct b43_wldev *dev) >+{ >+ struct b43_phy *phy = &dev->phy; >+ >+ if (phy->analog > 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, 0x4F19); >+ } else if (phy->rev == 2) { >+ b43_phy_write(dev, B43_PHY_CRSTHRES1_R1, 0x1861); >+ b43_phy_write(dev, B43_PHY_CRSTHRES2_R1, 0x1861); >+ b43_phy_write(dev, B43_PHY_ANTDWELL, >+ b43_phy_read(dev, B43_PHY_ANTDWELL) >+ | 0x0800); >+ } else { >+ b43_phy_write(dev, B43_PHY_CRSTHRES1_R1, 0x0098); >+ b43_phy_write(dev, B43_PHY_CRSTHRES2_R1, 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) & 0x7F7F) | 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); >+ } >+} >+ >+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); >+} >diff -uNrp kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/wa.h kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/wa.h >--- kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/wa.h 1969-12-31 16:00:00.000000000 -0800 >+++ kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/wa.h 2007-12-11 20:23:31.000000000 -0800 >@@ -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_ */ >diff -uNrp kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/xmit.c kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/xmit.c >--- kernel-2.6.23.1-49/linux-2.6.23.i686/drivers/net/wireless/b43/xmit.c 2007-12-11 20:19:58.000000000 -0800 >+++ kernel-2.6.23.8-63/linux-2.6.23.i686/drivers/net/wireless/b43/xmit.c 2007-12-11 20:23:31.000000000 -0800 >@@ -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> >@@ -385,7 +385,7 @@ static s8 b43_rssi_postprocess(struct b4 > 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;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 412861
: 285041