From: Rod Whitby Date: Mon, 18 Dec 2006 01:57:04 +0000 (+0000) Subject: IXP4xx patches for NSLU2 and NAS100D X-Git-Tag: reboot~30240 X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fopenwrt.git;a=commitdiff_plain;h=3fa8a58011c5e92888179305c9cd82d48c986e50;hp=6f68289195d0e881269dba51836782d3828831d0 IXP4xx patches for NSLU2 and NAS100D SVN-Revision: 5830 --- diff --git a/target/linux/ixp4xx-2.6/patches/102-nslu2_led_swap.patch b/target/linux/ixp4xx-2.6/patches/102-nslu2_led_swap.patch new file mode 100644 index 0000000000..f6ea98bbd3 --- /dev/null +++ b/target/linux/ixp4xx-2.6/patches/102-nslu2_led_swap.patch @@ -0,0 +1,36 @@ +Submitted as http://www.arm.linux.org.uk/developer/patches/viewpatch.php?id=3984/1 + +This patch fixes an error in the numbering of the disk LEDs on the +Linksys NSLU2. The error crept in because the physical location +of the LEDs has the Disk 2 LED *above* the Disk 1 LED. + +Thanks to Gordon Farquharson for reporting this. + +Signed-off-by: Rod Whitby + +PATCH FOLLOWS +KernelVersion: 2.6.19 + +Index: linux-2.6.19/include/asm-arm/arch-ixp4xx/nslu2.h +=================================================================== +--- linux-2.6.19.orig/include/asm-arm/arch-ixp4xx/nslu2.h ++++ linux-2.6.19/include/asm-arm/arch-ixp4xx/nslu2.h +@@ -76,6 +76,7 @@ + + #define NSLU2_GPIO_BUZZ 4 + #define NSLU2_BZ_BM (1L << NSLU2_GPIO_BUZZ) ++ + /* LEDs */ + + #define NSLU2_LED_RED NSLU2_GPIO0 +@@ -84,8 +85,8 @@ + #define NSLU2_LED_RED_BM (1L << NSLU2_LED_RED) + #define NSLU2_LED_GRN_BM (1L << NSLU2_LED_GRN) + +-#define NSLU2_LED_DISK1 NSLU2_GPIO2 +-#define NSLU2_LED_DISK2 NSLU2_GPIO3 ++#define NSLU2_LED_DISK1 NSLU2_GPIO3 ++#define NSLU2_LED_DISK2 NSLU2_GPIO2 + + #define NSLU2_LED_DISK1_BM (1L << NSLU2_GPIO2) + #define NSLU2_LED_DISK2_BM (1L << NSLU2_GPIO3) diff --git a/target/linux/ixp4xx-2.6/patches/133-ixp4xx-net-driver-improve-mac-handling.patch b/target/linux/ixp4xx-2.6/patches/133-ixp4xx-net-driver-improve-mac-handling.patch new file mode 100644 index 0000000000..a808e4dfa9 --- /dev/null +++ b/target/linux/ixp4xx-2.6/patches/133-ixp4xx-net-driver-improve-mac-handling.patch @@ -0,0 +1,60 @@ +Index: linux-2.6.19/include/asm-arm/arch-ixp4xx/platform.h +=================================================================== +--- linux-2.6.19.orig/include/asm-arm/arch-ixp4xx/platform.h ++++ linux-2.6.19/include/asm-arm/arch-ixp4xx/platform.h +@@ -100,6 +100,7 @@ struct mac_plat_info { + int phy_id; /* ID of the connected PHY (PCB/platform dependent) */ + int rxq_id; /* Queue ID of the RX-free q*/ + int txq_id; /* Where to push the outgoing packets */ ++ unsigned char hwaddr[6]; /* Desired hardware address */ + }; + + +Index: linux-2.6.19/drivers/net/ixp4xx/mac_driver.c +=================================================================== +--- linux-2.6.19.orig/drivers/net/ixp4xx/mac_driver.c ++++ linux-2.6.19/drivers/net/ixp4xx/mac_driver.c +@@ -189,6 +189,24 @@ static int ixmac_open (struct net_device + } + mac->rxq_pkt += RX_QUEUE_PREFILL; + ++ /* printk(KERN_INFO "...Platform MAC=0x%02x%02x%02x%02x%02x%02x\n", ++ mac->plat->hwaddr[0], ++ mac->plat->hwaddr[1], ++ mac->plat->hwaddr[2], ++ mac->plat->hwaddr[3], ++ mac->plat->hwaddr[4], ++ mac->plat->hwaddr[5] ++ ); */ ++ /* Only use platform or random if there's currently no device hw addr */ ++ if (is_zero_ether_addr(dev->dev_addr)) { ++ if (is_zero_ether_addr(mac->plat->hwaddr)) { ++ random_ether_addr(dev->dev_addr); ++ dev->dev_addr[5] = mac->plat->phy_id; ++ } ++ else ++ memcpy(dev->dev_addr, mac->plat->hwaddr, 6); ++ } ++ + mac_init(mac); + npe_mh_set_rxqid(npe, mac->plat, RX_DONE_QID); + mac_set_uniaddr(dev); +@@ -434,9 +452,15 @@ static int mac_probe(struct platform_dev + * following commands: + * "ip link set address 02:03:04:04:04:01 dev eth0" + * "ifconfig eth0 hw ether 02:03:04:04:04:07" +- */ +- random_ether_addr(dev->dev_addr); +- dev->dev_addr[5] = plat->phy_id; ++ */ ++/* Note: moved to ixmac_open to allow notifiers to run for compiled in modules ++ if (is_zero_ether_addr(plat->hwaddr)) { ++ random_ether_addr(dev->dev_addr); ++ dev->dev_addr[5] = plat->phy_id; ++ } ++ else ++ memcpy(dev->dev_addr, plat->hwaddr, 6); ++*/ + + printk(KERN_INFO IXMAC_NAME " driver " IXMAC_VERSION + ": %s on %s with PHY[%d] initialized\n", diff --git a/target/linux/ixp4xx-2.6/patches/139-ixp4xx-net-driver-mtd-load-fw.patch b/target/linux/ixp4xx-2.6/patches/139-ixp4xx-net-driver-mtd-load-fw.patch new file mode 100644 index 0000000000..532c80080b --- /dev/null +++ b/target/linux/ixp4xx-2.6/patches/139-ixp4xx-net-driver-mtd-load-fw.patch @@ -0,0 +1,414 @@ +Index: linux-2.6.19/drivers/net/ixp4xx/Kconfig +=================================================================== +--- linux-2.6.19.orig/drivers/net/ixp4xx/Kconfig ++++ linux-2.6.19/drivers/net/ixp4xx/Kconfig +@@ -11,6 +11,7 @@ config IXP4XX_NPE + tristate "IXP4xx NPE support" + depends on ARCH_IXP4XX + depends on NET_ETHERNET ++ select CRC16 + help + The IXP4XX NPE driver supports the 3 CPU co-processors called + "Network Processing Engines" (NPE). It adds support fo downloading +@@ -18,7 +19,7 @@ config IXP4XX_NPE + More about this at: Documentation/networking/ixp4xx/README. + You can either use this OR the Intel Access Library (IAL) + +-config IXP4XX_FW_LOAD ++config IXP4XX_NPE_FW_LOAD + bool "Use Firmware hotplug for Microcode download" + depends on IXP4XX_NPE + select HOTPLUG +@@ -28,6 +29,13 @@ config IXP4XX_FW_LOAD + /usr/lib/hotplug/firmware/NPE-[ABC] + see Documentation/firmware_class/hotplug-script + ++config IXP4XX_NPE_FW_MTD ++ bool "Load firmware from an mtd partition" ++ depends on IXP4XX_NPE && MTD_IXP4XX ++ help ++ With this option, the driver will search for ++ the firmware into an MTD partition. ++ + config IXP4XX_MAC + tristate "IXP4xx MAC support" + depends on IXP4XX_NPE +Index: linux-2.6.19/drivers/net/ixp4xx/Makefile +=================================================================== +--- linux-2.6.19.orig/drivers/net/ixp4xx/Makefile ++++ linux-2.6.19/drivers/net/ixp4xx/Makefile +@@ -1,6 +1,7 @@ + obj-$(CONFIG_IXP4XX_QMGR) += ixp4xx_qmgr.o + obj-$(CONFIG_IXP4XX_NPE) += ixp4xx_npe.o + obj-$(CONFIG_IXP4XX_MAC) += ixp4xx_mac.o ++obj-$(CONFIG_IXP4XX_NPE_FW_MTD) += npe_ucode.o + + ixp4xx_npe-objs := ucode_dl.o npe_mh.o + ixp4xx_mac-objs := mac_driver.o qmgr_eth.o phy.o +Index: linux-2.6.19/drivers/net/ixp4xx/npe_ucode.c +=================================================================== +--- /dev/null ++++ linux-2.6.19/drivers/net/ixp4xx/npe_ucode.c +@@ -0,0 +1,185 @@ ++/* ++ * Provide an NPE platform device for microcode handling ++ * ++ * Copyright (C) 2006 Christian Hohnstaedt ++ * ++ * This file is released under the GPLv2 ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#define DL_MAGIC 0xfeedf00d ++#define DL_MAGIC_SWAP 0x0df0edfe ++ ++#define IMG_SIZE(image) (((image)->size * sizeof(u32)) + \ ++ sizeof(struct dl_image)) ++ ++#define IMG_REV_MAJOR(id) (((id) >> 8) & 0x0f) ++#define IMG_REV_MINOR(id) ((id) & 0x0f) ++#define IMG_FUNC(id) (((id) >> 16) & 0xff) ++#define IMG_NPE(id) (((id) >> 24) & 0x0f) ++#define IMG_IXP(id) (((id) >> 28) & 0x0f) ++ ++static struct platform_driver ixp4xx_npe_ucode_driver; ++static unsigned char *partition_name = NULL; ++ ++static void print_image_info(u32 id, u32 offset, u32 size) ++{ ++ unsigned char idx; ++ const char *names[] = { "IXP425", "IXP465", "unknown" }; ++ ++ idx = IMG_IXP(id) < 2 ? IMG_IXP(id) : 2; ++ ++ printk(KERN_INFO "npe: found at 0x%x, %s/NPE-%c func: %02x, rev: %x.%x, " ++ "size: %5d, id: %08x\n", offset, names[idx], IMG_NPE(id) + 'A', ++ IMG_FUNC(id), IMG_REV_MAJOR(id), IMG_REV_MINOR(id), size, id); ++} ++ ++void npe_swap_image(struct dl_image *image) ++{ ++ unsigned int i; ++ ++ image->magic = swab32(image->magic); ++ image->id = swab32(image->id); ++ image->size = swab32(image->size); ++ ++ for (i = 0; i < image->size; i++) ++ image->u.data[i] = swab32(image->u.data[i]); ++} ++ ++static void npe_find_microcode(struct mtd_info *mtd) ++{ ++ u32 buf; ++ u32 magic = htonl(DL_MAGIC); ++ u32 id, size; ++ size_t retlen; ++ int err; ++ unsigned int offset = 0; ++ ++ printk("npe: searching for firmware...\n"); ++ ++ while (offset < mtd->size) { ++ ++ err = mtd->read(mtd, offset, 4, &retlen, (u_char *) &buf); ++ offset += retlen; ++ ++ if (buf != magic) ++ continue; ++ ++ err = mtd->read(mtd, offset, 4, &retlen, (u_char *) &id); ++ offset += retlen; ++ ++ if (id == magic) ++ break; ++ ++ id = ntohl(id); ++ ++ err = mtd->read(mtd, offset, 4, &retlen, (u_char *) &size); ++ offset += retlen; ++ ++ size = (ntohl(size) * 4) + 12; ++ ++ print_image_info(id, offset - 12, size); ++ ++ if (size < 24000 && ( IMG_FUNC(id) == 0x01 || IMG_FUNC(id) == 0x00) ) { // XXX fix size/detection ++ ++ struct dl_image *image = kmalloc(size, GFP_KERNEL); ++ ++ /* we are going to load it, rewind offset */ ++ offset -= 12; ++ ++ if (image) { ++ err = mtd->read(mtd, offset, size, &retlen, (u_char *) image); ++ ++ if (err == 0 && retlen == size) { ++ if (image->magic == DL_MAGIC_SWAP) ++ npe_swap_image(image); ++ ++ store_npe_image(image, NULL); ++ } else { ++ printk(KERN_ERR "unable to read firmware\n"); ++ } ++ ++ kfree(image); ++ } ++ ++ offset += size; ++ } ++ } ++} ++ ++static void npe_flash_add(struct mtd_info *mtd) ++{ ++ if (partition_name == NULL) ++ return; ++ ++ if (strcmp(mtd->name, partition_name) == 0) { ++ npe_find_microcode(mtd); ++ } ++} ++ ++static void npe_flash_remove(struct mtd_info *mtd) { ++} ++ ++static struct mtd_notifier npe_flash_notifier = { ++ .add = npe_flash_add, ++ .remove = npe_flash_remove, ++}; ++ ++static int npe_ucode_probe(struct platform_device *pdev) ++{ ++ struct npe_ucode_platform_data *data = pdev->dev.platform_data; ++ ++ if (partition_name) ++ return -EEXIST; ++ ++ if (data && data->mtd_partition) { ++ partition_name = data->mtd_partition; ++ return 0; ++ } ++ ++ return -EINVAL; ++} ++ ++static int npe_ucode_remove(struct platform_device *pdev) ++{ ++ return 0; ++} ++ ++static struct platform_driver ixp4xx_npe_ucode_driver = { ++ .driver = { ++ .name = "ixp4xx_npe_ucode", ++ .owner = THIS_MODULE, ++ }, ++ .probe = npe_ucode_probe, ++ .remove = npe_ucode_remove, ++}; ++ ++static int __init npe_ucode_init(void) ++{ ++ int ret; ++ ++ ret = platform_driver_register(&ixp4xx_npe_ucode_driver); ++ register_mtd_user(&npe_flash_notifier); ++ ++ return ret; ++} ++ ++static void __exit npe_ucode_exit(void) ++{ ++ unregister_mtd_user(&npe_flash_notifier); ++ platform_driver_unregister(&ixp4xx_npe_ucode_driver); ++} ++ ++module_init(npe_ucode_init); ++module_exit(npe_ucode_exit); ++ ++MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("Alessandro Zummo "); +Index: linux-2.6.19/drivers/net/ixp4xx/ucode_dl.c +=================================================================== +--- linux-2.6.19.orig/drivers/net/ixp4xx/ucode_dl.c ++++ linux-2.6.19/drivers/net/ixp4xx/ucode_dl.c +@@ -16,6 +16,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -30,6 +31,12 @@ + #define IMG_SIZE(image) (((image)->size * sizeof(u32)) + \ + sizeof(struct dl_image)) + ++#define IMG_REV_MAJOR(id) (((id) >> 8) & 0x0f) ++#define IMG_REV_MINOR(id) ((id) & 0x0f) ++#define IMG_FUNC(id) (((id) >> 16) & 0xff) ++#define IMG_NPE(id) (((id) >> 24) & 0x0f) ++#define IMG_IXP(id) (((id) >> 28) & 0x0f) ++ + #define BT_INSTR 0 + #define BT_DATA 1 + +@@ -38,21 +45,6 @@ enum blk_type { + data, + }; + +-struct dl_block { +- u32 type; +- u32 offset; +-}; +- +-struct dl_image { +- u32 magic; +- u32 id; +- u32 size; +- union { +- u32 data[0]; +- struct dl_block block[0]; +- } u; +-}; +- + struct dl_codeblock { + u32 npe_addr; + u32 size; +@@ -134,23 +126,41 @@ struct device *get_npe_by_id(int id) + &id, match_by_npeid); + } + +-static int store_npe_image(struct dl_image *image, struct device *dev) ++int store_npe_image(struct dl_image *image, struct device *dev) + { + struct dl_block *blk; + struct dl_codeblock *cb; + struct npe_info *npe; +- int ret=0; ++ int ret = 0; ++ u16 crc; + + if (!dev) { +- dev = get_npe_by_id( (image->id >> 24) & 0xf); +- put_device(dev); ++ dev = get_npe_by_id(IMG_NPE(image->id)); ++ if (dev) ++ put_device(dev); ++ // XXX shouldn't this put_device be outside if(!dev) ? ++ else ++ printk(KERN_ERR "npe: cannot find npe for image %x\n", IMG_NPE(image->id)); + } ++ + if (!dev) + return -ENODEV; + ++ if (image->size > 24000) { // XXX fix max size ++ printk(KERN_ERR "npe: firmware too large\n"); ++ return -EFBIG; ++ } ++ ++ if (IMG_REV_MAJOR(image->id) != 2) { ++ printk(KERN_ERR "npe: only revision 2 is supported at this time\n"); ++ return -EINVAL; ++ } ++ ++ crc = crc16(0, (u8 *) image, IMG_SIZE(image)); ++ + npe = dev_get_drvdata(dev); + +- if ( npe_status(npe) & IX_NPEDL_EXCTL_STATUS_RUN) { ++ if (npe_status(npe) & IX_NPEDL_EXCTL_STATUS_RUN) { + printk(KERN_INFO "Cowardly refusing to reload an Image " + "into the running %s\n", npe->plat->name); + return 0; /* indicate success anyway... */ +@@ -173,9 +183,9 @@ static int store_npe_image(struct dl_ima + *(u32*)npe->img_info = cpu_to_be32(image->id); + npe_start(npe); + +- printk(KERN_INFO "Image loaded to %s Func:%x, Rel: %x:%x, Status: %x\n", ++ printk(KERN_INFO "npe: firmware loaded to %s, func: %02x, rev: %x.%x, status: %x, crc: %x\n", + npe->plat->name, npe->img_info[1], npe->img_info[2], +- npe->img_info[3], npe_status(npe)); ++ npe->img_info[3], npe_status(npe), crc); + return 0; + } + +@@ -265,8 +275,7 @@ static ssize_t ucode_write(struct file * + + static void npe_firmware_probe(struct device *dev) + { +-#if (defined(CONFIG_FW_LOADER) || defined(CONFIG_FW_LOADER_MODULE)) \ +- && defined(MODULE) ++#ifdef CONFIG_IXP4XX_NPE_FW_LOADER + const struct firmware *fw_entry; + struct npe_info *npe = dev_get_drvdata(dev); + struct dl_image *image; +@@ -388,7 +397,7 @@ static int npe_probe(struct platform_dev + + npe->plat = plat; + disable_npe_irq(npe); +- if (! (npe_status(npe) & IX_NPEDL_EXCTL_STATUS_RUN)) ++ if (!(npe_status(npe) & IX_NPEDL_EXCTL_STATUS_RUN)) + npe_firmware_probe(&pdev->dev); + + return 0; +@@ -464,3 +473,4 @@ MODULE_LICENSE("GPL"); + MODULE_AUTHOR("Christian Hohnstaedt "); + + EXPORT_SYMBOL(get_npe_by_id); ++EXPORT_SYMBOL(store_npe_image); +Index: linux-2.6.19/include/asm-arm/arch-ixp4xx/platform.h +=================================================================== +--- linux-2.6.19.orig/include/asm-arm/arch-ixp4xx/platform.h ++++ linux-2.6.19/include/asm-arm/arch-ixp4xx/platform.h +@@ -86,6 +86,20 @@ struct ixp4xx_i2c_pins { + unsigned long scl_pin; + }; + ++struct dl_block { ++ u32 type; ++ u32 offset; ++}; ++ ++struct dl_image { ++ u32 magic; ++ u32 id; ++ u32 size; ++ union { ++ u32 data[0]; ++ struct dl_block block[0]; ++ } u; ++}; + struct npe_plat_data { + const char *name; + int data_size; +@@ -103,6 +117,9 @@ struct mac_plat_info { + unsigned char hwaddr[6]; /* Desired hardware address */ + }; + ++struct npe_ucode_platform_data { ++ unsigned char *mtd_partition; ++}; + + struct sys_timer; + +Index: linux-2.6.19/include/linux/ixp_npe.h +=================================================================== +--- linux-2.6.19.orig/include/linux/ixp_npe.h ++++ linux-2.6.19/include/linux/ixp_npe.h +@@ -71,6 +71,7 @@ static inline u32 npe_read_ecs_reg(struc + } + + extern struct device *get_npe_by_id(int id); ++extern int store_npe_image(struct dl_image *image, struct device *dev); + + /* NPE Messages */ + extern int diff --git a/target/linux/ixp4xx-2.6/patches/141-nslu2_setup_mac.patch b/target/linux/ixp4xx-2.6/patches/141-nslu2_setup_mac.patch new file mode 100644 index 0000000000..932fa9d412 --- /dev/null +++ b/target/linux/ixp4xx-2.6/patches/141-nslu2_setup_mac.patch @@ -0,0 +1,41 @@ +Index: linux-2.6.19/arch/arm/mach-ixp4xx/nslu2-setup.c +=================================================================== +--- linux-2.6.19.orig/arch/arm/mach-ixp4xx/nslu2-setup.c ++++ linux-2.6.19/arch/arm/mach-ixp4xx/nslu2-setup.c +@@ -137,6 +137,28 @@ static struct platform_device nslu2_uart + .resource = nslu2_uart_resources, + }; + ++static struct resource res_mac0 = { ++ .start = IXP4XX_EthB_BASE_PHYS, ++ .end = IXP4XX_EthB_BASE_PHYS + 0x1ff, ++ .flags = IORESOURCE_MEM, ++}; ++ ++static struct mac_plat_info plat_mac0 = { ++ .npe_id = 1, ++ .phy_id = 1, ++ .eth_id = 0, ++ .rxq_id = 27, ++ .txq_id = 24, ++}; ++ ++static struct platform_device mac0 = { ++ .name = "ixp4xx_mac", ++ .id = 0, ++ .dev.platform_data = &plat_mac0, ++ .num_resources = 1, ++ .resource = &res_mac0, ++}; ++ + static struct platform_device *nslu2_devices[] __initdata = { + &nslu2_i2c_controller, + &nslu2_flash, +@@ -144,6 +166,7 @@ static struct platform_device *nslu2_dev + #ifdef CONFIG_LEDS_IXP4XX + &nslu2_leds, + #endif ++ &mac0 + }; + + static void nslu2_power_off(void) diff --git a/target/linux/ixp4xx-2.6/patches/142-nas100d_setup_mac.patch b/target/linux/ixp4xx-2.6/patches/142-nas100d_setup_mac.patch new file mode 100644 index 0000000000..7c3e589c12 --- /dev/null +++ b/target/linux/ixp4xx-2.6/patches/142-nas100d_setup_mac.patch @@ -0,0 +1,40 @@ +Index: linux-2.6.19/arch/arm/mach-ixp4xx/nas100d-setup.c +=================================================================== +--- linux-2.6.19.orig/arch/arm/mach-ixp4xx/nas100d-setup.c ++++ linux-2.6.19/arch/arm/mach-ixp4xx/nas100d-setup.c +@@ -123,12 +123,35 @@ static struct platform_device nas100d_ua + .resource = nas100d_uart_resources, + }; + ++static struct resource res_mac0 = { ++ .start = IXP4XX_EthB_BASE_PHYS, ++ .end = IXP4XX_EthB_BASE_PHYS + 0x1ff, ++ .flags = IORESOURCE_MEM, ++}; ++ ++static struct mac_plat_info plat_mac0 = { ++ .npe_id = 1, ++ .phy_id = 0, ++ .eth_id = 0, ++ .rxq_id = 27, ++ .txq_id = 24, ++}; ++ ++static struct platform_device mac0 = { ++ .name = "ixp4xx_mac", ++ .id = 0, ++ .dev.platform_data = &plat_mac0, ++ .num_resources = 1, ++ .resource = &res_mac0, ++}; ++ + static struct platform_device *nas100d_devices[] __initdata = { + &nas100d_i2c_controller, + &nas100d_flash, + #ifdef CONFIG_LEDS_IXP4XX + &nas100d_leds, + #endif ++ &mac0 + }; + + static void nas100d_power_off(void) diff --git a/target/linux/ixp4xx-2.6/patches/143-nslu2_mtd_microcode.patch b/target/linux/ixp4xx-2.6/patches/143-nslu2_mtd_microcode.patch new file mode 100644 index 0000000000..adf91891f8 --- /dev/null +++ b/target/linux/ixp4xx-2.6/patches/143-nslu2_mtd_microcode.patch @@ -0,0 +1,35 @@ +--- + arch/arm/mach-ixp4xx/nslu2-setup.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +Index: linux-2.6.19/arch/arm/mach-ixp4xx/nslu2-setup.c +=================================================================== +--- linux-2.6.19.orig/arch/arm/mach-ixp4xx/nslu2-setup.c ++++ linux-2.6.19/arch/arm/mach-ixp4xx/nslu2-setup.c +@@ -159,6 +159,16 @@ static struct platform_device mac0 = { + .resource = &res_mac0, + }; + ++struct npe_ucode_platform_data nslu2_npe_ucode_data = { ++ .mtd_partition = "FIS directory", ++}; ++ ++static struct platform_device nslu2_npe_ucode = { ++ .name = "ixp4xx_npe_ucode", ++ .id = 0, ++ .dev.platform_data = &nslu2_npe_ucode_data, ++}; ++ + static struct platform_device *nslu2_devices[] __initdata = { + &nslu2_i2c_controller, + &nslu2_flash, +@@ -166,7 +176,8 @@ static struct platform_device *nslu2_dev + #ifdef CONFIG_LEDS_IXP4XX + &nslu2_leds, + #endif +- &mac0 ++ &mac0, ++ &nslu2_npe_ucode, + }; + + static void nslu2_power_off(void) diff --git a/target/linux/ixp4xx-2.6/patches/144-nas100d_mtd_microcode.patch b/target/linux/ixp4xx-2.6/patches/144-nas100d_mtd_microcode.patch new file mode 100644 index 0000000000..104f757a8a --- /dev/null +++ b/target/linux/ixp4xx-2.6/patches/144-nas100d_mtd_microcode.patch @@ -0,0 +1,34 @@ +--- + arch/arm/mach-ixp4xx/nas100d-setup.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +Index: linux-2.6.19/arch/arm/mach-ixp4xx/nas100d-setup.c +=================================================================== +--- linux-2.6.19.orig/arch/arm/mach-ixp4xx/nas100d-setup.c ++++ linux-2.6.19/arch/arm/mach-ixp4xx/nas100d-setup.c +@@ -145,13 +145,24 @@ static struct platform_device mac0 = { + .resource = &res_mac0, + }; + ++struct npe_ucode_platform_data nas100d_npe_ucode_data = { ++ .mtd_partition = "sysconfig", ++}; ++ ++static struct platform_device nas100d_npe_ucode = { ++ .name = "ixp4xx_npe_ucode", ++ .id = 0, ++ .dev.platform_data = &nas100d_npe_ucode_data, ++}; ++ + static struct platform_device *nas100d_devices[] __initdata = { + &nas100d_i2c_controller, + &nas100d_flash, + #ifdef CONFIG_LEDS_IXP4XX + &nas100d_leds, + #endif +- &mac0 ++ &mac0, ++ &nas100d_npe_ucode, + }; + + static void nas100d_power_off(void) diff --git a/target/linux/ixp4xx-2.6/patches/152-nas100d-mtd_load_mac.patch b/target/linux/ixp4xx-2.6/patches/152-nas100d-mtd_load_mac.patch new file mode 100644 index 0000000000..37368861bd --- /dev/null +++ b/target/linux/ixp4xx-2.6/patches/152-nas100d-mtd_load_mac.patch @@ -0,0 +1,56 @@ +--- + arch/arm/mach-ixp4xx/nas100d-setup.c | 27 +++++++++++++++++++++++++++ + 1 file changed, 27 insertions(+) + +Index: linux-2.6.19/arch/arm/mach-ixp4xx/nas100d-setup.c +=================================================================== +--- linux-2.6.19.orig/arch/arm/mach-ixp4xx/nas100d-setup.c ++++ linux-2.6.19/arch/arm/mach-ixp4xx/nas100d-setup.c +@@ -16,6 +16,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -165,6 +166,30 @@ static struct platform_device *nas100d_d + &nas100d_npe_ucode, + }; + ++static void nas100d_flash_add(struct mtd_info *mtd) ++{ ++ if (strcmp(mtd->name, "RedBoot config") == 0) { ++ size_t retlen; ++ u_char mac[6]; ++ ++ if (mtd->read(mtd, 0x0FD8, 6, &retlen, mac) == 0 && retlen == 6) { ++ printk(KERN_INFO "nas100d mac: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", ++ mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); ++ memcpy(plat_mac0.hwaddr, mac, 6); ++ } else { ++ printk(KERN_ERR "nas100d mac: read failed\n"); ++ } ++ } ++} ++ ++static void nas100d_flash_remove(struct mtd_info *mtd) { ++} ++ ++static struct mtd_notifier nas100d_flash_notifier = { ++ .add = nas100d_flash_add, ++ .remove = nas100d_flash_remove, ++}; ++ + static void nas100d_power_off(void) + { + /* This causes the box to drop the power and go dead. */ +@@ -196,6 +221,8 @@ static void __init nas100d_init(void) + (void)platform_device_register(&nas100d_uart); + + platform_add_devices(nas100d_devices, ARRAY_SIZE(nas100d_devices)); ++ ++ register_mtd_user(&nas100d_flash_notifier); + } + + MACHINE_START(NAS100D, "Iomega NAS 100d") diff --git a/target/linux/ixp4xx-2.6/patches/153-nslu2_mtd_load_mac.patch b/target/linux/ixp4xx-2.6/patches/153-nslu2_mtd_load_mac.patch new file mode 100644 index 0000000000..21fe29a88d --- /dev/null +++ b/target/linux/ixp4xx-2.6/patches/153-nslu2_mtd_load_mac.patch @@ -0,0 +1,56 @@ +--- + arch/arm/mach-ixp4xx/nslu2-setup.c | 27 +++++++++++++++++++++++++++ + 1 file changed, 27 insertions(+) + +Index: linux-2.6.19/arch/arm/mach-ixp4xx/nslu2-setup.c +=================================================================== +--- linux-2.6.19.orig/arch/arm/mach-ixp4xx/nslu2-setup.c ++++ linux-2.6.19/arch/arm/mach-ixp4xx/nslu2-setup.c +@@ -18,6 +18,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -180,6 +181,30 @@ static struct platform_device *nslu2_dev + &nslu2_npe_ucode, + }; + ++static void nslu2_flash_add(struct mtd_info *mtd) ++{ ++ if (strcmp(mtd->name, "RedBoot") == 0) { ++ size_t retlen; ++ u_char mac[6]; ++ ++ if (mtd->read(mtd, 0x3FFB0, 6, &retlen, mac) == 0 && retlen == 6) { ++ printk(KERN_INFO "nslu2 mac: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", ++ mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); ++ memcpy(plat_mac0.hwaddr, mac, 6); ++ } else { ++ printk(KERN_ERR "nslu2 mac: read failed\n"); ++ } ++ } ++} ++ ++static void nslu2_flash_remove(struct mtd_info *mtd) { ++} ++ ++static struct mtd_notifier nslu2_flash_notifier = { ++ .add = nslu2_flash_add, ++ .remove = nslu2_flash_remove, ++}; ++ + static void nslu2_power_off(void) + { + /* This causes the box to drop the power and go dead. */ +@@ -210,6 +235,8 @@ static void __init nslu2_init(void) + (void)platform_device_register(&nslu2_uart); + + platform_add_devices(nslu2_devices, ARRAY_SIZE(nslu2_devices)); ++ ++ register_mtd_user(&nslu2_flash_notifier); + } + + MACHINE_START(NSLU2, "Linksys NSLU2") diff --git a/target/linux/ixp4xx-2.6/patches/160-nas100d_artop_temp_fix.patch b/target/linux/ixp4xx-2.6/patches/160-nas100d_artop_temp_fix.patch new file mode 100644 index 0000000000..b7ac4d94c6 --- /dev/null +++ b/target/linux/ixp4xx-2.6/patches/160-nas100d_artop_temp_fix.patch @@ -0,0 +1,49 @@ +From: Alan Cox +To: Alessandro Zummo +Cc: Jeff Garzik , Alan Cox +Subject: Re: drivers/ata/pata_artop.c +Date: Sun, 15 Oct 2006 14:25:16 -0400 +User-Agent: Mutt/1.4.1i + +On Sun, Oct 15, 2006 at 07:18:31PM +0200, Alessandro Zummo wrote: +> In the discovery phase there's a lot of time spent in the detection +> of the second port. + +The error recovery is a bit determined right now - Tejun's been doing some +work on SRST behaviour and also for the worst cases polled detect so it +should come out ok + +> What's the correct way to inform the driver +> to avoid checking the second port? + +Set the number of ports to 1 in your own tree for now. The real fix is +not to go poking at pata ports if the ret is 0xFF + +--- + drivers/ata/pata_artop.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +Index: linux-2.6.19/drivers/ata/pata_artop.c +=================================================================== +--- linux-2.6.19.orig/drivers/ata/pata_artop.c ++++ linux-2.6.19/drivers/ata/pata_artop.c +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + + #define DRV_NAME "pata_artop" + #define DRV_VERSION "0.4.2" +@@ -469,6 +470,11 @@ static int artop_init_one (struct pci_de + pci_read_config_byte(pdev, 0x4a, ®); + pci_write_config_byte(pdev, 0x4a, (reg & ~0x01) | 0x80); + ++ /* NAS100D workaround */ ++#ifdef CONFIG_MACH_NAS100D ++ if (machine_is_nas100d()) ++ ports = 1; ++#endif + } + + BUG_ON(info == NULL); diff --git a/target/linux/ixp4xx-2.6/patches/185-nslu2_rtc_fixup.patch b/target/linux/ixp4xx-2.6/patches/185-nslu2_rtc_fixup.patch new file mode 100644 index 0000000000..2c379d2648 --- /dev/null +++ b/target/linux/ixp4xx-2.6/patches/185-nslu2_rtc_fixup.patch @@ -0,0 +1,54 @@ +Index: linux-2.6.19/arch/arm/mach-ixp4xx/nslu2-setup.c +=================================================================== +--- linux-2.6.19.orig/arch/arm/mach-ixp4xx/nslu2-setup.c ++++ linux-2.6.19/arch/arm/mach-ixp4xx/nslu2-setup.c +@@ -20,6 +20,7 @@ + #include + #include + ++#include + #include + #include + #include +@@ -239,11 +240,41 @@ static void __init nslu2_init(void) + register_mtd_user(&nslu2_flash_notifier); + } + ++static char nslu2_rtc_probe[] __initdata = "rtc-x1205.probe=0,0x6f "; ++ ++static void __init nslu2_fixup(struct machine_desc *desc, ++ struct tag *tags, char **cmdline, struct meminfo *mi) ++{ ++ struct tag *t = tags; ++ char *p = *cmdline; ++ ++ /* Find the end of the tags table, taking note of any cmdline tag. */ ++ for (; t->hdr.size; t = tag_next(t)) { ++ if (t->hdr.tag == ATAG_CMDLINE) { ++ p = t->u.cmdline.cmdline; ++ } ++ } ++ ++ /* Overwrite the end of the table with a new cmdline tag. */ ++ t->hdr.tag = ATAG_CMDLINE; ++ t->hdr.size = (sizeof (struct tag_header) + ++ strlen(nslu2_rtc_probe) + strlen(p) + 1 + 4) >> 2; ++ strlcpy(t->u.cmdline.cmdline, nslu2_rtc_probe, COMMAND_LINE_SIZE); ++ strlcpy(t->u.cmdline.cmdline + strlen(nslu2_rtc_probe), p, ++ COMMAND_LINE_SIZE - strlen(nslu2_rtc_probe)); ++ ++ /* Terminate the table. */ ++ t = tag_next(t); ++ t->hdr.tag = ATAG_NONE; ++ t->hdr.size = 0; ++} ++ + MACHINE_START(NSLU2, "Linksys NSLU2") + /* Maintainer: www.nslu2-linux.org */ + .phys_io = IXP4XX_PERIPHERAL_BASE_PHYS, + .io_pg_offst = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xFFFC, + .boot_params = 0x00000100, ++ .fixup = nslu2_fixup, + .map_io = ixp4xx_map_io, + .init_irq = ixp4xx_init_irq, + .timer = &ixp4xx_timer, diff --git a/target/linux/ixp4xx-2.6/patches/186-nas100d_rtc_fixup.patch b/target/linux/ixp4xx-2.6/patches/186-nas100d_rtc_fixup.patch new file mode 100644 index 0000000000..f594802d2f --- /dev/null +++ b/target/linux/ixp4xx-2.6/patches/186-nas100d_rtc_fixup.patch @@ -0,0 +1,55 @@ +Index: linux-2.6.19/arch/arm/mach-ixp4xx/nas100d-setup.c +=================================================================== +--- linux-2.6.19.orig/arch/arm/mach-ixp4xx/nas100d-setup.c ++++ linux-2.6.19/arch/arm/mach-ixp4xx/nas100d-setup.c +@@ -18,6 +18,7 @@ + #include + #include + ++#include + #include + #include + #include +@@ -225,11 +226,42 @@ static void __init nas100d_init(void) + register_mtd_user(&nas100d_flash_notifier); + } + ++static char nas100d_rtc_probe[] __initdata = "rtc-pcf8563.probe=0,0x51 "; ++ ++static void __init nas100d_fixup(struct machine_desc *desc, ++ struct tag *tags, char **cmdline, struct meminfo *mi) ++{ ++ struct tag *t = tags; ++ char *p = *cmdline; ++ ++ /* Find the end of the tags table, taking note of any cmdline tag. */ ++ for (; t->hdr.size; t = tag_next(t)) { ++ if (t->hdr.tag == ATAG_CMDLINE) { ++ p = t->u.cmdline.cmdline; ++ } ++ } ++ ++ /* Overwrite the end of the table with a new cmdline tag. */ ++ t->hdr.tag = ATAG_CMDLINE; ++ t->hdr.size = ++ (sizeof (struct tag_header) + ++ strlen(nas100d_rtc_probe) + strlen(p) + 1 + 4) >> 2; ++ strlcpy(t->u.cmdline.cmdline, nas100d_rtc_probe, COMMAND_LINE_SIZE); ++ strlcpy(t->u.cmdline.cmdline + strlen(nas100d_rtc_probe), p, ++ COMMAND_LINE_SIZE - strlen(nas100d_rtc_probe)); ++ ++ /* Terminate the table. */ ++ t = tag_next(t); ++ t->hdr.tag = ATAG_NONE; ++ t->hdr.size = 0; ++} ++ + MACHINE_START(NAS100D, "Iomega NAS 100d") + /* Maintainer: www.nslu2-linux.org */ + .phys_io = IXP4XX_PERIPHERAL_BASE_PHYS, + .io_pg_offst = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xFFFC, + .boot_params = 0x00000100, ++ .fixup = nas100d_fixup, + .map_io = ixp4xx_map_io, + .init_irq = ixp4xx_init_irq, + .timer = &ixp4xx_timer,