Ticket #7701: 975-ssb_update.patch

File 975-ssb_update.patch, 44.0 KB (added by acoul, 6 years ago)
  • drivers/ssb/driver_chipcommon.c

    a b u32 ssb_chipco_gpio_control(struct ssb_c 
    373373{ 
    374374        return chipco_write32_masked(cc, SSB_CHIPCO_GPIOCTL, mask, value); 
    375375} 
     376EXPORT_SYMBOL(ssb_chipco_gpio_control); 
    376377 
    377378u32 ssb_chipco_gpio_intmask(struct ssb_chipcommon *cc, u32 mask, u32 value) 
    378379{ 
  • drivers/ssb/driver_chipcommon_pmu.c

    a b static void ssb_pmu_pll_init(struct ssb_ 
    332332        case 0x5354: 
    333333                ssb_pmu0_pllinit_r0(cc, crystalfreq); 
    334334                break; 
     335        case 0x4322: 
     336                if (cc->pmu.rev == 2) { 
     337                        chipco_write32(cc, SSB_CHIPCO_PLLCTL_ADDR, 0x0000000A); 
     338                        chipco_write32(cc, SSB_CHIPCO_PLLCTL_DATA, 0x380005C0); 
     339                } 
     340                break; 
    335341        default: 
    336342                ssb_printk(KERN_ERR PFX 
    337343                           "ERROR: PLL init unknown for device %04X\n", 
    static void ssb_pmu_resources_init(struc 
    417423 
    418424        switch (bus->chip_id) { 
    419425        case 0x4312: 
     426        case 0x4322: 
    420427                /* We keep the default settings: 
    421428                 * min_msk = 0xCBB 
    422429                 * max_msk = 0x7FFFF 
  • drivers/ssb/driver_gige.c

    a b  
    1212#include <linux/ssb/ssb_driver_gige.h> 
    1313#include <linux/pci.h> 
    1414#include <linux/pci_regs.h> 
     15#include <linux/slab.h> 
    1516 
    1617 
    1718/* 
  • drivers/ssb/driver_mipscore.c

    a b void ssb_mipscore_init(struct ssb_mipsco 
    270270                                set_irq(dev, irq++); 
    271271                        } 
    272272                        break; 
    273                         /* fallthrough */ 
    274273                case SSB_DEV_PCI: 
    275274                case SSB_DEV_ETHERNET: 
    276275                case SSB_DEV_ETHERNET_GBIT: 
    void ssb_mipscore_init(struct ssb_mipsco 
    281280                                set_irq(dev, irq++); 
    282281                                break; 
    283282                        } 
     283                        /* fallthrough */ 
     284                case SSB_DEV_EXTIF: 
     285                        set_irq(dev, 0); 
     286                        break; 
    284287                } 
    285288        } 
    286289        ssb_dprintk(KERN_INFO PFX "after irq reconfiguration\n"); 
  • drivers/ssb/driver_pcicore.c

    a b static struct pci_controller ssb_pcicore 
    246246        .pci_ops        = &ssb_pcicore_pciops, 
    247247        .io_resource    = &ssb_pcicore_io_resource, 
    248248        .mem_resource   = &ssb_pcicore_mem_resource, 
    249         .mem_offset     = 0x24000000, 
    250249}; 
    251250 
    252 static u32 ssb_pcicore_pcibus_iobase = 0x100; 
    253 static u32 ssb_pcicore_pcibus_membase = SSB_PCI_DMA; 
    254  
    255251/* This function is called when doing a pci_enable_device(). 
    256252 * We must first check if the device is a device on the PCI-core bridge. */ 
    257253int ssb_pcicore_plat_dev_init(struct pci_dev *d) 
    258254{ 
    259         struct resource *res; 
    260         int pos, size; 
    261         u32 *base; 
    262  
    263255        if (d->bus->ops != &ssb_pcicore_pciops) { 
    264256                /* This is not a device on the PCI-core bridge. */ 
    265257                return -ENODEV; 
    int ssb_pcicore_plat_dev_init(struct pci 
    268260        ssb_printk(KERN_INFO "PCI: Fixing up device %s\n", 
    269261                   pci_name(d)); 
    270262 
    271         /* Fix up resource bases */ 
    272         for (pos = 0; pos < 6; pos++) { 
    273                 res = &d->resource[pos]; 
    274                 if (res->flags & IORESOURCE_IO) 
    275                         base = &ssb_pcicore_pcibus_iobase; 
    276                 else 
    277                         base = &ssb_pcicore_pcibus_membase; 
    278                 res->flags |= IORESOURCE_PCI_FIXED; 
    279                 if (res->end) { 
    280                         size = res->end - res->start + 1; 
    281                         if (*base & (size - 1)) 
    282                                 *base = (*base + size) & ~(size - 1); 
    283                         res->start = *base; 
    284                         res->end = res->start + size - 1; 
    285                         *base += size; 
    286                         pci_write_config_dword(d, PCI_BASE_ADDRESS_0 + (pos << 2), res->start); 
    287                 } 
    288                 /* Fix up PCI bridge BAR0 only */ 
    289                 if (d->bus->number == 0 && PCI_SLOT(d->devfn) == 0) 
    290                         break; 
    291         } 
    292263        /* Fix up interrupt lines */ 
    293264        d->irq = ssb_mips_irq(extpci_core->dev) + 2; 
    294265        pci_write_config_byte(d, PCI_INTERRUPT_LINE, d->irq); 
    int ssb_pcicore_dev_irqvecs_enable(struc 
    551522        might_sleep_if(pdev->id.coreid != SSB_DEV_PCI); 
    552523 
    553524        /* Enable interrupts for this device. */ 
    554         if (bus->host_pci && 
    555             ((pdev->id.revision >= 6) || (pdev->id.coreid == SSB_DEV_PCIE))) { 
     525        if ((pdev->id.revision >= 6) || (pdev->id.coreid == SSB_DEV_PCIE)) { 
    556526                u32 coremask; 
    557527 
    558528                /* Calculate the "coremask" for the device. */ 
    559529                coremask = (1 << dev->core_index); 
    560530 
     531                SSB_WARN_ON(bus->bustype != SSB_BUSTYPE_PCI); 
    561532                err = pci_read_config_dword(bus->host_pci, SSB_PCI_IRQMASK, &tmp); 
    562533                if (err) 
    563534                        goto out; 
  • drivers/ssb/main.c

    a b  
    1818#include <linux/dma-mapping.h> 
    1919#include <linux/pci.h> 
    2020#include <linux/mmc/sdio_func.h> 
     21#include <linux/slab.h> 
    2122 
    2223#include <pcmcia/cs_types.h> 
    2324#include <pcmcia/cs.h> 
    static void ssb_device_put(struct ssb_de 
    140141                put_device(dev->dev); 
    141142} 
    142143 
     144static inline struct ssb_driver *ssb_driver_get(struct ssb_driver *drv) 
     145{ 
     146        if (drv) 
     147                get_driver(&drv->drv); 
     148        return drv; 
     149} 
     150 
     151static inline void ssb_driver_put(struct ssb_driver *drv) 
     152{ 
     153        if (drv) 
     154                put_driver(&drv->drv); 
     155} 
     156 
    143157static int ssb_device_resume(struct device *dev) 
    144158{ 
    145159        struct ssb_device *ssb_dev = dev_to_ssb_dev(dev); 
    int ssb_bus_suspend(struct ssb_bus *bus) 
    210224EXPORT_SYMBOL(ssb_bus_suspend); 
    211225 
    212226#ifdef CONFIG_SSB_SPROM 
    213 int ssb_devices_freeze(struct ssb_bus *bus) 
     227/** ssb_devices_freeze - Freeze all devices on the bus. 
     228 * 
     229 * After freezing no device driver will be handling a device 
     230 * on this bus anymore. ssb_devices_thaw() must be called after 
     231 * a successful freeze to reactivate the devices. 
     232 * 
     233 * @bus: The bus. 
     234 * @ctx: Context structure. Pass this to ssb_devices_thaw(). 
     235 */ 
     236int ssb_devices_freeze(struct ssb_bus *bus, struct ssb_freeze_context *ctx) 
    214237{ 
    215         struct ssb_device *dev; 
    216         struct ssb_driver *drv; 
    217         int err = 0; 
    218         int i; 
    219         pm_message_t state = PMSG_FREEZE; 
     238        struct ssb_device *sdev; 
     239        struct ssb_driver *sdrv; 
     240        unsigned int i; 
     241 
     242        memset(ctx, 0, sizeof(*ctx)); 
     243        ctx->bus = bus; 
     244        SSB_WARN_ON(bus->nr_devices > ARRAY_SIZE(ctx->device_frozen)); 
    220245 
    221         /* First check that we are capable to freeze all devices. */ 
    222246        for (i = 0; i < bus->nr_devices; i++) { 
    223                 dev = &(bus->devices[i]); 
    224                 if (!dev->dev || 
    225                     !dev->dev->driver || 
    226                     !device_is_registered(dev->dev)) 
    227                         continue; 
    228                 drv = drv_to_ssb_drv(dev->dev->driver); 
    229                 if (!drv) 
     247                sdev = ssb_device_get(&bus->devices[i]); 
     248 
     249                if (!sdev->dev || !sdev->dev->driver || 
     250                    !device_is_registered(sdev->dev)) { 
     251                        ssb_device_put(sdev); 
    230252                        continue; 
    231                 if (!drv->suspend) { 
    232                         /* Nope, can't suspend this one. */ 
    233                         return -EOPNOTSUPP; 
    234253                } 
    235         } 
    236         /* Now suspend all devices */ 
    237         for (i = 0; i < bus->nr_devices; i++) { 
    238                 dev = &(bus->devices[i]); 
    239                 if (!dev->dev || 
    240                     !dev->dev->driver || 
    241                     !device_is_registered(dev->dev)) 
     254                sdrv = ssb_driver_get(drv_to_ssb_drv(sdev->dev->driver)); 
     255                if (!sdrv || SSB_WARN_ON(!sdrv->remove)) { 
     256                        ssb_device_put(sdev); 
    242257                        continue; 
    243                 drv = drv_to_ssb_drv(dev->dev->driver); 
    244                 if (!drv) 
    245                         continue; 
    246                 err = drv->suspend(dev, state); 
    247                 if (err) { 
    248                         ssb_printk(KERN_ERR PFX "Failed to freeze device %s\n", 
    249                                    dev_name(dev->dev)); 
    250                         goto err_unwind; 
    251258                } 
     259                sdrv->remove(sdev); 
     260                ctx->device_frozen[i] = 1; 
    252261        } 
    253262 
    254263        return 0; 
    255 err_unwind: 
    256         for (i--; i >= 0; i--) { 
    257                 dev = &(bus->devices[i]); 
    258                 if (!dev->dev || 
    259                     !dev->dev->driver || 
    260                     !device_is_registered(dev->dev)) 
    261                         continue; 
    262                 drv = drv_to_ssb_drv(dev->dev->driver); 
    263                 if (!drv) 
    264                         continue; 
    265                 if (drv->resume) 
    266                         drv->resume(dev); 
    267         } 
    268         return err; 
    269264} 
    270265 
    271 int ssb_devices_thaw(struct ssb_bus *bus) 
     266/** ssb_devices_thaw - Unfreeze all devices on the bus. 
     267 * 
     268 * This will re-attach the device drivers and re-init the devices. 
     269 * 
     270 * @ctx: The context structure from ssb_devices_freeze() 
     271 */ 
     272int ssb_devices_thaw(struct ssb_freeze_context *ctx) 
    272273{ 
    273         struct ssb_device *dev; 
    274         struct ssb_driver *drv; 
    275         int err; 
    276         int i; 
     274        struct ssb_bus *bus = ctx->bus; 
     275        struct ssb_device *sdev; 
     276        struct ssb_driver *sdrv; 
     277        unsigned int i; 
     278        int err, result = 0; 
    277279 
    278280        for (i = 0; i < bus->nr_devices; i++) { 
    279                 dev = &(bus->devices[i]); 
    280                 if (!dev->dev || 
    281                     !dev->dev->driver || 
    282                     !device_is_registered(dev->dev)) 
     281                if (!ctx->device_frozen[i]) 
    283282                        continue; 
    284                 drv = drv_to_ssb_drv(dev->dev->driver); 
    285                 if (!drv) 
     283                sdev = &bus->devices[i]; 
     284 
     285                if (SSB_WARN_ON(!sdev->dev || !sdev->dev->driver)) 
    286286                        continue; 
    287                 if (SSB_WARN_ON(!drv->resume)) 
     287                sdrv = drv_to_ssb_drv(sdev->dev->driver); 
     288                if (SSB_WARN_ON(!sdrv || !sdrv->probe)) 
    288289                        continue; 
    289                 err = drv->resume(dev); 
     290 
     291                err = sdrv->probe(sdev, &sdev->id); 
    290292                if (err) { 
    291293                        ssb_printk(KERN_ERR PFX "Failed to thaw device %s\n", 
    292                                    dev_name(dev->dev)); 
     294                                   dev_name(sdev->dev)); 
     295                        result = err; 
    293296                } 
     297                ssb_driver_put(sdrv); 
     298                ssb_device_put(sdev); 
    294299        } 
    295300 
    296         return 0; 
     301        return result; 
    297302} 
    298303#endif /* CONFIG_SSB_SPROM */ 
    299304 
    static int ssb_devices_register(struct s 
    490495#endif 
    491496                        break; 
    492497                case SSB_BUSTYPE_SDIO: 
    493 #ifdef CONFIG_SSB_SDIO 
    494                         sdev->irq = bus->host_sdio->dev.irq; 
     498#ifdef CONFIG_SSB_SDIOHOST 
    495499                        dev->parent = &bus->host_sdio->dev; 
    496500#endif 
    497501                        break; 
    int ssb_bus_pcibus_register(struct ssb_b 
    830834        if (!err) { 
    831835                ssb_printk(KERN_INFO PFX "Sonics Silicon Backplane found on " 
    832836                           "PCI device %s\n", dev_name(&host_pci->dev)); 
     837        } else { 
     838                ssb_printk(KERN_ERR PFX "Failed to register PCI version" 
     839                           " of SSB with error %d\n", err); 
    833840        } 
    834841 
    835842        return err; 
  • drivers/ssb/pci.c

    a b  
    1717 
    1818#include <linux/ssb/ssb.h> 
    1919#include <linux/ssb/ssb_regs.h> 
     20#include <linux/slab.h> 
    2021#include <linux/pci.h> 
    2122#include <linux/delay.h> 
    2223 
    static int ssb_pci_sprom_get(struct ssb_ 
    648649        } 
    649650        ssb_dprintk(KERN_INFO PFX "SPROM offset is 0x%x\n", bus->sprom_offset); 
    650651 
     652        if (!ssb_is_sprom_available(bus)) { 
     653                ssb_printk(KERN_ERR PFX "No SPROM available!\n"); 
     654                return -ENODEV; 
     655        } 
     656 
     657        bus->sprom_offset = (bus->chipco.dev->id.revision < 31) ? 
     658                SSB_SPROM_BASE1 : SSB_SPROM_BASE31; 
     659 
    651660        buf = kcalloc(SSB_SPROMSIZE_WORDS_R123, sizeof(u16), GFP_KERNEL); 
    652661        if (!buf) 
    653662                goto out; 
  • drivers/ssb/pcihost_wrapper.c

    a b  
    1212 */ 
    1313 
    1414#include <linux/pci.h> 
     15#include <linux/slab.h> 
    1516#include <linux/ssb/ssb.h> 
    1617 
    1718 
  • drivers/ssb/pcmcia.c

    a b static int ssb_pcmcia_sprom_check_crc(co 
    617617        }                                               \ 
    618618  } while (0) 
    619619 
    620 int ssb_pcmcia_get_invariants(struct ssb_bus *bus, 
    621                               struct ssb_init_invariants *iv) 
     620static int ssb_pcmcia_get_mac(struct pcmcia_device *p_dev, 
     621                        tuple_t *tuple, 
     622                        void *priv) 
    622623{ 
    623         tuple_t tuple; 
    624         int res; 
    625         unsigned char buf[32]; 
     624        struct ssb_sprom *sprom = priv; 
     625 
     626        if (tuple->TupleData[0] != CISTPL_FUNCE_LAN_NODE_ID) 
     627                return -EINVAL; 
     628        if (tuple->TupleDataLen != ETH_ALEN + 2) 
     629                return -EINVAL; 
     630        if (tuple->TupleData[1] != ETH_ALEN) 
     631                return -EINVAL; 
     632        memcpy(sprom->il0mac, &tuple->TupleData[2], ETH_ALEN); 
     633        return 0; 
     634}; 
     635 
     636static int ssb_pcmcia_do_get_invariants(struct pcmcia_device *p_dev, 
     637                                        tuple_t *tuple, 
     638                                        void *priv) 
     639{ 
     640        struct ssb_init_invariants *iv = priv; 
    626641        struct ssb_sprom *sprom = &iv->sprom; 
    627642        struct ssb_boardinfo *bi = &iv->boardinfo; 
    628643        const char *error_description; 
    629644 
     645        GOTO_ERROR_ON(tuple->TupleDataLen < 1, "VEN tpl < 1"); 
     646        switch (tuple->TupleData[0]) { 
     647        case SSB_PCMCIA_CIS_ID: 
     648                GOTO_ERROR_ON((tuple->TupleDataLen != 5) && 
     649                              (tuple->TupleDataLen != 7), 
     650                              "id tpl size"); 
     651                bi->vendor = tuple->TupleData[1] | 
     652                        ((u16)tuple->TupleData[2] << 8); 
     653                break; 
     654        case SSB_PCMCIA_CIS_BOARDREV: 
     655                GOTO_ERROR_ON(tuple->TupleDataLen != 2, 
     656                        "boardrev tpl size"); 
     657                sprom->board_rev = tuple->TupleData[1]; 
     658                break; 
     659        case SSB_PCMCIA_CIS_PA: 
     660                GOTO_ERROR_ON((tuple->TupleDataLen != 9) && 
     661                        (tuple->TupleDataLen != 10), 
     662                        "pa tpl size"); 
     663                sprom->pa0b0 = tuple->TupleData[1] | 
     664                        ((u16)tuple->TupleData[2] << 8); 
     665                sprom->pa0b1 = tuple->TupleData[3] | 
     666                        ((u16)tuple->TupleData[4] << 8); 
     667                sprom->pa0b2 = tuple->TupleData[5] | 
     668                        ((u16)tuple->TupleData[6] << 8); 
     669                sprom->itssi_a = tuple->TupleData[7]; 
     670                sprom->itssi_bg = tuple->TupleData[7]; 
     671                sprom->maxpwr_a = tuple->TupleData[8]; 
     672                sprom->maxpwr_bg = tuple->TupleData[8]; 
     673                break; 
     674        case SSB_PCMCIA_CIS_OEMNAME: 
     675                /* We ignore this. */ 
     676                break; 
     677        case SSB_PCMCIA_CIS_CCODE: 
     678                GOTO_ERROR_ON(tuple->TupleDataLen != 2, 
     679                        "ccode tpl size"); 
     680                sprom->country_code = tuple->TupleData[1]; 
     681                break; 
     682        case SSB_PCMCIA_CIS_ANTENNA: 
     683                GOTO_ERROR_ON(tuple->TupleDataLen != 2, 
     684                        "ant tpl size"); 
     685                sprom->ant_available_a = tuple->TupleData[1]; 
     686                sprom->ant_available_bg = tuple->TupleData[1]; 
     687                break; 
     688        case SSB_PCMCIA_CIS_ANTGAIN: 
     689                GOTO_ERROR_ON(tuple->TupleDataLen != 2, 
     690                        "antg tpl size"); 
     691                sprom->antenna_gain.ghz24.a0 = tuple->TupleData[1]; 
     692                sprom->antenna_gain.ghz24.a1 = tuple->TupleData[1]; 
     693                sprom->antenna_gain.ghz24.a2 = tuple->TupleData[1]; 
     694                sprom->antenna_gain.ghz24.a3 = tuple->TupleData[1]; 
     695                sprom->antenna_gain.ghz5.a0 = tuple->TupleData[1]; 
     696                sprom->antenna_gain.ghz5.a1 = tuple->TupleData[1]; 
     697                sprom->antenna_gain.ghz5.a2 = tuple->TupleData[1]; 
     698                sprom->antenna_gain.ghz5.a3 = tuple->TupleData[1]; 
     699                break; 
     700        case SSB_PCMCIA_CIS_BFLAGS: 
     701                GOTO_ERROR_ON((tuple->TupleDataLen != 3) && 
     702                        (tuple->TupleDataLen != 5), 
     703                        "bfl tpl size"); 
     704                sprom->boardflags_lo = tuple->TupleData[1] | 
     705                        ((u16)tuple->TupleData[2] << 8); 
     706                break; 
     707        case SSB_PCMCIA_CIS_LEDS: 
     708                GOTO_ERROR_ON(tuple->TupleDataLen != 5, 
     709                        "leds tpl size"); 
     710                sprom->gpio0 = tuple->TupleData[1]; 
     711                sprom->gpio1 = tuple->TupleData[2]; 
     712                sprom->gpio2 = tuple->TupleData[3]; 
     713                sprom->gpio3 = tuple->TupleData[4]; 
     714                break; 
     715        } 
     716        return -ENOSPC; /* continue with next entry */ 
     717 
     718error: 
     719        ssb_printk(KERN_ERR PFX 
     720                   "PCMCIA: Failed to fetch device invariants: %s\n", 
     721                   error_description); 
     722        return -ENODEV; 
     723} 
     724 
     725 
     726int ssb_pcmcia_get_invariants(struct ssb_bus *bus, 
     727                              struct ssb_init_invariants *iv) 
     728{ 
     729        struct ssb_sprom *sprom = &iv->sprom; 
     730        int res; 
     731 
    630732        memset(sprom, 0xFF, sizeof(*sprom)); 
    631733        sprom->revision = 1; 
    632734        sprom->boardflags_lo = 0; 
    633735        sprom->boardflags_hi = 0; 
    634736 
    635737        /* First fetch the MAC address. */ 
    636         memset(&tuple, 0, sizeof(tuple)); 
    637         tuple.DesiredTuple = CISTPL_FUNCE; 
    638         tuple.TupleData = buf; 
    639         tuple.TupleDataMax = sizeof(buf); 
    640         res = pcmcia_get_first_tuple(bus->host_pcmcia, &tuple); 
    641         GOTO_ERROR_ON(res != 0, "MAC first tpl"); 
    642         res = pcmcia_get_tuple_data(bus->host_pcmcia, &tuple); 
    643         GOTO_ERROR_ON(res != 0, "MAC first tpl data"); 
    644         while (1) { 
    645                 GOTO_ERROR_ON(tuple.TupleDataLen < 1, "MAC tpl < 1"); 
    646                 if (tuple.TupleData[0] == CISTPL_FUNCE_LAN_NODE_ID) 
    647                         break; 
    648                 res = pcmcia_get_next_tuple(bus->host_pcmcia, &tuple); 
    649                 GOTO_ERROR_ON(res != 0, "MAC next tpl"); 
    650                 res = pcmcia_get_tuple_data(bus->host_pcmcia, &tuple); 
    651                 GOTO_ERROR_ON(res != 0, "MAC next tpl data"); 
     738        res = pcmcia_loop_tuple(bus->host_pcmcia, CISTPL_FUNCE, 
     739                                ssb_pcmcia_get_mac, sprom); 
     740        if (res != 0) { 
     741                ssb_printk(KERN_ERR PFX 
     742                        "PCMCIA: Failed to fetch MAC address\n"); 
     743                return -ENODEV; 
    652744        } 
    653         GOTO_ERROR_ON(tuple.TupleDataLen != ETH_ALEN + 2, "MAC tpl size"); 
    654         memcpy(sprom->il0mac, &tuple.TupleData[2], ETH_ALEN); 
    655745 
    656746        /* Fetch the vendor specific tuples. */ 
    657         memset(&tuple, 0, sizeof(tuple)); 
    658         tuple.DesiredTuple = SSB_PCMCIA_CIS; 
    659         tuple.TupleData = buf; 
    660         tuple.TupleDataMax = sizeof(buf); 
    661         res = pcmcia_get_first_tuple(bus->host_pcmcia, &tuple); 
    662         GOTO_ERROR_ON(res != 0, "VEN first tpl"); 
    663         res = pcmcia_get_tuple_data(bus->host_pcmcia, &tuple); 
    664         GOTO_ERROR_ON(res != 0, "VEN first tpl data"); 
    665         while (1) { 
    666                 GOTO_ERROR_ON(tuple.TupleDataLen < 1, "VEN tpl < 1"); 
    667                 switch (tuple.TupleData[0]) { 
    668                 case SSB_PCMCIA_CIS_ID: 
    669                         GOTO_ERROR_ON((tuple.TupleDataLen != 5) && 
    670                                       (tuple.TupleDataLen != 7), 
    671                                       "id tpl size"); 
    672                         bi->vendor = tuple.TupleData[1] | 
    673                                ((u16)tuple.TupleData[2] << 8); 
    674                         break; 
    675                 case SSB_PCMCIA_CIS_BOARDREV: 
    676                         GOTO_ERROR_ON(tuple.TupleDataLen != 2, 
    677                                       "boardrev tpl size"); 
    678                         sprom->board_rev = tuple.TupleData[1]; 
    679                         break; 
    680                 case SSB_PCMCIA_CIS_PA: 
    681                         GOTO_ERROR_ON((tuple.TupleDataLen != 9) && 
    682                                       (tuple.TupleDataLen != 10), 
    683                                       "pa tpl size"); 
    684                         sprom->pa0b0 = tuple.TupleData[1] | 
    685                                  ((u16)tuple.TupleData[2] << 8); 
    686                         sprom->pa0b1 = tuple.TupleData[3] | 
    687                                  ((u16)tuple.TupleData[4] << 8); 
    688                         sprom->pa0b2 = tuple.TupleData[5] | 
    689                                  ((u16)tuple.TupleData[6] << 8); 
    690                         sprom->itssi_a = tuple.TupleData[7]; 
    691                         sprom->itssi_bg = tuple.TupleData[7]; 
    692                         sprom->maxpwr_a = tuple.TupleData[8]; 
    693                         sprom->maxpwr_bg = tuple.TupleData[8]; 
    694                         break; 
    695                 case SSB_PCMCIA_CIS_OEMNAME: 
    696                         /* We ignore this. */ 
    697                         break; 
    698                 case SSB_PCMCIA_CIS_CCODE: 
    699                         GOTO_ERROR_ON(tuple.TupleDataLen != 2, 
    700                                       "ccode tpl size"); 
    701                         sprom->country_code = tuple.TupleData[1]; 
    702                         break; 
    703                 case SSB_PCMCIA_CIS_ANTENNA: 
    704                         GOTO_ERROR_ON(tuple.TupleDataLen != 2, 
    705                                       "ant tpl size"); 
    706                         sprom->ant_available_a = tuple.TupleData[1]; 
    707                         sprom->ant_available_bg = tuple.TupleData[1]; 
    708                         break; 
    709                 case SSB_PCMCIA_CIS_ANTGAIN: 
    710                         GOTO_ERROR_ON(tuple.TupleDataLen != 2, 
    711                                       "antg tpl size"); 
    712                         sprom->antenna_gain.ghz24.a0 = tuple.TupleData[1]; 
    713                         sprom->antenna_gain.ghz24.a1 = tuple.TupleData[1]; 
    714                         sprom->antenna_gain.ghz24.a2 = tuple.TupleData[1]; 
    715                         sprom->antenna_gain.ghz24.a3 = tuple.TupleData[1]; 
    716                         sprom->antenna_gain.ghz5.a0 = tuple.TupleData[1]; 
    717                         sprom->antenna_gain.ghz5.a1 = tuple.TupleData[1]; 
    718                         sprom->antenna_gain.ghz5.a2 = tuple.TupleData[1]; 
    719                         sprom->antenna_gain.ghz5.a3 = tuple.TupleData[1]; 
    720                         break; 
    721                 case SSB_PCMCIA_CIS_BFLAGS: 
    722                         GOTO_ERROR_ON((tuple.TupleDataLen != 3) && 
    723                                       (tuple.TupleDataLen != 5), 
    724                                       "bfl tpl size"); 
    725                         sprom->boardflags_lo = tuple.TupleData[1] | 
    726                                          ((u16)tuple.TupleData[2] << 8); 
    727                         break; 
    728                 case SSB_PCMCIA_CIS_LEDS: 
    729                         GOTO_ERROR_ON(tuple.TupleDataLen != 5, 
    730                                       "leds tpl size"); 
    731                         sprom->gpio0 = tuple.TupleData[1]; 
    732                         sprom->gpio1 = tuple.TupleData[2]; 
    733                         sprom->gpio2 = tuple.TupleData[3]; 
    734                         sprom->gpio3 = tuple.TupleData[4]; 
    735                         break; 
    736                 } 
    737                 res = pcmcia_get_next_tuple(bus->host_pcmcia, &tuple); 
    738                 if (res == -ENOSPC) 
    739                         break; 
    740                 GOTO_ERROR_ON(res != 0, "VEN next tpl"); 
    741                 res = pcmcia_get_tuple_data(bus->host_pcmcia, &tuple); 
    742                 GOTO_ERROR_ON(res != 0, "VEN next tpl data"); 
    743         } 
     747        res = pcmcia_loop_tuple(bus->host_pcmcia, SSB_PCMCIA_CIS, 
     748                                ssb_pcmcia_do_get_invariants, sprom); 
     749        if ((res == 0) || (res == -ENOSPC)) 
     750                return 0; 
    744751 
    745         return 0; 
    746 error: 
    747752        ssb_printk(KERN_ERR PFX 
    748                    "PCMCIA: Failed to fetch device invariants: %s\n", 
    749                    error_description); 
     753                        "PCMCIA: Failed to fetch device invariants\n"); 
    750754        return -ENODEV; 
    751755} 
    752756 
  • drivers/ssb/scan.c

    a b int ssb_bus_scan(struct ssb_bus *bus, 
    354354                dev->bus = bus; 
    355355                dev->ops = bus->ops; 
    356356 
    357                 ssb_dprintk(KERN_INFO PFX 
     357                printk(KERN_DEBUG PFX 
    358358                            "Core %d found: %s " 
    359359                            "(cc 0x%03X, rev 0x%02X, vendor 0x%04X)\n", 
    360360                            i, ssb_core_name(dev->id.coreid), 
  • drivers/ssb/sprom.c

    a b  
    1414#include "ssb_private.h" 
    1515 
    1616#include <linux/ctype.h> 
     17#include <linux/slab.h> 
    1718 
    1819 
    1920static const struct ssb_sprom *fallback_sprom; 
    ssize_t ssb_attr_sprom_store(struct ssb_ 
    102103        u16 *sprom; 
    103104        int res = 0, err = -ENOMEM; 
    104105        size_t sprom_size_words = bus->sprom_size; 
     106        struct ssb_freeze_context freeze; 
    105107 
    106108        sprom = kcalloc(bus->sprom_size, sizeof(u16), GFP_KERNEL); 
    107109        if (!sprom) 
    ssize_t ssb_attr_sprom_store(struct ssb_ 
    123125        err = -ERESTARTSYS; 
    124126        if (mutex_lock_interruptible(&bus->sprom_mutex)) 
    125127                goto out_kfree; 
    126         err = ssb_devices_freeze(bus); 
    127         if (err == -EOPNOTSUPP) { 
    128                 ssb_printk(KERN_ERR PFX "SPROM write: Could not freeze devices. " 
    129                            "No suspend support. Is CONFIG_PM enabled?\n"); 
    130                 goto out_unlock; 
    131         } 
     128        err = ssb_devices_freeze(bus, &freeze); 
    132129        if (err) { 
    133130                ssb_printk(KERN_ERR PFX "SPROM write: Could not freeze all devices\n"); 
    134131                goto out_unlock; 
    135132        } 
    136133        res = sprom_write(bus, sprom); 
    137         err = ssb_devices_thaw(bus); 
     134        err = ssb_devices_thaw(&freeze); 
    138135        if (err) 
    139136                ssb_printk(KERN_ERR PFX "SPROM write: Could not thaw all devices\n"); 
    140137out_unlock: 
    const struct ssb_sprom *ssb_get_fallback 
    179176{ 
    180177        return fallback_sprom; 
    181178} 
     179 
     180/* http://bcm-v4.sipsolutions.net/802.11/IsSpromAvailable */ 
     181bool ssb_is_sprom_available(struct ssb_bus *bus) 
     182{ 
     183        /* status register only exists on chipcomon rev >= 11 and we need check 
     184           for >= 31 only */ 
     185        /* this routine differs from specs as we do not access SPROM directly 
     186           on PCMCIA */ 
     187        if (bus->bustype == SSB_BUSTYPE_PCI && 
     188            bus->chipco.dev->id.revision >= 31) 
     189                return bus->chipco.capabilities & SSB_CHIPCO_CAP_SPROM; 
     190 
     191        return true; 
     192} 
  • drivers/ssb/ssb_private.h

    a b extern const struct ssb_sprom *ssb_get_f 
    176176 
    177177/* core.c */ 
    178178extern u32 ssb_calc_clock_rate(u32 plltype, u32 n, u32 m); 
    179 extern int ssb_devices_freeze(struct ssb_bus *bus); 
    180 extern int ssb_devices_thaw(struct ssb_bus *bus); 
    181179extern struct ssb_bus *ssb_pci_dev_to_bus(struct pci_dev *pdev); 
    182180int ssb_for_each_bus_call(unsigned long data, 
    183181                          int (*func)(struct ssb_bus *bus, unsigned long data)); 
    184182extern struct ssb_bus *ssb_pcmcia_dev_to_bus(struct pcmcia_device *pdev); 
    185183 
     184struct ssb_freeze_context { 
     185        /* Pointer to the bus */ 
     186        struct ssb_bus *bus; 
     187        /* Boolean list to indicate whether a device is frozen on this bus. */ 
     188        bool device_frozen[SSB_MAX_NR_CORES]; 
     189}; 
     190extern int ssb_devices_freeze(struct ssb_bus *bus, struct ssb_freeze_context *ctx); 
     191extern int ssb_devices_thaw(struct ssb_freeze_context *ctx); 
     192 
     193 
    186194 
    187195/* b43_pci_bridge.c */ 
    188196#ifdef CONFIG_SSB_B43_PCI_BRIDGE 
    189197extern int __init b43_pci_ssb_bridge_init(void); 
    190198extern void __exit b43_pci_ssb_bridge_exit(void); 
    191 #else /* CONFIG_SSB_B43_PCI_BRIDGR */ 
     199#else /* CONFIG_SSB_B43_PCI_BRIDGE */ 
    192200static inline int b43_pci_ssb_bridge_init(void) 
    193201{ 
    194202        return 0; 
    static inline int b43_pci_ssb_bridge_ini 
    196204static inline void b43_pci_ssb_bridge_exit(void) 
    197205{ 
    198206} 
    199 #endif /* CONFIG_SSB_PCIHOST */ 
     207#endif /* CONFIG_SSB_B43_PCI_BRIDGE */ 
    200208 
    201209#endif /* LINUX_SSB_PRIVATE_H_ */ 
  • include/linux/ssb/ssb.h

    a b struct ssb_bus { 
    269269 
    270270        const struct ssb_bus_ops *ops; 
    271271 
    272         /* The core in the basic address register window. (PCI bus only) */ 
     272        /* The core currently mapped into the MMIO window. 
     273         * Not valid on all host-buses. So don't use outside of SSB. */ 
    273274        struct ssb_device *mapped_device; 
    274275        union { 
    275276                /* Currently mapped PCMCIA segment. (bustype == SSB_BUSTYPE_PCMCIA only) */ 
    struct ssb_bus { 
    281282         * On PCMCIA-host busses this is used to protect the whole MMIO access. */ 
    282283        spinlock_t bar_lock; 
    283284 
    284         /* The bus this backplane is running on. */ 
     285        /* The host-bus this backplane is running on. */ 
    285286        enum ssb_bustype bustype; 
    286         /* Pointer to the PCI bus (only valid if bustype == SSB_BUSTYPE_PCI). */ 
    287         struct pci_dev *host_pci; 
    288         /* Pointer to the PCMCIA device (only if bustype == SSB_BUSTYPE_PCMCIA). */ 
    289         struct pcmcia_device *host_pcmcia; 
    290         /* Pointer to the SDIO device (only if bustype == SSB_BUSTYPE_SDIO). */ 
    291         struct sdio_func *host_sdio; 
     287        /* Pointers to the host-bus. Check bustype before using any of these pointers. */ 
     288        union { 
     289                /* Pointer to the PCI bus (only valid if bustype == SSB_BUSTYPE_PCI). */ 
     290                struct pci_dev *host_pci; 
     291                /* Pointer to the PCMCIA device (only if bustype == SSB_BUSTYPE_PCMCIA). */ 
     292                struct pcmcia_device *host_pcmcia; 
     293                /* Pointer to the SDIO device (only if bustype == SSB_BUSTYPE_SDIO). */ 
     294                struct sdio_func *host_sdio; 
     295        }; 
    292296 
    293297        /* See enum ssb_quirks */ 
    294298        unsigned int quirks; 
    struct ssb_bus { 
    301305        /* ID information about the Chip. */ 
    302306        u16 chip_id; 
    303307        u16 chip_rev; 
     308        u16 sprom_offset; 
    304309        u16 sprom_size;         /* number of words in sprom */ 
    305310        u8 chip_package; 
    306311 
    extern int ssb_bus_sdiobus_register(stru 
    390395 
    391396extern void ssb_bus_unregister(struct ssb_bus *bus); 
    392397 
     398/* Does the device have an SPROM? */ 
     399extern bool ssb_is_sprom_available(struct ssb_bus *bus); 
     400 
    393401/* Set a fallback SPROM. 
    394402 * See kdoc at the function definition for complete documentation. */ 
    395403extern int ssb_arch_set_fallback_sprom(const struct ssb_sprom *sprom); 
  • include/linux/ssb/ssb_driver_chipcommon.h

    a b  
    5454#define  SSB_CHIPCO_CAP_64BIT           0x08000000      /* 64-bit Backplane */ 
    5555#define  SSB_CHIPCO_CAP_PMU             0x10000000      /* PMU available (rev >= 20) */ 
    5656#define  SSB_CHIPCO_CAP_ECI             0x20000000      /* ECI available (rev >= 20) */ 
     57#define  SSB_CHIPCO_CAP_SPROM           0x40000000      /* SPROM present */ 
    5758#define SSB_CHIPCO_CORECTL              0x0008 
    5859#define  SSB_CHIPCO_CORECTL_UARTCLK0    0x00000001      /* Drive UART with internal clock */ 
    5960#define  SSB_CHIPCO_CORECTL_SE          0x00000002      /* sync clk out enable (corerev >= 3) */ 
     
    386387 
    387388 
    388389/** Chip specific Chip-Status register contents. */ 
     390#define SSB_CHIPCO_CHST_4322_SPROM_EXISTS       0x00000040 /* SPROM present */ 
    389391#define SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL      0x00000003 
    390392#define SSB_CHIPCO_CHST_4325_DEFCIS_SEL         0 /* OTP is powered up, use def. CIS, no SPROM */ 
    391393#define SSB_CHIPCO_CHST_4325_SPROM_SEL          1 /* OTP is powered up, SPROM is present */ 
     
    399401#define SSB_CHIPCO_CHST_4325_RCAL_VALUE_SHIFT   4 
    400402#define SSB_CHIPCO_CHST_4325_PMUTOP_2B          0x00000200 /* 1 for 2b, 0 for to 2a */ 
    401403 
     404/** Macros to determine SPROM presence based on Chip-Status register. */ 
     405#define SSB_CHIPCO_CHST_4312_SPROM_PRESENT(status) \ 
     406        ((status & SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL) != \ 
     407                SSB_CHIPCO_CHST_4325_OTP_SEL) 
     408#define SSB_CHIPCO_CHST_4322_SPROM_PRESENT(status) \ 
     409        (status & SSB_CHIPCO_CHST_4322_SPROM_EXISTS) 
     410#define SSB_CHIPCO_CHST_4325_SPROM_PRESENT(status) \ 
     411        (((status & SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL) != \ 
     412                SSB_CHIPCO_CHST_4325_DEFCIS_SEL) && \ 
     413         ((status & SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL) != \ 
     414                SSB_CHIPCO_CHST_4325_OTP_SEL)) 
     415 
    402416 
    403417 
    404418/** Clockcontrol masks and values **/ 
  • include/linux/ssb/ssb_regs.h

    a b  
    178178#define  SSB_SPROM_REVISION_CRC_SHIFT   8 
    179179 
    180180/* SPROM Revision 1 */ 
    181 #define SSB_SPROM1_SPID                 0x1004  /* Subsystem Product ID for PCI */ 
    182 #define SSB_SPROM1_SVID                 0x1006  /* Subsystem Vendor ID for PCI */ 
    183 #define SSB_SPROM1_PID                  0x1008  /* Product ID for PCI */ 
    184 #define SSB_SPROM1_IL0MAC               0x1048  /* 6 bytes MAC address for 802.11b/g */ 
    185 #define SSB_SPROM1_ET0MAC               0x104E  /* 6 bytes MAC address for Ethernet */ 
    186 #define SSB_SPROM1_ET1MAC               0x1054  /* 6 bytes MAC address for 802.11a */ 
    187 #define SSB_SPROM1_ETHPHY               0x105A  /* Ethernet PHY settings */ 
     181#define SSB_SPROM1_SPID                 0x0004  /* Subsystem Product ID for PCI */ 
     182#define SSB_SPROM1_SVID                 0x0006  /* Subsystem Vendor ID for PCI */ 
     183#define SSB_SPROM1_PID                  0x0008  /* Product ID for PCI */ 
     184#define SSB_SPROM1_IL0MAC               0x0048  /* 6 bytes MAC address for 802.11b/g */ 
     185#define SSB_SPROM1_ET0MAC               0x004E  /* 6 bytes MAC address for Ethernet */ 
     186#define SSB_SPROM1_ET1MAC               0x0054  /* 6 bytes MAC address for 802.11a */ 
     187#define SSB_SPROM1_ETHPHY               0x005A  /* Ethernet PHY settings */ 
    188188#define  SSB_SPROM1_ETHPHY_ET0A         0x001F  /* MII Address for enet0 */ 
    189189#define  SSB_SPROM1_ETHPHY_ET1A         0x03E0  /* MII Address for enet1 */ 
    190190#define  SSB_SPROM1_ETHPHY_ET1A_SHIFT   5 
    191191#define  SSB_SPROM1_ETHPHY_ET0M         (1<<14) /* MDIO for enet0 */ 
    192192#define  SSB_SPROM1_ETHPHY_ET1M         (1<<15) /* MDIO for enet1 */ 
    193 #define SSB_SPROM1_BINF                 0x105C  /* Board info */ 
     193#define SSB_SPROM1_BINF                 0x005C  /* Board info */ 
    194194#define  SSB_SPROM1_BINF_BREV           0x00FF  /* Board Revision */ 
    195195#define  SSB_SPROM1_BINF_CCODE          0x0F00  /* Country Code */ 
    196196#define  SSB_SPROM1_BINF_CCODE_SHIFT    8 
     
    198198#define  SSB_SPROM1_BINF_ANTBG_SHIFT    12 
    199199#define  SSB_SPROM1_BINF_ANTA           0xC000  /* Available A-PHY antennas */ 
    200200#define  SSB_SPROM1_BINF_ANTA_SHIFT     14 
    201 #define SSB_SPROM1_PA0B0                0x105E 
    202 #define SSB_SPROM1_PA0B1                0x1060 
    203 #define SSB_SPROM1_PA0B2                0x1062 
    204 #define SSB_SPROM1_GPIOA                0x1064  /* General Purpose IO pins 0 and 1 */ 
     201#define SSB_SPROM1_PA0B0                0x005E 
     202#define SSB_SPROM1_PA0B1                0x0060 
     203#define SSB_SPROM1_PA0B2                0x0062 
     204#define SSB_SPROM1_GPIOA                0x0064  /* General Purpose IO pins 0 and 1 */ 
    205205#define  SSB_SPROM1_GPIOA_P0            0x00FF  /* Pin 0 */ 
    206206#define  SSB_SPROM1_GPIOA_P1            0xFF00  /* Pin 1 */ 
    207207#define  SSB_SPROM1_GPIOA_P1_SHIFT      8 
    208 #define SSB_SPROM1_GPIOB                0x1066  /* General Purpuse IO pins 2 and 3 */ 
     208#define SSB_SPROM1_GPIOB                0x0066  /* General Purpuse IO pins 2 and 3 */ 
    209209#define  SSB_SPROM1_GPIOB_P2            0x00FF  /* Pin 2 */ 
    210210#define  SSB_SPROM1_GPIOB_P3            0xFF00  /* Pin 3 */ 
    211211#define  SSB_SPROM1_GPIOB_P3_SHIFT      8 
    212 #define SSB_SPROM1_MAXPWR               0x1068  /* Power Amplifier Max Power */ 
     212#define SSB_SPROM1_MAXPWR               0x0068  /* Power Amplifier Max Power */ 
    213213#define  SSB_SPROM1_MAXPWR_BG           0x00FF  /* B-PHY and G-PHY (in dBm Q5.2) */ 
    214214#define  SSB_SPROM1_MAXPWR_A            0xFF00  /* A-PHY (in dBm Q5.2) */ 
    215215#define  SSB_SPROM1_MAXPWR_A_SHIFT      8 
    216 #define SSB_SPROM1_PA1B0                0x106A 
    217 #define SSB_SPROM1_PA1B1                0x106C 
    218 #define SSB_SPROM1_PA1B2                0x106E 
    219 #define SSB_SPROM1_ITSSI                0x1070  /* Idle TSSI Target */ 
     216#define SSB_SPROM1_PA1B0                0x006A 
     217#define SSB_SPROM1_PA1B1                0x006C 
     218#define SSB_SPROM1_PA1B2                0x006E 
     219#define SSB_SPROM1_ITSSI                0x0070  /* Idle TSSI Target */ 
    220220#define  SSB_SPROM1_ITSSI_BG            0x00FF  /* B-PHY and G-PHY*/ 
    221221#define  SSB_SPROM1_ITSSI_A             0xFF00  /* A-PHY */ 
    222222#define  SSB_SPROM1_ITSSI_A_SHIFT       8 
    223 #define SSB_SPROM1_BFLLO                0x1072  /* Boardflags (low 16 bits) */ 
    224 #define SSB_SPROM1_AGAIN                0x1074  /* Antenna Gain (in dBm Q5.2) */ 
     223#define SSB_SPROM1_BFLLO                0x0072  /* Boardflags (low 16 bits) */ 
     224#define SSB_SPROM1_AGAIN                0x0074  /* Antenna Gain (in dBm Q5.2) */ 
    225225#define  SSB_SPROM1_AGAIN_BG            0x00FF  /* B-PHY and G-PHY */ 
    226226#define  SSB_SPROM1_AGAIN_BG_SHIFT      0 
    227227#define  SSB_SPROM1_AGAIN_A             0xFF00  /* A-PHY */ 
    228228#define  SSB_SPROM1_AGAIN_A_SHIFT       8 
    229229 
    230230/* SPROM Revision 2 (inherits from rev 1) */ 
    231 #define SSB_SPROM2_BFLHI                0x1038  /* Boardflags (high 16 bits) */ 
    232 #define SSB_SPROM2_MAXP_A               0x103A  /* A-PHY Max Power */ 
     231#define SSB_SPROM2_BFLHI                0x0038  /* Boardflags (high 16 bits) */ 
     232#define SSB_SPROM2_MAXP_A               0x003A  /* A-PHY Max Power */ 
    233233#define  SSB_SPROM2_MAXP_A_HI           0x00FF  /* Max Power High */ 
    234234#define  SSB_SPROM2_MAXP_A_LO           0xFF00  /* Max Power Low */ 
    235235#define  SSB_SPROM2_MAXP_A_LO_SHIFT     8 
    236 #define SSB_SPROM2_PA1LOB0              0x103C  /* A-PHY PowerAmplifier Low Settings */ 
    237 #define SSB_SPROM2_PA1LOB1              0x103E  /* A-PHY PowerAmplifier Low Settings */ 
    238 #define SSB_SPROM2_PA1LOB2              0x1040  /* A-PHY PowerAmplifier Low Settings */ 
    239 #define SSB_SPROM2_PA1HIB0              0x1042  /* A-PHY PowerAmplifier High Settings */ 
    240 #define SSB_SPROM2_PA1HIB1              0x1044  /* A-PHY PowerAmplifier High Settings */ 
    241 #define SSB_SPROM2_PA1HIB2              0x1046  /* A-PHY PowerAmplifier High Settings */ 
    242 #define SSB_SPROM2_OPO                  0x1078  /* OFDM Power Offset from CCK Level */ 
     236#define SSB_SPROM2_PA1LOB0              0x003C  /* A-PHY PowerAmplifier Low Settings */ 
     237#define SSB_SPROM2_PA1LOB1              0x003E  /* A-PHY PowerAmplifier Low Settings */ 
     238#define SSB_SPROM2_PA1LOB2              0x0040  /* A-PHY PowerAmplifier Low Settings */ 
     239#define SSB_SPROM2_PA1HIB0              0x0042  /* A-PHY PowerAmplifier High Settings */ 
     240#define SSB_SPROM2_PA1HIB1              0x0044  /* A-PHY PowerAmplifier High Settings */ 
     241#define SSB_SPROM2_PA1HIB2              0x0046  /* A-PHY PowerAmplifier High Settings */ 
     242#define SSB_SPROM2_OPO                  0x0078  /* OFDM Power Offset from CCK Level */ 
    243243#define  SSB_SPROM2_OPO_VALUE           0x00FF 
    244244#define  SSB_SPROM2_OPO_UNUSED          0xFF00 
    245 #define SSB_SPROM2_CCODE                0x107C  /* Two char Country Code */ 
     245#define SSB_SPROM2_CCODE                0x007C  /* Two char Country Code */ 
    246246 
    247247/* SPROM Revision 3 (inherits most data from rev 2) */ 
    248 #define SSB_SPROM3_IL0MAC               0x104A  /* 6 bytes MAC address for 802.11b/g */ 
    249 #define SSB_SPROM3_OFDMAPO              0x102C  /* A-PHY OFDM Mid Power Offset (4 bytes, BigEndian) */ 
    250 #define SSB_SPROM3_OFDMALPO             0x1030  /* A-PHY OFDM Low Power Offset (4 bytes, BigEndian) */ 
    251 #define SSB_SPROM3_OFDMAHPO             0x1034  /* A-PHY OFDM High Power Offset (4 bytes, BigEndian) */ 
    252 #define SSB_SPROM3_GPIOLDC              0x1042  /* GPIO LED Powersave Duty Cycle (4 bytes, BigEndian) */ 
     248#define SSB_SPROM3_OFDMAPO              0x002C  /* A-PHY OFDM Mid Power Offset (4 bytes, BigEndian) */ 
     249#define SSB_SPROM3_OFDMALPO             0x0030  /* A-PHY OFDM Low Power Offset (4 bytes, BigEndian) */ 
     250#define SSB_SPROM3_OFDMAHPO             0x0034  /* A-PHY OFDM High Power Offset (4 bytes, BigEndian) */ 
     251#define SSB_SPROM3_GPIOLDC              0x0042  /* GPIO LED Powersave Duty Cycle (4 bytes, BigEndian) */ 
    253252#define  SSB_SPROM3_GPIOLDC_OFF         0x0000FF00      /* Off Count */ 
    254253#define  SSB_SPROM3_GPIOLDC_OFF_SHIFT   8 
    255254#define  SSB_SPROM3_GPIOLDC_ON          0x00FF0000      /* On Count */ 
    256255#define  SSB_SPROM3_GPIOLDC_ON_SHIFT    16 
    257 #define SSB_SPROM3_CCKPO                0x1078  /* CCK Power Offset */ 
     256#define SSB_SPROM3_IL0MAC               0x004A  /* 6 bytes MAC address for 802.11b/g */ 
     257#define SSB_SPROM3_CCKPO                0x0078  /* CCK Power Offset */ 
    258258#define  SSB_SPROM3_CCKPO_1M            0x000F  /* 1M Rate PO */ 
    259259#define  SSB_SPROM3_CCKPO_2M            0x00F0  /* 2M Rate PO */ 
    260260#define  SSB_SPROM3_CCKPO_2M_SHIFT      4 
     
    265265#define  SSB_SPROM3_OFDMGPO             0x107A  /* G-PHY OFDM Power Offset (4 bytes, BigEndian) */ 
    266266 
    267267/* SPROM Revision 4 */ 
    268 #define SSB_SPROM4_IL0MAC               0x104C  /* 6 byte MAC address for a/b/g/n */ 
    269 #define SSB_SPROM4_ETHPHY               0x105A  /* Ethernet PHY settings ?? */ 
     268#define SSB_SPROM4_BFLLO                0x0044  /* Boardflags (low 16 bits) */ 
     269#define SSB_SPROM4_BFLHI                0x0046  /* Board Flags Hi */ 
     270#define SSB_SPROM4_IL0MAC               0x004C  /* 6 byte MAC address for a/b/g/n */ 
     271#define SSB_SPROM4_CCODE                0x0052  /* Country Code (2 bytes) */ 
     272#define SSB_SPROM4_GPIOA                0x0056  /* Gen. Purpose IO # 0 and 1 */ 
     273#define  SSB_SPROM4_GPIOA_P0            0x00FF  /* Pin 0 */ 
     274#define  SSB_SPROM4_GPIOA_P1            0xFF00  /* Pin 1 */ 
     275#define  SSB_SPROM4_GPIOA_P1_SHIFT      8 
     276#define SSB_SPROM4_GPIOB                0x0058  /* Gen. Purpose IO # 2 and 3 */ 
     277#define  SSB_SPROM4_GPIOB_P2            0x00FF  /* Pin 2 */ 
     278#define  SSB_SPROM4_GPIOB_P3            0xFF00  /* Pin 3 */ 
     279#define  SSB_SPROM4_GPIOB_P3_SHIFT      8 
     280#define SSB_SPROM4_ETHPHY               0x005A  /* Ethernet PHY settings ?? */ 
    270281#define  SSB_SPROM4_ETHPHY_ET0A         0x001F  /* MII Address for enet0 */ 
    271282#define  SSB_SPROM4_ETHPHY_ET1A         0x03E0  /* MII Address for enet1 */ 
    272283#define  SSB_SPROM4_ETHPHY_ET1A_SHIFT   5 
    273284#define  SSB_SPROM4_ETHPHY_ET0M         (1<<14) /* MDIO for enet0 */ 
    274285#define  SSB_SPROM4_ETHPHY_ET1M         (1<<15) /* MDIO for enet1 */ 
    275 #define SSB_SPROM4_CCODE                0x1052  /* Country Code (2 bytes) */ 
    276 #define SSB_SPROM4_ANTAVAIL             0x105D  /* Antenna available bitfields */ 
    277 #define SSB_SPROM4_ANTAVAIL_A           0x00FF  /* A-PHY bitfield */ 
    278 #define SSB_SPROM4_ANTAVAIL_A_SHIFT     0 
    279 #define SSB_SPROM4_ANTAVAIL_BG          0xFF00  /* B-PHY and G-PHY bitfield */ 
    280 #define SSB_SPROM4_ANTAVAIL_BG_SHIFT    8 
    281 #define SSB_SPROM4_BFLLO                0x1044  /* Boardflags (low 16 bits) */ 
    282 #define SSB_SPROM4_AGAIN01              0x105E  /* Antenna Gain (in dBm Q5.2) */ 
     286#define SSB_SPROM4_ANTAVAIL             0x005D  /* Antenna available bitfields */ 
     287#define  SSB_SPROM4_ANTAVAIL_A          0x00FF  /* A-PHY bitfield */ 
     288#define  SSB_SPROM4_ANTAVAIL_A_SHIFT    0 
     289#define  SSB_SPROM4_ANTAVAIL_BG         0xFF00  /* B-PHY and G-PHY bitfield */ 
     290#define  SSB_SPROM4_ANTAVAIL_BG_SHIFT   8 
     291#define SSB_SPROM4_AGAIN01              0x005E  /* Antenna Gain (in dBm Q5.2) */ 
    283292#define  SSB_SPROM4_AGAIN0              0x00FF  /* Antenna 0 */ 
    284293#define  SSB_SPROM4_AGAIN0_SHIFT        0 
    285294#define  SSB_SPROM4_AGAIN1              0xFF00  /* Antenna 1 */ 
    286295#define  SSB_SPROM4_AGAIN1_SHIFT        8 
    287 #define SSB_SPROM4_AGAIN23              0x1060 
     296#define SSB_SPROM4_AGAIN23              0x0060 
    288297#define  SSB_SPROM4_AGAIN2              0x00FF  /* Antenna 2 */ 
    289298#define  SSB_SPROM4_AGAIN2_SHIFT        0 
    290299#define  SSB_SPROM4_AGAIN3              0xFF00  /* Antenna 3 */ 
    291300#define  SSB_SPROM4_AGAIN3_SHIFT        8 
    292 #define SSB_SPROM4_BFLHI                0x1046  /* Board Flags Hi */ 
    293 #define SSB_SPROM4_MAXP_BG              0x1080  /* Max Power BG in path 1 */ 
     301#define SSB_SPROM4_MAXP_BG              0x0080  /* Max Power BG in path 1 */ 
    294302#define  SSB_SPROM4_MAXP_BG_MASK        0x00FF  /* Mask for Max Power BG */ 
    295303#define  SSB_SPROM4_ITSSI_BG            0xFF00  /* Mask for path 1 itssi_bg */ 
    296304#define  SSB_SPROM4_ITSSI_BG_SHIFT      8 
    297 #define SSB_SPROM4_MAXP_A               0x108A  /* Max Power A in path 1 */ 
     305#define SSB_SPROM4_MAXP_A               0x008A  /* Max Power A in path 1 */ 
    298306#define  SSB_SPROM4_MAXP_A_MASK         0x00FF  /* Mask for Max Power A */ 
    299307#define  SSB_SPROM4_ITSSI_A             0xFF00  /* Mask for path 1 itssi_a */ 
    300308#define  SSB_SPROM4_ITSSI_A_SHIFT       8 
    301 #define SSB_SPROM4_GPIOA                0x1056  /* Gen. Purpose IO # 0 and 1 */ 
    302 #define  SSB_SPROM4_GPIOA_P0            0x00FF  /* Pin 0 */ 
    303 #define  SSB_SPROM4_GPIOA_P1            0xFF00  /* Pin 1 */ 
    304 #define  SSB_SPROM4_GPIOA_P1_SHIFT      8 
    305 #define SSB_SPROM4_GPIOB                0x1058  /* Gen. Purpose IO # 2 and 3 */ 
    306 #define  SSB_SPROM4_GPIOB_P2            0x00FF  /* Pin 2 */ 
    307 #define  SSB_SPROM4_GPIOB_P3            0xFF00  /* Pin 3 */ 
    308 #define  SSB_SPROM4_GPIOB_P3_SHIFT      8 
    309 #define SSB_SPROM4_PA0B0                0x1082  /* The paXbY locations are */ 
    310 #define SSB_SPROM4_PA0B1                0x1084  /*   only guesses */ 
    311 #define SSB_SPROM4_PA0B2                0x1086 
    312 #define SSB_SPROM4_PA1B0                0x108E 
    313 #define SSB_SPROM4_PA1B1                0x1090 
    314 #define SSB_SPROM4_PA1B2                0x1092 
     309#define SSB_SPROM4_PA0B0                0x0082  /* The paXbY locations are */ 
     310#define SSB_SPROM4_PA0B1                0x0084  /*   only guesses */ 
     311#define SSB_SPROM4_PA0B2                0x0086 
     312#define SSB_SPROM4_PA1B0                0x008E 
     313#define SSB_SPROM4_PA1B1                0x0090 
     314#define SSB_SPROM4_PA1B2                0x0092 
    315315 
    316316/* SPROM Revision 5 (inherits most data from rev 4) */ 
    317 #define SSB_SPROM5_BFLLO                0x104A  /* Boardflags (low 16 bits) */ 
    318 #define SSB_SPROM5_BFLHI                0x104C  /* Board Flags Hi */ 
    319 #define SSB_SPROM5_IL0MAC               0x1052  /* 6 byte MAC address for a/b/g/n */ 
    320 #define SSB_SPROM5_CCODE                0x1044  /* Country Code (2 bytes) */ 
    321 #define SSB_SPROM5_GPIOA                0x1076  /* Gen. Purpose IO # 0 and 1 */ 
     317#define SSB_SPROM5_CCODE                0x0044  /* Country Code (2 bytes) */ 
     318#define SSB_SPROM5_BFLLO                0x004A  /* Boardflags (low 16 bits) */ 
     319#define SSB_SPROM5_BFLHI                0x004C  /* Board Flags Hi */ 
     320#define SSB_SPROM5_IL0MAC               0x0052  /* 6 byte MAC address for a/b/g/n */ 
     321#define SSB_SPROM5_GPIOA                0x0076  /* Gen. Purpose IO # 0 and 1 */ 
    322322#define  SSB_SPROM5_GPIOA_P0            0x00FF  /* Pin 0 */ 
    323323#define  SSB_SPROM5_GPIOA_P1            0xFF00  /* Pin 1 */ 
    324324#define  SSB_SPROM5_GPIOA_P1_SHIFT      8 
    325 #define SSB_SPROM5_GPIOB                0x1078  /* Gen. Purpose IO # 2 and 3 */ 
     325#define SSB_SPROM5_GPIOB                0x0078  /* Gen. Purpose IO # 2 and 3 */ 
    326326#define  SSB_SPROM5_GPIOB_P2            0x00FF  /* Pin 2 */ 
    327327#define  SSB_SPROM5_GPIOB_P3            0xFF00  /* Pin 3 */ 
    328328#define  SSB_SPROM5_GPIOB_P3_SHIFT      8 
    329329 
    330330/* SPROM Revision 8 */ 
    331 #define SSB_SPROM8_BOARDREV             0x1082  /* Board revision */ 
    332 #define SSB_SPROM8_BFLLO                0x1084  /* Board flags (bits 0-15) */ 
    333 #define SSB_SPROM8_BFLHI                0x1086  /* Board flags (bits 16-31) */ 
    334 #define SSB_SPROM8_BFL2LO               0x1088  /* Board flags (bits 32-47) */ 
    335 #define SSB_SPROM8_BFL2HI               0x108A  /* Board flags (bits 48-63) */ 
    336 #define SSB_SPROM8_IL0MAC               0x108C  /* 6 byte MAC address */ 
    337 #define SSB_SPROM8_CCODE                0x1092  /* 2 byte country code */ 
    338 #define SSB_SPROM8_ANTAVAIL             0x109C  /* Antenna available bitfields*/ 
    339 #define SSB_SPROM8_ANTAVAIL_A           0xFF00  /* A-PHY bitfield */ 
    340 #define SSB_SPROM8_ANTAVAIL_A_SHIFT     8 
    341 #define SSB_SPROM8_ANTAVAIL_BG          0x00FF  /* B-PHY and G-PHY bitfield */ 
    342 #define SSB_SPROM8_ANTAVAIL_BG_SHIFT    0 
    343 #define SSB_SPROM8_AGAIN01              0x109E  /* Antenna Gain (in dBm Q5.2) */ 
     331#define SSB_SPROM8_BOARDREV             0x0082  /* Board revision */ 
     332#define SSB_SPROM8_BFLLO                0x0084  /* Board flags (bits 0-15) */ 
     333#define SSB_SPROM8_BFLHI                0x0086  /* Board flags (bits 16-31) */ 
     334#define SSB_SPROM8_BFL2LO               0x0088  /* Board flags (bits 32-47) */ 
     335#define SSB_SPROM8_BFL2HI               0x008A  /* Board flags (bits 48-63) */ 
     336#define SSB_SPROM8_IL0MAC               0x008C  /* 6 byte MAC address */ 
     337#define SSB_SPROM8_CCODE                0x0092  /* 2 byte country code */ 
     338#define SSB_SPROM8_GPIOA                0x0096  /*Gen. Purpose IO # 0 and 1 */ 
     339#define  SSB_SPROM8_GPIOA_P0            0x00FF  /* Pin 0 */ 
     340#define  SSB_SPROM8_GPIOA_P1            0xFF00  /* Pin 1 */ 
     341#define  SSB_SPROM8_GPIOA_P1_SHIFT      8 
     342#define SSB_SPROM8_GPIOB                0x0098  /* Gen. Purpose IO # 2 and 3 */ 
     343#define  SSB_SPROM8_GPIOB_P2            0x00FF  /* Pin 2 */ 
     344#define  SSB_SPROM8_GPIOB_P3            0xFF00  /* Pin 3 */ 
     345#define  SSB_SPROM8_GPIOB_P3_SHIFT      8 
     346#define SSB_SPROM8_ANTAVAIL             0x009C  /* Antenna available bitfields*/ 
     347#define  SSB_SPROM8_ANTAVAIL_A          0xFF00  /* A-PHY bitfield */ 
     348#define  SSB_SPROM8_ANTAVAIL_A_SHIFT    8 
     349#define  SSB_SPROM8_ANTAVAIL_BG         0x00FF  /* B-PHY and G-PHY bitfield */ 
     350#define  SSB_SPROM8_ANTAVAIL_BG_SHIFT   0 
     351#define SSB_SPROM8_AGAIN01              0x009E  /* Antenna Gain (in dBm Q5.2) */ 
    344352#define  SSB_SPROM8_AGAIN0              0x00FF  /* Antenna 0 */ 
    345353#define  SSB_SPROM8_AGAIN0_SHIFT        0 
    346354#define  SSB_SPROM8_AGAIN1              0xFF00  /* Antenna 1 */ 
    347355#define  SSB_SPROM8_AGAIN1_SHIFT        8 
    348 #define SSB_SPROM8_AGAIN23              0x10A0 
     356#define SSB_SPROM8_AGAIN23              0x00A0 
    349357#define  SSB_SPROM8_AGAIN2              0x00FF  /* Antenna 2 */ 
    350358#define  SSB_SPROM8_AGAIN2_SHIFT        0 
    351359#define  SSB_SPROM8_AGAIN3              0xFF00  /* Antenna 3 */ 
    352360#define  SSB_SPROM8_AGAIN3_SHIFT        8 
    353 #define SSB_SPROM8_GPIOA                0x1096  /*Gen. Purpose IO # 0 and 1 */ 
    354 #define  SSB_SPROM8_GPIOA_P0            0x00FF  /* Pin 0 */ 
    355 #define  SSB_SPROM8_GPIOA_P1            0xFF00  /* Pin 1 */ 
    356 #define  SSB_SPROM8_GPIOA_P1_SHIFT      8 
    357 #define SSB_SPROM8_GPIOB                0x1098  /* Gen. Purpose IO # 2 and 3 */ 
    358 #define  SSB_SPROM8_GPIOB_P2            0x00FF  /* Pin 2 */ 
    359 #define  SSB_SPROM8_GPIOB_P3            0xFF00  /* Pin 3 */ 
    360 #define  SSB_SPROM8_GPIOB_P3_SHIFT      8 
    361 #define SSB_SPROM8_RSSIPARM2G           0x10A4  /* RSSI params for 2GHz */ 
     361#define SSB_SPROM8_RSSIPARM2G           0x00A4  /* RSSI params for 2GHz */ 
    362362#define  SSB_SPROM8_RSSISMF2G           0x000F 
    363363#define  SSB_SPROM8_RSSISMC2G           0x00F0 
    364364#define  SSB_SPROM8_RSSISMC2G_SHIFT     4 
     
    366366#define  SSB_SPROM8_RSSISAV2G_SHIFT     8 
    367367#define  SSB_SPROM8_BXA2G               0x1800 
    368368#define  SSB_SPROM8_BXA2G_SHIFT         11 
    369 #define SSB_SPROM8_RSSIPARM5G           0x10A6  /* RSSI params for 5GHz */ 
     369#define SSB_SPROM8_RSSIPARM5G           0x00A6  /* RSSI params for 5GHz */ 
    370370#define  SSB_SPROM8_RSSISMF5G           0x000F 
    371371#define  SSB_SPROM8_RSSISMC5G           0x00F0 
    372372#define  SSB_SPROM8_RSSISMC5G_SHIFT     4 
     
    374374#define  SSB_SPROM8_RSSISAV5G_SHIFT     8 
    375375#define  SSB_SPROM8_BXA5G               0x1800 
    376376#define  SSB_SPROM8_BXA5G_SHIFT         11 
    377 #define SSB_SPROM8_TRI25G               0x10A8  /* TX isolation 2.4&5.3GHz */ 
     377#define SSB_SPROM8_TRI25G               0x00A8  /* TX isolation 2.4&5.3GHz */ 
    378378#define  SSB_SPROM8_TRI2G               0x00FF  /* TX isolation 2.4GHz */ 
    379379#define  SSB_SPROM8_TRI5G               0xFF00  /* TX isolation 5.3GHz */ 
    380380#define  SSB_SPROM8_TRI5G_SHIFT         8 
    381 #define SSB_SPROM8_TRI5GHL              0x10AA  /* TX isolation 5.2/5.8GHz */ 
     381#define SSB_SPROM8_TRI5GHL              0x00AA  /* TX isolation 5.2/5.8GHz */ 
    382382#define  SSB_SPROM8_TRI5GL              0x00FF  /* TX isolation 5.2GHz */ 
    383383#define  SSB_SPROM8_TRI5GH              0xFF00  /* TX isolation 5.8GHz */ 
    384384#define  SSB_SPROM8_TRI5GH_SHIFT        8 
    385 #define SSB_SPROM8_RXPO                 0x10AC  /* RX power offsets */ 
     385#define SSB_SPROM8_RXPO                 0x00AC  /* RX power offsets */ 
    386386#define  SSB_SPROM8_RXPO2G              0x00FF  /* 2GHz RX power offset */ 
    387387#define  SSB_SPROM8_RXPO5G              0xFF00  /* 5GHz RX power offset */ 
    388388#define  SSB_SPROM8_RXPO5G_SHIFT        8 
    389 #define SSB_SPROM8_MAXP_BG              0x10C0  /* Max Power 2GHz in path 1 */ 
     389#define SSB_SPROM8_MAXP_BG              0x00C0  /* Max Power 2GHz in path 1 */ 
    390390#define  SSB_SPROM8_MAXP_BG_MASK        0x00FF  /* Mask for Max Power 2GHz */ 
    391391#define  SSB_SPROM8_ITSSI_BG            0xFF00  /* Mask for path 1 itssi_bg */ 
    392392#define  SSB_SPROM8_ITSSI_BG_SHIFT      8 
    393 #define SSB_SPROM8_PA0B0                0x10C2  /* 2GHz power amp settings */ 
    394 #define SSB_SPROM8_PA0B1                0x10C4 
    395 #define SSB_SPROM8_PA0B2                0x10C6 
    396 #define SSB_SPROM8_MAXP_A               0x10C8  /* Max Power 5.3GHz */ 
     393#define SSB_SPROM8_PA0B0                0x00C2  /* 2GHz power amp settings */ 
     394#define SSB_SPROM8_PA0B1                0x00C4 
     395#define SSB_SPROM8_PA0B2                0x00C6 
     396#define SSB_SPROM8_MAXP_A               0x00C8  /* Max Power 5.3GHz */ 
    397397#define  SSB_SPROM8_MAXP_A_MASK         0x00FF  /* Mask for Max Power 5.3GHz */ 
    398398#define  SSB_SPROM8_ITSSI_A             0xFF00  /* Mask for path 1 itssi_a */ 
    399399#define  SSB_SPROM8_ITSSI_A_SHIFT       8 
    400 #define SSB_SPROM8_MAXP_AHL             0x10CA  /* Max Power 5.2/5.8GHz */ 
     400#define SSB_SPROM8_MAXP_AHL             0x00CA  /* Max Power 5.2/5.8GHz */ 
    401401#define  SSB_SPROM8_MAXP_AH_MASK        0x00FF  /* Mask for Max Power 5.8GHz */ 
    402402#define  SSB_SPROM8_MAXP_AL_MASK        0xFF00  /* Mask for Max Power 5.2GHz */ 
    403403#define  SSB_SPROM8_MAXP_AL_SHIFT       8 
    404 #define SSB_SPROM8_PA1B0                0x10CC  /* 5.3GHz power amp settings */ 
    405 #define SSB_SPROM8_PA1B1                0x10CE 
    406 #define SSB_SPROM8_PA1B2                0x10D0 
    407 #define SSB_SPROM8_PA1LOB0              0x10D2  /* 5.2GHz power amp settings */ 
    408 #define SSB_SPROM8_PA1LOB1              0x10D4 
    409 #define SSB_SPROM8_PA1LOB2              0x10D6 
    410 #define SSB_SPROM8_PA1HIB0              0x10D8  /* 5.8GHz power amp settings */ 
    411 #define SSB_SPROM8_PA1HIB1              0x10DA 
    412 #define SSB_SPROM8_PA1HIB2              0x10DC 
    413 #define SSB_SPROM8_CCK2GPO              0x1140  /* CCK power offset */ 
    414 #define SSB_SPROM8_OFDM2GPO             0x1142  /* 2.4GHz OFDM power offset */ 
    415 #define SSB_SPROM8_OFDM5GPO             0x1146  /* 5.3GHz OFDM power offset */ 
    416 #define SSB_SPROM8_OFDM5GLPO            0x114A  /* 5.2GHz OFDM power offset */ 
    417 #define SSB_SPROM8_OFDM5GHPO            0x114E  /* 5.8GHz OFDM power offset */ 
     404#define SSB_SPROM8_PA1B0                0x00CC  /* 5.3GHz power amp settings */ 
     405#define SSB_SPROM8_PA1B1                0x00CE 
     406#define SSB_SPROM8_PA1B2                0x00D0 
     407#define SSB_SPROM8_PA1LOB0              0x00D2  /* 5.2GHz power amp settings */ 
     408#define SSB_SPROM8_PA1LOB1              0x00D4 
     409#define SSB_SPROM8_PA1LOB2              0x00D6 
     410#define SSB_SPROM8_PA1HIB0              0x00D8  /* 5.8GHz power amp settings */ 
     411#define SSB_SPROM8_PA1HIB1              0x00DA 
     412#define SSB_SPROM8_PA1HIB2              0x00DC 
     413#define SSB_SPROM8_CCK2GPO              0x0140  /* CCK power offset */ 
     414#define SSB_SPROM8_OFDM2GPO             0x0142  /* 2.4GHz OFDM power offset */ 
     415#define SSB_SPROM8_OFDM5GPO             0x0146  /* 5.3GHz OFDM power offset */ 
     416#define SSB_SPROM8_OFDM5GLPO            0x014A  /* 5.2GHz OFDM power offset */ 
     417#define SSB_SPROM8_OFDM5GHPO            0x014E  /* 5.8GHz OFDM power offset */ 
    418418 
    419419/* Values for SSB_SPROM1_BINF_CCODE */ 
    420420enum {