diff options
Diffstat (limited to 'packages/linux/openslug-kernel-2.6.11.2')
7 files changed, 453 insertions, 0 deletions
diff --git a/packages/linux/openslug-kernel-2.6.11.2/.mtn2git_empty b/packages/linux/openslug-kernel-2.6.11.2/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/linux/openslug-kernel-2.6.11.2/.mtn2git_empty diff --git a/packages/linux/openslug-kernel-2.6.11.2/ixp4xx_copy_from.patch b/packages/linux/openslug-kernel-2.6.11.2/ixp4xx_copy_from.patch index e69de29bb2..8d0f187d44 100644 --- a/packages/linux/openslug-kernel-2.6.11.2/ixp4xx_copy_from.patch +++ b/packages/linux/openslug-kernel-2.6.11.2/ixp4xx_copy_from.patch @@ -0,0 +1,27 @@ +--- linux-2.6.11/drivers/mtd/maps/ixp4xx.c.orig 2005-03-05 20:00:28.000000000 +0100 ++++ linux-2.6.11/drivers/mtd/maps/ixp4xx.c 2005-03-05 22:10:48.000000000 +0100 +@@ -29,6 +29,8 @@ + #include <asm/mach-types.h> + #include <asm/mach/flash.h> + ++#include <asm/unaligned.h> ++ + #include <linux/reboot.h> + + #ifndef __ARMEB__ +@@ -60,13 +62,13 @@ static void ixp4xx_copy_from(struct map_ + u16 data; + + for (i = 0; i < (len / 2); i++) { +- data = src[i]; ++ data = get_unaligned((u16*)(src + i)); + dest[i * 2] = BYTE0(data); + dest[i * 2 + 1] = BYTE1(data); + } + + if (len & 1) +- dest[len - 1] = BYTE0(src[i]); ++ dest[len - 1] = BYTE0(get_unaligned((u16*)(src + i))); + } + + /* diff --git a/packages/linux/openslug-kernel-2.6.11.2/nslu2-part.c b/packages/linux/openslug-kernel-2.6.11.2/nslu2-part.c index e69de29bb2..6fbf952e2a 100644 --- a/packages/linux/openslug-kernel-2.6.11.2/nslu2-part.c +++ b/packages/linux/openslug-kernel-2.6.11.2/nslu2-part.c @@ -0,0 +1,120 @@ +/* + * nslu2-part.c + * + * Maintainers: http://www.nslu2-linux.org/ + * Initial port: Mark Rakes <mrakes AT mac.com> + * + * "Parse" the fixed partition table of the Linksys NSLU2 and + * produce a Linux partition array to match. + */ + +#include <linux/kernel.h> +#include <linux/slab.h> +#include <linux/init.h> +#include <linux/vmalloc.h> +#include <linux/mtd/mtd.h> +#include <linux/mtd/partitions.h> + +/* info we know about the NSLU2's flash setup: + * + * Num Partition offset size + * --- --------- ---------- ----------- + * 0 RedBoot 0x00000000 0x00040000 + * 1 System Configuration 0x00040000 0x00020000 + * 2 Kernel 0x00060000 0x00100000 + * 3 Ramdisk 0x00160000 0x006a0000 + */ + #define NSLU2_NUM_FLASH_PARTITIONS 4 + #define NSLU2_FLASH_PART0_NAME "RedBoot" + #define NSLU2_FLASH_PART0_OFFSET 0x00000000 + #define NSLU2_FLASH_PART0_SIZE 0x00040000 + #define NSLU2_FLASH_PART1_NAME "System Configuration" + #define NSLU2_FLASH_PART1_OFFSET (NSLU2_FLASH_PART0_OFFSET + NSLU2_FLASH_PART0_SIZE) + #define NSLU2_FLASH_PART1_SIZE 0x00020000 + #define NSLU2_FLASH_PART2_NAME "Kernel" + #define NSLU2_FLASH_PART2_OFFSET (NSLU2_FLASH_PART1_OFFSET + NSLU2_FLASH_PART1_SIZE) + #define NSLU2_FLASH_PART2_SIZE 0x00100000 + #define NSLU2_FLASH_PART3_NAME "Ramdisk" + #define NSLU2_FLASH_PART3_OFFSET (NSLU2_FLASH_PART2_OFFSET + NSLU2_FLASH_PART2_SIZE) + #define NSLU2_FLASH_PART3_SIZE 0x006a0000 + +static int parse_nslu2_partitions(struct mtd_info *master, + struct mtd_partition **pparts, + unsigned long flash_start) +{ + struct mtd_partition *parts; + int ret = 0, namelen = 0; + char *names; + + namelen = strlen(NSLU2_FLASH_PART0_NAME) + + strlen(NSLU2_FLASH_PART1_NAME) + + strlen(NSLU2_FLASH_PART2_NAME) + + strlen(NSLU2_FLASH_PART3_NAME) + + NSLU2_NUM_FLASH_PARTITIONS; /*4 strings + each terminator */ + + parts = kmalloc(sizeof(*parts)*NSLU2_NUM_FLASH_PARTITIONS + namelen, GFP_KERNEL); + if (!parts) { + ret = -ENOMEM; + goto out; + } + + memset(parts, 0, sizeof(*parts)*NSLU2_NUM_FLASH_PARTITIONS + namelen); + names = (char *)&parts[NSLU2_NUM_FLASH_PARTITIONS]; + + /* RedBoot partition */ + parts[0].size = NSLU2_FLASH_PART0_SIZE; + parts[0].offset = NSLU2_FLASH_PART0_OFFSET; + parts[0].name = NSLU2_FLASH_PART0_NAME; + parts[0].mask_flags = MTD_WRITEABLE; /* readonly */ + strcpy(names, NSLU2_FLASH_PART0_NAME); + names += strlen(names)+1; + /* System Configuration */ + parts[1].size = NSLU2_FLASH_PART1_SIZE; + parts[1].offset = NSLU2_FLASH_PART1_OFFSET; + parts[1].name = NSLU2_FLASH_PART1_NAME; + parts[1].mask_flags = MTD_WRITEABLE; /* readonly */ + strcpy(names, NSLU2_FLASH_PART1_NAME); + names += strlen(names)+1; + /* Kernel */ + parts[2].size = NSLU2_FLASH_PART2_SIZE; + parts[2].offset = NSLU2_FLASH_PART2_OFFSET; + parts[2].name = NSLU2_FLASH_PART2_NAME; + parts[2].mask_flags = MTD_WRITEABLE; /* readonly */ + strcpy(names, NSLU2_FLASH_PART2_NAME); + names += strlen(names)+1; + /* Ramdisk */ + parts[3].size = NSLU2_FLASH_PART3_SIZE; + parts[3].offset = NSLU2_FLASH_PART3_OFFSET; + parts[3].name = NSLU2_FLASH_PART3_NAME; + parts[3].mask_flags = MTD_WRITEABLE; /* readonly */ + strcpy(names, NSLU2_FLASH_PART3_NAME); + names += strlen(names)+1; + + ret = NSLU2_NUM_FLASH_PARTITIONS; + *pparts = parts; + out: + return ret; +} + +static struct mtd_part_parser nslu2_parser = { + .owner = THIS_MODULE, + .parse_fn = parse_nslu2_partitions, + .name = "NSLU2", +}; + +static int __init nslu2_parser_init(void) +{ + return register_mtd_parser(&nslu2_parser); +} + +static void __exit nslu2_parser_exit(void) +{ + deregister_mtd_parser(&nslu2_parser); +} + +module_init(nslu2_parser_init); +module_exit(nslu2_parser_exit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Mark Rakes"); +MODULE_DESCRIPTION("Parsing code for NSLU2 flash tables"); diff --git a/packages/linux/openslug-kernel-2.6.11.2/nslu2-pci.c b/packages/linux/openslug-kernel-2.6.11.2/nslu2-pci.c index e69de29bb2..7327c65a4f 100644 --- a/packages/linux/openslug-kernel-2.6.11.2/nslu2-pci.c +++ b/packages/linux/openslug-kernel-2.6.11.2/nslu2-pci.c @@ -0,0 +1,87 @@ +/* + * arch/arm/mach-ixp4xx/nslu2-pci.c + * + * NSLU2 board-level PCI initialization + * + * based on ixdp425-pci.c: + * Copyright (C) 2002 Intel Corporation. + * Copyright (C) 2003-2004 MontaVista Software, Inc. + * + * Maintainer: http://www.nslu2-linux.org/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ +// GPIO 8 is used as the power input so is not free for use as a PCI IRQ +// However, all the common PCI setup code presumes the standard 4 PCI +// interrupts are available. So we compromise...we don't enable the +// IRQ on Pin 8 but we let + +#include <linux/config.h> +#include <linux/pci.h> +#include <linux/init.h> +#include <linux/delay.h> + +#include <asm/mach/pci.h> +#include <asm/irq.h> +#include <asm/hardware.h> +#include <asm/mach-types.h> + +void __init nslu2_pci_preinit(void) +{ + gpio_line_config(NSLU2_PCI_INTA_PIN, + IXP4XX_GPIO_IN | IXP4XX_GPIO_ACTIVE_LOW); + gpio_line_config(NSLU2_PCI_INTB_PIN, + IXP4XX_GPIO_IN | IXP4XX_GPIO_ACTIVE_LOW); + gpio_line_config(NSLU2_PCI_INTC_PIN, + IXP4XX_GPIO_IN | IXP4XX_GPIO_ACTIVE_LOW); +// gpio_line_config(NSLU2_PCI_INTD_PIN, +// IXP4XX_GPIO_IN | IXP4XX_GPIO_ACTIVE_LOW); + + gpio_line_isr_clear(NSLU2_PCI_INTA_PIN); + gpio_line_isr_clear(NSLU2_PCI_INTB_PIN); + gpio_line_isr_clear(NSLU2_PCI_INTC_PIN); +// gpio_line_isr_clear(NSLU2_PCI_INTD_PIN); + + ixp4xx_pci_preinit(); +} + +static int __init nslu2_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +{ + static int pci_irq_table[NSLU2_PCI_IRQ_LINES] = { + IRQ_NSLU2_PCI_INTA, + IRQ_NSLU2_PCI_INTB, + IRQ_NSLU2_PCI_INTC, +// IRQ_NSLU2_PCI_INTD + }; + + int irq = -1; + + if (slot >= 1 && slot <= NSLU2_PCI_MAX_DEV && + pin >= 1 && pin <= NSLU2_PCI_IRQ_LINES) { + irq = pci_irq_table[(slot + pin - 2) % 3]; // ! % 4 kas11 + } + + return irq; +} + +struct hw_pci __initdata nslu2_pci = { + .nr_controllers = 1, + .preinit = nslu2_pci_preinit, + .swizzle = pci_std_swizzle, + .setup = ixp4xx_setup, + .scan = ixp4xx_scan_bus, + .map_irq = nslu2_map_irq, +}; + +int __init nslu2_pci_init(void) //monkey see, monkey do +{ + if (machine_is_nslu2()) + pci_common_init(&nslu2_pci); + return 0; +} + +subsys_initcall(nslu2_pci_init); + diff --git a/packages/linux/openslug-kernel-2.6.11.2/nslu2.h b/packages/linux/openslug-kernel-2.6.11.2/nslu2.h index e69de29bb2..bb79aaa007 100644 --- a/packages/linux/openslug-kernel-2.6.11.2/nslu2.h +++ b/packages/linux/openslug-kernel-2.6.11.2/nslu2.h @@ -0,0 +1,43 @@ +/* + * include/asm-arm/arch-ixp4xx/nslu2.h + * + * NSLU2 platform specific definitions + * + * Author: Mark Rakes <mrakes AT mac.com> + * Maintainers: http://www.nslu2-linux.org + * + * based on ixdp425.h: + * Copyright 2004 (c) MontaVista, Software, Inc. + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +// GPIO 8 is used as the power input so is not free for use as a PCI IRQ +// kas11 11-2-04 + +#ifndef __ASM_ARCH_HARDWARE_H__ +#error "Do not include this directly, instead #include <asm/hardware.h>" +#endif + +#define NSLU2_FLASH_BASE IXP4XX_EXP_BUS_CS0_BASE_PHYS +#define NSLU2_FLASH_SIZE IXP4XX_EXP_BUS_CSX_REGION_SIZE + +#define NSLU2_SDA_PIN 7 +#define NSLU2_SCL_PIN 6 + +/* + * NSLU2 PCI IRQs + */ +#define NSLU2_PCI_MAX_DEV 3 +#define NSLU2_PCI_IRQ_LINES 3 + + +/* PCI controller GPIO to IRQ pin mappings */ +#define NSLU2_PCI_INTA_PIN 11 +#define NSLU2_PCI_INTB_PIN 10 +#define NSLU2_PCI_INTC_PIN 9 +//#define NSLU2_PCI_INTD_PIN 8 + + diff --git a/packages/linux/openslug-kernel-2.6.11.2/nslu2_2.6.11.patch b/packages/linux/openslug-kernel-2.6.11.2/nslu2_2.6.11.patch index e69de29bb2..bff8400396 100644 --- a/packages/linux/openslug-kernel-2.6.11.2/nslu2_2.6.11.patch +++ b/packages/linux/openslug-kernel-2.6.11.2/nslu2_2.6.11.patch @@ -0,0 +1,159 @@ +diff -urN linux-2.6.11.orig/arch/arm/boot/compressed/head.S linux-2.6.11/arch/arm/boot/compressed/head.S +--- linux-2.6.11.orig/arch/arm/boot/compressed/head.S 2005-03-01 21:38:25.000000000 -1000 ++++ linux-2.6.11/arch/arm/boot/compressed/head.S 2005-03-03 00:55:05.000000000 -1000 +@@ -79,6 +79,14 @@ + .endm + .macro writeb, rb + str \rb, [r3, #0] ++ .endm ++#elif defined(CONFIG_ARCH_NSLU2) ++ .macro loadsp, rb ++ mov \rb, #0xc8000000 ++ .endm ++ .macro writeb, rb ++ str \rb, [r3, #0] ++ .endm + #elif defined(CONFIG_ARCH_IXP2000) + .macro loadsp, rb + mov \rb, #0xc0000000 +diff -urN linux-2.6.11.orig/arch/arm/boot/compressed/head-xscale.S linux-2.6.11/arch/arm/boot/compressed/head-xscale.S +--- linux-2.6.11.orig/arch/arm/boot/compressed/head-xscale.S 2005-03-01 21:37:52.000000000 -1000 ++++ linux-2.6.11/arch/arm/boot/compressed/head-xscale.S 2005-03-02 01:41:31.000000000 -1000 +@@ -47,3 +47,8 @@ + orr r7, r7, #(MACH_TYPE_GTWX5715 & 0xff00) + #endif + ++#ifdef CONFIG_ARCH_NSLU2 ++ mov r7, #(MACH_TYPE_NSLU2 & 0xff) ++ orr r7, r7, #(MACH_TYPE_NSLU2 & 0xff00) ++#endif ++ +diff -urN linux-2.6.11.orig/arch/arm/mach-ixp4xx/Kconfig linux-2.6.11/arch/arm/mach-ixp4xx/Kconfig +--- linux-2.6.11.orig/arch/arm/mach-ixp4xx/Kconfig 2005-03-01 21:37:49.000000000 -1000 ++++ linux-2.6.11/arch/arm/mach-ixp4xx/Kconfig 2005-03-02 01:43:42.000000000 -1000 +@@ -43,6 +43,12 @@ + IXDP465 Development Platform (Also known as BMP). + For more information on this platform, see Documentation/arm/IXP4xx. + ++config ARCH_NSLU2 ++ bool "NSLU2" ++ help ++ Say 'Y' here if you want your kernel to support Linksys's ++ NSLU2 NAS device. For more information on this platform, ++ see http://www.nslu2-linux.org + + # + # IXCDP1100 is the exact same HW as IXDP425, but with a different machine +diff -urN linux-2.6.11.orig/arch/arm/mach-ixp4xx/Makefile linux-2.6.11/arch/arm/mach-ixp4xx/Makefile +--- linux-2.6.11.orig/arch/arm/mach-ixp4xx/Makefile 2005-03-01 21:37:49.000000000 -1000 ++++ linux-2.6.11/arch/arm/mach-ixp4xx/Makefile 2005-03-02 01:44:16.000000000 -1000 +@@ -9,4 +9,4 @@ + obj-$(CONFIG_ARCH_ADI_COYOTE) += coyote-pci.o coyote-setup.o + obj-$(CONFIG_ARCH_PRPMC1100) += prpmc1100-pci.o prpmc1100-setup.o + obj-$(CONFIG_MACH_GTWX5715) += gtwx5715-pci.o gtwx5715-setup.o +- ++obj-$(CONFIG_ARCH_NSLU2) += nslu2-pci.o nslu2-setup.o nslu2-part.o nslu2-io.o +diff -urN linux-2.6.11.orig/arch/arm/tools/mach-types linux-2.6.11/arch/arm/tools/mach-types +--- linux-2.6.11.orig/arch/arm/tools/mach-types 2005-03-01 21:38:08.000000000 -1000 ++++ linux-2.6.11/arch/arm/tools/mach-types 2005-03-02 01:44:50.000000000 -1000 +@@ -604,7 +604,7 @@ + roverp7 MACH_ROVERP7 ROVERP7 594 + pr818s MACH_PR818S PR818S 595 + trxpro MACH_TRXPRO TRXPRO 596 +-nslu2 MACH_NSLU2 NSLU2 597 ++nslu2 ARCH_NSLU2 NSLU2 597 + e400 MACH_E400 E400 598 + trab MACH_TRAB TRAB 599 + cmc_pu2 MACH_CMC_PU2 CMC_PU2 600 +diff -urN linux-2.6.11.orig/drivers/i2c/chips/Kconfig linux-2.6.11/drivers/i2c/chips/Kconfig +--- linux-2.6.11.orig/drivers/i2c/chips/Kconfig 2005-03-01 21:38:10.000000000 -1000 ++++ linux-2.6.11/drivers/i2c/chips/Kconfig 2005-03-02 01:45:28.000000000 -1000 +@@ -370,5 +370,14 @@ + + This driver can also be built as a module. If so, the module + will be called isp1301_omap. ++config SENSORS_X1205 ++ tristate "Xicor X1205 RTC chip" ++ depends on I2C && EXPERIMENTAL ++ select I2C_SENSOR ++ help ++ If you say yes here you get support for the Xicor x1205 RTC chip. ++ ++ This driver can also be built as a module. If so, the module ++ will be called x1205-rtc + + endmenu +diff -urN linux-2.6.11.orig/drivers/i2c/chips/Makefile linux-2.6.11/drivers/i2c/chips/Makefile +--- linux-2.6.11.orig/drivers/i2c/chips/Makefile 2005-03-01 21:38:34.000000000 -1000 ++++ linux-2.6.11/drivers/i2c/chips/Makefile 2005-03-02 01:45:54.000000000 -1000 +@@ -35,6 +35,7 @@ + obj-$(CONFIG_SENSORS_VIA686A) += via686a.o + obj-$(CONFIG_SENSORS_W83L785TS) += w83l785ts.o + obj-$(CONFIG_ISP1301_OMAP) += isp1301_omap.o ++obj-$(CONFIG_SENSORS_X1205) += x1205-rtc.o + + ifeq ($(CONFIG_I2C_DEBUG_CHIP),y) + EXTRA_CFLAGS += -DDEBUG +diff -urN linux-2.6.11.orig/drivers/mtd/maps/ixp4xx.c linux-2.6.11/drivers/mtd/maps/ixp4xx.c +--- linux-2.6.11.orig/drivers/mtd/maps/ixp4xx.c 2005-03-01 21:37:30.000000000 -1000 ++++ linux-2.6.11/drivers/mtd/maps/ixp4xx.c 2005-03-02 01:46:40.000000000 -1000 +@@ -94,7 +94,11 @@ + struct resource *res; + }; + ++#ifdef CONFIG_ARCH_NSLU2 ++static const char *probes[] = { "cmdlinepart", "RedBoot", "NSLU2", NULL }; ++#else + static const char *probes[] = { "RedBoot", "cmdlinepart", NULL }; ++#endif + + static int ixp4xx_flash_remove(struct device *_dev) + { +diff -urN linux-2.6.11.orig/include/asm-arm/arch-ixp4xx/hardware.h linux-2.6.11/include/asm-arm/arch-ixp4xx/hardware.h +--- linux-2.6.11.orig/include/asm-arm/arch-ixp4xx/hardware.h 2005-03-01 21:37:51.000000000 -1000 ++++ linux-2.6.11/include/asm-arm/arch-ixp4xx/hardware.h 2005-03-02 17:34:46.000000000 -1000 +@@ -44,5 +44,6 @@ + #include "ixdp425.h" + #include "coyote.h" + #include "prpmc1100.h" ++#include "nslu2.h" + + #endif /* _ASM_ARCH_HARDWARE_H */ +diff -urN linux-2.6.11.orig/include/asm-arm/arch-ixp4xx/irqs.h linux-2.6.11/include/asm-arm/arch-ixp4xx/irqs.h +--- linux-2.6.11.orig/include/asm-arm/arch-ixp4xx/irqs.h 2005-03-01 21:38:12.000000000 -1000 ++++ linux-2.6.11/include/asm-arm/arch-ixp4xx/irqs.h 2005-03-02 01:49:27.000000000 -1000 +@@ -93,4 +93,11 @@ + #define IRQ_COYOTE_PCI_SLOT1 IRQ_IXP4XX_GPIO11 + #define IRQ_COYOTE_IDE IRQ_IXP4XX_GPIO5 + ++/* ++ * NSLU2 board IRQs ++ */ ++#define IRQ_NSLU2_PCI_INTA IRQ_IXP4XX_GPIO11 ++#define IRQ_NSLU2_PCI_INTB IRQ_IXP4XX_GPIO10 ++#define IRQ_NSLU2_PCI_INTC IRQ_IXP4XX_GPIO9 ++ + #endif +diff -urN linux-2.6.11.orig/include/asm-arm/arch-ixp4xx/ixp4xx-regs.h linux-2.6.11/include/asm-arm/arch-ixp4xx/ixp4xx-regs.h +--- linux-2.6.11.orig/include/asm-arm/arch-ixp4xx/ixp4xx-regs.h 2005-03-01 21:37:49.000000000 -1000 ++++ linux-2.6.11/include/asm-arm/arch-ixp4xx/ixp4xx-regs.h 2005-03-03 02:26:29.231822000 -1000 +@@ -52,7 +52,7 @@ + * Expansion BUS Configuration registers + */ + #define IXP4XX_EXP_CFG_BASE_PHYS (0xC4000000) +-#define IXP4XX_EXP_CFG_BASE_VIRT (0xFFBFD000) ++#define IXP4XX_EXP_CFG_BASE_VIRT (0xFFBFE000) + #define IXP4XX_EXP_CFG_REGION_SIZE (0x00001000) + + /* +diff -urN linux-2.6.11.orig/include/linux/i2c-id.h linux-2.6.11/include/linux/i2c-id.h +--- linux-2.6.11.orig/include/linux/i2c-id.h 2005-03-01 21:38:34.000000000 -1000 ++++ linux-2.6.11/include/linux/i2c-id.h 2005-03-02 01:50:14.000000000 -1000 +@@ -110,6 +110,7 @@ + #define I2C_DRIVERID_TDA7313 62 /* TDA7313 audio processor */ + #define I2C_DRIVERID_MAX6900 63 /* MAX6900 real-time clock */ + #define I2C_DRIVERID_SAA7114H 64 /* video decoder */ ++#define I2C_DRIVERID_X1205 0xF0 + + + #define I2C_DRIVERID_EXP0 0xF0 /* experimental use id's */ diff --git a/packages/linux/openslug-kernel-2.6.11.2/usbnet.patch b/packages/linux/openslug-kernel-2.6.11.2/usbnet.patch index e69de29bb2..1b3cf3fcb8 100644 --- a/packages/linux/openslug-kernel-2.6.11.2/usbnet.patch +++ b/packages/linux/openslug-kernel-2.6.11.2/usbnet.patch @@ -0,0 +1,17 @@ +--- linux-2.6.11/drivers/usb/net/usbnet.c_orig 2005-03-03 13:50:54.053237416 -0500 ++++ linux-2.6.11/drivers/usb/net/usbnet.c 2005-03-03 13:53:19.415139048 -0500 +@@ -2404,12 +2404,13 @@ + #endif + size = (sizeof (struct ethhdr) + dev->net->mtu); + +- if ((skb = alloc_skb (size, flags)) == NULL) { ++ if ((skb = alloc_skb (size + NET_IP_ALIGN, flags)) == NULL) { + devdbg (dev, "no rx skb"); + defer_kevent (dev, EVENT_RX_MEMORY); + usb_free_urb (urb); + return; + } ++ skb_reserve (skb, NET_IP_ALIGN); + + entry = (struct skb_data *) skb->cb; + entry->urb = urb; |