Changeset 6307


Ignore:
Timestamp:
2007-02-16T10:23:15+01:00 (10 years ago)
Author:
nbd
Message:

major cleanup of the ar531x code, improved hardware detection and support for multiple ethernet interfaces

Location:
trunk/target/linux/atheros-2.6
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/atheros-2.6/files/arch/mips/atheros/ar5312.c

    r6302 r6307  
    3030#include "ar531x.h" 
    3131 
    32  
    33  
     32#define NO_PHY 0x1f 
     33 
     34static int is_5312 = 0; 
    3435static struct platform_device *ar5312_devs[5]; 
    3536 
    3637static struct resource ar5312_eth0_res[] = { 
    3738        { 
    38                 .name = "eth_membase", 
     39                .name = "eth0_membase", 
    3940                .flags = IORESOURCE_MEM, 
    4041                .start = KSEG1ADDR(AR531X_ENET0), 
     
    4243        }, 
    4344        { 
    44                 .name = "eth_irq", 
     45                .name = "eth0_irq", 
    4546                .flags = IORESOURCE_IRQ, 
    4647                .start = AR5312_IRQ_ENET0_INTRS, 
     
    4849        }, 
    4950}; 
    50  
    51  
    52 static struct resource ar5312_eth1_res[] = { 
    53         { 
    54                 .name = "eth_membase", 
    55                 .flags = IORESOURCE_MEM, 
    56                 .start = KSEG1ADDR(AR531X_ENET1), 
    57                 .end = KSEG1ADDR(AR531X_ENET1 + 0x2000), 
    58         }, 
    59         { 
    60                 .name = "eth_irq", 
    61                 .flags = IORESOURCE_IRQ, 
    62                 .start = AR5312_IRQ_ENET1_INTRS, 
    63                 .end = AR5312_IRQ_ENET1_INTRS, 
    64         }, 
    65 }; 
    66  
    67  
    6851static struct ar531x_eth ar5312_eth0_data = { 
    69         .phy = 0x1f, 
     52        .phy = NO_PHY, 
    7053        .mac = 0, 
    7154        .reset_base = AR531X_RESET, 
    7255        .reset_mac = AR531X_RESET_ENET0, 
    7356        .reset_phy = AR531X_RESET_EPHY0, 
    74 }; 
    75  
     57        .phy_base = KSEG1ADDR(AR531X_ENET0), 
     58}; 
     59 
     60static struct resource ar5312_eth1_res[] = { 
     61        { 
     62                .name = "eth1_membase", 
     63                .flags = IORESOURCE_MEM, 
     64                .start = KSEG1ADDR(AR531X_ENET1), 
     65                .end = KSEG1ADDR(AR531X_ENET1 + 0x2000), 
     66        }, 
     67        { 
     68                .name = "eth1_irq", 
     69                .flags = IORESOURCE_IRQ, 
     70                .start = AR5312_IRQ_ENET1_INTRS, 
     71                .end = AR5312_IRQ_ENET1_INTRS, 
     72        }, 
     73}; 
    7674static struct ar531x_eth ar5312_eth1_data = { 
    77         .phy = 0, 
     75        .phy = NO_PHY, 
    7876        .mac = 1, 
    7977        .reset_base = AR531X_RESET, 
    8078        .reset_mac = AR531X_RESET_ENET1, 
    8179        .reset_phy = AR531X_RESET_EPHY1, 
     80        .phy_base = KSEG1ADDR(AR531X_ENET1), 
    8281}; 
    8382 
     
    9998}; 
    10099 
     100 
     101/* 
     102 * AR2312/3 ethernet uses the PHY of ENET0, but the MAC 
     103 * of ENET1. Atheros calls it 'twisted' for a reason :) 
     104 */ 
     105static struct resource ar231x_eth0_res[] = { 
     106        { 
     107                .name = "eth0_membase", 
     108                .flags = IORESOURCE_MEM, 
     109                .start = KSEG1ADDR(AR531X_ENET1), 
     110                .end = KSEG1ADDR(AR531X_ENET1 + 0x2000), 
     111        }, 
     112        { 
     113                .name = "eth0_irq", 
     114                .flags = IORESOURCE_IRQ, 
     115                .start = AR5312_IRQ_ENET1_INTRS, 
     116                .end = AR5312_IRQ_ENET1_INTRS, 
     117        }, 
     118}; 
     119static struct ar531x_eth ar231x_eth0_data = { 
     120        .phy = 1, 
     121        .mac = 1, 
     122        .reset_base = AR531X_RESET, 
     123        .reset_mac = AR531X_RESET_ENET1, 
     124        .reset_phy = AR531X_RESET_EPHY1, 
     125        .phy_base = KSEG1ADDR(AR531X_ENET0), 
     126}; 
     127static struct platform_device ar231x_eth0 = { 
     128        .id = 0, 
     129        .name = "ar531x-eth", 
     130        .dev.platform_data = &ar231x_eth0_data, 
     131        .resource = ar231x_eth0_res, 
     132        .num_resources = ARRAY_SIZE(ar231x_eth0_res) 
     133}; 
     134 
     135 
    101136static struct platform_device ar5312_wmac[] = { 
    102137        { 
     
    109144        }, 
    110145}; 
    111  
    112146 
    113147static struct physmap_flash_data ar5312_flash_data = { 
     
    140174{ 
    141175        u32 ctl; 
    142         /* Configure flash bank 0 */ 
     176        /*  
     177         * Configure flash bank 0. 
     178         * Assume 8M window size. Flash will be aliased if it's smaller 
     179         */ 
    143180        ctl = FLASHCTL_E | 
    144181                FLASHCTL_AC_8M | 
     
    158195                sysRegRead(AR531X_FLASHCTL2) & ~(FLASHCTL_E | FLASHCTL_AC)); 
    159196 
    160         return (char *) KSEG1ADDR(AR531X_FLASH + 0x400000); 
     197        return (char *) KSEG1ADDR(AR531X_FLASH + 0x800000); 
    161198} 
    162199 
     
    176213int __init ar5312_init_devices(void) 
    177214{ 
    178         char *radio; 
     215        struct ar531x_boarddata *bcfg; 
     216        char *radio, *c; 
    179217        int dev = 0; 
    180218 
    181         if (mips_machtype != MACH_ATHEROS_AR5312)  
     219        if (!is_5312) 
    182220                return 0; 
    183221 
     222        /* Locate board/radio config data */ 
    184223        ar531x_find_config(ar5312_flash_limit()); 
     224        bcfg = (struct ar531x_boarddata *) board_config; 
     225 
     226         
     227        /* 
     228         * Chip IDs and hardware detection for some Atheros 
     229         * models are really broken! 
     230         *  
     231         * Atheros uses a disabled WMAC0 and Silicon ID of AR5312 
     232         * as indication for AR2312, which is otherwise  
     233         * indistinguishable from the real AR5312. 
     234         */ 
     235        if (radio_config) { 
     236                radio = radio_config + AR531X_RADIO_MASK_OFF; 
     237                if ((*((u32 *) radio) & AR531X_RADIO0_MASK) == 0) 
     238                        bcfg->config |= BD_ISCASPER; 
     239        } else 
     240                radio = NULL; 
     241 
     242        /* AR2313 has CPU minor rev. 10 */ 
     243        if ((current_cpu_data.processor_id & 0xff) == 0x0a) 
     244                mips_machtype = MACH_ATHEROS_AR2313; 
     245         
     246        /* AR2312 shares the same Silicon ID as AR5312 */ 
     247        else if (bcfg->config & BD_ISCASPER) 
     248                mips_machtype = MACH_ATHEROS_AR2312; 
     249         
     250        /* Everything else is probably AR5312 or compatible */ 
     251        else 
     252                mips_machtype = MACH_ATHEROS_AR5312; 
     253 
    185254        ar5312_eth0_data.board_config = board_config; 
    186255        ar5312_eth1_data.board_config = board_config; 
    187256        ar5312_devs[dev++] = &ar5312_physmap_flash; 
    188         ar5312_devs[dev++] = &ar5312_eth[0]; 
    189         ar5312_devs[dev++] = &ar5312_eth[1]; 
    190  
    191         radio = radio_config + AR531X_RADIO_MASK_OFF; 
    192         if (*((u32 *) radio) & AR531X_RADIO0_MASK) { 
    193                 ar5312_wmac[0].dev.platform_data = init_wmac(0); 
    194                 ar5312_devs[dev++] = &ar5312_wmac[0]; 
    195         } 
    196         if (*((u32 *) radio) & AR531X_RADIO1_MASK) { 
    197                 ar5312_wmac[1].dev.platform_data = init_wmac(1); 
    198                 ar5312_devs[dev++] = &ar5312_wmac[1]; 
     257 
     258        ar5312_eth0_data.macaddr = bcfg->enet0Mac; 
     259        ar5312_eth1_data.macaddr = bcfg->enet1Mac; 
     260        if (memcmp(bcfg->enet0Mac, bcfg->enet1Mac, 6) == 0) { 
     261                /* ENET0 and ENET1 have the same mac. 
     262                 * Increment the one from ENET1 */ 
     263                c = bcfg->enet1Mac + 5; 
     264                while ((c >= (char *) bcfg->enet1Mac) && !(++(*c))) 
     265                        c--; 
     266        } 
     267 
     268        switch(mips_machtype) { 
     269                case MACH_ATHEROS_AR5312: 
     270                        ar5312_devs[dev++] = &ar5312_eth[0]; 
     271                        ar5312_devs[dev++] = &ar5312_eth[1]; 
     272                        break; 
     273                case MACH_ATHEROS_AR2312: 
     274                case MACH_ATHEROS_AR2313: 
     275                        ar5312_devs[dev++] = &ar231x_eth0; 
     276                        ar5312_flash_data.width = 1; 
     277                        break; 
     278        } 
     279 
     280        if (radio) { 
     281                if (*((u32 *) radio) & AR531X_RADIO0_MASK) { 
     282                        ar5312_wmac[0].dev.platform_data = init_wmac(0); 
     283                        ar5312_devs[dev++] = &ar5312_wmac[0]; 
     284                } 
     285                if (*((u32 *) radio) & AR531X_RADIO1_MASK) { 
     286                        ar5312_wmac[1].dev.platform_data = init_wmac(1); 
     287                        ar5312_devs[dev++] = &ar5312_wmac[1]; 
     288                } 
    199289        } 
    200290 
     
    446536} 
    447537 
     538void __init ar5312_prom_init(void) 
     539{ 
     540        u32 memsize, memcfg, bank0AC, bank1AC; 
     541 
     542        is_5312 = 1; 
     543 
     544        /* Detect memory size */ 
     545        memcfg = sysRegRead(AR531X_MEM_CFG1); 
     546        bank0AC = (memcfg & MEM_CFG1_AC0) >> MEM_CFG1_AC0_S; 
     547        bank1AC = (memcfg & MEM_CFG1_AC1) >> MEM_CFG1_AC1_S; 
     548        memsize = (bank0AC ? (1 << (bank0AC+1)) : 0) 
     549                + (bank1AC ? (1 << (bank1AC+1)) : 0); 
     550        memsize <<= 20; 
     551        add_memory_region(0, memsize, BOOT_MEM_RAM); 
     552         
     553        /* Initialize it to AR5312 for now. Real detection will be done 
     554         * in ar5312_init_devices() */ 
     555        mips_machtype = MACH_ATHEROS_AR5312; 
     556} 
    448557 
    449558void __init ar5312_plat_setup(void) 
  • trunk/target/linux/atheros-2.6/files/arch/mips/atheros/ar5312.h

    r6302 r6307  
    165165#define AR531X_REV_MIN         0x000f 
    166166#define AR531X_REV_MIN_S       0 
    167 #define AR531X_REV_CHIP        (REV_MAJ|REV_MIN) 
     167#define AR531X_REV_CHIP        (AR531X_REV_MAJ|AR531X_REV_MIN) 
    168168 
    169169/* Major revision numbers, bits 7..4 of Revision ID register */ 
  • trunk/target/linux/atheros-2.6/files/arch/mips/atheros/ar5315.c

    r6302 r6307  
    2929#include "ar531x.h" 
    3030 
     31static int is_5315 = 0; 
    3132static struct resource ar5315_eth_res[] = { 
    3233        { 
    33                 .name = "eth_membase", 
     34                .name = "eth0_membase", 
    3435                .flags = IORESOURCE_MEM, 
    3536                .start = AR5315_ENET0, 
     
    3738        }, 
    3839        { 
    39                 .name = "eth_irq", 
     40                .name = "eth0_irq", 
    4041                .flags = IORESOURCE_IRQ, 
    4142                .start = AR5315_IRQ_ENET0_INTRS, 
     
    5051        .reset_mac = AR5315_RESET_ENET0, 
    5152        .reset_phy = AR5315_RESET_EPHY0, 
     53        .phy_base = AR5315_ENET0 
    5254}; 
    5355 
     
    176178{ 
    177179        struct ar531x_config *config; 
     180        struct ar531x_boarddata *bcfg; 
     181        u32 devid; 
    178182        int dev = 0; 
    179183 
    180         if (mips_machtype != MACH_ATHEROS_AR5315)  
     184        if (!is_5315) 
    181185                return 0; 
    182186 
     187        /* Find board configuration */ 
    183188        ar531x_find_config(ar5315_flash_limit()); 
     189        bcfg = (struct ar531x_boarddata *) board_config; 
     190 
     191#if 0 
     192        /* Detect the hardware based on the device ID */ 
     193        devid = sysRegRead(AR5315_SREV) & AR5315_REV_MAJ >> AR5315_REV_MAJ_S; 
     194        switch(devid) { 
     195                case 0x9: 
     196                        mips_machtype = MACH_ATHEROS_AR2317; 
     197                        break; 
     198                /* FIXME: how can we detect AR2316? */ 
     199                case 0x8: 
     200                default: 
     201                        mips_machtype = MACH_ATHEROS_AR2315; 
     202                        break; 
     203        } 
     204#endif 
    184205 
    185206        config = (struct ar531x_config *) kzalloc(sizeof(struct ar531x_config), GFP_KERNEL); 
     
    187208        config->radio = radio_config; 
    188209        config->unit = 0; 
    189         config->tag = (u_int16_t) (sysRegRead(AR5315_SREV) & REV_CHIP); 
     210        config->tag = (u_int16_t) (sysRegRead(AR5315_SREV) & AR5315_REV_CHIP); 
    190211         
    191212        ar5315_eth_data.board_config = board_config; 
     213        ar5315_eth_data.macaddr = bcfg->enet0Mac; 
    192214        ar5315_wmac.dev.platform_data = config; 
    193215         
     
    380402        sysRegWrite(AR5315_IMR, imr); 
    381403        imr=sysRegRead(AR5315_IMR); /* flush write buffer */ 
    382         //printk("enable Interrupt irq 0x%x imr 0x%x \n",irq,imr); 
    383  
    384404} 
    385405 
     
    502522} 
    503523 
     524void __init ar5315_prom_init(void) 
     525{ 
     526        u32 memsize, memcfg; 
     527 
     528        is_5315 = 1; 
     529        memcfg = sysRegRead(AR5315_MEM_CFG); 
     530        memsize   = 1 + ((memcfg & SDRAM_DATA_WIDTH_M) >> SDRAM_DATA_WIDTH_S); 
     531        memsize <<= 1 + ((memcfg & SDRAM_COL_WIDTH_M) >> SDRAM_COL_WIDTH_S); 
     532        memsize <<= 1 + ((memcfg & SDRAM_ROW_WIDTH_M) >> SDRAM_ROW_WIDTH_S); 
     533        memsize <<= 3; 
     534        add_memory_region(0, memsize, BOOT_MEM_RAM); 
     535 
     536        /* Initialize it to AR2315 for now. Real detection will be done 
     537         * in ar5315_init_devices() */ 
     538        mips_machtype = MACH_ATHEROS_AR2315; 
     539} 
     540 
    504541void __init ar5315_plat_setup(void) 
    505542{ 
  • trunk/target/linux/atheros-2.6/files/arch/mips/atheros/ar5315.h

    r6302 r6307  
    122122#define AR5315_SREV             (AR5315_DSLBASE + 0x0014) 
    123123 
    124 #define REV_MAJ                     0x00f0 
    125 #define REV_MAJ_S                   4 
    126 #define REV_MIN                     0x000f 
    127 #define REV_MIN_S                   0 
    128 #define REV_CHIP                    (REV_MAJ|REV_MIN) 
     124#define AR5315_REV_MAJ                     0x00f0 
     125#define AR5315_REV_MAJ_S                   4 
     126#define AR5315_REV_MIN                     0x000f 
     127#define AR5315_REV_MIN_S                   0 
     128#define AR5315_REV_CHIP                    (AR5315_REV_MAJ|AR5315_REV_MIN) 
    129129 
    130130/* 
     
    360360#define AR5315_PCICLK           (AR5315_DSLBASE + 0x00a4) 
    361361 
    362 #define PCICLK_INPUT_M              0x3 
    363 #define PCICLK_INPUT_S              0 
     362#define AR5315_PCICLK_INPUT_M              0x3 
     363#define AR5315_PCICLK_INPUT_S              0 
    364364                          
    365 #define PCICLK_PLLC_CLKM            0 
    366 #define PCICLK_PLLC_CLKM1           1 
    367 #define PCICLK_PLLC_CLKC            2 
    368 #define PCICLK_REF_CLK              3  
    369  
    370 #define PCICLK_DIV_M                0xc 
    371 #define PCICLK_DIV_S                2 
     365#define AR5315_PCICLK_PLLC_CLKM            0 
     366#define AR5315_PCICLK_PLLC_CLKM1           1 
     367#define AR5315_PCICLK_PLLC_CLKC            2 
     368#define AR5315_PCICLK_REF_CLK              3  
     369 
     370#define AR5315_PCICLK_DIV_M                0xc 
     371#define AR5315_PCICLK_DIV_S                2 
    372372                          
    373 #define PCICLK_IN_FREQ              0 
    374 #define PCICLK_IN_FREQ_DIV_6        1 
    375 #define PCICLK_IN_FREQ_DIV_8        2 
    376 #define PCICLK_IN_FREQ_DIV_10       3  
     373#define AR5315_PCICLK_IN_FREQ              0 
     374#define AR5315_PCICLK_IN_FREQ_DIV_6        1 
     375#define AR5315_PCICLK_IN_FREQ_DIV_8        2 
     376#define AR5315_PCICLK_IN_FREQ_DIV_10       3  
    377377 
    378378/* 
  • trunk/target/linux/atheros-2.6/files/arch/mips/atheros/ar531x.h

    r6265 r6307  
    22#define __AR531X_H 
    33 
     4#include <asm/cpu-info.h> 
    45#include <ar531x_platform.h> 
    56#include "ar5312.h" 
    67#include "ar5315.h" 
     8 
     9/*                                                                              
     10 * Atheros CPUs before the AR2315 are using MIPS 4Kc core, later designs are 
     11 * using MIPS 4KEc R2 core. This makes it easy to determine the board at runtime. 
     12 */ 
     13#ifdef CONFIG_ATHEROS_AR5312 
     14#define DO_AR5312(...) \ 
     15        if (current_cpu_data.cputype != CPU_4KEC) { \ 
     16                __VA_ARGS__ \ 
     17        } 
     18#else 
     19#define DO_AR5312(...) 
     20#endif 
     21#ifdef CONFIG_ATHEROS_AR5315 
     22#define DO_AR5315(...) \ 
     23        if (current_cpu_data.cputype == CPU_4KEC) { \ 
     24                __VA_ARGS__ \ 
     25        } 
     26#else 
     27#define DO_AR5315(...) 
     28#endif 
     29 
     30 
    731 
    832#define MIPS_CPU_IRQ_BASE               0x00 
     
    90114}; 
    91115 
     116#define BOARD_CONFIG_BUFSZ              0x1000 
    92117 
    93 extern char *board_config; 
    94 extern char *radio_config; 
     118extern char *board_config, *radio_config; 
    95119extern void serial_setup(unsigned long mapbase, unsigned int uartclk); 
    96120extern int ar531x_find_config(char *flash_limit); 
    97121 
     122extern void ar5312_prom_init(void); 
    98123extern void ar5312_misc_intr_init(int irq_base); 
    99 extern void ar5312_irq_dispatch(void); 
    100124extern void ar5312_plat_setup(void); 
     125extern asmlinkage void ar5312_irq_dispatch(void); 
    101126 
     127extern void ar5315_prom_init(void); 
    102128extern void ar5315_misc_intr_init(int irq_base); 
     129extern void ar5315_plat_setup(void); 
    103130extern asmlinkage void ar5315_irq_dispatch(void); 
    104 extern void ar5315_plat_setup(void); 
    105131 
    106132#endif 
  • trunk/target/linux/atheros-2.6/files/arch/mips/atheros/board.c

    r6265 r6307  
    107107                return -ENODEV; 
    108108 
    109         board_config = kmalloc(0x1000, GFP_KERNEL); 
     109        board_config = kzalloc(BOARD_CONFIG_BUFSZ, GFP_KERNEL); 
    110110        memcpy(board_config, bcfg, 0x100); 
    111111 
     
    117117                return -ENODEV; 
    118118 
    119         printk("Radio config found at offset 0x%x\n", rcfg - bcfg); 
    120119        radio_config = board_config + 0x100 + ((rcfg - bcfg) & 0xfff); 
    121         rcfg_size = 0x1000 - ((rcfg - bcfg) & 0xfff); 
     120        printk("Radio config found at offset 0x%x(0x%x)\n", rcfg - bcfg, radio_config - board_config); 
     121        rcfg_size = BOARD_CONFIG_BUFSZ - ((rcfg - bcfg) & (BOARD_CONFIG_BUFSZ - 1)); 
    122122        memcpy(radio_config, rcfg, rcfg_size); 
    123123         
     
    144144void __init plat_mem_setup(void) 
    145145{ 
    146         switch(mips_machtype) { 
    147 #ifdef CONFIG_ATHEROS_AR5312 
    148         case MACH_ATHEROS_AR5312: 
    149                 ar5312_plat_setup(); 
    150                 break; 
    151 #endif 
    152 #ifdef CONFIG_ATHEROS_AR5315 
    153         case MACH_ATHEROS_AR5315: 
    154                 ar5315_plat_setup(); 
    155                 break; 
    156 #endif 
    157         } 
     146        DO_AR5312(ar5312_plat_setup();) 
     147        DO_AR5315(ar5315_plat_setup();) 
    158148 
    159149        /* Disable data watchpoints */ 
     
    167157        case MACH_ATHEROS_AR5312: 
    168158                return "Atheros AR5312\n"; 
     159 
     160        case MACH_ATHEROS_AR2312: 
     161                return "Atheros AR2312\n"; 
     162                 
     163        case MACH_ATHEROS_AR2313: 
     164                return "Atheros AR2313\n"; 
    169165#endif 
    170166#ifdef CONFIG_ATHEROS_AR5315 
    171         case MACH_ATHEROS_AR5315: 
    172                 return "Atheros AR5315\n"; 
     167        case MACH_ATHEROS_AR2315: 
     168                return "Atheros AR2315\n"; 
     169        case MACH_ATHEROS_AR2316: 
     170                return "Atheros AR2316\n"; 
     171        case MACH_ATHEROS_AR2317: 
     172                return "Atheros AR2317\n"; 
     173        case MACH_ATHEROS_AR2318: 
     174                return "Atheros AR2318\n"; 
    173175#endif 
    174176        } 
  • trunk/target/linux/atheros-2.6/files/arch/mips/atheros/irq.c

    r6265 r6307  
    6868asmlinkage void plat_irq_dispatch(void) 
    6969{ 
    70 #ifdef CONFIG_ATHEROS_AR5312 
    71         if (mips_machtype == MACH_ATHEROS_AR5312) 
    72                 ar5312_irq_dispatch(); 
    73 #endif 
    74 #ifdef CONFIG_ATHEROS_AR5315 
    75         if (mips_machtype == MACH_ATHEROS_AR5315) 
    76                 ar5315_irq_dispatch(); 
    77 #endif 
     70        DO_AR5312(ar5312_irq_dispatch();) 
     71        DO_AR5315(ar5315_irq_dispatch();) 
    7872} 
    7973 
     
    8478 
    8579        /* Initialize interrupt controllers */ 
    86 #ifdef CONFIG_ATHEROS_AR5312 
    87         if (mips_machtype == MACH_ATHEROS_AR5312) 
    88                 ar5312_misc_intr_init(AR531X_MISC_IRQ_BASE); 
    89 #endif 
    90 #ifdef CONFIG_ATHEROS_AR5315 
    91         if (mips_machtype == MACH_ATHEROS_AR5315) 
    92                 ar5315_misc_intr_init(AR531X_MISC_IRQ_BASE); 
    93 #endif 
     80        DO_AR5312(ar5312_misc_intr_init(AR531X_MISC_IRQ_BASE);) 
     81        DO_AR5315(ar5315_misc_intr_init(AR531X_MISC_IRQ_BASE);) 
    9482 
    9583        /* Default "spurious interrupt" handlers */ 
  • trunk/target/linux/atheros-2.6/files/arch/mips/atheros/prom.c

    r6265 r6307  
    2828void __init prom_init(void) 
    2929{ 
    30         u32 memsize, memcfg; 
    3130 
    3231        mips_machgroup = MACH_GROUP_ATHEROS; 
    3332        mips_machtype = -1; 
    3433 
    35         /*                                                                              
    36          * Atheros CPUs before the AR2315 are using MIPS 4Kc core, later designs are 
    37          * using MIPS 4KEc R2 core. This makes it easy to determine the board at runtime. 
    38          */ 
    39                                                                              
    40         if (current_cpu_data.cputype == CPU_4KEC) { 
    41                 mips_machtype = MACH_ATHEROS_AR5315; 
    42                  
    43                 memcfg = sysRegRead(AR5315_MEM_CFG); 
    44                 memsize   = 1 + ((memcfg & SDRAM_DATA_WIDTH_M) >> SDRAM_DATA_WIDTH_S); 
    45                 memsize <<= 1 + ((memcfg & SDRAM_COL_WIDTH_M) >> SDRAM_COL_WIDTH_S); 
    46                 memsize <<= 1 + ((memcfg & SDRAM_ROW_WIDTH_M) >> SDRAM_ROW_WIDTH_S); 
    47                 memsize <<= 3; 
    48         } else { 
    49                 int bank0AC, bank1AC; 
     34        DO_AR5312(ar5312_prom_init();) 
     35        DO_AR5315(ar5315_prom_init();) 
    5036 
    51                 mips_machtype = MACH_ATHEROS_AR5312; 
    52  
    53                 memcfg = sysRegRead(AR531X_MEM_CFG1); 
    54                 bank0AC = (memcfg & MEM_CFG1_AC0) >> MEM_CFG1_AC0_S; 
    55                 bank1AC = (memcfg & MEM_CFG1_AC1) >> MEM_CFG1_AC1_S; 
    56                 memsize = (bank0AC ? (1 << (bank0AC+1)) : 0) 
    57                         + (bank1AC ? (1 << (bank1AC+1)) : 0); 
    58                 memsize <<= 20; 
    59         } 
    60  
    61         add_memory_region(0, memsize, BOOT_MEM_RAM); 
    6237        strcpy(arcs_cmdline, "console=ttyS0,9600 rootfstype=squashfs,jffs2"); 
    6338} 
  • trunk/target/linux/atheros-2.6/files/drivers/net/ar2313/ar2313.c

    r6278 r6307  
    11/* 
    2  * ar2313.c: Linux driver for the Atheros AR231z Ethernet device. 
     2 * ar2313.c: Linux driver for the Atheros AR231x Ethernet device. 
    33 * 
    44 * Copyright (C) 2004 by Sameer Dekate <sdekate@arubanetworks.com> 
    55 * Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org> 
    6  * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org> 
     6 * Copyright (C) 2006-2007 Felix Fietkau <nbd@openwrt.org> 
    77 * 
    88 * Thanks to Atheros for providing hardware and documentation 
     
    5151#include <asm/bootinfo.h> 
    5252 
    53 #include <ar531x_platform.h> 
     53#define AR2313_MTU                     1692 
     54#define AR2313_PRIOS                   1 
     55#define AR2313_QUEUES                  (2*AR2313_PRIOS) 
     56#define AR2313_DESCR_ENTRIES           64 
    5457 
    5558#undef INDEX_DEBUG 
     
    6972#endif 
    7073 
    71 #ifndef SET_MODULE_OWNER 
    72 #define SET_MODULE_OWNER(dev)           {do{} while(0);} 
    73 #define AR2313_MOD_INC_USE_COUNT        MOD_INC_USE_COUNT 
    74 #define AR2313_MOD_DEC_USE_COUNT        MOD_DEC_USE_COUNT 
    75 #else 
    76 #define AR2313_MOD_INC_USE_COUNT        {do{} while(0);} 
    77 #define AR2313_MOD_DEC_USE_COUNT        {do{} while(0);} 
    78 #endif 
    79  
    80 #define PHYSADDR(a)             ((_ACAST32_ (a)) & 0x1fffffff) 
    81  
    82 static char ifname[5] = "bond"; 
    83  
    84 module_param_string(ifname, ifname, 5, 0); 
    85  
    8674#define AR2313_MBOX_SET_BIT  0x8 
    8775 
     
    8977#define BOARD_IDX_OVERFLOW      -1 
    9078 
    91 #include "ar2313_msg.h" 
    9279#include "platform.h" 
    9380#include "dma.h" 
     
    155142#endif 
    156143 
    157 #if DEBUG 
    158 static char version[] __initdata =  
    159   "ar2313.c: v0.03 2006/07/12  sdekate@arubanetworks.com\n"; 
    160 #endif /* DEBUG */ 
    161  
    162144#define virt_to_phys(x) ((u32)(x) & 0x1fffffff) 
    163145 
    164146// prototypes 
    165 static short armiiread(short phy, short reg); 
    166 static void armiiwrite(short phy, short reg, short data); 
     147static short armiiread(struct net_device *dev, short phy, short reg); 
     148static void armiiwrite(struct net_device *dev, short phy, short reg, short data); 
    167149#ifdef TX_TIMEOUT 
    168150static void ar2313_tx_timeout(struct net_device *dev); 
     
    172154static void ar2313_multicast_list(struct net_device *dev); 
    173155 
    174 static int probed __initdata = 0; 
    175 static unsigned long ar_eth_base; 
    176 static unsigned long ar_dma_base; 
    177 static unsigned long ar_int_base; 
    178 static unsigned long ar_int_mac_mask; 
    179 static unsigned long ar_int_phy_mask; 
    180  
    181156#ifndef ERR 
    182157#define ERR(fmt, args...) printk("%s: " fmt, __func__, ##args) 
     
    188163        struct net_device *dev; 
    189164        struct ar2313_private *sp; 
    190         struct ar531x_eth *cfg; 
    191165        struct resource *res; 
    192         int version_disp; 
    193         char name[64] ; 
    194  
    195         if (probed) 
    196             return -ENODEV; 
    197         probed++; 
    198  
    199         version_disp = 0; 
    200         sprintf(name, "%s%%d", ifname) ; 
     166        unsigned long ar_eth_base; 
     167        char buf[64] ; 
     168 
    201169        dev = alloc_etherdev(sizeof(struct ar2313_private)); 
    202170 
     
    211179        sp = dev->priv; 
    212180        sp->dev = dev; 
    213         cfg = pdev->dev.platform_data; 
    214  
    215         res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "eth_membase"); 
     181        sp->cfg = pdev->dev.platform_data; 
     182 
     183        sprintf(buf, "eth%d_membase", pdev->id); 
     184        res = platform_get_resource_byname(pdev, IORESOURCE_MEM, buf); 
    216185        if (!res) 
    217186                return -ENODEV; 
     
    219188        sp->link = 0; 
    220189        ar_eth_base = res->start; 
    221         ar_dma_base = ar_eth_base + 0x1000; 
    222         ar_int_base = cfg->reset_base; 
    223         ar_int_mac_mask = cfg->reset_mac; 
    224         ar_int_phy_mask = cfg->reset_phy; 
    225         sp->phy = cfg->phy; 
    226  
    227         dev->irq = platform_get_irq_byname(pdev, "eth_irq"); 
     190        sp->phy = sp->cfg->phy; 
     191 
     192        sprintf(buf, "eth%d_irq", pdev->id); 
     193        dev->irq = platform_get_irq_byname(pdev, buf); 
    228194 
    229195        spin_lock_init(&sp->lock); 
     
    248214        tasklet_disable(&sp->rx_tasklet); 
    249215 
    250         /* display version info if adapter is found */ 
    251         if (!version_disp) { 
    252             /* set display flag to TRUE so that */ 
    253             /* we only display this string ONCE */ 
    254         version_disp = 1; 
    255 #if DEBUG 
    256         printk(version); 
    257 #endif /* DEBUG */ 
    258         } 
    259  
    260 #if 0 
    261         request_region(PHYSADDR(ar_eth_base), ETHERNET_SIZE*ETHERNET_MACS, 
    262                        "AR2313ENET"); 
    263 #endif 
    264  
    265         sp->eth_regs = ioremap_nocache(PHYSADDR(ar_eth_base), sizeof(*sp->eth_regs)); 
     216        sp->eth_regs = ioremap_nocache(virt_to_phys(ar_eth_base), sizeof(*sp->eth_regs)); 
    266217        if (!sp->eth_regs) { 
    267218                printk("Can't remap eth registers\n"); 
     
    269220        } 
    270221 
    271         sp->dma_regs = ioremap_nocache(PHYSADDR(ar_eth_base + 0x1000), sizeof(*sp->dma_regs)); 
     222        /*  
     223         * When there's only one MAC, PHY regs are typically on ENET0,  
     224         * even though the MAC might be on ENET1. 
     225         * Needto remap PHY regs separately in this case 
     226         */ 
     227        if (virt_to_phys(ar_eth_base) == virt_to_phys(sp->phy_regs)) 
     228                sp->phy_regs = sp->eth_regs; 
     229        else { 
     230                sp->phy_regs = ioremap_nocache(virt_to_phys(sp->cfg->phy_base), sizeof(*sp->phy_regs)); 
     231                if (!sp->phy_regs) { 
     232                        printk("Can't remap phy registers\n"); 
     233                        return(-ENXIO); 
     234                } 
     235        } 
     236 
     237        sp->dma_regs = ioremap_nocache(virt_to_phys(ar_eth_base + 0x1000), sizeof(*sp->dma_regs)); 
    272238        dev->base_addr = (unsigned int) sp->dma_regs; 
    273239        if (!sp->dma_regs) { 
     
    276242        } 
    277243 
    278         sp->int_regs = ioremap_nocache(PHYSADDR(ar_int_base), 4); 
     244        sp->int_regs = ioremap_nocache(virt_to_phys(sp->cfg->reset_base), 4); 
    279245        if (!sp->int_regs) { 
    280246                printk("Can't remap INTERRUPT registers\n"); 
     
    282248        } 
    283249 
    284         strncpy(sp->name, "Atheros AR2313", sizeof (sp->name) - 1); 
     250        strncpy(sp->name, "Atheros AR231x", sizeof (sp->name) - 1); 
    285251        sp->name [sizeof (sp->name) - 1] = '\0'; 
    286  
    287         { 
    288                 /* XXX: Will have to rewrite this part later */ 
    289                 char *configstart; 
    290                 unsigned char def_mac[6] = {0, 0xaa, 0xbb, 0xcc, 0xdd, 0xee}; 
    291  
    292                 configstart = (char *) cfg->board_config; 
    293  
    294                 if (!configstart) { 
    295                         printk("no valid mac found, using defaults"); 
    296                         memcpy(dev->dev_addr, def_mac, 6); 
    297                 } else { 
    298                         memcpy(dev->dev_addr, ((u8 *)configstart)+102, 6); 
    299                         /* use the other MAC slot if the first one is empty */ 
    300                         if (!memcmp(dev->dev_addr, "\xff\xff\xff\xff\xff\xff", 6)) 
    301                                 memcpy(dev->dev_addr, ((u8 *)configstart)+102 + 6, 6); 
    302                 } 
    303         } 
    304  
     252        memcpy(dev->dev_addr, sp->cfg->macaddr, 6); 
    305253        sp->board_idx = BOARD_IDX_STATIC; 
    306254 
     
    547495        td->devcs  = DMA_TX1_CHAINED; 
    548496        td->addr   = 0; 
    549         td->descr  = K1_TO_PHYS(&sp->tx_ring[(j+1) & (AR2313_DESCR_ENTRIES-1)]); 
     497        td->descr  = virt_to_phys(&sp->tx_ring[(j+1) & (AR2313_DESCR_ENTRIES-1)]); 
    550498        } 
    551499 
     
    633581        u16 phyData; 
    634582 
    635         phyData = armiiread(sp->phy, MII_BMSR); 
     583        phyData = armiiread(dev, sp->phy, MII_BMSR); 
    636584        if (sp->phyData != phyData) { 
    637585        if (phyData & BMSR_LSTATUS) { 
     
    641589 
    642590                sp->link = 1; 
    643                 reg = armiiread(sp->phy, MII_BMCR); 
     591                reg = armiiread(dev, sp->phy, MII_BMCR); 
    644592                if (reg & BMCR_ANENABLE) { 
    645593                    /* auto neg enabled */ 
    646                     reg = armiiread(sp->phy, MII_LPA); 
     594                    reg = armiiread(dev, sp->phy, MII_LPA); 
    647595                    duplex = (reg & (LPA_100FULL|LPA_10FULL))? 1:0; 
    648596                } else { 
     
    678626        unsigned int flags; 
    679627 
    680         *sp->int_regs |= ar_int_mac_mask; 
     628        *sp->int_regs |= sp->cfg->reset_mac; 
    681629        mdelay(10); 
    682         *sp->int_regs &= ~ar_int_mac_mask; 
     630        *sp->int_regs &= ~sp->cfg->reset_mac; 
    683631        mdelay(10); 
    684         *sp->int_regs |= ar_int_phy_mask; 
     632        *sp->int_regs |= sp->cfg->reset_phy; 
    685633        mdelay(10); 
    686         *sp->int_regs &= ~ar_int_phy_mask; 
     634        *sp->int_regs &= ~sp->cfg->reset_phy; 
    687635        mdelay(10); 
    688636 
     
    697645                              DMA_STATUS_TI  | 
    698646                              DMA_STATUS_FBE); 
    699         sp->dma_regs->xmt_base = K1_TO_PHYS(sp->tx_ring); 
    700         sp->dma_regs->rcv_base = K1_TO_PHYS(sp->rx_ring); 
     647        sp->dma_regs->xmt_base = virt_to_phys(sp->tx_ring); 
     648        sp->dma_regs->rcv_base = virt_to_phys(sp->rx_ring); 
    701649        sp->dma_regs->control = (DMA_CONTROL_SR | DMA_CONTROL_ST | DMA_CONTROL_SF); 
    702650         
     
    944892            if (skb_new != NULL) { 
    945893 
    946                     skb = sp->rx_skb[idx]; 
     894                skb = sp->rx_skb[idx]; 
    947895                /* set skb */ 
    948                     skb_put(skb, ((status >> DMA_RX_LEN_SHIFT) & 0x3fff) - CRC_LEN); 
    949  
    950 #ifdef CONFIG_MERLOT 
    951                 if ((dev->am_pkt_handler == NULL) ||  
    952                         (dev->am_pkt_handler(skb, dev) == 0)) { 
    953 #endif 
    954                       sp->stats.rx_bytes += skb->len; 
    955                       skb->protocol = eth_type_trans(skb, dev); 
    956                       /* pass the packet to upper layers */ 
    957  
    958 #ifdef CONFIG_MERLOT 
    959                       if (dev->asap_netif_rx) 
    960                           dev->asap_netif_rx(skb); 
    961                       else 
    962 #endif 
    963                       netif_rx(skb); 
    964 #ifdef CONFIG_MERLOT 
    965                 } 
    966 #endif 
     896                skb_put(skb, ((status >> DMA_RX_LEN_SHIFT) & 0x3fff) - CRC_LEN); 
     897 
     898                sp->stats.rx_bytes += skb->len; 
     899                skb->protocol = eth_type_trans(skb, dev); 
     900                /* pass the packet to upper layers */ 
     901                netif_rx(skb); 
     902 
    967903                skb_new->dev = dev; 
    968904                /* 16 bit align */ 
     
    973909                sp->stats.rx_packets++; 
    974910                sp->rx_skb[idx] = skb_new; 
    975  
    976911            } else { 
    977                 sp->stats.rx_dropped++; 
     912                        sp->stats.rx_dropped++; 
    978913            } 
    979914        } 
     
    11391074        sp->eth_regs->mac_control |= MAC_CONTROL_RE; 
    11401075 
    1141         AR2313_MOD_INC_USE_COUNT; 
    1142  
    11431076        return 0; 
    11441077} 
     
    11591092 
    11601093        /* place phy and MAC in reset */ 
    1161         *sp->int_regs |= (ar_int_mac_mask | ar_int_phy_mask); 
     1094        *sp->int_regs |= (sp->cfg->reset_mac | sp->cfg->reset_phy); 
    11621095 
    11631096        /* free buffers on tx ring */ 
     
    12091142 
    12101143#endif 
    1211         AR2313_MOD_DEC_USE_COUNT; 
    12121144        return 0; 
    12131145} 
     
    12551187        idx = DSC_NEXT(idx); 
    12561188        sp->tx_prd = idx; 
    1257  
    1258         //dev->trans_start = jiffies; 
    12591189 
    12601190        return 0; 
     
    12781208 
    12791209        ecmd->advertising = ADVERTISED_MII; 
    1280         tmp = armiiread(np->phy, MII_ADVERTISE); 
     1210        tmp = armiiread(dev, np->phy, MII_ADVERTISE); 
    12811211        if (tmp & ADVERTISE_10HALF) 
    12821212                ecmd->advertising |= ADVERTISED_10baseT_Half; 
     
    12881218                ecmd->advertising |= ADVERTISED_100baseT_Full; 
    12891219 
    1290         tmp = armiiread(np->phy, MII_BMCR); 
     1220        tmp = armiiread(dev, np->phy, MII_BMCR); 
    12911221        if (tmp & BMCR_ANENABLE) { 
    12921222                ecmd->advertising |= ADVERTISED_Autoneg; 
     
    12971227 
    12981228            if (ecmd->autoneg == AUTONEG_ENABLE) { 
    1299                 tmp = armiiread(np->phy, MII_LPA); 
     1229                tmp = armiiread(dev, np->phy, MII_LPA); 
    13001230                if (tmp & (LPA_100FULL|LPA_10FULL)) { 
    13011231                    ecmd->duplex = DUPLEX_FULL; 
     
    13451275        /* WHEW! now lets bang some bits */ 
    13461276         
    1347         tmp = armiiread(np->phy, MII_BMCR); 
     1277        tmp = armiiread(dev, np->phy, MII_BMCR); 
    13481278        if (ecmd->autoneg == AUTONEG_ENABLE) { 
    13491279                /* turn on autonegotiation */ 
     
    13611291                           (ecmd->duplex == DUPLEX_FULL)? "full":"half"); 
    13621292        } 
    1363         armiiwrite(np->phy, MII_BMCR, tmp); 
     1293        armiiwrite(dev, np->phy, MII_BMCR, tmp); 
    13641294            np->phyData = 0; 
    13651295        return 0; 
     
    14011331                int r = -EINVAL; 
    14021332                /* if autoneg is off, it's an error */ 
    1403                 tmp = armiiread(np->phy, MII_BMCR); 
     1333                tmp = armiiread(dev, np->phy, MII_BMCR); 
    14041334                if (tmp & BMCR_ANENABLE) { 
    14051335                        tmp |= (BMCR_ANRESTART); 
    1406                         armiiwrite(np->phy, MII_BMCR, tmp); 
     1336                        armiiwrite(dev, np->phy, MII_BMCR, tmp); 
    14071337                        r = 0; 
    14081338                } 
     
    14121342        case ETHTOOL_GLINK: { 
    14131343                struct ethtool_value edata = {ETHTOOL_GLINK}; 
    1414                 edata.data = (armiiread(np->phy, MII_BMSR)&BMSR_LSTATUS) ? 1:0; 
     1344                edata.data = (armiiread(dev, np->phy, MII_BMSR)&BMSR_LSTATUS) ? 1:0; 
    14151345                if (copy_to_user(useraddr, &edata, sizeof(edata))) 
    14161346                        return -EFAULT; 
     
    14271357 
    14281358        switch (cmd) { 
    1429         case SIOCDEVPRIVATE: { 
    1430             struct ar2313_cmd scmd; 
    1431  
    1432             if (copy_from_user(&scmd, ifr->ifr_data, sizeof(scmd))) 
    1433             return -EFAULT; 
    1434  
    1435 #if DEBUG 
    1436         printk("%s: ioctl devprivate c=%d a=%x l=%d m=%d d=%x,%x\n", 
    1437                dev->name, scmd.cmd, 
    1438                scmd.address, scmd.length, 
    1439                scmd.mailbox, scmd.data[0], scmd.data[1]); 
    1440 #endif /* DEBUG */ 
    1441  
    1442         switch (scmd.cmd) { 
    1443         case AR2313_READ_DATA: 
    1444             if(scmd.length==4){ 
    1445                 scmd.data[0] = *((u32*)scmd.address); 
    1446             } else if(scmd.length==2) { 
    1447                 scmd.data[0] = *((u16*)scmd.address); 
    1448             } else if (scmd.length==1) { 
    1449                 scmd.data[0] = *((u8*)scmd.address); 
    1450             } else { 
    1451                 return -EOPNOTSUPP; 
    1452             } 
    1453             if(copy_to_user(ifr->ifr_data, &scmd, sizeof(scmd))) 
    1454                 return -EFAULT; 
    1455             break; 
    1456  
    1457         case AR2313_WRITE_DATA: 
    1458             if(scmd.length==4){ 
    1459                 *((u32*)scmd.address) = scmd.data[0]; 
    1460             } else if(scmd.length==2) { 
    1461                 *((u16*)scmd.address) = scmd.data[0]; 
    1462             } else if (scmd.length==1) { 
    1463                 *((u8*)scmd.address) = scmd.data[0]; 
    1464             } else { 
    1465                 return -EOPNOTSUPP; 
    1466             } 
    1467             break; 
    1468  
    1469         case AR2313_GET_VERSION: 
    1470             // SAMEER: sprintf((char*) &scmd, "%s", ARUBA_VERSION); 
    1471             if(copy_to_user(ifr->ifr_data, &scmd, sizeof(scmd))) 
    1472                 return -EFAULT; 
    1473             break; 
    1474  
    1475         default: 
    1476             return -EOPNOTSUPP; 
    1477         } 
    1478         return 0; 
    1479         } 
    14801359           
    14811360        case SIOCETHTOOL: 
     
    14871366 
    14881367        case SIOCGMIIREG:               /* Read MII PHY register. */ 
    1489         case SIOCDEVPRIVATE+1:  /* for binary compat, remove in 2.5 */ 
    1490             data->val_out = armiiread(data->phy_id & 0x1f,  
     1368            data->val_out = armiiread(dev, data->phy_id & 0x1f,  
    14911369                                      data->reg_num & 0x1f); 
    14921370            return 0; 
    14931371        case SIOCSMIIREG:               /* Write MII PHY register. */ 
    1494         case SIOCDEVPRIVATE+2:  /* for binary compat, remove in 2.5 */ 
    14951372            if (!capable(CAP_NET_ADMIN)) 
    14961373                return -EPERM; 
    1497             armiiwrite(data->phy_id & 0x1f,  
     1374            armiiwrite(dev, data->phy_id & 0x1f,  
    14981375                       data->reg_num & 0x1f, data->val_in); 
    14991376            return 0; 
     
    15221399} 
    15231400 
     1401 
     1402#define MII_ADDR(phy, reg) \ 
     1403        ((reg << MII_ADDR_REG_SHIFT) | (phy << MII_ADDR_PHY_SHIFT)) 
     1404 
    15241405static short 
    1525 armiiread(short phy, short reg) 
    1526 { 
    1527   volatile ETHERNET_STRUCT * ethernet; 
    1528  
    1529   ethernet = (volatile ETHERNET_STRUCT *)(ar_eth_base); /* always MAC 0 */ 
    1530   ethernet->mii_addr = ((reg << MII_ADDR_REG_SHIFT) | 
    1531                             (phy << MII_ADDR_PHY_SHIFT)); 
    1532   while (ethernet->mii_addr & MII_ADDR_BUSY); 
    1533   return (ethernet->mii_data >> MII_DATA_SHIFT); 
     1406armiiread(struct net_device *dev, short phy, short reg) 
     1407{ 
     1408        struct ar2313_private *sp = (struct ar2313_private *)dev->priv; 
     1409        volatile ETHERNET_STRUCT *ethernet = sp->phy_regs; 
     1410 
     1411        ethernet->mii_addr = MII_ADDR(phy, reg); 
     1412        while (ethernet->mii_addr & MII_ADDR_BUSY); 
     1413        return (ethernet->mii_data >> MII_DATA_SHIFT); 
    15341414} 
    15351415 
    15361416static void 
    1537 armiiwrite(short phy, short reg, short data) 
    1538 { 
    1539   volatile ETHERNET_STRUCT * ethernet; 
    1540  
    1541   ethernet = (volatile ETHERNET_STRUCT *)(ar_eth_base); /* always MAC 0 */ 
    1542   while (ethernet->mii_addr & MII_ADDR_BUSY); 
    1543   ethernet->mii_data = data << MII_DATA_SHIFT; 
    1544   ethernet->mii_addr = ((reg << MII_ADDR_REG_SHIFT) | 
    1545                             (phy << MII_ADDR_PHY_SHIFT) | 
    1546                             MII_ADDR_WRITE); 
    1547 } 
    1548  
     1417armiiwrite(struct net_device *dev, short phy, short reg, short data) 
     1418{ 
     1419        struct ar2313_private *sp = (struct ar2313_private *)dev->priv; 
     1420        volatile ETHERNET_STRUCT *ethernet = sp->phy_regs; 
     1421 
     1422        while (ethernet->mii_addr & MII_ADDR_BUSY); 
     1423        ethernet->mii_data = data << MII_DATA_SHIFT; 
     1424        ethernet->mii_addr = MII_ADDR(phy, reg) | MII_ADDR_WRITE; 
     1425} 
     1426 
  • trunk/target/linux/atheros-2.6/files/drivers/net/ar2313/ar2313.h

    r6265 r6307  
    44#include <linux/autoconf.h> 
    55#include <asm/bootinfo.h> 
     6#include <ar531x_platform.h> 
    67#include "platform.h" 
    7  
    8 extern unsigned long mips_machtype; 
    9  
    10 #undef ETHERNET_BASE 
    11 #define ETHERNET_BASE ar_eth_base 
    12 #define ETHERNET_SIZE 0x00100000 
    13 #define ETHERNET_MACS 2 
    14  
    15 #undef DMA_BASE 
    16 #define DMA_BASE      ar_dma_base 
    17 #define DMA_SIZE      0x00100000 
    18  
    198 
    209/* 
     
    2312#define LINK_TIMER    (5*HZ)  
    2413 
    25 /* 
    26  * Interrupt register base address 
    27  */ 
    28 #define INTERRUPT_BASE    PHYS_TO_K1(ar_int_base) 
    29  
    30 /* 
    31  * Reset Register 
    32  */ 
    33 #define AR531X_RESET    (AR531X_RESETTMR + 0x0020) 
    34 #define RESET_SYSTEM         0x00000001      /* cold reset full system */ 
    35 #define RESET_PROC           0x00000002      /* cold reset MIPS core */ 
    36 #define RESET_WLAN0          0x00000004      /* cold reset WLAN MAC and BB */ 
    37 #define RESET_EPHY0          0x00000008      /* cold reset ENET0 phy */ 
    38 #define RESET_EPHY1          0x00000010      /* cold reset ENET1 phy */ 
    39 #define RESET_ENET0          0x00000020      /* cold reset ENET0 mac */ 
    40 #define RESET_ENET1          0x00000040      /* cold reset ENET1 mac */ 
    41  
    4214#define IS_DMA_TX_INT(X)   (((X) & (DMA_STATUS_TI)) != 0) 
    4315#define IS_DMA_RX_INT(X)   (((X) & (DMA_STATUS_RI)) != 0) 
    4416#define IS_DRIVER_OWNED(X) (((X) & (DMA_TX_OWN))    == 0) 
    45  
    46 #ifndef K1_TO_PHYS 
    47 // hack 
    48 #define K1_TO_PHYS(x)   (((unsigned int)(x)) & 0x1FFFFFFF)        /* kseg1 to physical */ 
    49 #endif 
    50  
    51 #ifndef PHYS_TO_K1 
    52 // hack 
    53 #define  PHYS_TO_K1(x)   (((unsigned int)(x)) | 0xA0000000)   /* physical to kseg1 */ 
    54 #endif 
    5517 
    5618#define AR2313_TX_TIMEOUT (HZ/4) 
     
    11274        u32                     mb[2]; 
    11375         
     76        volatile ETHERNET_STRUCT        *phy_regs; 
    11477        volatile ETHERNET_STRUCT        *eth_regs; 
    11578        volatile DMA                    *dma_regs; 
    11679        volatile u32                    *int_regs; 
     80        struct ar531x_eth *cfg; 
    11781 
    11882        spinlock_t lock;        /* Serialise access to device */ 
  • trunk/target/linux/atheros-2.6/files/drivers/net/ar2313/dma.h

    r6265 r6307  
    128128#define DMA_CONTROL_SF       AR_BIT(21) /* store and forward */ 
    129129 
     130 
     131typedef struct { 
     132    volatile unsigned int       status;         // OWN, Device control and status. 
     133    volatile unsigned int       devcs;          // pkt Control bits + Length 
     134    volatile unsigned int       addr;           // Current Address. 
     135    volatile unsigned int       descr;          // Next descriptor in chain. 
     136} ar2313_descr_t; 
     137 
     138 
    130139#endif  // __ARUBA_DMA_H__ 
    131140 
    132  
    133  
    134  
    135  
  • trunk/target/linux/atheros-2.6/files/drivers/net/ar2313/platform.h

    r6265 r6307  
    1717#ifndef PLATFORM_H 
    1818#define PLATFORM_H 
    19  
    20 #define BIT(x) (1 << (x)) 
    21  
    22 #define RESET_BASE        0xBC003020 
    23 #define RESET_VALUE       0x00000001 
    24  
    25 /******************************************************************** 
    26  * Device controller  
    27  ********************************************************************/ 
    28 typedef struct { 
    29   volatile unsigned int flash0; 
    30 } DEVICE; 
    31  
    32 #define device (*((volatile DEVICE *) DEV_CTL_BASE)) 
    33  
    34 // DDRC register 
    35 #define DEV_WP        (1<<26) 
    36  
    37 /******************************************************************** 
    38  * DDR controller  
    39  ********************************************************************/ 
    40 typedef struct { 
    41   volatile unsigned int ddrc0; 
    42   volatile unsigned int ddrc1; 
    43   volatile unsigned int ddrrefresh; 
    44 } DDR; 
    45  
    46 #define ddr (*((volatile DDR *) DDR_BASE)) 
    47  
    48 // DDRC register 
    49 #define DDRC_CS(i)     ((i&0x3)<<0) 
    50 #define DDRC_WE        (1<<2) 
    51  
    52 /******************************************************************** 
    53  * Ethernet interfaces 
    54  ********************************************************************/ 
    55 #define ETHERNET_BASE    0xB8200000 
    5619 
    5720// 
     
    8548} INTERRUPT; 
    8649 
    87 #define interrupt (*((volatile INTERRUPT *) INTERRUPT_BASE)) 
    88  
    89 #define INTERRUPT_MISC_TIMER    BIT(0) 
    90 #define INTERRUPT_MISC_AHBPROC  BIT(1) 
    91 #define INTERRUPT_MISC_AHBDMA   BIT(2) 
    92 #define INTERRUPT_MISC_GPIO     BIT(3) 
    93 #define INTERRUPT_MISC_UART     BIT(4) 
    94 #define INTERRUPT_MISC_UARTDMA  BIT(5) 
    95 #define INTERRUPT_MISC_WATCHDOG BIT(6) 
    96 #define INTERRUPT_MISC_LOCAL    BIT(7) 
    97  
    98 #define INTERRUPT_GLOBAL_ETH    BIT(2) 
    99 #define INTERRUPT_GLOBAL_WLAN   BIT(3) 
    100 #define INTERRUPT_GLOBAL_MISC   BIT(4) 
    101 #define INTERRUPT_GLOBAL_ITIMER BIT(5) 
    102  
    10350/******************************************************************** 
    10451 * DMA controller 
    10552 ********************************************************************/ 
    106 #define DMA_BASE          0xB8201000 
    107  
    10853typedef struct { 
    10954  volatile unsigned int bus_mode;        /* 0x00 (CSR0) */ 
     
    12166} DMA; 
    12267 
    123 #define dma (*((volatile DMA *) DMA_BASE)) 
    124  
    125 // macro to convert from virtual to physical address   
    126 #define phys_addr(x)      (x & 0x1fffffff)  
    127  
    12868#endif /* PLATFORM_H */ 
  • trunk/target/linux/atheros-2.6/files/include/asm-mips/mach-atheros/ar531x_platform.h

    r6265 r6307  
    2121        u32 reset_mac; 
    2222        u32 reset_phy; 
     23        u32 phy_base; 
    2324        char *board_config; 
     25        char *macaddr; 
    2426}; 
    2527 
  • trunk/target/linux/atheros-2.6/patches/100-board.patch

    r6265 r6307  
    4747--- linux.old/include/asm-mips/bootinfo.h       2007-02-02 23:55:52.913446632 +0100 
    4848+++ linux.dev/include/asm-mips/bootinfo.h       2007-02-03 17:51:02.531494032 +0100 
    49 @@ -212,6 +212,13 @@ 
     49@@ -212,6 +212,18 @@ 
    5050 #define MACH_GROUP_NEC_EMMA2RH 25      /* NEC EMMA2RH (was 23)         */ 
    5151 #define  MACH_NEC_MARKEINS     0       /* NEC EMMA2RH Mark-eins        */ 
     
    5555+ */ 
    5656+#define MACH_GROUP_ATHEROS     26 
    57 +#define MACH_ATHEROS_AR5312    0       /* Atheros AR5312, AR2312/3/4   */ 
    58 +#define MACH_ATHEROS_AR5315    1       /* Atheros AR2315/6/7/8         */ 
     57+#define MACH_ATHEROS_AR5312    0 
     58+#define MACH_ATHEROS_AR2312    1 
     59+#define MACH_ATHEROS_AR2313    2 
     60+#define MACH_ATHEROS_AR2315    3 
     61+#define MACH_ATHEROS_AR2316    4 
     62+#define MACH_ATHEROS_AR2317    5 
     63+#define MACH_ATHEROS_AR2318    6 
    5964+ 
    6065 #define CL_SIZE                        COMMAND_LINE_SIZE 
Note: See TracChangeset for help on using the changeset viewer.