Changeset 22296


Ignore:
Timestamp:
2010-07-19T22:25:20+02:00 (6 years ago)
Author:
hauke
Message:

brcm47xx: prepare brcm47xx patches for sending to mainline.

Location:
trunk/target/linux
Files:
16 added
20 deleted
20 edited
2 copied
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/brcm47xx/patches-2.6.34/150-cpu_fixes.patch

    r21543 r22296  
    296296                protected_writeback_dcache_line(addr & ~(dc_lsize - 1)); 
    297297        if (!cpu_icache_snoops_remote_store && scache_size) 
    298 @@ -1298,6 +1312,17 @@ static void __cpuinit coherency_setup(vo 
     298@@ -1311,6 +1325,17 @@ static void __cpuinit coherency_setup(vo 
    299299         * silly idea of putting something else there ... 
    300300         */ 
     
    314314        case CPU_R4000SC: 
    315315        case CPU_R4000MC: 
    316 @@ -1354,6 +1379,15 @@ void __cpuinit r4k_cache_init(void) 
     316@@ -1367,6 +1392,15 @@ void __cpuinit r4k_cache_init(void) 
    317317                break; 
    318318        } 
     
    330330        setup_scache(); 
    331331  
    332 @@ -1412,5 +1446,13 @@ void __cpuinit r4k_cache_init(void) 
     332@@ -1425,5 +1459,13 @@ void __cpuinit r4k_cache_init(void) 
    333333 #if !defined(CONFIG_MIPS_CMP) 
    334334        local_r4k___flush_cache_all(NULL); 
  • trunk/target/linux/brcm47xx/patches-2.6.34/210-b44_phy_fix.patch

    r21108 r22296  
    11--- a/drivers/net/b44.c 
    22+++ b/drivers/net/b44.c 
    3 @@ -384,7 +384,7 @@ static void b44_set_flow_ctrl(struct b44 
     3@@ -381,11 +381,12 @@ static void b44_set_flow_ctrl(struct b44 
    44        __b44_set_flow_ctrl(bp, pause_enab); 
    55 } 
    66  
    77-#ifdef SSB_DRIVER_MIPS 
    8 +#ifdef CONFIG_SSB_DRIVER_MIPS 
    9  extern char *nvram_get(char *name); 
     8-extern char *nvram_get(char *name); 
     9+#ifdef CONFIG_BCM47XX 
     10+ 
     11+#include <asm/mach-bcm47xx/nvram.h> 
    1012 static void b44_wap54g10_workaround(struct b44 *bp) 
    1113 { 
    12 @@ -421,12 +421,45 @@ static inline void b44_wap54g10_workarou 
     14-       const char *str; 
     15+       char buf[20]; 
     16        u32 val; 
     17        int err; 
     18  
     19@@ -394,10 +395,9 @@ static void b44_wap54g10_workaround(stru 
     20         * see https://dev.openwrt.org/ticket/146 
     21         * check and reset bit "isolate" 
     22         */ 
     23-       str = nvram_get("boardnum"); 
     24-       if (!str) 
     25+       if (nvram_getenv("boardnum", buf, sizeof(buf)) > 0) 
     26                return; 
     27-       if (simple_strtoul(str, NULL, 0) == 2) { 
     28+       if (simple_strtoul(buf, NULL, 0) == 2) { 
     29                err = __b44_readphy(bp, 0, MII_BMCR, &val); 
     30                if (err) 
     31                        goto error; 
     32@@ -412,10 +412,43 @@ static void b44_wap54g10_workaround(stru 
     33 error: 
     34        pr_warning("PHY: cannot reset MII transceiver isolate bit\n"); 
    1335 } 
    14  #endif 
    15   
    16 +#ifdef CONFIG_SSB_DRIVER_MIPS 
     36+ 
    1737+static inline int startswith (const char *source, const char *cmp)  
    1838+{  
     
    2040+} 
    2141+ 
    22 +#define getvar(str) (nvram_get(str) ? : "") 
    23 + 
    2442+static inline void b44_bcm47xx_workarounds(struct b44 *bp) 
    2543+{ 
     44+       char buf[20]; 
    2645+       /* Toshiba WRC-1000, Siemens SE505 v1, Askey RT-210W, RT-220W */ 
    27 +       if (simple_strtoul(getvar("boardnum"), NULL, 0) == 100) { 
     46+       if (nvram_getenv("boardnum", buf, sizeof(buf)) > 0) 
     47+               return; 
     48+       if (simple_strtoul(buf, NULL, 0) == 100) { 
    2849+               bp->phy_addr = B44_PHY_ADDR_NO_PHY; 
    2950+       } else { 
    3051+               /* WL-HDD */ 
    3152+               struct ssb_device *sdev = bp->sdev; 
    32 +               if (startswith(getvar("hardware_version"), "WL300-"))  
    33 +               { 
     53+               if (nvram_getenv("hardware_version", buf, sizeof(buf)) > 0) 
     54+                       return; 
     55+               if (startswith(buf, "WL300-")) { 
    3456+                       if (sdev->bus->sprom.et0phyaddr == 0 && 
    3557+                           sdev->bus->sprom.et1phyaddr == 1) 
     
    4062+} 
    4163+ 
    42 +#else 
     64 #else 
     65+ 
     66 static inline void b44_wap54g10_workaround(struct b44 *bp) 
     67 { 
     68 } 
     69+ 
    4370+static inline void b44_bcm47xx_workarounds(struct b44 *bp)  
    4471+{  
    4572+} 
    46 +#endif 
    47 + 
     73 #endif 
     74  
    4875 static int b44_setup_phy(struct b44 *bp) 
    49  { 
    50         u32 val; 
     76@@ -424,6 +457,7 @@ static int b44_setup_phy(struct b44 *bp) 
    5177        int err; 
    5278  
     
    5682        if (bp->phy_addr == B44_PHY_ADDR_NO_PHY) 
    5783                return 0; 
    58 @@ -2089,6 +2122,8 @@ static int __devinit b44_get_invariants( 
     84@@ -2080,6 +2114,8 @@ static int __devinit b44_get_invariants( 
    5985         * valid PHY address. */ 
    6086        bp->phy_addr &= 0x1F; 
  • trunk/target/linux/brcm47xx/patches-2.6.34/211-b44_timeout_spam.patch

    r22116 r22296  
    11--- a/drivers/net/b44.c 
    22+++ b/drivers/net/b44.c 
    3 @@ -191,10 +190,11 @@ static int b44_wait_bit(struct b44 *bp,  
     3@@ -188,10 +188,11 @@ static int b44_wait_bit(struct b44 *bp,  
    44                udelay(10); 
    55        } 
  • trunk/target/linux/brcm47xx/patches-2.6.34/220-bcm5354.patch

    r21269 r22296  
    11--- a/drivers/ssb/driver_chipcommon.c 
    22+++ b/drivers/ssb/driver_chipcommon.c 
    3 @@ -260,6 +260,8 @@ void ssb_chipco_resume(struct ssb_chipco 
     3@@ -285,6 +285,8 @@ void ssb_chipco_resume(struct ssb_chipco 
    44 void ssb_chipco_get_clockcpu(struct ssb_chipcommon *cc, 
    55                              u32 *plltype, u32 *n, u32 *m) 
     
    1010        *plltype = (cc->capabilities & SSB_CHIPCO_CAP_PLLT); 
    1111        switch (*plltype) { 
    12 @@ -283,6 +285,8 @@ void ssb_chipco_get_clockcpu(struct ssb_ 
     12@@ -308,6 +310,8 @@ void ssb_chipco_get_clockcpu(struct ssb_ 
    1313 void ssb_chipco_get_clockcontrol(struct ssb_chipcommon *cc, 
    1414                                 u32 *plltype, u32 *n, u32 *m) 
     
    3232--- a/drivers/ssb/main.c 
    3333+++ b/drivers/ssb/main.c 
    34 @@ -1073,6 +1073,8 @@ u32 ssb_clockspeed(struct ssb_bus *bus) 
     34@@ -1075,6 +1075,8 @@ u32 ssb_clockspeed(struct ssb_bus *bus) 
    3535  
    3636        if (bus->chip_id == 0x5365) { 
  • trunk/target/linux/brcm47xx/patches-2.6.34/301-kmod-fuse-dcache-bug-r4k.patch

    r20888 r22296  
    1919 { 
    2020        struct flush_cache_page_args args; 
    21 @@ -1456,3 +1456,10 @@ void __cpuinit r4k_cache_init(void) 
     21@@ -1469,3 +1469,10 @@ void __cpuinit r4k_cache_init(void) 
    2222        coherency_setup(); 
    2323 #endif 
  • trunk/target/linux/brcm47xx/patches-2.6.34/400-arch-bcm47xx.patch

    r21430 r22296  
    1 --- a/arch/mips/Kconfig 
    2 +++ b/arch/mips/Kconfig 
    3 @@ -62,6 +62,7 @@ config BCM47XX 
    4         select SSB_DRIVER_MIPS 
    5         select SSB_DRIVER_EXTIF 
    6         select SSB_EMBEDDED 
    7 +       select SSB_B43_PCI_BRIDGE if PCI 
    8         select SSB_PCICORE_HOSTMODE if PCI 
    9         select GENERIC_GPIO 
    10         select SYS_HAS_EARLY_PRINTK 
    11 --- a/arch/mips/bcm47xx/Makefile 
    12 +++ b/arch/mips/bcm47xx/Makefile 
    13 @@ -3,4 +3,4 @@ 
    14  # under Linux. 
    15  # 
    16   
    17 -obj-y := gpio.o irq.o prom.o serial.o setup.o time.o wgt634u.o 
    18 +obj-y := cfe_env.o gpio.o irq.o nvram.o prom.o serial.o setup.o time.o wgt634u.o 
    19 --- a/arch/mips/bcm47xx/irq.c 
    20 +++ b/arch/mips/bcm47xx/irq.c 
    21 @@ -1,5 +1,6 @@ 
    22  /* 
    23   *  Copyright (C) 2004 Florian Schirmer <jolt@tuxbox.org> 
    24 + *  Copyright (C) 2008 Michael Buesch <mb@bu3sch.de> 
    25   * 
    26   *  This program is free software; you can redistribute  it and/or modify it 
    27   *  under  the terms of  the GNU General  Public License as published by the 
    28 @@ -23,10 +24,19 @@ 
    29   */ 
    30   
    31  #include <linux/types.h> 
    32 +#include <linux/errno.h> 
    33 +#include <linux/init.h> 
    34  #include <linux/interrupt.h> 
    35  #include <linux/irq.h> 
    36 +#include <linux/pci.h> 
    37 +#include <linux/ssb/ssb.h> 
    38 + 
    39  #include <asm/irq_cpu.h> 
    40   
    41 + 
    42 +extern struct ssb_bus ssb_bcm47xx; 
    43 + 
    44 + 
    45  void plat_irq_dispatch(void) 
    46  { 
    47         u32 cause; 
    481--- a/arch/mips/bcm47xx/nvram.c 
    492+++ b/arch/mips/bcm47xx/nvram.c 
    50 @@ -24,10 +24,10 @@ 
    51  #include <asm/io.h> 
    52  #include <asm/uaccess.h> 
    53   
    54 -#include <nvram.h> 
    55 +#include "include/nvram.h" 
    56   
    57  #define MB * 1048576 
    58 -extern struct ssb_bus ssb; 
    59 +extern struct ssb_bus ssb_bcm47xx; 
    60   
    61  static char nvram_buf[NVRAM_SPACE]; 
    62  static int cfe_env; 
    63 @@ -36,7 +36,7 @@ extern char *cfe_env_get(char *nv_buf, c 
    64  /* Probe for NVRAM header */ 
    65  static void __init early_nvram_init(void) 
    66  { 
    67 -       struct ssb_mipscore *mcore = &ssb.mipscore; 
    68 +       struct ssb_mipscore *mcore = &ssb_bcm47xx.mipscore; 
    69         struct nvram_header *header; 
    70         int i; 
    71         u32 base, lim, off; 
     3@@ -92,3 +92,30 @@ int nvram_getenv(char *name, char *val,  
     4        return 1; 
     5 } 
     6 EXPORT_SYMBOL(nvram_getenv); 
     7+ 
     8+char *nvram_get(const char *name) 
     9+{ 
     10+       char *var, *value, *end, *eq; 
     11+ 
     12+       if (!name) 
     13+               return NULL; 
     14+ 
     15+       if (!nvram_buf[0]) 
     16+               early_nvram_init(); 
     17+ 
     18+       /* Look for name=value and return value */ 
     19+       var = &nvram_buf[sizeof(struct nvram_header)]; 
     20+       end = nvram_buf + sizeof(nvram_buf) - 2; 
     21+       end[0] = end[1] = '\0'; 
     22+       for (; *var; var = value + strlen(value) + 1) { 
     23+               if (!(eq = strchr(var, '='))) 
     24+                       break; 
     25+               value = eq + 1; 
     26+               if ((eq - var) == strlen(name) && strncmp(var, name, (eq - var)) == 0) 
     27+                       return value; 
     28+       } 
     29+ 
     30+       return NULL; 
     31+} 
     32+ 
     33+EXPORT_SYMBOL(nvram_get); 
    7234--- a/arch/mips/bcm47xx/setup.c 
    7335+++ b/arch/mips/bcm47xx/setup.c 
    74 @@ -2,7 +2,7 @@ 
    75   *  Copyright (C) 2004 Florian Schirmer <jolt@tuxbox.org> 
    76   *  Copyright (C) 2005 Waldemar Brodkorb <wbx@openwrt.org> 
    77   *  Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org> 
    78 - *  Copyright (C) 2006 Michael Buesch <mb@bu3sch.de> 
    79 + *  Copyright (C) 2006-2008 Michael Buesch <mb@bu3sch.de> 
    80   * 
    81   *  This program is free software; you can redistribute  it and/or modify it 
    82   *  under  the terms of  the GNU General  Public License as published by the 
    83 @@ -25,18 +25,28 @@ 
    84   *  675 Mass Ave, Cambridge, MA 02139, USA. 
    85   */ 
    86   
    87 +#include <linux/init.h> 
    88  #include <linux/types.h> 
    89  #include <linux/ssb/ssb.h> 
    90  #include <linux/ssb/ssb_embedded.h> 
    91 +#include <linux/tty.h> 
    92 +#include <linux/serial.h> 
    93 +#include <linux/serial_core.h> 
    94 +#include <linux/serial_reg.h> 
    95 +#include <linux/serial_8250.h> 
    96  #include <asm/bootinfo.h> 
    97  #include <asm/reboot.h> 
    98  #include <asm/time.h> 
    99 -#include <bcm47xx.h> 
    100  #include <asm/fw/cfe/cfe_api.h> 
    101 +#include <linux/pm.h> 
    102 + 
    103 +#include "include/nvram.h" 
    104   
    105  struct ssb_bus ssb_bcm47xx; 
    106  EXPORT_SYMBOL(ssb_bcm47xx); 
    107   
    108 +extern void bcm47xx_pci_init(void); 
    109 + 
    110  static void bcm47xx_machine_restart(char *command) 
    111  { 
    112         printk(KERN_ALERT "Please stand by while rebooting the system...\n"); 
    113 @@ -56,7 +66,7 @@ static void bcm47xx_machine_halt(void) 
    114                 cpu_relax(); 
    115  } 
    116   
    117 -static void str2eaddr(char *str, char *dest) 
    118 +static void e_aton(char *str, char *dest) 
    119  { 
    120         int i = 0; 
    121   
    122 @@ -73,51 +83,142 @@ static void str2eaddr(char *str, char *d 
    123         } 
    124  } 
    125   
    126 -static int bcm47xx_get_invariants(struct ssb_bus *bus, 
    127 -                                  struct ssb_init_invariants *iv) 
    128 +static void bcm47xx_fill_sprom(struct ssb_sprom *sprom) 
    129 +{ 
    130 +       char *s; 
    131 + 
    132 +       memset(sprom, 0xFF, sizeof(struct ssb_sprom)); 
    133 + 
    134 +       sprom->revision = 1; 
    135 +       if ((s = nvram_get("il0macaddr"))) 
    136 +               e_aton(s, sprom->il0mac); 
    137 +       if ((s = nvram_get("et0macaddr"))) 
    138 +               e_aton(s, sprom->et0mac); 
    139 +       if ((s = nvram_get("et1macaddr"))) 
    140 +               e_aton(s, sprom->et1mac); 
    141 +       if ((s = nvram_get("et0phyaddr"))) 
    142 +               sprom->et0phyaddr = simple_strtoul(s, NULL, 0); 
    143 +       if ((s = nvram_get("et1phyaddr"))) 
    144 +               sprom->et1phyaddr = simple_strtoul(s, NULL, 0); 
    145 +       if ((s = nvram_get("et0mdcport"))) 
    146 +               sprom->et0mdcport = !!simple_strtoul(s, NULL, 10); 
    147 +       if ((s = nvram_get("et1mdcport"))) 
    148 +               sprom->et1mdcport = !!simple_strtoul(s, NULL, 10); 
    149 +       if ((s = nvram_get("pa0b0"))) 
    150 +               sprom->pa0b0 = simple_strtoul(s, NULL, 0); 
    151 +       if ((s = nvram_get("pa0b1"))) 
    152 +               sprom->pa0b1 = simple_strtoul(s, NULL, 0); 
    153 +       if ((s = nvram_get("pa0b2"))) 
    154 +               sprom->pa0b2 = simple_strtoul(s, NULL, 0); 
    155 +       if ((s = nvram_get("pa1b0"))) 
    156 +               sprom->pa1b0 = simple_strtoul(s, NULL, 0); 
    157 +       if ((s = nvram_get("pa1b1"))) 
    158 +               sprom->pa1b1 = simple_strtoul(s, NULL, 0); 
    159 +       if ((s = nvram_get("pa1b2"))) 
    160 +               sprom->pa1b2 = simple_strtoul(s, NULL, 0); 
    161 +       if ((s = nvram_get("wl0gpio0"))) 
    162 +               sprom->gpio0 = simple_strtoul(s, NULL, 0); 
    163 +       if ((s = nvram_get("wl0gpio1"))) 
    164 +               sprom->gpio1 = simple_strtoul(s, NULL, 0); 
    165 +       if ((s = nvram_get("wl0gpio2"))) 
    166 +               sprom->gpio2 = simple_strtoul(s, NULL, 0); 
    167 +       if ((s = nvram_get("wl0gpio3"))) 
    168 +               sprom->gpio3 = simple_strtoul(s, NULL, 0); 
    169 +       if ((s = nvram_get("pa0maxpwr"))) 
    170 +               sprom->maxpwr_bg = simple_strtoul(s, NULL, 0); 
    171 +       if ((s = nvram_get("pa1maxpwr"))) 
    172 +               sprom->maxpwr_a = simple_strtoul(s, NULL, 0); 
    173 +       if ((s = nvram_get("pa0itssit"))) 
    174 +               sprom->itssi_bg = simple_strtoul(s, NULL, 0); 
    175 +       if ((s = nvram_get("pa1itssit"))) 
    176 +               sprom->itssi_a = simple_strtoul(s, NULL, 0); 
    177 +       sprom->boardflags_lo = 0; 
    178 +       if ((s = nvram_get("boardflags"))) 
    179 +               sprom->boardflags_lo = simple_strtoul(s, NULL, 0); 
    180 +       sprom->boardflags_hi = 0; 
    181 +       if ((s = nvram_get("boardflags2"))) 
    182 +               sprom->boardflags_hi = simple_strtoul(s, NULL, 0); 
    183 +} 
    184 + 
    185 +static int bcm47xx_get_invariants(struct ssb_bus *bus, struct ssb_init_invariants *iv) 
    186  { 
    187 -       char buf[100]; 
    188 +       char *s; 
    189 + 
    190 +       iv->boardinfo.vendor = SSB_BOARDVENDOR_BCM; 
    191 +       if ((s = nvram_get("boardtype"))) 
    192 +               iv->boardinfo.type = (u16)simple_strtoul(s, NULL, 0); 
    193 +       if ((s = nvram_get("boardrev"))) 
    194 +               iv->boardinfo.rev = (u16)simple_strtoul(s, NULL, 0); 
    195   
    196 -       /* Fill boardinfo structure */ 
    197 -       memset(&(iv->boardinfo), 0 , sizeof(struct ssb_boardinfo)); 
    198 +       bcm47xx_fill_sprom(&iv->sprom); 
    199   
    200 -       if (cfe_getenv("boardvendor", buf, sizeof(buf)) >= 0) 
    201 -               iv->boardinfo.type = (u16)simple_strtoul(buf, NULL, 0); 
    202 -       if (cfe_getenv("boardtype", buf, sizeof(buf)) >= 0) 
    203 -               iv->boardinfo.type = (u16)simple_strtoul(buf, NULL, 0); 
    204 -       if (cfe_getenv("boardrev", buf, sizeof(buf)) >= 0) 
    205 -               iv->boardinfo.rev = (u16)simple_strtoul(buf, NULL, 0); 
    206 - 
    207 -       /* Fill sprom structure */ 
    208 -       memset(&(iv->sprom), 0, sizeof(struct ssb_sprom)); 
    209 -       iv->sprom.revision = 3; 
    210 - 
    211 -       if (cfe_getenv("et0macaddr", buf, sizeof(buf)) >= 0) 
    212 -               str2eaddr(buf, iv->sprom.et0mac); 
    213 -       if (cfe_getenv("et1macaddr", buf, sizeof(buf)) >= 0) 
    214 -               str2eaddr(buf, iv->sprom.et1mac); 
    215 -       if (cfe_getenv("et0phyaddr", buf, sizeof(buf)) >= 0) 
    216 -               iv->sprom.et0phyaddr = simple_strtoul(buf, NULL, 10); 
    217 -       if (cfe_getenv("et1phyaddr", buf, sizeof(buf)) >= 0) 
    218 -               iv->sprom.et1phyaddr = simple_strtoul(buf, NULL, 10); 
    219 -       if (cfe_getenv("et0mdcport", buf, sizeof(buf)) >= 0) 
    220 -               iv->sprom.et0mdcport = simple_strtoul(buf, NULL, 10); 
    221 -       if (cfe_getenv("et1mdcport", buf, sizeof(buf)) >= 0) 
    222 -               iv->sprom.et1mdcport = simple_strtoul(buf, NULL, 10); 
    223 +       if ((s = nvram_get("cardbus"))) 
    224 +               iv->has_cardbus_slot = !!simple_strtoul(s, NULL, 10); 
    225   
    226         return 0; 
    227  } 
    228   
    229  void __init plat_mem_setup(void) 
    230  { 
    231 -       int err; 
    232 +       int i, err; 
    233 +       char *s; 
    234 +       struct ssb_mipscore *mcore; 
    235 + 
    236 +       err = ssb_bus_ssbbus_register(&ssb_bcm47xx, SSB_ENUM_BASE, bcm47xx_get_invariants); 
    237 +       if (err) { 
    238 +               const char *msg = "Failed to initialize SSB bus (err %d)\n"; 
    239 +               printk(msg, err); /* Make sure the message gets out of the box. */ 
    240 +               panic(msg, err); 
    241 +       } 
    242 +       mcore = &ssb_bcm47xx.mipscore; 
    243   
    244 -       err = ssb_bus_ssbbus_register(&ssb_bcm47xx, SSB_ENUM_BASE, 
    245 -                                     bcm47xx_get_invariants); 
    246 -       if (err) 
    247 -               panic("Failed to initialize SSB bus (err %d)\n", err); 
    248 +       s = nvram_get("kernel_args"); 
    249 +       if (s && !strncmp(s, "console=ttyS1", 13)) { 
    250 +               struct ssb_serial_port port; 
    251 + 
    252 +               printk("Swapping serial ports!\n"); 
    253 +               /* swap serial ports */ 
    254 +               memcpy(&port, &mcore->serial_ports[0], sizeof(port)); 
    255 +               memcpy(&mcore->serial_ports[0], &mcore->serial_ports[1], sizeof(port)); 
    256 +               memcpy(&mcore->serial_ports[1], &port, sizeof(port)); 
    257 +       } 
    258 + 
    259 +       for (i = 0; i < mcore->nr_serial_ports; i++) { 
    260 +               struct ssb_serial_port *port = &(mcore->serial_ports[i]); 
    261 +               struct uart_port s; 
    262 + 
    263 +               memset(&s, 0, sizeof(s)); 
    264 +               s.line = i; 
    265 +               s.mapbase = (unsigned int) port->regs; 
    266 +               s.membase = port->regs; 
    267 +               s.irq = port->irq + 2; 
    268 +               s.uartclk = port->baud_base; 
    269 +               s.flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; 
    270 +               s.iotype = SERIAL_IO_MEM; 
    271 +               s.regshift = port->reg_shift; 
    272 + 
    273 +               early_serial_setup(&s); 
    274 +       } 
    275 +       printk("Serial init done.\n"); 
    276   
    277         _machine_restart = bcm47xx_machine_restart; 
     36@@ -226,3 +226,20 @@ void __init plat_mem_setup(void) 
    27837        _machine_halt = bcm47xx_machine_halt; 
    27938        pm_power_off = bcm47xx_machine_halt; 
     
    29655+} 
    29756+device_initcall(bcm47xx_register_gpiodev); 
    298 --- a/arch/mips/bcm47xx/time.c 
    299 +++ b/arch/mips/bcm47xx/time.c 
    300 @@ -22,11 +22,17 @@ 
    301   *  675 Mass Ave, Cambridge, MA 02139, USA. 
    302   */ 
    303   
    304 - 
    305  #include <linux/init.h> 
    306 +#include <linux/kernel.h> 
    307 +#include <linux/sched.h> 
    308 +#include <linux/serial_reg.h> 
    309 +#include <linux/interrupt.h> 
    310  #include <linux/ssb/ssb.h> 
    311 +#include <asm/addrspace.h> 
    312 +#include <asm/io.h> 
    313  #include <asm/time.h> 
    314 -#include <bcm47xx.h> 
    315 + 
    316 +extern struct ssb_bus ssb_bcm47xx; 
    317   
    318  void __init plat_time_init(void) 
    319  { 
  • trunk/target/linux/brcm47xx/patches-2.6.34/812-disable_wgt634u_crap.patch

    r20888 r22296  
    55 # 
    66  
    7 -obj-y := cfe_env.o gpio.o irq.o nvram.o prom.o serial.o setup.o time.o wgt634u.o 
    8 +obj-y := cfe_env.o gpio.o irq.o nvram.o prom.o serial.o setup.o time.o 
     7-obj-y := gpio.o irq.o nvram.o prom.o serial.o setup.o time.o wgt634u.o 
     8+obj-y := gpio.o irq.o nvram.o prom.o serial.o setup.o time.o 
    99--- a/arch/mips/bcm47xx/wgt634u.c 
    1010+++ /dev/null 
  • trunk/target/linux/brcm47xx/patches-2.6.34/940-bcm47xx-yenta.patch

    r20996 r22296  
    1818        mask = probe_irq_mask(val) & 0xffff; 
    1919  
    20 @@ -1022,6 +1025,10 @@ static void yenta_get_socket_capabilitie 
     20@@ -1023,6 +1026,10 @@ static void yenta_get_socket_capabilitie 
    2121        else 
    2222                socket->socket.irq_mask = 0; 
     
    2929                   "ISA IRQ mask 0x%04x, PCI irq %d\n", 
    3030                   socket->socket.irq_mask, socket->cb_irq); 
    31 @@ -1260,6 +1267,15 @@ static int __devinit yenta_probe(struct  
     31@@ -1261,6 +1268,15 @@ static int __devinit yenta_probe(struct  
    3232        dev_printk(KERN_INFO, &dev->dev, 
    3333                   "Socket status: %08x\n", cb_readl(socket, CB_SOCKET_STATE)); 
  • trunk/target/linux/brcm47xx/patches-2.6.34/999-wl_exports.patch

    r21793 r22296  
    11--- a/arch/mips/bcm47xx/nvram.c 
    22+++ b/arch/mips/bcm47xx/nvram.c 
    3 @@ -29,7 +29,9 @@ 
    4  #define MB * 1048576 
    5  extern struct ssb_bus ssb_bcm47xx; 
     3@@ -20,7 +20,8 @@ 
     4 #include <asm/mach-bcm47xx/nvram.h> 
     5 #include <asm/mach-bcm47xx/bcm47xx.h> 
    66  
    77-static char nvram_buf[NVRAM_SPACE]; 
    88+char nvram_buf[NVRAM_SPACE]; 
    99+EXPORT_SYMBOL(nvram_buf); 
    10 + 
    11  static int cfe_env; 
    12  extern char *cfe_env_get(char *nv_buf, const char *name); 
    13                  
     10  
     11 /* Probe for NVRAM header */ 
     12 static void __init early_nvram_init(void) 
    1413--- a/arch/mips/mm/cache.c 
    1514+++ b/arch/mips/mm/cache.c 
  • trunk/target/linux/brcm47xx/patches-2.6.35/150-cpu_fixes.patch

    r21707 r22296  
    296296                protected_writeback_dcache_line(addr & ~(dc_lsize - 1)); 
    297297        if (!cpu_icache_snoops_remote_store && scache_size) 
    298 @@ -1298,6 +1312,17 @@ static void __cpuinit coherency_setup(vo 
     298@@ -1311,6 +1325,17 @@ static void __cpuinit coherency_setup(vo 
    299299         * silly idea of putting something else there ... 
    300300         */ 
     
    314314        case CPU_R4000SC: 
    315315        case CPU_R4000MC: 
    316 @@ -1354,6 +1379,15 @@ void __cpuinit r4k_cache_init(void) 
     316@@ -1367,6 +1392,15 @@ void __cpuinit r4k_cache_init(void) 
    317317                break; 
    318318        } 
     
    330330        setup_scache(); 
    331331  
    332 @@ -1412,5 +1446,13 @@ void __cpuinit r4k_cache_init(void) 
     332@@ -1425,5 +1459,13 @@ void __cpuinit r4k_cache_init(void) 
    333333 #if !defined(CONFIG_MIPS_CMP) 
    334334        local_r4k___flush_cache_all(NULL); 
  • trunk/target/linux/brcm47xx/patches-2.6.35/210-b44_phy_fix.patch

    r21707 r22296  
    11--- a/drivers/net/b44.c 
    22+++ b/drivers/net/b44.c 
    3 @@ -384,7 +384,7 @@ static void b44_set_flow_ctrl(struct b44 
     3@@ -381,11 +381,12 @@ static void b44_set_flow_ctrl(struct b44 
    44        __b44_set_flow_ctrl(bp, pause_enab); 
    55 } 
    66  
    77-#ifdef SSB_DRIVER_MIPS 
    8 +#ifdef CONFIG_SSB_DRIVER_MIPS 
    9  extern char *nvram_get(char *name); 
     8-extern char *nvram_get(char *name); 
     9+#ifdef CONFIG_BCM47XX 
     10+ 
     11+#include <asm/mach-bcm47xx/nvram.h> 
    1012 static void b44_wap54g10_workaround(struct b44 *bp) 
    1113 { 
    12 @@ -421,12 +421,45 @@ static inline void b44_wap54g10_workarou 
     14-       const char *str; 
     15+       char buf[20]; 
     16        u32 val; 
     17        int err; 
     18  
     19@@ -394,10 +395,9 @@ static void b44_wap54g10_workaround(stru 
     20         * see https://dev.openwrt.org/ticket/146 
     21         * check and reset bit "isolate" 
     22         */ 
     23-       str = nvram_get("boardnum"); 
     24-       if (!str) 
     25+       if (nvram_getenv("boardnum", buf, sizeof(buf)) > 0) 
     26                return; 
     27-       if (simple_strtoul(str, NULL, 0) == 2) { 
     28+       if (simple_strtoul(buf, NULL, 0) == 2) { 
     29                err = __b44_readphy(bp, 0, MII_BMCR, &val); 
     30                if (err) 
     31                        goto error; 
     32@@ -412,10 +412,43 @@ static void b44_wap54g10_workaround(stru 
     33 error: 
     34        pr_warning("PHY: cannot reset MII transceiver isolate bit\n"); 
    1335 } 
    14  #endif 
    15   
    16 +#ifdef CONFIG_SSB_DRIVER_MIPS 
     36+ 
    1737+static inline int startswith (const char *source, const char *cmp)  
    1838+{  
     
    2040+} 
    2141+ 
    22 +#define getvar(str) (nvram_get(str) ? : "") 
    23 + 
    2442+static inline void b44_bcm47xx_workarounds(struct b44 *bp) 
    2543+{ 
     44+       char buf[20]; 
    2645+       /* Toshiba WRC-1000, Siemens SE505 v1, Askey RT-210W, RT-220W */ 
    27 +       if (simple_strtoul(getvar("boardnum"), NULL, 0) == 100) { 
     46+       if (nvram_getenv("boardnum", buf, sizeof(buf)) > 0) 
     47+               return; 
     48+       if (simple_strtoul(buf, NULL, 0) == 100) { 
    2849+               bp->phy_addr = B44_PHY_ADDR_NO_PHY; 
    2950+       } else { 
    3051+               /* WL-HDD */ 
    3152+               struct ssb_device *sdev = bp->sdev; 
    32 +               if (startswith(getvar("hardware_version"), "WL300-"))  
    33 +               { 
     53+               if (nvram_getenv("hardware_version", buf, sizeof(buf)) > 0) 
     54+                       return; 
     55+               if (startswith(buf, "WL300-")) { 
    3456+                       if (sdev->bus->sprom.et0phyaddr == 0 && 
    3557+                           sdev->bus->sprom.et1phyaddr == 1) 
     
    4062+} 
    4163+ 
    42 +#else 
     64 #else 
     65+ 
     66 static inline void b44_wap54g10_workaround(struct b44 *bp) 
     67 { 
     68 } 
     69+ 
    4370+static inline void b44_bcm47xx_workarounds(struct b44 *bp)  
    4471+{  
    4572+} 
    46 +#endif 
    47 + 
     73 #endif 
     74  
    4875 static int b44_setup_phy(struct b44 *bp) 
    49  { 
    50         u32 val; 
     76@@ -424,6 +457,7 @@ static int b44_setup_phy(struct b44 *bp) 
    5177        int err; 
    5278  
     
    5682        if (bp->phy_addr == B44_PHY_ADDR_NO_PHY) 
    5783                return 0; 
    58 @@ -2089,6 +2122,8 @@ static int __devinit b44_get_invariants( 
     84@@ -2080,6 +2114,8 @@ static int __devinit b44_get_invariants( 
    5985         * valid PHY address. */ 
    6086        bp->phy_addr &= 0x1F; 
  • trunk/target/linux/brcm47xx/patches-2.6.35/211-b44_timeout_spam.patch

    r22116 r22296  
    11--- a/drivers/net/b44.c 
    22+++ b/drivers/net/b44.c 
    3 @@ -191,10 +191,11 @@ static int b44_wait_bit(struct b44 *bp,  
     3@@ -188,10 +188,11 @@ static int b44_wait_bit(struct b44 *bp,  
    44                udelay(10); 
    55        } 
  • trunk/target/linux/brcm47xx/patches-2.6.35/220-bcm5354.patch

    r21707 r22296  
    11--- a/drivers/ssb/driver_chipcommon.c 
    22+++ b/drivers/ssb/driver_chipcommon.c 
    3 @@ -260,6 +260,8 @@ void ssb_chipco_resume(struct ssb_chipco 
     3@@ -285,6 +285,8 @@ void ssb_chipco_resume(struct ssb_chipco 
    44 void ssb_chipco_get_clockcpu(struct ssb_chipcommon *cc, 
    55                              u32 *plltype, u32 *n, u32 *m) 
     
    1010        *plltype = (cc->capabilities & SSB_CHIPCO_CAP_PLLT); 
    1111        switch (*plltype) { 
    12 @@ -283,6 +285,8 @@ void ssb_chipco_get_clockcpu(struct ssb_ 
     12@@ -308,6 +310,8 @@ void ssb_chipco_get_clockcpu(struct ssb_ 
    1313 void ssb_chipco_get_clockcontrol(struct ssb_chipcommon *cc, 
    1414                                 u32 *plltype, u32 *n, u32 *m) 
     
    3232--- a/drivers/ssb/main.c 
    3333+++ b/drivers/ssb/main.c 
    34 @@ -1073,6 +1073,8 @@ u32 ssb_clockspeed(struct ssb_bus *bus) 
     34@@ -1075,6 +1075,8 @@ u32 ssb_clockspeed(struct ssb_bus *bus) 
    3535  
    3636        if (bus->chip_id == 0x5365) { 
  • trunk/target/linux/brcm47xx/patches-2.6.35/301-kmod-fuse-dcache-bug-r4k.patch

    r21707 r22296  
    1919 { 
    2020        struct flush_cache_page_args args; 
    21 @@ -1456,3 +1456,10 @@ void __cpuinit r4k_cache_init(void) 
     21@@ -1469,3 +1469,10 @@ void __cpuinit r4k_cache_init(void) 
    2222        coherency_setup(); 
    2323 #endif 
  • trunk/target/linux/brcm47xx/patches-2.6.35/400-arch-bcm47xx.patch

    r21707 r22296  
    1 --- a/arch/mips/Kconfig 
    2 +++ b/arch/mips/Kconfig 
    3 @@ -62,6 +62,7 @@ config BCM47XX 
    4         select SSB_DRIVER_MIPS 
    5         select SSB_DRIVER_EXTIF 
    6         select SSB_EMBEDDED 
    7 +       select SSB_B43_PCI_BRIDGE if PCI 
    8         select SSB_PCICORE_HOSTMODE if PCI 
    9         select GENERIC_GPIO 
    10         select SYS_HAS_EARLY_PRINTK 
    11 --- a/arch/mips/bcm47xx/Makefile 
    12 +++ b/arch/mips/bcm47xx/Makefile 
    13 @@ -3,4 +3,4 @@ 
    14  # under Linux. 
    15  # 
    16   
    17 -obj-y := gpio.o irq.o prom.o serial.o setup.o time.o wgt634u.o 
    18 +obj-y := cfe_env.o gpio.o irq.o nvram.o prom.o serial.o setup.o time.o wgt634u.o 
    19 --- a/arch/mips/bcm47xx/irq.c 
    20 +++ b/arch/mips/bcm47xx/irq.c 
    21 @@ -1,5 +1,6 @@ 
    22  /* 
    23   *  Copyright (C) 2004 Florian Schirmer <jolt@tuxbox.org> 
    24 + *  Copyright (C) 2008 Michael Buesch <mb@bu3sch.de> 
    25   * 
    26   *  This program is free software; you can redistribute  it and/or modify it 
    27   *  under  the terms of  the GNU General  Public License as published by the 
    28 @@ -23,10 +24,19 @@ 
    29   */ 
    30   
    31  #include <linux/types.h> 
    32 +#include <linux/errno.h> 
    33 +#include <linux/init.h> 
    34  #include <linux/interrupt.h> 
    35  #include <linux/irq.h> 
    36 +#include <linux/pci.h> 
    37 +#include <linux/ssb/ssb.h> 
    38 + 
    39  #include <asm/irq_cpu.h> 
    40   
    41 + 
    42 +extern struct ssb_bus ssb_bcm47xx; 
    43 + 
    44 + 
    45  void plat_irq_dispatch(void) 
    46  { 
    47         u32 cause; 
    481--- a/arch/mips/bcm47xx/nvram.c 
    492+++ b/arch/mips/bcm47xx/nvram.c 
    50 @@ -24,10 +24,10 @@ 
    51  #include <asm/io.h> 
    52  #include <asm/uaccess.h> 
    53   
    54 -#include <nvram.h> 
    55 +#include "include/nvram.h" 
    56   
    57  #define MB * 1048576 
    58 -extern struct ssb_bus ssb; 
    59 +extern struct ssb_bus ssb_bcm47xx; 
    60   
    61  static char nvram_buf[NVRAM_SPACE]; 
    62  static int cfe_env; 
    63 @@ -36,7 +36,7 @@ extern char *cfe_env_get(char *nv_buf, c 
    64  /* Probe for NVRAM header */ 
    65  static void __init early_nvram_init(void) 
    66  { 
    67 -       struct ssb_mipscore *mcore = &ssb.mipscore; 
    68 +       struct ssb_mipscore *mcore = &ssb_bcm47xx.mipscore; 
    69         struct nvram_header *header; 
    70         int i; 
    71         u32 base, lim, off; 
     3@@ -92,3 +92,30 @@ int nvram_getenv(char *name, char *val,  
     4        return 1; 
     5 } 
     6 EXPORT_SYMBOL(nvram_getenv); 
     7+ 
     8+char *nvram_get(const char *name) 
     9+{ 
     10+       char *var, *value, *end, *eq; 
     11+ 
     12+       if (!name) 
     13+               return NULL; 
     14+ 
     15+       if (!nvram_buf[0]) 
     16+               early_nvram_init(); 
     17+ 
     18+       /* Look for name=value and return value */ 
     19+       var = &nvram_buf[sizeof(struct nvram_header)]; 
     20+       end = nvram_buf + sizeof(nvram_buf) - 2; 
     21+       end[0] = end[1] = '\0'; 
     22+       for (; *var; var = value + strlen(value) + 1) { 
     23+               if (!(eq = strchr(var, '='))) 
     24+                       break; 
     25+               value = eq + 1; 
     26+               if ((eq - var) == strlen(name) && strncmp(var, name, (eq - var)) == 0) 
     27+                       return value; 
     28+       } 
     29+ 
     30+       return NULL; 
     31+} 
     32+ 
     33+EXPORT_SYMBOL(nvram_get); 
    7234--- a/arch/mips/bcm47xx/setup.c 
    7335+++ b/arch/mips/bcm47xx/setup.c 
    74 @@ -2,7 +2,7 @@ 
    75   *  Copyright (C) 2004 Florian Schirmer <jolt@tuxbox.org> 
    76   *  Copyright (C) 2005 Waldemar Brodkorb <wbx@openwrt.org> 
    77   *  Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org> 
    78 - *  Copyright (C) 2006 Michael Buesch <mb@bu3sch.de> 
    79 + *  Copyright (C) 2006-2008 Michael Buesch <mb@bu3sch.de> 
    80   * 
    81   *  This program is free software; you can redistribute  it and/or modify it 
    82   *  under  the terms of  the GNU General  Public License as published by the 
    83 @@ -25,18 +25,28 @@ 
    84   *  675 Mass Ave, Cambridge, MA 02139, USA. 
    85   */ 
    86   
    87 +#include <linux/init.h> 
    88  #include <linux/types.h> 
    89  #include <linux/ssb/ssb.h> 
    90  #include <linux/ssb/ssb_embedded.h> 
    91 +#include <linux/tty.h> 
    92 +#include <linux/serial.h> 
    93 +#include <linux/serial_core.h> 
    94 +#include <linux/serial_reg.h> 
    95 +#include <linux/serial_8250.h> 
    96  #include <asm/bootinfo.h> 
    97  #include <asm/reboot.h> 
    98  #include <asm/time.h> 
    99 -#include <bcm47xx.h> 
    100  #include <asm/fw/cfe/cfe_api.h> 
    101 +#include <linux/pm.h> 
    102 + 
    103 +#include "include/nvram.h" 
    104   
    105  struct ssb_bus ssb_bcm47xx; 
    106  EXPORT_SYMBOL(ssb_bcm47xx); 
    107   
    108 +extern void bcm47xx_pci_init(void); 
    109 + 
    110  static void bcm47xx_machine_restart(char *command) 
    111  { 
    112         printk(KERN_ALERT "Please stand by while rebooting the system...\n"); 
    113 @@ -56,7 +66,7 @@ static void bcm47xx_machine_halt(void) 
    114                 cpu_relax(); 
    115  } 
    116   
    117 -static void str2eaddr(char *str, char *dest) 
    118 +static void e_aton(char *str, char *dest) 
    119  { 
    120         int i = 0; 
    121   
    122 @@ -73,51 +83,142 @@ static void str2eaddr(char *str, char *d 
    123         } 
    124  } 
    125   
    126 -static int bcm47xx_get_invariants(struct ssb_bus *bus, 
    127 -                                  struct ssb_init_invariants *iv) 
    128 +static void bcm47xx_fill_sprom(struct ssb_sprom *sprom) 
    129 +{ 
    130 +       char *s; 
    131 + 
    132 +       memset(sprom, 0xFF, sizeof(struct ssb_sprom)); 
    133 + 
    134 +       sprom->revision = 1; 
    135 +       if ((s = nvram_get("il0macaddr"))) 
    136 +               e_aton(s, sprom->il0mac); 
    137 +       if ((s = nvram_get("et0macaddr"))) 
    138 +               e_aton(s, sprom->et0mac); 
    139 +       if ((s = nvram_get("et1macaddr"))) 
    140 +               e_aton(s, sprom->et1mac); 
    141 +       if ((s = nvram_get("et0phyaddr"))) 
    142 +               sprom->et0phyaddr = simple_strtoul(s, NULL, 0); 
    143 +       if ((s = nvram_get("et1phyaddr"))) 
    144 +               sprom->et1phyaddr = simple_strtoul(s, NULL, 0); 
    145 +       if ((s = nvram_get("et0mdcport"))) 
    146 +               sprom->et0mdcport = !!simple_strtoul(s, NULL, 10); 
    147 +       if ((s = nvram_get("et1mdcport"))) 
    148 +               sprom->et1mdcport = !!simple_strtoul(s, NULL, 10); 
    149 +       if ((s = nvram_get("pa0b0"))) 
    150 +               sprom->pa0b0 = simple_strtoul(s, NULL, 0); 
    151 +       if ((s = nvram_get("pa0b1"))) 
    152 +               sprom->pa0b1 = simple_strtoul(s, NULL, 0); 
    153 +       if ((s = nvram_get("pa0b2"))) 
    154 +               sprom->pa0b2 = simple_strtoul(s, NULL, 0); 
    155 +       if ((s = nvram_get("pa1b0"))) 
    156 +               sprom->pa1b0 = simple_strtoul(s, NULL, 0); 
    157 +       if ((s = nvram_get("pa1b1"))) 
    158 +               sprom->pa1b1 = simple_strtoul(s, NULL, 0); 
    159 +       if ((s = nvram_get("pa1b2"))) 
    160 +               sprom->pa1b2 = simple_strtoul(s, NULL, 0); 
    161 +       if ((s = nvram_get("wl0gpio0"))) 
    162 +               sprom->gpio0 = simple_strtoul(s, NULL, 0); 
    163 +       if ((s = nvram_get("wl0gpio1"))) 
    164 +               sprom->gpio1 = simple_strtoul(s, NULL, 0); 
    165 +       if ((s = nvram_get("wl0gpio2"))) 
    166 +               sprom->gpio2 = simple_strtoul(s, NULL, 0); 
    167 +       if ((s = nvram_get("wl0gpio3"))) 
    168 +               sprom->gpio3 = simple_strtoul(s, NULL, 0); 
    169 +       if ((s = nvram_get("pa0maxpwr"))) 
    170 +               sprom->maxpwr_bg = simple_strtoul(s, NULL, 0); 
    171 +       if ((s = nvram_get("pa1maxpwr"))) 
    172 +               sprom->maxpwr_a = simple_strtoul(s, NULL, 0); 
    173 +       if ((s = nvram_get("pa0itssit"))) 
    174 +               sprom->itssi_bg = simple_strtoul(s, NULL, 0); 
    175 +       if ((s = nvram_get("pa1itssit"))) 
    176 +               sprom->itssi_a = simple_strtoul(s, NULL, 0); 
    177 +       sprom->boardflags_lo = 0; 
    178 +       if ((s = nvram_get("boardflags"))) 
    179 +               sprom->boardflags_lo = simple_strtoul(s, NULL, 0); 
    180 +       sprom->boardflags_hi = 0; 
    181 +       if ((s = nvram_get("boardflags2"))) 
    182 +               sprom->boardflags_hi = simple_strtoul(s, NULL, 0); 
    183 +} 
    184 + 
    185 +static int bcm47xx_get_invariants(struct ssb_bus *bus, struct ssb_init_invariants *iv) 
    186  { 
    187 -       char buf[100]; 
    188 +       char *s; 
    189 + 
    190 +       iv->boardinfo.vendor = SSB_BOARDVENDOR_BCM; 
    191 +       if ((s = nvram_get("boardtype"))) 
    192 +               iv->boardinfo.type = (u16)simple_strtoul(s, NULL, 0); 
    193 +       if ((s = nvram_get("boardrev"))) 
    194 +               iv->boardinfo.rev = (u16)simple_strtoul(s, NULL, 0); 
    195   
    196 -       /* Fill boardinfo structure */ 
    197 -       memset(&(iv->boardinfo), 0 , sizeof(struct ssb_boardinfo)); 
    198 +       bcm47xx_fill_sprom(&iv->sprom); 
    199   
    200 -       if (cfe_getenv("boardvendor", buf, sizeof(buf)) >= 0) 
    201 -               iv->boardinfo.type = (u16)simple_strtoul(buf, NULL, 0); 
    202 -       if (cfe_getenv("boardtype", buf, sizeof(buf)) >= 0) 
    203 -               iv->boardinfo.type = (u16)simple_strtoul(buf, NULL, 0); 
    204 -       if (cfe_getenv("boardrev", buf, sizeof(buf)) >= 0) 
    205 -               iv->boardinfo.rev = (u16)simple_strtoul(buf, NULL, 0); 
    206 - 
    207 -       /* Fill sprom structure */ 
    208 -       memset(&(iv->sprom), 0, sizeof(struct ssb_sprom)); 
    209 -       iv->sprom.revision = 3; 
    210 - 
    211 -       if (cfe_getenv("et0macaddr", buf, sizeof(buf)) >= 0) 
    212 -               str2eaddr(buf, iv->sprom.et0mac); 
    213 -       if (cfe_getenv("et1macaddr", buf, sizeof(buf)) >= 0) 
    214 -               str2eaddr(buf, iv->sprom.et1mac); 
    215 -       if (cfe_getenv("et0phyaddr", buf, sizeof(buf)) >= 0) 
    216 -               iv->sprom.et0phyaddr = simple_strtoul(buf, NULL, 10); 
    217 -       if (cfe_getenv("et1phyaddr", buf, sizeof(buf)) >= 0) 
    218 -               iv->sprom.et1phyaddr = simple_strtoul(buf, NULL, 10); 
    219 -       if (cfe_getenv("et0mdcport", buf, sizeof(buf)) >= 0) 
    220 -               iv->sprom.et0mdcport = simple_strtoul(buf, NULL, 10); 
    221 -       if (cfe_getenv("et1mdcport", buf, sizeof(buf)) >= 0) 
    222 -               iv->sprom.et1mdcport = simple_strtoul(buf, NULL, 10); 
    223 +       if ((s = nvram_get("cardbus"))) 
    224 +               iv->has_cardbus_slot = !!simple_strtoul(s, NULL, 10); 
    225   
    226         return 0; 
    227  } 
    228   
    229  void __init plat_mem_setup(void) 
    230  { 
    231 -       int err; 
    232 +       int i, err; 
    233 +       char *s; 
    234 +       struct ssb_mipscore *mcore; 
    235 + 
    236 +       err = ssb_bus_ssbbus_register(&ssb_bcm47xx, SSB_ENUM_BASE, bcm47xx_get_invariants); 
    237 +       if (err) { 
    238 +               const char *msg = "Failed to initialize SSB bus (err %d)\n"; 
    239 +               printk(msg, err); /* Make sure the message gets out of the box. */ 
    240 +               panic(msg, err); 
    241 +       } 
    242 +       mcore = &ssb_bcm47xx.mipscore; 
    243   
    244 -       err = ssb_bus_ssbbus_register(&ssb_bcm47xx, SSB_ENUM_BASE, 
    245 -                                     bcm47xx_get_invariants); 
    246 -       if (err) 
    247 -               panic("Failed to initialize SSB bus (err %d)\n", err); 
    248 +       s = nvram_get("kernel_args"); 
    249 +       if (s && !strncmp(s, "console=ttyS1", 13)) { 
    250 +               struct ssb_serial_port port; 
    251 + 
    252 +               printk("Swapping serial ports!\n"); 
    253 +               /* swap serial ports */ 
    254 +               memcpy(&port, &mcore->serial_ports[0], sizeof(port)); 
    255 +               memcpy(&mcore->serial_ports[0], &mcore->serial_ports[1], sizeof(port)); 
    256 +               memcpy(&mcore->serial_ports[1], &port, sizeof(port)); 
    257 +       } 
    258 + 
    259 +       for (i = 0; i < mcore->nr_serial_ports; i++) { 
    260 +               struct ssb_serial_port *port = &(mcore->serial_ports[i]); 
    261 +               struct uart_port s; 
    262 + 
    263 +               memset(&s, 0, sizeof(s)); 
    264 +               s.line = i; 
    265 +               s.mapbase = (unsigned int) port->regs; 
    266 +               s.membase = port->regs; 
    267 +               s.irq = port->irq + 2; 
    268 +               s.uartclk = port->baud_base; 
    269 +               s.flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; 
    270 +               s.iotype = SERIAL_IO_MEM; 
    271 +               s.regshift = port->reg_shift; 
    272 + 
    273 +               early_serial_setup(&s); 
    274 +       } 
    275 +       printk("Serial init done.\n"); 
    276   
    277         _machine_restart = bcm47xx_machine_restart; 
     36@@ -226,3 +226,20 @@ void __init plat_mem_setup(void) 
    27837        _machine_halt = bcm47xx_machine_halt; 
    27938        pm_power_off = bcm47xx_machine_halt; 
     
    29655+} 
    29756+device_initcall(bcm47xx_register_gpiodev); 
    298 --- a/arch/mips/bcm47xx/time.c 
    299 +++ b/arch/mips/bcm47xx/time.c 
    300 @@ -22,11 +22,17 @@ 
    301   *  675 Mass Ave, Cambridge, MA 02139, USA. 
    302   */ 
    303   
    304 - 
    305  #include <linux/init.h> 
    306 +#include <linux/kernel.h> 
    307 +#include <linux/sched.h> 
    308 +#include <linux/serial_reg.h> 
    309 +#include <linux/interrupt.h> 
    310  #include <linux/ssb/ssb.h> 
    311 +#include <asm/addrspace.h> 
    312 +#include <asm/io.h> 
    313  #include <asm/time.h> 
    314 -#include <bcm47xx.h> 
    315 + 
    316 +extern struct ssb_bus ssb_bcm47xx; 
    317   
    318  void __init plat_time_init(void) 
    319  { 
  • trunk/target/linux/brcm47xx/patches-2.6.35/700-ssb-gigabit-ethernet-driver.patch

    r21707 r22296  
    99 #include <net/checksum.h> 
    1010 #include <net/ip.h> 
    11 @@ -471,8 +472,9 @@ static void _tw32_flush(struct tg3 *tp,  
     11@@ -494,8 +495,9 @@ static void _tw32_flush(struct tg3 *tp,  
    1212 static inline void tw32_mailbox_flush(struct tg3 *tp, u32 off, u32 val) 
    1313 { 
     
    2121 } 
    2222  
    23 @@ -482,7 +484,7 @@ static void tg3_write32_tx_mbox(struct t 
     23@@ -505,7 +507,7 @@ static void tg3_write32_tx_mbox(struct t 
    2424        writel(val, mbox); 
    2525        if (tp->tg3_flags & TG3_FLAG_TXD_MBOX_HWBUG) 
     
    3030 } 
    3131  
    32 @@ -783,7 +785,7 @@ static void tg3_switch_clocks(struct tg3 
     32@@ -807,7 +809,7 @@ static void tg3_switch_clocks(struct tg3 
    3333  
    3434 #define PHY_BUSY_LOOPS 5000 
     
    3939        u32 frame_val; 
    4040        unsigned int loops; 
    41 @@ -797,7 +799,7 @@ static int tg3_readphy(struct tg3 *tp, i 
     41@@ -821,7 +823,7 @@ static int tg3_readphy(struct tg3 *tp, i 
    4242  
    4343        *val = 0x0; 
     
    4848        frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) & 
    4949                      MI_COM_REG_ADDR_MASK); 
    50 @@ -832,7 +834,12 @@ static int tg3_readphy(struct tg3 *tp, i 
     50@@ -856,7 +858,12 @@ static int tg3_readphy(struct tg3 *tp, i 
    5151        return ret; 
    5252 } 
     
    6262        u32 frame_val; 
    6363        unsigned int loops; 
    64 @@ -848,7 +855,7 @@ static int tg3_writephy(struct tg3 *tp,  
     64@@ -872,7 +879,7 @@ static int tg3_writephy(struct tg3 *tp,  
    6565                udelay(80); 
    6666        } 
     
    7171        frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) & 
    7272                      MI_COM_REG_ADDR_MASK); 
    73 @@ -881,6 +888,11 @@ static int tg3_writephy(struct tg3 *tp,  
     73@@ -905,6 +912,11 @@ static int tg3_writephy(struct tg3 *tp,  
    7474        return ret; 
    7575 } 
     
    8383 { 
    8484        u32 phy_control; 
    85 @@ -2389,6 +2401,9 @@ static int tg3_nvram_read(struct tg3 *tp 
     85@@ -2411,6 +2423,9 @@ static int tg3_nvram_read(struct tg3 *tp 
    8686 { 
    8787        int ret; 
     
    9393                return tg3_nvram_read_using_eeprom(tp, offset, val); 
    9494  
    95 @@ -2720,8 +2735,10 @@ static int tg3_set_power_state(struct tg 
     95@@ -2742,8 +2757,10 @@ static int tg3_set_power_state(struct tg 
    9696        tg3_frob_aux_power(tp); 
    9797  
     
    106106  
    107107                val &= ~((1 << 16) | (1 << 4) | (1 << 2) | (1 << 1) | 1); 
    108 @@ -3214,6 +3231,14 @@ relink: 
     108@@ -3236,6 +3253,14 @@ relink: 
    109109  
    110110                tg3_phy_copper_begin(tp); 
     
    121121                if (!tg3_readphy(tp, MII_BMSR, &tmp) && 
    122122                    (tmp & BMSR_LSTATUS)) 
    123 @@ -6675,6 +6700,11 @@ static int tg3_poll_fw(struct tg3 *tp) 
     123@@ -6719,6 +6744,11 @@ static int tg3_poll_fw(struct tg3 *tp) 
    124124        int i; 
    125125        u32 val; 
     
    133133                /* Wait up to 20ms for init done. */ 
    134134                for (i = 0; i < 200; i++) { 
    135 @@ -6958,6 +6988,14 @@ static int tg3_chip_reset(struct tg3 *tp 
     135@@ -7002,6 +7032,14 @@ static int tg3_chip_reset(struct tg3 *tp 
    136136                tw32(0x5000, 0x400); 
    137137        } 
     
    148148  
    149149        if (tp->pci_chip_rev_id == CHIPREV_ID_5705_A0) { 
    150 @@ -7135,9 +7173,12 @@ static int tg3_halt_cpu(struct tg3 *tp,  
     150@@ -7179,9 +7217,12 @@ static int tg3_halt_cpu(struct tg3 *tp,  
    151151                return -ENODEV; 
    152152        } 
     
    164164 } 
    165165  
    166 @@ -7199,6 +7240,11 @@ static int tg3_load_5701_a0_firmware_fix 
     166@@ -7244,6 +7285,11 @@ static int tg3_load_5701_a0_firmware_fix 
    167167        const __be32 *fw_data; 
    168168        int err, i; 
     
    176176  
    177177        /* Firmware blob starts with version numbers, followed by 
    178 @@ -7256,6 +7302,11 @@ static int tg3_load_tso_firmware(struct  
     178@@ -7302,6 +7348,11 @@ static int tg3_load_tso_firmware(struct  
    179179        unsigned long cpu_base, cpu_scratch_base, cpu_scratch_size; 
    180180        int err, i; 
     
    188188                return 0; 
    189189  
    190 @@ -8380,6 +8431,11 @@ static void tg3_timer(unsigned long __op 
     190@@ -8446,6 +8497,11 @@ static void tg3_timer(unsigned long __op 
    191191  
    192192        spin_lock(&tp->lock); 
     
    200200                /* All of this garbage is because when using non-tagged 
    201201                 * IRQ status the mailbox/status_block protocol the chip 
    202 @@ -10279,6 +10335,11 @@ static int tg3_test_nvram(struct tg3 *tp 
     202@@ -10113,6 +10169,11 @@ static int tg3_test_nvram(struct tg3 *tp 
    203203        if (tp->tg3_flags3 & TG3_FLG3_NO_NVRAM) 
    204204                return 0; 
     
    212212                return -EIO; 
    213213  
    214 @@ -11098,7 +11159,7 @@ static int tg3_ioctl(struct net_device * 
     214@@ -10932,7 +10993,7 @@ static int tg3_ioctl(struct net_device * 
    215215                        return -EAGAIN; 
    216216  
     
    221221  
    222222                data->val_out = mii_regval; 
    223 @@ -11114,7 +11175,7 @@ static int tg3_ioctl(struct net_device * 
     223@@ -10948,7 +11009,7 @@ static int tg3_ioctl(struct net_device * 
    224224                        return -EAGAIN; 
    225225  
     
    230230  
    231231                return err; 
    232 @@ -11759,6 +11820,12 @@ static void __devinit tg3_get_5717_nvram 
     232@@ -11593,6 +11654,12 @@ static void __devinit tg3_get_5717_nvram 
    233233 /* Chips other than 5700/5701 use the NVRAM for fetching info. */ 
    234234 static void __devinit tg3_nvram_init(struct tg3 *tp) 
     
    243243             (EEPROM_ADDR_FSM_RESET | 
    244244              (EEPROM_DEFAULT_CLOCK_PERIOD << 
    245 @@ -12020,6 +12087,9 @@ static int tg3_nvram_write_block(struct  
     245@@ -11855,6 +11922,9 @@ static int tg3_nvram_write_block(struct  
    246246 { 
    247247        int ret; 
     
    253253                tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl & 
    254254                       ~GRC_LCLCTRL_GPIO_OUTPUT1); 
    255 @@ -13360,6 +13430,11 @@ static int __devinit tg3_get_invariants( 
     255@@ -13227,6 +13297,11 @@ static int __devinit tg3_get_invariants( 
    256256              GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701))) 
    257257                tp->tg3_flags |= TG3_FLAG_SRAM_USE_CONFIG; 
     
    265265         * In particular, the TG3_FLG2_IS_NIC flag must be 
    266266         * determined before calling tg3_set_power_state() so that 
    267 @@ -13753,6 +13828,10 @@ static int __devinit tg3_get_device_addr 
     267@@ -13624,6 +13699,10 @@ static int __devinit tg3_get_device_addr 
    268268        } 
    269269  
     
    276276                if (!tg3_get_default_macaddr_sparc(tp)) 
    277277                        return 0; 
    278 @@ -14272,6 +14351,7 @@ static char * __devinit tg3_phy_string(s 
     278@@ -14144,6 +14223,7 @@ static char * __devinit tg3_phy_string(s 
    279279        case TG3_PHY_ID_BCM5704:        return "5704"; 
    280280        case TG3_PHY_ID_BCM5705:        return "5705"; 
     
    284284        case TG3_PHY_ID_BCM5714:        return "5714"; 
    285285        case TG3_PHY_ID_BCM5780:        return "5780"; 
    286 @@ -14481,6 +14561,13 @@ static int __devinit tg3_init_one(struct 
     286@@ -14354,6 +14434,13 @@ static int __devinit tg3_init_one(struct 
    287287                tp->msg_enable = tg3_debug; 
    288288        else 
     
    310310 #define NIC_SRAM_RX_MINI_BUFFER_DESC   0x00001000 
    311311  
    312 @@ -2930,6 +2933,7 @@ struct tg3 { 
     312@@ -2931,6 +2934,7 @@ struct tg3 { 
    313313 #define TG3_PHY_ID_BCM5704             0x60008190 
    314314 #define TG3_PHY_ID_BCM5705             0x600081a0 
     
    318318 #define TG3_PHY_ID_BCM5714             0x60008340 
    319319 #define TG3_PHY_ID_BCM5780             0x60008350 
    320 @@ -2964,7 +2968,8 @@ struct tg3 { 
     320@@ -2965,7 +2969,8 @@ struct tg3 { 
    321321         (X) == TG3_PHY_ID_BCM5755 || (X) == TG3_PHY_ID_BCM5756 || \ 
    322322         (X) == TG3_PHY_ID_BCM5906 || (X) == TG3_PHY_ID_BCM5761 || \ 
  • trunk/target/linux/brcm47xx/patches-2.6.35/812-disable_wgt634u_crap.patch

    r21707 r22296  
    55 # 
    66  
    7 -obj-y := cfe_env.o gpio.o irq.o nvram.o prom.o serial.o setup.o time.o wgt634u.o 
    8 +obj-y := cfe_env.o gpio.o irq.o nvram.o prom.o serial.o setup.o time.o 
     7-obj-y := gpio.o irq.o nvram.o prom.o serial.o setup.o time.o wgt634u.o 
     8+obj-y := gpio.o irq.o nvram.o prom.o serial.o setup.o time.o 
    99--- a/arch/mips/bcm47xx/wgt634u.c 
    1010+++ /dev/null 
  • trunk/target/linux/brcm47xx/patches-2.6.35/940-bcm47xx-yenta.patch

    r21707 r22296  
    11--- a/drivers/pcmcia/yenta_socket.c 
    22+++ b/drivers/pcmcia/yenta_socket.c 
    3 @@ -924,6 +924,8 @@ static unsigned int yenta_probe_irq(stru 
     3@@ -922,6 +922,8 @@ static unsigned int yenta_probe_irq(stru 
    44         * Probe for usable interrupts using the force 
    55         * register to generate bogus card status events. 
     
    1010        cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK); 
    1111        reg = exca_readb(socket, I365_CSCINT); 
    12 @@ -939,6 +941,7 @@ static unsigned int yenta_probe_irq(stru 
     12@@ -937,6 +939,7 @@ static unsigned int yenta_probe_irq(stru 
    1313        } 
    1414        cb_writel(socket, CB_SOCKET_MASK, 0); 
     
    1818        mask = probe_irq_mask(val) & 0xffff; 
    1919  
    20 @@ -1022,6 +1025,10 @@ static void yenta_get_socket_capabilitie 
     20@@ -1021,6 +1024,10 @@ static void yenta_get_socket_capabilitie 
    2121        else 
    2222                socket->socket.irq_mask = 0; 
     
    2929                   "ISA IRQ mask 0x%04x, PCI irq %d\n", 
    3030                   socket->socket.irq_mask, socket->cb_irq); 
    31 @@ -1260,6 +1267,15 @@ static int __devinit yenta_probe(struct  
     31@@ -1259,6 +1266,15 @@ static int __devinit yenta_probe(struct  
    3232        dev_printk(KERN_INFO, &dev->dev, 
    3333                   "Socket status: %08x\n", cb_readl(socket, CB_SOCKET_STATE)); 
  • trunk/target/linux/brcm47xx/patches-2.6.35/999-wl_exports.patch

    r21793 r22296  
    11--- a/arch/mips/bcm47xx/nvram.c 
    22+++ b/arch/mips/bcm47xx/nvram.c 
    3 @@ -29,7 +29,9 @@ 
    4  #define MB * 1048576 
    5  extern struct ssb_bus ssb_bcm47xx; 
     3@@ -20,7 +20,8 @@ 
     4 #include <asm/mach-bcm47xx/nvram.h> 
     5 #include <asm/mach-bcm47xx/bcm47xx.h> 
    66  
    77-static char nvram_buf[NVRAM_SPACE]; 
    88+char nvram_buf[NVRAM_SPACE]; 
    99+EXPORT_SYMBOL(nvram_buf); 
    10 + 
    11  static int cfe_env; 
    12  extern char *cfe_env_get(char *nv_buf, const char *name); 
    13                  
     10  
     11 /* Probe for NVRAM header */ 
     12 static void __init early_nvram_init(void) 
    1413--- a/arch/mips/mm/cache.c 
    1514+++ b/arch/mips/mm/cache.c 
  • trunk/target/linux/generic/patches-2.6.34/975-ssb_update.patch

    r21952 r22296  
     1--- a/drivers/net/b44.c 
     2+++ b/drivers/net/b44.c 
     3@@ -135,7 +135,6 @@ static void b44_init_rings(struct b44 *) 
     4  
     5 static void b44_init_hw(struct b44 *, int); 
     6  
     7-static int dma_desc_align_mask; 
     8 static int dma_desc_sync_size; 
     9 static int instance; 
     10  
     11@@ -150,9 +149,8 @@ static inline void b44_sync_dma_desc_for 
     12                                                unsigned long offset, 
     13                                                enum dma_data_direction dir) 
     14 { 
     15-       ssb_dma_sync_single_range_for_device(sdev, dma_base, 
     16-                                            offset & dma_desc_align_mask, 
     17-                                            dma_desc_sync_size, dir); 
     18+       dma_sync_single_for_device(sdev->dma_dev, dma_base + offset, 
     19+                                  dma_desc_sync_size, dir); 
     20 } 
     21  
     22 static inline void b44_sync_dma_desc_for_cpu(struct ssb_device *sdev, 
     23@@ -160,9 +158,8 @@ static inline void b44_sync_dma_desc_for 
     24                                             unsigned long offset, 
     25                                             enum dma_data_direction dir) 
     26 { 
     27-       ssb_dma_sync_single_range_for_cpu(sdev, dma_base, 
     28-                                         offset & dma_desc_align_mask, 
     29-                                         dma_desc_sync_size, dir); 
     30+       dma_sync_single_for_cpu(sdev->dma_dev, dma_base + offset, 
     31+                               dma_desc_sync_size, dir); 
     32 } 
     33  
     34 static inline unsigned long br32(const struct b44 *bp, unsigned long reg) 
     35@@ -608,10 +605,10 @@ static void b44_tx(struct b44 *bp) 
     36  
     37                BUG_ON(skb == NULL); 
     38  
     39-               ssb_dma_unmap_single(bp->sdev, 
     40-                                    rp->mapping, 
     41-                                    skb->len, 
     42-                                    DMA_TO_DEVICE); 
     43+               dma_unmap_single(bp->sdev->dma_dev, 
     44+                                rp->mapping, 
     45+                                skb->len, 
     46+                                DMA_TO_DEVICE); 
     47                rp->skb = NULL; 
     48                dev_kfree_skb_irq(skb); 
     49        } 
     50@@ -648,29 +645,29 @@ static int b44_alloc_rx_skb(struct b44 * 
     51        if (skb == NULL) 
     52                return -ENOMEM; 
     53  
     54-       mapping = ssb_dma_map_single(bp->sdev, skb->data, 
     55-                                    RX_PKT_BUF_SZ, 
     56-                                    DMA_FROM_DEVICE); 
     57+       mapping = dma_map_single(bp->sdev->dma_dev, skb->data, 
     58+                                RX_PKT_BUF_SZ, 
     59+                                DMA_FROM_DEVICE); 
     60  
     61        /* Hardware bug work-around, the chip is unable to do PCI DMA 
     62           to/from anything above 1GB :-( */ 
     63-       if (ssb_dma_mapping_error(bp->sdev, mapping) || 
     64+       if (dma_mapping_error(bp->sdev->dma_dev, mapping) || 
     65                mapping + RX_PKT_BUF_SZ > DMA_BIT_MASK(30)) { 
     66                /* Sigh... */ 
     67-               if (!ssb_dma_mapping_error(bp->sdev, mapping)) 
     68-                       ssb_dma_unmap_single(bp->sdev, mapping, 
     69+               if (!dma_mapping_error(bp->sdev->dma_dev, mapping)) 
     70+                       dma_unmap_single(bp->sdev->dma_dev, mapping, 
     71                                             RX_PKT_BUF_SZ, DMA_FROM_DEVICE); 
     72                dev_kfree_skb_any(skb); 
     73                skb = __netdev_alloc_skb(bp->dev, RX_PKT_BUF_SZ, GFP_ATOMIC|GFP_DMA); 
     74                if (skb == NULL) 
     75                        return -ENOMEM; 
     76-               mapping = ssb_dma_map_single(bp->sdev, skb->data, 
     77-                                            RX_PKT_BUF_SZ, 
     78-                                            DMA_FROM_DEVICE); 
     79-               if (ssb_dma_mapping_error(bp->sdev, mapping) || 
     80-                       mapping + RX_PKT_BUF_SZ > DMA_BIT_MASK(30)) { 
     81-                       if (!ssb_dma_mapping_error(bp->sdev, mapping)) 
     82-                               ssb_dma_unmap_single(bp->sdev, mapping, RX_PKT_BUF_SZ,DMA_FROM_DEVICE); 
     83+               mapping = dma_map_single(bp->sdev->dma_dev, skb->data, 
     84+                                        RX_PKT_BUF_SZ, 
     85+                                        DMA_FROM_DEVICE); 
     86+               if (dma_mapping_error(bp->sdev->dma_dev, mapping) || 
     87+                   mapping + RX_PKT_BUF_SZ > DMA_BIT_MASK(30)) { 
     88+                       if (!dma_mapping_error(bp->sdev->dma_dev, mapping)) 
     89+                               dma_unmap_single(bp->sdev->dma_dev, mapping, RX_PKT_BUF_SZ,DMA_FROM_DEVICE); 
     90                        dev_kfree_skb_any(skb); 
     91                        return -ENOMEM; 
     92                } 
     93@@ -745,9 +742,9 @@ static void b44_recycle_rx(struct b44 *b 
     94                                             dest_idx * sizeof(*dest_desc), 
     95                                             DMA_BIDIRECTIONAL); 
     96  
     97-       ssb_dma_sync_single_for_device(bp->sdev, dest_map->mapping, 
     98-                                      RX_PKT_BUF_SZ, 
     99-                                      DMA_FROM_DEVICE); 
     100+       dma_sync_single_for_device(bp->sdev->dma_dev, dest_map->mapping, 
     101+                                  RX_PKT_BUF_SZ, 
     102+                                  DMA_FROM_DEVICE); 
     103 } 
     104  
     105 static int b44_rx(struct b44 *bp, int budget) 
     106@@ -767,9 +764,9 @@ static int b44_rx(struct b44 *bp, int bu 
     107                struct rx_header *rh; 
     108                u16 len; 
     109  
     110-               ssb_dma_sync_single_for_cpu(bp->sdev, map, 
     111-                                           RX_PKT_BUF_SZ, 
     112-                                           DMA_FROM_DEVICE); 
     113+               dma_sync_single_for_cpu(bp->sdev->dma_dev, map, 
     114+                                       RX_PKT_BUF_SZ, 
     115+                                       DMA_FROM_DEVICE); 
     116                rh = (struct rx_header *) skb->data; 
     117                len = le16_to_cpu(rh->len); 
     118                if ((len > (RX_PKT_BUF_SZ - RX_PKT_OFFSET)) || 
     119@@ -801,8 +798,8 @@ static int b44_rx(struct b44 *bp, int bu 
     120                        skb_size = b44_alloc_rx_skb(bp, cons, bp->rx_prod); 
     121                        if (skb_size < 0) 
     122                                goto drop_it; 
     123-                       ssb_dma_unmap_single(bp->sdev, map, 
     124-                                            skb_size, DMA_FROM_DEVICE); 
     125+                       dma_unmap_single(bp->sdev->dma_dev, map, 
     126+                                        skb_size, DMA_FROM_DEVICE); 
     127                        /* Leave out rx_header */ 
     128                        skb_put(skb, len + RX_PKT_OFFSET); 
     129                        skb_pull(skb, RX_PKT_OFFSET); 
     130@@ -954,24 +951,24 @@ static netdev_tx_t b44_start_xmit(struct 
     131                goto err_out; 
     132        } 
     133  
     134-       mapping = ssb_dma_map_single(bp->sdev, skb->data, len, DMA_TO_DEVICE); 
     135-       if (ssb_dma_mapping_error(bp->sdev, mapping) || mapping + len > DMA_BIT_MASK(30)) { 
     136+       mapping = dma_map_single(bp->sdev->dma_dev, skb->data, len, DMA_TO_DEVICE); 
     137+       if (dma_mapping_error(bp->sdev->dma_dev, mapping) || mapping + len > DMA_BIT_MASK(30)) { 
     138                struct sk_buff *bounce_skb; 
     139  
     140                /* Chip can't handle DMA to/from >1GB, use bounce buffer */ 
     141-               if (!ssb_dma_mapping_error(bp->sdev, mapping)) 
     142-                       ssb_dma_unmap_single(bp->sdev, mapping, len, 
     143+               if (!dma_mapping_error(bp->sdev->dma_dev, mapping)) 
     144+                       dma_unmap_single(bp->sdev->dma_dev, mapping, len, 
     145                                             DMA_TO_DEVICE); 
     146  
     147                bounce_skb = __netdev_alloc_skb(dev, len, GFP_ATOMIC | GFP_DMA); 
     148                if (!bounce_skb) 
     149                        goto err_out; 
     150  
     151-               mapping = ssb_dma_map_single(bp->sdev, bounce_skb->data, 
     152-                                            len, DMA_TO_DEVICE); 
     153-               if (ssb_dma_mapping_error(bp->sdev, mapping) || mapping + len > DMA_BIT_MASK(30)) { 
     154-                       if (!ssb_dma_mapping_error(bp->sdev, mapping)) 
     155-                               ssb_dma_unmap_single(bp->sdev, mapping, 
     156+               mapping = dma_map_single(bp->sdev->dma_dev, bounce_skb->data, 
     157+                                        len, DMA_TO_DEVICE); 
     158+               if (dma_mapping_error(bp->sdev->dma_dev, mapping) || mapping + len > DMA_BIT_MASK(30)) { 
     159+                       if (!dma_mapping_error(bp->sdev->dma_dev, mapping)) 
     160+                               dma_unmap_single(bp->sdev->dma_dev, mapping, 
     161                                                     len, DMA_TO_DEVICE); 
     162                        dev_kfree_skb_any(bounce_skb); 
     163                        goto err_out; 
     164@@ -1014,8 +1011,6 @@ static netdev_tx_t b44_start_xmit(struct 
     165        if (TX_BUFFS_AVAIL(bp) < 1) 
     166                netif_stop_queue(dev); 
     167  
     168-       dev->trans_start = jiffies; 
     169- 
     170 out_unlock: 
     171        spin_unlock_irqrestore(&bp->lock, flags); 
     172  
     173@@ -1070,8 +1065,8 @@ static void b44_free_rings(struct b44 *b 
     174  
     175                if (rp->skb == NULL) 
     176                        continue; 
     177-               ssb_dma_unmap_single(bp->sdev, rp->mapping, RX_PKT_BUF_SZ, 
     178-                                    DMA_FROM_DEVICE); 
     179+               dma_unmap_single(bp->sdev->dma_dev, rp->mapping, RX_PKT_BUF_SZ, 
     180+                                DMA_FROM_DEVICE); 
     181                dev_kfree_skb_any(rp->skb); 
     182                rp->skb = NULL; 
     183        } 
     184@@ -1082,8 +1077,8 @@ static void b44_free_rings(struct b44 *b 
     185  
     186                if (rp->skb == NULL) 
     187                        continue; 
     188-               ssb_dma_unmap_single(bp->sdev, rp->mapping, rp->skb->len, 
     189-                                    DMA_TO_DEVICE); 
     190+               dma_unmap_single(bp->sdev->dma_dev, rp->mapping, rp->skb->len, 
     191+                                DMA_TO_DEVICE); 
     192                dev_kfree_skb_any(rp->skb); 
     193                rp->skb = NULL; 
     194        } 
     195@@ -1105,14 +1100,12 @@ static void b44_init_rings(struct b44 *b 
     196        memset(bp->tx_ring, 0, B44_TX_RING_BYTES); 
     197  
     198        if (bp->flags & B44_FLAG_RX_RING_HACK) 
     199-               ssb_dma_sync_single_for_device(bp->sdev, bp->rx_ring_dma, 
     200-                                              DMA_TABLE_BYTES, 
     201-                                              DMA_BIDIRECTIONAL); 
     202+               dma_sync_single_for_device(bp->sdev->dma_dev, bp->rx_ring_dma, 
     203+                                          DMA_TABLE_BYTES, DMA_BIDIRECTIONAL); 
     204  
     205        if (bp->flags & B44_FLAG_TX_RING_HACK) 
     206-               ssb_dma_sync_single_for_device(bp->sdev, bp->tx_ring_dma, 
     207-                                              DMA_TABLE_BYTES, 
     208-                                              DMA_TO_DEVICE); 
     209+               dma_sync_single_for_device(bp->sdev->dma_dev, bp->tx_ring_dma, 
     210+                                          DMA_TABLE_BYTES, DMA_TO_DEVICE); 
     211  
     212        for (i = 0; i < bp->rx_pending; i++) { 
     213                if (b44_alloc_rx_skb(bp, -1, i) < 0) 
     214@@ -1132,27 +1125,23 @@ static void b44_free_consistent(struct b 
     215        bp->tx_buffers = NULL; 
     216        if (bp->rx_ring) { 
     217                if (bp->flags & B44_FLAG_RX_RING_HACK) { 
     218-                       ssb_dma_unmap_single(bp->sdev, bp->rx_ring_dma, 
     219-                                            DMA_TABLE_BYTES, 
     220-                                            DMA_BIDIRECTIONAL); 
     221+                       dma_unmap_single(bp->sdev->dma_dev, bp->rx_ring_dma, 
     222+                                        DMA_TABLE_BYTES, DMA_BIDIRECTIONAL); 
     223                        kfree(bp->rx_ring); 
     224                } else 
     225-                       ssb_dma_free_consistent(bp->sdev, DMA_TABLE_BYTES, 
     226-                                               bp->rx_ring, bp->rx_ring_dma, 
     227-                                               GFP_KERNEL); 
     228+                       dma_free_coherent(bp->sdev->dma_dev, DMA_TABLE_BYTES, 
     229+                                         bp->rx_ring, bp->rx_ring_dma); 
     230                bp->rx_ring = NULL; 
     231                bp->flags &= ~B44_FLAG_RX_RING_HACK; 
     232        } 
     233        if (bp->tx_ring) { 
     234                if (bp->flags & B44_FLAG_TX_RING_HACK) { 
     235-                       ssb_dma_unmap_single(bp->sdev, bp->tx_ring_dma, 
     236-                                            DMA_TABLE_BYTES, 
     237-                                            DMA_TO_DEVICE); 
     238+                       dma_unmap_single(bp->sdev->dma_dev, bp->tx_ring_dma, 
     239+                                        DMA_TABLE_BYTES, DMA_TO_DEVICE); 
     240                        kfree(bp->tx_ring); 
     241                } else 
     242-                       ssb_dma_free_consistent(bp->sdev, DMA_TABLE_BYTES, 
     243-                                               bp->tx_ring, bp->tx_ring_dma, 
     244-                                               GFP_KERNEL); 
     245+                       dma_free_coherent(bp->sdev->dma_dev, DMA_TABLE_BYTES, 
     246+                                         bp->tx_ring, bp->tx_ring_dma); 
     247                bp->tx_ring = NULL; 
     248                bp->flags &= ~B44_FLAG_TX_RING_HACK; 
     249        } 
     250@@ -1177,7 +1166,8 @@ static int b44_alloc_consistent(struct b 
     251                goto out_err; 
     252  
     253        size = DMA_TABLE_BYTES; 
     254-       bp->rx_ring = ssb_dma_alloc_consistent(bp->sdev, size, &bp->rx_ring_dma, gfp); 
     255+       bp->rx_ring = dma_alloc_coherent(bp->sdev->dma_dev, size, 
     256+                                        &bp->rx_ring_dma, gfp); 
     257        if (!bp->rx_ring) { 
     258                /* Allocation may have failed due to pci_alloc_consistent 
     259                   insisting on use of GFP_DMA, which is more restrictive 
     260@@ -1189,11 +1179,11 @@ static int b44_alloc_consistent(struct b 
     261                if (!rx_ring) 
     262                        goto out_err; 
     263  
     264-               rx_ring_dma = ssb_dma_map_single(bp->sdev, rx_ring, 
     265-                                                DMA_TABLE_BYTES, 
     266-                                                DMA_BIDIRECTIONAL); 
     267+               rx_ring_dma = dma_map_single(bp->sdev->dma_dev, rx_ring, 
     268+                                            DMA_TABLE_BYTES, 
     269+                                            DMA_BIDIRECTIONAL); 
     270  
     271-               if (ssb_dma_mapping_error(bp->sdev, rx_ring_dma) || 
     272+               if (dma_mapping_error(bp->sdev->dma_dev, rx_ring_dma) || 
     273                        rx_ring_dma + size > DMA_BIT_MASK(30)) { 
     274                        kfree(rx_ring); 
     275                        goto out_err; 
     276@@ -1204,7 +1194,8 @@ static int b44_alloc_consistent(struct b 
     277                bp->flags |= B44_FLAG_RX_RING_HACK; 
     278        } 
     279  
     280-       bp->tx_ring = ssb_dma_alloc_consistent(bp->sdev, size, &bp->tx_ring_dma, gfp); 
     281+       bp->tx_ring = dma_alloc_coherent(bp->sdev->dma_dev, size, 
     282+                                        &bp->tx_ring_dma, gfp); 
     283        if (!bp->tx_ring) { 
     284                /* Allocation may have failed due to ssb_dma_alloc_consistent 
     285                   insisting on use of GFP_DMA, which is more restrictive 
     286@@ -1216,11 +1207,11 @@ static int b44_alloc_consistent(struct b 
     287                if (!tx_ring) 
     288                        goto out_err; 
     289  
     290-               tx_ring_dma = ssb_dma_map_single(bp->sdev, tx_ring, 
     291-                                           DMA_TABLE_BYTES, 
     292-                                           DMA_TO_DEVICE); 
     293+               tx_ring_dma = dma_map_single(bp->sdev->dma_dev, tx_ring, 
     294+                                            DMA_TABLE_BYTES, 
     295+                                            DMA_TO_DEVICE); 
     296  
     297-               if (ssb_dma_mapping_error(bp->sdev, tx_ring_dma) || 
     298+               if (dma_mapping_error(bp->sdev->dma_dev, tx_ring_dma) || 
     299                        tx_ring_dma + size > DMA_BIT_MASK(30)) { 
     300                        kfree(tx_ring); 
     301                        goto out_err; 
     302@@ -2178,12 +2169,14 @@ static int __devinit b44_init_one(struct 
     303                        "Failed to powerup the bus\n"); 
     304                goto err_out_free_dev; 
     305        } 
     306-       err = ssb_dma_set_mask(sdev, DMA_BIT_MASK(30)); 
     307-       if (err) { 
     308+ 
     309+       if (dma_set_mask(sdev->dma_dev, DMA_BIT_MASK(30)) || 
     310+           dma_set_coherent_mask(sdev->dma_dev, DMA_BIT_MASK(30))) { 
     311                dev_err(sdev->dev, 
     312                        "Required 30BIT DMA mask unsupported by the system\n"); 
     313                goto err_out_powerdown; 
     314        } 
     315+ 
     316        err = b44_get_invariants(bp); 
     317        if (err) { 
     318                dev_err(sdev->dev, 
     319@@ -2346,7 +2339,6 @@ static int __init b44_init(void) 
     320        int err; 
     321  
     322        /* Setup paramaters for syncing RX/TX DMA descriptors */ 
     323-       dma_desc_align_mask = ~(dma_desc_align_size - 1); 
     324        dma_desc_sync_size = max_t(unsigned int, dma_desc_align_size, sizeof(struct dma_desc)); 
     325  
     326        err = b44_pci_init(); 
    1327--- a/drivers/ssb/driver_chipcommon.c 
    2328+++ b/drivers/ssb/driver_chipcommon.c 
    3 @@ -233,6 +233,8 @@ void ssb_chipcommon_init(struct ssb_chip 
     329@@ -209,6 +209,24 @@ static void chipco_powercontrol_init(str 
     330        } 
     331 } 
     332  
     333+/* http://bcm-v4.sipsolutions.net/802.11/PmuFastPwrupDelay */ 
     334+static u16 pmu_fast_powerup_delay(struct ssb_chipcommon *cc) 
     335+{ 
     336+       struct ssb_bus *bus = cc->dev->bus; 
     337+ 
     338+       switch (bus->chip_id) { 
     339+       case 0x4312: 
     340+       case 0x4322: 
     341+       case 0x4328: 
     342+               return 7000; 
     343+       case 0x4325: 
     344+               /* TODO: */ 
     345+       default: 
     346+               return 15000; 
     347+       } 
     348+} 
     349+ 
     350+/* http://bcm-v4.sipsolutions.net/802.11/ClkctlFastPwrupDelay */ 
     351 static void calc_fast_powerup_delay(struct ssb_chipcommon *cc) 
     352 { 
     353        struct ssb_bus *bus = cc->dev->bus; 
     354@@ -218,6 +236,12 @@ static void calc_fast_powerup_delay(stru 
     355  
     356        if (bus->bustype != SSB_BUSTYPE_PCI) 
     357                return; 
     358+ 
     359+       if (cc->capabilities & SSB_CHIPCO_CAP_PMU) { 
     360+               cc->fast_pwrup_delay = pmu_fast_powerup_delay(cc); 
     361+               return; 
     362+       } 
     363+ 
     364        if (!(cc->capabilities & SSB_CHIPCO_CAP_PCTL)) 
     365                return; 
     366  
     367@@ -233,6 +257,9 @@ void ssb_chipcommon_init(struct ssb_chip 
    4368 { 
    5369        if (!cc->dev) 
     
    7371+       if (cc->dev->id.revision >= 11) 
    8372+               cc->status = chipco_read32(cc, SSB_CHIPCO_CHIPSTAT); 
     373+       ssb_dprintk(KERN_INFO PFX "chipcommon status is 0x%x\n", cc->status); 
    9374        ssb_pmu_init(cc); 
    10375        chipco_powercontrol_init(cc); 
    11376        ssb_chipco_set_clockmode(cc, SSB_CLKMODE_FAST); 
    12 @@ -370,6 +372,7 @@ u32 ssb_chipco_gpio_control(struct ssb_c 
     377@@ -370,6 +397,7 @@ u32 ssb_chipco_gpio_control(struct ssb_c 
    13378 { 
    14379        return chipco_write32_masked(cc, SSB_CHIPCO_GPIOCTL, mask, value); 
     
    18383 u32 ssb_chipco_gpio_intmask(struct ssb_chipcommon *cc, u32 mask, u32 value) 
    19384 { 
     385--- a/drivers/ssb/driver_chipcommon_pmu.c 
     386+++ b/drivers/ssb/driver_chipcommon_pmu.c 
     387@@ -502,9 +502,9 @@ static void ssb_pmu_resources_init(struc 
     388                chipco_write32(cc, SSB_CHIPCO_PMU_MAXRES_MSK, max_msk); 
     389 } 
     390  
     391+/* http://bcm-v4.sipsolutions.net/802.11/SSB/PmuInit */ 
     392 void ssb_pmu_init(struct ssb_chipcommon *cc) 
     393 { 
     394-       struct ssb_bus *bus = cc->dev->bus; 
     395        u32 pmucap; 
     396  
     397        if (!(cc->capabilities & SSB_CHIPCO_CAP_PMU)) 
     398@@ -516,15 +516,12 @@ void ssb_pmu_init(struct ssb_chipcommon  
     399        ssb_dprintk(KERN_DEBUG PFX "Found rev %u PMU (capabilities 0x%08X)\n", 
     400                    cc->pmu.rev, pmucap); 
     401  
     402-       if (cc->pmu.rev >= 1) { 
     403-               if ((bus->chip_id == 0x4325) && (bus->chip_rev < 2)) { 
     404-                       chipco_mask32(cc, SSB_CHIPCO_PMU_CTL, 
     405-                                     ~SSB_CHIPCO_PMU_CTL_NOILPONW); 
     406-               } else { 
     407-                       chipco_set32(cc, SSB_CHIPCO_PMU_CTL, 
     408-                                    SSB_CHIPCO_PMU_CTL_NOILPONW); 
     409-               } 
     410-       } 
     411+       if (cc->pmu.rev == 1) 
     412+               chipco_mask32(cc, SSB_CHIPCO_PMU_CTL, 
     413+                             ~SSB_CHIPCO_PMU_CTL_NOILPONW); 
     414+       else 
     415+               chipco_set32(cc, SSB_CHIPCO_PMU_CTL, 
     416+                            SSB_CHIPCO_PMU_CTL_NOILPONW); 
     417        ssb_pmu_pll_init(cc); 
     418        ssb_pmu_resources_init(cc); 
     419 } 
    20420--- a/drivers/ssb/main.c 
    21421+++ b/drivers/ssb/main.c 
    22 @@ -834,6 +834,9 @@ int ssb_bus_pcibus_register(struct ssb_b 
     422@@ -486,11 +486,12 @@ static int ssb_devices_register(struct s 
     423 #ifdef CONFIG_SSB_PCIHOST 
     424                        sdev->irq = bus->host_pci->irq; 
     425                        dev->parent = &bus->host_pci->dev; 
     426+                       sdev->dma_dev = dev->parent; 
     427 #endif 
     428                        break; 
     429                case SSB_BUSTYPE_PCMCIA: 
     430 #ifdef CONFIG_SSB_PCMCIAHOST 
     431-                       sdev->irq = bus->host_pcmcia->irq.AssignedIRQ; 
     432+                       sdev->irq = bus->host_pcmcia->irq; 
     433                        dev->parent = &bus->host_pcmcia->dev; 
     434 #endif 
     435                        break; 
     436@@ -501,6 +502,7 @@ static int ssb_devices_register(struct s 
     437                        break; 
     438                case SSB_BUSTYPE_SSB: 
     439                        dev->dma_mask = &dev->coherent_dma_mask; 
     440+                       sdev->dma_dev = dev; 
     441                        break; 
     442                } 
     443  
     444@@ -834,6 +836,9 @@ int ssb_bus_pcibus_register(struct ssb_b 
    23445        if (!err) { 
    24446                ssb_printk(KERN_INFO PFX "Sonics Silicon Backplane found on " 
     
    30452  
    31453        return err; 
     454@@ -1223,80 +1228,6 @@ u32 ssb_dma_translation(struct ssb_devic 
     455 } 
     456 EXPORT_SYMBOL(ssb_dma_translation); 
     457  
     458-int ssb_dma_set_mask(struct ssb_device *dev, u64 mask) 
     459-{ 
     460-#ifdef CONFIG_SSB_PCIHOST 
     461-       int err; 
     462-#endif 
     463- 
     464-       switch (dev->bus->bustype) { 
     465-       case SSB_BUSTYPE_PCI: 
     466-#ifdef CONFIG_SSB_PCIHOST 
     467-               err = pci_set_dma_mask(dev->bus->host_pci, mask); 
     468-               if (err) 
     469-                       return err; 
     470-               err = pci_set_consistent_dma_mask(dev->bus->host_pci, mask); 
     471-               return err; 
     472-#endif 
     473-       case SSB_BUSTYPE_SSB: 
     474-               return dma_set_mask(dev->dev, mask); 
     475-       default: 
     476-               __ssb_dma_not_implemented(dev); 
     477-       } 
     478-       return -ENOSYS; 
     479-} 
     480-EXPORT_SYMBOL(ssb_dma_set_mask); 
     481- 
     482-void * ssb_dma_alloc_consistent(struct ssb_device *dev, size_t size, 
     483-                               dma_addr_t *dma_handle, gfp_t gfp_flags) 
     484-{ 
     485-       switch (dev->bus->bustype) { 
     486-       case SSB_BUSTYPE_PCI: 
     487-#ifdef CONFIG_SSB_PCIHOST 
     488-               if (gfp_flags & GFP_DMA) { 
     489-                       /* Workaround: The PCI API does not support passing 
     490-                        * a GFP flag. */ 
     491-                       return dma_alloc_coherent(&dev->bus->host_pci->dev, 
     492-                                                 size, dma_handle, gfp_flags); 
     493-               } 
     494-               return pci_alloc_consistent(dev->bus->host_pci, size, dma_handle); 
     495-#endif 
     496-       case SSB_BUSTYPE_SSB: 
     497-               return dma_alloc_coherent(dev->dev, size, dma_handle, gfp_flags); 
     498-       default: 
     499-               __ssb_dma_not_implemented(dev); 
     500-       } 
     501-       return NULL; 
     502-} 
     503-EXPORT_SYMBOL(ssb_dma_alloc_consistent); 
     504- 
     505-void ssb_dma_free_consistent(struct ssb_device *dev, size_t size, 
     506-                            void *vaddr, dma_addr_t dma_handle, 
     507-                            gfp_t gfp_flags) 
     508-{ 
     509-       switch (dev->bus->bustype) { 
     510-       case SSB_BUSTYPE_PCI: 
     511-#ifdef CONFIG_SSB_PCIHOST 
     512-               if (gfp_flags & GFP_DMA) { 
     513-                       /* Workaround: The PCI API does not support passing 
     514-                        * a GFP flag. */ 
     515-                       dma_free_coherent(&dev->bus->host_pci->dev, 
     516-                                         size, vaddr, dma_handle); 
     517-                       return; 
     518-               } 
     519-               pci_free_consistent(dev->bus->host_pci, size, 
     520-                                   vaddr, dma_handle); 
     521-               return; 
     522-#endif 
     523-       case SSB_BUSTYPE_SSB: 
     524-               dma_free_coherent(dev->dev, size, vaddr, dma_handle); 
     525-               return; 
     526-       default: 
     527-               __ssb_dma_not_implemented(dev); 
     528-       } 
     529-} 
     530-EXPORT_SYMBOL(ssb_dma_free_consistent); 
     531- 
     532 int ssb_bus_may_powerdown(struct ssb_bus *bus) 
     533 { 
     534        struct ssb_chipcommon *cc; 
    32535--- a/drivers/ssb/pci.c 
    33536+++ b/drivers/ssb/pci.c 
     
    41544 #define SPEX16(_outvar, _offset, _mask, _shift)        \ 
    42545        out->_outvar = ((in[SPOFF(_offset)] & (_mask)) >> (_shift)) 
    43 @@ -254,7 +254,7 @@ static int sprom_do_read(struct ssb_bus 
     546@@ -254,7 +254,7 @@ static int sprom_do_read(struct ssb_bus  
    44547        int i; 
    45548  
     
    59562                msleep(20); 
    60563        } 
    61 @@ -621,6 +621,14 @@ static int ssb_pci_sprom_get(struct ssb_ 
     564@@ -621,6 +621,28 @@ static int ssb_pci_sprom_get(struct ssb_ 
    62565        int err = -ENOMEM; 
    63566        u16 *buf; 
     
    67570+               return -ENODEV; 
    68571+       } 
    69 + 
    70 +       bus->sprom_offset = (bus->chipco.dev->id.revision < 31) ? 
    71 +               SSB_SPROM_BASE1 : SSB_SPROM_BASE31; 
     572+       if (bus->chipco.dev) {  /* can be unavailible! */ 
     573+               /* 
     574+                * get SPROM offset: SSB_SPROM_BASE1 except for 
     575+                * chipcommon rev >= 31 or chip ID is 0x4312 and 
     576+                * chipcommon status & 3 == 2 
     577+                */ 
     578+               if (bus->chipco.dev->id.revision >= 31) 
     579+                       bus->sprom_offset = SSB_SPROM_BASE31; 
     580+               else if (bus->chip_id == 0x4312 && 
     581+                        (bus->chipco.status & 0x03) == 2) 
     582+                       bus->sprom_offset = SSB_SPROM_BASE31; 
     583+               else 
     584+                       bus->sprom_offset = SSB_SPROM_BASE1; 
     585+       } else { 
     586+               bus->sprom_offset = SSB_SPROM_BASE1; 
     587+       } 
     588+       ssb_dprintk(KERN_INFO PFX "SPROM offset is 0x%x\n", bus->sprom_offset); 
    72589+ 
    73590        buf = kcalloc(SSB_SPROMSIZE_WORDS_R123, sizeof(u16), GFP_KERNEL); 
     
    76593--- a/drivers/ssb/sprom.c 
    77594+++ b/drivers/ssb/sprom.c 
    78 @@ -176,3 +176,17 @@ const struct ssb_sprom *ssb_get_fallback 
     595@@ -176,3 +176,18 @@ const struct ssb_sprom *ssb_get_fallback 
    79596 { 
    80597        return fallback_sprom; 
     
    89606+          on PCMCIA */ 
    90607+       if (bus->bustype == SSB_BUSTYPE_PCI && 
     608+           bus->chipco.dev &&  /* can be unavailible! */ 
    91609+           bus->chipco.dev->id.revision >= 31) 
    92610+               return bus->chipco.capabilities & SSB_CHIPCO_CAP_SPROM; 
     
    96614--- a/include/linux/ssb/ssb.h 
    97615+++ b/include/linux/ssb/ssb.h 
     616@@ -167,7 +167,7 @@ struct ssb_device { 
     617         * is an optimization. */ 
     618        const struct ssb_bus_ops *ops; 
     619  
     620-       struct device *dev; 
     621+       struct device *dev, *dma_dev; 
     622  
     623        struct ssb_bus *bus; 
     624        struct ssb_device_id id; 
    98625@@ -305,6 +305,7 @@ struct ssb_bus { 
    99626        /* ID information about the Chip. */ 
     
    114641  * See kdoc at the function definition for complete documentation. */ 
    115642 extern int ssb_arch_set_fallback_sprom(const struct ssb_sprom *sprom); 
     643@@ -466,14 +470,6 @@ extern u32 ssb_dma_translation(struct ss 
     644 #define SSB_DMA_TRANSLATION_MASK       0xC0000000 
     645 #define SSB_DMA_TRANSLATION_SHIFT      30 
     646  
     647-extern int ssb_dma_set_mask(struct ssb_device *dev, u64 mask); 
     648- 
     649-extern void * ssb_dma_alloc_consistent(struct ssb_device *dev, size_t size, 
     650-                                      dma_addr_t *dma_handle, gfp_t gfp_flags); 
     651-extern void ssb_dma_free_consistent(struct ssb_device *dev, size_t size, 
     652-                                   void *vaddr, dma_addr_t dma_handle, 
     653-                                   gfp_t gfp_flags); 
     654- 
     655 static inline void __cold __ssb_dma_not_implemented(struct ssb_device *dev) 
     656 { 
     657 #ifdef CONFIG_SSB_DEBUG 
     658@@ -482,155 +478,6 @@ static inline void __cold __ssb_dma_not_ 
     659 #endif /* DEBUG */ 
     660 } 
     661  
     662-static inline int ssb_dma_mapping_error(struct ssb_device *dev, dma_addr_t addr) 
     663-{ 
     664-       switch (dev->bus->bustype) { 
     665-       case SSB_BUSTYPE_PCI: 
     666-#ifdef CONFIG_SSB_PCIHOST 
     667-               return pci_dma_mapping_error(dev->bus->host_pci, addr); 
     668-#endif 
     669-               break; 
     670-       case SSB_BUSTYPE_SSB: 
     671-               return dma_mapping_error(dev->dev, addr); 
     672-       default: 
     673-               break; 
     674-       } 
     675-       __ssb_dma_not_implemented(dev); 
     676-       return -ENOSYS; 
     677-} 
     678- 
     679-static inline dma_addr_t ssb_dma_map_single(struct ssb_device *dev, void *p, 
     680-                                           size_t size, enum dma_data_direction dir) 
     681-{ 
     682-       switch (dev->bus->bustype) { 
     683-       case SSB_BUSTYPE_PCI: 
     684-#ifdef CONFIG_SSB_PCIHOST 
     685-               return pci_map_single(dev->bus->host_pci, p, size, dir); 
     686-#endif 
     687-               break; 
     688-       case SSB_BUSTYPE_SSB: 
     689-               return dma_map_single(dev->dev, p, size, dir); 
     690-       default: 
     691-               break; 
     692-       } 
     693-       __ssb_dma_not_implemented(dev); 
     694-       return 0; 
     695-} 
     696- 
     697-static inline void ssb_dma_unmap_single(struct ssb_device *dev, dma_addr_t dma_addr, 
     698-                                       size_t size, enum dma_data_direction dir) 
     699-{ 
     700-       switch (dev->bus->bustype) { 
     701-       case SSB_BUSTYPE_PCI: 
     702-#ifdef CONFIG_SSB_PCIHOST 
     703-               pci_unmap_single(dev->bus->host_pci, dma_addr, size, dir); 
     704-               return; 
     705-#endif 
     706-               break; 
     707-       case SSB_BUSTYPE_SSB: 
     708-               dma_unmap_single(dev->dev, dma_addr, size, dir); 
     709-               return; 
     710-       default: 
     711-               break; 
     712-       } 
     713-       __ssb_dma_not_implemented(dev); 
     714-} 
     715- 
     716-static inline void ssb_dma_sync_single_for_cpu(struct ssb_device *dev, 
     717-                                              dma_addr_t dma_addr, 
     718-                                              size_t size, 
     719-                                              enum dma_data_direction dir) 
     720-{ 
     721-       switch (dev->bus->bustype) { 
     722-       case SSB_BUSTYPE_PCI: 
     723-#ifdef CONFIG_SSB_PCIHOST 
     724-               pci_dma_sync_single_for_cpu(dev->bus->host_pci, dma_addr, 
     725-                                           size, dir); 
     726-               return; 
     727-#endif 
     728-               break; 
     729-       case SSB_BUSTYPE_SSB: 
     730-               dma_sync_single_for_cpu(dev->dev, dma_addr, size, dir); 
     731-               return; 
     732-       default: 
     733-               break; 
     734-       } 
     735-       __ssb_dma_not_implemented(dev); 
     736-} 
     737- 
     738-static inline void ssb_dma_sync_single_for_device(struct ssb_device *dev, 
     739-                                                 dma_addr_t dma_addr, 
     740-                                                 size_t size, 
     741-                                                 enum dma_data_direction dir) 
     742-{ 
     743-       switch (dev->bus->bustype) { 
     744-       case SSB_BUSTYPE_PCI: 
     745-#ifdef CONFIG_SSB_PCIHOST 
     746-               pci_dma_sync_single_for_device(dev->bus->host_pci, dma_addr, 
     747-                                              size, dir); 
     748-               return; 
     749-#endif 
     750-               break; 
     751-       case SSB_BUSTYPE_SSB: 
     752-               dma_sync_single_for_device(dev->dev, dma_addr, size, dir); 
     753-               return; 
     754-       default: 
     755-               break; 
     756-       } 
     757-       __ssb_dma_not_implemented(dev); 
     758-} 
     759- 
     760-static inline void ssb_dma_sync_single_range_for_cpu(struct ssb_device *dev, 
     761-                                                    dma_addr_t dma_addr, 
     762-                                                    unsigned long offset, 
     763-                                                    size_t size, 
     764-                                                    enum dma_data_direction dir) 
     765-{ 
     766-       switch (dev->bus->bustype) { 
     767-       case SSB_BUSTYPE_PCI: 
     768-#ifdef CONFIG_SSB_PCIHOST 
     769-               /* Just sync everything. That's all the PCI API can do. */ 
     770-               pci_dma_sync_single_for_cpu(dev->bus->host_pci, dma_addr, 
     771-                                           offset + size, dir); 
     772-               return; 
     773-#endif 
     774-               break; 
     775-       case SSB_BUSTYPE_SSB: 
     776-               dma_sync_single_range_for_cpu(dev->dev, dma_addr, offset, 
     777-                                             size, dir); 
     778-               return; 
     779-       default: 
     780-               break; 
     781-       } 
     782-       __ssb_dma_not_implemented(dev); 
     783-} 
     784- 
     785-static inline void ssb_dma_sync_single_range_for_device(struct ssb_device *dev, 
     786-                                                       dma_addr_t dma_addr, 
     787-                                                       unsigned long offset, 
     788-                                                       size_t size, 
     789-                                                       enum dma_data_direction dir) 
     790-{ 
     791-       switch (dev->bus->bustype) { 
     792-       case SSB_BUSTYPE_PCI: 
     793-#ifdef CONFIG_SSB_PCIHOST 
     794-               /* Just sync everything. That's all the PCI API can do. */ 
     795-               pci_dma_sync_single_for_device(dev->bus->host_pci, dma_addr, 
     796-                                              offset + size, dir); 
     797-               return; 
     798-#endif 
     799-               break; 
     800-       case SSB_BUSTYPE_SSB: 
     801-               dma_sync_single_range_for_device(dev->dev, dma_addr, offset, 
     802-                                                size, dir); 
     803-               return; 
     804-       default: 
     805-               break; 
     806-       } 
     807-       __ssb_dma_not_implemented(dev); 
     808-} 
     809- 
     810- 
     811 #ifdef CONFIG_SSB_PCIHOST 
     812 /* PCI-host wrapper driver */ 
     813 extern int ssb_pcihost_register(struct pci_driver *driver); 
    116814--- a/include/linux/ssb/ssb_driver_chipcommon.h 
    117815+++ b/include/linux/ssb/ssb_driver_chipcommon.h 
Note: See TracChangeset for help on using the changeset viewer.