diff -Nur linux-2.6.32.orig/arch/mips/ar7/platform.c linux-2.6.32/arch/mips/ar7/platform.c --- linux-2.6.32.orig/arch/mips/ar7/platform.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32/arch/mips/ar7/platform.c 2009-12-16 20:10:47.564817191 +0100 @@ -509,7 +509,7 @@ memset(uart_port, 0, sizeof(struct uart_port) * 2); - uart_port[0].type = PORT_16550A; + uart_port[0].type = PORT_AR7; uart_port[0].line = 0; uart_port[0].irq = AR7_IRQ_UART0; uart_port[0].uartclk = ar7_bus_freq() / 2; @@ -524,7 +524,7 @@ /* Only TNETD73xx have a second serial port */ if (ar7_has_second_uart()) { - uart_port[1].type = PORT_16550A; + uart_port[1].type = PORT_AR7; uart_port[1].line = 1; uart_port[1].irq = AR7_IRQ_UART1; uart_port[1].uartclk = ar7_bus_freq() / 2; diff -Nur linux-2.6.32.orig/arch/mips/include/asm/page.h linux-2.6.32/arch/mips/include/asm/page.h --- linux-2.6.32.orig/arch/mips/include/asm/page.h 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32/arch/mips/include/asm/page.h 2009-12-16 20:10:47.576432079 +0100 @@ -200,8 +200,11 @@ #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) -#define UNCAC_ADDR(addr) ((addr) - PAGE_OFFSET + UNCAC_BASE) -#define CAC_ADDR(addr) ((addr) - UNCAC_BASE + PAGE_OFFSET) +#define UNCAC_ADDR(addr) ((addr) - PAGE_OFFSET + UNCAC_BASE + \ + PHYS_OFFSET) +#define CAC_ADDR(addr) ((addr) - UNCAC_BASE + PAGE_OFFSET - \ + PHYS_OFFSET) + #include #include diff -Nur linux-2.6.32.orig/arch/mips/Kconfig linux-2.6.32/arch/mips/Kconfig --- linux-2.6.32.orig/arch/mips/Kconfig 2009-12-14 21:11:40.737752912 +0100 +++ linux-2.6.32/arch/mips/Kconfig 2009-12-16 20:10:47.592420151 +0100 @@ -30,7 +30,6 @@ select CEVT_R4K select CSRC_R4K select IRQ_CPU - select NO_EXCEPT_FILL select SWAP_IO_SPACE select SYS_HAS_CPU_MIPS32_R1 select SYS_HAS_EARLY_PRINTK diff -Nur linux-2.6.32.orig/arch/mips/kernel/traps.c linux-2.6.32/arch/mips/kernel/traps.c --- linux-2.6.32.orig/arch/mips/kernel/traps.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32/arch/mips/kernel/traps.c 2009-12-16 20:10:47.596422057 +0100 @@ -1255,9 +1255,22 @@ exception_handlers[n] = handler; if (n == 0 && cpu_has_divec) { - *(u32 *)(ebase + 0x200) = 0x08000000 | - (0x03ffffff & (handler >> 2)); - local_flush_icache_range(ebase + 0x200, ebase + 0x204); + if ((handler ^ (ebase + 4)) & 0xfc000000) { + /* lui k0, 0x0000 */ + *(u32 *)(ebase + 0x200) = 0x3c1a0000 | (handler >> 16); + /* ori k0, 0x0000 */ + *(u32 *)(ebase + 0x204) = + 0x375a0000 | (handler & 0xffff); + /* jr k0 */ + *(u32 *)(ebase + 0x208) = 0x03400008; + /* nop */ + *(u32 *)(ebase + 0x20C) = 0x00000000; + flush_icache_range(ebase + 0x200, ebase + 0x210); + } else { + *(u32 *)(ebase + 0x200) = + 0x08000000 | (0x03ffffff & (handler >> 2)); + flush_icache_range(ebase + 0x200, ebase + 0x204); + } } return (void *)old_handler; } diff -Nur linux-2.6.32.orig/drivers/mtd/ar7part.c linux-2.6.32/drivers/mtd/ar7part.c --- linux-2.6.32.orig/drivers/mtd/ar7part.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32/drivers/mtd/ar7part.c 2009-12-17 10:51:32.044434005 +0100 @@ -28,7 +28,7 @@ #include #include -#define AR7_PARTS 4 +#define AR7_PARTS 5 #define ROOT_OFFSET 0xe0000 #define LOADER_MAGIC1 le32_to_cpu(0xfeedfa42) @@ -122,14 +122,19 @@ ar7_parts[2].name = "linux"; ar7_parts[2].offset = pre_size; - ar7_parts[2].size = master->size - pre_size - post_size; + ar7_parts[2].size = master->size - pre_size - post_size - 2*master->erasesize; ar7_parts[2].mask_flags = 0; ar7_parts[3].name = "rootfs"; ar7_parts[3].offset = root_offset; - ar7_parts[3].size = master->size - root_offset - post_size; + ar7_parts[3].size = master->size - root_offset - post_size - 2*master->erasesize; ar7_parts[3].mask_flags = 0; + ar7_parts[4].name = "cfgfs"; + ar7_parts[4].offset = master->size - 2*master->erasesize; + ar7_parts[4].size = 2*master->erasesize; + ar7_parts[4].mask_flags = 0; + *pparts = ar7_parts; return AR7_PARTS; } diff -Nur linux-2.6.32.orig/drivers/mtd/maps/physmap.c linux-2.6.32/drivers/mtd/maps/physmap.c --- linux-2.6.32.orig/drivers/mtd/maps/physmap.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32/drivers/mtd/maps/physmap.c 2009-12-16 20:12:01.388510102 +0100 @@ -80,7 +80,7 @@ "map_rom", NULL }; #ifdef CONFIG_MTD_PARTITIONS -static const char *part_probe_types[] = { "cmdlinepart", "RedBoot", NULL }; +static const char *part_probe_types[] = { "cmdlinepart", "RedBoot", "ar7part", NULL }; #endif static int physmap_flash_probe(struct platform_device *dev) diff -Nur linux-2.6.32.orig/drivers/net/cpmac.c linux-2.6.32/drivers/net/cpmac.c --- linux-2.6.32.orig/drivers/net/cpmac.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32/drivers/net/cpmac.c 2009-12-16 21:24:20.356422767 +0100 @@ -1165,7 +1165,7 @@ priv->dev = dev; priv->ring_size = 64; priv->msg_enable = netif_msg_init(debug_level, 0xff); - memcpy(dev->dev_addr, pdata->dev_addr, sizeof(dev->dev_addr)); + memcpy(dev->dev_addr, pdata->dev_addr, ETH_ALEN); snprintf(priv->phy_name, MII_BUS_ID_SIZE, PHY_ID_FMT, mdio_bus_id, phy_id); diff -Nur linux-2.6.32.orig/drivers/serial/8250.c linux-2.6.32/drivers/serial/8250.c --- linux-2.6.32.orig/drivers/serial/8250.c 2009-12-03 04:51:21.000000000 +0100 +++ linux-2.6.32/drivers/serial/8250.c 2009-12-16 20:10:58.820421544 +0100 @@ -2714,7 +2714,11 @@ { struct uart_8250_port *up = (struct uart_8250_port *)port; +#ifdef CONFIG_AR7 + wait_for_xmitr(up, BOTH_EMPTY); +#else wait_for_xmitr(up, UART_LSR_THRE); +#endif serial_out(up, UART_TX, ch); }