Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
authorJohn W. Linville <linville@tuxdriver.com>
Wed, 8 Jun 2011 17:44:21 +0000 (13:44 -0400)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 8 Jun 2011 17:44:21 +0000 (13:44 -0400)
1  2 
drivers/bcma/host_pci.c
drivers/net/wireless/ath/ath9k/ath9k.h
drivers/net/wireless/b43/main.c
drivers/net/wireless/b43legacy/main.c
drivers/net/wireless/iwlwifi/iwl-dev.h
drivers/net/wireless/rt2x00/rt2800lib.c
drivers/net/wireless/rt2x00/rt2800pci.c
lib/Kconfig
lib/Makefile

diff --combined drivers/bcma/host_pci.c
@@@ -6,7 -6,6 +6,7 @@@
   */
  
  #include "bcma_private.h"
 +#include <linux/slab.h>
  #include <linux/bcma/bcma.h>
  #include <linux/pci.h>
  
@@@ -65,6 -64,54 +65,54 @@@ static void bcma_host_pci_write32(struc
        iowrite32(value, core->bus->mmio + offset);
  }
  
+ #ifdef CONFIG_BCMA_BLOCKIO
+ void bcma_host_pci_block_read(struct bcma_device *core, void *buffer,
+                             size_t count, u16 offset, u8 reg_width)
+ {
+       void __iomem *addr = core->bus->mmio + offset;
+       if (core->bus->mapped_core != core)
+               bcma_host_pci_switch_core(core);
+       switch (reg_width) {
+       case sizeof(u8):
+               ioread8_rep(addr, buffer, count);
+               break;
+       case sizeof(u16):
+               WARN_ON(count & 1);
+               ioread16_rep(addr, buffer, count >> 1);
+               break;
+       case sizeof(u32):
+               WARN_ON(count & 3);
+               ioread32_rep(addr, buffer, count >> 2);
+               break;
+       default:
+               WARN_ON(1);
+       }
+ }
+ void bcma_host_pci_block_write(struct bcma_device *core, const void *buffer,
+                              size_t count, u16 offset, u8 reg_width)
+ {
+       void __iomem *addr = core->bus->mmio + offset;
+       if (core->bus->mapped_core != core)
+               bcma_host_pci_switch_core(core);
+       switch (reg_width) {
+       case sizeof(u8):
+               iowrite8_rep(addr, buffer, count);
+               break;
+       case sizeof(u16):
+               WARN_ON(count & 1);
+               iowrite16_rep(addr, buffer, count >> 1);
+               break;
+       case sizeof(u32):
+               WARN_ON(count & 3);
+               iowrite32_rep(addr, buffer, count >> 2);
+               break;
+       default:
+               WARN_ON(1);
+       }
+ }
+ #endif
  static u32 bcma_host_pci_aread32(struct bcma_device *core, u16 offset)
  {
        if (core->bus->mapped_core != core)
@@@ -87,6 -134,10 +135,10 @@@ const struct bcma_host_ops bcma_host_pc
        .write8         = bcma_host_pci_write8,
        .write16        = bcma_host_pci_write16,
        .write32        = bcma_host_pci_write32,
+ #ifdef CONFIG_BCMA_BLOCKIO
+       .block_read     = bcma_host_pci_block_read,
+       .block_write    = bcma_host_pci_block_write,
+ #endif
        .aread32        = bcma_host_pci_aread32,
        .awrite32       = bcma_host_pci_awrite32,
  };
@@@ -19,7 -19,6 +19,7 @@@
  
  #include <linux/etherdevice.h>
  #include <linux/device.h>
 +#include <linux/interrupt.h>
  #include <linux/leds.h>
  #include <linux/completion.h>
  
@@@ -180,7 -179,7 +180,7 @@@ enum ATH_AGGR_STATUS 
  struct ath_txq {
        int mac80211_qnum; /* mac80211 queue number, -1 means not mac80211 Q */
        u32 axq_qnum; /* ath9k hardware queue number */
-       u32 *axq_link;
+       void *axq_link;
        struct list_head axq_q;
        spinlock_t axq_lock;
        u32 axq_depth;
        bool axq_tx_inprogress;
        struct list_head axq_acq;
        struct list_head txq_fifo[ATH_TXFIFO_DEPTH];
-       struct list_head txq_fifo_pending;
        u8 txq_headidx;
        u8 txq_tailidx;
        int pending_frames;
@@@ -429,6 -427,7 +428,7 @@@ void ath_hw_check(struct work_struct *w
  void ath_hw_pll_work(struct work_struct *work);
  void ath_paprd_calibrate(struct work_struct *work);
  void ath_ani_calibrate(unsigned long data);
+ void ath_start_ani(struct ath_common *common);
  
  /**********/
  /* BTCOEX */
@@@ -670,12 -669,8 +670,8 @@@ int ath9k_init_device(u16 devid, struc
                    const struct ath_bus_ops *bus_ops);
  void ath9k_deinit_device(struct ath_softc *sc);
  void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw);
- int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
-                   struct ath9k_channel *hchan);
  
- void ath_radio_enable(struct ath_softc *sc, struct ieee80211_hw *hw);
  void ath_radio_disable(struct ath_softc *sc, struct ieee80211_hw *hw);
- bool ath9k_setpower(struct ath_softc *sc, enum ath9k_power_mode mode);
  bool ath9k_uses_beacons(int type);
  
  #ifdef CONFIG_ATH9K_PCI
@@@ -113,6 -113,16 +113,16 @@@ static int b43_modparam_pio = B43_PIO_D
  module_param_named(pio, b43_modparam_pio, int, 0644);
  MODULE_PARM_DESC(pio, "Use PIO accesses by default: 0=DMA, 1=PIO");
  
+ #ifdef CONFIG_B43_BCMA
+ static const struct bcma_device_id b43_bcma_tbl[] = {
+       BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x17, BCMA_ANY_CLASS),
+       BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x18, BCMA_ANY_CLASS),
+       BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x1D, BCMA_ANY_CLASS),
+       BCMA_CORETABLE_END
+ };
+ MODULE_DEVICE_TABLE(bcma, b43_bcma_tbl);
+ #endif
  static const struct ssb_device_id b43_ssb_tbl[] = {
        SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 5),
        SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 6),
