diff options
103 files changed, 643 insertions, 317 deletions
diff --git a/Documentation/i2c/writing-clients b/Documentation/i2c/writing-clients index ee75cbace28d..d4cd4126d1ad 100644 --- a/Documentation/i2c/writing-clients +++ b/Documentation/i2c/writing-clients | |||
| @@ -25,12 +25,23 @@ routines, and should be zero-initialized except for fields with data you | |||
| 25 | provide. A client structure holds device-specific information like the | 25 | provide. A client structure holds device-specific information like the |
| 26 | driver model device node, and its I2C address. | 26 | driver model device node, and its I2C address. |
| 27 | 27 | ||
| 28 | /* iff driver uses driver model ("new style") binding model: */ | ||
| 29 | |||
| 30 | static struct i2c_device_id foo_idtable[] = { | ||
| 31 | { "foo", my_id_for_foo }, | ||
| 32 | { "bar", my_id_for_bar }, | ||
| 33 | { } | ||
| 34 | }; | ||
| 35 | |||
| 36 | MODULE_DEVICE_TABLE(i2c, foo_idtable); | ||
| 37 | |||
| 28 | static struct i2c_driver foo_driver = { | 38 | static struct i2c_driver foo_driver = { |
| 29 | .driver = { | 39 | .driver = { |
| 30 | .name = "foo", | 40 | .name = "foo", |
| 31 | }, | 41 | }, |
| 32 | 42 | ||
| 33 | /* iff driver uses driver model ("new style") binding model: */ | 43 | /* iff driver uses driver model ("new style") binding model: */ |
| 44 | .id_table = foo_ids, | ||
| 34 | .probe = foo_probe, | 45 | .probe = foo_probe, |
| 35 | .remove = foo_remove, | 46 | .remove = foo_remove, |
| 36 | 47 | ||
| @@ -173,10 +184,9 @@ handle may be used during foo_probe(). If foo_probe() reports success | |||
| 173 | (zero not a negative status code) it may save the handle and use it until | 184 | (zero not a negative status code) it may save the handle and use it until |
| 174 | foo_remove() returns. That binding model is used by most Linux drivers. | 185 | foo_remove() returns. That binding model is used by most Linux drivers. |
| 175 | 186 | ||
| 176 | Drivers match devices when i2c_client.driver_name and the driver name are | 187 | The probe function is called when an entry in the id_table name field |
| 177 | the same; this approach is used in several other busses that don't have | 188 | matches the device's name. It is passed the entry that was matched so |
| 178 | device typing support in the hardware. The driver and module name should | 189 | the driver knows which one in the table matched. |
| 179 | match, so hotplug/coldplug mechanisms will modprobe the driver. | ||
| 180 | 190 | ||
| 181 | 191 | ||
| 182 | Device Creation (Standard driver model) | 192 | Device Creation (Standard driver model) |
diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt index 17a6e46fbd43..17f1f91af35c 100644 --- a/Documentation/networking/ip-sysctl.txt +++ b/Documentation/networking/ip-sysctl.txt | |||
| @@ -81,23 +81,23 @@ inet_peer_minttl - INTEGER | |||
| 81 | Minimum time-to-live of entries. Should be enough to cover fragment | 81 | Minimum time-to-live of entries. Should be enough to cover fragment |
| 82 | time-to-live on the reassembling side. This minimum time-to-live is | 82 | time-to-live on the reassembling side. This minimum time-to-live is |
| 83 | guaranteed if the pool size is less than inet_peer_threshold. | 83 | guaranteed if the pool size is less than inet_peer_threshold. |
| 84 | Measured in jiffies(1). | 84 | Measured in seconds. |
| 85 | 85 | ||
| 86 | inet_peer_maxttl - INTEGER | 86 | inet_peer_maxttl - INTEGER |
| 87 | Maximum time-to-live of entries. Unused entries will expire after | 87 | Maximum time-to-live of entries. Unused entries will expire after |
| 88 | this period of time if there is no memory pressure on the pool (i.e. | 88 | this period of time if there is no memory pressure on the pool (i.e. |
| 89 | when the number of entries in the pool is very small). | 89 | when the number of entries in the pool is very small). |
| 90 | Measured in jiffies(1). | 90 | Measured in seconds. |
| 91 | 91 | ||
| 92 | inet_peer_gc_mintime - INTEGER | 92 | inet_peer_gc_mintime - INTEGER |
| 93 | Minimum interval between garbage collection passes. This interval is | 93 | Minimum interval between garbage collection passes. This interval is |
| 94 | in effect under high memory pressure on the pool. | 94 | in effect under high memory pressure on the pool. |
| 95 | Measured in jiffies(1). | 95 | Measured in seconds. |
| 96 | 96 | ||
| 97 | inet_peer_gc_maxtime - INTEGER | 97 | inet_peer_gc_maxtime - INTEGER |
| 98 | Minimum interval between garbage collection passes. This interval is | 98 | Minimum interval between garbage collection passes. This interval is |
| 99 | in effect under low (or absent) memory pressure on the pool. | 99 | in effect under low (or absent) memory pressure on the pool. |
| 100 | Measured in jiffies(1). | 100 | Measured in seconds. |
| 101 | 101 | ||
| 102 | TCP variables: | 102 | TCP variables: |
| 103 | 103 | ||
| @@ -794,10 +794,6 @@ tag - INTEGER | |||
| 794 | Allows you to write a number, which can be used as required. | 794 | Allows you to write a number, which can be used as required. |
| 795 | Default value is 0. | 795 | Default value is 0. |
| 796 | 796 | ||
| 797 | (1) Jiffie: internal timeunit for the kernel. On the i386 1/100s, on the | ||
| 798 | Alpha 1/1024s. See the HZ define in /usr/include/asm/param.h for the exact | ||
| 799 | value on your system. | ||
| 800 | |||
| 801 | Alexey Kuznetsov. | 797 | Alexey Kuznetsov. |
| 802 | kuznet@ms2.inr.ac.ru | 798 | kuznet@ms2.inr.ac.ru |
| 803 | 799 | ||
diff --git a/Documentation/networking/s2io.txt b/Documentation/networking/s2io.txt index 4bde53e85f3f..1e28e2ddb90a 100644 --- a/Documentation/networking/s2io.txt +++ b/Documentation/networking/s2io.txt | |||
| @@ -83,9 +83,9 @@ Valid range: Limited by memory on system | |||
| 83 | Default: 30 | 83 | Default: 30 |
| 84 | 84 | ||
| 85 | e. intr_type | 85 | e. intr_type |
| 86 | Specifies interrupt type. Possible values 1(INTA), 2(MSI), 3(MSI-X) | 86 | Specifies interrupt type. Possible values 0(INTA), 2(MSI-X) |
| 87 | Valid range: 1-3 | 87 | Valid values: 0, 2 |
| 88 | Default: 1 | 88 | Default: 2 |
| 89 | 89 | ||
| 90 | 5. Performance suggestions | 90 | 5. Performance suggestions |
| 91 | General: | 91 | General: |
diff --git a/arch/arm/common/dmabounce.c b/arch/arm/common/dmabounce.c index 52fc6a883281..2744673314b4 100644 --- a/arch/arm/common/dmabounce.c +++ b/arch/arm/common/dmabounce.c | |||
| @@ -650,7 +650,8 @@ EXPORT_SYMBOL(dma_map_sg); | |||
| 650 | EXPORT_SYMBOL(dma_unmap_sg); | 650 | EXPORT_SYMBOL(dma_unmap_sg); |
| 651 | EXPORT_SYMBOL(dma_sync_single_for_cpu); | 651 | EXPORT_SYMBOL(dma_sync_single_for_cpu); |
| 652 | EXPORT_SYMBOL(dma_sync_single_for_device); | 652 | EXPORT_SYMBOL(dma_sync_single_for_device); |
| 653 | EXPORT_SYMBOL(dma_sync_sg); | 653 | EXPORT_SYMBOL(dma_sync_sg_for_cpu); |
| 654 | EXPORT_SYMBOL(dma_sync_sg_for_device); | ||
| 654 | EXPORT_SYMBOL(dmabounce_register_dev); | 655 | EXPORT_SYMBOL(dmabounce_register_dev); |
| 655 | EXPORT_SYMBOL(dmabounce_unregister_dev); | 656 | EXPORT_SYMBOL(dmabounce_unregister_dev); |
| 656 | 657 | ||
diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index 02cede295e89..dbf68dc50ae2 100644 --- a/arch/arm/mach-omap2/gpmc.c +++ b/arch/arm/mach-omap2/gpmc.c | |||
| @@ -42,7 +42,7 @@ | |||
| 42 | #define GPMC_STATUS 0x54 | 42 | #define GPMC_STATUS 0x54 |
| 43 | #define GPMC_PREFETCH_CONFIG1 0x1e0 | 43 | #define GPMC_PREFETCH_CONFIG1 0x1e0 |
| 44 | #define GPMC_PREFETCH_CONFIG2 0x1e4 | 44 | #define GPMC_PREFETCH_CONFIG2 0x1e4 |
| 45 | #define GPMC_PREFETCH_CONTROL 0x1e8 | 45 | #define GPMC_PREFETCH_CONTROL 0x1ec |
| 46 | #define GPMC_PREFETCH_STATUS 0x1f0 | 46 | #define GPMC_PREFETCH_STATUS 0x1f0 |
| 47 | #define GPMC_ECC_CONFIG 0x1f4 | 47 | #define GPMC_ECC_CONFIG 0x1f4 |
| 48 | #define GPMC_ECC_CONTROL 0x1f8 | 48 | #define GPMC_ECC_CONTROL 0x1f8 |
diff --git a/arch/arm/mach-realview/platsmp.c b/arch/arm/mach-realview/platsmp.c index 3e57428affee..8e813ed57519 100644 --- a/arch/arm/mach-realview/platsmp.c +++ b/arch/arm/mach-realview/platsmp.c | |||
| @@ -74,6 +74,8 @@ static DEFINE_SPINLOCK(boot_lock); | |||
| 74 | 74 | ||
| 75 | void __cpuinit platform_secondary_init(unsigned int cpu) | 75 | void __cpuinit platform_secondary_init(unsigned int cpu) |
| 76 | { | 76 | { |
| 77 | trace_hardirqs_off(); | ||
| 78 | |||
| 77 | /* | 79 | /* |
| 78 | * the primary core may have used a "cross call" soft interrupt | 80 | * the primary core may have used a "cross call" soft interrupt |
| 79 | * to get this processor out of WFI in the BootMonitor - make | 81 | * to get this processor out of WFI in the BootMonitor - make |
diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c index c00eda588cd8..39c637b0ffea 100644 --- a/arch/arm/plat-omap/dma.c +++ b/arch/arm/plat-omap/dma.c | |||
| @@ -501,8 +501,6 @@ static inline void omap_enable_channel_irq(int lch) | |||
| 501 | 501 | ||
| 502 | /* Enable some nice interrupts. */ | 502 | /* Enable some nice interrupts. */ |
| 503 | OMAP_DMA_CICR_REG(lch) = dma_chan[lch].enabled_irqs; | 503 | OMAP_DMA_CICR_REG(lch) = dma_chan[lch].enabled_irqs; |
| 504 | |||
| 505 | dma_chan[lch].flags |= OMAP_DMA_ACTIVE; | ||
| 506 | } | 504 | } |
| 507 | 505 | ||
| 508 | static void omap_disable_channel_irq(int lch) | 506 | static void omap_disable_channel_irq(int lch) |
diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index 1cee2f9fdf06..095e04db1c0e 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile | |||
| @@ -273,7 +273,8 @@ endif | |||
| 273 | initrd- := $(patsubst zImage%, zImage.initrd%, $(image-n) $(image-)) | 273 | initrd- := $(patsubst zImage%, zImage.initrd%, $(image-n) $(image-)) |
| 274 | initrd-y := $(patsubst zImage%, zImage.initrd%, \ | 274 | initrd-y := $(patsubst zImage%, zImage.initrd%, \ |
| 275 | $(patsubst dtbImage%, dtbImage.initrd%, \ | 275 | $(patsubst dtbImage%, dtbImage.initrd%, \ |
| 276 | $(patsubst treeImage%, treeImage.initrd%, $(image-y)))) | 276 | $(patsubst simpleImage%, simpleImage.initrd%, \ |
| 277 | $(patsubst treeImage%, treeImage.initrd%, $(image-y))))) | ||
| 277 | initrd-y := $(filter-out $(image-y), $(initrd-y)) | 278 | initrd-y := $(filter-out $(image-y), $(initrd-y)) |
| 278 | targets += $(image-y) $(initrd-y) | 279 | targets += $(image-y) $(initrd-y) |
| 279 | 280 | ||
diff --git a/arch/powerpc/kernel/legacy_serial.c b/arch/powerpc/kernel/legacy_serial.c index 61dd17449ddc..cf37f5ca4b71 100644 --- a/arch/powerpc/kernel/legacy_serial.c +++ b/arch/powerpc/kernel/legacy_serial.c | |||
| @@ -136,6 +136,11 @@ static int __init add_legacy_soc_port(struct device_node *np, | |||
| 136 | if (of_get_property(np, "clock-frequency", NULL) == NULL) | 136 | if (of_get_property(np, "clock-frequency", NULL) == NULL) |
| 137 | return -1; | 137 | return -1; |
| 138 | 138 | ||
| 139 | /* if reg-shift or offset, don't try to use it */ | ||
| 140 | if ((of_get_property(np, "reg-shift", NULL) != NULL) || | ||
| 141 | (of_get_property(np, "reg-offset", NULL) != NULL)) | ||
| 142 | return -1; | ||
| 143 | |||
| 139 | /* if rtas uses this device, don't try to use it as well */ | 144 | /* if rtas uses this device, don't try to use it as well */ |
| 140 | if (of_get_property(np, "used-by-rtas", NULL) != NULL) | 145 | if (of_get_property(np, "used-by-rtas", NULL) != NULL) |
| 141 | return -1; | 146 | return -1; |
diff --git a/arch/powerpc/platforms/52xx/lite5200_pm.c b/arch/powerpc/platforms/52xx/lite5200_pm.c index 41c7fd91e99e..fe92e65103ed 100644 --- a/arch/powerpc/platforms/52xx/lite5200_pm.c +++ b/arch/powerpc/platforms/52xx/lite5200_pm.c | |||
| @@ -14,6 +14,7 @@ static struct mpc52xx_sdma __iomem *bes; | |||
| 14 | static struct mpc52xx_xlb __iomem *xlb; | 14 | static struct mpc52xx_xlb __iomem *xlb; |
| 15 | static struct mpc52xx_gpio __iomem *gps; | 15 | static struct mpc52xx_gpio __iomem *gps; |
| 16 | static struct mpc52xx_gpio_wkup __iomem *gpw; | 16 | static struct mpc52xx_gpio_wkup __iomem *gpw; |
| 17 | static void __iomem *pci; | ||
| 17 | static void __iomem *sram; | 18 | static void __iomem *sram; |
| 18 | static const int sram_size = 0x4000; /* 16 kBytes */ | 19 | static const int sram_size = 0x4000; /* 16 kBytes */ |
| 19 | static void __iomem *mbar; | 20 | static void __iomem *mbar; |
| @@ -50,6 +51,8 @@ static int lite5200_pm_prepare(void) | |||
| 50 | { .type = "builtin", .compatible = "mpc5200", }, /* efika */ | 51 | { .type = "builtin", .compatible = "mpc5200", }, /* efika */ |
| 51 | {} | 52 | {} |
| 52 | }; | 53 | }; |
| 54 | u64 regaddr64 = 0; | ||
| 55 | const u32 *regaddr_p; | ||
| 53 | 56 | ||
| 54 | /* deep sleep? let mpc52xx code handle that */ | 57 | /* deep sleep? let mpc52xx code handle that */ |
| 55 | if (lite5200_pm_target_state == PM_SUSPEND_STANDBY) | 58 | if (lite5200_pm_target_state == PM_SUSPEND_STANDBY) |
| @@ -60,8 +63,12 @@ static int lite5200_pm_prepare(void) | |||
| 60 | 63 | ||
| 61 | /* map registers */ | 64 | /* map registers */ |
| 62 | np = of_find_matching_node(NULL, immr_ids); | 65 | np = of_find_matching_node(NULL, immr_ids); |
| 63 | mbar = of_iomap(np, 0); | 66 | regaddr_p = of_get_address(np, 0, NULL, NULL); |
| 67 | if (regaddr_p) | ||
| 68 | regaddr64 = of_translate_address(np, regaddr_p); | ||
| 64 | of_node_put(np); | 69 | of_node_put(np); |
| 70 | |||
| 71 | mbar = ioremap((u32) regaddr64, 0xC000); | ||
| 65 | if (!mbar) { | 72 | if (!mbar) { |
| 66 | printk(KERN_ERR "%s:%i Error mapping registers\n", __func__, __LINE__); | 73 | printk(KERN_ERR "%s:%i Error mapping registers\n", __func__, __LINE__); |
| 67 | return -ENOSYS; | 74 | return -ENOSYS; |
| @@ -71,6 +78,7 @@ static int lite5200_pm_prepare(void) | |||
| 71 | pic = mbar + 0x500; | 78 | pic = mbar + 0x500; |
| 72 | gps = mbar + 0xb00; | 79 | gps = mbar + 0xb00; |
| 73 | gpw = mbar + 0xc00; | 80 | gpw = mbar + 0xc00; |
| 81 | pci = mbar + 0xd00; | ||
| 74 | bes = mbar + 0x1200; | 82 | bes = mbar + 0x1200; |
| 75 | xlb = mbar + 0x1f00; | 83 | xlb = mbar + 0x1f00; |
| 76 | sram = mbar + 0x8000; | 84 | sram = mbar + 0x8000; |
| @@ -85,6 +93,7 @@ static struct mpc52xx_sdma sbes; | |||
| 85 | static struct mpc52xx_xlb sxlb; | 93 | static struct mpc52xx_xlb sxlb; |
| 86 | static struct mpc52xx_gpio sgps; | 94 | static struct mpc52xx_gpio sgps; |
| 87 | static struct mpc52xx_gpio_wkup sgpw; | 95 | static struct mpc52xx_gpio_wkup sgpw; |
| 96 | static char spci[0x200]; | ||
| 88 | 97 | ||
| 89 | static void lite5200_save_regs(void) | 98 | static void lite5200_save_regs(void) |
| 90 | { | 99 | { |
| @@ -94,6 +103,7 @@ static void lite5200_save_regs(void) | |||
| 94 | _memcpy_fromio(&sxlb, xlb, sizeof(*xlb)); | 103 | _memcpy_fromio(&sxlb, xlb, sizeof(*xlb)); |
| 95 | _memcpy_fromio(&sgps, gps, sizeof(*gps)); | 104 | _memcpy_fromio(&sgps, gps, sizeof(*gps)); |
| 96 | _memcpy_fromio(&sgpw, gpw, sizeof(*gpw)); | 105 | _memcpy_fromio(&sgpw, gpw, sizeof(*gpw)); |
| 106 | _memcpy_fromio(spci, pci, 0x200); | ||
| 97 | 107 | ||
| 98 | _memcpy_fromio(saved_sram, sram, sram_size); | 108 | _memcpy_fromio(saved_sram, sram, sram_size); |
| 99 | } | 109 | } |
| @@ -103,6 +113,8 @@ static void lite5200_restore_regs(void) | |||
| 103 | int i; | 113 | int i; |
| 104 | _memcpy_toio(sram, saved_sram, sram_size); | 114 | _memcpy_toio(sram, saved_sram, sram_size); |
| 105 | 115 | ||
| 116 | /* PCI Configuration */ | ||
| 117 | _memcpy_toio(pci, spci, 0x200); | ||
| 106 | 118 | ||
| 107 | /* | 119 | /* |
| 108 | * GPIOs. Interrupt Master Enable has higher address then other | 120 | * GPIOs. Interrupt Master Enable has higher address then other |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index e0edaaa6920a..bf07b6f50fa1 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -966,8 +966,8 @@ config NUMA_EMU | |||
| 966 | number of nodes. This is only useful for debugging. | 966 | number of nodes. This is only useful for debugging. |
| 967 | 967 | ||
| 968 | config NODES_SHIFT | 968 | config NODES_SHIFT |
| 969 | int "Max num nodes shift(1-15)" | 969 | int "Max num nodes shift(1-9)" |
| 970 | range 1 15 if X86_64 | 970 | range 1 9 if X86_64 |
| 971 | default "6" if X86_64 | 971 | default "6" if X86_64 |
| 972 | default "4" if X86_NUMAQ | 972 | default "4" if X86_NUMAQ |
| 973 | default "3" | 973 | default "3" |
diff --git a/drivers/char/drm/i915_irq.c b/drivers/char/drm/i915_irq.c index f7f16e7a8bf3..df036118b8b1 100644 --- a/drivers/char/drm/i915_irq.c +++ b/drivers/char/drm/i915_irq.c | |||
| @@ -62,11 +62,11 @@ static void i915_vblank_tasklet(struct drm_device *dev) | |||
| 62 | u32 ropcpp = (0xcc << 16) | ((cpp - 1) << 24); | 62 | u32 ropcpp = (0xcc << 16) | ((cpp - 1) << 24); |
| 63 | RING_LOCALS; | 63 | RING_LOCALS; |
| 64 | 64 | ||
| 65 | if (sarea_priv->front_tiled) { | 65 | if (IS_I965G(dev) && sarea_priv->front_tiled) { |
| 66 | cmd |= XY_SRC_COPY_BLT_DST_TILED; | 66 | cmd |= XY_SRC_COPY_BLT_DST_TILED; |
| 67 | dst_pitch >>= 2; | 67 | dst_pitch >>= 2; |
| 68 | } | 68 | } |
| 69 | if (sarea_priv->back_tiled) { | 69 | if (IS_I965G(dev) && sarea_priv->back_tiled) { |
| 70 | cmd |= XY_SRC_COPY_BLT_SRC_TILED; | 70 | cmd |= XY_SRC_COPY_BLT_SRC_TILED; |
| 71 | src_pitch >>= 2; | 71 | src_pitch >>= 2; |
| 72 | } | 72 | } |
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index e94bee032314..750131010af0 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
| @@ -3322,7 +3322,7 @@ static int send_break(struct tty_struct *tty, unsigned int duration) | |||
| 3322 | msleep_interruptible(duration); | 3322 | msleep_interruptible(duration); |
| 3323 | tty->ops->break_ctl(tty, 0); | 3323 | tty->ops->break_ctl(tty, 0); |
| 3324 | tty_write_unlock(tty); | 3324 | tty_write_unlock(tty); |
| 3325 | if (!signal_pending(current)) | 3325 | if (signal_pending(current)) |
| 3326 | return -EINTR; | 3326 | return -EINTR; |
| 3327 | return 0; | 3327 | return 0; |
| 3328 | } | 3328 | } |
diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c index 85e2ba7fcfba..bf4830082a13 100644 --- a/drivers/connector/connector.c +++ b/drivers/connector/connector.c | |||
| @@ -27,6 +27,8 @@ | |||
| 27 | #include <linux/moduleparam.h> | 27 | #include <linux/moduleparam.h> |
| 28 | #include <linux/connector.h> | 28 | #include <linux/connector.h> |
| 29 | #include <linux/mutex.h> | 29 | #include <linux/mutex.h> |
| 30 | #include <linux/proc_fs.h> | ||
| 31 | #include <linux/spinlock.h> | ||
| 30 | 32 | ||
| 31 | #include <net/sock.h> | 33 | #include <net/sock.h> |
| 32 | 34 | ||
| @@ -403,6 +405,40 @@ static void cn_callback(void *data) | |||
| 403 | mutex_unlock(¬ify_lock); | 405 | mutex_unlock(¬ify_lock); |
| 404 | } | 406 | } |
| 405 | 407 | ||
| 408 | static int cn_proc_show(struct seq_file *m, void *v) | ||
| 409 | { | ||
| 410 | struct cn_queue_dev *dev = cdev.cbdev; | ||
| 411 | struct cn_callback_entry *cbq; | ||
| 412 | |||
| 413 | seq_printf(m, "Name ID\n"); | ||
| 414 | |||
| 415 | spin_lock_bh(&dev->queue_lock); | ||
| 416 | |||
| 417 | list_for_each_entry(cbq, &dev->queue_list, callback_entry) { | ||
| 418 | seq_printf(m, "%-15s %u:%u\n", | ||
| 419 | cbq->id.name, | ||
| 420 | cbq->id.id.idx, | ||
| 421 | cbq->id.id.val); | ||
| 422 | } | ||
| 423 | |||
| 424 | spin_unlock_bh(&dev->queue_lock); | ||
| 425 | |||
| 426 | return 0; | ||
| 427 | } | ||
| 428 | |||
| 429 | static int cn_proc_open(struct inode *inode, struct file *file) | ||
| 430 | { | ||
| 431 | return single_open(file, cn_proc_show, NULL); | ||
| 432 | } | ||
| 433 | |||
| 434 | static const struct file_operations cn_file_ops = { | ||
| 435 | .owner = THIS_MODULE, | ||
| 436 | .open = cn_proc_open, | ||
| 437 | .read = seq_read, | ||
| 438 | .llseek = seq_lseek, | ||
| 439 | .release = single_release | ||
| 440 | }; | ||
| 441 | |||
| 406 | static int __devinit cn_init(void) | 442 | static int __devinit cn_init(void) |
| 407 | { | 443 | { |
| 408 | struct cn_dev *dev = &cdev; | 444 | struct cn_dev *dev = &cdev; |
| @@ -434,6 +470,8 @@ static int __devinit cn_init(void) | |||
| 434 | return -EINVAL; | 470 | return -EINVAL; |
| 435 | } | 471 | } |
| 436 | 472 | ||
| 473 | proc_net_fops_create(&init_net, "connector", S_IRUGO, &cn_file_ops); | ||
| 474 | |||
| 437 | return 0; | 475 | return 0; |
| 438 | } | 476 | } |
| 439 | 477 | ||
| @@ -443,6 +481,8 @@ static void __devexit cn_fini(void) | |||
| 443 | 481 | ||
| 444 | cn_already_initialized = 0; | 482 | cn_already_initialized = 0; |
| 445 | 483 | ||
| 484 | proc_net_remove(&init_net, "connector"); | ||
| 485 | |||
| 446 | cn_del_callback(&dev->id); | 486 | cn_del_callback(&dev->id); |
| 447 | cn_queue_free_dev(dev->cbdev); | 487 | cn_queue_free_dev(dev->cbdev); |
| 448 | netlink_kernel_release(dev->nls); | 488 | netlink_kernel_release(dev->nls); |
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index 8e07de23d220..1607536ff5fb 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
| @@ -823,6 +823,13 @@ config BLK_DEV_IDE_RAPIDE | |||
| 823 | Say Y here if you want to support the Yellowstone RapIDE controller | 823 | Say Y here if you want to support the Yellowstone RapIDE controller |
| 824 | manufactured for use with Acorn computers. | 824 | manufactured for use with Acorn computers. |
| 825 | 825 | ||
| 826 | config BLK_DEV_IDE_BAST | ||
| 827 | tristate "Simtec BAST / Thorcom VR1000 IDE support" | ||
| 828 | depends on ARM && (ARCH_BAST || MACH_VR1000) | ||
| 829 | help | ||
| 830 | Say Y here if you want to support the onboard IDE channels on the | ||
| 831 | Simtec BAST or the Thorcom VR1000 | ||
| 832 | |||
| 826 | config IDE_H8300 | 833 | config IDE_H8300 |
| 827 | tristate "H8300 IDE support" | 834 | tristate "H8300 IDE support" |
| 828 | depends on H8300 | 835 | depends on H8300 |
diff --git a/drivers/ide/arm/Makefile b/drivers/ide/arm/Makefile index 5bc26053afa6..936e7b0237f5 100644 --- a/drivers/ide/arm/Makefile +++ b/drivers/ide/arm/Makefile | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | 1 | ||
| 2 | obj-$(CONFIG_BLK_DEV_IDE_ICSIDE) += icside.o | 2 | obj-$(CONFIG_BLK_DEV_IDE_ICSIDE) += icside.o |
| 3 | obj-$(CONFIG_BLK_DEV_IDE_RAPIDE) += rapide.o | 3 | obj-$(CONFIG_BLK_DEV_IDE_RAPIDE) += rapide.o |
| 4 | obj-$(CONFIG_BLK_DEV_IDE_BAST) += bast-ide.o | ||
| 4 | obj-$(CONFIG_BLK_DEV_PALMCHIP_BK3710) += palm_bk3710.o | 5 | obj-$(CONFIG_BLK_DEV_PALMCHIP_BK3710) += palm_bk3710.o |
| 5 | 6 | ||
| 6 | ifeq ($(CONFIG_IDE_ARM), m) | 7 | ifeq ($(CONFIG_IDE_ARM), m) |
diff --git a/drivers/ide/arm/bast-ide.c b/drivers/ide/arm/bast-ide.c new file mode 100644 index 000000000000..8e8c28104b45 --- /dev/null +++ b/drivers/ide/arm/bast-ide.c | |||
| @@ -0,0 +1,90 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2003-2004 Simtec Electronics | ||
| 3 | * Ben Dooks <ben@simtec.co.uk> | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License version 2 as | ||
| 7 | * published by the Free Software Foundation. | ||
| 8 | * | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include <linux/module.h> | ||
| 12 | #include <linux/errno.h> | ||
| 13 | #include <linux/ide.h> | ||
| 14 | #include <linux/init.h> | ||
| 15 | |||
| 16 | #include <asm/mach-types.h> | ||
| 17 | |||
| 18 | #include <asm/io.h> | ||
| 19 | #include <asm/irq.h> | ||
| 20 | #include <asm/arch/map.h> | ||
| 21 | #include <asm/arch/bast-map.h> | ||
| 22 | #include <asm/arch/bast-irq.h> | ||
| 23 | |||
| 24 | #define DRV_NAME "bast-ide" | ||
| 25 | |||
| 26 | static int __init bastide_register(unsigned int base, unsigned int aux, int irq) | ||
| 27 | { | ||
| 28 | ide_hwif_t *hwif; | ||
| 29 | hw_regs_t hw; | ||
| 30 | int i; | ||
| 31 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; | ||
| 32 | |||
| 33 | memset(&hw, 0, sizeof(hw)); | ||
| 34 | |||
| 35 | base += BAST_IDE_CS; | ||
| 36 | aux += BAST_IDE_CS; | ||
| 37 | |||
| 38 | for (i = 0; i <= 7; i++) { | ||
| 39 | hw.io_ports_array[i] = (unsigned long)base; | ||
| 40 | base += 0x20; | ||
| 41 | } | ||
| 42 | |||
| 43 | hw.io_ports.ctl_addr = aux + (6 * 0x20); | ||
| 44 | hw.irq = irq; | ||
| 45 | hw.chipset = ide_generic; | ||
| 46 | |||
| 47 | hwif = ide_find_port(); | ||
| 48 | if (hwif == NULL) | ||
| 49 | goto out; | ||
| 50 | |||
| 51 | i = hwif->index; | ||
| 52 | |||
| 53 | ide_init_port_data(hwif, i); | ||
| 54 | ide_init_port_hw(hwif, &hw); | ||
| 55 | hwif->port_ops = NULL; | ||
| 56 | |||
| 57 | idx[0] = i; | ||
| 58 | |||
| 59 | ide_device_add(idx, NULL); | ||
| 60 | out: | ||
| 61 | return 0; | ||
| 62 | } | ||
| 63 | |||
| 64 | static int __init bastide_init(void) | ||
| 65 | { | ||
| 66 | unsigned long base = BAST_VA_IDEPRI + BAST_IDE_CS; | ||
| 67 | |||
| 68 | /* we can treat the VR1000 and the BAST the same */ | ||
| 69 | |||
| 70 | if (!(machine_is_bast() || machine_is_vr1000())) | ||
| 71 | return 0; | ||
| 72 | |||
| 73 | printk("BAST: IDE driver, (c) 2003-2004 Simtec Electronics\n"); | ||
| 74 | |||
| 75 | if (!request_mem_region(base, 0x400000, DRV_NAME)) { | ||
| 76 | printk(KERN_ERR "%s: resources busy\n", DRV_NAME); | ||
| 77 | return -EBUSY; | ||
| 78 | } | ||
| 79 | |||
| 80 | bastide_register(BAST_VA_IDEPRI, BAST_VA_IDEPRIAUX, IRQ_IDE0); | ||
| 81 | bastide_register(BAST_VA_IDESEC, BAST_VA_IDESECAUX, IRQ_IDE1); | ||
| 82 | |||
| 83 | return 0; | ||
| 84 | } | ||
| 85 | |||
| 86 | module_init(bastide_init); | ||
| 87 | |||
| 88 | MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>"); | ||
| 89 | MODULE_LICENSE("GPL"); | ||
| 90 | MODULE_DESCRIPTION("Simtec BAST / Thorcom VR1000 IDE driver"); | ||
diff --git a/drivers/ide/ide-proc.c b/drivers/ide/ide-proc.c index 55ec7f798772..8af88bf0969b 100644 --- a/drivers/ide/ide-proc.c +++ b/drivers/ide/ide-proc.c | |||
| @@ -76,7 +76,7 @@ static int proc_ide_read_mate | |||
| 76 | ide_hwif_t *hwif = (ide_hwif_t *) data; | 76 | ide_hwif_t *hwif = (ide_hwif_t *) data; |
| 77 | int len; | 77 | int len; |
| 78 | 78 | ||
| 79 | if (hwif && hwif->mate && hwif->mate->present) | 79 | if (hwif && hwif->mate) |
| 80 | len = sprintf(page, "%s\n", hwif->mate->name); | 80 | len = sprintf(page, "%s\n", hwif->mate->name); |
| 81 | else | 81 | else |
| 82 | len = sprintf(page, "(none)\n"); | 82 | len = sprintf(page, "(none)\n"); |
diff --git a/drivers/input/ff-core.c b/drivers/input/ff-core.c index 4c01464ec8f3..72c63e5dd630 100644 --- a/drivers/input/ff-core.c +++ b/drivers/input/ff-core.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <linux/input.h> | 28 | #include <linux/input.h> |
| 29 | #include <linux/module.h> | 29 | #include <linux/module.h> |
| 30 | #include <linux/mutex.h> | 30 | #include <linux/mutex.h> |
| 31 | #include <linux/sched.h> | ||
| 31 | 32 | ||
| 32 | /* | 33 | /* |
| 33 | * Check that the effect_id is a valid effect and whether the user | 34 | * Check that the effect_id is a valid effect and whether the user |
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 835def11419d..ab6a61db63ce 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c | |||
| @@ -432,6 +432,7 @@ static int crypt_convert(struct crypt_config *cc, | |||
| 432 | case 0: | 432 | case 0: |
| 433 | atomic_dec(&ctx->pending); | 433 | atomic_dec(&ctx->pending); |
| 434 | ctx->sector++; | 434 | ctx->sector++; |
| 435 | cond_resched(); | ||
| 435 | continue; | 436 | continue; |
| 436 | 437 | ||
| 437 | /* error */ | 438 | /* error */ |
diff --git a/drivers/md/md.c b/drivers/md/md.c index 7cf512a34ccf..2580ac1b9b0f 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -3897,8 +3897,10 @@ static void autorun_devices(int part) | |||
| 3897 | 3897 | ||
| 3898 | md_probe(dev, NULL, NULL); | 3898 | md_probe(dev, NULL, NULL); |
| 3899 | mddev = mddev_find(dev); | 3899 | mddev = mddev_find(dev); |
| 3900 | if (!mddev) { | 3900 | if (!mddev || !mddev->gendisk) { |
| 3901 | printk(KERN_ERR | 3901 | if (mddev) |
| 3902 | mddev_put(mddev); | ||
| 3903 | printk(KERN_ERR | ||
| 3902 | "md: cannot allocate memory for md drive.\n"); | 3904 | "md: cannot allocate memory for md drive.\n"); |
| 3903 | break; | 3905 | break; |
| 3904 | } | 3906 | } |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 1de17da34a95..a71277b640ab 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
| @@ -2137,6 +2137,8 @@ static int run(mddev_t *mddev) | |||
| 2137 | !test_bit(In_sync, &disk->rdev->flags)) { | 2137 | !test_bit(In_sync, &disk->rdev->flags)) { |
| 2138 | disk->head_position = 0; | 2138 | disk->head_position = 0; |
| 2139 | mddev->degraded++; | 2139 | mddev->degraded++; |
| 2140 | if (disk->rdev) | ||
| 2141 | conf->fullsync = 1; | ||
| 2140 | } | 2142 | } |
| 2141 | } | 2143 | } |
| 2142 | 2144 | ||
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index c37e256b1176..54c8ee28fcc4 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
| @@ -2898,6 +2898,8 @@ static void handle_stripe5(struct stripe_head *sh) | |||
| 2898 | 2898 | ||
| 2899 | for (i = conf->raid_disks; i--; ) { | 2899 | for (i = conf->raid_disks; i--; ) { |
| 2900 | set_bit(R5_Wantwrite, &sh->dev[i].flags); | 2900 | set_bit(R5_Wantwrite, &sh->dev[i].flags); |
| 2901 | set_bit(R5_LOCKED, &dev->flags); | ||
| 2902 | s.locked++; | ||
| 2901 | if (!test_and_set_bit(STRIPE_OP_IO, &sh->ops.pending)) | 2903 | if (!test_and_set_bit(STRIPE_OP_IO, &sh->ops.pending)) |
| 2902 | sh->ops.count++; | 2904 | sh->ops.count++; |
| 2903 | } | 2905 | } |
| @@ -2911,6 +2913,7 @@ static void handle_stripe5(struct stripe_head *sh) | |||
| 2911 | conf->raid_disks); | 2913 | conf->raid_disks); |
| 2912 | s.locked += handle_write_operations5(sh, 1, 1); | 2914 | s.locked += handle_write_operations5(sh, 1, 1); |
| 2913 | } else if (s.expanded && | 2915 | } else if (s.expanded && |
| 2916 | s.locked == 0 && | ||
| 2914 | !test_bit(STRIPE_OP_POSTXOR, &sh->ops.pending)) { | 2917 | !test_bit(STRIPE_OP_POSTXOR, &sh->ops.pending)) { |
| 2915 | clear_bit(STRIPE_EXPAND_READY, &sh->state); | 2918 | clear_bit(STRIPE_EXPAND_READY, &sh->state); |
| 2916 | atomic_dec(&conf->reshape_stripes); | 2919 | atomic_dec(&conf->reshape_stripes); |
| @@ -4305,7 +4308,9 @@ static int run(mddev_t *mddev) | |||
| 4305 | " disk %d\n", bdevname(rdev->bdev,b), | 4308 | " disk %d\n", bdevname(rdev->bdev,b), |
| 4306 | raid_disk); | 4309 | raid_disk); |
| 4307 | working_disks++; | 4310 | working_disks++; |
| 4308 | } | 4311 | } else |
| 4312 | /* Cannot rely on bitmap to complete recovery */ | ||
| 4313 | conf->fullsync = 1; | ||
| 4309 | } | 4314 | } |
| 4310 | 4315 | ||
| 4311 | /* | 4316 | /* |
diff --git a/drivers/net/3c59x.c b/drivers/net/3c59x.c index 2edda8cc7f99..aabad8ce7458 100644 --- a/drivers/net/3c59x.c +++ b/drivers/net/3c59x.c | |||
| @@ -1768,9 +1768,10 @@ vortex_timer(unsigned long data) | |||
| 1768 | case XCVR_MII: case XCVR_NWAY: | 1768 | case XCVR_MII: case XCVR_NWAY: |
| 1769 | { | 1769 | { |
| 1770 | ok = 1; | 1770 | ok = 1; |
| 1771 | spin_lock_bh(&vp->lock); | 1771 | /* Interrupts are already disabled */ |
| 1772 | spin_lock(&vp->lock); | ||
| 1772 | vortex_check_media(dev, 0); | 1773 | vortex_check_media(dev, 0); |
| 1773 | spin_unlock_bh(&vp->lock); | 1774 | spin_unlock(&vp->lock); |
| 1774 | } | 1775 | } |
| 1775 | break; | 1776 | break; |
| 1776 | default: /* Other media types handled by Tx timeouts. */ | 1777 | default: /* Other media types handled by Tx timeouts. */ |
diff --git a/drivers/net/e100.c b/drivers/net/e100.c index f3cba5e24ec5..1037b1332312 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c | |||
| @@ -1803,6 +1803,8 @@ static int e100_rx_alloc_skb(struct nic *nic, struct rx *rx) | |||
| 1803 | if (rx->prev->skb) { | 1803 | if (rx->prev->skb) { |
| 1804 | struct rfd *prev_rfd = (struct rfd *)rx->prev->skb->data; | 1804 | struct rfd *prev_rfd = (struct rfd *)rx->prev->skb->data; |
| 1805 | put_unaligned_le32(rx->dma_addr, &prev_rfd->link); | 1805 | put_unaligned_le32(rx->dma_addr, &prev_rfd->link); |
| 1806 | pci_dma_sync_single_for_device(nic->pdev, rx->prev->dma_addr, | ||
| 1807 | sizeof(struct rfd), PCI_DMA_TODEVICE); | ||
| 1806 | } | 1808 | } |
| 1807 | 1809 | ||
| 1808 | return 0; | 1810 | return 0; |
diff --git a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c index 701531e72e7b..a3f6a9c72ec8 100644 --- a/drivers/net/e1000/e1000_ethtool.c +++ b/drivers/net/e1000/e1000_ethtool.c | |||
| @@ -347,7 +347,7 @@ e1000_set_tso(struct net_device *netdev, u32 data) | |||
| 347 | else | 347 | else |
| 348 | netdev->features &= ~NETIF_F_TSO; | 348 | netdev->features &= ~NETIF_F_TSO; |
| 349 | 349 | ||
| 350 | if (data) | 350 | if (data && (adapter->hw.mac_type > e1000_82547_rev_2)) |
| 351 | netdev->features |= NETIF_F_TSO6; | 351 | netdev->features |= NETIF_F_TSO6; |
| 352 | else | 352 | else |
| 353 | netdev->features &= ~NETIF_F_TSO6; | 353 | netdev->features &= ~NETIF_F_TSO6; |
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index cab1835173cd..648a87bbf467 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
| @@ -2535,7 +2535,8 @@ void e1000e_down(struct e1000_adapter *adapter) | |||
| 2535 | adapter->link_speed = 0; | 2535 | adapter->link_speed = 0; |
| 2536 | adapter->link_duplex = 0; | 2536 | adapter->link_duplex = 0; |
| 2537 | 2537 | ||
| 2538 | e1000e_reset(adapter); | 2538 | if (!pci_channel_offline(adapter->pdev)) |
| 2539 | e1000e_reset(adapter); | ||
| 2539 | e1000_clean_tx_ring(adapter); | 2540 | e1000_clean_tx_ring(adapter); |
| 2540 | e1000_clean_rx_ring(adapter); | 2541 | e1000_clean_rx_ring(adapter); |
| 2541 | 2542 | ||
diff --git a/drivers/net/hamradio/dmascc.c b/drivers/net/hamradio/dmascc.c index 0b94833e23f7..e8cfadefa4b6 100644 --- a/drivers/net/hamradio/dmascc.c +++ b/drivers/net/hamradio/dmascc.c | |||
| @@ -1077,8 +1077,6 @@ static inline void rx_off(struct scc_priv *priv) | |||
| 1077 | 1077 | ||
| 1078 | static void start_timer(struct scc_priv *priv, int t, int r15) | 1078 | static void start_timer(struct scc_priv *priv, int t, int r15) |
| 1079 | { | 1079 | { |
| 1080 | unsigned long flags; | ||
| 1081 | |||
| 1082 | outb(priv->tmr_mode, priv->tmr_ctrl); | 1080 | outb(priv->tmr_mode, priv->tmr_ctrl); |
| 1083 | if (t == 0) { | 1081 | if (t == 0) { |
| 1084 | tm_isr(priv); | 1082 | tm_isr(priv); |
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c index ae398f04c7b4..e79a26a886c8 100644 --- a/drivers/net/igb/igb_main.c +++ b/drivers/net/igb/igb_main.c | |||
| @@ -718,7 +718,8 @@ void igb_down(struct igb_adapter *adapter) | |||
| 718 | adapter->link_speed = 0; | 718 | adapter->link_speed = 0; |
| 719 | adapter->link_duplex = 0; | 719 | adapter->link_duplex = 0; |
| 720 | 720 | ||
| 721 | igb_reset(adapter); | 721 | if (!pci_channel_offline(adapter->pdev)) |
| 722 | igb_reset(adapter); | ||
| 722 | igb_clean_all_tx_rings(adapter); | 723 | igb_clean_all_tx_rings(adapter); |
| 723 | igb_clean_all_rx_rings(adapter); | 724 | igb_clean_all_rx_rings(adapter); |
| 724 | } | 725 | } |
diff --git a/drivers/net/ipg.c b/drivers/net/ipg.c index 679a0826780e..2c03f4e2ccc4 100644 --- a/drivers/net/ipg.c +++ b/drivers/net/ipg.c | |||
| @@ -1271,7 +1271,7 @@ static void ipg_nic_rx_with_end(struct net_device *dev, | |||
| 1271 | 1271 | ||
| 1272 | framelen = le64_to_cpu(rxfd->rfs) & IPG_RFS_RXFRAMELEN; | 1272 | framelen = le64_to_cpu(rxfd->rfs) & IPG_RFS_RXFRAMELEN; |
| 1273 | 1273 | ||
| 1274 | endframeLen = framelen - jumbo->current_size; | 1274 | endframelen = framelen - jumbo->current_size; |
| 1275 | /* | 1275 | /* |
| 1276 | if (framelen > IPG_RXFRAG_SIZE) | 1276 | if (framelen > IPG_RXFRAG_SIZE) |
| 1277 | framelen=IPG_RXFRAG_SIZE; | 1277 | framelen=IPG_RXFRAG_SIZE; |
| @@ -1279,8 +1279,8 @@ static void ipg_nic_rx_with_end(struct net_device *dev, | |||
| 1279 | if (framelen > IPG_RXSUPPORT_SIZE) | 1279 | if (framelen > IPG_RXSUPPORT_SIZE) |
| 1280 | dev_kfree_skb_irq(jumbo->skb); | 1280 | dev_kfree_skb_irq(jumbo->skb); |
| 1281 | else { | 1281 | else { |
| 1282 | memcpy(skb_put(jumbo->skb, endframeLen), | 1282 | memcpy(skb_put(jumbo->skb, endframelen), |
| 1283 | skb->data, endframeLen); | 1283 | skb->data, endframelen); |
| 1284 | 1284 | ||
| 1285 | jumbo->skb->protocol = | 1285 | jumbo->skb->protocol = |
| 1286 | eth_type_trans(jumbo->skb, dev); | 1286 | eth_type_trans(jumbo->skb, dev); |
| @@ -1352,16 +1352,16 @@ static int ipg_nic_rx(struct net_device *dev) | |||
| 1352 | 1352 | ||
| 1353 | switch (ipg_nic_rx_check_frame_type(dev)) { | 1353 | switch (ipg_nic_rx_check_frame_type(dev)) { |
| 1354 | case FRAME_WITH_START_WITH_END: | 1354 | case FRAME_WITH_START_WITH_END: |
| 1355 | ipg_nic_rx_with_start_and_end(dev, tp, rxfd, entry); | 1355 | ipg_nic_rx_with_start_and_end(dev, sp, rxfd, entry); |
| 1356 | break; | 1356 | break; |
| 1357 | case FRAME_WITH_START: | 1357 | case FRAME_WITH_START: |
| 1358 | ipg_nic_rx_with_start(dev, tp, rxfd, entry); | 1358 | ipg_nic_rx_with_start(dev, sp, rxfd, entry); |
| 1359 | break; | 1359 | break; |
| 1360 | case FRAME_WITH_END: | 1360 | case FRAME_WITH_END: |
| 1361 | ipg_nic_rx_with_end(dev, tp, rxfd, entry); | 1361 | ipg_nic_rx_with_end(dev, sp, rxfd, entry); |
| 1362 | break; | 1362 | break; |
| 1363 | case FRAME_NO_START_NO_END: | 1363 | case FRAME_NO_START_NO_END: |
| 1364 | ipg_nic_rx_no_start_no_end(dev, tp, rxfd, entry); | 1364 | ipg_nic_rx_no_start_no_end(dev, sp, rxfd, entry); |
| 1365 | break; | 1365 | break; |
| 1366 | } | 1366 | } |
| 1367 | } | 1367 | } |
| @@ -1808,7 +1808,7 @@ static int ipg_nic_open(struct net_device *dev) | |||
| 1808 | /* initialize JUMBO Frame control variable */ | 1808 | /* initialize JUMBO Frame control variable */ |
| 1809 | sp->jumbo.found_start = 0; | 1809 | sp->jumbo.found_start = 0; |
| 1810 | sp->jumbo.current_size = 0; | 1810 | sp->jumbo.current_size = 0; |
| 1811 | sp->jumbo.skb = 0; | 1811 | sp->jumbo.skb = NULL; |
| 1812 | dev->mtu = IPG_TXFRAG_SIZE; | 1812 | dev->mtu = IPG_TXFRAG_SIZE; |
| 1813 | #endif | 1813 | #endif |
| 1814 | 1814 | ||
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 7b859220c255..8f0460901153 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
| @@ -1969,7 +1969,8 @@ void ixgbe_down(struct ixgbe_adapter *adapter) | |||
| 1969 | netif_carrier_off(netdev); | 1969 | netif_carrier_off(netdev); |
| 1970 | netif_stop_queue(netdev); | 1970 | netif_stop_queue(netdev); |
| 1971 | 1971 | ||
| 1972 | ixgbe_reset(adapter); | 1972 | if (!pci_channel_offline(adapter->pdev)) |
| 1973 | ixgbe_reset(adapter); | ||
| 1973 | ixgbe_clean_all_tx_rings(adapter); | 1974 | ixgbe_clean_all_tx_rings(adapter); |
| 1974 | ixgbe_clean_all_rx_rings(adapter); | 1975 | ixgbe_clean_all_rx_rings(adapter); |
| 1975 | 1976 | ||
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 6797ed069f1f..63cd67b931e7 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
| @@ -71,14 +71,18 @@ static irqreturn_t netxen_intr(int irq, void *data); | |||
| 71 | static irqreturn_t netxen_msi_intr(int irq, void *data); | 71 | static irqreturn_t netxen_msi_intr(int irq, void *data); |
| 72 | 72 | ||
| 73 | /* PCI Device ID Table */ | 73 | /* PCI Device ID Table */ |
| 74 | #define ENTRY(device) \ | ||
| 75 | {PCI_DEVICE(0x4040, (device)), \ | ||
| 76 | .class = PCI_CLASS_NETWORK_ETHERNET << 8, .class_mask = ~0} | ||
| 77 | |||
| 74 | static struct pci_device_id netxen_pci_tbl[] __devinitdata = { | 78 | static struct pci_device_id netxen_pci_tbl[] __devinitdata = { |
| 75 | {PCI_DEVICE(0x4040, 0x0001), PCI_DEVICE_CLASS(0x020000, ~0)}, | 79 | ENTRY(0x0001), |
| 76 | {PCI_DEVICE(0x4040, 0x0002), PCI_DEVICE_CLASS(0x020000, ~0)}, | 80 | ENTRY(0x0002), |
| 77 | {PCI_DEVICE(0x4040, 0x0003), PCI_DEVICE_CLASS(0x020000, ~0)}, | 81 | ENTRY(0x0003), |
| 78 | {PCI_DEVICE(0x4040, 0x0004), PCI_DEVICE_CLASS(0x020000, ~0)}, | 82 | ENTRY(0x0004), |
| 79 | {PCI_DEVICE(0x4040, 0x0005), PCI_DEVICE_CLASS(0x020000, ~0)}, | 83 | ENTRY(0x0005), |
| 80 | {PCI_DEVICE(0x4040, 0x0024), PCI_DEVICE_CLASS(0x020000, ~0)}, | 84 | ENTRY(0x0024), |
| 81 | {PCI_DEVICE(0x4040, 0x0025), PCI_DEVICE_CLASS(0x020000, ~0)}, | 85 | ENTRY(0x0025), |
| 82 | {0,} | 86 | {0,} |
| 83 | }; | 87 | }; |
| 84 | 88 | ||
diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c index ce95c5d168fe..70d012e90dcf 100644 --- a/drivers/net/pcmcia/axnet_cs.c +++ b/drivers/net/pcmcia/axnet_cs.c | |||
| @@ -525,12 +525,14 @@ static int axnet_open(struct net_device *dev) | |||
| 525 | int ret; | 525 | int ret; |
| 526 | axnet_dev_t *info = PRIV(dev); | 526 | axnet_dev_t *info = PRIV(dev); |
| 527 | struct pcmcia_device *link = info->p_dev; | 527 | struct pcmcia_device *link = info->p_dev; |
| 528 | unsigned int nic_base = dev->base_addr; | ||
| 528 | 529 | ||
| 529 | DEBUG(2, "axnet_open('%s')\n", dev->name); | 530 | DEBUG(2, "axnet_open('%s')\n", dev->name); |
| 530 | 531 | ||
| 531 | if (!pcmcia_dev_present(link)) | 532 | if (!pcmcia_dev_present(link)) |
| 532 | return -ENODEV; | 533 | return -ENODEV; |
| 533 | 534 | ||
| 535 | outb_p(0xFF, nic_base + EN0_ISR); /* Clear bogus intr. */ | ||
| 534 | ret = request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, "axnet_cs", dev); | 536 | ret = request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, "axnet_cs", dev); |
| 535 | if (ret) | 537 | if (ret) |
| 536 | return ret; | 538 | return ret; |
diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c index fd8158a86f64..2d4c4ad89b8d 100644 --- a/drivers/net/pcmcia/pcnet_cs.c +++ b/drivers/net/pcmcia/pcnet_cs.c | |||
| @@ -969,6 +969,7 @@ static int pcnet_open(struct net_device *dev) | |||
| 969 | int ret; | 969 | int ret; |
| 970 | pcnet_dev_t *info = PRIV(dev); | 970 | pcnet_dev_t *info = PRIV(dev); |
| 971 | struct pcmcia_device *link = info->p_dev; | 971 | struct pcmcia_device *link = info->p_dev; |
| 972 | unsigned int nic_base = dev->base_addr; | ||
| 972 | 973 | ||
| 973 | DEBUG(2, "pcnet_open('%s')\n", dev->name); | 974 | DEBUG(2, "pcnet_open('%s')\n", dev->name); |
| 974 | 975 | ||
| @@ -976,6 +977,8 @@ static int pcnet_open(struct net_device *dev) | |||
| 976 | return -ENODEV; | 977 | return -ENODEV; |
| 977 | 978 | ||
| 978 | set_misc_reg(dev); | 979 | set_misc_reg(dev); |
| 980 | |||
| 981 | outb_p(0xFF, nic_base + EN0_ISR); /* Clear bogus intr. */ | ||
| 979 | ret = request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, dev_info, dev); | 982 | ret = request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, dev_info, dev); |
| 980 | if (ret) | 983 | if (ret) |
| 981 | return ret; | 984 | return ret; |
diff --git a/drivers/net/qla3xxx.c b/drivers/net/qla3xxx.c index b7f7b2227d56..bccee68bd48a 100644 --- a/drivers/net/qla3xxx.c +++ b/drivers/net/qla3xxx.c | |||
| @@ -3701,7 +3701,9 @@ static int ql_cycle_adapter(struct ql3_adapter *qdev, int reset) | |||
| 3701 | printk(KERN_ERR PFX | 3701 | printk(KERN_ERR PFX |
| 3702 | "%s: Driver up/down cycle failed, " | 3702 | "%s: Driver up/down cycle failed, " |
| 3703 | "closing device\n",qdev->ndev->name); | 3703 | "closing device\n",qdev->ndev->name); |
| 3704 | rtnl_lock(); | ||
| 3704 | dev_close(qdev->ndev); | 3705 | dev_close(qdev->ndev); |
| 3706 | rtnl_unlock(); | ||
| 3705 | return -1; | 3707 | return -1; |
| 3706 | } | 3708 | } |
| 3707 | return 0; | 3709 | return 0; |
diff --git a/drivers/net/r6040.c b/drivers/net/r6040.c index 858b191517b3..504a48ff73c8 100644 --- a/drivers/net/r6040.c +++ b/drivers/net/r6040.c | |||
| @@ -273,7 +273,7 @@ static void r6040_init_ring_desc(struct r6040_descriptor *desc_ring, | |||
| 273 | dma_addr_t mapping = desc_dma; | 273 | dma_addr_t mapping = desc_dma; |
| 274 | 274 | ||
| 275 | while (size-- > 0) { | 275 | while (size-- > 0) { |
| 276 | mapping += sizeof(sizeof(*desc)); | 276 | mapping += sizeof(*desc); |
| 277 | desc->ndesc = cpu_to_le32(mapping); | 277 | desc->ndesc = cpu_to_le32(mapping); |
| 278 | desc->vndescp = desc + 1; | 278 | desc->vndescp = desc + 1; |
| 279 | desc++; | 279 | desc++; |
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index b5c1e663417d..ae7b697456b4 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
| @@ -2625,9 +2625,7 @@ static int fill_rx_buffers(struct ring_info *ring) | |||
| 2625 | rxdp1->Buffer0_ptr = pci_map_single | 2625 | rxdp1->Buffer0_ptr = pci_map_single |
| 2626 | (ring->pdev, skb->data, size - NET_IP_ALIGN, | 2626 | (ring->pdev, skb->data, size - NET_IP_ALIGN, |
| 2627 | PCI_DMA_FROMDEVICE); | 2627 | PCI_DMA_FROMDEVICE); |
| 2628 | if( (rxdp1->Buffer0_ptr == 0) || | 2628 | if(pci_dma_mapping_error(rxdp1->Buffer0_ptr)) |
| 2629 | (rxdp1->Buffer0_ptr == | ||
| 2630 | DMA_ERROR_CODE)) | ||
| 2631 | goto pci_map_failed; | 2629 | goto pci_map_failed; |
| 2632 | 2630 | ||
| 2633 | rxdp->Control_2 = | 2631 | rxdp->Control_2 = |
| @@ -2657,6 +2655,7 @@ static int fill_rx_buffers(struct ring_info *ring) | |||
| 2657 | skb->data = (void *) (unsigned long)tmp; | 2655 | skb->data = (void *) (unsigned long)tmp; |
| 2658 | skb_reset_tail_pointer(skb); | 2656 | skb_reset_tail_pointer(skb); |
| 2659 | 2657 | ||
| 2658 | /* AK: check is wrong. 0 can be valid dma address */ | ||
| 2660 | if (!(rxdp3->Buffer0_ptr)) | 2659 | if (!(rxdp3->Buffer0_ptr)) |
| 2661 | rxdp3->Buffer0_ptr = | 2660 | rxdp3->Buffer0_ptr = |
| 2662 | pci_map_single(ring->pdev, ba->ba_0, | 2661 | pci_map_single(ring->pdev, ba->ba_0, |
| @@ -2665,8 +2664,7 @@ static int fill_rx_buffers(struct ring_info *ring) | |||
| 2665 | pci_dma_sync_single_for_device(ring->pdev, | 2664 | pci_dma_sync_single_for_device(ring->pdev, |
| 2666 | (dma_addr_t) rxdp3->Buffer0_ptr, | 2665 | (dma_addr_t) rxdp3->Buffer0_ptr, |
| 2667 | BUF0_LEN, PCI_DMA_FROMDEVICE); | 2666 | BUF0_LEN, PCI_DMA_FROMDEVICE); |
| 2668 | if( (rxdp3->Buffer0_ptr == 0) || | 2667 | if (pci_dma_mapping_error(rxdp3->Buffer0_ptr)) |
| 2669 | (rxdp3->Buffer0_ptr == DMA_ERROR_CODE)) | ||
| 2670 | goto pci_map_failed; | 2668 | goto pci_map_failed; |
| 2671 | 2669 | ||
| 2672 | rxdp->Control_2 = SET_BUFFER0_SIZE_3(BUF0_LEN); | 2670 | rxdp->Control_2 = SET_BUFFER0_SIZE_3(BUF0_LEN); |
| @@ -2681,18 +2679,17 @@ static int fill_rx_buffers(struct ring_info *ring) | |||
| 2681 | (ring->pdev, skb->data, ring->mtu + 4, | 2679 | (ring->pdev, skb->data, ring->mtu + 4, |
| 2682 | PCI_DMA_FROMDEVICE); | 2680 | PCI_DMA_FROMDEVICE); |
| 2683 | 2681 | ||
| 2684 | if( (rxdp3->Buffer2_ptr == 0) || | 2682 | if (pci_dma_mapping_error(rxdp3->Buffer2_ptr)) |
| 2685 | (rxdp3->Buffer2_ptr == DMA_ERROR_CODE)) | ||
| 2686 | goto pci_map_failed; | 2683 | goto pci_map_failed; |
| 2687 | 2684 | ||
| 2685 | /* AK: check is wrong */ | ||
| 2688 | if (!rxdp3->Buffer1_ptr) | 2686 | if (!rxdp3->Buffer1_ptr) |
| 2689 | rxdp3->Buffer1_ptr = | 2687 | rxdp3->Buffer1_ptr = |
| 2690 | pci_map_single(ring->pdev, | 2688 | pci_map_single(ring->pdev, |
| 2691 | ba->ba_1, BUF1_LEN, | 2689 | ba->ba_1, BUF1_LEN, |
| 2692 | PCI_DMA_FROMDEVICE); | 2690 | PCI_DMA_FROMDEVICE); |
| 2693 | 2691 | ||
| 2694 | if( (rxdp3->Buffer1_ptr == 0) || | 2692 | if (pci_dma_mapping_error(rxdp3->Buffer1_ptr)) { |
| 2695 | (rxdp3->Buffer1_ptr == DMA_ERROR_CODE)) { | ||
| 2696 | pci_unmap_single | 2693 | pci_unmap_single |
| 2697 | (ring->pdev, | 2694 | (ring->pdev, |
| 2698 | (dma_addr_t)(unsigned long) | 2695 | (dma_addr_t)(unsigned long) |
| @@ -4264,16 +4261,14 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 4264 | txdp->Buffer_Pointer = pci_map_single(sp->pdev, | 4261 | txdp->Buffer_Pointer = pci_map_single(sp->pdev, |
| 4265 | fifo->ufo_in_band_v, | 4262 | fifo->ufo_in_band_v, |
| 4266 | sizeof(u64), PCI_DMA_TODEVICE); | 4263 | sizeof(u64), PCI_DMA_TODEVICE); |
| 4267 | if((txdp->Buffer_Pointer == 0) || | 4264 | if (pci_dma_mapping_error(txdp->Buffer_Pointer)) |
| 4268 | (txdp->Buffer_Pointer == DMA_ERROR_CODE)) | ||
| 4269 | goto pci_map_failed; | 4265 | goto pci_map_failed; |
| 4270 | txdp++; | 4266 | txdp++; |
| 4271 | } | 4267 | } |
| 4272 | 4268 | ||
| 4273 | txdp->Buffer_Pointer = pci_map_single | 4269 | txdp->Buffer_Pointer = pci_map_single |
| 4274 | (sp->pdev, skb->data, frg_len, PCI_DMA_TODEVICE); | 4270 | (sp->pdev, skb->data, frg_len, PCI_DMA_TODEVICE); |
| 4275 | if((txdp->Buffer_Pointer == 0) || | 4271 | if (pci_dma_mapping_error(txdp->Buffer_Pointer)) |
| 4276 | (txdp->Buffer_Pointer == DMA_ERROR_CODE)) | ||
| 4277 | goto pci_map_failed; | 4272 | goto pci_map_failed; |
| 4278 | 4273 | ||
| 4279 | txdp->Host_Control = (unsigned long) skb; | 4274 | txdp->Host_Control = (unsigned long) skb; |
| @@ -6884,10 +6879,8 @@ static int set_rxd_buffer_pointer(struct s2io_nic *sp, struct RxD_t *rxdp, | |||
| 6884 | pci_map_single( sp->pdev, (*skb)->data, | 6879 | pci_map_single( sp->pdev, (*skb)->data, |
| 6885 | size - NET_IP_ALIGN, | 6880 | size - NET_IP_ALIGN, |
| 6886 | PCI_DMA_FROMDEVICE); | 6881 | PCI_DMA_FROMDEVICE); |
| 6887 | if( (rxdp1->Buffer0_ptr == 0) || | 6882 | if (pci_dma_mapping_error(rxdp1->Buffer0_ptr)) |
| 6888 | (rxdp1->Buffer0_ptr == DMA_ERROR_CODE)) { | ||
| 6889 | goto memalloc_failed; | 6883 | goto memalloc_failed; |
| 6890 | } | ||
| 6891 | rxdp->Host_Control = (unsigned long) (*skb); | 6884 | rxdp->Host_Control = (unsigned long) (*skb); |
| 6892 | } | 6885 | } |
| 6893 | } else if ((sp->rxd_mode == RXD_MODE_3B) && (rxdp->Host_Control == 0)) { | 6886 | } else if ((sp->rxd_mode == RXD_MODE_3B) && (rxdp->Host_Control == 0)) { |
| @@ -6913,15 +6906,12 @@ static int set_rxd_buffer_pointer(struct s2io_nic *sp, struct RxD_t *rxdp, | |||
| 6913 | pci_map_single(sp->pdev, (*skb)->data, | 6906 | pci_map_single(sp->pdev, (*skb)->data, |
| 6914 | dev->mtu + 4, | 6907 | dev->mtu + 4, |
| 6915 | PCI_DMA_FROMDEVICE); | 6908 | PCI_DMA_FROMDEVICE); |
| 6916 | if( (rxdp3->Buffer2_ptr == 0) || | 6909 | if (pci_dma_mapping_error(rxdp3->Buffer2_ptr)) |
| 6917 | (rxdp3->Buffer2_ptr == DMA_ERROR_CODE)) { | ||
| 6918 | goto memalloc_failed; | 6910 | goto memalloc_failed; |
| 6919 | } | ||
| 6920 | rxdp3->Buffer0_ptr = *temp0 = | 6911 | rxdp3->Buffer0_ptr = *temp0 = |
| 6921 | pci_map_single( sp->pdev, ba->ba_0, BUF0_LEN, | 6912 | pci_map_single( sp->pdev, ba->ba_0, BUF0_LEN, |
| 6922 | PCI_DMA_FROMDEVICE); | 6913 | PCI_DMA_FROMDEVICE); |
| 6923 | if( (rxdp3->Buffer0_ptr == 0) || | 6914 | if (pci_dma_mapping_error(rxdp3->Buffer0_ptr)) { |
| 6924 | (rxdp3->Buffer0_ptr == DMA_ERROR_CODE)) { | ||
| 6925 | pci_unmap_single (sp->pdev, | 6915 | pci_unmap_single (sp->pdev, |
| 6926 | (dma_addr_t)rxdp3->Buffer2_ptr, | 6916 | (dma_addr_t)rxdp3->Buffer2_ptr, |
| 6927 | dev->mtu + 4, PCI_DMA_FROMDEVICE); | 6917 | dev->mtu + 4, PCI_DMA_FROMDEVICE); |
| @@ -6933,8 +6923,7 @@ static int set_rxd_buffer_pointer(struct s2io_nic *sp, struct RxD_t *rxdp, | |||
| 6933 | rxdp3->Buffer1_ptr = *temp1 = | 6923 | rxdp3->Buffer1_ptr = *temp1 = |
| 6934 | pci_map_single(sp->pdev, ba->ba_1, BUF1_LEN, | 6924 | pci_map_single(sp->pdev, ba->ba_1, BUF1_LEN, |
| 6935 | PCI_DMA_FROMDEVICE); | 6925 | PCI_DMA_FROMDEVICE); |
| 6936 | if( (rxdp3->Buffer1_ptr == 0) || | 6926 | if (pci_dma_mapping_error(rxdp3->Buffer1_ptr)) { |
| 6937 | (rxdp3->Buffer1_ptr == DMA_ERROR_CODE)) { | ||
| 6938 | pci_unmap_single (sp->pdev, | 6927 | pci_unmap_single (sp->pdev, |
| 6939 | (dma_addr_t)rxdp3->Buffer0_ptr, | 6928 | (dma_addr_t)rxdp3->Buffer0_ptr, |
| 6940 | BUF0_LEN, PCI_DMA_FROMDEVICE); | 6929 | BUF0_LEN, PCI_DMA_FROMDEVICE); |
diff --git a/drivers/net/s2io.h b/drivers/net/s2io.h index 4706f7f9acb6..1827b6686c98 100644 --- a/drivers/net/s2io.h +++ b/drivers/net/s2io.h | |||
| @@ -75,10 +75,6 @@ static int debug_level = ERR_DBG; | |||
| 75 | /* DEBUG message print. */ | 75 | /* DEBUG message print. */ |
| 76 | #define DBG_PRINT(dbg_level, args...) if(!(debug_level<dbg_level)) printk(args) | 76 | #define DBG_PRINT(dbg_level, args...) if(!(debug_level<dbg_level)) printk(args) |
| 77 | 77 | ||
| 78 | #ifndef DMA_ERROR_CODE | ||
| 79 | #define DMA_ERROR_CODE (~(dma_addr_t)0x0) | ||
| 80 | #endif | ||
| 81 | |||
| 82 | /* Protocol assist features of the NIC */ | 78 | /* Protocol assist features of the NIC */ |
| 83 | #define L3_CKSUM_OK 0xFFFF | 79 | #define L3_CKSUM_OK 0xFFFF |
| 84 | #define L4_CKSUM_OK 0xFFFF | 80 | #define L4_CKSUM_OK 0xFFFF |
diff --git a/drivers/net/tc35815.c b/drivers/net/tc35815.c index 10e4e85da3fc..b07b8cbadeaf 100644 --- a/drivers/net/tc35815.c +++ b/drivers/net/tc35815.c | |||
| @@ -1394,6 +1394,7 @@ tc35815_open(struct net_device *dev) | |||
| 1394 | tc35815_chip_init(dev); | 1394 | tc35815_chip_init(dev); |
| 1395 | spin_unlock_irq(&lp->lock); | 1395 | spin_unlock_irq(&lp->lock); |
| 1396 | 1396 | ||
| 1397 | netif_carrier_off(dev); | ||
| 1397 | /* schedule a link state check */ | 1398 | /* schedule a link state check */ |
| 1398 | phy_start(lp->phy_dev); | 1399 | phy_start(lp->phy_dev); |
| 1399 | 1400 | ||
| @@ -1735,7 +1736,6 @@ tc35815_rx(struct net_device *dev) | |||
| 1735 | skb = lp->rx_skbs[cur_bd].skb; | 1736 | skb = lp->rx_skbs[cur_bd].skb; |
| 1736 | prefetch(skb->data); | 1737 | prefetch(skb->data); |
| 1737 | lp->rx_skbs[cur_bd].skb = NULL; | 1738 | lp->rx_skbs[cur_bd].skb = NULL; |
| 1738 | lp->fbl_count--; | ||
| 1739 | pci_unmap_single(lp->pci_dev, | 1739 | pci_unmap_single(lp->pci_dev, |
| 1740 | lp->rx_skbs[cur_bd].skb_dma, | 1740 | lp->rx_skbs[cur_bd].skb_dma, |
| 1741 | RX_BUF_SIZE, PCI_DMA_FROMDEVICE); | 1741 | RX_BUF_SIZE, PCI_DMA_FROMDEVICE); |
| @@ -1791,6 +1791,7 @@ tc35815_rx(struct net_device *dev) | |||
| 1791 | #ifdef TC35815_USE_PACKEDBUFFER | 1791 | #ifdef TC35815_USE_PACKEDBUFFER |
| 1792 | while (lp->fbl_curid != id) | 1792 | while (lp->fbl_curid != id) |
| 1793 | #else | 1793 | #else |
| 1794 | lp->fbl_count--; | ||
| 1794 | while (lp->fbl_count < RX_BUF_NUM) | 1795 | while (lp->fbl_count < RX_BUF_NUM) |
| 1795 | #endif | 1796 | #endif |
| 1796 | { | 1797 | { |
| @@ -2453,6 +2454,7 @@ static int tc35815_resume(struct pci_dev *pdev) | |||
| 2453 | return 0; | 2454 | return 0; |
| 2454 | pci_set_power_state(pdev, PCI_D0); | 2455 | pci_set_power_state(pdev, PCI_D0); |
| 2455 | tc35815_restart(dev); | 2456 | tc35815_restart(dev); |
| 2457 | netif_carrier_off(dev); | ||
| 2456 | if (lp->phy_dev) | 2458 | if (lp->phy_dev) |
| 2457 | phy_start(lp->phy_dev); | 2459 | phy_start(lp->phy_dev); |
| 2458 | netif_device_attach(dev); | 2460 | netif_device_attach(dev); |
diff --git a/drivers/net/wan/x25_asy.c b/drivers/net/wan/x25_asy.c index 249e18053d5f..069f8bb0a99f 100644 --- a/drivers/net/wan/x25_asy.c +++ b/drivers/net/wan/x25_asy.c | |||
| @@ -32,6 +32,7 @@ | |||
| 32 | #include <linux/x25.h> | 32 | #include <linux/x25.h> |
| 33 | #include <linux/lapb.h> | 33 | #include <linux/lapb.h> |
| 34 | #include <linux/init.h> | 34 | #include <linux/init.h> |
| 35 | #include <linux/rtnetlink.h> | ||
| 35 | #include "x25_asy.h" | 36 | #include "x25_asy.h" |
| 36 | 37 | ||
| 37 | #include <net/x25device.h> | 38 | #include <net/x25device.h> |
| @@ -601,8 +602,10 @@ static void x25_asy_close_tty(struct tty_struct *tty) | |||
| 601 | if (!sl || sl->magic != X25_ASY_MAGIC) | 602 | if (!sl || sl->magic != X25_ASY_MAGIC) |
| 602 | return; | 603 | return; |
| 603 | 604 | ||
| 605 | rtnl_lock(); | ||
| 604 | if (sl->dev->flags & IFF_UP) | 606 | if (sl->dev->flags & IFF_UP) |
| 605 | dev_close(sl->dev); | 607 | dev_close(sl->dev); |
| 608 | rtnl_unlock(); | ||
| 606 | 609 | ||
| 607 | tty->disc_data = NULL; | 610 | tty->disc_data = NULL; |
| 608 | sl->tty = NULL; | 611 | sl->tty = NULL; |
diff --git a/drivers/net/wireless/b43/leds.c b/drivers/net/wireless/b43/leds.c index 36a9c42df835..76f4c7bad8b8 100644 --- a/drivers/net/wireless/b43/leds.c +++ b/drivers/net/wireless/b43/leds.c | |||
| @@ -72,6 +72,9 @@ static void b43_led_brightness_set(struct led_classdev *led_dev, | |||
| 72 | struct b43_wldev *dev = led->dev; | 72 | struct b43_wldev *dev = led->dev; |
| 73 | bool radio_enabled; | 73 | bool radio_enabled; |
| 74 | 74 | ||
| 75 | if (unlikely(b43_status(dev) < B43_STAT_INITIALIZED)) | ||
| 76 | return; | ||
| 77 | |||
| 75 | /* Checking the radio-enabled status here is slightly racy, | 78 | /* Checking the radio-enabled status here is slightly racy, |
| 76 | * but we want to avoid the locking overhead and we don't care | 79 | * but we want to avoid the locking overhead and we don't care |
| 77 | * whether the LED has the wrong state for a second. */ | 80 | * whether the LED has the wrong state for a second. */ |
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index fa4b0d8b74a2..a70827793086 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
| @@ -2883,12 +2883,11 @@ static int b43_op_tx(struct ieee80211_hw *hw, | |||
| 2883 | 2883 | ||
| 2884 | if (unlikely(skb->len < 2 + 2 + 6)) { | 2884 | if (unlikely(skb->len < 2 + 2 + 6)) { |
| 2885 | /* Too short, this can't be a valid frame. */ | 2885 | /* Too short, this can't be a valid frame. */ |
| 2886 | dev_kfree_skb_any(skb); | 2886 | goto drop_packet; |
| 2887 | return NETDEV_TX_OK; | ||
| 2888 | } | 2887 | } |
| 2889 | B43_WARN_ON(skb_shinfo(skb)->nr_frags); | 2888 | B43_WARN_ON(skb_shinfo(skb)->nr_frags); |
| 2890 | if (unlikely(!dev)) | 2889 | if (unlikely(!dev)) |
| 2891 | return NETDEV_TX_BUSY; | 2890 | goto drop_packet; |
| 2892 | 2891 | ||
| 2893 | /* Transmissions on seperate queues can run concurrently. */ | 2892 | /* Transmissions on seperate queues can run concurrently. */ |
| 2894 | read_lock_irqsave(&wl->tx_lock, flags); | 2893 | read_lock_irqsave(&wl->tx_lock, flags); |
| @@ -2904,7 +2903,12 @@ static int b43_op_tx(struct ieee80211_hw *hw, | |||
| 2904 | read_unlock_irqrestore(&wl->tx_lock, flags); | 2903 | read_unlock_irqrestore(&wl->tx_lock, flags); |
| 2905 | 2904 | ||
| 2906 | if (unlikely(err)) | 2905 | if (unlikely(err)) |
| 2907 | return NETDEV_TX_BUSY; | 2906 | goto drop_packet; |
| 2907 | return NETDEV_TX_OK; | ||
| 2908 | |||
| 2909 | drop_packet: | ||
| 2910 | /* We can not transmit this packet. Drop it. */ | ||
| 2911 | dev_kfree_skb_any(skb); | ||
| 2908 | return NETDEV_TX_OK; | 2912 | return NETDEV_TX_OK; |
| 2909 | } | 2913 | } |
| 2910 | 2914 | ||
diff --git a/drivers/net/wireless/b43legacy/dma.c b/drivers/net/wireless/b43legacy/dma.c index c990f87b107a..93ddc1cbcc8b 100644 --- a/drivers/net/wireless/b43legacy/dma.c +++ b/drivers/net/wireless/b43legacy/dma.c | |||
| @@ -876,6 +876,7 @@ struct b43legacy_dmaring *b43legacy_setup_dmaring(struct b43legacy_wldev *dev, | |||
| 876 | if (!ring) | 876 | if (!ring) |
| 877 | goto out; | 877 | goto out; |
| 878 | ring->type = type; | 878 | ring->type = type; |
| 879 | ring->dev = dev; | ||
| 879 | 880 | ||
| 880 | nr_slots = B43legacy_RXRING_SLOTS; | 881 | nr_slots = B43legacy_RXRING_SLOTS; |
| 881 | if (for_tx) | 882 | if (for_tx) |
| @@ -922,7 +923,6 @@ struct b43legacy_dmaring *b43legacy_setup_dmaring(struct b43legacy_wldev *dev, | |||
| 922 | DMA_TO_DEVICE); | 923 | DMA_TO_DEVICE); |
| 923 | } | 924 | } |
| 924 | 925 | ||
| 925 | ring->dev = dev; | ||
| 926 | ring->nr_slots = nr_slots; | 926 | ring->nr_slots = nr_slots; |
| 927 | ring->mmio_base = b43legacy_dmacontroller_base(type, controller_index); | 927 | ring->mmio_base = b43legacy_dmacontroller_base(type, controller_index); |
| 928 | ring->index = controller_index; | 928 | ring->index = controller_index; |
diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c index 204077c13870..3e612d0a13e8 100644 --- a/drivers/net/wireless/b43legacy/main.c +++ b/drivers/net/wireless/b43legacy/main.c | |||
| @@ -2378,8 +2378,10 @@ static int b43legacy_op_tx(struct ieee80211_hw *hw, | |||
| 2378 | } else | 2378 | } else |
| 2379 | err = b43legacy_dma_tx(dev, skb, ctl); | 2379 | err = b43legacy_dma_tx(dev, skb, ctl); |
| 2380 | out: | 2380 | out: |
| 2381 | if (unlikely(err)) | 2381 | if (unlikely(err)) { |
| 2382 | return NETDEV_TX_BUSY; | 2382 | /* Drop the packet. */ |
| 2383 | dev_kfree_skb_any(skb); | ||
| 2384 | } | ||
| 2383 | return NETDEV_TX_OK; | 2385 | return NETDEV_TX_OK; |
| 2384 | } | 2386 | } |
| 2385 | 2387 | ||
diff --git a/drivers/net/wireless/hostap/hostap_80211_rx.c b/drivers/net/wireless/hostap/hostap_80211_rx.c index 4fd73809602e..020f450e9dba 100644 --- a/drivers/net/wireless/hostap/hostap_80211_rx.c +++ b/drivers/net/wireless/hostap/hostap_80211_rx.c | |||
| @@ -64,7 +64,7 @@ int prism2_rx_80211(struct net_device *dev, struct sk_buff *skb, | |||
| 64 | int hdrlen, phdrlen, head_need, tail_need; | 64 | int hdrlen, phdrlen, head_need, tail_need; |
| 65 | u16 fc; | 65 | u16 fc; |
| 66 | int prism_header, ret; | 66 | int prism_header, ret; |
| 67 | struct ieee80211_hdr_4addr *hdr; | 67 | struct ieee80211_hdr_4addr *fhdr; |
| 68 | 68 | ||
| 69 | iface = netdev_priv(dev); | 69 | iface = netdev_priv(dev); |
| 70 | local = iface->local; | 70 | local = iface->local; |
| @@ -83,8 +83,8 @@ int prism2_rx_80211(struct net_device *dev, struct sk_buff *skb, | |||
| 83 | phdrlen = 0; | 83 | phdrlen = 0; |
| 84 | } | 84 | } |
| 85 | 85 | ||
| 86 | hdr = (struct ieee80211_hdr_4addr *) skb->data; | 86 | fhdr = (struct ieee80211_hdr_4addr *) skb->data; |
| 87 | fc = le16_to_cpu(hdr->frame_ctl); | 87 | fc = le16_to_cpu(fhdr->frame_ctl); |
| 88 | 88 | ||
| 89 | if (type == PRISM2_RX_MGMT && (fc & IEEE80211_FCTL_VERS)) { | 89 | if (type == PRISM2_RX_MGMT && (fc & IEEE80211_FCTL_VERS)) { |
| 90 | printk(KERN_DEBUG "%s: dropped management frame with header " | 90 | printk(KERN_DEBUG "%s: dropped management frame with header " |
| @@ -551,7 +551,7 @@ hostap_rx_frame_wds(local_info_t *local, struct ieee80211_hdr_4addr *hdr, | |||
| 551 | hdr->addr1[2] != 0xff || hdr->addr1[3] != 0xff || | 551 | hdr->addr1[2] != 0xff || hdr->addr1[3] != 0xff || |
| 552 | hdr->addr1[4] != 0xff || hdr->addr1[5] != 0xff)) { | 552 | hdr->addr1[4] != 0xff || hdr->addr1[5] != 0xff)) { |
| 553 | /* RA (or BSSID) is not ours - drop */ | 553 | /* RA (or BSSID) is not ours - drop */ |
| 554 | PDEBUG(DEBUG_EXTRA, "%s: received WDS frame with " | 554 | PDEBUG(DEBUG_EXTRA2, "%s: received WDS frame with " |
| 555 | "not own or broadcast %s=%s\n", | 555 | "not own or broadcast %s=%s\n", |
| 556 | local->dev->name, | 556 | local->dev->name, |
| 557 | fc & IEEE80211_FCTL_FROMDS ? "RA" : "BSSID", | 557 | fc & IEEE80211_FCTL_FROMDS ? "RA" : "BSSID", |
diff --git a/drivers/net/wireless/hostap/hostap_ap.c b/drivers/net/wireless/hostap/hostap_ap.c index 0acd9589c48c..ab981afd481d 100644 --- a/drivers/net/wireless/hostap/hostap_ap.c +++ b/drivers/net/wireless/hostap/hostap_ap.c | |||
| @@ -1930,7 +1930,7 @@ static void handle_pspoll(local_info_t *local, | |||
| 1930 | PDEBUG(DEBUG_PS, " PSPOLL and AID[15:14] not set\n"); | 1930 | PDEBUG(DEBUG_PS, " PSPOLL and AID[15:14] not set\n"); |
| 1931 | return; | 1931 | return; |
| 1932 | } | 1932 | } |
| 1933 | aid &= ~BIT(15) & ~BIT(14); | 1933 | aid &= ~(BIT(15) | BIT(14)); |
| 1934 | if (aid == 0 || aid > MAX_AID_TABLE_SIZE) { | 1934 | if (aid == 0 || aid > MAX_AID_TABLE_SIZE) { |
| 1935 | PDEBUG(DEBUG_PS, " invalid aid=%d\n", aid); | 1935 | PDEBUG(DEBUG_PS, " invalid aid=%d\n", aid); |
| 1936 | return; | 1936 | return; |
diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c index ed4317a17cbb..80039a0ae027 100644 --- a/drivers/net/wireless/hostap/hostap_cs.c +++ b/drivers/net/wireless/hostap/hostap_cs.c | |||
| @@ -533,10 +533,10 @@ static void prism2_detach(struct pcmcia_device *link) | |||
| 533 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) | 533 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) |
| 534 | 534 | ||
| 535 | #define CFG_CHECK2(fn, retf) \ | 535 | #define CFG_CHECK2(fn, retf) \ |
| 536 | do { int ret = (retf); \ | 536 | do { int _ret = (retf); \ |
| 537 | if (ret != 0) { \ | 537 | if (_ret != 0) { \ |
| 538 | PDEBUG(DEBUG_EXTRA, "CardServices(" #fn ") returned %d\n", ret); \ | 538 | PDEBUG(DEBUG_EXTRA, "CardServices(" #fn ") returned %d\n", _ret); \ |
| 539 | cs_error(link, fn, ret); \ | 539 | cs_error(link, fn, _ret); \ |
| 540 | goto next_entry; \ | 540 | goto next_entry; \ |
| 541 | } \ | 541 | } \ |
| 542 | } while (0) | 542 | } while (0) |
diff --git a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c index cdf90c40f11b..936f52e3d95c 100644 --- a/drivers/net/wireless/hostap/hostap_hw.c +++ b/drivers/net/wireless/hostap/hostap_hw.c | |||
| @@ -2835,7 +2835,7 @@ static void hostap_passive_scan(unsigned long data) | |||
| 2835 | { | 2835 | { |
| 2836 | local_info_t *local = (local_info_t *) data; | 2836 | local_info_t *local = (local_info_t *) data; |
| 2837 | struct net_device *dev = local->dev; | 2837 | struct net_device *dev = local->dev; |
| 2838 | u16 channel; | 2838 | u16 chan; |
| 2839 | 2839 | ||
| 2840 | if (local->passive_scan_interval <= 0) | 2840 | if (local->passive_scan_interval <= 0) |
| 2841 | return; | 2841 | return; |
| @@ -2872,11 +2872,11 @@ static void hostap_passive_scan(unsigned long data) | |||
| 2872 | 2872 | ||
| 2873 | printk(KERN_DEBUG "%s: passive scan channel %d\n", | 2873 | printk(KERN_DEBUG "%s: passive scan channel %d\n", |
| 2874 | dev->name, local->passive_scan_channel); | 2874 | dev->name, local->passive_scan_channel); |
| 2875 | channel = local->passive_scan_channel; | 2875 | chan = local->passive_scan_channel; |
| 2876 | local->passive_scan_state = PASSIVE_SCAN_WAIT; | 2876 | local->passive_scan_state = PASSIVE_SCAN_WAIT; |
| 2877 | local->passive_scan_timer.expires = jiffies + HZ / 10; | 2877 | local->passive_scan_timer.expires = jiffies + HZ / 10; |
| 2878 | } else { | 2878 | } else { |
| 2879 | channel = local->channel; | 2879 | chan = local->channel; |
| 2880 | local->passive_scan_state = PASSIVE_SCAN_LISTEN; | 2880 | local->passive_scan_state = PASSIVE_SCAN_LISTEN; |
| 2881 | local->passive_scan_timer.expires = jiffies + | 2881 | local->passive_scan_timer.expires = jiffies + |
| 2882 | local->passive_scan_interval * HZ; | 2882 | local->passive_scan_interval * HZ; |
| @@ -2884,9 +2884,9 @@ static void hostap_passive_scan(unsigned long data) | |||
| 2884 | 2884 | ||
| 2885 | if (hfa384x_cmd_callback(dev, HFA384X_CMDCODE_TEST | | 2885 | if (hfa384x_cmd_callback(dev, HFA384X_CMDCODE_TEST | |
| 2886 | (HFA384X_TEST_CHANGE_CHANNEL << 8), | 2886 | (HFA384X_TEST_CHANGE_CHANNEL << 8), |
| 2887 | channel, NULL, 0)) | 2887 | chan, NULL, 0)) |
| 2888 | printk(KERN_ERR "%s: passive scan channel set %d " | 2888 | printk(KERN_ERR "%s: passive scan channel set %d " |
| 2889 | "failed\n", dev->name, channel); | 2889 | "failed\n", dev->name, chan); |
| 2890 | 2890 | ||
| 2891 | add_timer(&local->passive_scan_timer); | 2891 | add_timer(&local->passive_scan_timer); |
| 2892 | } | 2892 | } |
diff --git a/drivers/net/wireless/hostap/hostap_main.c b/drivers/net/wireless/hostap/hostap_main.c index f7aec9309d04..a38e85f334df 100644 --- a/drivers/net/wireless/hostap/hostap_main.c +++ b/drivers/net/wireless/hostap/hostap_main.c | |||
| @@ -594,7 +594,8 @@ void hostap_dump_tx_header(const char *name, const struct hfa384x_tx_frame *tx) | |||
| 594 | } | 594 | } |
| 595 | 595 | ||
| 596 | 596 | ||
| 597 | int hostap_80211_header_parse(const struct sk_buff *skb, unsigned char *haddr) | 597 | static int hostap_80211_header_parse(const struct sk_buff *skb, |
| 598 | unsigned char *haddr) | ||
| 598 | { | 599 | { |
| 599 | struct hostap_interface *iface = netdev_priv(skb->dev); | 600 | struct hostap_interface *iface = netdev_priv(skb->dev); |
| 600 | local_info_t *local = iface->local; | 601 | local_info_t *local = iface->local; |
| @@ -857,7 +858,6 @@ const struct header_ops hostap_80211_ops = { | |||
| 857 | .rebuild = eth_rebuild_header, | 858 | .rebuild = eth_rebuild_header, |
| 858 | .cache = eth_header_cache, | 859 | .cache = eth_header_cache, |
| 859 | .cache_update = eth_header_cache_update, | 860 | .cache_update = eth_header_cache_update, |
| 860 | |||
| 861 | .parse = hostap_80211_header_parse, | 861 | .parse = hostap_80211_header_parse, |
| 862 | }; | 862 | }; |
| 863 | EXPORT_SYMBOL(hostap_80211_ops); | 863 | EXPORT_SYMBOL(hostap_80211_ops); |
| @@ -1150,7 +1150,6 @@ EXPORT_SYMBOL(hostap_set_roaming); | |||
| 1150 | EXPORT_SYMBOL(hostap_set_auth_algs); | 1150 | EXPORT_SYMBOL(hostap_set_auth_algs); |
| 1151 | EXPORT_SYMBOL(hostap_dump_rx_header); | 1151 | EXPORT_SYMBOL(hostap_dump_rx_header); |
| 1152 | EXPORT_SYMBOL(hostap_dump_tx_header); | 1152 | EXPORT_SYMBOL(hostap_dump_tx_header); |
| 1153 | EXPORT_SYMBOL(hostap_80211_header_parse); | ||
| 1154 | EXPORT_SYMBOL(hostap_80211_get_hdrlen); | 1153 | EXPORT_SYMBOL(hostap_80211_get_hdrlen); |
| 1155 | EXPORT_SYMBOL(hostap_get_stats); | 1154 | EXPORT_SYMBOL(hostap_get_stats); |
| 1156 | EXPORT_SYMBOL(hostap_setup_dev); | 1155 | EXPORT_SYMBOL(hostap_setup_dev); |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 13925b627e3b..b1b3c523185d 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
| @@ -2227,7 +2227,10 @@ static int iwl3945_scan_initiate(struct iwl3945_priv *priv) | |||
| 2227 | } | 2227 | } |
| 2228 | 2228 | ||
| 2229 | IWL_DEBUG_INFO("Starting scan...\n"); | 2229 | IWL_DEBUG_INFO("Starting scan...\n"); |
| 2230 | priv->scan_bands = 2; | 2230 | if (priv->cfg->sku & IWL_SKU_G) |
| 2231 | priv->scan_bands |= BIT(IEEE80211_BAND_2GHZ); | ||
| 2232 | if (priv->cfg->sku & IWL_SKU_A) | ||
| 2233 | priv->scan_bands |= BIT(IEEE80211_BAND_5GHZ); | ||
| 2231 | set_bit(STATUS_SCANNING, &priv->status); | 2234 | set_bit(STATUS_SCANNING, &priv->status); |
| 2232 | priv->scan_start = jiffies; | 2235 | priv->scan_start = jiffies; |
| 2233 | priv->scan_pass_start = priv->scan_start; | 2236 | priv->scan_pass_start = priv->scan_start; |
| @@ -3352,13 +3355,18 @@ static void iwl3945_rx_scan_complete_notif(struct iwl3945_priv *priv, | |||
| 3352 | cancel_delayed_work(&priv->scan_check); | 3355 | cancel_delayed_work(&priv->scan_check); |
| 3353 | 3356 | ||
| 3354 | IWL_DEBUG_INFO("Scan pass on %sGHz took %dms\n", | 3357 | IWL_DEBUG_INFO("Scan pass on %sGHz took %dms\n", |
| 3355 | (priv->scan_bands == 2) ? "2.4" : "5.2", | 3358 | (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) ? |
| 3359 | "2.4" : "5.2", | ||
| 3356 | jiffies_to_msecs(elapsed_jiffies | 3360 | jiffies_to_msecs(elapsed_jiffies |
| 3357 | (priv->scan_pass_start, jiffies))); | 3361 | (priv->scan_pass_start, jiffies))); |
| 3358 | 3362 | ||
| 3359 | /* Remove this scanned band from the list | 3363 | /* Remove this scanned band from the list of pending |
| 3360 | * of pending bands to scan */ | 3364 | * bands to scan, band G precedes A in order of scanning |
| 3361 | priv->scan_bands--; | 3365 | * as seen in iwl3945_bg_request_scan */ |
| 3366 | if (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) | ||
| 3367 | priv->scan_bands &= ~BIT(IEEE80211_BAND_2GHZ); | ||
| 3368 | else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) | ||
| 3369 | priv->scan_bands &= ~BIT(IEEE80211_BAND_5GHZ); | ||
| 3362 | 3370 | ||
| 3363 | /* If a request to abort was given, or the scan did not succeed | 3371 | /* If a request to abort was given, or the scan did not succeed |
| 3364 | * then we reset the scan state machine and terminate, | 3372 | * then we reset the scan state machine and terminate, |
| @@ -4972,7 +4980,7 @@ static int iwl3945_get_channels_for_scan(struct iwl3945_priv *priv, | |||
| 4972 | 4980 | ||
| 4973 | ch_info = iwl3945_get_channel_info(priv, band, scan_ch->channel); | 4981 | ch_info = iwl3945_get_channel_info(priv, band, scan_ch->channel); |
| 4974 | if (!is_channel_valid(ch_info)) { | 4982 | if (!is_channel_valid(ch_info)) { |
| 4975 | IWL_DEBUG_SCAN("Channel %d is INVALID for this SKU.\n", | 4983 | IWL_DEBUG_SCAN("Channel %d is INVALID for this band.\n", |
| 4976 | scan_ch->channel); | 4984 | scan_ch->channel); |
| 4977 | continue; | 4985 | continue; |
| 4978 | } | 4986 | } |
| @@ -6315,21 +6323,16 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
| 6315 | 6323 | ||
| 6316 | /* flags + rate selection */ | 6324 | /* flags + rate selection */ |
| 6317 | 6325 | ||
| 6318 | switch (priv->scan_bands) { | 6326 | if (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) { |
| 6319 | case 2: | ||
| 6320 | scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK; | 6327 | scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK; |
| 6321 | scan->tx_cmd.rate = IWL_RATE_1M_PLCP; | 6328 | scan->tx_cmd.rate = IWL_RATE_1M_PLCP; |
| 6322 | scan->good_CRC_th = 0; | 6329 | scan->good_CRC_th = 0; |
| 6323 | band = IEEE80211_BAND_2GHZ; | 6330 | band = IEEE80211_BAND_2GHZ; |
| 6324 | break; | 6331 | } else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) { |
| 6325 | |||
| 6326 | case 1: | ||
| 6327 | scan->tx_cmd.rate = IWL_RATE_6M_PLCP; | 6332 | scan->tx_cmd.rate = IWL_RATE_6M_PLCP; |
| 6328 | scan->good_CRC_th = IWL_GOOD_CRC_TH; | 6333 | scan->good_CRC_th = IWL_GOOD_CRC_TH; |
| 6329 | band = IEEE80211_BAND_5GHZ; | 6334 | band = IEEE80211_BAND_5GHZ; |
| 6330 | break; | 6335 | } else { |
| 6331 | |||
| 6332 | default: | ||
| 6333 | IWL_WARNING("Invalid scan band count\n"); | 6336 | IWL_WARNING("Invalid scan band count\n"); |
| 6334 | goto done; | 6337 | goto done; |
| 6335 | } | 6338 | } |
| @@ -6770,7 +6773,7 @@ static int iwl3945_mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *co | |||
| 6770 | ch_info = iwl3945_get_channel_info(priv, conf->channel->band, | 6773 | ch_info = iwl3945_get_channel_info(priv, conf->channel->band, |
| 6771 | conf->channel->hw_value); | 6774 | conf->channel->hw_value); |
| 6772 | if (!is_channel_valid(ch_info)) { | 6775 | if (!is_channel_valid(ch_info)) { |
| 6773 | IWL_DEBUG_SCAN("Channel %d [%d] is INVALID for this SKU.\n", | 6776 | IWL_DEBUG_SCAN("Channel %d [%d] is INVALID for this band.\n", |
| 6774 | conf->channel->hw_value, conf->channel->band); | 6777 | conf->channel->hw_value, conf->channel->band); |
| 6775 | IWL_DEBUG_MAC80211("leave - invalid channel\n"); | 6778 | IWL_DEBUG_MAC80211("leave - invalid channel\n"); |
| 6776 | spin_unlock_irqrestore(&priv->lock, flags); | 6779 | spin_unlock_irqrestore(&priv->lock, flags); |
diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c b/drivers/net/wireless/iwlwifi/iwl4965-base.c index 883b42f7e998..5ed16ce78468 100644 --- a/drivers/net/wireless/iwlwifi/iwl4965-base.c +++ b/drivers/net/wireless/iwlwifi/iwl4965-base.c | |||
| @@ -1774,7 +1774,10 @@ static int iwl4965_scan_initiate(struct iwl_priv *priv) | |||
| 1774 | } | 1774 | } |
| 1775 | 1775 | ||
| 1776 | IWL_DEBUG_INFO("Starting scan...\n"); | 1776 | IWL_DEBUG_INFO("Starting scan...\n"); |
| 1777 | priv->scan_bands = 2; | 1777 | if (priv->cfg->sku & IWL_SKU_G) |
| 1778 | priv->scan_bands |= BIT(IEEE80211_BAND_2GHZ); | ||
| 1779 | if (priv->cfg->sku & IWL_SKU_A) | ||
| 1780 | priv->scan_bands |= BIT(IEEE80211_BAND_5GHZ); | ||
| 1778 | set_bit(STATUS_SCANNING, &priv->status); | 1781 | set_bit(STATUS_SCANNING, &priv->status); |
| 1779 | priv->scan_start = jiffies; | 1782 | priv->scan_start = jiffies; |
| 1780 | priv->scan_pass_start = priv->scan_start; | 1783 | priv->scan_pass_start = priv->scan_start; |
| @@ -3023,8 +3026,9 @@ static void iwl4965_rx_reply_tx(struct iwl_priv *priv, | |||
| 3023 | 3026 | ||
| 3024 | IWL_DEBUG_TX_REPLY("Tx queue reclaim %d\n", index); | 3027 | IWL_DEBUG_TX_REPLY("Tx queue reclaim %d\n", index); |
| 3025 | if (index != -1) { | 3028 | if (index != -1) { |
| 3026 | int freed = iwl4965_tx_queue_reclaim(priv, txq_id, index); | ||
| 3027 | #ifdef CONFIG_IWL4965_HT | 3029 | #ifdef CONFIG_IWL4965_HT |
| 3030 | int freed = iwl4965_tx_queue_reclaim(priv, txq_id, index); | ||
| 3031 | |||
| 3028 | if (tid != MAX_TID_COUNT) | 3032 | if (tid != MAX_TID_COUNT) |
| 3029 | priv->stations[sta_id].tid[tid].tfds_in_queue -= freed; | 3033 | priv->stations[sta_id].tid[tid].tfds_in_queue -= freed; |
| 3030 | if (iwl4965_queue_space(&txq->q) > txq->q.low_mark && | 3034 | if (iwl4965_queue_space(&txq->q) > txq->q.low_mark && |
| @@ -3276,13 +3280,18 @@ static void iwl4965_rx_scan_complete_notif(struct iwl_priv *priv, | |||
| 3276 | cancel_delayed_work(&priv->scan_check); | 3280 | cancel_delayed_work(&priv->scan_check); |
| 3277 | 3281 | ||
| 3278 | IWL_DEBUG_INFO("Scan pass on %sGHz took %dms\n", | 3282 | IWL_DEBUG_INFO("Scan pass on %sGHz took %dms\n", |
| 3279 | (priv->scan_bands == 2) ? "2.4" : "5.2", | 3283 | (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) ? |
| 3284 | "2.4" : "5.2", | ||
| 3280 | jiffies_to_msecs(elapsed_jiffies | 3285 | jiffies_to_msecs(elapsed_jiffies |
| 3281 | (priv->scan_pass_start, jiffies))); | 3286 | (priv->scan_pass_start, jiffies))); |
| 3282 | 3287 | ||
| 3283 | /* Remove this scanned band from the list | 3288 | /* Remove this scanned band from the list of pending |
| 3284 | * of pending bands to scan */ | 3289 | * bands to scan, band G precedes A in order of scanning |
| 3285 | priv->scan_bands--; | 3290 | * as seen in iwl_bg_request_scan */ |
| 3291 | if (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) | ||
| 3292 | priv->scan_bands &= ~BIT(IEEE80211_BAND_2GHZ); | ||
| 3293 | else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) | ||
| 3294 | priv->scan_bands &= ~BIT(IEEE80211_BAND_5GHZ); | ||
| 3286 | 3295 | ||
| 3287 | /* If a request to abort was given, or the scan did not succeed | 3296 | /* If a request to abort was given, or the scan did not succeed |
| 3288 | * then we reset the scan state machine and terminate, | 3297 | * then we reset the scan state machine and terminate, |
| @@ -3292,7 +3301,7 @@ static void iwl4965_rx_scan_complete_notif(struct iwl_priv *priv, | |||
| 3292 | clear_bit(STATUS_SCAN_ABORTING, &priv->status); | 3301 | clear_bit(STATUS_SCAN_ABORTING, &priv->status); |
| 3293 | } else { | 3302 | } else { |
| 3294 | /* If there are more bands on this scan pass reschedule */ | 3303 | /* If there are more bands on this scan pass reschedule */ |
| 3295 | if (priv->scan_bands > 0) | 3304 | if (priv->scan_bands) |
| 3296 | goto reschedule; | 3305 | goto reschedule; |
| 3297 | } | 3306 | } |
| 3298 | 3307 | ||
| @@ -4635,10 +4644,9 @@ static int iwl4965_get_channels_for_scan(struct iwl_priv *priv, | |||
| 4635 | 4644 | ||
| 4636 | scan_ch->channel = ieee80211_frequency_to_channel(channels[i].center_freq); | 4645 | scan_ch->channel = ieee80211_frequency_to_channel(channels[i].center_freq); |
| 4637 | 4646 | ||
| 4638 | ch_info = iwl_get_channel_info(priv, band, | 4647 | ch_info = iwl_get_channel_info(priv, band, scan_ch->channel); |
| 4639 | scan_ch->channel); | ||
| 4640 | if (!is_channel_valid(ch_info)) { | 4648 | if (!is_channel_valid(ch_info)) { |
| 4641 | IWL_DEBUG_SCAN("Channel %d is INVALID for this SKU.\n", | 4649 | IWL_DEBUG_SCAN("Channel %d is INVALID for this band.\n", |
| 4642 | scan_ch->channel); | 4650 | scan_ch->channel); |
| 4643 | continue; | 4651 | continue; |
| 4644 | } | 4652 | } |
| @@ -5830,8 +5838,7 @@ static void iwl4965_bg_request_scan(struct work_struct *data) | |||
| 5830 | scan->tx_cmd.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE; | 5838 | scan->tx_cmd.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE; |
| 5831 | 5839 | ||
| 5832 | 5840 | ||
| 5833 | switch (priv->scan_bands) { | 5841 | if (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) { |
| 5834 | case 2: | ||
| 5835 | scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK; | 5842 | scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK; |
| 5836 | scan->tx_cmd.rate_n_flags = | 5843 | scan->tx_cmd.rate_n_flags = |
| 5837 | iwl4965_hw_set_rate_n_flags(IWL_RATE_1M_PLCP, | 5844 | iwl4965_hw_set_rate_n_flags(IWL_RATE_1M_PLCP, |
| @@ -5839,17 +5846,13 @@ static void iwl4965_bg_request_scan(struct work_struct *data) | |||
| 5839 | 5846 | ||
| 5840 | scan->good_CRC_th = 0; | 5847 | scan->good_CRC_th = 0; |
| 5841 | band = IEEE80211_BAND_2GHZ; | 5848 | band = IEEE80211_BAND_2GHZ; |
| 5842 | break; | 5849 | } else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) { |
| 5843 | |||
| 5844 | case 1: | ||
| 5845 | scan->tx_cmd.rate_n_flags = | 5850 | scan->tx_cmd.rate_n_flags = |
| 5846 | iwl4965_hw_set_rate_n_flags(IWL_RATE_6M_PLCP, | 5851 | iwl4965_hw_set_rate_n_flags(IWL_RATE_6M_PLCP, |
| 5847 | RATE_MCS_ANT_B_MSK); | 5852 | RATE_MCS_ANT_B_MSK); |
| 5848 | scan->good_CRC_th = IWL_GOOD_CRC_TH; | 5853 | scan->good_CRC_th = IWL_GOOD_CRC_TH; |
| 5849 | band = IEEE80211_BAND_5GHZ; | 5854 | band = IEEE80211_BAND_5GHZ; |
| 5850 | break; | 5855 | } else { |
| 5851 | |||
| 5852 | default: | ||
| 5853 | IWL_WARNING("Invalid scan band count\n"); | 5856 | IWL_WARNING("Invalid scan band count\n"); |
| 5854 | goto done; | 5857 | goto done; |
| 5855 | } | 5858 | } |
diff --git a/drivers/net/wireless/prism54/islpci_eth.c b/drivers/net/wireless/prism54/islpci_eth.c index 762e85bef55d..e43bae97ed8f 100644 --- a/drivers/net/wireless/prism54/islpci_eth.c +++ b/drivers/net/wireless/prism54/islpci_eth.c | |||
| @@ -290,7 +290,7 @@ islpci_monitor_rx(islpci_private *priv, struct sk_buff **skb) | |||
| 290 | 290 | ||
| 291 | avs->version = cpu_to_be32(P80211CAPTURE_VERSION); | 291 | avs->version = cpu_to_be32(P80211CAPTURE_VERSION); |
| 292 | avs->length = cpu_to_be32(sizeof (struct avs_80211_1_header)); | 292 | avs->length = cpu_to_be32(sizeof (struct avs_80211_1_header)); |
| 293 | avs->mactime = cpu_to_be64(le64_to_cpu(clock)); | 293 | avs->mactime = cpu_to_be64(clock); |
| 294 | avs->hosttime = cpu_to_be64(jiffies); | 294 | avs->hosttime = cpu_to_be64(jiffies); |
| 295 | avs->phytype = cpu_to_be32(6); /*OFDM: 6 for (g), 8 for (a) */ | 295 | avs->phytype = cpu_to_be32(6); /*OFDM: 6 for (g), 8 for (a) */ |
| 296 | avs->channel = cpu_to_be32(channel_of_freq(freq)); | 296 | avs->channel = cpu_to_be32(channel_of_freq(freq)); |
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index fdbd0ef2be4b..61e59c17a60a 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c | |||
| @@ -138,11 +138,8 @@ static void rt2500usb_bbp_write(struct rt2x00_dev *rt2x00dev, | |||
| 138 | * Wait until the BBP becomes ready. | 138 | * Wait until the BBP becomes ready. |
| 139 | */ | 139 | */ |
| 140 | reg = rt2500usb_bbp_check(rt2x00dev); | 140 | reg = rt2500usb_bbp_check(rt2x00dev); |
| 141 | if (rt2x00_get_field16(reg, PHY_CSR8_BUSY)) { | 141 | if (rt2x00_get_field16(reg, PHY_CSR8_BUSY)) |
| 142 | ERROR(rt2x00dev, "PHY_CSR8 register busy. Write failed.\n"); | 142 | goto exit_fail; |
| 143 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | ||
| 144 | return; | ||
| 145 | } | ||
| 146 | 143 | ||
| 147 | /* | 144 | /* |
| 148 | * Write the data into the BBP. | 145 | * Write the data into the BBP. |
| @@ -155,6 +152,13 @@ static void rt2500usb_bbp_write(struct rt2x00_dev *rt2x00dev, | |||
| 155 | rt2500usb_register_write_lock(rt2x00dev, PHY_CSR7, reg); | 152 | rt2500usb_register_write_lock(rt2x00dev, PHY_CSR7, reg); |
| 156 | 153 | ||
| 157 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | 154 | mutex_unlock(&rt2x00dev->usb_cache_mutex); |
| 155 | |||
| 156 | return; | ||
| 157 | |||
| 158 | exit_fail: | ||
| 159 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | ||
| 160 | |||
| 161 | ERROR(rt2x00dev, "PHY_CSR8 register busy. Write failed.\n"); | ||
| 158 | } | 162 | } |
| 159 | 163 | ||
| 160 | static void rt2500usb_bbp_read(struct rt2x00_dev *rt2x00dev, | 164 | static void rt2500usb_bbp_read(struct rt2x00_dev *rt2x00dev, |
| @@ -168,10 +172,8 @@ static void rt2500usb_bbp_read(struct rt2x00_dev *rt2x00dev, | |||
| 168 | * Wait until the BBP becomes ready. | 172 | * Wait until the BBP becomes ready. |
| 169 | */ | 173 | */ |
| 170 | reg = rt2500usb_bbp_check(rt2x00dev); | 174 | reg = rt2500usb_bbp_check(rt2x00dev); |
| 171 | if (rt2x00_get_field16(reg, PHY_CSR8_BUSY)) { | 175 | if (rt2x00_get_field16(reg, PHY_CSR8_BUSY)) |
| 172 | ERROR(rt2x00dev, "PHY_CSR8 register busy. Read failed.\n"); | 176 | goto exit_fail; |
| 173 | return; | ||
| 174 | } | ||
| 175 | 177 | ||
| 176 | /* | 178 | /* |
| 177 | * Write the request into the BBP. | 179 | * Write the request into the BBP. |
| @@ -186,17 +188,21 @@ static void rt2500usb_bbp_read(struct rt2x00_dev *rt2x00dev, | |||
| 186 | * Wait until the BBP becomes ready. | 188 | * Wait until the BBP becomes ready. |
| 187 | */ | 189 | */ |
| 188 | reg = rt2500usb_bbp_check(rt2x00dev); | 190 | reg = rt2500usb_bbp_check(rt2x00dev); |
| 189 | if (rt2x00_get_field16(reg, PHY_CSR8_BUSY)) { | 191 | if (rt2x00_get_field16(reg, PHY_CSR8_BUSY)) |
| 190 | ERROR(rt2x00dev, "PHY_CSR8 register busy. Read failed.\n"); | 192 | goto exit_fail; |
| 191 | *value = 0xff; | ||
| 192 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | ||
| 193 | return; | ||
| 194 | } | ||
| 195 | 193 | ||
| 196 | rt2500usb_register_read_lock(rt2x00dev, PHY_CSR7, ®); | 194 | rt2500usb_register_read_lock(rt2x00dev, PHY_CSR7, ®); |
| 197 | *value = rt2x00_get_field16(reg, PHY_CSR7_DATA); | 195 | *value = rt2x00_get_field16(reg, PHY_CSR7_DATA); |
| 198 | 196 | ||
| 199 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | 197 | mutex_unlock(&rt2x00dev->usb_cache_mutex); |
| 198 | |||
| 199 | return; | ||
| 200 | |||
| 201 | exit_fail: | ||
| 202 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | ||
| 203 | |||
| 204 | ERROR(rt2x00dev, "PHY_CSR8 register busy. Read failed.\n"); | ||
| 205 | *value = 0xff; | ||
| 200 | } | 206 | } |
| 201 | 207 | ||
| 202 | static void rt2500usb_rf_write(struct rt2x00_dev *rt2x00dev, | 208 | static void rt2500usb_rf_write(struct rt2x00_dev *rt2x00dev, |
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h index 611d98320593..b4bf1e09cf9a 100644 --- a/drivers/net/wireless/rt2x00/rt2x00.h +++ b/drivers/net/wireless/rt2x00/rt2x00.h | |||
| @@ -821,6 +821,7 @@ struct rt2x00_dev { | |||
| 821 | /* | 821 | /* |
| 822 | * Scheduled work. | 822 | * Scheduled work. |
| 823 | */ | 823 | */ |
| 824 | struct workqueue_struct *workqueue; | ||
| 824 | struct work_struct intf_work; | 825 | struct work_struct intf_work; |
| 825 | struct work_struct filter_work; | 826 | struct work_struct filter_work; |
| 826 | 827 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index 2673d568bcac..c997d4f28ab3 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
| @@ -75,7 +75,7 @@ static void rt2x00lib_start_link_tuner(struct rt2x00_dev *rt2x00dev) | |||
| 75 | 75 | ||
| 76 | rt2x00lib_reset_link_tuner(rt2x00dev); | 76 | rt2x00lib_reset_link_tuner(rt2x00dev); |
| 77 | 77 | ||
| 78 | queue_delayed_work(rt2x00dev->hw->workqueue, | 78 | queue_delayed_work(rt2x00dev->workqueue, |
| 79 | &rt2x00dev->link.work, LINK_TUNE_INTERVAL); | 79 | &rt2x00dev->link.work, LINK_TUNE_INTERVAL); |
| 80 | } | 80 | } |
| 81 | 81 | ||
| @@ -137,14 +137,6 @@ void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev) | |||
| 137 | return; | 137 | return; |
| 138 | 138 | ||
| 139 | /* | 139 | /* |
| 140 | * Stop all scheduled work. | ||
| 141 | */ | ||
| 142 | if (work_pending(&rt2x00dev->intf_work)) | ||
| 143 | cancel_work_sync(&rt2x00dev->intf_work); | ||
| 144 | if (work_pending(&rt2x00dev->filter_work)) | ||
| 145 | cancel_work_sync(&rt2x00dev->filter_work); | ||
| 146 | |||
| 147 | /* | ||
| 148 | * Stop the TX queues. | 140 | * Stop the TX queues. |
| 149 | */ | 141 | */ |
| 150 | ieee80211_stop_queues(rt2x00dev->hw); | 142 | ieee80211_stop_queues(rt2x00dev->hw); |
| @@ -398,8 +390,8 @@ static void rt2x00lib_link_tuner(struct work_struct *work) | |||
| 398 | * Increase tuner counter, and reschedule the next link tuner run. | 390 | * Increase tuner counter, and reschedule the next link tuner run. |
| 399 | */ | 391 | */ |
| 400 | rt2x00dev->link.count++; | 392 | rt2x00dev->link.count++; |
| 401 | queue_delayed_work(rt2x00dev->hw->workqueue, &rt2x00dev->link.work, | 393 | queue_delayed_work(rt2x00dev->workqueue, |
| 402 | LINK_TUNE_INTERVAL); | 394 | &rt2x00dev->link.work, LINK_TUNE_INTERVAL); |
| 403 | } | 395 | } |
| 404 | 396 | ||
| 405 | static void rt2x00lib_packetfilter_scheduled(struct work_struct *work) | 397 | static void rt2x00lib_packetfilter_scheduled(struct work_struct *work) |
| @@ -433,6 +425,15 @@ static void rt2x00lib_intf_scheduled_iter(void *data, u8 *mac, | |||
| 433 | 425 | ||
| 434 | spin_unlock(&intf->lock); | 426 | spin_unlock(&intf->lock); |
| 435 | 427 | ||
| 428 | /* | ||
| 429 | * It is possible the radio was disabled while the work had been | ||
| 430 | * scheduled. If that happens we should return here immediately, | ||
| 431 | * note that in the spinlock protected area above the delayed_flags | ||
| 432 | * have been cleared correctly. | ||
| 433 | */ | ||
| 434 | if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags)) | ||
| 435 | return; | ||
| 436 | |||
| 436 | if (delayed_flags & DELAYED_UPDATE_BEACON) { | 437 | if (delayed_flags & DELAYED_UPDATE_BEACON) { |
| 437 | skb = ieee80211_beacon_get(rt2x00dev->hw, vif, &control); | 438 | skb = ieee80211_beacon_get(rt2x00dev->hw, vif, &control); |
| 438 | if (skb && rt2x00dev->ops->hw->beacon_update(rt2x00dev->hw, | 439 | if (skb && rt2x00dev->ops->hw->beacon_update(rt2x00dev->hw, |
| @@ -441,7 +442,7 @@ static void rt2x00lib_intf_scheduled_iter(void *data, u8 *mac, | |||
| 441 | } | 442 | } |
| 442 | 443 | ||
| 443 | if (delayed_flags & DELAYED_CONFIG_ERP) | 444 | if (delayed_flags & DELAYED_CONFIG_ERP) |
| 444 | rt2x00lib_config_erp(rt2x00dev, intf, &intf->conf); | 445 | rt2x00lib_config_erp(rt2x00dev, intf, &conf); |
| 445 | 446 | ||
| 446 | if (delayed_flags & DELAYED_LED_ASSOC) | 447 | if (delayed_flags & DELAYED_LED_ASSOC) |
| 447 | rt2x00leds_led_assoc(rt2x00dev, !!rt2x00dev->intf_associated); | 448 | rt2x00leds_led_assoc(rt2x00dev, !!rt2x00dev->intf_associated); |
| @@ -487,7 +488,7 @@ void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev) | |||
| 487 | rt2x00lib_beacondone_iter, | 488 | rt2x00lib_beacondone_iter, |
| 488 | rt2x00dev); | 489 | rt2x00dev); |
| 489 | 490 | ||
| 490 | queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->intf_work); | 491 | queue_work(rt2x00dev->workqueue, &rt2x00dev->intf_work); |
| 491 | } | 492 | } |
| 492 | EXPORT_SYMBOL_GPL(rt2x00lib_beacondone); | 493 | EXPORT_SYMBOL_GPL(rt2x00lib_beacondone); |
| 493 | 494 | ||
| @@ -1130,6 +1131,10 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev) | |||
| 1130 | /* | 1131 | /* |
| 1131 | * Initialize configuration work. | 1132 | * Initialize configuration work. |
| 1132 | */ | 1133 | */ |
| 1134 | rt2x00dev->workqueue = create_singlethread_workqueue("rt2x00lib"); | ||
| 1135 | if (!rt2x00dev->workqueue) | ||
| 1136 | goto exit; | ||
| 1137 | |||
| 1133 | INIT_WORK(&rt2x00dev->intf_work, rt2x00lib_intf_scheduled); | 1138 | INIT_WORK(&rt2x00dev->intf_work, rt2x00lib_intf_scheduled); |
| 1134 | INIT_WORK(&rt2x00dev->filter_work, rt2x00lib_packetfilter_scheduled); | 1139 | INIT_WORK(&rt2x00dev->filter_work, rt2x00lib_packetfilter_scheduled); |
| 1135 | INIT_DELAYED_WORK(&rt2x00dev->link.work, rt2x00lib_link_tuner); | 1140 | INIT_DELAYED_WORK(&rt2x00dev->link.work, rt2x00lib_link_tuner); |
| @@ -1190,6 +1195,13 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev) | |||
| 1190 | rt2x00leds_unregister(rt2x00dev); | 1195 | rt2x00leds_unregister(rt2x00dev); |
| 1191 | 1196 | ||
| 1192 | /* | 1197 | /* |
| 1198 | * Stop all queued work. Note that most tasks will already be halted | ||
| 1199 | * during rt2x00lib_disable_radio() and rt2x00lib_uninitialize(). | ||
| 1200 | */ | ||
| 1201 | flush_workqueue(rt2x00dev->workqueue); | ||
| 1202 | destroy_workqueue(rt2x00dev->workqueue); | ||
| 1203 | |||
| 1204 | /* | ||
| 1193 | * Free ieee80211_hw memory. | 1205 | * Free ieee80211_hw memory. |
| 1194 | */ | 1206 | */ |
| 1195 | rt2x00lib_remove_hw(rt2x00dev); | 1207 | rt2x00lib_remove_hw(rt2x00dev); |
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c index 87e280a21971..9cb023edd2e9 100644 --- a/drivers/net/wireless/rt2x00/rt2x00mac.c +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c | |||
| @@ -428,7 +428,7 @@ void rt2x00mac_configure_filter(struct ieee80211_hw *hw, | |||
| 428 | if (!test_bit(DRIVER_REQUIRE_SCHEDULED, &rt2x00dev->flags)) | 428 | if (!test_bit(DRIVER_REQUIRE_SCHEDULED, &rt2x00dev->flags)) |
| 429 | rt2x00dev->ops->lib->config_filter(rt2x00dev, *total_flags); | 429 | rt2x00dev->ops->lib->config_filter(rt2x00dev, *total_flags); |
| 430 | else | 430 | else |
| 431 | queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->filter_work); | 431 | queue_work(rt2x00dev->workqueue, &rt2x00dev->filter_work); |
| 432 | } | 432 | } |
| 433 | EXPORT_SYMBOL_GPL(rt2x00mac_configure_filter); | 433 | EXPORT_SYMBOL_GPL(rt2x00mac_configure_filter); |
| 434 | 434 | ||
| @@ -509,7 +509,7 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw, | |||
| 509 | memcpy(&intf->conf, bss_conf, sizeof(*bss_conf)); | 509 | memcpy(&intf->conf, bss_conf, sizeof(*bss_conf)); |
| 510 | if (delayed) { | 510 | if (delayed) { |
| 511 | intf->delayed_flags |= delayed; | 511 | intf->delayed_flags |= delayed; |
| 512 | queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->intf_work); | 512 | queue_work(rt2x00dev->workqueue, &rt2x00dev->intf_work); |
| 513 | } | 513 | } |
| 514 | spin_unlock(&intf->lock); | 514 | spin_unlock(&intf->lock); |
| 515 | } | 515 | } |
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index fff8386e816b..83cc0147f698 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
| @@ -134,11 +134,8 @@ static void rt73usb_bbp_write(struct rt2x00_dev *rt2x00dev, | |||
| 134 | * Wait until the BBP becomes ready. | 134 | * Wait until the BBP becomes ready. |
| 135 | */ | 135 | */ |
| 136 | reg = rt73usb_bbp_check(rt2x00dev); | 136 | reg = rt73usb_bbp_check(rt2x00dev); |
| 137 | if (rt2x00_get_field32(reg, PHY_CSR3_BUSY)) { | 137 | if (rt2x00_get_field32(reg, PHY_CSR3_BUSY)) |
| 138 | ERROR(rt2x00dev, "PHY_CSR3 register busy. Write failed.\n"); | 138 | goto exit_fail; |
| 139 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | ||
| 140 | return; | ||
| 141 | } | ||
| 142 | 139 | ||
| 143 | /* | 140 | /* |
| 144 | * Write the data into the BBP. | 141 | * Write the data into the BBP. |
| @@ -151,6 +148,13 @@ static void rt73usb_bbp_write(struct rt2x00_dev *rt2x00dev, | |||
| 151 | 148 | ||
| 152 | rt73usb_register_write_lock(rt2x00dev, PHY_CSR3, reg); | 149 | rt73usb_register_write_lock(rt2x00dev, PHY_CSR3, reg); |
| 153 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | 150 | mutex_unlock(&rt2x00dev->usb_cache_mutex); |
| 151 | |||
| 152 | return; | ||
| 153 | |||
| 154 | exit_fail: | ||
| 155 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | ||
| 156 | |||
| 157 | ERROR(rt2x00dev, "PHY_CSR3 register busy. Write failed.\n"); | ||
| 154 | } | 158 | } |
| 155 | 159 | ||
| 156 | static void rt73usb_bbp_read(struct rt2x00_dev *rt2x00dev, | 160 | static void rt73usb_bbp_read(struct rt2x00_dev *rt2x00dev, |
| @@ -164,11 +168,8 @@ static void rt73usb_bbp_read(struct rt2x00_dev *rt2x00dev, | |||
| 164 | * Wait until the BBP becomes ready. | 168 | * Wait until the BBP becomes ready. |
| 165 | */ | 169 | */ |
| 166 | reg = rt73usb_bbp_check(rt2x00dev); | 170 | reg = rt73usb_bbp_check(rt2x00dev); |
| 167 | if (rt2x00_get_field32(reg, PHY_CSR3_BUSY)) { | 171 | if (rt2x00_get_field32(reg, PHY_CSR3_BUSY)) |
| 168 | ERROR(rt2x00dev, "PHY_CSR3 register busy. Read failed.\n"); | 172 | goto exit_fail; |
| 169 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | ||
| 170 | return; | ||
| 171 | } | ||
| 172 | 173 | ||
| 173 | /* | 174 | /* |
| 174 | * Write the request into the BBP. | 175 | * Write the request into the BBP. |
| @@ -184,14 +185,19 @@ static void rt73usb_bbp_read(struct rt2x00_dev *rt2x00dev, | |||
| 184 | * Wait until the BBP becomes ready. | 185 | * Wait until the BBP becomes ready. |
| 185 | */ | 186 | */ |
| 186 | reg = rt73usb_bbp_check(rt2x00dev); | 187 | reg = rt73usb_bbp_check(rt2x00dev); |
| 187 | if (rt2x00_get_field32(reg, PHY_CSR3_BUSY)) { | 188 | if (rt2x00_get_field32(reg, PHY_CSR3_BUSY)) |
| 188 | ERROR(rt2x00dev, "PHY_CSR3 register busy. Read failed.\n"); | 189 | goto exit_fail; |
| 189 | *value = 0xff; | ||
| 190 | return; | ||
| 191 | } | ||
| 192 | 190 | ||
| 193 | *value = rt2x00_get_field32(reg, PHY_CSR3_VALUE); | 191 | *value = rt2x00_get_field32(reg, PHY_CSR3_VALUE); |
| 194 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | 192 | mutex_unlock(&rt2x00dev->usb_cache_mutex); |
| 193 | |||
| 194 | return; | ||
| 195 | |||
| 196 | exit_fail: | ||
| 197 | mutex_unlock(&rt2x00dev->usb_cache_mutex); | ||
| 198 | |||
| 199 | ERROR(rt2x00dev, "PHY_CSR3 register busy. Read failed.\n"); | ||
| 200 | *value = 0xff; | ||
| 195 | } | 201 | } |
| 196 | 202 | ||
| 197 | static void rt73usb_rf_write(struct rt2x00_dev *rt2x00dev, | 203 | static void rt73usb_rf_write(struct rt2x00_dev *rt2x00dev, |
diff --git a/drivers/rtc/rtc-sa1100.c b/drivers/rtc/rtc-sa1100.c index 82f62d25f921..67421b0d3a7b 100644 --- a/drivers/rtc/rtc-sa1100.c +++ b/drivers/rtc/rtc-sa1100.c | |||
| @@ -331,14 +331,14 @@ static int sa1100_rtc_probe(struct platform_device *pdev) | |||
| 331 | RCNR = 0; | 331 | RCNR = 0; |
| 332 | } | 332 | } |
| 333 | 333 | ||
| 334 | device_init_wakeup(&pdev->dev, 1); | ||
| 335 | |||
| 334 | rtc = rtc_device_register(pdev->name, &pdev->dev, &sa1100_rtc_ops, | 336 | rtc = rtc_device_register(pdev->name, &pdev->dev, &sa1100_rtc_ops, |
| 335 | THIS_MODULE); | 337 | THIS_MODULE); |
| 336 | 338 | ||
| 337 | if (IS_ERR(rtc)) | 339 | if (IS_ERR(rtc)) |
| 338 | return PTR_ERR(rtc); | 340 | return PTR_ERR(rtc); |
| 339 | 341 | ||
| 340 | device_init_wakeup(&pdev->dev, 1); | ||
| 341 | |||
| 342 | platform_set_drvdata(pdev, rtc); | 342 | platform_set_drvdata(pdev, rtc); |
| 343 | 343 | ||
| 344 | return 0; | 344 | return 0; |
diff --git a/drivers/scsi/esp_scsi.c b/drivers/scsi/esp_scsi.c index a0b6d414953d..59fbef08d690 100644 --- a/drivers/scsi/esp_scsi.c +++ b/drivers/scsi/esp_scsi.c | |||
| @@ -2359,6 +2359,24 @@ void scsi_esp_unregister(struct esp *esp) | |||
| 2359 | } | 2359 | } |
| 2360 | EXPORT_SYMBOL(scsi_esp_unregister); | 2360 | EXPORT_SYMBOL(scsi_esp_unregister); |
| 2361 | 2361 | ||
| 2362 | static int esp_target_alloc(struct scsi_target *starget) | ||
| 2363 | { | ||
| 2364 | struct esp *esp = shost_priv(dev_to_shost(&starget->dev)); | ||
| 2365 | struct esp_target_data *tp = &esp->target[starget->id]; | ||
| 2366 | |||
| 2367 | tp->starget = starget; | ||
| 2368 | |||
| 2369 | return 0; | ||
| 2370 | } | ||
| 2371 | |||
| 2372 | static void esp_target_destroy(struct scsi_target *starget) | ||
| 2373 | { | ||
| 2374 | struct esp *esp = shost_priv(dev_to_shost(&starget->dev)); | ||
| 2375 | struct esp_target_data *tp = &esp->target[starget->id]; | ||
| 2376 | |||
| 2377 | tp->starget = NULL; | ||
| 2378 | } | ||
| 2379 | |||
| 2362 | static int esp_slave_alloc(struct scsi_device *dev) | 2380 | static int esp_slave_alloc(struct scsi_device *dev) |
| 2363 | { | 2381 | { |
| 2364 | struct esp *esp = shost_priv(dev->host); | 2382 | struct esp *esp = shost_priv(dev->host); |
| @@ -2370,8 +2388,6 @@ static int esp_slave_alloc(struct scsi_device *dev) | |||
| 2370 | return -ENOMEM; | 2388 | return -ENOMEM; |
| 2371 | dev->hostdata = lp; | 2389 | dev->hostdata = lp; |
| 2372 | 2390 | ||
| 2373 | tp->starget = dev->sdev_target; | ||
| 2374 | |||
| 2375 | spi_min_period(tp->starget) = esp->min_period; | 2391 | spi_min_period(tp->starget) = esp->min_period; |
| 2376 | spi_max_offset(tp->starget) = 15; | 2392 | spi_max_offset(tp->starget) = 15; |
| 2377 | 2393 | ||
| @@ -2608,6 +2624,8 @@ struct scsi_host_template scsi_esp_template = { | |||
| 2608 | .name = "esp", | 2624 | .name = "esp", |
| 2609 | .info = esp_info, | 2625 | .info = esp_info, |
| 2610 | .queuecommand = esp_queuecommand, | 2626 | .queuecommand = esp_queuecommand, |
| 2627 | .target_alloc = esp_target_alloc, | ||
| 2628 | .target_destroy = esp_target_destroy, | ||
| 2611 | .slave_alloc = esp_slave_alloc, | 2629 | .slave_alloc = esp_slave_alloc, |
| 2612 | .slave_configure = esp_slave_configure, | 2630 | .slave_configure = esp_slave_configure, |
| 2613 | .slave_destroy = esp_slave_destroy, | 2631 | .slave_destroy = esp_slave_destroy, |
diff --git a/drivers/scsi/ses.c b/drivers/scsi/ses.c index 45df83b9d847..0fe031f003e7 100644 --- a/drivers/scsi/ses.c +++ b/drivers/scsi/ses.c | |||
| @@ -61,7 +61,7 @@ static int ses_probe(struct device *dev) | |||
| 61 | return err; | 61 | return err; |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | #define SES_TIMEOUT 30 | 64 | #define SES_TIMEOUT (30 * HZ) |
| 65 | #define SES_RETRIES 3 | 65 | #define SES_RETRIES 3 |
| 66 | 66 | ||
| 67 | static int ses_recv_diag(struct scsi_device *sdev, int page_code, | 67 | static int ses_recv_diag(struct scsi_device *sdev, int page_code, |
diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c index 7dcda187d9ba..fafe7db20d6d 100644 --- a/drivers/video/pxafb.c +++ b/drivers/video/pxafb.c | |||
| @@ -1246,7 +1246,7 @@ static int pxafb_resume(struct platform_device *dev) | |||
| 1246 | * cache. Once this area is remapped, all virtual memory | 1246 | * cache. Once this area is remapped, all virtual memory |
| 1247 | * access to the video memory should occur at the new region. | 1247 | * access to the video memory should occur at the new region. |
| 1248 | */ | 1248 | */ |
| 1249 | static int __init pxafb_map_video_memory(struct pxafb_info *fbi) | 1249 | static int __devinit pxafb_map_video_memory(struct pxafb_info *fbi) |
| 1250 | { | 1250 | { |
| 1251 | /* | 1251 | /* |
| 1252 | * We reserve one page for the palette, plus the size | 1252 | * We reserve one page for the palette, plus the size |
| @@ -1348,7 +1348,7 @@ decode_mode: | |||
| 1348 | pxafb_decode_mode_info(fbi, inf->modes, inf->num_modes); | 1348 | pxafb_decode_mode_info(fbi, inf->modes, inf->num_modes); |
| 1349 | } | 1349 | } |
| 1350 | 1350 | ||
| 1351 | static struct pxafb_info * __init pxafb_init_fbinfo(struct device *dev) | 1351 | static struct pxafb_info * __devinit pxafb_init_fbinfo(struct device *dev) |
| 1352 | { | 1352 | { |
| 1353 | struct pxafb_info *fbi; | 1353 | struct pxafb_info *fbi; |
| 1354 | void *addr; | 1354 | void *addr; |
| @@ -1410,7 +1410,7 @@ static struct pxafb_info * __init pxafb_init_fbinfo(struct device *dev) | |||
| 1410 | } | 1410 | } |
| 1411 | 1411 | ||
| 1412 | #ifdef CONFIG_FB_PXA_PARAMETERS | 1412 | #ifdef CONFIG_FB_PXA_PARAMETERS |
| 1413 | static int __init parse_opt_mode(struct device *dev, const char *this_opt) | 1413 | static int __devinit parse_opt_mode(struct device *dev, const char *this_opt) |
| 1414 | { | 1414 | { |
| 1415 | struct pxafb_mach_info *inf = dev->platform_data; | 1415 | struct pxafb_mach_info *inf = dev->platform_data; |
| 1416 | 1416 | ||
| @@ -1469,7 +1469,7 @@ done: | |||
| 1469 | return 0; | 1469 | return 0; |
| 1470 | } | 1470 | } |
| 1471 | 1471 | ||
| 1472 | static int __init parse_opt(struct device *dev, char *this_opt) | 1472 | static int __devinit parse_opt(struct device *dev, char *this_opt) |
| 1473 | { | 1473 | { |
| 1474 | struct pxafb_mach_info *inf = dev->platform_data; | 1474 | struct pxafb_mach_info *inf = dev->platform_data; |
| 1475 | struct pxafb_mode_info *mode = &inf->modes[0]; | 1475 | struct pxafb_mode_info *mode = &inf->modes[0]; |
| @@ -1567,7 +1567,7 @@ static int __init parse_opt(struct device *dev, char *this_opt) | |||
| 1567 | return 0; | 1567 | return 0; |
| 1568 | } | 1568 | } |
| 1569 | 1569 | ||
| 1570 | static int __init pxafb_parse_options(struct device *dev, char *options) | 1570 | static int __devinit pxafb_parse_options(struct device *dev, char *options) |
| 1571 | { | 1571 | { |
| 1572 | char *this_opt; | 1572 | char *this_opt; |
| 1573 | int ret; | 1573 | int ret; |
| @@ -1588,8 +1588,8 @@ static int __init pxafb_parse_options(struct device *dev, char *options) | |||
| 1588 | 1588 | ||
| 1589 | static char g_options[256] __devinitdata = ""; | 1589 | static char g_options[256] __devinitdata = ""; |
| 1590 | 1590 | ||
| 1591 | #ifndef CONFIG_MODULES | 1591 | #ifndef MODULE |
| 1592 | static int __devinit pxafb_setup_options(void) | 1592 | static int __init pxafb_setup_options(void) |
| 1593 | { | 1593 | { |
| 1594 | char *options = NULL; | 1594 | char *options = NULL; |
| 1595 | 1595 | ||
| @@ -1613,7 +1613,7 @@ MODULE_PARM_DESC(options, "LCD parameters (see Documentation/fb/pxafb.txt)"); | |||
| 1613 | #define pxafb_setup_options() (0) | 1613 | #define pxafb_setup_options() (0) |
| 1614 | #endif | 1614 | #endif |
| 1615 | 1615 | ||
| 1616 | static int __init pxafb_probe(struct platform_device *dev) | 1616 | static int __devinit pxafb_probe(struct platform_device *dev) |
| 1617 | { | 1617 | { |
| 1618 | struct pxafb_info *fbi; | 1618 | struct pxafb_info *fbi; |
| 1619 | struct pxafb_mach_info *inf; | 1619 | struct pxafb_mach_info *inf; |
| @@ -1685,14 +1685,14 @@ static int __init pxafb_probe(struct platform_device *dev) | |||
| 1685 | if (r == NULL) { | 1685 | if (r == NULL) { |
| 1686 | dev_err(&dev->dev, "no I/O memory resource defined\n"); | 1686 | dev_err(&dev->dev, "no I/O memory resource defined\n"); |
| 1687 | ret = -ENODEV; | 1687 | ret = -ENODEV; |
| 1688 | goto failed; | 1688 | goto failed_fbi; |
| 1689 | } | 1689 | } |
| 1690 | 1690 | ||
| 1691 | r = request_mem_region(r->start, r->end - r->start + 1, dev->name); | 1691 | r = request_mem_region(r->start, r->end - r->start + 1, dev->name); |
| 1692 | if (r == NULL) { | 1692 | if (r == NULL) { |
| 1693 | dev_err(&dev->dev, "failed to request I/O memory\n"); | 1693 | dev_err(&dev->dev, "failed to request I/O memory\n"); |
| 1694 | ret = -EBUSY; | 1694 | ret = -EBUSY; |
| 1695 | goto failed; | 1695 | goto failed_fbi; |
| 1696 | } | 1696 | } |
| 1697 | 1697 | ||
| 1698 | fbi->mmio_base = ioremap(r->start, r->end - r->start + 1); | 1698 | fbi->mmio_base = ioremap(r->start, r->end - r->start + 1); |
| @@ -1735,8 +1735,17 @@ static int __init pxafb_probe(struct platform_device *dev) | |||
| 1735 | * This makes sure that our colour bitfield | 1735 | * This makes sure that our colour bitfield |
| 1736 | * descriptors are correctly initialised. | 1736 | * descriptors are correctly initialised. |
| 1737 | */ | 1737 | */ |
| 1738 | pxafb_check_var(&fbi->fb.var, &fbi->fb); | 1738 | ret = pxafb_check_var(&fbi->fb.var, &fbi->fb); |
| 1739 | pxafb_set_par(&fbi->fb); | 1739 | if (ret) { |
| 1740 | dev_err(&dev->dev, "failed to get suitable mode\n"); | ||
| 1741 | goto failed_free_irq; | ||
| 1742 | } | ||
| 1743 | |||
| 1744 | ret = pxafb_set_par(&fbi->fb); | ||
| 1745 | if (ret) { | ||
| 1746 | dev_err(&dev->dev, "Failed to set parameters\n"); | ||
| 1747 | goto failed_free_irq; | ||
| 1748 | } | ||
| 1740 | 1749 | ||
| 1741 | platform_set_drvdata(dev, fbi); | 1750 | platform_set_drvdata(dev, fbi); |
| 1742 | 1751 | ||
| @@ -1744,7 +1753,7 @@ static int __init pxafb_probe(struct platform_device *dev) | |||
| 1744 | if (ret < 0) { | 1753 | if (ret < 0) { |
| 1745 | dev_err(&dev->dev, | 1754 | dev_err(&dev->dev, |
| 1746 | "Failed to register framebuffer device: %d\n", ret); | 1755 | "Failed to register framebuffer device: %d\n", ret); |
| 1747 | goto failed_free_irq; | 1756 | goto failed_free_cmap; |
| 1748 | } | 1757 | } |
| 1749 | 1758 | ||
| 1750 | #ifdef CONFIG_CPU_FREQ | 1759 | #ifdef CONFIG_CPU_FREQ |
| @@ -1763,18 +1772,23 @@ static int __init pxafb_probe(struct platform_device *dev) | |||
| 1763 | 1772 | ||
| 1764 | return 0; | 1773 | return 0; |
| 1765 | 1774 | ||
| 1775 | failed_free_cmap: | ||
| 1776 | if (fbi->fb.cmap.len) | ||
| 1777 | fb_dealloc_cmap(&fbi->fb.cmap); | ||
| 1766 | failed_free_irq: | 1778 | failed_free_irq: |
| 1767 | free_irq(irq, fbi); | 1779 | free_irq(irq, fbi); |
| 1768 | failed_free_res: | ||
| 1769 | release_mem_region(r->start, r->end - r->start + 1); | ||
| 1770 | failed_free_io: | ||
| 1771 | iounmap(fbi->mmio_base); | ||
| 1772 | failed_free_mem: | 1780 | failed_free_mem: |
| 1773 | dma_free_writecombine(&dev->dev, fbi->map_size, | 1781 | dma_free_writecombine(&dev->dev, fbi->map_size, |
| 1774 | fbi->map_cpu, fbi->map_dma); | 1782 | fbi->map_cpu, fbi->map_dma); |
| 1775 | failed: | 1783 | failed_free_io: |
| 1784 | iounmap(fbi->mmio_base); | ||
| 1785 | failed_free_res: | ||
| 1786 | release_mem_region(r->start, r->end - r->start + 1); | ||
| 1787 | failed_fbi: | ||
| 1788 | clk_put(fbi->clk); | ||
| 1776 | platform_set_drvdata(dev, NULL); | 1789 | platform_set_drvdata(dev, NULL); |
| 1777 | kfree(fbi); | 1790 | kfree(fbi); |
| 1791 | failed: | ||
| 1778 | return ret; | 1792 | return ret; |
| 1779 | } | 1793 | } |
| 1780 | 1794 | ||
| @@ -1787,7 +1801,7 @@ static struct platform_driver pxafb_driver = { | |||
| 1787 | }, | 1801 | }, |
| 1788 | }; | 1802 | }; |
| 1789 | 1803 | ||
| 1790 | static int __devinit pxafb_init(void) | 1804 | static int __init pxafb_init(void) |
| 1791 | { | 1805 | { |
| 1792 | if (pxafb_setup_options()) | 1806 | if (pxafb_setup_options()) |
| 1793 | return -EINVAL; | 1807 | return -EINVAL; |
diff --git a/include/linux/i2c.h b/include/linux/i2c.h index fb9af6a0fe9c..8dc730132192 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h | |||
| @@ -171,7 +171,7 @@ struct i2c_client { | |||
| 171 | struct i2c_adapter *adapter; /* the adapter we sit on */ | 171 | struct i2c_adapter *adapter; /* the adapter we sit on */ |
| 172 | struct i2c_driver *driver; /* and our access routines */ | 172 | struct i2c_driver *driver; /* and our access routines */ |
| 173 | struct device dev; /* the device structure */ | 173 | struct device dev; /* the device structure */ |
| 174 | int irq; /* irq issued by device (or -1) */ | 174 | int irq; /* irq issued by device */ |
| 175 | struct list_head list; /* DEPRECATED */ | 175 | struct list_head list; /* DEPRECATED */ |
| 176 | struct completion released; | 176 | struct completion released; |
| 177 | }; | 177 | }; |
diff --git a/include/linux/inet_lro.h b/include/linux/inet_lro.h index 80335b7d77c5..c4335faebb63 100644 --- a/include/linux/inet_lro.h +++ b/include/linux/inet_lro.h | |||
| @@ -84,7 +84,11 @@ struct net_lro_mgr { | |||
| 84 | from received packets and eth protocol | 84 | from received packets and eth protocol |
| 85 | is still ETH_P_8021Q */ | 85 | is still ETH_P_8021Q */ |
| 86 | 86 | ||
| 87 | u32 ip_summed; /* Set in non generated SKBs in page mode */ | 87 | /* |
| 88 | * Set for generated SKBs that are not added to | ||
| 89 | * the frag list in fragmented mode | ||
| 90 | */ | ||
| 91 | u32 ip_summed; | ||
| 88 | u32 ip_summed_aggr; /* Set in aggregated SKBs: CHECKSUM_UNNECESSARY | 92 | u32 ip_summed_aggr; /* Set in aggregated SKBs: CHECKSUM_UNNECESSARY |
| 89 | * or CHECKSUM_NONE */ | 93 | * or CHECKSUM_NONE */ |
| 90 | 94 | ||
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index f27fd2009334..25f87102ab66 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -88,6 +88,8 @@ struct wireless_dev; | |||
| 88 | #define NETDEV_TX_BUSY 1 /* driver tx path was busy*/ | 88 | #define NETDEV_TX_BUSY 1 /* driver tx path was busy*/ |
| 89 | #define NETDEV_TX_LOCKED -1 /* driver tx lock was already taken */ | 89 | #define NETDEV_TX_LOCKED -1 /* driver tx lock was already taken */ |
| 90 | 90 | ||
| 91 | #ifdef __KERNEL__ | ||
| 92 | |||
| 91 | /* | 93 | /* |
| 92 | * Compute the worst case header length according to the protocols | 94 | * Compute the worst case header length according to the protocols |
| 93 | * used. | 95 | * used. |
| @@ -114,6 +116,8 @@ struct wireless_dev; | |||
| 114 | #define MAX_HEADER (LL_MAX_HEADER + 48) | 116 | #define MAX_HEADER (LL_MAX_HEADER + 48) |
| 115 | #endif | 117 | #endif |
| 116 | 118 | ||
| 119 | #endif /* __KERNEL__ */ | ||
| 120 | |||
| 117 | struct net_device_subqueue | 121 | struct net_device_subqueue |
| 118 | { | 122 | { |
| 119 | /* Give a control state for each queue. This struct may contain | 123 | /* Give a control state for each queue. This struct may contain |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index dae3f9ec1154..bcd1623245cb 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
| @@ -595,6 +595,15 @@ enum ieee80211_key_alg { | |||
| 595 | ALG_CCMP, | 595 | ALG_CCMP, |
| 596 | }; | 596 | }; |
| 597 | 597 | ||
| 598 | /** | ||
| 599 | * enum ieee80211_key_len - key length | ||
| 600 | * @WEP40: WEP 5 byte long key | ||
| 601 | * @WEP104: WEP 13 byte long key | ||
| 602 | */ | ||
| 603 | enum ieee80211_key_len { | ||
| 604 | LEN_WEP40 = 5, | ||
| 605 | LEN_WEP104 = 13, | ||
| 606 | }; | ||
| 598 | 607 | ||
| 599 | /** | 608 | /** |
| 600 | * enum ieee80211_key_flags - key flags | 609 | * enum ieee80211_key_flags - key flags |
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index ab502ec1c61c..a87fc0312edc 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h | |||
| @@ -178,7 +178,7 @@ extern struct Qdisc *qdisc_alloc(struct net_device *dev, struct Qdisc_ops *ops); | |||
| 178 | extern struct Qdisc *qdisc_create_dflt(struct net_device *dev, | 178 | extern struct Qdisc *qdisc_create_dflt(struct net_device *dev, |
| 179 | struct Qdisc_ops *ops, u32 parentid); | 179 | struct Qdisc_ops *ops, u32 parentid); |
| 180 | extern void tcf_destroy(struct tcf_proto *tp); | 180 | extern void tcf_destroy(struct tcf_proto *tp); |
| 181 | extern void tcf_destroy_chain(struct tcf_proto *fl); | 181 | extern void tcf_destroy_chain(struct tcf_proto **fl); |
| 182 | 182 | ||
| 183 | static inline int __qdisc_enqueue_tail(struct sk_buff *skb, struct Qdisc *sch, | 183 | static inline int __qdisc_enqueue_tail(struct sk_buff *skb, struct Qdisc *sch, |
| 184 | struct sk_buff_head *list) | 184 | struct sk_buff_head *list) |
diff --git a/kernel/rcuclassic.c b/kernel/rcuclassic.c index f4ffbd0f306f..a38895a5b8e2 100644 --- a/kernel/rcuclassic.c +++ b/kernel/rcuclassic.c | |||
| @@ -89,8 +89,22 @@ static void force_quiescent_state(struct rcu_data *rdp, | |||
| 89 | /* | 89 | /* |
| 90 | * Don't send IPI to itself. With irqs disabled, | 90 | * Don't send IPI to itself. With irqs disabled, |
| 91 | * rdp->cpu is the current cpu. | 91 | * rdp->cpu is the current cpu. |
| 92 | * | ||
| 93 | * cpu_online_map is updated by the _cpu_down() | ||
| 94 | * using stop_machine_run(). Since we're in irqs disabled | ||
| 95 | * section, stop_machine_run() is not exectuting, hence | ||
| 96 | * the cpu_online_map is stable. | ||
| 97 | * | ||
| 98 | * However, a cpu might have been offlined _just_ before | ||
| 99 | * we disabled irqs while entering here. | ||
| 100 | * And rcu subsystem might not yet have handled the CPU_DEAD | ||
| 101 | * notification, leading to the offlined cpu's bit | ||
| 102 | * being set in the rcp->cpumask. | ||
| 103 | * | ||
| 104 | * Hence cpumask = (rcp->cpumask & cpu_online_map) to prevent | ||
| 105 | * sending smp_reschedule() to an offlined CPU. | ||
| 92 | */ | 106 | */ |
| 93 | cpumask = rcp->cpumask; | 107 | cpus_and(cpumask, rcp->cpumask, cpu_online_map); |
| 94 | cpu_clear(rdp->cpu, cpumask); | 108 | cpu_clear(rdp->cpu, cpumask); |
| 95 | for_each_cpu_mask(cpu, cpumask) | 109 | for_each_cpu_mask(cpu, cpumask) |
| 96 | smp_send_reschedule(cpu); | 110 | smp_send_reschedule(cpu); |
diff --git a/kernel/sched.c b/kernel/sched.c index a66e85639de2..94ead43eda62 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -8502,6 +8502,9 @@ int sched_group_set_rt_period(struct task_group *tg, long rt_period_us) | |||
| 8502 | rt_period = (u64)rt_period_us * NSEC_PER_USEC; | 8502 | rt_period = (u64)rt_period_us * NSEC_PER_USEC; |
| 8503 | rt_runtime = tg->rt_bandwidth.rt_runtime; | 8503 | rt_runtime = tg->rt_bandwidth.rt_runtime; |
| 8504 | 8504 | ||
| 8505 | if (rt_period == 0) | ||
| 8506 | return -EINVAL; | ||
| 8507 | |||
| 8505 | return tg_set_bandwidth(tg, rt_period, rt_runtime); | 8508 | return tg_set_bandwidth(tg, rt_period, rt_runtime); |
| 8506 | } | 8509 | } |
| 8507 | 8510 | ||
diff --git a/lib/ts_bm.c b/lib/ts_bm.c index d90822c378a4..4a7fce72898e 100644 --- a/lib/ts_bm.c +++ b/lib/ts_bm.c | |||
| @@ -63,7 +63,7 @@ static unsigned int bm_find(struct ts_config *conf, struct ts_state *state) | |||
| 63 | struct ts_bm *bm = ts_config_priv(conf); | 63 | struct ts_bm *bm = ts_config_priv(conf); |
| 64 | unsigned int i, text_len, consumed = state->offset; | 64 | unsigned int i, text_len, consumed = state->offset; |
| 65 | const u8 *text; | 65 | const u8 *text; |
| 66 | int shift = bm->patlen, bs; | 66 | int shift = bm->patlen - 1, bs; |
| 67 | 67 | ||
| 68 | for (;;) { | 68 | for (;;) { |
| 69 | text_len = conf->get_next_block(consumed, &text, conf, state); | 69 | text_len = conf->get_next_block(consumed, &text, conf, state); |
diff --git a/net/core/dev.c b/net/core/dev.c index c421a1f8f0b9..fca23a3bf12c 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -454,7 +454,7 @@ static int netdev_boot_setup_add(char *name, struct ifmap *map) | |||
| 454 | for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++) { | 454 | for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++) { |
| 455 | if (s[i].name[0] == '\0' || s[i].name[0] == ' ') { | 455 | if (s[i].name[0] == '\0' || s[i].name[0] == ' ') { |
| 456 | memset(s[i].name, 0, sizeof(s[i].name)); | 456 | memset(s[i].name, 0, sizeof(s[i].name)); |
| 457 | strcpy(s[i].name, name); | 457 | strlcpy(s[i].name, name, IFNAMSIZ); |
| 458 | memcpy(&s[i].map, map, sizeof(s[i].map)); | 458 | memcpy(&s[i].map, map, sizeof(s[i].map)); |
| 459 | break; | 459 | break; |
| 460 | } | 460 | } |
| @@ -479,7 +479,7 @@ int netdev_boot_setup_check(struct net_device *dev) | |||
| 479 | 479 | ||
| 480 | for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++) { | 480 | for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++) { |
| 481 | if (s[i].name[0] != '\0' && s[i].name[0] != ' ' && | 481 | if (s[i].name[0] != '\0' && s[i].name[0] != ' ' && |
| 482 | !strncmp(dev->name, s[i].name, strlen(s[i].name))) { | 482 | !strcmp(dev->name, s[i].name)) { |
| 483 | dev->irq = s[i].map.irq; | 483 | dev->irq = s[i].map.irq; |
| 484 | dev->base_addr = s[i].map.base_addr; | 484 | dev->base_addr = s[i].map.base_addr; |
| 485 | dev->mem_start = s[i].map.mem_start; | 485 | dev->mem_start = s[i].map.mem_start; |
| @@ -2973,7 +2973,7 @@ EXPORT_SYMBOL(dev_unicast_delete); | |||
| 2973 | /** | 2973 | /** |
| 2974 | * dev_unicast_add - add a secondary unicast address | 2974 | * dev_unicast_add - add a secondary unicast address |
| 2975 | * @dev: device | 2975 | * @dev: device |
| 2976 | * @addr: address to delete | 2976 | * @addr: address to add |
| 2977 | * @alen: length of @addr | 2977 | * @alen: length of @addr |
| 2978 | * | 2978 | * |
| 2979 | * Add a secondary unicast address to the device or increase | 2979 | * Add a secondary unicast address to the device or increase |
diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c index e3e9ab0f74e3..277a2302eb3a 100644 --- a/net/core/fib_rules.c +++ b/net/core/fib_rules.c | |||
| @@ -226,7 +226,7 @@ static int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) | |||
| 226 | 226 | ||
| 227 | ops = lookup_rules_ops(net, frh->family); | 227 | ops = lookup_rules_ops(net, frh->family); |
| 228 | if (ops == NULL) { | 228 | if (ops == NULL) { |
| 229 | err = EAFNOSUPPORT; | 229 | err = -EAFNOSUPPORT; |
| 230 | goto errout; | 230 | goto errout; |
| 231 | } | 231 | } |
| 232 | 232 | ||
| @@ -365,7 +365,7 @@ static int fib_nl_delrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) | |||
| 365 | 365 | ||
| 366 | ops = lookup_rules_ops(net, frh->family); | 366 | ops = lookup_rules_ops(net, frh->family); |
| 367 | if (ops == NULL) { | 367 | if (ops == NULL) { |
| 368 | err = EAFNOSUPPORT; | 368 | err = -EAFNOSUPPORT; |
| 369 | goto errout; | 369 | goto errout; |
| 370 | } | 370 | } |
| 371 | 371 | ||
diff --git a/net/core/filter.c b/net/core/filter.c index 4f8369729a4e..df3744355839 100644 --- a/net/core/filter.c +++ b/net/core/filter.c | |||
| @@ -68,7 +68,6 @@ static inline void *load_pointer(struct sk_buff *skb, int k, | |||
| 68 | * sk_filter - run a packet through a socket filter | 68 | * sk_filter - run a packet through a socket filter |
| 69 | * @sk: sock associated with &sk_buff | 69 | * @sk: sock associated with &sk_buff |
| 70 | * @skb: buffer to filter | 70 | * @skb: buffer to filter |
| 71 | * @needlock: set to 1 if the sock is not locked by caller. | ||
| 72 | * | 71 | * |
| 73 | * Run the filter code and then cut skb->data to correct size returned by | 72 | * Run the filter code and then cut skb->data to correct size returned by |
| 74 | * sk_run_filter. If pkt_len is 0 we toss packet. If skb->len is smaller | 73 | * sk_run_filter. If pkt_len is 0 we toss packet. If skb->len is smaller |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 1e556d312117..366621610e76 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -1292,12 +1292,14 @@ static int __skb_splice_bits(struct sk_buff *skb, unsigned int *offset, | |||
| 1292 | { | 1292 | { |
| 1293 | unsigned int nr_pages = spd->nr_pages; | 1293 | unsigned int nr_pages = spd->nr_pages; |
| 1294 | unsigned int poff, plen, len, toff, tlen; | 1294 | unsigned int poff, plen, len, toff, tlen; |
| 1295 | int headlen, seg; | 1295 | int headlen, seg, error = 0; |
| 1296 | 1296 | ||
| 1297 | toff = *offset; | 1297 | toff = *offset; |
| 1298 | tlen = *total_len; | 1298 | tlen = *total_len; |
| 1299 | if (!tlen) | 1299 | if (!tlen) { |
| 1300 | error = 1; | ||
| 1300 | goto err; | 1301 | goto err; |
| 1302 | } | ||
| 1301 | 1303 | ||
| 1302 | /* | 1304 | /* |
| 1303 | * if the offset is greater than the linear part, go directly to | 1305 | * if the offset is greater than the linear part, go directly to |
| @@ -1339,7 +1341,8 @@ static int __skb_splice_bits(struct sk_buff *skb, unsigned int *offset, | |||
| 1339 | * just jump directly to update and return, no point | 1341 | * just jump directly to update and return, no point |
| 1340 | * in going over fragments when the output is full. | 1342 | * in going over fragments when the output is full. |
| 1341 | */ | 1343 | */ |
| 1342 | if (spd_fill_page(spd, virt_to_page(p), plen, poff, skb)) | 1344 | error = spd_fill_page(spd, virt_to_page(p), plen, poff, skb); |
| 1345 | if (error) | ||
| 1343 | goto done; | 1346 | goto done; |
| 1344 | 1347 | ||
| 1345 | tlen -= plen; | 1348 | tlen -= plen; |
| @@ -1369,7 +1372,8 @@ map_frag: | |||
| 1369 | if (!plen) | 1372 | if (!plen) |
| 1370 | break; | 1373 | break; |
| 1371 | 1374 | ||
| 1372 | if (spd_fill_page(spd, f->page, plen, poff, skb)) | 1375 | error = spd_fill_page(spd, f->page, plen, poff, skb); |
| 1376 | if (error) | ||
| 1373 | break; | 1377 | break; |
| 1374 | 1378 | ||
| 1375 | tlen -= plen; | 1379 | tlen -= plen; |
| @@ -1382,7 +1386,10 @@ done: | |||
| 1382 | return 0; | 1386 | return 0; |
| 1383 | } | 1387 | } |
| 1384 | err: | 1388 | err: |
| 1385 | return 1; | 1389 | /* update the offset to reflect the linear part skip, if any */ |
| 1390 | if (!error) | ||
| 1391 | *offset = toff; | ||
| 1392 | return error; | ||
| 1386 | } | 1393 | } |
| 1387 | 1394 | ||
| 1388 | /* | 1395 | /* |
diff --git a/net/ipv4/inet_fragment.c b/net/ipv4/inet_fragment.c index 4ed429bd5951..0546a0bc97ea 100644 --- a/net/ipv4/inet_fragment.c +++ b/net/ipv4/inet_fragment.c | |||
| @@ -192,14 +192,21 @@ EXPORT_SYMBOL(inet_frag_evictor); | |||
| 192 | 192 | ||
| 193 | static struct inet_frag_queue *inet_frag_intern(struct netns_frags *nf, | 193 | static struct inet_frag_queue *inet_frag_intern(struct netns_frags *nf, |
| 194 | struct inet_frag_queue *qp_in, struct inet_frags *f, | 194 | struct inet_frag_queue *qp_in, struct inet_frags *f, |
| 195 | unsigned int hash, void *arg) | 195 | void *arg) |
| 196 | { | 196 | { |
| 197 | struct inet_frag_queue *qp; | 197 | struct inet_frag_queue *qp; |
| 198 | #ifdef CONFIG_SMP | 198 | #ifdef CONFIG_SMP |
| 199 | struct hlist_node *n; | 199 | struct hlist_node *n; |
| 200 | #endif | 200 | #endif |
| 201 | unsigned int hash; | ||
| 201 | 202 | ||
| 202 | write_lock(&f->lock); | 203 | write_lock(&f->lock); |
| 204 | /* | ||
| 205 | * While we stayed w/o the lock other CPU could update | ||
| 206 | * the rnd seed, so we need to re-calculate the hash | ||
| 207 | * chain. Fortunatelly the qp_in can be used to get one. | ||
| 208 | */ | ||
| 209 | hash = f->hashfn(qp_in); | ||
| 203 | #ifdef CONFIG_SMP | 210 | #ifdef CONFIG_SMP |
| 204 | /* With SMP race we have to recheck hash table, because | 211 | /* With SMP race we have to recheck hash table, because |
| 205 | * such entry could be created on other cpu, while we | 212 | * such entry could be created on other cpu, while we |
| @@ -247,7 +254,7 @@ static struct inet_frag_queue *inet_frag_alloc(struct netns_frags *nf, | |||
| 247 | } | 254 | } |
| 248 | 255 | ||
| 249 | static struct inet_frag_queue *inet_frag_create(struct netns_frags *nf, | 256 | static struct inet_frag_queue *inet_frag_create(struct netns_frags *nf, |
| 250 | struct inet_frags *f, void *arg, unsigned int hash) | 257 | struct inet_frags *f, void *arg) |
| 251 | { | 258 | { |
| 252 | struct inet_frag_queue *q; | 259 | struct inet_frag_queue *q; |
| 253 | 260 | ||
| @@ -255,7 +262,7 @@ static struct inet_frag_queue *inet_frag_create(struct netns_frags *nf, | |||
| 255 | if (q == NULL) | 262 | if (q == NULL) |
| 256 | return NULL; | 263 | return NULL; |
| 257 | 264 | ||
| 258 | return inet_frag_intern(nf, q, f, hash, arg); | 265 | return inet_frag_intern(nf, q, f, arg); |
| 259 | } | 266 | } |
| 260 | 267 | ||
| 261 | struct inet_frag_queue *inet_frag_find(struct netns_frags *nf, | 268 | struct inet_frag_queue *inet_frag_find(struct netns_frags *nf, |
| @@ -264,7 +271,6 @@ struct inet_frag_queue *inet_frag_find(struct netns_frags *nf, | |||
| 264 | struct inet_frag_queue *q; | 271 | struct inet_frag_queue *q; |
| 265 | struct hlist_node *n; | 272 | struct hlist_node *n; |
| 266 | 273 | ||
| 267 | read_lock(&f->lock); | ||
| 268 | hlist_for_each_entry(q, n, &f->hash[hash], list) { | 274 | hlist_for_each_entry(q, n, &f->hash[hash], list) { |
| 269 | if (q->net == nf && f->match(q, key)) { | 275 | if (q->net == nf && f->match(q, key)) { |
| 270 | atomic_inc(&q->refcnt); | 276 | atomic_inc(&q->refcnt); |
| @@ -274,6 +280,6 @@ struct inet_frag_queue *inet_frag_find(struct netns_frags *nf, | |||
| 274 | } | 280 | } |
| 275 | read_unlock(&f->lock); | 281 | read_unlock(&f->lock); |
| 276 | 282 | ||
| 277 | return inet_frag_create(nf, f, key, hash); | 283 | return inet_frag_create(nf, f, key); |
| 278 | } | 284 | } |
| 279 | EXPORT_SYMBOL(inet_frag_find); | 285 | EXPORT_SYMBOL(inet_frag_find); |
diff --git a/net/ipv4/inet_lro.c b/net/ipv4/inet_lro.c index 4a4d49fca1f2..cfd034a2b96e 100644 --- a/net/ipv4/inet_lro.c +++ b/net/ipv4/inet_lro.c | |||
| @@ -383,8 +383,7 @@ static int __lro_proc_skb(struct net_lro_mgr *lro_mgr, struct sk_buff *skb, | |||
| 383 | out2: /* send aggregated SKBs to stack */ | 383 | out2: /* send aggregated SKBs to stack */ |
| 384 | lro_flush(lro_mgr, lro_desc); | 384 | lro_flush(lro_mgr, lro_desc); |
| 385 | 385 | ||
| 386 | out: /* Original SKB has to be posted to stack */ | 386 | out: |
| 387 | skb->ip_summed = lro_mgr->ip_summed; | ||
| 388 | return 1; | 387 | return 1; |
| 389 | } | 388 | } |
| 390 | 389 | ||
diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c index cd6ce6ac6358..37221f659159 100644 --- a/net/ipv4/ip_fragment.c +++ b/net/ipv4/ip_fragment.c | |||
| @@ -229,6 +229,8 @@ static inline struct ipq *ip_find(struct net *net, struct iphdr *iph, u32 user) | |||
| 229 | 229 | ||
| 230 | arg.iph = iph; | 230 | arg.iph = iph; |
| 231 | arg.user = user; | 231 | arg.user = user; |
| 232 | |||
| 233 | read_lock(&ip4_frags.lock); | ||
| 232 | hash = ipqhashfn(iph->id, iph->saddr, iph->daddr, iph->protocol); | 234 | hash = ipqhashfn(iph->id, iph->saddr, iph->daddr, iph->protocol); |
| 233 | 235 | ||
| 234 | q = inet_frag_find(&net->ipv4.frags, &ip4_frags, &arg, hash); | 236 | q = inet_frag_find(&net->ipv4.frags, &ip4_frags, &arg, hash); |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index fc54a48fde1e..850825dc86e6 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -260,6 +260,8 @@ | |||
| 260 | #include <linux/socket.h> | 260 | #include <linux/socket.h> |
| 261 | #include <linux/random.h> | 261 | #include <linux/random.h> |
| 262 | #include <linux/bootmem.h> | 262 | #include <linux/bootmem.h> |
| 263 | #include <linux/highmem.h> | ||
| 264 | #include <linux/swap.h> | ||
| 263 | #include <linux/cache.h> | 265 | #include <linux/cache.h> |
| 264 | #include <linux/err.h> | 266 | #include <linux/err.h> |
| 265 | #include <linux/crypto.h> | 267 | #include <linux/crypto.h> |
| @@ -2620,7 +2622,7 @@ __setup("thash_entries=", set_thash_entries); | |||
| 2620 | void __init tcp_init(void) | 2622 | void __init tcp_init(void) |
| 2621 | { | 2623 | { |
| 2622 | struct sk_buff *skb = NULL; | 2624 | struct sk_buff *skb = NULL; |
| 2623 | unsigned long limit; | 2625 | unsigned long nr_pages, limit; |
| 2624 | int order, i, max_share; | 2626 | int order, i, max_share; |
| 2625 | 2627 | ||
| 2626 | BUILD_BUG_ON(sizeof(struct tcp_skb_cb) > sizeof(skb->cb)); | 2628 | BUILD_BUG_ON(sizeof(struct tcp_skb_cb) > sizeof(skb->cb)); |
| @@ -2689,8 +2691,9 @@ void __init tcp_init(void) | |||
| 2689 | * is up to 1/2 at 256 MB, decreasing toward zero with the amount of | 2691 | * is up to 1/2 at 256 MB, decreasing toward zero with the amount of |
| 2690 | * memory, with a floor of 128 pages. | 2692 | * memory, with a floor of 128 pages. |
| 2691 | */ | 2693 | */ |
| 2692 | limit = min(nr_all_pages, 1UL<<(28-PAGE_SHIFT)) >> (20-PAGE_SHIFT); | 2694 | nr_pages = totalram_pages - totalhigh_pages; |
| 2693 | limit = (limit * (nr_all_pages >> (20-PAGE_SHIFT))) >> (PAGE_SHIFT-11); | 2695 | limit = min(nr_pages, 1UL<<(28-PAGE_SHIFT)) >> (20-PAGE_SHIFT); |
| 2696 | limit = (limit * (nr_pages >> (20-PAGE_SHIFT))) >> (PAGE_SHIFT-11); | ||
| 2694 | limit = max(limit, 128UL); | 2697 | limit = max(limit, 128UL); |
| 2695 | sysctl_tcp_mem[0] = limit / 4 * 3; | 2698 | sysctl_tcp_mem[0] = limit / 4 * 3; |
| 2696 | sysctl_tcp_mem[1] = limit; | 2699 | sysctl_tcp_mem[1] = limit; |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 12695be2c255..ffe869ac1bcf 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
| @@ -2291,7 +2291,7 @@ static void get_tcp4_sock(struct sock *sk, struct seq_file *f, int i, int *len) | |||
| 2291 | } | 2291 | } |
| 2292 | 2292 | ||
| 2293 | seq_printf(f, "%4d: %08X:%04X %08X:%04X %02X %08X:%08X %02X:%08lX " | 2293 | seq_printf(f, "%4d: %08X:%04X %08X:%04X %02X %08X:%08X %02X:%08lX " |
| 2294 | "%08X %5d %8d %lu %d %p %u %u %u %u %d%n", | 2294 | "%08X %5d %8d %lu %d %p %lu %lu %u %u %d%n", |
| 2295 | i, src, srcp, dest, destp, sk->sk_state, | 2295 | i, src, srcp, dest, destp, sk->sk_state, |
| 2296 | tp->write_seq - tp->snd_una, | 2296 | tp->write_seq - tp->snd_una, |
| 2297 | sk->sk_state == TCP_LISTEN ? sk->sk_ack_backlog : | 2297 | sk->sk_state == TCP_LISTEN ? sk->sk_ack_backlog : |
| @@ -2303,8 +2303,8 @@ static void get_tcp4_sock(struct sock *sk, struct seq_file *f, int i, int *len) | |||
| 2303 | icsk->icsk_probes_out, | 2303 | icsk->icsk_probes_out, |
| 2304 | sock_i_ino(sk), | 2304 | sock_i_ino(sk), |
| 2305 | atomic_read(&sk->sk_refcnt), sk, | 2305 | atomic_read(&sk->sk_refcnt), sk, |
| 2306 | icsk->icsk_rto, | 2306 | jiffies_to_clock_t(icsk->icsk_rto), |
| 2307 | icsk->icsk_ack.ato, | 2307 | jiffies_to_clock_t(icsk->icsk_ack.ato), |
| 2308 | (icsk->icsk_ack.quick << 1) | icsk->icsk_ack.pingpong, | 2308 | (icsk->icsk_ack.quick << 1) | icsk->icsk_ack.pingpong, |
| 2309 | tp->snd_cwnd, | 2309 | tp->snd_cwnd, |
| 2310 | tp->snd_ssthresh >= 0xFFFF ? -1 : tp->snd_ssthresh, | 2310 | tp->snd_ssthresh >= 0xFFFF ? -1 : tp->snd_ssthresh, |
diff --git a/net/ipv6/netfilter/ip6table_mangle.c b/net/ipv6/netfilter/ip6table_mangle.c index 27a5e8b48d93..f405cea21a8b 100644 --- a/net/ipv6/netfilter/ip6table_mangle.c +++ b/net/ipv6/netfilter/ip6table_mangle.c | |||
| @@ -129,7 +129,7 @@ static struct nf_hook_ops ip6t_ops[] __read_mostly = { | |||
| 129 | .priority = NF_IP6_PRI_MANGLE, | 129 | .priority = NF_IP6_PRI_MANGLE, |
| 130 | }, | 130 | }, |
| 131 | { | 131 | { |
| 132 | .hook = ip6t_local_hook, | 132 | .hook = ip6t_route_hook, |
| 133 | .owner = THIS_MODULE, | 133 | .owner = THIS_MODULE, |
| 134 | .pf = PF_INET6, | 134 | .pf = PF_INET6, |
| 135 | .hooknum = NF_INET_LOCAL_IN, | 135 | .hooknum = NF_INET_LOCAL_IN, |
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c index e65e26e210ee..cf20bc4fd60d 100644 --- a/net/ipv6/netfilter/nf_conntrack_reasm.c +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c | |||
| @@ -207,9 +207,10 @@ fq_find(__be32 id, struct in6_addr *src, struct in6_addr *dst) | |||
| 207 | arg.id = id; | 207 | arg.id = id; |
| 208 | arg.src = src; | 208 | arg.src = src; |
| 209 | arg.dst = dst; | 209 | arg.dst = dst; |
| 210 | |||
| 211 | read_lock_bh(&nf_frags.lock); | ||
| 210 | hash = ip6qhashfn(id, src, dst); | 212 | hash = ip6qhashfn(id, src, dst); |
| 211 | 213 | ||
| 212 | local_bh_disable(); | ||
| 213 | q = inet_frag_find(&nf_init_frags, &nf_frags, &arg, hash); | 214 | q = inet_frag_find(&nf_init_frags, &nf_frags, &arg, hash); |
| 214 | local_bh_enable(); | 215 | local_bh_enable(); |
| 215 | if (q == NULL) | 216 | if (q == NULL) |
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c index 798cabc7535b..a60d7d129713 100644 --- a/net/ipv6/reassembly.c +++ b/net/ipv6/reassembly.c | |||
| @@ -247,6 +247,8 @@ fq_find(struct net *net, __be32 id, struct in6_addr *src, struct in6_addr *dst, | |||
| 247 | arg.id = id; | 247 | arg.id = id; |
| 248 | arg.src = src; | 248 | arg.src = src; |
| 249 | arg.dst = dst; | 249 | arg.dst = dst; |
| 250 | |||
| 251 | read_lock(&ip6_frags.lock); | ||
| 250 | hash = ip6qhashfn(id, src, dst); | 252 | hash = ip6qhashfn(id, src, dst); |
| 251 | 253 | ||
| 252 | q = inet_frag_find(&net->ipv6.frags, &ip6_frags, &arg, hash); | 254 | q = inet_frag_find(&net->ipv6.frags, &ip6_frags, &arg, hash); |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index d1f3e19b06c7..7ff687020fa9 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -240,7 +240,7 @@ static inline int rt6_need_strict(struct in6_addr *daddr) | |||
| 240 | static inline struct rt6_info *rt6_device_match(struct net *net, | 240 | static inline struct rt6_info *rt6_device_match(struct net *net, |
| 241 | struct rt6_info *rt, | 241 | struct rt6_info *rt, |
| 242 | int oif, | 242 | int oif, |
| 243 | int strict) | 243 | int flags) |
| 244 | { | 244 | { |
| 245 | struct rt6_info *local = NULL; | 245 | struct rt6_info *local = NULL; |
| 246 | struct rt6_info *sprt; | 246 | struct rt6_info *sprt; |
| @@ -253,7 +253,7 @@ static inline struct rt6_info *rt6_device_match(struct net *net, | |||
| 253 | if (dev->flags & IFF_LOOPBACK) { | 253 | if (dev->flags & IFF_LOOPBACK) { |
| 254 | if (sprt->rt6i_idev == NULL || | 254 | if (sprt->rt6i_idev == NULL || |
| 255 | sprt->rt6i_idev->dev->ifindex != oif) { | 255 | sprt->rt6i_idev->dev->ifindex != oif) { |
| 256 | if (strict && oif) | 256 | if (flags & RT6_LOOKUP_F_IFACE && oif) |
| 257 | continue; | 257 | continue; |
| 258 | if (local && (!oif || | 258 | if (local && (!oif || |
| 259 | local->rt6i_idev->dev->ifindex == oif)) | 259 | local->rt6i_idev->dev->ifindex == oif)) |
| @@ -266,7 +266,7 @@ static inline struct rt6_info *rt6_device_match(struct net *net, | |||
| 266 | if (local) | 266 | if (local) |
| 267 | return local; | 267 | return local; |
| 268 | 268 | ||
| 269 | if (strict) | 269 | if (flags & RT6_LOOKUP_F_IFACE) |
| 270 | return net->ipv6.ip6_null_entry; | 270 | return net->ipv6.ip6_null_entry; |
| 271 | } | 271 | } |
| 272 | return rt; | 272 | return rt; |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index cb46749d4c32..40ea9c36d24b 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
| @@ -2036,7 +2036,7 @@ static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i) | |||
| 2036 | 2036 | ||
| 2037 | seq_printf(seq, | 2037 | seq_printf(seq, |
| 2038 | "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X " | 2038 | "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X " |
| 2039 | "%02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %u %u %u %u %d\n", | 2039 | "%02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %lu %lu %u %u %d\n", |
| 2040 | i, | 2040 | i, |
| 2041 | src->s6_addr32[0], src->s6_addr32[1], | 2041 | src->s6_addr32[0], src->s6_addr32[1], |
| 2042 | src->s6_addr32[2], src->s6_addr32[3], srcp, | 2042 | src->s6_addr32[2], src->s6_addr32[3], srcp, |
| @@ -2052,8 +2052,8 @@ static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i) | |||
| 2052 | icsk->icsk_probes_out, | 2052 | icsk->icsk_probes_out, |
| 2053 | sock_i_ino(sp), | 2053 | sock_i_ino(sp), |
| 2054 | atomic_read(&sp->sk_refcnt), sp, | 2054 | atomic_read(&sp->sk_refcnt), sp, |
| 2055 | icsk->icsk_rto, | 2055 | jiffies_to_clock_t(icsk->icsk_rto), |
| 2056 | icsk->icsk_ack.ato, | 2056 | jiffies_to_clock_t(icsk->icsk_ack.ato), |
| 2057 | (icsk->icsk_ack.quick << 1 ) | icsk->icsk_ack.pingpong, | 2057 | (icsk->icsk_ack.quick << 1 ) | icsk->icsk_ack.pingpong, |
| 2058 | tp->snd_cwnd, tp->snd_ssthresh>=0xFFFF?-1:tp->snd_ssthresh | 2058 | tp->snd_cwnd, tp->snd_ssthresh>=0xFFFF?-1:tp->snd_ssthresh |
| 2059 | ); | 2059 | ); |
diff --git a/net/mac80211/key.c b/net/mac80211/key.c index 150d66dbda9d..220e83be3ef4 100644 --- a/net/mac80211/key.c +++ b/net/mac80211/key.c | |||
| @@ -380,6 +380,15 @@ void ieee80211_key_free(struct ieee80211_key *key) | |||
| 380 | if (!key) | 380 | if (!key) |
| 381 | return; | 381 | return; |
| 382 | 382 | ||
| 383 | if (!key->sdata) { | ||
| 384 | /* The key has not been linked yet, simply free it | ||
| 385 | * and don't Oops */ | ||
| 386 | if (key->conf.alg == ALG_CCMP) | ||
| 387 | ieee80211_aes_key_free(key->u.ccmp.tfm); | ||
| 388 | kfree(key); | ||
| 389 | return; | ||
| 390 | } | ||
| 391 | |||
| 383 | spin_lock_irqsave(&key->sdata->local->key_lock, flags); | 392 | spin_lock_irqsave(&key->sdata->local->key_lock, flags); |
| 384 | __ieee80211_key_free(key); | 393 | __ieee80211_key_free(key); |
| 385 | spin_unlock_irqrestore(&key->sdata->local->key_lock, flags); | 394 | spin_unlock_irqrestore(&key->sdata->local->key_lock, flags); |
diff --git a/net/mac80211/wext.c b/net/mac80211/wext.c index 6106cb79060c..e8404212ad57 100644 --- a/net/mac80211/wext.c +++ b/net/mac80211/wext.c | |||
| @@ -95,6 +95,13 @@ static int ieee80211_set_encryption(struct net_device *dev, u8 *sta_addr, | |||
| 95 | } | 95 | } |
| 96 | } | 96 | } |
| 97 | 97 | ||
| 98 | if (alg == ALG_WEP && | ||
| 99 | key_len != LEN_WEP40 && key_len != LEN_WEP104) { | ||
| 100 | ieee80211_key_free(key); | ||
| 101 | err = -EINVAL; | ||
| 102 | goto out_unlock; | ||
| 103 | } | ||
| 104 | |||
| 98 | ieee80211_key_link(key, sdata, sta); | 105 | ieee80211_key_link(key, sdata, sta); |
| 99 | 106 | ||
| 100 | if (set_tx_key || (!sta && !sdata->default_key && key)) | 107 | if (set_tx_key || (!sta && !sdata->default_key && key)) |
diff --git a/net/mac80211/wme.c b/net/mac80211/wme.c index 635b996c8c35..5d09e8698b57 100644 --- a/net/mac80211/wme.c +++ b/net/mac80211/wme.c | |||
| @@ -323,8 +323,7 @@ static void wme_qdiscop_destroy(struct Qdisc* qd) | |||
| 323 | struct ieee80211_hw *hw = &local->hw; | 323 | struct ieee80211_hw *hw = &local->hw; |
| 324 | int queue; | 324 | int queue; |
| 325 | 325 | ||
| 326 | tcf_destroy_chain(q->filter_list); | 326 | tcf_destroy_chain(&q->filter_list); |
| 327 | q->filter_list = NULL; | ||
| 328 | 327 | ||
| 329 | for (queue=0; queue < hw->queues; queue++) { | 328 | for (queue=0; queue < hw->queues; queue++) { |
| 330 | skb_queue_purge(&q->requeued[queue]); | 329 | skb_queue_purge(&q->requeued[queue]); |
diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c index ba94004fe323..271cd01d57ae 100644 --- a/net/netfilter/nf_conntrack_proto_tcp.c +++ b/net/netfilter/nf_conntrack_proto_tcp.c | |||
| @@ -331,12 +331,13 @@ static unsigned int get_conntrack_index(const struct tcphdr *tcph) | |||
| 331 | 331 | ||
| 332 | I. Upper bound for valid data: seq <= sender.td_maxend | 332 | I. Upper bound for valid data: seq <= sender.td_maxend |
| 333 | II. Lower bound for valid data: seq + len >= sender.td_end - receiver.td_maxwin | 333 | II. Lower bound for valid data: seq + len >= sender.td_end - receiver.td_maxwin |
| 334 | III. Upper bound for valid ack: sack <= receiver.td_end | 334 | III. Upper bound for valid (s)ack: sack <= receiver.td_end |
| 335 | IV. Lower bound for valid ack: ack >= receiver.td_end - MAXACKWINDOW | 335 | IV. Lower bound for valid (s)ack: sack >= receiver.td_end - MAXACKWINDOW |
| 336 | 336 | ||
| 337 | where sack is the highest right edge of sack block found in the packet. | 337 | where sack is the highest right edge of sack block found in the packet |
| 338 | or ack in the case of packet without SACK option. | ||
| 338 | 339 | ||
| 339 | The upper bound limit for a valid ack is not ignored - | 340 | The upper bound limit for a valid (s)ack is not ignored - |
| 340 | we doesn't have to deal with fragments. | 341 | we doesn't have to deal with fragments. |
| 341 | */ | 342 | */ |
| 342 | 343 | ||
| @@ -606,12 +607,12 @@ static bool tcp_in_window(const struct nf_conn *ct, | |||
| 606 | before(seq, sender->td_maxend + 1), | 607 | before(seq, sender->td_maxend + 1), |
| 607 | after(end, sender->td_end - receiver->td_maxwin - 1), | 608 | after(end, sender->td_end - receiver->td_maxwin - 1), |
| 608 | before(sack, receiver->td_end + 1), | 609 | before(sack, receiver->td_end + 1), |
| 609 | after(ack, receiver->td_end - MAXACKWINDOW(sender))); | 610 | after(sack, receiver->td_end - MAXACKWINDOW(sender) - 1)); |
| 610 | 611 | ||
| 611 | if (before(seq, sender->td_maxend + 1) && | 612 | if (before(seq, sender->td_maxend + 1) && |
| 612 | after(end, sender->td_end - receiver->td_maxwin - 1) && | 613 | after(end, sender->td_end - receiver->td_maxwin - 1) && |
| 613 | before(sack, receiver->td_end + 1) && | 614 | before(sack, receiver->td_end + 1) && |
| 614 | after(ack, receiver->td_end - MAXACKWINDOW(sender))) { | 615 | after(sack, receiver->td_end - MAXACKWINDOW(sender) - 1)) { |
| 615 | /* | 616 | /* |
| 616 | * Take into account window scaling (RFC 1323). | 617 | * Take into account window scaling (RFC 1323). |
| 617 | */ | 618 | */ |
diff --git a/net/netlabel/netlabel_unlabeled.c b/net/netlabel/netlabel_unlabeled.c index 0099da5b2591..52b2611a6eb6 100644 --- a/net/netlabel/netlabel_unlabeled.c +++ b/net/netlabel/netlabel_unlabeled.c | |||
| @@ -1534,7 +1534,7 @@ static int netlbl_unlabel_staticlistdef(struct sk_buff *skb, | |||
| 1534 | } | 1534 | } |
| 1535 | } | 1535 | } |
| 1536 | list_for_each_entry_rcu(addr6, &iface->addr6_list, list) { | 1536 | list_for_each_entry_rcu(addr6, &iface->addr6_list, list) { |
| 1537 | if (addr6->valid || iter_addr6++ < skip_addr6) | 1537 | if (!addr6->valid || iter_addr6++ < skip_addr6) |
| 1538 | continue; | 1538 | continue; |
| 1539 | if (netlbl_unlabel_staticlist_gen(NLBL_UNLABEL_C_STATICLISTDEF, | 1539 | if (netlbl_unlabel_staticlist_gen(NLBL_UNLABEL_C_STATICLISTDEF, |
| 1540 | iface, | 1540 | iface, |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 9b97f8006c9c..349aba189558 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
| @@ -886,7 +886,7 @@ retry: | |||
| 886 | return netlink_unicast_kernel(sk, skb); | 886 | return netlink_unicast_kernel(sk, skb); |
| 887 | 887 | ||
| 888 | if (sk_filter(sk, skb)) { | 888 | if (sk_filter(sk, skb)) { |
| 889 | int err = skb->len; | 889 | err = skb->len; |
| 890 | kfree_skb(skb); | 890 | kfree_skb(skb); |
| 891 | sock_put(sk); | 891 | sock_put(sk); |
| 892 | return err; | 892 | return err; |
diff --git a/net/netlink/attr.c b/net/netlink/attr.c index 47bbf45ae5d7..2d106cfe1d27 100644 --- a/net/netlink/attr.c +++ b/net/netlink/attr.c | |||
| @@ -132,6 +132,7 @@ errout: | |||
| 132 | * @maxtype: maximum attribute type to be expected | 132 | * @maxtype: maximum attribute type to be expected |
| 133 | * @head: head of attribute stream | 133 | * @head: head of attribute stream |
| 134 | * @len: length of attribute stream | 134 | * @len: length of attribute stream |
| 135 | * @policy: validation policy | ||
| 135 | * | 136 | * |
| 136 | * Parses a stream of attributes and stores a pointer to each attribute in | 137 | * Parses a stream of attributes and stores a pointer to each attribute in |
| 137 | * the tb array accessable via the attribute type. Attributes with a type | 138 | * the tb array accessable via the attribute type. Attributes with a type |
| @@ -194,7 +195,7 @@ struct nlattr *nla_find(struct nlattr *head, int len, int attrtype) | |||
| 194 | /** | 195 | /** |
| 195 | * nla_strlcpy - Copy string attribute payload into a sized buffer | 196 | * nla_strlcpy - Copy string attribute payload into a sized buffer |
| 196 | * @dst: where to copy the string to | 197 | * @dst: where to copy the string to |
| 197 | * @src: attribute to copy the string from | 198 | * @nla: attribute to copy the string from |
| 198 | * @dstsize: size of destination buffer | 199 | * @dstsize: size of destination buffer |
| 199 | * | 200 | * |
| 200 | * Copies at most dstsize - 1 bytes into the destination buffer. | 201 | * Copies at most dstsize - 1 bytes into the destination buffer. |
| @@ -340,9 +341,9 @@ struct nlattr *nla_reserve(struct sk_buff *skb, int attrtype, int attrlen) | |||
| 340 | } | 341 | } |
| 341 | 342 | ||
| 342 | /** | 343 | /** |
| 343 | * nla_reserve - reserve room for attribute without header | 344 | * nla_reserve_nohdr - reserve room for attribute without header |
| 344 | * @skb: socket buffer to reserve room on | 345 | * @skb: socket buffer to reserve room on |
| 345 | * @len: length of attribute payload | 346 | * @attrlen: length of attribute payload |
| 346 | * | 347 | * |
| 347 | * Reserves room for attribute payload without a header. | 348 | * Reserves room for attribute payload without a header. |
| 348 | * | 349 | * |
diff --git a/net/sched/Kconfig b/net/sched/Kconfig index 82adfe6447d7..9437b27ff84d 100644 --- a/net/sched/Kconfig +++ b/net/sched/Kconfig | |||
| @@ -106,17 +106,6 @@ config NET_SCH_PRIO | |||
| 106 | To compile this code as a module, choose M here: the | 106 | To compile this code as a module, choose M here: the |
| 107 | module will be called sch_prio. | 107 | module will be called sch_prio. |
| 108 | 108 | ||
| 109 | config NET_SCH_RR | ||
| 110 | tristate "Multi Band Round Robin Queuing (RR)" | ||
| 111 | select NET_SCH_PRIO | ||
| 112 | ---help--- | ||
| 113 | Say Y here if you want to use an n-band round robin packet | ||
| 114 | scheduler. | ||
| 115 | |||
| 116 | The module uses sch_prio for its framework and is aliased as | ||
| 117 | sch_rr, so it will load sch_prio, although it is referred | ||
| 118 | to using sch_rr. | ||
| 119 | |||
| 120 | config NET_SCH_RED | 109 | config NET_SCH_RED |
| 121 | tristate "Random Early Detection (RED)" | 110 | tristate "Random Early Detection (RED)" |
| 122 | ---help--- | 111 | ---help--- |
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index c40773cdbe45..10f01ad04380 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c | |||
| @@ -1252,12 +1252,12 @@ void tcf_destroy(struct tcf_proto *tp) | |||
| 1252 | kfree(tp); | 1252 | kfree(tp); |
| 1253 | } | 1253 | } |
| 1254 | 1254 | ||
| 1255 | void tcf_destroy_chain(struct tcf_proto *fl) | 1255 | void tcf_destroy_chain(struct tcf_proto **fl) |
| 1256 | { | 1256 | { |
| 1257 | struct tcf_proto *tp; | 1257 | struct tcf_proto *tp; |
| 1258 | 1258 | ||
| 1259 | while ((tp = fl) != NULL) { | 1259 | while ((tp = *fl) != NULL) { |
| 1260 | fl = tp->next; | 1260 | *fl = tp->next; |
| 1261 | tcf_destroy(tp); | 1261 | tcf_destroy(tp); |
| 1262 | } | 1262 | } |
| 1263 | } | 1263 | } |
diff --git a/net/sched/sch_atm.c b/net/sched/sch_atm.c index 335273416384..db0e23ae85f8 100644 --- a/net/sched/sch_atm.c +++ b/net/sched/sch_atm.c | |||
| @@ -160,7 +160,7 @@ static void atm_tc_put(struct Qdisc *sch, unsigned long cl) | |||
| 160 | *prev = flow->next; | 160 | *prev = flow->next; |
| 161 | pr_debug("atm_tc_put: qdisc %p\n", flow->q); | 161 | pr_debug("atm_tc_put: qdisc %p\n", flow->q); |
| 162 | qdisc_destroy(flow->q); | 162 | qdisc_destroy(flow->q); |
| 163 | tcf_destroy_chain(flow->filter_list); | 163 | tcf_destroy_chain(&flow->filter_list); |
| 164 | if (flow->sock) { | 164 | if (flow->sock) { |
| 165 | pr_debug("atm_tc_put: f_count %d\n", | 165 | pr_debug("atm_tc_put: f_count %d\n", |
| 166 | file_count(flow->sock->file)); | 166 | file_count(flow->sock->file)); |
| @@ -586,10 +586,11 @@ static void atm_tc_destroy(struct Qdisc *sch) | |||
| 586 | struct atm_flow_data *flow; | 586 | struct atm_flow_data *flow; |
| 587 | 587 | ||
| 588 | pr_debug("atm_tc_destroy(sch %p,[qdisc %p])\n", sch, p); | 588 | pr_debug("atm_tc_destroy(sch %p,[qdisc %p])\n", sch, p); |
| 589 | for (flow = p->flows; flow; flow = flow->next) | ||
| 590 | tcf_destroy_chain(&flow->filter_list); | ||
| 591 | |||
| 589 | /* races ? */ | 592 | /* races ? */ |
| 590 | while ((flow = p->flows)) { | 593 | while ((flow = p->flows)) { |
| 591 | tcf_destroy_chain(flow->filter_list); | ||
| 592 | flow->filter_list = NULL; | ||
| 593 | if (flow->ref > 1) | 594 | if (flow->ref > 1) |
| 594 | printk(KERN_ERR "atm_destroy: %p->ref = %d\n", flow, | 595 | printk(KERN_ERR "atm_destroy: %p->ref = %d\n", flow, |
| 595 | flow->ref); | 596 | flow->ref); |
diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c index 09969c1fbc08..2a3c97f7dc63 100644 --- a/net/sched/sch_cbq.c +++ b/net/sched/sch_cbq.c | |||
| @@ -1704,7 +1704,7 @@ static void cbq_destroy_class(struct Qdisc *sch, struct cbq_class *cl) | |||
| 1704 | 1704 | ||
| 1705 | BUG_TRAP(!cl->filters); | 1705 | BUG_TRAP(!cl->filters); |
| 1706 | 1706 | ||
| 1707 | tcf_destroy_chain(cl->filter_list); | 1707 | tcf_destroy_chain(&cl->filter_list); |
| 1708 | qdisc_destroy(cl->q); | 1708 | qdisc_destroy(cl->q); |
| 1709 | qdisc_put_rtab(cl->R_tab); | 1709 | qdisc_put_rtab(cl->R_tab); |
| 1710 | gen_kill_estimator(&cl->bstats, &cl->rate_est); | 1710 | gen_kill_estimator(&cl->bstats, &cl->rate_est); |
| @@ -1728,10 +1728,8 @@ cbq_destroy(struct Qdisc* sch) | |||
| 1728 | * be bound to classes which have been destroyed already. --TGR '04 | 1728 | * be bound to classes which have been destroyed already. --TGR '04 |
| 1729 | */ | 1729 | */ |
| 1730 | for (h = 0; h < 16; h++) { | 1730 | for (h = 0; h < 16; h++) { |
| 1731 | for (cl = q->classes[h]; cl; cl = cl->next) { | 1731 | for (cl = q->classes[h]; cl; cl = cl->next) |
| 1732 | tcf_destroy_chain(cl->filter_list); | 1732 | tcf_destroy_chain(&cl->filter_list); |
| 1733 | cl->filter_list = NULL; | ||
| 1734 | } | ||
| 1735 | } | 1733 | } |
| 1736 | for (h = 0; h < 16; h++) { | 1734 | for (h = 0; h < 16; h++) { |
| 1737 | struct cbq_class *next; | 1735 | struct cbq_class *next; |
diff --git a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c index 64465bacbe79..c4c1317cd47d 100644 --- a/net/sched/sch_dsmark.c +++ b/net/sched/sch_dsmark.c | |||
| @@ -416,7 +416,7 @@ static void dsmark_destroy(struct Qdisc *sch) | |||
| 416 | 416 | ||
| 417 | pr_debug("dsmark_destroy(sch %p,[qdisc %p])\n", sch, p); | 417 | pr_debug("dsmark_destroy(sch %p,[qdisc %p])\n", sch, p); |
| 418 | 418 | ||
| 419 | tcf_destroy_chain(p->filter_list); | 419 | tcf_destroy_chain(&p->filter_list); |
| 420 | qdisc_destroy(p->q); | 420 | qdisc_destroy(p->q); |
| 421 | kfree(p->mask); | 421 | kfree(p->mask); |
| 422 | } | 422 | } |
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index d355e5e47fe3..13afa7214392 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
| @@ -468,7 +468,7 @@ struct Qdisc *qdisc_alloc(struct net_device *dev, struct Qdisc_ops *ops) | |||
| 468 | 468 | ||
| 469 | return sch; | 469 | return sch; |
| 470 | errout: | 470 | errout: |
| 471 | return ERR_PTR(-err); | 471 | return ERR_PTR(err); |
| 472 | } | 472 | } |
| 473 | 473 | ||
| 474 | struct Qdisc * qdisc_create_dflt(struct net_device *dev, struct Qdisc_ops *ops, | 474 | struct Qdisc * qdisc_create_dflt(struct net_device *dev, struct Qdisc_ops *ops, |
diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c index fdfaa3fcc16d..e817aa00441d 100644 --- a/net/sched/sch_hfsc.c +++ b/net/sched/sch_hfsc.c | |||
| @@ -1123,7 +1123,7 @@ hfsc_destroy_class(struct Qdisc *sch, struct hfsc_class *cl) | |||
| 1123 | { | 1123 | { |
| 1124 | struct hfsc_sched *q = qdisc_priv(sch); | 1124 | struct hfsc_sched *q = qdisc_priv(sch); |
| 1125 | 1125 | ||
| 1126 | tcf_destroy_chain(cl->filter_list); | 1126 | tcf_destroy_chain(&cl->filter_list); |
| 1127 | qdisc_destroy(cl->qdisc); | 1127 | qdisc_destroy(cl->qdisc); |
| 1128 | gen_kill_estimator(&cl->bstats, &cl->rate_est); | 1128 | gen_kill_estimator(&cl->bstats, &cl->rate_est); |
| 1129 | if (cl != &q->root) | 1129 | if (cl != &q->root) |
| @@ -1541,6 +1541,10 @@ hfsc_destroy_qdisc(struct Qdisc *sch) | |||
| 1541 | unsigned int i; | 1541 | unsigned int i; |
| 1542 | 1542 | ||
| 1543 | for (i = 0; i < HFSC_HSIZE; i++) { | 1543 | for (i = 0; i < HFSC_HSIZE; i++) { |
| 1544 | list_for_each_entry(cl, &q->clhash[i], hlist) | ||
| 1545 | tcf_destroy_chain(&cl->filter_list); | ||
| 1546 | } | ||
| 1547 | for (i = 0; i < HFSC_HSIZE; i++) { | ||
| 1544 | list_for_each_entry_safe(cl, next, &q->clhash[i], hlist) | 1548 | list_for_each_entry_safe(cl, next, &q->clhash[i], hlist) |
| 1545 | hfsc_destroy_class(sch, cl); | 1549 | hfsc_destroy_class(sch, cl); |
| 1546 | } | 1550 | } |
diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 6807c97985a5..3fb58f428f72 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c | |||
| @@ -1238,7 +1238,7 @@ static void htb_destroy_class(struct Qdisc *sch, struct htb_class *cl) | |||
| 1238 | qdisc_put_rtab(cl->rate); | 1238 | qdisc_put_rtab(cl->rate); |
| 1239 | qdisc_put_rtab(cl->ceil); | 1239 | qdisc_put_rtab(cl->ceil); |
| 1240 | 1240 | ||
| 1241 | tcf_destroy_chain(cl->filter_list); | 1241 | tcf_destroy_chain(&cl->filter_list); |
| 1242 | 1242 | ||
| 1243 | while (!list_empty(&cl->children)) | 1243 | while (!list_empty(&cl->children)) |
| 1244 | htb_destroy_class(sch, list_entry(cl->children.next, | 1244 | htb_destroy_class(sch, list_entry(cl->children.next, |
| @@ -1267,7 +1267,7 @@ static void htb_destroy(struct Qdisc *sch) | |||
| 1267 | and surprisingly it worked in 2.4. But it must precede it | 1267 | and surprisingly it worked in 2.4. But it must precede it |
| 1268 | because filter need its target class alive to be able to call | 1268 | because filter need its target class alive to be able to call |
| 1269 | unbind_filter on it (without Oops). */ | 1269 | unbind_filter on it (without Oops). */ |
| 1270 | tcf_destroy_chain(q->filter_list); | 1270 | tcf_destroy_chain(&q->filter_list); |
| 1271 | 1271 | ||
| 1272 | while (!list_empty(&q->root)) | 1272 | while (!list_empty(&q->root)) |
| 1273 | htb_destroy_class(sch, list_entry(q->root.next, | 1273 | htb_destroy_class(sch, list_entry(q->root.next, |
diff --git a/net/sched/sch_ingress.c b/net/sched/sch_ingress.c index 274b1ddb160c..956c80ad5965 100644 --- a/net/sched/sch_ingress.c +++ b/net/sched/sch_ingress.c | |||
| @@ -104,7 +104,7 @@ static void ingress_destroy(struct Qdisc *sch) | |||
| 104 | { | 104 | { |
| 105 | struct ingress_qdisc_data *p = qdisc_priv(sch); | 105 | struct ingress_qdisc_data *p = qdisc_priv(sch); |
| 106 | 106 | ||
| 107 | tcf_destroy_chain(p->filter_list); | 107 | tcf_destroy_chain(&p->filter_list); |
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | static int ingress_dump(struct Qdisc *sch, struct sk_buff *skb) | 110 | static int ingress_dump(struct Qdisc *sch, struct sk_buff *skb) |
diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c index 4aa2b45dad0a..5532f1031ab5 100644 --- a/net/sched/sch_prio.c +++ b/net/sched/sch_prio.c | |||
| @@ -219,7 +219,7 @@ prio_destroy(struct Qdisc* sch) | |||
| 219 | int prio; | 219 | int prio; |
| 220 | struct prio_sched_data *q = qdisc_priv(sch); | 220 | struct prio_sched_data *q = qdisc_priv(sch); |
| 221 | 221 | ||
| 222 | tcf_destroy_chain(q->filter_list); | 222 | tcf_destroy_chain(&q->filter_list); |
| 223 | for (prio=0; prio<q->bands; prio++) | 223 | for (prio=0; prio<q->bands; prio++) |
| 224 | qdisc_destroy(q->queues[prio]); | 224 | qdisc_destroy(q->queues[prio]); |
| 225 | } | 225 | } |
diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c index f0463d757a98..6a97afbfb952 100644 --- a/net/sched/sch_sfq.c +++ b/net/sched/sch_sfq.c | |||
| @@ -520,7 +520,7 @@ static void sfq_destroy(struct Qdisc *sch) | |||
| 520 | { | 520 | { |
| 521 | struct sfq_sched_data *q = qdisc_priv(sch); | 521 | struct sfq_sched_data *q = qdisc_priv(sch); |
| 522 | 522 | ||
| 523 | tcf_destroy_chain(q->filter_list); | 523 | tcf_destroy_chain(&q->filter_list); |
| 524 | q->perturb_period = 0; | 524 | q->perturb_period = 0; |
| 525 | del_timer_sync(&q->perturb_timer); | 525 | del_timer_sync(&q->perturb_timer); |
| 526 | } | 526 | } |
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 657835f227d3..783317dacd30 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
| @@ -487,8 +487,8 @@ static int unix_socketpair(struct socket *, struct socket *); | |||
| 487 | static int unix_accept(struct socket *, struct socket *, int); | 487 | static int unix_accept(struct socket *, struct socket *, int); |
| 488 | static int unix_getname(struct socket *, struct sockaddr *, int *, int); | 488 | static int unix_getname(struct socket *, struct sockaddr *, int *, int); |
| 489 | static unsigned int unix_poll(struct file *, struct socket *, poll_table *); | 489 | static unsigned int unix_poll(struct file *, struct socket *, poll_table *); |
| 490 | static unsigned int unix_datagram_poll(struct file *, struct socket *, | 490 | static unsigned int unix_dgram_poll(struct file *, struct socket *, |
| 491 | poll_table *); | 491 | poll_table *); |
| 492 | static int unix_ioctl(struct socket *, unsigned int, unsigned long); | 492 | static int unix_ioctl(struct socket *, unsigned int, unsigned long); |
| 493 | static int unix_shutdown(struct socket *, int); | 493 | static int unix_shutdown(struct socket *, int); |
| 494 | static int unix_stream_sendmsg(struct kiocb *, struct socket *, | 494 | static int unix_stream_sendmsg(struct kiocb *, struct socket *, |
| @@ -534,7 +534,7 @@ static const struct proto_ops unix_dgram_ops = { | |||
| 534 | .socketpair = unix_socketpair, | 534 | .socketpair = unix_socketpair, |
| 535 | .accept = sock_no_accept, | 535 | .accept = sock_no_accept, |
| 536 | .getname = unix_getname, | 536 | .getname = unix_getname, |
| 537 | .poll = unix_datagram_poll, | 537 | .poll = unix_dgram_poll, |
| 538 | .ioctl = unix_ioctl, | 538 | .ioctl = unix_ioctl, |
| 539 | .listen = sock_no_listen, | 539 | .listen = sock_no_listen, |
| 540 | .shutdown = unix_shutdown, | 540 | .shutdown = unix_shutdown, |
| @@ -555,7 +555,7 @@ static const struct proto_ops unix_seqpacket_ops = { | |||
| 555 | .socketpair = unix_socketpair, | 555 | .socketpair = unix_socketpair, |
| 556 | .accept = unix_accept, | 556 | .accept = unix_accept, |
| 557 | .getname = unix_getname, | 557 | .getname = unix_getname, |
| 558 | .poll = unix_datagram_poll, | 558 | .poll = unix_dgram_poll, |
| 559 | .ioctl = unix_ioctl, | 559 | .ioctl = unix_ioctl, |
| 560 | .listen = unix_listen, | 560 | .listen = unix_listen, |
| 561 | .shutdown = unix_shutdown, | 561 | .shutdown = unix_shutdown, |
| @@ -1994,29 +1994,13 @@ static unsigned int unix_poll(struct file * file, struct socket *sock, poll_tabl | |||
| 1994 | return mask; | 1994 | return mask; |
| 1995 | } | 1995 | } |
| 1996 | 1996 | ||
| 1997 | static unsigned int unix_datagram_poll(struct file *file, struct socket *sock, | 1997 | static unsigned int unix_dgram_poll(struct file *file, struct socket *sock, |
| 1998 | poll_table *wait) | 1998 | poll_table *wait) |
| 1999 | { | 1999 | { |
| 2000 | struct sock *sk = sock->sk, *peer; | 2000 | struct sock *sk = sock->sk, *other; |
| 2001 | unsigned int mask; | 2001 | unsigned int mask, writable; |
| 2002 | 2002 | ||
| 2003 | poll_wait(file, sk->sk_sleep, wait); | 2003 | poll_wait(file, sk->sk_sleep, wait); |
| 2004 | |||
| 2005 | peer = unix_peer_get(sk); | ||
| 2006 | if (peer) { | ||
| 2007 | if (peer != sk) { | ||
| 2008 | /* | ||
| 2009 | * Writability of a connected socket additionally | ||
| 2010 | * depends on the state of the receive queue of the | ||
| 2011 | * peer. | ||
| 2012 | */ | ||
| 2013 | poll_wait(file, &unix_sk(peer)->peer_wait, wait); | ||
| 2014 | } else { | ||
| 2015 | sock_put(peer); | ||
| 2016 | peer = NULL; | ||
| 2017 | } | ||
| 2018 | } | ||
| 2019 | |||
| 2020 | mask = 0; | 2004 | mask = 0; |
| 2021 | 2005 | ||
| 2022 | /* exceptional events? */ | 2006 | /* exceptional events? */ |
| @@ -2042,14 +2026,26 @@ static unsigned int unix_datagram_poll(struct file *file, struct socket *sock, | |||
| 2042 | } | 2026 | } |
| 2043 | 2027 | ||
| 2044 | /* writable? */ | 2028 | /* writable? */ |
| 2045 | if (unix_writable(sk) && !(peer && unix_recvq_full(peer))) | 2029 | writable = unix_writable(sk); |
| 2030 | if (writable) { | ||
| 2031 | other = unix_peer_get(sk); | ||
| 2032 | if (other) { | ||
| 2033 | if (unix_peer(other) != sk) { | ||
| 2034 | poll_wait(file, &unix_sk(other)->peer_wait, | ||
| 2035 | wait); | ||
| 2036 | if (unix_recvq_full(other)) | ||
| 2037 | writable = 0; | ||
| 2038 | } | ||
| 2039 | |||
| 2040 | sock_put(other); | ||
| 2041 | } | ||
| 2042 | } | ||
| 2043 | |||
| 2044 | if (writable) | ||
| 2046 | mask |= POLLOUT | POLLWRNORM | POLLWRBAND; | 2045 | mask |= POLLOUT | POLLWRNORM | POLLWRBAND; |
| 2047 | else | 2046 | else |
| 2048 | set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); | 2047 | set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); |
| 2049 | 2048 | ||
| 2050 | if (peer) | ||
| 2051 | sock_put(peer); | ||
| 2052 | |||
| 2053 | return mask; | 2049 | return mask; |
| 2054 | } | 2050 | } |
| 2055 | 2051 | ||
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 185488da2466..855bff4b3250 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
| @@ -80,6 +80,23 @@ static const struct ieee80211_channel_range ieee80211_JP_channels[] = { | |||
| 80 | IEEE80211_CHAN_RADAR), | 80 | IEEE80211_CHAN_RADAR), |
| 81 | }; | 81 | }; |
| 82 | 82 | ||
| 83 | static const struct ieee80211_channel_range ieee80211_EU_channels[] = { | ||
| 84 | /* IEEE 802.11b/g, channels 1..13 */ | ||
| 85 | RANGE_PWR(2412, 2472, 20, 6, 0), | ||
| 86 | /* IEEE 802.11a, channel 36*/ | ||
| 87 | RANGE_PWR(5180, 5180, 23, 6, IEEE80211_CHAN_PASSIVE_SCAN), | ||
| 88 | /* IEEE 802.11a, channel 40*/ | ||
| 89 | RANGE_PWR(5200, 5200, 23, 6, IEEE80211_CHAN_PASSIVE_SCAN), | ||
| 90 | /* IEEE 802.11a, channel 44*/ | ||
| 91 | RANGE_PWR(5220, 5220, 23, 6, IEEE80211_CHAN_PASSIVE_SCAN), | ||
| 92 | /* IEEE 802.11a, channels 48..64 */ | ||
| 93 | RANGE_PWR(5240, 5320, 23, 6, IEEE80211_CHAN_NO_IBSS | | ||
| 94 | IEEE80211_CHAN_RADAR), | ||
| 95 | /* IEEE 802.11a, channels 100..140 */ | ||
| 96 | RANGE_PWR(5500, 5700, 30, 6, IEEE80211_CHAN_NO_IBSS | | ||
| 97 | IEEE80211_CHAN_RADAR), | ||
| 98 | }; | ||
| 99 | |||
| 83 | #define REGDOM(_code) \ | 100 | #define REGDOM(_code) \ |
| 84 | { \ | 101 | { \ |
| 85 | .code = __stringify(_code), \ | 102 | .code = __stringify(_code), \ |
| @@ -90,6 +107,7 @@ static const struct ieee80211_channel_range ieee80211_JP_channels[] = { | |||
| 90 | static const struct ieee80211_regdomain ieee80211_regdoms[] = { | 107 | static const struct ieee80211_regdomain ieee80211_regdoms[] = { |
| 91 | REGDOM(US), | 108 | REGDOM(US), |
| 92 | REGDOM(JP), | 109 | REGDOM(JP), |
| 110 | REGDOM(EU), | ||
| 93 | }; | 111 | }; |
| 94 | 112 | ||
| 95 | 113 | ||
