diff options
12 files changed, 930 insertions, 0 deletions
| 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 000000000..f6ea98bbd --- /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 <rod@whitby.id.au> + +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 000000000..a808e4dfa --- /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 000000000..532c80080 --- /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 <chohnstaedt@innominate.com> ++ * ++ * This file is released under the GPLv2 ++ */ ++ ++#include <linux/kernel.h> ++#include <linux/platform_device.h> ++#include <linux/init.h> ++#include <linux/slab.h> ++#include <linux/firmware.h> ++#include <linux/mtd/mtd.h> ++ ++#include <linux/ixp_npe.h> ++ ++#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 <a.zummo@towertech.it>"); +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 <linux/firmware.h> + #include <linux/dma-mapping.h> + #include <linux/byteorder/swab.h> ++#include <linux/crc16.h> + #include <asm/uaccess.h> + #include <asm/io.h> +  +@@ -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 <chohnstaedt@innominate.com>"); +  + 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 000000000..932fa9d41 --- /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 000000000..7c3e589c1 --- /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 000000000..adf91891f --- /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 000000000..104f757a8 --- /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 000000000..37368861b --- /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 <linux/serial.h> + #include <linux/serial_8250.h> + #include <linux/leds.h> ++#include <linux/mtd/mtd.h> +  + #include <asm/mach-types.h> + #include <asm/mach/arch.h> +@@ -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 000000000..21fe29a88 --- /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 <linux/serial.h> + #include <linux/serial_8250.h> + #include <linux/leds.h> ++#include <linux/mtd/mtd.h> +  + #include <asm/mach-types.h> + #include <asm/mach/arch.h> +@@ -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 000000000..b7ac4d94c --- /dev/null +++ b/target/linux/ixp4xx-2.6/patches/160-nas100d_artop_temp_fix.patch @@ -0,0 +1,49 @@ +From: Alan Cox <alan@redhat.com> +To: Alessandro Zummo <alessandro.zummo@towertech.it> +Cc: Jeff Garzik <jgarzik@redhat.com>, Alan Cox <alan@redhat.com> +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 <scsi/scsi_host.h> + #include <linux/libata.h> + #include <linux/ata.h> ++#include <asm/mach-types.h> +  + #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 000000000..2c379d264 --- /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 <linux/leds.h> + #include <linux/mtd/mtd.h> +  ++#include <asm/setup.h> + #include <asm/mach-types.h> + #include <asm/mach/arch.h> + #include <asm/mach/flash.h> +@@ -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 000000000..f594802d2 --- /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 <linux/leds.h> + #include <linux/mtd/mtd.h> +  ++#include <asm/setup.h> + #include <asm/mach-types.h> + #include <asm/mach/arch.h> + #include <asm/mach/flash.h> +@@ -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, | 