@@@ -548,7 -558,7 +558,7 @@@ void b43_tsf_read(struct b43_wldev *dev
  {
        u32 low, high;
  
-       B43_WARN_ON(dev->sdev->id.revision < 3);
+       B43_WARN_ON(dev->dev->core_rev < 3);
  
        /* The hardware guarantees us an atomic read, if we
         * read the low register first. */
@@@ -586,7 -596,7 +596,7 @@@ static void b43_tsf_write_locked(struc
  {
        u32 low, high;
  
-       B43_WARN_ON(dev->sdev->id.revision < 3);
+       B43_WARN_ON(dev->dev->core_rev < 3);
  
        low = tsf;
        high = (tsf >> 32);
@@@ -714,7 -724,7 +724,7 @@@ void b43_dummy_transmission(struct b43_
                b43_ram_write(dev, i * 4, buffer[i]);
  
        b43_write16(dev, 0x0568, 0x0000);
-       if (dev->sdev->id.revision < 11)
+       if (dev->dev->core_rev < 11)
                b43_write16(dev, 0x07C0, 0x0000);
        else
                b43_write16(dev, 0x07C0, 0x0100);
@@@ -1132,7 -1142,7 +1142,7 @@@ void b43_power_saving_ctl_bits(struct b
        b43_write32(dev, B43_MMIO_MACCTL, macctl);
        /* Commit write */
        b43_read32(dev, B43_MMIO_MACCTL);
-       if (awake && dev->sdev->id.revision >= 5) {
+       if (awake && dev->dev->core_rev >= 5) {
                /* Wait for the microcode to wake up. */
                for (i = 0; i < 100; i++) {
                        ucstat = b43_shm_read16(dev, B43_SHM_SHARED,
        }
  }
  
- static void b43_ssb_wireless_core_reset(struct b43_wldev *dev, u32 flags)
+ static void b43_ssb_wireless_core_reset(struct b43_wldev *dev, bool gmode)
  {
+       struct ssb_device *sdev = dev->dev->sdev;
        u32 tmslow;
+       u32 flags = 0;
  
+       if (gmode)
+               flags |= B43_TMSLOW_GMODE;
        flags |= B43_TMSLOW_PHYCLKEN;
        flags |= B43_TMSLOW_PHYRESET;
        if (dev->phy.type == B43_PHYTYPE_N)
                flags |= B43_TMSLOW_PHY_BANDWIDTH_20MHZ; /* Make 20 MHz def */
-       ssb_device_enable(dev->sdev, flags);
+       b43_device_enable(dev, flags);
        msleep(2);              /* Wait for the PLL to turn on. */
  
        /* Now take the PHY out of Reset again */
-       tmslow = ssb_read32(dev->sdev, SSB_TMSLOW);
+       tmslow = ssb_read32(sdev, SSB_TMSLOW);
        tmslow |= SSB_TMSLOW_FGC;
        tmslow &= ~B43_TMSLOW_PHYRESET;
-       ssb_write32(dev->sdev, SSB_TMSLOW, tmslow);
-       ssb_read32(dev->sdev, SSB_TMSLOW);      /* flush */
+       ssb_write32(sdev, SSB_TMSLOW, tmslow);
+       ssb_read32(sdev, SSB_TMSLOW);   /* flush */
        msleep(1);
        tmslow &= ~SSB_TMSLOW_FGC;
-       ssb_write32(dev->sdev, SSB_TMSLOW, tmslow);
-       ssb_read32(dev->sdev, SSB_TMSLOW);      /* flush */
+       ssb_write32(sdev, SSB_TMSLOW, tmslow);
+       ssb_read32(sdev, SSB_TMSLOW);   /* flush */
        msleep(1);
  }
  
- void b43_wireless_core_reset(struct b43_wldev *dev, u32 flags)
+ void b43_wireless_core_reset(struct b43_wldev *dev, bool gmode)
  {
        u32 macctl;
  
-       b43_ssb_wireless_core_reset(dev, flags);
+       b43_ssb_wireless_core_reset(dev, gmode);
  
        /* Turn Analog ON, but only if we already know the PHY-type.
         * This protects against very early setup where we don't know the
  
        macctl = b43_read32(dev, B43_MMIO_MACCTL);
        macctl &= ~B43_MACCTL_GMODE;
-       if (flags & B43_TMSLOW_GMODE)
+       if (gmode)
                macctl |= B43_MACCTL_GMODE;
        macctl |= B43_MACCTL_IHR_ENABLED;
        b43_write32(dev, B43_MMIO_MACCTL, macctl);
@@@ -1221,7 -1235,7 +1235,7 @@@ static void drain_txstatus_queue(struc
  {
        u32 dummy;
  
-       if (dev->sdev->id.revision < 5)
+       if (dev->dev->core_rev < 5)
                return;
        /* Read all entries from the microcode TXstatus FIFO
         * and throw them away.
@@@ -1427,9 -1441,9 +1441,9 @@@ u8 b43_ieee80211_antenna_sanitize(struc
  
        /* Get the mask of available antennas. */
        if (dev->phy.gmode)
-               antenna_mask = dev->sdev->bus->sprom.ant_available_bg;
+               antenna_mask = dev->dev->bus_sprom->ant_available_bg;
        else
-               antenna_mask = dev->sdev->bus->sprom.ant_available_a;
+               antenna_mask = dev->dev->bus_sprom->ant_available_a;
  
        if (!(antenna_mask & (1 << (antenna_nr - 1)))) {
                /* This antenna is not available. Fall back to default. */
@@@ -1644,7 -1658,7 +1658,7 @@@ static void b43_beacon_update_trigger_w
        mutex_lock(&wl->mutex);
        dev = wl->current_dev;
        if (likely(dev && (b43_status(dev) >= B43_STAT_INITIALIZED))) {
-               if (dev->sdev->bus->bustype == SSB_BUSTYPE_SDIO) {
+               if (b43_bus_host_is_sdio(dev->dev)) {
                        /* wl->mutex is enough. */
                        b43_do_beacon_update_trigger_work(dev);
                        mmiowb();
@@@ -1689,7 -1703,7 +1703,7 @@@ static void b43_update_templates(struc
  static void b43_set_beacon_int(struct b43_wldev *dev, u16 beacon_int)
  {
        b43_time_lock(dev);
-       if (dev->sdev->id.revision >= 3) {
+       if (dev->dev->core_rev >= 3) {
                b43_write32(dev, B43_MMIO_TSF_CFP_REP, (beacon_int << 16));
                b43_write32(dev, B43_MMIO_TSF_CFP_START, (beacon_int << 10));
        } else {
@@@ -2063,7 -2077,7 +2077,7 @@@ int b43_do_request_fw(struct b43_reques
                B43_WARN_ON(1);
                return -ENOSYS;
        }
-       err = request_firmware(&blob, ctx->fwname, ctx->dev->sdev->dev);
+       err = request_firmware(&blob, ctx->fwname, ctx->dev->dev->dev);
        if (err == -ENOENT) {
                snprintf(ctx->errors[ctx->req_type],
                         sizeof(ctx->errors[ctx->req_type]),
@@@ -2113,7 -2127,7 +2127,7 @@@ static int b43_try_request_fw(struct b4
  {
        struct b43_wldev *dev = ctx->dev;
        struct b43_firmware *fw = &ctx->dev->fw;
-       const u8 rev = ctx->dev->sdev->id.revision;
+       const u8 rev = ctx->dev->dev->core_rev;
        const char *filename;
        u32 tmshigh;
        int err;
        switch (dev->phy.type) {
        case B43_PHYTYPE_A:
                if ((rev >= 5) && (rev <= 10)) {
-                       tmshigh = ssb_read32(dev->sdev, SSB_TMSHIGH);
+                       tmshigh = ssb_read32(dev->dev->sdev, SSB_TMSHIGH);
                        if (tmshigh & B43_TMSHIGH_HAVE_2GHZ_PHY)
                                filename = "a0g1initvals5";
                        else
        switch (dev->phy.type) {
        case B43_PHYTYPE_A:
                if ((rev >= 5) && (rev <= 10)) {
-                       tmshigh = ssb_read32(dev->sdev, SSB_TMSHIGH);
+                       tmshigh = ssb_read32(dev->dev->sdev, SSB_TMSHIGH);
                        if (tmshigh & B43_TMSHIGH_HAVE_2GHZ_PHY)
                                filename = "a0g1bsinitvals5";
                        else
@@@ -2448,7 -2462,7 +2462,7 @@@ static int b43_upload_microcode(struct 
  
        snprintf(wiphy->fw_version, sizeof(wiphy->fw_version), "%u.%u",
                        dev->fw.rev, dev->fw.patch);
-       wiphy->hw_version = dev->sdev->id.coreid;
+       wiphy->hw_version = dev->dev->core_id;
  
        if (b43_is_old_txhdr_format(dev)) {
                /* We're over the deadline, but we keep support for old fw
@@@ -2566,7 -2580,7 +2580,7 @@@ out
   */
  static struct ssb_device *b43_ssb_gpio_dev(struct b43_wldev *dev)
  {
-       struct ssb_bus *bus = dev->sdev->bus;
+       struct ssb_bus *bus = dev->dev->sdev->bus;
  
  #ifdef CONFIG_SSB_DRIVER_PCICORE
        return (bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev);
@@@ -2588,7 -2602,7 +2602,7 @@@ static int b43_gpio_init(struct b43_wld
  
        mask = 0x0000001F;
        set = 0x0000000F;
-       if (dev->sdev->bus->chip_id == 0x4301) {
+       if (dev->dev->chip_id == 0x4301) {
                mask |= 0x0060;
                set |= 0x0060;
        }
                mask |= 0x0180;
                set |= 0x0180;
        }
-       if (dev->sdev->bus->sprom.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);
                mask |= 0x0200;
                set |= 0x0200;
        }
-       if (dev->sdev->id.revision >= 2)
+       if (dev->dev->core_rev >= 2)
                mask |= 0x0010; /* FIXME: This is redundant. */
  
        gpiodev = b43_ssb_gpio_dev(dev);
@@@ -2741,15 -2755,15 +2755,15 @@@ static void b43_adjust_opmode(struct b4
        /* Workaround: On old hardware the HW-MAC-address-filter
         * doesn't work properly, so always run promisc in filter
         * it in software. */
-       if (dev->sdev->id.revision <= 4)
+       if (dev->dev->core_rev <= 4)
                ctl |= B43_MACCTL_PROMISC;
  
        b43_write32(dev, B43_MMIO_MACCTL, ctl);
  
        cfp_pretbtt = 2;
        if ((ctl & B43_MACCTL_INFRA) && !(ctl & B43_MACCTL_AP)) {
-               if (dev->sdev->bus->chip_id == 0x4306 &&
-                   dev->sdev->bus->chip_rev == 3)
+               if (dev->dev->chip_id == 0x4306 &&
+                   dev->dev->chip_rev == 3)
                        cfp_pretbtt = 100;
                else
                        cfp_pretbtt = 50;
@@@ -2907,7 -2921,7 +2921,7 @@@ static int b43_chip_init(struct b43_wld
                b43_write16(dev, 0x005E, value16);
        }
        b43_write32(dev, 0x0100, 0x01000000);
-       if (dev->sdev->id.revision < 5)
+       if (dev->dev->core_rev < 5)
                b43_write32(dev, 0x010C, 0x01000000);
  
        b43_write32(dev, B43_MMIO_MACCTL, b43_read32(dev, B43_MMIO_MACCTL)
        /* Initially set the wireless operation mode. */
        b43_adjust_opmode(dev);
  
-       if (dev->sdev->id.revision < 3) {
+       if (dev->dev->core_rev < 3) {
                b43_write16(dev, 0x060E, 0x0000);
                b43_write16(dev, 0x0610, 0x8000);
                b43_write16(dev, 0x0604, 0x0000);
@@@ -3105,7 -3119,7 +3119,7 @@@ static int b43_validate_chipaccess(stru
        b43_shm_write32(dev, B43_SHM_SHARED, 0, backup0);
        b43_shm_write32(dev, B43_SHM_SHARED, 4, backup4);
  
-       if ((dev->sdev->id.revision >= 3) && (dev->sdev->id.revision <= 10)) {
+       if ((dev->dev->core_rev >= 3) && (dev->dev->core_rev <= 10)) {
                /* The 32bit register shadows the two 16bit registers
                 * with update sideeffects. Validate this. */
                b43_write16(dev, B43_MMIO_TSF_CFP_START, 0xAAAA);
@@@ -3954,7 -3968,7 +3968,7 @@@ redo
  
        /* Disable interrupts on the device. */
        b43_set_status(dev, B43_STAT_INITIALIZED);
-       if (dev->sdev->bus->bustype == SSB_BUSTYPE_SDIO) {
+       if (b43_bus_host_is_sdio(dev->dev)) {
                /* wl->mutex is locked. That is enough. */
                b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, 0);
                b43_read32(dev, B43_MMIO_GEN_IRQ_MASK); /* Flush */
        /* Synchronize and free the interrupt handlers. Unlock to avoid deadlocks. */
        orig_dev = dev;
        mutex_unlock(&wl->mutex);
-       if (dev->sdev->bus->bustype == SSB_BUSTYPE_SDIO) {
+       if (b43_bus_host_is_sdio(dev->dev)) {
                b43_sdio_free_irq(dev);
        } else {
-               synchronize_irq(dev->sdev->irq);
-               free_irq(dev->sdev->irq, dev);
+               synchronize_irq(dev->dev->irq);
+               free_irq(dev->dev->irq, dev);
        }
        mutex_lock(&wl->mutex);
        dev = wl->current_dev;
@@@ -4004,19 -4018,19 +4018,19 @@@ static int b43_wireless_core_start(stru
        B43_WARN_ON(b43_status(dev) != B43_STAT_INITIALIZED);
  
        drain_txstatus_queue(dev);
-       if (dev->sdev->bus->bustype == SSB_BUSTYPE_SDIO) {
+       if (b43_bus_host_is_sdio(dev->dev)) {
                err = b43_sdio_request_irq(dev, b43_sdio_interrupt_handler);
                if (err) {
                        b43err(dev->wl, "Cannot request SDIO IRQ\n");
                        goto out;
                }
        } else {
-               err = request_threaded_irq(dev->sdev->irq, b43_interrupt_handler,
+               err = request_threaded_irq(dev->dev->irq, b43_interrupt_handler,
                                           b43_interrupt_thread_handler,
                                           IRQF_SHARED, KBUILD_MODNAME, dev);
                if (err) {
                        b43err(dev->wl, "Cannot request IRQ-%d\n",
-                              dev->sdev->irq);
+                              dev->dev->irq);
                        goto out;
                }
        }
@@@ -4085,7 -4099,7 +4099,7 @@@ static int b43_phy_versioning(struct b4
  #endif
        default:
                unsupported = 1;
 -      };
 +      }
        if (unsupported) {
                b43err(dev->wl, "FOUND UNSUPPORTED PHY "
                       "(Analog %u, Type %u, Revision %u)\n",
               analog_type, phy_type, phy_rev);
  
        /* Get RADIO versioning */
-       if (dev->sdev->bus->chip_id == 0x4317) {
-               if (dev->sdev->bus->chip_rev == 0)
+       if (dev->dev->chip_id == 0x4317) {
+               if (dev->dev->chip_rev == 0)
                        tmp = 0x3205017F;
-               else if (dev->sdev->bus->chip_rev == 1)
+               else if (dev->dev->chip_rev == 1)
                        tmp = 0x4205017F;
                else
                        tmp = 0x5205017F;
@@@ -4204,7 -4218,7 +4218,7 @@@ static void setup_struct_wldev_for_init
  
  static void b43_bluetooth_coext_enable(struct b43_wldev *dev)
  {
-       struct ssb_sprom *sprom = &dev->sdev->bus->sprom;
+       struct ssb_sprom *sprom = dev->dev->bus_sprom;
        u64 hf;
  
        if (!modparam_btcoex)
@@@ -4231,16 -4245,21 +4245,21 @@@ static void b43_bluetooth_coext_disable
  
  static void b43_imcfglo_timeouts_workaround(struct b43_wldev *dev)
  {
-       struct ssb_bus *bus = dev->sdev->bus;
+       struct ssb_bus *bus;
        u32 tmp;
  
+       if (dev->dev->bus_type != B43_BUS_SSB)
+               return;
+       bus = dev->dev->sdev->bus;
        if ((bus->chip_id == 0x4311 && bus->chip_rev == 2) ||
            (bus->chip_id == 0x4312)) {
-               tmp = ssb_read32(dev->sdev, SSB_IMCFGLO);
+               tmp = ssb_read32(dev->dev->sdev, SSB_IMCFGLO);
                tmp &= ~SSB_IMCFGLO_REQTO;
                tmp &= ~SSB_IMCFGLO_SERTO;
                tmp |= 0x3;
-               ssb_write32(dev->sdev, SSB_IMCFGLO, tmp);
+               ssb_write32(dev->dev->sdev, SSB_IMCFGLO, tmp);
                ssb_commit_settings(bus);
        }
  }
@@@ -4310,29 -4329,26 +4329,26 @@@ static void b43_wireless_core_exit(stru
                dev->wl->current_beacon = NULL;
        }
  
-       ssb_device_disable(dev->sdev, 0);
-       ssb_bus_may_powerdown(dev->sdev->bus);
+       b43_device_disable(dev, 0);
+       b43_bus_may_powerdown(dev);
  }
  
  /* Initialize a wireless core */
  static int b43_wireless_core_init(struct b43_wldev *dev)
  {
        struct ssb_bus *bus = dev->sdev->bus;
-       struct ssb_sprom *sprom = &bus->sprom;
+       struct ssb_sprom *sprom = dev->dev->bus_sprom;
        struct b43_phy *phy = &dev->phy;
        int err;
        u64 hf;
-       u32 tmp;
  
        B43_WARN_ON(b43_status(dev) != B43_STAT_UNINIT);
  
-       err = ssb_bus_powerup(bus, 0);
+       err = b43_bus_powerup(dev, 0);
        if (err)
                goto out;
-       if (!ssb_device_is_enabled(dev->sdev)) {
-               tmp = phy->gmode ? B43_TMSLOW_GMODE : 0;
-               b43_wireless_core_reset(dev, tmp);
-       }
+       if (!b43_device_is_enabled(dev))
+               b43_wireless_core_reset(dev, phy->gmode);
  
        /* Reset all data structures. */
        setup_struct_wldev_for_init(dev);
        if (err)
                goto err_busdown;
        b43_shm_write16(dev, B43_SHM_SHARED,
-                       B43_SHM_SH_WLCOREREV, dev->sdev->id.revision);
+                       B43_SHM_SH_WLCOREREV, dev->dev->core_rev);
        hf = b43_hf_read(dev);
        if (phy->type == B43_PHYTYPE_G) {
                hf |= B43_HF_SYMW;
        /* Maximum Contention Window */
        b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_MAXCONT, 0x3FF);
  
-       if ((dev->sdev->bus->bustype == SSB_BUSTYPE_PCMCIA) ||
-           (dev->sdev->bus->bustype == SSB_BUSTYPE_SDIO) ||
+       if (b43_bus_host_is_pcmcia(dev->dev) ||
+           b43_bus_host_is_sdio(dev->dev) ||
            dev->use_pio) {
                dev->__using_pio_transfers = 1;
                err = b43_pio_init(dev);
        b43_set_synth_pu_delay(dev, 1);
        b43_bluetooth_coext_enable(dev);
  
-       ssb_bus_powerup(bus, !(sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW));
+       b43_bus_powerup(dev, !(sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW));
        b43_upload_card_macaddress(dev);
        b43_security_init(dev);
  
@@@ -4431,7 -4447,7 +4447,7 @@@ out
  err_chip_exit:
        b43_chip_exit(dev);
  err_busdown:
-       ssb_bus_may_powerdown(bus);
+       b43_bus_may_powerdown(dev);
        B43_WARN_ON(b43_status(dev) != B43_STAT_UNINIT);
        return err;
  }
@@@ -4741,7 -4757,6 +4757,6 @@@ static int b43_wireless_core_attach(str
        struct pci_dev *pdev = (bus->bustype == SSB_BUSTYPE_PCI) ? bus->host_pci : NULL;
        int err;
        bool have_2ghz_phy = 0, have_5ghz_phy = 0;
-       u32 tmp;
  
        /* Do NOT do any device initialization here.
         * Do it in wireless_core_init() instead.
         * that in core_init(), too.
         */
  
-       err = ssb_bus_powerup(bus, 0);
+       err = b43_bus_powerup(dev, 0);
        if (err) {
                b43err(wl, "Bus powerup failed\n");
                goto out;
        }
        /* Get the PHY type. */
-       if (dev->sdev->id.revision >= 5) {
+       if (dev->dev->core_rev >= 5) {
                u32 tmshigh;
  
                tmshigh = ssb_read32(dev->sdev, SSB_TMSHIGH);
  
        dev->phy.gmode = have_2ghz_phy;
        dev->phy.radio_on = 1;
-       tmp = dev->phy.gmode ? B43_TMSLOW_GMODE : 0;
-       b43_wireless_core_reset(dev, tmp);
+       b43_wireless_core_reset(dev, dev->phy.gmode);
  
        err = b43_phy_versioning(dev);
        if (err)
                goto err_powerdown;
  
        dev->phy.gmode = have_2ghz_phy;
-       tmp = dev->phy.gmode ? B43_TMSLOW_GMODE : 0;
-       b43_wireless_core_reset(dev, tmp);
+       b43_wireless_core_reset(dev, dev->phy.gmode);
  
        err = b43_validate_chipaccess(dev);
        if (err)
        INIT_WORK(&dev->restart_work, b43_chip_reset);
  
        dev->phy.ops->switch_analog(dev, 0);
-       ssb_device_disable(dev->sdev, 0);
-       ssb_bus_may_powerdown(bus);
+       b43_device_disable(dev, 0);
+       b43_bus_may_powerdown(dev);
  
  out:
        return err;
  err_phy_free:
        b43_phy_free(dev);
  err_powerdown:
-       ssb_bus_may_powerdown(bus);
+       b43_bus_may_powerdown(dev);
        return err;
  }
  
- static void b43_one_core_detach(struct ssb_device *dev)
+ static void b43_one_core_detach(struct b43_bus_dev *dev)
  {
        struct b43_wldev *wldev;
        struct b43_wl *wl;
        /* Do not cancel ieee80211-workqueue based work here.
         * See comment in b43_remove(). */
  
-       wldev = ssb_get_drvdata(dev);
+       wldev = ssb_get_drvdata(dev->sdev);
        wl = wldev->wl;
        b43_debugfs_remove_device(wldev);
        b43_wireless_core_detach(wldev);
        list_del(&wldev->list);
        wl->nr_devs--;
-       ssb_set_drvdata(dev, NULL);
+       ssb_set_drvdata(dev->sdev, NULL);
        kfree(wldev);
  }
  
- static int b43_one_core_attach(struct ssb_device *dev, struct b43_wl *wl)
+ static int b43_one_core_attach(struct b43_bus_dev *dev, struct b43_wl *wl)
  {
        struct b43_wldev *wldev;
        int err = -ENOMEM;
                goto out;
  
        wldev->use_pio = b43_modparam_pio;
-       wldev->sdev = dev;
+       wldev->dev = dev;
+       wldev->sdev = dev->sdev; /* TODO: Remove when not needed */
        wldev->wl = wl;
        b43_set_status(wldev, B43_STAT_UNINIT);
        wldev->bad_frames_preempt = modparam_bad_frames_preempt;
  
        list_add(&wldev->list, &wl->devlist);
        wl->nr_devs++;
-       ssb_set_drvdata(dev, wldev);
+       ssb_set_drvdata(dev->sdev, wldev);
        b43_debugfs_add_device(wldev);
  
        out:
@@@ -4926,11 -4940,11 +4940,11 @@@ static void b43_sprom_fixup(struct ssb_
        }
  }
  
- static void b43_wireless_exit(struct ssb_device *dev, struct b43_wl *wl)
+ static void b43_wireless_exit(struct b43_bus_dev *dev, struct b43_wl *wl)
  {
        struct ieee80211_hw *hw = wl->hw;
  
-       ssb_set_devtypedata(dev, NULL);
+       ssb_set_devtypedata(dev->sdev, NULL);
        ieee80211_free_hw(hw);
  }
  
@@@ -4982,24 -4996,48 +4996,48 @@@ static struct b43_wl *b43_wireless_init
        return wl;
  }
  
- static int b43_ssb_probe(struct ssb_device *dev, const struct ssb_device_id *id)
+ #ifdef CONFIG_B43_BCMA
+ static int b43_bcma_probe(struct bcma_device *core)
+ {
+       b43err(NULL, "BCMA is not supported yet!");
+       return -EOPNOTSUPP;
+ }
+ static void b43_bcma_remove(struct bcma_device *core)
+ {
+       /* TODO */
+ }
+ static struct bcma_driver b43_bcma_driver = {
+       .name           = KBUILD_MODNAME,
+       .id_table       = b43_bcma_tbl,
+       .probe          = b43_bcma_probe,
+       .remove         = b43_bcma_remove,
+ };
+ #endif
+ static
+ int b43_ssb_probe(struct ssb_device *sdev, const struct ssb_device_id *id)
  {
+       struct b43_bus_dev *dev;
        struct b43_wl *wl;
        int err;
        int first = 0;
  
-       wl = ssb_get_devtypedata(dev);
+       dev = b43_bus_dev_ssb_init(sdev);
+       wl = ssb_get_devtypedata(sdev);
        if (!wl) {
                /* Probing the first core. Must setup common struct b43_wl */
                first = 1;
-               b43_sprom_fixup(dev->bus);
-               wl = b43_wireless_init(dev);
+               b43_sprom_fixup(sdev->bus);
+               wl = b43_wireless_init(sdev);
                if (IS_ERR(wl)) {
                        err = PTR_ERR(wl);
                        goto out;
                }
-               ssb_set_devtypedata(dev, wl);
-               B43_WARN_ON(ssb_get_devtypedata(dev) != wl);
+               ssb_set_devtypedata(sdev, wl);
+               B43_WARN_ON(ssb_get_devtypedata(sdev) != wl);
        }
        err = b43_one_core_attach(dev, wl);
        if (err)
        return err;
  }
  
- static void b43_ssb_remove(struct ssb_device *dev)
+ static void b43_ssb_remove(struct ssb_device *sdev)
  {
-       struct b43_wl *wl = ssb_get_devtypedata(dev);
-       struct b43_wldev *wldev = ssb_get_drvdata(dev);
+       struct b43_wl *wl = ssb_get_devtypedata(sdev);
+       struct b43_wldev *wldev = ssb_get_drvdata(sdev);
  
        /* We must cancel any work here before unregistering from ieee80211,
         * as the ieee80211 unreg will destroy the workqueue. */
                ieee80211_unregister_hw(wl->hw);
        }
  
-       b43_one_core_detach(dev);
+       b43_one_core_detach(wldev->dev);
  
        if (list_empty(&wl->devlist)) {
                b43_leds_unregister(wl);
                /* Last core on the chip unregistered.
                 * We can destroy common struct b43_wl.
                 */
-               b43_wireless_exit(dev, wl);
+               b43_wireless_exit(wldev->dev, wl);
        }
  }
  
@@@ -5108,14 -5146,23 +5146,23 @@@ static int __init b43_init(void
        err = b43_sdio_init();
        if (err)
                goto err_pcmcia_exit;
-       err = ssb_driver_register(&b43_ssb_driver);
+ #ifdef CONFIG_B43_BCMA
+       err = bcma_driver_register(&b43_bcma_driver);
        if (err)
                goto err_sdio_exit;
+ #endif
+       err = ssb_driver_register(&b43_ssb_driver);
+       if (err)
+               goto err_bcma_driver_exit;
        b43_print_driverinfo();
  
        return err;
  
+ err_bcma_driver_exit:
+ #ifdef CONFIG_B43_BCMA
+       bcma_driver_unregister(&b43_bcma_driver);
  err_sdio_exit:
+ #endif
        b43_sdio_exit();
  err_pcmcia_exit:
        b43_pcmcia_exit();
@@@ -5127,6 -5174,9 +5174,9 @@@ err_dfs_exit
  static void __exit b43_exit(void)
  {
        ssb_driver_unregister(&b43_ssb_driver);
+ #ifdef CONFIG_B43_BCMA
+       bcma_driver_unregister(&b43_bcma_driver);
+ #endif
        b43_sdio_exit();
        b43_pcmcia_exit();
        b43_debugfs_exit();
@@@ -1564,10 -1564,10 +1564,10 @@@ static int b43legacy_request_firmware(s
        struct b43legacy_firmware *fw = &dev->fw;
        const u8 rev = dev->dev->id.revision;
        const char *filename;
-       u32 tmshigh;
        int err;
  
-       tmshigh = ssb_read32(dev->dev, SSB_TMSHIGH);
+       /* do dummy read */
+       ssb_read32(dev->dev, SSB_TMSHIGH);
        if (!fw->ucode) {
                if (rev == 2)
                        filename = "ucode2";
@@@ -2634,11 -2634,9 +2634,9 @@@ static int b43legacy_op_dev_config(stru
        unsigned long flags;
        unsigned int new_phymode = 0xFFFF;
        int antenna_tx;
-       int antenna_rx;
        int err = 0;
  
        antenna_tx = B43legacy_ANTENNA_DEFAULT;
-       antenna_rx = B43legacy_ANTENNA_DEFAULT;
  
        mutex_lock(&wl->mutex);
        dev = wl->current_dev;
@@@ -2775,14 -2773,12 +2773,12 @@@ static void b43legacy_op_bss_info_chang
  {
        struct b43legacy_wl *wl = hw_to_b43legacy_wl(hw);
        struct b43legacy_wldev *dev;
-       struct b43legacy_phy *phy;
        unsigned long flags;
  
        mutex_lock(&wl->mutex);
        B43legacy_WARN_ON(wl->vif != vif);
  
        dev = wl->current_dev;
-       phy = &dev->phy;
  
        /* Disable IRQs while reconfiguring the device.
         * This makes it possible to drop the spinlock throughout
@@@ -2974,7 -2970,7 +2970,7 @@@ static int b43legacy_phy_versioning(str
                break;
        default:
                unsupported = 1;
 -      };
 +      }
        if (unsupported) {
                b43legacyerr(dev->wl, "FOUND UNSUPPORTED PHY "
                       "(Analog %u, Type %u, Revision %u)\n",
@@@ -31,7 -31,6 +31,7 @@@
  #ifndef __iwl_dev_h__
  #define __iwl_dev_h__
  
 +#include <linux/interrupt.h>
  #include <linux/pci.h> /* for struct pci_device_id */
  #include <linux/kernel.h>
  #include <linux/wait.h>
@@@ -982,17 -981,6 +982,6 @@@ struct traffic_stats 
  #endif
  };
  
- /*
-  * iwl_switch_rxon: "channel switch" structure
-  *
-  * @ switch_in_progress: channel switch in progress
-  * @ channel: new channel
-  */
- struct iwl_switch_rxon {
-       bool switch_in_progress;
-       __le16 channel;
- };
  /*
   * schedule the timer to wake up every UCODE_TRACE_PERIOD milliseconds
   * to perform continuous uCode event logging operation if enabled
@@@ -1288,7 -1276,7 +1277,7 @@@ struct iwl_priv 
  
        struct iwl_rxon_context contexts[NUM_IWL_RXON_CTX];
  
-       struct iwl_switch_rxon switch_rxon;
+       __le16 switch_channel;
  
        struct {
                u32 error_event_table;
@@@ -401,7 -401,8 +401,8 @@@ int rt2800_load_firmware(struct rt2x00_
                return -EBUSY;
  
        if (rt2x00_is_pci(rt2x00dev)) {
-               if (rt2x00_rt(rt2x00dev, RT5390)) {
+               if (rt2x00_rt(rt2x00dev, RT3572) ||
+                   rt2x00_rt(rt2x00dev, RT5390)) {
                        rt2800_register_read(rt2x00dev, AUX_CTRL, &reg);
                        rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
                        rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
@@@ -600,49 -601,6 +601,6 @@@ void rt2800_process_rxwi(struct queue_e
  }
  EXPORT_SYMBOL_GPL(rt2800_process_rxwi);
  
- static bool rt2800_txdone_entry_check(struct queue_entry *entry, u32 reg)
- {
-       __le32 *txwi;
-       u32 word;
-       int wcid, ack, pid;
-       int tx_wcid, tx_ack, tx_pid;
-       wcid    = rt2x00_get_field32(reg, TX_STA_FIFO_WCID);
-       ack     = rt2x00_get_field32(reg, TX_STA_FIFO_TX_ACK_REQUIRED);
-       pid     = rt2x00_get_field32(reg, TX_STA_FIFO_PID_TYPE);
-       /*
-        * This frames has returned with an IO error,
-        * so the status report is not intended for this
-        * frame.
-        */
-       if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags)) {
-               rt2x00lib_txdone_noinfo(entry, TXDONE_FAILURE);
-               return false;
-       }
-       /*
-        * Validate if this TX status report is intended for
-        * this entry by comparing the WCID/ACK/PID fields.
-        */
-       txwi = rt2800_drv_get_txwi(entry);
-       rt2x00_desc_read(txwi, 1, &word);
-       tx_wcid = rt2x00_get_field32(word, TXWI_W1_WIRELESS_CLI_ID);
-       tx_ack  = rt2x00_get_field32(word, TXWI_W1_ACK);
-       tx_pid  = rt2x00_get_field32(word, TXWI_W1_PACKETID);
-       if ((wcid != tx_wcid) || (ack != tx_ack) || (pid != tx_pid)) {
-               WARNING(entry->queue->rt2x00dev,
-                       "TX status report missed for queue %d entry %d\n",
-               entry->queue->qid, entry->entry_idx);
-               rt2x00lib_txdone_noinfo(entry, TXDONE_UNKNOWN);
-               return false;
-       }
-       return true;
- }
  void rt2800_txdone_entry(struct queue_entry *entry, u32 status)
  {
        struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
  }
  EXPORT_SYMBOL_GPL(rt2800_txdone_entry);
  
- void rt2800_txdone(struct rt2x00_dev *rt2x00dev)
- {
-       struct data_queue *queue;
-       struct queue_entry *entry;
-       u32 reg;
-       u8 qid;
-       while (kfifo_get(&rt2x00dev->txstatus_fifo, &reg)) {
-               /* TX_STA_FIFO_PID_QUEUE is a 2-bit field, thus
-                * qid is guaranteed to be one of the TX QIDs
-                */
-               qid = rt2x00_get_field32(reg, TX_STA_FIFO_PID_QUEUE);
-               queue = rt2x00queue_get_tx_queue(rt2x00dev, qid);
-               if (unlikely(!queue)) {
-                       WARNING(rt2x00dev, "Got TX status for an unavailable "
-                                          "queue %u, dropping\n", qid);
-                       continue;
-               }
-               /*
-                * Inside each queue, we process each entry in a chronological
-                * order. We first check that the queue is not empty.
-                */
-               entry = NULL;
-               while (!rt2x00queue_empty(queue)) {
-                       entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
-                       if (rt2800_txdone_entry_check(entry, reg))
-                               break;
-               }
-               if (!entry || rt2x00queue_empty(queue))
-                       break;
-               rt2800_txdone_entry(entry, reg);
-       }
- }
- EXPORT_SYMBOL_GPL(rt2800_txdone);
  void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc)
  {
        struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
@@@ -1355,7 -1274,7 +1274,7 @@@ static void rt2800_config_ht_opmode(str
                        gf20_rate = gf40_rate = 0x0003;
                }
                break;
 -      };
 +      }
  
        /* check for STAs not supporting greenfield mode */
        if (any_sta_nongf)
@@@ -1433,6 -1352,40 +1352,40 @@@ void rt2800_config_erp(struct rt2x00_de
  }
  EXPORT_SYMBOL_GPL(rt2800_config_erp);
  
+ static void rt2800_config_3572bt_ant(struct rt2x00_dev *rt2x00dev)
+ {
+       u32 reg;
+       u16 eeprom;
+       u8 led_ctrl, led_g_mode, led_r_mode;
+       rt2800_register_read(rt2x00dev, GPIO_SWITCH, &reg);
+       if (rt2x00dev->curr_band == IEEE80211_BAND_5GHZ) {
+               rt2x00_set_field32(&reg, GPIO_SWITCH_0, 1);
+               rt2x00_set_field32(&reg, GPIO_SWITCH_1, 1);
+       } else {
+               rt2x00_set_field32(&reg, GPIO_SWITCH_0, 0);
+               rt2x00_set_field32(&reg, GPIO_SWITCH_1, 0);
+       }
+       rt2800_register_write(rt2x00dev, GPIO_SWITCH, reg);
+       rt2800_register_read(rt2x00dev, LED_CFG, &reg);
+       led_g_mode = rt2x00_get_field32(reg, LED_CFG_LED_POLAR) ? 3 : 0;
+       led_r_mode = rt2x00_get_field32(reg, LED_CFG_LED_POLAR) ? 0 : 3;
+       if (led_g_mode != rt2x00_get_field32(reg, LED_CFG_G_LED_MODE) ||
+           led_r_mode != rt2x00_get_field32(reg, LED_CFG_R_LED_MODE)) {
+               rt2x00_eeprom_read(rt2x00dev, EEPROM_FREQ, &eeprom);
+               led_ctrl = rt2x00_get_field16(eeprom, EEPROM_FREQ_LED_MODE);
+               if (led_ctrl == 0 || led_ctrl > 0x40) {
+                       rt2x00_set_field32(&reg, LED_CFG_G_LED_MODE, led_g_mode);
+                       rt2x00_set_field32(&reg, LED_CFG_R_LED_MODE, led_r_mode);
+                       rt2800_register_write(rt2x00dev, LED_CFG, reg);
+               } else {
+                       rt2800_mcu_request(rt2x00dev, MCU_BAND_SELECT, 0xff,
+                                          (led_g_mode << 2) | led_r_mode, 1);
+               }
+       }
+ }
  static void rt2800_set_ant_diversity(struct rt2x00_dev *rt2x00dev,
                                     enum antenna ant)
  {
@@@ -1463,6 -1416,10 +1416,10 @@@ void rt2800_config_ant(struct rt2x00_de
        rt2800_bbp_read(rt2x00dev, 1, &r1);
        rt2800_bbp_read(rt2x00dev, 3, &r3);
  
+       if (rt2x00_rt(rt2x00dev, RT3572) &&
+           test_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags))
+               rt2800_config_3572bt_ant(rt2x00dev);
        /*
         * Configure the TX antenna.
         */
                rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 0);
                break;
        case 2:
-               rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 2);
+               if (rt2x00_rt(rt2x00dev, RT3572) &&
+                   test_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags))
+                       rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 1);
+               else
+                       rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 2);
                break;
        case 3:
                rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 0);
                rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 0);
                break;
        case 2:
-               rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 1);
+               if (rt2x00_rt(rt2x00dev, RT3572) &&
+                   test_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags)) {
+                       rt2x00_set_field8(&r3, BBP3_RX_ADC, 1);
+                       rt2x00_set_field8(&r3, BBP3_RX_ANTENNA,
+                               rt2x00dev->curr_band == IEEE80211_BAND_5GHZ);
+                       rt2800_set_ant_diversity(rt2x00dev, ANTENNA_B);
+               } else {
+                       rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 1);
+               }
                break;
        case 3:
                rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 2);
@@@ -1630,6 -1599,161 +1599,161 @@@ static void rt2800_config_channel_rf3xx
        rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
  }
  
+ static void rt2800_config_channel_rf3052(struct rt2x00_dev *rt2x00dev,
+                                        struct ieee80211_conf *conf,
+                                        struct rf_channel *rf,
+                                        struct channel_info *info)
+ {
+       u8 rfcsr;
+       u32 reg;
+       if (rf->channel <= 14) {
+               rt2800_bbp_write(rt2x00dev, 25, 0x15);
+               rt2800_bbp_write(rt2x00dev, 26, 0x85);
+       } else {
+               rt2800_bbp_write(rt2x00dev, 25, 0x09);
+               rt2800_bbp_write(rt2x00dev, 26, 0xff);
+       }
+       rt2800_rfcsr_write(rt2x00dev, 2, rf->rf1);
+       rt2800_rfcsr_write(rt2x00dev, 3, rf->rf3);
+       rt2800_rfcsr_read(rt2x00dev, 6, &rfcsr);
+       rt2x00_set_field8(&rfcsr, RFCSR6_R1, rf->rf2);
+       if (rf->channel <= 14)
+               rt2x00_set_field8(&rfcsr, RFCSR6_TXDIV, 2);
+       else
+               rt2x00_set_field8(&rfcsr, RFCSR6_TXDIV, 1);
+       rt2800_rfcsr_write(rt2x00dev, 6, rfcsr);
+       rt2800_rfcsr_read(rt2x00dev, 5, &rfcsr);
+       if (rf->channel <= 14)
+               rt2x00_set_field8(&rfcsr, RFCSR5_R1, 1);
+       else
+               rt2x00_set_field8(&rfcsr, RFCSR5_R1, 2);
+       rt2800_rfcsr_write(rt2x00dev, 5, rfcsr);
+       rt2800_rfcsr_read(rt2x00dev, 12, &rfcsr);
+       if (rf->channel <= 14) {
+               rt2x00_set_field8(&rfcsr, RFCSR12_DR0, 3);
+               rt2x00_set_field8(&rfcsr, RFCSR12_TX_POWER,
+                               (info->default_power1 & 0x3) |
+                               ((info->default_power1 & 0xC) << 1));
+       } else {
+               rt2x00_set_field8(&rfcsr, RFCSR12_DR0, 7);
+               rt2x00_set_field8(&rfcsr, RFCSR12_TX_POWER,
+                               (info->default_power1 & 0x3) |
+                               ((info->default_power1 & 0xC) << 1));
+       }
+       rt2800_rfcsr_write(rt2x00dev, 12, rfcsr);
+       rt2800_rfcsr_read(rt2x00dev, 13, &rfcsr);
+       if (rf->channel <= 14) {
+               rt2x00_set_field8(&rfcsr, RFCSR13_DR0, 3);
+               rt2x00_set_field8(&rfcsr, RFCSR13_TX_POWER,
+                               (info->default_power2 & 0x3) |
+                               ((info->default_power2 & 0xC) << 1));
+       } else {
+               rt2x00_set_field8(&rfcsr, RFCSR13_DR0, 7);
+               rt2x00_set_field8(&rfcsr, RFCSR13_TX_POWER,
+                               (info->default_power2 & 0x3) |
+                               ((info->default_power2 & 0xC) << 1));
+       }
+       rt2800_rfcsr_write(rt2x00dev, 13, rfcsr);
+       rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr);
+       rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1);
+       rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0);
+       rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0);
+       rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0);
+       rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 0);
+       if (test_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags)) {
+               if (rf->channel <= 14) {
+                       rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1);
+                       rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1);
+               }
+               rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1);
+               rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1);
+       } else {
+               switch (rt2x00dev->default_ant.tx_chain_num) {
+               case 1:
+                       rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1);
+               case 2:
+                       rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1);
+                       break;
+               }
+               switch (rt2x00dev->default_ant.rx_chain_num) {
+               case 1:
+                       rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1);
+               case 2:
+                       rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1);
+                       break;
+               }
+       }
+       rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
+       rt2800_rfcsr_read(rt2x00dev, 23, &rfcsr);
+       rt2x00_set_field8(&rfcsr, RFCSR23_FREQ_OFFSET, rt2x00dev->freq_offset);
+       rt2800_rfcsr_write(rt2x00dev, 23, rfcsr);
+       rt2800_rfcsr_write(rt2x00dev, 24,
+                             rt2x00dev->calibration[conf_is_ht40(conf)]);
+       rt2800_rfcsr_write(rt2x00dev, 31,
+                             rt2x00dev->calibration[conf_is_ht40(conf)]);
+       if (rf->channel <= 14) {
+               rt2800_rfcsr_write(rt2x00dev, 7, 0xd8);
+               rt2800_rfcsr_write(rt2x00dev, 9, 0xc3);
+               rt2800_rfcsr_write(rt2x00dev, 10, 0xf1);
+               rt2800_rfcsr_write(rt2x00dev, 11, 0xb9);
+               rt2800_rfcsr_write(rt2x00dev, 15, 0x53);
+               rt2800_rfcsr_write(rt2x00dev, 16, 0x4c);
+               rt2800_rfcsr_write(rt2x00dev, 17, 0x23);
+               rt2800_rfcsr_write(rt2x00dev, 19, 0x93);
+               rt2800_rfcsr_write(rt2x00dev, 20, 0xb3);
+               rt2800_rfcsr_write(rt2x00dev, 25, 0x15);
+               rt2800_rfcsr_write(rt2x00dev, 26, 0x85);
+               rt2800_rfcsr_write(rt2x00dev, 27, 0x00);
+               rt2800_rfcsr_write(rt2x00dev, 29, 0x9b);
+       } else {
+               rt2800_rfcsr_write(rt2x00dev, 7, 0x14);
+               rt2800_rfcsr_write(rt2x00dev, 9, 0xc0);
+               rt2800_rfcsr_write(rt2x00dev, 10, 0xf1);
+               rt2800_rfcsr_write(rt2x00dev, 11, 0x00);
+               rt2800_rfcsr_write(rt2x00dev, 15, 0x43);
+               rt2800_rfcsr_write(rt2x00dev, 16, 0x7a);
+               rt2800_rfcsr_write(rt2x00dev, 17, 0x23);
+               if (rf->channel <= 64) {
+                       rt2800_rfcsr_write(rt2x00dev, 19, 0xb7);
+                       rt2800_rfcsr_write(rt2x00dev, 20, 0xf6);
+                       rt2800_rfcsr_write(rt2x00dev, 25, 0x3d);
+               } else if (rf->channel <= 128) {
+                       rt2800_rfcsr_write(rt2x00dev, 19, 0x74);
+                       rt2800_rfcsr_write(rt2x00dev, 20, 0xf4);
+                       rt2800_rfcsr_write(rt2x00dev, 25, 0x01);
+               } else {
+                       rt2800_rfcsr_write(rt2x00dev, 19, 0x72);
+                       rt2800_rfcsr_write(rt2x00dev, 20, 0xf3);
+                       rt2800_rfcsr_write(rt2x00dev, 25, 0x01);
+               }
+               rt2800_rfcsr_write(rt2x00dev, 26, 0x87);
+               rt2800_rfcsr_write(rt2x00dev, 27, 0x01);
+               rt2800_rfcsr_write(rt2x00dev, 29, 0x9f);
+       }
+       rt2800_register_read(rt2x00dev, GPIO_CTRL_CFG, &reg);
+       rt2x00_set_field32(&reg, GPIO_CTRL_CFG_GPIOD_BIT7, 0);
+       if (rf->channel <= 14)
+               rt2x00_set_field32(&reg, GPIO_CTRL_CFG_BIT7, 1);
+       else
+               rt2x00_set_field32(&reg, GPIO_CTRL_CFG_BIT7, 0);
+       rt2800_register_write(rt2x00dev, GPIO_CTRL_CFG, reg);
+       rt2800_rfcsr_read(rt2x00dev, 7, &rfcsr);
+       rt2x00_set_field8(&rfcsr, RFCSR7_RF_TUNING, 1);
+       rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
+ }
  
  #define RT5390_POWER_BOUND     0x27
  #define RT5390_FREQ_OFFSET_BOUND       0x5f
@@@ -1748,9 -1872,10 +1872,10 @@@ static void rt2800_config_channel(struc
            rt2x00_rf(rt2x00dev, RF3020) ||
            rt2x00_rf(rt2x00dev, RF3021) ||
            rt2x00_rf(rt2x00dev, RF3022) ||
-           rt2x00_rf(rt2x00dev, RF3052) ||
            rt2x00_rf(rt2x00dev, RF3320))
                rt2800_config_channel_rf3xxx(rt2x00dev, conf, rf, info);
+       else if (rt2x00_rf(rt2x00dev, RF3052))
+               rt2800_config_channel_rf3052(rt2x00dev, conf, rf, info);
        else if (rt2x00_rf(rt2x00dev, RF5370) ||
                 rt2x00_rf(rt2x00dev, RF5390))
                rt2800_config_channel_rf53xx(rt2x00dev, conf, rf, info);
                        }
                }
        } else {
-               rt2800_bbp_write(rt2x00dev, 82, 0xf2);
+               if (rt2x00_rt(rt2x00dev, RT3572))
+                       rt2800_bbp_write(rt2x00dev, 82, 0x94);
+               else
+                       rt2800_bbp_write(rt2x00dev, 82, 0xf2);
  
                if (test_bit(CAPABILITY_EXTERNAL_LNA_A, &rt2x00dev->cap_flags))
                        rt2800_bbp_write(rt2x00dev, 75, 0x46);
        rt2x00_set_field32(&reg, TX_BAND_CFG_BG, rf->channel <= 14);
        rt2800_register_write(rt2x00dev, TX_BAND_CFG, reg);
  
+       if (rt2x00_rt(rt2x00dev, RT3572))
+               rt2800_rfcsr_write(rt2x00dev, 8, 0);
        tx_pin = 0;
  
        /* Turn on unused PA or LNA when not using 1T or 1R */
        if (rt2x00dev->default_ant.tx_chain_num == 2) {
-               rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A1_EN, 1);
-               rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G1_EN, 1);
+               rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A1_EN,
+                                  rf->channel > 14);
+               rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G1_EN,
+                                  rf->channel <= 14);
        }
  
        /* Turn on unused PA or LNA when not using 1T or 1R */
        rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G0_EN, 1);
        rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFTR_EN, 1);
        rt2x00_set_field32(&tx_pin, TX_PIN_CFG_TRSW_EN, 1);
-       rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN, rf->channel <= 14);
+       if (test_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags))
+               rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN, 1);
+       else
+               rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN,
+                                  rf->channel <= 14);
        rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A0_EN, rf->channel > 14);
  
        rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
  
+       if (rt2x00_rt(rt2x00dev, RT3572))
+               rt2800_rfcsr_write(rt2x00dev, 8, 0x80);
        rt2800_bbp_read(rt2x00dev, 4, &bbp);
        rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * conf_is_ht40(conf));
        rt2800_bbp_write(rt2x00dev, 4, bbp);
@@@ -2413,6 -2553,9 +2553,9 @@@ static int rt2800_init_registers(struc
                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000);
                rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000030);
+       } else if (rt2x00_rt(rt2x00dev, RT3572)) {
+               rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
+               rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
        } else if (rt2x00_rt(rt2x00dev, RT5390)) {
                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
@@@ -2799,6 -2942,7 +2942,7 @@@ static int rt2800_init_bbp(struct rt2x0
        }
  
        if (rt2800_is_305x_soc(rt2x00dev) ||
+           rt2x00_rt(rt2x00dev, RT3572) ||
            rt2x00_rt(rt2x00dev, RT5390))
                rt2800_bbp_write(rt2x00dev, 31, 0x08);
  
            rt2x00_rt(rt2x00dev, RT3071) ||
            rt2x00_rt(rt2x00dev, RT3090) ||
            rt2x00_rt(rt2x00dev, RT3390) ||
+           rt2x00_rt(rt2x00dev, RT3572) ||
            rt2x00_rt(rt2x00dev, RT5390)) {
                rt2800_bbp_write(rt2x00dev, 79, 0x13);
                rt2800_bbp_write(rt2x00dev, 80, 0x05);
            rt2x00_rt_rev_gte(rt2x00dev, RT3071, REV_RT3071E) ||
            rt2x00_rt_rev_gte(rt2x00dev, RT3090, REV_RT3090E) ||
            rt2x00_rt_rev_gte(rt2x00dev, RT3390, REV_RT3390E) ||
+           rt2x00_rt(rt2x00dev, RT3572) ||
            rt2x00_rt(rt2x00dev, RT5390) ||
            rt2800_is_305x_soc(rt2x00dev))
                rt2800_bbp_write(rt2x00dev, 103, 0xc0);
        if (rt2x00_rt(rt2x00dev, RT3071) ||
            rt2x00_rt(rt2x00dev, RT3090) ||
            rt2x00_rt(rt2x00dev, RT3390) ||
+           rt2x00_rt(rt2x00dev, RT3572) ||
            rt2x00_rt(rt2x00dev, RT5390)) {
                rt2800_bbp_read(rt2x00dev, 138, &value);
  
@@@ -3031,6 -3178,7 +3178,7 @@@ static int rt2800_init_rfcsr(struct rt2
            !rt2x00_rt(rt2x00dev, RT3071) &&
            !rt2x00_rt(rt2x00dev, RT3090) &&
            !rt2x00_rt(rt2x00dev, RT3390) &&
+           !rt2x00_rt(rt2x00dev, RT3572) &&
            !rt2x00_rt(rt2x00dev, RT5390) &&
            !rt2800_is_305x_soc(rt2x00dev))
                return 0;
                rt2800_rfcsr_write(rt2x00dev, 29, 0x8f);
                rt2800_rfcsr_write(rt2x00dev, 30, 0x20);
                rt2800_rfcsr_write(rt2x00dev, 31, 0x0f);
+       } else if (rt2x00_rt(rt2x00dev, RT3572)) {
+               rt2800_rfcsr_write(rt2x00dev, 0, 0x70);
+               rt2800_rfcsr_write(rt2x00dev, 1, 0x81);
+               rt2800_rfcsr_write(rt2x00dev, 2, 0xf1);
+               rt2800_rfcsr_write(rt2x00dev, 3, 0x02);
+               rt2800_rfcsr_write(rt2x00dev, 4, 0x4c);
+               rt2800_rfcsr_write(rt2x00dev, 5, 0x05);
+               rt2800_rfcsr_write(rt2x00dev, 6, 0x4a);
+               rt2800_rfcsr_write(rt2x00dev, 7, 0xd8);
+               rt2800_rfcsr_write(rt2x00dev, 9, 0xc3);
+               rt2800_rfcsr_write(rt2x00dev, 10, 0xf1);
+               rt2800_rfcsr_write(rt2x00dev, 11, 0xb9);
+               rt2800_rfcsr_write(rt2x00dev, 12, 0x70);
+               rt2800_rfcsr_write(rt2x00dev, 13, 0x65);
+               rt2800_rfcsr_write(rt2x00dev, 14, 0xa0);
+               rt2800_rfcsr_write(rt2x00dev, 15, 0x53);
+               rt2800_rfcsr_write(rt2x00dev, 16, 0x4c);
+               rt2800_rfcsr_write(rt2x00dev, 17, 0x23);
+               rt2800_rfcsr_write(rt2x00dev, 18, 0xac);
+               rt2800_rfcsr_write(rt2x00dev, 19, 0x93);
+               rt2800_rfcsr_write(rt2x00dev, 20, 0xb3);
+               rt2800_rfcsr_write(rt2x00dev, 21, 0xd0);
+               rt2800_rfcsr_write(rt2x00dev, 22, 0x00);
+               rt2800_rfcsr_write(rt2x00dev, 23, 0x3c);
+               rt2800_rfcsr_write(rt2x00dev, 24, 0x16);
+               rt2800_rfcsr_write(rt2x00dev, 25, 0x15);
+               rt2800_rfcsr_write(rt2x00dev, 26, 0x85);
+               rt2800_rfcsr_write(rt2x00dev, 27, 0x00);
+               rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
+               rt2800_rfcsr_write(rt2x00dev, 29, 0x9b);
+               rt2800_rfcsr_write(rt2x00dev, 30, 0x09);
+               rt2800_rfcsr_write(rt2x00dev, 31, 0x10);
        } else if (rt2800_is_305x_soc(rt2x00dev)) {
                rt2800_rfcsr_write(rt2x00dev, 0, 0x50);
                rt2800_rfcsr_write(rt2x00dev, 1, 0x01);
                rt2800_register_read(rt2x00dev, GPIO_SWITCH, &reg);
                rt2x00_set_field32(&reg, GPIO_SWITCH_5, 0);
                rt2800_register_write(rt2x00dev, GPIO_SWITCH, reg);
+       } else if (rt2x00_rt(rt2x00dev, RT3572)) {
+               rt2800_rfcsr_read(rt2x00dev, 6, &rfcsr);
+               rt2x00_set_field8(&rfcsr, RFCSR6_R2, 1);
+               rt2800_rfcsr_write(rt2x00dev, 6, rfcsr);
+               rt2800_register_read(rt2x00dev, LDO_CFG0, &reg);
+               rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL, 3);
+               rt2x00_set_field32(&reg, LDO_CFG0_BGSEL, 1);
+               rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
+               msleep(1);
+               rt2800_register_read(rt2x00dev, LDO_CFG0, &reg);
+               rt2x00_set_field32(&reg, LDO_CFG0_BGSEL, 1);
+               rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
        }
  
        /*
                        rt2800_init_rx_filter(rt2x00dev, true, 0x27, 0x19);
        } else if (rt2x00_rt(rt2x00dev, RT3071) ||
                   rt2x00_rt(rt2x00dev, RT3090) ||
-                  rt2x00_rt(rt2x00dev, RT3390)) {
+                  rt2x00_rt(rt2x00dev, RT3390) ||
+                  rt2x00_rt(rt2x00dev, RT3572)) {
                rt2x00dev->calibration[0] =
                        rt2800_init_rx_filter(rt2x00dev, false, 0x07, 0x13);
                rt2x00dev->calibration[1] =
@@@ -219,7 -219,7 +219,7 @@@ static void rt2800pci_start_queue(struc
                break;
        default:
                break;
 -      };
 +      }
  }
  
  static void rt2800pci_kick_queue(struct data_queue *queue)
@@@ -501,7 -501,9 +501,9 @@@ static int rt2800pci_init_registers(str
        rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e1f);
        rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e00);
  
-       if (rt2x00_rt(rt2x00dev, RT5390)) {
+       if (rt2x00_is_pcie(rt2x00dev) &&
+           (rt2x00_rt(rt2x00dev, RT3572) ||
+            rt2x00_rt(rt2x00dev, RT5390))) {
                rt2x00pci_register_read(rt2x00dev, AUX_CTRL, &reg);
                rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
                rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
diff --combined lib/Kconfig
@@@ -19,6 -19,16 +19,6 @@@ config RATIONA
  config GENERIC_FIND_FIRST_BIT
        bool
  
 -config GENERIC_FIND_NEXT_BIT
 -      bool
 -
 -config GENERIC_FIND_BIT_LE
 -      bool
 -
 -config GENERIC_FIND_LAST_BIT
 -      bool
 -      default y
 -
  config CRC_CCITT
        tristate "CRC-CCITT functions"
        help
@@@ -79,6 -89,13 +79,13 @@@ config LIBCRC32
          require M here.  See Castagnoli93.
          Module will be libcrc32c.
  
+ config CRC8
+       tristate "CRC8 function"
+       help
+         This option provides CRC8 function. Drivers may select this
+         when they need to do cyclic redundancy check according CRC8
+         algorithm. Module will be called crc8.
  config AUDIT_GENERIC
        bool
        depends on AUDIT && !AUDIT_ARCH
@@@ -262,4 -279,11 +269,11 @@@ config AVERAG
  
          If unsure, say N.
  
+ config CORDIC
+       tristate "Cordic function"
+       help
+         The option provides arithmetic function using cordic algorithm
+         so its calculations are in fixed point. Modules can select this
+         when they require this function. Module will be called cordic.
  endmenu
diff --combined lib/Makefile
@@@ -12,7 -12,7 +12,7 @@@ lib-y := ctype.o string.o vsprintf.o cm
         idr.o int_sqrt.o extable.o prio_tree.o \
         sha1.o irq_regs.o reciprocal_div.o argv_split.o \
         proportions.o prio_heap.o ratelimit.o show_mem.o \
 -       is_single_threaded.o plist.o decompress.o
 +       is_single_threaded.o plist.o decompress.o find_next_bit.o
  
  lib-$(CONFIG_MMU) += ioremap.o
  lib-$(CONFIG_SMP) += cpumask.o
@@@ -22,7 -22,7 +22,7 @@@ lib-y += kobject.o kref.o klist.
  obj-y += bcd.o div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \
         bust_spinlocks.o hexdump.o kasprintf.o bitmap.o scatterlist.o \
         string_helpers.o gcd.o lcm.o list_sort.o uuid.o flex_array.o \
 -       bsearch.o
 +       bsearch.o find_last_bit.o
  obj-y += kstrtox.o
  obj-$(CONFIG_TEST_KSTRTOX) += test-kstrtox.o
  
@@@ -39,6 -39,10 +39,6 @@@ obj-$(CONFIG_DEBUG_LOCKING_API_SELFTEST
  obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock_debug.o
  lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o
  lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
 -lib-$(CONFIG_GENERIC_FIND_FIRST_BIT) += find_next_bit.o
 -lib-$(CONFIG_GENERIC_FIND_NEXT_BIT) += find_next_bit.o
 -lib-$(CONFIG_GENERIC_FIND_BIT_LE) += find_next_bit.o
 -obj-$(CONFIG_GENERIC_FIND_LAST_BIT) += find_last_bit.o
  
  CFLAGS_hweight.o = $(subst $(quote),,$(CONFIG_ARCH_HWEIGHT_CFLAGS))
  obj-$(CONFIG_GENERIC_HWEIGHT) += hweight.o
@@@ -61,6 -65,7 +61,7 @@@ obj-$(CONFIG_CRC_ITU_T)       += crc-itu-t.
  obj-$(CONFIG_CRC32)   += crc32.o
  obj-$(CONFIG_CRC7)    += crc7.o
  obj-$(CONFIG_LIBCRC32C)       += libcrc32c.o
+ obj-$(CONFIG_CRC8)    += crc8.o
  obj-$(CONFIG_GENERIC_ALLOCATOR) += genalloc.o
  
  obj-$(CONFIG_ZLIB_INFLATE) += zlib_inflate/
@@@ -112,6 -117,8 +113,8 @@@ obj-$(CONFIG_AVERAGE) += average.
  
  obj-$(CONFIG_CPU_RMAP) += cpu_rmap.o
  
+ obj-$(CONFIG_CORDIC) += cordic.o
  hostprogs-y   := gen_crc32table
  clean-files   := crc32table.h