Changeset 2866


Ignore:
Timestamp:
2006-01-09T17:03:36+01:00 (12 years ago)
Author:
wbx
Message:

add updates for atheros SOC support from Mike A., thx

Location:
trunk/openwrt/target/linux
Files:
2 added
1 deleted
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/openwrt/target/linux/Config.in

    r2845 r2866  
    365365        tristate 
    366366        default m 
     367        depends BR2_LINUX_2_4_X86 || BR2_LINUX_2_4_BRCM || BR2_LINUX_2_6_X86 || BR2_LINUX_2_6_BRCM 
    367368        help 
    368369          Kernel modules for IDE support 
     
    451452        prompt "kmod-pwc.......................... Kernel driver for USB Philips Cameras" 
    452453        tristate 
     454        default n if BR2_LINUX_2_4_AR531X 
    453455        default m 
    454456 
     
    520522        prompt "kmod-net-3c59x.................... 3Com 3c590/3c900 series (592/595/597) \"Vortex/Boomerang\" Ethernet kernel support" 
    521523        tristate 
     524        default n if BR2_LINUX_2_4_AR531X 
    522525        default m 
    523526        help 
     
    534537        prompt "kmod-net-8139too.................. RealTek RTL-8139 PCI Fast Ethernet Adapter kernel support" 
    535538        tristate 
     539        default n if BR2_LINUX_2_4_AR531X 
    536540        default m 
    537541        help 
     
    542546        prompt "kmod-net-airo..................... Cisco/Aironet 34X/35X/4500/4800 ISA and PCI cards kernel support" 
    543547        tristate 
     548        default n if BR2_LINUX_2_4_AR531X 
    544549        default m 
    545550        help 
     
    573578        prompt "kmod-net-hermes................... Hermes chipset 802.11b support (Orinoco/Prism2/Symbol) kernel support" 
    574579        tristate 
     580        default n if BR2_LINUX_2_4_AR531X 
    575581        default m 
    576582        help 
     
    613619        prompt "kmod-net-natsemi.................. National Semiconductor DP8381x series PCI Ethernet kernel support" 
    614620        tristate 
     621        default n if BR2_LINUX_2_4_AR531X 
    615622        default m 
    616623        help 
     
    622629        prompt "kmod-net-prism54.................. Intersil Prism GT/Duette/Indigo PCI/PCMCIA cards kernel support" 
    623630        tristate 
     631        default n if BR2_LINUX_2_4_AR531X 
    624632        default m 
    625633        help 
     
    663671        depends BR2_LINUX_PCMCIA_SUPPORT 
    664672        tristate 
     673        default n if BR2_LINUX_2_4_AR531X 
    665674        default m 
    666675 
     
    676685        prompt "kmod-usb-core..................... USB support" 
    677686        tristate 
     687        default n if BR2_LINUX_2_4_AR531X 
    678688        default m 
    679689 
     
    786796        tristate 
    787797        default m 
     798        default n if BR2_LINUX_2_4_AR531X 
    788799        help 
    789800          Bluetooth drivers and network stack 
  • trunk/openwrt/target/linux/image/squashfs.mk

    r2376 r2866  
     1ifeq ($(BR2_LINUX_2_4_AR531X),) 
     2        endian := be 
     3else 
     4        endian := le 
     5endif 
     6 
     7 
    18squashfs-prepare: 
    29        $(MAKE) -C squashfs prepare $(MAKE_TRACE) 
     
    1118$(KDIR)/root.squashfs: install-prepare 
    1219        @mkdir -p $(KDIR)/root/jffs 
    13         $(STAGING_DIR)/bin/mksquashfs-lzma $(KDIR)/root $@ -nopad -noappend -root-owned -le $(MAKE_TRACE) 
     20        $(STAGING_DIR)/bin/mksquashfs-lzma $(KDIR)/root $@ -nopad -noappend -root-owned -$(endian) $(MAKE_TRACE) 
    1421         
    1522ifeq ($(IB),) 
  • trunk/openwrt/target/linux/linux-2.4/config/ar531x

    r2855 r2866  
    8989CONFIG_NONCOHERENT_IO=y 
    9090CONFIG_EARLY_PRINTK_HACK=y 
     91CONFIG_VENETDEV=y 
     92CONFIG_MARVELL_ENET_PHY=y 
    9193# CONFIG_SCSI is not set 
    9294 
     
    127129# CONFIG_PAGE_SIZE_16KB is not set 
    128130# CONFIG_PAGE_SIZE_64KB is not set 
    129 # CONFIG_CPU_ADVANCED is not set 
     131CONFIG_CPU_ADVANCED=y 
    130132# CONFIG_CPU_HAS_LLSC is not set 
    131133# CONFIG_CPU_HAS_LLDSCD is not set 
     
    286288CONFIG_BLK_DEV_LOOP=m 
    287289CONFIG_BLK_DEV_NBD=m 
    288 # CONFIG_BLK_DEV_RAM is not set 
    289 # CONFIG_BLK_DEV_INITRD is not set 
     290CONFIG_BLK_DEV_RAM=y 
     291CONFIG_BLK_DEV_RAM_SIZE=3072 
     292CONFIG_BLK_DEV_INITRD=y 
    290293# CONFIG_BLK_STATS is not set 
    291294 
     
    597600# 
    598601CONFIG_NET_ETHERNET=y 
    599 # CONFIG_VENETDEV is not set 
    600 CONFIG_MARVELL_ENET_PHY=y 
    601602# CONFIG_SUNLANCE is not set 
    602603# CONFIG_SUNBMAC is not set 
  • trunk/openwrt/target/linux/linux-2.4/patches/ar531x/000-atheros-support.patch

    r2781 r2866  
    1 diff -urN linux-2.4.32/arch/mips/ar531x/ar531xdbg_io.c linux-2.4.32.new/arch/mips/ar531x/ar531xdbg_io.c 
    2 --- linux-2.4.32/arch/mips/ar531x/ar531xdbg_io.c        1970-01-01 01:00:00.000000000 +0100 
    3 +++ linux-2.4.32.new/arch/mips/ar531x/ar531xdbg_io.c    2005-12-24 20:29:42.102311328 +0000 
    4 @@ -0,0 +1,217 @@ 
     1diff -urN linux-mips/arch/mips/ar531x/ar531xdbg_io.c mips-linux-2.4.25/arch/mips/ar531x/ar531xdbg_io.c 
     2--- linux-mips/arch/mips/ar531x/ar531xdbg_io.c  1970-01-01 01:00:00.000000000 +0100 
     3+++ mips-linux-2.4.25/arch/mips/ar531x/ar531xdbg_io.c   2005-12-30 17:26:30.606883840 +0000 
     4@@ -0,0 +1,234 @@ 
    55+/* 
    66+ * This file is subject to the terms and conditions of the GNU General Public 
     
    4040+#if CONFIG_EARLY_PRINTK_HACK || CONFIG_KGDB 
    4141+/* base addr of uart and clock timing */ 
    42 +#define         BASE                    0xbc000003 
     42+#if CONFIG_AR5315 
     43+#define         BASE                    AR5315_UART0  
     44+#else 
     45+#define         BASE                    AR531X_UART0 
     46+#endif 
    4347+ 
    4448+/* distance in bytes between two serial registers */ 
     
    107111+{ 
    108112+       /* Pull UART out of reset */ 
     113+#if CONFIG_AR5315 
     114+       sysRegWrite(AR5315_RESET, 
     115+               sysRegRead(AR5315_RESET) & ~(RESET_UART0)); 
     116+#else 
    109117+       sysRegWrite(AR531X_RESET, 
    110118+               sysRegRead(AR531X_RESET) & ~(AR531X_RESET_UART0)); 
     119+#endif 
    111120+ 
    112121+       /* disable interrupts */ 
     
    117126+       {  
    118127+               u32 divisor; 
     128+#if CONFIG_AR5315  
     129+               u32 uart_clock_rate = ar531x_apb_frequency(); 
     130+#else 
    119131+               u32 uart_clock_rate = ar531x_cpu_frequency() / 4; 
     132+#endif 
    120133+               u32 base_baud = uart_clock_rate / 16; 
    121134+        
     
    166179+kgdbInit(void) 
    167180+{ 
     181+#if CONFIG_AR5315 
     182+    sysRegWrite(AR5315_WDC, WDC_IGNORE_EXPIRATION); 
     183+#else 
    168184+    sysRegWrite(AR531X_WD_CTRL, AR531X_WD_CTRL_IGNORE_EXPIRATION); 
     185+#endif 
    169186+ 
    170187+    if (!kgdbInitialized) { 
     
    220237+ } 
    221238+#endif /* CONFIG_EARLY_PRINTK_HACK || CONFIG_KGDB */ 
    222 diff -urN linux-2.4.32/arch/mips/ar531x/ar531xgpio.c linux-2.4.32.new/arch/mips/ar531x/ar531xgpio.c 
    223 --- linux-2.4.32/arch/mips/ar531x/ar531xgpio.c  1970-01-01 01:00:00.000000000 +0100 
    224 +++ linux-2.4.32.new/arch/mips/ar531x/ar531xgpio.c      2005-12-24 20:29:42.102311328 +0000 
    225 @@ -0,0 +1,141 @@ 
     239diff -urN linux-mips/arch/mips/ar531x/ar531xgpio.c mips-linux-2.4.25/arch/mips/ar531x/ar531xgpio.c 
     240--- linux-mips/arch/mips/ar531x/ar531xgpio.c    1970-01-01 01:00:00.000000000 +0100 
     241+++ mips-linux-2.4.25/arch/mips/ar531x/ar531xgpio.c     2005-12-30 17:26:30.606883840 +0000 
     242@@ -0,0 +1,147 @@ 
    226243+/* 
    227244+ * This file is subject to the terms and conditions of the GNU General Public 
     
    270287+    int gpio; 
    271288+ 
     289+#ifndef CONFIG_AR5315 
    272290+    gpio = irq - AR531X_GPIO_IRQ_BASE; 
    273291+    gpioIntMask |= gpio; 
     
    280298+    sysRegWrite(AR531X_GPIO_CR, reg); 
    281299+    (void)sysRegRead(AR531X_GPIO_CR); /* flush to hardware */ 
     300+#endif 
    282301+} 
    283302+ 
     
    289308+    int gpio; 
    290309+ 
     310+#ifndef CONFIG_AR5315 
    291311+    gpio = irq - AR531X_GPIO_IRQ_BASE; 
    292 + 
    293312+    reg = sysRegRead(AR531X_GPIO_CR); 
    294313+    reg &= ~(GPIO_CR_M(gpio) | GPIO_CR_UART(gpio) | GPIO_CR_INT(gpio)); 
     
    300319+ 
    301320+    gpioIntMask &= ~gpio; 
     321+#endif 
    302322+} 
    303323+ 
     
    354374+{ 
    355375+    u32 gpioDataIn; 
    356 + 
     376+#if CONFIG_AR5315 
     377+    gpioDataIn = sysRegRead(AR5315_GPIO_DI) & gpioIntMask; 
     378+#else 
    357379+    gpioDataIn = sysRegRead(AR531X_GPIO_DI) & gpioIntMask; 
     380+#endif 
    358381+ 
    359382+    printk("spurious_gpio_handler: 0x%x di=0x%8.8x gpioIntMask=0x%8.8x\n", 
     
    365388+            NULL, NULL}; 
    366389+ 
    367 diff -urN linux-2.4.32/arch/mips/ar531x/ar531x.h linux-2.4.32.new/arch/mips/ar531x/ar531x.h 
    368 --- linux-2.4.32/arch/mips/ar531x/ar531x.h      1970-01-01 01:00:00.000000000 +0100 
    369 +++ linux-2.4.32.new/arch/mips/ar531x/ar531x.h  2005-12-24 20:29:42.102311328 +0000 
    370 @@ -0,0 +1,280 @@ 
     390diff -urN linux-mips/arch/mips/ar531x/ar531x.h mips-linux-2.4.25/arch/mips/ar531x/ar531x.h 
     391--- linux-mips/arch/mips/ar531x/ar531x.h        1970-01-01 01:00:00.000000000 +0100 
     392+++ mips-linux-2.4.25/arch/mips/ar531x/ar531x.h 2005-12-30 17:26:30.605883992 +0000 
     393@@ -0,0 +1,1018 @@ 
    371394+/* 
    372395+ * This file is subject to the terms and conditions of the GNU General Public 
     
    379402+#ifndef AR531X_H 
    380403+#define AR531X_H 1 
     404+ 
     405+#ifndef CONFIG_AR5315 
    381406+ 
    382407+#include <asm/addrspace.h> 
     
    391416+#define AR531X_APBBASE         0x1c000000 
    392417+#define AR531X_FLASH            0x1e000000 
     418+#define AR531X_UART0            0xbc000003      /* UART MMR */ 
    393419+ 
    394420+/* 
     
    648674+    u8  wlan1Mac[6];                 /* (ar5212) */ 
    649675+}; 
    650 +#endif /* AR531X_H */ 
    651 diff -urN linux-2.4.32/arch/mips/ar531x/ar531xintr.S linux-2.4.32.new/arch/mips/ar531x/ar531xintr.S 
    652 --- linux-2.4.32/arch/mips/ar531x/ar531xintr.S  1970-01-01 01:00:00.000000000 +0100 
    653 +++ linux-2.4.32.new/arch/mips/ar531x/ar531xintr.S      2005-12-24 20:29:42.103311176 +0000 
     676+ 
     677+#else 
     678+ 
     679+/* 
     680+ * Address map 
     681+ */ 
     682+#define AR5315_SDRAM0           0x00000000      /* DRAM */ 
     683+#define AR5315_SPI_READ         0x08000000      /* SPI FLASH */ 
     684+#define AR5315_WLAN0            0xB0000000      /* Wireless MMR */ 
     685+#define AR5315_PCI              0xB0100000      /* PCI MMR */ 
     686+#define AR5315_SDRAMCTL         0xB0300000      /* SDRAM MMR */ 
     687+#define AR5315_LOCAL            0xB0400000      /* LOCAL BUS MMR */ 
     688+#define AR5315_ENET0            0xB0500000      /* ETHERNET MMR */ 
     689+#define AR5315_DSLBASE          0xB1000000      /* RESET CONTROL MMR */ 
     690+#define AR5315_UART0            0xB1100003      /* UART MMR */ 
     691+#define AR5315_SPI              0xB1300000      /* SPI FLASH MMR */ 
     692+#define AR5315_FLASHBT          0xBfc00000      /* ro boot alias to FLASH */ 
     693+#define AR5315_RAM1             0x40000000      /* ram alias */ 
     694+#define AR5315_PCIEXT           0x80000000      /* pci external */ 
     695+#define AR5315_RAM2             0xc0000000      /* ram alias */ 
     696+#define AR5315_RAM3             0xe0000000      /* ram alias */ 
     697+ 
     698+/* 
     699+ * Reset Register 
     700+ */ 
     701+#define AR5315_COLD_RESET       (AR5315_DSLBASE + 0x0000) 
     702+ 
     703+/* Cold Reset */ 
     704+#define RESET_COLD_AHB              0x00000001 
     705+#define RESET_COLD_APB              0x00000002 
     706+#define RESET_COLD_CPU              0x00000004 
     707+#define RESET_COLD_CPUWARM          0x00000008 
     708+#define RESET_SYSTEM                (RESET_COLD_CPU | RESET_COLD_APB | RESET_COLD_AHB)      /* full system */ 
     709+ 
     710+/* Warm Reset */ 
     711+ 
     712+#define AR5315_RESET            (AR5315_DSLBASE + 0x0004) 
     713+ 
     714+#define RESET_WARM_WLAN0_MAC        0x00000001      /* warm reset WLAN0 MAC */ 
     715+#define RESET_WARM_WLAN0_BB         0x00000002      /* warm reset WLAN0 BaseBand */ 
     716+#define RESET_MPEGTS_RSVD           0x00000004      /* warm reset MPEG-TS */ 
     717+#define RESET_PCIDMA                0x00000008      /* warm reset PCI ahb/dma */ 
     718+#define RESET_MEMCTL                0x00000010      /* warm reset memory controller */ 
     719+#define RESET_LOCAL                 0x00000020      /* warm reset local bus */ 
     720+#define RESET_I2C_RSVD              0x00000040      /* warm reset I2C bus */ 
     721+#define RESET_SPI                   0x00000080      /* warm reset SPI interface */ 
     722+#define RESET_UART0                 0x00000100      /* warm reset UART0 */ 
     723+#define RESET_IR_RSVD               0x00000200      /* warm reset IR interface */ 
     724+#define RESET_EPHY0                 0x00000400      /* cold reset ENET0 phy */ 
     725+#define RESET_ENET0                 0x00000800      /* cold reset ENET0 mac */ 
     726+ 
     727+/* 
     728+ * AHB master arbitration control 
     729+ */ 
     730+#define AR5315_AHB_ARB_CTL      (AR5315_DSLBASE + 0x0008) 
     731+ 
     732+#define ARB_CPU                     0x00000001      /* CPU, default */ 
     733+#define ARB_WLAN                    0x00000002      /* WLAN */ 
     734+#define ARB_MPEGTS_RSVD             0x00000004      /* MPEG-TS */ 
     735+#define ARB_LOCAL                   0x00000008      /* LOCAL */ 
     736+#define ARB_PCI                     0x00000010      /* PCI */ 
     737+#define ARB_ETHERNET                0x00000020      /* Ethernet */ 
     738+#define ARB_RETRY                   0x00000100      /* retry policy, debug only */ 
     739+ 
     740+/* 
     741+ * Config Register 
     742+ */ 
     743+#define AR5315_ENDIAN_CTL       (AR5315_DSLBASE + 0x000c) 
     744+ 
     745+#define CONFIG_AHB                  0x00000001      /* EC - AHB bridge endianess */ 
     746+#define CONFIG_WLAN                 0x00000002      /* WLAN byteswap */ 
     747+#define CONFIG_MPEGTS_RSVD          0x00000004      /* MPEG-TS byteswap */ 
     748+#define CONFIG_PCI                  0x00000008      /* PCI byteswap */ 
     749+#define CONFIG_MEMCTL               0x00000010      /* Memory controller endianess */ 
     750+#define CONFIG_LOCAL                0x00000020      /* Local bus byteswap */ 
     751+#define CONFIG_ETHERNET             0x00000040      /* Ethernet byteswap */ 
     752+ 
     753+#define CONFIG_MERGE                0x00000200      /* CPU write buffer merge */ 
     754+#define CONFIG_CPU                  0x00000400      /* CPU big endian */ 
     755+#define CONFIG_PCIAHB               0x00000800 
     756+#define CONFIG_PCIAHB_BRIDGE        0x00001000 
     757+#define CONFIG_SPI                  0x00008000      /* SPI byteswap */ 
     758+#define CONFIG_CPU_DRAM             0x00010000 
     759+#define CONFIG_CPU_PCI              0x00020000 
     760+#define CONFIG_CPU_MMR              0x00040000 
     761+#define CONFIG_BIG                  0x00000400       
     762+ 
     763+ 
     764+/* 
     765+ * NMI control 
     766+ */ 
     767+#define AR5315_NMI_CTL          (AR5315_DSLBASE + 0x0010) 
     768+ 
     769+#define NMI_EN  1 
     770+ 
     771+/* 
     772+ * Revision Register - Initial value is 0x3010 (WMAC 3.0, AR531X 1.0). 
     773+ */ 
     774+#define AR5315_SREV             (AR5315_DSLBASE + 0x0014) 
     775+ 
     776+#define REV_MAJ                     0x00f0 
     777+#define REV_MAJ_S                   4 
     778+#define REV_MIN                     0x000f 
     779+#define REV_MIN_S                   0 
     780+#define REV_CHIP                    (REV_MAJ|REV_MIN) 
     781+ 
     782+/* 
     783+ * Interface Enable 
     784+ */ 
     785+#define AR5315_IF_CTL           (AR5315_DSLBASE + 0x0018) 
     786+ 
     787+#define IF_MASK                     0x00000007 
     788+#define IF_DISABLED                 0 
     789+#define IF_PCI                      1 
     790+#define IF_TS_LOCAL                 2 
     791+#define IF_ALL                      3   /* only for emulation with separate pins */ 
     792+#define IF_LOCAL_HOST               0x00000008 
     793+#define IF_PCI_HOST                 0x00000010 
     794+#define IF_PCI_INTR                 0x00000020 
     795+#define IF_PCI_CLK_MASK             0x00030000 
     796+#define IF_PCI_CLK_INPUT            0  
     797+#define IF_PCI_CLK_OUTPUT_LOW       1 
     798+#define IF_PCI_CLK_OUTPUT_CLK       2 
     799+#define IF_PCI_CLK_OUTPUT_HIGH      3 
     800+#define IF_PCI_CLK_SHIFT            16  
     801+  
     802+                 
     803+/* Major revision numbers, bits 7..4 of Revision ID register */ 
     804+#define REV_MAJ_AR5311              0x01 
     805+#define REV_MAJ_AR5312              0x04 
     806+#define REV_MAJ_AR5315              0x0B 
     807+ 
     808+/* 
     809+ * APB Interrupt control 
     810+ */ 
     811+ 
     812+#define AR5315_ISR              (AR5315_DSLBASE + 0x0020) 
     813+#define AR5315_IMR              (AR5315_DSLBASE + 0x0024) 
     814+#define AR5315_GISR             (AR5315_DSLBASE + 0x0028) 
     815+ 
     816+#define ISR_UART0                   0x0001           /* high speed UART */ 
     817+#define ISR_I2C_RSVD                0x0002           /* I2C bus */ 
     818+#define ISR_SPI                     0x0004           /* SPI bus */ 
     819+#define ISR_AHB                     0x0008           /* AHB error */ 
     820+#define ISR_APB                     0x0010           /* APB error */ 
     821+#define ISR_TIMER                   0x0020           /* timer */ 
     822+#define ISR_GPIO                    0x0040           /* GPIO */ 
     823+#define ISR_WD                      0x0080           /* watchdog */ 
     824+#define ISR_IR_RSVD                 0x0100           /* IR */ 
     825+                                 
     826+#define IMR_UART0                   ISR_UART0 
     827+#define IMR_I2C_RSVD                ISR_I2C_RSVD 
     828+#define IMR_SPI                     ISR_SPI 
     829+#define IMR_AHB                     ISR_AHB 
     830+#define IMR_APB                     ISR_APB 
     831+#define IMR_TIMER                   ISR_TIMER 
     832+#define IMR_GPIO                    ISR_GPIO 
     833+#define IMR_WD                      ISR_WD 
     834+#define IMR_IR_RSVD                 ISR_IR_RSVD 
     835+ 
     836+#define GISR_MISC                   0x0001 
     837+#define GISR_WLAN0                  0x0002 
     838+#define GISR_MPEGTS_RSVD            0x0004 
     839+#define GISR_LOCALPCI               0x0008 
     840+#define GISR_WMACPOLL               0x0010 
     841+#define GISR_TIMER                  0x0020 
     842+#define GISR_ETHERNET               0x0040 
     843+ 
     844+/* 
     845+ * Interrupt routing from IO to the processor IP bits 
     846+ * Define our inter mask and level 
     847+ */ 
     848+#define AR5315_INTR_MISCIO      SR_IBIT3 
     849+#define AR5315_INTR_WLAN0       SR_IBIT4 
     850+#define AR5315_INTR_ENET0       SR_IBIT5 
     851+#define AR5315_INTR_LOCALPCI    SR_IBIT6 
     852+#define AR5315_INTR_WMACPOLL    SR_IBIT7 
     853+#define AR5315_INTR_COMPARE     SR_IBIT8 
     854+ 
     855+/* 
     856+ * Timers 
     857+ */ 
     858+#define AR5315_TIMER            (AR5315_DSLBASE + 0x0030) 
     859+#define AR5315_RELOAD           (AR5315_DSLBASE + 0x0034) 
     860+#define AR5315_WD               (AR5315_DSLBASE + 0x0038) 
     861+#define AR5315_WDC              (AR5315_DSLBASE + 0x003c) 
     862+ 
     863+#define WDC_RESET                   0x00000002               /* reset on watchdog */ 
     864+#define WDC_NMI                     0x00000001               /* NMI on watchdog */ 
     865+#define WDC_IGNORE_EXPIRATION       0x00000000 
     866+ 
     867+/* 
     868+ * Interface Debug 
     869+ */ 
     870+#define AR531X_FLASHDBG             (AR531X_RESETTMR + 0x0040) 
     871+#define AR531X_MIIDBG               (AR531X_RESETTMR + 0x0044) 
     872+ 
     873+ 
     874+/* 
     875+ * CPU Performance Counters 
     876+ */ 
     877+#define AR5315_PERFCNT0         (AR5315_DSLBASE + 0x0048) 
     878+#define AR5315_PERFCNT1         (AR5315_DSLBASE + 0x004c) 
     879+ 
     880+#define PERF_DATAHIT                0x0001  /* Count Data Cache Hits */ 
     881+#define PERF_DATAMISS               0x0002  /* Count Data Cache Misses */ 
     882+#define PERF_INSTHIT                0x0004  /* Count Instruction Cache Hits */ 
     883+#define PERF_INSTMISS               0x0008  /* Count Instruction Cache Misses */ 
     884+#define PERF_ACTIVE                 0x0010  /* Count Active Processor Cycles */ 
     885+#define PERF_WBHIT                  0x0020  /* Count CPU Write Buffer Hits */ 
     886+#define PERF_WBMISS                 0x0040  /* Count CPU Write Buffer Misses */ 
     887+                                 
     888+#define PERF_EB_ARDY                0x0001  /* Count EB_ARdy signal */ 
     889+#define PERF_EB_AVALID              0x0002  /* Count EB_AValid signal */ 
     890+#define PERF_EB_WDRDY               0x0004  /* Count EB_WDRdy signal */ 
     891+#define PERF_EB_RDVAL               0x0008  /* Count EB_RdVal signal */ 
     892+#define PERF_VRADDR                 0x0010  /* Count valid read address cycles */ 
     893+#define PERF_VWADDR                 0x0020  /* Count valid write address cycles */ 
     894+#define PERF_VWDATA                 0x0040  /* Count valid write data cycles */ 
     895+ 
     896+/* 
     897+ * AHB Error Reporting. 
     898+ */ 
     899+#define AR5315_AHB_ERR0         (AR5315_DSLBASE + 0x0050)  /* error  */ 
     900+#define AR5315_AHB_ERR1         (AR5315_DSLBASE + 0x0054)  /* haddr  */ 
     901+#define AR5315_AHB_ERR2         (AR5315_DSLBASE + 0x0058)  /* hwdata */ 
     902+#define AR5315_AHB_ERR3         (AR5315_DSLBASE + 0x005c)  /* hrdata */ 
     903+#define AR5315_AHB_ERR4         (AR5315_DSLBASE + 0x0060)  /* status */ 
     904+ 
     905+#define AHB_ERROR_DET               1   /* AHB Error has been detected,          */ 
     906+                                        /* write 1 to clear all bits in ERR0     */ 
     907+#define AHB_ERROR_OVR               2   /* AHB Error overflow has been detected  */ 
     908+#define AHB_ERROR_WDT               4   /* AHB Error due to wdt instead of hresp */ 
     909+ 
     910+#define PROCERR_HMAST               0x0000000f 
     911+#define PROCERR_HMAST_DFLT          0 
     912+#define PROCERR_HMAST_WMAC          1 
     913+#define PROCERR_HMAST_ENET          2 
     914+#define PROCERR_HMAST_PCIENDPT      3 
     915+#define PROCERR_HMAST_LOCAL         4 
     916+#define PROCERR_HMAST_CPU           5 
     917+#define PROCERR_HMAST_PCITGT        6 
     918+                                     
     919+#define PROCERR_HMAST_S             0 
     920+#define PROCERR_HWRITE              0x00000010 
     921+#define PROCERR_HSIZE               0x00000060 
     922+#define PROCERR_HSIZE_S             5 
     923+#define PROCERR_HTRANS              0x00000180 
     924+#define PROCERR_HTRANS_S            7 
     925+#define PROCERR_HBURST              0x00000e00 
     926+#define PROCERR_HBURST_S            9 
     927+ 
     928+ 
     929+ 
     930+/* 
     931+ * Clock Control 
     932+ */ 
     933+#define AR5315_PLLC_CTL         (AR5315_DSLBASE + 0x0064) 
     934+#define AR5315_PLLV_CTL         (AR5315_DSLBASE + 0x0068) 
     935+#define AR5315_CPUCLK           (AR5315_DSLBASE + 0x006c) 
     936+#define AR5315_AMBACLK          (AR5315_DSLBASE + 0x0070) 
     937+#define AR5315_SYNCCLK          (AR5315_DSLBASE + 0x0074) 
     938+#define AR5315_DSL_SLEEP_CTL    (AR5315_DSLBASE + 0x0080) 
     939+#define AR5315_DSL_SLEEP_DUR    (AR5315_DSLBASE + 0x0084) 
     940+ 
     941+/* PLLc Control fields */ 
     942+#define PLLC_REF_DIV_M              0x00000003 
     943+#define PLLC_REF_DIV_S              0 
     944+#define PLLC_FDBACK_DIV_M           0x0000007C 
     945+#define PLLC_FDBACK_DIV_S           2 
     946+#define PLLC_ADD_FDBACK_DIV_M       0x00000080 
     947+#define PLLC_ADD_FDBACK_DIV_S       7 
     948+#define PLLC_CLKC_DIV_M             0x0001c000 
     949+#define PLLC_CLKC_DIV_S             14 
     950+#define PLLC_CLKM_DIV_M             0x00700000 
     951+#define PLLC_CLKM_DIV_S             20 
     952+ 
     953+/* CPU CLK Control fields */ 
     954+#define CPUCLK_CLK_SEL_M            0x00000003 
     955+#define CPUCLK_CLK_SEL_S            0 
     956+#define CPUCLK_CLK_DIV_M            0x0000000c 
     957+#define CPUCLK_CLK_DIV_S            2 
     958+ 
     959+/* AMBA CLK Control fields */ 
     960+#define AMBACLK_CLK_SEL_M           0x00000003 
     961+#define AMBACLK_CLK_SEL_S           0 
     962+#define AMBACLK_CLK_DIV_M           0x0000000c 
     963+#define AMBACLK_CLK_DIV_S           2 
     964+ 
     965+#if defined(COBRA_EMUL) 
     966+#define AR5315_AMBA_CLOCK_RATE  20000000 
     967+#define AR5315_CPU_CLOCK_RATE   40000000 
     968+#else 
     969+#if defined(DEFAULT_PLL) 
     970+#define AR5315_AMBA_CLOCK_RATE  40000000 
     971+#define AR5315_CPU_CLOCK_RATE   40000000 
     972+#else 
     973+#define AR5315_AMBA_CLOCK_RATE  92000000 
     974+#define AR5315_CPU_CLOCK_RATE   184000000 
     975+#endif /* ! DEFAULT_PLL */ 
     976+#endif /* ! COBRA_EMUL */ 
     977+ 
     978+#define AR5315_UART_CLOCK_RATE  AR5315_AMBA_CLOCK_RATE 
     979+#define AR5315_SDRAM_CLOCK_RATE AR5315_AMBA_CLOCK_RATE 
     980+ 
     981+/* 
     982+ * The UART computes baud rate as: 
     983+ *   baud = clock / (16 * divisor) 
     984+ * where divisor is specified as a High Byte (DLM) and a Low Byte (DLL). 
     985+ */ 
     986+#define DESIRED_BAUD_RATE           38400 
     987+ 
     988+/* 
     989+ * The WATCHDOG value is computed as 
     990+ *  10 seconds * AR531X_WATCHDOG_CLOCK_RATE 
     991+ */ 
     992+#define DESIRED_WATCHDOG_SECONDS    10 
     993+#define AR531X_WATCHDOG_TIME \ 
     994+        (DESIRED_WATCHDOG_SECONDS * AR531X_WATCHDOG_CLOCK_RATE) 
     995+ 
     996+ 
     997+#define CLOCKCTL_UART0  0x0010  /* enable UART0 external clock */ 
     998+ 
     999+ 
     1000+ /* 
     1001+ * Applicable "PCICFG" bits for WLAN(s).  Assoc status and LED mode. 
     1002+ */ 
     1003+#define AR531X_PCICFG               (AR531X_RESETTMR + 0x00b0) 
     1004+#define ASSOC_STATUS_M              0x00000003 
     1005+#define ASSOC_STATUS_NONE           0 
     1006+#define ASSOC_STATUS_PENDING        1    
     1007+#define ASSOC_STATUS_ASSOCIATED     2 
     1008+#define LED_MODE_M                  0x0000001c 
     1009+#define LED_BLINK_THRESHOLD_M       0x000000e0 
     1010+#define LED_SLOW_BLINK_MODE         0x00000100 
     1011+ 
     1012+/* 
     1013+ * GPIO 
     1014+ */ 
     1015+ 
     1016+#define AR5315_GPIO_DI          (AR5315_DSLBASE + 0x0088) 
     1017+#define AR5315_GPIO_DO          (AR5315_DSLBASE + 0x0090) 
     1018+#define AR5315_GPIO_CR          (AR5315_DSLBASE + 0x0098) 
     1019+#define AR5315_GPIO_INT         (AR5315_DSLBASE + 0x00a0) 
     1020+ 
     1021+#define GPIO_CR_M(x)                (1 << (x))                  /* mask for i/o */ 
     1022+#define GPIO_CR_O(x)                (1 << (x))                  /* output */ 
     1023+#define GPIO_CR_I(x)                (0 << (x))                  /* input */ 
     1024+ 
     1025+#define GPIO_INT(x,Y)               ((x) << (8 * (Y)))          /* interrupt enable */ 
     1026+#define GPIO_INT_M(Y)               ((0x3F) << (8 * (Y)))       /* mask for int */ 
     1027+#define GPIO_INT_LVL(x,Y)           ((x) << (8 * (Y) + 6))      /* interrupt level */ 
     1028+#define GPIO_INT_LVL_M(Y)           ((0x3) << (8 * (Y) + 6))    /* mask for int level */ 
     1029+ 
     1030+#define AR5315_RESET_GPIO       5 
     1031+#define AR5315_NUM_GPIO         22 
     1032+ 
     1033+     
     1034+/*  
     1035+ *  PCI Clock Control 
     1036+ */      
     1037+  
     1038+#define AR5315_PCICLK           (AR5315_DSLBASE + 0x00a4) 
     1039+ 
     1040+#define PCICLK_INPUT_M              0x3 
     1041+#define PCICLK_INPUT_S              0 
     1042+                          
     1043+#define PCICLK_PLLC_CLKM            0 
     1044+#define PCICLK_PLLC_CLKM1           1 
     1045+#define PCICLK_PLLC_CLKC            2 
     1046+#define PCICLK_REF_CLK              3  
     1047+ 
     1048+#define PCICLK_DIV_M                0xc 
     1049+#define PCICLK_DIV_S                2 
     1050+                          
     1051+#define PCICLK_IN_FREQ              0 
     1052+#define PCICLK_IN_FREQ_DIV_6        1 
     1053+#define PCICLK_IN_FREQ_DIV_8        2 
     1054+#define PCICLK_IN_FREQ_DIV_10       3  
     1055+ 
     1056+/* 
     1057+ * Observation Control Register 
     1058+ */ 
     1059+#define AR5315_OCR              (AR5315_DSLBASE + 0x00b0) 
     1060+#define OCR_GPIO0_IRIN              0x0040 
     1061+#define OCR_GPIO1_IROUT             0x0080 
     1062+#define OCR_GPIO3_RXCLR             0x0200 
     1063+ 
     1064+/*  
     1065+ *  General Clock Control 
     1066+ */      
     1067+  
     1068+#define AR5315_MISCCLK          (AR5315_DSLBASE + 0x00b4) 
     1069+#define MISCCLK_PLLBYPASS_EN        0x00000001 
     1070+#define MISCCLK_PROCREFCLK          0x00000002 
     1071+ 
     1072+/* 
     1073+ * SDRAM Controller 
     1074+ *   - No read or write buffers are included. 
     1075+ */ 
     1076+#define AR5315_MEM_CFG          (AR5315_SDRAMCTL + 0x00) 
     1077+#define AR5315_MEM_CTRL         (AR5315_SDRAMCTL + 0x0c) 
     1078+#define AR5315_MEM_REF          (AR5315_SDRAMCTL + 0x10) 
     1079+ 
     1080+#define SDRAM_DATA_WIDTH_M          0x00006000 
     1081+#define SDRAM_DATA_WIDTH_S          13 
     1082+ 
     1083+#define SDRAM_COL_WIDTH_M           0x00001E00 
     1084+#define SDRAM_COL_WIDTH_S           9 
     1085+ 
     1086+#define SDRAM_ROW_WIDTH_M           0x000001E0 
     1087+#define SDRAM_ROW_WIDTH_S           5 
     1088+ 
     1089+#define SDRAM_BANKADDR_BITS_M       0x00000018 
     1090+#define SDRAM_BANKADDR_BITS_S       3 
     1091+ 
     1092+ 
     1093+/* 
     1094+ * SDRAM Memory Refresh (MEM_REF) value is computed as: 
     1095+ * MEMCTL_SREFR = (Tr * hclk_freq) / R 
     1096+ * where Tr is max. time of refresh of any single row 
     1097+ * R is number of rows in the DRAM 
     1098+ * For most 133MHz SDRAM parts, Tr=64ms, R=4096 or 8192 
     1099+ */ 
     1100+#if defined(COBRA_EMUL) 
     1101+#define AR5315_SDRAM_MEMORY_REFRESH_VALUE  0x96 
     1102+#else  
     1103+#if defined(DEFAULT_PLL) 
     1104+#define AR5315_SDRAM_MEMORY_REFRESH_VALUE  0x200 
     1105+#else 
     1106+#define AR5315_SDRAM_MEMORY_REFRESH_VALUE  0x61a 
     1107+#endif /* ! DEFAULT_PLL */ 
     1108+#endif  
     1109+ 
     1110+#if defined(AR5315) 
     1111+ 
     1112+#define AR5315_SDRAM_DDR_SDRAM      0   /* Not DDR SDRAM */ 
     1113+#define AR5315_SDRAM_DATA_WIDTH     16  /* bits */    
     1114+#define AR5315_SDRAM_COL_WIDTH      8 
     1115+#define AR5315_SDRAM_ROW_WIDTH      12 
     1116+ 
     1117+#else 
     1118+ 
     1119+#define AR5315_SDRAM_DDR_SDRAM      0   /* Not DDR SDRAM */ 
     1120+#define AR5315_SDRAM_DATA_WIDTH     16 
     1121+#define AR5315_SDRAM_COL_WIDTH      8 
     1122+#define AR5315_SDRAM_ROW_WIDTH      12 
     1123+ 
     1124+#endif /* ! AR5315 */ 
     1125+ 
     1126+/* 
     1127+ * SPI Flash Interface Registers 
     1128+ */ 
     1129+ 
     1130+#define AR5315_SPI_CTL      (AR5315_SPI + 0x00) 
     1131+#define AR5315_SPI_OPCODE   (AR5315_SPI + 0x04) 
     1132+#define AR5315_SPI_DATA     (AR5315_SPI + 0x08) 
     1133+ 
     1134+#define SPI_CTL_START           0x00000100 
     1135+#define SPI_CTL_BUSY            0x00010000 
     1136+#define SPI_CTL_TXCNT_MASK      0x0000000f 
     1137+#define SPI_CTL_RXCNT_MASK      0x000000f0 
     1138+#define SPI_CTL_TX_RX_CNT_MASK  0x000000ff 
     1139+#define SPI_CTL_SIZE_MASK       0x00060000 
     1140+ 
     1141+#define SPI_CTL_CLK_SEL_MASK    0x03000000 
     1142+#define SPI_OPCODE_MASK         0x000000ff 
     1143+ 
     1144+/*  
     1145+ * PCI-MAC Configuration registers  
     1146+ */ 
     1147+#define PCI_MAC_RC              (AR5315_PCI + 0x4000)  
     1148+#define PCI_MAC_SCR             (AR5315_PCI + 0x4004) 
     1149+#define PCI_MAC_INTPEND         (AR5315_PCI + 0x4008) 
     1150+#define PCI_MAC_SFR             (AR5315_PCI + 0x400C) 
     1151+#define PCI_MAC_PCICFG          (AR5315_PCI + 0x4010) 
     1152+#define PCI_MAC_SREV            (AR5315_PCI + 0x4020) 
     1153+ 
     1154+#define PCI_MAC_RC_MAC          0x00000001 
     1155+#define PCI_MAC_RC_BB           0x00000002 
     1156+ 
     1157+#define PCI_MAC_SCR_SLMODE_M    0x00030000 
     1158+#define PCI_MAC_SCR_SLMODE_S    16         
     1159+#define PCI_MAC_SCR_SLM_FWAKE   0          
     1160+#define PCI_MAC_SCR_SLM_FSLEEP  1          
     1161+#define PCI_MAC_SCR_SLM_NORMAL  2          
     1162+ 
     1163+#define PCI_MAC_SFR_SLEEP       0x00000001 
     1164+ 
     1165+#define PCI_MAC_PCICFG_SPWR_DN  0x00010000 
     1166+ 
     1167+  
     1168+ 
     1169+ 
     1170+/* 
     1171+ * PCI Bus Interface Registers 
     1172+ */ 
     1173+#define AR5315_PCI_1MS_REG      (AR5315_PCI + 0x0008) 
     1174+#define AR5315_PCI_1MS_MASK     0x3FFFF         /* # of AHB clk cycles in 1ms */ 
     1175+ 
     1176+#define AR5315_PCI_MISC_CONFIG  (AR5315_PCI + 0x000c) 
     1177+#define AR5315_PCIMISC_TXD_EN   0x00000001      /* Enable TXD for fragments */ 
     1178+#define AR5315_PCIMISC_CFG_SEL  0x00000002      /* mem or config cycles */ 
     1179+#define AR5315_PCIMISC_GIG_MASK 0x0000000C      /* bits 31-30 for pci req */ 
     1180+#define AR5315_PCIMISC_RST_MODE 0x00000030 
     1181+#define AR5315_PCIRST_INPUT     0x00000000      /* 4:5=0 rst is input */ 
     1182+#define AR5315_PCIRST_LOW       0x00000010      /* 4:5=1 rst to GND */ 
     1183+#define AR5315_PCIRST_HIGH      0x00000020      /* 4:5=2 rst to VDD */ 
     1184+#define AR5315_PCIGRANT_EN      0x00000000      /* 6:7=0 early grant en */ 
     1185+#define AR5315_PCIGRANT_FRAME   0x00000040      /* 6:7=1 grant waits 4 frame */ 
     1186+#define AR5315_PCIGRANT_IDLE    0x00000080      /* 6:7=2 grant waits 4 idle */ 
     1187+#define AR5315_PCIGRANT_GAP     0x00000000      /* 6:7=2 grant waits 4 idle */ 
     1188+#define AR5315_PCICACHE_DIS     0x00001000      /* PCI external access cache disable */ 
     1189+ 
     1190+#define AR5315_PCI_OUT_TSTAMP   (AR5315_PCI + 0x0010) 
     1191+ 
     1192+#define AR5315_PCI_UNCACHE_CFG  (AR5315_PCI + 0x0014) 
     1193+ 
     1194+#define AR5315_PCI_IN_EN        (AR5315_PCI + 0x0100) 
     1195+#define AR5315_PCI_IN_EN0       0x01            /* Enable chain 0 */ 
     1196+#define AR5315_PCI_IN_EN1       0x02            /* Enable chain 1 */ 
     1197+#define AR5315_PCI_IN_EN2       0x04            /* Enable chain 2 */ 
     1198+#define AR5315_PCI_IN_EN3       0x08            /* Enable chain 3 */ 
     1199+ 
     1200+#define AR5315_PCI_IN_DIS       (AR5315_PCI + 0x0104) 
     1201+#define AR5315_PCI_IN_DIS0      0x01            /* Disable chain 0 */ 
     1202+#define AR5315_PCI_IN_DIS1      0x02            /* Disable chain 1 */ 
     1203+#define AR5315_PCI_IN_DIS2      0x04            /* Disable chain 2 */ 
     1204+#define AR5315_PCI_IN_DIS3      0x08            /* Disable chain 3 */ 
     1205+ 
     1206+#define AR5315_PCI_IN_PTR       (AR5315_PCI + 0x0200) 
     1207+ 
     1208+#define AR5315_PCI_OUT_EN       (AR5315_PCI + 0x0400) 
     1209+#define AR5315_PCI_OUT_EN0      0x01            /* Enable chain 0 */ 
     1210+ 
     1211+#define AR5315_PCI_OUT_DIS      (AR5315_PCI + 0x0404) 
     1212+#define AR5315_PCI_OUT_DIS0     0x01            /* Disable chain 0 */ 
     1213+ 
     1214+#define AR5315_PCI_OUT_PTR      (AR5315_PCI + 0x0408) 
     1215+ 
     1216+#define AR5315_PCI_INT_STATUS   (AR5315_PCI + 0x0500)   /* write one to clr */ 
     1217+#define AR5315_PCI_TXINT        0x00000001      /* Desc In Completed */ 
     1218+#define AR5315_PCI_TXOK         0x00000002      /* Desc In OK */ 
     1219+#define AR5315_PCI_TXERR        0x00000004      /* Desc In ERR */ 
     1220+#define AR5315_PCI_TXEOL        0x00000008      /* Desc In End-of-List */ 
     1221+#define AR5315_PCI_RXINT        0x00000010      /* Desc Out Completed */ 
     1222+#define AR5315_PCI_RXOK         0x00000020      /* Desc Out OK */ 
     1223+#define AR5315_PCI_RXERR        0x00000040      /* Desc Out ERR */ 
     1224+#define AR5315_PCI_RXEOL        0x00000080      /* Desc Out EOL */ 
     1225+#define AR5315_PCI_TXOOD        0x00000200      /* Desc In Out-of-Desc */ 
     1226+#define AR5315_PCI_MASK         0x0000FFFF      /* Desc Mask */ 
     1227+#define AR5315_PCI_EXT_INT      0x02000000       
     1228+#define AR5315_PCI_ABORT_INT    0x04000000       
     1229+ 
     1230+#define AR5315_PCI_INT_MASK     (AR5315_PCI + 0x0504)   /* same as INT_STATUS */ 
     1231+ 
     1232+#define AR5315_PCI_INTEN_REG    (AR5315_PCI + 0x0508) 
     1233+#define AR5315_PCI_INT_DISABLE  0x00            /* disable pci interrupts */ 
     1234+#define AR5315_PCI_INT_ENABLE   0x01            /* enable pci interrupts */ 
     1235+ 
     1236+#define AR5315_PCI_HOST_IN_EN   (AR5315_PCI + 0x0800) 
     1237+#define AR5315_PCI_HOST_IN_DIS  (AR5315_PCI + 0x0804) 
     1238+#define AR5315_PCI_HOST_IN_PTR  (AR5315_PCI + 0x0810) 
     1239+#define AR5315_PCI_HOST_OUT_EN  (AR5315_PCI + 0x0900) 
     1240+#define AR5315_PCI_HOST_OUT_DIS (AR5315_PCI + 0x0904) 
     1241+#define AR5315_PCI_HOST_OUT_PTR (AR5315_PCI + 0x0908) 
     1242+ 
     1243+ 
     1244+/* 
     1245+ * Local Bus Interface Registers 
     1246+ */ 
     1247+#define AR5315_LB_CONFIG        (AR5315_LOCAL + 0x0000) 
     1248+#define AR5315_LBCONF_OE        0x00000001      /* =1 OE is low-true */ 
     1249+#define AR5315_LBCONF_CS0       0x00000002      /* =1 first CS is low-true */ 
     1250+#define AR5315_LBCONF_CS1       0x00000004      /* =1 2nd CS is low-true */ 
     1251+#define AR5315_LBCONF_RDY       0x00000008      /* =1 RDY is low-true */ 
     1252+#define AR5315_LBCONF_WE        0x00000010      /* =1 Write En is low-true */ 
     1253+#define AR5315_LBCONF_WAIT      0x00000020      /* =1 WAIT is low-true */ 
     1254+#define AR5315_LBCONF_ADS       0x00000040      /* =1 Adr Strobe is low-true */ 
     1255+#define AR5315_LBCONF_MOT       0x00000080      /* =0 Intel, =1 Motorola */ 
     1256+#define AR5315_LBCONF_8CS       0x00000100      /* =1 8 bits CS, 0= 16bits */ 
     1257+#define AR5315_LBCONF_8DS       0x00000200      /* =1 8 bits Data S, 0=16bits */ 
     1258+#define AR5315_LBCONF_ADS_EN    0x00000400      /* =1 Enable ADS */ 
     1259+#define AR5315_LBCONF_ADR_OE    0x00000800      /* =1 Adr cap on OE, WE or DS */ 
     1260+#define AR5315_LBCONF_ADDT_MUX  0x00001000      /* =1 Adr and Data share bus */ 
     1261+#define AR5315_LBCONF_DATA_OE   0x00002000      /* =1 Data cap on OE, WE, DS */ 
     1262+#define AR5315_LBCONF_16DATA    0x00004000      /* =1 Data is 16 bits wide */ 
     1263+#define AR5315_LBCONF_SWAPDT    0x00008000      /* =1 Byte swap data */ 
     1264+#define AR5315_LBCONF_SYNC      0x00010000      /* =1 Bus synchronous to clk */ 
     1265+#define AR5315_LBCONF_INT       0x00020000      /* =1 Intr is low true */ 
     1266+#define AR5315_LBCONF_INT_CTR0  0x00000000      /* GND high-Z, Vdd is high-Z */ 
     1267+#define AR5315_LBCONF_INT_CTR1  0x00040000      /* GND drive, Vdd is high-Z */ 
     1268+#define AR5315_LBCONF_INT_CTR2  0x00080000      /* GND high-Z, Vdd drive */ 
     1269+#define AR5315_LBCONF_INT_CTR3  0x000C0000      /* GND drive, Vdd drive */ 
     1270+#define AR5315_LBCONF_RDY_WAIT  0x00100000      /* =1 RDY is negative of WAIT */ 
     1271+#define AR5315_LBCONF_INT_PULSE 0x00200000      /* =1 Interrupt is a pulse */ 
     1272+#define AR5315_LBCONF_ENABLE    0x00400000      /* =1 Falcon respond to LB */ 
     1273+ 
     1274+#define AR5315_LB_CLKSEL        (AR5315_LOCAL + 0x0004) 
     1275+#define AR5315_LBCLK_EXT        0x0001          /* use external clk for lb */ 
     1276+ 
     1277+#define AR5315_LB_1MS           (AR5315_LOCAL + 0x0008) 
     1278+#define AR5315_LB1MS_MASK       0x3FFFF         /* # of AHB clk cycles in 1ms */ 
     1279+ 
     1280+#define AR5315_LB_MISCCFG       (AR5315_LOCAL + 0x000C) 
     1281+#define AR5315_LBM_TXD_EN       0x00000001      /* Enable TXD for fragments */ 
     1282+#define AR5315_LBM_RX_INTEN     0x00000002      /* Enable LB ints on RX ready */ 
     1283+#define AR5315_LBM_MBOXWR_INTEN 0x00000004      /* Enable LB ints on mbox wr */ 
     1284+#define AR5315_LBM_MBOXRD_INTEN 0x00000008      /* Enable LB ints on mbox rd */ 
     1285+#define AR5315_LMB_DESCSWAP_EN  0x00000010      /* Byte swap desc enable */ 
     1286+#define AR5315_LBM_TIMEOUT_MASK 0x00FFFF80 
     1287+#define AR5315_LBM_TIMEOUT_SHFT 7 
     1288+#define AR5315_LBM_PORTMUX      0x07000000 
     1289+ 
     1290+ 
     1291+#define AR5315_LB_RXTSOFF       (AR5315_LOCAL + 0x0010) 
     1292+ 
     1293+#define AR5315_LB_TX_CHAIN_EN   (AR5315_LOCAL + 0x0100) 
     1294+#define AR5315_LB_TXEN_0        0x01 
     1295+#define AR5315_LB_TXEN_1        0x02 
     1296+#define AR5315_LB_TXEN_2        0x04 
     1297+#define AR5315_LB_TXEN_3        0x08 
     1298+ 
     1299+#define AR5315_LB_TX_CHAIN_DIS  (AR5315_LOCAL + 0x0104) 
     1300+#define AR5315_LB_TX_DESC_PTR   (AR5315_LOCAL + 0x0200) 
     1301+ 
     1302+#define AR5315_LB_RX_CHAIN_EN   (AR5315_LOCAL + 0x0400) 
     1303+#define AR5315_LB_RXEN          0x01 
     1304+ 
     1305+#define AR5315_LB_RX_CHAIN_DIS  (AR5315_LOCAL + 0x0404) 
     1306+#define AR5315_LB_RX_DESC_PTR   (AR5315_LOCAL + 0x0408) 
     1307+ 
     1308+#define AR5315_LB_INT_STATUS    (AR5315_LOCAL + 0x0500) 
     1309+#define AR5315_INT_TX_DESC      0x0001 
     1310+#define AR5315_INT_TX_OK        0x0002 
     1311+#define AR5315_INT_TX_ERR       0x0004 
     1312+#define AR5315_INT_TX_EOF       0x0008 
     1313+#define AR5315_INT_RX_DESC      0x0010 
     1314+#define AR5315_INT_RX_OK        0x0020 
     1315+#define AR5315_INT_RX_ERR       0x0040 
     1316+#define AR5315_INT_RX_EOF       0x0080 
     1317+#define AR5315_INT_TX_TRUNC     0x0100 
     1318+#define AR5315_INT_TX_STARVE    0x0200 
     1319+#define AR5315_INT_LB_TIMEOUT   0x0400 
     1320+#define AR5315_INT_LB_ERR       0x0800 
     1321+#define AR5315_INT_MBOX_WR      0x1000 
     1322+#define AR5315_INT_MBOX_RD      0x2000 
     1323+ 
     1324+/* Bit definitions for INT MASK are the same as INT_STATUS */ 
     1325+#define AR5315_LB_INT_MASK      (AR5315_LOCAL + 0x0504) 
     1326+ 
     1327+#define AR5315_LB_INT_EN        (AR5315_LOCAL + 0x0508) 
     1328+#define AR5315_LB_MBOX          (AR5315_LOCAL + 0x0600) 
     1329+ 
     1330+ 
     1331+ 
     1332+/* 
     1333+ * IR Interface Registers 
     1334+ */ 
     1335+#define AR5315_IR_PKTDATA                   (AR5315_IR + 0x0000) 
     1336+ 
     1337+#define AR5315_IR_PKTLEN                    (AR5315_IR + 0x07fc) /* 0 - 63 */ 
     1338+ 
     1339+#define AR5315_IR_CONTROL                   (AR5315_IR + 0x0800) 
     1340+#define AR5315_IRCTL_TX                     0x00000000  /* use as tranmitter */ 
     1341+#define AR5315_IRCTL_RX                     0x00000001  /* use as receiver   */ 
     1342+#define AR5315_IRCTL_SAMPLECLK_MASK         0x00003ffe  /* Sample clk divisor mask */ 
     1343+#define AR5315_IRCTL_SAMPLECLK_SHFT                  1 
     1344+#define AR5315_IRCTL_OUTPUTCLK_MASK         0x03ffc000  /* Output clk divisor mask */ 
     1345+#define AR5315_IRCTL_OUTPUTCLK_SHFT                 14 
     1346+ 
     1347+#define AR5315_IR_STATUS                    (AR5315_IR + 0x0804) 
     1348+#define AR5315_IRSTS_RX                     0x00000001  /* receive in progress */ 
     1349+#define AR5315_IRSTS_TX                     0x00000002  /* transmit in progress */ 
     1350+ 
     1351+#define AR5315_IR_CONFIG                    (AR5315_IR + 0x0808) 
     1352+#define AR5315_IRCFG_INVIN                  0x00000001  /* invert input polarity */ 
     1353+#define AR5315_IRCFG_INVOUT                 0x00000002  /* invert output polarity */ 
     1354+#define AR5315_IRCFG_SEQ_START_WIN_SEL      0x00000004  /* 1 => 28, 0 => 7 */ 
     1355+#define AR5315_IRCFG_SEQ_START_THRESH       0x000000f0  /*  */ 
     1356+#define AR5315_IRCFG_SEQ_END_UNIT_SEL       0x00000100  /*  */ 
     1357+#define AR5315_IRCFG_SEQ_END_UNIT_THRESH    0x00007e00  /*  */ 
     1358+#define AR5315_IRCFG_SEQ_END_WIN_SEL        0x00008000  /*  */ 
     1359+#define AR5315_IRCFG_SEQ_END_WIN_THRESH     0x001f0000  /*  */ 
     1360+#define AR5315_IRCFG_NUM_BACKOFF_WORDS      0x01e00000  /*  */ 
     1361+ 
     1362+/* 
     1363+ * PCI memory constants: Memory area 1 and 2 are the same size - 
     1364+ * (twice the PCI_TLB_PAGE_SIZE). The definition of 
     1365+ * CPU_TO_PCI_MEM_SIZE is coupled with the TLB setup routine 
     1366+ * sysLib.c/sysTlbInit(), in that it assumes that 2 pages of size 
     1367+ * PCI_TLB_PAGE_SIZE are set up in the TLB for each PCI memory space. 
     1368+ */ 
     1369+  
     1370+#define CPU_TO_PCI_MEM_BASE1    0xE0000000 
     1371+#define CPU_TO_PCI_MEM_SIZE1    (2*PCI_TLB_PAGE_SIZE) 
     1372+  
     1373+ 
     1374+/* TLB attributes for PCI transactions */ 
     1375+ 
     1376+#define PCI_MMU_PAGEMASK        0x00003FFF 
     1377+#define MMU_PAGE_UNCACHED       0x00000010 
     1378+#define MMU_PAGE_DIRTY          0x00000004 
     1379+#define MMU_PAGE_VALID          0x00000002 
     1380+#define MMU_PAGE_GLOBAL         0x00000001 
     1381+#define PCI_MMU_PAGEATTRIB      (MMU_PAGE_UNCACHED|MMU_PAGE_DIRTY|\ 
     1382+                                 MMU_PAGE_VALID|MMU_PAGE_GLOBAL) 
     1383+#define PCI_MEMORY_SPACE1_VIRT  0xE0000000      /* Used for non-prefet  mem   */ 
     1384+#define PCI_MEMORY_SPACE1_PHYS  0x80000000 
     1385+#define PCI_TLB_PAGE_SIZE       0x01000000 
     1386+#define TLB_HI_MASK             0xFFFFE000 
     1387+#define TLB_LO_MASK             0x3FFFFFFF 
     1388+#define PAGEMASK_SHIFT          11 
     1389+#define TLB_LO_SHIFT            6 
     1390+ 
     1391+#define PCI_MAX_LATENCY         0xFFF           /* Max PCI latency            */ 
     1392+ 
     1393+#define HOST_PCI_DEV_ID         3 
     1394+#define HOST_PCI_MBAR0          0x10000000 
     1395+#define HOST_PCI_MBAR1          0x20000000 
     1396+#define HOST_PCI_MBAR2          0x30000000 
     1397+ 
     1398+#define HOST_PCI_SDRAM_BASEADDR HOST_PCI_MBAR1 
     1399+#define PCI_DEVICE_MEM_SPACE    0x800000 
     1400+ 
     1401+ 
     1402+typedef unsigned int AR531X_REG; 
     1403+ 
     1404+#define sysRegRead(phys)       \ 
     1405+       (*(volatile AR531X_REG *)PHYS_TO_K1(phys)) 
     1406+ 
     1407+#define sysRegWrite(phys, val) \ 
     1408+       ((*(volatile AR531X_REG *)PHYS_TO_K1(phys)) = (val)) 
     1409+#endif 
     1410+ 
     1411+#endif 
     1412diff -urN linux-mips/arch/mips/ar531x/ar531xintr.S mips-linux-2.4.25/arch/mips/ar531x/ar531xintr.S 
     1413--- linux-mips/arch/mips/ar531x/ar531xintr.S    1970-01-01 01:00:00.000000000 +0100 
     1414+++ mips-linux-2.4.25/arch/mips/ar531x/ar531xintr.S     2005-12-30 17:26:31.000823952 +0000 
    6541415@@ -0,0 +1,30 @@ 
    6551416+/* 
     
    6831444+ 
    6841445+       END(ar531x_interrupt_receive) 
    685 diff -urN linux-2.4.32/arch/mips/ar531x/ar531xirq.c linux-2.4.32.new/arch/mips/ar531x/ar531xirq.c 
    686 --- linux-2.4.32/arch/mips/ar531x/ar531xirq.c   1970-01-01 01:00:00.000000000 +0100 
    687 +++ linux-2.4.32.new/arch/mips/ar531x/ar531xirq.c       2005-12-24 20:29:42.132306768 +0000 
    688 @@ -0,0 +1,292 @@ 
     1446diff -urN linux-mips/arch/mips/ar531x/ar531xirq.c mips-linux-2.4.25/arch/mips/ar531x/ar531xirq.c 
     1447--- linux-mips/arch/mips/ar531x/ar531xirq.c     1970-01-01 01:00:00.000000000 +0100 
     1448+++ mips-linux-2.4.25/arch/mips/ar531x/ar531xirq.c      2005-12-30 17:26:31.000823952 +0000 
     1449@@ -0,0 +1,442 @@ 
    6891450+/* 
    6901451+ * This file is subject to the terms and conditions of the GNU General Public 
     
    7441505+       unsigned int imr; 
    7451506+ 
     1507+#if CONFIG_AR5315 
     1508+       imr = sysRegRead(AR5315_IMR); 
     1509+        switch(irq) 
     1510+        { 
     1511+           case AR531X_MISC_IRQ_TIMER: 
     1512+             imr |= IMR_TIMER; 
     1513+            break; 
     1514+ 
     1515+          case AR531X_MISC_IRQ_AHB_PROC: 
     1516+             imr |= IMR_AHB; 
     1517+            break; 
     1518+ 
     1519+           case AR531X_MISC_IRQ_AHB_DMA: 
     1520+             imr |= 0/* ?? */; 
     1521+            break; 
     1522+            /* 
     1523+          case AR531X_ISR_GPIO: 
     1524+             imr |= IMR_GPIO; 
     1525+             break; 
     1526+             */ 
     1527+ 
     1528+          case AR531X_MISC_IRQ_UART0: 
     1529+             imr |= IMR_UART0; 
     1530+             break; 
     1531+ 
     1532+ 
     1533+           case        AR531X_MISC_IRQ_WATCHDOG: 
     1534+             imr |= IMR_WD; 
     1535+             break; 
     1536+ 
     1537+          case AR531X_MISC_IRQ_LOCAL: 
     1538+             imr |= 0/* ?? */; 
     1539+             break; 
     1540+ 
     1541+        } 
     1542+       sysRegWrite(AR5315_IMR, imr); 
     1543+       imr=sysRegRead(AR5315_IMR); /* flush write buffer */ 
     1544+        //printk("enable Interrupt irq 0x%x imr 0x%x \n",irq,imr); 
     1545+ 
     1546+#else 
    7461547+       imr = sysRegRead(AR531X_IMR); 
    7471548+       imr |= (1 << (irq - AR531X_MISC_IRQ_BASE - 1)); 
    7481549+       sysRegWrite(AR531X_IMR, imr); 
    7491550+       sysRegRead(AR531X_IMR); /* flush write buffer */ 
     1551+#endif 
    7501552+} 
    7511553+ 
     
    7561558+       unsigned int imr; 
    7571559+ 
     1560+#if CONFIG_AR5315 
     1561+       imr = sysRegRead(AR5315_IMR); 
     1562+        switch(irq) 
     1563+        { 
     1564+           case AR531X_MISC_IRQ_TIMER: 
     1565+             imr &= (~IMR_TIMER); 
     1566+            break; 
     1567+ 
     1568+          case AR531X_MISC_IRQ_AHB_PROC: 
     1569+             imr &= (~IMR_AHB); 
     1570+            break; 
     1571+ 
     1572+           case AR531X_MISC_IRQ_AHB_DMA: 
     1573+             imr &= 0/* ?? */; 
     1574+            break; 
     1575+            /* 
     1576+          case AR531X_ISR_GPIO: 
     1577+             imr &= ~IMR_GPIO; 
     1578+             break; 
     1579+             */ 
     1580+ 
     1581+          case AR531X_MISC_IRQ_UART0: 
     1582+             imr &= (~IMR_UART0); 
     1583+             break; 
     1584+ 
     1585+           case        AR531X_MISC_IRQ_WATCHDOG: 
     1586+             imr &= (~IMR_WD); 
     1587+             break; 
     1588+ 
     1589+          case AR531X_MISC_IRQ_LOCAL: 
     1590+             imr &= ~0/* ?? */; 
     1591+             break; 
     1592+ 
     1593+        } 
     1594+       sysRegWrite(AR5315_IMR, imr); 
     1595+       sysRegRead(AR5315_IMR); /* flush write buffer */ 
     1596+#else 
    7581597+       imr = sysRegRead(AR531X_IMR); 
    7591598+       imr &= ~(1 << (irq - AR531X_MISC_IRQ_BASE - 1)); 
    7601599+       sysRegWrite(AR531X_IMR, imr); 
    7611600+       sysRegRead(AR531X_IMR); /* flush write buffer */ 
     1601+#endif 
    7621602+} 
    7631603+ 
     
    8351675+ar531x_timer_handler(int cpl, void *dev_id, struct pt_regs *regs) 
    8361676+{ 
     1677+#if CONFIG_AR5315 
     1678+       (void)sysRegRead(AR5315_TIMER); /* clear interrupt */ 
     1679+#else 
    8371680+       (void)sysRegRead(AR531X_TIMER); /* clear interrupt */ 
     1681+#endif 
    8381682+} 
    8391683+ 
     
    8451689+    u32 dmaAddr; 
    8461690+    u32 dma1; 
    847 + 
     1691+#if CONFIG_AR5315 
     1692+    sysRegWrite(AR5315_AHB_ERR0,AHB_ERROR_DET); 
     1693+    sysRegRead(AR5315_AHB_ERR1); 
     1694+#else 
    8481695+    proc1 = sysRegRead(AR531X_PROC1); 
    8491696+    procAddr = sysRegRead(AR531X_PROCADDR); /* clears error state */ 
    8501697+    dma1 = sysRegRead(AR531X_DMA1); 
    8511698+    dmaAddr = sysRegRead(AR531X_DMAADDR);   /* clears error state */ 
     1699+#endif 
    8521700+ 
    8531701+    printk("AHB interrupt: PROCADDR=0x%8.8x  PROC1=0x%8.8x  DMAADDR=0x%8.8x  DMA1=0x%8.8x\n", 
     
    8871735+ * choosing which to dispatch first. 
    8881736+ */ 
     1737+extern void dump_uart(void *); 
     1738+ 
     1739+#if CONFIG_AR5315 
     1740+ 
     1741+void 
     1742+ar531x_irq_dispatch(struct pt_regs *regs) 
     1743+{ 
     1744+       int cause_intrs = regs->cp0_cause; 
     1745+       int status_intrs = regs->cp0_status; 
     1746+       int pending = cause_intrs & status_intrs; 
     1747+ 
     1748+       if (pending & CAUSEF_IP3) { 
     1749+               do_IRQ(AR531X_IRQ_WLAN0_INTRS, regs); 
     1750+       }                
     1751+       else if (pending & CAUSEF_IP4) { 
     1752+               do_IRQ(AR531X_IRQ_ENET0_INTRS, regs); 
     1753+       } 
     1754+       else if (pending & CAUSEF_IP2) { 
     1755+               AR531X_REG ar531x_isr = sysRegRead(AR5315_ISR); 
     1756+               AR531X_REG ar531x_imr = sysRegRead(AR5315_IMR); 
     1757+               unsigned int ar531x_misc_intrs = ar531x_isr & ar531x_imr; 
     1758+ 
     1759+               if (ar531x_misc_intrs & ISR_TIMER) 
     1760+                                         do_IRQ(AR531X_MISC_IRQ_TIMER, regs); 
     1761+               else if (ar531x_misc_intrs & ISR_AHB) 
     1762+                                         do_IRQ(AR531X_MISC_IRQ_AHB_PROC, regs); 
     1763+               else if (ar531x_misc_intrs & ISR_GPIO) 
     1764+                { 
     1765+                    int i; 
     1766+                    u32 gpioIntPending; 
     1767+ 
     1768+                    gpioIntPending = sysRegRead(AR5315_GPIO_DI) & gpioIntMask; 
     1769+                    for (i=0; i<AR531X_GPIO_IRQ_COUNT; i++) { 
     1770+                        if (gpioIntPending & (1 << i)) 
     1771+                                             do_IRQ(AR531X_GPIO_IRQ(i), regs); 
     1772+                    } 
     1773+                } 
     1774+               else if (ar531x_misc_intrs & ISR_UART0) { 
     1775+                               do_IRQ(AR531X_MISC_IRQ_UART0, regs); 
     1776+#if CONFIG_KGDB 
     1777+                        if (kgdbInterrupt()) { 
     1778+                                if (!user_mode(regs)) 
     1779+                                   set_async_breakpoint((unsigned long *)&regs->cp0_epc); 
     1780+                        } 
     1781+#endif         /* CONFIG_KGDB */ 
     1782+                } 
     1783+               else if (ar531x_misc_intrs & ISR_WD) 
     1784+                       do_IRQ(AR531X_MISC_IRQ_WATCHDOG, regs); 
     1785+               else 
     1786+                       do_IRQ(AR531X_MISC_IRQ_NONE, regs); 
     1787+       } else if (pending & CAUSEF_IP7) { 
     1788+               do_IRQ(AR531X_IRQ_CPU_CLOCK, regs); 
     1789+        } 
     1790+       else { 
     1791+               do_IRQ(AR531X_IRQ_NONE, regs); 
     1792+        } 
     1793+} 
     1794+ 
     1795+#else 
     1796+ 
    8891797+void 
    8901798+ar531x_irq_dispatch(struct pt_regs *regs) 
     
    9441852+               else 
    9451853+                       do_IRQ(AR531X_MISC_IRQ_NONE, regs); 
    946 +       } else if (pending & CAUSEF_IP7) 
     1854+       } else if (pending & CAUSEF_IP7) { 
    9471855+               do_IRQ(AR531X_IRQ_CPU_CLOCK, regs); 
    948 +       else 
     1856+       } else 
    9491857+               do_IRQ(AR531X_IRQ_NONE, regs); 
    9501858+} 
     1859+ 
     1860+#endif 
    9511861+ 
    9521862+void __init init_IRQ(void) 
     
    9681878+       setup_irq(AR531X_MISC_IRQ_NONE, &spurious_misc); 
    9691879+       setup_irq(AR531X_GPIO_IRQ_NONE, &spurious_gpio); 
    970 + 
     1880+#ifndef CONFIG_AR5315 
    9711881+       setup_irq(AR531X_MISC_IRQ_TIMER, &ar531x_timer_interrupt); 
     1882+#endif 
    9721883+       setup_irq(AR531X_MISC_IRQ_AHB_PROC, &ar531x_ahb_proc_interrupt); 
    9731884+        setup_irq(AR531X_MISC_IRQ_GPIO, &cascade); 
     
    9791890+#endif 
    9801891+} 
    981 diff -urN linux-2.4.32/arch/mips/ar531x/ar531xksyms.c linux-2.4.32.new/arch/mips/ar531x/ar531xksyms.c 
    982 --- linux-2.4.32/arch/mips/ar531x/ar531xksyms.c 1970-01-01 01:00:00.000000000 +0100 
    983 +++ linux-2.4.32.new/arch/mips/ar531x/ar531xksyms.c     2005-12-24 20:29:42.132306768 +0000 
    984 @@ -0,0 +1,16 @@ 
     1892diff -urN linux-mips/arch/mips/ar531x/ar531xksyms.c mips-linux-2.4.25/arch/mips/ar531x/ar531xksyms.c 
     1893--- linux-mips/arch/mips/ar531x/ar531xksyms.c   1970-01-01 01:00:00.000000000 +0100 
     1894+++ mips-linux-2.4.25/arch/mips/ar531x/ar531xksyms.c    2005-12-30 17:26:31.001823800 +0000 
     1895@@ -0,0 +1,17 @@ 
    9851896+/* 
    9861897+ * This file is subject to the terms and conditions of the GNU General Public 
     
    9941905+#include "asm/atheros/ar531xbsp.h" 
    9951906+ 
    996 +#if CONFIG_KGDB 
     1907+#ifdef CONFIG_KGDB 
    9971908+EXPORT_SYMBOL(kgdbInit); 
    9981909+EXPORT_SYMBOL(kgdbEnabled); 
    9991910+#endif 
    10001911+EXPORT_SYMBOL(ar531x_sys_frequency); 
    1001 diff -urN linux-2.4.32/arch/mips/ar531x/ar531xlnx.h linux-2.4.32.new/arch/mips/ar531x/ar531xlnx.h 
    1002 --- linux-2.4.32/arch/mips/ar531x/ar531xlnx.h   1970-01-01 01:00:00.000000000 +0100 
    1003 +++ linux-2.4.32.new/arch/mips/ar531x/ar531xlnx.h       2005-12-24 20:29:42.133306616 +0000 
    1004 @@ -0,0 +1,122 @@ 
     1912+EXPORT_SYMBOL(get_system_type); 
     1913diff -urN linux-mips/arch/mips/ar531x/ar531xlnx.h mips-linux-2.4.25/arch/mips/ar531x/ar531xlnx.h 
     1914--- linux-mips/arch/mips/ar531x/ar531xlnx.h     1970-01-01 01:00:00.000000000 +0100 
     1915+++ mips-linux-2.4.25/arch/mips/ar531x/ar531xlnx.h      2005-12-30 17:26:31.001823800 +0000 
     1916@@ -0,0 +1,135 @@ 
    10051917+/* 
    10061918+ * This file is subject to the terms and conditions of the GNU General Public 
     
    10251937+ 
    10261938+/* Software's idea of interrupts handled by "CPU Interrupt Controller" */ 
     1939+#if CONFIG_AR5315 
     1940+#define AR531X_IRQ_NONE                MIPS_CPU_IRQ_BASE+0 
     1941+#define AR531X_IRQ_MISC_INTRS  MIPS_CPU_IRQ_BASE+2 /* C0_CAUSE: 0x0400 */ 
     1942+#define AR531X_IRQ_WLAN0_INTRS MIPS_CPU_IRQ_BASE+3 /* C0_CAUSE: 0x0800 */ 
     1943+#define AR531X_IRQ_ENET0_INTRS MIPS_CPU_IRQ_BASE+4 /* C0_CAUSE: 0x1000 */ 
     1944+#define AR531X_IRQ_LCBUS_PCI   MIPS_CPU_IRQ_BASE+6 /* C0_CAUSE: 0x4000 */ 
     1945+#define AR531X_IRQ_WLAN0_POLL  MIPS_CPU_IRQ_BASE+6 /* C0_CAUSE: 0x4000 */ 
     1946+#define AR531X_IRQ_CPU_CLOCK   MIPS_CPU_IRQ_BASE+7 /* C0_CAUSE: 0x8000 */ 
     1947+#else 
    10271948+#define AR531X_IRQ_NONE                MIPS_CPU_IRQ_BASE+0 
    10281949+#define AR531X_IRQ_WLAN0_INTRS MIPS_CPU_IRQ_BASE+2 /* C0_CAUSE: 0x0400 */ 
     
    10321953+#define AR531X_IRQ_MISC_INTRS  MIPS_CPU_IRQ_BASE+6 /* C0_CAUSE: 0x4000 */ 
    10331954+#define AR531X_IRQ_CPU_CLOCK   MIPS_CPU_IRQ_BASE+7 /* C0_CAUSE: 0x8000 */ 
    1034 + 
     1955+#endif 
    10351956+/* Miscellaneous interrupts, which share IP6 */ 
    10361957+#define AR531X_MISC_IRQ_NONE           AR531X_MISC_IRQ_BASE+0 
     
    10481969+#define AR531X_GPIO_IRQ_NONE            AR531X_MISC_IRQ_BASE+0 
    10491970+#define AR531X_GPIO_IRQ(n)              AR531X_MISC_IRQ_BASE+(n)+1 
     1971+#ifdef CONFIG_AR5315 
     1972+#define AR531X_GPIO_IRQ_COUNT           2 
     1973+#else 
    10501974+#define AR531X_GPIO_IRQ_COUNT           9 
     1975+#endif 
    10511976+ 
    10521977+#define PHYS_TO_K1(physaddr) KSEG1ADDR(physaddr) 
     
    11252050+#define intDisable(x) cli() 
    11262051+#define intEnable(x) sti() 
    1127 diff -urN linux-2.4.32/arch/mips/ar531x/ar531xprom.c linux-2.4.32.new/arch/mips/ar531x/ar531xprom.c 
    1128 --- linux-2.4.32/arch/mips/ar531x/ar531xprom.c  1970-01-01 01:00:00.000000000 +0100 
    1129 +++ linux-2.4.32.new/arch/mips/ar531x/ar531xprom.c      2005-12-24 20:29:42.133306616 +0000 
    1130 @@ -0,0 +1,84 @@ 
     2052diff -urN linux-mips/arch/mips/ar531x/ar531xprom.c mips-linux-2.4.25/arch/mips/ar531x/ar531xprom.c 
     2053--- linux-mips/arch/mips/ar531x/ar531xprom.c    1970-01-01 01:00:00.000000000 +0100 
     2054+++ mips-linux-2.4.25/arch/mips/ar531x/ar531xprom.c     2005-12-30 17:26:31.001823800 +0000 
     2055@@ -0,0 +1,88 @@ 
    11312056+/* 
    11322057+ * This file is subject to the terms and conditions of the GNU General Public 
     
    11642089+    int bank0AC, bank1AC; 
    11652090+    int memsz_in_mb; 
    1166 + 
    11672091+    strcpy(arcs_cmdline, "console=ttyS0,9600"); 
    11682092+    for (i=0; i<argc; i++) { 
     
    11962120+ 
    11972121+    /* Determine SDRAM size based on Address Checks done at startup */ 
     2122+#if CONFIG_AR5315 
     2123+    /* TO-DO : compute the SDRAM size */ 
     2124+    memsz_in_mb=8; 
     2125+#else 
    11982126+    memcfg1 = sysRegRead(AR531X_MEM_CFG1); 
    11992127+    bank0AC = (memcfg1 & MEM_CFG1_AC0) >> MEM_CFG1_AC0_S; 
     
    12012129+    memsz_in_mb = (bank0AC ? (1 << (bank0AC+1)) : 0) 
    12022130+                + (bank1AC ? (1 << (bank1AC+1)) : 0); 
     2131+#endif 
    12032132+ 
    12042133+    /* 
     
    12132142+{ 
    12142143+} 
    1215 diff -urN linux-2.4.32/arch/mips/ar531x/ar531xsetup.c linux-2.4.32.new/arch/mips/ar531x/ar531xsetup.c 
    1216 --- linux-2.4.32/arch/mips/ar531x/ar531xsetup.c 1970-01-01 01:00:00.000000000 +0100 
    1217 +++ linux-2.4.32.new/arch/mips/ar531x/ar531xsetup.c     2005-12-24 20:29:42.133306616 +0000 
    1218 @@ -0,0 +1,240 @@ 
     2144diff -urN linux-mips/arch/mips/ar531x/ar531xsetup.c mips-linux-2.4.25/arch/mips/ar531x/ar531xsetup.c 
     2145--- linux-mips/arch/mips/ar531x/ar531xsetup.c   1970-01-01 01:00:00.000000000 +0100 
     2146+++ mips-linux-2.4.25/arch/mips/ar531x/ar531xsetup.c    2005-12-30 17:26:31.002823648 +0000 
     2147@@ -0,0 +1,406 @@ 
    12192148+/* 
    12202149+ * This file is subject to the terms and conditions of the GNU General Public 
     
    12532182+{ 
    12542183+    for(;;) { 
     2184+#if CONFIG_AR5315 
     2185+    /*  
     2186+    ** Cold reset does not work,work around is to use the GPIO reset bit.   
     2187+    */ 
     2188+    unsigned int reg; 
     2189+    reg = sysRegRead(AR5315_GPIO_DO); 
     2190+    reg &= ~(1 << AR5315_RESET_GPIO); 
     2191+    sysRegWrite(AR5315_GPIO_DO, reg); 
     2192+    (void)sysRegRead(AR5315_GPIO_DO); /* flush write to hardware */ 
     2193+       
     2194+#else 
    12552195+        sysRegWrite(AR531X_RESET, AR531X_RESET_SYSTEM); 
     2196+#endif 
    12562197+    } 
    12572198+} 
     
    12732214+get_system_type(void) 
    12742215+{ 
     2216+#if CONFIG_AR5315 
     2217+       return "Atheros AR5315"; 
     2218+#else 
    12752219+       return "Atheros AR531X"; 
     2220+#endif 
    12762221+} 
    12772222+ 
     
    12872232+}; 
    12882233+ 
     2234+#if CONFIG_AR5315 
     2235+static int PLLC_DIVIDE_TABLE[5] = { 
     2236+    2, 
     2237+    3, 
     2238+    4, 
     2239+    6, 
     2240+    3 
     2241+}; 
     2242+ 
     2243+unsigned int 
     2244+ar531x_cpu_frequency(void) 
     2245+{ 
     2246+    static unsigned int ar531x_calculated_cpu_freq=0; 
     2247+    unsigned int clockCtl,pllcCtrl,cpuDiv; 
     2248+    unsigned int pllcOut,refdiv,fdiv,divby2; 
     2249+ 
     2250+    if(ar531x_calculated_cpu_freq)  
     2251+         return ar531x_calculated_cpu_freq;  
     2252+ 
     2253+     
     2254+    pllcCtrl = sysRegRead(AR5315_PLLC_CTL); 
     2255+    refdiv = (pllcCtrl & PLLC_REF_DIV_M) >> PLLC_REF_DIV_S; 
     2256+    refdiv = CLOCKCTL1_PREDIVIDE_TABLE[refdiv]; 
     2257+    fdiv = (pllcCtrl & PLLC_FDBACK_DIV_M) >> PLLC_FDBACK_DIV_S; 
     2258+    divby2 = (pllcCtrl & PLLC_ADD_FDBACK_DIV_M) >> PLLC_ADD_FDBACK_DIV_S; 
     2259+    divby2 += 1; 
     2260+    pllcOut = (40000000/refdiv)*(2*divby2)*fdiv; 
     2261+ 
     2262+    clockCtl = sysRegRead(AR5315_CPUCLK); 
     2263+ 
     2264+    /* clkm input selected */ 
     2265+    if((clockCtl & CPUCLK_CLK_SEL_M) == 0  || (clockCtl & CPUCLK_CLK_SEL_M) == 1 ) { 
     2266+       unsigned int clkMdiv; 
     2267+       clkMdiv = (pllcCtrl & PLLC_CLKM_DIV_M) >> PLLC_CLKM_DIV_S; 
     2268+       clkMdiv = PLLC_DIVIDE_TABLE[clkMdiv]; 
     2269+ 
     2270+       cpuDiv = (clockCtl & CPUCLK_CLK_DIV_M) >> CPUCLK_CLK_DIV_S;   
     2271+       if(cpuDiv)  cpuDiv *= 2; 
     2272+       else cpuDiv=1; 
     2273+ 
     2274+       ar531x_calculated_cpu_freq= (pllcOut/(clkMdiv * cpuDiv)) ; 
     2275+         
     2276+       return ar531x_calculated_cpu_freq;  
     2277+    }  
     2278+     
     2279+    /* clkc input selected */ 
     2280+    if((clockCtl & CPUCLK_CLK_SEL_M) == 2 ) { 
     2281+       unsigned int clkCdiv; 
     2282+       clkCdiv = (pllcCtrl & PLLC_CLKC_DIV_M) >> PLLC_CLKC_DIV_S; 
     2283+       clkCdiv = PLLC_DIVIDE_TABLE[clkCdiv]; 
     2284+ 
     2285+       cpuDiv = (clockCtl & CPUCLK_CLK_DIV_M) >> CPUCLK_CLK_DIV_S;   
     2286+       if(cpuDiv)  cpuDiv *= 2; 
     2287+       else cpuDiv=1; 
     2288+ 
     2289+       ar531x_calculated_cpu_freq= (pllcOut/(clkCdiv * cpuDiv)) ; 
     2290+         
     2291+       return ar531x_calculated_cpu_freq;  
     2292+    } else {   /* ref_clk  selected */ 
     2293+ 
     2294+       cpuDiv = (clockCtl & CPUCLK_CLK_DIV_M) >> CPUCLK_CLK_DIV_S;   
     2295+       if(cpuDiv)  cpuDiv *= 2; 
     2296+       else cpuDiv=1; 
     2297+ 
     2298+       ar531x_calculated_cpu_freq= (40000000/(cpuDiv)) ; 
     2299+       return ar531x_calculated_cpu_freq;  
     2300+    } 
     2301+} 
     2302+ 
     2303+unsigned int 
     2304+ar531x_apb_frequency(void) 
     2305+{ 
     2306+    static unsigned int ar531x_calculated_cpu_freq=0; 
     2307+    unsigned int clockCtl,pllcCtrl,cpuDiv; 
     2308+    unsigned int pllcOut,refdiv,fdiv,divby2; 
     2309+ 
     2310+    if(ar531x_calculated_cpu_freq)  
     2311+         return ar531x_calculated_cpu_freq;  
     2312+ 
     2313+     
     2314+    pllcCtrl = sysRegRead(AR5315_PLLC_CTL); 
     2315+    refdiv = (pllcCtrl & PLLC_REF_DIV_M) >> PLLC_REF_DIV_S; 
     2316+    refdiv = CLOCKCTL1_PREDIVIDE_TABLE[refdiv]; 
     2317+    fdiv = (pllcCtrl & PLLC_FDBACK_DIV_M) >> PLLC_FDBACK_DIV_S; 
     2318+    divby2 = (pllcCtrl & PLLC_ADD_FDBACK_DIV_M) >> PLLC_ADD_FDBACK_DIV_S; 
     2319+    divby2 += 1; 
     2320+    pllcOut = (40000000/refdiv)*(2*divby2)*fdiv; 
     2321+ 
     2322+    clockCtl = sysRegRead(AR5315_AMBACLK); 
     2323+ 
     2324+    /* clkm input selected */ 
     2325+    if((clockCtl & CPUCLK_CLK_SEL_M) == 0  || (clockCtl & CPUCLK_CLK_SEL_M) == 1 ) { 
     2326+       unsigned int clkMdiv; 
     2327+       clkMdiv = (pllcCtrl & PLLC_CLKM_DIV_M) >> PLLC_CLKM_DIV_S; 
     2328+       clkMdiv = PLLC_DIVIDE_TABLE[clkMdiv]; 
     2329+ 
     2330+       cpuDiv = (clockCtl & CPUCLK_CLK_DIV_M) >> CPUCLK_CLK_DIV_S;   
     2331+       if(cpuDiv)  cpuDiv *= 2; 
     2332+       else cpuDiv=1; 
     2333+ 
     2334+       ar531x_calculated_cpu_freq= (pllcOut/(clkMdiv * cpuDiv)) ; 
     2335+         
     2336+       return ar531x_calculated_cpu_freq;  
     2337+    }  
     2338+     
     2339+    /* clkc input selected */ 
     2340+    if((clockCtl & CPUCLK_CLK_SEL_M) == 2 ) { 
     2341+       unsigned int clkCdiv; 
     2342+       clkCdiv = (pllcCtrl & PLLC_CLKC_DIV_M) >> PLLC_CLKC_DIV_S; 
     2343+       clkCdiv = PLLC_DIVIDE_TABLE[clkCdiv]; 
     2344+ 
     2345+       cpuDiv = (clockCtl & CPUCLK_CLK_DIV_M) >> CPUCLK_CLK_DIV_S;   
     2346+       if(cpuDiv)  cpuDiv *= 2; 
     2347+       else cpuDiv=1; 
     2348+ 
     2349+       ar531x_calculated_cpu_freq= (pllcOut/(clkCdiv * cpuDiv)) ; 
     2350+         
     2351+       return ar531x_calculated_cpu_freq;  
     2352+    } else {   /* ref_clk  selected */ 
     2353+ 
     2354+       cpuDiv = (clockCtl & CPUCLK_CLK_DIV_M) >> CPUCLK_CLK_DIV_S;   
     2355+       if(cpuDiv)  cpuDiv *= 2; 
     2356+       else cpuDiv=1; 
     2357+ 
     2358+       ar531x_calculated_cpu_freq= (40000000/(cpuDiv)) ; 
     2359+       return ar531x_calculated_cpu_freq;  
     2360+    } 
     2361+} 
     2362+ 
     2363+#else 
    12892364+unsigned int 
    12902365+ar531x_cpu_frequency(void) 
     
    13062381+ 
    13072382+        wisoc_revision = (sysRegRead(AR531X_REV) & AR531X_REV_MAJ) >> AR531X_REV_MAJ_S; 
     2383+ 
    13082384+        if (wisoc_revision == AR531X_REV_MAJ_AR2313) { 
    13092385+            clockctl1_predivide_mask = AR2313_CLOCKCTL1_PREDIVIDE_MASK; 
     
    13562432+       return ar531x_calculated_cpu_freq; 
    13572433+} 
     2434+#endif 
    13582435+ 
    13592436+unsigned int 
     
    13732450+{ 
    13742451+    UINT32 flash_ctl; 
    1375 + 
     2452+#ifndef CONFIG_AR5315 
    13762453+    /* Configure flash bank 0 */ 
    13772454+    flash_ctl = FLASHCTL_E | 
     
    13912468+    sysRegWrite(AR531X_FLASHCTL2, 
    13922469+                sysRegRead(AR531X_FLASHCTL2) & ~(FLASHCTL_E | FLASHCTL_AC)); 
     2470+#endif 
    13932471+} 
    13942472+ 
     
    14042482+       s.flags = STD_COM_FLAGS; 
    14052483+       s.io_type = SERIAL_IO_MEM; 
     2484+#if CONFIG_AR5315 
     2485+       s.baud_base = ar531x_apb_frequency()/16; 
     2486+#else 
    14062487+       s.baud_base = ar531x_sys_frequency()/16; 
     2488+#endif 
    14072489+       s.irq = AR531X_MISC_IRQ_UART0; 
    14082490+       s.iomem_reg_shift = 2; 
    1409 +       s.iomem_base = (u8 *)0xbc000003; 
     2491+#if CONFIG_AR5315 
     2492+       s.iomem_base = (u8 *)AR5315_UART0; 
     2493+#else 
     2494+       s.iomem_base = (u8 *)AR531X_UART0; 
     2495+#endif 
    14102496+ 
    14112497+       if (early_serial_setup(&s) != 0) 
     
    14392525+{ 
    14402526+       /* Clear any lingering AHB errors */ 
     2527+#if CONFIG_AR5315 
     2528+       unsigned int config = read_c0_config(); 
     2529+       write_c0_config(config & ~0x3); 
     2530+       sysRegWrite(AR5315_AHB_ERR0,AHB_ERROR_DET); 
     2531+       sysRegRead(AR5315_AHB_ERR1); 
     2532+       sysRegWrite(AR5315_WDC, WDC_IGNORE_EXPIRATION); 
     2533+#else 
    14412534+       sysRegRead(AR531X_PROCADDR); 
    14422535+       sysRegRead(AR531X_DMAADDR); 
    14432536+ 
    14442537+       sysRegWrite(AR531X_WD_CTRL, AR531X_WD_CTRL_IGNORE_EXPIRATION); 
     2538+ 
     2539+#endif 
    14452540+ 
    14462541+        /* Disable data watchpoints */ 
     
    14572552+        serial_setup(); 
    14582553+} 
    1459 diff -urN linux-2.4.32/arch/mips/ar531x/Makefile linux-2.4.32.new/arch/mips/ar531x/Makefile 
    1460 --- linux-2.4.32/arch/mips/ar531x/Makefile      1970-01-01 01:00:00.000000000 +0100 
    1461 +++ linux-2.4.32.new/arch/mips/ar531x/Makefile  2005-12-24 20:29:42.010325312 +0000 
     2554diff -urN linux-mips/arch/mips/ar531x/Makefile mips-linux-2.4.25/arch/mips/ar531x/Makefile 
     2555--- linux-mips/arch/mips/ar531x/Makefile        1970-01-01 01:00:00.000000000 +0100 
     2556+++ mips-linux-2.4.25/arch/mips/ar531x/Makefile 2005-12-30 17:26:29.912989328 +0000 
    14622557@@ -0,0 +1,33 @@ 
    14632558+# 
     
    14942589+ 
    14952590+include $(TOPDIR)/Rules.make 
    1496 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/backup-busybox.links linux-2.4.32.new/arch/mips/ar531x/RAMDISK/backup-busybox.links 
    1497 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/backup-busybox.links  1970-01-01 01:00:00.000000000 +0100 
    1498 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/backup-busybox.links      2005-12-24 20:29:42.011325160 +0000 
    1499 @@ -0,0 +1,33 @@ 
    1500 +/usr/bin/[ 
    1501 +/sbin/brctl 
    1502 +/bin/cat 
    1503 +/bin/chmod 
    1504 +/bin/cp 
    1505 +/bin/df 
    1506 +/bin/echo 
    1507 +/bin/false 
    1508 +/sbin/ifconfig 
    1509 +/sbin/init 
    1510 +/sbin/insmod 
    1511 +/bin/kill 
    1512 +/bin/ls 
    1513 +/sbin/lsmod 
    1514 +/bin/mkdir 
    1515 +/sbin/modprobe 
    1516 +/bin/mount 
    1517 +/bin/msh 
    1518 +/bin/mv 
    1519 +/bin/ping 
    1520 +/bin/ps 
    1521 +/bin/pwd 
    1522 +/sbin/reboot 
    1523 +/bin/rm 
    1524 +/bin/rmdir 
    1525 +/sbin/rmmod 
    1526 +/sbin/route 
    1527 +/bin/sh 
    1528 +/usr/bin/test 
    1529 +/usr/bin/top 
    1530 +/bin/true 
    1531 +/bin/umount 
    1532 +/usr/bin/wget 
    1533 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/busybox.links linux-2.4.32.new/arch/mips/ar531x/RAMDISK/busybox.links 
    1534 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/busybox.links 1970-01-01 01:00:00.000000000 +0100 
    1535 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/busybox.links     2005-12-24 20:29:42.011325160 +0000 
    1536 @@ -0,0 +1,33 @@ 
    1537 +/usr/bin/[ 
    1538 +/sbin/brctl 
    1539 +/bin/cat 
    1540 +/bin/chmod 
    1541 +/bin/cp 
    1542 +/bin/df 
    1543 +/bin/echo 
    1544 +/bin/false 
    1545 +/sbin/ifconfig 
    1546 +/sbin/init 
    1547 +/sbin/insmod 
    1548 +/bin/kill 
    1549 +/bin/ls 
    1550 +/sbin/lsmod 
    1551 +/bin/mkdir 
    1552 +/sbin/modprobe 
    1553 +/bin/mount 
    1554 +/bin/msh 
    1555 +/bin/mv 
    1556 +/bin/ping 
    1557 +/bin/ps 
    1558 +/bin/pwd 
    1559 +/sbin/reboot 
    1560 +/bin/rm 
    1561 +/bin/rmdir 
    1562 +/sbin/rmmod 
    1563 +/sbin/route 
    1564 +/bin/sh 
    1565 +/usr/bin/test 
    1566 +/bin/true 
    1567 +/bin/umount 
    1568 +/bin/uname 
    1569 +/usr/bin/wget 
    1570 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/Makefile linux-2.4.32.new/arch/mips/ar531x/RAMDISK/Makefile 
    1571 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/Makefile      1970-01-01 01:00:00.000000000 +0100 
    1572 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/Makefile  2005-12-24 20:29:42.011325160 +0000 
    1573 @@ -0,0 +1,53 @@ 
    1574 +KERNEL_SOURCE=../../../.. 
    1575 + 
    1576 +# The value for INITRDSIZE is extracted from linux/.config, 
    1577 +# if it exists; otherwise, a default value is used. 
    1578 + 
    1579 +CONFIG_FILE = $(KERNEL_SOURCE)/.config 
    1580 + 
    1581 +ifeq ($(CONFIG_FILE),$(wildcard $(CONFIG_FILE))) 
    1582 + 
    1583 +include $(CONFIG_FILE) 
    1584 +ifdef CONFIG_BLK_DEV_RAM_SIZE 
    1585 +INITRDSIZE  := $(shell echo $(CONFIG_BLK_DEV_RAM_SIZE)) 
    1586 +else 
    1587 +INITRDSIZE := 8192 
    1588 +endif 
    1589 + 
    1590 +else 
    1591 +INITRDSIZE := 8192 
    1592 +endif 
    1593 + 
    1594 +MOUNTPT = /mnt/xtmp 
    1595 + 
    1596 +ramdisk.gz: ramdisk 
    1597 +       gzip -f ramdisk 
    1598 + 
    1599 +ramdisk: 
    1600 +       ./makelinks   
    1601 +       @echo "CREATING RAMDISK OF SIZE $(INITRDSIZE) on $@" 
    1602 +       dd if=/dev/zero of=$@ bs=1k count=$(INITRDSIZE) 
    1603 +       /sbin/mke2fs -vFm0 $@ $(INITRDSIZE) 
    1604 +       if [ \! -e $(MOUNTPT) ]; then mkdir -p $(MOUNTPT) ; fi 
    1605 +       mount -o loop $@ $(MOUNTPT) 
    1606 +       @df $(MOUNTPT) 
    1607 +       (cd rootdir; tar cf - . ) | (cd $(MOUNTPT) && tar xf - ) 
    1608 +       (cd $(MOUNTPT) ; chown -R root.root . ) 
    1609 +       @df $(MOUNTPT) 
    1610 +       umount $(MOUNTPT) 
    1611 + 
    1612 +install: 
    1613 +       @(if [ -d $(KERNEL_SOURCE)/arch/mips/ramdisk ]; \ 
    1614 +       then \ 
    1615 +               if [ -f ramdisk.gz ]; \ 
    1616 +               then \ 
    1617 +                       cp ramdisk.gz $(KERNEL_SOURCE)/arch/mips/ramdisk/; \ 
    1618 +               else \ 
    1619 +                       echo "No ramdisk.gz image"; \ 
    1620 +               fi; \ 
    1621 +       else \ 
    1622 +               echo "No ramdisk directory.  Check KERNEL_SOURCE variable."; \ 
    1623 +       fi) 
    1624 + 
    1625 +clean:  
    1626 +       rm -f ramdisk.gz ramdisk 
    1627 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/makelinks linux-2.4.32.new/arch/mips/ar531x/RAMDISK/makelinks 
    1628 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/makelinks     1970-01-01 01:00:00.000000000 +0100 
    1629 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/makelinks 2005-12-24 20:29:42.012325008 +0000 
    1630 @@ -0,0 +1,65 @@ 
    1631 +#!/bin/sh 
    1632 + 
    1633 +if [ -f busybox.links ] 
    1634 +then 
    1635 +    cat busybox.links | sed 's/\//ln -s -f \/bin\/busybox rootdir\//' | /bin/sh 
    1636 +fi 
    1637 + 
    1638 +cons="  root tty    622" 
    1639 +disk="  root disk   660" 
    1640 +mtd="  root root   640" 
    1641 +makedev () {    # usage: makedev name [bcu] major minor owner group mode 
    1642 +        if [ "$opt_v" ] 
    1643 +        then    if [ "$opt_d" ] 
    1644 +                then    echo "rm -f $1" 
    1645 +                else    echo "$1        = $2 $3 $4 $5:$6 $7" 
    1646 +                fi 
    1647 +        fi 
    1648 +        [ ! "$opt_n" ] && rm -f $1 && 
    1649 +        [ ! "$opt_d" ] && mknod $1 $2 $3 $4 && 
    1650 +                chown $5:$6 $1 && 
    1651 +                chmod $7 $1 
    1652 +}   
    1653 + 
    1654 +makedev rootdir/dev/console c 5 1 $cons 
    1655 +makedev rootdir/dev/ram  b 1 1 $disk  
    1656 +makedev rootdir/dev/ram0 b 1 0 $disk 
    1657 +makedev rootdir/dev/ram1 b 1 1 $disk  
    1658 +makedev rootdir/dev/ram2 b 1 2 $disk 
    1659 +makedev rootdir/dev/ram3 b 1 3 $disk 
    1660 +makedev rootdir/dev/ram4 b 1 4 $disk 
    1661 +makedev rootdir/dev/ram5 b 1 5 $disk 
    1662 +makedev rootdir/dev/ram6 b 1 6 $disk 
    1663 +makedev rootdir/dev/ram7 b 1 7 $disk 
    1664 +makedev rootdir/dev/ram8 b 1 8 $disk 
    1665 +makedev rootdir/dev/ram9 b 1 9 $disk 
    1666 +makedev rootdir/dev/ram10 b 1 10 $disk 
    1667 +makedev rootdir/dev/ram11 b 1 11 $disk 
    1668 +makedev rootdir/dev/ram12 b 1 12 $disk 
    1669 +makedev rootdir/dev/ram13 b 1 13 $disk 
    1670 +makedev rootdir/dev/ram14 b 1 14 $disk 
    1671 +makedev rootdir/dev/ram15 b 1 15 $disk 
    1672 + 
    1673 +makedev rootdir/dev/mtd0 c 90 0 $mtd 
    1674 +makedev rootdir/dev/mtd1 c 90 2 $mtd 
    1675 +makedev rootdir/dev/mtd2 c 90 4 $mtd 
    1676 +makedev rootdir/dev/mtd3 c 90 6 $mtd 
    1677 +makedev rootdir/dev/mtd4 c 90 8 $mtd 
    1678 +makedev rootdir/dev/mtd5 c 90 10 $mtd 
    1679 +makedev rootdir/dev/mtd6 c 90 12 $mtd 
    1680 +makedev rootdir/dev/mtdblock0 b 31 0 $mtd 
    1681 +makedev rootdir/dev/mtdblock1 b 31 1 $mtd 
    1682 +makedev rootdir/dev/mtdblock2 b 31 2 $mtd 
    1683 +makedev rootdir/dev/mtdblock3 b 31 3 $mtd 
    1684 +makedev rootdir/dev/mtdblock4 b 31 4 $mtd 
    1685 +makedev rootdir/dev/mtdblock5 b 31 5 $mtd 
    1686 +makedev rootdir/dev/mtdblock6 b 31 6 $mtd 
    1687 +makedev rootdir/dev/mtdr0 c 90 1 $mtd 
    1688 +makedev rootdir/dev/mtdr1 c 90 3 $mtd 
    1689 +makedev rootdir/dev/mtdr2 c 90 5 $mtd 
    1690 +makedev rootdir/dev/mtdr3 c 90 7 $mtd 
    1691 +makedev rootdir/dev/mtdr4 c 90 9 $mtd 
    1692 +makedev rootdir/dev/mtdr5 c 90 11 $mtd 
    1693 +makedev rootdir/dev/mtdr6 c 90 13 $mtd 
    1694 + 
    1695 +cd rootdir/dev;ln -sf ram1 ram 
    1696 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/README linux-2.4.32.new/arch/mips/ar531x/RAMDISK/README 
    1697 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/README        1970-01-01 01:00:00.000000000 +0100 
    1698 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/README    2005-12-24 20:29:42.011325160 +0000 
    1699 @@ -0,0 +1,40 @@ 
    1700 +How to build a ramdisk image for use as a root filesystem with AR531X 
    1701 + 
    1702 +Overview: 
    1703 +In order to boot from a ramdisk root file system image, you will 
    1704 +first create a root directory structure in the "rootdir" directory. 
    1705 +Then run "make" to create a compressed root file system image in 
    1706 +ramdisk.gz.  Finally, copy this image into your kernel source tree 
    1707 +and remake the kernel.  The ramdisk image is then built into the 
    1708 +kernel.  When the kernel starts, it is uncompressed into RAM, and 
    1709 +used as a root file system. 
    1710 + 
    1711 +If you'd like to use a pre-built ramdisk.gz rather than build 
    1712 +one yourself: 
    1713 +  cp arch/mips/ar531x/RAMDISK/ramdisk.gz arch/mips/ramdisk/ramdisk.gz 
    1714 + 
    1715 +Here are the detailed steps to build your own: 
    1716 + 
    1717 +1) Modify Makefile to point KERNEL_SOURCE at your linux source tree. 
    1718 + 
    1719 +2) Copy whatever additional files/directories/links you'd like to 
    1720 +   under rootdir.  Note that you're limited to CONFIG_BLK_DEV_RAM_SIZE 
    1721 +   1KB blocks, as specified in your linux/.config file. 
    1722 +   Examples: 
    1723 +       Copy busybox to rootdir/bin/ 
    1724 +        [NOTE: Copy busybox.links to this directory to 
    1725 +        cause the makelinks script to automatically 
    1726 +        set up all of the necessary busybox command links 
    1727 +        in the rootdir/bin directory]. 
    1728 + 
    1729 +       Copy any wireless driver modules into rootdir tree 
    1730 + 
    1731 +   You might want to make a copy of the rootdir directory 
    1732 +   before you modify it, just in case you want to get back 
    1733 +   to the original. 
    1734 + 
    1735 +3) LOGIN AS ROOT (e.g. "su") and type "make" 
    1736 + 
    1737 +4) Copy the resulting ramdisk.gz to your linux source tree under 
    1738 +       arch/mips/ramdisk/ramdisk.gz 
    1739 +   (or "make install" will do this step for you) 
    1740 Binary files linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/bin/busybox and linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/bin/busybox differ 
    1741 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/fstab linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/fstab 
    1742 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/fstab     1970-01-01 01:00:00.000000000 +0100 
    1743 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/fstab 2005-12-24 20:29:42.063317256 +0000 
    1744 @@ -0,0 +1 @@ 
    1745 +/proc /proc proc defaults 0 0 
    1746 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/group linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/group 
    1747 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/group     1970-01-01 01:00:00.000000000 +0100 
    1748 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/group 2005-12-24 20:29:42.064317104 +0000 
    1749 @@ -0,0 +1,18 @@ 
    1750 +root:x:0: 
    1751 +wheel:x:10: 
    1752 +bin:x:1:bin,daemon 
    1753 +daemon:x:2:bin,daemon 
    1754 +sys:x:3:bin,adm 
    1755 +adm:x:4:adm,daemon 
    1756 +tty:x:5: 
    1757 +disk:x:6: 
    1758 +lp:x:7:daemon,lp 
    1759 +mem:x:8: 
    1760 +kmem:x:9: 
    1761 +operator:x:11: 
    1762 +uucp:x:14:uucp 
    1763 +dip:x:40: 
    1764 +utmp:x:45: 
    1765 +www:x:63: 
    1766 +nobody:x:65534: 
    1767 +users:x:100: 
    1768 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/host.conf linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/host.conf 
    1769 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/host.conf 1970-01-01 01:00:00.000000000 +0100 
    1770 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/host.conf     2005-12-24 20:29:42.064317104 +0000 
    1771 @@ -0,0 +1,2 @@ 
    1772 +order hosts,bind 
    1773 +multi on 
    1774 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/inittab linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/inittab 
    1775 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/inittab   1970-01-01 01:00:00.000000000 +0100 
    1776 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/inittab       2005-12-24 20:29:42.064317104 +0000 
    1777 @@ -0,0 +1,2 @@ 
    1778 +::sysinit:/etc/rc.d/rcS 
    1779 +::respawn:/bin/sh 
    1780 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/nsswitch.conf linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/nsswitch.conf 
    1781 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/nsswitch.conf     1970-01-01 01:00:00.000000000 +0100 
    1782 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/nsswitch.conf 2005-12-24 20:29:42.065316952 +0000 
    1783 @@ -0,0 +1,16 @@ 
    1784 +# /etc/nsswitch.conf 
    1785 +# 
    1786 +# Name Service Switch configuration file. 
    1787 +# 
    1788 + 
    1789 +passwd:                compat 
    1790 +shadow:                compat 
    1791 +group:         compat 
    1792 + 
    1793 +hosts:         files dns 
    1794 +networks:      files dns 
    1795 + 
    1796 +ethers:                files 
    1797 +protocols:     files 
    1798 +rpc:           files 
    1799 +services:      files 
    1800 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/passwd linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/passwd 
    1801 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/passwd    1970-01-01 01:00:00.000000000 +0100 
    1802 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/passwd        2005-12-24 20:29:42.065316952 +0000 
    1803 @@ -0,0 +1,11 @@ 
    1804 +root:x:0:0:root:/root:/bin/ash 
    1805 +bin:x:1:1:bin:/bin:/bin/sh 
    1806 +daemon:x:2:2:daemon:/usr/sbin:/bin/sh 
    1807 +adm:x:3:4:adm:/adm:/bin/sh 
    1808 +lp:x:4:7:lp:/var/spool/lpd:/bin/sh 
    1809 +sync:x:5:0:sync:/bin:/bin/sync 
    1810 +shutdown:x:6:11:shutdown:/sbin:/sbin/shutdown 
    1811 +halt:x:7:0:halt:/sbin:/sbin/halt 
    1812 +uucp:x:10:14:uucp:/var/spool/uucp:/bin/sh 
    1813 +operator:x:11:0:Operator:/var:/bin/sh 
    1814 +nobody:x:65534:65534:nobody:/home:/bin/sh 
    1815 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/rc.d/rcS linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/rc.d/rcS 
    1816 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/rc.d/rcS  1970-01-01 01:00:00.000000000 +0100 
    1817 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/rc.d/rcS      2005-12-24 20:29:42.066316800 +0000 
    1818 @@ -0,0 +1,17 @@ 
    1819 +#!/bin/sh 
    1820 + 
    1821 +mount -a 
    1822 +mount -t jffs2 -o remount +w / 
    1823 +# mount -t ramfs /dev/ram /ramdisk 
    1824 + 
    1825 +echo Load MADWiFi wlan module 
    1826 +insmod ../../lib/modules/2.4.25/net/wlan.o 
    1827 + 
    1828 +echo Load MADWiFi Atheros HAL module 
    1829 +insmod ../../lib/modules/2.4.25/net/ath_hal.o 
    1830 + 
    1831 +echo Load MADWiFi Atheros Driver module 
    1832 +insmod ../../lib/modules/2.4.25/net/ath_lbus.o 
    1833 + 
    1834 +exit 
    1835 + 
    1836 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/resolv.conf linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/resolv.conf 
    1837 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/resolv.conf       1970-01-01 01:00:00.000000000 +0100 
    1838 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/resolv.conf   2005-12-24 20:29:42.066316800 +0000 
    1839 @@ -0,0 +1,18 @@ 
    1840 +# /etc/resolv.conf - DNS setup file 
    1841 +# 
    1842 +# possible entries are: 
    1843 +# 
    1844 +#       domain <domain>                 Local domain name. If not present, the 
    1845 +#                                       gethostbyname syscall is used to 
    1846 +#                                       determine the local domain name. 
    1847 +# 
    1848 +#       search <list_of_domains>        Search list for hostname lookup. 
    1849 +#                                       The search list is normally determined 
    1850 +#                                       from the local domain name but it 
    1851 +#                                       can be set to a list of domains. 
    1852 +# 
    1853 +#       nameserver <ip_addr>            Define which server to contact 
    1854 +#                                       for DNS lookups. If there are 
    1855 +#                                       multiple nameserver lines (Max=3), 
    1856 +#                                       they are queried in the listed order. 
    1857 +# 
    1858 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/securetty linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/securetty 
    1859 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/securetty 1970-01-01 01:00:00.000000000 +0100 
    1860 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/securetty     2005-12-24 20:29:42.066316800 +0000 
    1861 @@ -0,0 +1,12 @@ 
    1862 +tty1 
    1863 +tty2 
    1864 +tty3 
    1865 +tty4 
    1866 +tty5 
    1867 +tty6 
    1868 +tty7 
    1869 +tty8 
    1870 +ttyS0 
    1871 +ttyS1 
    1872 +ttyS2 
    1873 +ttyS3 
    1874 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/services linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/services 
    1875 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/services  1970-01-01 01:00:00.000000000 +0100 
    1876 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/services      2005-12-24 20:29:42.066316800 +0000 
    1877 @@ -0,0 +1,193 @@ 
    1878 +#      $NetBSD: services,v 1.18 1996/03/26 00:07:58 mrg Exp $ 
    1879 +# 
    1880 +# Network services, Internet style 
    1881 +# 
    1882 +# Note that it is presently the policy of IANA to assign a single well-known 
    1883 +# port number for both TCP and UDP; hence, most entries here have two entries 
    1884 +# even if the protocol doesn't support UDP operations. 
    1885 +# Updated from RFC 1340, ``Assigned Numbers'' (July 1992).  Not all ports 
    1886 +# are included, only the more common ones. 
    1887 +# 
    1888 +#      from: @(#)services      5.8 (Berkeley) 5/9/91 
    1889 +# 
    1890 +tcpmux         1/tcp           # TCP port service multiplexer 
    1891 +echo           7/tcp 
    1892 +echo           7/udp 
    1893 +discard                9/tcp           sink null 
    1894 +discard                9/udp           sink null 
    1895 +systat         11/tcp          users 
    1896 +daytime                13/tcp 
    1897 +daytime                13/udp 
    1898 +netstat                15/tcp 
    1899 +qotd           17/tcp          quote 
    1900 +msp            18/tcp          # message send protocol 
    1901 +msp            18/udp          # message send protocol 
    1902 +chargen                19/tcp          ttytst source 
    1903 +chargen                19/udp          ttytst source 
    1904 +ftp-data       20/tcp          # default ftp data port 
    1905 +ftp            21/tcp 
    1906 +ssh            22/tcp 
    1907 +ssh            22/udp 
    1908 +telnet         23/tcp 
    1909 +# 24 - private 
    1910 +smtp           25/tcp          mail 
    1911 +# 26 - unassigned 
    1912 +time           37/tcp          timserver 
    1913 +time           37/udp          timserver 
    1914 +rlp            39/udp          resource        # resource location 
    1915 +nameserver     42/tcp          name            # IEN 116 
    1916 +whois          43/tcp          nicname 
    1917 +domain         53/tcp          nameserver      # name-domain server 
    1918 +domain         53/udp          nameserver 
    1919 +mtp            57/tcp                          # deprecated 
    1920 +bootps         67/tcp          # BOOTP server 
    1921 +bootps         67/udp 
    1922 +bootpc         68/tcp          # BOOTP client 
    1923 +bootpc         68/udp 
    1924 +tftp           69/udp 
    1925 +gopher         70/tcp          # Internet Gopher 
    1926 +gopher         70/udp 
    1927 +rje            77/tcp          netrjs 
    1928 +finger         79/tcp 
    1929 +www            80/tcp          http    # WorldWideWeb HTTP 
    1930 +www            80/udp                  # HyperText Transfer Protocol 
    1931 +link           87/tcp          ttylink 
    1932 +kerberos       88/tcp          krb5    # Kerberos v5 
    1933 +kerberos       88/udp 
    1934 +supdup         95/tcp 
    1935 +# 100 - reserved 
    1936 +hostnames      101/tcp         hostname        # usually from sri-nic 
    1937 +iso-tsap       102/tcp         tsap            # part of ISODE. 
    1938 +csnet-ns       105/tcp         cso-ns  # also used by CSO name server 
    1939 +csnet-ns       105/udp         cso-ns 
    1940 +rtelnet                107/tcp         # Remote Telnet 
    1941 +rtelnet                107/udp 
    1942 +pop2           109/tcp         pop-2 postoffice        # POP version 2 
    1943 +pop2           109/udp 
    1944 +pop3           110/tcp         pop-3 # POP version 3 
    1945 +pop3           110/udp 
    1946 +sunrpc         111/tcp 
    1947 +sunrpc         111/udp 
    1948 +auth           113/tcp         authentication tap ident 
    1949 +sftp           115/tcp 
    1950 +uucp-path      117/tcp 
    1951 +nntp           119/tcp         readnews untp   # USENET News Transfer Protocol 
    1952 +ntp            123/tcp 
    1953 +ntp            123/udp                         # Network Time Protocol 
    1954 +netbios-ns     137/tcp                         # NETBIOS Name Service 
    1955 +netbios-ns     137/udp 
    1956 +netbios-dgm    138/tcp                         # NETBIOS Datagram Service 
    1957 +netbios-dgm    138/udp 
    1958 +netbios-ssn    139/tcp                         # NETBIOS session service 
    1959 +netbios-ssn    139/udp 
    1960 +imap2          143/tcp         imap            # Interim Mail Access Proto v2 
    1961 +imap2          143/udp 
    1962 +snmp           161/udp                         # Simple Net Mgmt Proto 
    1963 +snmp-trap      162/udp         snmptrap        # Traps for SNMP 
    1964 +cmip-man       163/tcp                         # ISO mgmt over IP (CMOT) 
    1965 +cmip-man       163/udp 
    1966 +cmip-agent     164/tcp 
    1967 +cmip-agent     164/udp 
    1968 +xdmcp          177/tcp                         # X Display Mgr. Control Proto 
    1969 +xdmcp          177/udp 
    1970 +nextstep       178/tcp         NeXTStep NextStep       # NeXTStep window 
    1971 +nextstep       178/udp         NeXTStep NextStep       # server 
    1972 +bgp            179/tcp                         # Border Gateway Proto. 
    1973 +bgp            179/udp 
    1974 +prospero       191/tcp                         # Cliff Neuman's Prospero 
    1975 +prospero       191/udp 
    1976 +irc            194/tcp                         # Internet Relay Chat 
    1977 +irc            194/udp 
    1978 +smux           199/tcp                         # SNMP Unix Multiplexer 
    1979 +smux           199/udp 
    1980 +at-rtmp                201/tcp                         # AppleTalk routing 
    1981 +at-rtmp                201/udp 
    1982 +at-nbp         202/tcp                         # AppleTalk name binding 
    1983 +at-nbp         202/udp 
    1984 +at-echo                204/tcp                         # AppleTalk echo 
    1985 +at-echo                204/udp 
    1986 +at-zis         206/tcp                         # AppleTalk zone information 
    1987 +at-zis         206/udp 
    1988 +z3950          210/tcp         wais            # NISO Z39.50 database 
    1989 +z3950          210/udp         wais 
    1990 +ipx            213/tcp                         # IPX 
    1991 +ipx            213/udp 
    1992 +imap3          220/tcp                         # Interactive Mail Access 
    1993 +imap3          220/udp                         # Protocol v3 
    1994 +ulistserv      372/tcp                         # UNIX Listserv 
    1995 +ulistserv      372/udp 
    1996 +# 
    1997 +# UNIX specific services 
    1998 +# 
    1999 +exec           512/tcp 
    2000 +biff           512/udp         comsat 
    2001 +login          513/tcp 
    2002 +who            513/udp         whod 
    2003 +shell          514/tcp         cmd             # no passwords used 
    2004 +syslog         514/udp 
    2005 +printer                515/tcp         spooler         # line printer spooler 
    2006 +talk           517/udp 
    2007 +ntalk          518/udp 
    2008 +route          520/udp         router routed   # RIP 
    2009 +timed          525/udp         timeserver 
    2010 +tempo          526/tcp         newdate 
    2011 +courier                530/tcp         rpc 
    2012 +conference     531/tcp         chat 
    2013 +netnews                532/tcp         readnews 
    2014 +netwall                533/udp                         # -for emergency broadcasts 
    2015 +uucp           540/tcp         uucpd           # uucp daemon 
    2016 +remotefs       556/tcp         rfs_server rfs  # Brunhoff remote filesystem 
    2017 +# 
    2018 +webster                765/tcp                         # Network dictionary 
    2019 +webster                765/udp 
    2020 +# temporary entry (not officially registered by the Samba Team!) 
    2021 +swat           901/tcp         # Samba Web Administration Tool 
    2022 +# 
    2023 +# From ``Assigned Numbers'': 
    2024 +# 
    2025 +#> The Registered Ports are not controlled by the IANA and on most systems 
    2026 +#> can be used by ordinary user processes or programs executed by ordinary 
    2027 +#> users. 
    2028 +# 
    2029 +#> Ports are used in the TCP [45,106] to name the ends of logical 
    2030 +#> connections which carry long term conversations.  For the purpose of 
    2031 +#> providing services to unknown callers, a service contact port is 
    2032 +#> defined.  This list specifies the port used by the server process as its 
    2033 +#> contact port.  While the IANA can not control uses of these ports it 
    2034 +#> does register or list uses of these ports as a convienence to the 
    2035 +#> community. 
    2036 +# 
    2037 +ingreslock     1524/tcp 
    2038 +ingreslock     1524/udp 
    2039 +prospero-np    1525/tcp                # Prospero non-privileged 
    2040 +prospero-np    1525/udp 
    2041 +rfe            5002/tcp                # Radio Free Ethernet 
    2042 +rfe            5002/udp                # Actually uses UDP only 
    2043 +# 
    2044 +# 
    2045 +# Kerberos (Project Athena/MIT) services 
    2046 +# Note that these are for Kerberos v4, and are unofficial. 
    2047 +# 
    2048 +klogin         543/tcp                 # Kerberos `rlogin' 
    2049 +kshell         544/tcp         krcmd   # Kerberos `rsh' 
    2050 +kerberos-adm   749/tcp                 # Kerberos `kadmin' (v5) 
    2051 +kerberos4      750/udp         kdc     # Kerberos (server) udp 
    2052 +kerberos4      750/tcp         kdc     # Kerberos (server) tcp 
    2053 +kerberos-master        751/udp                 # Kerberos admin server udp 
    2054 +kerberos-master        751/tcp                 # Kerberos admin server tcp 
    2055 +krbupdate      760/tcp         kreg    # BSD Kerberos registration 
    2056 +kpasswd                761/tcp         kpwd    # BSD Kerberos `passwd' 
    2057 +eklogin                2105/tcp                # Kerberos encrypted `rlogin' 
    2058 +# 
    2059 +# Unofficial but necessary (for NetBSD) services 
    2060 +# 
    2061 +supfilesrv     871/tcp                 # SUP server 
    2062 +supfiledbg     1127/tcp                # SUP debugging 
    2063 +# 
    2064 +# AppleTalk DDP entries (DDP: Datagram Delivery Protocol) 
    2065 +# 
    2066 +rtmp           1/ddp                   # Routing Table Maintenance Protocol 
    2067 +nbp            2/ddp                   # Name Binding Protocol 
    2068 +echo           4/ddp                   # AppleTalk Echo Protocol 
    2069 +zip            6/ddp                   # Zone Information Protocol 
    2070 + 
    2071 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/shadow linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/shadow 
    2072 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/etc/shadow    1970-01-01 01:00:00.000000000 +0100 
    2073 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/etc/shadow        2005-12-24 20:29:42.067316648 +0000 
    2074 @@ -0,0 +1,11 @@ 
    2075 +root::10933:0:99999:7::: 
    2076 +bin:*:10933:0:99999:7::: 
    2077 +daemon:*:10933:0:99999:7::: 
    2078 +adm:*:10933:0:99999:7::: 
    2079 +lp:*:10933:0:99999:7::: 
    2080 +sync:*:10933:0:99999:7::: 
    2081 +shutdown:*:10933:0:99999:7::: 
    2082 +halt:*:10933:0:99999:7::: 
    2083 +uucp:*:10933:0:99999:7::: 
    2084 +operator:*:10933:0:99999:7::: 
    2085 +nobody:*:10933:0:99999:7::: 
    2086 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.generic_string linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.generic_string 
    2087 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.generic_string     1970-01-01 01:00:00.000000000 +0100 
    2088 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.generic_string 2005-12-24 20:29:42.071316040 +0000 
    2089 @@ -0,0 +1 @@ 
    2090 +# module             id=string 
    2091 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.ieee1394map linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.ieee1394map 
    2092 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.ieee1394map        1970-01-01 01:00:00.000000000 +0100 
    2093 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.ieee1394map    2005-12-24 20:29:42.071316040 +0000 
    2094 @@ -0,0 +1 @@ 
    2095 +# ieee1394 module    match_flags vendor_id model_id specifier_id version 
    2096 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.isapnpmap linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.isapnpmap 
    2097 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.isapnpmap  1970-01-01 01:00:00.000000000 +0100 
    2098 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.isapnpmap      2005-12-24 20:29:42.079314824 +0000 
    2099 @@ -0,0 +1 @@ 
    2100 +# isapnp module      cardvendor carddevice driver_data vendor     function   ... 
    2101 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.parportmap linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.parportmap 
    2102 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.parportmap 1970-01-01 01:00:00.000000000 +0100 
    2103 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.parportmap     2005-12-24 20:29:42.079314824 +0000 
    2104 @@ -0,0 +1 @@ 
    2105 +# module             pattern 
    2106 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.pcimap linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.pcimap 
    2107 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.pcimap     1970-01-01 01:00:00.000000000 +0100 
    2108 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.pcimap 2005-12-24 20:29:42.080314672 +0000 
    2109 @@ -0,0 +1 @@ 
    2110 +# pci module         vendor     device     subvendor  subdevice  class      class_mask driver_data 
    2111 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.pnpbiosmap linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.pnpbiosmap 
    2112 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.pnpbiosmap 1970-01-01 01:00:00.000000000 +0100 
    2113 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.pnpbiosmap     2005-12-24 20:29:42.080314672 +0000 
    2114 @@ -0,0 +1 @@ 
    2115 +# module             id 
    2116 diff -urN linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.usbmap linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.usbmap 
    2117 --- linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.usbmap     1970-01-01 01:00:00.000000000 +0100 
    2118 +++ linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/lib/modules/2.4.25/modules.usbmap 2005-12-24 20:29:42.080314672 +0000 
    2119 @@ -0,0 +1 @@ 
    2120 +# usb module         match_flags idVendor idProduct bcdDevice_lo bcdDevice_hi bDeviceClass bDeviceSubClass bDeviceProtocol bInterfaceClass bInterfaceSubClass bInterfaceProtocol driver_info 
    2121 Binary files linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/sbin/iwconfig and linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/sbin/iwconfig differ 
    2122 Binary files linux-2.4.32/arch/mips/ar531x/RAMDISK/rootdir/sbin/iwpriv and linux-2.4.32.new/arch/mips/ar531x/RAMDISK/rootdir/sbin/iwpriv differ 
    2123 diff -urN linux-2.4.32/arch/mips/ar531x/README linux-2.4.32.new/arch/mips/ar531x/README 
    2124 --- linux-2.4.32/arch/mips/ar531x/README        1970-01-01 01:00:00.000000000 +0100 
    2125 +++ linux-2.4.32.new/arch/mips/ar531x/README    2005-12-24 20:29:42.101311480 +0000 
     2591diff -urN linux-mips/arch/mips/ar531x/README mips-linux-2.4.25/arch/mips/ar531x/README 
     2592--- linux-mips/arch/mips/ar531x/README  1970-01-01 01:00:00.000000000 +0100 
     2593+++ mips-linux-2.4.25/arch/mips/ar531x/README   2005-12-30 17:26:30.478903296 +0000 
    21262594@@ -0,0 +1,68 @@ 
    21272595+Basic information for the AR531X Board Support Package 
     
    21932661+this effort, to "linux@atheros.com".  Your email will be received by a 
    21942662+couple of engineers, and redirected as appropriate. 
    2195 diff -urN linux-2.4.32/arch/mips/ar531x/README.BUILD linux-2.4.32.new/arch/mips/ar531x/README.BUILD 
    2196 --- linux-2.4.32/arch/mips/ar531x/README.BUILD  1970-01-01 01:00:00.000000000 +0100 
    2197 +++ linux-2.4.32.new/arch/mips/ar531x/README.BUILD      2005-12-24 20:29:42.101311480 +0000 
     2663diff -urN linux-mips/arch/mips/ar531x/README.BUILD mips-linux-2.4.25/arch/mips/ar531x/README.BUILD 
     2664--- linux-mips/arch/mips/ar531x/README.BUILD    1970-01-01 01:00:00.000000000 +0100 
     2665+++ mips-linux-2.4.25/arch/mips/ar531x/README.BUILD     2005-12-30 17:26:30.478903296 +0000 
    21982666@@ -0,0 +1,47 @@ 
    21992667+       How to BUILD a linux kernel for an AR531X system 
     
    22442712+    See instructions in README.EXECUTE to run your vmlinux 
    22452713+    image on an AP531X-based board. 
    2246 diff -urN linux-2.4.32/arch/mips/ar531x/README.EXECUTE linux-2.4.32.new/arch/mips/ar531x/README.EXECUTE 
    2247 --- linux-2.4.32/arch/mips/ar531x/README.EXECUTE        1970-01-01 01:00:00.000000000 +0100 
    2248 +++ linux-2.4.32.new/arch/mips/ar531x/README.EXECUTE    2005-12-24 20:29:42.101311480 +0000 
     2714diff -urN linux-mips/arch/mips/ar531x/README.EXECUTE mips-linux-2.4.25/arch/mips/ar531x/README.EXECUTE 
     2715--- linux-mips/arch/mips/ar531x/README.EXECUTE  1970-01-01 01:00:00.000000000 +0100 
     2716+++ mips-linux-2.4.25/arch/mips/ar531x/README.EXECUTE   2005-12-30 17:26:30.479903144 +0000 
    22492717@@ -0,0 +1,23 @@ 
    22502718+      How to EXECUTE a linux image on an AR531X system 
     
    22712739+over the serial line with this port.  We use kgdb and the kgdb_demux perl 
    22722740+script -- available over the www -- for debugging. 
    2273 diff -urN linux-2.4.32/arch/mips/ar531x/README.VERSION linux-2.4.32.new/arch/mips/ar531x/README.VERSION 
    2274 --- linux-2.4.32/arch/mips/ar531x/README.VERSION        1970-01-01 01:00:00.000000000 +0100 
    2275 +++ linux-2.4.32.new/arch/mips/ar531x/README.VERSION    2005-12-24 20:29:42.101311480 +0000 
     2741diff -urN linux-mips/arch/mips/ar531x/README.VERSION mips-linux-2.4.25/arch/mips/ar531x/README.VERSION 
     2742--- linux-mips/arch/mips/ar531x/README.VERSION  1970-01-01 01:00:00.000000000 +0100 
     2743+++ mips-linux-2.4.25/arch/mips/ar531x/README.VERSION   2005-12-30 17:26:30.479903144 +0000 
    22762744@@ -0,0 +1 @@ 
    22772745+Source release last modified: 12/16/03 
    2278 diff -urN linux-2.4.32/arch/mips/config-shared.in linux-2.4.32.new/arch/mips/config-shared.in 
    2279 --- linux-2.4.32/arch/mips/config-shared.in     2005-12-24 16:11:21.000000000 +0000 
    2280 +++ linux-2.4.32.new/arch/mips/config-shared.in 2005-12-24 21:33:42.804435856 +0000 
    2281 @@ -31,6 +31,7 @@ 
    2282  dep_bool 'Support for Alchemy PB1000 board' CONFIG_MIPS_PB1000 $CONFIG_MIPS32 
    2283  dep_bool 'Support for Alchemy PB1100 board' CONFIG_MIPS_PB1100 $CONFIG_MIPS32 
    2284  dep_bool 'Support for Alchemy PB1500 board' CONFIG_MIPS_PB1500 $CONFIG_MIPS32 
    2285 +dep_bool 'Support for Atheros AR5312/AR2312 WiSoC (EXPERIMENTAL)' CONFIG_AR531X $CONFIG_AR531X $CONFIG_EXPERIMENTAL 
     2746diff -urN linux-mips/arch/mips/config-shared.in mips-linux-2.4.25/arch/mips/config-shared.in 
     2747--- linux-mips/arch/mips/config-shared.in       2005-12-24 15:11:15.963885864 +0000 
     2748+++ mips-linux-2.4.25/arch/mips/config-shared.in        2005-12-30 17:26:31.611731080 +0000 
     2749@@ -34,6 +34,7 @@ 
    22862750 dep_bool 'Support for Alchemy PB1550 board' CONFIG_MIPS_PB1550 $CONFIG_MIPS32 
    22872751 dep_bool 'Support for Alchemy PB1200 board' CONFIG_MIPS_PB1200 $CONFIG_MIPS32 
    22882752 dep_bool 'Support for Alchemy Hydrogen3 board' CONFIG_MIPS_HYDROGEN3 $CONFIG_MIPS32 
    2289 @@ -196,7 +197,7 @@ 
    2290     bool '   Support for ZBbus profiling' CONFIG_SIBYTE_TBPROF 
    2291   
    2292     if [ "$CONFIG_SIBYTE_SWARM" = "y" -o \ 
    2293 -        "$CONFIG_SIBYTE_LITTLESUR" = "y" -o \ 
    2294 +O5B        "$CONFIG_SIBYTE_LITTLESUR" = "y" -o \ 
    2295          "$CONFIG_SIBYTE_PTSWARM" = "y" -o \ 
    2296          "$CONFIG_SIBYTE_CARMEL" = "y" ]; then 
    2297        define_bool CONFIG_SIBYTE_GENBUS_IDE y 
    2298 @@ -239,6 +240,43 @@ 
    2299     define_bool CONFIG_NONCOHERENT_IO y 
     2753+dep_bool 'Support for Atheros AR5312/AR2312 WiSoC (EXPERIMENTAL)' CONFIG_AR531X $CONFIG_AR531X $CONFIG_EXPERIMENTAL 
     2754 dep_bool 'Support for MyCable XXS1500 board' CONFIG_MIPS_XXS1500 $CONFIG_MIPS32 
     2755 dep_bool 'Support for 4G Systems MTX-1 board' CONFIG_MIPS_MTX1 $CONFIG_MIPS32 
     2756 dep_bool 'Support for Cogent CSB250 board' CONFIG_COGENT_CSB250 $CONFIG_MIPS32 
     2757@@ -238,6 +239,63 @@ 
    23002758    define_bool CONFIG_PC_KEYB y 
     2759    define_bool CONFIG_OLD_TIME_C y 
    23012760 fi 
    23022761+if [ "$CONFIG_AR531X" = "y" ]; then 
    23032762+   define_bool CONFIG_IRQ_CPU y 
    2304 +   define_bool CONFIG_CPU_VR4100 y 
     2763+   define_bool CONFIG_CPU_R4X00 y 
    23052764+   define_bool CONFIG_SERIAL y 
    23062765+   define_bool CONFIG_NEW_IRQ y 
     
    23192778+         AP38 CONFIG_AP38 \ 
    23202779+         AP43 CONFIG_AP43 \ 
    2321 +         AP48 CONFIG_AP48" AP30 
    2322 +   if [ "$CONFIG_AP30" = "y" ]; then 
     2780+         AP48 CONFIG_AP48 \ 
     2781+         AP51 CONFIG_AP51 \ 
     2782+          AP30-ASK CONFIG_AP30ASK" AP30 
     2783+   if [ "$CONFIG_AP30" = "y" -o "$CONFIG_AP30ASK" = "y" ]; then 
    23232784+       define_int CONFIG_MTD_PHYSMAP_BUSWIDTH 2 
    23242785+   fi 
     
    23352796+       define_int CONFIG_MTD_PHYSMAP_BUSWIDTH 1 
    23362797+   fi 
    2337 +   endmenu 
     2798+   if [ "$CONFIG_AP51" = "y" ]; then 
     2799+       define_int CONFIG_MTD_PHYSMAP_BUSWIDTH 1 
     2800+       define_bool CONFIG_MTD_REDBOOT_PARTS y 
     2801+       define_bool CONFIG_AR5315 y 
     2802+       define_bool CONFIG_MTD_SPIFLASH y 
     2803+       define_bool CONFIG_MTD_CFI n 
     2804+       define_bool CONFIG_MTD_JEDECPROBE n 
     2805+       define_bool CONFIG_MTD_CFI_INTELEXT n 
     2806+       define_bool CONFIG_MTD_CFI_AMDSTD n 
     2807+       define_bool CONFIG_MTD_OBSOLETE_CHIPS n 
     2808+       define_bool CONFIG_MTD_AMDSTD n 
     2809+       define_bool CONFIG_MTD_JEDEC n 
     2810+       define_bool CONFIG_MTD_PHYSMAP n 
     2811+   fi 
     2812+   mainmenu_option next_comment 
     2813+   comment 'Flash Selection' 
     2814+      choice 'Flash Size' \ 
     2815+         "2MB  CONFIG_FLASH_2MB \ 
     2816+          4MB  CONFIG_FLASH_4MB" 2MB 
    23382817+fi 
    23392818 if [ "$CONFIG_CASIO_E55" = "y" ]; then 
    23402819    define_bool CONFIG_IRQ_CPU y 
    2341     define_bool CONFIG_NONCOHERENT_IO y 
    2342 diff -urN linux-2.4.32/arch/mips/kernel/setup.c linux-2.4.32.new/arch/mips/kernel/setup.c 
    2343 --- linux-2.4.32/arch/mips/kernel/setup.c       2005-12-24 16:08:53.000000000 +0000 
    2344 +++ linux-2.4.32.new/arch/mips/kernel/setup.c   2005-12-24 21:28:51.779678344 +0000 
    2345 @@ -494,6 +494,7 @@ 
     2820    define_bool CONFIG_NEW_TIME_C y 
     2821 
     2822diff -urN linux-mips/arch/mips/kernel/setup.c mips-linux-2.4.25/arch/mips/kernel/setup.c 
     2823--- linux-mips/arch/mips/kernel/setup.c 2005-12-24 15:11:16.188851664 +0000 
     2824+++ mips-linux-2.4.25/arch/mips/kernel/setup.c  2005-12-30 17:26:33.536438480 +0000 
     2825@@ -496,6 +496,7 @@ 
    23462826        void hp_setup(void); 
    23472827        void au1x00_setup(void); 
     
    23512831        frame_info_init(); 
    23522832 #if defined(CONFIG_BLK_DEV_FD) || defined(CONFIG_BLK_DEV_FD_MODULE) 
    2353 @@ -691,6 +692,12 @@ 
     2833@@ -693,6 +694,12 @@ 
    23542834                 pmc_yosemite_setup(); 
    23552835                 break; 
     
    23642844                panic("Unsupported architecture"); 
    23652845        } 
    2366 diff -urN linux-2.4.32/arch/mips/Makefile linux-2.4.32.new/arch/mips/Makefile 
    2367 --- linux-2.4.32/arch/mips/Makefile     2005-12-24 16:09:51.000000000 +0000 
    2368 +++ linux-2.4.32.new/arch/mips/Makefile 2005-12-24 21:28:51.780678192 +0000 
    2369 @@ -725,6 +725,12 @@ 
     2846diff -urN linux-mips/arch/mips/Makefile mips-linux-2.4.25/arch/mips/Makefile 
     2847--- linux-mips/arch/mips/Makefile       2005-12-24 15:11:15.903894984 +0000 
     2848+++ mips-linux-2.4.25/arch/mips/Makefile        2005-12-30 17:26:29.911989480 +0000 
     2849@@ -701,6 +701,17 @@ 
    23702850 LOADADDR      += 0x80020000 
    23712851 endif 
     
    23742854+SUBDIRS       += arch/mips/ar531x 
    23752855+LIBS          += arch/mips/ar531x/ar531x.o 
     2856+ifdef CONFIG_AP51 
     2857+LOADADDR      += 0x80041000 
     2858+else 
    23762859+LOADADDR      += 0x80002000 
     2860+endif 
     2861+ 
    23772862+endif 
    23782863+ 
     
    23802865 # Choosing incompatible machines durings configuration will result in 
    23812866 # error messages during linking.  Select a default linkscript if 
    2382 diff -urN linux-2.4.32/drivers/mtd/chips/cfi_cmdset_0002.c linux-2.4.32.new/drivers/mtd/chips/cfi_cmdset_0002.c 
    2383 --- linux-2.4.32/drivers/mtd/chips/cfi_cmdset_0002.c    2004-11-17 11:54:21.000000000 +0000 
    2384 +++ linux-2.4.32.new/drivers/mtd/chips/cfi_cmdset_0002.c        2005-12-24 21:28:51.795675912 +0000 
    2385 @@ -510,7 +510,7 @@ 
     2867diff -urN linux-mips/ath_version.mk mips-linux-2.4.25/ath_version.mk 
     2868--- linux-mips/ath_version.mk   1970-01-01 01:00:00.000000000 +0100 
     2869+++ mips-linux-2.4.25/ath_version.mk    2005-12-30 17:27:00.579327336 +0000 
     2870@@ -0,0 +1 @@ 
     2871+EXTRAVERSION=-LSDK-5.0.0-RC5 
     2872diff -urN linux-mips/drivers/char/serial.c mips-linux-2.4.25/drivers/char/serial.c 
     2873--- linux-mips/drivers/char/serial.c    2005-12-24 15:11:21.796999096 +0000 
     2874+++ mips-linux-2.4.25/drivers/char/serial.c     2005-12-30 17:27:10.815771160 +0000 
     2875@@ -3441,7 +3441,7 @@ 
     2876  
     2877 static _INLINE_ void show_serial_version(void) 
     2878 { 
     2879-       printk(KERN_INFO "%s version %s%s (%s) with%s", serial_name, 
     2880+       printk(KERN_INFO "%s version %s%s (%s) with%s\n", serial_name, 
     2881               serial_version, LOCAL_VERSTRING, serial_revdate, 
     2882               serial_options); 
     2883 } 
     2884@@ -5567,7 +5567,7 @@ 
     2885                        printk(KERN_INFO"ttyS%02d%s at 0x%p (irq = %d) is a %s\n", 
     2886                               state->line + SERIAL_DEV_OFFSET, 
     2887                               (state->flags & ASYNC_FOURPORT) ? " FourPort" : "", 
     2888-                              state->iomem_base, state->irq, 
     2889+                              (void *)state->iomem_base, state->irq, 
     2890                               uart_config[state->type].name); 
     2891                } 
     2892                else { 
     2893diff -urN linux-mips/drivers/mtd/chips/cfi_cmdset_0002.c mips-linux-2.4.25/drivers/mtd/chips/cfi_cmdset_0002.c 
     2894--- linux-mips/drivers/mtd/chips/cfi_cmdset_0002.c      2005-12-24 15:11:25.102496584 +0000 
     2895+++ mips-linux-2.4.25/drivers/mtd/chips/cfi_cmdset_0002.c       2005-12-30 17:27:21.333172272 +0000 
     2896@@ -511,7 +511,7 @@ 
    23862897           or tells us why it failed. */         
    23872898        dq6 = CMD(1<<6); 
     
    23922903        oldstatus = cfi_read(map, adr); 
    23932904        status = cfi_read(map, adr); 
    2394 @@ -535,12 +535,14 @@ 
     2905@@ -536,16 +536,18 @@ 
    23952906                if( (status & dq5) == dq5 ) { 
    23962907                        /* When DQ5 raises, we must check once again 
     
    24042915+#if 0 
    24052916                                printk(KERN_WARNING "Warning: DQ5 raised while program operation was in progress, however operation completed OK\n" ); 
    2406 +#endif 
     2917+#endif  
    24072918                        } else {  
    24082919                                /* DQ5 is active so we can do a reset and stop the erase */ 
    24092920                                cfi_write(map, CMD(0xF0), chip->start); 
    2410 diff -urN linux-2.4.32/drivers/mtd/chips/jedec_probe.c linux-2.4.32.new/drivers/mtd/chips/jedec_probe.c 
    2411 --- linux-2.4.32/drivers/mtd/chips/jedec_probe.c        2003-06-13 15:51:34.000000000 +0100 
    2412 +++ linux-2.4.32.new/drivers/mtd/chips/jedec_probe.c    2005-12-24 21:28:51.797675608 +0000 
    2413 @@ -900,7 +900,16 @@ 
     2921-                               printk(KERN_WARNING "Internal flash device timeout occurred or write operation was performed while flash was programming.\n" ); 
     2922+                               printk(KERN_WARNING "Internal flash device timeout pt A occurred or write operation was performed while flash was programming.  timeout=%d\n",chip->word_write_time ); 
     2923                        } 
     2924                } else { 
     2925                        printk(KERN_WARNING "Waiting for write to complete timed out in do_write_oneword.");         
     2926@@ -959,7 +961,7 @@ 
     2927             { 
     2928                            /* DQ5 is active so we can do a reset and stop the erase */ 
     2929                                cfi_write(map, CMD(0xF0), chip->start); 
     2930-                printk( KERN_WARNING "Internal flash device timeout occured or write operation was performed while flash was erasing\n" ); 
     2931+                printk( KERN_WARNING "Internal flash device timeout pt B occured or write operation was performed while flash was erasing\n" ); 
     2932                        } 
     2933                } 
     2934         else 
     2935diff -urN linux-mips/drivers/mtd/chips/cfi_probe.c mips-linux-2.4.25/drivers/mtd/chips/cfi_probe.c 
     2936--- linux-mips/drivers/mtd/chips/cfi_probe.c    2005-12-24 15:11:25.103496432 +0000 
     2937+++ mips-linux-2.4.25/drivers/mtd/chips/cfi_probe.c     2005-12-30 17:27:21.507145824 +0000 
     2938@@ -51,7 +51,7 @@ 
     2939                          struct flchip *chips, struct cfi_private *cfi) 
     2940 { 
     2941        int i; 
     2942-        
     2943+ 
     2944        if ((base + 0) >= map->size) { 
     2945                printk(KERN_NOTICE 
     2946                        "Probe at base[0x00](0x%08lx) past the end of the map(0x%08lx)\n", 
     2947@@ -221,12 +221,10 @@ 
     2948  
     2949 static void print_cfi_ident(struct cfi_ident *cfip) 
     2950 { 
     2951-#if 0 
     2952        if (cfip->qry[0] != 'Q' || cfip->qry[1] != 'R' || cfip->qry[2] != 'Y') { 
     2953                printk("Invalid CFI ident structure.\n"); 
     2954                return; 
     2955        }        
     2956-#endif          
     2957        printk("Primary Vendor Command Set: %4.4X (%s)\n", cfip->P_ID, vendorname(cfip->P_ID)); 
     2958        if (cfip->P_ADR) 
     2959                printk("Primary Algorithm Table at %4.4X\n", cfip->P_ADR); 
     2960diff -urN linux-mips/drivers/mtd/chips/jedec_probe.c mips-linux-2.4.25/drivers/mtd/chips/jedec_probe.c 
     2961--- linux-mips/drivers/mtd/chips/jedec_probe.c  2005-12-24 15:11:25.126492936 +0000 
     2962+++ mips-linux-2.4.25/drivers/mtd/chips/jedec_probe.c   2005-12-30 17:27:21.532142024 +0000 
     2963@@ -104,6 +104,7 @@ 
     2964 #define SST29LE512     0x003d 
     2965 #define SST39LF800     0x2781 
     2966 #define SST39LF160     0x2782 
     2967+#define SST39LF1601    0x234b 
     2968 #define SST39LF512     0x00D4 
     2969 #define SST39LF010     0x00D5 
     2970 #define SST39LF020     0x00D6 
     2971@@ -113,6 +114,8 @@ 
     2972 #define SST49LF030A    0x001C 
     2973 #define SST49LF040A    0x0051 
     2974 #define SST49LF080A    0x005B 
     2975+#define SST39VF3201     0x235B 
     2976+#define SST39VF3202     0x235A 
     2977  
     2978 /* Toshiba */ 
     2979 #define TC58FVT160     0x00C2 
     2980@@ -900,7 +903,43 @@ 
    24142981                NumEraseRegions: 1, 
    24152982                regions: {ERASEINFO(0x01000,256), 
     
    24252992+               regions: {ERASEINFO(0x01000,512), 
    24262993+               } 
     2994+        }, { 
     2995+               mfr_id: MANUFACTURER_SST, 
     2996+               dev_id: SST39LF1601, 
     2997+               name: "SST 39LF1601", 
     2998+               DevSize: SIZE_2MiB, 
     2999+               CmdSet: P_ID_AMD_STD, 
     3000+               NumEraseRegions: 1, 
     3001+               regions: {ERASEINFO(0x01000,512), 
     3002+               } 
     3003+        }, { 
     3004+               mfr_id: MANUFACTURER_SST, 
     3005+               dev_id: SST39VF3201, 
     3006+               name: "SST 39VF3201", 
     3007+               DevSize: SIZE_4MiB, 
     3008+               CmdSet: P_ID_AMD_STD, 
     3009+               NumEraseRegions: 1, 
     3010+               regions: {ERASEINFO(0x01000,1024), 
     3011+               } 
     3012+        }, { 
     3013+               mfr_id: MANUFACTURER_SST, 
     3014+               dev_id: SST39VF3202, 
     3015+               name: "SST 39VF3202", 
     3016+               DevSize: SIZE_4MiB, 
     3017+               CmdSet: P_ID_AMD_STD, 
     3018+               NumEraseRegions: 1, 
     3019+               regions: {ERASEINFO(0x01000,1024), 
     3020+               } 
    24273021+        } 
    24283022 }; 
    24293023  
    24303024  
    2431 diff -urN linux-2.4.32/drivers/mtd/Config.in linux-2.4.32.new/drivers/mtd/Config.in 
    2432 --- linux-2.4.32/drivers/mtd/Config.in  2003-06-13 15:51:34.000000000 +0100 
    2433 +++ linux-2.4.32.new/drivers/mtd/Config.in      2005-12-24 21:28:51.803674696 +0000 
     3025@@ -967,6 +1006,35 @@ 
     3026        p_cfi->cfiq->DevSize = jedec_table[index].DevSize; 
     3027        p_cfi->cfi_mode = CFI_MODE_JEDEC; 
     3028  
     3029+       /* 
     3030+        * Add the following code to set the flash timing parameters. 
     3031+        * Maybe this is done in a table somwehere else? I can't find it. 
     3032+        */ 
     3033+           
     3034+           
     3035+       switch(jedec_table[index].dev_id) { 
     3036+       case SST39VF3201: 
     3037+       case SST39VF3202: 
     3038+               p_cfi->cfiq->WordWriteTimeoutTyp = 3;  /* 8 us */ 
     3039+               p_cfi->cfiq->WordWriteTimeoutMax = 4;  /* 16 us */ 
     3040+               p_cfi->cfiq->BlockEraseTimeoutTyp = 15; /* Actually 18ms, max 25 */ 
     3041+               p_cfi->cfiq->BlockEraseTimeoutMax =  15;  /*  Actually 25ms */  
     3042+               p_cfi->cfiq->ChipEraseTimeoutTyp = 16;  /* Max is 50ms, typical is 40ms */ 
     3043+               p_cfi->cfiq->ChipEraseTimeoutMax = 16; 
     3044+               break; 
     3045+       case SST39LF160: 
     3046+       case SST39LF1601: 
     3047+               p_cfi->cfiq->WordWriteTimeoutTyp = 4;  /* 14 us */ 
     3048+               p_cfi->cfiq->WordWriteTimeoutMax = 5;  /* 20 us */ 
     3049+               p_cfi->cfiq->BlockEraseTimeoutTyp = 15; /* Actually 18ms, max 25 */ 
     3050+               p_cfi->cfiq->BlockEraseTimeoutMax =  15;  /*  Actually 25ms */  
     3051+               p_cfi->cfiq->ChipEraseTimeoutTyp = 17;  /* Max is 70ms, typical is 40ms */ 
     3052+               p_cfi->cfiq->ChipEraseTimeoutMax = 17; 
     3053+               break; 
     3054+       } 
     3055+ 
     3056+ 
     3057+ 
     3058        for (i=0; i<num_erase_regions; i++){ 
     3059                p_cfi->cfiq->EraseRegionInfo[i] = jedec_table[index].regions[i]; 
     3060        } 
     3061diff -urN linux-mips/drivers/mtd/Config.in mips-linux-2.4.25/drivers/mtd/Config.in 
     3062--- linux-mips/drivers/mtd/Config.in    2005-12-24 15:11:25.091498256 +0000 
     3063+++ mips-linux-2.4.25/drivers/mtd/Config.in     2005-12-30 17:27:21.182195224 +0000 
    24343064@@ -14,6 +14,9 @@ 
    24353065    dep_tristate '  MTD partitioning support' CONFIG_MTD_PARTITIONS $CONFIG_MTD 
     
    24423072    if [ "$CONFIG_ARM" = "y" ]; then 
    24433073       dep_tristate '  ARM Firmware Suite partition parsing' CONFIG_MTD_AFS_PARTS $CONFIG_MTD_PARTITIONS 
    2444 diff -urN linux-2.4.32/drivers/mtd/maps/physmap.c linux-2.4.32.new/drivers/mtd/maps/physmap.c 
    2445 --- linux-2.4.32/drivers/mtd/maps/physmap.c     2003-06-13 15:51:34.000000000 +0100 
    2446 +++ linux-2.4.32.new/drivers/mtd/maps/physmap.c 2005-12-24 21:28:51.811673480 +0000 
    2447 @@ -80,12 +80,18 @@ 
     3074diff -urN linux-mips/drivers/mtd/devices/Makefile mips-linux-2.4.25/drivers/mtd/devices/Makefile 
     3075--- linux-mips/drivers/mtd/devices/Makefile     2005-12-24 15:11:25.128492632 +0000 
     3076+++ mips-linux-2.4.25/drivers/mtd/devices/Makefile      2005-12-30 17:27:21.561137616 +0000 
     3077@@ -22,5 +22,6 @@ 
     3078 obj-$(CONFIG_MTD_MTDRAM)       += mtdram.o 
     3079 obj-$(CONFIG_MTD_LART)         += lart.o 
     3080 obj-$(CONFIG_MTD_BLKMTD)       += blkmtd.o 
     3081+obj-$(CONFIG_MTD_SPIFLASH)      += spiflash.o 
     3082  
     3083 include $(TOPDIR)/Rules.make 
     3084diff -urN linux-mips/drivers/mtd/devices/spiflash.c mips-linux-2.4.25/drivers/mtd/devices/spiflash.c 
     3085--- linux-mips/drivers/mtd/devices/spiflash.c   1970-01-01 01:00:00.000000000 +0100 
     3086+++ mips-linux-2.4.25/drivers/mtd/devices/spiflash.c    2005-12-30 17:27:21.652123784 +0000 
     3087@@ -0,0 +1,506 @@ 
     3088+ 
     3089+/* 
     3090+ * MTD driver for the SPI Flash Memory support. 
     3091+ * 
     3092+ * $Id: //depot/sw/releases/linuxsrc/src/kernels/mips-linux-2.4.25/drivers/mtd/devices/spiflash.c#3 $ 
     3093+ * 
     3094+ * 
     3095+ * Copyright (c) 2005-2006 Atheros Communications Inc. 
     3096+ * 
     3097+ * This code is free software; you can redistribute it and/or modify 
     3098+ * it under the terms of the GNU General Public License version 2 as 
     3099+ * published by the Free Software Foundation. 
     3100+ * 
     3101+ */ 
     3102+ 
     3103+/*=========================================================================== 
     3104+** !!!!  VERY IMPORTANT NOTICE !!!!  FLASH DATA STORED IN LITTLE ENDIAN FORMAT 
     3105+** 
     3106+** This module contains the Serial Flash access routines for the Atheros SOC. 
     3107+** The Atheros SOC integrates a SPI flash controller that is used to access 
     3108+** serial flash parts. The SPI flash controller executes in "Little Endian" 
     3109+** mode. THEREFORE, all WRITES and READS from the MIPS CPU must be 
     3110+** BYTESWAPPED! The SPI Flash controller hardware by default performs READ 
     3111+** ONLY byteswapping when accessed via the SPI Flash Alias memory region 
     3112+** (Physical Address 0x0800_0000 - 0x0fff_ffff). The data stored in the 
     3113+** flash sectors is stored in "Little Endian" format. 
     3114+** 
     3115+** The spiflash_write() routine performs byteswapping on all write 
     3116+** operations. 
     3117+**===========================================================================*/ 
     3118+ 
     3119+#include <linux/kernel.h> 
     3120+#include <linux/module.h> 
     3121+#include <linux/types.h> 
     3122+#include <linux/version.h> 
     3123+#include <linux/errno.h> 
     3124+#include <linux/slab.h> 
     3125+#include <linux/mtd/mtd.h> 
     3126+#include <linux/mtd/partitions.h> 
     3127+#include <asm/delay.h> 
     3128+#include <asm/io.h> 
     3129+#include "spiflash.h" 
     3130+ 
     3131+/* debugging */ 
     3132+/* #define SPIFLASH_DEBUG */ 
     3133+ 
     3134+#ifndef __BIG_ENDIAN 
     3135+#error This driver currently only works with big endian CPU. 
     3136+#endif 
     3137+ 
     3138+static char module_name[] = "spiflash"; 
     3139+ 
     3140+#define MIN(a,b)        ((a) < (b) ? (a) : (b)) 
     3141+#define FALSE  0 
     3142+#define TRUE   1 
     3143+ 
     3144+#define ROOTFS_NAME    "rootfs" 
     3145+ 
     3146+static __u32 spiflash_regread32(int reg); 
     3147+static void spiflash_regwrite32(int reg, __u32 data); 
     3148+static __u32 spiflash_sendcmd (int op); 
     3149+ 
     3150+int __init spiflash_init (void); 
     3151+void __exit spiflash_exit (void); 
     3152+static int spiflash_probe (void); 
     3153+static int spiflash_erase (struct mtd_info *mtd,struct erase_info *instr); 
     3154+static int spiflash_read (struct mtd_info *mtd, loff_t from,size_t len,size_t *retlen,u_char *buf); 
     3155+static int spiflash_write (struct mtd_info *mtd,loff_t to,size_t len,size_t *retlen,const u_char *buf); 
     3156+ 
     3157+/* Flash configuration table */ 
     3158+struct flashconfig { 
     3159+    __u32 byte_cnt; 
     3160+    __u32 sector_cnt; 
     3161+    __u32 sector_size; 
     3162+    __u32 cs_addrmask; 
     3163+} flashconfig_tbl[MAX_FLASH] = 
     3164+    { 
     3165+        { 0, 0, 0, 0}, 
     3166+        { STM_1MB_BYTE_COUNT, STM_1MB_SECTOR_COUNT, STM_1MB_SECTOR_SIZE, 0x0}, 
     3167+        { STM_2MB_BYTE_COUNT, STM_2MB_SECTOR_COUNT, STM_2MB_SECTOR_SIZE, 0x0}, 
     3168+        { STM_4MB_BYTE_COUNT, STM_4MB_SECTOR_COUNT, STM_4MB_SECTOR_SIZE, 0x0} 
     3169+    }; 
     3170+ 
     3171+/* Mapping of generic opcodes to STM serial flash opcodes */ 
     3172+struct opcodes { 
     3173+    __u16 code; 
     3174+    __s8 tx_cnt; 
     3175+    __s8 rx_cnt; 
     3176+} stm_opcodes[] = { 
     3177+        {STM_OP_WR_ENABLE, 1, 0}, 
     3178+        {STM_OP_WR_DISABLE, 1, 0}, 
     3179+        {STM_OP_RD_STATUS, 1, 1}, 
     3180+        {STM_OP_WR_STATUS, 1, 0}, 
     3181+        {STM_OP_RD_DATA, 4, 4}, 
     3182+        {STM_OP_FAST_RD_DATA, 1, 0}, 
     3183+        {STM_OP_PAGE_PGRM, 8, 0}, 
     3184+        {STM_OP_SECTOR_ERASE, 4, 0}, 
     3185+        {STM_OP_BULK_ERASE, 1, 0}, 
     3186+        {STM_OP_DEEP_PWRDOWN, 1, 0}, 
     3187+        {STM_OP_RD_SIG, 4, 1} 
     3188+}; 
     3189+ 
     3190+/* Driver private data structure */ 
     3191+struct spiflash_data { 
     3192+       struct  mtd_info       *mtd;     
     3193+       struct  mtd_partition  *parsed_parts;     /* parsed partitions */ 
     3194+       void    *spiflash_readaddr; /* memory mapped data for read  */ 
     3195+       void    *spiflash_mmraddr;  /* memory mapped register space */ 
     3196+}; 
     3197+ 
     3198+static struct spiflash_data *spidata; 
     3199+ 
     3200+extern int parse_redboot_partitions(struct mtd_info *master, struct mtd_partition **pparts); 
     3201+ 
     3202+/***************************************************************************************************/ 
     3203+ 
     3204+static __u32 
     3205+spiflash_regread32(int reg) 
     3206+{ 
     3207+       volatile __u32 *data = (__u32 *)(spidata->spiflash_mmraddr + reg); 
     3208+ 
     3209+       return (*data); 
     3210+} 
     3211+ 
     3212+static void  
     3213+spiflash_regwrite32(int reg, __u32 data) 
     3214+{ 
     3215+       volatile __u32 *addr = (__u32 *)(spidata->spiflash_mmraddr + reg); 
     3216+ 
     3217+       *addr = data; 
     3218+       return; 
     3219+} 
     3220+ 
     3221+static __u32  
     3222+spiflash_sendcmd (int op) 
     3223+{ 
     3224+        __u32 reg; 
     3225+        __u32 mask; 
     3226+       struct opcodes *ptr_opcode; 
     3227+ 
     3228+       ptr_opcode = &stm_opcodes[op]; 
     3229+ 
     3230+       do { 
     3231+               reg = spiflash_regread32(SPI_FLASH_CTL); 
     3232+       } while (reg & SPI_CTL_BUSY); 
     3233+ 
     3234+       spiflash_regwrite32(SPI_FLASH_OPCODE, ptr_opcode->code); 
     3235+ 
     3236+       reg = (reg & ~SPI_CTL_TX_RX_CNT_MASK) | ptr_opcode->tx_cnt | 
     3237+               (ptr_opcode->rx_cnt << 4) | SPI_CTL_START; 
     3238+ 
     3239+       spiflash_regwrite32(SPI_FLASH_CTL, reg); 
     3240+  
     3241+       if (ptr_opcode->rx_cnt > 0) { 
     3242+               do { 
     3243+                       reg = spiflash_regread32(SPI_FLASH_CTL); 
     3244+               } while (reg & SPI_CTL_BUSY); 
     3245+ 
     3246+               reg = (__u32) spiflash_regread32(SPI_FLASH_DATA); 
     3247+ 
     3248+               switch (ptr_opcode->rx_cnt) { 
     3249+               case 1: 
     3250+                       mask = 0x000000ff; 
     3251+                       break; 
     3252+               case 2: 
     3253+                       mask = 0x0000ffff; 
     3254+                       break; 
     3255+               case 3: 
     3256+                       mask = 0x00ffffff; 
     3257+                       break; 
     3258+               default: 
     3259+                       mask = 0xffffffff; 
     3260+                       break; 
     3261+               } 
     3262+ 
     3263+               reg &= mask; 
     3264+       } 
     3265+       else { 
     3266+                       reg = 0; 
     3267+       } 
     3268+ 
     3269+       return reg; 
     3270+} 
     3271+ 
     3272+/* Probe SPI flash device 
     3273+ * Function returns 0 for failure. 
     3274+ * and flashconfig_tbl array index for success. 
     3275+ */ 
     3276+static int  
     3277+spiflash_probe (void) 
     3278+{ 
     3279+       __u32 sig; 
     3280+       int flash_size; 
     3281+ 
     3282+       /* Read the signature on the flash device */ 
     3283+       sig = spiflash_sendcmd(SPI_RD_SIG); 
     3284+ 
     3285+       switch (sig) { 
     3286+       case STM_8MBIT_SIGNATURE: 
     3287+               flash_size = FLASH_1MB; 
     3288+               break; 
     3289+        case STM_16MBIT_SIGNATURE: 
     3290+               flash_size = FLASH_2MB; 
     3291+               break; 
     3292+        case STM_32MBIT_SIGNATURE: 
     3293+               flash_size = FLASH_4MB; 
     3294+               break; 
     3295+        default: 
     3296+               printk (KERN_WARNING "%s: Read of flash device signature failed!\n", module_name); 
     3297+               return (0); 
     3298+       } 
     3299+ 
     3300+       return (flash_size); 
     3301+} 
     3302+ 
     3303+ 
     3304+static int  
     3305+spiflash_erase (struct mtd_info *mtd,struct erase_info *instr) 
     3306+{ 
     3307+       struct opcodes *ptr_opcode; 
     3308+       __u32 temp, reg; 
     3309+       int finished = FALSE; 
     3310+ 
     3311+#ifdef SPIFLASH_DEBUG 
     3312+       printk (KERN_DEBUG "%s(addr = 0x%.8x, len = %d)\n",__FUNCTION__,instr->addr,instr->len); 
     3313+#endif 
     3314+ 
     3315+       /* sanity checks */ 
     3316+       if (instr->addr + instr->len > mtd->size) return (-EINVAL); 
     3317+ 
     3318+       ptr_opcode = &stm_opcodes[SPI_SECTOR_ERASE]; 
     3319+ 
     3320+       temp = ((__u32)instr->addr << 8) | (__u32)(ptr_opcode->code); 
     3321+       spiflash_sendcmd(SPI_WRITE_ENABLE); 
     3322+       do { 
     3323+               reg = spiflash_regread32(SPI_FLASH_CTL); 
     3324+       } while (reg & SPI_CTL_BUSY); 
     3325+ 
     3326+       spiflash_regwrite32(SPI_FLASH_OPCODE, temp); 
     3327+ 
     3328+       reg = (reg & ~SPI_CTL_TX_RX_CNT_MASK) | ptr_opcode->tx_cnt | SPI_CTL_START; 
     3329+       spiflash_regwrite32(SPI_FLASH_CTL, reg); 
     3330+ 
     3331+       do { 
     3332+               reg = spiflash_sendcmd(SPI_RD_STATUS); 
     3333+               if (!(reg & SPI_STATUS_WIP)) { 
     3334+                       finished = TRUE; 
     3335+               } 
     3336+       } while (!finished); 
     3337+ 
     3338+       instr->state = MTD_ERASE_DONE; 
     3339+       if (instr->callback) instr->callback (instr); 
     3340+ 
     3341+#ifdef SPIFLASH_DEBUG 
     3342+       printk (KERN_DEBUG "%s return\n",__FUNCTION__); 
     3343+#endif 
     3344+       return (0); 
     3345+} 
     3346+ 
     3347+static int  
     3348+spiflash_read (struct mtd_info *mtd, loff_t from,size_t len,size_t *retlen,u_char *buf) 
     3349+{ 
     3350+       u_char  *read_addr; 
     3351+ 
     3352+#ifdef SPIFLASH_DEBUG 
     3353+       printk (KERN_DEBUG "%s(from = 0x%.8x, len = %d)\n",__FUNCTION__,(__u32) from,(int)len);   
     3354+#endif 
     3355+ 
     3356+       /* sanity checks */ 
     3357+       if (!len) return (0); 
     3358+       if (from + len > mtd->size) return (-EINVAL); 
     3359+        
     3360+ 
     3361+       /* we always read len bytes */ 
     3362+       *retlen = len; 
     3363+ 
     3364+       read_addr = (u_char *)(spidata->spiflash_readaddr + from); 
     3365+       memcpy(buf, read_addr, len); 
     3366+ 
     3367+       return (0); 
     3368+} 
     3369+ 
     3370+static int  
     3371+spiflash_write (struct mtd_info *mtd,loff_t to,size_t len,size_t *retlen,const u_char *buf) 
     3372+{ 
     3373+       int done = FALSE, page_offset, bytes_left, finished; 
     3374+       __u32 xact_len, spi_data = 0, opcode, reg; 
     3375+ 
     3376+#ifdef SPIFLASH_DEBUG 
     3377+       printk (KERN_DEBUG "%s(to = 0x%.8x, len = %d)\n",__FUNCTION__,(__u32) to,len);  
     3378+#endif 
     3379+ 
     3380+       *retlen = 0; 
     3381+        
     3382+       /* sanity checks */ 
     3383+       if (!len) return (0); 
     3384+       if (to + len > mtd->size) return (-EINVAL); 
     3385+        
     3386+       opcode = stm_opcodes[SPI_PAGE_PROGRAM].code; 
     3387+       bytes_left = len; 
     3388+        
     3389+       while (done == FALSE) { 
     3390+               xact_len = MIN(bytes_left, sizeof(__u32)); 
     3391+ 
     3392+               /* 32-bit writes cannot span across a page boundary 
     3393+                * (256 bytes). This types of writes require two page 
     3394+                * program operations to handle it correctly. The STM part 
     3395+                * will write the overflow data to the beginning of the 
     3396+                * current page as opposed to the subsequent page. 
     3397+                */ 
     3398+               page_offset = (to & (STM_PAGE_SIZE - 1)) + xact_len; 
     3399+ 
     3400+               if (page_offset > STM_PAGE_SIZE) { 
     3401+                       xact_len -= (page_offset - STM_PAGE_SIZE); 
     3402+               } 
     3403+ 
     3404+               spiflash_sendcmd(SPI_WRITE_ENABLE); 
     3405+ 
     3406+               do { 
     3407+                       reg = spiflash_regread32(SPI_FLASH_CTL); 
     3408+               } while (reg & SPI_CTL_BUSY); 
     3409+        
     3410+               switch (xact_len) { 
     3411+                       case 1: 
     3412+                               (__u8)spi_data = *buf; 
     3413+                               break; 
     3414+                       case 2: 
     3415+                               spi_data = (buf[1] << 8) | buf[0]; 
     3416+                               break; 
     3417+                       case 3: 
     3418+                               spi_data = (buf[2] << 16) | (buf[1] << 8) | buf[0]; 
     3419+                               break; 
     3420+                       case 4: 
     3421+                               spi_data = (buf[3] << 24) | (buf[2] << 16) |  
     3422+                                                       (buf[1] << 8) | buf[0]; 
     3423+                               break; 
     3424+                       default: 
     3425+                               printk("spiflash_write: default case\n"); 
     3426+                               break; 
     3427+               } 
     3428+ 
     3429+               spiflash_regwrite32(SPI_FLASH_DATA, spi_data); 
     3430+               opcode = (opcode & SPI_OPCODE_MASK) | ((__u32)to << 8); 
     3431+               spiflash_regwrite32(SPI_FLASH_OPCODE, opcode); 
     3432+ 
     3433+               reg = (reg & ~SPI_CTL_TX_RX_CNT_MASK) | (xact_len + 4) | SPI_CTL_START; 
     3434+               spiflash_regwrite32(SPI_FLASH_CTL, reg); 
     3435+               finished = FALSE; 
     3436+                
     3437+               do { 
     3438+                       udelay(1); 
     3439+                       reg = spiflash_sendcmd(SPI_RD_STATUS); 
     3440+                       if (!(reg & SPI_STATUS_WIP)) { 
     3441+                               finished = TRUE; 
     3442+                       } 
     3443+               } while (!finished); 
     3444+ 
     3445+               bytes_left -= xact_len; 
     3446+               to += xact_len; 
     3447+               buf += xact_len; 
     3448+ 
     3449+               *retlen += xact_len; 
     3450+ 
     3451+               if (bytes_left == 0) { 
     3452+                       done = TRUE; 
     3453+               } 
     3454+       } 
     3455+ 
     3456+       return (0); 
     3457+} 
     3458+ 
     3459+ 
     3460+int __init  
     3461+spiflash_init (void) 
     3462+{ 
     3463+       int result, i; 
     3464+       int index, num_parts; 
     3465+       struct mtd_info *mtd; 
     3466+       struct  mtd_partition  *mtd_parts; 
     3467+ 
     3468+       spidata = kmalloc(sizeof(struct spiflash_data), GFP_KERNEL); 
     3469+       if (!spidata) 
     3470+               return (-ENXIO); 
     3471+ 
     3472+       spidata->spiflash_mmraddr = ioremap_nocache(SPI_FLASH_MMR, SPI_FLASH_MMR_SIZE); 
     3473+       if (!spidata->spiflash_mmraddr) { 
     3474+                       printk (KERN_WARNING "%s: Failed to map flash device\n", module_name); 
     3475+               kfree(spidata); 
     3476+                       return (-ENXIO); 
     3477+       } 
     3478+ 
     3479+       mtd = kmalloc(sizeof(struct mtd_info), GFP_KERNEL); 
     3480+       if (!mtd) { 
     3481+               kfree(spidata); 
     3482+               return (-ENXIO); 
     3483+       } 
     3484+        
     3485+       memset (mtd,0,sizeof (*mtd)); 
     3486+        
     3487+       printk ("MTD driver for SPI flash.\n"); 
     3488+       printk ("%s: Probing for Serial flash ...\n", module_name); 
     3489+       if (!(index = spiflash_probe ())) { 
     3490+                       printk (KERN_WARNING "%s: Found no serial flash device\n", module_name); 
     3491+               kfree(mtd); 
     3492+               kfree(spidata); 
     3493+                       return (-ENXIO); 
     3494+       } 
     3495+       printk ("%s: Found SPI serial Flash.\n", module_name); 
     3496+       printk ("%d: size\n", flashconfig_tbl[index].byte_cnt); 
     3497+ 
     3498+       spidata->spiflash_readaddr = ioremap_nocache(SPI_FLASH_READ, flashconfig_tbl[index].byte_cnt); 
     3499+       if (!spidata->spiflash_readaddr) { 
     3500+                       printk (KERN_WARNING "%s: Failed to map flash device\n", module_name); 
     3501+               kfree(mtd); 
     3502+               kfree(spidata); 
     3503+                       return (-ENXIO); 
     3504+       } 
     3505+ 
     3506+       mtd->name = module_name; 
     3507+       mtd->type = MTD_NORFLASH; 
     3508+       mtd->flags = (MTD_CAP_NORFLASH|MTD_WRITEABLE); 
     3509+       mtd->size = flashconfig_tbl[index].byte_cnt; 
     3510+       mtd->erasesize = flashconfig_tbl[index].sector_size; 
     3511+       mtd->numeraseregions = 0; 
     3512+       mtd->eraseregions = NULL; 
     3513+       mtd->module = THIS_MODULE; 
     3514+       mtd->erase = spiflash_erase; 
     3515+       mtd->read = spiflash_read; 
     3516+       mtd->write = spiflash_write; 
     3517+        
     3518+#ifdef SPIFLASH_DEBUG 
     3519+       printk (KERN_DEBUG 
     3520+                  "mtd->name = %s\n" 
     3521+                  "mtd->size = 0x%.8x (%uM)\n" 
     3522+                  "mtd->erasesize = 0x%.8x (%uK)\n" 
     3523+                  "mtd->numeraseregions = %d\n", 
     3524+                  mtd->name, 
     3525+                  mtd->size, mtd->size / (1024*1024), 
     3526+                  mtd->erasesize, mtd->erasesize / 1024, 
     3527+                  mtd->numeraseregions); 
     3528+ 
     3529+       if (mtd->numeraseregions) { 
     3530+               for (result = 0; result < mtd->numeraseregions; result++) { 
     3531+                       printk (KERN_DEBUG 
     3532+                          "\n\n" 
     3533+                          "mtd->eraseregions[%d].offset = 0x%.8x\n" 
     3534+                          "mtd->eraseregions[%d].erasesize = 0x%.8x (%uK)\n" 
     3535+                          "mtd->eraseregions[%d].numblocks = %d\n", 
     3536+                          result,mtd->eraseregions[result].offset, 
     3537+                          result,mtd->eraseregions[result].erasesize,mtd->eraseregions[result].erasesize / 1024, 
     3538+                          result,mtd->eraseregions[result].numblocks); 
     3539+               } 
     3540+       } 
     3541+#endif 
     3542+ 
     3543+#ifndef CONFIG_BLK_DEV_INITRD 
     3544+       /* parse redboot partitions */ 
     3545+       num_parts = parse_redboot_partitions(mtd, &spidata->parsed_parts); 
     3546+ 
     3547+#ifdef SPIFLASH_DEBUG 
     3548+       printk (KERN_DEBUG "Found %d redboot partitions\n", num_parts); 
     3549+#endif 
     3550+ 
     3551+       if (num_parts) { 
     3552+               result = add_mtd_partitions(mtd, spidata->parsed_parts, num_parts); 
     3553+               /* Find root partition */ 
     3554+               mtd_parts = spidata->parsed_parts; 
     3555+               for (i=0; i < num_parts; i++) { 
     3556+                       if (!strcmp(mtd_parts[i].name, ROOTFS_NAME)) { 
     3557+                               /* Create root device */ 
     3558+                               ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, i); 
     3559+                               break; 
     3560+                       } 
     3561+               } 
     3562+       } else { 
     3563+#ifdef SPIFLASH_DEBUG 
     3564+       printk (KERN_DEBUG "Did not find any redboot partitions\n"); 
     3565+#endif 
     3566+               kfree(mtd); 
     3567+               kfree(spidata); 
     3568+                       return (-ENXIO); 
     3569+       } 
     3570+#endif 
     3571+ 
     3572+       spidata->mtd = mtd; 
     3573+ 
     3574+       return (result); 
     3575+} 
     3576+ 
     3577+void __exit  
     3578+spiflash_exit (void) 
     3579+{ 
     3580+       if (spidata && spidata->parsed_parts) { 
     3581+               del_mtd_partitions (spidata->mtd); 
     3582+               kfree(spidata->mtd); 
     3583+               kfree(spidata); 
     3584+       } 
     3585+} 
     3586+ 
     3587+module_init (spiflash_init); 
     3588+module_exit (spiflash_exit); 
     3589+ 
     3590+MODULE_LICENSE("GPL"); 
     3591+MODULE_AUTHOR("Atheros Communications Inc"); 
     3592+MODULE_DESCRIPTION("MTD driver for SPI Flash on Atheros SOC"); 
     3593+ 
     3594diff -urN linux-mips/drivers/mtd/devices/spiflash.h mips-linux-2.4.25/drivers/mtd/devices/spiflash.h 
     3595--- linux-mips/drivers/mtd/devices/spiflash.h   1970-01-01 01:00:00.000000000 +0100 
     3596+++ mips-linux-2.4.25/drivers/mtd/devices/spiflash.h    2005-12-30 17:27:21.652123784 +0000 
     3597@@ -0,0 +1,113 @@ 
     3598+/* 
     3599+ * SPI Flash Memory support header file. 
     3600+ * 
     3601+ * $Id: //depot/sw/releases/linuxsrc/src/kernels/mips-linux-2.4.25/drivers/mtd/devices/spiflash.h#3 $ 
     3602+ * 
     3603+ * 
     3604+ * Copyright (c) 2005, Atheros Communications Inc. 
     3605+ * 
     3606+ * This code is free software; you can redistribute it and/or modify 
     3607+ * it under the terms of the GNU General Public License version 2 as 
     3608+ * published by the Free Software Foundation. 
     3609+ * 
     3610+ */ 
     3611+#define FLASH_1MB  1 
     3612+#define FLASH_2MB  2 
     3613+#define FLASH_4MB  3 
     3614+#define MAX_FLASH  4 
     3615+ 
     3616+#define STM_PAGE_SIZE           256 
     3617+ 
     3618+#define STM_8MBIT_SIGNATURE     0x13 
     3619+#define STM_M25P80_BYTE_COUNT   1048576 
     3620+#define STM_M25P80_SECTOR_COUNT 16 
     3621+#define STM_M25P80_SECTOR_SIZE  0x10000 
     3622+ 
     3623+#define STM_16MBIT_SIGNATURE    0x14 
     3624+#define STM_M25P16_BYTE_COUNT   2097152 
     3625+#define STM_M25P16_SECTOR_COUNT 32 
     3626+#define STM_M25P16_SECTOR_SIZE  0x10000 
     3627+ 
     3628+#define STM_32MBIT_SIGNATURE    0x15 
     3629+#define STM_M25P32_BYTE_COUNT   4194304 
     3630+#define STM_M25P32_SECTOR_COUNT 64 
     3631+#define STM_M25P32_SECTOR_SIZE  0x10000 
     3632+ 
     3633+#define STM_1MB_BYTE_COUNT   STM_M25P80_BYTE_COUNT 
     3634+#define STM_1MB_SECTOR_COUNT STM_M25P80_SECTOR_COUNT 
     3635+#define STM_1MB_SECTOR_SIZE  STM_M25P80_SECTOR_SIZE 
     3636+#define STM_2MB_BYTE_COUNT   STM_M25P16_BYTE_COUNT 
     3637+#define STM_2MB_SECTOR_COUNT STM_M25P16_SECTOR_COUNT 
     3638+#define STM_2MB_SECTOR_SIZE  STM_M25P16_SECTOR_SIZE 
     3639+#define STM_4MB_BYTE_COUNT   STM_M25P32_BYTE_COUNT 
     3640+#define STM_4MB_SECTOR_COUNT STM_M25P32_SECTOR_COUNT 
     3641+#define STM_4MB_SECTOR_SIZE  STM_M25P32_SECTOR_SIZE 
     3642+ 
     3643+#define SPI_WRITE_ENABLE    0 
     3644+#define SPI_WRITE_DISABLE   1 
     3645+#define SPI_RD_STATUS       2 
     3646+#define SPI_WR_STATUS       3 
     3647+#define SPI_RD_DATA         4 
     3648+#define SPI_FAST_RD_DATA    5 
     3649+#define SPI_PAGE_PROGRAM    6 
     3650+#define SPI_SECTOR_ERASE    7 
     3651+#define SPI_BULK_ERASE      8 
     3652+#define SPI_DEEP_PWRDOWN    9 
     3653+#define SPI_RD_SIG          10 
     3654+#define SPI_MAX_OPCODES     11 
     3655+ 
     3656+#define SFI_WRITE_BUFFER_SIZE   4 
     3657+#define SFI_FLASH_ADDR_MASK     0x00ffffff 
     3658+ 
     3659+/* 
     3660+ * ST Microelectronics Opcodes for Serial Flash 
     3661+ */ 
     3662+ 
     3663+#define STM_OP_WR_ENABLE       0x06     /* Write Enable */ 
     3664+#define STM_OP_WR_DISABLE      0x04     /* Write Disable */ 
     3665+#define STM_OP_RD_STATUS       0x05     /* Read Status */ 
     3666+#define STM_OP_WR_STATUS       0x01     /* Write Status */ 
     3667+#define STM_OP_RD_DATA         0x03     /* Read Data */ 
     3668+#define STM_OP_FAST_RD_DATA    0x0b     /* Fast Read Data */ 
     3669+#define STM_OP_PAGE_PGRM       0x02     /* Page Program */ 
     3670+#define STM_OP_SECTOR_ERASE    0xd8     /* Sector Erase */ 
     3671+#define STM_OP_BULK_ERASE      0xc7     /* Bulk Erase */ 
     3672+#define STM_OP_DEEP_PWRDOWN    0xb9     /* Deep Power-Down Mode */ 
     3673+#define STM_OP_RD_SIG          0xab     /* Read Electronic Signature */ 
     3674+ 
     3675+#define STM_STATUS_WIP       0x01       /* Write-In-Progress */ 
     3676+#define STM_STATUS_WEL       0x02       /* Write Enable Latch */ 
     3677+#define STM_STATUS_BP0       0x04       /* Block Protect 0 */ 
     3678+#define STM_STATUS_BP1       0x08       /* Block Protect 1 */ 
     3679+#define STM_STATUS_BP2       0x10       /* Block Protect 2 */ 
     3680+#define STM_STATUS_SRWD      0x80       /* Status Register Write Disable */ 
     3681+ 
     3682+/* 
     3683+ * SPI Flash Interface Registers 
     3684+ */ 
     3685+#define AR531XPLUS_SPI_READ     0x1fc00000 
     3686+#define AR531XPLUS_SPI_MMR      0x11300000 
     3687+#define AR531XPLUS_SPI_MMR_SIZE 12 
     3688+ 
     3689+#define AR531XPLUS_SPI_CTL      0x00 
     3690+#define AR531XPLUS_SPI_OPCODE   0x04 
     3691+#define AR531XPLUS_SPI_DATA     0x08 
     3692+ 
     3693+#define SPI_FLASH_READ          AR531XPLUS_SPI_READ 
     3694+#define SPI_FLASH_MMR           AR531XPLUS_SPI_MMR 
     3695+#define SPI_FLASH_MMR_SIZE      AR531XPLUS_SPI_MMR_SIZE 
     3696+#define SPI_FLASH_CTL           AR531XPLUS_SPI_CTL 
     3697+#define SPI_FLASH_OPCODE        AR531XPLUS_SPI_OPCODE 
     3698+#define SPI_FLASH_DATA          AR531XPLUS_SPI_DATA 
     3699+ 
     3700+#define SPI_CTL_START           0x00000100 
     3701+#define SPI_CTL_BUSY            0x00010000 
     3702+#define SPI_CTL_TXCNT_MASK      0x0000000f 
     3703+#define SPI_CTL_RXCNT_MASK      0x000000f0 
     3704+#define SPI_CTL_TX_RX_CNT_MASK  0x000000ff 
     3705+#define SPI_CTL_SIZE_MASK       0x00060000 
     3706+ 
     3707+#define SPI_CTL_CLK_SEL_MASK    0x03000000 
     3708+#define SPI_OPCODE_MASK         0x000000ff 
     3709+ 
     3710+#define SPI_STATUS_WIP         STM_STATUS_WIP 
     3711diff -urN linux-mips/drivers/mtd/maps/Config.in mips-linux-2.4.25/drivers/mtd/maps/Config.in 
     3712--- linux-mips/drivers/mtd/maps/Config.in       2005-12-24 15:11:25.158488072 +0000 
     3713+++ mips-linux-2.4.25/drivers/mtd/maps/Config.in        2005-12-30 17:27:21.660122568 +0000 
     3714@@ -9,7 +9,14 @@ 
     3715 dep_tristate '  CFI Flash device in physical memory map' CONFIG_MTD_PHYSMAP $CONFIG_MTD_GEN_PROBE 
     3716 if [ "$CONFIG_MTD_PHYSMAP" = "y" -o "$CONFIG_MTD_PHYSMAP" = "m" ]; then 
     3717    hex '    Physical start address of flash mapping' CONFIG_MTD_PHYSMAP_START 0x8000000 
     3718-   hex '    Physical length of flash mapping' CONFIG_MTD_PHYSMAP_LEN 0x4000000 
     3719+   if [ "$CONFIG_FLASH_2MB" = "y" ]; then 
     3720+       define_hex CONFIG_MTD_PHYSMAP_LEN 200000 
     3721+   fi   
     3722+   if [ "$CONFIG_FLASH_4MB" = "y" ]; then 
     3723+       define_hex CONFIG_MTD_PHYSMAP_LEN 400000 
     3724+   fi   
     3725+ 
     3726+#   hex '    Physical length of flash mapping' CONFIG_MTD_PHYSMAP_LEN 0x4000000 
     3727    int '    Bus width in octets' CONFIG_MTD_PHYSMAP_BUSWIDTH 2 
     3728 fi 
     3729  
     3730diff -urN linux-mips/drivers/mtd/maps/physmap.c mips-linux-2.4.25/drivers/mtd/maps/physmap.c 
     3731--- linux-mips/drivers/mtd/maps/physmap.c       2005-12-24 15:11:25.217479104 +0000 
     3732+++ mips-linux-2.4.25/drivers/mtd/maps/physmap.c        2005-12-30 17:27:22.044064200 +0000 
     3733@@ -80,12 +80,25 @@ 
    24483734 }; 
    24493735  
     
    24583744+    { 
    24593745+        name:   "rootfs", 
     3746+#ifdef CONFIG_FLASH_2MB 
    24603747+        size:   0x000e0000, 
    2461 +        offset: 0x000f0000, 
     3748+       offset: 0x000f0000, 
     3749+#endif 
     3750+#ifdef CONFIG_FLASH_4MB 
     3751+        size:   0x002dd000, 
     3752+        offset: 0x00100000, 
     3753+#endif 
     3754+ 
    24623755+        /* Allow file system to be mounted for writing */ 
    24633756+    } 
     
    24653758        { 
    24663759                name:           "bootROM", 
    2467 @@ -138,6 +144,22 @@ 
     3760@@ -138,6 +151,22 @@ 
    24683761  
    24693762                add_mtd_device(mymtd); 
     
    24883781                mtd_parts_nb = parse_cmdline_partitions(mymtd, &mtd_parts,  
    24893782                                                        "phys"); 
    2490 @@ -147,7 +169,8 @@ 
     3783@@ -147,7 +176,8 @@ 
    24913784                               "Using command line partition definition\n"); 
    24923785                        add_mtd_partitions (mymtd, mtd_parts, mtd_parts_nb); 
     
    24983791                { 
    24993792                        printk(KERN_NOTICE  
    2500 diff -urN linux-2.4.32/drivers/mtd/redboot.c linux-2.4.32.new/drivers/mtd/redboot.c 
    2501 --- linux-2.4.32/drivers/mtd/redboot.c  2001-11-09 22:01:22.000000000 +0000 
    2502 +++ linux-2.4.32.new/drivers/mtd/redboot.c      2005-12-24 21:28:51.821671960 +0000 
     3793diff -urN linux-mips/drivers/mtd/redboot.c mips-linux-2.4.25/drivers/mtd/redboot.c 
     3794--- linux-mips/drivers/mtd/redboot.c    2005-12-24 15:11:25.249474240 +0000 
     3795+++ mips-linux-2.4.25/drivers/mtd/redboot.c     2005-12-30 17:27:22.517992152 +0000 
    25033796@@ -51,8 +51,14 @@ 
    25043797                return -ENOMEM; 
     
    25173810        if (ret) 
    25183811                goto out; 
    2519 diff -urN linux-2.4.32/drivers/net/Config.in linux-2.4.32.new/drivers/net/Config.in 
    2520 --- linux-2.4.32/drivers/net/Config.in  2005-12-24 16:16:53.000000000 +0000 
    2521 +++ linux-2.4.32.new/drivers/net/Config.in      2005-12-24 21:28:51.856666640 +0000 
    2522 @@ -30,6 +30,8 @@ 
     3812diff -urN linux-mips/drivers/net/Config.in mips-linux-2.4.25/drivers/net/Config.in 
     3813--- linux-mips/drivers/net/Config.in    2005-12-24 15:11:25.725401888 +0000 
     3814+++ mips-linux-2.4.25/drivers/net/Config.in     2005-12-30 17:27:22.684966768 +0000 
     3815@@ -24,6 +24,18 @@ 
    25233816 comment 'Ethernet (10 or 100Mbit)' 
    25243817 bool 'Ethernet (10 or 100Mbit)' CONFIG_NET_ETHERNET 
    25253818 if [ "$CONFIG_NET_ETHERNET" = "y" ]; then 
    25263819+   define_bool CONFIG_VENETDEV n 
    2527 +   define_bool CONFIG_MARVELL_ENET_PHY y 
     3820+   tristate ' BUILT-IN ATHEROS ENET DRIVER' CONFIG_NET_ATHEROS_ETHER 
     3821+   if [ "$CONFIG_AP38" = "y" -o "$CONFIG_AP48" = "y"  ]; then 
     3822+      define_bool CONFIG_KENDIN_ENET_PHY y 
     3823+   elif [ "$CONFIG_AP30ASK" = "y" ]; then 
     3824+      define_bool CONFIG_KENDIN_KS8995XA_ENET_PHY y 
     3825+      bool 'Multiple Ethernet address hack ' CONFIG_ASK_MULT_MAC_HACK 
     3826+   elif [ "$CONFIG_AP51" = "y" ]; then 
     3827+      define_bool CONFIG_ICPLUS_ENET_PHY y 
     3828+   else 
     3829+      define_bool CONFIG_MARVELL_ENET_PHY y 
     3830+   fi 
    25283831    if [ "$CONFIG_ARM" = "y" ]; then   
    25293832       dep_bool '  ARM EBSA110 AM79C961A support' CONFIG_ARM_AM79C961A $CONFIG_ARCH_EBSA110 
    25303833       tristate '  Cirrus Logic CS8900A support' CONFIG_ARM_CIRRUS 
    2531 diff -urN linux-2.4.32/drivers/net/wireless/Config.in linux-2.4.32.new/drivers/net/wireless/Config.in 
    2532 --- linux-2.4.32/drivers/net/wireless/Config.in 2004-11-17 11:54:21.000000000 +0000 
    2533 +++ linux-2.4.32.new/drivers/net/wireless/Config.in     2005-12-24 21:28:51.898660256 +0000 
    2534 @@ -38,7 +38,8 @@ 
     3834diff -urN linux-mips/drivers/net/Makefile mips-linux-2.4.25/drivers/net/Makefile 
     3835--- linux-mips/drivers/net/Makefile     2005-12-24 15:11:25.726401736 +0000 
     3836+++ mips-linux-2.4.25/drivers/net/Makefile      2005-12-30 17:27:22.709962968 +0000 
     3837@@ -31,6 +31,10 @@ 
     3838   obj-y += e1000/e1000.o 
     3839 endif 
    25353840  
    2536  # yes, this works even when no drivers are selected 
    2537  if [ "$CONFIG_ISA" = "y" -o "$CONFIG_PCI" = "y" -o \ 
    2538 -     "$CONFIG_ALL_PPC" = "y" -o "$CONFIG_PCMCIA" != "n" ]; then 
    2539 +     "$CONFIG_ALL_PPC" = "y" -o "$CONFIG_PCMCIA" != "n" -o \ 
    2540 +     "$CONFIG_NET_WIRELESS" = "y" ]; then 
    2541     define_bool CONFIG_NET_WIRELESS y 
    2542  else 
    2543     define_bool CONFIG_NET_WIRELESS n 
    2544 diff -urN linux-2.4.32/include/asm-mips/atheros/ar531xbsp.h linux-2.4.32.new/include/asm-mips/atheros/ar531xbsp.h 
    2545 --- linux-2.4.32/include/asm-mips/atheros/ar531xbsp.h   1970-01-01 01:00:00.000000000 +0100 
    2546 +++ linux-2.4.32.new/include/asm-mips/atheros/ar531xbsp.h       2005-12-24 20:29:06.898663096 +0000 
    2547 @@ -0,0 +1,16 @@ 
     3841+ifeq ($(CONFIG_NET_ATHEROS_ETHER),y) 
     3842+  obj-y += ath/ae531x.o 
     3843+endif 
     3844+ 
     3845 ifeq ($(CONFIG_BONDING),y) 
     3846   obj-y += bonding/bonding.o 
     3847 endif 
     3848@@ -53,8 +57,13 @@ 
     3849 subdir-$(CONFIG_SKFP) += skfp 
     3850 subdir-$(CONFIG_E100) += e100 
     3851 subdir-$(CONFIG_E1000) += e1000 
     3852+subdir-$(CONFIG_NET_ATHEROS_ETHER) += ath 
     3853 subdir-$(CONFIG_BONDING) += bonding 
     3854  
     3855+ifeq ($(CONFIG_ATHAP33),y) 
     3856+subdir-$(CONFIG_ATHAP33) += athap33 
     3857+endif 
     3858+ 
     3859 # 
     3860 # link order important here 
     3861 # 
     3862@@ -242,6 +251,10 @@ 
     3863 obj-$(CONFIG_R8169) += r8169.o 
     3864 obj-$(CONFIG_AMD8111_ETH) += amd8111e.o mii.o 
     3865  
     3866+ifeq ($(CONFIG_ATHAP33),y) 
     3867+obj-$(CONFIG_ATHAP33) += athap33/ath_ap_mips.o 
     3868+endif 
     3869+ 
     3870 # non-drivers/net drivers who want mii lib 
     3871 obj-$(CONFIG_PCMCIA_SMC91C92) += mii.o 
     3872 obj-$(CONFIG_USB_USBNET) += mii.o 
     3873diff -urN linux-mips/fs/jffs2/nodelist.h mips-linux-2.4.25/fs/jffs2/nodelist.h 
     3874--- linux-mips/fs/jffs2/nodelist.h      2005-12-24 15:11:50.407649616 +0000 
     3875+++ mips-linux-2.4.25/fs/jffs2/nodelist.h       2005-12-30 17:27:51.289618200 +0000 
     3876@@ -31,7 +31,7 @@ 
     3877  * provisions above, a recipient may use your version of this file 
     3878  * under either the RHEPL or the GPL. 
     3879  * 
     3880- * $Id: nodelist.h,v 1.46.2.5 2003/11/02 13:54:20 dwmw2 Exp $ 
     3881+ * $Id: //depot/sw/releases/linuxsrc/src/kernels/mips-linux-2.4.25/fs/jffs2/nodelist.h#3 $ 
     3882  * 
     3883  */ 
     3884  
     3885@@ -222,8 +222,8 @@ 
     3886 #define ALLOC_DELETION 1       /* Deletion node. Best to allow it */ 
     3887 #define ALLOC_GC       2       /* Space requested for GC. Give it or die */ 
     3888  
     3889-#define JFFS2_RESERVED_BLOCKS_BASE 3                                           /* Number of free blocks there must be before we... */ 
     3890-#define JFFS2_RESERVED_BLOCKS_WRITE (JFFS2_RESERVED_BLOCKS_BASE + 2)           /* ... allow a normal filesystem write */ 
     3891+#define JFFS2_RESERVED_BLOCKS_BASE 2                                           /* Number of free blocks there must be before we... */ 
     3892+#define JFFS2_RESERVED_BLOCKS_WRITE (JFFS2_RESERVED_BLOCKS_BASE + 1)           /* ... allow a normal filesystem write */ 
     3893 #define JFFS2_RESERVED_BLOCKS_DELETION (JFFS2_RESERVED_BLOCKS_BASE + 1)                /* ... allow a normal filesystem deletion */ 
     3894 #define JFFS2_RESERVED_BLOCKS_GCTRIGGER (JFFS2_RESERVED_BLOCKS_BASE + 3)       /* ... wake up the GC thread */ 
     3895 #define JFFS2_RESERVED_BLOCKS_GCBAD (JFFS2_RESERVED_BLOCKS_BASE + 1)           /* ... pick a block from the bad_list to GC */ 
     3896diff -urN linux-mips/fs/partitions/Config.in mips-linux-2.4.25/fs/partitions/Config.in 
     3897--- linux-mips/fs/partitions/Config.in  2005-12-24 15:11:52.366351848 +0000 
     3898+++ mips-linux-2.4.25/fs/partitions/Config.in   2005-12-30 17:27:52.279467720 +0000 
     3899@@ -39,7 +39,7 @@ 
     3900    fi 
     3901    if [ "$CONFIG_AMIGA" != "y" -a "$CONFIG_ATARI" != "y" -a \ 
     3902         "$CONFIG_MAC" != "y" -a "$CONFIG_SGI_IP22" != "y" -a \ 
     3903-       "$CONFIG_SGI_IP27" != "y" ]; then 
     3904+       "$CONFIG_SGI_IP27" != "y" -a "$CONFIG_AR531X" != "y" ]; then 
     3905       define_bool CONFIG_MSDOS_PARTITION y 
     3906    fi 
     3907    if [ "$CONFIG_AMIGA" = "y" -o "$CONFIG_AFFS_FS" = "y" ]; then 
     3908diff -urN linux-mips/include/asm-mips/atheros/ar531xbsp.h mips-linux-2.4.25/include/asm-mips/atheros/ar531xbsp.h 
     3909--- linux-mips/include/asm-mips/atheros/ar531xbsp.h     1970-01-01 01:00:00.000000000 +0100 
     3910+++ mips-linux-2.4.25/include/asm-mips/atheros/ar531xbsp.h      2005-12-30 17:28:01.523062480 +0000 
     3911@@ -0,0 +1,17 @@ 
    25483912+#ifndef __ASM_ATHEROS_BSP_SUPPORT_H 
    25493913+#define __ASM_ATHEROS_BSP_SUPPORT_H 
     
    25553919+ 
    25563920+extern unsigned int ar531x_sys_frequency(void); 
     3921+extern const char* get_system_type(void); 
    25573922+ 
    25583923+#ifdef CONFIG_KGDB 
     
    25623927+ 
    25633928+#endif /* __ASM_ATHEROS_BSP_SUPPORT_H */ 
    2564 diff -urN linux-2.4.32/include/asm-mips/bootinfo.h linux-2.4.32.new/include/asm-mips/bootinfo.h 
    2565 --- linux-2.4.32/include/asm-mips/bootinfo.h    2005-12-24 16:08:53.000000000 +0000 
    2566 +++ linux-2.4.32.new/include/asm-mips/bootinfo.h        2005-12-24 21:28:51.899660104 +0000 
     3929diff -urN linux-mips/include/asm-mips/bootinfo.h mips-linux-2.4.25/include/asm-mips/bootinfo.h 
     3930--- linux-mips/include/asm-mips/bootinfo.h      2005-12-24 15:12:00.645093288 +0000 
     3931+++ mips-linux-2.4.25/include/asm-mips/bootinfo.h       2005-12-30 17:28:01.534060808 +0000 
    25673932@@ -37,6 +37,7 @@ 
    25683933 #define MACH_GROUP_HP_LJ       20 /* Hewlett Packard LaserJet               */ 
     
    25733938 /* 
    25743939  * Valid machtype values for group unknown (low order halfword of mips_machtype) 
    2575 @@ -201,6 +202,17 @@ 
     3940@@ -198,6 +199,17 @@ 
    25763941  */ 
    25773942 #define        MACH_TITAN_YOSEMITE     1       /* PMC-Sierra Yosemite */ 
     
    25913956  
    25923957 const char *get_system_type(void); 
    2593 diff -urN linux-2.4.32/include/asm-mips/serial.h linux-2.4.32.new/include/asm-mips/serial.h 
    2594 --- linux-2.4.32/include/asm-mips/serial.h      2005-01-19 14:10:12.000000000 +0000 
    2595 +++ linux-2.4.32.new/include/asm-mips/serial.h  2005-12-24 21:28:51.901659800 +0000 
    2596 @@ -467,6 +467,11 @@ 
     3958diff -urN linux-mips/include/asm-mips/page.h mips-linux-2.4.25/include/asm-mips/page.h 
     3959--- linux-mips/include/asm-mips/page.h  2005-12-24 15:12:01.097024584 +0000 
     3960+++ mips-linux-2.4.25/include/asm-mips/page.h   2005-12-30 17:28:01.898005480 +0000 
     3961@@ -13,7 +13,6 @@ 
     3962 #include <linux/config.h> 
     3963 #include <asm/break.h> 
     3964  
     3965-#ifdef __KERNEL__ 
     3966  
     3967 /* 
     3968  * PAGE_SHIFT determines the page size 
     3969@@ -30,6 +29,7 @@ 
     3970 #define PAGE_SIZE      (1L << PAGE_SHIFT) 
     3971 #define PAGE_MASK      (~(PAGE_SIZE-1)) 
     3972  
     3973+#ifdef __KERNEL__ 
     3974 #ifndef __ASSEMBLY__ 
     3975  
     3976 #include <asm/cacheflush.h> 
     3977diff -urN linux-mips/include/asm-mips/serial.h mips-linux-2.4.25/include/asm-mips/serial.h 
     3978--- linux-mips/include/asm-mips/serial.h        2005-12-24 15:12:01.130019568 +0000 
     3979+++ mips-linux-2.4.25/include/asm-mips/serial.h 2005-12-30 17:28:02.143968088 +0000 
     3980@@ -410,6 +410,11 @@ 
    25973981 #define DDB5477_SERIAL_PORT_DEFNS 
    25983982 #endif 
     
    26063990        ATLAS_SERIAL_PORT_DEFNS                 \ 
    26073991        AU1000_SERIAL_PORT_DEFNS                \ 
    2608 diff -urN linux-2.4.32/kernel/printk.c linux-2.4.32.new/kernel/printk.c 
    2609 --- linux-2.4.32/kernel/printk.c        2004-11-17 11:54:22.000000000 +0000 
    2610 +++ linux-2.4.32.new/kernel/printk.c    2005-12-24 21:28:51.929655544 +0000 
    2611 @@ -384,6 +384,18 @@ 
     3992diff -urN linux-mips/kernel/printk.c mips-linux-2.4.25/kernel/printk.c 
     3993--- linux-mips/kernel/printk.c  2005-12-24 15:12:09.361768152 +0000 
     3994+++ mips-linux-2.4.25/kernel/printk.c   2005-12-30 17:28:11.943478336 +0000 
     3995@@ -383,6 +383,18 @@ 
    26123996        _call_console_drivers(start_print, end, msg_level); 
    26133997 } 
     
    26284012 { 
    26294013        LOG_BUF(log_end) = c; 
    2630 @@ -395,6 +407,7 @@ 
     4014@@ -394,6 +406,7 @@ 
    26314015        if (logged_chars < LOG_BUF_LEN) 
    26324016                logged_chars++; 
     
    26364020 /* 
    26374021  * This is printk.  It can be called from any context.  We want it to work. 
    2638 @@ -700,3 +713,4 @@ 
     4022@@ -696,3 +709,4 @@ 
    26394023                tty->driver.write(tty, 0, msg, strlen(msg)); 
    26404024        return; 
    26414025 } 
    26424026+ 
     4027diff -urN linux-mips-orig/drivers/net/ath/ae531x.h linux-mips-new/drivers/net/ath/ae531x.h 
     4028--- linux-mips-orig/drivers/net/ath/ae531x.h    1970-01-01 01:00:00.000000000 +0100 
     4029+++ linux-mips-new/drivers/net/ath/ae531x.h     2005-12-31 12:33:57.672538976 +0000 
     4030@@ -0,0 +1,43 @@ 
     4031+#ifndef __AE531X_H 
     4032+#define __AE531X_H 
     4033+ 
     4034+#include <linux/config.h> 
     4035+#include <linux/types.h> 
     4036+#include <linux/delay.h> 
     4037+#include <linux/netdevice.h> 
     4038+#include <linux/etherdevice.h> 
     4039+#include <linux/init.h> 
     4040+#include <linux/skbuff.h> 
     4041+#include <asm/io.h> 
     4042+ 
     4043+#include "ar531xlnx.h" 
     4044+#include "ae531xreg.h" 
     4045+#include "ae531xmac.h" 
     4046+ 
     4047+extern void *ae531x_rxbuf_alloc(ae531x_MAC_t *MACInfo, char **rxBuffp,  
     4048+                               int *rxBuffSizep); 
     4049+extern void ae531x_swptr_free(VIRT_ADDR desc); 
     4050+extern BOOL ae531x_twisted_enet(void); 
     4051+extern void ae531x_MiiWrite(UINT32 phyBase, UINT32 phyAddr, UINT8 reg,  
     4052+                           UINT16 data); 
     4053+extern UINT16 ae531x_MiiRead(UINT32 phyBase, UINT32 phyAddr, UINT8 reg); 
     4054+extern void ae531x_unitLinkGained(int ethUnit); 
     4055+extern void ae531x_unitLinkLost(int ethUnit); 
     4056+extern void ae531x_WriteDmaReg(ae531x_MAC_t *MACInfo, UINT32 reg, UINT32 data); 
     4057+extern void ae531x_MACReset(ae531x_MAC_t *MACInfo); 
     4058+extern void ae531x_DisableComm(ae531x_MAC_t *MACInfo); 
     4059+extern void ae531x_FreeQueues(ae531x_MAC_t *MACInfo); 
     4060+extern void ae531x_reset(ae531x_MAC_t *MACInfo); 
     4061+extern int  ae531x_AllocateQueues(ae531x_MAC_t *MACInfo); 
     4062+extern void ae531x_EnableComm(ae531x_MAC_t *MACInfo); 
     4063+extern void ae531x_DmaIntEnable(ae531x_MAC_t *MACInfo); 
     4064+extern void ae531x_DmaIntDisable(ae531x_MAC_t *MACInfo); 
     4065+extern void ae531x_DmaReset(ae531x_MAC_t *MACInfo); 
     4066+extern void ae531x_BeginResetMode(ae531x_MAC_t *MACInfo); 
     4067+extern void ae531x_AckIntr(ae531x_MAC_t *MACInfo, UINT32 data); 
     4068+extern void ae531x_SetDmaReg(ae531x_MAC_t *MACInfo, UINT32 reg, UINT32 val); 
     4069+extern BOOL ae531x_IsInResetMode(ae531x_MAC_t *MACInfo); 
     4070+extern UINT32 ae531x_ReadDmaReg(ae531x_MAC_t *MACInfo, UINT32 reg); 
     4071+extern void ae531x_ClearDmaReg(ae531x_MAC_t *MACInfo, UINT32 reg, UINT32 val); 
     4072+ 
     4073+#endif   /* __AE531X_H */ 
     4074diff -urN linux-mips-orig/drivers/net/ath/ae531xlnx.c linux-mips-new/drivers/net/ath/ae531xlnx.c 
     4075--- linux-mips-orig/drivers/net/ath/ae531xlnx.c 1970-01-01 01:00:00.000000000 +0100 
     4076+++ linux-mips-new/drivers/net/ath/ae531xlnx.c  2005-12-31 12:33:57.673538824 +0000 
     4077@@ -0,0 +1,1303 @@ 
     4078+/* 
     4079+ * This file is subject to the terms and conditions of the GNU General Public 
     4080+ * License.  See the file "COPYING" in the main directory of this archive 
     4081+ * for more details. 
     4082+ * 
     4083+ * Copyright © 2003 Atheros Communications, Inc.,  All Rights Reserved. 
     4084+ */ 
     4085+ 
     4086+/* 
     4087+ * Ethernet driver for Atheros' ae531x ethernet MAC. 
     4088+ * This is a fairly generic driver, but it's intended 
     4089+ * for use in typical Atheros products. 
     4090+ */ 
     4091+ 
     4092+#include <linux/config.h> 
     4093+#include <linux/module.h> 
     4094+#include <linux/types.h> 
     4095+#include <linux/delay.h> 
     4096+#include <linux/netdevice.h> 
     4097+#include <linux/etherdevice.h> 
     4098+#include <linux/init.h> 
     4099+#include <linux/skbuff.h> 
     4100+#include <asm/io.h> 
     4101+ 
     4102+#include "ar531xlnx.h" 
     4103+#include "ae531xreg.h" 
     4104+#include "ae531xmac.h" 
     4105+#include "ae531x.h" 
     4106+ 
     4107+#ifndef EXPORT_SYMTAB 
     4108+#define EXPORT_SYMTAB 
     4109+#endif 
     4110+ 
     4111+#ifdef DEBUG 
     4112+void my_mvPhyShow(int ethUnit); 
     4113+#endif 
     4114+ 
     4115+static struct ar531x_boarddata *ar531x_boardConfig=NULL; 
     4116+ 
     4117+static char *radioConfig=NULL; 
     4118+ 
     4119+#define AE531X_LAN_PORT 0 
     4120+#define AE531X_DEV_PER_MAC 1 
     4121+ 
     4122+/* 
     4123+ * ae531x_MAC_state contains driver-specific linux-specific per-MAC information. 
     4124+ * The OSinfo member of ae531x_MAC_t points to one of these. 
     4125+ */ 
     4126+typedef struct ae531x_MAC_state { 
     4127+    int                         irq; 
     4128+    struct tq_struct            restart_task; 
     4129+    struct net_device_stats     stats; 
     4130+    struct ae531x_dev_sw_state  *dev_sw_state[AE531X_DEV_PER_MAC]; 
     4131+    int                         primary_dev; 
     4132+    ae531x_MAC_t                MACInfo; /* hardware state */ 
     4133+} ae531x_MAC_state_t; 
     4134+ 
     4135+/* 
     4136+ * ae531x_dev_sw_state contains driver-specific linux-specific per-device 
     4137+ * information.  The net_device priv member points to one of these, and 
     4138+ * this structure contains a pointer to the associated MAC information. 
     4139+ */ 
     4140+ 
     4141+typedef struct ae531x_dev_sw_state { 
     4142+    int                     enetUnit;        /* system unit number "eth%d" */ 
     4143+    int                     unit_on_MAC;     /* MAC-relative unit number */ 
     4144+    struct net_device       *dev; 
     4145+    ae531x_MAC_state_t      *MAC_state;      /* underlying MAC hw/sw state */ 
     4146+} ae531x_dev_sw_state_t; 
     4147+ 
     4148+/* 
     4149+ * Driver-independent linux-specific per-ethernet device software information. 
     4150+ */ 
     4151+static struct net_device *ae531x_MAC_dev[AR531X_NUM_ENET_MAC * AE531X_DEV_PER_MAC]; 
     4152+ 
     4153+/* Driver-dependent per-MAC information */ 
     4154+static ae531x_MAC_state_t per_MAC_info[AR531X_NUM_ENET_MAC]; 
     4155+ 
     4156+/* 
     4157+ * Receive buffers need enough room to hold the following: 
     4158+ * 1) a max MTU-sized packet.   
     4159+ * 2) space for an ethernet header 
     4160+ * 3) room at the beginning of the receive buffer in order 
     4161+ *    to facilitate cooperating drivers that need to PREpend 
     4162+ *    data. 
     4163+ * 4) Depending on configuration, we may need some additional 
     4164+ *    room at the END of the rx buffer for phy-supplied 
     4165+ *    trailers (if any). (c.f. CONFIG_VENETDEV) 
     4166+ * 
     4167+ * The DMA engine insists on 32-bit aligned RX buffers. 
     4168+ * TBDXXX: With current code, the IP stack ends up looking 
     4169+ * at misaligned headers with word operations.  The misaligned 
     4170+ * reads are software-emulated via handle_adel_int.  We'd 
     4171+ * rather align the buffers on a 16-bit boundary, but the 
     4172+ * DMA engine doesn't permit it??? 
     4173+ */ 
     4174+#define ETH_MAX_MTU 1518 
     4175+#define AE531X_RX_BUF_SIZE \ 
     4176+    (((RXBUFF_RESERVE + ETH_HLEN + ETH_MAX_MTU + PHY_TRAILER_SIZE) + 3) & ~3) 
     4177+ 
     4178+/* Forward references to local functions */ 
     4179+static void ae531x_TxReap(ae531x_MAC_state_t *MAC_state); 
     4180+static int ae531x_phy_poll(void *data); 
     4181+static int ae531x_MAC_stop(struct net_device *dev); 
     4182+static int ae531x_MAC_open(struct net_device *dev); 
     4183+ 
     4184+/******************************************************************************* 
     4185+* ae531x_MAC_poll checks for received packets, and sends data 
     4186+* up the stack. 
     4187+*/ 
     4188+int 
     4189+ae531x_MAC_poll(struct net_device *dev, int *budget) 
     4190+{ 
     4191+    struct sk_buff *skb; 
     4192+    struct sk_buff *newskb; 
     4193+    char *rxBufp; 
     4194+    int unused_length; 
     4195+    VIRT_ADDR   rxDesc; 
     4196+    int length; 
     4197+    ae531x_dev_sw_state_t *dev_sw_state; 
     4198+    ae531x_MAC_state_t *MAC_state; 
     4199+    ae531x_MAC_t *MACInfo; 
     4200+    u32 cmdsts; 
     4201+    int rx_limit; 
     4202+    int rx_received; 
     4203+    int rxDescCount; 
     4204+    struct net_device *rxdev; 
     4205+    int early_stop; 
     4206+    int retval; 
     4207+#ifdef DEBUG 
     4208+       static int rxDescCountMax = 0; 
     4209+#endif 
     4210+ 
     4211+    ARRIVE(); 
     4212+ 
     4213+    dev_sw_state = (ae531x_dev_sw_state_t *)dev->priv; 
     4214+    MAC_state = dev_sw_state->MAC_state; 
     4215+    MACInfo = &MAC_state->MACInfo; 
     4216+    rx_limit = MAC_state->dev_sw_state[MAC_state->primary_dev]->dev->quota; 
     4217+    rx_received = 0; 
     4218+ 
     4219+    rxDescCount = 0; 
     4220+ 
     4221+    early_stop = 0; 
     4222+    do { 
     4223+        ae531x_AckIntr(MACInfo, DmaIntRxCompleted); 
     4224+ 
     4225+        for(;!early_stop;) { 
     4226+            rxDesc = MACInfo->rxQueue.curDescAddr; 
     4227+            cmdsts = AE531X_DESC_STATUS_GET(KSEG1ADDR(rxDesc)); 
     4228+ 
     4229+            AE531X_PRINT(AE531X_DEBUG_RX, 
     4230+                  ("examine rxDesc %p with cmdsts=0x%x\n", 
     4231+                   (void *)rxDesc, cmdsts)); 
     4232+     
     4233+            if (cmdsts & DescOwnByDma) { 
     4234+                /* There's nothing left to process in the RX ring */ 
     4235+                goto rx_all_done; 
     4236+            } 
     4237+ 
     4238+            rxDescCount++; 
     4239+ 
     4240+            AE531X_CONSUME_DESC((&MACInfo->rxQueue)); 
     4241+     
     4242+            A_DATA_CACHE_INVAL(rxDesc, AE531X_DESC_SIZE); 
     4243+ 
     4244+            /*  Process a packet */ 
     4245+            length = AE531X_DESC_STATUS_RX_SIZE(cmdsts) - ETH_CRC_LEN; 
     4246+            if ( (cmdsts & (DescRxFirst |DescRxLast | DescRxErrors)) == 
     4247+                           (DescRxFirst | DescRxLast) ) { 
     4248+                /* Descriptor status indicates "NO errors" */ 
     4249+                skb = AE531X_DESC_SWPTR_GET(rxDesc); 
     4250+     
     4251+                /* 
     4252+                 * Allocate a replacement skb. 
     4253+                 * We want to get another buffer ready for Rx ASAP. 
     4254+                 */ 
     4255+                newskb = (struct sk_buff *)ae531x_rxbuf_alloc(MACInfo, &rxBufp, &unused_length); 
     4256+                if(newskb == NULL ) { 
     4257+                    /* 
     4258+                     * Give this descriptor back to the DMA engine, 
     4259+                     * and drop the received packet. 
     4260+                     */ 
     4261+                    MAC_state->stats.rx_dropped++; 
     4262+                    AE531X_PRINT(AE531X_DEBUG_ERROR, 
     4263+                              ("Can't allocate new skb\n")); 
     4264+                } else { 
     4265+                    AE531X_DESC_BUFPTR_SET(rxDesc, virt_to_bus(rxBufp)); 
     4266+                    AE531X_DESC_SWPTR_SET(rxDesc, newskb); 
     4267+                } 
     4268+ 
     4269+                AE531X_DESC_STATUS_SET(rxDesc, DescOwnByDma); 
     4270+                rxDesc = NULL; /* sanity -- cannot use rxDesc now */ 
     4271+                sysWbFlush(); 
     4272+     
     4273+                if (newskb == NULL) { 
     4274+                    retval = 1; 
     4275+                    goto rx_no_skbs; 
     4276+                } else { 
     4277+                    /* Sync data cache w.r.t. DMA */ 
     4278+                    A_DATA_CACHE_INVAL(skb->data, length); 
     4279+         
     4280+                    rxdev = dev_sw_state->dev; 
     4281+ 
     4282+                    if (rxdev == NULL) { 
     4283+                        /* 
     4284+                         * We received a packet for a virtual enet device 
     4285+                         * that is no longer up.  Ignore it. 
     4286+                         */ 
     4287+                        kfree_skb(skb); 
     4288+                        continue; 
     4289+                    } 
     4290+ 
     4291+                    /* Advance data pointer to show that there's data here */ 
     4292+                    skb_put(skb, length); 
     4293+                    skb->protocol = eth_type_trans(skb, rxdev); 
     4294+                    skb->dev = rxdev; 
     4295+                    rxdev->last_rx = jiffies; 
     4296+                    rxdev->quota--; 
     4297+ 
     4298+                    if (rx_limit-- < 0) { 
     4299+                        early_stop=1; 
     4300+                        /* We've done enough for now -- more later */ 
     4301+                        AE531X_PRINT(AE531X_DEBUG_RX_STOP, 
     4302+                            ("Enet%d RX early stop.  Quota=%d rxDescCount=%d budget=%d\n", 
     4303+                             MACInfo->unit, dev->quota, rxDescCount, *budget)); 
     4304+                    } 
     4305+                    rx_received++; 
     4306+         
     4307+                    /* Send the data up the stack */ 
     4308+                    AE531X_PRINT(AE531X_DEBUG_RX, 
     4309+                              ("Send data up stack: skb=%p data=%p length=%d\n", 
     4310+                               (void *)skb, (void *)skb->data, length)); 
     4311+ 
     4312+                    netif_receive_skb(skb); 
     4313+ 
     4314+                    MAC_state->stats.rx_packets++; 
     4315+                    MAC_state->stats.rx_bytes += length; 
     4316+                } 
     4317+            } else { 
     4318+                /* Descriptor status indicates ERRORS */ 
     4319+                MAC_state->stats.rx_errors++; 
     4320+     
     4321+                if (cmdsts & (DescRxRunt | DescRxLateColl)) { 
     4322+                    MAC_state->stats.collisions++; 
     4323+                } 
     4324+     
     4325+                if (cmdsts & DescRxLengthError) { 
     4326+                    MAC_state->stats.rx_length_errors++; 
     4327+                } 
     4328+     
     4329+                if (cmdsts & DescRxCrc) { 
     4330+                    MAC_state->stats.rx_crc_errors++; 
     4331+                } 
     4332+     
     4333+                if (cmdsts & DescRxDribbling) { 
     4334+                    MAC_state->stats.rx_frame_errors++; 
     4335+                } 
     4336+                                
     4337+                               AE531X_DESC_STATUS_SET(rxDesc, DescOwnByDma); 
     4338+ 
     4339+                AE531X_PRINT(AE531X_DEBUG_ERROR, 
     4340+                          ("Bad receive.  rxDesc=%p  cmdsts=0x%8.8x\n", 
     4341+                           (void *)rxDesc, cmdsts)); 
     4342+            } 
     4343+        } 
     4344+    } while ((!early_stop) && 
     4345+             ae531x_ReadDmaReg(MACInfo, DmaStatus) & DmaIntRxCompleted); 
     4346+ 
     4347+rx_all_done: 
     4348+    AE531X_PRINT(AE531X_DEBUG_RX,  
     4349+             ("rx done (%d)\n", rxDescCount)); 
     4350+    *budget -= rxDescCount; 
     4351+ 
     4352+    if (!early_stop) { 
     4353+        netif_rx_complete(dev); 
     4354+ 
     4355+        ae531x_SetDmaReg(MACInfo, DmaIntrEnb, 
     4356+                     DmaIeRxCompleted | DmaIeRxNoBuffer); 
     4357+        ae531x_WriteDmaReg(MACInfo, DmaRxPollDemand, 0); 
     4358+    } 
     4359+     
     4360+    retval = early_stop; 
     4361+ 
     4362+rx_no_skbs: 
     4363+ 
     4364+    LEAVE(); 
     4365+ 
     4366+#ifdef DEBUG 
     4367+       if (rxDescCount > rxDescCountMax) { 
     4368+               printk("max rx %d\n", rxDescCount); 
     4369+               rxDescCountMax = rxDescCount; 
     4370+       } 
     4371+#endif 
     4372+ 
     4373+    return retval; 
     4374+} 
     4375+ 
     4376+/******************************************************************************* 
     4377+* ae531x_restart stops all ethernet devices associated with a physical MAC, 
     4378+* then shuts down the MAC.  Then it re-opens all devices that were in use. 
     4379+* TBDXXX: needs testing! 
     4380+*/ 
     4381+static void 
     4382+ae531x_restart(void *data) 
     4383+{ 
     4384+    ae531x_MAC_t *MACInfo = (ae531x_MAC_t *)data; 
     4385+    ae531x_MAC_state_t *MAC_state = (ae531x_MAC_state_t *)MACInfo->OSinfo; 
     4386+    struct net_device *saved_dev[AE531X_DEV_PER_MAC]; 
     4387+    int i; 
     4388+ 
     4389+    for (i=0; i<AE531X_DEV_PER_MAC; i++) { 
     4390+        if ((saved_dev[i] = MAC_state->dev_sw_state[i]->dev) != NULL) { 
     4391+            ae531x_MAC_stop(saved_dev[i]); 
     4392+        } 
     4393+    } 
     4394+ 
     4395+    for (i=0; i<AE531X_DEV_PER_MAC; i++) { 
     4396+        if (saved_dev[i]) 
     4397+            ae531x_MAC_open(saved_dev[i]); 
     4398+    } 
     4399+} 
     4400+ 
     4401+/******************************************************************************* 
     4402+* ae531x_MAC_intr handle interrupts from an ethernet MAC. 
     4403+* It checks MAC status registers, and dispatches as appropriate. 
     4404+*/ 
     4405+void 
     4406+ae531x_MAC_intr(int cpl, void *dev_id, struct pt_regs *regs) 
     4407+{ 
     4408+       ae531x_MAC_state_t *MAC_state; 
     4409+       ae531x_MAC_t *MACInfo; 
     4410+       u32 regIsr; 
     4411+       u32 regImr; 
     4412+       u32 pendIntrs; 
     4413+ 
     4414+       ARRIVE(); 
     4415+       MACInfo = (ae531x_MAC_t *)dev_id; 
     4416+       MAC_state = (ae531x_MAC_state_t *)MACInfo->OSinfo; 
     4417+       for(;;) { 
     4418+               /* Clear any unhandled intr causes. */ 
     4419+               ae531x_WriteDmaReg(MACInfo, DmaStatus, UnhandledIntrMask); 
     4420+ 
     4421+               regIsr = ae531x_ReadDmaReg(MACInfo, DmaStatus); 
     4422+               regImr = ae531x_ReadDmaReg(MACInfo, DmaIntrEnb); 
     4423+               pendIntrs = regIsr & regImr; 
     4424+ 
     4425+               AE531X_PRINT(AE531X_DEBUG_INT, 
     4426+                                        ("ethmac%d: intIsr=0x%8.8x intImr=0x%8.8x pendIntrs=0x%8.8x\n", 
     4427+                                         MACInfo->unit, regIsr, regImr, pendIntrs )); 
     4428+ 
     4429+               if ((pendIntrs & DmaAllIntCauseMask) == 0) 
     4430+                       break; 
     4431+ 
     4432+               if ((pendIntrs & DmaIntRxCompleted) || 
     4433+                       (pendIntrs & DmaIntRxNoBuffer)) { 
     4434+                       if (netif_rx_schedule_prep(MAC_state->dev_sw_state[MAC_state->primary_dev]->dev)) { 
     4435+                               ae531x_ClearDmaReg(MACInfo, 
     4436+                                                                  DmaIntrEnb, 
     4437+                                                                  DmaIeRxCompleted | DmaIeRxNoBuffer); 
     4438+                               ae531x_AckIntr(MACInfo, 
     4439+                                                          DmaIntRxCompleted | DmaIntRxNoBuffer); 
     4440+                               (void)ae531x_ReadDmaReg(MACInfo, DmaIntrEnb); 
     4441+                               __netif_rx_schedule(MAC_state->dev_sw_state[MAC_state->primary_dev]->dev); 
     4442+                       } else { 
     4443+#if 0 
     4444+                               AE531X_PRINT(AE531X_DEBUG_ERROR, 
     4445+                                                        ("%s: Interrupt (0x%8.8x/0x%8.8x) while in poll.  regs@%p, pc=%p, ra=%p\n", 
     4446+                                                         __FILE__, 
     4447+                                                         regIsr, 
     4448+                                                         ae531x_ReadDmaReg(MACInfo, DmaIntrEnb), 
     4449+                                                         (void *)regs, 
     4450+                                                         (void *)regs->cp0_epc, 
     4451+                                                         (void *)regs->regs[31])); 
     4452+#endif 
     4453+                               ae531x_AckIntr(MACInfo, 
     4454+                                                          DmaIntRxCompleted | DmaIntRxNoBuffer); 
     4455+                       } 
     4456+               } 
     4457+ 
     4458+               if (pendIntrs & 
     4459+                       (DmaIntTxStopped | DmaIntTxJabber | DmaIntTxUnderflow)) { 
     4460+                       AE531X_PRINT(AE531X_DEBUG_ERROR, 
     4461+                                                ("ethmac%d: TX Error Intr (0x%x)\n", 
     4462+                                                 MACInfo->unit, pendIntrs)); 
     4463+                       ae531x_AckIntr(MACInfo, 
     4464+                                                  (DmaIntTxStopped | DmaIntTxJabber | DmaIntTxUnderflow)); 
     4465+               } 
     4466+ 
     4467+               if (pendIntrs & DmaIntBusError) { 
     4468+                       AE531X_PRINT(AE531X_DEBUG_ERROR, 
     4469+                                                ("ethmac%d: DMA Bus Error Intr (0x%x)\n", 
     4470+                                                 MACInfo->unit, pendIntrs)); 
     4471+                       ae531x_AckIntr(MACInfo, DmaIntBusError); 
     4472+                       /* Reset the chip, if it's not already being done */ 
     4473+                       if (ae531x_IsInResetMode(MACInfo)) { 
     4474+                               goto intr_done; 
     4475+                       } 
     4476+                       ae531x_BeginResetMode(MACInfo); 
     4477+                       schedule_task(&MAC_state->restart_task); 
     4478+               } 
     4479+ 
     4480+               if (pendIntrs & DmaIntRxStopped) { 
     4481+                       AE531X_PRINT(AE531X_DEBUG_ERROR, 
     4482+                                                ("ethmac%d: RX Stopped Intr (0x%x)\n", 
     4483+                                                 MACInfo->unit, pendIntrs)); 
     4484+                       ae531x_AckIntr(MACInfo, DmaIntRxStopped); 
     4485+               } 
     4486+       } 
     4487+ 
     4488+ intr_done: 
     4489+       LEAVE(); 
     4490+} 
     4491+ 
     4492+/******************************************************************************* 
     4493+* ae531x_MAC_get_stats returns statistics for a specified device 
     4494+*/ 
     4495+static struct net_device_stats* 
     4496+ae531x_MAC_get_stats(struct net_device *dev) 
     4497+{ 
     4498+        ae531x_dev_sw_state_t *dev_sw_state; 
     4499+        ae531x_MAC_state_t *MAC_state; 
     4500+ 
     4501+        ARRIVE(); 
     4502+        dev_sw_state = (ae531x_dev_sw_state_t *)dev->priv; 
     4503+        MAC_state = dev_sw_state->MAC_state; 
     4504+ 
     4505+        LEAVE(); 
     4506+        return &MAC_state->stats; 
     4507+} 
     4508+ 
     4509+#define AE531X_PHY_POLL_SECONDS 2 
     4510+ 
     4511+#if CONFIG_AR5315 
     4512+ 
     4513+/******************************************************************************* 
     4514+* ae531x_getMACInfo returns the MACInfo  of the interface given by unit  
     4515+*/ 
     4516+ae531x_MAC_t *ae531x_getMAcInfo(int ethUnit) 
     4517+{ 
     4518+  int i,j; 
     4519+  for(i=0;i<AR531X_NUM_ENET_MAC;++i) { 
     4520+    if(per_MAC_info[i].dev_sw_state) { 
     4521+      for(j=0;j<AE531X_DEV_PER_MAC;++j) { 
     4522+        if(per_MAC_info[i].dev_sw_state[j] 
     4523+           && per_MAC_info[i].dev_sw_state[j]->enetUnit == ethUnit) 
     4524+            return (&(per_MAC_info[i].MACInfo)); 
     4525+      } 
     4526+    } 
     4527+  } 
     4528+  return NULL; 
     4529+} 
     4530+     
     4531+ 
     4532+#endif 
     4533+ 
     4534+/******************************************************************************* 
     4535+* ae531x_phy_poll periodically checks for changes in phy status 
     4536+* (e.g. dropped link). 
     4537+*/ 
     4538+static int 
     4539+ae531x_phy_poll(void *data) 
     4540+{ 
     4541+    ae531x_dev_sw_state_t *dev_sw_state = (ae531x_dev_sw_state_t *)data; 
     4542+    ae531x_MAC_t *MACInfo = &dev_sw_state->MAC_state->MACInfo; 
     4543+    int unit = dev_sw_state->enetUnit; 
     4544+ 
     4545+    while(dev_sw_state->dev!=NULL) { 
     4546+        if (MACInfo->port_is_up) { 
     4547+            phyCheckStatusChange(unit); 
     4548+        } 
     4549+ 
     4550+        set_current_state(TASK_UNINTERRUPTIBLE); 
     4551+        schedule_timeout(AE531X_PHY_POLL_SECONDS * HZ); 
     4552+    } 
     4553+ 
     4554+    return 0; 
     4555+} 
     4556+ 
     4557+ 
     4558+static char invalid_enet_MAC_addr[] = {0, 0, 0, 0, 0, 0}; 
     4559+ 
     4560+/* 
     4561+ * Fetch a pointer to an ethernet's MAC address 
     4562+ * in the Board Configuration data (in flash). 
     4563+ */ 
     4564+char * 
     4565+ae531x_enet_mac_address_get(int MACUnit) 
     4566+{ 
     4567+       /* XXX: Hack for poorly configured boards. 
     4568+        *      Cannot setup bridging properly (brctl) when both enet 
     4569+        *      interfaces share the same MAC address. 
     4570+        *  
     4571+        */ 
     4572+ 
     4573+#ifdef CONFIG_ASK_MULT_MAC_HACK 
     4574+    static u8  enet0Mac[6] = {0x00, 0x0d, 0x0b, 0x13, 0x6b, 0x16}; 
     4575+    static u8  enet1Mac[6] = {0x00, 0x0d, 0x0b, 0x13, 0x6b, 0x17}; 
     4576+#endif 
     4577+ 
     4578+    if (!ar531x_boardConfig) 
     4579+        return invalid_enet_MAC_addr; 
     4580+    if (MACUnit == 0) { 
     4581+#ifndef CONFIG_ASK_MULT_MAC_HACK 
     4582+        return ar531x_boardConfig->enet0Mac; 
     4583+#else 
     4584+               return enet0Mac; 
     4585+#endif 
     4586+    } 
     4587+    if (MACUnit == 1) { 
     4588+#ifndef CONFIG_ASK_MULT_MAC_HACK 
     4589+        return ar531x_boardConfig->enet1Mac; 
     4590+#else 
     4591+               return enet1Mac; 
     4592+#endif 
     4593+    } 
     4594+    printk("Invalid ethernet MAC unit number (%d)!\n", MACUnit); 
     4595+    return invalid_enet_MAC_addr; 
     4596+} 
     4597+ 
     4598+ 
     4599+ 
     4600+/******************************************************************************* 
     4601+* ae531x_MAC_open is the standard Linux open function.  It puts 
     4602+* hardware into a known good state, allocates queues, starts 
     4603+* the phy polling task, and arranges for interrupts to be handled. 
     4604+*/ 
     4605+static int  
     4606+ae531x_MAC_open(struct net_device *dev) 
     4607+{ 
     4608+    ae531x_dev_sw_state_t *dev_sw_state; 
     4609+    ae531x_MAC_state_t *MAC_state; 
     4610+    ae531x_MAC_t *MACInfo; 
     4611+    u8 *MACAddr; 
     4612+    int rv; 
     4613+    struct tq_struct *restart_task; 
     4614+    pid_t phy_poll_pid; 
     4615+    ARRIVE(); 
     4616+ 
     4617+    dev_sw_state = (ae531x_dev_sw_state_t *)dev->priv; 
     4618+    dev_sw_state->dev = dev; 
     4619+    MAC_state = dev_sw_state->MAC_state; 
     4620+    MACInfo = &MAC_state->MACInfo; 
     4621+ 
     4622+    restart_task = &MAC_state->restart_task; 
     4623+    restart_task->routine = ae531x_restart; 
     4624+    restart_task->data = (void *)MACInfo; 
     4625+ 
     4626+    AE531X_PRINT(AE531X_DEBUG_RESET, 
     4627+              ("ae531x_MAC_open eth%d ethmac%d macBase=0x%x dmaBase=0x%x irq=0x%x\n", 
     4628+               dev_sw_state->enetUnit, 
     4629+               MACInfo->unit, 
     4630+               MACInfo->macBase, 
     4631+               MACInfo->dmaBase, 
     4632+               MAC_state->irq)); 
     4633+ 
     4634+    /* Default MAC address */ 
     4635+    MACAddr = ae531x_enet_mac_address_get(MACInfo->unit); 
     4636+    memcpy(dev->dev_addr, MACAddr, dev->addr_len ); 
     4637+  
     4638+    if (!MACInfo->port_is_up) { 
     4639+        /* Bring MAC and PHY out of reset */ 
     4640+        ae531x_reset(MACInfo); 
     4641+     
     4642+        /* Attach interrupt handler */ 
     4643+        rv = request_irq(MAC_state->irq, ae531x_MAC_intr, SA_INTERRUPT, 
     4644+                    "ae531x_MAC_intr", (void *)MACInfo); 
     4645+        if (rv < 0) { 
     4646+            AE531X_PRINT(AE531X_DEBUG_ERROR, 
     4647+                         ("request_irq(0x%x) failed (%d)\n", 
     4648+                          MAC_state->irq, rv)); 
     4649+            goto open_failure; 
     4650+        } 
     4651+ 
     4652+        /* Initialize PHY */ 
     4653+               AE531X_PRINT(AE531X_DEBUG_RESET, ("\n --- phyBase: %08x\n", MACInfo->phyBase)); 
     4654+        phySetup(MACInfo->unit, MACInfo->phyBase); 
     4655+ 
     4656+        /* Start thread to poll for phy link status changes */ 
     4657+        phy_poll_pid = kernel_thread(ae531x_phy_poll, dev_sw_state, 0); 
     4658+        if (phy_poll_pid < 0) { 
     4659+            AE531X_PRINT(AE531X_DEBUG_ERROR, 
     4660+                     ("ethmac%d unable to start Phy Poll thread\n", 
     4661+                     MACInfo->unit)); 
     4662+        } 
     4663+ 
     4664+        /* Allocate RX/TX Queues */ 
     4665+        if (ae531x_AllocateQueues(MACInfo) < 0) { 
     4666+            AE531X_PRINT(AE531X_DEBUG_RESET, ("Queue allocation failed")); 
     4667+            free_irq(MAC_state->irq, (void *)MACInfo); 
     4668+            goto open_failure; 
     4669+        } 
     4670+     
     4671+        /* Initialize DMA and descriptors */ 
     4672+        ae531x_DmaReset(MACInfo); 
     4673+ 
     4674+        /* Initialize MAC */ 
     4675+        ae531x_MACReset(MACInfo); 
     4676+ 
     4677+        /* Enable Receive/Transmit */ 
     4678+        ae531x_EnableComm(MACInfo); 
     4679+     
     4680+        MAC_state->primary_dev = dev_sw_state->unit_on_MAC; 
     4681+        MACInfo->port_is_up = TRUE; 
     4682+    } 
     4683+ 
     4684+    dev->trans_start = jiffies; 
     4685+    SET_MODULE_OWNER(dev); 
     4686+ 
     4687+    LEAVE(); 
     4688+    return 0; 
     4689+ 
     4690+open_failure: 
     4691+    LEAVE(); 
     4692+    return -1; 
     4693+} 
     4694+ 
     4695+/* 
     4696+ * Shut down MAC hardware. 
     4697+ */ 
     4698+static void 
     4699+ae531x_MAC_shutdown(ae531x_MAC_state_t *MAC_state) 
     4700+{ 
     4701+    ae531x_MAC_t *MACInfo; 
     4702+ 
     4703+    MACInfo = &MAC_state->MACInfo; 
     4704+    MACInfo->port_is_up = FALSE; 
     4705+ 
     4706+    /* Disable Receive/Transmit */ 
     4707+    ae531x_DisableComm(MACInfo); 
     4708+ 
     4709+    /* Disable Interrupts */ 
     4710+    ae531x_DmaIntDisable(MACInfo); 
     4711+    sysWbFlush(); 
     4712+    free_irq(MAC_state->irq, (void *)MACInfo); 
     4713+ 
     4714+    /* Free Transmit & Receive skb's/descriptors */ 
     4715+    ae531x_TxReap(MAC_state); /* one last time */ 
     4716+    ae531x_FreeQueues(MACInfo); 
     4717+} 
     4718+ 
     4719+/******************************************************************************* 
     4720+* ae531x_MAC_stop is the standard Linux stop function.  It undoes 
     4721+* everything set up by ae531x_MAC_open. 
     4722+*/ 
     4723+static int 
     4724+ae531x_MAC_stop(struct net_device *dev) 
     4725+{ 
     4726+    ae531x_dev_sw_state_t *dev_sw_state; 
     4727+    ae531x_MAC_state_t *MAC_state; 
     4728+    ae531x_MAC_t *MACInfo; 
     4729+    int i; 
     4730+ 
     4731+    ARRIVE(); 
     4732+ 
     4733+    dev_sw_state = (ae531x_dev_sw_state_t *)dev->priv; 
     4734+    MAC_state = dev_sw_state->MAC_state; 
     4735+    MACInfo = &MAC_state->MACInfo; 
     4736+ 
     4737+    for (i=0; i<AE531X_DEV_PER_MAC; i++) { 
     4738+        if ((MAC_state->dev_sw_state[i]->dev) && 
     4739+            (MAC_state->dev_sw_state[i]->dev != dev_sw_state->dev)) { 
     4740+            break; 
     4741+        } 
     4742+    } 
     4743+ 
     4744+    if (i < AE531X_DEV_PER_MAC) { 
     4745+        /* Physical MAC is still in use */ 
     4746+        if (MAC_state->primary_dev == dev_sw_state->unit_on_MAC) { 
     4747+            /* 
     4748+             * If the primary_dev is being stopped 
     4749+             * then we need to assign a new one. 
     4750+             */ 
     4751+            MAC_state->primary_dev = i; 
     4752+        } 
     4753+    } else { 
     4754+        /* Physical MAC is no longer in use */ 
     4755+        ae531x_MAC_shutdown(MAC_state); 
     4756+    } 
     4757+ 
     4758+    dev_sw_state->dev = NULL; 
     4759+    LEAVE(); 
     4760+    return 0; 
     4761+} 
     4762+ 
     4763+/******************************************************************************* 
     4764+* ae531x_rxbuf_alloc - Allocate an skb to be associated with an RX descriptor. 
     4765+* 
     4766+* RETURNS: A pointer to the skb.  Also returns a pointer to the underlying 
     4767+* buffer and the size of that buffer.  
     4768+*/ 
     4769+void * 
     4770+ae531x_rxbuf_alloc(ae531x_MAC_t *MACInfo, char **rxBuffp, int *rxBuffSizep) 
     4771+{ 
     4772+    int buf_size; 
     4773+    struct sk_buff *skb; 
     4774+    char *rxBuff; 
     4775+    int rxBuffSize; 
     4776+ 
     4777+    buf_size = AE531X_RX_BUF_SIZE; 
     4778+ 
     4779+    skb = dev_alloc_skb(buf_size); 
     4780+    if (skb) { 
     4781+        /* skb->dev = dev; */ 
     4782+        skb_reserve(skb, RXBUFF_RESERVE); 
     4783+ 
     4784+        rxBuffSize = skb_tailroom(skb); 
     4785+        rxBuff = skb->tail; 
     4786+ 
     4787+        *rxBuffp = rxBuff; 
     4788+        *rxBuffSizep = rxBuffSize; 
     4789+    } 
     4790+ 
     4791+    return skb; 
     4792+} 
     4793+ 
     4794+/******************************************************************************* 
     4795+* ae531x_swptr_free - Free the skb, if any, associated with a descriptor. 
     4796+*/ 
     4797+void 
     4798+ae531x_swptr_free(VIRT_ADDR desc) 
     4799+{ 
     4800+    struct sk_buff *skb; 
     4801+ 
     4802+    skb = (struct sk_buff *)AE531X_DESC_SWPTR_GET(desc); 
     4803+    if (skb) { 
     4804+        AE531X_DESC_SWPTR_SET(desc, NULL); 
     4805+        kfree_skb(skb); 
     4806+    } 
     4807+} 
     4808+ 
     4809+/******************************************************************************* 
     4810+* 
     4811+* ae531x_TxReap - the driver Tx completion routine. 
     4812+* 
     4813+* This routine reaps sk_buffs which have already been transmitted. 
     4814+* 
     4815+*/ 
     4816+static void 
     4817+ae531x_TxReap(ae531x_MAC_state_t *MAC_state) 
     4818+{ 
     4819+    AE531X_QUEUE      *txq; 
     4820+    VIRT_ADDR         txDesc; 
     4821+    UINT32            cmdsts; 
     4822+    struct            sk_buff *skb; 
     4823+    int               reaped; 
     4824+    ae531x_MAC_t      *MACInfo; 
     4825+    static int        aeUselessReap = 0; 
     4826+#ifdef DEBUG 
     4827+    static int        aeMaxReap = 0; 
     4828+#endif 
     4829+    ARRIVE(); 
     4830+ 
     4831+    MACInfo = &MAC_state->MACInfo; 
     4832+    txq = &MACInfo->txQueue; 
     4833+    reaped = 0; 
     4834+ 
     4835+    while (1) { 
     4836+ 
     4837+        txDesc = AE531X_QUEUE_ELE_NEXT_GET(txq, txq->reapDescAddr); 
     4838+        if (txDesc == txq->curDescAddr) { 
     4839+            break; 
     4840+        } 
     4841+ 
     4842+        cmdsts = AE531X_DESC_STATUS_GET(KSEG1ADDR(txDesc)); 
     4843+        if (cmdsts & DescOwnByDma) { 
     4844+            break; 
     4845+        } 
     4846+ 
     4847+        /* Release sk_buff associated with completed transmit */ 
     4848+        skb = (struct sk_buff *)AE531X_DESC_SWPTR_GET(txDesc); 
     4849+        if (skb) { 
     4850+            kfree_skb(skb); 
     4851+            AE531X_DESC_SWPTR_SET(txDesc, NULL); 
     4852+        } 
     4853+ 
     4854+        /* Update statistics according to completed transmit desc */ 
     4855+        if (cmdsts & DescTxErrors) { 
     4856+            AE531X_PRINT(AE531X_DEBUG_ERROR, 
     4857+                    ("enetmac%d Tx prior error: 0x%8.8x <0x%8.8x> 0x%8.8x\n", 
     4858+                    MACInfo->unit, 
     4859+                    cmdsts, 
     4860+                    DescTxErrors, 
     4861+                    (int)txDesc)); 
     4862+#ifdef DEBUG 
     4863+                       //my_mvPhyShow(MACInfo->unit); 
     4864+           printk ("ae531xMacControl: 0x%08x\tMacFlowControl: 0x%08x\n", 
     4865+                   ae531x_ReadMacReg(MACInfo, MacControl), 
     4866+                   ae531x_ReadMacReg(MACInfo, MacFlowControl)); 
     4867+#endif 
     4868+            MAC_state->stats.tx_errors++; 
     4869+            if (cmdsts & (DescTxLateCollision | DescTxExcCollisions)) { 
     4870+                MAC_state->stats.tx_aborted_errors++; 
     4871+            } 
     4872+            if (cmdsts & (DescTxLostCarrier | DescTxNoCarrier)) { 
     4873+                MAC_state->stats.tx_carrier_errors++; 
     4874+            } 
     4875+        } else { 
     4876+            MAC_state->stats.tx_bytes += AE531X_DESC_STATUS_RX_SIZE(cmdsts); 
     4877+            MAC_state->stats.tx_packets++; 
     4878+        } 
     4879+ 
     4880+        MAC_state->stats.collisions += 
     4881+            ((cmdsts & DescTxCollMask) >> DescTxCollShift); 
     4882+ 
     4883+        txq->reapDescAddr = txDesc; 
     4884+        reaped++; 
     4885+    } 
     4886+ 
     4887+    if (reaped > 0) { 
     4888+        int i; 
     4889+ 
     4890+#ifdef DEBUG 
     4891+               if (reaped > aeMaxReap) { 
     4892+                       aeMaxReap = reaped; 
     4893+                       printk("max reaped = %d\n", reaped); 
     4894+               } 
     4895+#endif 
     4896+        AE531X_PRINT(AE531X_DEBUG_TX_REAP, 
     4897+             ("reaped %d\n", reaped)); 
     4898+ 
     4899+        /* 
     4900+         * Re-start transmit queues for all ethernet devices 
     4901+         * associated with this MAC. 
     4902+         */ 
     4903+        for (i=0; i<AE531X_DEV_PER_MAC; i++) { 
     4904+            if (MAC_state->dev_sw_state[i]->dev) 
     4905+                netif_start_queue(MAC_state->dev_sw_state[i]->dev); 
     4906+        } 
     4907+    } else { 
     4908+        aeUselessReap++; 
     4909+    } 
     4910+ 
     4911+    LEAVE(); 
     4912+} 
     4913+ 
     4914+ 
     4915+/******************************************************************************* 
     4916+* ae531x_MAC_start_xmit sends a packet. 
     4917+*/ 
     4918+static int 
     4919+ae531x_MAC_start_xmit(struct sk_buff *skb, struct net_device *dev) 
     4920+{ 
     4921+    ae531x_dev_sw_state_t *dev_sw_state; 
     4922+    ae531x_MAC_state_t *MAC_state; 
     4923+    ae531x_MAC_t *MACInfo; 
     4924+    u32 buf; 
     4925+    u32 ctrlen; 
     4926+    u32 length; 
     4927+    int mtu; 
     4928+    int max_buf_size; 
     4929+    VIRT_ADDR txDesc; 
     4930+ 
     4931+    ARRIVE(); 
     4932+ 
     4933+    dev_sw_state = (ae531x_dev_sw_state_t *)dev->priv; 
     4934+    MAC_state = dev_sw_state->MAC_state; 
     4935+    MACInfo = &MAC_state->MACInfo; 
     4936+ 
     4937+    length = skb->len; 
     4938+ 
     4939+    /* Check if this port is up, else toss packet */ 
     4940+    if (!MACInfo->port_is_up) { 
     4941+        buf = virt_to_bus(skb->data); 
     4942+        AE531X_PRINT(AE531X_DEBUG_ERROR, 
     4943+                  ("eth%d Tx Down, dropping buf=0x%8.8x, length=0x%8.8x, skb=%p\n", 
     4944+                   dev_sw_state->enetUnit, buf, length, (void *)skb)); 
     4945+ 
     4946+        MAC_state->stats.tx_dropped++; 
     4947+        MAC_state->stats.tx_carrier_errors++; 
     4948+        goto dropFrame; 
     4949+    } 
     4950+ 
     4951+    if (ae531x_IsInResetMode(MACInfo)) { 
     4952+        AE531X_PRINT(AE531X_DEBUG_ERROR, 
     4953+                  ("eth%d Tx: In Chip reset - drop frame\n", 
     4954+                   dev_sw_state->enetUnit)); 
     4955+ 
     4956+        MAC_state->stats.tx_dropped++; 
     4957+        MAC_state->stats.tx_aborted_errors++; 
     4958+        goto dropFrame; 
     4959+    } 
     4960+ 
     4961+    /* Check if we can transport this packet */ 
     4962+    length = max((u32)60, length);  /* total length */ 
     4963+    mtu = dev->mtu; 
     4964+    max_buf_size = mtu + ETH_HLEN; 
     4965+    if (length > max_buf_size) { 
     4966+        AE531X_PRINT(AE531X_DEBUG_ERROR, 
     4967+                  ("eth%d Tx: length %d too long.  mtu=%d, trailer=%d\n", 
     4968+                   dev_sw_state->enetUnit, length, mtu, PHY_TRAILER_SIZE)); 
     4969+ 
     4970+        MAC_state->stats.tx_errors++; 
     4971+        MAC_state->stats.tx_aborted_errors++; 
     4972+ 
     4973+        goto dropFrame; 
     4974+    } 
     4975+ 
     4976+       /* Reap any old, completed Tx descriptors */ 
     4977+       ae531x_TxReap(MAC_state); 
     4978+ 
     4979+    txDesc = MACInfo->txQueue.curDescAddr; 
     4980+    if (txDesc == MACInfo->txQueue.reapDescAddr) { 
     4981+        int i; 
     4982+ 
     4983+        AE531X_PRINT(AE531X_DEBUG_ERROR, 
     4984+                  ("eth%d Tx: cannot get txDesc\n", 
     4985+                   dev_sw_state->enetUnit)); 
     4986+ 
     4987+        MAC_state->stats.tx_dropped++; 
     4988+        MAC_state->stats.tx_fifo_errors++; 
     4989+ 
     4990+        /* 
     4991+         * Stop transmit queues for any ethernet devices 
     4992+         * associated with this MAC. 
     4993+         */ 
     4994+#if 0 /* XXX: no way to recover from queue stop until ae531x_MAC_tx_timeout() 
     4995+          *      is rewritten to avoid calls to shedule(). 
     4996+          */ 
     4997+        for (i=0; i<AE531X_DEV_PER_MAC; i++) { 
     4998+            if (MAC_state->dev_sw_state[i]->dev) 
     4999+                netif_stop_queue(MAC_state->dev_sw_state[i]->dev); 
     5000+        } 
     5001+#endif 
     5002+        goto dropFrame; 
     5003+    } 
     5004+ 
     5005+    /* We won't fail now; so consume this descriptor */ 
     5006+    AE531X_CONSUME_DESC((&MACInfo->txQueue)); 
     5007+ 
     5008+    /* Update the descriptor */ 
     5009+    buf = virt_to_bus(skb->data); 
     5010+    AE531X_DESC_BUFPTR_SET(txDesc, buf); 
     5011+    AE531X_DESC_SWPTR_SET(txDesc, skb); 
     5012+    ctrlen = AE531X_DESC_CTRLEN_GET(txDesc); 
     5013+    ctrlen = (ctrlen & (DescEndOfRing)) | 
     5014+                            DescTxFirst | 
     5015+                             DescTxLast | 
     5016+                        DescTxIntEnable; 
     5017+ 
     5018+    ctrlen |= ((length << DescSize1Shift) & DescSize1Mask); 
     5019+ 
     5020+    AE531X_DESC_CTRLEN_SET(txDesc, ctrlen); 
     5021+    AE531X_DESC_STATUS_SET(txDesc, DescOwnByDma); 
     5022+ 
     5023+    /* Alert DMA engine to resume Tx */ 
     5024+    ae531x_WriteDmaReg(MACInfo, DmaTxPollDemand, 0); 
     5025+    sysWbFlush(); 
     5026+ 
     5027+    AE531X_PRINT(AE531X_DEBUG_TX, 
     5028+              ("eth%d Tx: Desc=0x%8.8x, L=0x%8.8x, D=0x%8.8x, d=0x%8.8x, length=0x%8.8x\n", 
     5029+               dev_sw_state->enetUnit, 
     5030+               (UINT32)txDesc, 
     5031+               AE531X_DESC_CTRLEN_GET(txDesc), 
     5032+               buf, 
     5033+               AE531X_DESC_LNKBUF_GET(txDesc), 
     5034+               length)); 
     5035+ 
     5036+    /* Tell upper layers to keep it coming */ 
     5037+    dev->trans_start = jiffies; 
     5038+ 
     5039+    LEAVE(); 
     5040+ 
     5041+    return 0; 
     5042+ 
     5043+dropFrame: 
     5044+    kfree_skb(skb); 
     5045+    LEAVE(); 
     5046+    return 0; 
     5047+} 
     5048+ 
     5049+ 
     5050+/******************************************************************************* 
     5051+* ae531x_MAC_tx_timeout handles transmit timeouts 
     5052+*/ 
     5053+static void 
     5054+ae531x_MAC_tx_timeout(struct net_device *dev) 
     5055+{ 
     5056+    ae531x_dev_sw_state_t *dev_sw_state; 
     5057+    ae531x_MAC_state_t *MAC_state; 
     5058+    ae531x_MAC_t *MACInfo; 
     5059+ 
     5060+    ARRIVE(); 
     5061+ 
     5062+    dev_sw_state = (ae531x_dev_sw_state_t *)dev->priv; 
     5063+    MAC_state = dev_sw_state->MAC_state; 
     5064+    MACInfo = &MAC_state->MACInfo; 
     5065+ 
     5066+    AE531X_PRINT(AE531X_DEBUG_ERROR, 
     5067+             ("enet%d: Tx timeout\n", dev_sw_state->enetUnit)); 
     5068+ 
     5069+    ae531x_restart(MACInfo); 
     5070+ 
     5071+    LEAVE(); 
     5072+} 
     5073+ 
     5074+ 
     5075+/******************************************************************************* 
     5076+* ae531x_MAC_do_ioctl is a placeholder for future ioctls. 
     5077+*/ 
     5078+static int 
     5079+ae531x_MAC_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) 
     5080+{ 
     5081+        int rv; 
     5082+        ae531x_MAC_t *MACInfo; 
     5083+        struct ioctl_data { 
     5084+                u32 unit; 
     5085+                u32 addr; 
     5086+                u32 data; 
     5087+        } *req; 
     5088+        ae531x_dev_sw_state_t *dev_sw_state; 
     5089+        ae531x_MAC_state_t *MAC_state; 
     5090+ 
     5091+        ARRIVE(); 
     5092+ 
     5093+        dev_sw_state = (ae531x_dev_sw_state_t *)dev->priv; 
     5094+        MAC_state = dev_sw_state->MAC_state; 
     5095+        MACInfo = &MAC_state->MACInfo; 
     5096+ 
     5097+        req = (struct ioctl_data *)ifr->ifr_data; 
     5098+ 
     5099+        switch( cmd ) { 
     5100+        default: 
     5101+            AE531X_PRINT(AE531X_DEBUG_ERROR, 
     5102+                     ("Unsupported ioctl: 0x%x\n", cmd)); 
     5103+            rv = -EOPNOTSUPP; 
     5104+        } 
     5105+ 
     5106+        LEAVE(); 
     5107+        return rv; 
     5108+} 
     5109+ 
     5110+static void 
     5111+ae531x_MAC_setup_fntable(struct net_device *dev) 
     5112+{ 
     5113+    ARRIVE(); 
     5114+ 
     5115+    dev->get_stats       = ae531x_MAC_get_stats; 
     5116+    dev->open            = ae531x_MAC_open; 
     5117+    dev->stop            = ae531x_MAC_stop; 
     5118+    dev->hard_start_xmit = ae531x_MAC_start_xmit; 
     5119+    dev->do_ioctl        = ae531x_MAC_do_ioctl; 
     5120+    dev->poll            = ae531x_MAC_poll; 
     5121+    dev->weight          = 16; 
     5122+#if 0 /* XXX: currently, ae531x_MAC_tx_timeout() will call functions 
     5123+          *      that in turn call schedule(). this is BAD, since the 
     5124+          *      timeout call runs at interrupt time. until ae531x_MAC_tx_timeout 
     5125+          *      is rewritten to avoid schedule() calls, we do not use it. 
     5126+          */ 
     5127+    dev->tx_timeout      = ae531x_MAC_tx_timeout; 
     5128+#else 
     5129+    dev->tx_timeout      = NULL; 
     5130+#endif 
     5131+    dev->features        = NETIF_F_HW_CSUM |\ 
     5132+                           NETIF_F_HIGHDMA; 
     5133+ 
     5134+    LEAVE(); 
     5135+} 
     5136+ 
     5137+static void 
     5138+ar5312EepromRead(char *EepromAddr, u_int16_t id, unsigned int off,  
     5139+                unsigned int nbytes, char *data) 
     5140+{ 
     5141+       int i; 
     5142+        
     5143+       for (i=0; i<nbytes; i++, off++) { 
     5144+               data[i] = EepromAddr[off]; 
     5145+       } 
     5146+} 
     5147+ 
     5148+int 
     5149+ae531x_get_numMACs(void) 
     5150+{ 
     5151+    int devid; 
     5152+    u16 radioMask; 
     5153+ 
     5154+    /* Probe to find out the silicon revision and enable the 
     5155+       correct number of macs */ 
     5156+    devid = ((u_int16_t) ((sysRegRead(AR531X_REV) >>8) &  
     5157+                         (AR531X_REV_MAJ | AR531X_REV_MIN))); 
     5158+    switch (devid) { 
     5159+    case AR5212_AR5312_REV2: 
     5160+    case AR5212_AR5312_REV7: 
     5161+        /* Need to determine if we have a 5312 or a 2312 since they 
     5162+           have the same Silicon Rev ID*/ 
     5163+        ar5312EepromRead(radioConfig,0,2*AR531X_RADIO_MASK_OFF,2, 
     5164+                        (char *) &radioMask); 
     5165+        if ((radioMask & AR531X_RADIO0_MASK) != 0) { 
     5166+            return 2; 
     5167+        } 
     5168+        return 1; 
     5169+    case AR5212_AR2313_REV8: 
     5170+        return 1; 
     5171+    } 
     5172+         
     5173+    /* default to 1 */ 
     5174+    return 1; 
     5175+} 
     5176+ 
     5177+BOOL 
     5178+ae531x_twisted_enet(void) 
     5179+{ 
     5180+    int wisoc_revision; 
     5181+ 
     5182+    wisoc_revision = (sysRegRead(AR531X_REV) & AR531X_REV_MAJ) >> AR531X_REV_MAJ_S; 
     5183+    if ( (wisoc_revision == AR531X_REV_MAJ_AR2313) || 
     5184+         /* next clause is used to determine AR2312, based on number of MACs.  
     5185+          * must do this since revision is same for 5312 and 2312. 
     5186+          */ 
     5187+         (wisoc_revision == AR531X_REV_MAJ_AR5312 && ae531x_get_numMACs() == 1) ) { 
     5188+        return TRUE; 
     5189+    } else { 
     5190+        return FALSE; 
     5191+    } 
     5192+} 
     5193+ 
     5194+int 
     5195+ae531x_get_board_config(void) 
     5196+{ 
     5197+    int dataFound; 
     5198+    char *bd_config; 
     5199+ 
     5200+    /* 
     5201+     * Find start of Board Configuration data, using heuristics: 
     5202+     * Search back from the (aliased) end of flash by 0x1000 bytes 
     5203+     * at a time until we find the string "5311", which marks the 
     5204+     * start of Board Configuration.  Give up if we've searched 
     5205+     * more than 500KB. 
     5206+     */ 
     5207+    dataFound = 0; 
     5208+    for (bd_config = (char *)0xbffff000; 
     5209+         bd_config > (char *)0xbff80000; 
     5210+         bd_config -= 0x1000) 
     5211+    { 
     5212+        if ( *(int *)bd_config == AR531X_BD_MAGIC) { 
     5213+            dataFound = 1; 
     5214+            break; 
     5215+        } 
     5216+    } 
     5217+ 
     5218+    if (!dataFound) { 
     5219+        printk("Could not find Board Configuration Data\n"); 
     5220+               bd_config = NULL; 
     5221+    } 
     5222+        
     5223+    ar531x_boardConfig = (struct ar531x_boarddata *) bd_config; 
     5224+        
     5225+    return(dataFound); 
     5226+} 
     5227+ 
     5228+int 
     5229+ae531x_get_radio_config(void) 
     5230+{ 
     5231+    int dataFound; 
     5232+    char *radio_config; 
     5233+ 
     5234+    /*  
     5235+     * Now find the start of Radio Configuration data, using heuristics: 
     5236+     * Search forward from Board Configuration data by 0x1000 bytes 
     5237+     * at a time until we find non-0xffffffff. 
     5238+     */ 
     5239+    dataFound = 0; 
     5240+    for (radio_config = ((char *) ar531x_boardConfig) + 0x1000; 
     5241+         radio_config < (char *)0xbffff000; 
     5242+         radio_config += 0x1000) 
     5243+    { 
     5244+        if (*(int *)radio_config != 0xffffffff) { 
     5245+            dataFound = 1; 
     5246+            break; 
     5247+        } 
     5248+    } 
     5249+ 
     5250+    if (!dataFound) { /* AR2316 relocates radio config to new location */ 
     5251+       dataFound = 0; 
     5252+       for (radio_config = ((char *) ar531x_boardConfig) + 0xf8; 
     5253+            radio_config < (char *)0xbffff0f8; 
     5254+            radio_config += 0x1000) 
     5255+       { 
     5256+           if (*(int *)radio_config != 0xffffffff) { 
     5257+               dataFound = 1; 
     5258+               break; 
     5259+           } 
     5260+       } 
     5261+    } 
     5262+ 
     5263+    if (!dataFound) { 
     5264+        printk("Could not find Radio Configuration data\n"); 
     5265+       radio_config = NULL; 
     5266+    } 
     5267+    radioConfig = radio_config; 
     5268+    return(dataFound); 
     5269+} 
     5270+ 
     5271+static int __init 
     5272+ae531x_MAC_setup(void) 
     5273+{ 
     5274+    int next_dev, i; 
     5275+    struct net_device *dev; 
     5276+    ae531x_dev_sw_state_t *dev_sw_state; 
     5277+    ae531x_MAC_state_t *MAC_state; 
     5278+    ae531x_MAC_t *MACInfo; 
     5279+    char *addr; 
     5280+ 
     5281+    ARRIVE(); 
     5282+ 
     5283+    MOD_INC_USE_COUNT; 
     5284+    for (i=0;i<AR531X_NUM_ENET_MAC * AE531X_DEV_PER_MAC; i++) { 
     5285+       ae531x_MAC_dev[i] = NULL; 
     5286+    } 
     5287+     
     5288+    if (!ae531x_get_board_config()) { 
     5289+       LEAVE(); 
     5290+       return -1; 
     5291+    } 
     5292+    if (!ae531x_get_radio_config()) { 
     5293+       LEAVE(); 
     5294+       return(-1); 
     5295+    } 
     5296+    for(i=0, next_dev = AR531X_NUM_ENET_MAC-1;  
     5297+        i<ae531x_get_numMACs() && next_dev>=0;  
     5298+        i++, next_dev--){ 
     5299+        
     5300+        /* if MAC is bogus in config data, skip */ 
     5301+        addr = ae531x_enet_mac_address_get(next_dev); 
     5302+        if((*(u32 *)addr == 0xffffffff) && (*(u16 *)(addr+4)==0xffff)){ 
     5303+            /* bogus MAC config data */ 
     5304+            continue; 
     5305+        } 
     5306+        
     5307+        dev = ae531x_MAC_dev[next_dev] = 
     5308+            init_etherdev(NULL, sizeof(ae531x_dev_sw_state_t)); 
     5309+        
     5310+        if (dev == NULL) { 
     5311+            LEAVE(); 
     5312+            return -1; 
     5313+        } 
     5314+        
     5315+        ae531x_MAC_setup_fntable(dev); 
     5316+ 
     5317+        dev_sw_state = (ae531x_dev_sw_state_t *)dev->priv; 
     5318+        dev_sw_state->enetUnit = next_dev; 
     5319+        dev_sw_state->unit_on_MAC = 0; 
     5320+        MAC_state = &per_MAC_info[next_dev]; 
     5321+        dev_sw_state->MAC_state = MAC_state; 
     5322+        MAC_state->dev_sw_state[AE531X_LAN_PORT] = dev_sw_state; 
     5323+        MAC_state->primary_dev = -1; 
     5324+ 
     5325+        /* Initialize per-MAC information */ 
     5326+        MACInfo = &MAC_state->MACInfo; 
     5327+ 
     5328+        MACInfo->unit = next_dev; 
     5329+ 
     5330+        if (MACInfo->unit == 0) { 
     5331+            MACInfo->macBase = (u32)(PHYS_TO_K1(AR531X_ENET0)+AE531X_MAC_OFFSET); 
     5332+            MACInfo->dmaBase = (u32)(PHYS_TO_K1(AR531X_ENET0)+AE531X_DMA_OFFSET); 
     5333+            MACInfo->phyBase = (u32)(PHYS_TO_K1(AR531X_ENET0)+AE531X_PHY_OFFSET); 
     5334+            MAC_state->irq = AR531X_IRQ_ENET0_INTRS; 
     5335+        } else { 
     5336+#ifndef CONFIG_AR5315 
     5337+            MACInfo->macBase = (u32) (PHYS_TO_K1(AR531X_ENET1)+AE531X_MAC_OFFSET); 
     5338+            MACInfo->dmaBase = (u32) (PHYS_TO_K1(AR531X_ENET1)+AE531X_DMA_OFFSET); 
     5339+            if (ae531x_twisted_enet()) { 
     5340+                MACInfo->phyBase = (u32)(PHYS_TO_K1(AR531X_ENET0)+AE531X_PHY_OFFSET); 
     5341+            } else { 
     5342+                MACInfo->phyBase = (u32)(PHYS_TO_K1(AR531X_ENET1)+AE531X_PHY_OFFSET); 
     5343+            } 
     5344+            MAC_state->irq = AR531X_IRQ_ENET1_INTRS; 
     5345+#endif 
     5346+        } 
     5347+ 
     5348+        MACInfo->OSinfo = (void *)MAC_state; 
     5349+ 
     5350+    } 
     5351+ 
     5352+    LEAVE(); 
     5353+    return 0; 
     5354+} 
     5355+module_init(ae531x_MAC_setup); 
     5356+ 
     5357+/******************************************************************************* 
     5358+* ae531x_MAC_unload is the module unload function 
     5359+*/ 
     5360+static void __exit 
     5361+ae531x_MAC_unload(void) 
     5362+{ 
     5363+    int i; 
     5364+ 
     5365+    for (i=0;i<AR531X_NUM_ENET_MAC * AE531X_DEV_PER_MAC; i++) { 
     5366+        if (ae531x_MAC_dev[i] != NULL) { 
     5367+            if( (((ae531x_dev_sw_state_t *)ae531x_MAC_dev[i]->priv)->dev) != NULL) 
     5368+                  ae531x_MAC_stop(ae531x_MAC_dev[i]); 
     5369+            ae531x_MAC_dev[i] = NULL; 
     5370+        } 
     5371+    } 
     5372+   MOD_DEC_USE_COUNT; 
     5373+} 
     5374+ 
     5375+MODULE_AUTHOR("Atheros Communications, Inc."); 
     5376+MODULE_DESCRIPTION("Support for Atheros WiSoC Ethernet device"); 
     5377+#ifdef MODULE_LICENSE 
     5378+MODULE_LICENSE("Atheros"); 
     5379+#endif 
     5380+module_exit(ae531x_MAC_unload); 
     5381diff -urN linux-mips-orig/drivers/net/ath/ae531xmac.c linux-mips-new/drivers/net/ath/ae531xmac.c 
     5382--- linux-mips-orig/drivers/net/ath/ae531xmac.c 1970-01-01 01:00:00.000000000 +0100 
     5383+++ linux-mips-new/drivers/net/ath/ae531xmac.c  2005-12-31 12:33:57.673538824 +0000 
     5384@@ -0,0 +1,951 @@ 
     5385+/* 
     5386+ * This file is subject to the terms and conditions of the GNU General Public 
     5387+ * License.  See the file "COPYING" in the main directory of this archive 
     5388+ * for more details. 
     5389+ * 
     5390+ * Copyright © 2003 Atheros Communications, Inc.,  All Rights Reserved. 
     5391+ */ 
     5392+ 
     5393+ 
     5394+/* 
     5395+ * Ethernet driver for Atheros' ae531x ethernet MAC. 
     5396+ */ 
     5397+ 
     5398+#if linux 
     5399+#include <linux/config.h> 
     5400+#include <linux/types.h> 
     5401+#include <linux/delay.h> 
     5402+#include <linux/netdevice.h> 
     5403+#include <linux/etherdevice.h> 
     5404+#include <linux/init.h> 
     5405+#include <asm/io.h> 
     5406+ 
     5407+#include "ar531xlnx.h" 
     5408+#endif /* linux */ 
     5409+ 
     5410+#include "ae531xreg.h" 
     5411+#include "ae531xmac.h" 
     5412+ 
     5413+#ifdef DEBUG 
     5414+int ae531x_MAC_debug = AE531X_DEBUG_ERROR; 
     5415+#else 
     5416+int ae531x_MAC_debug = 0; 
     5417+#endif 
     5418+ 
     5419+extern char *ae531x_enet_mac_address_get(int); 
     5420+ 
     5421+/* Forward references to local functions */ 
     5422+static void ae531x_QueueDestroy(AE531X_QUEUE *q); 
     5423+ 
     5424+ 
     5425+/****************************************************************************** 
     5426+* 
     5427+* ae531x_ReadMacReg - read AE MAC register 
     5428+* 
     5429+* RETURNS: register value 
     5430+*/ 
     5431+UINT32 
     5432+ae531x_ReadMacReg(ae531x_MAC_t *MACInfo, UINT32 reg) 
     5433+{ 
     5434+    UINT32 addr = MACInfo->macBase+reg; 
     5435+    UINT32 data; 
     5436+ 
     5437+    data = RegRead(addr); 
     5438+    return data; 
     5439+} 
     5440+ 
     5441+ 
     5442+/****************************************************************************** 
     5443+* 
     5444+* ae531x_WriteMacReg - write AE MAC register 
     5445+* 
     5446+* RETURNS: N/A 
     5447+*/ 
     5448+void 
     5449+ae531x_WriteMacReg(ae531x_MAC_t *MACInfo, UINT32 reg, UINT32 data) 
     5450+{ 
     5451+    UINT32 addr = MACInfo->macBase+reg; 
     5452+ 
     5453+    RegWrite(data, addr); 
     5454+} 
     5455+ 
     5456+ 
     5457+/****************************************************************************** 
     5458+* 
     5459+* ae531x_SetMacReg - set bits in AE MAC register 
     5460+* 
     5461+* RETURNS: N/A 
     5462+*/ 
     5463+void 
     5464+ae531x_SetMacReg(ae531x_MAC_t *MACInfo, UINT32 reg, UINT32 val) 
     5465+{ 
     5466+    UINT32 addr = MACInfo->macBase+reg; 
     5467+    UINT32 data = RegRead(addr); 
     5468+ 
     5469+    data |= val; 
     5470+    RegWrite(data, addr); 
     5471+} 
     5472+ 
     5473+ 
     5474+/****************************************************************************** 
     5475+* 
     5476+* ae531x_ClearMacReg - clear bits in AE MAC register 
     5477+* 
     5478+* RETURNS: N/A 
     5479+*/ 
     5480+void 
     5481+ae531x_ClearMacReg(ae531x_MAC_t *MACInfo, UINT32 reg, UINT32 val) 
     5482+{ 
     5483+    UINT32 addr = MACInfo->macBase+reg; 
     5484+    UINT32 data = RegRead(addr); 
     5485+ 
     5486+    data &= ~val; 
     5487+    RegWrite(data, addr); 
     5488+} 
     5489+ 
     5490+ 
     5491+/****************************************************************************** 
     5492+* 
     5493+* ae531x_ReadDmaReg - read AE DMA register 
     5494+* 
     5495+* RETURNS: register value 
     5496+*/ 
     5497+UINT32 
     5498+ae531x_ReadDmaReg(ae531x_MAC_t *MACInfo, UINT32 reg) 
     5499+{ 
     5500+    UINT32 addr = MACInfo->dmaBase+reg; 
     5501+    UINT32 data = RegRead(addr); 
     5502+ 
     5503+    return data; 
     5504+} 
     5505+ 
     5506+ 
     5507+/****************************************************************************** 
     5508+* 
     5509+* ae531x_WriteDmaReg - write AE DMA register 
     5510+* 
     5511+* RETURNS: N/A 
     5512+*/ 
     5513+void 
     5514+ae531x_WriteDmaReg(ae531x_MAC_t *MACInfo, UINT32 reg, UINT32 data) 
     5515+{ 
     5516+    UINT32 addr = MACInfo->dmaBase+reg; 
     5517+ 
     5518+    RegWrite(data, addr); 
     5519+} 
     5520+ 
     5521+ 
     5522+/****************************************************************************** 
     5523+ * 
     5524+ * ae531x_AckIntr - clear interrupt bits in the status register. 
     5525+ * Note: Interrupt bits are *cleared* by writing a 1. 
     5526+ */ 
     5527+void 
     5528+ae531x_AckIntr(ae531x_MAC_t *MACInfo, UINT32 data) 
     5529+{ 
     5530+      ae531x_WriteDmaReg(MACInfo, DmaStatus, data); 
     5531+} 
     5532+ 
     5533+ 
     5534+/****************************************************************************** 
     5535+* 
     5536+* ae531x_SetDmaReg - set bits in an AE DMA register 
     5537+* 
     5538+* RETURNS: N/A 
     5539+*/ 
     5540+void 
     5541+ae531x_SetDmaReg(ae531x_MAC_t *MACInfo, UINT32 reg, UINT32 val) 
     5542+{ 
     5543+    UINT32 addr = MACInfo->dmaBase+reg; 
     5544+    UINT32 data = RegRead(addr); 
     5545+ 
     5546+    data |= val; 
     5547+    RegWrite(data, addr); 
     5548+} 
     5549+ 
     5550+ 
     5551+/****************************************************************************** 
     5552+* 
     5553+* ae531x_ClearDmaReg - clear bits in an AE DMA register 
     5554+* 
     5555+* RETURNS: N/A 
     5556+*/ 
     5557+void 
     5558+ae531x_ClearDmaReg(ae531x_MAC_t *MACInfo, UINT32 reg, UINT32 val) 
     5559+{ 
     5560+    UINT32 addr = MACInfo->dmaBase+reg; 
     5561+    UINT32 data = RegRead(addr); 
     5562+ 
     5563+    data &= ~val; 
     5564+    RegWrite(data, addr); 
     5565+} 
     5566+ 
     5567+ 
     5568+/****************************************************************************** 
     5569+* 
     5570+* ae531x_ReadMiiReg - read PHY registers via AE MAC Mii addr/data registers 
     5571+* 
     5572+* RETURNS: register value 
     5573+*/ 
     5574+UINT32 
     5575+ae531x_ReadMiiReg(UINT32 phyBase, UINT32 reg) 
     5576+{ 
     5577+    UINT32 data; 
     5578+    UINT32 addr = phyBase+reg; 
     5579+ 
     5580+    data = RegRead(addr); 
     5581+    return data; 
     5582+} 
     5583+ 
     5584+ 
     5585+/****************************************************************************** 
     5586+* 
     5587+* ae531x_WriteMiiReg - write PHY registers via AE MAC Mii addr/data registers 
     5588+* 
     5589+* RETURNS: N/A 
     5590+*/ 
     5591+void 
     5592+ae531x_WriteMiiReg(UINT32 phyBase, UINT32 reg, UINT32 data) 
     5593+{ 
     5594+    UINT32 addr = phyBase+reg; 
     5595+ 
     5596+    RegWrite(data, addr); 
     5597+} 
     5598+ 
     5599+ 
     5600+/****************************************************************************** 
     5601+* 
     5602+* ae531x_MiiRead - read AE Mii register 
     5603+* 
     5604+* RETURNS: register value 
     5605+*/ 
     5606+UINT16 
     5607+ae531x_MiiRead(UINT32 phyBase, UINT32 phyAddr, UINT8 reg) 
     5608+{ 
     5609+    UINT32 addr; 
     5610+    UINT16 data; 
     5611+ 
     5612+    addr = ((phyAddr << MiiDevShift) & MiiDevMask) | ((reg << MiiRegShift) & MiiRegMask); 
     5613+ 
     5614+    ae531x_WriteMiiReg(phyBase, MacMiiAddr, addr ); 
     5615+    do { 
     5616+        /* nop */ 
     5617+    } while ((ae531x_ReadMiiReg(phyBase, MacMiiAddr ) & MiiBusy) == MiiBusy); 
     5618+ 
     5619+    data = ae531x_ReadMiiReg(phyBase, MacMiiData) & 0xFFFF; 
     5620+ 
     5621+    return data; 
     5622+} 
     5623+ 
     5624+ 
     5625+/****************************************************************************** 
     5626+* 
     5627+* ae531x_MiiWrite - write AE Mii register 
     5628+* 
     5629+* RETURNS: N/A 
     5630+*/ 
     5631+void 
     5632+ae531x_MiiWrite(UINT32 phyBase, UINT32 phyAddr, UINT8 reg, UINT16 data) 
     5633+{ 
     5634+    UINT32 addr; 
     5635+ 
     5636+    ae531x_WriteMiiReg(phyBase, MacMiiData, data ); 
     5637+ 
     5638+    addr = ((phyAddr << MiiDevShift) & MiiDevMask) | 
     5639+        ((reg << MiiRegShift) & MiiRegMask) | MiiWrite; 
     5640+    ae531x_WriteMiiReg(phyBase, MacMiiAddr, addr ); 
     5641+ 
     5642+    do { 
     5643+        /* nop */ 
     5644+    } while ((ae531x_ReadMiiReg(phyBase, MacMiiAddr ) & MiiBusy) == MiiBusy); 
     5645+} 
     5646+ 
     5647+ 
     5648+/******************************************************************************* 
     5649+* ae531x_BeginResetMode - enter a special "reset mode" in which 
     5650+*    -no interrupts are expected from the device 
     5651+*    -the device will not transmit nor receive 
     5652+*    -attempts to send or receive will return with an error and 
     5653+*    -the device will be reset at the next convenient opportunity. 
     5654+*/ 
     5655+void 
     5656+ae531x_BeginResetMode(ae531x_MAC_t *MACInfo) 
     5657+{ 
     5658+    /* Set the reset flag */ 
     5659+    MACInfo->aeProcessRst = 1; 
     5660+} 
     5661+ 
     5662+ 
     5663+/******************************************************************************* 
     5664+* ae531x_EndResetMode - exit the special "reset mode" entered 
     5665+* earlier via a call to ae531x_BeginResetMode. 
     5666+*/ 
     5667+void 
     5668+ae531x_EndResetMode(ae531x_MAC_t *MACInfo) 
     5669+{ 
     5670+    MACInfo->aeProcessRst = 0; 
     5671+} 
     5672+ 
     5673+ 
     5674+/******************************************************************************* 
     5675+* ae531x_IsInResetMode - determine whether or not the device is 
     5676+* currently in "reset mode" (i.e. that a device reset is pending) 
     5677+*/ 
     5678+BOOL 
     5679+ae531x_IsInResetMode(ae531x_MAC_t *MACInfo) 
     5680+{ 
     5681+    return MACInfo->aeProcessRst; 
     5682+} 
     5683+ 
     5684+ 
     5685+/****************************************************************************** 
     5686+* 
     5687+* ae531x_DmaRxStart - Start Rx 
     5688+* 
     5689+* RETURNS: N/A 
     5690+*/ 
     5691+static void 
     5692+ae531x_DmaRxStart(ae531x_MAC_t *MACInfo) 
     5693+{ 
     5694+    ae531x_SetDmaReg(MACInfo, DmaControl, DmaRxStart); 
     5695+    sysWbFlush(); 
     5696+} 
     5697+ 
     5698+ 
     5699+/****************************************************************************** 
     5700+* 
     5701+* ae531x_DmaRxStop - Stop Rx 
     5702+* 
     5703+* RETURNS: N/A 
     5704+*/ 
     5705+void 
     5706+ae531x_DmaRxStop(ae531x_MAC_t *MACInfo) 
     5707+{ 
     5708+    ae531x_ClearDmaReg(MACInfo, DmaControl, DmaRxStart); 
     5709+    sysWbFlush(); 
     5710+} 
     5711+ 
     5712+ 
     5713+/****************************************************************************** 
     5714+* 
     5715+* ae531x_DmaTxStart - Start Tx 
     5716+* 
     5717+* RETURNS: N/A 
     5718+*/ 
     5719+void 
     5720+ae531x_DmaTxStart(ae531x_MAC_t *MACInfo) 
     5721+{ 
     5722+    ae531x_SetDmaReg(MACInfo, DmaControl, DmaTxStart); 
     5723+    sysWbFlush(); 
     5724+} 
     5725+ 
     5726+ 
     5727+/****************************************************************************** 
     5728+* 
     5729+* ae531x_DmaTxStop - Stop Tx 
     5730+* 
     5731+* RETURNS: N/A 
     5732+*/ 
     5733+void 
     5734+ae531x_DmaTxStop(ae531x_MAC_t *MACInfo) 
     5735+{ 
     5736+    ae531x_ClearDmaReg(MACInfo, DmaControl, DmaTxStart); 
     5737+    sysWbFlush(); 
     5738+} 
     5739+ 
     5740+ 
     5741+/****************************************************************************** 
     5742+* 
     5743+* ae531x_DmaIntEnable - Enable DMA interrupts 
     5744+* 
     5745+* RETURNS: N/A 
     5746+*/ 
     5747+void 
     5748+ae531x_DmaIntEnable(ae531x_MAC_t *MACInfo) 
     5749+{ 
     5750+    ae531x_WriteDmaReg(MACInfo, DmaIntrEnb, DmaIntEnable); 
     5751+} 
     5752+ 
     5753+ 
     5754+/****************************************************************************** 
     5755+* 
     5756+* ae531x_DmaIntDisable - Disable DMA interrupts 
     5757+* 
     5758+* RETURNS: N/A 
     5759+*/ 
     5760+void 
     5761+ae531x_DmaIntDisable(ae531x_MAC_t *MACInfo) 
     5762+{ 
     5763+    ae531x_WriteDmaReg(MACInfo, DmaIntrEnb, DmaIntDisable); 
     5764+} 
     5765+ 
     5766+ 
     5767+/****************************************************************************** 
     5768+* 
     5769+* ae531x_DmaIntClear - Clear DMA interrupts 
     5770+* 
     5771+* RETURNS: N/A 
     5772+*/ 
     5773+static void 
     5774+ae531x_DmaIntClear(ae531x_MAC_t *MACInfo) 
     5775+{ 
     5776+    /* clear all interrupt requests */ 
     5777+    ae531x_WriteDmaReg(MACInfo, DmaStatus, 
     5778+                      ae531x_ReadDmaReg(MACInfo, DmaStatus));   
     5779+} 
     5780+ 
     5781+ 
     5782+/****************************************************************************** 
     5783+* Initialize generic queue data 
     5784+*/ 
     5785+void 
     5786+ae531x_QueueInit(AE531X_QUEUE *q, char *pMem, int count) 
     5787+{ 
     5788+    ARRIVE(); 
     5789+    q->firstDescAddr = pMem; 
     5790+    q->lastDescAddr = (VIRT_ADDR)((UINT32)q->firstDescAddr + 
     5791+                                  (count - 1) * AE531X_QUEUE_ELE_SIZE); 
     5792+    q->curDescAddr = q->firstDescAddr; 
     5793+    q->count = count; 
     5794+    LEAVE(); 
     5795+} 
     5796+ 
     5797+ 
     5798+/****************************************************************************** 
     5799+* ae531x_TxQueueCreate - create a circular queue of descriptors for Transmit 
     5800+*/ 
     5801+static int 
     5802+ae531x_TxQueueCreate(ae531x_MAC_t *MACInfo, 
     5803+                  AE531X_QUEUE *q, 
     5804+                  char *pMem, 
     5805+                  int count) 
     5806+{ 
     5807+    int         i; 
     5808+    VIRT_ADDR   descAddr; 
     5809+ 
     5810+    ARRIVE(); 
     5811+ 
     5812+    ae531x_QueueInit(q, pMem, count); 
     5813+    q->reapDescAddr = q->lastDescAddr; 
     5814+ 
     5815+    /* Initialize Tx buffer descriptors.  */ 
     5816+    for (i=0, descAddr=q->firstDescAddr; 
     5817+         i<count; 
     5818+         i++, descAddr=(VIRT_ADDR)((UINT32)descAddr + AE531X_QUEUE_ELE_SIZE)) 
     5819+    { 
     5820+        /* Update the size, BUFPTR, and SWPTR fields */ 
     5821+ 
     5822+        AE531X_DESC_STATUS_SET(descAddr, 0); 
     5823+        AE531X_DESC_CTRLEN_SET(descAddr, 0); 
     5824+ 
     5825+        AE531X_DESC_BUFPTR_SET(descAddr, (UINT32)0); 
     5826+        AE531X_DESC_LNKBUF_SET(descAddr, (UINT32)0); 
     5827+        AE531X_DESC_SWPTR_SET(descAddr, (void *)0); 
     5828+    } /* for each desc */ 
     5829+ 
     5830+    /* Make the queue circular */ 
     5831+    AE531X_DESC_CTRLEN_SET(q->lastDescAddr, 
     5832+                       DescEndOfRing|AE531X_DESC_CTRLEN_GET(q->lastDescAddr)); 
     5833+ 
     5834+    AE531X_PRINT(AE531X_DEBUG_RESET, 
     5835+            ("ethmac%d Txbuf begin = %x, end = %x\n", 
     5836+            MACInfo->unit, 
     5837+            (UINT32)q->firstDescAddr, 
     5838+            (UINT32)q->lastDescAddr)); 
     5839+ 
     5840+    LEAVE(); 
     5841+    return 0; 
     5842+} 
     5843+ 
     5844+ 
     5845+/****************************************************************************** 
     5846+* ae531x_RxQueueCreate - create a circular queue of Rx descriptors 
     5847+*/ 
     5848+int 
     5849+ae531x_RxQueueCreate(ae531x_MAC_t *MACInfo, 
     5850+                  AE531X_QUEUE *q, 
     5851+                  char *pMem, 
     5852+                  int count) 
     5853+{ 
     5854+    int               i; 
     5855+    VIRT_ADDR         descAddr; 
     5856+ 
     5857+    ARRIVE(); 
     5858+ 
     5859+    ae531x_QueueInit(q, pMem, count); 
     5860+    q->reapDescAddr = NULL; 
     5861+ 
     5862+ 
     5863+    /* Initialize Rx buffer descriptors */ 
     5864+    for (i=0, descAddr=q->firstDescAddr; 
     5865+         i<count; 
     5866+         i++, descAddr=(VIRT_ADDR)((UINT32)descAddr + AE531X_QUEUE_ELE_SIZE)) 
     5867+    { 
     5868+        void *swptr; 
     5869+        char *rxBuffer; 
     5870+        int  rxBufferSize; 
     5871+ 
     5872+        swptr = ae531x_rxbuf_alloc(MACInfo, &rxBuffer, &rxBufferSize); 
     5873+        if (swptr == NULL) { 
     5874+                AE531X_PRINT(AE531X_DEBUG_RESET, 
     5875+                          ("ethmac%d RX queue: ae531x_rxbuf_alloc failed\n", 
     5876+                           MACInfo->unit)); 
     5877+                ae531x_QueueDestroy(q); 
     5878+                return -1; 
     5879+        } 
     5880+        AE531X_DESC_SWPTR_SET(descAddr, swptr); 
     5881+ 
     5882+        AE531X_DESC_STATUS_SET(descAddr, DescOwnByDma); 
     5883+        AE531X_DESC_CTRLEN_SET(descAddr, rxBufferSize); 
     5884+        AE531X_DESC_BUFPTR_SET(descAddr, virt_to_bus(rxBuffer)); 
     5885+        AE531X_DESC_LNKBUF_SET(descAddr, (UINT32)0); 
     5886+    } /* for each desc */ 
     5887+ 
     5888+    /* Make the queue circular */ 
     5889+    AE531X_DESC_CTRLEN_SET(q->lastDescAddr, 
     5890+                       DescEndOfRing|AE531X_DESC_CTRLEN_GET(q->lastDescAddr)); 
     5891+ 
     5892+    AE531X_PRINT(AE531X_DEBUG_RESET, 
     5893+              ("ethmac%d Rxbuf begin = %x, end = %x\n", 
     5894+              MACInfo->unit, 
     5895+              (UINT32)q->firstDescAddr, 
     5896+              (UINT32)q->lastDescAddr)); 
     5897+ 
     5898+    LEAVE(); 
     5899+    return 0; 
     5900+} 
     5901+ 
     5902+ 
     5903+/****************************************************************************** 
     5904+* ae531x_QueueDestroy -- Free all buffers and descriptors associated  
     5905+* with a queue. 
     5906+*/ 
     5907+static void 
     5908+ae531x_QueueDestroy(AE531X_QUEUE *q) 
     5909+{ 
     5910+    int i; 
     5911+    int count; 
     5912+    VIRT_ADDR    descAddr; 
     5913+ 
     5914+    ARRIVE(); 
     5915+ 
     5916+    count = q->count; 
     5917+ 
     5918+    for (i=0, descAddr=q->firstDescAddr; 
     5919+         i<count; 
     5920+         i++, descAddr=(VIRT_ADDR)((UINT32)descAddr + AE531X_QUEUE_ELE_SIZE)) { 
     5921+ 
     5922+        AE531X_DESC_STATUS_SET(descAddr, 0); 
     5923+        AE531X_DESC_CTRLEN_SET(descAddr, 0); 
     5924+        AE531X_DESC_BUFPTR_SET(descAddr, (UINT32)0); 
     5925+        AE531X_DESC_LNKBUF_SET(descAddr, (UINT32)0); 
     5926+ 
     5927+        ae531x_swptr_free(descAddr); /* Free OS-specific software pointer */ 
     5928+    } 
     5929+ 
     5930+    LEAVE(); 
     5931+} 
     5932+ 
     5933+static void 
     5934+ae531x_TxQueueDestroy(ae531x_MAC_t *MACInfo) 
     5935+{ 
     5936+    ae531x_QueueDestroy(&MACInfo->txQueue); 
     5937+} 
     5938+ 
     5939+static void 
     5940+ae531x_RxQueueDestroy(ae531x_MAC_t *MACInfo) 
     5941+{ 
     5942+    ae531x_QueueDestroy(&MACInfo->rxQueue); 
     5943+} 
     5944+ 
     5945+ 
     5946+/****************************************************************************** 
     5947+* ae531x_AllocateQueues - Allocate receive and transmit queues 
     5948+*/ 
     5949+int 
     5950+ae531x_AllocateQueues(ae531x_MAC_t *MACInfo) 
     5951+{ 
     5952+    size_t QMemSize; 
     5953+    char *pTxBuf = NULL; 
     5954+    char *pRxBuf = NULL; 
     5955+ 
     5956+    ARRIVE(); 
     5957+ 
     5958+    MACInfo->txDescCount = AE531X_TX_DESC_COUNT_DEFAULT; 
     5959+    QMemSize = AE531X_QUEUE_ELE_SIZE * MACInfo->txDescCount; 
     5960+    pTxBuf = MALLOC(QMemSize); 
     5961+    if (pTxBuf == NULL) { 
     5962+        AE531X_PRINT(AE531X_DEBUG_RESET, 
     5963+                  ("ethmac%d Failed to allocate TX queue\n", MACInfo->unit)); 
     5964+        goto AllocQFail; 
     5965+    } 
     5966+ 
     5967+    if (ae531x_TxQueueCreate(MACInfo, &MACInfo->txQueue, pTxBuf, 
     5968+                          MACInfo->txDescCount) < 0) 
     5969+    { 
     5970+        AE531X_PRINT(AE531X_DEBUG_RESET, 
     5971+                ("ethmac%d Failed to create TX queue\n", MACInfo->unit)); 
     5972+        goto AllocQFail; 
     5973+    } 
     5974+ 
     5975+    MACInfo->rxDescCount = AE531X_RX_DESC_COUNT_DEFAULT; 
     5976+    QMemSize = AE531X_QUEUE_ELE_SIZE * MACInfo->rxDescCount; 
     5977+    pRxBuf = MALLOC(QMemSize); 
     5978+    if (pRxBuf == NULL) { 
     5979+        AE531X_PRINT(AE531X_DEBUG_RESET, 
     5980+                  ("ethmac%d Failed to allocate RX queue\n", MACInfo->unit)); 
     5981+        goto AllocQFail; 
     5982+    } 
     5983+ 
     5984+    if (ae531x_RxQueueCreate(MACInfo, &MACInfo->rxQueue, pRxBuf, 
     5985+                          MACInfo->rxDescCount) < 0) 
     5986+    { 
     5987+        AE531X_PRINT(AE531X_DEBUG_RESET, 
     5988+                ("ethmac%d Failed to create RX queue\n", MACInfo->unit)); 
     5989+        goto AllocQFail; 
     5990+    } 
     5991+ 
     5992+    AE531X_PRINT(AE531X_DEBUG_RESET, 
     5993+            ("ethmac%d Memory setup complete.\n", MACInfo->unit)); 
     5994+ 
     5995+    LEAVE(); 
     5996+    return 0; 
     5997+ 
     5998+AllocQFail: 
     5999+    MACInfo->txDescCount = 0; /* sanity */ 
     6000+    MACInfo->rxDescCount = 0; /* sanity */ 
     6001+ 
     6002+    if (pTxBuf) { 
     6003+        FREE(pTxBuf); 
     6004+    } 
     6005+    if (pRxBuf) { 
     6006+        FREE(pRxBuf); 
     6007+    } 
     6008+     
     6009+    LEAVE(); 
     6010+    return -1; 
     6011+} 
     6012+ 
     6013+ 
     6014+/****************************************************************************** 
     6015+* 
     6016+* ae531x_FreeQueues - Free Transmit & Receive queues 
     6017+*/ 
     6018+void 
     6019+ae531x_FreeQueues(ae531x_MAC_t *MACInfo) 
     6020+{ 
     6021+    ae531x_TxQueueDestroy(MACInfo); 
     6022+    FREE(MACInfo->txQueue.firstDescAddr); 
     6023+ 
     6024+    ae531x_RxQueueDestroy(MACInfo); 
     6025+    FREE(MACInfo->rxQueue.firstDescAddr); 
     6026+} 
     6027+ 
     6028+/****************************************************************************** 
     6029+* 
     6030+* ae531x_DmaReset - Reset DMA and TLI controllers 
     6031+* 
     6032+* RETURNS: N/A 
     6033+*/ 
     6034+void 
     6035+ae531x_DmaReset(ae531x_MAC_t *MACInfo) 
     6036+{ 
     6037+    int        i; 
     6038+    UINT32     descAddr; 
     6039+ 
     6040+    ARRIVE(); 
     6041+ 
     6042+    /* Disable device interrupts prior to any errors during stop */ 
     6043+    intDisable(MACInfo->ilevel); 
     6044+ 
     6045+    /* Disable MAC rx and tx */ 
     6046+    ae531x_ClearMacReg(MACInfo, MacControl, (MacRxEnable | MacTxEnable)); 
     6047+ 
     6048+    udelay(1); 
     6049+ 
     6050+    /* Reset dma controller */ 
     6051+     
     6052+    ae531x_WriteDmaReg(MACInfo, DmaBusMode, DmaResetOn); 
     6053+ 
     6054+    /* Delay 2 usec */ 
     6055+    sysUDelay(2); 
     6056+ 
     6057+    /* Flush the rx queue */ 
     6058+    descAddr = (UINT32)MACInfo->rxQueue.firstDescAddr; 
     6059+    MACInfo->rxQueue.curDescAddr = MACInfo->rxQueue.firstDescAddr; 
     6060+    for (i=0; 
     6061+         i<(MACInfo->rxDescCount); 
     6062+         i++, descAddr += AE531X_QUEUE_ELE_SIZE) { 
     6063+            AE531X_DESC_STATUS_SET(descAddr, DescOwnByDma); 
     6064+    } 
     6065+ 
     6066+    /* Flush the tx queue */ 
     6067+    descAddr = (UINT32)MACInfo->txQueue.firstDescAddr; 
     6068+    MACInfo->txQueue.curDescAddr = MACInfo->txQueue.firstDescAddr; 
     6069+    MACInfo->txQueue.reapDescAddr = MACInfo->txQueue.lastDescAddr; 
     6070+    for (i=0; 
     6071+         i<(MACInfo->txDescCount); 
     6072+         i++, descAddr += AE531X_QUEUE_ELE_SIZE) { 
     6073+            AE531X_DESC_STATUS_SET (descAddr, 0); 
     6074+    } 
     6075+ 
     6076+    /* Set init register values  */ 
     6077+    ae531x_WriteDmaReg(MACInfo, DmaBusMode, DmaBusModeInit); 
     6078+ 
     6079+    /* Install the first Tx and Rx queues on the device */ 
     6080+    ae531x_WriteDmaReg(MACInfo, DmaRxBaseAddr, 
     6081+                      virt_to_bus(MACInfo->rxQueue.firstDescAddr)); 
     6082+    ae531x_WriteDmaReg(MACInfo, DmaTxBaseAddr, 
     6083+                      virt_to_bus(MACInfo->txQueue.firstDescAddr)); 
     6084+ 
     6085+ 
     6086+    ae531x_WriteDmaReg(MACInfo, DmaControl, DmaStoreAndForward); 
     6087+ 
     6088+    ae531x_WriteDmaReg(MACInfo, DmaIntrEnb, DmaIntDisable); 
     6089+ 
     6090+    AE531X_PRINT(AE531X_DEBUG_RESET, 
     6091+              ("ethmac%d: DMA RESET!\n", MACInfo->unit)); 
     6092+ 
     6093+    /* Turn on device interrupts -- enable most errors */ 
     6094+    ae531x_DmaIntClear(MACInfo);    /* clear interrupt requests  */ 
     6095+    ae531x_DmaIntEnable(MACInfo);   /* enable interrupts */ 
     6096+ 
     6097+    ae531x_EndResetMode(MACInfo); 
     6098+ 
     6099+    intEnable(MACInfo->ilevel); 
     6100+ 
     6101+    LEAVE(); 
     6102+} 
     6103+ 
     6104+ 
     6105+/****************************************************************************** 
     6106+* 
     6107+* ae531x_MACAddressSet - Set the ethernet address 
     6108+* 
     6109+* Sets the ethernet address according to settings in flash. 
     6110+* 
     6111+* RETURNS: void 
     6112+*/ 
     6113+static void 
     6114+ae531x_MACAddressSet(ae531x_MAC_t *MACInfo) 
     6115+{ 
     6116+    unsigned int    data; 
     6117+    UINT8 *macAddr; 
     6118+ 
     6119+    ARRIVE(); 
     6120+         
     6121+    macAddr = ae531x_enet_mac_address_get(MACInfo->unit); 
     6122+ 
     6123+    /* set our MAC address  */ 
     6124+    data = (macAddr[5]<<8) | macAddr[4]; 
     6125+    ae531x_WriteMacReg(MACInfo, MacAddrHigh, data ); 
     6126+ 
     6127+    data = (macAddr[3]<<24) | (macAddr[2]<<16) | (macAddr[1]<<8) | macAddr[0]; 
     6128+    ae531x_WriteMacReg(MACInfo, MacAddrLow, data ); 
     6129+ 
     6130+    AE531X_PRINT(AE531X_DEBUG_RESET, 
     6131+              ("ethmac%d Verify MAC address %8.8X %8.8X \n", 
     6132+               MACInfo->unit, 
     6133+               ae531x_ReadMacReg(MACInfo, MacAddrLow), 
     6134+               ae531x_ReadMacReg(MACInfo, MacAddrHigh))); 
     6135+ 
     6136+    AE531X_PRINT(AE531X_DEBUG_RESET, 
     6137+              ("  sb = %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n", 
     6138+               0xff&macAddr[0], 
     6139+               0xff&macAddr[1], 
     6140+               0xff&macAddr[2], 
     6141+               0xff&macAddr[3], 
     6142+               0xff&macAddr[4], 
     6143+               0xff&macAddr[5])); 
     6144+    LEAVE(); 
     6145+} 
     6146+ 
     6147+ 
     6148+/****************************************************************************** 
     6149+* 
     6150+* ae_SetMACFromPhy - read Phy settings and update Mac 
     6151+*                    with current duplex and speed. 
     6152+* 
     6153+* RETURNS: 
     6154+*/ 
     6155+static void 
     6156+ae531x_SetMACFromPhy(ae531x_MAC_t *MACInfo) 
     6157+{ 
     6158+    UINT32  macCtl; 
     6159+    BOOL    fullDuplex; 
     6160+    UINT32  timeout; 
     6161+ 
     6162+    ARRIVE(); 
     6163+ 
     6164+    timeout = jiffies+(HZ/1000)*AE531X_NEGOT_TIMEOUT; 
     6165+ 
     6166+    /* Get duplex mode from Phy */ 
     6167+    while (((fullDuplex = phyIsFullDuplex(MACInfo->unit)) == -1) && 
     6168+          (jiffies <= timeout)); 
     6169+ 
     6170+    /* Flag is set for full duplex mode, else cleared */ 
     6171+    macCtl = ae531x_ReadMacReg(MACInfo, MacControl); 
     6172+ 
     6173+    if (fullDuplex) { 
     6174+        /* set values of control registers */ 
     6175+        macCtl &= ~MacDisableRxOwn; 
     6176+        macCtl |= MacFullDuplex; 
     6177+        ae531x_WriteMacReg(MACInfo, MacControl, macCtl); 
     6178+        ae531x_WriteMacReg(MACInfo, MacFlowControl, MacFlowControlInitFdx); 
     6179+    } else { 
     6180+       /* set values of control registers */ 
     6181+        ae531x_WriteMacReg(MACInfo, MacFlowControl, MacFlowControlInitHdx); 
     6182+        macCtl |= MacDisableRxOwn; 
     6183+        macCtl &= ~MacFullDuplex; 
     6184+        ae531x_WriteMacReg(MACInfo, MacControl, macCtl); 
     6185+    } 
     6186+ 
     6187+    LEAVE(); 
     6188+} 
     6189+ 
     6190+ 
     6191+/****************************************************************************** 
     6192+* ae531x_MACReset -- sets MAC address and duplex. 
     6193+*/ 
     6194+void 
     6195+ae531x_MACReset(ae531x_MAC_t *MACInfo) 
     6196+{ 
     6197+    ae531x_MACAddressSet(MACInfo); 
     6198+#ifndef CONFIG_AR5315 
     6199+    ae531x_SetMACFromPhy(MACInfo); 
     6200+#endif 
     6201+} 
     6202+ 
     6203+ 
     6204+/****************************************************************************** 
     6205+* ae531x_EnableComm -- enable Transmit and Receive 
     6206+*/ 
     6207+void 
     6208+ae531x_EnableComm(ae531x_MAC_t *MACInfo) 
     6209+{ 
     6210+    ae531x_SetMacReg(MACInfo, MacControl, (MacRxEnable | MacTxEnable)); 
     6211+    ae531x_DmaRxStart(MACInfo);     /* start receiver  */ 
     6212+    ae531x_DmaTxStart(MACInfo);     /* start transmitter */ 
     6213+} 
     6214+ 
     6215+ 
     6216+/****************************************************************************** 
     6217+* ae531x_DisableComm -- disable Transmit and Receive 
     6218+*/ 
     6219+void 
     6220+ae531x_DisableComm(ae531x_MAC_t *MACInfo) 
     6221+{ 
     6222+    ae531x_ClearMacReg(MACInfo, MacControl, (MacRxEnable | MacTxEnable)); 
     6223+} 
     6224+ 
     6225+ 
     6226+/****************************************************************************** 
     6227+* ae531x_reset -- Cold reset ethernet interface 
     6228+*/ 
     6229+void 
     6230+ae531x_reset(ae531x_MAC_t *MACInfo) 
     6231+{ 
     6232+    UINT32 mask = 0; 
     6233+    UINT32 regtmp; 
     6234+#ifndef CONFIG_AR5315 
     6235+    
     6236+    if (MACInfo->unit == 0) { 
     6237+        mask = AR531X_RESET_ENET0 | AR531X_RESET_EPHY0; 
     6238+    } else { 
     6239+        mask = AR531X_RESET_ENET1 | AR531X_RESET_EPHY1; 
     6240+    } 
     6241+ 
     6242+    /* Put into reset */ 
     6243+    regtmp = sysRegRead(AR531X_RESET); 
     6244+    sysRegWrite(AR531X_RESET, regtmp | mask); 
     6245+    sysMsDelay(15); 
     6246+ 
     6247+    /* Pull out of reset */ 
     6248+    regtmp = sysRegRead(AR531X_RESET); 
     6249+    sysRegWrite(AR531X_RESET, regtmp & ~mask); 
     6250+    sysUDelay(25); 
     6251+ 
     6252+    /* Enable */ 
     6253+    if (MACInfo->unit == 0) { 
     6254+        mask = AR531X_ENABLE_ENET0; 
     6255+    } else { 
     6256+        mask = AR531X_ENABLE_ENET1; 
     6257+    } 
     6258+    regtmp = sysRegRead(AR531X_ENABLE); 
     6259+    sysRegWrite(AR531X_ENABLE, regtmp | mask); 
     6260+#else 
     6261+    if (MACInfo->unit == 0) { 
     6262+        mask = AR531X_RESET_ENET0 | AR531X_RESET_EPHY0; 
     6263+    } 
     6264+    /* Enable Arbitration for Ethernet bus */ 
     6265+    regtmp = sysRegRead(AR531XPLUS_AHB_ARB_CTL); 
     6266+    regtmp |= ARB_ETHERNET; 
     6267+    sysRegWrite(AR531XPLUS_AHB_ARB_CTL, regtmp); 
     6268+ 
     6269+    /* Put into reset */ 
     6270+    regtmp = sysRegRead(AR531X_RESET); 
     6271+    sysRegWrite(AR531X_RESET, regtmp | mask); 
     6272+    sysMsDelay(10); 
     6273+ 
     6274+    /* Pull out of reset */ 
     6275+    regtmp = sysRegRead(AR531X_RESET); 
     6276+    sysRegWrite(AR531X_RESET, regtmp & ~mask); 
     6277+    sysMsDelay(10); 
     6278+ 
     6279+    regtmp = sysRegRead(AR531XPLUS_IF_CTL); 
     6280+    regtmp |= IF_TS_LOCAL; 
     6281+    sysRegWrite(AR531XPLUS_IF_CTL, regtmp); 
     6282+#endif 
     6283+} 
     6284+ 
     6285+ 
     6286+/****************************************************************************** 
     6287+* ae531x_unitLinkLost -- Called from PHY layer to notify the MAC layer 
     6288+* that there are no longer any live links associated with a MAC. 
     6289+*/ 
     6290+void 
     6291+ae531x_unitLinkLost(int ethUnit) 
     6292+{ 
     6293+    AE531X_PRINT(AE531X_DEBUG_LINK_CHANGE, 
     6294+             ("enetmac%d link down\n", ethUnit)); 
     6295+} 
     6296+ 
     6297+ 
     6298+/****************************************************************************** 
     6299+* ae531x_unitLinkGained -- Called from PHY layer to notify the MAC layer 
     6300+* that there are 1 or more live links associated with a MAC. 
     6301+*/ 
     6302+void 
     6303+ae531x_unitLinkGained(int ethUnit) 
     6304+{ 
     6305+#if CONFIG_AR5315 
     6306+#define AE531X_POLL_MILLI_SECONDS 200  
     6307+    ae531x_MAC_t *MACInfo = ae531x_getMAcInfo(ethUnit); 
     6308+    while(!MACInfo || !MACInfo->port_is_up) 
     6309+    { 
     6310+        set_current_state(TASK_UNINTERRUPTIBLE); 
     6311+        schedule_timeout((AE531X_POLL_MILLI_SECONDS * HZ)/1000); 
     6312+        MACInfo = ae531x_getMAcInfo(ethUnit); 
     6313+    } 
     6314+    ae531x_SetMACFromPhy(MACInfo); 
     6315+#endif 
     6316+    AE531X_PRINT(AE531X_DEBUG_LINK_CHANGE, 
     6317+             ("enet%d link up\n", ethUnit)); 
     6318+} 
     6319+ 
     6320+/****************************************************************************** 
     6321+* ae531x_ethMacDefault -- Called from PHY layer to determine the default 
     6322+* ethernet MAC.  On some "twisted" platforms, the only usable MAC is 1, 
     6323+* while on others the usable MAC is 0.  Future boards may allow both MACs 
     6324+* to be used; in this case, return -1 to indicate that there IS NO default 
     6325+* MAC. 
     6326+*/ 
     6327+int 
     6328+ae531x_ethMacDefault(void) 
     6329+{ 
     6330+    if (ae531x_twisted_enet()) 
     6331+        return 1; 
     6332+ 
     6333+    return 0; 
     6334+ 
     6335+} 
     6336diff -urN linux-mips-orig/drivers/net/ath/ae531xmac.h linux-mips-new/drivers/net/ath/ae531xmac.h 
     6337--- linux-mips-orig/drivers/net/ath/ae531xmac.h 1970-01-01 01:00:00.000000000 +0100 
     6338+++ linux-mips-new/drivers/net/ath/ae531xmac.h  2005-12-31 12:33:57.674538672 +0000 
     6339@@ -0,0 +1,229 @@ 
     6340+/* 
     6341+ * This file is subject to the terms and conditions of the GNU General Public 
     6342+ * License.  See the file "COPYING" in the main directory of this archive 
     6343+ * for more details. 
     6344+ * 
     6345+ * Copyright © 2003 Atheros Communications, Inc.,  All Rights Reserved. 
     6346+ */ 
     6347+ 
     6348+/* 
     6349+ * See README to understand the decomposition of the ethernet driver. 
     6350+ * 
     6351+ * This file contains OS-independent pure software definitions for 
     6352+ * ethernet support on the AR531X platform. 
     6353+ */ 
     6354+ 
     6355+#ifndef _AE531XMAC_H_ 
     6356+#define _AE531XMAC_H_ 
     6357+ 
     6358+#include <linux/config.h> 
     6359+#include <linux/module.h> 
     6360+ 
     6361+/* 
     6362+ * DEBUG switches to control verbosity. 
     6363+ * Just modify the value of ae531x_MAC_debug. 
     6364+ */ 
     6365+#define AE531X_DEBUG_ALL         0xffffffff 
     6366+#define AE531X_DEBUG_ERROR       0x00000001 /* Unusual conditions and Errors */ 
     6367+#define AE531X_DEBUG_ARRIVE      0x00000002 /* Arrive into a function */ 
     6368+#define AE531X_DEBUG_LEAVE       0x00000004 /* Leave a function */ 
     6369+#define AE531X_DEBUG_RESET       0x00000008 /* Reset */ 
     6370+#define AE531X_DEBUG_TX          0x00000010 /* Transmit */ 
     6371+#define AE531X_DEBUG_TX_REAP     0x00000020 /* Transmit Descriptor Reaping */ 
     6372+#define AE531X_DEBUG_RX          0x00000040 /* Receive */ 
     6373+#define AE531X_DEBUG_RX_STOP     0x00000080 /* Receive Early Stop */ 
     6374+#define AE531X_DEBUG_INT         0x00000100 /* Interrupts */ 
     6375+#define AE531X_DEBUG_LINK_CHANGE 0x00000200 /* PHY Link status changed */ 
     6376+ 
     6377+#define AE531X_NEGOT_TIMEOUT    500        /* ms to wait for autonegotiation */ 
     6378+ 
     6379+extern int ae531x_MAC_debug; 
     6380+ 
     6381+#define AE531X_PRINT(FLG, X)                            \ 
     6382+{                                                   \ 
     6383+    if (ae531x_MAC_debug & (FLG)) {                  \ 
     6384+        DEBUG_PRINTF("%s#%d:%s ",                   \ 
     6385+                     __FILE__,                      \ 
     6386+                     __LINE__,                      \ 
     6387+                     __FUNCTION__);                 \ 
     6388+        DEBUG_PRINTF X;                             \ 
     6389+    }                                               \ 
     6390+} 
     6391+ 
     6392+#define ARRIVE() AE531X_PRINT(AE531X_DEBUG_ARRIVE, ("Arrive{\n")) 
     6393+#define LEAVE() AE531X_PRINT(AE531X_DEBUG_LEAVE, ("}Leave\n")) 
     6394+ 
     6395+#define RegRead(addr)  \ 
     6396+       (*(volatile unsigned int *)(addr)) 
     6397+ 
     6398+#define RegWrite(val,addr)     \ 
     6399+       ((*(volatile unsigned int *)(addr)) = (val)) 
     6400+ 
     6401+/***************************************************************** 
     6402+ * Phy code is broken out into a separate layer, so that different 
     6403+ * PHY hardware can easily be supported. 
     6404+ * 
     6405+ * These functions are provided by the PHY layer for use by the MAC layer. 
     6406+ *   phySetup             -- Set phy hardware appropriately for a MAC unit 
     6407+ * 
     6408+ *   phyCheckStatusChange -- Look for dropped/initiated links on any 
     6409+ *                           phy port associated with a MAC unit 
     6410+ * 
     6411+ *   phyIsSpeed100        -- Determines whether or not a PHY is up and 
     6412+ *                           running at 100Mbit 
     6413+ * 
     6414+ *   phyIsFullDuplex      -- Determines whether or not a PHY is up and 
     6415+ *                           running in Full Duplex mode 
     6416+ * 
     6417+ */ 
     6418+#if CONFIG_MARVELL_ENET_PHY 
     6419+/* 
     6420+ * Mapping of generic phy APIs to Marvell Ethernet Switch phy functions. 
     6421+ */ 
     6422+#include "mvPhy.h" 
     6423+#define phySetup(ethUnit, phyBase)      mv_phySetup((ethUnit), (phyBase)) 
     6424+#define phyCheckStatusChange(ethUnit)   mv_phyCheckStatusChange(ethUnit) 
     6425+#define phyIsSpeed100(ethUnit)          mv_phyIsSpeed100(ethUnit) 
     6426+#define phyIsFullDuplex(ethUnit)        mv_phyIsFullDuplex(ethUnit) 
     6427+ 
     6428+#if CONFIG_VENETDEV 
     6429+#define PHY_TRAILER_SIZE    MV_PHY_TRAILER_SIZE 
     6430+extern void mv