diff options
120 files changed, 845 insertions, 590 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index e5b447a0acda..c4178778e7fd 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -883,6 +883,14 @@ and is between 256 and 4096 characters. It is defined in the file | |||
883 | lapic_timer_c2_ok [X86-32,x86-64,APIC] trust the local apic timer in | 883 | lapic_timer_c2_ok [X86-32,x86-64,APIC] trust the local apic timer in |
884 | C2 power state. | 884 | C2 power state. |
885 | 885 | ||
886 | libata.dma= [LIBATA] DMA control | ||
887 | libata.dma=0 Disable all PATA and SATA DMA | ||
888 | libata.dma=1 PATA and SATA Disk DMA only | ||
889 | libata.dma=2 ATAPI (CDROM) DMA only | ||
890 | libata.dma=4 Compact Flash DMA only | ||
891 | Combinations also work, so libata.dma=3 enables DMA | ||
892 | for disks and CDROMs, but not CFs. | ||
893 | |||
886 | libata.noacpi [LIBATA] Disables use of ACPI in libata suspend/resume | 894 | libata.noacpi [LIBATA] Disables use of ACPI in libata suspend/resume |
887 | when set. | 895 | when set. |
888 | Format: <int> | 896 | Format: <int> |
diff --git a/Documentation/nfsroot.txt b/Documentation/nfsroot.txt index c86dd38e2281..31b329172343 100644 --- a/Documentation/nfsroot.txt +++ b/Documentation/nfsroot.txt | |||
@@ -145,6 +145,7 @@ ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf> | |||
145 | this option. | 145 | this option. |
146 | 146 | ||
147 | off or none: don't use autoconfiguration | 147 | off or none: don't use autoconfiguration |
148 | (do static IP assignment instead) | ||
148 | on or any: use any protocol available in the kernel | 149 | on or any: use any protocol available in the kernel |
149 | (default) | 150 | (default) |
150 | dhcp: use DHCP | 151 | dhcp: use DHCP |
diff --git a/MAINTAINERS b/MAINTAINERS index 79c711e6074b..b4f611c60cfc 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -1919,7 +1919,7 @@ INFINIBAND SUBSYSTEM | |||
1919 | P: Roland Dreier | 1919 | P: Roland Dreier |
1920 | M: rolandd@cisco.com | 1920 | M: rolandd@cisco.com |
1921 | P: Sean Hefty | 1921 | P: Sean Hefty |
1922 | M: mshefty@ichips.intel.com | 1922 | M: sean.hefty@intel.com |
1923 | P: Hal Rosenstock | 1923 | P: Hal Rosenstock |
1924 | M: hal.rosenstock@gmail.com | 1924 | M: hal.rosenstock@gmail.com |
1925 | L: general@lists.openfabrics.org | 1925 | L: general@lists.openfabrics.org |
@@ -1984,29 +1984,27 @@ L: netdev@vger.kernel.org | |||
1984 | S: Maintained | 1984 | S: Maintained |
1985 | 1985 | ||
1986 | INTEL PRO/100 ETHERNET SUPPORT | 1986 | INTEL PRO/100 ETHERNET SUPPORT |
1987 | P: John Ronciak | 1987 | P: Auke Kok |
1988 | M: john.ronciak@intel.com | 1988 | M: auke-jan.h.kok@intel.com |
1989 | P: Jesse Brandeburg | 1989 | P: Jesse Brandeburg |
1990 | M: jesse.brandeburg@intel.com | 1990 | M: jesse.brandeburg@intel.com |
1991 | P: Jeff Kirsher | 1991 | P: Jeff Kirsher |
1992 | M: jeffrey.t.kirsher@intel.com | 1992 | M: jeffrey.t.kirsher@intel.com |
1993 | P: Auke Kok | 1993 | P: John Ronciak |
1994 | M: auke-jan.h.kok@intel.com | 1994 | M: john.ronciak@intel.com |
1995 | L: e1000-devel@lists.sourceforge.net | 1995 | L: e1000-devel@lists.sourceforge.net |
1996 | W: http://sourceforge.net/projects/e1000/ | 1996 | W: http://sourceforge.net/projects/e1000/ |
1997 | S: Supported | 1997 | S: Supported |
1998 | 1998 | ||
1999 | INTEL PRO/1000 GIGABIT ETHERNET SUPPORT | 1999 | INTEL PRO/1000 GIGABIT ETHERNET SUPPORT |
2000 | P: Jeb Cramer | 2000 | P: Auke Kok |
2001 | M: cramerj@intel.com | 2001 | M: auke-jan.h.kok@intel.com |
2002 | P: John Ronciak | ||
2003 | M: john.ronciak@intel.com | ||
2004 | P: Jesse Brandeburg | 2002 | P: Jesse Brandeburg |
2005 | M: jesse.brandeburg@intel.com | 2003 | M: jesse.brandeburg@intel.com |
2006 | P: Jeff Kirsher | 2004 | P: Jeff Kirsher |
2007 | M: jeffrey.t.kirsher@intel.com | 2005 | M: jeffrey.t.kirsher@intel.com |
2008 | P: Auke Kok | 2006 | P: John Ronciak |
2009 | M: auke-jan.h.kok@intel.com | 2007 | M: john.ronciak@intel.com |
2010 | L: e1000-devel@lists.sourceforge.net | 2008 | L: e1000-devel@lists.sourceforge.net |
2011 | W: http://sourceforge.net/projects/e1000/ | 2009 | W: http://sourceforge.net/projects/e1000/ |
2012 | S: Supported | 2010 | S: Supported |
diff --git a/arch/arm/mach-at91/board-ek.c b/arch/arm/mach-at91/board-ek.c index d05b1b2be9fb..53a5ef9e72ee 100644 --- a/arch/arm/mach-at91/board-ek.c +++ b/arch/arm/mach-at91/board-ek.c | |||
@@ -109,6 +109,15 @@ static struct spi_board_info ek_spi_devices[] = { | |||
109 | #endif | 109 | #endif |
110 | }; | 110 | }; |
111 | 111 | ||
112 | static struct i2c_board_info __initdata ek_i2c_devices[] = { | ||
113 | { | ||
114 | I2C_BOARD_INFO("ics1523", 0x26), | ||
115 | }, | ||
116 | { | ||
117 | I2C_BOARD_INFO("dac3550", 0x4d), | ||
118 | } | ||
119 | }; | ||
120 | |||
112 | #define EK_FLASH_BASE AT91_CHIPSELECT_0 | 121 | #define EK_FLASH_BASE AT91_CHIPSELECT_0 |
113 | #define EK_FLASH_SIZE 0x200000 | 122 | #define EK_FLASH_SIZE 0x200000 |
114 | 123 | ||
diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c index dcd81f8d0833..9732d5d9466b 100644 --- a/arch/arm/mach-pxa/pxa25x.c +++ b/arch/arm/mach-pxa/pxa25x.c | |||
@@ -178,13 +178,19 @@ static void pxa25x_cpu_pm_save(unsigned long *sleep_save) | |||
178 | SAVE(GAFR1_L); SAVE(GAFR1_U); | 178 | SAVE(GAFR1_L); SAVE(GAFR1_U); |
179 | SAVE(GAFR2_L); SAVE(GAFR2_U); | 179 | SAVE(GAFR2_L); SAVE(GAFR2_U); |
180 | 180 | ||
181 | SAVE(ICMR); | 181 | SAVE(ICMR); ICMR = 0; |
182 | SAVE(CKEN); | 182 | SAVE(CKEN); |
183 | SAVE(PSTR); | 183 | SAVE(PSTR); |
184 | |||
185 | /* Clear GPIO transition detect bits */ | ||
186 | GEDR0 = GEDR0; GEDR1 = GEDR1; GEDR2 = GEDR2; | ||
184 | } | 187 | } |
185 | 188 | ||
186 | static void pxa25x_cpu_pm_restore(unsigned long *sleep_save) | 189 | static void pxa25x_cpu_pm_restore(unsigned long *sleep_save) |
187 | { | 190 | { |
191 | /* ensure not to come back here if it wasn't intended */ | ||
192 | PSPR = 0; | ||
193 | |||
188 | /* restore registers */ | 194 | /* restore registers */ |
189 | RESTORE_GPLEVEL(0); RESTORE_GPLEVEL(1); RESTORE_GPLEVEL(2); | 195 | RESTORE_GPLEVEL(0); RESTORE_GPLEVEL(1); RESTORE_GPLEVEL(2); |
190 | RESTORE(GPDR0); RESTORE(GPDR1); RESTORE(GPDR2); | 196 | RESTORE(GPDR0); RESTORE(GPDR1); RESTORE(GPDR2); |
@@ -195,7 +201,12 @@ static void pxa25x_cpu_pm_restore(unsigned long *sleep_save) | |||
195 | RESTORE(GFER0); RESTORE(GFER1); RESTORE(GFER2); | 201 | RESTORE(GFER0); RESTORE(GFER1); RESTORE(GFER2); |
196 | RESTORE(PGSR0); RESTORE(PGSR1); RESTORE(PGSR2); | 202 | RESTORE(PGSR0); RESTORE(PGSR1); RESTORE(PGSR2); |
197 | 203 | ||
204 | PSSR = PSSR_RDH | PSSR_PH; | ||
205 | |||
198 | RESTORE(CKEN); | 206 | RESTORE(CKEN); |
207 | |||
208 | ICLR = 0; | ||
209 | ICCR = 1; | ||
199 | RESTORE(ICMR); | 210 | RESTORE(ICMR); |
200 | RESTORE(PSTR); | 211 | RESTORE(PSTR); |
201 | } | 212 | } |
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index c6fc405a6c8e..291d368ffd28 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -992,8 +992,6 @@ config BOOT_ELF64 | |||
992 | 992 | ||
993 | menu "CPU selection" | 993 | menu "CPU selection" |
994 | 994 | ||
995 | source "kernel/time/Kconfig" | ||
996 | |||
997 | choice | 995 | choice |
998 | prompt "CPU type" | 996 | prompt "CPU type" |
999 | default CPU_R4X00 | 997 | default CPU_R4X00 |
@@ -1768,6 +1766,8 @@ config NR_CPUS | |||
1768 | performance should round up your number of processors to the next | 1766 | performance should round up your number of processors to the next |
1769 | power of two. | 1767 | power of two. |
1770 | 1768 | ||
1769 | source "kernel/time/Kconfig" | ||
1770 | |||
1771 | # | 1771 | # |
1772 | # Timer Interrupt Frequency Configuration | 1772 | # Timer Interrupt Frequency Configuration |
1773 | # | 1773 | # |
diff --git a/arch/mips/au1000/common/pci.c b/arch/mips/au1000/common/pci.c index 6fa70a36a250..ce771487567d 100644 --- a/arch/mips/au1000/common/pci.c +++ b/arch/mips/au1000/common/pci.c | |||
@@ -1,8 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | * BRIEF MODULE DESCRIPTION | 2 | * BRIEF MODULE DESCRIPTION |
3 | * Alchemy/AMD Au1x00 pci support. | 3 | * Alchemy/AMD Au1x00 PCI support. |
4 | * | 4 | * |
5 | * Copyright 2001,2002,2003 MontaVista Software Inc. | 5 | * Copyright 2001-2003, 2007 MontaVista Software Inc. |
6 | * Author: MontaVista Software, Inc. | 6 | * Author: MontaVista Software, Inc. |
7 | * ppopov@mvista.com or source@mvista.com | 7 | * ppopov@mvista.com or source@mvista.com |
8 | * | 8 | * |
@@ -66,6 +66,8 @@ static unsigned long virt_io_addr; | |||
66 | 66 | ||
67 | static int __init au1x_pci_setup(void) | 67 | static int __init au1x_pci_setup(void) |
68 | { | 68 | { |
69 | extern void au1x_pci_cfg_init(void); | ||
70 | |||
69 | #if defined(CONFIG_SOC_AU1500) || defined(CONFIG_SOC_AU1550) | 71 | #if defined(CONFIG_SOC_AU1500) || defined(CONFIG_SOC_AU1550) |
70 | virt_io_addr = (unsigned long)ioremap(Au1500_PCI_IO_START, | 72 | virt_io_addr = (unsigned long)ioremap(Au1500_PCI_IO_START, |
71 | Au1500_PCI_IO_END - Au1500_PCI_IO_START + 1); | 73 | Au1500_PCI_IO_END - Au1500_PCI_IO_START + 1); |
@@ -94,6 +96,8 @@ static int __init au1x_pci_setup(void) | |||
94 | set_io_port_base(virt_io_addr); | 96 | set_io_port_base(virt_io_addr); |
95 | #endif | 97 | #endif |
96 | 98 | ||
99 | au1x_pci_cfg_init(); | ||
100 | |||
97 | register_pci_controller(&au1x_controller); | 101 | register_pci_controller(&au1x_controller); |
98 | return 0; | 102 | return 0; |
99 | } | 103 | } |
diff --git a/arch/mips/kernel/head.S b/arch/mips/kernel/head.S index 236768731063..50be56c9e9ef 100644 --- a/arch/mips/kernel/head.S +++ b/arch/mips/kernel/head.S | |||
@@ -136,7 +136,8 @@ EXPORT(_stext) | |||
136 | * kernel load address. This is needed because this platform does | 136 | * kernel load address. This is needed because this platform does |
137 | * not have a ELF loader yet. | 137 | * not have a ELF loader yet. |
138 | */ | 138 | */ |
139 | __INIT | 139 | FEXPORT(__kernel_entry) |
140 | j kernel_entry | ||
140 | #endif | 141 | #endif |
141 | 142 | ||
142 | __INIT_REFOK | 143 | __INIT_REFOK |
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index 7f6ddcb5d485..f8a535afce39 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c | |||
@@ -269,7 +269,7 @@ static void __init bootmem_init(void) | |||
269 | 269 | ||
270 | static void __init bootmem_init(void) | 270 | static void __init bootmem_init(void) |
271 | { | 271 | { |
272 | unsigned long init_begin, reserved_end; | 272 | unsigned long reserved_end; |
273 | unsigned long mapstart = ~0UL; | 273 | unsigned long mapstart = ~0UL; |
274 | unsigned long bootmap_size; | 274 | unsigned long bootmap_size; |
275 | int i; | 275 | int i; |
@@ -344,7 +344,6 @@ static void __init bootmem_init(void) | |||
344 | min_low_pfn, max_low_pfn); | 344 | min_low_pfn, max_low_pfn); |
345 | 345 | ||
346 | 346 | ||
347 | init_begin = PFN_UP(__pa_symbol(&__init_begin)); | ||
348 | for (i = 0; i < boot_mem_map.nr_map; i++) { | 347 | for (i = 0; i < boot_mem_map.nr_map; i++) { |
349 | unsigned long start, end; | 348 | unsigned long start, end; |
350 | 349 | ||
@@ -352,8 +351,8 @@ static void __init bootmem_init(void) | |||
352 | end = PFN_DOWN(boot_mem_map.map[i].addr | 351 | end = PFN_DOWN(boot_mem_map.map[i].addr |
353 | + boot_mem_map.map[i].size); | 352 | + boot_mem_map.map[i].size); |
354 | 353 | ||
355 | if (start <= init_begin) | 354 | if (start <= min_low_pfn) |
356 | start = init_begin; | 355 | start = min_low_pfn; |
357 | if (start >= end) | 356 | if (start >= end) |
358 | continue; | 357 | continue; |
359 | 358 | ||
diff --git a/arch/mips/kernel/time.c b/arch/mips/kernel/time.c index 1ecfbb7eba6c..2995be1ab3ca 100644 --- a/arch/mips/kernel/time.c +++ b/arch/mips/kernel/time.c | |||
@@ -147,9 +147,9 @@ static __init int cpu_has_mfc0_count_bug(void) | |||
147 | return 1; | 147 | return 1; |
148 | 148 | ||
149 | /* | 149 | /* |
150 | * I don't have erratas for newer R4400 so be paranoid. | 150 | * we assume newer revisions are ok |
151 | */ | 151 | */ |
152 | return 1; | 152 | return 0; |
153 | } | 153 | } |
154 | 154 | ||
155 | return 0; | 155 | return 0; |
diff --git a/arch/mips/lasat/image/Makefile b/arch/mips/lasat/image/Makefile index 5332449ec040..460626b6d62f 100644 --- a/arch/mips/lasat/image/Makefile +++ b/arch/mips/lasat/image/Makefile | |||
@@ -12,11 +12,11 @@ endif | |||
12 | 12 | ||
13 | MKLASATIMG = mklasatimg | 13 | MKLASATIMG = mklasatimg |
14 | MKLASATIMG_ARCH = mq2,mqpro,sp100,sp200 | 14 | MKLASATIMG_ARCH = mq2,mqpro,sp100,sp200 |
15 | KERNEL_IMAGE = $(TOPDIR)/vmlinux | 15 | KERNEL_IMAGE = vmlinux |
16 | KERNEL_START = $(shell $(NM) $(KERNEL_IMAGE) | grep " _text" | cut -f1 -d\ ) | 16 | KERNEL_START = $(shell $(NM) $(KERNEL_IMAGE) | grep " _text" | cut -f1 -d\ ) |
17 | KERNEL_ENTRY = $(shell $(NM) $(KERNEL_IMAGE) | grep kernel_entry | cut -f1 -d\ ) | 17 | KERNEL_ENTRY = $(shell $(NM) $(KERNEL_IMAGE) | grep kernel_entry | cut -f1 -d\ ) |
18 | 18 | ||
19 | LDSCRIPT= -L$(obj) -Tromscript.normal | 19 | LDSCRIPT= -L$(srctree)/$(src) -Tromscript.normal |
20 | 20 | ||
21 | HEAD_DEFINES := -D_kernel_start=0x$(KERNEL_START) \ | 21 | HEAD_DEFINES := -D_kernel_start=0x$(KERNEL_START) \ |
22 | -D_kernel_entry=0x$(KERNEL_ENTRY) \ | 22 | -D_kernel_entry=0x$(KERNEL_ENTRY) \ |
@@ -24,7 +24,7 @@ HEAD_DEFINES := -D_kernel_start=0x$(KERNEL_START) \ | |||
24 | -D TIMESTAMP=$(shell date +%s) | 24 | -D TIMESTAMP=$(shell date +%s) |
25 | 25 | ||
26 | $(obj)/head.o: $(obj)/head.S $(KERNEL_IMAGE) | 26 | $(obj)/head.o: $(obj)/head.S $(KERNEL_IMAGE) |
27 | $(CC) -fno-pic $(HEAD_DEFINES) -I$(TOPDIR)/include -c -o $@ $< | 27 | $(CC) -fno-pic $(HEAD_DEFINES) $(LINUXINCLUDE) -c -o $@ $< |
28 | 28 | ||
29 | OBJECTS = head.o kImage.o | 29 | OBJECTS = head.o kImage.o |
30 | 30 | ||
diff --git a/arch/mips/mips-boards/generic/memory.c b/arch/mips/mips-boards/generic/memory.c index 2c5c27c8e86d..dc272c188233 100644 --- a/arch/mips/mips-boards/generic/memory.c +++ b/arch/mips/mips-boards/generic/memory.c | |||
@@ -169,7 +169,6 @@ void __init prom_meminit(void) | |||
169 | 169 | ||
170 | void __init prom_free_prom_memory(void) | 170 | void __init prom_free_prom_memory(void) |
171 | { | 171 | { |
172 | #if 0 /* for now ... */ | ||
173 | unsigned long addr; | 172 | unsigned long addr; |
174 | int i; | 173 | int i; |
175 | 174 | ||
@@ -181,5 +180,4 @@ void __init prom_free_prom_memory(void) | |||
181 | free_init_pages("prom memory", | 180 | free_init_pages("prom memory", |
182 | addr, addr + boot_mem_map.map[i].size); | 181 | addr, addr + boot_mem_map.map[i].size); |
183 | } | 182 | } |
184 | #endif | ||
185 | } | 183 | } |
diff --git a/arch/mips/mips-boards/generic/reset.c b/arch/mips/mips-boards/generic/reset.c index 7a1bb51f81ee..583d468d98a9 100644 --- a/arch/mips/mips-boards/generic/reset.c +++ b/arch/mips/mips-boards/generic/reset.c | |||
@@ -39,16 +39,18 @@ static void atlas_machine_power_off(void); | |||
39 | 39 | ||
40 | static void mips_machine_restart(char *command) | 40 | static void mips_machine_restart(char *command) |
41 | { | 41 | { |
42 | unsigned int __iomem *softres_reg = ioremap(SOFTRES_REG, sizeof(unsigned int)); | 42 | unsigned int __iomem *softres_reg = |
43 | ioremap(SOFTRES_REG, sizeof(unsigned int)); | ||
43 | 44 | ||
44 | writew(GORESET, softres_reg); | 45 | __raw_writel(GORESET, softres_reg); |
45 | } | 46 | } |
46 | 47 | ||
47 | static void mips_machine_halt(void) | 48 | static void mips_machine_halt(void) |
48 | { | 49 | { |
49 | unsigned int __iomem *softres_reg = ioremap(SOFTRES_REG, sizeof(unsigned int)); | 50 | unsigned int __iomem *softres_reg = |
51 | ioremap(SOFTRES_REG, sizeof(unsigned int)); | ||
50 | 52 | ||
51 | writew(GORESET, softres_reg); | 53 | __raw_writel(GORESET, softres_reg); |
52 | } | 54 | } |
53 | 55 | ||
54 | #if defined(CONFIG_MIPS_ATLAS) | 56 | #if defined(CONFIG_MIPS_ATLAS) |
diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c index ae76795685cc..810535dd091b 100644 --- a/arch/mips/mm/dma-default.c +++ b/arch/mips/mm/dma-default.c | |||
@@ -45,7 +45,7 @@ static gfp_t massage_gfp_flags(const struct device *dev, gfp_t gfp) | |||
45 | /* ignore region specifiers */ | 45 | /* ignore region specifiers */ |
46 | gfp &= ~(__GFP_DMA | __GFP_DMA32 | __GFP_HIGHMEM); | 46 | gfp &= ~(__GFP_DMA | __GFP_DMA32 | __GFP_HIGHMEM); |
47 | 47 | ||
48 | #ifdef CONFIG_ZONE_DMA32 | 48 | #ifdef CONFIG_ZONE_DMA |
49 | if (dev == NULL) | 49 | if (dev == NULL) |
50 | gfp |= __GFP_DMA; | 50 | gfp |= __GFP_DMA; |
51 | else if (dev->coherent_dma_mask < DMA_BIT_MASK(24)) | 51 | else if (dev->coherent_dma_mask < DMA_BIT_MASK(24)) |
diff --git a/arch/mips/pci/ops-au1000.c b/arch/mips/pci/ops-au1000.c index 6b29904acf45..1314bd58f036 100644 --- a/arch/mips/pci/ops-au1000.c +++ b/arch/mips/pci/ops-au1000.c | |||
@@ -1,8 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | * BRIEF MODULE DESCRIPTION | 2 | * BRIEF MODULE DESCRIPTION |
3 | * Alchemy/AMD Au1x00 pci support. | 3 | * Alchemy/AMD Au1x00 PCI support. |
4 | * | 4 | * |
5 | * Copyright 2001,2002,2003 MontaVista Software Inc. | 5 | * Copyright 2001-2003, 2007 MontaVista Software Inc. |
6 | * Author: MontaVista Software, Inc. | 6 | * Author: MontaVista Software, Inc. |
7 | * ppopov@mvista.com or source@mvista.com | 7 | * ppopov@mvista.com or source@mvista.com |
8 | * | 8 | * |
@@ -69,10 +69,27 @@ void mod_wired_entry(int entry, unsigned long entrylo0, | |||
69 | write_c0_pagemask(old_pagemask); | 69 | write_c0_pagemask(old_pagemask); |
70 | } | 70 | } |
71 | 71 | ||
72 | struct vm_struct *pci_cfg_vm; | 72 | static struct vm_struct *pci_cfg_vm; |
73 | static int pci_cfg_wired_entry; | 73 | static int pci_cfg_wired_entry; |
74 | static int first_cfg = 1; | 74 | static unsigned long last_entryLo0, last_entryLo1; |
75 | unsigned long last_entryLo0, last_entryLo1; | 75 | |
76 | /* | ||
77 | * We can't ioremap the entire pci config space because it's too large. | ||
78 | * Nor can we call ioremap dynamically because some device drivers use | ||
79 | * the PCI config routines from within interrupt handlers and that | ||
80 | * becomes a problem in get_vm_area(). We use one wired TLB to handle | ||
81 | * all config accesses for all busses. | ||
82 | */ | ||
83 | void __init au1x_pci_cfg_init(void) | ||
84 | { | ||
85 | /* Reserve a wired entry for PCI config accesses */ | ||
86 | pci_cfg_vm = get_vm_area(0x2000, VM_IOREMAP); | ||
87 | if (!pci_cfg_vm) | ||
88 | panic(KERN_ERR "PCI unable to get vm area\n"); | ||
89 | pci_cfg_wired_entry = read_c0_wired(); | ||
90 | add_wired_entry(0, 0, (unsigned long)pci_cfg_vm->addr, PM_4K); | ||
91 | last_entryLo0 = last_entryLo1 = 0xffffffff; | ||
92 | } | ||
76 | 93 | ||
77 | static int config_access(unsigned char access_type, struct pci_bus *bus, | 94 | static int config_access(unsigned char access_type, struct pci_bus *bus, |
78 | unsigned int dev_fn, unsigned char where, | 95 | unsigned int dev_fn, unsigned char where, |
@@ -97,27 +114,6 @@ static int config_access(unsigned char access_type, struct pci_bus *bus, | |||
97 | Au1500_PCI_STATCMD); | 114 | Au1500_PCI_STATCMD); |
98 | au_sync_udelay(1); | 115 | au_sync_udelay(1); |
99 | 116 | ||
100 | /* | ||
101 | * We can't ioremap the entire pci config space because it's | ||
102 | * too large. Nor can we call ioremap dynamically because some | ||
103 | * device drivers use the pci config routines from within | ||
104 | * interrupt handlers and that becomes a problem in get_vm_area(). | ||
105 | * We use one wired tlb to handle all config accesses for all | ||
106 | * busses. To improve performance, if the current device | ||
107 | * is the same as the last device accessed, we don't touch the | ||
108 | * tlb. | ||
109 | */ | ||
110 | if (first_cfg) { | ||
111 | /* reserve a wired entry for pci config accesses */ | ||
112 | first_cfg = 0; | ||
113 | pci_cfg_vm = get_vm_area(0x2000, VM_IOREMAP); | ||
114 | if (!pci_cfg_vm) | ||
115 | panic(KERN_ERR "PCI unable to get vm area\n"); | ||
116 | pci_cfg_wired_entry = read_c0_wired(); | ||
117 | add_wired_entry(0, 0, (unsigned long)pci_cfg_vm->addr, PM_4K); | ||
118 | last_entryLo0 = last_entryLo1 = 0xffffffff; | ||
119 | } | ||
120 | |||
121 | /* Allow board vendors to implement their own off-chip idsel. | 117 | /* Allow board vendors to implement their own off-chip idsel. |
122 | * If it doesn't succeed, may as well bail out at this point. | 118 | * If it doesn't succeed, may as well bail out at this point. |
123 | */ | 119 | */ |
@@ -144,9 +140,12 @@ static int config_access(unsigned char access_type, struct pci_bus *bus, | |||
144 | /* page boundary */ | 140 | /* page boundary */ |
145 | cfg_base = cfg_base & PAGE_MASK; | 141 | cfg_base = cfg_base & PAGE_MASK; |
146 | 142 | ||
143 | /* | ||
144 | * To improve performance, if the current device is the same as | ||
145 | * the last device accessed, we don't touch the TLB. | ||
146 | */ | ||
147 | entryLo0 = (6 << 26) | (cfg_base >> 6) | (2 << 3) | 7; | 147 | entryLo0 = (6 << 26) | (cfg_base >> 6) | (2 << 3) | 7; |
148 | entryLo1 = (6 << 26) | (cfg_base >> 6) | (0x1000 >> 6) | (2 << 3) | 7; | 148 | entryLo1 = (6 << 26) | (cfg_base >> 6) | (0x1000 >> 6) | (2 << 3) | 7; |
149 | |||
150 | if ((entryLo0 != last_entryLo0) || (entryLo1 != last_entryLo1)) { | 149 | if ((entryLo0 != last_entryLo0) || (entryLo1 != last_entryLo1)) { |
151 | mod_wired_entry(pci_cfg_wired_entry, entryLo0, entryLo1, | 150 | mod_wired_entry(pci_cfg_wired_entry, entryLo0, entryLo1, |
152 | (unsigned long)pci_cfg_vm->addr, PM_4K); | 151 | (unsigned long)pci_cfg_vm->addr, PM_4K); |
diff --git a/arch/mips/pci/ops-mace.c b/arch/mips/pci/ops-mace.c index fe5451449304..e95881897ec9 100644 --- a/arch/mips/pci/ops-mace.c +++ b/arch/mips/pci/ops-mace.c | |||
@@ -42,6 +42,10 @@ static int | |||
42 | mace_pci_read_config(struct pci_bus *bus, unsigned int devfn, | 42 | mace_pci_read_config(struct pci_bus *bus, unsigned int devfn, |
43 | int reg, int size, u32 *val) | 43 | int reg, int size, u32 *val) |
44 | { | 44 | { |
45 | u32 control = mace->pci.control; | ||
46 | |||
47 | /* disable master aborts interrupts during config read */ | ||
48 | mace->pci.control = control & ~MACEPCI_CONTROL_MAR_INT; | ||
45 | mace->pci.config_addr = mkaddr(bus, devfn, reg); | 49 | mace->pci.config_addr = mkaddr(bus, devfn, reg); |
46 | switch (size) { | 50 | switch (size) { |
47 | case 1: | 51 | case 1: |
@@ -54,6 +58,9 @@ mace_pci_read_config(struct pci_bus *bus, unsigned int devfn, | |||
54 | *val = mace->pci.config_data.l; | 58 | *val = mace->pci.config_data.l; |
55 | break; | 59 | break; |
56 | } | 60 | } |
61 | /* ack possible master abort */ | ||
62 | mace->pci.error &= ~MACEPCI_ERROR_MASTER_ABORT; | ||
63 | mace->pci.control = control; | ||
57 | 64 | ||
58 | DPRINTK("read%d: reg=%08x,val=%02x\n", size * 8, reg, *val); | 65 | DPRINTK("read%d: reg=%08x,val=%02x\n", size * 8, reg, *val); |
59 | 66 | ||
diff --git a/arch/mips/pci/pci-ip32.c b/arch/mips/pci/pci-ip32.c index 618ea7dbc474..532b561b4442 100644 --- a/arch/mips/pci/pci-ip32.c +++ b/arch/mips/pci/pci-ip32.c | |||
@@ -119,6 +119,7 @@ static struct pci_controller mace_pci_controller = { | |||
119 | .iommu = 0, | 119 | .iommu = 0, |
120 | .mem_offset = MACE_PCI_MEM_OFFSET, | 120 | .mem_offset = MACE_PCI_MEM_OFFSET, |
121 | .io_offset = 0, | 121 | .io_offset = 0, |
122 | .io_map_base = CKSEG1ADDR(MACEPCI_LOW_IO), | ||
122 | }; | 123 | }; |
123 | 124 | ||
124 | static int __init mace_init(void) | 125 | static int __init mace_init(void) |
@@ -135,7 +136,8 @@ static int __init mace_init(void) | |||
135 | BUG_ON(request_irq(MACE_PCI_BRIDGE_IRQ, macepci_error, 0, | 136 | BUG_ON(request_irq(MACE_PCI_BRIDGE_IRQ, macepci_error, 0, |
136 | "MACE PCI error", NULL)); | 137 | "MACE PCI error", NULL)); |
137 | 138 | ||
138 | iomem_resource = mace_pci_mem_resource; | 139 | /* extend memory resources */ |
140 | iomem_resource.end = mace_pci_mem_resource.end; | ||
139 | ioport_resource = mace_pci_io_resource; | 141 | ioport_resource = mace_pci_io_resource; |
140 | 142 | ||
141 | register_pci_controller(&mace_pci_controller); | 143 | register_pci_controller(&mace_pci_controller); |
diff --git a/arch/mips/philips/pnx8550/common/time.c b/arch/mips/philips/pnx8550/common/time.c index e818fd0f1584..6d494e0de3d9 100644 --- a/arch/mips/philips/pnx8550/common/time.c +++ b/arch/mips/philips/pnx8550/common/time.c | |||
@@ -22,7 +22,6 @@ | |||
22 | #include <linux/kernel_stat.h> | 22 | #include <linux/kernel_stat.h> |
23 | #include <linux/spinlock.h> | 23 | #include <linux/spinlock.h> |
24 | #include <linux/interrupt.h> | 24 | #include <linux/interrupt.h> |
25 | #include <linux/module.h> | ||
26 | 25 | ||
27 | #include <asm/bootinfo.h> | 26 | #include <asm/bootinfo.h> |
28 | #include <asm/cpu.h> | 27 | #include <asm/cpu.h> |
@@ -41,11 +40,60 @@ static cycle_t hpt_read(void) | |||
41 | return read_c0_count2(); | 40 | return read_c0_count2(); |
42 | } | 41 | } |
43 | 42 | ||
43 | static struct clocksource pnx_clocksource = { | ||
44 | .name = "pnx8xxx", | ||
45 | .rating = 200, | ||
46 | .read = hpt_read, | ||
47 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | ||
48 | }; | ||
49 | |||
44 | static void timer_ack(void) | 50 | static void timer_ack(void) |
45 | { | 51 | { |
46 | write_c0_compare(cpj); | 52 | write_c0_compare(cpj); |
47 | } | 53 | } |
48 | 54 | ||
55 | static irqreturn_t pnx8xxx_timer_interrupt(int irq, void *dev_id) | ||
56 | { | ||
57 | struct clock_event_device *c = dev_id; | ||
58 | |||
59 | /* clear MATCH, signal the event */ | ||
60 | c->event_handler(c); | ||
61 | |||
62 | return IRQ_HANDLED; | ||
63 | } | ||
64 | |||
65 | static struct irqaction pnx8xxx_timer_irq = { | ||
66 | .handler = pnx8xxx_timer_interrupt, | ||
67 | .flags = IRQF_DISABLED | IRQF_PERCPU, | ||
68 | .name = "pnx8xxx_timer", | ||
69 | }; | ||
70 | |||
71 | static irqreturn_t monotonic_interrupt(int irq, void *dev_id) | ||
72 | { | ||
73 | /* Timer 2 clear interrupt */ | ||
74 | write_c0_compare2(-1); | ||
75 | return IRQ_HANDLED; | ||
76 | } | ||
77 | |||
78 | static struct irqaction monotonic_irqaction = { | ||
79 | .handler = monotonic_interrupt, | ||
80 | .flags = IRQF_DISABLED, | ||
81 | .name = "Monotonic timer", | ||
82 | }; | ||
83 | |||
84 | static int pnx8xxx_set_next_event(unsigned long delta, | ||
85 | struct clock_event_device *evt) | ||
86 | { | ||
87 | write_c0_compare(delta); | ||
88 | return 0; | ||
89 | } | ||
90 | |||
91 | static struct clock_event_device pnx8xxx_clockevent = { | ||
92 | .name = "pnx8xxx_clockevent", | ||
93 | .features = CLOCK_EVT_FEAT_ONESHOT, | ||
94 | .set_next_event = pnx8xxx_set_next_event, | ||
95 | }; | ||
96 | |||
49 | /* | 97 | /* |
50 | * plat_time_init() - it does the following things: | 98 | * plat_time_init() - it does the following things: |
51 | * | 99 | * |
@@ -58,11 +106,34 @@ static void timer_ack(void) | |||
58 | 106 | ||
59 | __init void plat_time_init(void) | 107 | __init void plat_time_init(void) |
60 | { | 108 | { |
109 | unsigned int configPR; | ||
61 | unsigned int n; | 110 | unsigned int n; |
62 | unsigned int m; | 111 | unsigned int m; |
63 | unsigned int p; | 112 | unsigned int p; |
64 | unsigned int pow2p; | 113 | unsigned int pow2p; |
65 | 114 | ||
115 | clockevents_register_device(&pnx8xxx_clockevent); | ||
116 | clocksource_register(&pnx_clocksource); | ||
117 | |||
118 | setup_irq(PNX8550_INT_TIMER1, &pnx8xxx_timer_irq); | ||
119 | setup_irq(PNX8550_INT_TIMER2, &monotonic_irqaction); | ||
120 | |||
121 | /* Timer 1 start */ | ||
122 | configPR = read_c0_config7(); | ||
123 | configPR &= ~0x00000008; | ||
124 | write_c0_config7(configPR); | ||
125 | |||
126 | /* Timer 2 start */ | ||
127 | configPR = read_c0_config7(); | ||
128 | configPR &= ~0x00000010; | ||
129 | write_c0_config7(configPR); | ||
130 | |||
131 | /* Timer 3 stop */ | ||
132 | configPR = read_c0_config7(); | ||
133 | configPR |= 0x00000020; | ||
134 | write_c0_config7(configPR); | ||
135 | |||
136 | |||
66 | /* PLL0 sets MIPS clock (PLL1 <=> TM1, PLL6 <=> TM2, PLL5 <=> mem) */ | 137 | /* PLL0 sets MIPS clock (PLL1 <=> TM1, PLL6 <=> TM2, PLL5 <=> mem) */ |
67 | /* (but only if CLK_MIPS_CTL select value [bits 3:1] is 1: FIXME) */ | 138 | /* (but only if CLK_MIPS_CTL select value [bits 3:1] is 1: FIXME) */ |
68 | 139 | ||
@@ -87,42 +158,6 @@ __init void plat_time_init(void) | |||
87 | write_c0_count2(0); | 158 | write_c0_count2(0); |
88 | write_c0_compare2(0xffffffff); | 159 | write_c0_compare2(0xffffffff); |
89 | 160 | ||
90 | clocksource_mips.read = hpt_read; | ||
91 | mips_timer_ack = timer_ack; | ||
92 | } | ||
93 | |||
94 | static irqreturn_t monotonic_interrupt(int irq, void *dev_id) | ||
95 | { | ||
96 | /* Timer 2 clear interrupt */ | ||
97 | write_c0_compare2(-1); | ||
98 | return IRQ_HANDLED; | ||
99 | } | 161 | } |
100 | 162 | ||
101 | static struct irqaction monotonic_irqaction = { | ||
102 | .handler = monotonic_interrupt, | ||
103 | .flags = IRQF_DISABLED, | ||
104 | .name = "Monotonic timer", | ||
105 | }; | ||
106 | 163 | ||
107 | void __init plat_timer_setup(struct irqaction *irq) | ||
108 | { | ||
109 | int configPR; | ||
110 | |||
111 | setup_irq(PNX8550_INT_TIMER1, irq); | ||
112 | setup_irq(PNX8550_INT_TIMER2, &monotonic_irqaction); | ||
113 | |||
114 | /* Timer 1 start */ | ||
115 | configPR = read_c0_config7(); | ||
116 | configPR &= ~0x00000008; | ||
117 | write_c0_config7(configPR); | ||
118 | |||
119 | /* Timer 2 start */ | ||
120 | configPR = read_c0_config7(); | ||
121 | configPR &= ~0x00000010; | ||
122 | write_c0_config7(configPR); | ||
123 | |||
124 | /* Timer 3 stop */ | ||
125 | configPR = read_c0_config7(); | ||
126 | configPR |= 0x00000020; | ||
127 | write_c0_config7(configPR); | ||
128 | } | ||
diff --git a/arch/mips/sgi-ip32/ip32-irq.c b/arch/mips/sgi-ip32/ip32-irq.c index cab7cc22ab67..b0ea0e43ba48 100644 --- a/arch/mips/sgi-ip32/ip32-irq.c +++ b/arch/mips/sgi-ip32/ip32-irq.c | |||
@@ -426,7 +426,6 @@ static void ip32_irq0(void) | |||
426 | 426 | ||
427 | crime_int = crime->istat & crime_mask; | 427 | crime_int = crime->istat & crime_mask; |
428 | irq = MACE_VID_IN1_IRQ + __ffs(crime_int); | 428 | irq = MACE_VID_IN1_IRQ + __ffs(crime_int); |
429 | crime_int = 1 << irq; | ||
430 | 429 | ||
431 | if (crime_int & CRIME_MACEISA_INT_MASK) { | 430 | if (crime_int & CRIME_MACEISA_INT_MASK) { |
432 | unsigned long mace_int = mace->perif.ctrl.istat; | 431 | unsigned long mace_int = mace->perif.ctrl.istat; |
diff --git a/arch/mips/sgi-ip32/ip32-platform.c b/arch/mips/sgi-ip32/ip32-platform.c index 77febd68fcd4..89a71f49b692 100644 --- a/arch/mips/sgi-ip32/ip32-platform.c +++ b/arch/mips/sgi-ip32/ip32-platform.c | |||
@@ -13,21 +13,22 @@ | |||
13 | #include <asm/ip32/mace.h> | 13 | #include <asm/ip32/mace.h> |
14 | #include <asm/ip32/ip32_ints.h> | 14 | #include <asm/ip32/ip32_ints.h> |
15 | 15 | ||
16 | /* | 16 | #define MACEISA_SERIAL1_OFFS offsetof(struct sgi_mace, isa.serial1) |
17 | * .iobase isn't a constant (in the sense of C) so we fill it in at runtime. | 17 | #define MACEISA_SERIAL2_OFFS offsetof(struct sgi_mace, isa.serial2) |
18 | */ | 18 | |
19 | #define MACE_PORT(int) \ | 19 | #define MACE_PORT(offset,_irq) \ |
20 | { \ | 20 | { \ |
21 | .irq = int, \ | 21 | .mapbase = MACE_BASE + offset, \ |
22 | .irq = _irq, \ | ||
22 | .uartclk = 1843200, \ | 23 | .uartclk = 1843200, \ |
23 | .iotype = UPIO_MEM, \ | 24 | .iotype = UPIO_MEM, \ |
24 | .flags = UPF_SKIP_TEST, \ | 25 | .flags = UPF_SKIP_TEST|UPF_IOREMAP, \ |
25 | .regshift = 8, \ | 26 | .regshift = 8, \ |
26 | } | 27 | } |
27 | 28 | ||
28 | static struct plat_serial8250_port uart8250_data[] = { | 29 | static struct plat_serial8250_port uart8250_data[] = { |
29 | MACE_PORT(MACEISA_SERIAL1_IRQ), | 30 | MACE_PORT(MACEISA_SERIAL1_OFFS, MACEISA_SERIAL1_IRQ), |
30 | MACE_PORT(MACEISA_SERIAL2_IRQ), | 31 | MACE_PORT(MACEISA_SERIAL2_OFFS, MACEISA_SERIAL2_IRQ), |
31 | { }, | 32 | { }, |
32 | }; | 33 | }; |
33 | 34 | ||
@@ -41,9 +42,6 @@ static struct platform_device uart8250_device = { | |||
41 | 42 | ||
42 | static int __init uart8250_init(void) | 43 | static int __init uart8250_init(void) |
43 | { | 44 | { |
44 | uart8250_data[0].membase = (void __iomem *) &mace->isa.serial1; | ||
45 | uart8250_data[1].membase = (void __iomem *) &mace->isa.serial2; | ||
46 | |||
47 | return platform_device_register(&uart8250_device); | 45 | return platform_device_register(&uart8250_device); |
48 | } | 46 | } |
49 | 47 | ||
diff --git a/arch/x86/kernel/smpboot_64.c b/arch/x86/kernel/smpboot_64.c index 500670c93d81..aaf4e1291217 100644 --- a/arch/x86/kernel/smpboot_64.c +++ b/arch/x86/kernel/smpboot_64.c | |||
@@ -526,7 +526,7 @@ struct create_idle { | |||
526 | int cpu; | 526 | int cpu; |
527 | }; | 527 | }; |
528 | 528 | ||
529 | void do_fork_idle(struct work_struct *work) | 529 | static void __cpuinit do_fork_idle(struct work_struct *work) |
530 | { | 530 | { |
531 | struct create_idle *c_idle = | 531 | struct create_idle *c_idle = |
532 | container_of(work, struct create_idle, work); | 532 | container_of(work, struct create_idle, work); |
diff --git a/block/blktrace.c b/block/blktrace.c index 498a0a54a6aa..9b4da4ae3c7d 100644 --- a/block/blktrace.c +++ b/block/blktrace.c | |||
@@ -25,7 +25,6 @@ | |||
25 | #include <linux/time.h> | 25 | #include <linux/time.h> |
26 | #include <asm/uaccess.h> | 26 | #include <asm/uaccess.h> |
27 | 27 | ||
28 | static DEFINE_PER_CPU(unsigned long long, blk_trace_cpu_offset) = { 0, }; | ||
29 | static unsigned int blktrace_seq __read_mostly = 1; | 28 | static unsigned int blktrace_seq __read_mostly = 1; |
30 | 29 | ||
31 | /* | 30 | /* |
@@ -41,7 +40,7 @@ static void trace_note(struct blk_trace *bt, pid_t pid, int action, | |||
41 | const int cpu = smp_processor_id(); | 40 | const int cpu = smp_processor_id(); |
42 | 41 | ||
43 | t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION; | 42 | t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION; |
44 | t->time = cpu_clock(cpu) - per_cpu(blk_trace_cpu_offset, cpu); | 43 | t->time = ktime_to_ns(ktime_get()); |
45 | t->device = bt->dev; | 44 | t->device = bt->dev; |
46 | t->action = action; | 45 | t->action = action; |
47 | t->pid = pid; | 46 | t->pid = pid; |
@@ -159,7 +158,7 @@ void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes, | |||
159 | 158 | ||
160 | t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION; | 159 | t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION; |
161 | t->sequence = ++(*sequence); | 160 | t->sequence = ++(*sequence); |
162 | t->time = cpu_clock(cpu) - per_cpu(blk_trace_cpu_offset, cpu); | 161 | t->time = ktime_to_ns(ktime_get()); |
163 | t->sector = sector; | 162 | t->sector = sector; |
164 | t->bytes = bytes; | 163 | t->bytes = bytes; |
165 | t->action = what; | 164 | t->action = what; |
@@ -179,7 +178,7 @@ void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes, | |||
179 | EXPORT_SYMBOL_GPL(__blk_add_trace); | 178 | EXPORT_SYMBOL_GPL(__blk_add_trace); |
180 | 179 | ||
181 | static struct dentry *blk_tree_root; | 180 | static struct dentry *blk_tree_root; |
182 | static struct mutex blk_tree_mutex; | 181 | static DEFINE_MUTEX(blk_tree_mutex); |
183 | static unsigned int root_users; | 182 | static unsigned int root_users; |
184 | 183 | ||
185 | static inline void blk_remove_root(void) | 184 | static inline void blk_remove_root(void) |
@@ -505,77 +504,3 @@ void blk_trace_shutdown(struct request_queue *q) | |||
505 | blk_trace_remove(q); | 504 | blk_trace_remove(q); |
506 | } | 505 | } |
507 | } | 506 | } |
508 | |||
509 | /* | ||
510 | * Average offset over two calls to cpu_clock() with a gettimeofday() | ||
511 | * in the middle | ||
512 | */ | ||
513 | static void blk_check_time(unsigned long long *t, int this_cpu) | ||
514 | { | ||
515 | unsigned long long a, b; | ||
516 | struct timeval tv; | ||
517 | |||
518 | a = cpu_clock(this_cpu); | ||
519 | do_gettimeofday(&tv); | ||
520 | b = cpu_clock(this_cpu); | ||
521 | |||
522 | *t = tv.tv_sec * 1000000000 + tv.tv_usec * 1000; | ||
523 | *t -= (a + b) / 2; | ||
524 | } | ||
525 | |||
526 | /* | ||
527 | * calibrate our inter-CPU timings | ||
528 | */ | ||
529 | static void blk_trace_check_cpu_time(void *data) | ||
530 | { | ||
531 | unsigned long long *t; | ||
532 | int this_cpu = get_cpu(); | ||
533 | |||
534 | t = &per_cpu(blk_trace_cpu_offset, this_cpu); | ||
535 | |||
536 | /* | ||
537 | * Just call it twice, hopefully the second call will be cache hot | ||
538 | * and a little more precise | ||
539 | */ | ||
540 | blk_check_time(t, this_cpu); | ||
541 | blk_check_time(t, this_cpu); | ||
542 | |||
543 | put_cpu(); | ||
544 | } | ||
545 | |||
546 | static void blk_trace_set_ht_offsets(void) | ||
547 | { | ||
548 | #if defined(CONFIG_SCHED_SMT) | ||
549 | int cpu, i; | ||
550 | |||
551 | /* | ||
552 | * now make sure HT siblings have the same time offset | ||
553 | */ | ||
554 | preempt_disable(); | ||
555 | for_each_online_cpu(cpu) { | ||
556 | unsigned long long *cpu_off, *sibling_off; | ||
557 | |||
558 | for_each_cpu_mask(i, per_cpu(cpu_sibling_map, cpu)) { | ||
559 | if (i == cpu) | ||
560 | continue; | ||
561 | |||
562 | cpu_off = &per_cpu(blk_trace_cpu_offset, cpu); | ||
563 | sibling_off = &per_cpu(blk_trace_cpu_offset, i); | ||
564 | *sibling_off = *cpu_off; | ||
565 | } | ||
566 | } | ||
567 | preempt_enable(); | ||
568 | #endif | ||
569 | } | ||
570 | |||
571 | static __init int blk_trace_init(void) | ||
572 | { | ||
573 | mutex_init(&blk_tree_mutex); | ||
574 | on_each_cpu(blk_trace_check_cpu_time, NULL, 1, 1); | ||
575 | blk_trace_set_ht_offsets(); | ||
576 | |||
577 | return 0; | ||
578 | } | ||
579 | |||
580 | module_init(blk_trace_init); | ||
581 | |||
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index f0124a8d3134..21a81cd148e4 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
@@ -1733,11 +1733,15 @@ static void ata_eh_link_autopsy(struct ata_link *link) | |||
1733 | ehc->i.action &= ~ATA_EH_PERDEV_MASK; | 1733 | ehc->i.action &= ~ATA_EH_PERDEV_MASK; |
1734 | } | 1734 | } |
1735 | 1735 | ||
1736 | /* consider speeding down */ | 1736 | /* propagate timeout to host link */ |
1737 | if ((all_err_mask & AC_ERR_TIMEOUT) && !ata_is_host_link(link)) | ||
1738 | ap->link.eh_context.i.err_mask |= AC_ERR_TIMEOUT; | ||
1739 | |||
1740 | /* record error and consider speeding down */ | ||
1737 | dev = ehc->i.dev; | 1741 | dev = ehc->i.dev; |
1738 | if (!dev && ata_link_max_devices(link) == 1 && | 1742 | if (!dev && ((ata_link_max_devices(link) == 1 && |
1739 | ata_dev_enabled(link->device)) | 1743 | ata_dev_enabled(link->device)))) |
1740 | dev = link->device; | 1744 | dev = link->device; |
1741 | 1745 | ||
1742 | if (dev) | 1746 | if (dev) |
1743 | ehc->i.action |= ata_eh_speed_down(dev, is_io, all_err_mask); | 1747 | ehc->i.action |= ata_eh_speed_down(dev, is_io, all_err_mask); |
@@ -1759,8 +1763,14 @@ void ata_eh_autopsy(struct ata_port *ap) | |||
1759 | { | 1763 | { |
1760 | struct ata_link *link; | 1764 | struct ata_link *link; |
1761 | 1765 | ||
1762 | __ata_port_for_each_link(link, ap) | 1766 | ata_port_for_each_link(link, ap) |
1763 | ata_eh_link_autopsy(link); | 1767 | ata_eh_link_autopsy(link); |
1768 | |||
1769 | /* Autopsy of fanout ports can affect host link autopsy. | ||
1770 | * Perform host link autopsy last. | ||
1771 | */ | ||
1772 | if (ap->nr_pmp_links) | ||
1773 | ata_eh_link_autopsy(&ap->link); | ||
1764 | } | 1774 | } |
1765 | 1775 | ||
1766 | /** | 1776 | /** |
@@ -2157,13 +2167,11 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
2157 | if (ata_link_offline(link)) | 2167 | if (ata_link_offline(link)) |
2158 | continue; | 2168 | continue; |
2159 | 2169 | ||
2160 | /* apply class override and convert UNKNOWN to NONE */ | 2170 | /* apply class override */ |
2161 | if (lflags & ATA_LFLAG_ASSUME_ATA) | 2171 | if (lflags & ATA_LFLAG_ASSUME_ATA) |
2162 | classes[dev->devno] = ATA_DEV_ATA; | 2172 | classes[dev->devno] = ATA_DEV_ATA; |
2163 | else if (lflags & ATA_LFLAG_ASSUME_SEMB) | 2173 | else if (lflags & ATA_LFLAG_ASSUME_SEMB) |
2164 | classes[dev->devno] = ATA_DEV_SEMB_UNSUP; /* not yet */ | 2174 | classes[dev->devno] = ATA_DEV_SEMB_UNSUP; /* not yet */ |
2165 | else if (classes[dev->devno] == ATA_DEV_UNKNOWN) | ||
2166 | classes[dev->devno] = ATA_DEV_NONE; | ||
2167 | } | 2175 | } |
2168 | 2176 | ||
2169 | /* record current link speed */ | 2177 | /* record current link speed */ |
diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c index c0c4dbcde091..caef2bbd4a8a 100644 --- a/drivers/ata/libata-pmp.c +++ b/drivers/ata/libata-pmp.c | |||
@@ -495,14 +495,12 @@ static void sata_pmp_quirks(struct ata_port *ap) | |||
495 | /* SError.N need a kick in the ass to get working */ | 495 | /* SError.N need a kick in the ass to get working */ |
496 | link->flags |= ATA_LFLAG_HRST_TO_RESUME; | 496 | link->flags |= ATA_LFLAG_HRST_TO_RESUME; |
497 | 497 | ||
498 | /* class code report is unreliable */ | 498 | /* Class code report is unreliable and SRST |
499 | if (link->pmp < 5) | 499 | * times out under certain configurations. |
500 | link->flags |= ATA_LFLAG_ASSUME_ATA; | 500 | * Config device can be at port 0 or 5 and |
501 | 501 | * locks up on SRST. | |
502 | /* The config device, which can be either at | ||
503 | * port 0 or 5, locks up on SRST. | ||
504 | */ | 502 | */ |
505 | if (link->pmp == 0 || link->pmp == 5) | 503 | if (link->pmp <= 5) |
506 | link->flags |= ATA_LFLAG_NO_SRST | | 504 | link->flags |= ATA_LFLAG_NO_SRST | |
507 | ATA_LFLAG_ASSUME_ATA; | 505 | ATA_LFLAG_ASSUME_ATA; |
508 | 506 | ||
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index a883bb03d4c7..264ae60e3fd8 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -872,7 +872,8 @@ int ata_scsi_slave_config(struct scsi_device *sdev) | |||
872 | 872 | ||
873 | ata_scsi_sdev_config(sdev); | 873 | ata_scsi_sdev_config(sdev); |
874 | 874 | ||
875 | sdev->manage_start_stop = 1; | 875 | if (dev->class == ATA_DEV_ATA) |
876 | sdev->manage_start_stop = 1; | ||
876 | 877 | ||
877 | if (dev) | 878 | if (dev) |
878 | ata_scsi_dev_config(sdev, dev); | 879 | ata_scsi_dev_config(sdev, dev); |
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index 48acc09dab96..b7ac80b4b1fb 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c | |||
@@ -806,7 +806,10 @@ int ata_pci_init_one(struct pci_dev *pdev, | |||
806 | if (rc) | 806 | if (rc) |
807 | goto err_out; | 807 | goto err_out; |
808 | 808 | ||
809 | if (!legacy_mode) { | 809 | if (!legacy_mode && pdev->irq) { |
810 | /* We may have no IRQ assigned in which case we can poll. This | ||
811 | shouldn't happen on a sane system but robustness is cheap | ||
812 | in this case */ | ||
810 | rc = devm_request_irq(dev, pdev->irq, pi->port_ops->irq_handler, | 813 | rc = devm_request_irq(dev, pdev->irq, pi->port_ops->irq_handler, |
811 | IRQF_SHARED, DRV_NAME, host); | 814 | IRQF_SHARED, DRV_NAME, host); |
812 | if (rc) | 815 | if (rc) |
@@ -814,7 +817,7 @@ int ata_pci_init_one(struct pci_dev *pdev, | |||
814 | 817 | ||
815 | ata_port_desc(host->ports[0], "irq %d", pdev->irq); | 818 | ata_port_desc(host->ports[0], "irq %d", pdev->irq); |
816 | ata_port_desc(host->ports[1], "irq %d", pdev->irq); | 819 | ata_port_desc(host->ports[1], "irq %d", pdev->irq); |
817 | } else { | 820 | } else if (legacy_mode) { |
818 | if (!ata_port_is_dummy(host->ports[0])) { | 821 | if (!ata_port_is_dummy(host->ports[0])) { |
819 | rc = devm_request_irq(dev, ATA_PRIMARY_IRQ(pdev), | 822 | rc = devm_request_irq(dev, ATA_PRIMARY_IRQ(pdev), |
820 | pi->port_ops->irq_handler, | 823 | pi->port_ops->irq_handler, |
diff --git a/drivers/ata/pata_ixp4xx_cf.c b/drivers/ata/pata_ixp4xx_cf.c index fcd532afbf2e..120b5bfa7ce6 100644 --- a/drivers/ata/pata_ixp4xx_cf.c +++ b/drivers/ata/pata_ixp4xx_cf.c | |||
@@ -130,10 +130,11 @@ static struct ata_port_operations ixp4xx_port_ops = { | |||
130 | .port_start = ata_port_start, | 130 | .port_start = ata_port_start, |
131 | }; | 131 | }; |
132 | 132 | ||
133 | static void ixp4xx_setup_port(struct ata_ioports *ioaddr, | 133 | static void ixp4xx_setup_port(struct ata_port *ap, |
134 | struct ixp4xx_pata_data *data, | 134 | struct ixp4xx_pata_data *data, |
135 | unsigned long raw_cs0, unsigned long raw_cs1) | 135 | unsigned long raw_cs0, unsigned long raw_cs1) |
136 | { | 136 | { |
137 | struct ata_ioports *ioaddr = &ap->ioaddr; | ||
137 | unsigned long raw_cmd = raw_cs0; | 138 | unsigned long raw_cmd = raw_cs0; |
138 | unsigned long raw_ctl = raw_cs1 + 0x06; | 139 | unsigned long raw_ctl = raw_cs1 + 0x06; |
139 | 140 | ||
diff --git a/drivers/ata/pata_pdc202xx_old.c b/drivers/ata/pata_pdc202xx_old.c index bc7c2d5d8d5e..8f2815601791 100644 --- a/drivers/ata/pata_pdc202xx_old.c +++ b/drivers/ata/pata_pdc202xx_old.c | |||
@@ -215,8 +215,8 @@ static void pdc2026x_bmdma_stop(struct ata_queued_cmd *qc) | |||
215 | /* Flip back to 33Mhz for PIO */ | 215 | /* Flip back to 33Mhz for PIO */ |
216 | if (adev->dma_mode >= XFER_UDMA_2) | 216 | if (adev->dma_mode >= XFER_UDMA_2) |
217 | iowrite8(ioread8(clock) & ~sel66, clock); | 217 | iowrite8(ioread8(clock) & ~sel66, clock); |
218 | |||
219 | ata_bmdma_stop(qc); | 218 | ata_bmdma_stop(qc); |
219 | pdc202xx_set_piomode(ap, adev); | ||
220 | } | 220 | } |
221 | 221 | ||
222 | /** | 222 | /** |
@@ -233,6 +233,17 @@ static void pdc2026x_dev_config(struct ata_device *adev) | |||
233 | adev->max_sectors = 256; | 233 | adev->max_sectors = 256; |
234 | } | 234 | } |
235 | 235 | ||
236 | static int pdc2026x_port_start(struct ata_port *ap) | ||
237 | { | ||
238 | void __iomem *bmdma = ap->ioaddr.bmdma_addr; | ||
239 | if (bmdma) { | ||
240 | /* Enable burst mode */ | ||
241 | u8 burst = ioread8(bmdma + 0x1f); | ||
242 | iowrite8(burst | 0x01, bmdma + 0x1f); | ||
243 | } | ||
244 | return ata_sff_port_start(ap); | ||
245 | } | ||
246 | |||
236 | static struct scsi_host_template pdc202xx_sht = { | 247 | static struct scsi_host_template pdc202xx_sht = { |
237 | .module = THIS_MODULE, | 248 | .module = THIS_MODULE, |
238 | .name = DRV_NAME, | 249 | .name = DRV_NAME, |
@@ -313,7 +324,7 @@ static struct ata_port_operations pdc2026x_port_ops = { | |||
313 | .irq_clear = ata_bmdma_irq_clear, | 324 | .irq_clear = ata_bmdma_irq_clear, |
314 | .irq_on = ata_irq_on, | 325 | .irq_on = ata_irq_on, |
315 | 326 | ||
316 | .port_start = ata_sff_port_start, | 327 | .port_start = pdc2026x_port_start, |
317 | }; | 328 | }; |
318 | 329 | ||
319 | static int pdc202xx_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 330 | static int pdc202xx_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
diff --git a/drivers/ata/sata_qstor.c b/drivers/ata/sata_qstor.c index 2f1de6ec044c..c68b241805fd 100644 --- a/drivers/ata/sata_qstor.c +++ b/drivers/ata/sata_qstor.c | |||
@@ -270,7 +270,7 @@ static int qs_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) | |||
270 | static void qs_error_handler(struct ata_port *ap) | 270 | static void qs_error_handler(struct ata_port *ap) |
271 | { | 271 | { |
272 | qs_enter_reg_mode(ap); | 272 | qs_enter_reg_mode(ap); |
273 | ata_do_eh(ap, qs_prereset, ata_std_softreset, NULL, | 273 | ata_do_eh(ap, qs_prereset, NULL, sata_std_hardreset, |
274 | ata_std_postreset); | 274 | ata_std_postreset); |
275 | } | 275 | } |
276 | 276 | ||
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c index 96fd5260446d..b4c674d83769 100644 --- a/drivers/ata/sata_sil24.c +++ b/drivers/ata/sata_sil24.c | |||
@@ -832,16 +832,31 @@ static int sil24_qc_defer(struct ata_queued_cmd *qc) | |||
832 | struct ata_link *link = qc->dev->link; | 832 | struct ata_link *link = qc->dev->link; |
833 | struct ata_port *ap = link->ap; | 833 | struct ata_port *ap = link->ap; |
834 | u8 prot = qc->tf.protocol; | 834 | u8 prot = qc->tf.protocol; |
835 | int is_atapi = (prot == ATA_PROT_ATAPI || | 835 | |
836 | prot == ATA_PROT_ATAPI_NODATA || | 836 | /* |
837 | prot == ATA_PROT_ATAPI_DMA); | 837 | * There is a bug in the chip: |
838 | 838 | * Port LRAM Causes the PRB/SGT Data to be Corrupted | |
839 | /* ATAPI commands completing with CHECK_SENSE cause various | 839 | * If the host issues a read request for LRAM and SActive registers |
840 | * weird problems if other commands are active. PMP DMA CS | 840 | * while active commands are available in the port, PRB/SGT data in |
841 | * errata doesn't cover all and HSM violation occurs even with | 841 | * the LRAM can become corrupted. This issue applies only when |
842 | * only one other device active. Always run an ATAPI command | 842 | * reading from, but not writing to, the LRAM. |
843 | * by itself. | 843 | * |
844 | */ | 844 | * Therefore, reading LRAM when there is no particular error [and |
845 | * other commands may be outstanding] is prohibited. | ||
846 | * | ||
847 | * To avoid this bug there are two situations where a command must run | ||
848 | * exclusive of any other commands on the port: | ||
849 | * | ||
850 | * - ATAPI commands which check the sense data | ||
851 | * - Passthrough ATA commands which always have ATA_QCFLAG_RESULT_TF | ||
852 | * set. | ||
853 | * | ||
854 | */ | ||
855 | int is_excl = (prot == ATA_PROT_ATAPI || | ||
856 | prot == ATA_PROT_ATAPI_NODATA || | ||
857 | prot == ATA_PROT_ATAPI_DMA || | ||
858 | (qc->flags & ATA_QCFLAG_RESULT_TF)); | ||
859 | |||
845 | if (unlikely(ap->excl_link)) { | 860 | if (unlikely(ap->excl_link)) { |
846 | if (link == ap->excl_link) { | 861 | if (link == ap->excl_link) { |
847 | if (ap->nr_active_links) | 862 | if (ap->nr_active_links) |
@@ -849,7 +864,7 @@ static int sil24_qc_defer(struct ata_queued_cmd *qc) | |||
849 | qc->flags |= ATA_QCFLAG_CLEAR_EXCL; | 864 | qc->flags |= ATA_QCFLAG_CLEAR_EXCL; |
850 | } else | 865 | } else |
851 | return ATA_DEFER_PORT; | 866 | return ATA_DEFER_PORT; |
852 | } else if (unlikely(is_atapi)) { | 867 | } else if (unlikely(is_excl)) { |
853 | ap->excl_link = link; | 868 | ap->excl_link = link; |
854 | if (ap->nr_active_links) | 869 | if (ap->nr_active_links) |
855 | return ATA_DEFER_PORT; | 870 | return ATA_DEFER_PORT; |
diff --git a/drivers/atm/nicstar.c b/drivers/atm/nicstar.c index 14ced85b3f54..0c205b000e8b 100644 --- a/drivers/atm/nicstar.c +++ b/drivers/atm/nicstar.c | |||
@@ -625,14 +625,6 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev) | |||
625 | if (mac[i] == NULL) | 625 | if (mac[i] == NULL) |
626 | nicstar_init_eprom(card->membase); | 626 | nicstar_init_eprom(card->membase); |
627 | 627 | ||
628 | if (request_irq(pcidev->irq, &ns_irq_handler, IRQF_DISABLED | IRQF_SHARED, "nicstar", card) != 0) | ||
629 | { | ||
630 | printk("nicstar%d: can't allocate IRQ %d.\n", i, pcidev->irq); | ||
631 | error = 9; | ||
632 | ns_init_card_error(card, error); | ||
633 | return error; | ||
634 | } | ||
635 | |||
636 | /* Set the VPI/VCI MSb mask to zero so we can receive OAM cells */ | 628 | /* Set the VPI/VCI MSb mask to zero so we can receive OAM cells */ |
637 | writel(0x00000000, card->membase + VPM); | 629 | writel(0x00000000, card->membase + VPM); |
638 | 630 | ||
@@ -858,8 +850,6 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev) | |||
858 | card->iovpool.count++; | 850 | card->iovpool.count++; |
859 | } | 851 | } |
860 | 852 | ||
861 | card->intcnt = 0; | ||
862 | |||
863 | /* Configure NICStAR */ | 853 | /* Configure NICStAR */ |
864 | if (card->rct_size == 4096) | 854 | if (card->rct_size == 4096) |
865 | ns_cfg_rctsize = NS_CFG_RCTSIZE_4096_ENTRIES; | 855 | ns_cfg_rctsize = NS_CFG_RCTSIZE_4096_ENTRIES; |
@@ -868,6 +858,15 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev) | |||
868 | 858 | ||
869 | card->efbie = 1; | 859 | card->efbie = 1; |
870 | 860 | ||
861 | card->intcnt = 0; | ||
862 | if (request_irq(pcidev->irq, &ns_irq_handler, IRQF_DISABLED | IRQF_SHARED, "nicstar", card) != 0) | ||
863 | { | ||
864 | printk("nicstar%d: can't allocate IRQ %d.\n", i, pcidev->irq); | ||
865 | error = 9; | ||
866 | ns_init_card_error(card, error); | ||
867 | return error; | ||
868 | } | ||
869 | |||
871 | /* Register device */ | 870 | /* Register device */ |
872 | card->atmdev = atm_dev_register("nicstar", &atm_ops, -1, NULL); | 871 | card->atmdev = atm_dev_register("nicstar", &atm_ops, -1, NULL); |
873 | if (card->atmdev == NULL) | 872 | if (card->atmdev == NULL) |
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 56e23042728a..b8af22e610df 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c | |||
@@ -610,7 +610,7 @@ static int loop_thread(void *data) | |||
610 | static int loop_switch(struct loop_device *lo, struct file *file) | 610 | static int loop_switch(struct loop_device *lo, struct file *file) |
611 | { | 611 | { |
612 | struct switch_request w; | 612 | struct switch_request w; |
613 | struct bio *bio = bio_alloc(GFP_KERNEL, 1); | 613 | struct bio *bio = bio_alloc(GFP_KERNEL, 0); |
614 | if (!bio) | 614 | if (!bio) |
615 | return -ENOMEM; | 615 | return -ENOMEM; |
616 | init_completion(&w.wait); | 616 | init_completion(&w.wait); |
diff --git a/drivers/char/tty_ioctl.c b/drivers/char/tty_ioctl.c index e02d59245a17..d4b6d64e858b 100644 --- a/drivers/char/tty_ioctl.c +++ b/drivers/char/tty_ioctl.c | |||
@@ -365,6 +365,25 @@ void tty_termios_copy_hw(struct ktermios *new, struct ktermios *old) | |||
365 | EXPORT_SYMBOL(tty_termios_copy_hw); | 365 | EXPORT_SYMBOL(tty_termios_copy_hw); |
366 | 366 | ||
367 | /** | 367 | /** |
368 | * tty_termios_hw_change - check for setting change | ||
369 | * @a: termios | ||
370 | * @b: termios to compare | ||
371 | * | ||
372 | * Check if any of the bits that affect a dumb device have changed | ||
373 | * between the two termios structures, or a speed change is needed. | ||
374 | */ | ||
375 | |||
376 | int tty_termios_hw_change(struct ktermios *a, struct ktermios *b) | ||
377 | { | ||
378 | if (a->c_ispeed != b->c_ispeed || a->c_ospeed != b->c_ospeed) | ||
379 | return 1; | ||
380 | if ((a->c_cflag ^ b->c_cflag) & ~(HUPCL | CREAD | CLOCAL)) | ||
381 | return 1; | ||
382 | return 0; | ||
383 | } | ||
384 | EXPORT_SYMBOL(tty_termios_hw_change); | ||
385 | |||
386 | /** | ||
368 | * change_termios - update termios values | 387 | * change_termios - update termios values |
369 | * @tty: tty to update | 388 | * @tty: tty to update |
370 | * @new_termios: desired new value | 389 | * @new_termios: desired new value |
diff --git a/drivers/connector/cn_queue.c b/drivers/connector/cn_queue.c index 296f51002b55..12ceed54ab18 100644 --- a/drivers/connector/cn_queue.c +++ b/drivers/connector/cn_queue.c | |||
@@ -99,8 +99,8 @@ int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id | |||
99 | spin_unlock_bh(&dev->queue_lock); | 99 | spin_unlock_bh(&dev->queue_lock); |
100 | 100 | ||
101 | if (found) { | 101 | if (found) { |
102 | atomic_dec(&dev->refcnt); | ||
103 | cn_queue_free_callback(cbq); | 102 | cn_queue_free_callback(cbq); |
103 | atomic_dec(&dev->refcnt); | ||
104 | return -EINVAL; | 104 | return -EINVAL; |
105 | } | 105 | } |
106 | 106 | ||
diff --git a/drivers/crypto/padlock-aes.c b/drivers/crypto/padlock-aes.c index a337b693b6c9..5f7e71810489 100644 --- a/drivers/crypto/padlock-aes.c +++ b/drivers/crypto/padlock-aes.c | |||
@@ -429,8 +429,8 @@ static inline void padlock_xcrypt(const u8 *input, u8 *output, void *key, | |||
429 | 429 | ||
430 | static void aes_crypt_copy(const u8 *in, u8 *out, u32 *key, struct cword *cword) | 430 | static void aes_crypt_copy(const u8 *in, u8 *out, u32 *key, struct cword *cword) |
431 | { | 431 | { |
432 | u8 tmp[AES_BLOCK_SIZE * 2] | 432 | u8 buf[AES_BLOCK_SIZE * 2 + PADLOCK_ALIGNMENT - 1]; |
433 | __attribute__ ((__aligned__(PADLOCK_ALIGNMENT))); | 433 | u8 *tmp = PTR_ALIGN(&buf[0], PADLOCK_ALIGNMENT); |
434 | 434 | ||
435 | memcpy(tmp, in, AES_BLOCK_SIZE); | 435 | memcpy(tmp, in, AES_BLOCK_SIZE); |
436 | padlock_xcrypt(tmp, out, key, cword); | 436 | padlock_xcrypt(tmp, out, key, cword); |
diff --git a/drivers/firmware/dmi-id.c b/drivers/firmware/dmi-id.c index b6e1eb77d148..bc132d8f79cb 100644 --- a/drivers/firmware/dmi-id.c +++ b/drivers/firmware/dmi-id.c | |||
@@ -175,12 +175,11 @@ static struct device *dmi_dev; | |||
175 | 175 | ||
176 | extern int dmi_available; | 176 | extern int dmi_available; |
177 | 177 | ||
178 | static int __init dmi_id_init(void) | 178 | /* In a separate function to keep gcc 3.2 happy - do NOT merge this in |
179 | dmi_id_init! */ | ||
180 | static void __init dmi_id_init_attr_table(void) | ||
179 | { | 181 | { |
180 | int ret, i; | 182 | int i; |
181 | |||
182 | if (!dmi_available) | ||
183 | return -ENODEV; | ||
184 | 183 | ||
185 | /* Not necessarily all DMI fields are available on all | 184 | /* Not necessarily all DMI fields are available on all |
186 | * systems, hence let's built an attribute table of just | 185 | * systems, hence let's built an attribute table of just |
@@ -205,6 +204,16 @@ static int __init dmi_id_init(void) | |||
205 | ADD_DMI_ATTR(chassis_serial, DMI_CHASSIS_SERIAL); | 204 | ADD_DMI_ATTR(chassis_serial, DMI_CHASSIS_SERIAL); |
206 | ADD_DMI_ATTR(chassis_asset_tag, DMI_CHASSIS_ASSET_TAG); | 205 | ADD_DMI_ATTR(chassis_asset_tag, DMI_CHASSIS_ASSET_TAG); |
207 | sys_dmi_attributes[i++] = &sys_dmi_modalias_attr.attr; | 206 | sys_dmi_attributes[i++] = &sys_dmi_modalias_attr.attr; |
207 | } | ||
208 | |||
209 | static int __init dmi_id_init(void) | ||
210 | { | ||
211 | int ret; | ||
212 | |||
213 | if (!dmi_available) | ||
214 | return -ENODEV; | ||
215 | |||
216 | dmi_id_init_attr_table(); | ||
208 | 217 | ||
209 | ret = class_register(&dmi_class); | 218 | ret = class_register(&dmi_class); |
210 | if (ret) | 219 | if (ret) |
diff --git a/drivers/ide/ide-acpi.c b/drivers/ide/ide-acpi.c index 89df48fdc69d..899d56536e80 100644 --- a/drivers/ide/ide-acpi.c +++ b/drivers/ide/ide-acpi.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <acpi/acpi.h> | 16 | #include <acpi/acpi.h> |
17 | #include <linux/ide.h> | 17 | #include <linux/ide.h> |
18 | #include <linux/pci.h> | 18 | #include <linux/pci.h> |
19 | #include <linux/dmi.h> | ||
19 | 20 | ||
20 | #include <acpi/acpi_bus.h> | 21 | #include <acpi/acpi_bus.h> |
21 | #include <acpi/acnames.h> | 22 | #include <acpi/acnames.h> |
@@ -65,6 +66,39 @@ extern int ide_noacpi; | |||
65 | extern int ide_noacpitfs; | 66 | extern int ide_noacpitfs; |
66 | extern int ide_noacpionboot; | 67 | extern int ide_noacpionboot; |
67 | 68 | ||
69 | static bool ide_noacpi_psx; | ||
70 | static int no_acpi_psx(const struct dmi_system_id *id) | ||
71 | { | ||
72 | ide_noacpi_psx = true; | ||
73 | printk(KERN_NOTICE"%s detected - disable ACPI _PSx.\n", id->ident); | ||
74 | return 0; | ||
75 | } | ||
76 | |||
77 | static const struct dmi_system_id ide_acpi_dmi_table[] = { | ||
78 | /* Bug 9673. */ | ||
79 | /* We should check if this is because ACPI NVS isn't save/restored. */ | ||
80 | { | ||
81 | .callback = no_acpi_psx, | ||
82 | .ident = "HP nx9005", | ||
83 | .matches = { | ||
84 | DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies Ltd."), | ||
85 | DMI_MATCH(DMI_BIOS_VERSION, "KAM1.60") | ||
86 | }, | ||
87 | }, | ||
88 | |||
89 | { } /* terminate list */ | ||
90 | }; | ||
91 | |||
92 | static int ide_acpi_blacklist(void) | ||
93 | { | ||
94 | static int done; | ||
95 | if (done) | ||
96 | return 0; | ||
97 | done = 1; | ||
98 | dmi_check_system(ide_acpi_dmi_table); | ||
99 | return 0; | ||
100 | } | ||
101 | |||
68 | /** | 102 | /** |
69 | * ide_get_dev_handle - finds acpi_handle and PCI device.function | 103 | * ide_get_dev_handle - finds acpi_handle and PCI device.function |
70 | * @dev: device to locate | 104 | * @dev: device to locate |
@@ -623,7 +657,7 @@ void ide_acpi_set_state(ide_hwif_t *hwif, int on) | |||
623 | { | 657 | { |
624 | int unit; | 658 | int unit; |
625 | 659 | ||
626 | if (ide_noacpi) | 660 | if (ide_noacpi || ide_noacpi_psx) |
627 | return; | 661 | return; |
628 | 662 | ||
629 | DEBPRINT("ENTER:\n"); | 663 | DEBPRINT("ENTER:\n"); |
@@ -668,6 +702,8 @@ void ide_acpi_init(ide_hwif_t *hwif) | |||
668 | struct ide_acpi_drive_link *master; | 702 | struct ide_acpi_drive_link *master; |
669 | struct ide_acpi_drive_link *slave; | 703 | struct ide_acpi_drive_link *slave; |
670 | 704 | ||
705 | ide_acpi_blacklist(); | ||
706 | |||
671 | hwif->acpidata = kzalloc(sizeof(struct ide_acpi_hwif_link), GFP_KERNEL); | 707 | hwif->acpidata = kzalloc(sizeof(struct ide_acpi_hwif_link), GFP_KERNEL); |
672 | if (!hwif->acpidata) | 708 | if (!hwif->acpidata) |
673 | return; | 709 | return; |
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index cef405ddaf0e..bb9693dabe41 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c | |||
@@ -612,12 +612,12 @@ u8 eighty_ninty_three (ide_drive_t *drive) | |||
612 | printk(KERN_DEBUG "%s: skipping word 93 validity check\n", | 612 | printk(KERN_DEBUG "%s: skipping word 93 validity check\n", |
613 | drive->name); | 613 | drive->name); |
614 | 614 | ||
615 | if (ide_dev_is_sata(id) && !ivb) | ||
616 | return 1; | ||
617 | |||
615 | if (hwif->cbl != ATA_CBL_PATA80 && !ivb) | 618 | if (hwif->cbl != ATA_CBL_PATA80 && !ivb) |
616 | goto no_80w; | 619 | goto no_80w; |
617 | 620 | ||
618 | if (ide_dev_is_sata(id)) | ||
619 | return 1; | ||
620 | |||
621 | /* | 621 | /* |
622 | * FIXME: | 622 | * FIXME: |
623 | * - force bit13 (80c cable present) check also for !ivb devices | 623 | * - force bit13 (80c cable present) check also for !ivb devices |
diff --git a/drivers/ide/pci/trm290.c b/drivers/ide/pci/trm290.c index 0895e753a35d..0151d7fdfb8a 100644 --- a/drivers/ide/pci/trm290.c +++ b/drivers/ide/pci/trm290.c | |||
@@ -1,7 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/ide/pci/trm290.c Version 1.02 Mar. 18, 2000 | 2 | * linux/drivers/ide/pci/trm290.c Version 1.05 Dec. 26, 2007 |
3 | * | 3 | * |
4 | * Copyright (c) 1997-1998 Mark Lord | 4 | * Copyright (c) 1997-1998 Mark Lord |
5 | * Copyright (c) 2007 MontaVista Software, Inc. <source@mvista.com> | ||
5 | * May be copied or modified under the terms of the GNU General Public License | 6 | * May be copied or modified under the terms of the GNU General Public License |
6 | * | 7 | * |
7 | * June 22, 2004 - get rid of check_region | 8 | * June 22, 2004 - get rid of check_region |
@@ -177,7 +178,7 @@ static void trm290_selectproc (ide_drive_t *drive) | |||
177 | trm290_prepare_drive(drive, drive->using_dma); | 178 | trm290_prepare_drive(drive, drive->using_dma); |
178 | } | 179 | } |
179 | 180 | ||
180 | static void trm290_ide_dma_exec_cmd(ide_drive_t *drive, u8 command) | 181 | static void trm290_dma_exec_cmd(ide_drive_t *drive, u8 command) |
181 | { | 182 | { |
182 | BUG_ON(HWGROUP(drive)->handler != NULL); /* paranoia check */ | 183 | BUG_ON(HWGROUP(drive)->handler != NULL); /* paranoia check */ |
183 | ide_set_handler(drive, &ide_dma_intr, WAIT_CMD, NULL); | 184 | ide_set_handler(drive, &ide_dma_intr, WAIT_CMD, NULL); |
@@ -185,7 +186,7 @@ static void trm290_ide_dma_exec_cmd(ide_drive_t *drive, u8 command) | |||
185 | outb(command, IDE_COMMAND_REG); | 186 | outb(command, IDE_COMMAND_REG); |
186 | } | 187 | } |
187 | 188 | ||
188 | static int trm290_ide_dma_setup(ide_drive_t *drive) | 189 | static int trm290_dma_setup(ide_drive_t *drive) |
189 | { | 190 | { |
190 | ide_hwif_t *hwif = drive->hwif; | 191 | ide_hwif_t *hwif = drive->hwif; |
191 | struct request *rq = hwif->hwgroup->rq; | 192 | struct request *rq = hwif->hwgroup->rq; |
@@ -215,7 +216,7 @@ static int trm290_ide_dma_setup(ide_drive_t *drive) | |||
215 | return 0; | 216 | return 0; |
216 | } | 217 | } |
217 | 218 | ||
218 | static void trm290_ide_dma_start(ide_drive_t *drive) | 219 | static void trm290_dma_start(ide_drive_t *drive) |
219 | { | 220 | { |
220 | } | 221 | } |
221 | 222 | ||
@@ -240,6 +241,14 @@ static int trm290_ide_dma_test_irq (ide_drive_t *drive) | |||
240 | return (status == 0x00ff); | 241 | return (status == 0x00ff); |
241 | } | 242 | } |
242 | 243 | ||
244 | static void trm290_dma_host_on(ide_drive_t *drive) | ||
245 | { | ||
246 | } | ||
247 | |||
248 | static void trm290_dma_host_off(ide_drive_t *drive) | ||
249 | { | ||
250 | } | ||
251 | |||
243 | static void __devinit init_hwif_trm290(ide_hwif_t *hwif) | 252 | static void __devinit init_hwif_trm290(ide_hwif_t *hwif) |
244 | { | 253 | { |
245 | unsigned int cfgbase = 0; | 254 | unsigned int cfgbase = 0; |
@@ -280,11 +289,13 @@ static void __devinit init_hwif_trm290(ide_hwif_t *hwif) | |||
280 | 289 | ||
281 | ide_setup_dma(hwif, (hwif->config_data + 4) ^ (hwif->channel ? 0x0080 : 0x0000), 3); | 290 | ide_setup_dma(hwif, (hwif->config_data + 4) ^ (hwif->channel ? 0x0080 : 0x0000), 3); |
282 | 291 | ||
283 | hwif->dma_setup = &trm290_ide_dma_setup; | 292 | hwif->dma_host_off = &trm290_dma_host_off; |
284 | hwif->dma_exec_cmd = &trm290_ide_dma_exec_cmd; | 293 | hwif->dma_host_on = &trm290_dma_host_on; |
285 | hwif->dma_start = &trm290_ide_dma_start; | 294 | hwif->dma_setup = &trm290_dma_setup; |
286 | hwif->ide_dma_end = &trm290_ide_dma_end; | 295 | hwif->dma_exec_cmd = &trm290_dma_exec_cmd; |
287 | hwif->ide_dma_test_irq = &trm290_ide_dma_test_irq; | 296 | hwif->dma_start = &trm290_dma_start; |
297 | hwif->ide_dma_end = &trm290_ide_dma_end; | ||
298 | hwif->ide_dma_test_irq = &trm290_ide_dma_test_irq; | ||
288 | 299 | ||
289 | hwif->selectproc = &trm290_selectproc; | 300 | hwif->selectproc = &trm290_selectproc; |
290 | #if 1 | 301 | #if 1 |
diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c index 8bf44daf45ec..9d32c49cc651 100644 --- a/drivers/infiniband/hw/mlx4/cq.c +++ b/drivers/infiniband/hw/mlx4/cq.c | |||
@@ -430,7 +430,7 @@ static int mlx4_ib_poll_one(struct mlx4_ib_cq *cq, | |||
430 | wc->dlid_path_bits = (be32_to_cpu(cqe->g_mlpath_rqpn) >> 24) & 0x7f; | 430 | wc->dlid_path_bits = (be32_to_cpu(cqe->g_mlpath_rqpn) >> 24) & 0x7f; |
431 | wc->wc_flags |= be32_to_cpu(cqe->g_mlpath_rqpn) & 0x80000000 ? | 431 | wc->wc_flags |= be32_to_cpu(cqe->g_mlpath_rqpn) & 0x80000000 ? |
432 | IB_WC_GRH : 0; | 432 | IB_WC_GRH : 0; |
433 | wc->pkey_index = be32_to_cpu(cqe->immed_rss_invalid) >> 16; | 433 | wc->pkey_index = be32_to_cpu(cqe->immed_rss_invalid) & 0x7f; |
434 | } | 434 | } |
435 | 435 | ||
436 | return 0; | 436 | return 0; |
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c index 77e8b90dfbff..bdb6f8517401 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.c +++ b/drivers/infiniband/ulp/srp/ib_srp.c | |||
@@ -2053,8 +2053,8 @@ static void srp_remove_one(struct ib_device *device) | |||
2053 | 2053 | ||
2054 | list_for_each_entry_safe(target, tmp_target, | 2054 | list_for_each_entry_safe(target, tmp_target, |
2055 | &host->target_list, list) { | 2055 | &host->target_list, list) { |
2056 | scsi_remove_host(target->scsi_host); | ||
2057 | srp_remove_host(target->scsi_host); | 2056 | srp_remove_host(target->scsi_host); |
2057 | scsi_remove_host(target->scsi_host); | ||
2058 | srp_disconnect_target(target); | 2058 | srp_disconnect_target(target); |
2059 | ib_destroy_cm_id(target->cm_id); | 2059 | ib_destroy_cm_id(target->cm_id); |
2060 | srp_free_target_ib(target); | 2060 | srp_free_target_ib(target); |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index a5aad8cad843..e8c8157b02fc 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -2865,7 +2865,8 @@ static void handle_stripe5(struct stripe_head *sh) | |||
2865 | md_done_sync(conf->mddev, STRIPE_SECTORS, 1); | 2865 | md_done_sync(conf->mddev, STRIPE_SECTORS, 1); |
2866 | } | 2866 | } |
2867 | 2867 | ||
2868 | if (s.expanding && s.locked == 0) | 2868 | if (s.expanding && s.locked == 0 && |
2869 | !test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending)) | ||
2869 | handle_stripe_expansion(conf, sh, NULL); | 2870 | handle_stripe_expansion(conf, sh, NULL); |
2870 | 2871 | ||
2871 | if (sh->ops.count) | 2872 | if (sh->ops.count) |
@@ -3067,7 +3068,8 @@ static void handle_stripe6(struct stripe_head *sh, struct page *tmp_page) | |||
3067 | md_done_sync(conf->mddev, STRIPE_SECTORS, 1); | 3068 | md_done_sync(conf->mddev, STRIPE_SECTORS, 1); |
3068 | } | 3069 | } |
3069 | 3070 | ||
3070 | if (s.expanding && s.locked == 0) | 3071 | if (s.expanding && s.locked == 0 && |
3072 | !test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending)) | ||
3071 | handle_stripe_expansion(conf, sh, &r6s); | 3073 | handle_stripe_expansion(conf, sh, &r6s); |
3072 | 3074 | ||
3073 | spin_unlock(&sh->lock); | 3075 | spin_unlock(&sh->lock); |
diff --git a/drivers/media/video/bt8xx/bttv-driver.c b/drivers/media/video/bt8xx/bttv-driver.c index c02d92deacd2..581a3c955739 100644 --- a/drivers/media/video/bt8xx/bttv-driver.c +++ b/drivers/media/video/bt8xx/bttv-driver.c | |||
@@ -3063,11 +3063,10 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file, | |||
3063 | struct video_mbuf *mbuf = arg; | 3063 | struct video_mbuf *mbuf = arg; |
3064 | unsigned int i; | 3064 | unsigned int i; |
3065 | 3065 | ||
3066 | mutex_lock(&fh->cap.lock); | ||
3067 | retval = videobuf_mmap_setup(&fh->cap,gbuffers,gbufsize, | 3066 | retval = videobuf_mmap_setup(&fh->cap,gbuffers,gbufsize, |
3068 | V4L2_MEMORY_MMAP); | 3067 | V4L2_MEMORY_MMAP); |
3069 | if (retval < 0) | 3068 | if (retval < 0) |
3070 | goto fh_unlock_and_return; | 3069 | return retval; |
3071 | 3070 | ||
3072 | gbuffers = retval; | 3071 | gbuffers = retval; |
3073 | memset(mbuf,0,sizeof(*mbuf)); | 3072 | memset(mbuf,0,sizeof(*mbuf)); |
@@ -3075,7 +3074,6 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file, | |||
3075 | mbuf->size = gbuffers * gbufsize; | 3074 | mbuf->size = gbuffers * gbufsize; |
3076 | for (i = 0; i < gbuffers; i++) | 3075 | for (i = 0; i < gbuffers; i++) |
3077 | mbuf->offsets[i] = i * gbufsize; | 3076 | mbuf->offsets[i] = i * gbufsize; |
3078 | mutex_unlock(&fh->cap.lock); | ||
3079 | return 0; | 3077 | return 0; |
3080 | } | 3078 | } |
3081 | case VIDIOCMCAPTURE: | 3079 | case VIDIOCMCAPTURE: |
diff --git a/drivers/media/video/ivtv/ivtv-driver.c b/drivers/media/video/ivtv/ivtv-driver.c index 6d2dd8764f81..10d6faf8ccda 100644 --- a/drivers/media/video/ivtv/ivtv-driver.c +++ b/drivers/media/video/ivtv/ivtv-driver.c | |||
@@ -1076,6 +1076,10 @@ static int __devinit ivtv_probe(struct pci_dev *dev, | |||
1076 | ivtv_process_eeprom(itv); | 1076 | ivtv_process_eeprom(itv); |
1077 | } | 1077 | } |
1078 | 1078 | ||
1079 | /* The mspx4xx chips need a longer delay for some reason */ | ||
1080 | if (!(itv->hw_flags & IVTV_HW_MSP34XX)) | ||
1081 | itv->i2c_algo.udelay = 5; | ||
1082 | |||
1079 | if (itv->std == 0) { | 1083 | if (itv->std == 0) { |
1080 | itv->std = V4L2_STD_NTSC_M; | 1084 | itv->std = V4L2_STD_NTSC_M; |
1081 | } | 1085 | } |
diff --git a/drivers/media/video/ivtv/ivtv-i2c.c b/drivers/media/video/ivtv/ivtv-i2c.c index 44678fe27a04..36e54f78aa2a 100644 --- a/drivers/media/video/ivtv/ivtv-i2c.c +++ b/drivers/media/video/ivtv/ivtv-i2c.c | |||
@@ -541,7 +541,7 @@ static const struct i2c_algo_bit_data ivtv_i2c_algo_template = { | |||
541 | .setscl = ivtv_setscl_old, | 541 | .setscl = ivtv_setscl_old, |
542 | .getsda = ivtv_getsda_old, | 542 | .getsda = ivtv_getsda_old, |
543 | .getscl = ivtv_getscl_old, | 543 | .getscl = ivtv_getscl_old, |
544 | .udelay = 5, | 544 | .udelay = 10, |
545 | .timeout = 200, | 545 | .timeout = 200, |
546 | }; | 546 | }; |
547 | 547 | ||
@@ -718,9 +718,6 @@ int init_ivtv_i2c(struct ivtv *itv) | |||
718 | sizeof(struct i2c_adapter)); | 718 | sizeof(struct i2c_adapter)); |
719 | memcpy(&itv->i2c_algo, &ivtv_i2c_algo_template, | 719 | memcpy(&itv->i2c_algo, &ivtv_i2c_algo_template, |
720 | sizeof(struct i2c_algo_bit_data)); | 720 | sizeof(struct i2c_algo_bit_data)); |
721 | /* The mspx4xx chips need a longer delay for some reason */ | ||
722 | if (itv->hw_flags & IVTV_HW_MSP34XX) | ||
723 | itv->i2c_algo.udelay = 10; | ||
724 | itv->i2c_algo.data = itv; | 721 | itv->i2c_algo.data = itv; |
725 | itv->i2c_adap.algo_data = &itv->i2c_algo; | 722 | itv->i2c_adap.algo_data = &itv->i2c_algo; |
726 | } | 723 | } |
diff --git a/drivers/mtd/chips/cfi_cmdset_0001.c b/drivers/mtd/chips/cfi_cmdset_0001.c index a9eb1c516247..1707f98c322c 100644 --- a/drivers/mtd/chips/cfi_cmdset_0001.c +++ b/drivers/mtd/chips/cfi_cmdset_0001.c | |||
@@ -1504,9 +1504,12 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip, | |||
1504 | int ret, wbufsize, word_gap, words; | 1504 | int ret, wbufsize, word_gap, words; |
1505 | const struct kvec *vec; | 1505 | const struct kvec *vec; |
1506 | unsigned long vec_seek; | 1506 | unsigned long vec_seek; |
1507 | unsigned long initial_adr; | ||
1508 | int initial_len = len; | ||
1507 | 1509 | ||
1508 | wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize; | 1510 | wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize; |
1509 | adr += chip->start; | 1511 | adr += chip->start; |
1512 | initial_adr = adr; | ||
1510 | cmd_adr = adr & ~(wbufsize-1); | 1513 | cmd_adr = adr & ~(wbufsize-1); |
1511 | 1514 | ||
1512 | /* Let's determine this according to the interleave only once */ | 1515 | /* Let's determine this according to the interleave only once */ |
@@ -1519,7 +1522,7 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip, | |||
1519 | return ret; | 1522 | return ret; |
1520 | } | 1523 | } |
1521 | 1524 | ||
1522 | XIP_INVAL_CACHED_RANGE(map, adr, len); | 1525 | XIP_INVAL_CACHED_RANGE(map, initial_adr, initial_len); |
1523 | ENABLE_VPP(map); | 1526 | ENABLE_VPP(map); |
1524 | xip_disable(map, chip, cmd_adr); | 1527 | xip_disable(map, chip, cmd_adr); |
1525 | 1528 | ||
@@ -1610,7 +1613,7 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip, | |||
1610 | chip->state = FL_WRITING; | 1613 | chip->state = FL_WRITING; |
1611 | 1614 | ||
1612 | ret = INVAL_CACHE_AND_WAIT(map, chip, cmd_adr, | 1615 | ret = INVAL_CACHE_AND_WAIT(map, chip, cmd_adr, |
1613 | adr, len, | 1616 | initial_adr, initial_len, |
1614 | chip->buffer_write_time); | 1617 | chip->buffer_write_time); |
1615 | if (ret) { | 1618 | if (ret) { |
1616 | map_write(map, CMD(0x70), cmd_adr); | 1619 | map_write(map, CMD(0x70), cmd_adr); |
diff --git a/drivers/net/e100.c b/drivers/net/e100.c index 2b06e4b4dabc..b87402bc8308 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c | |||
@@ -1991,13 +1991,12 @@ static int e100_poll(struct napi_struct *napi, int budget) | |||
1991 | struct nic *nic = container_of(napi, struct nic, napi); | 1991 | struct nic *nic = container_of(napi, struct nic, napi); |
1992 | struct net_device *netdev = nic->netdev; | 1992 | struct net_device *netdev = nic->netdev; |
1993 | unsigned int work_done = 0; | 1993 | unsigned int work_done = 0; |
1994 | int tx_cleaned; | ||
1995 | 1994 | ||
1996 | e100_rx_clean(nic, &work_done, budget); | 1995 | e100_rx_clean(nic, &work_done, budget); |
1997 | tx_cleaned = e100_tx_clean(nic); | 1996 | e100_tx_clean(nic); |
1998 | 1997 | ||
1999 | /* If no Rx and Tx cleanup work was done, exit polling mode. */ | 1998 | /* If budget not fully consumed, exit the polling mode */ |
2000 | if((!tx_cleaned && (work_done == 0)) || !netif_running(netdev)) { | 1999 | if (work_done < budget) { |
2001 | netif_rx_complete(netdev, napi); | 2000 | netif_rx_complete(netdev, napi); |
2002 | e100_enable_irq(nic); | 2001 | e100_enable_irq(nic); |
2003 | } | 2002 | } |
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index 4f37506ad374..13d57b0a88fa 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -3919,32 +3919,26 @@ e1000_clean(struct napi_struct *napi, int budget) | |||
3919 | { | 3919 | { |
3920 | struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi); | 3920 | struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi); |
3921 | struct net_device *poll_dev = adapter->netdev; | 3921 | struct net_device *poll_dev = adapter->netdev; |
3922 | int tx_cleaned = 0, work_done = 0; | 3922 | int work_done = 0; |
3923 | 3923 | ||
3924 | /* Must NOT use netdev_priv macro here. */ | 3924 | /* Must NOT use netdev_priv macro here. */ |
3925 | adapter = poll_dev->priv; | 3925 | adapter = poll_dev->priv; |
3926 | 3926 | ||
3927 | /* Keep link state information with original netdev */ | ||
3928 | if (!netif_carrier_ok(poll_dev)) | ||
3929 | goto quit_polling; | ||
3930 | |||
3931 | /* e1000_clean is called per-cpu. This lock protects | 3927 | /* e1000_clean is called per-cpu. This lock protects |
3932 | * tx_ring[0] from being cleaned by multiple cpus | 3928 | * tx_ring[0] from being cleaned by multiple cpus |
3933 | * simultaneously. A failure obtaining the lock means | 3929 | * simultaneously. A failure obtaining the lock means |
3934 | * tx_ring[0] is currently being cleaned anyway. */ | 3930 | * tx_ring[0] is currently being cleaned anyway. */ |
3935 | if (spin_trylock(&adapter->tx_queue_lock)) { | 3931 | if (spin_trylock(&adapter->tx_queue_lock)) { |
3936 | tx_cleaned = e1000_clean_tx_irq(adapter, | 3932 | e1000_clean_tx_irq(adapter, |
3937 | &adapter->tx_ring[0]); | 3933 | &adapter->tx_ring[0]); |
3938 | spin_unlock(&adapter->tx_queue_lock); | 3934 | spin_unlock(&adapter->tx_queue_lock); |
3939 | } | 3935 | } |
3940 | 3936 | ||
3941 | adapter->clean_rx(adapter, &adapter->rx_ring[0], | 3937 | adapter->clean_rx(adapter, &adapter->rx_ring[0], |
3942 | &work_done, budget); | 3938 | &work_done, budget); |
3943 | 3939 | ||
3944 | /* If no Tx and not enough Rx work done, exit the polling mode */ | 3940 | /* If budget not fully consumed, exit the polling mode */ |
3945 | if ((!tx_cleaned && (work_done == 0)) || | 3941 | if (work_done < budget) { |
3946 | !netif_running(poll_dev)) { | ||
3947 | quit_polling: | ||
3948 | if (likely(adapter->itr_setting & 3)) | 3942 | if (likely(adapter->itr_setting & 3)) |
3949 | e1000_set_itr(adapter); | 3943 | e1000_set_itr(adapter); |
3950 | netif_rx_complete(poll_dev, napi); | 3944 | netif_rx_complete(poll_dev, napi); |
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 4fd2e23720b6..4a6fc7453776 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
@@ -1384,30 +1384,24 @@ static int e1000_clean(struct napi_struct *napi, int budget) | |||
1384 | { | 1384 | { |
1385 | struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi); | 1385 | struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi); |
1386 | struct net_device *poll_dev = adapter->netdev; | 1386 | struct net_device *poll_dev = adapter->netdev; |
1387 | int tx_cleaned = 0, work_done = 0; | 1387 | int work_done = 0; |
1388 | 1388 | ||
1389 | /* Must NOT use netdev_priv macro here. */ | 1389 | /* Must NOT use netdev_priv macro here. */ |
1390 | adapter = poll_dev->priv; | 1390 | adapter = poll_dev->priv; |
1391 | 1391 | ||
1392 | /* Keep link state information with original netdev */ | ||
1393 | if (!netif_carrier_ok(poll_dev)) | ||
1394 | goto quit_polling; | ||
1395 | |||
1396 | /* e1000_clean is called per-cpu. This lock protects | 1392 | /* e1000_clean is called per-cpu. This lock protects |
1397 | * tx_ring from being cleaned by multiple cpus | 1393 | * tx_ring from being cleaned by multiple cpus |
1398 | * simultaneously. A failure obtaining the lock means | 1394 | * simultaneously. A failure obtaining the lock means |
1399 | * tx_ring is currently being cleaned anyway. */ | 1395 | * tx_ring is currently being cleaned anyway. */ |
1400 | if (spin_trylock(&adapter->tx_queue_lock)) { | 1396 | if (spin_trylock(&adapter->tx_queue_lock)) { |
1401 | tx_cleaned = e1000_clean_tx_irq(adapter); | 1397 | e1000_clean_tx_irq(adapter); |
1402 | spin_unlock(&adapter->tx_queue_lock); | 1398 | spin_unlock(&adapter->tx_queue_lock); |
1403 | } | 1399 | } |
1404 | 1400 | ||
1405 | adapter->clean_rx(adapter, &work_done, budget); | 1401 | adapter->clean_rx(adapter, &work_done, budget); |
1406 | 1402 | ||
1407 | /* If no Tx and not enough Rx work done, exit the polling mode */ | 1403 | /* If budget not fully consumed, exit the polling mode */ |
1408 | if ((!tx_cleaned && (work_done < budget)) || | 1404 | if (work_done < budget) { |
1409 | !netif_running(poll_dev)) { | ||
1410 | quit_polling: | ||
1411 | if (adapter->itr_setting & 3) | 1405 | if (adapter->itr_setting & 3) |
1412 | e1000_set_itr(adapter); | 1406 | e1000_set_itr(adapter); |
1413 | netif_rx_complete(poll_dev, napi); | 1407 | netif_rx_complete(poll_dev, napi); |
diff --git a/drivers/net/epic100.c b/drivers/net/epic100.c index ecdd3fc8d70c..0b365b8d947b 100644 --- a/drivers/net/epic100.c +++ b/drivers/net/epic100.c | |||
@@ -1273,7 +1273,7 @@ rx_action: | |||
1273 | 1273 | ||
1274 | epic_rx_err(dev, ep); | 1274 | epic_rx_err(dev, ep); |
1275 | 1275 | ||
1276 | if (netif_running(dev) && (work_done < budget)) { | 1276 | if (work_done < budget) { |
1277 | unsigned long flags; | 1277 | unsigned long flags; |
1278 | int more; | 1278 | int more; |
1279 | 1279 | ||
diff --git a/drivers/net/fec_8xx/fec_main.c b/drivers/net/fec_8xx/fec_main.c index 8d2904fa5789..ab9637ab3a8d 100644 --- a/drivers/net/fec_8xx/fec_main.c +++ b/drivers/net/fec_8xx/fec_main.c | |||
@@ -476,11 +476,6 @@ static int fec_enet_rx_common(struct fec_enet_private *ep, | |||
476 | __u16 pkt_len, sc; | 476 | __u16 pkt_len, sc; |
477 | int curidx; | 477 | int curidx; |
478 | 478 | ||
479 | if (fpi->use_napi) { | ||
480 | if (!netif_running(dev)) | ||
481 | return 0; | ||
482 | } | ||
483 | |||
484 | /* | 479 | /* |
485 | * First, grab all of the stats for the incoming packet. | 480 | * First, grab all of the stats for the incoming packet. |
486 | * These get messed up if we get called due to a busy condition. | 481 | * These get messed up if we get called due to a busy condition. |
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index a96583cceb5e..f84c752997a4 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
@@ -5199,10 +5199,6 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i | |||
5199 | dev->dev_addr[3] = (np->orig_mac[0] >> 16) & 0xff; | 5199 | dev->dev_addr[3] = (np->orig_mac[0] >> 16) & 0xff; |
5200 | dev->dev_addr[4] = (np->orig_mac[0] >> 8) & 0xff; | 5200 | dev->dev_addr[4] = (np->orig_mac[0] >> 8) & 0xff; |
5201 | dev->dev_addr[5] = (np->orig_mac[0] >> 0) & 0xff; | 5201 | dev->dev_addr[5] = (np->orig_mac[0] >> 0) & 0xff; |
5202 | /* set permanent address to be correct aswell */ | ||
5203 | np->orig_mac[0] = (dev->dev_addr[0] << 0) + (dev->dev_addr[1] << 8) + | ||
5204 | (dev->dev_addr[2] << 16) + (dev->dev_addr[3] << 24); | ||
5205 | np->orig_mac[1] = (dev->dev_addr[4] << 0) + (dev->dev_addr[5] << 8); | ||
5206 | writel(txreg|NVREG_TRANSMITPOLL_MAC_ADDR_REV, base + NvRegTransmitPoll); | 5202 | writel(txreg|NVREG_TRANSMITPOLL_MAC_ADDR_REV, base + NvRegTransmitPoll); |
5207 | } | 5203 | } |
5208 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); | 5204 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); |
@@ -5414,6 +5410,8 @@ static void __devexit nv_remove(struct pci_dev *pci_dev) | |||
5414 | */ | 5410 | */ |
5415 | writel(np->orig_mac[0], base + NvRegMacAddrA); | 5411 | writel(np->orig_mac[0], base + NvRegMacAddrA); |
5416 | writel(np->orig_mac[1], base + NvRegMacAddrB); | 5412 | writel(np->orig_mac[1], base + NvRegMacAddrB); |
5413 | writel(readl(base + NvRegTransmitPoll) & ~NVREG_TRANSMITPOLL_MAC_ADDR_REV, | ||
5414 | base + NvRegTransmitPoll); | ||
5417 | 5415 | ||
5418 | /* free all structures */ | 5416 | /* free all structures */ |
5419 | free_rings(dev); | 5417 | free_rings(dev); |
diff --git a/drivers/net/fs_enet/fs_enet-main.c b/drivers/net/fs_enet/fs_enet-main.c index f2a4d399a6e5..3e1a57a42f11 100644 --- a/drivers/net/fs_enet/fs_enet-main.c +++ b/drivers/net/fs_enet/fs_enet-main.c | |||
@@ -96,9 +96,6 @@ static int fs_enet_rx_napi(struct napi_struct *napi, int budget) | |||
96 | u16 pkt_len, sc; | 96 | u16 pkt_len, sc; |
97 | int curidx; | 97 | int curidx; |
98 | 98 | ||
99 | if (!netif_running(dev)) | ||
100 | return 0; | ||
101 | |||
102 | /* | 99 | /* |
103 | * First, grab all of the stats for the incoming packet. | 100 | * First, grab all of the stats for the incoming packet. |
104 | * These get messed up if we get called due to a busy condition. | 101 | * These get messed up if we get called due to a busy condition. |
diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c index bf9085fe035a..d2fb88d5cda2 100644 --- a/drivers/net/ixgb/ixgb_main.c +++ b/drivers/net/ixgb/ixgb_main.c | |||
@@ -1787,14 +1787,13 @@ ixgb_clean(struct napi_struct *napi, int budget) | |||
1787 | { | 1787 | { |
1788 | struct ixgb_adapter *adapter = container_of(napi, struct ixgb_adapter, napi); | 1788 | struct ixgb_adapter *adapter = container_of(napi, struct ixgb_adapter, napi); |
1789 | struct net_device *netdev = adapter->netdev; | 1789 | struct net_device *netdev = adapter->netdev; |
1790 | int tx_cleaned; | ||
1791 | int work_done = 0; | 1790 | int work_done = 0; |
1792 | 1791 | ||
1793 | tx_cleaned = ixgb_clean_tx_irq(adapter); | 1792 | ixgb_clean_tx_irq(adapter); |
1794 | ixgb_clean_rx_irq(adapter, &work_done, budget); | 1793 | ixgb_clean_rx_irq(adapter, &work_done, budget); |
1795 | 1794 | ||
1796 | /* if no Tx and not enough Rx work done, exit the polling mode */ | 1795 | /* If budget not fully consumed, exit the polling mode */ |
1797 | if((!tx_cleaned && (work_done == 0)) || !netif_running(netdev)) { | 1796 | if (work_done < budget) { |
1798 | netif_rx_complete(netdev, napi); | 1797 | netif_rx_complete(netdev, napi); |
1799 | ixgb_irq_enable(adapter); | 1798 | ixgb_irq_enable(adapter); |
1800 | } | 1799 | } |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 00bc525c6560..a56491617661 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
@@ -1468,21 +1468,15 @@ static int ixgbe_clean(struct napi_struct *napi, int budget) | |||
1468 | struct ixgbe_adapter *adapter = container_of(napi, | 1468 | struct ixgbe_adapter *adapter = container_of(napi, |
1469 | struct ixgbe_adapter, napi); | 1469 | struct ixgbe_adapter, napi); |
1470 | struct net_device *netdev = adapter->netdev; | 1470 | struct net_device *netdev = adapter->netdev; |
1471 | int tx_cleaned = 0, work_done = 0; | 1471 | int work_done = 0; |
1472 | |||
1473 | /* Keep link state information with original netdev */ | ||
1474 | if (!netif_carrier_ok(adapter->netdev)) | ||
1475 | goto quit_polling; | ||
1476 | 1472 | ||
1477 | /* In non-MSIX case, there is no multi-Tx/Rx queue */ | 1473 | /* In non-MSIX case, there is no multi-Tx/Rx queue */ |
1478 | tx_cleaned = ixgbe_clean_tx_irq(adapter, adapter->tx_ring); | 1474 | ixgbe_clean_tx_irq(adapter, adapter->tx_ring); |
1479 | ixgbe_clean_rx_irq(adapter, &adapter->rx_ring[0], &work_done, | 1475 | ixgbe_clean_rx_irq(adapter, &adapter->rx_ring[0], &work_done, |
1480 | budget); | 1476 | budget); |
1481 | 1477 | ||
1482 | /* If no Tx and not enough Rx work done, exit the polling mode */ | 1478 | /* If budget not fully consumed, exit the polling mode */ |
1483 | if ((!tx_cleaned && (work_done < budget)) || | 1479 | if (work_done < budget) { |
1484 | !netif_running(adapter->netdev)) { | ||
1485 | quit_polling: | ||
1486 | netif_rx_complete(netdev, napi); | 1480 | netif_rx_complete(netdev, napi); |
1487 | ixgbe_irq_enable(adapter); | 1481 | ixgbe_irq_enable(adapter); |
1488 | } | 1482 | } |
diff --git a/drivers/net/ixp2000/ixpdev.c b/drivers/net/ixp2000/ixpdev.c index 6c0dd49149d0..484cb2ba717f 100644 --- a/drivers/net/ixp2000/ixpdev.c +++ b/drivers/net/ixp2000/ixpdev.c | |||
@@ -135,8 +135,6 @@ static int ixpdev_poll(struct napi_struct *napi, int budget) | |||
135 | struct net_device *dev = ip->dev; | 135 | struct net_device *dev = ip->dev; |
136 | int rx; | 136 | int rx; |
137 | 137 | ||
138 | /* @@@ Have to stop polling when nds[0] is administratively | ||
139 | * downed while we are polling. */ | ||
140 | rx = 0; | 138 | rx = 0; |
141 | do { | 139 | do { |
142 | ixp2000_reg_write(IXP2000_IRQ_THD_RAW_STATUS_A_0, 0x00ff); | 140 | ixp2000_reg_write(IXP2000_IRQ_THD_RAW_STATUS_A_0, 0x00ff); |
diff --git a/drivers/net/meth.c b/drivers/net/meth.c index 0c89b028a80c..cdaa8fc21809 100644 --- a/drivers/net/meth.c +++ b/drivers/net/meth.c | |||
@@ -95,11 +95,14 @@ static inline void load_eaddr(struct net_device *dev) | |||
95 | { | 95 | { |
96 | int i; | 96 | int i; |
97 | DECLARE_MAC_BUF(mac); | 97 | DECLARE_MAC_BUF(mac); |
98 | u64 macaddr; | ||
98 | 99 | ||
99 | for (i = 0; i < 6; i++) | ||
100 | dev->dev_addr[i] = o2meth_eaddr[i]; | ||
101 | DPRINTK("Loading MAC Address: %s\n", print_mac(mac, dev->dev_addr)); | 100 | DPRINTK("Loading MAC Address: %s\n", print_mac(mac, dev->dev_addr)); |
102 | mace->eth.mac_addr = (*(unsigned long*)o2meth_eaddr) >> 16; | 101 | macaddr = 0; |
102 | for (i = 0; i < 6; i++) | ||
103 | macaddr |= dev->dev_addr[i] << ((5 - i) * 8); | ||
104 | |||
105 | mace->eth.mac_addr = macaddr; | ||
103 | } | 106 | } |
104 | 107 | ||
105 | /* | 108 | /* |
@@ -794,6 +797,7 @@ static int __init meth_probe(struct platform_device *pdev) | |||
794 | #endif | 797 | #endif |
795 | dev->irq = MACE_ETHERNET_IRQ; | 798 | dev->irq = MACE_ETHERNET_IRQ; |
796 | dev->base_addr = (unsigned long)&mace->eth; | 799 | dev->base_addr = (unsigned long)&mace->eth; |
800 | memcpy(dev->dev_addr, o2meth_eaddr, 6); | ||
797 | 801 | ||
798 | priv = netdev_priv(dev); | 802 | priv = netdev_priv(dev); |
799 | spin_lock_init(&priv->meth_lock); | 803 | spin_lock_init(&priv->meth_lock); |
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index 8def8657251f..c90958f6d3fe 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
@@ -1239,7 +1239,7 @@ static int myri10ge_poll(struct napi_struct *napi, int budget) | |||
1239 | /* process as many rx events as NAPI will allow */ | 1239 | /* process as many rx events as NAPI will allow */ |
1240 | work_done = myri10ge_clean_rx_done(mgp, budget); | 1240 | work_done = myri10ge_clean_rx_done(mgp, budget); |
1241 | 1241 | ||
1242 | if (work_done < budget || !netif_running(netdev)) { | 1242 | if (work_done < budget) { |
1243 | netif_rx_complete(netdev, napi); | 1243 | netif_rx_complete(netdev, napi); |
1244 | put_be32(htonl(3), mgp->irq_claim); | 1244 | put_be32(htonl(3), mgp->irq_claim); |
1245 | } | 1245 | } |
diff --git a/drivers/net/natsemi.c b/drivers/net/natsemi.c index 87cde062fd63..c329a4f5840c 100644 --- a/drivers/net/natsemi.c +++ b/drivers/net/natsemi.c | |||
@@ -2266,7 +2266,7 @@ static int natsemi_poll(struct napi_struct *napi, int budget) | |||
2266 | /* Reenable interrupts providing nothing is trying to shut | 2266 | /* Reenable interrupts providing nothing is trying to shut |
2267 | * the chip down. */ | 2267 | * the chip down. */ |
2268 | spin_lock(&np->lock); | 2268 | spin_lock(&np->lock); |
2269 | if (!np->hands_off && netif_running(dev)) | 2269 | if (!np->hands_off) |
2270 | natsemi_irq_enable(dev); | 2270 | natsemi_irq_enable(dev); |
2271 | spin_unlock(&np->lock); | 2271 | spin_unlock(&np->lock); |
2272 | 2272 | ||
diff --git a/drivers/net/netx-eth.c b/drivers/net/netx-eth.c index 5267e031daa0..78d34af13a1c 100644 --- a/drivers/net/netx-eth.c +++ b/drivers/net/netx-eth.c | |||
@@ -169,8 +169,8 @@ static void netx_eth_receive(struct net_device *ndev) | |||
169 | ndev->last_rx = jiffies; | 169 | ndev->last_rx = jiffies; |
170 | skb->protocol = eth_type_trans(skb, ndev); | 170 | skb->protocol = eth_type_trans(skb, ndev); |
171 | netif_rx(skb); | 171 | netif_rx(skb); |
172 | dev->stats.rx_packets++; | 172 | ndev->stats.rx_packets++; |
173 | dev->stats.rx_bytes += len; | 173 | ndev->stats.rx_bytes += len; |
174 | } | 174 | } |
175 | 175 | ||
176 | static irqreturn_t | 176 | static irqreturn_t |
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index a80f0cd6b528..454226f7baa8 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
@@ -1321,7 +1321,7 @@ static int netxen_nic_poll(struct napi_struct *napi, int budget) | |||
1321 | budget / MAX_RCV_CTX); | 1321 | budget / MAX_RCV_CTX); |
1322 | } | 1322 | } |
1323 | 1323 | ||
1324 | if (work_done >= budget && netxen_nic_rx_has_work(adapter) != 0) | 1324 | if (work_done >= budget) |
1325 | done = 0; | 1325 | done = 0; |
1326 | 1326 | ||
1327 | if (netxen_process_cmd_ring((unsigned long)adapter) == 0) | 1327 | if (netxen_process_cmd_ring((unsigned long)adapter) == 0) |
diff --git a/drivers/net/niu.c b/drivers/net/niu.c index abfc61c3a38c..9a0c6d3adfe9 100644 --- a/drivers/net/niu.c +++ b/drivers/net/niu.c | |||
@@ -33,8 +33,8 @@ | |||
33 | 33 | ||
34 | #define DRV_MODULE_NAME "niu" | 34 | #define DRV_MODULE_NAME "niu" |
35 | #define PFX DRV_MODULE_NAME ": " | 35 | #define PFX DRV_MODULE_NAME ": " |
36 | #define DRV_MODULE_VERSION "0.5" | 36 | #define DRV_MODULE_VERSION "0.6" |
37 | #define DRV_MODULE_RELDATE "October 5, 2007" | 37 | #define DRV_MODULE_RELDATE "January 5, 2008" |
38 | 38 | ||
39 | static char version[] __devinitdata = | 39 | static char version[] __devinitdata = |
40 | DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; | 40 | DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; |
@@ -2241,6 +2241,8 @@ static int niu_process_rx_pkt(struct niu *np, struct rx_ring_info *rp) | |||
2241 | skb->protocol = eth_type_trans(skb, np->dev); | 2241 | skb->protocol = eth_type_trans(skb, np->dev); |
2242 | netif_receive_skb(skb); | 2242 | netif_receive_skb(skb); |
2243 | 2243 | ||
2244 | np->dev->last_rx = jiffies; | ||
2245 | |||
2244 | return num_rcr; | 2246 | return num_rcr; |
2245 | } | 2247 | } |
2246 | 2248 | ||
@@ -2508,15 +2510,19 @@ static int niu_rx_error(struct niu *np, struct rx_ring_info *rp) | |||
2508 | u64 stat = nr64(RX_DMA_CTL_STAT(rp->rx_channel)); | 2510 | u64 stat = nr64(RX_DMA_CTL_STAT(rp->rx_channel)); |
2509 | int err = 0; | 2511 | int err = 0; |
2510 | 2512 | ||
2511 | dev_err(np->device, PFX "%s: RX channel %u error, stat[%llx]\n", | ||
2512 | np->dev->name, rp->rx_channel, (unsigned long long) stat); | ||
2513 | |||
2514 | niu_log_rxchan_errors(np, rp, stat); | ||
2515 | 2513 | ||
2516 | if (stat & (RX_DMA_CTL_STAT_CHAN_FATAL | | 2514 | if (stat & (RX_DMA_CTL_STAT_CHAN_FATAL | |
2517 | RX_DMA_CTL_STAT_PORT_FATAL)) | 2515 | RX_DMA_CTL_STAT_PORT_FATAL)) |
2518 | err = -EINVAL; | 2516 | err = -EINVAL; |
2519 | 2517 | ||
2518 | if (err) { | ||
2519 | dev_err(np->device, PFX "%s: RX channel %u error, stat[%llx]\n", | ||
2520 | np->dev->name, rp->rx_channel, | ||
2521 | (unsigned long long) stat); | ||
2522 | |||
2523 | niu_log_rxchan_errors(np, rp, stat); | ||
2524 | } | ||
2525 | |||
2520 | nw64(RX_DMA_CTL_STAT(rp->rx_channel), | 2526 | nw64(RX_DMA_CTL_STAT(rp->rx_channel), |
2521 | stat & RX_DMA_CTL_WRITE_CLEAR_ERRS); | 2527 | stat & RX_DMA_CTL_WRITE_CLEAR_ERRS); |
2522 | 2528 | ||
@@ -2749,13 +2755,16 @@ static int niu_device_error(struct niu *np) | |||
2749 | return -ENODEV; | 2755 | return -ENODEV; |
2750 | } | 2756 | } |
2751 | 2757 | ||
2752 | static int niu_slowpath_interrupt(struct niu *np, struct niu_ldg *lp) | 2758 | static int niu_slowpath_interrupt(struct niu *np, struct niu_ldg *lp, |
2759 | u64 v0, u64 v1, u64 v2) | ||
2753 | { | 2760 | { |
2754 | u64 v0 = lp->v0; | 2761 | |
2755 | u64 v1 = lp->v1; | ||
2756 | u64 v2 = lp->v2; | ||
2757 | int i, err = 0; | 2762 | int i, err = 0; |
2758 | 2763 | ||
2764 | lp->v0 = v0; | ||
2765 | lp->v1 = v1; | ||
2766 | lp->v2 = v2; | ||
2767 | |||
2759 | if (v1 & 0x00000000ffffffffULL) { | 2768 | if (v1 & 0x00000000ffffffffULL) { |
2760 | u32 rx_vec = (v1 & 0xffffffff); | 2769 | u32 rx_vec = (v1 & 0xffffffff); |
2761 | 2770 | ||
@@ -2764,8 +2773,13 @@ static int niu_slowpath_interrupt(struct niu *np, struct niu_ldg *lp) | |||
2764 | 2773 | ||
2765 | if (rx_vec & (1 << rp->rx_channel)) { | 2774 | if (rx_vec & (1 << rp->rx_channel)) { |
2766 | int r = niu_rx_error(np, rp); | 2775 | int r = niu_rx_error(np, rp); |
2767 | if (r) | 2776 | if (r) { |
2768 | err = r; | 2777 | err = r; |
2778 | } else { | ||
2779 | if (!v0) | ||
2780 | nw64(RX_DMA_CTL_STAT(rp->rx_channel), | ||
2781 | RX_DMA_CTL_STAT_MEX); | ||
2782 | } | ||
2769 | } | 2783 | } |
2770 | } | 2784 | } |
2771 | } | 2785 | } |
@@ -2803,7 +2817,7 @@ static int niu_slowpath_interrupt(struct niu *np, struct niu_ldg *lp) | |||
2803 | if (err) | 2817 | if (err) |
2804 | niu_enable_interrupts(np, 0); | 2818 | niu_enable_interrupts(np, 0); |
2805 | 2819 | ||
2806 | return -EINVAL; | 2820 | return err; |
2807 | } | 2821 | } |
2808 | 2822 | ||
2809 | static void niu_rxchan_intr(struct niu *np, struct rx_ring_info *rp, | 2823 | static void niu_rxchan_intr(struct niu *np, struct rx_ring_info *rp, |
@@ -2905,7 +2919,7 @@ static irqreturn_t niu_interrupt(int irq, void *dev_id) | |||
2905 | } | 2919 | } |
2906 | 2920 | ||
2907 | if (unlikely((v0 & ((u64)1 << LDN_MIF)) || v1 || v2)) { | 2921 | if (unlikely((v0 & ((u64)1 << LDN_MIF)) || v1 || v2)) { |
2908 | int err = niu_slowpath_interrupt(np, lp); | 2922 | int err = niu_slowpath_interrupt(np, lp, v0, v1, v2); |
2909 | if (err) | 2923 | if (err) |
2910 | goto out; | 2924 | goto out; |
2911 | } | 2925 | } |
@@ -5194,7 +5208,8 @@ static int niu_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
5194 | } | 5208 | } |
5195 | kfree_skb(skb); | 5209 | kfree_skb(skb); |
5196 | skb = skb_new; | 5210 | skb = skb_new; |
5197 | } | 5211 | } else |
5212 | skb_orphan(skb); | ||
5198 | 5213 | ||
5199 | align = ((unsigned long) skb->data & (16 - 1)); | 5214 | align = ((unsigned long) skb->data & (16 - 1)); |
5200 | headroom = align + sizeof(struct tx_pkt_hdr); | 5215 | headroom = align + sizeof(struct tx_pkt_hdr); |
diff --git a/drivers/net/pcnet32.c b/drivers/net/pcnet32.c index ff92aca0a7b3..90498ffe26f2 100644 --- a/drivers/net/pcnet32.c +++ b/drivers/net/pcnet32.c | |||
@@ -455,9 +455,14 @@ static void pcnet32_netif_start(struct net_device *dev) | |||
455 | { | 455 | { |
456 | #ifdef CONFIG_PCNET32_NAPI | 456 | #ifdef CONFIG_PCNET32_NAPI |
457 | struct pcnet32_private *lp = netdev_priv(dev); | 457 | struct pcnet32_private *lp = netdev_priv(dev); |
458 | ulong ioaddr = dev->base_addr; | ||
459 | u16 val; | ||
458 | #endif | 460 | #endif |
459 | netif_wake_queue(dev); | 461 | netif_wake_queue(dev); |
460 | #ifdef CONFIG_PCNET32_NAPI | 462 | #ifdef CONFIG_PCNET32_NAPI |
463 | val = lp->a.read_csr(ioaddr, CSR3); | ||
464 | val &= 0x00ff; | ||
465 | lp->a.write_csr(ioaddr, CSR3, val); | ||
461 | napi_enable(&lp->napi); | 466 | napi_enable(&lp->napi); |
462 | #endif | 467 | #endif |
463 | } | 468 | } |
diff --git a/drivers/net/qla3xxx.c b/drivers/net/qla3xxx.c index a5791114b7bd..cf0774de6c41 100644 --- a/drivers/net/qla3xxx.c +++ b/drivers/net/qla3xxx.c | |||
@@ -2320,14 +2320,9 @@ static int ql_poll(struct napi_struct *napi, int budget) | |||
2320 | unsigned long hw_flags; | 2320 | unsigned long hw_flags; |
2321 | struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers; | 2321 | struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers; |
2322 | 2322 | ||
2323 | if (!netif_carrier_ok(ndev)) | ||
2324 | goto quit_polling; | ||
2325 | |||
2326 | ql_tx_rx_clean(qdev, &tx_cleaned, &rx_cleaned, budget); | 2323 | ql_tx_rx_clean(qdev, &tx_cleaned, &rx_cleaned, budget); |
2327 | 2324 | ||
2328 | if (tx_cleaned + rx_cleaned != budget || | 2325 | if (tx_cleaned + rx_cleaned != budget) { |
2329 | !netif_running(ndev)) { | ||
2330 | quit_polling: | ||
2331 | spin_lock_irqsave(&qdev->hw_lock, hw_flags); | 2326 | spin_lock_irqsave(&qdev->hw_lock, hw_flags); |
2332 | __netif_rx_complete(ndev, napi); | 2327 | __netif_rx_complete(ndev, napi); |
2333 | ql_update_small_bufq_prod_index(qdev); | 2328 | ql_update_small_bufq_prod_index(qdev); |
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 5863190894cc..af8030981f10 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
@@ -2398,6 +2398,8 @@ static void rtl8169_wait_for_quiescence(struct net_device *dev) | |||
2398 | rtl8169_irq_mask_and_ack(ioaddr); | 2398 | rtl8169_irq_mask_and_ack(ioaddr); |
2399 | 2399 | ||
2400 | #ifdef CONFIG_R8169_NAPI | 2400 | #ifdef CONFIG_R8169_NAPI |
2401 | tp->intr_mask = 0xffff; | ||
2402 | RTL_W16(IntrMask, tp->intr_event); | ||
2401 | napi_enable(&tp->napi); | 2403 | napi_enable(&tp->napi); |
2402 | #endif | 2404 | #endif |
2403 | } | 2405 | } |
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index 9d80f1cf73ac..fa57c49c0c51 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
@@ -2704,9 +2704,6 @@ static int s2io_poll(struct napi_struct *napi, int budget) | |||
2704 | struct XENA_dev_config __iomem *bar0 = nic->bar0; | 2704 | struct XENA_dev_config __iomem *bar0 = nic->bar0; |
2705 | int i; | 2705 | int i; |
2706 | 2706 | ||
2707 | if (!is_s2io_card_up(nic)) | ||
2708 | return 0; | ||
2709 | |||
2710 | mac_control = &nic->mac_control; | 2707 | mac_control = &nic->mac_control; |
2711 | config = &nic->config; | 2708 | config = &nic->config; |
2712 | 2709 | ||
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index a74fc11a6482..52ec89b82f64 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
@@ -1168,6 +1168,7 @@ static void sky2_vlan_rx_register(struct net_device *dev, struct vlan_group *grp | |||
1168 | TX_VLAN_TAG_OFF); | 1168 | TX_VLAN_TAG_OFF); |
1169 | } | 1169 | } |
1170 | 1170 | ||
1171 | sky2_read32(hw, B0_Y2_SP_LISR); | ||
1171 | napi_enable(&hw->napi); | 1172 | napi_enable(&hw->napi); |
1172 | netif_tx_unlock_bh(dev); | 1173 | netif_tx_unlock_bh(dev); |
1173 | } | 1174 | } |
@@ -2043,6 +2044,7 @@ static int sky2_change_mtu(struct net_device *dev, int new_mtu) | |||
2043 | err = sky2_rx_start(sky2); | 2044 | err = sky2_rx_start(sky2); |
2044 | sky2_write32(hw, B0_IMSK, imask); | 2045 | sky2_write32(hw, B0_IMSK, imask); |
2045 | 2046 | ||
2047 | sky2_read32(hw, B0_Y2_SP_LISR); | ||
2046 | napi_enable(&hw->napi); | 2048 | napi_enable(&hw->napi); |
2047 | 2049 | ||
2048 | if (err) | 2050 | if (err) |
@@ -3861,6 +3863,7 @@ static int sky2_debug_show(struct seq_file *seq, void *v) | |||
3861 | last = sky2_read16(hw, Y2_QADDR(rxqaddr[port], PREF_UNIT_PUT_IDX)), | 3863 | last = sky2_read16(hw, Y2_QADDR(rxqaddr[port], PREF_UNIT_PUT_IDX)), |
3862 | sky2_read16(hw, Y2_QADDR(rxqaddr[port], PREF_UNIT_LAST_IDX))); | 3864 | sky2_read16(hw, Y2_QADDR(rxqaddr[port], PREF_UNIT_LAST_IDX))); |
3863 | 3865 | ||
3866 | sky2_read32(hw, B0_Y2_SP_LISR); | ||
3864 | napi_enable(&hw->napi); | 3867 | napi_enable(&hw->napi); |
3865 | return 0; | 3868 | return 0; |
3866 | } | 3869 | } |
diff --git a/drivers/net/tulip/interrupt.c b/drivers/net/tulip/interrupt.c index 365331446387..6284afd14bbb 100644 --- a/drivers/net/tulip/interrupt.c +++ b/drivers/net/tulip/interrupt.c | |||
@@ -117,9 +117,6 @@ int tulip_poll(struct napi_struct *napi, int budget) | |||
117 | int received = 0; | 117 | int received = 0; |
118 | #endif | 118 | #endif |
119 | 119 | ||
120 | if (!netif_running(dev)) | ||
121 | goto done; | ||
122 | |||
123 | #ifdef CONFIG_TULIP_NAPI_HW_MITIGATION | 120 | #ifdef CONFIG_TULIP_NAPI_HW_MITIGATION |
124 | 121 | ||
125 | /* that one buffer is needed for mit activation; or might be a | 122 | /* that one buffer is needed for mit activation; or might be a |
@@ -151,7 +148,8 @@ int tulip_poll(struct napi_struct *napi, int budget) | |||
151 | if (tulip_debug > 5) | 148 | if (tulip_debug > 5) |
152 | printk(KERN_DEBUG "%s: In tulip_rx(), entry %d %8.8x.\n", | 149 | printk(KERN_DEBUG "%s: In tulip_rx(), entry %d %8.8x.\n", |
153 | dev->name, entry, status); | 150 | dev->name, entry, status); |
154 | if (work_done++ >= budget) | 151 | |
152 | if (++work_done >= budget) | ||
155 | goto not_done; | 153 | goto not_done; |
156 | 154 | ||
157 | if ((status & 0x38008300) != 0x0300) { | 155 | if ((status & 0x38008300) != 0x0300) { |
@@ -260,8 +258,6 @@ int tulip_poll(struct napi_struct *napi, int budget) | |||
260 | * finally: amount of IO did not increase at all. */ | 258 | * finally: amount of IO did not increase at all. */ |
261 | } while ((ioread32(tp->base_addr + CSR5) & RxIntr)); | 259 | } while ((ioread32(tp->base_addr + CSR5) & RxIntr)); |
262 | 260 | ||
263 | done: | ||
264 | |||
265 | #ifdef CONFIG_TULIP_NAPI_HW_MITIGATION | 261 | #ifdef CONFIG_TULIP_NAPI_HW_MITIGATION |
266 | 262 | ||
267 | /* We use this simplistic scheme for IM. It's proven by | 263 | /* We use this simplistic scheme for IM. It's proven by |
diff --git a/drivers/net/usb/kaweth.c b/drivers/net/usb/kaweth.c index 58a53a641754..569ad8bfd383 100644 --- a/drivers/net/usb/kaweth.c +++ b/drivers/net/usb/kaweth.c | |||
@@ -70,7 +70,7 @@ | |||
70 | #define KAWETH_TX_TIMEOUT (5 * HZ) | 70 | #define KAWETH_TX_TIMEOUT (5 * HZ) |
71 | #define KAWETH_SCRATCH_SIZE 32 | 71 | #define KAWETH_SCRATCH_SIZE 32 |
72 | #define KAWETH_FIRMWARE_BUF_SIZE 4096 | 72 | #define KAWETH_FIRMWARE_BUF_SIZE 4096 |
73 | #define KAWETH_CONTROL_TIMEOUT (30 * HZ) | 73 | #define KAWETH_CONTROL_TIMEOUT (30000) |
74 | 74 | ||
75 | #define KAWETH_STATUS_BROKEN 0x0000001 | 75 | #define KAWETH_STATUS_BROKEN 0x0000001 |
76 | #define KAWETH_STATUS_CLOSING 0x0000002 | 76 | #define KAWETH_STATUS_CLOSING 0x0000002 |
diff --git a/drivers/net/usb/mcs7830.c b/drivers/net/usb/mcs7830.c index f55a5951733a..5ea7411e1337 100644 --- a/drivers/net/usb/mcs7830.c +++ b/drivers/net/usb/mcs7830.c | |||
@@ -94,7 +94,7 @@ static int mcs7830_get_reg(struct usbnet *dev, u16 index, u16 size, void *data) | |||
94 | 94 | ||
95 | ret = usb_control_msg(xdev, usb_rcvctrlpipe(xdev, 0), MCS7830_RD_BREQ, | 95 | ret = usb_control_msg(xdev, usb_rcvctrlpipe(xdev, 0), MCS7830_RD_BREQ, |
96 | MCS7830_RD_BMREQ, 0x0000, index, data, | 96 | MCS7830_RD_BMREQ, 0x0000, index, data, |
97 | size, msecs_to_jiffies(MCS7830_CTRL_TIMEOUT)); | 97 | size, MCS7830_CTRL_TIMEOUT); |
98 | return ret; | 98 | return ret; |
99 | } | 99 | } |
100 | 100 | ||
@@ -105,7 +105,7 @@ static int mcs7830_set_reg(struct usbnet *dev, u16 index, u16 size, void *data) | |||
105 | 105 | ||
106 | ret = usb_control_msg(xdev, usb_sndctrlpipe(xdev, 0), MCS7830_WR_BREQ, | 106 | ret = usb_control_msg(xdev, usb_sndctrlpipe(xdev, 0), MCS7830_WR_BREQ, |
107 | MCS7830_WR_BMREQ, 0x0000, index, data, | 107 | MCS7830_WR_BMREQ, 0x0000, index, data, |
108 | size, msecs_to_jiffies(MCS7830_CTRL_TIMEOUT)); | 108 | size, MCS7830_CTRL_TIMEOUT); |
109 | return ret; | 109 | return ret; |
110 | } | 110 | } |
111 | 111 | ||
diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h index a28ad230d63e..7b6fc1ab2b90 100644 --- a/drivers/net/wireless/b43/b43.h +++ b/drivers/net/wireless/b43/b43.h | |||
@@ -273,6 +273,8 @@ enum { | |||
273 | #define B43_PHYTYPE_A 0x00 | 273 | #define B43_PHYTYPE_A 0x00 |
274 | #define B43_PHYTYPE_B 0x01 | 274 | #define B43_PHYTYPE_B 0x01 |
275 | #define B43_PHYTYPE_G 0x02 | 275 | #define B43_PHYTYPE_G 0x02 |
276 | #define B43_PHYTYPE_N 0x04 | ||
277 | #define B43_PHYTYPE_LP 0x05 | ||
276 | 278 | ||
277 | /* PHYRegisters */ | 279 | /* PHYRegisters */ |
278 | #define B43_PHY_ILT_A_CTRL 0x0072 | 280 | #define B43_PHY_ILT_A_CTRL 0x0072 |
diff --git a/drivers/net/wireless/b43/main.h b/drivers/net/wireless/b43/main.h index 284d17da17d1..08e2e56e48f4 100644 --- a/drivers/net/wireless/b43/main.h +++ b/drivers/net/wireless/b43/main.h | |||
@@ -39,11 +39,11 @@ | |||
39 | #define PAD_BYTES(nr_bytes) P4D_BYTES( __LINE__ , (nr_bytes)) | 39 | #define PAD_BYTES(nr_bytes) P4D_BYTES( __LINE__ , (nr_bytes)) |
40 | 40 | ||
41 | /* Lightweight function to convert a frequency (in Mhz) to a channel number. */ | 41 | /* Lightweight function to convert a frequency (in Mhz) to a channel number. */ |
42 | static inline u8 b43_freq_to_channel_a(int freq) | 42 | static inline u8 b43_freq_to_channel_5ghz(int freq) |
43 | { | 43 | { |
44 | return ((freq - 5000) / 5); | 44 | return ((freq - 5000) / 5); |
45 | } | 45 | } |
46 | static inline u8 b43_freq_to_channel_bg(int freq) | 46 | static inline u8 b43_freq_to_channel_2ghz(int freq) |
47 | { | 47 | { |
48 | u8 channel; | 48 | u8 channel; |
49 | 49 | ||
@@ -54,19 +54,13 @@ static inline u8 b43_freq_to_channel_bg(int freq) | |||
54 | 54 | ||
55 | return channel; | 55 | return channel; |
56 | } | 56 | } |
57 | static inline u8 b43_freq_to_channel(struct b43_wldev *dev, int freq) | ||
58 | { | ||
59 | if (dev->phy.type == B43_PHYTYPE_A) | ||
60 | return b43_freq_to_channel_a(freq); | ||
61 | return b43_freq_to_channel_bg(freq); | ||
62 | } | ||
63 | 57 | ||
64 | /* Lightweight function to convert a channel number to a frequency (in Mhz). */ | 58 | /* Lightweight function to convert a channel number to a frequency (in Mhz). */ |
65 | static inline int b43_channel_to_freq_a(u8 channel) | 59 | static inline int b43_channel_to_freq_5ghz(u8 channel) |
66 | { | 60 | { |
67 | return (5000 + (5 * channel)); | 61 | return (5000 + (5 * channel)); |
68 | } | 62 | } |
69 | static inline int b43_channel_to_freq_bg(u8 channel) | 63 | static inline int b43_channel_to_freq_2ghz(u8 channel) |
70 | { | 64 | { |
71 | int freq; | 65 | int freq; |
72 | 66 | ||
@@ -77,12 +71,6 @@ static inline int b43_channel_to_freq_bg(u8 channel) | |||
77 | 71 | ||
78 | return freq; | 72 | return freq; |
79 | } | 73 | } |
80 | static inline int b43_channel_to_freq(struct b43_wldev *dev, u8 channel) | ||
81 | { | ||
82 | if (dev->phy.type == B43_PHYTYPE_A) | ||
83 | return b43_channel_to_freq_a(channel); | ||
84 | return b43_channel_to_freq_bg(channel); | ||
85 | } | ||
86 | 74 | ||
87 | static inline int b43_is_cck_rate(int rate) | 75 | static inline int b43_is_cck_rate(int rate) |
88 | { | 76 | { |
diff --git a/drivers/net/wireless/b43/xmit.c b/drivers/net/wireless/b43/xmit.c index 0bd6f8a348a8..3307ba1856b1 100644 --- a/drivers/net/wireless/b43/xmit.c +++ b/drivers/net/wireless/b43/xmit.c | |||
@@ -531,21 +531,32 @@ void b43_rx(struct b43_wldev *dev, struct sk_buff *skb, const void *_rxhdr) | |||
531 | switch (chanstat & B43_RX_CHAN_PHYTYPE) { | 531 | switch (chanstat & B43_RX_CHAN_PHYTYPE) { |
532 | case B43_PHYTYPE_A: | 532 | case B43_PHYTYPE_A: |
533 | status.phymode = MODE_IEEE80211A; | 533 | status.phymode = MODE_IEEE80211A; |
534 | status.freq = chanid; | 534 | B43_WARN_ON(1); |
535 | status.channel = b43_freq_to_channel_a(chanid); | 535 | /* FIXME: We don't really know which value the "chanid" contains. |
536 | break; | 536 | * So the following assignment might be wrong. */ |
537 | case B43_PHYTYPE_B: | 537 | status.channel = chanid; |
538 | status.phymode = MODE_IEEE80211B; | 538 | status.freq = b43_channel_to_freq_5ghz(status.channel); |
539 | status.freq = chanid + 2400; | ||
540 | status.channel = b43_freq_to_channel_bg(chanid + 2400); | ||
541 | break; | 539 | break; |
542 | case B43_PHYTYPE_G: | 540 | case B43_PHYTYPE_G: |
543 | status.phymode = MODE_IEEE80211G; | 541 | status.phymode = MODE_IEEE80211G; |
542 | /* chanid is the radio channel cookie value as used | ||
543 | * to tune the radio. */ | ||
544 | status.freq = chanid + 2400; | 544 | status.freq = chanid + 2400; |
545 | status.channel = b43_freq_to_channel_bg(chanid + 2400); | 545 | status.channel = b43_freq_to_channel_2ghz(status.freq); |
546 | break; | ||
547 | case B43_PHYTYPE_N: | ||
548 | status.phymode = 0xDEAD /*FIXME MODE_IEEE80211N*/; | ||
549 | /* chanid is the SHM channel cookie. Which is the plain | ||
550 | * channel number in b43. */ | ||
551 | status.channel = chanid; | ||
552 | if (chanstat & B43_RX_CHAN_5GHZ) | ||
553 | status.freq = b43_freq_to_channel_5ghz(status.freq); | ||
554 | else | ||
555 | status.freq = b43_freq_to_channel_2ghz(status.freq); | ||
546 | break; | 556 | break; |
547 | default: | 557 | default: |
548 | B43_WARN_ON(1); | 558 | B43_WARN_ON(1); |
559 | goto drop; | ||
549 | } | 560 | } |
550 | 561 | ||
551 | dev->stats.last_rx = jiffies; | 562 | dev->stats.last_rx = jiffies; |
diff --git a/drivers/net/wireless/b43/xmit.h b/drivers/net/wireless/b43/xmit.h index 03bddd251618..6dc079382f7f 100644 --- a/drivers/net/wireless/b43/xmit.h +++ b/drivers/net/wireless/b43/xmit.h | |||
@@ -142,49 +142,56 @@ struct b43_rxhdr_fw4 { | |||
142 | } __attribute__ ((__packed__)); | 142 | } __attribute__ ((__packed__)); |
143 | 143 | ||
144 | /* PHY RX Status 0 */ | 144 | /* PHY RX Status 0 */ |
145 | #define B43_RX_PHYST0_GAINCTL 0x4000 /* Gain Control */ | 145 | #define B43_RX_PHYST0_GAINCTL 0x4000 /* Gain Control */ |
146 | #define B43_RX_PHYST0_PLCPHCF 0x0200 | 146 | #define B43_RX_PHYST0_PLCPHCF 0x0200 |
147 | #define B43_RX_PHYST0_PLCPFV 0x0100 | 147 | #define B43_RX_PHYST0_PLCPFV 0x0100 |
148 | #define B43_RX_PHYST0_SHORTPRMBL 0x0080 /* Received with Short Preamble */ | 148 | #define B43_RX_PHYST0_SHORTPRMBL 0x0080 /* Received with Short Preamble */ |
149 | #define B43_RX_PHYST0_LCRS 0x0040 | 149 | #define B43_RX_PHYST0_LCRS 0x0040 |
150 | #define B43_RX_PHYST0_ANT 0x0020 /* Antenna */ | 150 | #define B43_RX_PHYST0_ANT 0x0020 /* Antenna */ |
151 | #define B43_RX_PHYST0_UNSRATE 0x0010 | 151 | #define B43_RX_PHYST0_UNSRATE 0x0010 |
152 | #define B43_RX_PHYST0_CLIP 0x000C | 152 | #define B43_RX_PHYST0_CLIP 0x000C |
153 | #define B43_RX_PHYST0_CLIP_SHIFT 2 | 153 | #define B43_RX_PHYST0_CLIP_SHIFT 2 |
154 | #define B43_RX_PHYST0_FTYPE 0x0003 /* Frame type */ | 154 | #define B43_RX_PHYST0_FTYPE 0x0003 /* Frame type */ |
155 | #define B43_RX_PHYST0_CCK 0x0000 /* Frame type: CCK */ | 155 | #define B43_RX_PHYST0_CCK 0x0000 /* Frame type: CCK */ |
156 | #define B43_RX_PHYST0_OFDM 0x0001 /* Frame type: OFDM */ | 156 | #define B43_RX_PHYST0_OFDM 0x0001 /* Frame type: OFDM */ |
157 | #define B43_RX_PHYST0_PRE_N 0x0002 /* Pre-standard N-PHY frame */ | 157 | #define B43_RX_PHYST0_PRE_N 0x0002 /* Pre-standard N-PHY frame */ |
158 | #define B43_RX_PHYST0_STD_N 0x0003 /* Standard N-PHY frame */ | 158 | #define B43_RX_PHYST0_STD_N 0x0003 /* Standard N-PHY frame */ |
159 | 159 | ||
160 | /* PHY RX Status 2 */ | 160 | /* PHY RX Status 2 */ |
161 | #define B43_RX_PHYST2_LNAG 0xC000 /* LNA Gain */ | 161 | #define B43_RX_PHYST2_LNAG 0xC000 /* LNA Gain */ |
162 | #define B43_RX_PHYST2_LNAG_SHIFT 14 | 162 | #define B43_RX_PHYST2_LNAG_SHIFT 14 |
163 | #define B43_RX_PHYST2_PNAG 0x3C00 /* PNA Gain */ | 163 | #define B43_RX_PHYST2_PNAG 0x3C00 /* PNA Gain */ |
164 | #define B43_RX_PHYST2_PNAG_SHIFT 10 | 164 | #define B43_RX_PHYST2_PNAG_SHIFT 10 |
165 | #define B43_RX_PHYST2_FOFF 0x03FF /* F offset */ | 165 | #define B43_RX_PHYST2_FOFF 0x03FF /* F offset */ |
166 | 166 | ||
167 | /* PHY RX Status 3 */ | 167 | /* PHY RX Status 3 */ |
168 | #define B43_RX_PHYST3_DIGG 0x1800 /* DIG Gain */ | 168 | #define B43_RX_PHYST3_DIGG 0x1800 /* DIG Gain */ |
169 | #define B43_RX_PHYST3_DIGG_SHIFT 11 | 169 | #define B43_RX_PHYST3_DIGG_SHIFT 11 |
170 | #define B43_RX_PHYST3_TRSTATE 0x0400 /* TR state */ | 170 | #define B43_RX_PHYST3_TRSTATE 0x0400 /* TR state */ |
171 | 171 | ||
172 | /* MAC RX Status */ | 172 | /* MAC RX Status */ |
173 | #define B43_RX_MAC_BEACONSENT 0x00008000 /* Beacon send flag */ | 173 | #define B43_RX_MAC_RXST_VALID 0x01000000 /* PHY RXST valid */ |
174 | #define B43_RX_MAC_KEYIDX 0x000007E0 /* Key index */ | 174 | #define B43_RX_MAC_TKIP_MICERR 0x00100000 /* TKIP MIC error */ |
175 | #define B43_RX_MAC_KEYIDX_SHIFT 5 | 175 | #define B43_RX_MAC_TKIP_MICATT 0x00080000 /* TKIP MIC attempted */ |
176 | #define B43_RX_MAC_DECERR 0x00000010 /* Decrypt error */ | 176 | #define B43_RX_MAC_AGGTYPE 0x00060000 /* Aggregation type */ |
177 | #define B43_RX_MAC_DEC 0x00000008 /* Decryption attempted */ | 177 | #define B43_RX_MAC_AGGTYPE_SHIFT 17 |
178 | #define B43_RX_MAC_PADDING 0x00000004 /* Pad bytes present */ | 178 | #define B43_RX_MAC_AMSDU 0x00010000 /* A-MSDU mask */ |
179 | #define B43_RX_MAC_RESP 0x00000002 /* Response frame transmitted */ | 179 | #define B43_RX_MAC_BEACONSENT 0x00008000 /* Beacon sent flag */ |
180 | #define B43_RX_MAC_FCSERR 0x00000001 /* FCS error */ | 180 | #define B43_RX_MAC_KEYIDX 0x000007E0 /* Key index */ |
181 | #define B43_RX_MAC_KEYIDX_SHIFT 5 | ||
182 | #define B43_RX_MAC_DECERR 0x00000010 /* Decrypt error */ | ||
183 | #define B43_RX_MAC_DEC 0x00000008 /* Decryption attempted */ | ||
184 | #define B43_RX_MAC_PADDING 0x00000004 /* Pad bytes present */ | ||
185 | #define B43_RX_MAC_RESP 0x00000002 /* Response frame transmitted */ | ||
186 | #define B43_RX_MAC_FCSERR 0x00000001 /* FCS error */ | ||
181 | 187 | ||
182 | /* RX channel */ | 188 | /* RX channel */ |
183 | #define B43_RX_CHAN_GAIN 0xFC00 /* Gain */ | 189 | #define B43_RX_CHAN_40MHZ 0x1000 /* 40 Mhz channel width */ |
184 | #define B43_RX_CHAN_GAIN_SHIFT 10 | 190 | #define B43_RX_CHAN_5GHZ 0x0800 /* 5 Ghz band */ |
185 | #define B43_RX_CHAN_ID 0x03FC /* Channel ID */ | 191 | #define B43_RX_CHAN_ID 0x07F8 /* Channel ID */ |
186 | #define B43_RX_CHAN_ID_SHIFT 2 | 192 | #define B43_RX_CHAN_ID_SHIFT 3 |
187 | #define B43_RX_CHAN_PHYTYPE 0x0003 /* PHY type */ | 193 | #define B43_RX_CHAN_PHYTYPE 0x0007 /* PHY type */ |
194 | |||
188 | 195 | ||
189 | u8 b43_plcp_get_ratecode_cck(const u8 bitrate); | 196 | u8 b43_plcp_get_ratecode_cck(const u8 bitrate); |
190 | u8 b43_plcp_get_ratecode_ofdm(const u8 bitrate); | 197 | u8 b43_plcp_get_ratecode_ofdm(const u8 bitrate); |
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index 2a8fc431099f..bca37bf0f545 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c | |||
@@ -852,11 +852,6 @@ static int xennet_poll(struct napi_struct *napi, int budget) | |||
852 | 852 | ||
853 | spin_lock(&np->rx_lock); | 853 | spin_lock(&np->rx_lock); |
854 | 854 | ||
855 | if (unlikely(!netif_carrier_ok(dev))) { | ||
856 | spin_unlock(&np->rx_lock); | ||
857 | return 0; | ||
858 | } | ||
859 | |||
860 | skb_queue_head_init(&rxq); | 855 | skb_queue_head_init(&rxq); |
861 | skb_queue_head_init(&errq); | 856 | skb_queue_head_init(&errq); |
862 | skb_queue_head_init(&tmpq); | 857 | skb_queue_head_init(&tmpq); |
diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c index 146d540f6281..288640756099 100644 --- a/drivers/scsi/qla1280.c +++ b/drivers/scsi/qla1280.c | |||
@@ -3041,7 +3041,6 @@ qla1280_32bit_start_scsi(struct scsi_qla_host *ha, struct srb * sp) | |||
3041 | int cnt; | 3041 | int cnt; |
3042 | int req_cnt; | 3042 | int req_cnt; |
3043 | int seg_cnt; | 3043 | int seg_cnt; |
3044 | dma_addr_t dma_handle; | ||
3045 | u8 dir; | 3044 | u8 dir; |
3046 | 3045 | ||
3047 | ENTER("qla1280_32bit_start_scsi"); | 3046 | ENTER("qla1280_32bit_start_scsi"); |
@@ -3050,6 +3049,7 @@ qla1280_32bit_start_scsi(struct scsi_qla_host *ha, struct srb * sp) | |||
3050 | cmd->cmnd[0]); | 3049 | cmd->cmnd[0]); |
3051 | 3050 | ||
3052 | /* Calculate number of entries and segments required. */ | 3051 | /* Calculate number of entries and segments required. */ |
3052 | req_cnt = 1; | ||
3053 | seg_cnt = scsi_dma_map(cmd); | 3053 | seg_cnt = scsi_dma_map(cmd); |
3054 | if (seg_cnt) { | 3054 | if (seg_cnt) { |
3055 | /* | 3055 | /* |
diff --git a/drivers/spi/spi_bitbang.c b/drivers/spi/spi_bitbang.c index 81639c6be1c7..f7f8580edad8 100644 --- a/drivers/spi/spi_bitbang.c +++ b/drivers/spi/spi_bitbang.c | |||
@@ -184,6 +184,7 @@ int spi_bitbang_setup(struct spi_device *spi) | |||
184 | struct spi_bitbang_cs *cs = spi->controller_state; | 184 | struct spi_bitbang_cs *cs = spi->controller_state; |
185 | struct spi_bitbang *bitbang; | 185 | struct spi_bitbang *bitbang; |
186 | int retval; | 186 | int retval; |
187 | unsigned long flags; | ||
187 | 188 | ||
188 | bitbang = spi_master_get_devdata(spi->master); | 189 | bitbang = spi_master_get_devdata(spi->master); |
189 | 190 | ||
@@ -222,12 +223,12 @@ int spi_bitbang_setup(struct spi_device *spi) | |||
222 | */ | 223 | */ |
223 | 224 | ||
224 | /* deselect chip (low or high) */ | 225 | /* deselect chip (low or high) */ |
225 | spin_lock(&bitbang->lock); | 226 | spin_lock_irqsave(&bitbang->lock, flags); |
226 | if (!bitbang->busy) { | 227 | if (!bitbang->busy) { |
227 | bitbang->chipselect(spi, BITBANG_CS_INACTIVE); | 228 | bitbang->chipselect(spi, BITBANG_CS_INACTIVE); |
228 | ndelay(cs->nsecs); | 229 | ndelay(cs->nsecs); |
229 | } | 230 | } |
230 | spin_unlock(&bitbang->lock); | 231 | spin_unlock_irqrestore(&bitbang->lock, flags); |
231 | 232 | ||
232 | return 0; | 233 | return 0; |
233 | } | 234 | } |
diff --git a/drivers/ssb/scan.c b/drivers/ssb/scan.c index 96258c60919d..63ee5cfbefbb 100644 --- a/drivers/ssb/scan.c +++ b/drivers/ssb/scan.c | |||
@@ -388,6 +388,17 @@ int ssb_bus_scan(struct ssb_bus *bus, | |||
388 | case SSB_DEV_PCI: | 388 | case SSB_DEV_PCI: |
389 | case SSB_DEV_PCIE: | 389 | case SSB_DEV_PCIE: |
390 | #ifdef CONFIG_SSB_DRIVER_PCICORE | 390 | #ifdef CONFIG_SSB_DRIVER_PCICORE |
391 | if (bus->bustype == SSB_BUSTYPE_PCI) { | ||
392 | /* Ignore PCI cores on PCI-E cards. | ||
393 | * Ignore PCI-E cores on PCI cards. */ | ||
394 | if (dev->id.coreid == SSB_DEV_PCI) { | ||
395 | if (bus->host_pci->is_pcie) | ||
396 | continue; | ||
397 | } else { | ||
398 | if (!bus->host_pci->is_pcie) | ||
399 | continue; | ||
400 | } | ||
401 | } | ||
391 | if (bus->pcicore.dev) { | 402 | if (bus->pcicore.dev) { |
392 | ssb_printk(KERN_WARNING PFX | 403 | ssb_printk(KERN_WARNING PFX |
393 | "WARNING: Multiple PCI(E) cores found\n"); | 404 | "WARNING: Multiple PCI(E) cores found\n"); |
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index cf8add91de05..0da1df9c79bf 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c | |||
@@ -483,6 +483,13 @@ static void pl2303_set_termios(struct usb_serial_port *port, | |||
483 | } | 483 | } |
484 | spin_unlock_irqrestore(&priv->lock, flags); | 484 | spin_unlock_irqrestore(&priv->lock, flags); |
485 | 485 | ||
486 | /* The PL2303 is reported to lose bytes if you change | ||
487 | serial settings even to the same values as before. Thus | ||
488 | we actually need to filter in this specific case */ | ||
489 | |||
490 | if (!tty_termios_hw_change(port->tty->termios, old_termios)) | ||
491 | return; | ||
492 | |||
486 | cflag = port->tty->termios->c_cflag; | 493 | cflag = port->tty->termios->c_cflag; |
487 | 494 | ||
488 | buf = kzalloc(7, GFP_KERNEL); | 495 | buf = kzalloc(7, GFP_KERNEL); |
diff --git a/drivers/video/ps3fb.c b/drivers/video/ps3fb.c index b3128903d673..044a423a72cb 100644 --- a/drivers/video/ps3fb.c +++ b/drivers/video/ps3fb.c | |||
@@ -443,8 +443,6 @@ static int ps3fb_sync(struct fb_info *info, u32 frame) | |||
443 | u32 ddr_line_length, xdr_line_length; | 443 | u32 ddr_line_length, xdr_line_length; |
444 | u64 ddr_base, xdr_base; | 444 | u64 ddr_base, xdr_base; |
445 | 445 | ||
446 | acquire_console_sem(); | ||
447 | |||
448 | if (frame > par->num_frames - 1) { | 446 | if (frame > par->num_frames - 1) { |
449 | dev_dbg(info->device, "%s: invalid frame number (%u)\n", | 447 | dev_dbg(info->device, "%s: invalid frame number (%u)\n", |
450 | __func__, frame); | 448 | __func__, frame); |
@@ -464,7 +462,6 @@ static int ps3fb_sync(struct fb_info *info, u32 frame) | |||
464 | xdr_line_length); | 462 | xdr_line_length); |
465 | 463 | ||
466 | out: | 464 | out: |
467 | release_console_sem(); | ||
468 | return error; | 465 | return error; |
469 | } | 466 | } |
470 | 467 | ||
@@ -479,7 +476,10 @@ static int ps3fb_release(struct fb_info *info, int user) | |||
479 | if (atomic_dec_and_test(&ps3fb.f_count)) { | 476 | if (atomic_dec_and_test(&ps3fb.f_count)) { |
480 | if (atomic_read(&ps3fb.ext_flip)) { | 477 | if (atomic_read(&ps3fb.ext_flip)) { |
481 | atomic_set(&ps3fb.ext_flip, 0); | 478 | atomic_set(&ps3fb.ext_flip, 0); |
482 | ps3fb_sync(info, 0); /* single buffer */ | 479 | if (!try_acquire_console_sem()) { |
480 | ps3fb_sync(info, 0); /* single buffer */ | ||
481 | release_console_sem(); | ||
482 | } | ||
483 | } | 483 | } |
484 | } | 484 | } |
485 | return 0; | 485 | return 0; |
@@ -865,7 +865,9 @@ static int ps3fb_ioctl(struct fb_info *info, unsigned int cmd, | |||
865 | break; | 865 | break; |
866 | 866 | ||
867 | dev_dbg(info->device, "PS3FB_IOCTL_FSEL:%d\n", val); | 867 | dev_dbg(info->device, "PS3FB_IOCTL_FSEL:%d\n", val); |
868 | acquire_console_sem(); | ||
868 | retval = ps3fb_sync(info, val); | 869 | retval = ps3fb_sync(info, val); |
870 | release_console_sem(); | ||
869 | break; | 871 | break; |
870 | 872 | ||
871 | default: | 873 | default: |
@@ -885,7 +887,9 @@ static int ps3fbd(void *arg) | |||
885 | set_current_state(TASK_INTERRUPTIBLE); | 887 | set_current_state(TASK_INTERRUPTIBLE); |
886 | if (ps3fb.is_kicked) { | 888 | if (ps3fb.is_kicked) { |
887 | ps3fb.is_kicked = 0; | 889 | ps3fb.is_kicked = 0; |
890 | acquire_console_sem(); | ||
888 | ps3fb_sync(info, 0); /* single buffer */ | 891 | ps3fb_sync(info, 0); /* single buffer */ |
892 | release_console_sem(); | ||
889 | } | 893 | } |
890 | schedule(); | 894 | schedule(); |
891 | } | 895 | } |
@@ -1234,12 +1238,6 @@ static int ps3fb_shutdown(struct ps3_system_bus_device *dev) | |||
1234 | ps3fb_flip_ctl(0, &ps3fb); /* flip off */ | 1238 | ps3fb_flip_ctl(0, &ps3fb); /* flip off */ |
1235 | ps3fb.dinfo->irq.mask = 0; | 1239 | ps3fb.dinfo->irq.mask = 0; |
1236 | 1240 | ||
1237 | if (info) { | ||
1238 | unregister_framebuffer(info); | ||
1239 | fb_dealloc_cmap(&info->cmap); | ||
1240 | framebuffer_release(info); | ||
1241 | } | ||
1242 | |||
1243 | ps3av_register_flip_ctl(NULL, NULL); | 1241 | ps3av_register_flip_ctl(NULL, NULL); |
1244 | if (ps3fb.task) { | 1242 | if (ps3fb.task) { |
1245 | struct task_struct *task = ps3fb.task; | 1243 | struct task_struct *task = ps3fb.task; |
@@ -1250,6 +1248,12 @@ static int ps3fb_shutdown(struct ps3_system_bus_device *dev) | |||
1250 | free_irq(ps3fb.irq_no, &dev->core); | 1248 | free_irq(ps3fb.irq_no, &dev->core); |
1251 | ps3_irq_plug_destroy(ps3fb.irq_no); | 1249 | ps3_irq_plug_destroy(ps3fb.irq_no); |
1252 | } | 1250 | } |
1251 | if (info) { | ||
1252 | unregister_framebuffer(info); | ||
1253 | fb_dealloc_cmap(&info->cmap); | ||
1254 | framebuffer_release(info); | ||
1255 | info = dev->core.driver_data = NULL; | ||
1256 | } | ||
1253 | iounmap((u8 __iomem *)ps3fb.dinfo); | 1257 | iounmap((u8 __iomem *)ps3fb.dinfo); |
1254 | 1258 | ||
1255 | status = lv1_gpu_context_free(ps3fb.context_handle); | 1259 | status = lv1_gpu_context_free(ps3fb.context_handle); |
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index ba8de7ca260b..f0b3171842f2 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c | |||
@@ -1384,7 +1384,7 @@ static void fill_prstatus(struct elf_prstatus *prstatus, | |||
1384 | prstatus->pr_sigpend = p->pending.signal.sig[0]; | 1384 | prstatus->pr_sigpend = p->pending.signal.sig[0]; |
1385 | prstatus->pr_sighold = p->blocked.sig[0]; | 1385 | prstatus->pr_sighold = p->blocked.sig[0]; |
1386 | prstatus->pr_pid = task_pid_vnr(p); | 1386 | prstatus->pr_pid = task_pid_vnr(p); |
1387 | prstatus->pr_ppid = task_pid_vnr(p->parent); | 1387 | prstatus->pr_ppid = task_pid_vnr(p->real_parent); |
1388 | prstatus->pr_pgrp = task_pgrp_vnr(p); | 1388 | prstatus->pr_pgrp = task_pgrp_vnr(p); |
1389 | prstatus->pr_sid = task_session_vnr(p); | 1389 | prstatus->pr_sid = task_session_vnr(p); |
1390 | if (thread_group_leader(p)) { | 1390 | if (thread_group_leader(p)) { |
@@ -1430,7 +1430,7 @@ static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p, | |||
1430 | psinfo->pr_psargs[len] = 0; | 1430 | psinfo->pr_psargs[len] = 0; |
1431 | 1431 | ||
1432 | psinfo->pr_pid = task_pid_vnr(p); | 1432 | psinfo->pr_pid = task_pid_vnr(p); |
1433 | psinfo->pr_ppid = task_pid_vnr(p->parent); | 1433 | psinfo->pr_ppid = task_pid_vnr(p->real_parent); |
1434 | psinfo->pr_pgrp = task_pgrp_vnr(p); | 1434 | psinfo->pr_pgrp = task_pgrp_vnr(p); |
1435 | psinfo->pr_sid = task_session_vnr(p); | 1435 | psinfo->pr_sid = task_session_vnr(p); |
1436 | 1436 | ||
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 0b1ab016fa2e..5a719180983c 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c | |||
@@ -120,22 +120,9 @@ ecryptfs_do_create(struct inode *directory_inode, | |||
120 | rc = ecryptfs_create_underlying_file(lower_dir_dentry->d_inode, | 120 | rc = ecryptfs_create_underlying_file(lower_dir_dentry->d_inode, |
121 | ecryptfs_dentry, mode, nd); | 121 | ecryptfs_dentry, mode, nd); |
122 | if (rc) { | 122 | if (rc) { |
123 | struct inode *ecryptfs_inode = ecryptfs_dentry->d_inode; | 123 | printk(KERN_ERR "%s: Failure to create dentry in lower fs; " |
124 | struct ecryptfs_inode_info *inode_info = | 124 | "rc = [%d]\n", __FUNCTION__, rc); |
125 | ecryptfs_inode_to_private(ecryptfs_inode); | 125 | goto out_lock; |
126 | |||
127 | printk(KERN_WARNING "%s: Error creating underlying file; " | ||
128 | "rc = [%d]; checking for existing\n", __FUNCTION__, rc); | ||
129 | if (inode_info) { | ||
130 | mutex_lock(&inode_info->lower_file_mutex); | ||
131 | if (!inode_info->lower_file) { | ||
132 | mutex_unlock(&inode_info->lower_file_mutex); | ||
133 | printk(KERN_ERR "%s: Failure to set underlying " | ||
134 | "file; rc = [%d]\n", __FUNCTION__, rc); | ||
135 | goto out_lock; | ||
136 | } | ||
137 | mutex_unlock(&inode_info->lower_file_mutex); | ||
138 | } | ||
139 | } | 126 | } |
140 | rc = ecryptfs_interpose(lower_dentry, ecryptfs_dentry, | 127 | rc = ecryptfs_interpose(lower_dentry, ecryptfs_dentry, |
141 | directory_inode->i_sb, 0); | 128 | directory_inode->i_sb, 0); |
@@ -451,6 +438,7 @@ static int ecryptfs_unlink(struct inode *dir, struct dentry *dentry) | |||
451 | dentry->d_inode->i_nlink = | 438 | dentry->d_inode->i_nlink = |
452 | ecryptfs_inode_to_lower(dentry->d_inode)->i_nlink; | 439 | ecryptfs_inode_to_lower(dentry->d_inode)->i_nlink; |
453 | dentry->d_inode->i_ctime = dir->i_ctime; | 440 | dentry->d_inode->i_ctime = dir->i_ctime; |
441 | d_drop(dentry); | ||
454 | out_unlock: | 442 | out_unlock: |
455 | unlock_parent(lower_dentry); | 443 | unlock_parent(lower_dentry); |
456 | return rc; | 444 | return rc; |
diff --git a/fs/ecryptfs/super.c b/fs/ecryptfs/super.c index f8cdab2bee3d..4859c4eecd65 100644 --- a/fs/ecryptfs/super.c +++ b/fs/ecryptfs/super.c | |||
@@ -86,7 +86,6 @@ static void ecryptfs_destroy_inode(struct inode *inode) | |||
86 | fput(inode_info->lower_file); | 86 | fput(inode_info->lower_file); |
87 | inode_info->lower_file = NULL; | 87 | inode_info->lower_file = NULL; |
88 | d_drop(lower_dentry); | 88 | d_drop(lower_dentry); |
89 | d_delete(lower_dentry); | ||
90 | } | 89 | } |
91 | } | 90 | } |
92 | mutex_unlock(&inode_info->lower_file_mutex); | 91 | mutex_unlock(&inode_info->lower_file_mutex); |
diff --git a/fs/fat/fatent.c b/fs/fat/fatent.c index 2c1b73fb82ae..5fb366992b73 100644 --- a/fs/fat/fatent.c +++ b/fs/fat/fatent.c | |||
@@ -590,21 +590,49 @@ error: | |||
590 | 590 | ||
591 | EXPORT_SYMBOL_GPL(fat_free_clusters); | 591 | EXPORT_SYMBOL_GPL(fat_free_clusters); |
592 | 592 | ||
593 | /* 128kb is the whole sectors for FAT12 and FAT16 */ | ||
594 | #define FAT_READA_SIZE (128 * 1024) | ||
595 | |||
596 | static void fat_ent_reada(struct super_block *sb, struct fat_entry *fatent, | ||
597 | unsigned long reada_blocks) | ||
598 | { | ||
599 | struct fatent_operations *ops = MSDOS_SB(sb)->fatent_ops; | ||
600 | sector_t blocknr; | ||
601 | int i, offset; | ||
602 | |||
603 | ops->ent_blocknr(sb, fatent->entry, &offset, &blocknr); | ||
604 | |||
605 | for (i = 0; i < reada_blocks; i++) | ||
606 | sb_breadahead(sb, blocknr + i); | ||
607 | } | ||
608 | |||
593 | int fat_count_free_clusters(struct super_block *sb) | 609 | int fat_count_free_clusters(struct super_block *sb) |
594 | { | 610 | { |
595 | struct msdos_sb_info *sbi = MSDOS_SB(sb); | 611 | struct msdos_sb_info *sbi = MSDOS_SB(sb); |
596 | struct fatent_operations *ops = sbi->fatent_ops; | 612 | struct fatent_operations *ops = sbi->fatent_ops; |
597 | struct fat_entry fatent; | 613 | struct fat_entry fatent; |
614 | unsigned long reada_blocks, reada_mask, cur_block; | ||
598 | int err = 0, free; | 615 | int err = 0, free; |
599 | 616 | ||
600 | lock_fat(sbi); | 617 | lock_fat(sbi); |
601 | if (sbi->free_clusters != -1) | 618 | if (sbi->free_clusters != -1) |
602 | goto out; | 619 | goto out; |
603 | 620 | ||
621 | reada_blocks = FAT_READA_SIZE >> sb->s_blocksize_bits; | ||
622 | reada_mask = reada_blocks - 1; | ||
623 | cur_block = 0; | ||
624 | |||
604 | free = 0; | 625 | free = 0; |
605 | fatent_init(&fatent); | 626 | fatent_init(&fatent); |
606 | fatent_set_entry(&fatent, FAT_START_ENT); | 627 | fatent_set_entry(&fatent, FAT_START_ENT); |
607 | while (fatent.entry < sbi->max_cluster) { | 628 | while (fatent.entry < sbi->max_cluster) { |
629 | /* readahead of fat blocks */ | ||
630 | if ((cur_block & reada_mask) == 0) { | ||
631 | unsigned long rest = sbi->fat_length - cur_block; | ||
632 | fat_ent_reada(sb, &fatent, min(reada_blocks, rest)); | ||
633 | } | ||
634 | cur_block++; | ||
635 | |||
608 | err = fat_ent_read_block(sb, &fatent); | 636 | err = fat_ent_read_block(sb, &fatent); |
609 | if (err) | 637 | if (err) |
610 | goto out; | 638 | goto out; |
diff --git a/fs/hfs/bfind.c b/fs/hfs/bfind.c index f13f1494d4fe..f8452a0eab56 100644 --- a/fs/hfs/bfind.c +++ b/fs/hfs/bfind.c | |||
@@ -52,6 +52,10 @@ int __hfs_brec_find(struct hfs_bnode *bnode, struct hfs_find_data *fd) | |||
52 | rec = (e + b) / 2; | 52 | rec = (e + b) / 2; |
53 | len = hfs_brec_lenoff(bnode, rec, &off); | 53 | len = hfs_brec_lenoff(bnode, rec, &off); |
54 | keylen = hfs_brec_keylen(bnode, rec); | 54 | keylen = hfs_brec_keylen(bnode, rec); |
55 | if (keylen == HFS_BAD_KEYLEN) { | ||
56 | res = -EINVAL; | ||
57 | goto done; | ||
58 | } | ||
55 | hfs_bnode_read(bnode, fd->key, off, keylen); | 59 | hfs_bnode_read(bnode, fd->key, off, keylen); |
56 | cmpval = bnode->tree->keycmp(fd->key, fd->search_key); | 60 | cmpval = bnode->tree->keycmp(fd->key, fd->search_key); |
57 | if (!cmpval) { | 61 | if (!cmpval) { |
@@ -67,6 +71,10 @@ int __hfs_brec_find(struct hfs_bnode *bnode, struct hfs_find_data *fd) | |||
67 | if (rec != e && e >= 0) { | 71 | if (rec != e && e >= 0) { |
68 | len = hfs_brec_lenoff(bnode, e, &off); | 72 | len = hfs_brec_lenoff(bnode, e, &off); |
69 | keylen = hfs_brec_keylen(bnode, e); | 73 | keylen = hfs_brec_keylen(bnode, e); |
74 | if (keylen == HFS_BAD_KEYLEN) { | ||
75 | res = -EINVAL; | ||
76 | goto done; | ||
77 | } | ||
70 | hfs_bnode_read(bnode, fd->key, off, keylen); | 78 | hfs_bnode_read(bnode, fd->key, off, keylen); |
71 | } | 79 | } |
72 | done: | 80 | done: |
@@ -198,6 +206,10 @@ int hfs_brec_goto(struct hfs_find_data *fd, int cnt) | |||
198 | 206 | ||
199 | len = hfs_brec_lenoff(bnode, fd->record, &off); | 207 | len = hfs_brec_lenoff(bnode, fd->record, &off); |
200 | keylen = hfs_brec_keylen(bnode, fd->record); | 208 | keylen = hfs_brec_keylen(bnode, fd->record); |
209 | if (keylen == HFS_BAD_KEYLEN) { | ||
210 | res = -EINVAL; | ||
211 | goto out; | ||
212 | } | ||
201 | fd->keyoffset = off; | 213 | fd->keyoffset = off; |
202 | fd->keylength = keylen; | 214 | fd->keylength = keylen; |
203 | fd->entryoffset = off + keylen; | 215 | fd->entryoffset = off + keylen; |
diff --git a/fs/hfs/brec.c b/fs/hfs/brec.c index 5c87cf4801fc..8626ee375ea8 100644 --- a/fs/hfs/brec.c +++ b/fs/hfs/brec.c | |||
@@ -44,10 +44,21 @@ u16 hfs_brec_keylen(struct hfs_bnode *node, u16 rec) | |||
44 | recoff = hfs_bnode_read_u16(node, node->tree->node_size - (rec + 1) * 2); | 44 | recoff = hfs_bnode_read_u16(node, node->tree->node_size - (rec + 1) * 2); |
45 | if (!recoff) | 45 | if (!recoff) |
46 | return 0; | 46 | return 0; |
47 | if (node->tree->attributes & HFS_TREE_BIGKEYS) | 47 | if (node->tree->attributes & HFS_TREE_BIGKEYS) { |
48 | retval = hfs_bnode_read_u16(node, recoff) + 2; | 48 | retval = hfs_bnode_read_u16(node, recoff) + 2; |
49 | else | 49 | if (retval > node->tree->max_key_len + 2) { |
50 | printk(KERN_ERR "hfs: keylen %d too large\n", | ||
51 | retval); | ||
52 | retval = HFS_BAD_KEYLEN; | ||
53 | } | ||
54 | } else { | ||
50 | retval = (hfs_bnode_read_u8(node, recoff) | 1) + 1; | 55 | retval = (hfs_bnode_read_u8(node, recoff) | 1) + 1; |
56 | if (retval > node->tree->max_key_len + 1) { | ||
57 | printk(KERN_ERR "hfs: keylen %d too large\n", | ||
58 | retval); | ||
59 | retval = HFS_BAD_KEYLEN; | ||
60 | } | ||
61 | } | ||
51 | } | 62 | } |
52 | return retval; | 63 | return retval; |
53 | } | 64 | } |
diff --git a/fs/hfs/btree.c b/fs/hfs/btree.c index 8a3a650abc87..31284c77bba8 100644 --- a/fs/hfs/btree.c +++ b/fs/hfs/btree.c | |||
@@ -81,6 +81,17 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 id, btree_keycmp ke | |||
81 | goto fail_page; | 81 | goto fail_page; |
82 | if (!tree->node_count) | 82 | if (!tree->node_count) |
83 | goto fail_page; | 83 | goto fail_page; |
84 | if ((id == HFS_EXT_CNID) && (tree->max_key_len != HFS_MAX_EXT_KEYLEN)) { | ||
85 | printk(KERN_ERR "hfs: invalid extent max_key_len %d\n", | ||
86 | tree->max_key_len); | ||
87 | goto fail_page; | ||
88 | } | ||
89 | if ((id == HFS_CAT_CNID) && (tree->max_key_len != HFS_MAX_CAT_KEYLEN)) { | ||
90 | printk(KERN_ERR "hfs: invalid catalog max_key_len %d\n", | ||
91 | tree->max_key_len); | ||
92 | goto fail_page; | ||
93 | } | ||
94 | |||
84 | tree->node_size_shift = ffs(size) - 1; | 95 | tree->node_size_shift = ffs(size) - 1; |
85 | tree->pages_per_bnode = (tree->node_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; | 96 | tree->pages_per_bnode = (tree->node_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; |
86 | 97 | ||
@@ -89,9 +100,9 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 id, btree_keycmp ke | |||
89 | return tree; | 100 | return tree; |
90 | 101 | ||
91 | fail_page: | 102 | fail_page: |
92 | tree->inode->i_mapping->a_ops = &hfs_aops; | ||
93 | page_cache_release(page); | 103 | page_cache_release(page); |
94 | free_tree: | 104 | free_tree: |
105 | tree->inode->i_mapping->a_ops = &hfs_aops; | ||
95 | iput(tree->inode); | 106 | iput(tree->inode); |
96 | kfree(tree); | 107 | kfree(tree); |
97 | return NULL; | 108 | return NULL; |
diff --git a/fs/hfs/hfs.h b/fs/hfs/hfs.h index 1445e3a56ed4..c6aae61adfe6 100644 --- a/fs/hfs/hfs.h +++ b/fs/hfs/hfs.h | |||
@@ -28,6 +28,8 @@ | |||
28 | #define HFS_MAX_NAMELEN 128 | 28 | #define HFS_MAX_NAMELEN 128 |
29 | #define HFS_MAX_VALENCE 32767U | 29 | #define HFS_MAX_VALENCE 32767U |
30 | 30 | ||
31 | #define HFS_BAD_KEYLEN 0xFF | ||
32 | |||
31 | /* Meanings of the drAtrb field of the MDB, | 33 | /* Meanings of the drAtrb field of the MDB, |
32 | * Reference: _Inside Macintosh: Files_ p. 2-61 | 34 | * Reference: _Inside Macintosh: Files_ p. 2-61 |
33 | */ | 35 | */ |
@@ -167,6 +169,9 @@ typedef union hfs_btree_key { | |||
167 | struct hfs_ext_key ext; | 169 | struct hfs_ext_key ext; |
168 | } hfs_btree_key; | 170 | } hfs_btree_key; |
169 | 171 | ||
172 | #define HFS_MAX_CAT_KEYLEN (sizeof(struct hfs_cat_key) - sizeof(u8)) | ||
173 | #define HFS_MAX_EXT_KEYLEN (sizeof(struct hfs_ext_key) - sizeof(u8)) | ||
174 | |||
170 | typedef union hfs_btree_key btree_key; | 175 | typedef union hfs_btree_key btree_key; |
171 | 176 | ||
172 | struct hfs_extent { | 177 | struct hfs_extent { |
diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h index b35069a2aa9e..bd1b9d663fb9 100644 --- a/fs/nfs/nfs4_fs.h +++ b/fs/nfs/nfs4_fs.h | |||
@@ -115,6 +115,7 @@ struct nfs4_lock_state { | |||
115 | #define NFS_LOCK_INITIALIZED 1 | 115 | #define NFS_LOCK_INITIALIZED 1 |
116 | int ls_flags; | 116 | int ls_flags; |
117 | struct nfs_seqid_counter ls_seqid; | 117 | struct nfs_seqid_counter ls_seqid; |
118 | struct rpc_sequence ls_sequence; | ||
118 | struct nfs_unique_id ls_id; | 119 | struct nfs_unique_id ls_id; |
119 | nfs4_stateid ls_stateid; | 120 | nfs4_stateid ls_stateid; |
120 | atomic_t ls_count; | 121 | atomic_t ls_count; |
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index 23a9a36556bf..5a39c6f78acf 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c | |||
@@ -509,7 +509,10 @@ static struct nfs4_lock_state *nfs4_alloc_lock_state(struct nfs4_state *state, f | |||
509 | lsp = kzalloc(sizeof(*lsp), GFP_KERNEL); | 509 | lsp = kzalloc(sizeof(*lsp), GFP_KERNEL); |
510 | if (lsp == NULL) | 510 | if (lsp == NULL) |
511 | return NULL; | 511 | return NULL; |
512 | lsp->ls_seqid.sequence = &state->owner->so_sequence; | 512 | rpc_init_wait_queue(&lsp->ls_sequence.wait, "lock_seqid_waitqueue"); |
513 | spin_lock_init(&lsp->ls_sequence.lock); | ||
514 | INIT_LIST_HEAD(&lsp->ls_sequence.list); | ||
515 | lsp->ls_seqid.sequence = &lsp->ls_sequence; | ||
513 | atomic_set(&lsp->ls_count, 1); | 516 | atomic_set(&lsp->ls_count, 1); |
514 | lsp->ls_owner = fl_owner; | 517 | lsp->ls_owner = fl_owner; |
515 | spin_lock(&clp->cl_lock); | 518 | spin_lock(&clp->cl_lock); |
diff --git a/include/linux/key.h b/include/linux/key.h index fcdbd5ed227b..a70b8a8f2005 100644 --- a/include/linux/key.h +++ b/include/linux/key.h | |||
@@ -290,7 +290,7 @@ extern void key_init(void); | |||
290 | #define key_get(k) ({ NULL; }) | 290 | #define key_get(k) ({ NULL; }) |
291 | #define key_put(k) do { } while(0) | 291 | #define key_put(k) do { } while(0) |
292 | #define key_ref_put(k) do { } while(0) | 292 | #define key_ref_put(k) do { } while(0) |
293 | #define make_key_ref(k) ({ NULL; }) | 293 | #define make_key_ref(k, p) ({ NULL; }) |
294 | #define key_ref_to_ptr(k) ({ NULL; }) | 294 | #define key_ref_to_ptr(k) ({ NULL; }) |
295 | #define is_key_possessed(k) 0 | 295 | #define is_key_possessed(k) 0 |
296 | #define alloc_uid_keyring(u,c) 0 | 296 | #define alloc_uid_keyring(u,c) 0 |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 1e6af4f174b6..b0813c3286b1 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -319,21 +319,29 @@ struct napi_struct { | |||
319 | enum | 319 | enum |
320 | { | 320 | { |
321 | NAPI_STATE_SCHED, /* Poll is scheduled */ | 321 | NAPI_STATE_SCHED, /* Poll is scheduled */ |
322 | NAPI_STATE_DISABLE, /* Disable pending */ | ||
322 | }; | 323 | }; |
323 | 324 | ||
324 | extern void FASTCALL(__napi_schedule(struct napi_struct *n)); | 325 | extern void FASTCALL(__napi_schedule(struct napi_struct *n)); |
325 | 326 | ||
327 | static inline int napi_disable_pending(struct napi_struct *n) | ||
328 | { | ||
329 | return test_bit(NAPI_STATE_DISABLE, &n->state); | ||
330 | } | ||
331 | |||
326 | /** | 332 | /** |
327 | * napi_schedule_prep - check if napi can be scheduled | 333 | * napi_schedule_prep - check if napi can be scheduled |
328 | * @n: napi context | 334 | * @n: napi context |
329 | * | 335 | * |
330 | * Test if NAPI routine is already running, and if not mark | 336 | * Test if NAPI routine is already running, and if not mark |
331 | * it as running. This is used as a condition variable | 337 | * it as running. This is used as a condition variable |
332 | * insure only one NAPI poll instance runs | 338 | * insure only one NAPI poll instance runs. We also make |
339 | * sure there is no pending NAPI disable. | ||
333 | */ | 340 | */ |
334 | static inline int napi_schedule_prep(struct napi_struct *n) | 341 | static inline int napi_schedule_prep(struct napi_struct *n) |
335 | { | 342 | { |
336 | return !test_and_set_bit(NAPI_STATE_SCHED, &n->state); | 343 | return !napi_disable_pending(n) && |
344 | !test_and_set_bit(NAPI_STATE_SCHED, &n->state); | ||
337 | } | 345 | } |
338 | 346 | ||
339 | /** | 347 | /** |
@@ -389,8 +397,10 @@ static inline void napi_complete(struct napi_struct *n) | |||
389 | */ | 397 | */ |
390 | static inline void napi_disable(struct napi_struct *n) | 398 | static inline void napi_disable(struct napi_struct *n) |
391 | { | 399 | { |
400 | set_bit(NAPI_STATE_DISABLE, &n->state); | ||
392 | while (test_and_set_bit(NAPI_STATE_SCHED, &n->state)) | 401 | while (test_and_set_bit(NAPI_STATE_SCHED, &n->state)) |
393 | msleep(1); | 402 | msleep(1); |
403 | clear_bit(NAPI_STATE_DISABLE, &n->state); | ||
394 | } | 404 | } |
395 | 405 | ||
396 | /** | 406 | /** |
@@ -1268,7 +1278,7 @@ static inline u32 netif_msg_init(int debug_value, int default_msg_enable_bits) | |||
1268 | static inline int netif_rx_schedule_prep(struct net_device *dev, | 1278 | static inline int netif_rx_schedule_prep(struct net_device *dev, |
1269 | struct napi_struct *napi) | 1279 | struct napi_struct *napi) |
1270 | { | 1280 | { |
1271 | return netif_running(dev) && napi_schedule_prep(napi); | 1281 | return napi_schedule_prep(napi); |
1272 | } | 1282 | } |
1273 | 1283 | ||
1274 | /* Add interface to tail of rx poll list. This assumes that _prep has | 1284 | /* Add interface to tail of rx poll list. This assumes that _prep has |
@@ -1277,7 +1287,6 @@ static inline int netif_rx_schedule_prep(struct net_device *dev, | |||
1277 | static inline void __netif_rx_schedule(struct net_device *dev, | 1287 | static inline void __netif_rx_schedule(struct net_device *dev, |
1278 | struct napi_struct *napi) | 1288 | struct napi_struct *napi) |
1279 | { | 1289 | { |
1280 | dev_hold(dev); | ||
1281 | __napi_schedule(napi); | 1290 | __napi_schedule(napi); |
1282 | } | 1291 | } |
1283 | 1292 | ||
@@ -1308,7 +1317,6 @@ static inline void __netif_rx_complete(struct net_device *dev, | |||
1308 | struct napi_struct *napi) | 1317 | struct napi_struct *napi) |
1309 | { | 1318 | { |
1310 | __napi_complete(napi); | 1319 | __napi_complete(napi); |
1311 | dev_put(dev); | ||
1312 | } | 1320 | } |
1313 | 1321 | ||
1314 | /* Remove interface from poll list: it must be in the poll list | 1322 | /* Remove interface from poll list: it must be in the poll list |
diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h index 416e000dfe81..e3ff21dbac53 100644 --- a/include/linux/scatterlist.h +++ b/include/linux/scatterlist.h | |||
@@ -191,8 +191,8 @@ static inline void sg_chain(struct scatterlist *prv, unsigned int prv_nents, | |||
191 | /* | 191 | /* |
192 | * offset and length are unused for chain entry. Clear them. | 192 | * offset and length are unused for chain entry. Clear them. |
193 | */ | 193 | */ |
194 | prv->offset = 0; | 194 | prv[prv_nents - 1].offset = 0; |
195 | prv->length = 0; | 195 | prv[prv_nents - 1].length = 0; |
196 | 196 | ||
197 | /* | 197 | /* |
198 | * Set lowest bit to indicate a link pointer, and make sure to clear | 198 | * Set lowest bit to indicate a link pointer, and make sure to clear |
diff --git a/include/linux/tty.h b/include/linux/tty.h index c555f5442bd7..defd2ab72449 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h | |||
@@ -319,6 +319,7 @@ extern speed_t tty_termios_input_baud_rate(struct ktermios *termios); | |||
319 | extern void tty_termios_encode_baud_rate(struct ktermios *termios, speed_t ibaud, speed_t obaud); | 319 | extern void tty_termios_encode_baud_rate(struct ktermios *termios, speed_t ibaud, speed_t obaud); |
320 | extern void tty_encode_baud_rate(struct tty_struct *tty, speed_t ibaud, speed_t obaud); | 320 | extern void tty_encode_baud_rate(struct tty_struct *tty, speed_t ibaud, speed_t obaud); |
321 | extern void tty_termios_copy_hw(struct ktermios *new, struct ktermios *old); | 321 | extern void tty_termios_copy_hw(struct ktermios *new, struct ktermios *old); |
322 | extern int tty_termios_hw_change(struct ktermios *a, struct ktermios *b); | ||
322 | 323 | ||
323 | extern struct tty_ldisc *tty_ldisc_ref(struct tty_struct *); | 324 | extern struct tty_ldisc *tty_ldisc_ref(struct tty_struct *); |
324 | extern void tty_ldisc_deref(struct tty_ldisc *); | 325 | extern void tty_ldisc_deref(struct tty_ldisc *); |
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index c9265518a378..4c3b35153c37 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h | |||
@@ -325,7 +325,6 @@ static inline struct sk_buff *skb_act_clone(struct sk_buff *skb, gfp_t gfp_mask) | |||
325 | n->tc_verd = SET_TC_VERD(n->tc_verd, 0); | 325 | n->tc_verd = SET_TC_VERD(n->tc_verd, 0); |
326 | n->tc_verd = CLR_TC_OK2MUNGE(n->tc_verd); | 326 | n->tc_verd = CLR_TC_OK2MUNGE(n->tc_verd); |
327 | n->tc_verd = CLR_TC_MUNGED(n->tc_verd); | 327 | n->tc_verd = CLR_TC_MUNGED(n->tc_verd); |
328 | n->iif = skb->iif; | ||
329 | } | 328 | } |
330 | return n; | 329 | return n; |
331 | } | 330 | } |
diff --git a/include/net/sctp/user.h b/include/net/sctp/user.h index 00848b641f59..954090b1e354 100644 --- a/include/net/sctp/user.h +++ b/include/net/sctp/user.h | |||
@@ -450,7 +450,7 @@ enum sctp_sn_type { | |||
450 | SCTP_SHUTDOWN_EVENT, | 450 | SCTP_SHUTDOWN_EVENT, |
451 | SCTP_PARTIAL_DELIVERY_EVENT, | 451 | SCTP_PARTIAL_DELIVERY_EVENT, |
452 | SCTP_ADAPTATION_INDICATION, | 452 | SCTP_ADAPTATION_INDICATION, |
453 | SCTP_AUTHENTICATION_EVENT, | 453 | SCTP_AUTHENTICATION_INDICATION, |
454 | }; | 454 | }; |
455 | 455 | ||
456 | /* Notification error codes used to fill up the error fields in some | 456 | /* Notification error codes used to fill up the error fields in some |
diff --git a/include/net/sock.h b/include/net/sock.h index 67e35c7e230c..6e1542da33a1 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -944,7 +944,7 @@ static inline int sk_filter(struct sock *sk, struct sk_buff *skb) | |||
944 | return err; | 944 | return err; |
945 | 945 | ||
946 | rcu_read_lock_bh(); | 946 | rcu_read_lock_bh(); |
947 | filter = sk->sk_filter; | 947 | filter = rcu_dereference(sk->sk_filter); |
948 | if (filter) { | 948 | if (filter) { |
949 | unsigned int pkt_len = sk_run_filter(skb, filter->insns, | 949 | unsigned int pkt_len = sk_run_filter(skb, filter->insns, |
950 | filter->len); | 950 | filter->len); |
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 58dfa82889aa..1dd20cf17982 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
@@ -1188,10 +1188,15 @@ static inline int xfrm_aevent_is_on(void) | |||
1188 | return ret; | 1188 | return ret; |
1189 | } | 1189 | } |
1190 | 1190 | ||
1191 | static inline int xfrm_alg_len(struct xfrm_algo *alg) | ||
1192 | { | ||
1193 | return sizeof(*alg) + ((alg->alg_key_len + 7) / 8); | ||
1194 | } | ||
1195 | |||
1191 | #ifdef CONFIG_XFRM_MIGRATE | 1196 | #ifdef CONFIG_XFRM_MIGRATE |
1192 | static inline struct xfrm_algo *xfrm_algo_clone(struct xfrm_algo *orig) | 1197 | static inline struct xfrm_algo *xfrm_algo_clone(struct xfrm_algo *orig) |
1193 | { | 1198 | { |
1194 | return (struct xfrm_algo *)kmemdup(orig, sizeof(*orig) + orig->alg_key_len, GFP_KERNEL); | 1199 | return kmemdup(orig, xfrm_alg_len(orig), GFP_KERNEL); |
1195 | } | 1200 | } |
1196 | 1201 | ||
1197 | static inline void xfrm_states_put(struct xfrm_state **states, int n) | 1202 | static inline void xfrm_states_put(struct xfrm_state **states, int n) |
diff --git a/kernel/acct.c b/kernel/acct.c index cf19547cc9e4..521dfa53cb99 100644 --- a/kernel/acct.c +++ b/kernel/acct.c | |||
@@ -482,7 +482,7 @@ static void do_acct_process(struct file *file) | |||
482 | #endif | 482 | #endif |
483 | #if ACCT_VERSION==3 | 483 | #if ACCT_VERSION==3 |
484 | ac.ac_pid = current->tgid; | 484 | ac.ac_pid = current->tgid; |
485 | ac.ac_ppid = current->parent->tgid; | 485 | ac.ac_ppid = current->real_parent->tgid; |
486 | #endif | 486 | #endif |
487 | 487 | ||
488 | spin_lock_irq(¤t->sighand->siglock); | 488 | spin_lock_irq(¤t->sighand->siglock); |
diff --git a/kernel/futex.c b/kernel/futex.c index 172a1aeeafdb..db9824de8bf0 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
@@ -1097,15 +1097,15 @@ static void unqueue_me_pi(struct futex_q *q) | |||
1097 | } | 1097 | } |
1098 | 1098 | ||
1099 | /* | 1099 | /* |
1100 | * Fixup the pi_state owner with current. | 1100 | * Fixup the pi_state owner with the new owner. |
1101 | * | 1101 | * |
1102 | * Must be called with hash bucket lock held and mm->sem held for non | 1102 | * Must be called with hash bucket lock held and mm->sem held for non |
1103 | * private futexes. | 1103 | * private futexes. |
1104 | */ | 1104 | */ |
1105 | static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, | 1105 | static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, |
1106 | struct task_struct *curr) | 1106 | struct task_struct *newowner) |
1107 | { | 1107 | { |
1108 | u32 newtid = task_pid_vnr(curr) | FUTEX_WAITERS; | 1108 | u32 newtid = task_pid_vnr(newowner) | FUTEX_WAITERS; |
1109 | struct futex_pi_state *pi_state = q->pi_state; | 1109 | struct futex_pi_state *pi_state = q->pi_state; |
1110 | u32 uval, curval, newval; | 1110 | u32 uval, curval, newval; |
1111 | int ret; | 1111 | int ret; |
@@ -1119,12 +1119,12 @@ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, | |||
1119 | } else | 1119 | } else |
1120 | newtid |= FUTEX_OWNER_DIED; | 1120 | newtid |= FUTEX_OWNER_DIED; |
1121 | 1121 | ||
1122 | pi_state->owner = curr; | 1122 | pi_state->owner = newowner; |
1123 | 1123 | ||
1124 | spin_lock_irq(&curr->pi_lock); | 1124 | spin_lock_irq(&newowner->pi_lock); |
1125 | WARN_ON(!list_empty(&pi_state->list)); | 1125 | WARN_ON(!list_empty(&pi_state->list)); |
1126 | list_add(&pi_state->list, &curr->pi_state_list); | 1126 | list_add(&pi_state->list, &newowner->pi_state_list); |
1127 | spin_unlock_irq(&curr->pi_lock); | 1127 | spin_unlock_irq(&newowner->pi_lock); |
1128 | 1128 | ||
1129 | /* | 1129 | /* |
1130 | * We own it, so we have to replace the pending owner | 1130 | * We own it, so we have to replace the pending owner |
@@ -1508,9 +1508,40 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared, | |||
1508 | * when we were on the way back before we locked the | 1508 | * when we were on the way back before we locked the |
1509 | * hash bucket. | 1509 | * hash bucket. |
1510 | */ | 1510 | */ |
1511 | if (q.pi_state->owner == curr && | 1511 | if (q.pi_state->owner == curr) { |
1512 | rt_mutex_trylock(&q.pi_state->pi_mutex)) { | 1512 | /* |
1513 | ret = 0; | 1513 | * Try to get the rt_mutex now. This might |
1514 | * fail as some other task acquired the | ||
1515 | * rt_mutex after we removed ourself from the | ||
1516 | * rt_mutex waiters list. | ||
1517 | */ | ||
1518 | if (rt_mutex_trylock(&q.pi_state->pi_mutex)) | ||
1519 | ret = 0; | ||
1520 | else { | ||
1521 | /* | ||
1522 | * pi_state is incorrect, some other | ||
1523 | * task did a lock steal and we | ||
1524 | * returned due to timeout or signal | ||
1525 | * without taking the rt_mutex. Too | ||
1526 | * late. We can access the | ||
1527 | * rt_mutex_owner without locking, as | ||
1528 | * the other task is now blocked on | ||
1529 | * the hash bucket lock. Fix the state | ||
1530 | * up. | ||
1531 | */ | ||
1532 | struct task_struct *owner; | ||
1533 | int res; | ||
1534 | |||
1535 | owner = rt_mutex_owner(&q.pi_state->pi_mutex); | ||
1536 | res = fixup_pi_state_owner(uaddr, &q, owner); | ||
1537 | |||
1538 | WARN_ON(rt_mutex_owner(&q.pi_state->pi_mutex) != | ||
1539 | owner); | ||
1540 | |||
1541 | /* propagate -EFAULT, if the fixup failed */ | ||
1542 | if (res) | ||
1543 | ret = res; | ||
1544 | } | ||
1514 | } else { | 1545 | } else { |
1515 | /* | 1546 | /* |
1516 | * Paranoia check. If we did not take the lock | 1547 | * Paranoia check. If we did not take the lock |
diff --git a/kernel/kexec.c b/kernel/kexec.c index aa74a1ef2da8..9a26eec9eb04 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c | |||
@@ -1404,6 +1404,7 @@ static int __init crash_save_vmcoreinfo_init(void) | |||
1404 | VMCOREINFO_OFFSET(list_head, next); | 1404 | VMCOREINFO_OFFSET(list_head, next); |
1405 | VMCOREINFO_OFFSET(list_head, prev); | 1405 | VMCOREINFO_OFFSET(list_head, prev); |
1406 | VMCOREINFO_LENGTH(zone.free_area, MAX_ORDER); | 1406 | VMCOREINFO_LENGTH(zone.free_area, MAX_ORDER); |
1407 | VMCOREINFO_LENGTH(free_area.free_list, MIGRATE_TYPES); | ||
1407 | VMCOREINFO_NUMBER(NR_FREE_PAGES); | 1408 | VMCOREINFO_NUMBER(NR_FREE_PAGES); |
1408 | 1409 | ||
1409 | arch_crash_save_vmcoreinfo(); | 1410 | arch_crash_save_vmcoreinfo(); |
diff --git a/kernel/sched.c b/kernel/sched.c index 3df84ea6aba9..37cf07aa4164 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -4918,7 +4918,7 @@ static void show_task(struct task_struct *p) | |||
4918 | } | 4918 | } |
4919 | #endif | 4919 | #endif |
4920 | printk(KERN_CONT "%5lu %5d %6d\n", free, | 4920 | printk(KERN_CONT "%5lu %5d %6d\n", free, |
4921 | task_pid_nr(p), task_pid_nr(p->parent)); | 4921 | task_pid_nr(p), task_pid_nr(p->real_parent)); |
4922 | 4922 | ||
4923 | if (state != TASK_RUNNING) | 4923 | if (state != TASK_RUNNING) |
4924 | show_stack(p, NULL); | 4924 | show_stack(p, NULL); |
diff --git a/mm/filemap_xip.c b/mm/filemap_xip.c index e233fff61b4b..f874ae818ad3 100644 --- a/mm/filemap_xip.c +++ b/mm/filemap_xip.c | |||
@@ -25,14 +25,15 @@ static struct page *__xip_sparse_page; | |||
25 | static struct page *xip_sparse_page(void) | 25 | static struct page *xip_sparse_page(void) |
26 | { | 26 | { |
27 | if (!__xip_sparse_page) { | 27 | if (!__xip_sparse_page) { |
28 | unsigned long zeroes = get_zeroed_page(GFP_HIGHUSER); | 28 | struct page *page = alloc_page(GFP_HIGHUSER | __GFP_ZERO); |
29 | if (zeroes) { | 29 | |
30 | if (page) { | ||
30 | static DEFINE_SPINLOCK(xip_alloc_lock); | 31 | static DEFINE_SPINLOCK(xip_alloc_lock); |
31 | spin_lock(&xip_alloc_lock); | 32 | spin_lock(&xip_alloc_lock); |
32 | if (!__xip_sparse_page) | 33 | if (!__xip_sparse_page) |
33 | __xip_sparse_page = virt_to_page(zeroes); | 34 | __xip_sparse_page = page; |
34 | else | 35 | else |
35 | free_page(zeroes); | 36 | __free_page(page); |
36 | spin_unlock(&xip_alloc_lock); | 37 | spin_unlock(&xip_alloc_lock); |
37 | } | 38 | } |
38 | } | 39 | } |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index d73bfad1c32f..e1028fae3ebb 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -3438,7 +3438,7 @@ static void __init_refok alloc_node_mem_map(struct pglist_data *pgdat) | |||
3438 | mem_map = NODE_DATA(0)->node_mem_map; | 3438 | mem_map = NODE_DATA(0)->node_mem_map; |
3439 | #ifdef CONFIG_ARCH_POPULATES_NODE_MAP | 3439 | #ifdef CONFIG_ARCH_POPULATES_NODE_MAP |
3440 | if (page_to_pfn(mem_map) != pgdat->node_start_pfn) | 3440 | if (page_to_pfn(mem_map) != pgdat->node_start_pfn) |
3441 | mem_map -= pgdat->node_start_pfn; | 3441 | mem_map -= (pgdat->node_start_pfn - ARCH_PFN_OFFSET); |
3442 | #endif /* CONFIG_ARCH_POPULATES_NODE_MAP */ | 3442 | #endif /* CONFIG_ARCH_POPULATES_NODE_MAP */ |
3443 | } | 3443 | } |
3444 | #endif | 3444 | #endif |
diff --git a/net/atm/mpc.c b/net/atm/mpc.c index 2086396de177..9c7f712fc7e9 100644 --- a/net/atm/mpc.c +++ b/net/atm/mpc.c | |||
@@ -542,6 +542,13 @@ static int mpc_send_packet(struct sk_buff *skb, struct net_device *dev) | |||
542 | if (eth->h_proto != htons(ETH_P_IP)) | 542 | if (eth->h_proto != htons(ETH_P_IP)) |
543 | goto non_ip; /* Multi-Protocol Over ATM :-) */ | 543 | goto non_ip; /* Multi-Protocol Over ATM :-) */ |
544 | 544 | ||
545 | /* Weed out funny packets (e.g., AF_PACKET or raw). */ | ||
546 | if (skb->len < ETH_HLEN + sizeof(struct iphdr)) | ||
547 | goto non_ip; | ||
548 | skb_set_network_header(skb, ETH_HLEN); | ||
549 | if (skb->len < ETH_HLEN + ip_hdr(skb)->ihl * 4 || ip_hdr(skb)->ihl < 5) | ||
550 | goto non_ip; | ||
551 | |||
545 | while (i < mpc->number_of_mps_macs) { | 552 | while (i < mpc->number_of_mps_macs) { |
546 | if (!compare_ether_addr(eth->h_dest, (mpc->mps_macs + i*ETH_ALEN))) | 553 | if (!compare_ether_addr(eth->h_dest, (mpc->mps_macs + i*ETH_ALEN))) |
547 | if ( send_via_shortcut(skb, mpc) == 0 ) /* try shortcut */ | 554 | if ( send_via_shortcut(skb, mpc) == 0 ) /* try shortcut */ |
diff --git a/net/core/dev.c b/net/core/dev.c index be9d3015beaa..0879f52115eb 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -2207,8 +2207,12 @@ static void net_rx_action(struct softirq_action *h) | |||
2207 | * still "owns" the NAPI instance and therefore can | 2207 | * still "owns" the NAPI instance and therefore can |
2208 | * move the instance around on the list at-will. | 2208 | * move the instance around on the list at-will. |
2209 | */ | 2209 | */ |
2210 | if (unlikely(work == weight)) | 2210 | if (unlikely(work == weight)) { |
2211 | list_move_tail(&n->poll_list, list); | 2211 | if (unlikely(napi_disable_pending(n))) |
2212 | __napi_complete(n); | ||
2213 | else | ||
2214 | list_move_tail(&n->poll_list, list); | ||
2215 | } | ||
2212 | 2216 | ||
2213 | netpoll_poll_unlock(have); | 2217 | netpoll_poll_unlock(have); |
2214 | } | 2218 | } |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 5b4ce9b4dd20..b6283779e93d 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -416,16 +416,17 @@ static struct sk_buff *__skb_clone(struct sk_buff *n, struct sk_buff *skb) | |||
416 | C(len); | 416 | C(len); |
417 | C(data_len); | 417 | C(data_len); |
418 | C(mac_len); | 418 | C(mac_len); |
419 | n->cloned = 1; | ||
420 | n->hdr_len = skb->nohdr ? skb_headroom(skb) : skb->hdr_len; | 419 | n->hdr_len = skb->nohdr ? skb_headroom(skb) : skb->hdr_len; |
420 | n->cloned = 1; | ||
421 | n->nohdr = 0; | 421 | n->nohdr = 0; |
422 | n->destructor = NULL; | 422 | n->destructor = NULL; |
423 | C(truesize); | 423 | C(iif); |
424 | atomic_set(&n->users, 1); | ||
425 | C(head); | ||
426 | C(data); | ||
427 | C(tail); | 424 | C(tail); |
428 | C(end); | 425 | C(end); |
426 | C(head); | ||
427 | C(data); | ||
428 | C(truesize); | ||
429 | atomic_set(&n->users, 1); | ||
429 | 430 | ||
430 | atomic_inc(&(skb_shinfo(skb)->dataref)); | 431 | atomic_inc(&(skb_shinfo(skb)->dataref)); |
431 | skb->cloned = 1; | 432 | skb->cloned = 1; |
diff --git a/net/ipv4/inet_lro.c b/net/ipv4/inet_lro.c index 9a96c277393d..4a4d49fca1f2 100644 --- a/net/ipv4/inet_lro.c +++ b/net/ipv4/inet_lro.c | |||
@@ -310,7 +310,7 @@ static void lro_flush(struct net_lro_mgr *lro_mgr, | |||
310 | skb_shinfo(lro_desc->parent)->gso_size = lro_desc->mss; | 310 | skb_shinfo(lro_desc->parent)->gso_size = lro_desc->mss; |
311 | 311 | ||
312 | if (lro_desc->vgrp) { | 312 | if (lro_desc->vgrp) { |
313 | if (test_bit(LRO_F_NAPI, &lro_mgr->features)) | 313 | if (lro_mgr->features & LRO_F_NAPI) |
314 | vlan_hwaccel_receive_skb(lro_desc->parent, | 314 | vlan_hwaccel_receive_skb(lro_desc->parent, |
315 | lro_desc->vgrp, | 315 | lro_desc->vgrp, |
316 | lro_desc->vlan_tag); | 316 | lro_desc->vlan_tag); |
@@ -320,7 +320,7 @@ static void lro_flush(struct net_lro_mgr *lro_mgr, | |||
320 | lro_desc->vlan_tag); | 320 | lro_desc->vlan_tag); |
321 | 321 | ||
322 | } else { | 322 | } else { |
323 | if (test_bit(LRO_F_NAPI, &lro_mgr->features)) | 323 | if (lro_mgr->features & LRO_F_NAPI) |
324 | netif_receive_skb(lro_desc->parent); | 324 | netif_receive_skb(lro_desc->parent); |
325 | else | 325 | else |
326 | netif_rx(lro_desc->parent); | 326 | netif_rx(lro_desc->parent); |
@@ -352,7 +352,7 @@ static int __lro_proc_skb(struct net_lro_mgr *lro_mgr, struct sk_buff *skb, | |||
352 | goto out; | 352 | goto out; |
353 | 353 | ||
354 | if ((skb->protocol == htons(ETH_P_8021Q)) | 354 | if ((skb->protocol == htons(ETH_P_8021Q)) |
355 | && !test_bit(LRO_F_EXTRACT_VLAN_ID, &lro_mgr->features)) | 355 | && !(lro_mgr->features & LRO_F_EXTRACT_VLAN_ID)) |
356 | vlan_hdr_len = VLAN_HLEN; | 356 | vlan_hdr_len = VLAN_HLEN; |
357 | 357 | ||
358 | if (!lro_desc->active) { /* start new lro session */ | 358 | if (!lro_desc->active) { /* start new lro session */ |
@@ -474,7 +474,7 @@ static struct sk_buff *__lro_proc_segment(struct net_lro_mgr *lro_mgr, | |||
474 | goto out; | 474 | goto out; |
475 | 475 | ||
476 | if ((skb->protocol == htons(ETH_P_8021Q)) | 476 | if ((skb->protocol == htons(ETH_P_8021Q)) |
477 | && !test_bit(LRO_F_EXTRACT_VLAN_ID, &lro_mgr->features)) | 477 | && !(lro_mgr->features & LRO_F_EXTRACT_VLAN_ID)) |
478 | vlan_hdr_len = VLAN_HLEN; | 478 | vlan_hdr_len = VLAN_HLEN; |
479 | 479 | ||
480 | iph = (void *)(skb->data + vlan_hdr_len); | 480 | iph = (void *)(skb->data + vlan_hdr_len); |
@@ -516,7 +516,7 @@ void lro_receive_skb(struct net_lro_mgr *lro_mgr, | |||
516 | void *priv) | 516 | void *priv) |
517 | { | 517 | { |
518 | if (__lro_proc_skb(lro_mgr, skb, NULL, 0, priv)) { | 518 | if (__lro_proc_skb(lro_mgr, skb, NULL, 0, priv)) { |
519 | if (test_bit(LRO_F_NAPI, &lro_mgr->features)) | 519 | if (lro_mgr->features & LRO_F_NAPI) |
520 | netif_receive_skb(skb); | 520 | netif_receive_skb(skb); |
521 | else | 521 | else |
522 | netif_rx(skb); | 522 | netif_rx(skb); |
@@ -531,7 +531,7 @@ void lro_vlan_hwaccel_receive_skb(struct net_lro_mgr *lro_mgr, | |||
531 | void *priv) | 531 | void *priv) |
532 | { | 532 | { |
533 | if (__lro_proc_skb(lro_mgr, skb, vgrp, vlan_tag, priv)) { | 533 | if (__lro_proc_skb(lro_mgr, skb, vgrp, vlan_tag, priv)) { |
534 | if (test_bit(LRO_F_NAPI, &lro_mgr->features)) | 534 | if (lro_mgr->features & LRO_F_NAPI) |
535 | vlan_hwaccel_receive_skb(skb, vgrp, vlan_tag); | 535 | vlan_hwaccel_receive_skb(skb, vgrp, vlan_tag); |
536 | else | 536 | else |
537 | vlan_hwaccel_rx(skb, vgrp, vlan_tag); | 537 | vlan_hwaccel_rx(skb, vgrp, vlan_tag); |
@@ -550,7 +550,7 @@ void lro_receive_frags(struct net_lro_mgr *lro_mgr, | |||
550 | if (!skb) | 550 | if (!skb) |
551 | return; | 551 | return; |
552 | 552 | ||
553 | if (test_bit(LRO_F_NAPI, &lro_mgr->features)) | 553 | if (lro_mgr->features & LRO_F_NAPI) |
554 | netif_receive_skb(skb); | 554 | netif_receive_skb(skb); |
555 | else | 555 | else |
556 | netif_rx(skb); | 556 | netif_rx(skb); |
@@ -570,7 +570,7 @@ void lro_vlan_hwaccel_receive_frags(struct net_lro_mgr *lro_mgr, | |||
570 | if (!skb) | 570 | if (!skb) |
571 | return; | 571 | return; |
572 | 572 | ||
573 | if (test_bit(LRO_F_NAPI, &lro_mgr->features)) | 573 | if (lro_mgr->features & LRO_F_NAPI) |
574 | vlan_hwaccel_receive_skb(skb, vgrp, vlan_tag); | 574 | vlan_hwaccel_receive_skb(skb, vgrp, vlan_tag); |
575 | else | 575 | else |
576 | vlan_hwaccel_rx(skb, vgrp, vlan_tag); | 576 | vlan_hwaccel_rx(skb, vgrp, vlan_tag); |
diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c index 56a675734ea5..b8f7763b2261 100644 --- a/net/ipv4/ipconfig.c +++ b/net/ipv4/ipconfig.c | |||
@@ -1404,8 +1404,7 @@ static int __init ic_proto_name(char *name) | |||
1404 | return 1; | 1404 | return 1; |
1405 | } | 1405 | } |
1406 | if (!strcmp(name, "off") || !strcmp(name, "none")) { | 1406 | if (!strcmp(name, "off") || !strcmp(name, "none")) { |
1407 | ic_enable = 0; | 1407 | return 0; |
1408 | return 1; | ||
1409 | } | 1408 | } |
1410 | #ifdef CONFIG_IP_PNP_DHCP | 1409 | #ifdef CONFIG_IP_PNP_DHCP |
1411 | else if (!strcmp(name, "dhcp")) { | 1410 | else if (!strcmp(name, "dhcp")) { |
@@ -1442,10 +1441,22 @@ static int __init ip_auto_config_setup(char *addrs) | |||
1442 | ic_set_manually = 1; | 1441 | ic_set_manually = 1; |
1443 | ic_enable = 1; | 1442 | ic_enable = 1; |
1444 | 1443 | ||
1444 | /* | ||
1445 | * If any dhcp, bootp etc options are set, leave autoconfig on | ||
1446 | * and skip the below static IP processing. | ||
1447 | */ | ||
1445 | if (ic_proto_name(addrs)) | 1448 | if (ic_proto_name(addrs)) |
1446 | return 1; | 1449 | return 1; |
1447 | 1450 | ||
1448 | /* Parse the whole string */ | 1451 | /* If no static IP is given, turn off autoconfig and bail. */ |
1452 | if (*addrs == 0 || | ||
1453 | strcmp(addrs, "off") == 0 || | ||
1454 | strcmp(addrs, "none") == 0) { | ||
1455 | ic_enable = 0; | ||
1456 | return 1; | ||
1457 | } | ||
1458 | |||
1459 | /* Parse string for static IP assignment. */ | ||
1449 | ip = addrs; | 1460 | ip = addrs; |
1450 | while (ip && *ip) { | 1461 | while (ip && *ip) { |
1451 | if ((cp = strchr(ip, ':'))) | 1462 | if ((cp = strchr(ip, ':'))) |
@@ -1483,7 +1494,10 @@ static int __init ip_auto_config_setup(char *addrs) | |||
1483 | strlcpy(user_dev_name, ip, sizeof(user_dev_name)); | 1494 | strlcpy(user_dev_name, ip, sizeof(user_dev_name)); |
1484 | break; | 1495 | break; |
1485 | case 6: | 1496 | case 6: |
1486 | ic_proto_name(ip); | 1497 | if (ic_proto_name(ip) == 0 && |
1498 | ic_myaddr == NONE) { | ||
1499 | ic_enable = 0; | ||
1500 | } | ||
1487 | break; | 1501 | break; |
1488 | } | 1502 | } |
1489 | } | 1503 | } |
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 66b42f547bf9..e7050f8eabeb 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c | |||
@@ -271,6 +271,7 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length, | |||
271 | int hh_len; | 271 | int hh_len; |
272 | struct iphdr *iph; | 272 | struct iphdr *iph; |
273 | struct sk_buff *skb; | 273 | struct sk_buff *skb; |
274 | unsigned int iphlen; | ||
274 | int err; | 275 | int err; |
275 | 276 | ||
276 | if (length > rt->u.dst.dev->mtu) { | 277 | if (length > rt->u.dst.dev->mtu) { |
@@ -304,7 +305,8 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length, | |||
304 | goto error_fault; | 305 | goto error_fault; |
305 | 306 | ||
306 | /* We don't modify invalid header */ | 307 | /* We don't modify invalid header */ |
307 | if (length >= sizeof(*iph) && iph->ihl * 4U <= length) { | 308 | iphlen = iph->ihl * 4; |
309 | if (iphlen >= sizeof(*iph) && iphlen <= length) { | ||
308 | if (!iph->saddr) | 310 | if (!iph->saddr) |
309 | iph->saddr = rt->rt_src; | 311 | iph->saddr = rt->rt_src; |
310 | iph->check = 0; | 312 | iph->check = 0; |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index d2bc6148a737..d3377069ce05 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -2626,11 +2626,10 @@ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
2626 | int idx, s_idx; | 2626 | int idx, s_idx; |
2627 | 2627 | ||
2628 | s_h = cb->args[0]; | 2628 | s_h = cb->args[0]; |
2629 | if (s_h < 0) | ||
2630 | s_h = 0; | ||
2629 | s_idx = idx = cb->args[1]; | 2631 | s_idx = idx = cb->args[1]; |
2630 | for (h = 0; h <= rt_hash_mask; h++) { | 2632 | for (h = s_h; h <= rt_hash_mask; h++) { |
2631 | if (h < s_h) continue; | ||
2632 | if (h > s_h) | ||
2633 | s_idx = 0; | ||
2634 | rcu_read_lock_bh(); | 2633 | rcu_read_lock_bh(); |
2635 | for (rt = rcu_dereference(rt_hash_table[h].chain), idx = 0; rt; | 2634 | for (rt = rcu_dereference(rt_hash_table[h].chain), idx = 0; rt; |
2636 | rt = rcu_dereference(rt->u.dst.rt_next), idx++) { | 2635 | rt = rcu_dereference(rt->u.dst.rt_next), idx++) { |
@@ -2647,6 +2646,7 @@ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
2647 | dst_release(xchg(&skb->dst, NULL)); | 2646 | dst_release(xchg(&skb->dst, NULL)); |
2648 | } | 2647 | } |
2649 | rcu_read_unlock_bh(); | 2648 | rcu_read_unlock_bh(); |
2649 | s_idx = 0; | ||
2650 | } | 2650 | } |
2651 | 2651 | ||
2652 | done: | 2652 | done: |
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index 2ed689ac449e..5d4245ab4183 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c | |||
@@ -123,11 +123,11 @@ ipv4_connected: | |||
123 | goto out; | 123 | goto out; |
124 | } | 124 | } |
125 | sk->sk_bound_dev_if = usin->sin6_scope_id; | 125 | sk->sk_bound_dev_if = usin->sin6_scope_id; |
126 | if (!sk->sk_bound_dev_if && | ||
127 | (addr_type & IPV6_ADDR_MULTICAST)) | ||
128 | fl.oif = np->mcast_oif; | ||
129 | } | 126 | } |
130 | 127 | ||
128 | if (!sk->sk_bound_dev_if && (addr_type & IPV6_ADDR_MULTICAST)) | ||
129 | sk->sk_bound_dev_if = np->mcast_oif; | ||
130 | |||
131 | /* Connect to link-local address requires an interface */ | 131 | /* Connect to link-local address requires an interface */ |
132 | if (!sk->sk_bound_dev_if) { | 132 | if (!sk->sk_bound_dev_if) { |
133 | err = -EINVAL; | 133 | err = -EINVAL; |
diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c index 48ce59a6e026..d5e4dd75200b 100644 --- a/net/irda/af_irda.c +++ b/net/irda/af_irda.c | |||
@@ -1118,8 +1118,6 @@ static int irda_create(struct net *net, struct socket *sock, int protocol) | |||
1118 | self->max_sdu_size_rx = TTP_SAR_UNBOUND; | 1118 | self->max_sdu_size_rx = TTP_SAR_UNBOUND; |
1119 | break; | 1119 | break; |
1120 | default: | 1120 | default: |
1121 | IRDA_ERROR("%s: protocol not supported!\n", | ||
1122 | __FUNCTION__); | ||
1123 | return -ESOCKTNOSUPPORT; | 1121 | return -ESOCKTNOSUPPORT; |
1124 | } | 1122 | } |
1125 | break; | 1123 | break; |
diff --git a/net/mac80211/ieee80211_ioctl.c b/net/mac80211/ieee80211_ioctl.c index 7027eed4d4ae..308bbe4a1333 100644 --- a/net/mac80211/ieee80211_ioctl.c +++ b/net/mac80211/ieee80211_ioctl.c | |||
@@ -591,7 +591,7 @@ static int ieee80211_ioctl_siwrate(struct net_device *dev, | |||
591 | sdata->bss->force_unicast_rateidx = -1; | 591 | sdata->bss->force_unicast_rateidx = -1; |
592 | if (rate->value < 0) | 592 | if (rate->value < 0) |
593 | return 0; | 593 | return 0; |
594 | for (i=0; i< mode->num_rates; i++) { | 594 | for (i=0; i < mode->num_rates; i++) { |
595 | struct ieee80211_rate *rates = &mode->rates[i]; | 595 | struct ieee80211_rate *rates = &mode->rates[i]; |
596 | int this_rate = rates->rate; | 596 | int this_rate = rates->rate; |
597 | 597 | ||
@@ -599,10 +599,10 @@ static int ieee80211_ioctl_siwrate(struct net_device *dev, | |||
599 | sdata->bss->max_ratectrl_rateidx = i; | 599 | sdata->bss->max_ratectrl_rateidx = i; |
600 | if (rate->fixed) | 600 | if (rate->fixed) |
601 | sdata->bss->force_unicast_rateidx = i; | 601 | sdata->bss->force_unicast_rateidx = i; |
602 | break; | 602 | return 0; |
603 | } | 603 | } |
604 | } | 604 | } |
605 | return 0; | 605 | return -EINVAL; |
606 | } | 606 | } |
607 | 607 | ||
608 | static int ieee80211_ioctl_giwrate(struct net_device *dev, | 608 | static int ieee80211_ioctl_giwrate(struct net_device *dev, |
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index ed7c9e30ebc9..3cc629d3c9ff 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c | |||
@@ -210,6 +210,9 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc, | |||
210 | chunksize = sizeof(init) + addrs_len + SCTP_SAT_LEN(num_types); | 210 | chunksize = sizeof(init) + addrs_len + SCTP_SAT_LEN(num_types); |
211 | chunksize += sizeof(ecap_param); | 211 | chunksize += sizeof(ecap_param); |
212 | 212 | ||
213 | if (sctp_prsctp_enable) | ||
214 | chunksize += sizeof(prsctp_param); | ||
215 | |||
213 | /* ADDIP: Section 4.2.7: | 216 | /* ADDIP: Section 4.2.7: |
214 | * An implementation supporting this extension [ADDIP] MUST list | 217 | * An implementation supporting this extension [ADDIP] MUST list |
215 | * the ASCONF,the ASCONF-ACK, and the AUTH chunks in its INIT and | 218 | * the ASCONF,the ASCONF-ACK, and the AUTH chunks in its INIT and |
@@ -369,6 +372,9 @@ struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc, | |||
369 | if (asoc->peer.ecn_capable) | 372 | if (asoc->peer.ecn_capable) |
370 | chunksize += sizeof(ecap_param); | 373 | chunksize += sizeof(ecap_param); |
371 | 374 | ||
375 | if (sctp_prsctp_enable) | ||
376 | chunksize += sizeof(prsctp_param); | ||
377 | |||
372 | if (sctp_addip_enable) { | 378 | if (sctp_addip_enable) { |
373 | extensions[num_ext] = SCTP_CID_ASCONF; | 379 | extensions[num_ext] = SCTP_CID_ASCONF; |
374 | extensions[num_ext+1] = SCTP_CID_ASCONF_ACK; | 380 | extensions[num_ext+1] = SCTP_CID_ASCONF_ACK; |
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index 5fb84778846d..d247ed4ee423 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c | |||
@@ -1309,26 +1309,6 @@ static void sctp_tietags_populate(struct sctp_association *new_asoc, | |||
1309 | new_asoc->c.initial_tsn = asoc->c.initial_tsn; | 1309 | new_asoc->c.initial_tsn = asoc->c.initial_tsn; |
1310 | } | 1310 | } |
1311 | 1311 | ||
1312 | static void sctp_auth_params_populate(struct sctp_association *new_asoc, | ||
1313 | const struct sctp_association *asoc) | ||
1314 | { | ||
1315 | /* Only perform this if AUTH extension is enabled */ | ||
1316 | if (!sctp_auth_enable) | ||
1317 | return; | ||
1318 | |||
1319 | /* We need to provide the same parameter information as | ||
1320 | * was in the original INIT. This means that we need to copy | ||
1321 | * the HMACS, CHUNKS, and RANDOM parameter from the original | ||
1322 | * assocaition. | ||
1323 | */ | ||
1324 | memcpy(new_asoc->c.auth_random, asoc->c.auth_random, | ||
1325 | sizeof(asoc->c.auth_random)); | ||
1326 | memcpy(new_asoc->c.auth_hmacs, asoc->c.auth_hmacs, | ||
1327 | sizeof(asoc->c.auth_hmacs)); | ||
1328 | memcpy(new_asoc->c.auth_chunks, asoc->c.auth_chunks, | ||
1329 | sizeof(asoc->c.auth_chunks)); | ||
1330 | } | ||
1331 | |||
1332 | /* | 1312 | /* |
1333 | * Compare vtag/tietag values to determine unexpected COOKIE-ECHO | 1313 | * Compare vtag/tietag values to determine unexpected COOKIE-ECHO |
1334 | * handling action. | 1314 | * handling action. |
@@ -1486,8 +1466,6 @@ static sctp_disposition_t sctp_sf_do_unexpected_init( | |||
1486 | 1466 | ||
1487 | sctp_tietags_populate(new_asoc, asoc); | 1467 | sctp_tietags_populate(new_asoc, asoc); |
1488 | 1468 | ||
1489 | sctp_auth_params_populate(new_asoc, asoc); | ||
1490 | |||
1491 | /* B) "Z" shall respond immediately with an INIT ACK chunk. */ | 1469 | /* B) "Z" shall respond immediately with an INIT ACK chunk. */ |
1492 | 1470 | ||
1493 | /* If there are errors need to be reported for unknown parameters, | 1471 | /* If there are errors need to be reported for unknown parameters, |
diff --git a/net/sctp/ulpevent.c b/net/sctp/ulpevent.c index 2c17c7efad46..307314356e16 100644 --- a/net/sctp/ulpevent.c +++ b/net/sctp/ulpevent.c | |||
@@ -830,7 +830,7 @@ struct sctp_ulpevent *sctp_ulpevent_make_authkey( | |||
830 | ak = (struct sctp_authkey_event *) | 830 | ak = (struct sctp_authkey_event *) |
831 | skb_put(skb, sizeof(struct sctp_authkey_event)); | 831 | skb_put(skb, sizeof(struct sctp_authkey_event)); |
832 | 832 | ||
833 | ak->auth_type = SCTP_AUTHENTICATION_EVENT; | 833 | ak->auth_type = SCTP_AUTHENTICATION_INDICATION; |
834 | ak->auth_flags = 0; | 834 | ak->auth_flags = 0; |
835 | ak->auth_length = sizeof(struct sctp_authkey_event); | 835 | ak->auth_length = sizeof(struct sctp_authkey_event); |
836 | 836 | ||
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index e75dbdcb08a4..c4f6419b1769 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
@@ -31,11 +31,6 @@ | |||
31 | #include <linux/in6.h> | 31 | #include <linux/in6.h> |
32 | #endif | 32 | #endif |
33 | 33 | ||
34 | static inline int alg_len(struct xfrm_algo *alg) | ||
35 | { | ||
36 | return sizeof(*alg) + ((alg->alg_key_len + 7) / 8); | ||
37 | } | ||
38 | |||
39 | static int verify_one_alg(struct nlattr **attrs, enum xfrm_attr_type_t type) | 34 | static int verify_one_alg(struct nlattr **attrs, enum xfrm_attr_type_t type) |
40 | { | 35 | { |
41 | struct nlattr *rt = attrs[type]; | 36 | struct nlattr *rt = attrs[type]; |
@@ -45,7 +40,7 @@ static int verify_one_alg(struct nlattr **attrs, enum xfrm_attr_type_t type) | |||
45 | return 0; | 40 | return 0; |
46 | 41 | ||
47 | algp = nla_data(rt); | 42 | algp = nla_data(rt); |
48 | if (nla_len(rt) < alg_len(algp)) | 43 | if (nla_len(rt) < xfrm_alg_len(algp)) |
49 | return -EINVAL; | 44 | return -EINVAL; |
50 | 45 | ||
51 | switch (type) { | 46 | switch (type) { |
@@ -204,7 +199,7 @@ static int attach_one_algo(struct xfrm_algo **algpp, u8 *props, | |||
204 | return -ENOSYS; | 199 | return -ENOSYS; |
205 | *props = algo->desc.sadb_alg_id; | 200 | *props = algo->desc.sadb_alg_id; |
206 | 201 | ||
207 | p = kmemdup(ualg, alg_len(ualg), GFP_KERNEL); | 202 | p = kmemdup(ualg, xfrm_alg_len(ualg), GFP_KERNEL); |
208 | if (!p) | 203 | if (!p) |
209 | return -ENOMEM; | 204 | return -ENOMEM; |
210 | 205 | ||
@@ -516,9 +511,9 @@ static int copy_to_user_state_extra(struct xfrm_state *x, | |||
516 | NLA_PUT_U64(skb, XFRMA_LASTUSED, x->lastused); | 511 | NLA_PUT_U64(skb, XFRMA_LASTUSED, x->lastused); |
517 | 512 | ||
518 | if (x->aalg) | 513 | if (x->aalg) |
519 | NLA_PUT(skb, XFRMA_ALG_AUTH, alg_len(x->aalg), x->aalg); | 514 | NLA_PUT(skb, XFRMA_ALG_AUTH, xfrm_alg_len(x->aalg), x->aalg); |
520 | if (x->ealg) | 515 | if (x->ealg) |
521 | NLA_PUT(skb, XFRMA_ALG_CRYPT, alg_len(x->ealg), x->ealg); | 516 | NLA_PUT(skb, XFRMA_ALG_CRYPT, xfrm_alg_len(x->ealg), x->ealg); |
522 | if (x->calg) | 517 | if (x->calg) |
523 | NLA_PUT(skb, XFRMA_ALG_COMP, sizeof(*(x->calg)), x->calg); | 518 | NLA_PUT(skb, XFRMA_ALG_COMP, sizeof(*(x->calg)), x->calg); |
524 | 519 | ||
@@ -1978,9 +1973,9 @@ static inline size_t xfrm_sa_len(struct xfrm_state *x) | |||
1978 | { | 1973 | { |
1979 | size_t l = 0; | 1974 | size_t l = 0; |
1980 | if (x->aalg) | 1975 | if (x->aalg) |
1981 | l += nla_total_size(alg_len(x->aalg)); | 1976 | l += nla_total_size(xfrm_alg_len(x->aalg)); |
1982 | if (x->ealg) | 1977 | if (x->ealg) |
1983 | l += nla_total_size(alg_len(x->ealg)); | 1978 | l += nla_total_size(xfrm_alg_len(x->ealg)); |
1984 | if (x->calg) | 1979 | if (x->calg) |
1985 | l += nla_total_size(sizeof(*x->calg)); | 1980 | l += nla_total_size(sizeof(*x->calg)); |
1986 | if (x->encap) | 1981 | if (x->encap) |
diff --git a/sound/core/oss/mixer_oss.c b/sound/core/oss/mixer_oss.c index 3ace4a5680ba..c5a5ab9cae8c 100644 --- a/sound/core/oss/mixer_oss.c +++ b/sound/core/oss/mixer_oss.c | |||
@@ -925,6 +925,68 @@ static void mixer_slot_clear(struct snd_mixer_oss_slot *rslot) | |||
925 | rslot->number = idx; | 925 | rslot->number = idx; |
926 | } | 926 | } |
927 | 927 | ||
928 | /* In a separate function to keep gcc 3.2 happy - do NOT merge this in | ||
929 | snd_mixer_oss_build_input! */ | ||
930 | static int snd_mixer_oss_build_test_all(struct snd_mixer_oss *mixer, | ||
931 | struct snd_mixer_oss_assign_table *ptr, | ||
932 | struct slot *slot) | ||
933 | { | ||
934 | char str[64]; | ||
935 | int err; | ||
936 | |||
937 | err = snd_mixer_oss_build_test(mixer, slot, ptr->name, ptr->index, | ||
938 | SNDRV_MIXER_OSS_ITEM_GLOBAL); | ||
939 | if (err) | ||
940 | return err; | ||
941 | sprintf(str, "%s Switch", ptr->name); | ||
942 | err = snd_mixer_oss_build_test(mixer, slot, str, ptr->index, | ||
943 | SNDRV_MIXER_OSS_ITEM_GSWITCH); | ||
944 | if (err) | ||
945 | return err; | ||
946 | sprintf(str, "%s Route", ptr->name); | ||
947 | err = snd_mixer_oss_build_test(mixer, slot, str, ptr->index, | ||
948 | SNDRV_MIXER_OSS_ITEM_GROUTE); | ||
949 | if (err) | ||
950 | return err; | ||
951 | sprintf(str, "%s Volume", ptr->name); | ||
952 | err = snd_mixer_oss_build_test(mixer, slot, str, ptr->index, | ||
953 | SNDRV_MIXER_OSS_ITEM_GVOLUME); | ||
954 | if (err) | ||
955 | return err; | ||
956 | sprintf(str, "%s Playback Switch", ptr->name); | ||
957 | err = snd_mixer_oss_build_test(mixer, slot, str, ptr->index, | ||
958 | SNDRV_MIXER_OSS_ITEM_PSWITCH); | ||
959 | if (err) | ||
960 | return err; | ||
961 | sprintf(str, "%s Playback Route", ptr->name); | ||
962 | err = snd_mixer_oss_build_test(mixer, slot, str, ptr->index, | ||
963 | SNDRV_MIXER_OSS_ITEM_PROUTE); | ||
964 | if (err) | ||
965 | return err; | ||
966 | sprintf(str, "%s Playback Volume", ptr->name); | ||
967 | err = snd_mixer_oss_build_test(mixer, slot, str, ptr->index, | ||
968 | SNDRV_MIXER_OSS_ITEM_PVOLUME); | ||
969 | if (err) | ||
970 | return err; | ||
971 | sprintf(str, "%s Capture Switch", ptr->name); | ||
972 | err = snd_mixer_oss_build_test(mixer, slot, str, ptr->index, | ||
973 | SNDRV_MIXER_OSS_ITEM_CSWITCH); | ||
974 | if (err) | ||
975 | return err; | ||
976 | sprintf(str, "%s Capture Route", ptr->name); | ||
977 | err = snd_mixer_oss_build_test(mixer, slot, str, ptr->index, | ||
978 | SNDRV_MIXER_OSS_ITEM_CROUTE); | ||
979 | if (err) | ||
980 | return err; | ||
981 | sprintf(str, "%s Capture Volume", ptr->name); | ||
982 | err = snd_mixer_oss_build_test(mixer, slot, str, ptr->index, | ||
983 | SNDRV_MIXER_OSS_ITEM_CVOLUME); | ||
984 | if (err) | ||
985 | return err; | ||
986 | |||
987 | return 0; | ||
988 | } | ||
989 | |||
928 | /* | 990 | /* |
929 | * build an OSS mixer element. | 991 | * build an OSS mixer element. |
930 | * ptr_allocated means the entry is dynamically allocated (change via proc file). | 992 | * ptr_allocated means the entry is dynamically allocated (change via proc file). |
@@ -944,44 +1006,7 @@ static int snd_mixer_oss_build_input(struct snd_mixer_oss *mixer, struct snd_mix | |||
944 | 1006 | ||
945 | memset(&slot, 0, sizeof(slot)); | 1007 | memset(&slot, 0, sizeof(slot)); |
946 | memset(slot.numid, 0xff, sizeof(slot.numid)); /* ID_UNKNOWN */ | 1008 | memset(slot.numid, 0xff, sizeof(slot.numid)); /* ID_UNKNOWN */ |
947 | if (snd_mixer_oss_build_test(mixer, &slot, ptr->name, ptr->index, | 1009 | if (snd_mixer_oss_build_test_all(mixer, ptr, &slot)) |
948 | SNDRV_MIXER_OSS_ITEM_GLOBAL)) | ||
949 | return 0; | ||
950 | sprintf(str, "%s Switch", ptr->name); | ||
951 | if (snd_mixer_oss_build_test(mixer, &slot, str, ptr->index, | ||
952 | SNDRV_MIXER_OSS_ITEM_GSWITCH)) | ||
953 | return 0; | ||
954 | sprintf(str, "%s Route", ptr->name); | ||
955 | if (snd_mixer_oss_build_test(mixer, &slot, str, ptr->index, | ||
956 | SNDRV_MIXER_OSS_ITEM_GROUTE)) | ||
957 | return 0; | ||
958 | sprintf(str, "%s Volume", ptr->name); | ||
959 | if (snd_mixer_oss_build_test(mixer, &slot, str, ptr->index, | ||
960 | SNDRV_MIXER_OSS_ITEM_GVOLUME)) | ||
961 | return 0; | ||
962 | sprintf(str, "%s Playback Switch", ptr->name); | ||
963 | if (snd_mixer_oss_build_test(mixer, &slot, str, ptr->index, | ||
964 | SNDRV_MIXER_OSS_ITEM_PSWITCH)) | ||
965 | return 0; | ||
966 | sprintf(str, "%s Playback Route", ptr->name); | ||
967 | if (snd_mixer_oss_build_test(mixer, &slot, str, ptr->index, | ||
968 | SNDRV_MIXER_OSS_ITEM_PROUTE)) | ||
969 | return 0; | ||
970 | sprintf(str, "%s Playback Volume", ptr->name); | ||
971 | if (snd_mixer_oss_build_test(mixer, &slot, str, ptr->index, | ||
972 | SNDRV_MIXER_OSS_ITEM_PVOLUME)) | ||
973 | return 0; | ||
974 | sprintf(str, "%s Capture Switch", ptr->name); | ||
975 | if (snd_mixer_oss_build_test(mixer, &slot, str, ptr->index, | ||
976 | SNDRV_MIXER_OSS_ITEM_CSWITCH)) | ||
977 | return 0; | ||
978 | sprintf(str, "%s Capture Route", ptr->name); | ||
979 | if (snd_mixer_oss_build_test(mixer, &slot, str, ptr->index, | ||
980 | SNDRV_MIXER_OSS_ITEM_CROUTE)) | ||
981 | return 0; | ||
982 | sprintf(str, "%s Capture Volume", ptr->name); | ||
983 | if (snd_mixer_oss_build_test(mixer, &slot, str, ptr->index, | ||
984 | SNDRV_MIXER_OSS_ITEM_CVOLUME)) | ||
985 | return 0; | 1010 | return 0; |
986 | down_read(&mixer->card->controls_rwsem); | 1011 | down_read(&mixer->card->controls_rwsem); |
987 | if (ptr->index == 0 && (kctl = snd_mixer_oss_test_id(mixer, "Capture Source", 0)) != NULL) { | 1012 | if (ptr->index == 0 && (kctl = snd_mixer_oss_test_id(mixer, "Capture Source", 0)) != NULL) { |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 62b9fb386903..3fa0f9704909 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -555,8 +555,7 @@ static unsigned int azx_rirb_get_response(struct hda_codec *codec) | |||
555 | } | 555 | } |
556 | if (!chip->rirb.cmds) | 556 | if (!chip->rirb.cmds) |
557 | return chip->rirb.res; /* the last value */ | 557 | return chip->rirb.res; /* the last value */ |
558 | udelay(10); | 558 | schedule_timeout_uninterruptible(1); |
559 | cond_resched(); | ||
560 | } while (time_after_eq(timeout, jiffies)); | 559 | } while (time_after_eq(timeout, jiffies)); |
561 | 560 | ||
562 | if (chip->msi) { | 561 | if (chip->msi) { |