diff options
160 files changed, 705 insertions, 3259 deletions
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index c3b1430cf603..0bc8b0b2e103 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
@@ -316,3 +316,11 @@ Why: The option/code is | |||
316 | Who: Johannes Berg <johannes@sipsolutions.net> | 316 | Who: Johannes Berg <johannes@sipsolutions.net> |
317 | 317 | ||
318 | --------------------------- | 318 | --------------------------- |
319 | |||
320 | What: i8xx_tco watchdog driver | ||
321 | When: in 2.6.22 | ||
322 | Why: the i8xx_tco watchdog driver has been replaced by the iTCO_wdt | ||
323 | watchdog driver. | ||
324 | Who: Wim Van Sebroeck <wim@iguana.be> | ||
325 | |||
326 | --------------------------- | ||
diff --git a/arch/arm/common/Kconfig b/arch/arm/common/Kconfig index 5e34ca6d38b6..3e073467caca 100644 --- a/arch/arm/common/Kconfig +++ b/arch/arm/common/Kconfig | |||
@@ -28,6 +28,7 @@ config SHARP_PARAM | |||
28 | 28 | ||
29 | config SHARPSL_PM | 29 | config SHARPSL_PM |
30 | bool | 30 | bool |
31 | select APM_EMULATION | ||
31 | 32 | ||
32 | config SHARP_SCOOP | 33 | config SHARP_SCOOP |
33 | bool | 34 | bool |
diff --git a/arch/arm/mach-imx/cpufreq.c b/arch/arm/mach-imx/cpufreq.c index 4f66e90db74f..7e70e0b0b989 100644 --- a/arch/arm/mach-imx/cpufreq.c +++ b/arch/arm/mach-imx/cpufreq.c | |||
@@ -50,6 +50,7 @@ | |||
50 | #define CR_920T_ASYNC_MODE 0xC0000000 | 50 | #define CR_920T_ASYNC_MODE 0xC0000000 |
51 | 51 | ||
52 | static u32 mpctl0_at_boot; | 52 | static u32 mpctl0_at_boot; |
53 | static u32 bclk_div_at_boot; | ||
53 | 54 | ||
54 | static void imx_set_async_mode(void) | 55 | static void imx_set_async_mode(void) |
55 | { | 56 | { |
@@ -82,13 +83,13 @@ static void imx_set_mpctl0(u32 mpctl0) | |||
82 | * imx_compute_mpctl - compute new PLL parameters | 83 | * imx_compute_mpctl - compute new PLL parameters |
83 | * @new_mpctl: pointer to location assigned by new PLL control register value | 84 | * @new_mpctl: pointer to location assigned by new PLL control register value |
84 | * @cur_mpctl: current PLL control register parameters | 85 | * @cur_mpctl: current PLL control register parameters |
86 | * @f_ref: reference source frequency Hz | ||
85 | * @freq: required frequency in Hz | 87 | * @freq: required frequency in Hz |
86 | * @relation: is one of %CPUFREQ_RELATION_L (supremum) | 88 | * @relation: is one of %CPUFREQ_RELATION_L (supremum) |
87 | * and %CPUFREQ_RELATION_H (infimum) | 89 | * and %CPUFREQ_RELATION_H (infimum) |
88 | */ | 90 | */ |
89 | long imx_compute_mpctl(u32 *new_mpctl, u32 cur_mpctl, unsigned long freq, int relation) | 91 | long imx_compute_mpctl(u32 *new_mpctl, u32 cur_mpctl, u32 f_ref, unsigned long freq, int relation) |
90 | { | 92 | { |
91 | u32 f_ref = (CSCR & CSCR_SYSTEM_SEL) ? 16000000 : (CLK32 * 512); | ||
92 | u32 mfi; | 93 | u32 mfi; |
93 | u32 mfn; | 94 | u32 mfn; |
94 | u32 mfd; | 95 | u32 mfd; |
@@ -182,7 +183,7 @@ static int imx_set_target(struct cpufreq_policy *policy, | |||
182 | unsigned long flags; | 183 | unsigned long flags; |
183 | long freq; | 184 | long freq; |
184 | long sysclk; | 185 | long sysclk; |
185 | unsigned int bclk_div = 1; | 186 | unsigned int bclk_div = bclk_div_at_boot; |
186 | 187 | ||
187 | /* | 188 | /* |
188 | * Some governors do not respects CPU and policy lower limits | 189 | * Some governors do not respects CPU and policy lower limits |
@@ -202,8 +203,8 @@ static int imx_set_target(struct cpufreq_policy *policy, | |||
202 | 203 | ||
203 | sysclk = imx_get_system_clk(); | 204 | sysclk = imx_get_system_clk(); |
204 | 205 | ||
205 | if (freq > sysclk + 1000000) { | 206 | if (freq > sysclk / bclk_div_at_boot + 1000000) { |
206 | freq = imx_compute_mpctl(&mpctl0, mpctl0_at_boot, freq, relation); | 207 | freq = imx_compute_mpctl(&mpctl0, mpctl0_at_boot, CLK32 * 512, freq, relation); |
207 | if (freq < 0) { | 208 | if (freq < 0) { |
208 | printk(KERN_WARNING "imx: target frequency %ld Hz cannot be set\n", freq); | 209 | printk(KERN_WARNING "imx: target frequency %ld Hz cannot be set\n", freq); |
209 | return -EINVAL; | 210 | return -EINVAL; |
@@ -217,6 +218,8 @@ static int imx_set_target(struct cpufreq_policy *policy, | |||
217 | 218 | ||
218 | if(bclk_div > 16) | 219 | if(bclk_div > 16) |
219 | bclk_div = 16; | 220 | bclk_div = 16; |
221 | if(bclk_div < bclk_div_at_boot) | ||
222 | bclk_div = bclk_div_at_boot; | ||
220 | } | 223 | } |
221 | freq = (sysclk + bclk_div / 2) / bclk_div; | 224 | freq = (sysclk + bclk_div / 2) / bclk_div; |
222 | } | 225 | } |
@@ -285,7 +288,7 @@ static struct cpufreq_driver imx_driver = { | |||
285 | 288 | ||
286 | static int __init imx_cpufreq_init(void) | 289 | static int __init imx_cpufreq_init(void) |
287 | { | 290 | { |
288 | 291 | bclk_div_at_boot = __mfld2val(CSCR_BCLK_DIV, CSCR) + 1; | |
289 | mpctl0_at_boot = 0; | 292 | mpctl0_at_boot = 0; |
290 | 293 | ||
291 | if((CSCR & CSCR_MPEN) && | 294 | if((CSCR & CSCR_MPEN) && |
diff --git a/arch/arm/mach-imx/generic.c b/arch/arm/mach-imx/generic.c index b5aa49d00ca3..7a7fa51ec62c 100644 --- a/arch/arm/mach-imx/generic.c +++ b/arch/arm/mach-imx/generic.c | |||
@@ -102,7 +102,7 @@ EXPORT_SYMBOL(imx_gpio_mode); | |||
102 | * f = 2 * f_ref * -------------------- | 102 | * f = 2 * f_ref * -------------------- |
103 | * pd + 1 | 103 | * pd + 1 |
104 | */ | 104 | */ |
105 | static unsigned int imx_decode_pll(unsigned int pll) | 105 | static unsigned int imx_decode_pll(unsigned int pll, u32 f_ref) |
106 | { | 106 | { |
107 | unsigned long long ll; | 107 | unsigned long long ll; |
108 | unsigned long quot; | 108 | unsigned long quot; |
@@ -111,7 +111,6 @@ static unsigned int imx_decode_pll(unsigned int pll) | |||
111 | u32 mfn = pll & 0x3ff; | 111 | u32 mfn = pll & 0x3ff; |
112 | u32 mfd = (pll >> 16) & 0x3ff; | 112 | u32 mfd = (pll >> 16) & 0x3ff; |
113 | u32 pd = (pll >> 26) & 0xf; | 113 | u32 pd = (pll >> 26) & 0xf; |
114 | u32 f_ref = (CSCR & CSCR_SYSTEM_SEL) ? 16000000 : (CLK32 * 512); | ||
115 | 114 | ||
116 | mfi = mfi <= 5 ? 5 : mfi; | 115 | mfi = mfi <= 5 ? 5 : mfi; |
117 | 116 | ||
@@ -124,13 +123,15 @@ static unsigned int imx_decode_pll(unsigned int pll) | |||
124 | 123 | ||
125 | unsigned int imx_get_system_clk(void) | 124 | unsigned int imx_get_system_clk(void) |
126 | { | 125 | { |
127 | return imx_decode_pll(SPCTL0); | 126 | u32 f_ref = (CSCR & CSCR_SYSTEM_SEL) ? 16000000 : (CLK32 * 512); |
127 | |||
128 | return imx_decode_pll(SPCTL0, f_ref); | ||
128 | } | 129 | } |
129 | EXPORT_SYMBOL(imx_get_system_clk); | 130 | EXPORT_SYMBOL(imx_get_system_clk); |
130 | 131 | ||
131 | unsigned int imx_get_mcu_clk(void) | 132 | unsigned int imx_get_mcu_clk(void) |
132 | { | 133 | { |
133 | return imx_decode_pll(MPCTL0); | 134 | return imx_decode_pll(MPCTL0, CLK32 * 512); |
134 | } | 135 | } |
135 | EXPORT_SYMBOL(imx_get_mcu_clk); | 136 | EXPORT_SYMBOL(imx_get_mcu_clk); |
136 | 137 | ||
diff --git a/arch/arm/mach-ns9xxx/mach-cc9p9360dev.c b/arch/arm/mach-ns9xxx/mach-cc9p9360dev.c index a193dd931512..760c9d0db7c3 100644 --- a/arch/arm/mach-ns9xxx/mach-cc9p9360dev.c +++ b/arch/arm/mach-ns9xxx/mach-cc9p9360dev.c | |||
@@ -32,7 +32,7 @@ static void __init mach_cc9p9360dev_init_machine(void) | |||
32 | board_a9m9750dev_init_machine(); | 32 | board_a9m9750dev_init_machine(); |
33 | } | 33 | } |
34 | 34 | ||
35 | MACHINE_START(CC9P9360DEV, "Connect Core 9P 9360 on an A9M9750 Devboard") | 35 | MACHINE_START(CC9P9360DEV, "Digi ConnectCore 9P 9360 on an A9M9750 Devboard") |
36 | .map_io = mach_cc9p9360dev_map_io, | 36 | .map_io = mach_cc9p9360dev_map_io, |
37 | .init_irq = mach_cc9p9360dev_init_irq, | 37 | .init_irq = mach_cc9p9360dev_init_irq, |
38 | .init_machine = mach_cc9p9360dev_init_machine, | 38 | .init_machine = mach_cc9p9360dev_init_machine, |
diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c index 6e113078f7ab..ad519390dd58 100644 --- a/arch/arm/mach-omap1/board-h2.c +++ b/arch/arm/mach-omap1/board-h2.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/mtd/nand.h> | 27 | #include <linux/mtd/nand.h> |
28 | #include <linux/mtd/partitions.h> | 28 | #include <linux/mtd/partitions.h> |
29 | #include <linux/input.h> | 29 | #include <linux/input.h> |
30 | #include <linux/workqueue.h> | ||
30 | 31 | ||
31 | #include <asm/hardware.h> | 32 | #include <asm/hardware.h> |
32 | #include <asm/mach-types.h> | 33 | #include <asm/mach-types.h> |
diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c index 0de201c3d50b..5170481afeab 100644 --- a/arch/arm/mach-omap2/clock.c +++ b/arch/arm/mach-omap2/clock.c | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | #include <asm/arch/clock.h> | 28 | #include <asm/arch/clock.h> |
29 | #include <asm/arch/sram.h> | 29 | #include <asm/arch/sram.h> |
30 | #include <asm/div64.h> | ||
30 | 31 | ||
31 | #include "prcm-regs.h" | 32 | #include "prcm-regs.h" |
32 | #include "memory.h" | 33 | #include "memory.h" |
diff --git a/arch/arm/mach-omap2/clock.h b/arch/arm/mach-omap2/clock.h index 8816f5a33a28..162978fd5359 100644 --- a/arch/arm/mach-omap2/clock.h +++ b/arch/arm/mach-omap2/clock.h | |||
@@ -1013,7 +1013,8 @@ static struct clk dss2_fck = { /* Alt clk used in power management */ | |||
1013 | .name = "dss2_fck", | 1013 | .name = "dss2_fck", |
1014 | .parent = &sys_ck, /* fixed at sys_ck or 48MHz */ | 1014 | .parent = &sys_ck, /* fixed at sys_ck or 48MHz */ |
1015 | .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X | | 1015 | .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X | |
1016 | RATE_CKCTL | CM_CORE_SEL1 | RATE_FIXED, | 1016 | RATE_CKCTL | CM_CORE_SEL1 | RATE_FIXED | |
1017 | DELAYED_APP, | ||
1017 | .enable_reg = (void __iomem *)&CM_FCLKEN1_CORE, | 1018 | .enable_reg = (void __iomem *)&CM_FCLKEN1_CORE, |
1018 | .enable_bit = 1, | 1019 | .enable_bit = 1, |
1019 | .src_offset = 13, | 1020 | .src_offset = 13, |
diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c index 7915a5a22865..72738771fb57 100644 --- a/arch/arm/mach-pxa/tosa.c +++ b/arch/arm/mach-pxa/tosa.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <asm/hardware.h> | 28 | #include <asm/hardware.h> |
29 | #include <asm/irq.h> | 29 | #include <asm/irq.h> |
30 | #include <asm/system.h> | 30 | #include <asm/system.h> |
31 | #include <asm/arch/pxa-regs.h> | ||
31 | #include <asm/arch/irda.h> | 32 | #include <asm/arch/irda.h> |
32 | #include <asm/arch/mmc.h> | 33 | #include <asm/arch/mmc.h> |
33 | #include <asm/arch/udc.h> | 34 | #include <asm/arch/udc.h> |
@@ -35,8 +36,6 @@ | |||
35 | #include <asm/mach/arch.h> | 36 | #include <asm/mach/arch.h> |
36 | #include <asm/mach/map.h> | 37 | #include <asm/mach/map.h> |
37 | #include <asm/mach/irq.h> | 38 | #include <asm/mach/irq.h> |
38 | |||
39 | #include <asm/arch/pxa-regs.h> | ||
40 | #include <asm/arch/tosa.h> | 39 | #include <asm/arch/tosa.h> |
41 | 40 | ||
42 | #include <asm/hardware/scoop.h> | 41 | #include <asm/hardware/scoop.h> |
diff --git a/arch/i386/Kconfig b/arch/i386/Kconfig index 27e8453274e6..53d62373a524 100644 --- a/arch/i386/Kconfig +++ b/arch/i386/Kconfig | |||
@@ -220,7 +220,7 @@ config PARAVIRT | |||
220 | 220 | ||
221 | config VMI | 221 | config VMI |
222 | bool "VMI Paravirt-ops support" | 222 | bool "VMI Paravirt-ops support" |
223 | depends on PARAVIRT | 223 | depends on PARAVIRT && !COMPAT_VDSO |
224 | help | 224 | help |
225 | VMI provides a paravirtualized interface to the VMware ESX server | 225 | VMI provides a paravirtualized interface to the VMware ESX server |
226 | (it could be used by other hypervisors in theory too, but is not | 226 | (it could be used by other hypervisors in theory too, but is not |
diff --git a/arch/i386/kernel/nmi.c b/arch/i386/kernel/nmi.c index 821df34d2b3a..14702427b104 100644 --- a/arch/i386/kernel/nmi.c +++ b/arch/i386/kernel/nmi.c | |||
@@ -245,14 +245,6 @@ static int __init check_nmi_watchdog(void) | |||
245 | unsigned int *prev_nmi_count; | 245 | unsigned int *prev_nmi_count; |
246 | int cpu; | 246 | int cpu; |
247 | 247 | ||
248 | /* Enable NMI watchdog for newer systems. | ||
249 | Probably safe on most older systems too, but let's be careful. | ||
250 | IBM ThinkPads use INT10 inside SMM and that allows early NMI inside SMM | ||
251 | which hangs the system. Disable watchdog for all thinkpads */ | ||
252 | if (nmi_watchdog == NMI_DEFAULT && dmi_get_year(DMI_BIOS_DATE) >= 2004 && | ||
253 | !dmi_name_in_vendors("ThinkPad")) | ||
254 | nmi_watchdog = NMI_LOCAL_APIC; | ||
255 | |||
256 | if ((nmi_watchdog == NMI_NONE) || (nmi_watchdog == NMI_DEFAULT)) | 248 | if ((nmi_watchdog == NMI_NONE) || (nmi_watchdog == NMI_DEFAULT)) |
257 | return 0; | 249 | return 0; |
258 | 250 | ||
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index a1cd84f9b3bc..2b9c65c3b5d1 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -470,11 +470,6 @@ config MIPS_XXS1500 | |||
470 | select SOC_AU1500 | 470 | select SOC_AU1500 |
471 | select SYS_SUPPORTS_LITTLE_ENDIAN | 471 | select SYS_SUPPORTS_LITTLE_ENDIAN |
472 | 472 | ||
473 | config PNX8550_V2PCI | ||
474 | bool "Philips PNX8550 based Viper2-PCI board" | ||
475 | select PNX8550 | ||
476 | select SYS_SUPPORTS_LITTLE_ENDIAN | ||
477 | |||
478 | config PNX8550_JBS | 473 | config PNX8550_JBS |
479 | bool "Philips PNX8550 based JBS board" | 474 | bool "Philips PNX8550 based JBS board" |
480 | select PNX8550 | 475 | select PNX8550 |
diff --git a/arch/mips/configs/atlas_defconfig b/arch/mips/configs/atlas_defconfig index 458894933a4c..39e251300c64 100644 --- a/arch/mips/configs/atlas_defconfig +++ b/arch/mips/configs/atlas_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_MIPS_ATLAS=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/bigsur_defconfig b/arch/mips/configs/bigsur_defconfig index aa05e294ea62..4713a13211ce 100644 --- a/arch/mips/configs/bigsur_defconfig +++ b/arch/mips/configs/bigsur_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/capcella_defconfig b/arch/mips/configs/capcella_defconfig index b2594fa556f3..5e7ae56b1f3c 100644 --- a/arch/mips/configs/capcella_defconfig +++ b/arch/mips/configs/capcella_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/cobalt_defconfig b/arch/mips/configs/cobalt_defconfig index 9090a7aba6c1..ba593b510b76 100644 --- a/arch/mips/configs/cobalt_defconfig +++ b/arch/mips/configs/cobalt_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_MIPS_COBALT=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/db1000_defconfig b/arch/mips/configs/db1000_defconfig index 4cb8cf4255a2..0db6a8b37301 100644 --- a/arch/mips/configs/db1000_defconfig +++ b/arch/mips/configs/db1000_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_MIPS_DB1000=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/db1100_defconfig b/arch/mips/configs/db1100_defconfig index d86dedf27fc4..162add97c5ef 100644 --- a/arch/mips/configs/db1100_defconfig +++ b/arch/mips/configs/db1100_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_MIPS_DB1100=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/db1200_defconfig b/arch/mips/configs/db1200_defconfig index c24b6008345e..82801ec43e6a 100644 --- a/arch/mips/configs/db1200_defconfig +++ b/arch/mips/configs/db1200_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_MIPS_DB1200=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/db1500_defconfig b/arch/mips/configs/db1500_defconfig index baad2c5223ba..545f23094e13 100644 --- a/arch/mips/configs/db1500_defconfig +++ b/arch/mips/configs/db1500_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_MIPS_DB1500=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/db1550_defconfig b/arch/mips/configs/db1550_defconfig index c29fdab0423a..5bd3b4328e57 100644 --- a/arch/mips/configs/db1550_defconfig +++ b/arch/mips/configs/db1550_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_MIPS_DB1550=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/ddb5477_defconfig b/arch/mips/configs/ddb5477_defconfig index f4b316d2cd70..5b502a2013fb 100644 --- a/arch/mips/configs/ddb5477_defconfig +++ b/arch/mips/configs/ddb5477_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | CONFIG_DDB5477=y | 44 | CONFIG_DDB5477=y |
diff --git a/arch/mips/configs/decstation_defconfig b/arch/mips/configs/decstation_defconfig index 9c38e5c77761..4bbdab078ff1 100644 --- a/arch/mips/configs/decstation_defconfig +++ b/arch/mips/configs/decstation_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_MACH_DECSTATION=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/e55_defconfig b/arch/mips/configs/e55_defconfig index 922af379aa41..b5714a6a5398 100644 --- a/arch/mips/configs/e55_defconfig +++ b/arch/mips/configs/e55_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/emma2rh_defconfig b/arch/mips/configs/emma2rh_defconfig index c0db8f14713d..3044579f171a 100644 --- a/arch/mips/configs/emma2rh_defconfig +++ b/arch/mips/configs/emma2rh_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/ev64120_defconfig b/arch/mips/configs/ev64120_defconfig index ce088b36291d..c10e4e063226 100644 --- a/arch/mips/configs/ev64120_defconfig +++ b/arch/mips/configs/ev64120_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_MIPS_EV64120=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/excite_defconfig b/arch/mips/configs/excite_defconfig index 82f204d080b7..460d7a26a8ba 100644 --- a/arch/mips/configs/excite_defconfig +++ b/arch/mips/configs/excite_defconfig | |||
@@ -40,7 +40,6 @@ CONFIG_BASLER_EXCITE=y | |||
40 | # CONFIG_MOMENCO_OCELOT_C is not set | 40 | # CONFIG_MOMENCO_OCELOT_C is not set |
41 | # CONFIG_MOMENCO_OCELOT_G is not set | 41 | # CONFIG_MOMENCO_OCELOT_G is not set |
42 | # CONFIG_MIPS_XXS1500 is not set | 42 | # CONFIG_MIPS_XXS1500 is not set |
43 | # CONFIG_PNX8550_V2PCI is not set | ||
44 | # CONFIG_PNX8550_JBS is not set | 43 | # CONFIG_PNX8550_JBS is not set |
45 | # CONFIG_PNX8550_STB810 is not set | 44 | # CONFIG_PNX8550_STB810 is not set |
46 | # CONFIG_DDB5477 is not set | 45 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/ip22_defconfig b/arch/mips/configs/ip22_defconfig index cb81f13bd45a..7ec618f3c8b9 100644 --- a/arch/mips/configs/ip22_defconfig +++ b/arch/mips/configs/ip22_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/ip27_defconfig b/arch/mips/configs/ip27_defconfig index 46f6ac4083b9..9ddc3eff4793 100644 --- a/arch/mips/configs/ip27_defconfig +++ b/arch/mips/configs/ip27_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/ip32_defconfig b/arch/mips/configs/ip32_defconfig index d9e5000d5329..8fc18809d5ff 100644 --- a/arch/mips/configs/ip32_defconfig +++ b/arch/mips/configs/ip32_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/jaguar-atx_defconfig b/arch/mips/configs/jaguar-atx_defconfig index 57ef0c45a62b..083104daa2ca 100644 --- a/arch/mips/configs/jaguar-atx_defconfig +++ b/arch/mips/configs/jaguar-atx_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_MOMENCO_JAGUAR_ATX=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/jazz_defconfig b/arch/mips/configs/jazz_defconfig index 21d979f8326c..9331cb0a19b1 100644 --- a/arch/mips/configs/jazz_defconfig +++ b/arch/mips/configs/jazz_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_MACH_JAZZ=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/jmr3927_defconfig b/arch/mips/configs/jmr3927_defconfig index 98b9fbc042f4..21a094752dab 100644 --- a/arch/mips/configs/jmr3927_defconfig +++ b/arch/mips/configs/jmr3927_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/lasat200_defconfig b/arch/mips/configs/lasat200_defconfig index b3f767ff1c5a..fd4272c1458a 100644 --- a/arch/mips/configs/lasat200_defconfig +++ b/arch/mips/configs/lasat200_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_LASAT=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/malta_defconfig b/arch/mips/configs/malta_defconfig index a5f379d626d6..1f64d7632a03 100644 --- a/arch/mips/configs/malta_defconfig +++ b/arch/mips/configs/malta_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_MIPS_MALTA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/mipssim_defconfig b/arch/mips/configs/mipssim_defconfig index 5ff53e184912..a2db5c201216 100644 --- a/arch/mips/configs/mipssim_defconfig +++ b/arch/mips/configs/mipssim_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_MIPS_SIM=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/mpc30x_defconfig b/arch/mips/configs/mpc30x_defconfig index 750e6445c613..ad5c0bf87b2b 100644 --- a/arch/mips/configs/mpc30x_defconfig +++ b/arch/mips/configs/mpc30x_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/ocelot_3_defconfig b/arch/mips/configs/ocelot_3_defconfig index 2febd0a7fba2..28547313ce13 100644 --- a/arch/mips/configs/ocelot_3_defconfig +++ b/arch/mips/configs/ocelot_3_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_MOMENCO_OCELOT_3=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/ocelot_c_defconfig b/arch/mips/configs/ocelot_c_defconfig index b8f457300bbf..82ff6fc0cd41 100644 --- a/arch/mips/configs/ocelot_c_defconfig +++ b/arch/mips/configs/ocelot_c_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | CONFIG_MOMENCO_OCELOT_C=y | 39 | CONFIG_MOMENCO_OCELOT_C=y |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/ocelot_defconfig b/arch/mips/configs/ocelot_defconfig index 8ade072271cd..15a027e00eec 100644 --- a/arch/mips/configs/ocelot_defconfig +++ b/arch/mips/configs/ocelot_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_MOMENCO_OCELOT=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/ocelot_g_defconfig b/arch/mips/configs/ocelot_g_defconfig index d20a2216c11d..7078e6b3ea11 100644 --- a/arch/mips/configs/ocelot_g_defconfig +++ b/arch/mips/configs/ocelot_g_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | CONFIG_MOMENCO_OCELOT_G=y | 40 | CONFIG_MOMENCO_OCELOT_G=y |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/pb1100_defconfig b/arch/mips/configs/pb1100_defconfig index 33fcc8133bc0..69678d99ae61 100644 --- a/arch/mips/configs/pb1100_defconfig +++ b/arch/mips/configs/pb1100_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_MIPS_PB1100=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/pb1500_defconfig b/arch/mips/configs/pb1500_defconfig index e07c55dc8dc1..070672799dac 100644 --- a/arch/mips/configs/pb1500_defconfig +++ b/arch/mips/configs/pb1500_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_MIPS_PB1500=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/pb1550_defconfig b/arch/mips/configs/pb1550_defconfig index df210dd22476..354e49b7a5f1 100644 --- a/arch/mips/configs/pb1550_defconfig +++ b/arch/mips/configs/pb1550_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_MIPS_PB1550=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/pnx8550-jbs_defconfig b/arch/mips/configs/pnx8550-jbs_defconfig index 106a1641c0b5..fae16c5ec521 100644 --- a/arch/mips/configs/pnx8550-jbs_defconfig +++ b/arch/mips/configs/pnx8550-jbs_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | CONFIG_PNX8550_JBS=y | 42 | CONFIG_PNX8550_JBS=y |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/pnx8550-stb810_defconfig b/arch/mips/configs/pnx8550-stb810_defconfig index 8caa2cd1aa7c..cd821e52181d 100644 --- a/arch/mips/configs/pnx8550-stb810_defconfig +++ b/arch/mips/configs/pnx8550-stb810_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | CONFIG_PNX8550_STB810=y | 43 | CONFIG_PNX8550_STB810=y |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/pnx8550-v2pci_defconfig b/arch/mips/configs/pnx8550-v2pci_defconfig index 43f1becec2a4..3d6c2d743502 100644 --- a/arch/mips/configs/pnx8550-v2pci_defconfig +++ b/arch/mips/configs/pnx8550-v2pci_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | CONFIG_PNX8550_V2PCI=y | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/qemu_defconfig b/arch/mips/configs/qemu_defconfig index f68396d19f9a..8e8d03157954 100644 --- a/arch/mips/configs/qemu_defconfig +++ b/arch/mips/configs/qemu_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/rbhma4500_defconfig b/arch/mips/configs/rbhma4500_defconfig index a6a824fcc874..29e0df9f4be0 100644 --- a/arch/mips/configs/rbhma4500_defconfig +++ b/arch/mips/configs/rbhma4500_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/rm200_defconfig b/arch/mips/configs/rm200_defconfig index bee3702d501d..5593cde9f74c 100644 --- a/arch/mips/configs/rm200_defconfig +++ b/arch/mips/configs/rm200_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/sb1250-swarm_defconfig b/arch/mips/configs/sb1250-swarm_defconfig index 3c891ed10141..6c4f09a381e2 100644 --- a/arch/mips/configs/sb1250-swarm_defconfig +++ b/arch/mips/configs/sb1250-swarm_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/sead_defconfig b/arch/mips/configs/sead_defconfig index e31d964a053b..988b9cdef01f 100644 --- a/arch/mips/configs/sead_defconfig +++ b/arch/mips/configs/sead_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_MIPS_SEAD=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/tb0226_defconfig b/arch/mips/configs/tb0226_defconfig index 5771c1aee76a..b5be8b74d896 100644 --- a/arch/mips/configs/tb0226_defconfig +++ b/arch/mips/configs/tb0226_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/tb0229_defconfig b/arch/mips/configs/tb0229_defconfig index a8eb4b182d34..1756d2bdf6b8 100644 --- a/arch/mips/configs/tb0229_defconfig +++ b/arch/mips/configs/tb0229_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/tb0287_defconfig b/arch/mips/configs/tb0287_defconfig index c58afa2eac6b..8bb6be4342b6 100644 --- a/arch/mips/configs/tb0287_defconfig +++ b/arch/mips/configs/tb0287_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/workpad_defconfig b/arch/mips/configs/workpad_defconfig index 2abbd6827720..8f019ffcc71b 100644 --- a/arch/mips/configs/workpad_defconfig +++ b/arch/mips/configs/workpad_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/wrppmc_defconfig b/arch/mips/configs/wrppmc_defconfig index 44b6b7c1fdb6..52b48c0715d3 100644 --- a/arch/mips/configs/wrppmc_defconfig +++ b/arch/mips/configs/wrppmc_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_WR_PPMC=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/configs/yosemite_defconfig b/arch/mips/configs/yosemite_defconfig index f24e1c6fc484..6824606309e5 100644 --- a/arch/mips/configs/yosemite_defconfig +++ b/arch/mips/configs/yosemite_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/defconfig b/arch/mips/defconfig index 8cb8f5919194..41211f8b7738 100644 --- a/arch/mips/defconfig +++ b/arch/mips/defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_ZONE_DMA=y | |||
39 | # CONFIG_MOMENCO_OCELOT_C is not set | 39 | # CONFIG_MOMENCO_OCELOT_C is not set |
40 | # CONFIG_MOMENCO_OCELOT_G is not set | 40 | # CONFIG_MOMENCO_OCELOT_G is not set |
41 | # CONFIG_MIPS_XXS1500 is not set | 41 | # CONFIG_MIPS_XXS1500 is not set |
42 | # CONFIG_PNX8550_V2PCI is not set | ||
43 | # CONFIG_PNX8550_JBS is not set | 42 | # CONFIG_PNX8550_JBS is not set |
44 | # CONFIG_PNX8550_STB810 is not set | 43 | # CONFIG_PNX8550_STB810 is not set |
45 | # CONFIG_DDB5477 is not set | 44 | # CONFIG_DDB5477 is not set |
diff --git a/arch/mips/kernel/kspd.c b/arch/mips/kernel/kspd.c index 5929f883e46b..241ee7a2906e 100644 --- a/arch/mips/kernel/kspd.c +++ b/arch/mips/kernel/kspd.c | |||
@@ -70,6 +70,7 @@ static int sp_stopping = 0; | |||
70 | #define MTSP_SYSCALL_GETTIME (MTSP_SYSCALL_BASE + 7) | 70 | #define MTSP_SYSCALL_GETTIME (MTSP_SYSCALL_BASE + 7) |
71 | #define MTSP_SYSCALL_PIPEFREQ (MTSP_SYSCALL_BASE + 8) | 71 | #define MTSP_SYSCALL_PIPEFREQ (MTSP_SYSCALL_BASE + 8) |
72 | #define MTSP_SYSCALL_GETTOD (MTSP_SYSCALL_BASE + 9) | 72 | #define MTSP_SYSCALL_GETTOD (MTSP_SYSCALL_BASE + 9) |
73 | #define MTSP_SYSCALL_IOCTL (MTSP_SYSCALL_BASE + 10) | ||
73 | 74 | ||
74 | #define MTSP_O_RDONLY 0x0000 | 75 | #define MTSP_O_RDONLY 0x0000 |
75 | #define MTSP_O_WRONLY 0x0001 | 76 | #define MTSP_O_WRONLY 0x0001 |
@@ -110,7 +111,8 @@ struct apsp_table syscall_command_table[] = { | |||
110 | { MTSP_SYSCALL_CLOSE, __NR_close }, | 111 | { MTSP_SYSCALL_CLOSE, __NR_close }, |
111 | { MTSP_SYSCALL_READ, __NR_read }, | 112 | { MTSP_SYSCALL_READ, __NR_read }, |
112 | { MTSP_SYSCALL_WRITE, __NR_write }, | 113 | { MTSP_SYSCALL_WRITE, __NR_write }, |
113 | { MTSP_SYSCALL_LSEEK32, __NR_lseek } | 114 | { MTSP_SYSCALL_LSEEK32, __NR_lseek }, |
115 | { MTSP_SYSCALL_IOCTL, __NR_ioctl } | ||
114 | }; | 116 | }; |
115 | 117 | ||
116 | static int sp_syscall(int num, int arg0, int arg1, int arg2, int arg3) | 118 | static int sp_syscall(int num, int arg0, int arg1, int arg2, int arg3) |
diff --git a/arch/mips/oprofile/op_model_mipsxx.c b/arch/mips/oprofile/op_model_mipsxx.c index 9d08608aaa51..69a8bcfe72b2 100644 --- a/arch/mips/oprofile/op_model_mipsxx.c +++ b/arch/mips/oprofile/op_model_mipsxx.c | |||
@@ -74,13 +74,13 @@ static inline void w_c0_ ## r ## n(unsigned int value) \ | |||
74 | 74 | ||
75 | __define_perf_accessors(perfcntr, 0, 2) | 75 | __define_perf_accessors(perfcntr, 0, 2) |
76 | __define_perf_accessors(perfcntr, 1, 3) | 76 | __define_perf_accessors(perfcntr, 1, 3) |
77 | __define_perf_accessors(perfcntr, 2, 2) | 77 | __define_perf_accessors(perfcntr, 2, 0) |
78 | __define_perf_accessors(perfcntr, 3, 2) | 78 | __define_perf_accessors(perfcntr, 3, 1) |
79 | 79 | ||
80 | __define_perf_accessors(perfctrl, 0, 2) | 80 | __define_perf_accessors(perfctrl, 0, 2) |
81 | __define_perf_accessors(perfctrl, 1, 3) | 81 | __define_perf_accessors(perfctrl, 1, 3) |
82 | __define_perf_accessors(perfctrl, 2, 2) | 82 | __define_perf_accessors(perfctrl, 2, 0) |
83 | __define_perf_accessors(perfctrl, 3, 2) | 83 | __define_perf_accessors(perfctrl, 3, 1) |
84 | 84 | ||
85 | struct op_mips_model op_model_mipsxx_ops; | 85 | struct op_mips_model op_model_mipsxx_ops; |
86 | 86 | ||
@@ -97,7 +97,6 @@ static void mipsxx_reg_setup(struct op_counter_config *ctr) | |||
97 | int i; | 97 | int i; |
98 | 98 | ||
99 | /* Compute the performance counter control word. */ | 99 | /* Compute the performance counter control word. */ |
100 | /* For now count kernel and user mode */ | ||
101 | for (i = 0; i < counters; i++) { | 100 | for (i = 0; i < counters; i++) { |
102 | reg.control[i] = 0; | 101 | reg.control[i] = 0; |
103 | reg.counter[i] = 0; | 102 | reg.counter[i] = 0; |
@@ -234,9 +233,6 @@ static inline int n_counters(void) | |||
234 | counters = __n_counters(); | 233 | counters = __n_counters(); |
235 | } | 234 | } |
236 | 235 | ||
237 | #ifdef CONFIG_MIPS_MT_SMP | ||
238 | counters >> 1; | ||
239 | #endif | ||
240 | return counters; | 236 | return counters; |
241 | } | 237 | } |
242 | 238 | ||
@@ -270,6 +266,10 @@ static int __init mipsxx_init(void) | |||
270 | 266 | ||
271 | reset_counters(counters); | 267 | reset_counters(counters); |
272 | 268 | ||
269 | #ifdef CONFIG_MIPS_MT_SMP | ||
270 | counters >>= 1; | ||
271 | #endif | ||
272 | |||
273 | op_model_mipsxx_ops.num_counters = counters; | 273 | op_model_mipsxx_ops.num_counters = counters; |
274 | switch (current_cpu_data.cputype) { | 274 | switch (current_cpu_data.cputype) { |
275 | case CPU_20KC: | 275 | case CPU_20KC: |
@@ -326,7 +326,11 @@ static int __init mipsxx_init(void) | |||
326 | 326 | ||
327 | static void mipsxx_exit(void) | 327 | static void mipsxx_exit(void) |
328 | { | 328 | { |
329 | reset_counters(op_model_mipsxx_ops.num_counters); | 329 | int counters = op_model_mipsxx_ops.num_counters; |
330 | #ifdef CONFIG_MIPS_MT_SMP | ||
331 | counters <<= 1; | ||
332 | #endif | ||
333 | reset_counters(counters); | ||
330 | 334 | ||
331 | perf_irq = null_perf_irq; | 335 | perf_irq = null_perf_irq; |
332 | } | 336 | } |
diff --git a/arch/mips/philips/pnx8550/common/int.c b/arch/mips/philips/pnx8550/common/int.c index d48665ebd33c..b1c4805a0b92 100644 --- a/arch/mips/philips/pnx8550/common/int.c +++ b/arch/mips/philips/pnx8550/common/int.c | |||
@@ -204,19 +204,7 @@ void __init arch_init_irq(void) | |||
204 | * Note, PCI INTA is active low on the bus, but inverted | 204 | * Note, PCI INTA is active low on the bus, but inverted |
205 | * in the GIC, so to us it's active high. | 205 | * in the GIC, so to us it's active high. |
206 | */ | 206 | */ |
207 | #ifdef CONFIG_PNX8550_V2PCI | 207 | PNX8550_GIC_REQ(i - PNX8550_INT_GIC_MIN) = 0x1E000000; |
208 | if (gic_int_line == (PNX8550_INT_GPIO0 - PNX8550_INT_GIC_MIN)) { | ||
209 | /* PCI INT through gpio 8, which is setup in | ||
210 | * pnx8550_setup.c and routed to GPIO | ||
211 | * Interrupt Level 0 (GPIO Connection 58). | ||
212 | * Set it active low. */ | ||
213 | |||
214 | PNX8550_GIC_REQ(gic_int_line) = 0x1E020000; | ||
215 | } else | ||
216 | #endif | ||
217 | { | ||
218 | PNX8550_GIC_REQ(i - PNX8550_INT_GIC_MIN) = 0x1E000000; | ||
219 | } | ||
220 | 208 | ||
221 | /* mask/priority is still 0 so we will not get any | 209 | /* mask/priority is still 0 so we will not get any |
222 | * interrupts until it is unmasked */ | 210 | * interrupts until it is unmasked */ |
diff --git a/arch/powerpc/configs/cell_defconfig b/arch/powerpc/configs/cell_defconfig index 24367319ce24..cf7e316ad4f6 100644 --- a/arch/powerpc/configs/cell_defconfig +++ b/arch/powerpc/configs/cell_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.20-rc5 | 3 | # Linux kernel version: 2.6.21-rc3 |
4 | # Mon Jan 22 22:12:56 2007 | 4 | # Fri Mar 9 23:34:53 2007 |
5 | # | 5 | # |
6 | CONFIG_PPC64=y | 6 | CONFIG_PPC64=y |
7 | CONFIG_64BIT=y | 7 | CONFIG_64BIT=y |
@@ -61,6 +61,7 @@ CONFIG_LOCALVERSION_AUTO=y | |||
61 | CONFIG_SWAP=y | 61 | CONFIG_SWAP=y |
62 | CONFIG_SYSVIPC=y | 62 | CONFIG_SYSVIPC=y |
63 | # CONFIG_IPC_NS is not set | 63 | # CONFIG_IPC_NS is not set |
64 | CONFIG_SYSVIPC_SYSCTL=y | ||
64 | # CONFIG_POSIX_MQUEUE is not set | 65 | # CONFIG_POSIX_MQUEUE is not set |
65 | # CONFIG_BSD_PROCESS_ACCT is not set | 66 | # CONFIG_BSD_PROCESS_ACCT is not set |
66 | # CONFIG_TASKSTATS is not set | 67 | # CONFIG_TASKSTATS is not set |
@@ -71,6 +72,7 @@ CONFIG_IKCONFIG_PROC=y | |||
71 | CONFIG_CPUSETS=y | 72 | CONFIG_CPUSETS=y |
72 | CONFIG_SYSFS_DEPRECATED=y | 73 | CONFIG_SYSFS_DEPRECATED=y |
73 | # CONFIG_RELAY is not set | 74 | # CONFIG_RELAY is not set |
75 | CONFIG_BLK_DEV_INITRD=y | ||
74 | CONFIG_INITRAMFS_SOURCE="" | 76 | CONFIG_INITRAMFS_SOURCE="" |
75 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | 77 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y |
76 | CONFIG_SYSCTL=y | 78 | CONFIG_SYSCTL=y |
@@ -133,6 +135,7 @@ CONFIG_PPC_MULTIPLATFORM=y | |||
133 | # CONFIG_PPC_PSERIES is not set | 135 | # CONFIG_PPC_PSERIES is not set |
134 | # CONFIG_PPC_ISERIES is not set | 136 | # CONFIG_PPC_ISERIES is not set |
135 | # CONFIG_PPC_MPC52xx is not set | 137 | # CONFIG_PPC_MPC52xx is not set |
138 | # CONFIG_PPC_MPC5200 is not set | ||
136 | # CONFIG_PPC_PMAC is not set | 139 | # CONFIG_PPC_PMAC is not set |
137 | # CONFIG_PPC_MAPLE is not set | 140 | # CONFIG_PPC_MAPLE is not set |
138 | # CONFIG_PPC_PASEMI is not set | 141 | # CONFIG_PPC_PASEMI is not set |
@@ -140,8 +143,10 @@ CONFIG_PPC_CELL=y | |||
140 | CONFIG_PPC_CELL_NATIVE=y | 143 | CONFIG_PPC_CELL_NATIVE=y |
141 | CONFIG_PPC_IBM_CELL_BLADE=y | 144 | CONFIG_PPC_IBM_CELL_BLADE=y |
142 | CONFIG_PPC_PS3=y | 145 | CONFIG_PPC_PS3=y |
146 | CONFIG_PPC_CELLEB=y | ||
143 | CONFIG_PPC_NATIVE=y | 147 | CONFIG_PPC_NATIVE=y |
144 | CONFIG_UDBG_RTAS_CONSOLE=y | 148 | CONFIG_UDBG_RTAS_CONSOLE=y |
149 | CONFIG_PPC_UDBG_BEAT=y | ||
145 | # CONFIG_U3_DART is not set | 150 | # CONFIG_U3_DART is not set |
146 | CONFIG_PPC_RTAS=y | 151 | CONFIG_PPC_RTAS=y |
147 | # CONFIG_RTAS_ERROR_LOGGING is not set | 152 | # CONFIG_RTAS_ERROR_LOGGING is not set |
@@ -181,10 +186,13 @@ CONFIG_CBE_CPUFREQ=m | |||
181 | # | 186 | # |
182 | # PS3 Platform Options | 187 | # PS3 Platform Options |
183 | # | 188 | # |
189 | # CONFIG_PS3_ADVANCED is not set | ||
184 | CONFIG_PS3_HTAB_SIZE=20 | 190 | CONFIG_PS3_HTAB_SIZE=20 |
185 | # CONFIG_PS3_DYNAMIC_DMA is not set | 191 | # CONFIG_PS3_DYNAMIC_DMA is not set |
186 | CONFIG_PS3_USE_LPAR_ADDR=y | 192 | CONFIG_PS3_USE_LPAR_ADDR=y |
187 | CONFIG_PS3_VUART=y | 193 | CONFIG_PS3_VUART=y |
194 | CONFIG_PS3_PS3AV=y | ||
195 | CONFIG_PS3_SYS_MANAGER=y | ||
188 | 196 | ||
189 | # | 197 | # |
190 | # Kernel options | 198 | # Kernel options |
@@ -226,6 +234,7 @@ CONFIG_MEMORY_HOTPLUG_SPARSE=y | |||
226 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 234 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
227 | CONFIG_MIGRATION=y | 235 | CONFIG_MIGRATION=y |
228 | CONFIG_RESOURCES_64BIT=y | 236 | CONFIG_RESOURCES_64BIT=y |
237 | CONFIG_ZONE_DMA_FLAG=1 | ||
229 | CONFIG_ARCH_MEMORY_PROBE=y | 238 | CONFIG_ARCH_MEMORY_PROBE=y |
230 | CONFIG_NODES_SPAN_OTHER_NODES=y | 239 | CONFIG_NODES_SPAN_OTHER_NODES=y |
231 | CONFIG_PPC_64K_PAGES=y | 240 | CONFIG_PPC_64K_PAGES=y |
@@ -239,6 +248,7 @@ CONFIG_ISA_DMA_API=y | |||
239 | # | 248 | # |
240 | # Bus options | 249 | # Bus options |
241 | # | 250 | # |
251 | CONFIG_ZONE_DMA=y | ||
242 | CONFIG_GENERIC_ISA_DMA=y | 252 | CONFIG_GENERIC_ISA_DMA=y |
243 | # CONFIG_MPIC_WEIRD is not set | 253 | # CONFIG_MPIC_WEIRD is not set |
244 | # CONFIG_PPC_I8259 is not set | 254 | # CONFIG_PPC_I8259 is not set |
@@ -274,6 +284,7 @@ CONFIG_UNIX=y | |||
274 | CONFIG_XFRM=y | 284 | CONFIG_XFRM=y |
275 | # CONFIG_XFRM_USER is not set | 285 | # CONFIG_XFRM_USER is not set |
276 | # CONFIG_XFRM_SUB_POLICY is not set | 286 | # CONFIG_XFRM_SUB_POLICY is not set |
287 | # CONFIG_XFRM_MIGRATE is not set | ||
277 | # CONFIG_NET_KEY is not set | 288 | # CONFIG_NET_KEY is not set |
278 | CONFIG_INET=y | 289 | CONFIG_INET=y |
279 | CONFIG_IP_MULTICAST=y | 290 | CONFIG_IP_MULTICAST=y |
@@ -340,6 +351,7 @@ CONFIG_NETFILTER_XT_TARGET_DSCP=m | |||
340 | CONFIG_NETFILTER_XT_TARGET_MARK=m | 351 | CONFIG_NETFILTER_XT_TARGET_MARK=m |
341 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m | 352 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m |
342 | CONFIG_NETFILTER_XT_TARGET_NFLOG=m | 353 | CONFIG_NETFILTER_XT_TARGET_NFLOG=m |
354 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m | ||
343 | CONFIG_NETFILTER_XT_MATCH_COMMENT=m | 355 | CONFIG_NETFILTER_XT_MATCH_COMMENT=m |
344 | CONFIG_NETFILTER_XT_MATCH_DCCP=m | 356 | CONFIG_NETFILTER_XT_MATCH_DCCP=m |
345 | CONFIG_NETFILTER_XT_MATCH_DSCP=m | 357 | CONFIG_NETFILTER_XT_MATCH_DSCP=m |
@@ -376,7 +388,6 @@ CONFIG_IP_NF_FILTER=m | |||
376 | CONFIG_IP_NF_TARGET_REJECT=m | 388 | CONFIG_IP_NF_TARGET_REJECT=m |
377 | CONFIG_IP_NF_TARGET_LOG=m | 389 | CONFIG_IP_NF_TARGET_LOG=m |
378 | CONFIG_IP_NF_TARGET_ULOG=m | 390 | CONFIG_IP_NF_TARGET_ULOG=m |
379 | CONFIG_IP_NF_TARGET_TCPMSS=m | ||
380 | CONFIG_IP_NF_MANGLE=m | 391 | CONFIG_IP_NF_MANGLE=m |
381 | CONFIG_IP_NF_TARGET_TOS=m | 392 | CONFIG_IP_NF_TARGET_TOS=m |
382 | CONFIG_IP_NF_TARGET_ECN=m | 393 | CONFIG_IP_NF_TARGET_ECN=m |
@@ -444,6 +455,7 @@ CONFIG_STANDALONE=y | |||
444 | CONFIG_PREVENT_FIRMWARE_BUILD=y | 455 | CONFIG_PREVENT_FIRMWARE_BUILD=y |
445 | CONFIG_FW_LOADER=y | 456 | CONFIG_FW_LOADER=y |
446 | # CONFIG_DEBUG_DRIVER is not set | 457 | # CONFIG_DEBUG_DRIVER is not set |
458 | # CONFIG_DEBUG_DEVRES is not set | ||
447 | # CONFIG_SYS_HYPERVISOR is not set | 459 | # CONFIG_SYS_HYPERVISOR is not set |
448 | 460 | ||
449 | # | 461 | # |
@@ -464,6 +476,7 @@ CONFIG_FW_LOADER=y | |||
464 | # | 476 | # |
465 | # Plug and Play support | 477 | # Plug and Play support |
466 | # | 478 | # |
479 | # CONFIG_PNPACPI is not set | ||
467 | 480 | ||
468 | # | 481 | # |
469 | # Block devices | 482 | # Block devices |
@@ -483,7 +496,6 @@ CONFIG_BLK_DEV_RAM=y | |||
483 | CONFIG_BLK_DEV_RAM_COUNT=16 | 496 | CONFIG_BLK_DEV_RAM_COUNT=16 |
484 | CONFIG_BLK_DEV_RAM_SIZE=131072 | 497 | CONFIG_BLK_DEV_RAM_SIZE=131072 |
485 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | 498 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 |
486 | CONFIG_BLK_DEV_INITRD=y | ||
487 | # CONFIG_CDROM_PKTCDVD is not set | 499 | # CONFIG_CDROM_PKTCDVD is not set |
488 | # CONFIG_ATA_OVER_ETH is not set | 500 | # CONFIG_ATA_OVER_ETH is not set |
489 | 501 | ||
@@ -537,6 +549,7 @@ CONFIG_BLK_DEV_AEC62XX=y | |||
537 | # CONFIG_BLK_DEV_JMICRON is not set | 549 | # CONFIG_BLK_DEV_JMICRON is not set |
538 | # CONFIG_BLK_DEV_SC1200 is not set | 550 | # CONFIG_BLK_DEV_SC1200 is not set |
539 | # CONFIG_BLK_DEV_PIIX is not set | 551 | # CONFIG_BLK_DEV_PIIX is not set |
552 | # CONFIG_BLK_DEV_IT8213 is not set | ||
540 | # CONFIG_BLK_DEV_IT821X is not set | 553 | # CONFIG_BLK_DEV_IT821X is not set |
541 | # CONFIG_BLK_DEV_NS87415 is not set | 554 | # CONFIG_BLK_DEV_NS87415 is not set |
542 | # CONFIG_BLK_DEV_PDC202XX_OLD is not set | 555 | # CONFIG_BLK_DEV_PDC202XX_OLD is not set |
@@ -547,6 +560,8 @@ CONFIG_BLK_DEV_SIIMAGE=y | |||
547 | # CONFIG_BLK_DEV_SLC90E66 is not set | 560 | # CONFIG_BLK_DEV_SLC90E66 is not set |
548 | # CONFIG_BLK_DEV_TRM290 is not set | 561 | # CONFIG_BLK_DEV_TRM290 is not set |
549 | # CONFIG_BLK_DEV_VIA82CXXX is not set | 562 | # CONFIG_BLK_DEV_VIA82CXXX is not set |
563 | # CONFIG_BLK_DEV_TC86C001 is not set | ||
564 | CONFIG_BLK_DEV_IDE_CELLEB=y | ||
550 | # CONFIG_IDE_ARM is not set | 565 | # CONFIG_IDE_ARM is not set |
551 | CONFIG_BLK_DEV_IDEDMA=y | 566 | CONFIG_BLK_DEV_IDEDMA=y |
552 | # CONFIG_IDEDMA_IVB is not set | 567 | # CONFIG_IDEDMA_IVB is not set |
@@ -557,7 +572,7 @@ CONFIG_IDEDMA_AUTO=y | |||
557 | # SCSI device support | 572 | # SCSI device support |
558 | # | 573 | # |
559 | # CONFIG_RAID_ATTRS is not set | 574 | # CONFIG_RAID_ATTRS is not set |
560 | CONFIG_SCSI=m | 575 | CONFIG_SCSI=y |
561 | # CONFIG_SCSI_TGT is not set | 576 | # CONFIG_SCSI_TGT is not set |
562 | # CONFIG_SCSI_NETLINK is not set | 577 | # CONFIG_SCSI_NETLINK is not set |
563 | CONFIG_SCSI_PROC_FS=y | 578 | CONFIG_SCSI_PROC_FS=y |
@@ -565,12 +580,12 @@ CONFIG_SCSI_PROC_FS=y | |||
565 | # | 580 | # |
566 | # SCSI support type (disk, tape, CD-ROM) | 581 | # SCSI support type (disk, tape, CD-ROM) |
567 | # | 582 | # |
568 | CONFIG_BLK_DEV_SD=m | 583 | CONFIG_BLK_DEV_SD=y |
569 | # CONFIG_CHR_DEV_ST is not set | 584 | # CONFIG_CHR_DEV_ST is not set |
570 | # CONFIG_CHR_DEV_OSST is not set | 585 | # CONFIG_CHR_DEV_OSST is not set |
571 | CONFIG_BLK_DEV_SR=m | 586 | CONFIG_BLK_DEV_SR=m |
572 | # CONFIG_BLK_DEV_SR_VENDOR is not set | 587 | # CONFIG_BLK_DEV_SR_VENDOR is not set |
573 | CONFIG_CHR_DEV_SG=m | 588 | CONFIG_CHR_DEV_SG=y |
574 | # CONFIG_CHR_DEV_SCH is not set | 589 | # CONFIG_CHR_DEV_SCH is not set |
575 | 590 | ||
576 | # | 591 | # |
@@ -587,7 +602,7 @@ CONFIG_CHR_DEV_SG=m | |||
587 | # CONFIG_SCSI_SPI_ATTRS is not set | 602 | # CONFIG_SCSI_SPI_ATTRS is not set |
588 | # CONFIG_SCSI_FC_ATTRS is not set | 603 | # CONFIG_SCSI_FC_ATTRS is not set |
589 | # CONFIG_SCSI_ISCSI_ATTRS is not set | 604 | # CONFIG_SCSI_ISCSI_ATTRS is not set |
590 | # CONFIG_SCSI_SAS_ATTRS is not set | 605 | CONFIG_SCSI_SAS_ATTRS=y |
591 | # CONFIG_SCSI_SAS_LIBSAS is not set | 606 | # CONFIG_SCSI_SAS_LIBSAS is not set |
592 | 607 | ||
593 | # | 608 | # |
@@ -617,6 +632,7 @@ CONFIG_CHR_DEV_SG=m | |||
617 | # CONFIG_SCSI_INIA100 is not set | 632 | # CONFIG_SCSI_INIA100 is not set |
618 | # CONFIG_SCSI_STEX is not set | 633 | # CONFIG_SCSI_STEX is not set |
619 | # CONFIG_SCSI_SYM53C8XX_2 is not set | 634 | # CONFIG_SCSI_SYM53C8XX_2 is not set |
635 | # CONFIG_SCSI_IPR is not set | ||
620 | # CONFIG_SCSI_QLOGIC_1280 is not set | 636 | # CONFIG_SCSI_QLOGIC_1280 is not set |
621 | # CONFIG_SCSI_QLA_FC is not set | 637 | # CONFIG_SCSI_QLA_FC is not set |
622 | # CONFIG_SCSI_QLA_ISCSI is not set | 638 | # CONFIG_SCSI_QLA_ISCSI is not set |
@@ -629,7 +645,60 @@ CONFIG_CHR_DEV_SG=m | |||
629 | # | 645 | # |
630 | # Serial ATA (prod) and Parallel ATA (experimental) drivers | 646 | # Serial ATA (prod) and Parallel ATA (experimental) drivers |
631 | # | 647 | # |
632 | # CONFIG_ATA is not set | 648 | CONFIG_ATA=y |
649 | # CONFIG_ATA_NONSTANDARD is not set | ||
650 | # CONFIG_SATA_AHCI is not set | ||
651 | # CONFIG_SATA_SVW is not set | ||
652 | # CONFIG_ATA_PIIX is not set | ||
653 | # CONFIG_SATA_MV is not set | ||
654 | # CONFIG_SATA_NV is not set | ||
655 | # CONFIG_PDC_ADMA is not set | ||
656 | # CONFIG_SATA_QSTOR is not set | ||
657 | CONFIG_SATA_PROMISE=y | ||
658 | # CONFIG_SATA_SX4 is not set | ||
659 | # CONFIG_SATA_SIL is not set | ||
660 | # CONFIG_SATA_SIL24 is not set | ||
661 | # CONFIG_SATA_SIS is not set | ||
662 | # CONFIG_SATA_ULI is not set | ||
663 | # CONFIG_SATA_VIA is not set | ||
664 | # CONFIG_SATA_VITESSE is not set | ||
665 | # CONFIG_SATA_INIC162X is not set | ||
666 | # CONFIG_PATA_ALI is not set | ||
667 | # CONFIG_PATA_AMD is not set | ||
668 | # CONFIG_PATA_ARTOP is not set | ||
669 | # CONFIG_PATA_ATIIXP is not set | ||
670 | # CONFIG_PATA_CMD64X is not set | ||
671 | # CONFIG_PATA_CS5520 is not set | ||
672 | # CONFIG_PATA_CS5530 is not set | ||
673 | # CONFIG_PATA_CYPRESS is not set | ||
674 | # CONFIG_PATA_EFAR is not set | ||
675 | # CONFIG_ATA_GENERIC is not set | ||
676 | # CONFIG_PATA_HPT366 is not set | ||
677 | # CONFIG_PATA_HPT37X is not set | ||
678 | # CONFIG_PATA_HPT3X2N is not set | ||
679 | # CONFIG_PATA_HPT3X3 is not set | ||
680 | # CONFIG_PATA_IT821X is not set | ||
681 | # CONFIG_PATA_IT8213 is not set | ||
682 | # CONFIG_PATA_JMICRON is not set | ||
683 | # CONFIG_PATA_TRIFLEX is not set | ||
684 | # CONFIG_PATA_MARVELL is not set | ||
685 | # CONFIG_PATA_MPIIX is not set | ||
686 | # CONFIG_PATA_OLDPIIX is not set | ||
687 | # CONFIG_PATA_NETCELL is not set | ||
688 | # CONFIG_PATA_NS87410 is not set | ||
689 | # CONFIG_PATA_OPTI is not set | ||
690 | # CONFIG_PATA_OPTIDMA is not set | ||
691 | # CONFIG_PATA_PDC_OLD is not set | ||
692 | # CONFIG_PATA_RADISYS is not set | ||
693 | # CONFIG_PATA_RZ1000 is not set | ||
694 | # CONFIG_PATA_SC1200 is not set | ||
695 | # CONFIG_PATA_SERVERWORKS is not set | ||
696 | CONFIG_PATA_PDC2027X=m | ||
697 | # CONFIG_PATA_SIL680 is not set | ||
698 | # CONFIG_PATA_SIS is not set | ||
699 | # CONFIG_PATA_VIA is not set | ||
700 | # CONFIG_PATA_WINBOND is not set | ||
701 | # CONFIG_PATA_SCC is not set | ||
633 | 702 | ||
634 | # | 703 | # |
635 | # Multi-device support (RAID and LVM) | 704 | # Multi-device support (RAID and LVM) |
@@ -655,10 +724,12 @@ CONFIG_DM_MULTIPATH=m | |||
655 | # | 724 | # |
656 | # Fusion MPT device support | 725 | # Fusion MPT device support |
657 | # | 726 | # |
658 | # CONFIG_FUSION is not set | 727 | CONFIG_FUSION=y |
659 | # CONFIG_FUSION_SPI is not set | 728 | # CONFIG_FUSION_SPI is not set |
660 | # CONFIG_FUSION_FC is not set | 729 | # CONFIG_FUSION_FC is not set |
661 | # CONFIG_FUSION_SAS is not set | 730 | CONFIG_FUSION_SAS=y |
731 | CONFIG_FUSION_MAX_SGE=128 | ||
732 | # CONFIG_FUSION_CTL is not set | ||
662 | 733 | ||
663 | # | 734 | # |
664 | # IEEE 1394 (FireWire) support | 735 | # IEEE 1394 (FireWire) support |
@@ -732,15 +803,18 @@ CONFIG_TIGON3=y | |||
732 | # CONFIG_BNX2 is not set | 803 | # CONFIG_BNX2 is not set |
733 | CONFIG_SPIDER_NET=y | 804 | CONFIG_SPIDER_NET=y |
734 | # CONFIG_QLA3XXX is not set | 805 | # CONFIG_QLA3XXX is not set |
806 | # CONFIG_ATL1 is not set | ||
735 | 807 | ||
736 | # | 808 | # |
737 | # Ethernet (10000 Mbit) | 809 | # Ethernet (10000 Mbit) |
738 | # | 810 | # |
739 | # CONFIG_CHELSIO_T1 is not set | 811 | # CONFIG_CHELSIO_T1 is not set |
812 | # CONFIG_CHELSIO_T3 is not set | ||
740 | # CONFIG_IXGB is not set | 813 | # CONFIG_IXGB is not set |
741 | # CONFIG_S2IO is not set | 814 | # CONFIG_S2IO is not set |
742 | # CONFIG_MYRI10GE is not set | 815 | # CONFIG_MYRI10GE is not set |
743 | # CONFIG_NETXEN_NIC is not set | 816 | # CONFIG_NETXEN_NIC is not set |
817 | # CONFIG_PASEMI_MAC is not set | ||
744 | 818 | ||
745 | # | 819 | # |
746 | # Token Ring devices | 820 | # Token Ring devices |
@@ -853,16 +927,27 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | |||
853 | # | 927 | # |
854 | CONFIG_SERIAL_CORE=y | 928 | CONFIG_SERIAL_CORE=y |
855 | CONFIG_SERIAL_CORE_CONSOLE=y | 929 | CONFIG_SERIAL_CORE_CONSOLE=y |
930 | CONFIG_SERIAL_TXX9=y | ||
931 | CONFIG_HAS_TXX9_SERIAL=y | ||
932 | CONFIG_SERIAL_TXX9_NR_UARTS=2 | ||
933 | CONFIG_SERIAL_TXX9_CONSOLE=y | ||
856 | # CONFIG_SERIAL_JSM is not set | 934 | # CONFIG_SERIAL_JSM is not set |
935 | CONFIG_SERIAL_OF_PLATFORM=y | ||
857 | CONFIG_UNIX98_PTYS=y | 936 | CONFIG_UNIX98_PTYS=y |
858 | # CONFIG_LEGACY_PTYS is not set | 937 | # CONFIG_LEGACY_PTYS is not set |
859 | CONFIG_HVC_DRIVER=y | 938 | CONFIG_HVC_DRIVER=y |
860 | CONFIG_HVC_RTAS=y | 939 | CONFIG_HVC_RTAS=y |
940 | # CONFIG_HVC_BEAT is not set | ||
861 | 941 | ||
862 | # | 942 | # |
863 | # IPMI | 943 | # IPMI |
864 | # | 944 | # |
865 | # CONFIG_IPMI_HANDLER is not set | 945 | CONFIG_IPMI_HANDLER=m |
946 | # CONFIG_IPMI_PANIC_EVENT is not set | ||
947 | CONFIG_IPMI_DEVICE_INTERFACE=m | ||
948 | CONFIG_IPMI_SI=m | ||
949 | CONFIG_IPMI_WATCHDOG=m | ||
950 | CONFIG_IPMI_POWEROFF=m | ||
866 | 951 | ||
867 | # | 952 | # |
868 | # Watchdog Cards | 953 | # Watchdog Cards |
@@ -874,7 +959,7 @@ CONFIG_WATCHDOG=y | |||
874 | # Watchdog Device Drivers | 959 | # Watchdog Device Drivers |
875 | # | 960 | # |
876 | # CONFIG_SOFT_WATCHDOG is not set | 961 | # CONFIG_SOFT_WATCHDOG is not set |
877 | CONFIG_WATCHDOG_RTAS=y | 962 | # CONFIG_WATCHDOG_RTAS is not set |
878 | 963 | ||
879 | # | 964 | # |
880 | # PCI-based Watchdog Cards | 965 | # PCI-based Watchdog Cards |
@@ -929,6 +1014,7 @@ CONFIG_I2C_ALGOBIT=y | |||
929 | # CONFIG_I2C_NFORCE2 is not set | 1014 | # CONFIG_I2C_NFORCE2 is not set |
930 | # CONFIG_I2C_OCORES is not set | 1015 | # CONFIG_I2C_OCORES is not set |
931 | # CONFIG_I2C_PARPORT_LIGHT is not set | 1016 | # CONFIG_I2C_PARPORT_LIGHT is not set |
1017 | # CONFIG_I2C_PASEMI is not set | ||
932 | # CONFIG_I2C_PROSAVAGE is not set | 1018 | # CONFIG_I2C_PROSAVAGE is not set |
933 | # CONFIG_I2C_SAVAGE4 is not set | 1019 | # CONFIG_I2C_SAVAGE4 is not set |
934 | # CONFIG_I2C_SIS5595 is not set | 1020 | # CONFIG_I2C_SIS5595 is not set |
@@ -973,6 +1059,11 @@ CONFIG_I2C_ALGOBIT=y | |||
973 | # CONFIG_HWMON_VID is not set | 1059 | # CONFIG_HWMON_VID is not set |
974 | 1060 | ||
975 | # | 1061 | # |
1062 | # Multifunction device drivers | ||
1063 | # | ||
1064 | # CONFIG_MFD_SM501 is not set | ||
1065 | |||
1066 | # | ||
976 | # Multimedia devices | 1067 | # Multimedia devices |
977 | # | 1068 | # |
978 | # CONFIG_VIDEO_DEV is not set | 1069 | # CONFIG_VIDEO_DEV is not set |
@@ -986,7 +1077,7 @@ CONFIG_I2C_ALGOBIT=y | |||
986 | # | 1077 | # |
987 | # Graphics support | 1078 | # Graphics support |
988 | # | 1079 | # |
989 | CONFIG_FIRMWARE_EDID=y | 1080 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set |
990 | # CONFIG_FB is not set | 1081 | # CONFIG_FB is not set |
991 | # CONFIG_FB_IBM_GXT4500 is not set | 1082 | # CONFIG_FB_IBM_GXT4500 is not set |
992 | 1083 | ||
@@ -995,7 +1086,6 @@ CONFIG_FIRMWARE_EDID=y | |||
995 | # | 1086 | # |
996 | # CONFIG_VGA_CONSOLE is not set | 1087 | # CONFIG_VGA_CONSOLE is not set |
997 | CONFIG_DUMMY_CONSOLE=y | 1088 | CONFIG_DUMMY_CONSOLE=y |
998 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
999 | 1089 | ||
1000 | # | 1090 | # |
1001 | # Sound | 1091 | # Sound |
@@ -1006,6 +1096,7 @@ CONFIG_DUMMY_CONSOLE=y | |||
1006 | # HID Devices | 1096 | # HID Devices |
1007 | # | 1097 | # |
1008 | CONFIG_HID=m | 1098 | CONFIG_HID=m |
1099 | # CONFIG_HID_DEBUG is not set | ||
1009 | 1100 | ||
1010 | # | 1101 | # |
1011 | # USB support | 1102 | # USB support |
@@ -1020,9 +1111,7 @@ CONFIG_USB=m | |||
1020 | # Miscellaneous USB options | 1111 | # Miscellaneous USB options |
1021 | # | 1112 | # |
1022 | CONFIG_USB_DEVICEFS=y | 1113 | CONFIG_USB_DEVICEFS=y |
1023 | # CONFIG_USB_BANDWIDTH is not set | ||
1024 | # CONFIG_USB_DYNAMIC_MINORS is not set | 1114 | # CONFIG_USB_DYNAMIC_MINORS is not set |
1025 | # CONFIG_USB_MULTITHREAD_PROBE is not set | ||
1026 | # CONFIG_USB_OTG is not set | 1115 | # CONFIG_USB_OTG is not set |
1027 | 1116 | ||
1028 | # | 1117 | # |
@@ -1032,9 +1121,15 @@ CONFIG_USB_EHCI_HCD=m | |||
1032 | # CONFIG_USB_EHCI_SPLIT_ISO is not set | 1121 | # CONFIG_USB_EHCI_SPLIT_ISO is not set |
1033 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set | 1122 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set |
1034 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set | 1123 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set |
1124 | CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y | ||
1035 | # CONFIG_USB_ISP116X_HCD is not set | 1125 | # CONFIG_USB_ISP116X_HCD is not set |
1036 | CONFIG_USB_OHCI_HCD=m | 1126 | CONFIG_USB_OHCI_HCD=m |
1037 | # CONFIG_USB_OHCI_BIG_ENDIAN is not set | 1127 | CONFIG_USB_OHCI_HCD_PPC_OF=y |
1128 | CONFIG_USB_OHCI_HCD_PPC_OF_BE=y | ||
1129 | # CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set | ||
1130 | CONFIG_USB_OHCI_HCD_PCI=y | ||
1131 | CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y | ||
1132 | CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y | ||
1038 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | 1133 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y |
1039 | # CONFIG_USB_UHCI_HCD is not set | 1134 | # CONFIG_USB_UHCI_HCD is not set |
1040 | # CONFIG_USB_SL811_HCD is not set | 1135 | # CONFIG_USB_SL811_HCD is not set |
@@ -1088,6 +1183,7 @@ CONFIG_USB_STORAGE=m | |||
1088 | # CONFIG_USB_ATI_REMOTE2 is not set | 1183 | # CONFIG_USB_ATI_REMOTE2 is not set |
1089 | # CONFIG_USB_KEYSPAN_REMOTE is not set | 1184 | # CONFIG_USB_KEYSPAN_REMOTE is not set |
1090 | # CONFIG_USB_APPLETOUCH is not set | 1185 | # CONFIG_USB_APPLETOUCH is not set |
1186 | # CONFIG_USB_GTCO is not set | ||
1091 | 1187 | ||
1092 | # | 1188 | # |
1093 | # USB Imaging devices | 1189 | # USB Imaging devices |
@@ -1125,6 +1221,7 @@ CONFIG_USB_MON=y | |||
1125 | # CONFIG_USB_RIO500 is not set | 1221 | # CONFIG_USB_RIO500 is not set |
1126 | # CONFIG_USB_LEGOTOWER is not set | 1222 | # CONFIG_USB_LEGOTOWER is not set |
1127 | # CONFIG_USB_LCD is not set | 1223 | # CONFIG_USB_LCD is not set |
1224 | # CONFIG_USB_BERRY_CHARGE is not set | ||
1128 | # CONFIG_USB_LED is not set | 1225 | # CONFIG_USB_LED is not set |
1129 | # CONFIG_USB_CYPRESS_CY7C63 is not set | 1226 | # CONFIG_USB_CYPRESS_CY7C63 is not set |
1130 | # CONFIG_USB_CYTHERM is not set | 1227 | # CONFIG_USB_CYTHERM is not set |
@@ -1135,6 +1232,7 @@ CONFIG_USB_MON=y | |||
1135 | # CONFIG_USB_SISUSBVGA is not set | 1232 | # CONFIG_USB_SISUSBVGA is not set |
1136 | # CONFIG_USB_LD is not set | 1233 | # CONFIG_USB_LD is not set |
1137 | # CONFIG_USB_TRANCEVIBRATOR is not set | 1234 | # CONFIG_USB_TRANCEVIBRATOR is not set |
1235 | # CONFIG_USB_IOWARRIOR is not set | ||
1138 | # CONFIG_USB_TEST is not set | 1236 | # CONFIG_USB_TEST is not set |
1139 | 1237 | ||
1140 | # | 1238 | # |
@@ -1175,6 +1273,7 @@ CONFIG_INFINIBAND_MTHCA=m | |||
1175 | CONFIG_INFINIBAND_MTHCA_DEBUG=y | 1273 | CONFIG_INFINIBAND_MTHCA_DEBUG=y |
1176 | # CONFIG_INFINIBAND_AMSO1100 is not set | 1274 | # CONFIG_INFINIBAND_AMSO1100 is not set |
1177 | CONFIG_INFINIBAND_IPOIB=m | 1275 | CONFIG_INFINIBAND_IPOIB=m |
1276 | # CONFIG_INFINIBAND_IPOIB_CM is not set | ||
1178 | CONFIG_INFINIBAND_IPOIB_DEBUG=y | 1277 | CONFIG_INFINIBAND_IPOIB_DEBUG=y |
1179 | CONFIG_INFINIBAND_IPOIB_DEBUG_DATA=y | 1278 | CONFIG_INFINIBAND_IPOIB_DEBUG_DATA=y |
1180 | # CONFIG_INFINIBAND_SRP is not set | 1279 | # CONFIG_INFINIBAND_SRP is not set |
@@ -1203,6 +1302,10 @@ CONFIG_INFINIBAND_IPOIB_DEBUG_DATA=y | |||
1203 | # | 1302 | # |
1204 | 1303 | ||
1205 | # | 1304 | # |
1305 | # Auxiliary Display support | ||
1306 | # | ||
1307 | |||
1308 | # | ||
1206 | # Virtualization | 1309 | # Virtualization |
1207 | # | 1310 | # |
1208 | 1311 | ||
@@ -1395,7 +1498,8 @@ CONFIG_TEXTSEARCH_KMP=m | |||
1395 | CONFIG_TEXTSEARCH_BM=m | 1498 | CONFIG_TEXTSEARCH_BM=m |
1396 | CONFIG_TEXTSEARCH_FSM=m | 1499 | CONFIG_TEXTSEARCH_FSM=m |
1397 | CONFIG_PLIST=y | 1500 | CONFIG_PLIST=y |
1398 | CONFIG_IOMAP_COPY=y | 1501 | CONFIG_HAS_IOMEM=y |
1502 | CONFIG_HAS_IOPORT=y | ||
1399 | 1503 | ||
1400 | # | 1504 | # |
1401 | # Instrumentation Support | 1505 | # Instrumentation Support |
@@ -1414,15 +1518,16 @@ CONFIG_MAGIC_SYSRQ=y | |||
1414 | CONFIG_DEBUG_FS=y | 1518 | CONFIG_DEBUG_FS=y |
1415 | # CONFIG_HEADERS_CHECK is not set | 1519 | # CONFIG_HEADERS_CHECK is not set |
1416 | CONFIG_DEBUG_KERNEL=y | 1520 | CONFIG_DEBUG_KERNEL=y |
1521 | # CONFIG_DEBUG_SHIRQ is not set | ||
1417 | CONFIG_LOG_BUF_SHIFT=15 | 1522 | CONFIG_LOG_BUF_SHIFT=15 |
1418 | CONFIG_DETECT_SOFTLOCKUP=y | 1523 | # CONFIG_DETECT_SOFTLOCKUP is not set |
1419 | # CONFIG_SCHEDSTATS is not set | 1524 | # CONFIG_SCHEDSTATS is not set |
1525 | # CONFIG_TIMER_STATS is not set | ||
1420 | # CONFIG_DEBUG_SLAB is not set | 1526 | # CONFIG_DEBUG_SLAB is not set |
1421 | # CONFIG_DEBUG_RT_MUTEXES is not set | 1527 | # CONFIG_DEBUG_RT_MUTEXES is not set |
1422 | # CONFIG_RT_MUTEX_TESTER is not set | 1528 | # CONFIG_RT_MUTEX_TESTER is not set |
1423 | # CONFIG_DEBUG_SPINLOCK is not set | 1529 | # CONFIG_DEBUG_SPINLOCK is not set |
1424 | CONFIG_DEBUG_MUTEXES=y | 1530 | CONFIG_DEBUG_MUTEXES=y |
1425 | # CONFIG_DEBUG_RWSEMS is not set | ||
1426 | CONFIG_DEBUG_SPINLOCK_SLEEP=y | 1531 | CONFIG_DEBUG_SPINLOCK_SLEEP=y |
1427 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | 1532 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set |
1428 | # CONFIG_DEBUG_KOBJECT is not set | 1533 | # CONFIG_DEBUG_KOBJECT is not set |
@@ -1432,6 +1537,7 @@ CONFIG_DEBUG_BUGVERBOSE=y | |||
1432 | # CONFIG_DEBUG_LIST is not set | 1537 | # CONFIG_DEBUG_LIST is not set |
1433 | # CONFIG_FORCED_INLINING is not set | 1538 | # CONFIG_FORCED_INLINING is not set |
1434 | # CONFIG_RCU_TORTURE_TEST is not set | 1539 | # CONFIG_RCU_TORTURE_TEST is not set |
1540 | # CONFIG_FAULT_INJECTION is not set | ||
1435 | # CONFIG_DEBUG_STACKOVERFLOW is not set | 1541 | # CONFIG_DEBUG_STACKOVERFLOW is not set |
1436 | # CONFIG_DEBUG_STACK_USAGE is not set | 1542 | # CONFIG_DEBUG_STACK_USAGE is not set |
1437 | CONFIG_DEBUGGER=y | 1543 | CONFIG_DEBUGGER=y |
@@ -1469,8 +1575,10 @@ CONFIG_CRYPTO_SHA1=m | |||
1469 | # CONFIG_CRYPTO_GF128MUL is not set | 1575 | # CONFIG_CRYPTO_GF128MUL is not set |
1470 | CONFIG_CRYPTO_ECB=m | 1576 | CONFIG_CRYPTO_ECB=m |
1471 | CONFIG_CRYPTO_CBC=m | 1577 | CONFIG_CRYPTO_CBC=m |
1578 | CONFIG_CRYPTO_PCBC=m | ||
1472 | # CONFIG_CRYPTO_LRW is not set | 1579 | # CONFIG_CRYPTO_LRW is not set |
1473 | CONFIG_CRYPTO_DES=m | 1580 | CONFIG_CRYPTO_DES=m |
1581 | # CONFIG_CRYPTO_FCRYPT is not set | ||
1474 | # CONFIG_CRYPTO_BLOWFISH is not set | 1582 | # CONFIG_CRYPTO_BLOWFISH is not set |
1475 | # CONFIG_CRYPTO_TWOFISH is not set | 1583 | # CONFIG_CRYPTO_TWOFISH is not set |
1476 | # CONFIG_CRYPTO_SERPENT is not set | 1584 | # CONFIG_CRYPTO_SERPENT is not set |
@@ -1484,6 +1592,7 @@ CONFIG_CRYPTO_DES=m | |||
1484 | CONFIG_CRYPTO_DEFLATE=m | 1592 | CONFIG_CRYPTO_DEFLATE=m |
1485 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | 1593 | # CONFIG_CRYPTO_MICHAEL_MIC is not set |
1486 | # CONFIG_CRYPTO_CRC32C is not set | 1594 | # CONFIG_CRYPTO_CRC32C is not set |
1595 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
1487 | # CONFIG_CRYPTO_TEST is not set | 1596 | # CONFIG_CRYPTO_TEST is not set |
1488 | 1597 | ||
1489 | # | 1598 | # |
diff --git a/arch/powerpc/kernel/udbg_16550.c b/arch/powerpc/kernel/udbg_16550.c index e738f93b42fe..a963f657222b 100644 --- a/arch/powerpc/kernel/udbg_16550.c +++ b/arch/powerpc/kernel/udbg_16550.c | |||
@@ -184,7 +184,7 @@ void udbg_pas_real_putc(char c) | |||
184 | 184 | ||
185 | void udbg_init_pas_realmode(void) | 185 | void udbg_init_pas_realmode(void) |
186 | { | 186 | { |
187 | udbg_comport = (volatile struct NS16550 __iomem *)0xfcff03f8; | 187 | udbg_comport = (volatile struct NS16550 __iomem *)0xfcff03f8UL; |
188 | 188 | ||
189 | udbg_putc = udbg_pas_real_putc; | 189 | udbg_putc = udbg_pas_real_putc; |
190 | udbg_getc = NULL; | 190 | udbg_getc = NULL; |
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c index c0d2a694fa30..3c7fe2c65b5a 100644 --- a/arch/powerpc/mm/hash_utils_64.c +++ b/arch/powerpc/mm/hash_utils_64.c | |||
@@ -685,6 +685,9 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap) | |||
685 | "non-cacheable mapping\n"); | 685 | "non-cacheable mapping\n"); |
686 | psize = mmu_vmalloc_psize = MMU_PAGE_4K; | 686 | psize = mmu_vmalloc_psize = MMU_PAGE_4K; |
687 | } | 687 | } |
688 | #ifdef CONFIG_SPE_BASE | ||
689 | spu_flush_all_slbs(mm); | ||
690 | #endif | ||
688 | } | 691 | } |
689 | if (user_region) { | 692 | if (user_region) { |
690 | if (psize != get_paca()->context.user_psize) { | 693 | if (psize != get_paca()->context.user_psize) { |
@@ -759,6 +762,9 @@ void hash_preload(struct mm_struct *mm, unsigned long ea, | |||
759 | mmu_psize_defs[MMU_PAGE_4K].sllp; | 762 | mmu_psize_defs[MMU_PAGE_4K].sllp; |
760 | get_paca()->context = mm->context; | 763 | get_paca()->context = mm->context; |
761 | slb_flush_and_rebolt(); | 764 | slb_flush_and_rebolt(); |
765 | #ifdef CONFIG_SPE_BASE | ||
766 | spu_flush_all_slbs(mm); | ||
767 | #endif | ||
762 | } | 768 | } |
763 | } | 769 | } |
764 | if (mm->context.user_psize == MMU_PAGE_64K) | 770 | if (mm->context.user_psize == MMU_PAGE_64K) |
diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c index 8c77c791f87e..f6ffaaa7a5bf 100644 --- a/arch/powerpc/mm/hugetlbpage.c +++ b/arch/powerpc/mm/hugetlbpage.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <asm/machdep.h> | 24 | #include <asm/machdep.h> |
25 | #include <asm/cputable.h> | 25 | #include <asm/cputable.h> |
26 | #include <asm/tlb.h> | 26 | #include <asm/tlb.h> |
27 | #include <asm/spu.h> | ||
27 | 28 | ||
28 | #include <linux/sysctl.h> | 29 | #include <linux/sysctl.h> |
29 | 30 | ||
@@ -513,6 +514,9 @@ int prepare_hugepage_range(unsigned long addr, unsigned long len, pgoff_t pgoff) | |||
513 | if ((addr + len) > 0x100000000UL) | 514 | if ((addr + len) > 0x100000000UL) |
514 | err = open_high_hpage_areas(current->mm, | 515 | err = open_high_hpage_areas(current->mm, |
515 | HTLB_AREA_MASK(addr, len)); | 516 | HTLB_AREA_MASK(addr, len)); |
517 | #ifdef CONFIG_SPE_BASE | ||
518 | spu_flush_all_slbs(current->mm); | ||
519 | #endif | ||
516 | if (err) { | 520 | if (err) { |
517 | printk(KERN_DEBUG "prepare_hugepage_range(%lx, %lx)" | 521 | printk(KERN_DEBUG "prepare_hugepage_range(%lx, %lx)" |
518 | " failed (lowmask: 0x%04hx, highmask: 0x%04hx)\n", | 522 | " failed (lowmask: 0x%04hx, highmask: 0x%04hx)\n", |
diff --git a/arch/powerpc/platforms/cell/spu_base.c b/arch/powerpc/platforms/cell/spu_base.c index c43999a10deb..eba7a2641dce 100644 --- a/arch/powerpc/platforms/cell/spu_base.c +++ b/arch/powerpc/platforms/cell/spu_base.c | |||
@@ -38,8 +38,61 @@ | |||
38 | const struct spu_management_ops *spu_management_ops; | 38 | const struct spu_management_ops *spu_management_ops; |
39 | const struct spu_priv1_ops *spu_priv1_ops; | 39 | const struct spu_priv1_ops *spu_priv1_ops; |
40 | 40 | ||
41 | static struct list_head spu_list[MAX_NUMNODES]; | ||
42 | static LIST_HEAD(spu_full_list); | ||
43 | static DEFINE_MUTEX(spu_mutex); | ||
44 | static spinlock_t spu_list_lock = SPIN_LOCK_UNLOCKED; | ||
45 | |||
41 | EXPORT_SYMBOL_GPL(spu_priv1_ops); | 46 | EXPORT_SYMBOL_GPL(spu_priv1_ops); |
42 | 47 | ||
48 | void spu_invalidate_slbs(struct spu *spu) | ||
49 | { | ||
50 | struct spu_priv2 __iomem *priv2 = spu->priv2; | ||
51 | |||
52 | if (spu_mfc_sr1_get(spu) & MFC_STATE1_RELOCATE_MASK) | ||
53 | out_be64(&priv2->slb_invalidate_all_W, 0UL); | ||
54 | } | ||
55 | EXPORT_SYMBOL_GPL(spu_invalidate_slbs); | ||
56 | |||
57 | /* This is called by the MM core when a segment size is changed, to | ||
58 | * request a flush of all the SPEs using a given mm | ||
59 | */ | ||
60 | void spu_flush_all_slbs(struct mm_struct *mm) | ||
61 | { | ||
62 | struct spu *spu; | ||
63 | unsigned long flags; | ||
64 | |||
65 | spin_lock_irqsave(&spu_list_lock, flags); | ||
66 | list_for_each_entry(spu, &spu_full_list, full_list) { | ||
67 | if (spu->mm == mm) | ||
68 | spu_invalidate_slbs(spu); | ||
69 | } | ||
70 | spin_unlock_irqrestore(&spu_list_lock, flags); | ||
71 | } | ||
72 | |||
73 | /* The hack below stinks... try to do something better one of | ||
74 | * these days... Does it even work properly with NR_CPUS == 1 ? | ||
75 | */ | ||
76 | static inline void mm_needs_global_tlbie(struct mm_struct *mm) | ||
77 | { | ||
78 | int nr = (NR_CPUS > 1) ? NR_CPUS : NR_CPUS + 1; | ||
79 | |||
80 | /* Global TLBIE broadcast required with SPEs. */ | ||
81 | __cpus_setall(&mm->cpu_vm_mask, nr); | ||
82 | } | ||
83 | |||
84 | void spu_associate_mm(struct spu *spu, struct mm_struct *mm) | ||
85 | { | ||
86 | unsigned long flags; | ||
87 | |||
88 | spin_lock_irqsave(&spu_list_lock, flags); | ||
89 | spu->mm = mm; | ||
90 | spin_unlock_irqrestore(&spu_list_lock, flags); | ||
91 | if (mm) | ||
92 | mm_needs_global_tlbie(mm); | ||
93 | } | ||
94 | EXPORT_SYMBOL_GPL(spu_associate_mm); | ||
95 | |||
43 | static int __spu_trap_invalid_dma(struct spu *spu) | 96 | static int __spu_trap_invalid_dma(struct spu *spu) |
44 | { | 97 | { |
45 | pr_debug("%s\n", __FUNCTION__); | 98 | pr_debug("%s\n", __FUNCTION__); |
@@ -74,6 +127,7 @@ static int __spu_trap_data_seg(struct spu *spu, unsigned long ea) | |||
74 | struct spu_priv2 __iomem *priv2 = spu->priv2; | 127 | struct spu_priv2 __iomem *priv2 = spu->priv2; |
75 | struct mm_struct *mm = spu->mm; | 128 | struct mm_struct *mm = spu->mm; |
76 | u64 esid, vsid, llp; | 129 | u64 esid, vsid, llp; |
130 | int psize; | ||
77 | 131 | ||
78 | pr_debug("%s\n", __FUNCTION__); | 132 | pr_debug("%s\n", __FUNCTION__); |
79 | 133 | ||
@@ -90,22 +144,25 @@ static int __spu_trap_data_seg(struct spu *spu, unsigned long ea) | |||
90 | case USER_REGION_ID: | 144 | case USER_REGION_ID: |
91 | #ifdef CONFIG_HUGETLB_PAGE | 145 | #ifdef CONFIG_HUGETLB_PAGE |
92 | if (in_hugepage_area(mm->context, ea)) | 146 | if (in_hugepage_area(mm->context, ea)) |
93 | llp = mmu_psize_defs[mmu_huge_psize].sllp; | 147 | psize = mmu_huge_psize; |
94 | else | 148 | else |
95 | #endif | 149 | #endif |
96 | llp = mmu_psize_defs[mmu_virtual_psize].sllp; | 150 | psize = mm->context.user_psize; |
97 | vsid = (get_vsid(mm->context.id, ea) << SLB_VSID_SHIFT) | | 151 | vsid = (get_vsid(mm->context.id, ea) << SLB_VSID_SHIFT) | |
98 | SLB_VSID_USER | llp; | 152 | SLB_VSID_USER; |
99 | break; | 153 | break; |
100 | case VMALLOC_REGION_ID: | 154 | case VMALLOC_REGION_ID: |
101 | llp = mmu_psize_defs[mmu_virtual_psize].sllp; | 155 | if (ea < VMALLOC_END) |
156 | psize = mmu_vmalloc_psize; | ||
157 | else | ||
158 | psize = mmu_io_psize; | ||
102 | vsid = (get_kernel_vsid(ea) << SLB_VSID_SHIFT) | | 159 | vsid = (get_kernel_vsid(ea) << SLB_VSID_SHIFT) | |
103 | SLB_VSID_KERNEL | llp; | 160 | SLB_VSID_KERNEL; |
104 | break; | 161 | break; |
105 | case KERNEL_REGION_ID: | 162 | case KERNEL_REGION_ID: |
106 | llp = mmu_psize_defs[mmu_linear_psize].sllp; | 163 | psize = mmu_linear_psize; |
107 | vsid = (get_kernel_vsid(ea) << SLB_VSID_SHIFT) | | 164 | vsid = (get_kernel_vsid(ea) << SLB_VSID_SHIFT) | |
108 | SLB_VSID_KERNEL | llp; | 165 | SLB_VSID_KERNEL; |
109 | break; | 166 | break; |
110 | default: | 167 | default: |
111 | /* Future: support kernel segments so that drivers | 168 | /* Future: support kernel segments so that drivers |
@@ -114,9 +171,10 @@ static int __spu_trap_data_seg(struct spu *spu, unsigned long ea) | |||
114 | pr_debug("invalid region access at %016lx\n", ea); | 171 | pr_debug("invalid region access at %016lx\n", ea); |
115 | return 1; | 172 | return 1; |
116 | } | 173 | } |
174 | llp = mmu_psize_defs[psize].sllp; | ||
117 | 175 | ||
118 | out_be64(&priv2->slb_index_W, spu->slb_replace); | 176 | out_be64(&priv2->slb_index_W, spu->slb_replace); |
119 | out_be64(&priv2->slb_vsid_RW, vsid); | 177 | out_be64(&priv2->slb_vsid_RW, vsid | llp); |
120 | out_be64(&priv2->slb_esid_RW, esid); | 178 | out_be64(&priv2->slb_esid_RW, esid); |
121 | 179 | ||
122 | spu->slb_replace++; | 180 | spu->slb_replace++; |
@@ -330,10 +388,6 @@ static void spu_free_irqs(struct spu *spu) | |||
330 | free_irq(spu->irqs[2], spu); | 388 | free_irq(spu->irqs[2], spu); |
331 | } | 389 | } |
332 | 390 | ||
333 | static struct list_head spu_list[MAX_NUMNODES]; | ||
334 | static LIST_HEAD(spu_full_list); | ||
335 | static DEFINE_MUTEX(spu_mutex); | ||
336 | |||
337 | static void spu_init_channels(struct spu *spu) | 391 | static void spu_init_channels(struct spu *spu) |
338 | { | 392 | { |
339 | static const struct { | 393 | static const struct { |
@@ -593,6 +647,7 @@ static int __init create_spu(void *data) | |||
593 | struct spu *spu; | 647 | struct spu *spu; |
594 | int ret; | 648 | int ret; |
595 | static int number; | 649 | static int number; |
650 | unsigned long flags; | ||
596 | 651 | ||
597 | ret = -ENOMEM; | 652 | ret = -ENOMEM; |
598 | spu = kzalloc(sizeof (*spu), GFP_KERNEL); | 653 | spu = kzalloc(sizeof (*spu), GFP_KERNEL); |
@@ -620,8 +675,10 @@ static int __init create_spu(void *data) | |||
620 | goto out_free_irqs; | 675 | goto out_free_irqs; |
621 | 676 | ||
622 | mutex_lock(&spu_mutex); | 677 | mutex_lock(&spu_mutex); |
678 | spin_lock_irqsave(&spu_list_lock, flags); | ||
623 | list_add(&spu->list, &spu_list[spu->node]); | 679 | list_add(&spu->list, &spu_list[spu->node]); |
624 | list_add(&spu->full_list, &spu_full_list); | 680 | list_add(&spu->full_list, &spu_full_list); |
681 | spin_unlock_irqrestore(&spu_list_lock, flags); | ||
625 | mutex_unlock(&spu_mutex); | 682 | mutex_unlock(&spu_mutex); |
626 | 683 | ||
627 | goto out; | 684 | goto out; |
diff --git a/arch/powerpc/platforms/cell/spufs/file.c b/arch/powerpc/platforms/cell/spufs/file.c index b00653d69c01..505266a568d4 100644 --- a/arch/powerpc/platforms/cell/spufs/file.c +++ b/arch/powerpc/platforms/cell/spufs/file.c | |||
@@ -63,8 +63,8 @@ static ssize_t | |||
63 | spufs_mem_read(struct file *file, char __user *buffer, | 63 | spufs_mem_read(struct file *file, char __user *buffer, |
64 | size_t size, loff_t *pos) | 64 | size_t size, loff_t *pos) |
65 | { | 65 | { |
66 | int ret; | ||
67 | struct spu_context *ctx = file->private_data; | 66 | struct spu_context *ctx = file->private_data; |
67 | ssize_t ret; | ||
68 | 68 | ||
69 | spu_acquire(ctx); | 69 | spu_acquire(ctx); |
70 | ret = __spufs_mem_read(ctx, buffer, size, pos); | 70 | ret = __spufs_mem_read(ctx, buffer, size, pos); |
@@ -74,25 +74,29 @@ spufs_mem_read(struct file *file, char __user *buffer, | |||
74 | 74 | ||
75 | static ssize_t | 75 | static ssize_t |
76 | spufs_mem_write(struct file *file, const char __user *buffer, | 76 | spufs_mem_write(struct file *file, const char __user *buffer, |
77 | size_t size, loff_t *pos) | 77 | size_t size, loff_t *ppos) |
78 | { | 78 | { |
79 | struct spu_context *ctx = file->private_data; | 79 | struct spu_context *ctx = file->private_data; |
80 | char *local_store; | 80 | char *local_store; |
81 | loff_t pos = *ppos; | ||
81 | int ret; | 82 | int ret; |
82 | 83 | ||
83 | size = min_t(ssize_t, LS_SIZE - *pos, size); | 84 | if (pos < 0) |
84 | if (size <= 0) | 85 | return -EINVAL; |
86 | if (pos > LS_SIZE) | ||
85 | return -EFBIG; | 87 | return -EFBIG; |
86 | *pos += size; | 88 | if (size > LS_SIZE - pos) |
89 | size = LS_SIZE - pos; | ||
87 | 90 | ||
88 | spu_acquire(ctx); | 91 | spu_acquire(ctx); |
89 | |||
90 | local_store = ctx->ops->get_ls(ctx); | 92 | local_store = ctx->ops->get_ls(ctx); |
91 | ret = copy_from_user(local_store + *pos - size, | 93 | ret = copy_from_user(local_store + pos, buffer, size); |
92 | buffer, size) ? -EFAULT : size; | ||
93 | |||
94 | spu_release(ctx); | 94 | spu_release(ctx); |
95 | return ret; | 95 | |
96 | if (ret) | ||
97 | return -EFAULT; | ||
98 | *ppos = pos + size; | ||
99 | return size; | ||
96 | } | 100 | } |
97 | 101 | ||
98 | static unsigned long spufs_mem_mmap_nopfn(struct vm_area_struct *vma, | 102 | static unsigned long spufs_mem_mmap_nopfn(struct vm_area_struct *vma, |
diff --git a/arch/powerpc/platforms/cell/spufs/run.c b/arch/powerpc/platforms/cell/spufs/run.c index 353a8fa07ab8..f95a611ca362 100644 --- a/arch/powerpc/platforms/cell/spufs/run.c +++ b/arch/powerpc/platforms/cell/spufs/run.c | |||
@@ -143,7 +143,7 @@ static inline int spu_run_init(struct spu_context *ctx, u32 * npc) | |||
143 | int ret; | 143 | int ret; |
144 | unsigned long runcntl = SPU_RUNCNTL_RUNNABLE; | 144 | unsigned long runcntl = SPU_RUNCNTL_RUNNABLE; |
145 | 145 | ||
146 | ret = spu_acquire_runnable(ctx, SPU_ACTIVATE_NOWAKE); | 146 | ret = spu_acquire_runnable(ctx, 0); |
147 | if (ret) | 147 | if (ret) |
148 | return ret; | 148 | return ret; |
149 | 149 | ||
@@ -155,7 +155,7 @@ static inline int spu_run_init(struct spu_context *ctx, u32 * npc) | |||
155 | spu_release(ctx); | 155 | spu_release(ctx); |
156 | ret = spu_setup_isolated(ctx); | 156 | ret = spu_setup_isolated(ctx); |
157 | if (!ret) | 157 | if (!ret) |
158 | ret = spu_acquire_runnable(ctx, SPU_ACTIVATE_NOWAKE); | 158 | ret = spu_acquire_runnable(ctx, 0); |
159 | } | 159 | } |
160 | 160 | ||
161 | /* if userspace has set the runcntrl register (eg, to issue an | 161 | /* if userspace has set the runcntrl register (eg, to issue an |
diff --git a/arch/powerpc/platforms/cell/spufs/sched.c b/arch/powerpc/platforms/cell/spufs/sched.c index 2f25e68b4bac..39823cec0844 100644 --- a/arch/powerpc/platforms/cell/spufs/sched.c +++ b/arch/powerpc/platforms/cell/spufs/sched.c | |||
@@ -127,14 +127,6 @@ static void spu_remove_from_active_list(struct spu *spu) | |||
127 | mutex_unlock(&spu_prio->active_mutex[node]); | 127 | mutex_unlock(&spu_prio->active_mutex[node]); |
128 | } | 128 | } |
129 | 129 | ||
130 | static inline void mm_needs_global_tlbie(struct mm_struct *mm) | ||
131 | { | ||
132 | int nr = (NR_CPUS > 1) ? NR_CPUS : NR_CPUS + 1; | ||
133 | |||
134 | /* Global TLBIE broadcast required with SPEs. */ | ||
135 | __cpus_setall(&mm->cpu_vm_mask, nr); | ||
136 | } | ||
137 | |||
138 | static BLOCKING_NOTIFIER_HEAD(spu_switch_notifier); | 130 | static BLOCKING_NOTIFIER_HEAD(spu_switch_notifier); |
139 | 131 | ||
140 | static void spu_switch_notify(struct spu *spu, struct spu_context *ctx) | 132 | static void spu_switch_notify(struct spu *spu, struct spu_context *ctx) |
@@ -167,8 +159,7 @@ static void spu_bind_context(struct spu *spu, struct spu_context *ctx) | |||
167 | ctx->spu = spu; | 159 | ctx->spu = spu; |
168 | ctx->ops = &spu_hw_ops; | 160 | ctx->ops = &spu_hw_ops; |
169 | spu->pid = current->pid; | 161 | spu->pid = current->pid; |
170 | spu->mm = ctx->owner; | 162 | spu_associate_mm(spu, ctx->owner); |
171 | mm_needs_global_tlbie(spu->mm); | ||
172 | spu->ibox_callback = spufs_ibox_callback; | 163 | spu->ibox_callback = spufs_ibox_callback; |
173 | spu->wbox_callback = spufs_wbox_callback; | 164 | spu->wbox_callback = spufs_wbox_callback; |
174 | spu->stop_callback = spufs_stop_callback; | 165 | spu->stop_callback = spufs_stop_callback; |
@@ -205,7 +196,7 @@ static void spu_unbind_context(struct spu *spu, struct spu_context *ctx) | |||
205 | spu->stop_callback = NULL; | 196 | spu->stop_callback = NULL; |
206 | spu->mfc_callback = NULL; | 197 | spu->mfc_callback = NULL; |
207 | spu->dma_callback = NULL; | 198 | spu->dma_callback = NULL; |
208 | spu->mm = NULL; | 199 | spu_associate_mm(spu, NULL); |
209 | spu->pid = 0; | 200 | spu->pid = 0; |
210 | ctx->ops = &spu_backing_ops; | 201 | ctx->ops = &spu_backing_ops; |
211 | ctx->spu = NULL; | 202 | ctx->spu = NULL; |
@@ -263,7 +254,6 @@ static void spu_prio_wait(struct spu_context *ctx) | |||
263 | { | 254 | { |
264 | DEFINE_WAIT(wait); | 255 | DEFINE_WAIT(wait); |
265 | 256 | ||
266 | set_bit(SPU_SCHED_WAKE, &ctx->sched_flags); | ||
267 | prepare_to_wait_exclusive(&ctx->stop_wq, &wait, TASK_INTERRUPTIBLE); | 257 | prepare_to_wait_exclusive(&ctx->stop_wq, &wait, TASK_INTERRUPTIBLE); |
268 | if (!signal_pending(current)) { | 258 | if (!signal_pending(current)) { |
269 | mutex_unlock(&ctx->state_mutex); | 259 | mutex_unlock(&ctx->state_mutex); |
@@ -272,7 +262,6 @@ static void spu_prio_wait(struct spu_context *ctx) | |||
272 | } | 262 | } |
273 | __set_current_state(TASK_RUNNING); | 263 | __set_current_state(TASK_RUNNING); |
274 | remove_wait_queue(&ctx->stop_wq, &wait); | 264 | remove_wait_queue(&ctx->stop_wq, &wait); |
275 | clear_bit(SPU_SCHED_WAKE, &ctx->sched_flags); | ||
276 | } | 265 | } |
277 | 266 | ||
278 | /** | 267 | /** |
@@ -292,7 +281,7 @@ static void spu_reschedule(struct spu *spu) | |||
292 | best = sched_find_first_bit(spu_prio->bitmap); | 281 | best = sched_find_first_bit(spu_prio->bitmap); |
293 | if (best < MAX_PRIO) { | 282 | if (best < MAX_PRIO) { |
294 | struct spu_context *ctx = spu_grab_context(best); | 283 | struct spu_context *ctx = spu_grab_context(best); |
295 | if (ctx && test_bit(SPU_SCHED_WAKE, &ctx->sched_flags)) | 284 | if (ctx) |
296 | wake_up(&ctx->stop_wq); | 285 | wake_up(&ctx->stop_wq); |
297 | } | 286 | } |
298 | spin_unlock(&spu_prio->runq_lock); | 287 | spin_unlock(&spu_prio->runq_lock); |
@@ -414,8 +403,7 @@ int spu_activate(struct spu_context *ctx, unsigned long flags) | |||
414 | } | 403 | } |
415 | 404 | ||
416 | spu_add_to_rq(ctx); | 405 | spu_add_to_rq(ctx); |
417 | if (!(flags & SPU_ACTIVATE_NOWAKE)) | 406 | spu_prio_wait(ctx); |
418 | spu_prio_wait(ctx); | ||
419 | spu_del_from_rq(ctx); | 407 | spu_del_from_rq(ctx); |
420 | } while (!signal_pending(current)); | 408 | } while (!signal_pending(current)); |
421 | 409 | ||
diff --git a/arch/powerpc/platforms/cell/spufs/spufs.h b/arch/powerpc/platforms/cell/spufs/spufs.h index 0c437891dfd5..5c4e47d69d79 100644 --- a/arch/powerpc/platforms/cell/spufs/spufs.h +++ b/arch/powerpc/platforms/cell/spufs/spufs.h | |||
@@ -41,7 +41,7 @@ struct spu_gang; | |||
41 | 41 | ||
42 | /* ctx->sched_flags */ | 42 | /* ctx->sched_flags */ |
43 | enum { | 43 | enum { |
44 | SPU_SCHED_WAKE = 0, | 44 | SPU_SCHED_WAKE = 0, /* currently unused */ |
45 | }; | 45 | }; |
46 | 46 | ||
47 | struct spu_context { | 47 | struct spu_context { |
@@ -191,9 +191,7 @@ void spu_forget(struct spu_context *ctx); | |||
191 | int spu_acquire_runnable(struct spu_context *ctx, unsigned long flags); | 191 | int spu_acquire_runnable(struct spu_context *ctx, unsigned long flags); |
192 | void spu_acquire_saved(struct spu_context *ctx); | 192 | void spu_acquire_saved(struct spu_context *ctx); |
193 | int spu_acquire_exclusive(struct spu_context *ctx); | 193 | int spu_acquire_exclusive(struct spu_context *ctx); |
194 | enum { | 194 | |
195 | SPU_ACTIVATE_NOWAKE = 1, | ||
196 | }; | ||
197 | int spu_activate(struct spu_context *ctx, unsigned long flags); | 195 | int spu_activate(struct spu_context *ctx, unsigned long flags); |
198 | void spu_deactivate(struct spu_context *ctx); | 196 | void spu_deactivate(struct spu_context *ctx); |
199 | void spu_yield(struct spu_context *ctx); | 197 | void spu_yield(struct spu_context *ctx); |
diff --git a/arch/powerpc/platforms/cell/spufs/switch.c b/arch/powerpc/platforms/cell/spufs/switch.c index c08981ff7fc6..fd91c73de34e 100644 --- a/arch/powerpc/platforms/cell/spufs/switch.c +++ b/arch/powerpc/platforms/cell/spufs/switch.c | |||
@@ -468,26 +468,6 @@ static inline void wait_purge_complete(struct spu_state *csa, struct spu *spu) | |||
468 | MFC_CNTL_PURGE_DMA_COMPLETE); | 468 | MFC_CNTL_PURGE_DMA_COMPLETE); |
469 | } | 469 | } |
470 | 470 | ||
471 | static inline void save_mfc_slbs(struct spu_state *csa, struct spu *spu) | ||
472 | { | ||
473 | struct spu_priv2 __iomem *priv2 = spu->priv2; | ||
474 | int i; | ||
475 | |||
476 | /* Save, Step 29: | ||
477 | * If MFC_SR1[R]='1', save SLBs in CSA. | ||
478 | */ | ||
479 | if (spu_mfc_sr1_get(spu) & MFC_STATE1_RELOCATE_MASK) { | ||
480 | csa->priv2.slb_index_W = in_be64(&priv2->slb_index_W); | ||
481 | for (i = 0; i < 8; i++) { | ||
482 | out_be64(&priv2->slb_index_W, i); | ||
483 | eieio(); | ||
484 | csa->slb_esid_RW[i] = in_be64(&priv2->slb_esid_RW); | ||
485 | csa->slb_vsid_RW[i] = in_be64(&priv2->slb_vsid_RW); | ||
486 | eieio(); | ||
487 | } | ||
488 | } | ||
489 | } | ||
490 | |||
491 | static inline void setup_mfc_sr1(struct spu_state *csa, struct spu *spu) | 471 | static inline void setup_mfc_sr1(struct spu_state *csa, struct spu *spu) |
492 | { | 472 | { |
493 | /* Save, Step 30: | 473 | /* Save, Step 30: |
@@ -708,20 +688,6 @@ static inline void resume_mfc_queue(struct spu_state *csa, struct spu *spu) | |||
708 | out_be64(&priv2->mfc_control_RW, MFC_CNTL_RESUME_DMA_QUEUE); | 688 | out_be64(&priv2->mfc_control_RW, MFC_CNTL_RESUME_DMA_QUEUE); |
709 | } | 689 | } |
710 | 690 | ||
711 | static inline void invalidate_slbs(struct spu_state *csa, struct spu *spu) | ||
712 | { | ||
713 | struct spu_priv2 __iomem *priv2 = spu->priv2; | ||
714 | |||
715 | /* Save, Step 45: | ||
716 | * Restore, Step 19: | ||
717 | * If MFC_SR1[R]=1, write 0 to SLB_Invalidate_All. | ||
718 | */ | ||
719 | if (spu_mfc_sr1_get(spu) & MFC_STATE1_RELOCATE_MASK) { | ||
720 | out_be64(&priv2->slb_invalidate_all_W, 0UL); | ||
721 | eieio(); | ||
722 | } | ||
723 | } | ||
724 | |||
725 | static inline void get_kernel_slb(u64 ea, u64 slb[2]) | 691 | static inline void get_kernel_slb(u64 ea, u64 slb[2]) |
726 | { | 692 | { |
727 | u64 llp; | 693 | u64 llp; |
@@ -765,7 +731,7 @@ static inline void setup_mfc_slbs(struct spu_state *csa, struct spu *spu) | |||
765 | * MFC_SR1[R]=1 (in other words, assume that | 731 | * MFC_SR1[R]=1 (in other words, assume that |
766 | * translation is desired by OS environment). | 732 | * translation is desired by OS environment). |
767 | */ | 733 | */ |
768 | invalidate_slbs(csa, spu); | 734 | spu_invalidate_slbs(spu); |
769 | get_kernel_slb((unsigned long)&spu_save_code[0], code_slb); | 735 | get_kernel_slb((unsigned long)&spu_save_code[0], code_slb); |
770 | get_kernel_slb((unsigned long)csa->lscsa, lscsa_slb); | 736 | get_kernel_slb((unsigned long)csa->lscsa, lscsa_slb); |
771 | load_mfc_slb(spu, code_slb, 0); | 737 | load_mfc_slb(spu, code_slb, 0); |
@@ -1718,27 +1684,6 @@ static inline void check_ppuint_mb_stat(struct spu_state *csa, struct spu *spu) | |||
1718 | } | 1684 | } |
1719 | } | 1685 | } |
1720 | 1686 | ||
1721 | static inline void restore_mfc_slbs(struct spu_state *csa, struct spu *spu) | ||
1722 | { | ||
1723 | struct spu_priv2 __iomem *priv2 = spu->priv2; | ||
1724 | int i; | ||
1725 | |||
1726 | /* Restore, Step 68: | ||
1727 | * If MFC_SR1[R]='1', restore SLBs from CSA. | ||
1728 | */ | ||
1729 | if (csa->priv1.mfc_sr1_RW & MFC_STATE1_RELOCATE_MASK) { | ||
1730 | for (i = 0; i < 8; i++) { | ||
1731 | out_be64(&priv2->slb_index_W, i); | ||
1732 | eieio(); | ||
1733 | out_be64(&priv2->slb_esid_RW, csa->slb_esid_RW[i]); | ||
1734 | out_be64(&priv2->slb_vsid_RW, csa->slb_vsid_RW[i]); | ||
1735 | eieio(); | ||
1736 | } | ||
1737 | out_be64(&priv2->slb_index_W, csa->priv2.slb_index_W); | ||
1738 | eieio(); | ||
1739 | } | ||
1740 | } | ||
1741 | |||
1742 | static inline void restore_mfc_sr1(struct spu_state *csa, struct spu *spu) | 1687 | static inline void restore_mfc_sr1(struct spu_state *csa, struct spu *spu) |
1743 | { | 1688 | { |
1744 | /* Restore, Step 69: | 1689 | /* Restore, Step 69: |
@@ -1875,7 +1820,6 @@ static void save_csa(struct spu_state *prev, struct spu *spu) | |||
1875 | set_mfc_tclass_id(prev, spu); /* Step 26. */ | 1820 | set_mfc_tclass_id(prev, spu); /* Step 26. */ |
1876 | purge_mfc_queue(prev, spu); /* Step 27. */ | 1821 | purge_mfc_queue(prev, spu); /* Step 27. */ |
1877 | wait_purge_complete(prev, spu); /* Step 28. */ | 1822 | wait_purge_complete(prev, spu); /* Step 28. */ |
1878 | save_mfc_slbs(prev, spu); /* Step 29. */ | ||
1879 | setup_mfc_sr1(prev, spu); /* Step 30. */ | 1823 | setup_mfc_sr1(prev, spu); /* Step 30. */ |
1880 | save_spu_npc(prev, spu); /* Step 31. */ | 1824 | save_spu_npc(prev, spu); /* Step 31. */ |
1881 | save_spu_privcntl(prev, spu); /* Step 32. */ | 1825 | save_spu_privcntl(prev, spu); /* Step 32. */ |
@@ -1987,7 +1931,7 @@ static void harvest(struct spu_state *prev, struct spu *spu) | |||
1987 | reset_spu_privcntl(prev, spu); /* Step 16. */ | 1931 | reset_spu_privcntl(prev, spu); /* Step 16. */ |
1988 | reset_spu_lslr(prev, spu); /* Step 17. */ | 1932 | reset_spu_lslr(prev, spu); /* Step 17. */ |
1989 | setup_mfc_sr1(prev, spu); /* Step 18. */ | 1933 | setup_mfc_sr1(prev, spu); /* Step 18. */ |
1990 | invalidate_slbs(prev, spu); /* Step 19. */ | 1934 | spu_invalidate_slbs(spu); /* Step 19. */ |
1991 | reset_ch_part1(prev, spu); /* Step 20. */ | 1935 | reset_ch_part1(prev, spu); /* Step 20. */ |
1992 | reset_ch_part2(prev, spu); /* Step 21. */ | 1936 | reset_ch_part2(prev, spu); /* Step 21. */ |
1993 | enable_interrupts(prev, spu); /* Step 22. */ | 1937 | enable_interrupts(prev, spu); /* Step 22. */ |
@@ -2055,7 +1999,7 @@ static void restore_csa(struct spu_state *next, struct spu *spu) | |||
2055 | restore_spu_mb(next, spu); /* Step 65. */ | 1999 | restore_spu_mb(next, spu); /* Step 65. */ |
2056 | check_ppu_mb_stat(next, spu); /* Step 66. */ | 2000 | check_ppu_mb_stat(next, spu); /* Step 66. */ |
2057 | check_ppuint_mb_stat(next, spu); /* Step 67. */ | 2001 | check_ppuint_mb_stat(next, spu); /* Step 67. */ |
2058 | restore_mfc_slbs(next, spu); /* Step 68. */ | 2002 | spu_invalidate_slbs(spu); /* Modified Step 68. */ |
2059 | restore_mfc_sr1(next, spu); /* Step 69. */ | 2003 | restore_mfc_sr1(next, spu); /* Step 69. */ |
2060 | restore_other_spu_access(next, spu); /* Step 70. */ | 2004 | restore_other_spu_access(next, spu); /* Step 70. */ |
2061 | restore_spu_runcntl(next, spu); /* Step 71. */ | 2005 | restore_spu_runcntl(next, spu); /* Step 71. */ |
diff --git a/arch/powerpc/platforms/pasemi/iommu.c b/arch/powerpc/platforms/pasemi/iommu.c index 459a53b7d24d..71dbf1a56e13 100644 --- a/arch/powerpc/platforms/pasemi/iommu.c +++ b/arch/powerpc/platforms/pasemi/iommu.c | |||
@@ -77,7 +77,7 @@ | |||
77 | #define IOBMAP_L2E_V 0x80000000 | 77 | #define IOBMAP_L2E_V 0x80000000 |
78 | #define IOBMAP_L2E_V_CACHED 0xc0000000 | 78 | #define IOBMAP_L2E_V_CACHED 0xc0000000 |
79 | 79 | ||
80 | static u32 *iob; | 80 | static u32 __iomem *iob; |
81 | static u32 iob_l1_emptyval; | 81 | static u32 iob_l1_emptyval; |
82 | static u32 iob_l2_emptyval; | 82 | static u32 iob_l2_emptyval; |
83 | static u32 *iob_l2_base; | 83 | static u32 *iob_l2_base; |
diff --git a/arch/powerpc/platforms/ps3/mm.c b/arch/powerpc/platforms/ps3/mm.c index 42354de3f557..2014d2b44449 100644 --- a/arch/powerpc/platforms/ps3/mm.c +++ b/arch/powerpc/platforms/ps3/mm.c | |||
@@ -294,7 +294,7 @@ static int __init ps3_mm_add_memory(void) | |||
294 | unsigned long nr_pages; | 294 | unsigned long nr_pages; |
295 | 295 | ||
296 | if (!firmware_has_feature(FW_FEATURE_PS3_LV1)) | 296 | if (!firmware_has_feature(FW_FEATURE_PS3_LV1)) |
297 | return 0; | 297 | return -ENODEV; |
298 | 298 | ||
299 | BUG_ON(!mem_init_done); | 299 | BUG_ON(!mem_init_done); |
300 | 300 | ||
diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c index a9f7e4a39a2a..3c48cce98a5c 100644 --- a/arch/powerpc/platforms/ps3/system-bus.c +++ b/arch/powerpc/platforms/ps3/system-bus.c | |||
@@ -172,7 +172,7 @@ int __init ps3_system_bus_init(void) | |||
172 | int result; | 172 | int result; |
173 | 173 | ||
174 | if (!firmware_has_feature(FW_FEATURE_PS3_LV1)) | 174 | if (!firmware_has_feature(FW_FEATURE_PS3_LV1)) |
175 | return 0; | 175 | return -ENODEV; |
176 | 176 | ||
177 | result = bus_register(&ps3_system_bus_type); | 177 | result = bus_register(&ps3_system_bus_type); |
178 | BUG_ON(result); | 178 | BUG_ON(result); |
diff --git a/arch/s390/appldata/appldata_mem.c b/arch/s390/appldata/appldata_mem.c index 4ca615788702..697eb30a68a3 100644 --- a/arch/s390/appldata/appldata_mem.c +++ b/arch/s390/appldata/appldata_mem.c | |||
@@ -117,7 +117,10 @@ static void appldata_get_mem_data(void *data) | |||
117 | mem_data->pgpgout = ev[PGPGOUT] >> 1; | 117 | mem_data->pgpgout = ev[PGPGOUT] >> 1; |
118 | mem_data->pswpin = ev[PSWPIN]; | 118 | mem_data->pswpin = ev[PSWPIN]; |
119 | mem_data->pswpout = ev[PSWPOUT]; | 119 | mem_data->pswpout = ev[PSWPOUT]; |
120 | mem_data->pgalloc = ev[PGALLOC_NORMAL] + ev[PGALLOC_DMA]; | 120 | mem_data->pgalloc = ev[PGALLOC_NORMAL]; |
121 | #ifdef CONFIG_ZONE_DMA | ||
122 | mem_data->pgalloc += ev[PGALLOC_DMA]; | ||
123 | #endif | ||
121 | mem_data->pgfault = ev[PGFAULT]; | 124 | mem_data->pgfault = ev[PGFAULT]; |
122 | mem_data->pgmajfault = ev[PGMAJFAULT]; | 125 | mem_data->pgmajfault = ev[PGMAJFAULT]; |
123 | 126 | ||
diff --git a/arch/sparc/kernel/process.c b/arch/sparc/kernel/process.c index 113bd48a89bd..fc874e63a499 100644 --- a/arch/sparc/kernel/process.c +++ b/arch/sparc/kernel/process.c | |||
@@ -348,7 +348,7 @@ void exit_thread(void) | |||
348 | #ifndef CONFIG_SMP | 348 | #ifndef CONFIG_SMP |
349 | if(last_task_used_math == current) { | 349 | if(last_task_used_math == current) { |
350 | #else | 350 | #else |
351 | if(current_thread_info()->flags & _TIF_USEDFPU) { | 351 | if (test_thread_flag(TIF_USEDFPU)) { |
352 | #endif | 352 | #endif |
353 | /* Keep process from leaving FPU in a bogon state. */ | 353 | /* Keep process from leaving FPU in a bogon state. */ |
354 | put_psr(get_psr() | PSR_EF); | 354 | put_psr(get_psr() | PSR_EF); |
@@ -357,7 +357,7 @@ void exit_thread(void) | |||
357 | #ifndef CONFIG_SMP | 357 | #ifndef CONFIG_SMP |
358 | last_task_used_math = NULL; | 358 | last_task_used_math = NULL; |
359 | #else | 359 | #else |
360 | current_thread_info()->flags &= ~_TIF_USEDFPU; | 360 | clear_thread_flag(TIF_USEDFPU); |
361 | #endif | 361 | #endif |
362 | } | 362 | } |
363 | } | 363 | } |
@@ -371,7 +371,7 @@ void flush_thread(void) | |||
371 | #ifndef CONFIG_SMP | 371 | #ifndef CONFIG_SMP |
372 | if(last_task_used_math == current) { | 372 | if(last_task_used_math == current) { |
373 | #else | 373 | #else |
374 | if(current_thread_info()->flags & _TIF_USEDFPU) { | 374 | if (test_thread_flag(TIF_USEDFPU)) { |
375 | #endif | 375 | #endif |
376 | /* Clean the fpu. */ | 376 | /* Clean the fpu. */ |
377 | put_psr(get_psr() | PSR_EF); | 377 | put_psr(get_psr() | PSR_EF); |
@@ -380,7 +380,7 @@ void flush_thread(void) | |||
380 | #ifndef CONFIG_SMP | 380 | #ifndef CONFIG_SMP |
381 | last_task_used_math = NULL; | 381 | last_task_used_math = NULL; |
382 | #else | 382 | #else |
383 | current_thread_info()->flags &= ~_TIF_USEDFPU; | 383 | clear_thread_flag(TIF_USEDFPU); |
384 | #endif | 384 | #endif |
385 | } | 385 | } |
386 | 386 | ||
@@ -466,13 +466,13 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, | |||
466 | #ifndef CONFIG_SMP | 466 | #ifndef CONFIG_SMP |
467 | if(last_task_used_math == current) { | 467 | if(last_task_used_math == current) { |
468 | #else | 468 | #else |
469 | if(current_thread_info()->flags & _TIF_USEDFPU) { | 469 | if (test_thread_flag(TIF_USEDFPU)) { |
470 | #endif | 470 | #endif |
471 | put_psr(get_psr() | PSR_EF); | 471 | put_psr(get_psr() | PSR_EF); |
472 | fpsave(&p->thread.float_regs[0], &p->thread.fsr, | 472 | fpsave(&p->thread.float_regs[0], &p->thread.fsr, |
473 | &p->thread.fpqueue[0], &p->thread.fpqdepth); | 473 | &p->thread.fpqueue[0], &p->thread.fpqdepth); |
474 | #ifdef CONFIG_SMP | 474 | #ifdef CONFIG_SMP |
475 | current_thread_info()->flags &= ~_TIF_USEDFPU; | 475 | clear_thread_flag(TIF_USEDFPU); |
476 | #endif | 476 | #endif |
477 | } | 477 | } |
478 | 478 | ||
@@ -609,13 +609,13 @@ int dump_fpu (struct pt_regs * regs, elf_fpregset_t * fpregs) | |||
609 | return 1; | 609 | return 1; |
610 | } | 610 | } |
611 | #ifdef CONFIG_SMP | 611 | #ifdef CONFIG_SMP |
612 | if (current_thread_info()->flags & _TIF_USEDFPU) { | 612 | if (test_thread_flag(TIF_USEDFPU)) { |
613 | put_psr(get_psr() | PSR_EF); | 613 | put_psr(get_psr() | PSR_EF); |
614 | fpsave(¤t->thread.float_regs[0], ¤t->thread.fsr, | 614 | fpsave(¤t->thread.float_regs[0], ¤t->thread.fsr, |
615 | ¤t->thread.fpqueue[0], ¤t->thread.fpqdepth); | 615 | ¤t->thread.fpqueue[0], ¤t->thread.fpqdepth); |
616 | if (regs != NULL) { | 616 | if (regs != NULL) { |
617 | regs->psr &= ~(PSR_EF); | 617 | regs->psr &= ~(PSR_EF); |
618 | current_thread_info()->flags &= ~(_TIF_USEDFPU); | 618 | clear_thread_flag(TIF_USEDFPU); |
619 | } | 619 | } |
620 | } | 620 | } |
621 | #else | 621 | #else |
diff --git a/arch/sparc/kernel/systbls.S b/arch/sparc/kernel/systbls.S index ea75ca569052..3a69778c8366 100644 --- a/arch/sparc/kernel/systbls.S +++ b/arch/sparc/kernel/systbls.S | |||
@@ -78,7 +78,8 @@ sys_call_table: | |||
78 | /*285*/ .long sys_mkdirat, sys_mknodat, sys_fchownat, sys_futimesat, sys_fstatat64 | 78 | /*285*/ .long sys_mkdirat, sys_mknodat, sys_fchownat, sys_futimesat, sys_fstatat64 |
79 | /*290*/ .long sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat | 79 | /*290*/ .long sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat |
80 | /*295*/ .long sys_fchmodat, sys_faccessat, sys_pselect6, sys_ppoll, sys_unshare | 80 | /*295*/ .long sys_fchmodat, sys_faccessat, sys_pselect6, sys_ppoll, sys_unshare |
81 | /*300*/ .long sys_set_robust_list, sys_get_robust_list, sys_migrate_pages | 81 | /*300*/ .long sys_set_robust_list, sys_get_robust_list, sys_migrate_pages, sys_mbind, sys_get_mempolicy |
82 | /*305*/ .long sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait | ||
82 | 83 | ||
83 | #ifdef CONFIG_SUNOS_EMUL | 84 | #ifdef CONFIG_SUNOS_EMUL |
84 | /* Now the SunOS syscall table. */ | 85 | /* Now the SunOS syscall table. */ |
@@ -192,5 +193,8 @@ sunos_sys_table: | |||
192 | .long sunos_nosys, sunos_nosys, sunos_nosys | 193 | .long sunos_nosys, sunos_nosys, sunos_nosys |
193 | .long sunos_nosys | 194 | .long sunos_nosys |
194 | /*300*/ .long sunos_nosys, sunos_nosys, sunos_nosys | 195 | /*300*/ .long sunos_nosys, sunos_nosys, sunos_nosys |
196 | .long sunos_nosys, sunos_nosys, sunos_nosys | ||
197 | .long sunos_nosys, sunos_nosys, sunos_nosys | ||
198 | .long sunos_nosys | ||
195 | 199 | ||
196 | #endif | 200 | #endif |
diff --git a/arch/sparc/kernel/traps.c b/arch/sparc/kernel/traps.c index 6a70d215fd04..527687afc1c4 100644 --- a/arch/sparc/kernel/traps.c +++ b/arch/sparc/kernel/traps.c | |||
@@ -259,7 +259,7 @@ void do_fpd_trap(struct pt_regs *regs, unsigned long pc, unsigned long npc, | |||
259 | } else { | 259 | } else { |
260 | fpload(¤t->thread.float_regs[0], ¤t->thread.fsr); | 260 | fpload(¤t->thread.float_regs[0], ¤t->thread.fsr); |
261 | } | 261 | } |
262 | current_thread_info()->flags |= _TIF_USEDFPU; | 262 | set_thread_flag(TIF_USEDFPU); |
263 | #endif | 263 | #endif |
264 | } | 264 | } |
265 | 265 | ||
@@ -290,7 +290,7 @@ void do_fpe_trap(struct pt_regs *regs, unsigned long pc, unsigned long npc, | |||
290 | #ifndef CONFIG_SMP | 290 | #ifndef CONFIG_SMP |
291 | if(!fpt) { | 291 | if(!fpt) { |
292 | #else | 292 | #else |
293 | if(!(task_thread_info(fpt)->flags & _TIF_USEDFPU)) { | 293 | if (!test_tsk_thread_flag(fpt, TIF_USEDFPU)) { |
294 | #endif | 294 | #endif |
295 | fpsave(&fake_regs[0], &fake_fsr, &fake_queue[0], &fake_depth); | 295 | fpsave(&fake_regs[0], &fake_fsr, &fake_queue[0], &fake_depth); |
296 | regs->psr &= ~PSR_EF; | 296 | regs->psr &= ~PSR_EF; |
@@ -333,7 +333,7 @@ void do_fpe_trap(struct pt_regs *regs, unsigned long pc, unsigned long npc, | |||
333 | /* nope, better SIGFPE the offending process... */ | 333 | /* nope, better SIGFPE the offending process... */ |
334 | 334 | ||
335 | #ifdef CONFIG_SMP | 335 | #ifdef CONFIG_SMP |
336 | task_thread_info(fpt)->flags &= ~_TIF_USEDFPU; | 336 | clear_tsk_thread_flag(fpt, TIF_USEDFPU); |
337 | #endif | 337 | #endif |
338 | if(psr & PSR_PS) { | 338 | if(psr & PSR_PS) { |
339 | /* The first fsr store/load we tried trapped, | 339 | /* The first fsr store/load we tried trapped, |
diff --git a/arch/sparc/mm/init.c b/arch/sparc/mm/init.c index c85ddf312747..a532922e2e35 100644 --- a/arch/sparc/mm/init.c +++ b/arch/sparc/mm/init.c | |||
@@ -75,7 +75,7 @@ void show_mem(void) | |||
75 | printk("Free swap: %6ldkB\n", | 75 | printk("Free swap: %6ldkB\n", |
76 | nr_swap_pages << (PAGE_SHIFT-10)); | 76 | nr_swap_pages << (PAGE_SHIFT-10)); |
77 | printk("%ld pages of RAM\n", totalram_pages); | 77 | printk("%ld pages of RAM\n", totalram_pages); |
78 | printk("%d free pages\n", nr_free_pages()); | 78 | printk("%ld free pages\n", nr_free_pages()); |
79 | #if 0 /* undefined pgtable_cache_size, pgd_cache_size */ | 79 | #if 0 /* undefined pgtable_cache_size, pgd_cache_size */ |
80 | printk("%ld pages in page table cache\n",pgtable_cache_size); | 80 | printk("%ld pages in page table cache\n",pgtable_cache_size); |
81 | #ifndef CONFIG_SMP | 81 | #ifndef CONFIG_SMP |
diff --git a/arch/sparc64/kernel/process.c b/arch/sparc64/kernel/process.c index 7d75cd4eb297..b291060c25a6 100644 --- a/arch/sparc64/kernel/process.c +++ b/arch/sparc64/kernel/process.c | |||
@@ -413,8 +413,13 @@ void flush_thread(void) | |||
413 | struct thread_info *t = current_thread_info(); | 413 | struct thread_info *t = current_thread_info(); |
414 | struct mm_struct *mm; | 414 | struct mm_struct *mm; |
415 | 415 | ||
416 | if (t->flags & _TIF_ABI_PENDING) | 416 | if (test_ti_thread_flag(t, TIF_ABI_PENDING)) { |
417 | t->flags ^= (_TIF_ABI_PENDING | _TIF_32BIT); | 417 | clear_ti_thread_flag(t, TIF_ABI_PENDING); |
418 | if (test_ti_thread_flag(t, TIF_32BIT)) | ||
419 | clear_ti_thread_flag(t, TIF_32BIT); | ||
420 | else | ||
421 | set_ti_thread_flag(t, TIF_32BIT); | ||
422 | } | ||
418 | 423 | ||
419 | mm = t->task->mm; | 424 | mm = t->task->mm; |
420 | if (mm) | 425 | if (mm) |
diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S index 948b7d2d5874..aaeb5e06735c 100644 --- a/arch/sparc64/kernel/systbls.S +++ b/arch/sparc64/kernel/systbls.S | |||
@@ -79,7 +79,8 @@ sys_call_table32: | |||
79 | .word sys_mkdirat, sys_mknodat, sys_fchownat, compat_sys_futimesat, compat_sys_fstatat64 | 79 | .word sys_mkdirat, sys_mknodat, sys_fchownat, compat_sys_futimesat, compat_sys_fstatat64 |
80 | /*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat | 80 | /*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat |
81 | .word sys_fchmodat, sys_faccessat, compat_sys_pselect6, compat_sys_ppoll, sys_unshare | 81 | .word sys_fchmodat, sys_faccessat, compat_sys_pselect6, compat_sys_ppoll, sys_unshare |
82 | /*300*/ .word compat_sys_set_robust_list, compat_sys_get_robust_list, compat_sys_migrate_pages | 82 | /*300*/ .word compat_sys_set_robust_list, compat_sys_get_robust_list, compat_sys_migrate_pages, compat_sys_mbind, compat_sys_get_mempolicy |
83 | .word compat_sys_set_mempolicy, compat_sys_kexec_load, compat_sys_move_pages, sys_getcpu, compat_sys_epoll_pwait | ||
83 | 84 | ||
84 | #endif /* CONFIG_COMPAT */ | 85 | #endif /* CONFIG_COMPAT */ |
85 | 86 | ||
@@ -149,7 +150,8 @@ sys_call_table: | |||
149 | .word sys_mkdirat, sys_mknodat, sys_fchownat, sys_futimesat, sys_fstatat64 | 150 | .word sys_mkdirat, sys_mknodat, sys_fchownat, sys_futimesat, sys_fstatat64 |
150 | /*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat | 151 | /*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat |
151 | .word sys_fchmodat, sys_faccessat, sys_pselect6, sys_ppoll, sys_unshare | 152 | .word sys_fchmodat, sys_faccessat, sys_pselect6, sys_ppoll, sys_unshare |
152 | /*300*/ .word sys_set_robust_list, sys_get_robust_list, sys_migrate_pages | 153 | /*300*/ .word sys_set_robust_list, sys_get_robust_list, sys_migrate_pages, sys_mbind, sys_get_mempolicy |
154 | .word sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait | ||
153 | 155 | ||
154 | #if defined(CONFIG_SUNOS_EMUL) || defined(CONFIG_SOLARIS_EMUL) || \ | 156 | #if defined(CONFIG_SUNOS_EMUL) || defined(CONFIG_SOLARIS_EMUL) || \ |
155 | defined(CONFIG_SOLARIS_EMUL_MODULE) | 157 | defined(CONFIG_SOLARIS_EMUL_MODULE) |
@@ -264,5 +266,8 @@ sunos_sys_table: | |||
264 | .word sunos_nosys, sunos_nosys, sunos_nosys | 266 | .word sunos_nosys, sunos_nosys, sunos_nosys |
265 | .word sunos_nosys | 267 | .word sunos_nosys |
266 | /*300*/ .word sunos_nosys, sunos_nosys, sunos_nosys | 268 | /*300*/ .word sunos_nosys, sunos_nosys, sunos_nosys |
269 | .word sunos_nosys, sunos_nosys, sunos_nosys | ||
270 | .word sunos_nosys, sunos_nosys, sunos_nosys | ||
271 | .word sunos_nosys | ||
267 | 272 | ||
268 | #endif | 273 | #endif |
diff --git a/arch/sparc64/mm/hugetlbpage.c b/arch/sparc64/mm/hugetlbpage.c index 33fd0b265e70..00677b5e1d7d 100644 --- a/arch/sparc64/mm/hugetlbpage.c +++ b/arch/sparc64/mm/hugetlbpage.c | |||
@@ -248,6 +248,7 @@ void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, | |||
248 | if (!pte_present(*ptep) && pte_present(entry)) | 248 | if (!pte_present(*ptep) && pte_present(entry)) |
249 | mm->context.huge_pte_count++; | 249 | mm->context.huge_pte_count++; |
250 | 250 | ||
251 | addr &= HPAGE_MASK; | ||
251 | for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) { | 252 | for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) { |
252 | set_pte_at(mm, addr, ptep, entry); | 253 | set_pte_at(mm, addr, ptep, entry); |
253 | ptep++; | 254 | ptep++; |
@@ -266,6 +267,8 @@ pte_t huge_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, | |||
266 | if (pte_present(entry)) | 267 | if (pte_present(entry)) |
267 | mm->context.huge_pte_count--; | 268 | mm->context.huge_pte_count--; |
268 | 269 | ||
270 | addr &= HPAGE_MASK; | ||
271 | |||
269 | for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) { | 272 | for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) { |
270 | pte_clear(mm, addr, ptep); | 273 | pte_clear(mm, addr, ptep); |
271 | addr += PAGE_SIZE; | 274 | addr += PAGE_SIZE; |
diff --git a/arch/um/Kconfig b/arch/um/Kconfig index b3a21ba77cd2..354cc6b70530 100644 --- a/arch/um/Kconfig +++ b/arch/um/Kconfig | |||
@@ -44,7 +44,7 @@ config LOCKDEP_SUPPORT | |||
44 | 44 | ||
45 | config STACKTRACE_SUPPORT | 45 | config STACKTRACE_SUPPORT |
46 | bool | 46 | bool |
47 | default y | 47 | default n |
48 | 48 | ||
49 | config GENERIC_CALIBRATE_DELAY | 49 | config GENERIC_CALIBRATE_DELAY |
50 | bool | 50 | bool |
diff --git a/arch/um/scripts/Makefile.rules b/arch/um/scripts/Makefile.rules index 813077fb1e5b..a9a4b85ca516 100644 --- a/arch/um/scripts/Makefile.rules +++ b/arch/um/scripts/Makefile.rules | |||
@@ -10,7 +10,7 @@ USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file)) | |||
10 | $(USER_OBJS:.o=.%): \ | 10 | $(USER_OBJS:.o=.%): \ |
11 | c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) $(CFLAGS_$(basetarget).o) | 11 | c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) $(CFLAGS_$(basetarget).o) |
12 | $(USER_OBJS) : CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ \ | 12 | $(USER_OBJS) : CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ \ |
13 | -Dunix -D__unix__ -D__$(SUBARCH)__ | 13 | -Dunix -D__unix__ -D__$(SUBARCH)__ $(CF) |
14 | 14 | ||
15 | # These are like USER_OBJS but filter USER_CFLAGS through unprofile instead of | 15 | # These are like USER_OBJS but filter USER_CFLAGS through unprofile instead of |
16 | # using it directly. | 16 | # using it directly. |
@@ -19,7 +19,7 @@ UNPROFILE_OBJS := $(foreach file,$(UNPROFILE_OBJS),$(obj)/$(file)) | |||
19 | $(UNPROFILE_OBJS:.o=.%): \ | 19 | $(UNPROFILE_OBJS:.o=.%): \ |
20 | c_flags = -Wp,-MD,$(depfile) $(call unprofile,$(USER_CFLAGS)) $(CFLAGS_$(basetarget).o) | 20 | c_flags = -Wp,-MD,$(depfile) $(call unprofile,$(USER_CFLAGS)) $(CFLAGS_$(basetarget).o) |
21 | $(UNPROFILE_OBJS) : CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ \ | 21 | $(UNPROFILE_OBJS) : CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ \ |
22 | -Dunix -D__unix__ -D__$(SUBARCH)__ | 22 | -Dunix -D__unix__ -D__$(SUBARCH)__ $(CF) |
23 | 23 | ||
24 | # The stubs and unmap.o can't try to call mcount or update basic block data | 24 | # The stubs and unmap.o can't try to call mcount or update basic block data |
25 | define unprofile | 25 | define unprofile |
diff --git a/arch/x86_64/kernel/nmi.c b/arch/x86_64/kernel/nmi.c index 486f4c61a948..82d9d85d5270 100644 --- a/arch/x86_64/kernel/nmi.c +++ b/arch/x86_64/kernel/nmi.c | |||
@@ -187,10 +187,7 @@ void nmi_watchdog_default(void) | |||
187 | { | 187 | { |
188 | if (nmi_watchdog != NMI_DEFAULT) | 188 | if (nmi_watchdog != NMI_DEFAULT) |
189 | return; | 189 | return; |
190 | if (nmi_known_cpu()) | 190 | nmi_watchdog = NMI_NONE; |
191 | nmi_watchdog = NMI_LOCAL_APIC; | ||
192 | else | ||
193 | nmi_watchdog = NMI_IO_APIC; | ||
194 | } | 191 | } |
195 | 192 | ||
196 | static int endflag __initdata = 0; | 193 | static int endflag __initdata = 0; |
diff --git a/arch/x86_64/kernel/vsyscall.c b/arch/x86_64/kernel/vsyscall.c index 180ff919eaf9..b43c698cf7d3 100644 --- a/arch/x86_64/kernel/vsyscall.c +++ b/arch/x86_64/kernel/vsyscall.c | |||
@@ -112,7 +112,7 @@ static __always_inline void do_vgettimeofday(struct timeval * tv) | |||
112 | 112 | ||
113 | vread = __vsyscall_gtod_data.clock.vread; | 113 | vread = __vsyscall_gtod_data.clock.vread; |
114 | if (unlikely(!__vsyscall_gtod_data.sysctl_enabled || !vread)) { | 114 | if (unlikely(!__vsyscall_gtod_data.sysctl_enabled || !vread)) { |
115 | gettimeofday(tv,0); | 115 | gettimeofday(tv,NULL); |
116 | return; | 116 | return; |
117 | } | 117 | } |
118 | now = vread(); | 118 | now = vread(); |
diff --git a/drivers/acpi/events/evmisc.c b/drivers/acpi/events/evmisc.c index 8dcade63b04b..3a799b9b5df5 100644 --- a/drivers/acpi/events/evmisc.c +++ b/drivers/acpi/events/evmisc.c | |||
@@ -549,7 +549,7 @@ acpi_status acpi_ev_release_global_lock(void) | |||
549 | acpi_gbl_global_lock_acquired = FALSE; | 549 | acpi_gbl_global_lock_acquired = FALSE; |
550 | 550 | ||
551 | /* Release the local GL mutex */ | 551 | /* Release the local GL mutex */ |
552 | acpi_ev_global_lock_thread_id = 0; | 552 | acpi_ev_global_lock_thread_id = NULL; |
553 | acpi_ev_global_lock_acquired = 0; | 553 | acpi_ev_global_lock_acquired = 0; |
554 | acpi_os_release_mutex(acpi_gbl_global_lock_mutex); | 554 | acpi_os_release_mutex(acpi_gbl_global_lock_mutex); |
555 | return_ACPI_STATUS(status); | 555 | return_ACPI_STATUS(status); |
diff --git a/drivers/ata/pata_cs5520.c b/drivers/ata/pata_cs5520.c index 7ef834250a43..55cc293e7487 100644 --- a/drivers/ata/pata_cs5520.c +++ b/drivers/ata/pata_cs5520.c | |||
@@ -208,7 +208,7 @@ static struct ata_port_operations cs5520_port_ops = { | |||
208 | static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 208 | static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
209 | { | 209 | { |
210 | u8 pcicfg; | 210 | u8 pcicfg; |
211 | void *iomap[5]; | 211 | void __iomem *iomap[5]; |
212 | static struct ata_probe_ent probe[2]; | 212 | static struct ata_probe_ent probe[2]; |
213 | int ports = 0; | 213 | int ports = 0; |
214 | 214 | ||
diff --git a/drivers/ata/pata_mpc52xx.c b/drivers/ata/pata_mpc52xx.c index f5d88729ca79..882c36eaf293 100644 --- a/drivers/ata/pata_mpc52xx.c +++ b/drivers/ata/pata_mpc52xx.c | |||
@@ -329,7 +329,7 @@ mpc52xx_ata_init_one(struct device *dev, struct mpc52xx_ata_priv *priv) | |||
329 | ae->dev = dev; | 329 | ae->dev = dev; |
330 | ae->irq = priv->ata_irq; | 330 | ae->irq = priv->ata_irq; |
331 | 331 | ||
332 | aio->cmd_addr = 0; /* Don't have a classic reg block */ | 332 | aio->cmd_addr = NULL; /* Don't have a classic reg block */ |
333 | aio->altstatus_addr = &priv->ata_regs->tf_control; | 333 | aio->altstatus_addr = &priv->ata_regs->tf_control; |
334 | aio->ctl_addr = &priv->ata_regs->tf_control; | 334 | aio->ctl_addr = &priv->ata_regs->tf_control; |
335 | aio->data_addr = &priv->ata_regs->tf_data; | 335 | aio->data_addr = &priv->ata_regs->tf_data; |
diff --git a/drivers/ata/sata_sis.c b/drivers/ata/sata_sis.c index 1879e0cd56aa..a787f0d4a5ba 100644 --- a/drivers/ata/sata_sis.c +++ b/drivers/ata/sata_sis.c | |||
@@ -354,7 +354,7 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
354 | return -ENOMEM; | 354 | return -ENOMEM; |
355 | 355 | ||
356 | if (!(probe_ent->port_flags & SIS_FLAG_CFGSCR)) { | 356 | if (!(probe_ent->port_flags & SIS_FLAG_CFGSCR)) { |
357 | void *mmio; | 357 | void __iomem *mmio; |
358 | 358 | ||
359 | mmio = pcim_iomap(pdev, SIS_SCR_PCI_BAR, 0); | 359 | mmio = pcim_iomap(pdev, SIS_SCR_PCI_BAR, 0); |
360 | if (!mmio) | 360 | if (!mmio) |
diff --git a/drivers/atm/zatm.c b/drivers/atm/zatm.c index 0d7091e2077f..2ad2527cf5b3 100644 --- a/drivers/atm/zatm.c +++ b/drivers/atm/zatm.c | |||
@@ -1177,7 +1177,7 @@ static void __devinit eprom_get_esi(struct atm_dev *dev) | |||
1177 | /*--------------------------------- entries ---------------------------------*/ | 1177 | /*--------------------------------- entries ---------------------------------*/ |
1178 | 1178 | ||
1179 | 1179 | ||
1180 | static int __init zatm_init(struct atm_dev *dev) | 1180 | static int __devinit zatm_init(struct atm_dev *dev) |
1181 | { | 1181 | { |
1182 | struct zatm_dev *zatm_dev; | 1182 | struct zatm_dev *zatm_dev; |
1183 | struct pci_dev *pci_dev; | 1183 | struct pci_dev *pci_dev; |
@@ -1256,7 +1256,7 @@ static int __init zatm_init(struct atm_dev *dev) | |||
1256 | } | 1256 | } |
1257 | 1257 | ||
1258 | 1258 | ||
1259 | static int __init zatm_start(struct atm_dev *dev) | 1259 | static int __devinit zatm_start(struct atm_dev *dev) |
1260 | { | 1260 | { |
1261 | struct zatm_dev *zatm_dev = ZATM_DEV(dev); | 1261 | struct zatm_dev *zatm_dev = ZATM_DEV(dev); |
1262 | struct pci_dev *pdev = zatm_dev->pci_dev; | 1262 | struct pci_dev *pdev = zatm_dev->pci_dev; |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 0c716ee905d7..072e18e6d76d 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
@@ -1439,7 +1439,7 @@ static int rebuild_lun_table(ctlr_info_t *h, struct gendisk *del_disk) | |||
1439 | 1439 | ||
1440 | if (return_code == IO_OK) { | 1440 | if (return_code == IO_OK) { |
1441 | listlength = | 1441 | listlength = |
1442 | be32_to_cpu(*(__u32 *) ld_buff->LUNListLength); | 1442 | be32_to_cpu(*(__be32 *) ld_buff->LUNListLength); |
1443 | } else { /* reading number of logical volumes failed */ | 1443 | } else { /* reading number of logical volumes failed */ |
1444 | printk(KERN_WARNING "cciss: report logical volume" | 1444 | printk(KERN_WARNING "cciss: report logical volume" |
1445 | " command failed\n"); | 1445 | " command failed\n"); |
@@ -1961,8 +1961,8 @@ cciss_read_capacity(int ctlr, int logvol, int withirq, sector_t *total_size, | |||
1961 | ctlr, buf, sizeof(ReadCapdata_struct), | 1961 | ctlr, buf, sizeof(ReadCapdata_struct), |
1962 | 1, logvol, 0, NULL, TYPE_CMD); | 1962 | 1, logvol, 0, NULL, TYPE_CMD); |
1963 | if (return_code == IO_OK) { | 1963 | if (return_code == IO_OK) { |
1964 | *total_size = be32_to_cpu(*(__u32 *) buf->total_size); | 1964 | *total_size = be32_to_cpu(*(__be32 *) buf->total_size); |
1965 | *block_size = be32_to_cpu(*(__u32 *) buf->block_size); | 1965 | *block_size = be32_to_cpu(*(__be32 *) buf->block_size); |
1966 | } else { /* read capacity command failed */ | 1966 | } else { /* read capacity command failed */ |
1967 | printk(KERN_WARNING "cciss: read capacity failed\n"); | 1967 | printk(KERN_WARNING "cciss: read capacity failed\n"); |
1968 | *total_size = 0; | 1968 | *total_size = 0; |
@@ -1997,8 +1997,8 @@ cciss_read_capacity_16(int ctlr, int logvol, int withirq, sector_t *total_size, | |||
1997 | 1, logvol, 0, NULL, TYPE_CMD); | 1997 | 1, logvol, 0, NULL, TYPE_CMD); |
1998 | } | 1998 | } |
1999 | if (return_code == IO_OK) { | 1999 | if (return_code == IO_OK) { |
2000 | *total_size = be64_to_cpu(*(__u64 *) buf->total_size); | 2000 | *total_size = be64_to_cpu(*(__be64 *) buf->total_size); |
2001 | *block_size = be32_to_cpu(*(__u32 *) buf->block_size); | 2001 | *block_size = be32_to_cpu(*(__be32 *) buf->block_size); |
2002 | } else { /* read capacity command failed */ | 2002 | } else { /* read capacity command failed */ |
2003 | printk(KERN_WARNING "cciss: read capacity failed\n"); | 2003 | printk(KERN_WARNING "cciss: read capacity failed\n"); |
2004 | *total_size = 0; | 2004 | *total_size = 0; |
diff --git a/drivers/block/paride/pd.c b/drivers/block/paride/pd.c index 99e2c8ce1cc4..31e01488eb51 100644 --- a/drivers/block/paride/pd.c +++ b/drivers/block/paride/pd.c | |||
@@ -663,11 +663,11 @@ static enum action pd_identify(struct pd_unit *disk) | |||
663 | return Fail; | 663 | return Fail; |
664 | pi_read_block(disk->pi, pd_scratch, 512); | 664 | pi_read_block(disk->pi, pd_scratch, 512); |
665 | disk->can_lba = pd_scratch[99] & 2; | 665 | disk->can_lba = pd_scratch[99] & 2; |
666 | disk->sectors = le16_to_cpu(*(u16 *) (pd_scratch + 12)); | 666 | disk->sectors = le16_to_cpu(*(__le16 *) (pd_scratch + 12)); |
667 | disk->heads = le16_to_cpu(*(u16 *) (pd_scratch + 6)); | 667 | disk->heads = le16_to_cpu(*(__le16 *) (pd_scratch + 6)); |
668 | disk->cylinders = le16_to_cpu(*(u16 *) (pd_scratch + 2)); | 668 | disk->cylinders = le16_to_cpu(*(__le16 *) (pd_scratch + 2)); |
669 | if (disk->can_lba) | 669 | if (disk->can_lba) |
670 | disk->capacity = le32_to_cpu(*(u32 *) (pd_scratch + 120)); | 670 | disk->capacity = le32_to_cpu(*(__le32 *) (pd_scratch + 120)); |
671 | else | 671 | else |
672 | disk->capacity = disk->sectors * disk->heads * disk->cylinders; | 672 | disk->capacity = disk->sectors * disk->heads * disk->cylinders; |
673 | 673 | ||
diff --git a/drivers/char/watchdog/Kconfig b/drivers/char/watchdog/Kconfig index ea09d0c974ea..e812aa129e28 100644 --- a/drivers/char/watchdog/Kconfig +++ b/drivers/char/watchdog/Kconfig | |||
@@ -301,6 +301,7 @@ config I6300ESB_WDT | |||
301 | config I8XX_TCO | 301 | config I8XX_TCO |
302 | tristate "Intel i8xx TCO Timer/Watchdog" | 302 | tristate "Intel i8xx TCO Timer/Watchdog" |
303 | depends on WATCHDOG && (X86 || IA64) && PCI | 303 | depends on WATCHDOG && (X86 || IA64) && PCI |
304 | default n | ||
304 | ---help--- | 305 | ---help--- |
305 | Hardware driver for the TCO timer built into the Intel 82801 | 306 | Hardware driver for the TCO timer built into the Intel 82801 |
306 | I/O Controller Hub family. The TCO (Total Cost of Ownership) | 307 | I/O Controller Hub family. The TCO (Total Cost of Ownership) |
diff --git a/drivers/char/watchdog/machzwd.c b/drivers/char/watchdog/machzwd.c index 4a328ba0d262..81fb3dec180f 100644 --- a/drivers/char/watchdog/machzwd.c +++ b/drivers/char/watchdog/machzwd.c | |||
@@ -324,7 +324,7 @@ static int zf_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | |||
324 | return put_user(0, p); | 324 | return put_user(0, p); |
325 | 325 | ||
326 | case WDIOC_KEEPALIVE: | 326 | case WDIOC_KEEPALIVE: |
327 | zf_ping(0); | 327 | zf_ping(NULL); |
328 | break; | 328 | break; |
329 | 329 | ||
330 | default: | 330 | default: |
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index d28d76d22043..67f3347afcf3 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
@@ -755,8 +755,7 @@ static __inline__ __u32 extract(__u8 *report, unsigned offset, unsigned n) | |||
755 | 755 | ||
756 | report += offset >> 3; /* adjust byte index */ | 756 | report += offset >> 3; /* adjust byte index */ |
757 | offset &= 7; /* now only need bit offset into one byte */ | 757 | offset &= 7; /* now only need bit offset into one byte */ |
758 | x = get_unaligned((u64 *) report); | 758 | x = le64_to_cpu(get_unaligned((__le64 *) report)); |
759 | x = le64_to_cpu(x); | ||
760 | x = (x >> offset) & ((1ULL << n) - 1); /* extract bit field */ | 759 | x = (x >> offset) & ((1ULL << n) - 1); /* extract bit field */ |
761 | return (u32) x; | 760 | return (u32) x; |
762 | } | 761 | } |
@@ -771,7 +770,7 @@ static __inline__ __u32 extract(__u8 *report, unsigned offset, unsigned n) | |||
771 | */ | 770 | */ |
772 | static __inline__ void implement(__u8 *report, unsigned offset, unsigned n, __u32 value) | 771 | static __inline__ void implement(__u8 *report, unsigned offset, unsigned n, __u32 value) |
773 | { | 772 | { |
774 | u64 x; | 773 | __le64 x; |
775 | u64 m = (1ULL << n) - 1; | 774 | u64 m = (1ULL << n) - 1; |
776 | 775 | ||
777 | WARN_ON(n > 32); | 776 | WARN_ON(n > 32); |
@@ -782,10 +781,10 @@ static __inline__ void implement(__u8 *report, unsigned offset, unsigned n, __u3 | |||
782 | report += offset >> 3; | 781 | report += offset >> 3; |
783 | offset &= 7; | 782 | offset &= 7; |
784 | 783 | ||
785 | x = get_unaligned((u64 *)report); | 784 | x = get_unaligned((__le64 *)report); |
786 | x &= cpu_to_le64(~(m << offset)); | 785 | x &= cpu_to_le64(~(m << offset)); |
787 | x |= cpu_to_le64(((u64) value) << offset); | 786 | x |= cpu_to_le64(((u64) value) << offset); |
788 | put_unaligned(x, (u64 *) report); | 787 | put_unaligned(x, (__le64 *) report); |
789 | } | 788 | } |
790 | 789 | ||
791 | /* | 790 | /* |
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index 5d134bb75ba1..3f76987d818a 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
@@ -802,7 +802,7 @@ config BLK_DEV_IDEDMA_PMAC | |||
802 | 802 | ||
803 | config BLK_DEV_IDE_CELLEB | 803 | config BLK_DEV_IDE_CELLEB |
804 | bool "Toshiba's Cell Reference Set IDE support" | 804 | bool "Toshiba's Cell Reference Set IDE support" |
805 | depends on PPC_CELLEB | 805 | depends on PPC_CELLEB && IDE=y |
806 | help | 806 | help |
807 | This driver provides support for the built-in IDE controller on | 807 | This driver provides support for the built-in IDE controller on |
808 | Toshiba Cell Reference Board. | 808 | Toshiba Cell Reference Board. |
diff --git a/drivers/infiniband/hw/ipath/ipath_dma.c b/drivers/infiniband/hw/ipath/ipath_dma.c index f6f949040825..f87f003e3ef8 100644 --- a/drivers/infiniband/hw/ipath/ipath_dma.c +++ b/drivers/infiniband/hw/ipath/ipath_dma.c | |||
@@ -167,7 +167,7 @@ static void *ipath_dma_alloc_coherent(struct ib_device *dev, size_t size, | |||
167 | } | 167 | } |
168 | 168 | ||
169 | static void ipath_dma_free_coherent(struct ib_device *dev, size_t size, | 169 | static void ipath_dma_free_coherent(struct ib_device *dev, size_t size, |
170 | void *cpu_addr, dma_addr_t dma_handle) | 170 | void *cpu_addr, u64 dma_handle) |
171 | { | 171 | { |
172 | free_pages((unsigned long) cpu_addr, get_order(size)); | 172 | free_pages((unsigned long) cpu_addr, get_order(size)); |
173 | } | 173 | } |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c index 1ff5138e4bb6..9916cf32494d 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c | |||
@@ -1248,10 +1248,10 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw) | |||
1248 | ret |= pvr2_write_register(hdw, 0xaa18, 0x00840000); /*unknown*/ | 1248 | ret |= pvr2_write_register(hdw, 0xaa18, 0x00840000); /*unknown*/ |
1249 | LOCK_TAKE(hdw->ctl_lock); do { | 1249 | LOCK_TAKE(hdw->ctl_lock); do { |
1250 | hdw->cmd_buffer[0] = FX2CMD_FWPOST1; | 1250 | hdw->cmd_buffer[0] = FX2CMD_FWPOST1; |
1251 | ret |= pvr2_send_request(hdw,hdw->cmd_buffer,1,0,0); | 1251 | ret |= pvr2_send_request(hdw,hdw->cmd_buffer,1,NULL,0); |
1252 | hdw->cmd_buffer[0] = FX2CMD_MEMSEL; | 1252 | hdw->cmd_buffer[0] = FX2CMD_MEMSEL; |
1253 | hdw->cmd_buffer[1] = 0; | 1253 | hdw->cmd_buffer[1] = 0; |
1254 | ret |= pvr2_send_request(hdw,hdw->cmd_buffer,2,0,0); | 1254 | ret |= pvr2_send_request(hdw,hdw->cmd_buffer,2,NULL,0); |
1255 | } while (0); LOCK_GIVE(hdw->ctl_lock); | 1255 | } while (0); LOCK_GIVE(hdw->ctl_lock); |
1256 | 1256 | ||
1257 | if (ret) { | 1257 | if (ret) { |
@@ -1320,7 +1320,7 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw) | |||
1320 | LOCK_TAKE(hdw->ctl_lock); do { | 1320 | LOCK_TAKE(hdw->ctl_lock); do { |
1321 | hdw->cmd_buffer[0] = FX2CMD_MEMSEL; | 1321 | hdw->cmd_buffer[0] = FX2CMD_MEMSEL; |
1322 | hdw->cmd_buffer[1] = 0; | 1322 | hdw->cmd_buffer[1] = 0; |
1323 | ret |= pvr2_send_request(hdw,hdw->cmd_buffer,2,0,0); | 1323 | ret |= pvr2_send_request(hdw,hdw->cmd_buffer,2,NULL,0); |
1324 | } while (0); LOCK_GIVE(hdw->ctl_lock); | 1324 | } while (0); LOCK_GIVE(hdw->ctl_lock); |
1325 | 1325 | ||
1326 | if (ret) { | 1326 | if (ret) { |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-v4l2.c b/drivers/media/video/pvrusb2/pvrusb2-v4l2.c index 5313d342666e..25d3830b482a 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-v4l2.c +++ b/drivers/media/video/pvrusb2/pvrusb2-v4l2.c | |||
@@ -808,11 +808,11 @@ static void pvr2_v4l2_destroy_no_lock(struct pvr2_v4l2 *vp) | |||
808 | { | 808 | { |
809 | if (vp->dev_video) { | 809 | if (vp->dev_video) { |
810 | pvr2_v4l2_dev_destroy(vp->dev_video); | 810 | pvr2_v4l2_dev_destroy(vp->dev_video); |
811 | vp->dev_video = 0; | 811 | vp->dev_video = NULL; |
812 | } | 812 | } |
813 | if (vp->dev_radio) { | 813 | if (vp->dev_radio) { |
814 | pvr2_v4l2_dev_destroy(vp->dev_radio); | 814 | pvr2_v4l2_dev_destroy(vp->dev_radio); |
815 | vp->dev_radio = 0; | 815 | vp->dev_radio = NULL; |
816 | } | 816 | } |
817 | 817 | ||
818 | pvr2_trace(PVR2_TRACE_STRUCT,"Destroying pvr2_v4l2 id=%p",vp); | 818 | pvr2_trace(PVR2_TRACE_STRUCT,"Destroying pvr2_v4l2 id=%p",vp); |
@@ -1138,7 +1138,7 @@ static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip, | |||
1138 | { | 1138 | { |
1139 | int mindevnum; | 1139 | int mindevnum; |
1140 | int unit_number; | 1140 | int unit_number; |
1141 | int *nr_ptr = 0; | 1141 | int *nr_ptr = NULL; |
1142 | dip->v4lp = vp; | 1142 | dip->v4lp = vp; |
1143 | 1143 | ||
1144 | 1144 | ||
diff --git a/drivers/mmc/imxmmc.c b/drivers/mmc/imxmmc.c index b060d4bfba29..0de5c9e94e74 100644 --- a/drivers/mmc/imxmmc.c +++ b/drivers/mmc/imxmmc.c | |||
@@ -569,10 +569,12 @@ static int imxmci_cpu_driven_data(struct imxmci_host *host, unsigned int *pstat) | |||
569 | 569 | ||
570 | if(host->dma_dir == DMA_FROM_DEVICE) { | 570 | if(host->dma_dir == DMA_FROM_DEVICE) { |
571 | imxmci_busy_wait_for_status(host, &stat, | 571 | imxmci_busy_wait_for_status(host, &stat, |
572 | STATUS_APPL_BUFF_FF | STATUS_DATA_TRANS_DONE, | 572 | STATUS_APPL_BUFF_FF | STATUS_DATA_TRANS_DONE | |
573 | STATUS_TIME_OUT_READ, | ||
573 | 50, "imxmci_cpu_driven_data read"); | 574 | 50, "imxmci_cpu_driven_data read"); |
574 | 575 | ||
575 | while((stat & (STATUS_APPL_BUFF_FF | STATUS_DATA_TRANS_DONE)) && | 576 | while((stat & (STATUS_APPL_BUFF_FF | STATUS_DATA_TRANS_DONE)) && |
577 | !(stat & STATUS_TIME_OUT_READ) && | ||
576 | (host->data_cnt < 512)) { | 578 | (host->data_cnt < 512)) { |
577 | 579 | ||
578 | udelay(20); /* required for clocks < 8MHz*/ | 580 | udelay(20); /* required for clocks < 8MHz*/ |
@@ -602,6 +604,12 @@ static int imxmci_cpu_driven_data(struct imxmci_host *host, unsigned int *pstat) | |||
602 | if(host->dma_size & 0x1ff) | 604 | if(host->dma_size & 0x1ff) |
603 | stat &= ~STATUS_CRC_READ_ERR; | 605 | stat &= ~STATUS_CRC_READ_ERR; |
604 | 606 | ||
607 | if(stat & STATUS_TIME_OUT_READ) { | ||
608 | dev_dbg(mmc_dev(host->mmc), "imxmci_cpu_driven_data read timeout STATUS = 0x%x\n", | ||
609 | stat); | ||
610 | trans_done = -1; | ||
611 | } | ||
612 | |||
605 | } else { | 613 | } else { |
606 | imxmci_busy_wait_for_status(host, &stat, | 614 | imxmci_busy_wait_for_status(host, &stat, |
607 | STATUS_APPL_BUFF_FE, | 615 | STATUS_APPL_BUFF_FE, |
@@ -709,6 +717,9 @@ static void imxmci_tasklet_fnc(unsigned long data) | |||
709 | */ | 717 | */ |
710 | stat |= host->status_reg; | 718 | stat |= host->status_reg; |
711 | 719 | ||
720 | if(test_bit(IMXMCI_PEND_CPU_DATA_b, &host->pending_events)) | ||
721 | stat &= ~STATUS_CRC_READ_ERR; | ||
722 | |||
712 | if(test_bit(IMXMCI_PEND_WAIT_RESP_b, &host->pending_events)) { | 723 | if(test_bit(IMXMCI_PEND_WAIT_RESP_b, &host->pending_events)) { |
713 | imxmci_busy_wait_for_status(host, &stat, | 724 | imxmci_busy_wait_for_status(host, &stat, |
714 | STATUS_END_CMD_RESP | STATUS_ERR_MASK, | 725 | STATUS_END_CMD_RESP | STATUS_ERR_MASK, |
diff --git a/drivers/net/atl1/atl1_main.c b/drivers/net/atl1/atl1_main.c index 88d4f70035bb..dee3638ad744 100644 --- a/drivers/net/atl1/atl1_main.c +++ b/drivers/net/atl1/atl1_main.c | |||
@@ -1328,7 +1328,7 @@ static int atl1_tx_csum(struct atl1_adapter *adapter, struct sk_buff *skb, | |||
1328 | 1328 | ||
1329 | if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { | 1329 | if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { |
1330 | cso = skb->h.raw - skb->data; | 1330 | cso = skb->h.raw - skb->data; |
1331 | css = (skb->h.raw + skb->csum) - skb->data; | 1331 | css = (skb->h.raw + skb->csum_offset) - skb->data; |
1332 | if (unlikely(cso & 0x1)) { | 1332 | if (unlikely(cso & 0x1)) { |
1333 | printk(KERN_DEBUG "%s: payload offset != even number\n", | 1333 | printk(KERN_DEBUG "%s: payload offset != even number\n", |
1334 | atl1_driver_name); | 1334 | atl1_driver_name); |
@@ -1562,7 +1562,7 @@ static int atl1_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
1562 | /* mss will be nonzero if we're doing segment offload (TSO/GSO) */ | 1562 | /* mss will be nonzero if we're doing segment offload (TSO/GSO) */ |
1563 | mss = skb_shinfo(skb)->gso_size; | 1563 | mss = skb_shinfo(skb)->gso_size; |
1564 | if (mss) { | 1564 | if (mss) { |
1565 | if (skb->protocol == ntohs(ETH_P_IP)) { | 1565 | if (skb->protocol == htons(ETH_P_IP)) { |
1566 | proto_hdr_len = ((skb->h.raw - skb->data) + | 1566 | proto_hdr_len = ((skb->h.raw - skb->data) + |
1567 | (skb->h.th->doff << 2)); | 1567 | (skb->h.th->doff << 2)); |
1568 | if (unlikely(proto_hdr_len > len)) { | 1568 | if (unlikely(proto_hdr_len > len)) { |
diff --git a/drivers/net/pcmcia/ibmtr_cs.c b/drivers/net/pcmcia/ibmtr_cs.c index a956a51d284f..1060154ae750 100644 --- a/drivers/net/pcmcia/ibmtr_cs.c +++ b/drivers/net/pcmcia/ibmtr_cs.c | |||
@@ -138,7 +138,7 @@ static const struct ethtool_ops netdev_ethtool_ops = { | |||
138 | 138 | ||
139 | ======================================================================*/ | 139 | ======================================================================*/ |
140 | 140 | ||
141 | static int ibmtr_attach(struct pcmcia_device *link) | 141 | static int __devinit ibmtr_attach(struct pcmcia_device *link) |
142 | { | 142 | { |
143 | ibmtr_dev_t *info; | 143 | ibmtr_dev_t *info; |
144 | struct net_device *dev; | 144 | struct net_device *dev; |
@@ -217,7 +217,7 @@ static void ibmtr_detach(struct pcmcia_device *link) | |||
217 | #define CS_CHECK(fn, ret) \ | 217 | #define CS_CHECK(fn, ret) \ |
218 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) | 218 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) |
219 | 219 | ||
220 | static int ibmtr_config(struct pcmcia_device *link) | 220 | static int __devinit ibmtr_config(struct pcmcia_device *link) |
221 | { | 221 | { |
222 | ibmtr_dev_t *info = link->priv; | 222 | ibmtr_dev_t *info = link->priv; |
223 | struct net_device *dev = info->dev; | 223 | struct net_device *dev = info->dev; |
diff --git a/drivers/net/tokenring/ibmtr.c b/drivers/net/tokenring/ibmtr.c index 36202e94ee91..01d55315ee8c 100644 --- a/drivers/net/tokenring/ibmtr.c +++ b/drivers/net/tokenring/ibmtr.c | |||
@@ -346,7 +346,7 @@ static void ibmtr_cleanup_card(struct net_device *dev) | |||
346 | * which references it. | 346 | * which references it. |
347 | ****************************************************************************/ | 347 | ****************************************************************************/ |
348 | 348 | ||
349 | static int __init ibmtr_probe(struct net_device *dev) | 349 | static int __devinit ibmtr_probe(struct net_device *dev) |
350 | { | 350 | { |
351 | int i; | 351 | int i; |
352 | int base_addr = dev->base_addr; | 352 | int base_addr = dev->base_addr; |
@@ -366,7 +366,7 @@ static int __init ibmtr_probe(struct net_device *dev) | |||
366 | return -ENODEV; | 366 | return -ENODEV; |
367 | } | 367 | } |
368 | 368 | ||
369 | int __init ibmtr_probe_card(struct net_device *dev) | 369 | int __devinit ibmtr_probe_card(struct net_device *dev) |
370 | { | 370 | { |
371 | int err = ibmtr_probe(dev); | 371 | int err = ibmtr_probe(dev); |
372 | if (!err) { | 372 | if (!err) { |
diff --git a/drivers/net/tulip/dmfe.c b/drivers/net/tulip/dmfe.c index 24a29c99ba94..9aeac76184f3 100644 --- a/drivers/net/tulip/dmfe.c +++ b/drivers/net/tulip/dmfe.c | |||
@@ -190,13 +190,13 @@ | |||
190 | 190 | ||
191 | /* Structure/enum declaration ------------------------------- */ | 191 | /* Structure/enum declaration ------------------------------- */ |
192 | struct tx_desc { | 192 | struct tx_desc { |
193 | u32 tdes0, tdes1, tdes2, tdes3; /* Data for the card */ | 193 | __le32 tdes0, tdes1, tdes2, tdes3; /* Data for the card */ |
194 | char *tx_buf_ptr; /* Data for us */ | 194 | char *tx_buf_ptr; /* Data for us */ |
195 | struct tx_desc *next_tx_desc; | 195 | struct tx_desc *next_tx_desc; |
196 | } __attribute__(( aligned(32) )); | 196 | } __attribute__(( aligned(32) )); |
197 | 197 | ||
198 | struct rx_desc { | 198 | struct rx_desc { |
199 | u32 rdes0, rdes1, rdes2, rdes3; /* Data for the card */ | 199 | __le32 rdes0, rdes1, rdes2, rdes3; /* Data for the card */ |
200 | struct sk_buff *rx_skb_ptr; /* Data for us */ | 200 | struct sk_buff *rx_skb_ptr; /* Data for us */ |
201 | struct rx_desc *next_rx_desc; | 201 | struct rx_desc *next_rx_desc; |
202 | } __attribute__(( aligned(32) )); | 202 | } __attribute__(( aligned(32) )); |
@@ -458,7 +458,7 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev, | |||
458 | 458 | ||
459 | /* read 64 word srom data */ | 459 | /* read 64 word srom data */ |
460 | for (i = 0; i < 64; i++) | 460 | for (i = 0; i < 64; i++) |
461 | ((u16 *) db->srom)[i] = | 461 | ((__le16 *) db->srom)[i] = |
462 | cpu_to_le16(read_srom_word(db->ioaddr, i)); | 462 | cpu_to_le16(read_srom_word(db->ioaddr, i)); |
463 | 463 | ||
464 | /* Set Node address */ | 464 | /* Set Node address */ |
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index 01869b1782e4..ad33e0159514 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
@@ -100,6 +100,7 @@ static void msi_set_mask_bit(unsigned int irq, int flag) | |||
100 | BUG(); | 100 | BUG(); |
101 | break; | 101 | break; |
102 | } | 102 | } |
103 | entry->msi_attrib.masked = !!flag; | ||
103 | } | 104 | } |
104 | 105 | ||
105 | void read_msi_msg(unsigned int irq, struct msi_msg *msg) | 106 | void read_msi_msg(unsigned int irq, struct msi_msg *msg) |
@@ -179,6 +180,7 @@ void write_msi_msg(unsigned int irq, struct msi_msg *msg) | |||
179 | default: | 180 | default: |
180 | BUG(); | 181 | BUG(); |
181 | } | 182 | } |
183 | entry->msg = *msg; | ||
182 | } | 184 | } |
183 | 185 | ||
184 | void mask_msi_irq(unsigned int irq) | 186 | void mask_msi_irq(unsigned int irq) |
@@ -225,164 +227,60 @@ static struct msi_desc* alloc_msi_entry(void) | |||
225 | } | 227 | } |
226 | 228 | ||
227 | #ifdef CONFIG_PM | 229 | #ifdef CONFIG_PM |
228 | static int __pci_save_msi_state(struct pci_dev *dev) | ||
229 | { | ||
230 | int pos, i = 0; | ||
231 | u16 control; | ||
232 | struct pci_cap_saved_state *save_state; | ||
233 | u32 *cap; | ||
234 | |||
235 | if (!dev->msi_enabled) | ||
236 | return 0; | ||
237 | |||
238 | pos = pci_find_capability(dev, PCI_CAP_ID_MSI); | ||
239 | if (pos <= 0) | ||
240 | return 0; | ||
241 | |||
242 | save_state = kzalloc(sizeof(struct pci_cap_saved_state) + sizeof(u32) * 5, | ||
243 | GFP_KERNEL); | ||
244 | if (!save_state) { | ||
245 | printk(KERN_ERR "Out of memory in pci_save_msi_state\n"); | ||
246 | return -ENOMEM; | ||
247 | } | ||
248 | cap = &save_state->data[0]; | ||
249 | |||
250 | pci_read_config_dword(dev, pos, &cap[i++]); | ||
251 | control = cap[0] >> 16; | ||
252 | pci_read_config_dword(dev, pos + PCI_MSI_ADDRESS_LO, &cap[i++]); | ||
253 | if (control & PCI_MSI_FLAGS_64BIT) { | ||
254 | pci_read_config_dword(dev, pos + PCI_MSI_ADDRESS_HI, &cap[i++]); | ||
255 | pci_read_config_dword(dev, pos + PCI_MSI_DATA_64, &cap[i++]); | ||
256 | } else | ||
257 | pci_read_config_dword(dev, pos + PCI_MSI_DATA_32, &cap[i++]); | ||
258 | if (control & PCI_MSI_FLAGS_MASKBIT) | ||
259 | pci_read_config_dword(dev, pos + PCI_MSI_MASK_BIT, &cap[i++]); | ||
260 | save_state->cap_nr = PCI_CAP_ID_MSI; | ||
261 | pci_add_saved_cap(dev, save_state); | ||
262 | return 0; | ||
263 | } | ||
264 | |||
265 | static void __pci_restore_msi_state(struct pci_dev *dev) | 230 | static void __pci_restore_msi_state(struct pci_dev *dev) |
266 | { | 231 | { |
267 | int i = 0, pos; | 232 | int pos; |
268 | u16 control; | 233 | u16 control; |
269 | struct pci_cap_saved_state *save_state; | 234 | struct msi_desc *entry; |
270 | u32 *cap; | ||
271 | 235 | ||
272 | if (!dev->msi_enabled) | 236 | if (!dev->msi_enabled) |
273 | return; | 237 | return; |
274 | 238 | ||
275 | save_state = pci_find_saved_cap(dev, PCI_CAP_ID_MSI); | 239 | entry = get_irq_msi(dev->irq); |
276 | pos = pci_find_capability(dev, PCI_CAP_ID_MSI); | 240 | pos = entry->msi_attrib.pos; |
277 | if (!save_state || pos <= 0) | ||
278 | return; | ||
279 | cap = &save_state->data[0]; | ||
280 | 241 | ||
281 | pci_intx(dev, 0); /* disable intx */ | 242 | pci_intx(dev, 0); /* disable intx */ |
282 | control = cap[i++] >> 16; | ||
283 | msi_set_enable(dev, 0); | 243 | msi_set_enable(dev, 0); |
284 | pci_write_config_dword(dev, pos + PCI_MSI_ADDRESS_LO, cap[i++]); | 244 | write_msi_msg(dev->irq, &entry->msg); |
285 | if (control & PCI_MSI_FLAGS_64BIT) { | 245 | if (entry->msi_attrib.maskbit) |
286 | pci_write_config_dword(dev, pos + PCI_MSI_ADDRESS_HI, cap[i++]); | 246 | msi_set_mask_bit(dev->irq, entry->msi_attrib.masked); |
287 | pci_write_config_dword(dev, pos + PCI_MSI_DATA_64, cap[i++]); | 247 | |
288 | } else | 248 | pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &control); |
289 | pci_write_config_dword(dev, pos + PCI_MSI_DATA_32, cap[i++]); | 249 | control &= ~(PCI_MSI_FLAGS_QSIZE | PCI_MSI_FLAGS_ENABLE); |
290 | if (control & PCI_MSI_FLAGS_MASKBIT) | 250 | if (entry->msi_attrib.maskbit || !entry->msi_attrib.masked) |
291 | pci_write_config_dword(dev, pos + PCI_MSI_MASK_BIT, cap[i++]); | 251 | control |= PCI_MSI_FLAGS_ENABLE; |
292 | pci_write_config_word(dev, pos + PCI_MSI_FLAGS, control); | 252 | pci_write_config_word(dev, pos + PCI_MSI_FLAGS, control); |
293 | pci_remove_saved_cap(save_state); | ||
294 | kfree(save_state); | ||
295 | } | ||
296 | |||
297 | static int __pci_save_msix_state(struct pci_dev *dev) | ||
298 | { | ||
299 | int pos; | ||
300 | int irq, head, tail = 0; | ||
301 | u16 control; | ||
302 | struct pci_cap_saved_state *save_state; | ||
303 | |||
304 | if (!dev->msix_enabled) | ||
305 | return 0; | ||
306 | |||
307 | pos = pci_find_capability(dev, PCI_CAP_ID_MSIX); | ||
308 | if (pos <= 0) | ||
309 | return 0; | ||
310 | |||
311 | /* save the capability */ | ||
312 | pci_read_config_word(dev, msi_control_reg(pos), &control); | ||
313 | save_state = kzalloc(sizeof(struct pci_cap_saved_state) + sizeof(u16), | ||
314 | GFP_KERNEL); | ||
315 | if (!save_state) { | ||
316 | printk(KERN_ERR "Out of memory in pci_save_msix_state\n"); | ||
317 | return -ENOMEM; | ||
318 | } | ||
319 | *((u16 *)&save_state->data[0]) = control; | ||
320 | |||
321 | /* save the table */ | ||
322 | irq = head = dev->first_msi_irq; | ||
323 | while (head != tail) { | ||
324 | struct msi_desc *entry; | ||
325 | |||
326 | entry = get_irq_msi(irq); | ||
327 | read_msi_msg(irq, &entry->msg_save); | ||
328 | |||
329 | tail = entry->link.tail; | ||
330 | irq = tail; | ||
331 | } | ||
332 | |||
333 | save_state->cap_nr = PCI_CAP_ID_MSIX; | ||
334 | pci_add_saved_cap(dev, save_state); | ||
335 | return 0; | ||
336 | } | ||
337 | |||
338 | int pci_save_msi_state(struct pci_dev *dev) | ||
339 | { | ||
340 | int rc; | ||
341 | |||
342 | rc = __pci_save_msi_state(dev); | ||
343 | if (rc) | ||
344 | return rc; | ||
345 | |||
346 | rc = __pci_save_msix_state(dev); | ||
347 | |||
348 | return rc; | ||
349 | } | 253 | } |
350 | 254 | ||
351 | static void __pci_restore_msix_state(struct pci_dev *dev) | 255 | static void __pci_restore_msix_state(struct pci_dev *dev) |
352 | { | 256 | { |
353 | u16 save; | ||
354 | int pos; | 257 | int pos; |
355 | int irq, head, tail = 0; | 258 | int irq, head, tail = 0; |
356 | struct msi_desc *entry; | 259 | struct msi_desc *entry; |
357 | struct pci_cap_saved_state *save_state; | 260 | u16 control; |
358 | 261 | ||
359 | if (!dev->msix_enabled) | 262 | if (!dev->msix_enabled) |
360 | return; | 263 | return; |
361 | 264 | ||
362 | save_state = pci_find_saved_cap(dev, PCI_CAP_ID_MSIX); | ||
363 | if (!save_state) | ||
364 | return; | ||
365 | save = *((u16 *)&save_state->data[0]); | ||
366 | pci_remove_saved_cap(save_state); | ||
367 | kfree(save_state); | ||
368 | |||
369 | pos = pci_find_capability(dev, PCI_CAP_ID_MSIX); | ||
370 | if (pos <= 0) | ||
371 | return; | ||
372 | |||
373 | /* route the table */ | 265 | /* route the table */ |
374 | pci_intx(dev, 0); /* disable intx */ | 266 | pci_intx(dev, 0); /* disable intx */ |
375 | msix_set_enable(dev, 0); | 267 | msix_set_enable(dev, 0); |
376 | irq = head = dev->first_msi_irq; | 268 | irq = head = dev->first_msi_irq; |
269 | entry = get_irq_msi(irq); | ||
270 | pos = entry->msi_attrib.pos; | ||
377 | while (head != tail) { | 271 | while (head != tail) { |
378 | entry = get_irq_msi(irq); | 272 | entry = get_irq_msi(irq); |
379 | write_msi_msg(irq, &entry->msg_save); | 273 | write_msi_msg(irq, &entry->msg); |
274 | msi_set_mask_bit(irq, entry->msi_attrib.masked); | ||
380 | 275 | ||
381 | tail = entry->link.tail; | 276 | tail = entry->link.tail; |
382 | irq = tail; | 277 | irq = tail; |
383 | } | 278 | } |
384 | 279 | ||
385 | pci_write_config_word(dev, msi_control_reg(pos), save); | 280 | pci_read_config_word(dev, pos + PCI_MSIX_FLAGS, &control); |
281 | control &= ~PCI_MSIX_FLAGS_MASKALL; | ||
282 | control |= PCI_MSIX_FLAGS_ENABLE; | ||
283 | pci_write_config_word(dev, pos + PCI_MSIX_FLAGS, control); | ||
386 | } | 284 | } |
387 | 285 | ||
388 | void pci_restore_msi_state(struct pci_dev *dev) | 286 | void pci_restore_msi_state(struct pci_dev *dev) |
@@ -420,6 +318,7 @@ static int msi_capability_init(struct pci_dev *dev) | |||
420 | entry->msi_attrib.is_64 = is_64bit_address(control); | 318 | entry->msi_attrib.is_64 = is_64bit_address(control); |
421 | entry->msi_attrib.entry_nr = 0; | 319 | entry->msi_attrib.entry_nr = 0; |
422 | entry->msi_attrib.maskbit = is_mask_bit_support(control); | 320 | entry->msi_attrib.maskbit = is_mask_bit_support(control); |
321 | entry->msi_attrib.masked = 1; | ||
423 | entry->msi_attrib.default_irq = dev->irq; /* Save IOAPIC IRQ */ | 322 | entry->msi_attrib.default_irq = dev->irq; /* Save IOAPIC IRQ */ |
424 | entry->msi_attrib.pos = pos; | 323 | entry->msi_attrib.pos = pos; |
425 | if (is_mask_bit_support(control)) { | 324 | if (is_mask_bit_support(control)) { |
@@ -507,6 +406,7 @@ static int msix_capability_init(struct pci_dev *dev, | |||
507 | entry->msi_attrib.is_64 = 1; | 406 | entry->msi_attrib.is_64 = 1; |
508 | entry->msi_attrib.entry_nr = j; | 407 | entry->msi_attrib.entry_nr = j; |
509 | entry->msi_attrib.maskbit = 1; | 408 | entry->msi_attrib.maskbit = 1; |
409 | entry->msi_attrib.masked = 1; | ||
510 | entry->msi_attrib.default_irq = dev->irq; | 410 | entry->msi_attrib.default_irq = dev->irq; |
511 | entry->msi_attrib.pos = pos; | 411 | entry->msi_attrib.pos = pos; |
512 | entry->dev = dev; | 412 | entry->dev = dev; |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index a32db0628157..d3eab057b2d3 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -551,7 +551,9 @@ static int pci_save_pcie_state(struct pci_dev *dev) | |||
551 | if (pos <= 0) | 551 | if (pos <= 0) |
552 | return 0; | 552 | return 0; |
553 | 553 | ||
554 | save_state = kzalloc(sizeof(*save_state) + sizeof(u16) * 4, GFP_KERNEL); | 554 | save_state = pci_find_saved_cap(dev, PCI_CAP_ID_EXP); |
555 | if (!save_state) | ||
556 | save_state = kzalloc(sizeof(*save_state) + sizeof(u16) * 4, GFP_KERNEL); | ||
555 | if (!save_state) { | 557 | if (!save_state) { |
556 | dev_err(&dev->dev, "Out of memory in pci_save_pcie_state\n"); | 558 | dev_err(&dev->dev, "Out of memory in pci_save_pcie_state\n"); |
557 | return -ENOMEM; | 559 | return -ENOMEM; |
@@ -582,8 +584,6 @@ static void pci_restore_pcie_state(struct pci_dev *dev) | |||
582 | pci_write_config_word(dev, pos + PCI_EXP_LNKCTL, cap[i++]); | 584 | pci_write_config_word(dev, pos + PCI_EXP_LNKCTL, cap[i++]); |
583 | pci_write_config_word(dev, pos + PCI_EXP_SLTCTL, cap[i++]); | 585 | pci_write_config_word(dev, pos + PCI_EXP_SLTCTL, cap[i++]); |
584 | pci_write_config_word(dev, pos + PCI_EXP_RTCTL, cap[i++]); | 586 | pci_write_config_word(dev, pos + PCI_EXP_RTCTL, cap[i++]); |
585 | pci_remove_saved_cap(save_state); | ||
586 | kfree(save_state); | ||
587 | } | 587 | } |
588 | 588 | ||
589 | 589 | ||
@@ -597,7 +597,9 @@ static int pci_save_pcix_state(struct pci_dev *dev) | |||
597 | if (pos <= 0) | 597 | if (pos <= 0) |
598 | return 0; | 598 | return 0; |
599 | 599 | ||
600 | save_state = kzalloc(sizeof(*save_state) + sizeof(u16), GFP_KERNEL); | 600 | save_state = pci_find_saved_cap(dev, PCI_CAP_ID_EXP); |
601 | if (!save_state) | ||
602 | save_state = kzalloc(sizeof(*save_state) + sizeof(u16), GFP_KERNEL); | ||
601 | if (!save_state) { | 603 | if (!save_state) { |
602 | dev_err(&dev->dev, "Out of memory in pci_save_pcie_state\n"); | 604 | dev_err(&dev->dev, "Out of memory in pci_save_pcie_state\n"); |
603 | return -ENOMEM; | 605 | return -ENOMEM; |
@@ -622,8 +624,6 @@ static void pci_restore_pcix_state(struct pci_dev *dev) | |||
622 | cap = (u16 *)&save_state->data[0]; | 624 | cap = (u16 *)&save_state->data[0]; |
623 | 625 | ||
624 | pci_write_config_word(dev, pos + PCI_X_CMD, cap[i++]); | 626 | pci_write_config_word(dev, pos + PCI_X_CMD, cap[i++]); |
625 | pci_remove_saved_cap(save_state); | ||
626 | kfree(save_state); | ||
627 | } | 627 | } |
628 | 628 | ||
629 | 629 | ||
@@ -638,8 +638,6 @@ pci_save_state(struct pci_dev *dev) | |||
638 | /* XXX: 100% dword access ok here? */ | 638 | /* XXX: 100% dword access ok here? */ |
639 | for (i = 0; i < 16; i++) | 639 | for (i = 0; i < 16; i++) |
640 | pci_read_config_dword(dev, i * 4,&dev->saved_config_space[i]); | 640 | pci_read_config_dword(dev, i * 4,&dev->saved_config_space[i]); |
641 | if ((i = pci_save_msi_state(dev)) != 0) | ||
642 | return i; | ||
643 | if ((i = pci_save_pcie_state(dev)) != 0) | 641 | if ((i = pci_save_pcie_state(dev)) != 0) |
644 | return i; | 642 | return i; |
645 | if ((i = pci_save_pcix_state(dev)) != 0) | 643 | if ((i = pci_save_pcix_state(dev)) != 0) |
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index ae7a975995a5..62ea04c8af64 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h | |||
@@ -52,10 +52,8 @@ static inline void pci_no_msi(void) { } | |||
52 | #endif | 52 | #endif |
53 | 53 | ||
54 | #if defined(CONFIG_PCI_MSI) && defined(CONFIG_PM) | 54 | #if defined(CONFIG_PCI_MSI) && defined(CONFIG_PM) |
55 | int pci_save_msi_state(struct pci_dev *dev); | ||
56 | void pci_restore_msi_state(struct pci_dev *dev); | 55 | void pci_restore_msi_state(struct pci_dev *dev); |
57 | #else | 56 | #else |
58 | static inline int pci_save_msi_state(struct pci_dev *dev) { return 0; } | ||
59 | static inline void pci_restore_msi_state(struct pci_dev *dev) {} | 57 | static inline void pci_restore_msi_state(struct pci_dev *dev) {} |
60 | #endif | 58 | #endif |
61 | 59 | ||
diff --git a/drivers/ps3/ps3av.c b/drivers/ps3/ps3av.c index 1926b4d3e1f4..d21e04ccb021 100644 --- a/drivers/ps3/ps3av.c +++ b/drivers/ps3/ps3av.c | |||
@@ -24,6 +24,8 @@ | |||
24 | #include <linux/reboot.h> | 24 | #include <linux/reboot.h> |
25 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
26 | #include <linux/ioctl.h> | 26 | #include <linux/ioctl.h> |
27 | |||
28 | #include <asm/firmware.h> | ||
27 | #include <asm/lv1call.h> | 29 | #include <asm/lv1call.h> |
28 | #include <asm/ps3av.h> | 30 | #include <asm/ps3av.h> |
29 | #include <asm/ps3.h> | 31 | #include <asm/ps3.h> |
@@ -947,7 +949,12 @@ static struct ps3_vuart_port_driver ps3av_driver = { | |||
947 | 949 | ||
948 | static int ps3av_module_init(void) | 950 | static int ps3av_module_init(void) |
949 | { | 951 | { |
950 | int error = ps3_vuart_port_driver_register(&ps3av_driver); | 952 | int error; |
953 | |||
954 | if (!firmware_has_feature(FW_FEATURE_PS3_LV1)) | ||
955 | return -ENODEV; | ||
956 | |||
957 | error = ps3_vuart_port_driver_register(&ps3av_driver); | ||
951 | if (error) { | 958 | if (error) { |
952 | printk(KERN_ERR | 959 | printk(KERN_ERR |
953 | "%s: ps3_vuart_port_driver_register failed %d\n", | 960 | "%s: ps3_vuart_port_driver_register failed %d\n", |
diff --git a/drivers/ps3/ps3av_cmd.c b/drivers/ps3/ps3av_cmd.c index 21c97c80aa2e..bc70e81f8cb0 100644 --- a/drivers/ps3/ps3av_cmd.c +++ b/drivers/ps3/ps3av_cmd.c | |||
@@ -485,12 +485,12 @@ static u8 ps3av_cnv_mclk(u32 fs) | |||
485 | 485 | ||
486 | static const u32 ps3av_ns_table[][5] = { | 486 | static const u32 ps3av_ns_table[][5] = { |
487 | /* D1, D2, D3, D4, D5 */ | 487 | /* D1, D2, D3, D4, D5 */ |
488 | [PS3AV_CMD_AUDIO_FS_44K-BASE] { 6272, 6272, 17836, 17836, 8918 }, | 488 | [PS3AV_CMD_AUDIO_FS_44K-BASE] = { 6272, 6272, 17836, 17836, 8918 }, |
489 | [PS3AV_CMD_AUDIO_FS_48K-BASE] { 6144, 6144, 11648, 11648, 5824 }, | 489 | [PS3AV_CMD_AUDIO_FS_48K-BASE] = { 6144, 6144, 11648, 11648, 5824 }, |
490 | [PS3AV_CMD_AUDIO_FS_88K-BASE] { 12544, 12544, 35672, 35672, 17836 }, | 490 | [PS3AV_CMD_AUDIO_FS_88K-BASE] = { 12544, 12544, 35672, 35672, 17836 }, |
491 | [PS3AV_CMD_AUDIO_FS_96K-BASE] { 12288, 12288, 23296, 23296, 11648 }, | 491 | [PS3AV_CMD_AUDIO_FS_96K-BASE] = { 12288, 12288, 23296, 23296, 11648 }, |
492 | [PS3AV_CMD_AUDIO_FS_176K-BASE] { 25088, 25088, 71344, 71344, 35672 }, | 492 | [PS3AV_CMD_AUDIO_FS_176K-BASE] = { 25088, 25088, 71344, 71344, 35672 }, |
493 | [PS3AV_CMD_AUDIO_FS_192K-BASE] { 24576, 24576, 46592, 46592, 23296 } | 493 | [PS3AV_CMD_AUDIO_FS_192K-BASE] = { 24576, 24576, 46592, 46592, 23296 } |
494 | }; | 494 | }; |
495 | 495 | ||
496 | static void ps3av_cnv_ns(u8 *ns, u32 fs, u32 video_vid) | 496 | static void ps3av_cnv_ns(u8 *ns, u32 fs, u32 video_vid) |
@@ -543,9 +543,10 @@ static void ps3av_cnv_ns(u8 *ns, u32 fs, u32 video_vid) | |||
543 | 543 | ||
544 | #undef BASE | 544 | #undef BASE |
545 | 545 | ||
546 | static u8 ps3av_cnv_enable(u32 source, u8 *enable) | 546 | static u8 ps3av_cnv_enable(u32 source, const u8 *enable) |
547 | { | 547 | { |
548 | u8 *p, ret = 0; | 548 | const u8 *p; |
549 | u8 ret = 0; | ||
549 | 550 | ||
550 | if (source == PS3AV_CMD_AUDIO_SOURCE_SPDIF) { | 551 | if (source == PS3AV_CMD_AUDIO_SOURCE_SPDIF) { |
551 | ret = 0x03; | 552 | ret = 0x03; |
@@ -559,9 +560,10 @@ static u8 ps3av_cnv_enable(u32 source, u8 *enable) | |||
559 | return ret; | 560 | return ret; |
560 | } | 561 | } |
561 | 562 | ||
562 | static u8 ps3av_cnv_fifomap(u8 *map) | 563 | static u8 ps3av_cnv_fifomap(const u8 *map) |
563 | { | 564 | { |
564 | u8 *p, ret = 0; | 565 | const u8 *p; |
566 | u8 ret = 0; | ||
565 | 567 | ||
566 | p = map; | 568 | p = map; |
567 | ret = p[0] + (p[1] << 2) + (p[2] << 4) + (p[3] << 6); | 569 | ret = p[0] + (p[1] << 2) + (p[2] << 4) + (p[3] << 6); |
@@ -615,7 +617,7 @@ static void ps3av_cnv_info(struct ps3av_audio_info_frame *info, | |||
615 | info->pb5.lsv = mode->audio_downmix_level; | 617 | info->pb5.lsv = mode->audio_downmix_level; |
616 | } | 618 | } |
617 | 619 | ||
618 | static void ps3av_cnv_chstat(u8 *chstat, u8 *cs_info) | 620 | static void ps3av_cnv_chstat(u8 *chstat, const u8 *cs_info) |
619 | { | 621 | { |
620 | memcpy(chstat, cs_info, 5); | 622 | memcpy(chstat, cs_info, 5); |
621 | } | 623 | } |
diff --git a/drivers/ps3/sys-manager.c b/drivers/ps3/sys-manager.c index 0fc30be8b81e..3aa2b0dcc369 100644 --- a/drivers/ps3/sys-manager.c +++ b/drivers/ps3/sys-manager.c | |||
@@ -22,7 +22,10 @@ | |||
22 | #include <linux/module.h> | 22 | #include <linux/module.h> |
23 | #include <linux/workqueue.h> | 23 | #include <linux/workqueue.h> |
24 | #include <linux/reboot.h> | 24 | #include <linux/reboot.h> |
25 | |||
26 | #include <asm/firmware.h> | ||
25 | #include <asm/ps3.h> | 27 | #include <asm/ps3.h> |
28 | |||
26 | #include "vuart.h" | 29 | #include "vuart.h" |
27 | 30 | ||
28 | MODULE_AUTHOR("Sony Corporation"); | 31 | MODULE_AUTHOR("Sony Corporation"); |
@@ -598,6 +601,9 @@ static struct ps3_vuart_port_driver ps3_sys_manager = { | |||
598 | 601 | ||
599 | static int __init ps3_sys_manager_init(void) | 602 | static int __init ps3_sys_manager_init(void) |
600 | { | 603 | { |
604 | if (!firmware_has_feature(FW_FEATURE_PS3_LV1)) | ||
605 | return -ENODEV; | ||
606 | |||
601 | return ps3_vuart_port_driver_register(&ps3_sys_manager); | 607 | return ps3_vuart_port_driver_register(&ps3_sys_manager); |
602 | } | 608 | } |
603 | 609 | ||
diff --git a/drivers/ps3/vuart.c b/drivers/ps3/vuart.c index 746298107d6f..6c12744eeb9d 100644 --- a/drivers/ps3/vuart.c +++ b/drivers/ps3/vuart.c | |||
@@ -952,7 +952,7 @@ fail_alloc_irq: | |||
952 | kfree(dev->priv); | 952 | kfree(dev->priv); |
953 | dev->priv = NULL; | 953 | dev->priv = NULL; |
954 | fail_alloc: | 954 | fail_alloc: |
955 | vuart_bus_priv.devices[port_number] = 0; | 955 | vuart_bus_priv.devices[port_number] = NULL; |
956 | fail_match: | 956 | fail_match: |
957 | up(&vuart_bus_priv.probe_mutex); | 957 | up(&vuart_bus_priv.probe_mutex); |
958 | dev_dbg(&dev->core, "%s:%d failed\n", __func__, __LINE__); | 958 | dev_dbg(&dev->core, "%s:%d failed\n", __func__, __LINE__); |
@@ -978,7 +978,7 @@ static int ps3_vuart_remove(struct device *_dev) | |||
978 | dev_dbg(&dev->core, "%s:%d: %s no remove method\n", __func__, | 978 | dev_dbg(&dev->core, "%s:%d: %s no remove method\n", __func__, |
979 | __LINE__, dev->core.bus_id); | 979 | __LINE__, dev->core.bus_id); |
980 | 980 | ||
981 | vuart_bus_priv.devices[dev->priv->port_number] = 0; | 981 | vuart_bus_priv.devices[dev->priv->port_number] = NULL; |
982 | 982 | ||
983 | if (--vuart_bus_priv.use_count == 0) { | 983 | if (--vuart_bus_priv.use_count == 0) { |
984 | BUG(); | 984 | BUG(); |
@@ -1031,7 +1031,7 @@ int __init ps3_vuart_bus_init(void) | |||
1031 | pr_debug("%s:%d:\n", __func__, __LINE__); | 1031 | pr_debug("%s:%d:\n", __func__, __LINE__); |
1032 | 1032 | ||
1033 | if (!firmware_has_feature(FW_FEATURE_PS3_LV1)) | 1033 | if (!firmware_has_feature(FW_FEATURE_PS3_LV1)) |
1034 | return 0; | 1034 | return -ENODEV; |
1035 | 1035 | ||
1036 | init_MUTEX(&vuart_bus_priv.probe_mutex); | 1036 | init_MUTEX(&vuart_bus_priv.probe_mutex); |
1037 | result = bus_register(&ps3_vuart_bus); | 1037 | result = bus_register(&ps3_vuart_bus); |
diff --git a/drivers/s390/net/qeth.h b/drivers/s390/net/qeth.h index e95c281f1e36..84b108d7c7fd 100644 --- a/drivers/s390/net/qeth.h +++ b/drivers/s390/net/qeth.h | |||
@@ -873,7 +873,7 @@ qeth_realloc_headroom(struct qeth_card *card, struct sk_buff *skb, int size) | |||
873 | } | 873 | } |
874 | 874 | ||
875 | static inline struct sk_buff * | 875 | static inline struct sk_buff * |
876 | qeth_pskb_unshare(struct sk_buff *skb, int pri) | 876 | qeth_pskb_unshare(struct sk_buff *skb, gfp_t pri) |
877 | { | 877 | { |
878 | struct sk_buff *nskb; | 878 | struct sk_buff *nskb; |
879 | if (!skb_cloned(skb)) | 879 | if (!skb_cloned(skb)) |
diff --git a/drivers/video/backlight/locomolcd.c b/drivers/video/backlight/locomolcd.c index d1312477813e..6b488b8a7eee 100644 --- a/drivers/video/backlight/locomolcd.c +++ b/drivers/video/backlight/locomolcd.c | |||
@@ -199,8 +199,8 @@ static int locomolcd_remove(struct locomo_dev *dev) | |||
199 | { | 199 | { |
200 | unsigned long flags; | 200 | unsigned long flags; |
201 | 201 | ||
202 | locomobl_data.brightness = 0; | 202 | locomolcd_bl_device->props.brightness = 0; |
203 | locomobl_data.power = 0; | 203 | locomolcd_bl_device->props.power = 0; |
204 | locomolcd_set_intensity(locomolcd_bl_device); | 204 | locomolcd_set_intensity(locomolcd_bl_device); |
205 | 205 | ||
206 | backlight_device_unregister(locomolcd_bl_device); | 206 | backlight_device_unregister(locomolcd_bl_device); |
diff --git a/drivers/video/backlight/progear_bl.c b/drivers/video/backlight/progear_bl.c index 702269357861..836ab4df0ef2 100644 --- a/drivers/video/backlight/progear_bl.c +++ b/drivers/video/backlight/progear_bl.c | |||
@@ -65,13 +65,13 @@ static int progearbl_probe(struct platform_device *pdev) | |||
65 | u8 temp; | 65 | u8 temp; |
66 | struct backlight_device *progear_backlight_device; | 66 | struct backlight_device *progear_backlight_device; |
67 | 67 | ||
68 | pmu_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, 0); | 68 | pmu_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, NULL); |
69 | if (!pmu_dev) { | 69 | if (!pmu_dev) { |
70 | printk("ALI M7101 PMU not found.\n"); | 70 | printk("ALI M7101 PMU not found.\n"); |
71 | return -ENODEV; | 71 | return -ENODEV; |
72 | } | 72 | } |
73 | 73 | ||
74 | sb_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, 0); | 74 | sb_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, NULL); |
75 | if (!sb_dev) { | 75 | if (!sb_dev) { |
76 | printk("ALI 1533 SB not found.\n"); | 76 | printk("ALI 1533 SB not found.\n"); |
77 | pci_dev_put(pmu_dev); | 77 | pci_dev_put(pmu_dev); |
diff --git a/drivers/video/bw2.c b/drivers/video/bw2.c index 9bb6257d6918..b0b2e40bbd9f 100644 --- a/drivers/video/bw2.c +++ b/drivers/video/bw2.c | |||
@@ -186,8 +186,7 @@ static int bw2_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) | |||
186 | * Initialisation | 186 | * Initialisation |
187 | */ | 187 | */ |
188 | 188 | ||
189 | static void | 189 | static void __devinit bw2_init_fix(struct fb_info *info, int linebytes) |
190 | bw2_init_fix(struct fb_info *info, int linebytes) | ||
191 | { | 190 | { |
192 | strlcpy(info->fix.id, "bwtwo", sizeof(info->fix.id)); | 191 | strlcpy(info->fix.id, "bwtwo", sizeof(info->fix.id)); |
193 | 192 | ||
@@ -199,43 +198,44 @@ bw2_init_fix(struct fb_info *info, int linebytes) | |||
199 | info->fix.accel = FB_ACCEL_SUN_BWTWO; | 198 | info->fix.accel = FB_ACCEL_SUN_BWTWO; |
200 | } | 199 | } |
201 | 200 | ||
202 | static u8 bw2regs_1600[] __initdata = { | 201 | static u8 bw2regs_1600[] __devinitdata = { |
203 | 0x14, 0x8b, 0x15, 0x28, 0x16, 0x03, 0x17, 0x13, | 202 | 0x14, 0x8b, 0x15, 0x28, 0x16, 0x03, 0x17, 0x13, |
204 | 0x18, 0x7b, 0x19, 0x05, 0x1a, 0x34, 0x1b, 0x2e, | 203 | 0x18, 0x7b, 0x19, 0x05, 0x1a, 0x34, 0x1b, 0x2e, |
205 | 0x1c, 0x00, 0x1d, 0x0a, 0x1e, 0xff, 0x1f, 0x01, | 204 | 0x1c, 0x00, 0x1d, 0x0a, 0x1e, 0xff, 0x1f, 0x01, |
206 | 0x10, 0x21, 0 | 205 | 0x10, 0x21, 0 |
207 | }; | 206 | }; |
208 | 207 | ||
209 | static u8 bw2regs_ecl[] __initdata = { | 208 | static u8 bw2regs_ecl[] __devinitdata = { |
210 | 0x14, 0x65, 0x15, 0x1e, 0x16, 0x04, 0x17, 0x0c, | 209 | 0x14, 0x65, 0x15, 0x1e, 0x16, 0x04, 0x17, 0x0c, |
211 | 0x18, 0x5e, 0x19, 0x03, 0x1a, 0xa7, 0x1b, 0x23, | 210 | 0x18, 0x5e, 0x19, 0x03, 0x1a, 0xa7, 0x1b, 0x23, |
212 | 0x1c, 0x00, 0x1d, 0x08, 0x1e, 0xff, 0x1f, 0x01, | 211 | 0x1c, 0x00, 0x1d, 0x08, 0x1e, 0xff, 0x1f, 0x01, |
213 | 0x10, 0x20, 0 | 212 | 0x10, 0x20, 0 |
214 | }; | 213 | }; |
215 | 214 | ||
216 | static u8 bw2regs_analog[] __initdata = { | 215 | static u8 bw2regs_analog[] __devinitdata = { |
217 | 0x14, 0xbb, 0x15, 0x2b, 0x16, 0x03, 0x17, 0x13, | 216 | 0x14, 0xbb, 0x15, 0x2b, 0x16, 0x03, 0x17, 0x13, |
218 | 0x18, 0xb0, 0x19, 0x03, 0x1a, 0xa6, 0x1b, 0x22, | 217 | 0x18, 0xb0, 0x19, 0x03, 0x1a, 0xa6, 0x1b, 0x22, |
219 | 0x1c, 0x01, 0x1d, 0x05, 0x1e, 0xff, 0x1f, 0x01, | 218 | 0x1c, 0x01, 0x1d, 0x05, 0x1e, 0xff, 0x1f, 0x01, |
220 | 0x10, 0x20, 0 | 219 | 0x10, 0x20, 0 |
221 | }; | 220 | }; |
222 | 221 | ||
223 | static u8 bw2regs_76hz[] __initdata = { | 222 | static u8 bw2regs_76hz[] __devinitdata = { |
224 | 0x14, 0xb7, 0x15, 0x27, 0x16, 0x03, 0x17, 0x0f, | 223 | 0x14, 0xb7, 0x15, 0x27, 0x16, 0x03, 0x17, 0x0f, |
225 | 0x18, 0xae, 0x19, 0x03, 0x1a, 0xae, 0x1b, 0x2a, | 224 | 0x18, 0xae, 0x19, 0x03, 0x1a, 0xae, 0x1b, 0x2a, |
226 | 0x1c, 0x01, 0x1d, 0x09, 0x1e, 0xff, 0x1f, 0x01, | 225 | 0x1c, 0x01, 0x1d, 0x09, 0x1e, 0xff, 0x1f, 0x01, |
227 | 0x10, 0x24, 0 | 226 | 0x10, 0x24, 0 |
228 | }; | 227 | }; |
229 | 228 | ||
230 | static u8 bw2regs_66hz[] __initdata = { | 229 | static u8 bw2regs_66hz[] __devinitdata = { |
231 | 0x14, 0xbb, 0x15, 0x2b, 0x16, 0x04, 0x17, 0x14, | 230 | 0x14, 0xbb, 0x15, 0x2b, 0x16, 0x04, 0x17, 0x14, |
232 | 0x18, 0xae, 0x19, 0x03, 0x1a, 0xa8, 0x1b, 0x24, | 231 | 0x18, 0xae, 0x19, 0x03, 0x1a, 0xa8, 0x1b, 0x24, |
233 | 0x1c, 0x01, 0x1d, 0x05, 0x1e, 0xff, 0x1f, 0x01, | 232 | 0x1c, 0x01, 0x1d, 0x05, 0x1e, 0xff, 0x1f, 0x01, |
234 | 0x10, 0x20, 0 | 233 | 0x10, 0x20, 0 |
235 | }; | 234 | }; |
236 | 235 | ||
237 | static void bw2_do_default_mode(struct bw2_par *par, struct fb_info *info, | 236 | static void __devinit bw2_do_default_mode(struct bw2_par *par, |
238 | int *linebytes) | 237 | struct fb_info *info, |
238 | int *linebytes) | ||
239 | { | 239 | { |
240 | u8 status, mon; | 240 | u8 status, mon; |
241 | u8 *p; | 241 | u8 *p; |
diff --git a/drivers/video/cg14.c b/drivers/video/cg14.c index ec6a51a5822d..b071bb632b97 100644 --- a/drivers/video/cg14.c +++ b/drivers/video/cg14.c | |||
@@ -354,7 +354,8 @@ static int cg14_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) | |||
354 | * Initialisation | 354 | * Initialisation |
355 | */ | 355 | */ |
356 | 356 | ||
357 | static void cg14_init_fix(struct fb_info *info, int linebytes, struct device_node *dp) | 357 | static void __devinit cg14_init_fix(struct fb_info *info, int linebytes, |
358 | struct device_node *dp) | ||
358 | { | 359 | { |
359 | const char *name = dp->name; | 360 | const char *name = dp->name; |
360 | 361 | ||
@@ -368,7 +369,7 @@ static void cg14_init_fix(struct fb_info *info, int linebytes, struct device_nod | |||
368 | info->fix.accel = FB_ACCEL_SUN_CG14; | 369 | info->fix.accel = FB_ACCEL_SUN_CG14; |
369 | } | 370 | } |
370 | 371 | ||
371 | static struct sbus_mmap_map __cg14_mmap_map[CG14_MMAP_ENTRIES] __initdata = { | 372 | static struct sbus_mmap_map __cg14_mmap_map[CG14_MMAP_ENTRIES] __devinitdata = { |
372 | { | 373 | { |
373 | .voff = CG14_REGS, | 374 | .voff = CG14_REGS, |
374 | .poff = 0x80000000, | 375 | .poff = 0x80000000, |
diff --git a/fs/cifs/cifspdu.h b/fs/cifs/cifspdu.h index 0efdf35aab2c..3af76249dc8b 100644 --- a/fs/cifs/cifspdu.h +++ b/fs/cifs/cifspdu.h | |||
@@ -220,7 +220,7 @@ | |||
220 | */ | 220 | */ |
221 | #define CIFS_NO_HANDLE 0xFFFF | 221 | #define CIFS_NO_HANDLE 0xFFFF |
222 | 222 | ||
223 | #define NO_CHANGE_64 0xFFFFFFFFFFFFFFFFULL | 223 | #define NO_CHANGE_64 cpu_to_le64(0xFFFFFFFFFFFFFFFFULL) |
224 | #define NO_CHANGE_32 0xFFFFFFFFUL | 224 | #define NO_CHANGE_32 0xFFFFFFFFUL |
225 | 225 | ||
226 | /* IPC$ in ASCII */ | 226 | /* IPC$ in ASCII */ |
diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c index 34750d5e4ff2..5e6e37e58f36 100644 --- a/fs/configfs/dir.c +++ b/fs/configfs/dir.c | |||
@@ -1141,25 +1141,22 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys) | |||
1141 | 1141 | ||
1142 | err = -ENOMEM; | 1142 | err = -ENOMEM; |
1143 | dentry = d_alloc(configfs_sb->s_root, &name); | 1143 | dentry = d_alloc(configfs_sb->s_root, &name); |
1144 | if (!dentry) | 1144 | if (dentry) { |
1145 | goto out_release; | 1145 | d_add(dentry, NULL); |
1146 | |||
1147 | d_add(dentry, NULL); | ||
1148 | 1146 | ||
1149 | err = configfs_attach_group(sd->s_element, &group->cg_item, | 1147 | err = configfs_attach_group(sd->s_element, &group->cg_item, |
1150 | dentry); | 1148 | dentry); |
1151 | if (!err) | 1149 | if (err) { |
1152 | dentry = NULL; | 1150 | d_delete(dentry); |
1153 | else | 1151 | dput(dentry); |
1154 | d_delete(dentry); | 1152 | } |
1153 | } | ||
1155 | 1154 | ||
1156 | mutex_unlock(&configfs_sb->s_root->d_inode->i_mutex); | 1155 | mutex_unlock(&configfs_sb->s_root->d_inode->i_mutex); |
1157 | 1156 | ||
1158 | if (dentry) { | 1157 | if (err) { |
1159 | dput(dentry); | 1158 | unlink_group(group); |
1160 | out_release: | 1159 | configfs_release_fs(); |
1161 | unlink_group(group); | ||
1162 | configfs_release_fs(); | ||
1163 | } | 1160 | } |
1164 | 1161 | ||
1165 | return err; | 1162 | return err; |
diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c index c2660cbfcd96..8d995bcef806 100644 --- a/fs/nfsd/nfsfh.c +++ b/fs/nfsd/nfsfh.c | |||
@@ -17,7 +17,6 @@ | |||
17 | #include <linux/stat.h> | 17 | #include <linux/stat.h> |
18 | #include <linux/dcache.h> | 18 | #include <linux/dcache.h> |
19 | #include <linux/mount.h> | 19 | #include <linux/mount.h> |
20 | #include <asm/pgtable.h> | ||
21 | 20 | ||
22 | #include <linux/sunrpc/clnt.h> | 21 | #include <linux/sunrpc/clnt.h> |
23 | #include <linux/sunrpc/svc.h> | 22 | #include <linux/sunrpc/svc.h> |
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 93628b02ef5d..875c11443817 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c | |||
@@ -614,6 +614,27 @@ static void ocfs2_dio_end_io(struct kiocb *iocb, | |||
614 | ocfs2_rw_unlock(inode, 0); | 614 | ocfs2_rw_unlock(inode, 0); |
615 | } | 615 | } |
616 | 616 | ||
617 | /* | ||
618 | * ocfs2_invalidatepage() and ocfs2_releasepage() are shamelessly stolen | ||
619 | * from ext3. PageChecked() bits have been removed as OCFS2 does not | ||
620 | * do journalled data. | ||
621 | */ | ||
622 | static void ocfs2_invalidatepage(struct page *page, unsigned long offset) | ||
623 | { | ||
624 | journal_t *journal = OCFS2_SB(page->mapping->host->i_sb)->journal->j_journal; | ||
625 | |||
626 | journal_invalidatepage(journal, page, offset); | ||
627 | } | ||
628 | |||
629 | static int ocfs2_releasepage(struct page *page, gfp_t wait) | ||
630 | { | ||
631 | journal_t *journal = OCFS2_SB(page->mapping->host->i_sb)->journal->j_journal; | ||
632 | |||
633 | if (!page_has_buffers(page)) | ||
634 | return 0; | ||
635 | return journal_try_to_free_buffers(journal, page, wait); | ||
636 | } | ||
637 | |||
617 | static ssize_t ocfs2_direct_IO(int rw, | 638 | static ssize_t ocfs2_direct_IO(int rw, |
618 | struct kiocb *iocb, | 639 | struct kiocb *iocb, |
619 | const struct iovec *iov, | 640 | const struct iovec *iov, |
@@ -661,5 +682,8 @@ const struct address_space_operations ocfs2_aops = { | |||
661 | .commit_write = ocfs2_commit_write, | 682 | .commit_write = ocfs2_commit_write, |
662 | .bmap = ocfs2_bmap, | 683 | .bmap = ocfs2_bmap, |
663 | .sync_page = block_sync_page, | 684 | .sync_page = block_sync_page, |
664 | .direct_IO = ocfs2_direct_IO | 685 | .direct_IO = ocfs2_direct_IO, |
686 | .invalidatepage = ocfs2_invalidatepage, | ||
687 | .releasepage = ocfs2_releasepage, | ||
688 | .migratepage = buffer_migrate_page, | ||
665 | }; | 689 | }; |
diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c index 5a9779bb9236..eba282da500e 100644 --- a/fs/ocfs2/cluster/heartbeat.c +++ b/fs/ocfs2/cluster/heartbeat.c | |||
@@ -1234,6 +1234,7 @@ static ssize_t o2hb_region_dev_write(struct o2hb_region *reg, | |||
1234 | const char *page, | 1234 | const char *page, |
1235 | size_t count) | 1235 | size_t count) |
1236 | { | 1236 | { |
1237 | struct task_struct *hb_task; | ||
1237 | long fd; | 1238 | long fd; |
1238 | int sectsize; | 1239 | int sectsize; |
1239 | char *p = (char *)page; | 1240 | char *p = (char *)page; |
@@ -1319,20 +1320,28 @@ static ssize_t o2hb_region_dev_write(struct o2hb_region *reg, | |||
1319 | */ | 1320 | */ |
1320 | atomic_set(®->hr_steady_iterations, O2HB_LIVE_THRESHOLD + 1); | 1321 | atomic_set(®->hr_steady_iterations, O2HB_LIVE_THRESHOLD + 1); |
1321 | 1322 | ||
1322 | reg->hr_task = kthread_run(o2hb_thread, reg, "o2hb-%s", | 1323 | hb_task = kthread_run(o2hb_thread, reg, "o2hb-%s", |
1323 | reg->hr_item.ci_name); | 1324 | reg->hr_item.ci_name); |
1324 | if (IS_ERR(reg->hr_task)) { | 1325 | if (IS_ERR(hb_task)) { |
1325 | ret = PTR_ERR(reg->hr_task); | 1326 | ret = PTR_ERR(hb_task); |
1326 | mlog_errno(ret); | 1327 | mlog_errno(ret); |
1327 | reg->hr_task = NULL; | ||
1328 | goto out; | 1328 | goto out; |
1329 | } | 1329 | } |
1330 | 1330 | ||
1331 | spin_lock(&o2hb_live_lock); | ||
1332 | reg->hr_task = hb_task; | ||
1333 | spin_unlock(&o2hb_live_lock); | ||
1334 | |||
1331 | ret = wait_event_interruptible(o2hb_steady_queue, | 1335 | ret = wait_event_interruptible(o2hb_steady_queue, |
1332 | atomic_read(®->hr_steady_iterations) == 0); | 1336 | atomic_read(®->hr_steady_iterations) == 0); |
1333 | if (ret) { | 1337 | if (ret) { |
1334 | kthread_stop(reg->hr_task); | 1338 | spin_lock(&o2hb_live_lock); |
1339 | hb_task = reg->hr_task; | ||
1335 | reg->hr_task = NULL; | 1340 | reg->hr_task = NULL; |
1341 | spin_unlock(&o2hb_live_lock); | ||
1342 | |||
1343 | if (hb_task) | ||
1344 | kthread_stop(hb_task); | ||
1336 | goto out; | 1345 | goto out; |
1337 | } | 1346 | } |
1338 | 1347 | ||
@@ -1354,10 +1363,17 @@ out: | |||
1354 | static ssize_t o2hb_region_pid_read(struct o2hb_region *reg, | 1363 | static ssize_t o2hb_region_pid_read(struct o2hb_region *reg, |
1355 | char *page) | 1364 | char *page) |
1356 | { | 1365 | { |
1357 | if (!reg->hr_task) | 1366 | pid_t pid = 0; |
1367 | |||
1368 | spin_lock(&o2hb_live_lock); | ||
1369 | if (reg->hr_task) | ||
1370 | pid = reg->hr_task->pid; | ||
1371 | spin_unlock(&o2hb_live_lock); | ||
1372 | |||
1373 | if (!pid) | ||
1358 | return 0; | 1374 | return 0; |
1359 | 1375 | ||
1360 | return sprintf(page, "%u\n", reg->hr_task->pid); | 1376 | return sprintf(page, "%u\n", pid); |
1361 | } | 1377 | } |
1362 | 1378 | ||
1363 | struct o2hb_region_attribute { | 1379 | struct o2hb_region_attribute { |
@@ -1495,13 +1511,17 @@ out: | |||
1495 | static void o2hb_heartbeat_group_drop_item(struct config_group *group, | 1511 | static void o2hb_heartbeat_group_drop_item(struct config_group *group, |
1496 | struct config_item *item) | 1512 | struct config_item *item) |
1497 | { | 1513 | { |
1514 | struct task_struct *hb_task; | ||
1498 | struct o2hb_region *reg = to_o2hb_region(item); | 1515 | struct o2hb_region *reg = to_o2hb_region(item); |
1499 | 1516 | ||
1500 | /* stop the thread when the user removes the region dir */ | 1517 | /* stop the thread when the user removes the region dir */ |
1501 | if (reg->hr_task) { | 1518 | spin_lock(&o2hb_live_lock); |
1502 | kthread_stop(reg->hr_task); | 1519 | hb_task = reg->hr_task; |
1503 | reg->hr_task = NULL; | 1520 | reg->hr_task = NULL; |
1504 | } | 1521 | spin_unlock(&o2hb_live_lock); |
1522 | |||
1523 | if (hb_task) | ||
1524 | kthread_stop(hb_task); | ||
1505 | 1525 | ||
1506 | config_item_put(item); | 1526 | config_item_put(item); |
1507 | } | 1527 | } |
@@ -1682,7 +1702,7 @@ out: | |||
1682 | } | 1702 | } |
1683 | EXPORT_SYMBOL_GPL(o2hb_register_callback); | 1703 | EXPORT_SYMBOL_GPL(o2hb_register_callback); |
1684 | 1704 | ||
1685 | int o2hb_unregister_callback(struct o2hb_callback_func *hc) | 1705 | void o2hb_unregister_callback(struct o2hb_callback_func *hc) |
1686 | { | 1706 | { |
1687 | BUG_ON(hc->hc_magic != O2HB_CB_MAGIC); | 1707 | BUG_ON(hc->hc_magic != O2HB_CB_MAGIC); |
1688 | 1708 | ||
@@ -1690,15 +1710,13 @@ int o2hb_unregister_callback(struct o2hb_callback_func *hc) | |||
1690 | __builtin_return_address(0), hc); | 1710 | __builtin_return_address(0), hc); |
1691 | 1711 | ||
1692 | if (list_empty(&hc->hc_item)) | 1712 | if (list_empty(&hc->hc_item)) |
1693 | return 0; | 1713 | return; |
1694 | 1714 | ||
1695 | down_write(&o2hb_callback_sem); | 1715 | down_write(&o2hb_callback_sem); |
1696 | 1716 | ||
1697 | list_del_init(&hc->hc_item); | 1717 | list_del_init(&hc->hc_item); |
1698 | 1718 | ||
1699 | up_write(&o2hb_callback_sem); | 1719 | up_write(&o2hb_callback_sem); |
1700 | |||
1701 | return 0; | ||
1702 | } | 1720 | } |
1703 | EXPORT_SYMBOL_GPL(o2hb_unregister_callback); | 1721 | EXPORT_SYMBOL_GPL(o2hb_unregister_callback); |
1704 | 1722 | ||
diff --git a/fs/ocfs2/cluster/heartbeat.h b/fs/ocfs2/cluster/heartbeat.h index cac6223206a9..cc6d40b39771 100644 --- a/fs/ocfs2/cluster/heartbeat.h +++ b/fs/ocfs2/cluster/heartbeat.h | |||
@@ -70,7 +70,7 @@ void o2hb_setup_callback(struct o2hb_callback_func *hc, | |||
70 | void *data, | 70 | void *data, |
71 | int priority); | 71 | int priority); |
72 | int o2hb_register_callback(struct o2hb_callback_func *hc); | 72 | int o2hb_register_callback(struct o2hb_callback_func *hc); |
73 | int o2hb_unregister_callback(struct o2hb_callback_func *hc); | 73 | void o2hb_unregister_callback(struct o2hb_callback_func *hc); |
74 | void o2hb_fill_node_map(unsigned long *map, | 74 | void o2hb_fill_node_map(unsigned long *map, |
75 | unsigned bytes); | 75 | unsigned bytes); |
76 | void o2hb_init(void); | 76 | void o2hb_init(void); |
diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c index 1718215fc018..69caf3e12fea 100644 --- a/fs/ocfs2/cluster/tcp.c +++ b/fs/ocfs2/cluster/tcp.c | |||
@@ -1638,17 +1638,8 @@ static void o2net_hb_node_up_cb(struct o2nm_node *node, int node_num, | |||
1638 | 1638 | ||
1639 | void o2net_unregister_hb_callbacks(void) | 1639 | void o2net_unregister_hb_callbacks(void) |
1640 | { | 1640 | { |
1641 | int ret; | 1641 | o2hb_unregister_callback(&o2net_hb_up); |
1642 | 1642 | o2hb_unregister_callback(&o2net_hb_down); | |
1643 | ret = o2hb_unregister_callback(&o2net_hb_up); | ||
1644 | if (ret < 0) | ||
1645 | mlog(ML_ERROR, "Status return %d unregistering heartbeat up " | ||
1646 | "callback!\n", ret); | ||
1647 | |||
1648 | ret = o2hb_unregister_callback(&o2net_hb_down); | ||
1649 | if (ret < 0) | ||
1650 | mlog(ML_ERROR, "Status return %d unregistering heartbeat down " | ||
1651 | "callback!\n", ret); | ||
1652 | } | 1643 | } |
1653 | 1644 | ||
1654 | int o2net_register_hb_callbacks(void) | 1645 | int o2net_register_hb_callbacks(void) |
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c index 77e4e6169a0d..9229e04362f6 100644 --- a/fs/ocfs2/dlm/dlmmaster.c +++ b/fs/ocfs2/dlm/dlmmaster.c | |||
@@ -2730,14 +2730,17 @@ int dlm_empty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) | |||
2730 | int ret; | 2730 | int ret; |
2731 | int lock_dropped = 0; | 2731 | int lock_dropped = 0; |
2732 | 2732 | ||
2733 | spin_lock(&res->spinlock); | ||
2733 | if (res->owner != dlm->node_num) { | 2734 | if (res->owner != dlm->node_num) { |
2734 | if (!__dlm_lockres_unused(res)) { | 2735 | if (!__dlm_lockres_unused(res)) { |
2735 | mlog(ML_ERROR, "%s:%.*s: this node is not master, " | 2736 | mlog(ML_ERROR, "%s:%.*s: this node is not master, " |
2736 | "trying to free this but locks remain\n", | 2737 | "trying to free this but locks remain\n", |
2737 | dlm->name, res->lockname.len, res->lockname.name); | 2738 | dlm->name, res->lockname.len, res->lockname.name); |
2738 | } | 2739 | } |
2740 | spin_unlock(&res->spinlock); | ||
2739 | goto leave; | 2741 | goto leave; |
2740 | } | 2742 | } |
2743 | spin_unlock(&res->spinlock); | ||
2741 | 2744 | ||
2742 | /* Wheee! Migrate lockres here! Will sleep so drop spinlock. */ | 2745 | /* Wheee! Migrate lockres here! Will sleep so drop spinlock. */ |
2743 | spin_unlock(&dlm->spinlock); | 2746 | spin_unlock(&dlm->spinlock); |
diff --git a/fs/ocfs2/dlm/dlmthread.c b/fs/ocfs2/dlm/dlmthread.c index 8ffa0916eb86..6421a8fae1de 100644 --- a/fs/ocfs2/dlm/dlmthread.c +++ b/fs/ocfs2/dlm/dlmthread.c | |||
@@ -265,8 +265,10 @@ static void dlm_run_purge_list(struct dlm_ctxt *dlm, | |||
265 | /* This may drop and reacquire the dlm spinlock if it | 265 | /* This may drop and reacquire the dlm spinlock if it |
266 | * has to do migration. */ | 266 | * has to do migration. */ |
267 | mlog(0, "calling dlm_purge_lockres!\n"); | 267 | mlog(0, "calling dlm_purge_lockres!\n"); |
268 | dlm_lockres_get(lockres); | ||
268 | if (dlm_purge_lockres(dlm, lockres)) | 269 | if (dlm_purge_lockres(dlm, lockres)) |
269 | BUG(); | 270 | BUG(); |
271 | dlm_lockres_put(lockres); | ||
270 | mlog(0, "DONE calling dlm_purge_lockres!\n"); | 272 | mlog(0, "DONE calling dlm_purge_lockres!\n"); |
271 | 273 | ||
272 | /* Avoid adding any scheduling latencies */ | 274 | /* Avoid adding any scheduling latencies */ |
diff --git a/fs/ocfs2/heartbeat.c b/fs/ocfs2/heartbeat.c index 8fc52d6d0ce7..b25ef63781ba 100644 --- a/fs/ocfs2/heartbeat.c +++ b/fs/ocfs2/heartbeat.c | |||
@@ -164,8 +164,10 @@ int ocfs2_register_hb_callbacks(struct ocfs2_super *osb) | |||
164 | } | 164 | } |
165 | 165 | ||
166 | status = o2hb_register_callback(&osb->osb_hb_up); | 166 | status = o2hb_register_callback(&osb->osb_hb_up); |
167 | if (status < 0) | 167 | if (status < 0) { |
168 | mlog_errno(status); | 168 | mlog_errno(status); |
169 | o2hb_unregister_callback(&osb->osb_hb_down); | ||
170 | } | ||
169 | 171 | ||
170 | bail: | 172 | bail: |
171 | return status; | 173 | return status; |
@@ -173,18 +175,11 @@ bail: | |||
173 | 175 | ||
174 | void ocfs2_clear_hb_callbacks(struct ocfs2_super *osb) | 176 | void ocfs2_clear_hb_callbacks(struct ocfs2_super *osb) |
175 | { | 177 | { |
176 | int status; | ||
177 | |||
178 | if (ocfs2_mount_local(osb)) | 178 | if (ocfs2_mount_local(osb)) |
179 | return; | 179 | return; |
180 | 180 | ||
181 | status = o2hb_unregister_callback(&osb->osb_hb_down); | 181 | o2hb_unregister_callback(&osb->osb_hb_down); |
182 | if (status < 0) | 182 | o2hb_unregister_callback(&osb->osb_hb_up); |
183 | mlog_errno(status); | ||
184 | |||
185 | status = o2hb_unregister_callback(&osb->osb_hb_up); | ||
186 | if (status < 0) | ||
187 | mlog_errno(status); | ||
188 | } | 183 | } |
189 | 184 | ||
190 | void ocfs2_stop_heartbeat(struct ocfs2_super *osb) | 185 | void ocfs2_stop_heartbeat(struct ocfs2_super *osb) |
diff --git a/fs/proc/base.c b/fs/proc/base.c index 01f7769da8e6..989af5e55d1b 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -1558,29 +1558,20 @@ static ssize_t proc_pid_attr_read(struct file * file, char __user * buf, | |||
1558 | size_t count, loff_t *ppos) | 1558 | size_t count, loff_t *ppos) |
1559 | { | 1559 | { |
1560 | struct inode * inode = file->f_path.dentry->d_inode; | 1560 | struct inode * inode = file->f_path.dentry->d_inode; |
1561 | unsigned long page; | 1561 | char *p = NULL; |
1562 | ssize_t length; | 1562 | ssize_t length; |
1563 | struct task_struct *task = get_proc_task(inode); | 1563 | struct task_struct *task = get_proc_task(inode); |
1564 | 1564 | ||
1565 | length = -ESRCH; | ||
1566 | if (!task) | 1565 | if (!task) |
1567 | goto out_no_task; | 1566 | return -ESRCH; |
1568 | |||
1569 | if (count > PAGE_SIZE) | ||
1570 | count = PAGE_SIZE; | ||
1571 | length = -ENOMEM; | ||
1572 | if (!(page = __get_free_page(GFP_KERNEL))) | ||
1573 | goto out; | ||
1574 | 1567 | ||
1575 | length = security_getprocattr(task, | 1568 | length = security_getprocattr(task, |
1576 | (char*)file->f_path.dentry->d_name.name, | 1569 | (char*)file->f_path.dentry->d_name.name, |
1577 | (void*)page, count); | 1570 | &p); |
1578 | if (length >= 0) | ||
1579 | length = simple_read_from_buffer(buf, count, ppos, (char *)page, length); | ||
1580 | free_page(page); | ||
1581 | out: | ||
1582 | put_task_struct(task); | 1571 | put_task_struct(task); |
1583 | out_no_task: | 1572 | if (length > 0) |
1573 | length = simple_read_from_buffer(buf, count, ppos, p, length); | ||
1574 | kfree(p); | ||
1584 | return length; | 1575 | return length; |
1585 | } | 1576 | } |
1586 | 1577 | ||
diff --git a/include/asm-arm/arch-ixp4xx/ixp4xx-regs.h b/include/asm-arm/arch-ixp4xx/ixp4xx-regs.h index 9444958bec1e..ed35e5c94f40 100644 --- a/include/asm-arm/arch-ixp4xx/ixp4xx-regs.h +++ b/include/asm-arm/arch-ixp4xx/ixp4xx-regs.h | |||
@@ -144,9 +144,9 @@ | |||
144 | #define IXP4XX_INTC_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x3000) | 144 | #define IXP4XX_INTC_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x3000) |
145 | #define IXP4XX_GPIO_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x4000) | 145 | #define IXP4XX_GPIO_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x4000) |
146 | #define IXP4XX_TIMER_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x5000) | 146 | #define IXP4XX_TIMER_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x5000) |
147 | #define IXP4XX_NPEA_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_PHYS + 0x6000) | 147 | #define IXP4XX_NPEA_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x6000) |
148 | #define IXP4XX_NPEB_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_PHYS + 0x7000) | 148 | #define IXP4XX_NPEB_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x7000) |
149 | #define IXP4XX_NPEC_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_PHYS + 0x8000) | 149 | #define IXP4XX_NPEC_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x8000) |
150 | #define IXP4XX_EthB_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x9000) | 150 | #define IXP4XX_EthB_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x9000) |
151 | #define IXP4XX_EthC_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0xA000) | 151 | #define IXP4XX_EthC_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0xA000) |
152 | #define IXP4XX_USB_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0xB000) | 152 | #define IXP4XX_USB_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0xB000) |
diff --git a/include/asm-arm/arch-lh7a40x/entry-macro.S b/include/asm-arm/arch-lh7a40x/entry-macro.S index 502700604e00..ffe397250f0c 100644 --- a/include/asm-arm/arch-lh7a40x/entry-macro.S +++ b/include/asm-arm/arch-lh7a40x/entry-macro.S | |||
@@ -86,6 +86,12 @@ branch_irq_lh7a400: b 1000f | |||
86 | .macro disable_fiq | 86 | .macro disable_fiq |
87 | .endm | 87 | .endm |
88 | 88 | ||
89 | .macro get_irqnr_preamble, base, tmp | ||
90 | .endm | ||
91 | |||
92 | .macro arch_ret_to_user, tmp1, tmp2 | ||
93 | .endm | ||
94 | |||
89 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | 95 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp |
90 | mov \irqnr, #0 | 96 | mov \irqnr, #0 |
91 | mov \base, #io_p2v(0x80000000) @ APB registers | 97 | mov \base, #io_p2v(0x80000000) @ APB registers |
@@ -105,6 +111,12 @@ branch_irq_lh7a400: b 1000f | |||
105 | .macro disable_fiq | 111 | .macro disable_fiq |
106 | .endm | 112 | .endm |
107 | 113 | ||
114 | .macro get_irqnr_preamble, base, tmp | ||
115 | .endm | ||
116 | |||
117 | .macro arch_ret_to_user, tmp1, tmp2 | ||
118 | .endm | ||
119 | |||
108 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | 120 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp |
109 | mov \irqnr, #0 @ VIC1 irq base | 121 | mov \irqnr, #0 @ VIC1 irq base |
110 | mov \base, #io_p2v(0x80000000) @ APB registers | 122 | mov \base, #io_p2v(0x80000000) @ APB registers |
diff --git a/include/asm-i386/nmi.h b/include/asm-i386/nmi.h index 64544cb85d6a..b04333ea6f31 100644 --- a/include/asm-i386/nmi.h +++ b/include/asm-i386/nmi.h | |||
@@ -33,7 +33,7 @@ extern int nmi_watchdog_tick (struct pt_regs * regs, unsigned reason); | |||
33 | 33 | ||
34 | extern atomic_t nmi_active; | 34 | extern atomic_t nmi_active; |
35 | extern unsigned int nmi_watchdog; | 35 | extern unsigned int nmi_watchdog; |
36 | #define NMI_DEFAULT 0 | 36 | #define NMI_DEFAULT -1 |
37 | #define NMI_NONE 0 | 37 | #define NMI_NONE 0 |
38 | #define NMI_IO_APIC 1 | 38 | #define NMI_IO_APIC 1 |
39 | #define NMI_LOCAL_APIC 2 | 39 | #define NMI_LOCAL_APIC 2 |
diff --git a/include/asm-i386/paravirt.h b/include/asm-i386/paravirt.h index f8319cae2ac5..46dc34ca887a 100644 --- a/include/asm-i386/paravirt.h +++ b/include/asm-i386/paravirt.h | |||
@@ -130,7 +130,7 @@ struct paravirt_ops | |||
130 | void (*flush_tlb_kernel)(void); | 130 | void (*flush_tlb_kernel)(void); |
131 | void (*flush_tlb_single)(u32 addr); | 131 | void (*flush_tlb_single)(u32 addr); |
132 | 132 | ||
133 | void (fastcall *map_pt_hook)(int type, pte_t *va, u32 pfn); | 133 | void (*map_pt_hook)(int type, pte_t *va, u32 pfn); |
134 | 134 | ||
135 | void (*alloc_pt)(u32 pfn); | 135 | void (*alloc_pt)(u32 pfn); |
136 | void (*alloc_pd)(u32 pfn); | 136 | void (*alloc_pd)(u32 pfn); |
diff --git a/include/asm-i386/vmi_time.h b/include/asm-i386/vmi_time.h index 94d0a12a4114..c3a1fcf66c96 100644 --- a/include/asm-i386/vmi_time.h +++ b/include/asm-i386/vmi_time.h | |||
@@ -54,7 +54,7 @@ extern unsigned long vmi_cpu_khz(void); | |||
54 | 54 | ||
55 | #ifdef CONFIG_X86_LOCAL_APIC | 55 | #ifdef CONFIG_X86_LOCAL_APIC |
56 | extern void __init vmi_timer_setup_boot_alarm(void); | 56 | extern void __init vmi_timer_setup_boot_alarm(void); |
57 | extern void __init vmi_timer_setup_secondary_alarm(void); | 57 | extern void __devinit vmi_timer_setup_secondary_alarm(void); |
58 | extern void apic_vmi_timer_interrupt(void); | 58 | extern void apic_vmi_timer_interrupt(void); |
59 | #endif | 59 | #endif |
60 | 60 | ||
diff --git a/include/asm-m32r/dma-mapping.h b/include/asm-m32r/dma-mapping.h index a7fa0302bda7..f9b58ebba361 100644 --- a/include/asm-m32r/dma-mapping.h +++ b/include/asm-m32r/dma-mapping.h | |||
@@ -1,23 +1,6 @@ | |||
1 | #ifndef _ASM_M32R_DMA_MAPPING_H | 1 | #ifndef _ASM_M32R_DMA_MAPPING_H |
2 | #define _ASM_M32R_DMA_MAPPING_H | 2 | #define _ASM_M32R_DMA_MAPPING_H |
3 | 3 | ||
4 | /* | 4 | #include <asm-generic/dma-mapping-broken.h> |
5 | * NOTE: Do not include <asm-generic/dma-mapping.h> | ||
6 | * Because it requires PCI stuffs, but current M32R don't provide these. | ||
7 | */ | ||
8 | |||
9 | static inline void * | ||
10 | dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, | ||
11 | gfp_t flag) | ||
12 | { | ||
13 | return (void *)NULL; | ||
14 | } | ||
15 | |||
16 | static inline void | ||
17 | dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, | ||
18 | dma_addr_t dma_handle) | ||
19 | { | ||
20 | return; | ||
21 | } | ||
22 | 5 | ||
23 | #endif /* _ASM_M32R_DMA_MAPPING_H */ | 6 | #endif /* _ASM_M32R_DMA_MAPPING_H */ |
diff --git a/include/asm-m68k/dma-mapping.h b/include/asm-m68k/dma-mapping.h index 00259ed6fc95..a26cdeb46a57 100644 --- a/include/asm-m68k/dma-mapping.h +++ b/include/asm-m68k/dma-mapping.h | |||
@@ -32,7 +32,7 @@ extern void dma_free_coherent(struct device *, size_t, | |||
32 | void *, dma_addr_t); | 32 | void *, dma_addr_t); |
33 | 33 | ||
34 | static inline void *dma_alloc_noncoherent(struct device *dev, size_t size, | 34 | static inline void *dma_alloc_noncoherent(struct device *dev, size_t size, |
35 | dma_addr_t *handle, int flag) | 35 | dma_addr_t *handle, gfp_t flag) |
36 | { | 36 | { |
37 | return dma_alloc_coherent(dev, size, handle, flag); | 37 | return dma_alloc_coherent(dev, size, handle, flag); |
38 | } | 38 | } |
diff --git a/include/asm-m68k/mc146818rtc.h b/include/asm-m68k/mc146818rtc.h index 11fe12ddb913..9f70a01f73dc 100644 --- a/include/asm-m68k/mc146818rtc.h +++ b/include/asm-m68k/mc146818rtc.h | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <asm/atarihw.h> | 11 | #include <asm/atarihw.h> |
12 | 12 | ||
13 | #define RTC_PORT(x) (TT_RTC_BAS + 2*(x)) | 13 | #define RTC_PORT(x) (TT_RTC_BAS + 2*(x)) |
14 | #define RTC_ALWAYS_BCD 0 | ||
14 | 15 | ||
15 | #define CMOS_READ(addr) ({ \ | 16 | #define CMOS_READ(addr) ({ \ |
16 | atari_outb_p((addr),RTC_PORT(0)); \ | 17 | atari_outb_p((addr),RTC_PORT(0)); \ |
diff --git a/include/asm-powerpc/floppy.h b/include/asm-powerpc/floppy.h index a0f14eea1da5..afa700ded877 100644 --- a/include/asm-powerpc/floppy.h +++ b/include/asm-powerpc/floppy.h | |||
@@ -178,7 +178,7 @@ static struct fd_dma_ops virt_dma_ops = | |||
178 | ._dma_setup = vdma_dma_setup | 178 | ._dma_setup = vdma_dma_setup |
179 | }; | 179 | }; |
180 | 180 | ||
181 | static int fd_request_dma() | 181 | static int fd_request_dma(void) |
182 | { | 182 | { |
183 | if (can_use_virtual_dma & 1) { | 183 | if (can_use_virtual_dma & 1) { |
184 | fd_ops = &virt_dma_ops; | 184 | fd_ops = &virt_dma_ops; |
diff --git a/include/asm-powerpc/spu.h b/include/asm-powerpc/spu.h index 0f9f2dd24a79..31d5054be20f 100644 --- a/include/asm-powerpc/spu.h +++ b/include/asm-powerpc/spu.h | |||
@@ -165,6 +165,13 @@ int spu_irq_class_0_bottom(struct spu *spu); | |||
165 | int spu_irq_class_1_bottom(struct spu *spu); | 165 | int spu_irq_class_1_bottom(struct spu *spu); |
166 | void spu_irq_setaffinity(struct spu *spu, int cpu); | 166 | void spu_irq_setaffinity(struct spu *spu, int cpu); |
167 | 167 | ||
168 | extern void spu_invalidate_slbs(struct spu *spu); | ||
169 | extern void spu_associate_mm(struct spu *spu, struct mm_struct *mm); | ||
170 | |||
171 | /* Calls from the memory management to the SPU */ | ||
172 | struct mm_struct; | ||
173 | extern void spu_flush_all_slbs(struct mm_struct *mm); | ||
174 | |||
168 | /* system callbacks from the SPU */ | 175 | /* system callbacks from the SPU */ |
169 | struct spu_syscall_block { | 176 | struct spu_syscall_block { |
170 | u64 nr_ret; | 177 | u64 nr_ret; |
diff --git a/include/asm-powerpc/spu_csa.h b/include/asm-powerpc/spu_csa.h index bdbf906a767f..8aad0619eb8e 100644 --- a/include/asm-powerpc/spu_csa.h +++ b/include/asm-powerpc/spu_csa.h | |||
@@ -221,8 +221,6 @@ struct spu_priv2_collapsed { | |||
221 | * @spu_chnlcnt_RW: Array of saved channel counts. | 221 | * @spu_chnlcnt_RW: Array of saved channel counts. |
222 | * @spu_chnldata_RW: Array of saved channel data. | 222 | * @spu_chnldata_RW: Array of saved channel data. |
223 | * @suspend_time: Time stamp when decrementer disabled. | 223 | * @suspend_time: Time stamp when decrementer disabled. |
224 | * @slb_esid_RW: Array of saved SLB esid entries. | ||
225 | * @slb_vsid_RW: Array of saved SLB vsid entries. | ||
226 | * | 224 | * |
227 | * Structure representing the whole of the SPU | 225 | * Structure representing the whole of the SPU |
228 | * context save area (CSA). This struct contains | 226 | * context save area (CSA). This struct contains |
@@ -245,8 +243,6 @@ struct spu_state { | |||
245 | u32 spu_mailbox_data[4]; | 243 | u32 spu_mailbox_data[4]; |
246 | u32 pu_mailbox_data[1]; | 244 | u32 pu_mailbox_data[1]; |
247 | unsigned long suspend_time; | 245 | unsigned long suspend_time; |
248 | u64 slb_esid_RW[8]; | ||
249 | u64 slb_vsid_RW[8]; | ||
250 | spinlock_t register_lock; | 246 | spinlock_t register_lock; |
251 | }; | 247 | }; |
252 | 248 | ||
diff --git a/include/asm-powerpc/systbl.h b/include/asm-powerpc/systbl.h index 418e5c7e972c..8d853c554631 100644 --- a/include/asm-powerpc/systbl.h +++ b/include/asm-powerpc/systbl.h | |||
@@ -304,5 +304,6 @@ SYSCALL_SPU(fchmodat) | |||
304 | SYSCALL_SPU(faccessat) | 304 | SYSCALL_SPU(faccessat) |
305 | COMPAT_SYS_SPU(get_robust_list) | 305 | COMPAT_SYS_SPU(get_robust_list) |
306 | COMPAT_SYS_SPU(set_robust_list) | 306 | COMPAT_SYS_SPU(set_robust_list) |
307 | COMPAT_SYS(move_pages) | 307 | COMPAT_SYS_SPU(move_pages) |
308 | SYSCALL_SPU(getcpu) | 308 | SYSCALL_SPU(getcpu) |
309 | COMPAT_SYS(epoll_pwait) | ||
diff --git a/include/asm-powerpc/unistd.h b/include/asm-powerpc/unistd.h index 0ae954e3d258..2baedbe54e13 100644 --- a/include/asm-powerpc/unistd.h +++ b/include/asm-powerpc/unistd.h | |||
@@ -324,10 +324,12 @@ | |||
324 | #define __NR_get_robust_list 299 | 324 | #define __NR_get_robust_list 299 |
325 | #define __NR_set_robust_list 300 | 325 | #define __NR_set_robust_list 300 |
326 | #define __NR_move_pages 301 | 326 | #define __NR_move_pages 301 |
327 | #define __NR_getcpu 302 | ||
328 | #define __NR_epoll_pwait 303 | ||
327 | 329 | ||
328 | #ifdef __KERNEL__ | 330 | #ifdef __KERNEL__ |
329 | 331 | ||
330 | #define __NR_syscalls 302 | 332 | #define __NR_syscalls 304 |
331 | 333 | ||
332 | #define __NR__exit __NR_exit | 334 | #define __NR__exit __NR_exit |
333 | #define NR_syscalls __NR_syscalls | 335 | #define NR_syscalls __NR_syscalls |
diff --git a/include/asm-sparc/dma-mapping.h b/include/asm-sparc/dma-mapping.h index 6db83dc93cb7..f3a641e6b2c8 100644 --- a/include/asm-sparc/dma-mapping.h +++ b/include/asm-sparc/dma-mapping.h | |||
@@ -5,20 +5,7 @@ | |||
5 | #ifdef CONFIG_PCI | 5 | #ifdef CONFIG_PCI |
6 | #include <asm-generic/dma-mapping.h> | 6 | #include <asm-generic/dma-mapping.h> |
7 | #else | 7 | #else |
8 | 8 | #include <asm-generic/dma-mapping-broken.h> | |
9 | static inline void *dma_alloc_coherent(struct device *dev, size_t size, | ||
10 | dma_addr_t *dma_handle, gfp_t flag) | ||
11 | { | ||
12 | BUG(); | ||
13 | return NULL; | ||
14 | } | ||
15 | |||
16 | static inline void dma_free_coherent(struct device *dev, size_t size, | ||
17 | void *vaddr, dma_addr_t dma_handle) | ||
18 | { | ||
19 | BUG(); | ||
20 | } | ||
21 | |||
22 | #endif /* PCI */ | 9 | #endif /* PCI */ |
23 | 10 | ||
24 | #endif /* _ASM_SPARC_DMA_MAPPING_H */ | 11 | #endif /* _ASM_SPARC_DMA_MAPPING_H */ |
diff --git a/include/asm-sparc/unistd.h b/include/asm-sparc/unistd.h index d5b2f8053b3b..e43ed1d63a9d 100644 --- a/include/asm-sparc/unistd.h +++ b/include/asm-sparc/unistd.h | |||
@@ -319,16 +319,17 @@ | |||
319 | #define __NR_set_robust_list 300 | 319 | #define __NR_set_robust_list 300 |
320 | #define __NR_get_robust_list 301 | 320 | #define __NR_get_robust_list 301 |
321 | #define __NR_migrate_pages 302 | 321 | #define __NR_migrate_pages 302 |
322 | #define __NR_mbind 303 | ||
323 | #define __NR_get_mempolicy 304 | ||
324 | #define __NR_set_mempolicy 305 | ||
325 | #define __NR_kexec_load 306 | ||
326 | #define __NR_move_pages 307 | ||
327 | #define __NR_getcpu 308 | ||
328 | #define __NR_epoll_pwait 309 | ||
322 | 329 | ||
323 | #define NR_SYSCALLS 303 | 330 | #define NR_SYSCALLS 310 |
324 | 331 | ||
325 | #ifdef __KERNEL__ | 332 | #ifdef __KERNEL__ |
326 | /* WARNING: You MAY NOT add syscall numbers larger than 302, since | ||
327 | * all of the syscall tables in the Sparc kernel are | ||
328 | * sized to have 302 entries (starting at zero). Therefore | ||
329 | * find a free slot in the 0-302 range. | ||
330 | */ | ||
331 | |||
332 | #define __ARCH_WANT_IPC_PARSE_VERSION | 333 | #define __ARCH_WANT_IPC_PARSE_VERSION |
333 | #define __ARCH_WANT_OLD_READDIR | 334 | #define __ARCH_WANT_OLD_READDIR |
334 | #define __ARCH_WANT_STAT64 | 335 | #define __ARCH_WANT_STAT64 |
@@ -345,7 +346,6 @@ | |||
345 | #define __ARCH_WANT_SYS_GETPGRP | 346 | #define __ARCH_WANT_SYS_GETPGRP |
346 | #define __ARCH_WANT_SYS_LLSEEK | 347 | #define __ARCH_WANT_SYS_LLSEEK |
347 | #define __ARCH_WANT_SYS_NICE | 348 | #define __ARCH_WANT_SYS_NICE |
348 | #define __ARCH_WANT_SYS_OLD_GETRLIMIT | ||
349 | #define __ARCH_WANT_SYS_OLDUMOUNT | 349 | #define __ARCH_WANT_SYS_OLDUMOUNT |
350 | #define __ARCH_WANT_SYS_SIGPENDING | 350 | #define __ARCH_WANT_SYS_SIGPENDING |
351 | #define __ARCH_WANT_SYS_SIGPROCMASK | 351 | #define __ARCH_WANT_SYS_SIGPROCMASK |
diff --git a/include/asm-sparc64/unistd.h b/include/asm-sparc64/unistd.h index 47047536f261..e2dcb87e0c62 100644 --- a/include/asm-sparc64/unistd.h +++ b/include/asm-sparc64/unistd.h | |||
@@ -321,17 +321,17 @@ | |||
321 | #define __NR_set_robust_list 300 | 321 | #define __NR_set_robust_list 300 |
322 | #define __NR_get_robust_list 301 | 322 | #define __NR_get_robust_list 301 |
323 | #define __NR_migrate_pages 302 | 323 | #define __NR_migrate_pages 302 |
324 | #define __NR_mbind 303 | ||
325 | #define __NR_get_mempolicy 304 | ||
326 | #define __NR_set_mempolicy 305 | ||
327 | #define __NR_kexec_load 306 | ||
328 | #define __NR_move_pages 307 | ||
329 | #define __NR_getcpu 308 | ||
330 | #define __NR_epoll_pwait 309 | ||
324 | 331 | ||
325 | #define NR_SYSCALLS 303 | 332 | #define NR_SYSCALLS 310 |
326 | 333 | ||
327 | #ifdef __KERNEL__ | 334 | #ifdef __KERNEL__ |
328 | |||
329 | /* WARNING: You MAY NOT add syscall numbers larger than 302, since | ||
330 | * all of the syscall tables in the Sparc kernel are | ||
331 | * sized to have 302 entries (starting at zero). Therefore | ||
332 | * find a free slot in the 0-302 range. | ||
333 | */ | ||
334 | |||
335 | /* sysconf options, for SunOS compatibility */ | 335 | /* sysconf options, for SunOS compatibility */ |
336 | #define _SC_ARG_MAX 1 | 336 | #define _SC_ARG_MAX 1 |
337 | #define _SC_CHILD_MAX 2 | 337 | #define _SC_CHILD_MAX 2 |
@@ -359,7 +359,6 @@ | |||
359 | #define __ARCH_WANT_SYS_GETPGRP | 359 | #define __ARCH_WANT_SYS_GETPGRP |
360 | #define __ARCH_WANT_SYS_LLSEEK | 360 | #define __ARCH_WANT_SYS_LLSEEK |
361 | #define __ARCH_WANT_SYS_NICE | 361 | #define __ARCH_WANT_SYS_NICE |
362 | #define __ARCH_WANT_SYS_OLD_GETRLIMIT | ||
363 | #define __ARCH_WANT_SYS_OLDUMOUNT | 362 | #define __ARCH_WANT_SYS_OLDUMOUNT |
364 | #define __ARCH_WANT_SYS_SIGPENDING | 363 | #define __ARCH_WANT_SYS_SIGPENDING |
365 | #define __ARCH_WANT_SYS_SIGPROCMASK | 364 | #define __ARCH_WANT_SYS_SIGPROCMASK |
diff --git a/include/asm-x86_64/nmi.h b/include/asm-x86_64/nmi.h index ceb3d8dac33d..72375e7d32a8 100644 --- a/include/asm-x86_64/nmi.h +++ b/include/asm-x86_64/nmi.h | |||
@@ -64,7 +64,7 @@ extern int setup_nmi_watchdog(char *); | |||
64 | 64 | ||
65 | extern atomic_t nmi_active; | 65 | extern atomic_t nmi_active; |
66 | extern unsigned int nmi_watchdog; | 66 | extern unsigned int nmi_watchdog; |
67 | #define NMI_DEFAULT 0 | 67 | #define NMI_DEFAULT -1 |
68 | #define NMI_NONE 0 | 68 | #define NMI_NONE 0 |
69 | #define NMI_IO_APIC 1 | 69 | #define NMI_IO_APIC 1 |
70 | #define NMI_LOCAL_APIC 2 | 70 | #define NMI_LOCAL_APIC 2 |
diff --git a/include/asm-x86_64/uaccess.h b/include/asm-x86_64/uaccess.h index 1981f70fcad1..9df30b939c4e 100644 --- a/include/asm-x86_64/uaccess.h +++ b/include/asm-x86_64/uaccess.h | |||
@@ -373,12 +373,12 @@ extern long __copy_user_nocache(void *dst, const void __user *src, unsigned size | |||
373 | static inline int __copy_from_user_nocache(void *dst, const void __user *src, unsigned size) | 373 | static inline int __copy_from_user_nocache(void *dst, const void __user *src, unsigned size) |
374 | { | 374 | { |
375 | might_sleep(); | 375 | might_sleep(); |
376 | return __copy_user_nocache(dst, (__force void *)src, size, 1); | 376 | return __copy_user_nocache(dst, src, size, 1); |
377 | } | 377 | } |
378 | 378 | ||
379 | static inline int __copy_from_user_inatomic_nocache(void *dst, const void __user *src, unsigned size) | 379 | static inline int __copy_from_user_inatomic_nocache(void *dst, const void __user *src, unsigned size) |
380 | { | 380 | { |
381 | return __copy_user_nocache(dst, (__force void *)src, size, 0); | 381 | return __copy_user_nocache(dst, src, size, 0); |
382 | } | 382 | } |
383 | 383 | ||
384 | #endif /* __X86_64_UACCESS_H */ | 384 | #endif /* __X86_64_UACCESS_H */ |
diff --git a/include/linux/msi.h b/include/linux/msi.h index 74c8a2ecc9dd..e38fe6822cb4 100644 --- a/include/linux/msi.h +++ b/include/linux/msi.h | |||
@@ -17,7 +17,7 @@ struct msi_desc { | |||
17 | struct { | 17 | struct { |
18 | __u8 type : 5; /* {0: unused, 5h:MSI, 11h:MSI-X} */ | 18 | __u8 type : 5; /* {0: unused, 5h:MSI, 11h:MSI-X} */ |
19 | __u8 maskbit : 1; /* mask-pending bit supported ? */ | 19 | __u8 maskbit : 1; /* mask-pending bit supported ? */ |
20 | __u8 unused : 1; | 20 | __u8 masked : 1; |
21 | __u8 is_64 : 1; /* Address size: 0=32bit 1=64bit */ | 21 | __u8 is_64 : 1; /* Address size: 0=32bit 1=64bit */ |
22 | __u8 pos; /* Location of the msi capability */ | 22 | __u8 pos; /* Location of the msi capability */ |
23 | __u16 entry_nr; /* specific enabled entry */ | 23 | __u16 entry_nr; /* specific enabled entry */ |
@@ -32,10 +32,8 @@ struct msi_desc { | |||
32 | void __iomem *mask_base; | 32 | void __iomem *mask_base; |
33 | struct pci_dev *dev; | 33 | struct pci_dev *dev; |
34 | 34 | ||
35 | #ifdef CONFIG_PM | 35 | /* Last set MSI message */ |
36 | /* PM save area for MSIX address/data */ | 36 | struct msi_msg msg; |
37 | struct msi_msg msg_save; | ||
38 | #endif | ||
39 | }; | 37 | }; |
40 | 38 | ||
41 | /* | 39 | /* |
diff --git a/include/linux/pci.h b/include/linux/pci.h index 78417e421b4c..481ea0663f19 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -209,11 +209,6 @@ static inline void pci_add_saved_cap(struct pci_dev *pci_dev, | |||
209 | hlist_add_head(&new_cap->next, &pci_dev->saved_cap_space); | 209 | hlist_add_head(&new_cap->next, &pci_dev->saved_cap_space); |
210 | } | 210 | } |
211 | 211 | ||
212 | static inline void pci_remove_saved_cap(struct pci_cap_saved_state *cap) | ||
213 | { | ||
214 | hlist_del(&cap->next); | ||
215 | } | ||
216 | |||
217 | /* | 212 | /* |
218 | * For PCI devices, the region numbers are assigned this way: | 213 | * For PCI devices, the region numbers are assigned this way: |
219 | * | 214 | * |
diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h index f09cce2357ff..495d368390e0 100644 --- a/include/linux/pci_regs.h +++ b/include/linux/pci_regs.h | |||
@@ -296,6 +296,7 @@ | |||
296 | #define PCI_MSIX_FLAGS 2 | 296 | #define PCI_MSIX_FLAGS 2 |
297 | #define PCI_MSIX_FLAGS_QSIZE 0x7FF | 297 | #define PCI_MSIX_FLAGS_QSIZE 0x7FF |
298 | #define PCI_MSIX_FLAGS_ENABLE (1 << 15) | 298 | #define PCI_MSIX_FLAGS_ENABLE (1 << 15) |
299 | #define PCI_MSIX_FLAGS_MASKALL (1 << 14) | ||
299 | #define PCI_MSIX_FLAGS_BIRMASK (7 << 0) | 300 | #define PCI_MSIX_FLAGS_BIRMASK (7 << 0) |
300 | #define PCI_MSIX_FLAGS_BITMASK (1 << 0) | 301 | #define PCI_MSIX_FLAGS_BITMASK (1 << 0) |
301 | 302 | ||
diff --git a/include/linux/security.h b/include/linux/security.h index 7f88d97575fd..47e82c120f9a 100644 --- a/include/linux/security.h +++ b/include/linux/security.h | |||
@@ -1324,7 +1324,7 @@ struct security_operations { | |||
1324 | 1324 | ||
1325 | void (*d_instantiate) (struct dentry *dentry, struct inode *inode); | 1325 | void (*d_instantiate) (struct dentry *dentry, struct inode *inode); |
1326 | 1326 | ||
1327 | int (*getprocattr)(struct task_struct *p, char *name, void *value, size_t size); | 1327 | int (*getprocattr)(struct task_struct *p, char *name, char **value); |
1328 | int (*setprocattr)(struct task_struct *p, char *name, void *value, size_t size); | 1328 | int (*setprocattr)(struct task_struct *p, char *name, void *value, size_t size); |
1329 | int (*secid_to_secctx)(u32 secid, char **secdata, u32 *seclen); | 1329 | int (*secid_to_secctx)(u32 secid, char **secdata, u32 *seclen); |
1330 | void (*release_secctx)(char *secdata, u32 seclen); | 1330 | void (*release_secctx)(char *secdata, u32 seclen); |
@@ -2092,9 +2092,9 @@ static inline void security_d_instantiate (struct dentry *dentry, struct inode * | |||
2092 | security_ops->d_instantiate (dentry, inode); | 2092 | security_ops->d_instantiate (dentry, inode); |
2093 | } | 2093 | } |
2094 | 2094 | ||
2095 | static inline int security_getprocattr(struct task_struct *p, char *name, void *value, size_t size) | 2095 | static inline int security_getprocattr(struct task_struct *p, char *name, char **value) |
2096 | { | 2096 | { |
2097 | return security_ops->getprocattr(p, name, value, size); | 2097 | return security_ops->getprocattr(p, name, value); |
2098 | } | 2098 | } |
2099 | 2099 | ||
2100 | static inline int security_setprocattr(struct task_struct *p, char *name, void *value, size_t size) | 2100 | static inline int security_setprocattr(struct task_struct *p, char *name, void *value, size_t size) |
@@ -2749,7 +2749,7 @@ static inline int security_sem_semop (struct sem_array * sma, | |||
2749 | static inline void security_d_instantiate (struct dentry *dentry, struct inode *inode) | 2749 | static inline void security_d_instantiate (struct dentry *dentry, struct inode *inode) |
2750 | { } | 2750 | { } |
2751 | 2751 | ||
2752 | static inline int security_getprocattr(struct task_struct *p, char *name, void *value, size_t size) | 2752 | static inline int security_getprocattr(struct task_struct *p, char *name, char **value) |
2753 | { | 2753 | { |
2754 | return -EINVAL; | 2754 | return -EINVAL; |
2755 | } | 2755 | } |
diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 359955800dd2..628c7ac590a0 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c | |||
@@ -739,28 +739,26 @@ static inline void audit_free_context(struct audit_context *context) | |||
739 | void audit_log_task_context(struct audit_buffer *ab) | 739 | void audit_log_task_context(struct audit_buffer *ab) |
740 | { | 740 | { |
741 | char *ctx = NULL; | 741 | char *ctx = NULL; |
742 | ssize_t len = 0; | 742 | unsigned len; |
743 | int error; | ||
744 | u32 sid; | ||
745 | |||
746 | selinux_get_task_sid(current, &sid); | ||
747 | if (!sid) | ||
748 | return; | ||
743 | 749 | ||
744 | len = security_getprocattr(current, "current", NULL, 0); | 750 | error = selinux_sid_to_string(sid, &ctx, &len); |
745 | if (len < 0) { | 751 | if (error) { |
746 | if (len != -EINVAL) | 752 | if (error != -EINVAL) |
747 | goto error_path; | 753 | goto error_path; |
748 | return; | 754 | return; |
749 | } | 755 | } |
750 | 756 | ||
751 | ctx = kmalloc(len, GFP_KERNEL); | ||
752 | if (!ctx) | ||
753 | goto error_path; | ||
754 | |||
755 | len = security_getprocattr(current, "current", ctx, len); | ||
756 | if (len < 0 ) | ||
757 | goto error_path; | ||
758 | |||
759 | audit_log_format(ab, " subj=%s", ctx); | 757 | audit_log_format(ab, " subj=%s", ctx); |
758 | kfree(ctx); | ||
760 | return; | 759 | return; |
761 | 760 | ||
762 | error_path: | 761 | error_path: |
763 | kfree(ctx); | ||
764 | audit_panic("error in audit_log_task_context"); | 762 | audit_panic("error in audit_log_task_context"); |
765 | return; | 763 | return; |
766 | } | 764 | } |
diff --git a/net/ipv4/cipso_ipv4.c b/net/ipv4/cipso_ipv4.c index c976dd7e9758..2ce5b693a8bd 100644 --- a/net/ipv4/cipso_ipv4.c +++ b/net/ipv4/cipso_ipv4.c | |||
@@ -1933,6 +1933,11 @@ int cipso_v4_skbuff_getattr(const struct sk_buff *skb, | |||
1933 | &cipso_ptr[6], | 1933 | &cipso_ptr[6], |
1934 | secattr); | 1934 | secattr); |
1935 | break; | 1935 | break; |
1936 | case CIPSO_V4_TAG_RANGE: | ||
1937 | ret_val = cipso_v4_parsetag_rng(doi_def, | ||
1938 | &cipso_ptr[6], | ||
1939 | secattr); | ||
1940 | break; | ||
1936 | } | 1941 | } |
1937 | 1942 | ||
1938 | skbuff_getattr_return: | 1943 | skbuff_getattr_return: |
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index 1c6a084b5fb7..8cedb2a2c9df 100644 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c | |||
@@ -1255,9 +1255,9 @@ out: | |||
1255 | */ | 1255 | */ |
1256 | void ip_mc_rejoin_group(struct ip_mc_list *im) | 1256 | void ip_mc_rejoin_group(struct ip_mc_list *im) |
1257 | { | 1257 | { |
1258 | #ifdef CONFIG_IP_MULTICAST | ||
1258 | struct in_device *in_dev = im->interface; | 1259 | struct in_device *in_dev = im->interface; |
1259 | 1260 | ||
1260 | #ifdef CONFIG_IP_MULTICAST | ||
1261 | if (im->multiaddr == IGMP_ALL_HOSTS) | 1261 | if (im->multiaddr == IGMP_ALL_HOSTS) |
1262 | return; | 1262 | return; |
1263 | 1263 | ||
diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c index 8c34f1ca6c8c..f92d5310847b 100644 --- a/net/rose/af_rose.c +++ b/net/rose/af_rose.c | |||
@@ -700,23 +700,7 @@ static int rose_connect(struct socket *sock, struct sockaddr *uaddr, int addr_le | |||
700 | unsigned char cause, diagnostic; | 700 | unsigned char cause, diagnostic; |
701 | struct net_device *dev; | 701 | struct net_device *dev; |
702 | ax25_uid_assoc *user; | 702 | ax25_uid_assoc *user; |
703 | int n; | 703 | int n, err = 0; |
704 | |||
705 | if (sk->sk_state == TCP_ESTABLISHED && sock->state == SS_CONNECTING) { | ||
706 | sock->state = SS_CONNECTED; | ||
707 | return 0; /* Connect completed during a ERESTARTSYS event */ | ||
708 | } | ||
709 | |||
710 | if (sk->sk_state == TCP_CLOSE && sock->state == SS_CONNECTING) { | ||
711 | sock->state = SS_UNCONNECTED; | ||
712 | return -ECONNREFUSED; | ||
713 | } | ||
714 | |||
715 | if (sk->sk_state == TCP_ESTABLISHED) | ||
716 | return -EISCONN; /* No reconnect on a seqpacket socket */ | ||
717 | |||
718 | sk->sk_state = TCP_CLOSE; | ||
719 | sock->state = SS_UNCONNECTED; | ||
720 | 704 | ||
721 | if (addr_len != sizeof(struct sockaddr_rose) && addr_len != sizeof(struct full_sockaddr_rose)) | 705 | if (addr_len != sizeof(struct sockaddr_rose) && addr_len != sizeof(struct full_sockaddr_rose)) |
722 | return -EINVAL; | 706 | return -EINVAL; |
@@ -734,24 +718,53 @@ static int rose_connect(struct socket *sock, struct sockaddr *uaddr, int addr_le | |||
734 | if ((rose->source_ndigis + addr->srose_ndigis) > ROSE_MAX_DIGIS) | 718 | if ((rose->source_ndigis + addr->srose_ndigis) > ROSE_MAX_DIGIS) |
735 | return -EINVAL; | 719 | return -EINVAL; |
736 | 720 | ||
721 | lock_sock(sk); | ||
722 | |||
723 | if (sk->sk_state == TCP_ESTABLISHED && sock->state == SS_CONNECTING) { | ||
724 | /* Connect completed during a ERESTARTSYS event */ | ||
725 | sock->state = SS_CONNECTED; | ||
726 | goto out_release; | ||
727 | } | ||
728 | |||
729 | if (sk->sk_state == TCP_CLOSE && sock->state == SS_CONNECTING) { | ||
730 | sock->state = SS_UNCONNECTED; | ||
731 | err = -ECONNREFUSED; | ||
732 | goto out_release; | ||
733 | } | ||
734 | |||
735 | if (sk->sk_state == TCP_ESTABLISHED) { | ||
736 | /* No reconnect on a seqpacket socket */ | ||
737 | err = -EISCONN; | ||
738 | goto out_release; | ||
739 | } | ||
740 | |||
741 | sk->sk_state = TCP_CLOSE; | ||
742 | sock->state = SS_UNCONNECTED; | ||
743 | |||
737 | rose->neighbour = rose_get_neigh(&addr->srose_addr, &cause, | 744 | rose->neighbour = rose_get_neigh(&addr->srose_addr, &cause, |
738 | &diagnostic); | 745 | &diagnostic); |
739 | if (!rose->neighbour) | 746 | if (!rose->neighbour) |
740 | return -ENETUNREACH; | 747 | return -ENETUNREACH; |
741 | 748 | ||
742 | rose->lci = rose_new_lci(rose->neighbour); | 749 | rose->lci = rose_new_lci(rose->neighbour); |
743 | if (!rose->lci) | 750 | if (!rose->lci) { |
744 | return -ENETUNREACH; | 751 | err = -ENETUNREACH; |
752 | goto out_release; | ||
753 | } | ||
745 | 754 | ||
746 | if (sock_flag(sk, SOCK_ZAPPED)) { /* Must bind first - autobinding in this may or may not work */ | 755 | if (sock_flag(sk, SOCK_ZAPPED)) { /* Must bind first - autobinding in this may or may not work */ |
747 | sock_reset_flag(sk, SOCK_ZAPPED); | 756 | sock_reset_flag(sk, SOCK_ZAPPED); |
748 | 757 | ||
749 | if ((dev = rose_dev_first()) == NULL) | 758 | if ((dev = rose_dev_first()) == NULL) { |
750 | return -ENETUNREACH; | 759 | err = -ENETUNREACH; |
760 | goto out_release; | ||
761 | } | ||
751 | 762 | ||
752 | user = ax25_findbyuid(current->euid); | 763 | user = ax25_findbyuid(current->euid); |
753 | if (!user) | 764 | if (!user) { |
754 | return -EINVAL; | 765 | err = -EINVAL; |
766 | goto out_release; | ||
767 | } | ||
755 | 768 | ||
756 | memcpy(&rose->source_addr, dev->dev_addr, ROSE_ADDR_LEN); | 769 | memcpy(&rose->source_addr, dev->dev_addr, ROSE_ADDR_LEN); |
757 | rose->source_call = user->call; | 770 | rose->source_call = user->call; |
@@ -789,8 +802,10 @@ rose_try_next_neigh: | |||
789 | rose_start_t1timer(sk); | 802 | rose_start_t1timer(sk); |
790 | 803 | ||
791 | /* Now the loop */ | 804 | /* Now the loop */ |
792 | if (sk->sk_state != TCP_ESTABLISHED && (flags & O_NONBLOCK)) | 805 | if (sk->sk_state != TCP_ESTABLISHED && (flags & O_NONBLOCK)) { |
793 | return -EINPROGRESS; | 806 | err = -EINPROGRESS; |
807 | goto out_release; | ||
808 | } | ||
794 | 809 | ||
795 | /* | 810 | /* |
796 | * A Connect Ack with Choke or timeout or failed routing will go to | 811 | * A Connect Ack with Choke or timeout or failed routing will go to |
@@ -805,8 +820,10 @@ rose_try_next_neigh: | |||
805 | set_current_state(TASK_INTERRUPTIBLE); | 820 | set_current_state(TASK_INTERRUPTIBLE); |
806 | if (sk->sk_state != TCP_SYN_SENT) | 821 | if (sk->sk_state != TCP_SYN_SENT) |
807 | break; | 822 | break; |
823 | release_sock(sk); | ||
808 | if (!signal_pending(tsk)) { | 824 | if (!signal_pending(tsk)) { |
809 | schedule(); | 825 | schedule(); |
826 | lock_sock(sk); | ||
810 | continue; | 827 | continue; |
811 | } | 828 | } |
812 | current->state = TASK_RUNNING; | 829 | current->state = TASK_RUNNING; |
@@ -822,14 +839,19 @@ rose_try_next_neigh: | |||
822 | rose->neighbour = rose_get_neigh(&addr->srose_addr, &cause, &diagnostic); | 839 | rose->neighbour = rose_get_neigh(&addr->srose_addr, &cause, &diagnostic); |
823 | if (rose->neighbour) | 840 | if (rose->neighbour) |
824 | goto rose_try_next_neigh; | 841 | goto rose_try_next_neigh; |
825 | /* No more neighbour */ | 842 | |
843 | /* No more neighbours */ | ||
826 | sock->state = SS_UNCONNECTED; | 844 | sock->state = SS_UNCONNECTED; |
827 | return sock_error(sk); /* Always set at this point */ | 845 | err = sock_error(sk); /* Always set at this point */ |
846 | goto out_release; | ||
828 | } | 847 | } |
829 | 848 | ||
830 | sock->state = SS_CONNECTED; | 849 | sock->state = SS_CONNECTED; |
831 | 850 | ||
832 | return 0; | 851 | out_release: |
852 | release_sock(sk); | ||
853 | |||
854 | return err; | ||
833 | } | 855 | } |
834 | 856 | ||
835 | static int rose_accept(struct socket *sock, struct socket *newsock, int flags) | 857 | static int rose_accept(struct socket *sock, struct socket *newsock, int flags) |
@@ -877,6 +899,8 @@ static int rose_accept(struct socket *sock, struct socket *newsock, int flags) | |||
877 | lock_sock(sk); | 899 | lock_sock(sk); |
878 | continue; | 900 | continue; |
879 | } | 901 | } |
902 | current->state = TASK_RUNNING; | ||
903 | remove_wait_queue(sk->sk_sleep, &wait); | ||
880 | return -ERESTARTSYS; | 904 | return -ERESTARTSYS; |
881 | } | 905 | } |
882 | current->state = TASK_RUNNING; | 906 | current->state = TASK_RUNNING; |
diff --git a/net/wanrouter/af_wanpipe.c b/net/wanrouter/af_wanpipe.c deleted file mode 100644 index 41d7e32be70d..000000000000 --- a/net/wanrouter/af_wanpipe.c +++ /dev/null | |||
@@ -1,2600 +0,0 @@ | |||
1 | /***************************************************************************** | ||
2 | * af_wanpipe.c WANPIPE(tm) Secure Socket Layer. | ||
3 | * | ||
4 | * Author: Nenad Corbic <ncorbic@sangoma.com> | ||
5 | * | ||
6 | * Copyright: (c) 2000 Sangoma Technologies Inc. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License | ||
10 | * as published by the Free Software Foundation; either version | ||
11 | * 2 of the License, or (at your option) any later version. | ||
12 | * ============================================================================ | ||
13 | * Due Credit: | ||
14 | * Wanpipe socket layer is based on Packet and | ||
15 | * the X25 socket layers. The above sockets were | ||
16 | * used for the specific use of Sangoma Technologies | ||
17 | * API programs. | ||
18 | * Packet socket Authors: Ross Biro, Fred N. van Kempen and | ||
19 | * Alan Cox. | ||
20 | * X25 socket Author: Jonathan Naylor. | ||
21 | * ============================================================================ | ||
22 | * Mar 15, 2002 Arnaldo C. Melo o Use wp_sk()->num, as it isnt anymore in sock | ||
23 | * Apr 25, 2000 Nenad Corbic o Added the ability to send zero length packets. | ||
24 | * Mar 13, 2000 Nenad Corbic o Added a tx buffer check via ioctl call. | ||
25 | * Mar 06, 2000 Nenad Corbic o Fixed the corrupt sock lcn problem. | ||
26 | * Server and client application can run | ||
27 | * simultaneously without conflicts. | ||
28 | * Feb 29, 2000 Nenad Corbic o Added support for PVC protocols, such as | ||
29 | * CHDLC, Frame Relay and HDLC API. | ||
30 | * Jan 17, 2000 Nenad Corbic o Initial version, based on AF_PACKET socket. | ||
31 | * X25API support only. | ||
32 | * | ||
33 | ******************************************************************************/ | ||
34 | |||
35 | #include <linux/types.h> | ||
36 | #include <linux/sched.h> | ||
37 | #include <linux/mm.h> | ||
38 | #include <linux/capability.h> | ||
39 | #include <linux/fcntl.h> | ||
40 | #include <linux/socket.h> | ||
41 | #include <linux/in.h> | ||
42 | #include <linux/inet.h> | ||
43 | #include <linux/netdevice.h> | ||
44 | #include <linux/poll.h> | ||
45 | #include <linux/wireless.h> | ||
46 | #include <linux/kmod.h> | ||
47 | #include <net/ip.h> | ||
48 | #include <net/protocol.h> | ||
49 | #include <linux/skbuff.h> | ||
50 | #include <net/sock.h> | ||
51 | #include <linux/errno.h> | ||
52 | #include <linux/timer.h> | ||
53 | #include <asm/system.h> | ||
54 | #include <asm/uaccess.h> | ||
55 | #include <linux/module.h> | ||
56 | #include <linux/init.h> | ||
57 | #include <linux/if_wanpipe.h> | ||
58 | #include <linux/pkt_sched.h> | ||
59 | #include <linux/tcp_states.h> | ||
60 | #include <linux/if_wanpipe_common.h> | ||
61 | |||
62 | #ifdef CONFIG_INET | ||
63 | #include <net/inet_common.h> | ||
64 | #endif | ||
65 | |||
66 | #define SLOW_BACKOFF 0.1*HZ | ||
67 | #define FAST_BACKOFF 0.01*HZ | ||
68 | |||
69 | //#define PRINT_DEBUG | ||
70 | #ifdef PRINT_DEBUG | ||
71 | #define DBG_PRINTK(format, a...) printk(format, ## a) | ||
72 | #else | ||
73 | #define DBG_PRINTK(format, a...) | ||
74 | #endif | ||
75 | |||
76 | |||
77 | /* SECURE SOCKET IMPLEMENTATION | ||
78 | * | ||
79 | * TRANSMIT: | ||
80 | * | ||
81 | * When the user sends a packet via send() system call | ||
82 | * the wanpipe_sendmsg() function is executed. | ||
83 | * | ||
84 | * Each packet is enqueud into sk->sk_write_queue transmit | ||
85 | * queue. When the packet is enqueued, a delayed transmit | ||
86 | * timer is triggerd which acts as a Bottom Half hander. | ||
87 | * | ||
88 | * wanpipe_delay_transmit() function (BH), dequeues packets | ||
89 | * from the sk->sk_write_queue transmit queue and sends it | ||
90 | * to the deriver via dev->hard_start_xmit(skb, dev) function. | ||
91 | * Note, this function is actual a function pointer of if_send() | ||
92 | * routine in the wanpipe driver. | ||
93 | * | ||
94 | * X25API GUARANTEED DELIVERY: | ||
95 | * | ||
96 | * In order to provide 100% guaranteed packet delivery, | ||
97 | * an atomic 'packet_sent' counter is implemented. Counter | ||
98 | * is incremented for each packet enqueued | ||
99 | * into sk->sk_write_queue. Counter is decremented each | ||
100 | * time wanpipe_delayed_transmit() function successfuly | ||
101 | * passes the packet to the driver. Before each send(), a poll | ||
102 | * routine checks the sock resources The maximum value of | ||
103 | * packet sent counter is 1, thus if one packet is queued, the | ||
104 | * application will block until that packet is passed to the | ||
105 | * driver. | ||
106 | * | ||
107 | * RECEIVE: | ||
108 | * | ||
109 | * Wanpipe device drivers call the socket bottom half | ||
110 | * function, wanpipe_rcv() to queue the incoming packets | ||
111 | * into an AF_WANPIPE socket queue. Based on wanpipe_rcv() | ||
112 | * return code, the driver knows whether the packet was | ||
113 | * successfully queued. If the socket queue is full, | ||
114 | * protocol flow control is used by the driver, if any, | ||
115 | * to slow down the traffic until the sock queue is free. | ||
116 | * | ||
117 | * Every time a packet arrives into a socket queue the | ||
118 | * socket wakes up processes which are waiting to receive | ||
119 | * data. | ||
120 | * | ||
121 | * If the socket queue is full, the driver sets a block | ||
122 | * bit which signals the socket to kick the wanpipe driver | ||
123 | * bottom half hander when the socket queue is partialy | ||
124 | * empty. wanpipe_recvmsg() function performs this action. | ||
125 | * | ||
126 | * In case of x25api, packets will never be dropped, since | ||
127 | * flow control is available. | ||
128 | * | ||
129 | * In case of streaming protocols like CHDLC, packets will | ||
130 | * be dropped but the statistics will be generated. | ||
131 | */ | ||
132 | |||
133 | |||
134 | /* The code below is used to test memory leaks. It prints out | ||
135 | * a message every time kmalloc and kfree system calls get executed. | ||
136 | * If the calls match there is no leak :) | ||
137 | */ | ||
138 | |||
139 | /***********FOR DEBUGGING PURPOSES********************************************* | ||
140 | #define KMEM_SAFETYZONE 8 | ||
141 | |||
142 | static void * dbg_kmalloc(unsigned int size, int prio, int line) { | ||
143 | void * v = kmalloc(size,prio); | ||
144 | printk(KERN_INFO "line %d kmalloc(%d,%d) = %p\n",line,size,prio,v); | ||
145 | return v; | ||
146 | } | ||
147 | static void dbg_kfree(void * v, int line) { | ||
148 | printk(KERN_INFO "line %d kfree(%p)\n",line,v); | ||
149 | kfree(v); | ||
150 | } | ||
151 | |||
152 | #define kmalloc(x,y) dbg_kmalloc(x,y,__LINE__) | ||
153 | #define kfree(x) dbg_kfree(x,__LINE__) | ||
154 | ******************************************************************************/ | ||
155 | |||
156 | |||
157 | /* List of all wanpipe sockets. */ | ||
158 | HLIST_HEAD(wanpipe_sklist); | ||
159 | static DEFINE_RWLOCK(wanpipe_sklist_lock); | ||
160 | |||
161 | atomic_t wanpipe_socks_nr; | ||
162 | static unsigned long wanpipe_tx_critical; | ||
163 | |||
164 | #if 0 | ||
165 | /* Private wanpipe socket structures. */ | ||
166 | struct wanpipe_opt | ||
167 | { | ||
168 | void *mbox; /* Mail box */ | ||
169 | void *card; /* Card bouded to */ | ||
170 | struct net_device *dev; /* Bounded device */ | ||
171 | unsigned short lcn; /* Binded LCN */ | ||
172 | unsigned char svc; /* 0=pvc, 1=svc */ | ||
173 | unsigned char timer; /* flag for delayed transmit*/ | ||
174 | struct timer_list tx_timer; | ||
175 | unsigned poll_cnt; | ||
176 | unsigned char force; /* Used to force sock release */ | ||
177 | atomic_t packet_sent; | ||
178 | }; | ||
179 | #endif | ||
180 | |||
181 | static int sk_count; | ||
182 | extern const struct proto_ops wanpipe_ops; | ||
183 | static unsigned long find_free_critical; | ||
184 | |||
185 | static void wanpipe_unlink_driver(struct sock *sk); | ||
186 | static void wanpipe_link_driver(struct net_device *dev, struct sock *sk); | ||
187 | static void wanpipe_wakeup_driver(struct sock *sk); | ||
188 | static int execute_command(struct sock *, unsigned char, unsigned int); | ||
189 | static int check_dev(struct net_device *dev, sdla_t *card); | ||
190 | struct net_device *wanpipe_find_free_dev(sdla_t *card); | ||
191 | static void wanpipe_unlink_card (struct sock *); | ||
192 | static int wanpipe_link_card (struct sock *); | ||
193 | static struct sock *wanpipe_make_new(struct sock *); | ||
194 | static struct sock *wanpipe_alloc_socket(void); | ||
195 | static inline int get_atomic_device(struct net_device *dev); | ||
196 | static int wanpipe_exec_cmd(struct sock *, int, unsigned int); | ||
197 | static int get_ioctl_cmd (struct sock *, void *); | ||
198 | static int set_ioctl_cmd (struct sock *, void *); | ||
199 | static void release_device(struct net_device *dev); | ||
200 | static void wanpipe_kill_sock_timer (unsigned long data); | ||
201 | static void wanpipe_kill_sock_irq (struct sock *); | ||
202 | static void wanpipe_kill_sock_accept (struct sock *); | ||
203 | static int wanpipe_do_bind(struct sock *sk, struct net_device *dev, | ||
204 | int protocol); | ||
205 | struct sock * get_newsk_from_skb (struct sk_buff *); | ||
206 | static int wanpipe_debug (struct sock *, void *); | ||
207 | static void wanpipe_delayed_transmit (unsigned long data); | ||
208 | static void release_driver(struct sock *); | ||
209 | static void start_cleanup_timer (struct sock *); | ||
210 | static void check_write_queue(struct sock *); | ||
211 | static int check_driver_busy (struct sock *); | ||
212 | |||
213 | /*============================================================ | ||
214 | * wanpipe_rcv | ||
215 | * | ||
216 | * Wanpipe socket bottom half handler. This function | ||
217 | * is called by the WANPIPE device drivers to queue a | ||
218 | * incoming packet into the socket receive queue. | ||
219 | * Once the packet is queued, all processes waiting to | ||
220 | * read are woken up. | ||
221 | * | ||
222 | * During socket bind, this function is bounded into | ||
223 | * WANPIPE driver private. | ||
224 | *===========================================================*/ | ||
225 | |||
226 | static int wanpipe_rcv(struct sk_buff *skb, struct net_device *dev, | ||
227 | struct sock *sk) | ||
228 | { | ||
229 | struct wan_sockaddr_ll *sll = (struct wan_sockaddr_ll*)skb->cb; | ||
230 | wanpipe_common_t *chan = dev->priv; | ||
231 | /* | ||
232 | * When we registered the protocol we saved the socket in the data | ||
233 | * field for just this event. | ||
234 | */ | ||
235 | |||
236 | skb->dev = dev; | ||
237 | |||
238 | sll->sll_family = AF_WANPIPE; | ||
239 | sll->sll_hatype = dev->type; | ||
240 | sll->sll_protocol = skb->protocol; | ||
241 | sll->sll_pkttype = skb->pkt_type; | ||
242 | sll->sll_ifindex = dev->ifindex; | ||
243 | sll->sll_halen = 0; | ||
244 | |||
245 | if (dev->hard_header_parse) | ||
246 | sll->sll_halen = dev->hard_header_parse(skb, sll->sll_addr); | ||
247 | |||
248 | /* | ||
249 | * WAN_PACKET_DATA : Data which should be passed up the receive queue. | ||
250 | * WAN_PACKET_ASYC : Asynchronous data like place call, which should | ||
251 | * be passed up the listening sock. | ||
252 | * WAN_PACKET_ERR : Asynchronous data like clear call or restart | ||
253 | * which should go into an error queue. | ||
254 | */ | ||
255 | switch (skb->pkt_type){ | ||
256 | |||
257 | case WAN_PACKET_DATA: | ||
258 | if (sock_queue_rcv_skb(sk,skb)<0){ | ||
259 | return -ENOMEM; | ||
260 | } | ||
261 | break; | ||
262 | case WAN_PACKET_CMD: | ||
263 | sk->sk_state = chan->state; | ||
264 | /* Bug fix: update Mar6. | ||
265 | * Do not set the sock lcn number here, since | ||
266 | * cmd is not guaranteed to be executed on the | ||
267 | * board, thus Lcn could be wrong */ | ||
268 | sk->sk_data_ready(sk, skb->len); | ||
269 | kfree_skb(skb); | ||
270 | break; | ||
271 | case WAN_PACKET_ERR: | ||
272 | sk->sk_state = chan->state; | ||
273 | if (sock_queue_err_skb(sk,skb)<0){ | ||
274 | return -ENOMEM; | ||
275 | } | ||
276 | break; | ||
277 | default: | ||
278 | printk(KERN_INFO "wansock: BH Illegal Packet Type Dropping\n"); | ||
279 | kfree_skb(skb); | ||
280 | break; | ||
281 | } | ||
282 | |||
283 | //?????????????????????? | ||
284 | // if (sk->sk_state == WANSOCK_DISCONNECTED){ | ||
285 | // if (sk->sk_zapped) { | ||
286 | // //printk(KERN_INFO "wansock: Disconnected, killing early\n"); | ||
287 | // wanpipe_unlink_driver(sk); | ||
288 | // sk->sk_bound_dev_if = 0; | ||
289 | // } | ||
290 | // } | ||
291 | |||
292 | return 0; | ||
293 | } | ||
294 | |||
295 | /*============================================================ | ||
296 | * wanpipe_listen_rcv | ||
297 | * | ||
298 | * Wanpipe LISTEN socket bottom half handler. This function | ||
299 | * is called by the WANPIPE device drivers to queue an | ||
300 | * incoming call into the socket listening queue. | ||
301 | * Once the packet is queued, the waiting accept() process | ||
302 | * is woken up. | ||
303 | * | ||
304 | * During socket bind, this function is bounded into | ||
305 | * WANPIPE driver private. | ||
306 | * | ||
307 | * IMPORTANT NOTE: | ||
308 | * The accept call() is waiting for an skb packet | ||
309 | * which contains a pointer to a device structure. | ||
310 | * | ||
311 | * When we do a bind to a device structre, we | ||
312 | * bind a newly created socket into "chan->sk". Thus, | ||
313 | * when accept receives the skb packet, it will know | ||
314 | * from which dev it came form, and in turn it will know | ||
315 | * the address of the new sock. | ||
316 | * | ||
317 | * NOTE: This function gets called from driver ISR. | ||
318 | *===========================================================*/ | ||
319 | |||
320 | static int wanpipe_listen_rcv (struct sk_buff *skb, struct sock *sk) | ||
321 | { | ||
322 | wanpipe_opt *wp = wp_sk(sk), *newwp; | ||
323 | struct wan_sockaddr_ll *sll = (struct wan_sockaddr_ll*)skb->cb; | ||
324 | struct sock *newsk; | ||
325 | struct net_device *dev; | ||
326 | sdla_t *card; | ||
327 | mbox_cmd_t *mbox_ptr; | ||
328 | wanpipe_common_t *chan; | ||
329 | |||
330 | /* Find a free device, if none found, all svc's are busy | ||
331 | */ | ||
332 | |||
333 | card = (sdla_t*)wp->card; | ||
334 | if (!card){ | ||
335 | printk(KERN_INFO "wansock: LISTEN ERROR, No Card\n"); | ||
336 | return -ENODEV; | ||
337 | } | ||
338 | |||
339 | dev = wanpipe_find_free_dev(card); | ||
340 | if (!dev){ | ||
341 | printk(KERN_INFO "wansock: LISTEN ERROR, No Free Device\n"); | ||
342 | return -ENODEV; | ||
343 | } | ||
344 | |||
345 | chan=dev->priv; | ||
346 | chan->state = WANSOCK_CONNECTING; | ||
347 | |||
348 | /* Allocate a new sock, which accept will bind | ||
349 | * and pass up to the user | ||
350 | */ | ||
351 | if ((newsk = wanpipe_make_new(sk)) == NULL){ | ||
352 | release_device(dev); | ||
353 | return -ENOMEM; | ||
354 | } | ||
355 | |||
356 | |||
357 | /* Initialize the new sock structure | ||
358 | */ | ||
359 | newsk->sk_bound_dev_if = dev->ifindex; | ||
360 | newwp = wp_sk(newsk); | ||
361 | newwp->card = wp->card; | ||
362 | |||
363 | /* Insert the sock into the main wanpipe | ||
364 | * sock list. | ||
365 | */ | ||
366 | atomic_inc(&wanpipe_socks_nr); | ||
367 | |||
368 | /* Allocate and fill in the new Mail Box. Then | ||
369 | * bind the mail box to the sock. It will be | ||
370 | * used by the ioctl call to read call information | ||
371 | * and to execute commands. | ||
372 | */ | ||
373 | if ((mbox_ptr = kzalloc(sizeof(mbox_cmd_t), GFP_ATOMIC)) == NULL) { | ||
374 | wanpipe_kill_sock_irq (newsk); | ||
375 | release_device(dev); | ||
376 | return -ENOMEM; | ||
377 | } | ||
378 | memcpy(mbox_ptr,skb->data,skb->len); | ||
379 | |||
380 | /* Register the lcn on which incoming call came | ||
381 | * from. Thus, if we have to clear it, we know | ||
382 | * which lcn to clear | ||
383 | */ | ||
384 | |||
385 | newwp->lcn = mbox_ptr->cmd.lcn; | ||
386 | newwp->mbox = (void *)mbox_ptr; | ||
387 | |||
388 | DBG_PRINTK(KERN_INFO "NEWSOCK : Device %s, bind to lcn %i\n", | ||
389 | dev->name,mbox_ptr->cmd.lcn); | ||
390 | |||
391 | chan->lcn = mbox_ptr->cmd.lcn; | ||
392 | card->u.x.svc_to_dev_map[(chan->lcn%MAX_X25_LCN)] = dev; | ||
393 | |||
394 | sock_reset_flag(newsk, SOCK_ZAPPED); | ||
395 | newwp->num = htons(X25_PROT); | ||
396 | |||
397 | if (wanpipe_do_bind(newsk, dev, newwp->num)) { | ||
398 | wanpipe_kill_sock_irq (newsk); | ||
399 | release_device(dev); | ||
400 | return -EINVAL; | ||
401 | } | ||
402 | newsk->sk_state = WANSOCK_CONNECTING; | ||
403 | |||
404 | |||
405 | /* Fill in the standard sock address info */ | ||
406 | |||
407 | sll->sll_family = AF_WANPIPE; | ||
408 | sll->sll_hatype = dev->type; | ||
409 | sll->sll_protocol = skb->protocol; | ||
410 | sll->sll_pkttype = skb->pkt_type; | ||
411 | sll->sll_ifindex = dev->ifindex; | ||
412 | sll->sll_halen = 0; | ||
413 | |||
414 | skb->dev = dev; | ||
415 | sk->sk_ack_backlog++; | ||
416 | |||
417 | /* We must do this manually, since the sock_queue_rcv_skb() | ||
418 | * function sets the skb->dev to NULL. However, we use | ||
419 | * the dev field in the accept function.*/ | ||
420 | if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >= | ||
421 | (unsigned)sk->sk_rcvbuf) { | ||
422 | |||
423 | wanpipe_unlink_driver(newsk); | ||
424 | wanpipe_kill_sock_irq (newsk); | ||
425 | --sk->sk_ack_backlog; | ||
426 | return -ENOMEM; | ||
427 | } | ||
428 | |||
429 | skb_set_owner_r(skb, sk); | ||
430 | skb_queue_tail(&sk->sk_receive_queue, skb); | ||
431 | sk->sk_data_ready(sk, skb->len); | ||
432 | |||
433 | return 0; | ||
434 | } | ||
435 | |||
436 | |||
437 | |||
438 | /*============================================================ | ||
439 | * wanpipe_make_new | ||
440 | * | ||
441 | * Create a new sock, and allocate a wanpipe private | ||
442 | * structure to it. Also, copy the important data | ||
443 | * from the original sock to the new sock. | ||
444 | * | ||
445 | * This function is used by wanpipe_listen_rcv() listen | ||
446 | * bottom half handler. A copy of the listening sock | ||
447 | * is created using this function. | ||
448 | * | ||
449 | *===========================================================*/ | ||
450 | |||
451 | static struct sock *wanpipe_make_new(struct sock *osk) | ||
452 | { | ||
453 | struct sock *sk; | ||
454 | |||
455 | if (osk->sk_type != SOCK_RAW) | ||
456 | return NULL; | ||
457 | |||
458 | if ((sk = wanpipe_alloc_socket()) == NULL) | ||
459 | return NULL; | ||
460 | |||
461 | sk->sk_type = osk->sk_type; | ||
462 | sk->sk_socket = osk->sk_socket; | ||
463 | sk->sk_priority = osk->sk_priority; | ||
464 | sk->sk_protocol = osk->sk_protocol; | ||
465 | wp_sk(sk)->num = wp_sk(osk)->num; | ||
466 | sk->sk_rcvbuf = osk->sk_rcvbuf; | ||
467 | sk->sk_sndbuf = osk->sk_sndbuf; | ||
468 | sk->sk_state = WANSOCK_CONNECTING; | ||
469 | sk->sk_sleep = osk->sk_sleep; | ||
470 | |||
471 | if (sock_flag(osk, SOCK_DBG)) | ||
472 | sock_set_flag(sk, SOCK_DBG); | ||
473 | |||
474 | return sk; | ||
475 | } | ||
476 | |||
477 | /* | ||
478 | * FIXME: wanpipe_opt has to include a sock in its definition and stop using | ||
479 | * sk_protinfo, but this code is not even compilable now, so lets leave it for | ||
480 | * later. | ||
481 | */ | ||
482 | static struct proto wanpipe_proto = { | ||
483 | .name = "WANPIPE", | ||
484 | .owner = THIS_MODULE, | ||
485 | .obj_size = sizeof(struct sock), | ||
486 | }; | ||
487 | |||
488 | /*============================================================ | ||
489 | * wanpipe_make_new | ||
490 | * | ||
491 | * Allocate memory for the a new sock, and sock | ||
492 | * private data. | ||
493 | * | ||
494 | * Increment the module use count. | ||
495 | * | ||
496 | * This function is used by wanpipe_create() and | ||
497 | * wanpipe_make_new() functions. | ||
498 | * | ||
499 | *===========================================================*/ | ||
500 | |||
501 | static struct sock *wanpipe_alloc_socket(void) | ||
502 | { | ||
503 | struct sock *sk; | ||
504 | struct wanpipe_opt *wan_opt; | ||
505 | |||
506 | if ((sk = sk_alloc(PF_WANPIPE, GFP_ATOMIC, &wanpipe_proto, 1)) == NULL) | ||
507 | return NULL; | ||
508 | |||
509 | if ((wan_opt = kzalloc(sizeof(struct wanpipe_opt), GFP_ATOMIC)) == NULL) { | ||
510 | sk_free(sk); | ||
511 | return NULL; | ||
512 | } | ||
513 | |||
514 | wp_sk(sk) = wan_opt; | ||
515 | |||
516 | /* Use timer to send data to the driver. This will act | ||
517 | * as a BH handler for sendmsg functions */ | ||
518 | init_timer(&wan_opt->tx_timer); | ||
519 | wan_opt->tx_timer.data = (unsigned long)sk; | ||
520 | wan_opt->tx_timer.function = wanpipe_delayed_transmit; | ||
521 | |||
522 | sock_init_data(NULL, sk); | ||
523 | return sk; | ||
524 | } | ||
525 | |||
526 | |||
527 | /*============================================================ | ||
528 | * wanpipe_sendmsg | ||
529 | * | ||
530 | * This function implements a sendto() system call, | ||
531 | * for AF_WANPIPE socket family. | ||
532 | * During socket bind() sk->sk_bound_dev_if is initialized | ||
533 | * to a correct network device. This number is used | ||
534 | * to find a network device to which the packet should | ||
535 | * be passed to. | ||
536 | * | ||
537 | * Each packet is queued into sk->sk_write_queue and | ||
538 | * delayed transmit bottom half handler is marked for | ||
539 | * execution. | ||
540 | * | ||
541 | * A socket must be in WANSOCK_CONNECTED state before | ||
542 | * a packet is queued into sk->sk_write_queue. | ||
543 | *===========================================================*/ | ||
544 | |||
545 | static int wanpipe_sendmsg(struct kiocb *iocb, struct socket *sock, | ||
546 | struct msghdr *msg, int len) | ||
547 | { | ||
548 | wanpipe_opt *wp; | ||
549 | struct sock *sk = sock->sk; | ||
550 | struct wan_sockaddr_ll *saddr=(struct wan_sockaddr_ll *)msg->msg_name; | ||
551 | struct sk_buff *skb; | ||
552 | struct net_device *dev; | ||
553 | unsigned short proto; | ||
554 | unsigned char *addr; | ||
555 | int ifindex, err, reserve = 0; | ||
556 | |||
557 | |||
558 | if (!sock_flag(sk, SOCK_ZAPPED)) | ||
559 | return -ENETDOWN; | ||
560 | |||
561 | if (sk->sk_state != WANSOCK_CONNECTED) | ||
562 | return -ENOTCONN; | ||
563 | |||
564 | if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_CMSG_COMPAT)) | ||
565 | return(-EINVAL); | ||
566 | |||
567 | /* it was <=, now one can send | ||
568 | * zero length packets */ | ||
569 | if (len < sizeof(x25api_hdr_t)) | ||
570 | return -EINVAL; | ||
571 | |||
572 | wp = wp_sk(sk); | ||
573 | |||
574 | if (saddr == NULL) { | ||
575 | ifindex = sk->sk_bound_dev_if; | ||
576 | proto = wp->num; | ||
577 | addr = NULL; | ||
578 | |||
579 | }else{ | ||
580 | if (msg->msg_namelen < sizeof(struct wan_sockaddr_ll)){ | ||
581 | return -EINVAL; | ||
582 | } | ||
583 | |||
584 | ifindex = sk->sk_bound_dev_if; | ||
585 | proto = saddr->sll_protocol; | ||
586 | addr = saddr->sll_addr; | ||
587 | } | ||
588 | |||
589 | dev = dev_get_by_index(ifindex); | ||
590 | if (dev == NULL){ | ||
591 | printk(KERN_INFO "wansock: Send failed, dev index: %i\n",ifindex); | ||
592 | return -ENXIO; | ||
593 | } | ||
594 | dev_put(dev); | ||
595 | |||
596 | if (sock->type == SOCK_RAW) | ||
597 | reserve = dev->hard_header_len; | ||
598 | |||
599 | if (len > dev->mtu+reserve){ | ||
600 | return -EMSGSIZE; | ||
601 | } | ||
602 | |||
603 | skb = sock_alloc_send_skb(sk, len + LL_RESERVED_SPACE(dev), | ||
604 | msg->msg_flags & MSG_DONTWAIT, &err); | ||
605 | |||
606 | if (skb==NULL){ | ||
607 | goto out_unlock; | ||
608 | } | ||
609 | |||
610 | skb_reserve(skb, LL_RESERVED_SPACE(dev)); | ||
611 | skb->nh.raw = skb->data; | ||
612 | |||
613 | /* Returns -EFAULT on error */ | ||
614 | err = memcpy_fromiovec(skb_put(skb,len), msg->msg_iov, len); | ||
615 | if (err){ | ||
616 | goto out_free; | ||
617 | } | ||
618 | |||
619 | if (dev->hard_header) { | ||
620 | int res; | ||
621 | err = -EINVAL; | ||
622 | res = dev->hard_header(skb, dev, ntohs(proto), addr, NULL, len); | ||
623 | if (res<0){ | ||
624 | goto out_free; | ||
625 | } | ||
626 | } | ||
627 | |||
628 | skb->protocol = proto; | ||
629 | skb->dev = dev; | ||
630 | skb->priority = sk->sk_priority; | ||
631 | skb->pkt_type = WAN_PACKET_DATA; | ||
632 | |||
633 | err = -ENETDOWN; | ||
634 | if (!(dev->flags & IFF_UP)) | ||
635 | goto out_free; | ||
636 | |||
637 | if (atomic_read(&sk->sk_wmem_alloc) + skb->truesize > | ||
638 | (unsigned int)sk->sk_sndbuf){ | ||
639 | kfree_skb(skb); | ||
640 | return -ENOBUFS; | ||
641 | } | ||
642 | |||
643 | skb_queue_tail(&sk->sk_write_queue,skb); | ||
644 | atomic_inc(&wp->packet_sent); | ||
645 | |||
646 | if (!(test_and_set_bit(0, &wp->timer))) | ||
647 | mod_timer(&wp->tx_timer, jiffies + 1); | ||
648 | |||
649 | return(len); | ||
650 | |||
651 | out_free: | ||
652 | kfree_skb(skb); | ||
653 | out_unlock: | ||
654 | return err; | ||
655 | } | ||
656 | |||
657 | /*============================================================ | ||
658 | * wanpipe_delayed_tarnsmit | ||
659 | * | ||
660 | * Transmit bottom half handler. It dequeues packets | ||
661 | * from sk->sk_write_queue and passes them to the | ||
662 | * driver. If the driver is busy, the packet is | ||
663 | * re-enqueued. | ||
664 | * | ||
665 | * Packet Sent counter is decremented on successful | ||
666 | * transmission. | ||
667 | *===========================================================*/ | ||
668 | |||
669 | |||
670 | static void wanpipe_delayed_transmit (unsigned long data) | ||
671 | { | ||
672 | struct sock *sk=(struct sock *)data; | ||
673 | struct sk_buff *skb; | ||
674 | wanpipe_opt *wp = wp_sk(sk); | ||
675 | struct net_device *dev = wp->dev; | ||
676 | sdla_t *card = (sdla_t*)wp->card; | ||
677 | |||
678 | if (!card || !dev){ | ||
679 | clear_bit(0, &wp->timer); | ||
680 | DBG_PRINTK(KERN_INFO "wansock: Transmit delay, no dev or card\n"); | ||
681 | return; | ||
682 | } | ||
683 | |||
684 | if (sk->sk_state != WANSOCK_CONNECTED || !sock_flag(sk, SOCK_ZAPPED)) { | ||
685 | clear_bit(0, &wp->timer); | ||
686 | DBG_PRINTK(KERN_INFO "wansock: Tx Timer, State not CONNECTED\n"); | ||
687 | return; | ||
688 | } | ||
689 | |||
690 | /* If driver is executing command, we must offload | ||
691 | * the board by not sending data. Otherwise a | ||
692 | * pending command will never get a free buffer | ||
693 | * to execute */ | ||
694 | if (atomic_read(&card->u.x.command_busy)){ | ||
695 | wp->tx_timer.expires = jiffies + SLOW_BACKOFF; | ||
696 | add_timer(&wp->tx_timer); | ||
697 | DBG_PRINTK(KERN_INFO "wansock: Tx Timer, command bys BACKOFF\n"); | ||
698 | return; | ||
699 | } | ||
700 | |||
701 | |||
702 | if (test_and_set_bit(0,&wanpipe_tx_critical)){ | ||
703 | printk(KERN_INFO "WanSock: Tx timer critical %s\n",dev->name); | ||
704 | wp->tx_timer.expires = jiffies + SLOW_BACKOFF; | ||
705 | add_timer(&wp->tx_timer); | ||
706 | return; | ||
707 | } | ||
708 | |||
709 | /* Check for a packet in the fifo and send */ | ||
710 | if ((skb = skb_dequeue(&sk->sk_write_queue)) != NULL){ | ||
711 | |||
712 | if (dev->hard_start_xmit(skb, dev) != 0){ | ||
713 | |||
714 | /* Driver failed to transmit, re-enqueue | ||
715 | * the packet and retry again later */ | ||
716 | skb_queue_head(&sk->sk_write_queue,skb); | ||
717 | clear_bit(0,&wanpipe_tx_critical); | ||
718 | return; | ||
719 | }else{ | ||
720 | |||
721 | /* Packet Sent successful. Check for more packets | ||
722 | * if more packets, re-trigger the transmit routine | ||
723 | * other wise exit | ||
724 | */ | ||
725 | atomic_dec(&wp->packet_sent); | ||
726 | |||
727 | if (skb_peek(&sk->sk_write_queue) == NULL) { | ||
728 | /* If there is nothing to send, kick | ||
729 | * the poll routine, which will trigger | ||
730 | * the application to send more data */ | ||
731 | sk->sk_data_ready(sk, 0); | ||
732 | clear_bit(0, &wp->timer); | ||
733 | }else{ | ||
734 | /* Reschedule as fast as possible */ | ||
735 | wp->tx_timer.expires = jiffies + 1; | ||
736 | add_timer(&wp->tx_timer); | ||
737 | } | ||
738 | } | ||
739 | } | ||
740 | clear_bit(0,&wanpipe_tx_critical); | ||
741 | } | ||
742 | |||
743 | /*============================================================ | ||
744 | * execute_command | ||
745 | * | ||
746 | * Execute x25api commands. The atomic variable | ||
747 | * chan->command is used to indicate to the driver that | ||
748 | * command is pending for execution. The acutal command | ||
749 | * structure is placed into a sock mbox structure | ||
750 | * (wp_sk(sk)->mbox). | ||
751 | * | ||
752 | * The sock private structure, mbox is | ||
753 | * used as shared memory between sock and the driver. | ||
754 | * Driver uses the sock mbox to execute the command | ||
755 | * and return the result. | ||
756 | * | ||
757 | * For all command except PLACE CALL, the function | ||
758 | * waits for the result. PLACE CALL can be ether | ||
759 | * blocking or nonblocking. The user sets this option | ||
760 | * via ioctl call. | ||
761 | *===========================================================*/ | ||
762 | |||
763 | |||
764 | static int execute_command(struct sock *sk, unsigned char cmd, unsigned int flags) | ||
765 | { | ||
766 | wanpipe_opt *wp = wp_sk(sk); | ||
767 | struct net_device *dev; | ||
768 | wanpipe_common_t *chan=NULL; | ||
769 | int err=0; | ||
770 | DECLARE_WAITQUEUE(wait, current); | ||
771 | |||
772 | dev = dev_get_by_index(sk->sk_bound_dev_if); | ||
773 | if (dev == NULL){ | ||
774 | printk(KERN_INFO "wansock: Exec failed no dev %i\n", | ||
775 | sk->sk_bound_dev_if); | ||
776 | return -ENODEV; | ||
777 | } | ||
778 | dev_put(dev); | ||
779 | |||
780 | if ((chan=dev->priv) == NULL){ | ||
781 | printk(KERN_INFO "wansock: Exec cmd failed no priv area\n"); | ||
782 | return -ENODEV; | ||
783 | } | ||
784 | |||
785 | if (atomic_read(&chan->command)){ | ||
786 | printk(KERN_INFO "wansock: ERROR: Command already running %x, %s\n", | ||
787 | atomic_read(&chan->command),dev->name); | ||
788 | return -EINVAL; | ||
789 | } | ||
790 | |||
791 | if (!wp->mbox) { | ||
792 | printk(KERN_INFO "wansock: In execute without MBOX\n"); | ||
793 | return -EINVAL; | ||
794 | } | ||
795 | |||
796 | ((mbox_cmd_t*)wp->mbox)->cmd.command = cmd; | ||
797 | ((mbox_cmd_t*)wp->mbox)->cmd.lcn = wp->lcn; | ||
798 | ((mbox_cmd_t*)wp->mbox)->cmd.result = 0x7F; | ||
799 | |||
800 | |||
801 | if (flags & O_NONBLOCK){ | ||
802 | cmd |= 0x80; | ||
803 | atomic_set(&chan->command, cmd); | ||
804 | }else{ | ||
805 | atomic_set(&chan->command, cmd); | ||
806 | } | ||
807 | |||
808 | add_wait_queue(sk->sk_sleep,&wait); | ||
809 | current->state = TASK_INTERRUPTIBLE; | ||
810 | for (;;){ | ||
811 | if (((mbox_cmd_t*)wp->mbox)->cmd.result != 0x7F) { | ||
812 | err = 0; | ||
813 | break; | ||
814 | } | ||
815 | if (signal_pending(current)) { | ||
816 | err = -ERESTARTSYS; | ||
817 | break; | ||
818 | } | ||
819 | schedule(); | ||
820 | } | ||
821 | current->state = TASK_RUNNING; | ||
822 | remove_wait_queue(sk->sk_sleep,&wait); | ||
823 | |||
824 | return err; | ||
825 | } | ||
826 | |||
827 | /*============================================================ | ||
828 | * wanpipe_destroy_timer | ||
829 | * | ||
830 | * Used by wanpipe_release, to delay release of | ||
831 | * the socket. | ||
832 | *===========================================================*/ | ||
833 | |||
834 | static void wanpipe_destroy_timer(unsigned long data) | ||
835 | { | ||
836 | struct sock *sk=(struct sock *)data; | ||
837 | wanpipe_opt *wp = wp_sk(sk); | ||
838 | |||
839 | if ((!atomic_read(&sk->sk_wmem_alloc) && | ||
840 | !atomic_read(&sk->sk_rmem_alloc)) || | ||
841 | (++wp->force == 5)) { | ||
842 | |||
843 | if (atomic_read(&sk->sk_wmem_alloc) || | ||
844 | atomic_read(&sk->sk_rmem_alloc)) | ||
845 | printk(KERN_INFO "wansock: Warning, Packet Discarded due to sock shutdown!\n"); | ||
846 | |||
847 | kfree(wp); | ||
848 | wp_sk(sk) = NULL; | ||
849 | |||
850 | if (atomic_read(&sk->sk_refcnt) != 1) { | ||
851 | atomic_set(&sk->sk_refcnt, 1); | ||
852 | DBG_PRINTK(KERN_INFO "wansock: Error, wrong reference count: %i ! :delay.\n", | ||
853 | atomic_read(&sk->sk_refcnt)); | ||
854 | } | ||
855 | sock_put(sk); | ||
856 | atomic_dec(&wanpipe_socks_nr); | ||
857 | return; | ||
858 | } | ||
859 | |||
860 | sk->sk_timer.expires = jiffies + 5 * HZ; | ||
861 | add_timer(&sk->sk_timer); | ||
862 | printk(KERN_INFO "wansock: packet sk destroy delayed\n"); | ||
863 | } | ||
864 | |||
865 | /*============================================================ | ||
866 | * wanpipe_unlink_driver | ||
867 | * | ||
868 | * When the socket is released, this function is | ||
869 | * used to remove links that bind the sock and the | ||
870 | * driver together. | ||
871 | *===========================================================*/ | ||
872 | static void wanpipe_unlink_driver (struct sock *sk) | ||
873 | { | ||
874 | struct net_device *dev; | ||
875 | wanpipe_common_t *chan=NULL; | ||
876 | |||
877 | sock_reset_flag(sk, SOCK_ZAPPED); | ||
878 | sk->sk_state = WANSOCK_DISCONNECTED; | ||
879 | wp_sk(sk)->dev = NULL; | ||
880 | |||
881 | dev = dev_get_by_index(sk->sk_bound_dev_if); | ||
882 | if (!dev){ | ||
883 | printk(KERN_INFO "wansock: No dev on release\n"); | ||
884 | return; | ||
885 | } | ||
886 | dev_put(dev); | ||
887 | |||
888 | if ((chan = dev->priv) == NULL){ | ||
889 | printk(KERN_INFO "wansock: No Priv Area on release\n"); | ||
890 | return; | ||
891 | } | ||
892 | |||
893 | set_bit(0,&chan->common_critical); | ||
894 | chan->sk=NULL; | ||
895 | chan->func=NULL; | ||
896 | chan->mbox=NULL; | ||
897 | chan->tx_timer=NULL; | ||
898 | clear_bit(0,&chan->common_critical); | ||
899 | release_device(dev); | ||
900 | |||
901 | return; | ||
902 | } | ||
903 | |||
904 | /*============================================================ | ||
905 | * wanpipe_link_driver | ||
906 | * | ||
907 | * Upon successful bind(), sock is linked to a driver | ||
908 | * by binding in the wanpipe_rcv() bottom half handler | ||
909 | * to the driver function pointer, as well as sock and | ||
910 | * sock mailbox addresses. This way driver can pass | ||
911 | * data up the socket. | ||
912 | *===========================================================*/ | ||
913 | |||
914 | static void wanpipe_link_driver(struct net_device *dev, struct sock *sk) | ||
915 | { | ||
916 | wanpipe_opt *wp = wp_sk(sk); | ||
917 | wanpipe_common_t *chan = dev->priv; | ||
918 | if (!chan) | ||
919 | return; | ||
920 | set_bit(0,&chan->common_critical); | ||
921 | chan->sk=sk; | ||
922 | chan->func=wanpipe_rcv; | ||
923 | chan->mbox = wp->mbox; | ||
924 | chan->tx_timer = &wp->tx_timer; | ||
925 | wp->dev = dev; | ||
926 | sock_set_flag(sk, SOCK_ZAPPED); | ||
927 | clear_bit(0,&chan->common_critical); | ||
928 | } | ||
929 | |||
930 | |||
931 | /*============================================================ | ||
932 | * release_device | ||
933 | * | ||
934 | * During sock release, clear a critical bit, which | ||
935 | * marks the device a being taken. | ||
936 | *===========================================================*/ | ||
937 | |||
938 | |||
939 | static void release_device(struct net_device *dev) | ||
940 | { | ||
941 | wanpipe_common_t *chan=dev->priv; | ||
942 | clear_bit(0,(void*)&chan->rw_bind); | ||
943 | } | ||
944 | |||
945 | /*============================================================ | ||
946 | * wanpipe_release | ||
947 | * | ||
948 | * Close a PACKET socket. This is fairly simple. We | ||
949 | * immediately go to 'closed' state and remove our | ||
950 | * protocol entry in the device list. | ||
951 | *===========================================================*/ | ||
952 | |||
953 | static int wanpipe_release(struct socket *sock) | ||
954 | { | ||
955 | wanpipe_opt *wp; | ||
956 | struct sock *sk = sock->sk; | ||
957 | |||
958 | if (!sk) | ||
959 | return 0; | ||
960 | |||
961 | wp = wp_sk(sk); | ||
962 | check_write_queue(sk); | ||
963 | |||
964 | /* Kill the tx timer, if we don't kill it now, the timer | ||
965 | * will run after we kill the sock. Timer code will | ||
966 | * try to access the sock which has been killed and cause | ||
967 | * kernel panic */ | ||
968 | |||
969 | del_timer(&wp->tx_timer); | ||
970 | |||
971 | /* | ||
972 | * Unhook packet receive handler. | ||
973 | */ | ||
974 | |||
975 | if (wp->num == htons(X25_PROT) && | ||
976 | sk->sk_state != WANSOCK_DISCONNECTED && sock_flag(sk, SOCK_ZAPPED)) { | ||
977 | struct net_device *dev = dev_get_by_index(sk->sk_bound_dev_if); | ||
978 | wanpipe_common_t *chan; | ||
979 | if (dev){ | ||
980 | chan=dev->priv; | ||
981 | atomic_set(&chan->disconnect,1); | ||
982 | DBG_PRINTK(KERN_INFO "wansock: Sending Clear Indication %i\n", | ||
983 | sk->sk_state); | ||
984 | dev_put(dev); | ||
985 | } | ||
986 | } | ||
987 | |||
988 | set_bit(1,&wanpipe_tx_critical); | ||
989 | write_lock(&wanpipe_sklist_lock); | ||
990 | sk_del_node_init(sk); | ||
991 | write_unlock(&wanpipe_sklist_lock); | ||
992 | clear_bit(1,&wanpipe_tx_critical); | ||
993 | |||
994 | |||
995 | |||
996 | release_driver(sk); | ||
997 | |||
998 | |||
999 | /* | ||
1000 | * Now the socket is dead. No more input will appear. | ||
1001 | */ | ||
1002 | |||
1003 | sk->sk_state_change(sk); /* It is useless. Just for sanity. */ | ||
1004 | |||
1005 | sock->sk = NULL; | ||
1006 | sk->sk_socket = NULL; | ||
1007 | sock_set_flag(sk, SOCK_DEAD); | ||
1008 | |||
1009 | /* Purge queues */ | ||
1010 | skb_queue_purge(&sk->sk_receive_queue); | ||
1011 | skb_queue_purge(&sk->sk_write_queue); | ||
1012 | skb_queue_purge(&sk->sk_error_queue); | ||
1013 | |||
1014 | if (atomic_read(&sk->sk_rmem_alloc) || | ||
1015 | atomic_read(&sk->sk_wmem_alloc)) { | ||
1016 | del_timer(&sk->sk_timer); | ||
1017 | printk(KERN_INFO "wansock: Killing in Timer R %i , W %i\n", | ||
1018 | atomic_read(&sk->sk_rmem_alloc), | ||
1019 | atomic_read(&sk->sk_wmem_alloc)); | ||
1020 | sk->sk_timer.data = (unsigned long)sk; | ||
1021 | sk->sk_timer.expires = jiffies + HZ; | ||
1022 | sk->sk_timer.function = wanpipe_destroy_timer; | ||
1023 | add_timer(&sk->sk_timer); | ||
1024 | return 0; | ||
1025 | } | ||
1026 | |||
1027 | kfree(wp); | ||
1028 | wp_sk(sk) = NULL; | ||
1029 | |||
1030 | if (atomic_read(&sk->sk_refcnt) != 1) { | ||
1031 | DBG_PRINTK(KERN_INFO "wansock: Error, wrong reference count: %i !:release.\n", | ||
1032 | atomic_read(&sk->sk_refcnt)); | ||
1033 | atomic_set(&sk->sk_refcnt, 1); | ||
1034 | } | ||
1035 | sock_put(sk); | ||
1036 | atomic_dec(&wanpipe_socks_nr); | ||
1037 | return 0; | ||
1038 | } | ||
1039 | |||
1040 | /*============================================================ | ||
1041 | * check_write_queue | ||
1042 | * | ||
1043 | * During sock shutdown, if the sock state is | ||
1044 | * WANSOCK_CONNECTED and there is transmit data | ||
1045 | * pending. Wait until data is released | ||
1046 | * before proceeding. | ||
1047 | *===========================================================*/ | ||
1048 | |||
1049 | static void check_write_queue(struct sock *sk) | ||
1050 | { | ||
1051 | |||
1052 | if (sk->sk_state != WANSOCK_CONNECTED) | ||
1053 | return; | ||
1054 | |||
1055 | if (!atomic_read(&sk->sk_wmem_alloc)) | ||
1056 | return; | ||
1057 | |||
1058 | printk(KERN_INFO "wansock: MAJOR ERROR, Data lost on sock release !!!\n"); | ||
1059 | |||
1060 | } | ||
1061 | |||
1062 | /*============================================================ | ||
1063 | * release_driver | ||
1064 | * | ||
1065 | * This function is called during sock shutdown, to | ||
1066 | * release any resources and links that bind the sock | ||
1067 | * to the driver. It also changes the state of the | ||
1068 | * sock to WANSOCK_DISCONNECTED | ||
1069 | *===========================================================*/ | ||
1070 | |||
1071 | static void release_driver(struct sock *sk) | ||
1072 | { | ||
1073 | wanpipe_opt *wp; | ||
1074 | struct sk_buff *skb=NULL; | ||
1075 | struct sock *deadsk=NULL; | ||
1076 | |||
1077 | if (sk->sk_state == WANSOCK_LISTEN || | ||
1078 | sk->sk_state == WANSOCK_BIND_LISTEN) { | ||
1079 | while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) { | ||
1080 | if ((deadsk = get_newsk_from_skb(skb))){ | ||
1081 | DBG_PRINTK (KERN_INFO "wansock: RELEASE: FOUND DEAD SOCK\n"); | ||
1082 | sock_set_flag(deadsk, SOCK_DEAD); | ||
1083 | start_cleanup_timer(deadsk); | ||
1084 | } | ||
1085 | kfree_skb(skb); | ||
1086 | } | ||
1087 | if (sock_flag(sk, SOCK_ZAPPED)) | ||
1088 | wanpipe_unlink_card(sk); | ||
1089 | }else{ | ||
1090 | if (sock_flag(sk, SOCK_ZAPPED)) | ||
1091 | wanpipe_unlink_driver(sk); | ||
1092 | } | ||
1093 | sk->sk_state = WANSOCK_DISCONNECTED; | ||
1094 | sk->sk_bound_dev_if = 0; | ||
1095 | sock_reset_flag(sk, SOCK_ZAPPED); | ||
1096 | wp = wp_sk(sk); | ||
1097 | |||
1098 | if (wp) { | ||
1099 | kfree(wp->mbox); | ||
1100 | wp->mbox = NULL; | ||
1101 | } | ||
1102 | } | ||
1103 | |||
1104 | /*============================================================ | ||
1105 | * start_cleanup_timer | ||
1106 | * | ||
1107 | * If new incoming call's are pending but the socket | ||
1108 | * is being released, start the timer which will | ||
1109 | * envoke the kill routines for pending socks. | ||
1110 | *===========================================================*/ | ||
1111 | |||
1112 | |||
1113 | static void start_cleanup_timer (struct sock *sk) | ||
1114 | { | ||
1115 | del_timer(&sk->sk_timer); | ||
1116 | sk->sk_timer.data = (unsigned long)sk; | ||
1117 | sk->sk_timer.expires = jiffies + HZ; | ||
1118 | sk->sk_timer.function = wanpipe_kill_sock_timer; | ||
1119 | add_timer(&sk->sk_timer); | ||
1120 | } | ||
1121 | |||
1122 | |||
1123 | /*============================================================ | ||
1124 | * wanpipe_kill_sock | ||
1125 | * | ||
1126 | * This is a function which performs actual killing | ||
1127 | * of the sock. It releases socket resources, | ||
1128 | * and unlinks the sock from the driver. | ||
1129 | *===========================================================*/ | ||
1130 | |||
1131 | static void wanpipe_kill_sock_timer (unsigned long data) | ||
1132 | { | ||
1133 | |||
1134 | struct sock *sk = (struct sock *)data; | ||
1135 | struct sock **skp; | ||
1136 | |||
1137 | if (!sk) | ||
1138 | return; | ||
1139 | |||
1140 | /* This function can be called from interrupt. We must use | ||
1141 | * appropriate locks */ | ||
1142 | |||
1143 | if (test_bit(1,&wanpipe_tx_critical)){ | ||
1144 | sk->sk_timer.expires = jiffies + 10; | ||
1145 | add_timer(&sk->sk_timer); | ||
1146 | return; | ||
1147 | } | ||
1148 | |||
1149 | write_lock(&wanpipe_sklist_lock); | ||
1150 | sk_del_node_init(sk); | ||
1151 | write_unlock(&wanpipe_sklist_lock); | ||
1152 | |||
1153 | |||
1154 | if (wp_sk(sk)->num == htons(X25_PROT) && | ||
1155 | sk->sk_state != WANSOCK_DISCONNECTED) { | ||
1156 | struct net_device *dev = dev_get_by_index(sk->sk_bound_dev_if); | ||
1157 | wanpipe_common_t *chan; | ||
1158 | if (dev){ | ||
1159 | chan=dev->priv; | ||
1160 | atomic_set(&chan->disconnect,1); | ||
1161 | dev_put(dev); | ||
1162 | } | ||
1163 | } | ||
1164 | |||
1165 | release_driver(sk); | ||
1166 | |||
1167 | sk->sk_socket = NULL; | ||
1168 | |||
1169 | /* Purge queues */ | ||
1170 | skb_queue_purge(&sk->sk_receive_queue); | ||
1171 | skb_queue_purge(&sk->sk_write_queue); | ||
1172 | skb_queue_purge(&sk->sk_error_queue); | ||
1173 | |||
1174 | if (atomic_read(&sk->sk_rmem_alloc) || | ||
1175 | atomic_read(&sk->sk_wmem_alloc)) { | ||
1176 | del_timer(&sk->sk_timer); | ||
1177 | printk(KERN_INFO "wansock: Killing SOCK in Timer\n"); | ||
1178 | sk->sk_timer.data = (unsigned long)sk; | ||
1179 | sk->sk_timer.expires = jiffies + HZ; | ||
1180 | sk->sk_timer.function = wanpipe_destroy_timer; | ||
1181 | add_timer(&sk->sk_timer); | ||
1182 | return; | ||
1183 | } | ||
1184 | |||
1185 | kfree(wp_sk(sk)); | ||
1186 | wp_sk(sk) = NULL; | ||
1187 | |||
1188 | if (atomic_read(&sk->sk_refcnt) != 1) { | ||
1189 | atomic_set(&sk->sk_refcnt, 1); | ||
1190 | DBG_PRINTK(KERN_INFO "wansock: Error, wrong reference count: %i ! :timer.\n", | ||
1191 | atomic_read(&sk->sk_refcnt)); | ||
1192 | } | ||
1193 | sock_put(sk); | ||
1194 | atomic_dec(&wanpipe_socks_nr); | ||
1195 | return; | ||
1196 | } | ||
1197 | |||
1198 | static void wanpipe_kill_sock_accept (struct sock *sk) | ||
1199 | { | ||
1200 | |||
1201 | struct sock **skp; | ||
1202 | |||
1203 | if (!sk) | ||
1204 | return; | ||
1205 | |||
1206 | /* This function can be called from interrupt. We must use | ||
1207 | * appropriate locks */ | ||
1208 | |||
1209 | write_lock(&wanpipe_sklist_lock); | ||
1210 | sk_del_node_init(sk); | ||
1211 | write_unlock(&wanpipe_sklist_lock); | ||
1212 | |||
1213 | sk->sk_socket = NULL; | ||
1214 | |||
1215 | |||
1216 | kfree(wp_sk(sk)); | ||
1217 | wp_sk(sk) = NULL; | ||
1218 | |||
1219 | if (atomic_read(&sk->sk_refcnt) != 1) { | ||
1220 | atomic_set(&sk->sk_refcnt, 1); | ||
1221 | DBG_PRINTK(KERN_INFO "wansock: Error, wrong reference count: %i ! :timer.\n", | ||
1222 | atomic_read(&sk->sk_refcnt)); | ||
1223 | } | ||
1224 | sock_put(sk); | ||
1225 | atomic_dec(&wanpipe_socks_nr); | ||
1226 | return; | ||
1227 | } | ||
1228 | |||
1229 | |||
1230 | static void wanpipe_kill_sock_irq (struct sock *sk) | ||
1231 | { | ||
1232 | |||
1233 | if (!sk) | ||
1234 | return; | ||
1235 | |||
1236 | sk->sk_socket = NULL; | ||
1237 | |||
1238 | kfree(wp_sk(sk)); | ||
1239 | wp_sk(sk) = NULL; | ||
1240 | |||
1241 | if (atomic_read(&sk->sk_refcnt) != 1) { | ||
1242 | atomic_set(&sk->sk_refcnt, 1); | ||
1243 | DBG_PRINTK(KERN_INFO "wansock: Error, wrong reference count: %i !:listen.\n", | ||
1244 | atomic_read(&sk->sk_refcnt)); | ||
1245 | } | ||
1246 | sock_put(sk); | ||
1247 | atomic_dec(&wanpipe_socks_nr); | ||
1248 | } | ||
1249 | |||
1250 | |||
1251 | /*============================================================ | ||
1252 | * wanpipe_do_bind | ||
1253 | * | ||
1254 | * Bottom half of the binding system call. | ||
1255 | * Once the wanpipe_bind() function checks the | ||
1256 | * legality of the call, this function binds the | ||
1257 | * sock to the driver. | ||
1258 | *===========================================================*/ | ||
1259 | |||
1260 | static int wanpipe_do_bind(struct sock *sk, struct net_device *dev, | ||
1261 | int protocol) | ||
1262 | { | ||
1263 | wanpipe_opt *wp = wp_sk(sk); | ||
1264 | wanpipe_common_t *chan=NULL; | ||
1265 | int err=0; | ||
1266 | |||
1267 | if (sock_flag(sk, SOCK_ZAPPED)) { | ||
1268 | err = -EALREADY; | ||
1269 | goto bind_unlock_exit; | ||
1270 | } | ||
1271 | |||
1272 | wp->num = protocol; | ||
1273 | |||
1274 | if (protocol == 0){ | ||
1275 | release_device(dev); | ||
1276 | err = -EINVAL; | ||
1277 | goto bind_unlock_exit; | ||
1278 | } | ||
1279 | |||
1280 | if (dev) { | ||
1281 | if (dev->flags&IFF_UP) { | ||
1282 | chan=dev->priv; | ||
1283 | sk->sk_state = chan->state; | ||
1284 | |||
1285 | if (wp->num == htons(X25_PROT) && | ||
1286 | sk->sk_state != WANSOCK_DISCONNECTED && | ||
1287 | sk->sk_state != WANSOCK_CONNECTING) { | ||
1288 | DBG_PRINTK(KERN_INFO | ||
1289 | "wansock: Binding to Device not DISCONNECTED %i\n", | ||
1290 | sk->sk_state); | ||
1291 | release_device(dev); | ||
1292 | err = -EAGAIN; | ||
1293 | goto bind_unlock_exit; | ||
1294 | } | ||
1295 | |||
1296 | wanpipe_link_driver(dev,sk); | ||
1297 | sk->sk_bound_dev_if = dev->ifindex; | ||
1298 | |||
1299 | /* X25 Specific option */ | ||
1300 | if (wp->num == htons(X25_PROT)) | ||
1301 | wp_sk(sk)->svc = chan->svc; | ||
1302 | |||
1303 | } else { | ||
1304 | sk->sk_err = ENETDOWN; | ||
1305 | sk->sk_error_report(sk); | ||
1306 | release_device(dev); | ||
1307 | err = -EINVAL; | ||
1308 | } | ||
1309 | } else { | ||
1310 | err = -ENODEV; | ||
1311 | } | ||
1312 | bind_unlock_exit: | ||
1313 | /* FIXME where is this lock */ | ||
1314 | |||
1315 | return err; | ||
1316 | } | ||
1317 | |||
1318 | /*============================================================ | ||
1319 | * wanpipe_bind | ||
1320 | * | ||
1321 | * BIND() System call, which is bound to the AF_WANPIPE | ||
1322 | * operations structure. It checks for correct wanpipe | ||
1323 | * card name, and cross references interface names with | ||
1324 | * the card names. Thus, interface name must belong to | ||
1325 | * the actual card. | ||
1326 | *===========================================================*/ | ||
1327 | |||
1328 | |||
1329 | static int wanpipe_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | ||
1330 | { | ||
1331 | struct wan_sockaddr_ll *sll = (struct wan_sockaddr_ll*)uaddr; | ||
1332 | struct sock *sk=sock->sk; | ||
1333 | wanpipe_opt *wp = wp_sk(sk); | ||
1334 | struct net_device *dev = NULL; | ||
1335 | sdla_t *card=NULL; | ||
1336 | char name[15]; | ||
1337 | |||
1338 | /* | ||
1339 | * Check legality | ||
1340 | */ | ||
1341 | |||
1342 | if (addr_len < sizeof(struct wan_sockaddr_ll)){ | ||
1343 | printk(KERN_INFO "wansock: Address length error\n"); | ||
1344 | return -EINVAL; | ||
1345 | } | ||
1346 | if (sll->sll_family != AF_WANPIPE){ | ||
1347 | printk(KERN_INFO "wansock: Illegal family name specified.\n"); | ||
1348 | return -EINVAL; | ||
1349 | } | ||
1350 | |||
1351 | card = wanpipe_find_card (sll->sll_card); | ||
1352 | if (!card){ | ||
1353 | printk(KERN_INFO "wansock: Wanpipe card not found: %s\n",sll->sll_card); | ||
1354 | return -ENODEV; | ||
1355 | }else{ | ||
1356 | wp_sk(sk)->card = (void *)card; | ||
1357 | } | ||
1358 | |||
1359 | if (!strcmp(sll->sll_device,"svc_listen")){ | ||
1360 | |||
1361 | /* Bind a sock to a card structure for listening | ||
1362 | */ | ||
1363 | int err=0; | ||
1364 | |||
1365 | /* This is x25 specific area if protocol doesn't | ||
1366 | * match, return error */ | ||
1367 | if (sll->sll_protocol != htons(X25_PROT)) | ||
1368 | return -EINVAL; | ||
1369 | |||
1370 | err= wanpipe_link_card (sk); | ||
1371 | if (err < 0) | ||
1372 | return err; | ||
1373 | |||
1374 | if (sll->sll_protocol) | ||
1375 | wp->num = sll->sll_protocol; | ||
1376 | sk->sk_state = WANSOCK_BIND_LISTEN; | ||
1377 | return 0; | ||
1378 | |||
1379 | }else if (!strcmp(sll->sll_device,"svc_connect")){ | ||
1380 | |||
1381 | /* This is x25 specific area if protocol doesn't | ||
1382 | * match, return error */ | ||
1383 | if (sll->sll_protocol != htons(X25_PROT)) | ||
1384 | return -EINVAL; | ||
1385 | |||
1386 | /* Find a free device | ||
1387 | */ | ||
1388 | dev = wanpipe_find_free_dev(card); | ||
1389 | if (dev == NULL){ | ||
1390 | DBG_PRINTK(KERN_INFO "wansock: No free network devices for card %s\n", | ||
1391 | card->devname); | ||
1392 | return -EINVAL; | ||
1393 | } | ||
1394 | }else{ | ||
1395 | /* Bind a socket to a interface name | ||
1396 | * This is used by PVC mostly | ||
1397 | */ | ||
1398 | strlcpy(name,sll->sll_device,sizeof(name)); | ||
1399 | dev = dev_get_by_name(name); | ||
1400 | if (dev == NULL){ | ||
1401 | printk(KERN_INFO "wansock: Failed to get Dev from name: %s,\n", | ||
1402 | name); | ||
1403 | return -ENODEV; | ||
1404 | } | ||
1405 | |||
1406 | dev_put(dev); | ||
1407 | |||
1408 | if (check_dev(dev, card)){ | ||
1409 | printk(KERN_INFO "wansock: Device %s, doesn't belong to card %s\n", | ||
1410 | dev->name, card->devname); | ||
1411 | return -EINVAL; | ||
1412 | } | ||
1413 | if (get_atomic_device (dev)) | ||
1414 | return -EINVAL; | ||
1415 | } | ||
1416 | |||
1417 | return wanpipe_do_bind(sk, dev, sll->sll_protocol ? : wp->num); | ||
1418 | } | ||
1419 | |||
1420 | /*============================================================ | ||
1421 | * get_atomic_device | ||
1422 | * | ||
1423 | * Sets a bit atomically which indicates that | ||
1424 | * the interface is taken. This avoids race conditions. | ||
1425 | *===========================================================*/ | ||
1426 | |||
1427 | |||
1428 | static inline int get_atomic_device(struct net_device *dev) | ||
1429 | { | ||
1430 | wanpipe_common_t *chan = dev->priv; | ||
1431 | if (!test_and_set_bit(0,(void *)&chan->rw_bind)){ | ||
1432 | return 0; | ||
1433 | } | ||
1434 | return 1; | ||
1435 | } | ||
1436 | |||
1437 | /*============================================================ | ||
1438 | * check_dev | ||
1439 | * | ||
1440 | * Check that device name belongs to a particular card. | ||
1441 | *===========================================================*/ | ||
1442 | |||
1443 | static int check_dev(struct net_device *dev, sdla_t *card) | ||
1444 | { | ||
1445 | struct net_device* tmp_dev; | ||
1446 | |||
1447 | for (tmp_dev = card->wandev.dev; tmp_dev; | ||
1448 | tmp_dev = *((struct net_device **)tmp_dev->priv)) { | ||
1449 | if (tmp_dev->ifindex == dev->ifindex){ | ||
1450 | return 0; | ||
1451 | } | ||
1452 | } | ||
1453 | return 1; | ||
1454 | } | ||
1455 | |||
1456 | /*============================================================ | ||
1457 | * wanpipe_find_free_dev | ||
1458 | * | ||
1459 | * Find a free network interface. If found set atomic | ||
1460 | * bit indicating that the interface is taken. | ||
1461 | * X25API Specific. | ||
1462 | *===========================================================*/ | ||
1463 | |||
1464 | struct net_device *wanpipe_find_free_dev(sdla_t *card) | ||
1465 | { | ||
1466 | struct net_device* dev; | ||
1467 | volatile wanpipe_common_t *chan; | ||
1468 | |||
1469 | if (test_and_set_bit(0,&find_free_critical)){ | ||
1470 | printk(KERN_INFO "CRITICAL in Find Free\n"); | ||
1471 | } | ||
1472 | |||
1473 | for (dev = card->wandev.dev; dev; | ||
1474 | dev = *((struct net_device **)dev->priv)) { | ||
1475 | chan = dev->priv; | ||
1476 | if (!chan) | ||
1477 | continue; | ||
1478 | if (chan->usedby == API && chan->svc){ | ||
1479 | if (!get_atomic_device (dev)){ | ||
1480 | if (chan->state != WANSOCK_DISCONNECTED){ | ||
1481 | release_device(dev); | ||
1482 | }else{ | ||
1483 | clear_bit(0,&find_free_critical); | ||
1484 | return dev; | ||
1485 | } | ||
1486 | } | ||
1487 | } | ||
1488 | } | ||
1489 | clear_bit(0,&find_free_critical); | ||
1490 | return NULL; | ||
1491 | } | ||
1492 | |||
1493 | /*============================================================ | ||
1494 | * wanpipe_create | ||
1495 | * | ||
1496 | * SOCKET() System call. It allocates a sock structure | ||
1497 | * and adds the socket to the wanpipe_sk_list. | ||
1498 | * Crates AF_WANPIPE socket. | ||
1499 | *===========================================================*/ | ||
1500 | |||
1501 | static int wanpipe_create(struct socket *sock, int protocol) | ||
1502 | { | ||
1503 | struct sock *sk; | ||
1504 | |||
1505 | //FIXME: This checks for root user, SECURITY ? | ||
1506 | //if (!capable(CAP_NET_RAW)) | ||
1507 | // return -EPERM; | ||
1508 | |||
1509 | if (sock->type != SOCK_DGRAM && sock->type != SOCK_RAW) | ||
1510 | return -ESOCKTNOSUPPORT; | ||
1511 | |||
1512 | sock->state = SS_UNCONNECTED; | ||
1513 | |||
1514 | if ((sk = wanpipe_alloc_socket()) == NULL) | ||
1515 | return -ENOBUFS; | ||
1516 | |||
1517 | sk->sk_reuse = 1; | ||
1518 | sock->ops = &wanpipe_ops; | ||
1519 | sock_init_data(sock,sk); | ||
1520 | |||
1521 | sock_reset_flag(sk, SOCK_ZAPPED); | ||
1522 | sk->sk_family = PF_WANPIPE; | ||
1523 | wp_sk(sk)->num = protocol; | ||
1524 | sk->sk_state = WANSOCK_DISCONNECTED; | ||
1525 | sk->sk_ack_backlog = 0; | ||
1526 | sk->sk_bound_dev_if = 0; | ||
1527 | |||
1528 | atomic_inc(&wanpipe_socks_nr); | ||
1529 | |||
1530 | /* We must disable interrupts because the ISR | ||
1531 | * can also change the list */ | ||
1532 | set_bit(1,&wanpipe_tx_critical); | ||
1533 | write_lock(&wanpipe_sklist_lock); | ||
1534 | sk_add_node(sk, &wanpipe_sklist); | ||
1535 | write_unlock(&wanpipe_sklist_lock); | ||
1536 | clear_bit(1,&wanpipe_tx_critical); | ||
1537 | |||
1538 | return(0); | ||
1539 | } | ||
1540 | |||
1541 | |||
1542 | /*============================================================ | ||
1543 | * wanpipe_recvmsg | ||
1544 | * | ||
1545 | * Pull a packet from our receive queue and hand it | ||
1546 | * to the user. If necessary we block. | ||
1547 | *===========================================================*/ | ||
1548 | |||
1549 | static int wanpipe_recvmsg(struct kiocb *iocb, struct socket *sock, | ||
1550 | struct msghdr *msg, int len, int flags) | ||
1551 | { | ||
1552 | struct sock *sk = sock->sk; | ||
1553 | struct sk_buff *skb; | ||
1554 | int copied, err=-ENOBUFS; | ||
1555 | |||
1556 | |||
1557 | /* | ||
1558 | * If the address length field is there to be filled in, we fill | ||
1559 | * it in now. | ||
1560 | */ | ||
1561 | |||
1562 | msg->msg_namelen = sizeof(struct wan_sockaddr_ll); | ||
1563 | |||
1564 | /* | ||
1565 | * Call the generic datagram receiver. This handles all sorts | ||
1566 | * of horrible races and re-entrancy so we can forget about it | ||
1567 | * in the protocol layers. | ||
1568 | * | ||
1569 | * Now it will return ENETDOWN, if device have just gone down, | ||
1570 | * but then it will block. | ||
1571 | */ | ||
1572 | |||
1573 | if (flags & MSG_OOB){ | ||
1574 | skb = skb_dequeue(&sk->sk_error_queue); | ||
1575 | }else{ | ||
1576 | skb=skb_recv_datagram(sk,flags,1,&err); | ||
1577 | } | ||
1578 | /* | ||
1579 | * An error occurred so return it. Because skb_recv_datagram() | ||
1580 | * handles the blocking we don't see and worry about blocking | ||
1581 | * retries. | ||
1582 | */ | ||
1583 | |||
1584 | if(skb==NULL) | ||
1585 | goto out; | ||
1586 | |||
1587 | /* | ||
1588 | * You lose any data beyond the buffer you gave. If it worries a | ||
1589 | * user program they can ask the device for its MTU anyway. | ||
1590 | */ | ||
1591 | |||
1592 | copied = skb->len; | ||
1593 | if (copied > len) | ||
1594 | { | ||
1595 | copied=len; | ||
1596 | msg->msg_flags|=MSG_TRUNC; | ||
1597 | } | ||
1598 | |||
1599 | wanpipe_wakeup_driver(sk); | ||
1600 | |||
1601 | /* We can't use skb_copy_datagram here */ | ||
1602 | err = memcpy_toiovec(msg->msg_iov, skb->data, copied); | ||
1603 | if (err) | ||
1604 | goto out_free; | ||
1605 | |||
1606 | sock_recv_timestamp(msg, sk, skb); | ||
1607 | |||
1608 | if (msg->msg_name) | ||
1609 | memcpy(msg->msg_name, skb->cb, msg->msg_namelen); | ||
1610 | |||
1611 | /* | ||
1612 | * Free or return the buffer as appropriate. Again this | ||
1613 | * hides all the races and re-entrancy issues from us. | ||
1614 | */ | ||
1615 | err = (flags&MSG_TRUNC) ? skb->len : copied; | ||
1616 | |||
1617 | out_free: | ||
1618 | skb_free_datagram(sk, skb); | ||
1619 | out: | ||
1620 | return err; | ||
1621 | } | ||
1622 | |||
1623 | |||
1624 | /*============================================================ | ||
1625 | * wanpipe_wakeup_driver | ||
1626 | * | ||
1627 | * If socket receive buffer is full and driver cannot | ||
1628 | * pass data up the sock, it sets a packet_block flag. | ||
1629 | * This function check that flag and if sock receive | ||
1630 | * queue has room it kicks the driver BH handler. | ||
1631 | * | ||
1632 | * This way, driver doesn't have to poll the sock | ||
1633 | * receive queue. | ||
1634 | *===========================================================*/ | ||
1635 | |||
1636 | static void wanpipe_wakeup_driver(struct sock *sk) | ||
1637 | { | ||
1638 | struct net_device *dev = NULL; | ||
1639 | wanpipe_common_t *chan=NULL; | ||
1640 | |||
1641 | dev = dev_get_by_index(sk->sk_bound_dev_if); | ||
1642 | if (!dev) | ||
1643 | return; | ||
1644 | |||
1645 | dev_put(dev); | ||
1646 | |||
1647 | if ((chan = dev->priv) == NULL) | ||
1648 | return; | ||
1649 | |||
1650 | if (atomic_read(&chan->receive_block)){ | ||
1651 | if (atomic_read(&sk->sk_rmem_alloc) < | ||
1652 | ((unsigned)sk->sk_rcvbuf * 0.9)) { | ||
1653 | printk(KERN_INFO "wansock: Queuing task for wanpipe\n"); | ||
1654 | atomic_set(&chan->receive_block,0); | ||
1655 | wanpipe_queue_tq(&chan->wanpipe_task); | ||
1656 | wanpipe_mark_bh(); | ||
1657 | } | ||
1658 | } | ||
1659 | } | ||
1660 | |||
1661 | /*============================================================ | ||
1662 | * wanpipe_getname | ||
1663 | * | ||
1664 | * I don't know what to do with this yet. | ||
1665 | * User can use this function to get sock address | ||
1666 | * information. Not very useful for Sangoma's purposes. | ||
1667 | *===========================================================*/ | ||
1668 | |||
1669 | |||
1670 | static int wanpipe_getname(struct socket *sock, struct sockaddr *uaddr, | ||
1671 | int *uaddr_len, int peer) | ||
1672 | { | ||
1673 | struct net_device *dev; | ||
1674 | struct sock *sk = sock->sk; | ||
1675 | struct wan_sockaddr_ll *sll = (struct wan_sockaddr_ll*)uaddr; | ||
1676 | |||
1677 | sll->sll_family = AF_WANPIPE; | ||
1678 | sll->sll_ifindex = sk->sk_bound_dev_if; | ||
1679 | sll->sll_protocol = wp_sk(sk)->num; | ||
1680 | dev = dev_get_by_index(sk->sk_bound_dev_if); | ||
1681 | if (dev) { | ||
1682 | sll->sll_hatype = dev->type; | ||
1683 | sll->sll_halen = dev->addr_len; | ||
1684 | memcpy(sll->sll_addr, dev->dev_addr, dev->addr_len); | ||
1685 | } else { | ||
1686 | sll->sll_hatype = 0; /* Bad: we have no ARPHRD_UNSPEC */ | ||
1687 | sll->sll_halen = 0; | ||
1688 | } | ||
1689 | *uaddr_len = sizeof(*sll); | ||
1690 | |||
1691 | dev_put(dev); | ||
1692 | |||
1693 | return 0; | ||
1694 | } | ||
1695 | |||
1696 | /*============================================================ | ||
1697 | * wanpipe_notifier | ||
1698 | * | ||
1699 | * If driver turns off network interface, this function | ||
1700 | * will be envoked. Currently I treate it as a | ||
1701 | * call disconnect. More thought should go into this | ||
1702 | * function. | ||
1703 | * | ||
1704 | * FIXME: More thought should go into this function. | ||
1705 | * | ||
1706 | *===========================================================*/ | ||
1707 | |||
1708 | static int wanpipe_notifier(struct notifier_block *this, unsigned long msg, void *data) | ||
1709 | { | ||
1710 | struct sock *sk; | ||
1711 | hlist_node *node; | ||
1712 | struct net_device *dev = (struct net_device *)data; | ||
1713 | |||
1714 | sk_for_each(sk, node, &wanpipe_sklist) { | ||
1715 | struct wanpipe_opt *po = wp_sk(sk); | ||
1716 | |||
1717 | if (!po) | ||
1718 | continue; | ||
1719 | if (dev == NULL) | ||
1720 | continue; | ||
1721 | |||
1722 | switch (msg) { | ||
1723 | case NETDEV_DOWN: | ||
1724 | case NETDEV_UNREGISTER: | ||
1725 | if (dev->ifindex == sk->sk_bound_dev_if) { | ||
1726 | printk(KERN_INFO "wansock: Device down %s\n",dev->name); | ||
1727 | if (sock_flag(sk, SOCK_ZAPPED)) { | ||
1728 | wanpipe_unlink_driver(sk); | ||
1729 | sk->sk_err = ENETDOWN; | ||
1730 | sk->sk_error_report(sk); | ||
1731 | } | ||
1732 | |||
1733 | if (msg == NETDEV_UNREGISTER) { | ||
1734 | printk(KERN_INFO "wansock: Unregistering Device: %s\n", | ||
1735 | dev->name); | ||
1736 | wanpipe_unlink_driver(sk); | ||
1737 | sk->sk_bound_dev_if = 0; | ||
1738 | } | ||
1739 | } | ||
1740 | break; | ||
1741 | case NETDEV_UP: | ||
1742 | if (dev->ifindex == sk->sk_bound_dev_if && | ||
1743 | po->num && !sock_flag(sk, SOCK_ZAPPED)) { | ||
1744 | printk(KERN_INFO "wansock: Registering Device: %s\n", | ||
1745 | dev->name); | ||
1746 | wanpipe_link_driver(dev,sk); | ||
1747 | } | ||
1748 | break; | ||
1749 | } | ||
1750 | } | ||
1751 | return NOTIFY_DONE; | ||
1752 | } | ||
1753 | |||
1754 | /*============================================================ | ||
1755 | * wanpipe_ioctl | ||
1756 | * | ||
1757 | * Execute a user commands, and set socket options. | ||
1758 | * | ||
1759 | * FIXME: More thought should go into this function. | ||
1760 | * | ||
1761 | *===========================================================*/ | ||
1762 | |||
1763 | static int wanpipe_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | ||
1764 | { | ||
1765 | struct sock *sk = sock->sk; | ||
1766 | int err; | ||
1767 | |||
1768 | switch(cmd) | ||
1769 | { | ||
1770 | case SIOCGSTAMP: | ||
1771 | return sock_get_timestamp(sk, (struct timeval __user *)arg); | ||
1772 | |||
1773 | case SIOC_WANPIPE_CHECK_TX: | ||
1774 | |||
1775 | return atomic_read(&sk->sk_wmem_alloc); | ||
1776 | |||
1777 | case SIOC_WANPIPE_SOCK_STATE: | ||
1778 | |||
1779 | if (sk->sk_state == WANSOCK_CONNECTED) | ||
1780 | return 0; | ||
1781 | |||
1782 | return 1; | ||
1783 | |||
1784 | |||
1785 | case SIOC_WANPIPE_GET_CALL_DATA: | ||
1786 | |||
1787 | return get_ioctl_cmd (sk,(void*)arg); | ||
1788 | |||
1789 | case SIOC_WANPIPE_SET_CALL_DATA: | ||
1790 | |||
1791 | return set_ioctl_cmd (sk,(void*)arg); | ||
1792 | |||
1793 | case SIOC_WANPIPE_ACCEPT_CALL: | ||
1794 | case SIOC_WANPIPE_CLEAR_CALL: | ||
1795 | case SIOC_WANPIPE_RESET_CALL: | ||
1796 | |||
1797 | if ((err=set_ioctl_cmd(sk,(void*)arg)) < 0) | ||
1798 | return err; | ||
1799 | |||
1800 | err=wanpipe_exec_cmd(sk,cmd,0); | ||
1801 | get_ioctl_cmd(sk,(void*)arg); | ||
1802 | return err; | ||
1803 | |||
1804 | case SIOC_WANPIPE_DEBUG: | ||
1805 | |||
1806 | return wanpipe_debug(sk,(void*)arg); | ||
1807 | |||
1808 | case SIOC_WANPIPE_SET_NONBLOCK: | ||
1809 | |||
1810 | if (sk->sk_state != WANSOCK_DISCONNECTED) | ||
1811 | return -EINVAL; | ||
1812 | |||
1813 | sock->file->f_flags |= O_NONBLOCK; | ||
1814 | return 0; | ||
1815 | |||
1816 | #ifdef CONFIG_INET | ||
1817 | case SIOCADDRT: | ||
1818 | case SIOCDELRT: | ||
1819 | case SIOCDARP: | ||
1820 | case SIOCGARP: | ||
1821 | case SIOCSARP: | ||
1822 | case SIOCDRARP: | ||
1823 | case SIOCGRARP: | ||
1824 | case SIOCSRARP: | ||
1825 | case SIOCGIFADDR: | ||
1826 | case SIOCSIFADDR: | ||
1827 | case SIOCGIFBRDADDR: | ||
1828 | case SIOCSIFBRDADDR: | ||
1829 | case SIOCGIFNETMASK: | ||
1830 | case SIOCSIFNETMASK: | ||
1831 | case SIOCGIFDSTADDR: | ||
1832 | case SIOCSIFDSTADDR: | ||
1833 | case SIOCSIFFLAGS: | ||
1834 | return inet_dgram_ops.ioctl(sock, cmd, arg); | ||
1835 | #endif | ||
1836 | |||
1837 | default: | ||
1838 | return -ENOIOCTLCMD; | ||
1839 | } | ||
1840 | /*NOTREACHED*/ | ||
1841 | } | ||
1842 | |||
1843 | /*============================================================ | ||
1844 | * wanpipe_debug | ||
1845 | * | ||
1846 | * This function will pass up information about all | ||
1847 | * active sockets. | ||
1848 | * | ||
1849 | * FIXME: More thought should go into this function. | ||
1850 | * | ||
1851 | *===========================================================*/ | ||
1852 | |||
1853 | static int wanpipe_debug (struct sock *origsk, void *arg) | ||
1854 | { | ||
1855 | struct sock *sk; | ||
1856 | struct hlist_node *node; | ||
1857 | struct net_device *dev = NULL; | ||
1858 | wanpipe_common_t *chan=NULL; | ||
1859 | int cnt=0, err=0; | ||
1860 | wan_debug_t *dbg_data = (wan_debug_t *)arg; | ||
1861 | |||
1862 | sk_for_each(sk, node, &wanpipe_sklist) { | ||
1863 | wanpipe_opt *wp = wp_sk(sk); | ||
1864 | |||
1865 | if (sk == origsk){ | ||
1866 | continue; | ||
1867 | } | ||
1868 | |||
1869 | if ((err=put_user(1, &dbg_data->debug[cnt].free))) | ||
1870 | return err; | ||
1871 | if ((err = put_user(sk->sk_state, | ||
1872 | &dbg_data->debug[cnt].state_sk))) | ||
1873 | return err; | ||
1874 | if ((err = put_user(sk->sk_rcvbuf, | ||
1875 | &dbg_data->debug[cnt].rcvbuf))) | ||
1876 | return err; | ||
1877 | if ((err = put_user(atomic_read(&sk->sk_rmem_alloc), | ||
1878 | &dbg_data->debug[cnt].rmem))) | ||
1879 | return err; | ||
1880 | if ((err = put_user(atomic_read(&sk->sk_wmem_alloc), | ||
1881 | &dbg_data->debug[cnt].wmem))) | ||
1882 | return err; | ||
1883 | if ((err = put_user(sk->sk_sndbuf, | ||
1884 | &dbg_data->debug[cnt].sndbuf))) | ||
1885 | return err; | ||
1886 | if ((err=put_user(sk_count, &dbg_data->debug[cnt].sk_count))) | ||
1887 | return err; | ||
1888 | if ((err=put_user(wp->poll_cnt, &dbg_data->debug[cnt].poll_cnt))) | ||
1889 | return err; | ||
1890 | if ((err = put_user(sk->sk_bound_dev_if, | ||
1891 | &dbg_data->debug[cnt].bound))) | ||
1892 | return err; | ||
1893 | |||
1894 | if (sk->sk_bound_dev_if) { | ||
1895 | dev = dev_get_by_index(sk->sk_bound_dev_if); | ||
1896 | if (!dev) | ||
1897 | continue; | ||
1898 | |||
1899 | chan=dev->priv; | ||
1900 | dev_put(dev); | ||
1901 | |||
1902 | if ((err=put_user(chan->state, &dbg_data->debug[cnt].d_state))) | ||
1903 | return err; | ||
1904 | if ((err=put_user(chan->svc, &dbg_data->debug[cnt].svc))) | ||
1905 | return err; | ||
1906 | |||
1907 | if ((err=put_user(atomic_read(&chan->command), | ||
1908 | &dbg_data->debug[cnt].command))) | ||
1909 | return err; | ||
1910 | |||
1911 | |||
1912 | if (wp){ | ||
1913 | sdla_t *card = (sdla_t*)wp->card; | ||
1914 | |||
1915 | if (card){ | ||
1916 | if ((err=put_user(atomic_read(&card->u.x.command_busy), | ||
1917 | &dbg_data->debug[cnt].cmd_busy))) | ||
1918 | return err; | ||
1919 | } | ||
1920 | |||
1921 | if ((err=put_user(wp->lcn, | ||
1922 | &dbg_data->debug[cnt].lcn))) | ||
1923 | return err; | ||
1924 | |||
1925 | if (wp->mbox) { | ||
1926 | if ((err=put_user(1, &dbg_data->debug[cnt].mbox))) | ||
1927 | return err; | ||
1928 | } | ||
1929 | } | ||
1930 | |||
1931 | if ((err=put_user(atomic_read(&chan->receive_block), | ||
1932 | &dbg_data->debug[cnt].rblock))) | ||
1933 | return err; | ||
1934 | |||
1935 | if (copy_to_user(dbg_data->debug[cnt].name, dev->name, strlen(dev->name))) | ||
1936 | return -EFAULT; | ||
1937 | } | ||
1938 | |||
1939 | if (++cnt == MAX_NUM_DEBUG) | ||
1940 | break; | ||
1941 | } | ||
1942 | return 0; | ||
1943 | } | ||
1944 | |||
1945 | /*============================================================ | ||
1946 | * get_ioctl_cmd | ||
1947 | * | ||
1948 | * Pass up the contents of socket MBOX to the user. | ||
1949 | *===========================================================*/ | ||
1950 | |||
1951 | static int get_ioctl_cmd (struct sock *sk, void *arg) | ||
1952 | { | ||
1953 | x25api_t *usr_data = (x25api_t *)arg; | ||
1954 | mbox_cmd_t *mbox_ptr; | ||
1955 | int err; | ||
1956 | |||
1957 | if (usr_data == NULL) | ||
1958 | return -EINVAL; | ||
1959 | |||
1960 | if (!wp_sk(sk)->mbox) { | ||
1961 | return -EINVAL; | ||
1962 | } | ||
1963 | |||
1964 | mbox_ptr = (mbox_cmd_t *)wp_sk(sk)->mbox; | ||
1965 | |||
1966 | if ((err=put_user(mbox_ptr->cmd.qdm, &usr_data->hdr.qdm))) | ||
1967 | return err; | ||
1968 | if ((err=put_user(mbox_ptr->cmd.cause, &usr_data->hdr.cause))) | ||
1969 | return err; | ||
1970 | if ((err=put_user(mbox_ptr->cmd.diagn, &usr_data->hdr.diagn))) | ||
1971 | return err; | ||
1972 | if ((err=put_user(mbox_ptr->cmd.length, &usr_data->hdr.length))) | ||
1973 | return err; | ||
1974 | if ((err=put_user(mbox_ptr->cmd.result, &usr_data->hdr.result))) | ||
1975 | return err; | ||
1976 | if ((err=put_user(mbox_ptr->cmd.lcn, &usr_data->hdr.lcn))) | ||
1977 | return err; | ||
1978 | |||
1979 | if (mbox_ptr->cmd.length > 0){ | ||
1980 | if (mbox_ptr->cmd.length > X25_MAX_DATA) | ||
1981 | return -EINVAL; | ||
1982 | |||
1983 | if (copy_to_user(usr_data->data, mbox_ptr->data, mbox_ptr->cmd.length)){ | ||
1984 | printk(KERN_INFO "wansock: Copy failed !!!\n"); | ||
1985 | return -EFAULT; | ||
1986 | } | ||
1987 | } | ||
1988 | return 0; | ||
1989 | } | ||
1990 | |||
1991 | /*============================================================ | ||
1992 | * set_ioctl_cmd | ||
1993 | * | ||
1994 | * Before command can be execute, socket MBOX must | ||
1995 | * be created, and initialized with user data. | ||
1996 | *===========================================================*/ | ||
1997 | |||
1998 | static int set_ioctl_cmd (struct sock *sk, void *arg) | ||
1999 | { | ||
2000 | x25api_t *usr_data = (x25api_t *)arg; | ||
2001 | mbox_cmd_t *mbox_ptr; | ||
2002 | int err; | ||
2003 | |||
2004 | if (!wp_sk(sk)->mbox) { | ||
2005 | void *mbox_ptr; | ||
2006 | struct net_device *dev = dev_get_by_index(sk->sk_bound_dev_if); | ||
2007 | if (!dev) | ||
2008 | return -ENODEV; | ||
2009 | |||
2010 | dev_put(dev); | ||
2011 | |||
2012 | if ((mbox_ptr = kzalloc(sizeof(mbox_cmd_t), GFP_ATOMIC)) == NULL) | ||
2013 | return -ENOMEM; | ||
2014 | |||
2015 | wp_sk(sk)->mbox = mbox_ptr; | ||
2016 | |||
2017 | wanpipe_link_driver(dev,sk); | ||
2018 | } | ||
2019 | |||
2020 | mbox_ptr = (mbox_cmd_t*)wp_sk(sk)->mbox; | ||
2021 | memset(mbox_ptr, 0, sizeof(mbox_cmd_t)); | ||
2022 | |||
2023 | if (usr_data == NULL){ | ||
2024 | return 0; | ||
2025 | } | ||
2026 | if ((err=get_user(mbox_ptr->cmd.qdm, &usr_data->hdr.qdm))) | ||
2027 | return err; | ||
2028 | if ((err=get_user(mbox_ptr->cmd.cause, &usr_data->hdr.cause))) | ||
2029 | return err; | ||
2030 | if ((err=get_user(mbox_ptr->cmd.diagn, &usr_data->hdr.diagn))) | ||
2031 | return err; | ||
2032 | if ((err=get_user(mbox_ptr->cmd.length, &usr_data->hdr.length))) | ||
2033 | return err; | ||
2034 | if ((err=get_user(mbox_ptr->cmd.result, &usr_data->hdr.result))) | ||
2035 | return err; | ||
2036 | |||
2037 | if (mbox_ptr->cmd.length > 0){ | ||
2038 | if (mbox_ptr->cmd.length > X25_MAX_DATA) | ||
2039 | return -EINVAL; | ||
2040 | |||
2041 | if (copy_from_user(mbox_ptr->data, usr_data->data, mbox_ptr->cmd.length)){ | ||
2042 | printk(KERN_INFO "Copy failed\n"); | ||
2043 | return -EFAULT; | ||
2044 | } | ||
2045 | } | ||
2046 | return 0; | ||
2047 | } | ||
2048 | |||
2049 | |||
2050 | /*====================================================================== | ||
2051 | * wanpipe_poll | ||
2052 | * | ||
2053 | * Datagram poll: Again totally generic. This also handles | ||
2054 | * sequenced packet sockets providing the socket receive queue | ||
2055 | * is only ever holding data ready to receive. | ||
2056 | * | ||
2057 | * Note: when you _don't_ use this routine for this protocol, | ||
2058 | * and you use a different write policy from sock_writeable() | ||
2059 | * then please supply your own write_space callback. | ||
2060 | *=====================================================================*/ | ||
2061 | |||
2062 | unsigned int wanpipe_poll(struct file * file, struct socket *sock, poll_table *wait) | ||
2063 | { | ||
2064 | struct sock *sk = sock->sk; | ||
2065 | unsigned int mask; | ||
2066 | |||
2067 | ++wp_sk(sk)->poll_cnt; | ||
2068 | |||
2069 | poll_wait(file, sk->sk_sleep, wait); | ||
2070 | mask = 0; | ||
2071 | |||
2072 | /* exceptional events? */ | ||
2073 | if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) { | ||
2074 | mask |= POLLPRI; | ||
2075 | return mask; | ||
2076 | } | ||
2077 | if (sk->sk_shutdown & RCV_SHUTDOWN) | ||
2078 | mask |= POLLHUP; | ||
2079 | |||
2080 | /* readable? */ | ||
2081 | if (!skb_queue_empty(&sk->sk_receive_queue)) { | ||
2082 | mask |= POLLIN | POLLRDNORM; | ||
2083 | } | ||
2084 | |||
2085 | /* connection hasn't started yet */ | ||
2086 | if (sk->sk_state == WANSOCK_CONNECTING) { | ||
2087 | return mask; | ||
2088 | } | ||
2089 | |||
2090 | if (sk->sk_state == WANSOCK_DISCONNECTED) { | ||
2091 | mask = POLLPRI; | ||
2092 | return mask; | ||
2093 | } | ||
2094 | |||
2095 | /* This check blocks the user process if there is | ||
2096 | * a packet already queued in the socket write queue. | ||
2097 | * This option is only for X25API protocol, for other | ||
2098 | * protocol like chdlc enable streaming mode, | ||
2099 | * where multiple packets can be pending in the socket | ||
2100 | * transmit queue */ | ||
2101 | |||
2102 | if (wp_sk(sk)->num == htons(X25_PROT)) { | ||
2103 | if (atomic_read(&wp_sk(sk)->packet_sent)) | ||
2104 | return mask; | ||
2105 | } | ||
2106 | |||
2107 | /* writable? */ | ||
2108 | if (sock_writeable(sk)){ | ||
2109 | mask |= POLLOUT | POLLWRNORM | POLLWRBAND; | ||
2110 | }else{ | ||
2111 | set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); | ||
2112 | } | ||
2113 | |||
2114 | return mask; | ||
2115 | } | ||
2116 | |||
2117 | /*====================================================================== | ||
2118 | * wanpipe_listen | ||
2119 | * | ||
2120 | * X25API Specific function. Set a socket into LISTENING MODE. | ||
2121 | *=====================================================================*/ | ||
2122 | |||
2123 | |||
2124 | static int wanpipe_listen(struct socket *sock, int backlog) | ||
2125 | { | ||
2126 | struct sock *sk = sock->sk; | ||
2127 | |||
2128 | /* This is x25 specific area if protocol doesn't | ||
2129 | * match, return error */ | ||
2130 | if (wp_sk(sk)->num != htons(X25_PROT)) | ||
2131 | return -EINVAL; | ||
2132 | |||
2133 | if (sk->sk_state == WANSOCK_BIND_LISTEN) { | ||
2134 | |||
2135 | sk->sk_max_ack_backlog = backlog; | ||
2136 | sk->sk_state = WANSOCK_LISTEN; | ||
2137 | return 0; | ||
2138 | }else{ | ||
2139 | printk(KERN_INFO "wansock: Listening sock was not binded\n"); | ||
2140 | } | ||
2141 | |||
2142 | return -EINVAL; | ||
2143 | } | ||
2144 | |||
2145 | /*====================================================================== | ||
2146 | * wanpipe_link_card | ||
2147 | * | ||
2148 | * Connects the listening socket to the driver | ||
2149 | *=====================================================================*/ | ||
2150 | |||
2151 | static int wanpipe_link_card (struct sock *sk) | ||
2152 | { | ||
2153 | sdla_t *card = (sdla_t*)wp_sk(sk)->card; | ||
2154 | |||
2155 | if (!card) | ||
2156 | return -ENOMEM; | ||
2157 | |||
2158 | if ((card->sk != NULL) || (card->func != NULL)){ | ||
2159 | printk(KERN_INFO "wansock: Listening queue is already established\n"); | ||
2160 | return -EINVAL; | ||
2161 | } | ||
2162 | |||
2163 | card->sk=sk; | ||
2164 | card->func=wanpipe_listen_rcv; | ||
2165 | sock_set_flag(sk, SOCK_ZAPPED); | ||
2166 | |||
2167 | return 0; | ||
2168 | } | ||
2169 | |||
2170 | /*====================================================================== | ||
2171 | * wanpipe_listen | ||
2172 | * | ||
2173 | * X25API Specific function. Disconnect listening socket from | ||
2174 | * the driver. | ||
2175 | *=====================================================================*/ | ||
2176 | |||
2177 | static void wanpipe_unlink_card (struct sock *sk) | ||
2178 | { | ||
2179 | sdla_t *card = (sdla_t*)wp_sk(sk)->card; | ||
2180 | |||
2181 | if (card){ | ||
2182 | card->sk=NULL; | ||
2183 | card->func=NULL; | ||
2184 | } | ||
2185 | } | ||
2186 | |||
2187 | /*====================================================================== | ||
2188 | * wanpipe_exec_cmd | ||
2189 | * | ||
2190 | * Ioctl function calls this function to execute user command. | ||
2191 | * Connect() sytem call also calls this function to execute | ||
2192 | * place call. This function blocks until command is executed. | ||
2193 | *=====================================================================*/ | ||
2194 | |||
2195 | static int wanpipe_exec_cmd(struct sock *sk, int cmd, unsigned int flags) | ||
2196 | { | ||
2197 | int err = -EINVAL; | ||
2198 | wanpipe_opt *wp = wp_sk(sk); | ||
2199 | mbox_cmd_t *mbox_ptr = (mbox_cmd_t*)wp->mbox; | ||
2200 | |||
2201 | if (!mbox_ptr){ | ||
2202 | printk(KERN_INFO "NO MBOX PTR !!!!!\n"); | ||
2203 | return -EINVAL; | ||
2204 | } | ||
2205 | |||
2206 | /* This is x25 specific area if protocol doesn't | ||
2207 | * match, return error */ | ||
2208 | if (wp->num != htons(X25_PROT)) | ||
2209 | return -EINVAL; | ||
2210 | |||
2211 | |||
2212 | switch (cmd){ | ||
2213 | |||
2214 | case SIOC_WANPIPE_ACCEPT_CALL: | ||
2215 | |||
2216 | if (sk->sk_state != WANSOCK_CONNECTING) { | ||
2217 | err = -EHOSTDOWN; | ||
2218 | break; | ||
2219 | } | ||
2220 | |||
2221 | err = execute_command(sk,X25_ACCEPT_CALL,0); | ||
2222 | if (err < 0) | ||
2223 | break; | ||
2224 | |||
2225 | /* Update. Mar6 2000. | ||
2226 | * Do not set the sock lcn number here, since | ||
2227 | * it is done in wanpipe_listen_rcv(). | ||
2228 | */ | ||
2229 | if (sk->sk_state == WANSOCK_CONNECTED) { | ||
2230 | wp->lcn = ((mbox_cmd_t*)wp->mbox)->cmd.lcn; | ||
2231 | DBG_PRINTK(KERN_INFO "\nwansock: Accept OK %i\n", | ||
2232 | wp->lcn); | ||
2233 | err = 0; | ||
2234 | |||
2235 | }else{ | ||
2236 | DBG_PRINTK (KERN_INFO "\nwansock: Accept Failed %i\n", | ||
2237 | wp->lcn); | ||
2238 | wp->lcn = 0; | ||
2239 | err = -ECONNREFUSED; | ||
2240 | } | ||
2241 | break; | ||
2242 | |||
2243 | case SIOC_WANPIPE_CLEAR_CALL: | ||
2244 | |||
2245 | if (sk->sk_state == WANSOCK_DISCONNECTED) { | ||
2246 | err = -EINVAL; | ||
2247 | break; | ||
2248 | } | ||
2249 | |||
2250 | |||
2251 | /* Check if data buffers are pending for transmission, | ||
2252 | * if so, check whether user wants to wait until data | ||
2253 | * is transmitted, or clear a call and drop packets */ | ||
2254 | |||
2255 | if (atomic_read(&sk->sk_wmem_alloc) || | ||
2256 | check_driver_busy(sk)) { | ||
2257 | mbox_cmd_t *mbox = wp->mbox; | ||
2258 | if (mbox->cmd.qdm & 0x80){ | ||
2259 | mbox->cmd.result = 0x35; | ||
2260 | err = -EAGAIN; | ||
2261 | break; | ||
2262 | } | ||
2263 | } | ||
2264 | |||
2265 | sk->sk_state = WANSOCK_DISCONNECTING; | ||
2266 | |||
2267 | err = execute_command(sk,X25_CLEAR_CALL,0); | ||
2268 | if (err < 0) | ||
2269 | break; | ||
2270 | |||
2271 | err = -ECONNREFUSED; | ||
2272 | if (sk->sk_state == WANSOCK_DISCONNECTED) { | ||
2273 | DBG_PRINTK(KERN_INFO "\nwansock: CLEAR OK %i\n", | ||
2274 | wp->lcn); | ||
2275 | wp->lcn = 0; | ||
2276 | err = 0; | ||
2277 | } | ||
2278 | break; | ||
2279 | |||
2280 | case SIOC_WANPIPE_RESET_CALL: | ||
2281 | |||
2282 | if (sk->sk_state != WANSOCK_CONNECTED) { | ||
2283 | err = -EINVAL; | ||
2284 | break; | ||
2285 | } | ||
2286 | |||
2287 | |||
2288 | /* Check if data buffers are pending for transmission, | ||
2289 | * if so, check whether user wants to wait until data | ||
2290 | * is transmitted, or reset a call and drop packets */ | ||
2291 | |||
2292 | if (atomic_read(&sk->sk_wmem_alloc) || | ||
2293 | check_driver_busy(sk)) { | ||
2294 | mbox_cmd_t *mbox = wp->mbox; | ||
2295 | if (mbox->cmd.qdm & 0x80){ | ||
2296 | mbox->cmd.result = 0x35; | ||
2297 | err = -EAGAIN; | ||
2298 | break; | ||
2299 | } | ||
2300 | } | ||
2301 | |||
2302 | |||
2303 | err = execute_command(sk, X25_RESET,0); | ||
2304 | if (err < 0) | ||
2305 | break; | ||
2306 | |||
2307 | err = mbox_ptr->cmd.result; | ||
2308 | break; | ||
2309 | |||
2310 | |||
2311 | case X25_PLACE_CALL: | ||
2312 | |||
2313 | err=execute_command(sk,X25_PLACE_CALL,flags); | ||
2314 | if (err < 0) | ||
2315 | break; | ||
2316 | |||
2317 | if (sk->sk_state == WANSOCK_CONNECTED) { | ||
2318 | |||
2319 | wp->lcn = ((mbox_cmd_t*)wp->mbox)->cmd.lcn; | ||
2320 | |||
2321 | DBG_PRINTK(KERN_INFO "\nwansock: PLACE CALL OK %i\n", | ||
2322 | wp->lcn); | ||
2323 | err = 0; | ||
2324 | |||
2325 | } else if (sk->sk_state == WANSOCK_CONNECTING && | ||
2326 | (flags & O_NONBLOCK)) { | ||
2327 | wp->lcn = ((mbox_cmd_t*)wp->mbox)->cmd.lcn; | ||
2328 | DBG_PRINTK(KERN_INFO "\nwansock: Place Call OK: Waiting %i\n", | ||
2329 | wp->lcn); | ||
2330 | |||
2331 | err = 0; | ||
2332 | |||
2333 | }else{ | ||
2334 | DBG_PRINTK(KERN_INFO "\nwansock: Place call Failed\n"); | ||
2335 | err = -ECONNREFUSED; | ||
2336 | } | ||
2337 | |||
2338 | break; | ||
2339 | |||
2340 | default: | ||
2341 | return -EINVAL; | ||
2342 | } | ||
2343 | |||
2344 | return err; | ||
2345 | } | ||
2346 | |||
2347 | static int check_driver_busy (struct sock *sk) | ||
2348 | { | ||
2349 | struct net_device *dev = dev_get_by_index(sk->sk_bound_dev_if); | ||
2350 | wanpipe_common_t *chan; | ||
2351 | |||
2352 | if (!dev) | ||
2353 | return 0; | ||
2354 | |||
2355 | dev_put(dev); | ||
2356 | |||
2357 | if ((chan=dev->priv) == NULL) | ||
2358 | return 0; | ||
2359 | |||
2360 | return atomic_read(&chan->driver_busy); | ||
2361 | } | ||
2362 | |||
2363 | |||
2364 | /*====================================================================== | ||
2365 | * wanpipe_accept | ||
2366 | * | ||
2367 | * ACCEPT() System call. X25API Specific function. | ||
2368 | * For each incoming call, create a new socket and | ||
2369 | * return it to the user. | ||
2370 | *=====================================================================*/ | ||
2371 | |||
2372 | static int wanpipe_accept(struct socket *sock, struct socket *newsock, int flags) | ||
2373 | { | ||
2374 | struct sock *sk; | ||
2375 | struct sock *newsk; | ||
2376 | struct sk_buff *skb; | ||
2377 | DECLARE_WAITQUEUE(wait, current); | ||
2378 | int err=0; | ||
2379 | |||
2380 | if (newsock->sk != NULL){ | ||
2381 | wanpipe_kill_sock_accept(newsock->sk); | ||
2382 | newsock->sk=NULL; | ||
2383 | } | ||
2384 | |||
2385 | if ((sk = sock->sk) == NULL) | ||
2386 | return -EINVAL; | ||
2387 | |||
2388 | if (sk->sk_type != SOCK_RAW) | ||
2389 | return -EOPNOTSUPP; | ||
2390 | |||
2391 | if (sk->sk_state != WANSOCK_LISTEN) | ||
2392 | return -EINVAL; | ||
2393 | |||
2394 | if (wp_sk(sk)->num != htons(X25_PROT)) | ||
2395 | return -EINVAL; | ||
2396 | |||
2397 | add_wait_queue(sk->sk_sleep,&wait); | ||
2398 | current->state = TASK_INTERRUPTIBLE; | ||
2399 | for (;;){ | ||
2400 | skb = skb_dequeue(&sk->sk_receive_queue); | ||
2401 | if (skb){ | ||
2402 | err=0; | ||
2403 | break; | ||
2404 | } | ||
2405 | if (signal_pending(current)) { | ||
2406 | err = -ERESTARTSYS; | ||
2407 | break; | ||
2408 | } | ||
2409 | schedule(); | ||
2410 | } | ||
2411 | current->state = TASK_RUNNING; | ||
2412 | remove_wait_queue(sk->sk_sleep,&wait); | ||
2413 | |||
2414 | if (err != 0) | ||
2415 | return err; | ||
2416 | |||
2417 | newsk = get_newsk_from_skb(skb); | ||
2418 | if (!newsk){ | ||
2419 | return -EINVAL; | ||
2420 | } | ||
2421 | |||
2422 | set_bit(1,&wanpipe_tx_critical); | ||
2423 | write_lock(&wanpipe_sklist_lock); | ||
2424 | sk_add_node(newsk, &wanpipe_sklist); | ||
2425 | write_unlock(&wanpipe_sklist_lock); | ||
2426 | clear_bit(1,&wanpipe_tx_critical); | ||
2427 | |||
2428 | newsk->sk_socket = newsock; | ||
2429 | newsk->sk_sleep = &newsock->wait; | ||
2430 | |||
2431 | /* Now attach up the new socket */ | ||
2432 | sk->sk_ack_backlog--; | ||
2433 | newsock->sk = newsk; | ||
2434 | |||
2435 | kfree_skb(skb); | ||
2436 | |||
2437 | DBG_PRINTK(KERN_INFO "\nwansock: ACCEPT Got LCN %i\n", | ||
2438 | wp_sk(newsk)->lcn); | ||
2439 | return 0; | ||
2440 | } | ||
2441 | |||
2442 | /*====================================================================== | ||
2443 | * get_newsk_from_skb | ||
2444 | * | ||
2445 | * Accept() uses this function to get the address of the new | ||
2446 | * socket structure. | ||
2447 | *=====================================================================*/ | ||
2448 | |||
2449 | struct sock * get_newsk_from_skb (struct sk_buff *skb) | ||
2450 | { | ||
2451 | struct net_device *dev = skb->dev; | ||
2452 | wanpipe_common_t *chan; | ||
2453 | |||
2454 | if (!dev){ | ||
2455 | return NULL; | ||
2456 | } | ||
2457 | |||
2458 | if ((chan = dev->priv) == NULL){ | ||
2459 | return NULL; | ||
2460 | } | ||
2461 | |||
2462 | if (!chan->sk){ | ||
2463 | return NULL; | ||
2464 | } | ||
2465 | return (struct sock *)chan->sk; | ||
2466 | } | ||
2467 | |||
2468 | /*====================================================================== | ||
2469 | * wanpipe_connect | ||
2470 | * | ||
2471 | * CONNECT() System Call. X25API specific function | ||
2472 | * Check the state of the sock, and execute PLACE_CALL command. | ||
2473 | * Connect can ether block or return without waiting for connection, | ||
2474 | * if specified by user. | ||
2475 | *=====================================================================*/ | ||
2476 | |||
2477 | static int wanpipe_connect(struct socket *sock, struct sockaddr *uaddr, int addr_len, int flags) | ||
2478 | { | ||
2479 | struct sock *sk = sock->sk; | ||
2480 | struct wan_sockaddr_ll *addr = (struct wan_sockaddr_ll*)uaddr; | ||
2481 | struct net_device *dev; | ||
2482 | int err; | ||
2483 | |||
2484 | if (wp_sk(sk)->num != htons(X25_PROT)) | ||
2485 | return -EINVAL; | ||
2486 | |||
2487 | if (sk->sk_state == WANSOCK_CONNECTED) | ||
2488 | return -EISCONN; /* No reconnect on a seqpacket socket */ | ||
2489 | |||
2490 | if (sk->sk_state != WAN_DISCONNECTED) { | ||
2491 | printk(KERN_INFO "wansock: Trying to connect on channel NON DISCONNECT\n"); | ||
2492 | return -ECONNREFUSED; | ||
2493 | } | ||
2494 | |||
2495 | sk->sk_state = WANSOCK_DISCONNECTED; | ||
2496 | sock->state = SS_UNCONNECTED; | ||
2497 | |||
2498 | if (addr_len != sizeof(struct wan_sockaddr_ll)) | ||
2499 | return -EINVAL; | ||
2500 | |||
2501 | if (addr->sll_family != AF_WANPIPE) | ||
2502 | return -EINVAL; | ||
2503 | |||
2504 | if ((dev = dev_get_by_index(sk->sk_bound_dev_if)) == NULL) | ||
2505 | return -ENETUNREACH; | ||
2506 | |||
2507 | dev_put(dev); | ||
2508 | |||
2509 | if (!sock_flag(sk, SOCK_ZAPPED)) /* Must bind first - autobinding does not work */ | ||
2510 | return -EINVAL; | ||
2511 | |||
2512 | sock->state = SS_CONNECTING; | ||
2513 | sk->sk_state = WANSOCK_CONNECTING; | ||
2514 | |||
2515 | if (!wp_sk(sk)->mbox) { | ||
2516 | if (wp_sk (sk)->svc) | ||
2517 | return -EINVAL; | ||
2518 | else { | ||
2519 | int err; | ||
2520 | if ((err=set_ioctl_cmd(sk,NULL)) < 0) | ||
2521 | return err; | ||
2522 | } | ||
2523 | } | ||
2524 | |||
2525 | if ((err=wanpipe_exec_cmd(sk, X25_PLACE_CALL,flags)) != 0){ | ||
2526 | sock->state = SS_UNCONNECTED; | ||
2527 | sk->sk_state = WANSOCK_CONNECTED; | ||
2528 | return err; | ||
2529 | } | ||
2530 | |||
2531 | if (sk->sk_state != WANSOCK_CONNECTED && (flags & O_NONBLOCK)) { | ||
2532 | return 0; | ||
2533 | } | ||
2534 | |||
2535 | if (sk->sk_state != WANSOCK_CONNECTED) { | ||
2536 | sock->state = SS_UNCONNECTED; | ||
2537 | return -ECONNREFUSED; | ||
2538 | } | ||
2539 | |||
2540 | sock->state = SS_CONNECTED; | ||
2541 | return 0; | ||
2542 | } | ||
2543 | |||
2544 | const struct proto_ops wanpipe_ops = { | ||
2545 | .family = PF_WANPIPE, | ||
2546 | .owner = THIS_MODULE, | ||
2547 | .release = wanpipe_release, | ||
2548 | .bind = wanpipe_bind, | ||
2549 | .connect = wanpipe_connect, | ||
2550 | .socketpair = sock_no_socketpair, | ||
2551 | .accept = wanpipe_accept, | ||
2552 | .getname = wanpipe_getname, | ||
2553 | .poll = wanpipe_poll, | ||
2554 | .ioctl = wanpipe_ioctl, | ||
2555 | .listen = wanpipe_listen, | ||
2556 | .shutdown = sock_no_shutdown, | ||
2557 | .setsockopt = sock_no_setsockopt, | ||
2558 | .getsockopt = sock_no_getsockopt, | ||
2559 | .sendmsg = wanpipe_sendmsg, | ||
2560 | .recvmsg = wanpipe_recvmsg | ||
2561 | }; | ||
2562 | |||
2563 | static struct net_proto_family wanpipe_family_ops = { | ||
2564 | .family = PF_WANPIPE, | ||
2565 | .create = wanpipe_create, | ||
2566 | .owner = THIS_MODULE, | ||
2567 | }; | ||
2568 | |||
2569 | struct notifier_block wanpipe_netdev_notifier = { | ||
2570 | .notifier_call = wanpipe_notifier, | ||
2571 | }; | ||
2572 | |||
2573 | |||
2574 | #ifdef MODULE | ||
2575 | void cleanup_module(void) | ||
2576 | { | ||
2577 | printk(KERN_INFO "wansock: Cleaning up \n"); | ||
2578 | unregister_netdevice_notifier(&wanpipe_netdev_notifier); | ||
2579 | sock_unregister(PF_WANPIPE); | ||
2580 | proto_unregister(&wanpipe_proto); | ||
2581 | } | ||
2582 | |||
2583 | int init_module(void) | ||
2584 | { | ||
2585 | int rc; | ||
2586 | |||
2587 | printk(KERN_INFO "wansock: Registering Socket \n"); | ||
2588 | |||
2589 | rc = proto_register(&wanpipe_proto, 0); | ||
2590 | if (rc != 0) | ||
2591 | goto out; | ||
2592 | |||
2593 | sock_register(&wanpipe_family_ops); | ||
2594 | register_netdevice_notifier(&wanpipe_netdev_notifier); | ||
2595 | out: | ||
2596 | return rc; | ||
2597 | } | ||
2598 | #endif | ||
2599 | MODULE_LICENSE("GPL"); | ||
2600 | MODULE_ALIAS_NETPROTO(PF_WANPIPE); | ||
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index a35f9e4ede26..5c5f6dcab974 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
@@ -704,7 +704,8 @@ static struct xfrm_state *__find_acq_core(unsigned short family, u8 mode, u32 re | |||
704 | x->props.mode != mode || | 704 | x->props.mode != mode || |
705 | x->props.family != family || | 705 | x->props.family != family || |
706 | x->km.state != XFRM_STATE_ACQ || | 706 | x->km.state != XFRM_STATE_ACQ || |
707 | x->id.spi != 0) | 707 | x->id.spi != 0 || |
708 | x->id.proto != proto) | ||
708 | continue; | 709 | continue; |
709 | 710 | ||
710 | switch (family) { | 711 | switch (family) { |
@@ -801,7 +802,8 @@ int xfrm_state_add(struct xfrm_state *x) | |||
801 | 802 | ||
802 | if (use_spi && x->km.seq) { | 803 | if (use_spi && x->km.seq) { |
803 | x1 = __xfrm_find_acq_byseq(x->km.seq); | 804 | x1 = __xfrm_find_acq_byseq(x->km.seq); |
804 | if (x1 && xfrm_addr_cmp(&x1->id.daddr, &x->id.daddr, family)) { | 805 | if (x1 && ((x1->id.proto != x->id.proto) || |
806 | xfrm_addr_cmp(&x1->id.daddr, &x->id.daddr, family))) { | ||
805 | xfrm_state_put(x1); | 807 | xfrm_state_put(x1); |
806 | x1 = NULL; | 808 | x1 = NULL; |
807 | } | 809 | } |
diff --git a/security/dummy.c b/security/dummy.c index 558795b237d6..8ffd76405b5b 100644 --- a/security/dummy.c +++ b/security/dummy.c | |||
@@ -907,7 +907,7 @@ static void dummy_d_instantiate (struct dentry *dentry, struct inode *inode) | |||
907 | return; | 907 | return; |
908 | } | 908 | } |
909 | 909 | ||
910 | static int dummy_getprocattr(struct task_struct *p, char *name, void *value, size_t size) | 910 | static int dummy_getprocattr(struct task_struct *p, char *name, char **value) |
911 | { | 911 | { |
912 | return -EINVAL; | 912 | return -EINVAL; |
913 | } | 913 | } |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 19a385e9968e..d41e24d6ae41 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
@@ -4468,11 +4468,12 @@ static void selinux_d_instantiate (struct dentry *dentry, struct inode *inode) | |||
4468 | } | 4468 | } |
4469 | 4469 | ||
4470 | static int selinux_getprocattr(struct task_struct *p, | 4470 | static int selinux_getprocattr(struct task_struct *p, |
4471 | char *name, void *value, size_t size) | 4471 | char *name, char **value) |
4472 | { | 4472 | { |
4473 | struct task_security_struct *tsec; | 4473 | struct task_security_struct *tsec; |
4474 | u32 sid; | 4474 | u32 sid; |
4475 | int error; | 4475 | int error; |
4476 | unsigned len; | ||
4476 | 4477 | ||
4477 | if (current != p) { | 4478 | if (current != p) { |
4478 | error = task_has_perm(current, p, PROCESS__GETATTR); | 4479 | error = task_has_perm(current, p, PROCESS__GETATTR); |
@@ -4500,7 +4501,10 @@ static int selinux_getprocattr(struct task_struct *p, | |||
4500 | if (!sid) | 4501 | if (!sid) |
4501 | return 0; | 4502 | return 0; |
4502 | 4503 | ||
4503 | return selinux_getsecurity(sid, value, size); | 4504 | error = security_sid_to_context(sid, value, &len); |
4505 | if (error) | ||
4506 | return error; | ||
4507 | return len; | ||
4504 | } | 4508 | } |
4505 | 4509 | ||
4506 | static int selinux_setprocattr(struct task_struct *p, | 4510 | static int selinux_setprocattr(struct task_struct *p, |
diff --git a/sound/oss/dmasound/dmasound_core.c b/sound/oss/dmasound/dmasound_core.c index a0ec886f2aa3..f4056a9c371b 100644 --- a/sound/oss/dmasound/dmasound_core.c +++ b/sound/oss/dmasound/dmasound_core.c | |||
@@ -1346,22 +1346,34 @@ static const struct file_operations sq_fops = | |||
1346 | .ioctl = sq_ioctl, | 1346 | .ioctl = sq_ioctl, |
1347 | .open = sq_open, | 1347 | .open = sq_open, |
1348 | .release = sq_release, | 1348 | .release = sq_release, |
1349 | }; | ||
1350 | |||
1349 | #ifdef HAS_RECORD | 1351 | #ifdef HAS_RECORD |
1350 | .read = NULL /* default to no read for compat mode */ | 1352 | static const struct file_operations sq_fops_record = |
1351 | #endif | 1353 | { |
1354 | .owner = THIS_MODULE, | ||
1355 | .llseek = no_llseek, | ||
1356 | .write = sq_write, | ||
1357 | .poll = sq_poll, | ||
1358 | .ioctl = sq_ioctl, | ||
1359 | .open = sq_open, | ||
1360 | .release = sq_release, | ||
1361 | .read = sq_read, | ||
1352 | }; | 1362 | }; |
1363 | #endif | ||
1353 | 1364 | ||
1354 | static int sq_init(void) | 1365 | static int sq_init(void) |
1355 | { | 1366 | { |
1367 | const struct file_operations *fops = &sq_fops; | ||
1356 | #ifndef MODULE | 1368 | #ifndef MODULE |
1357 | int sq_unit; | 1369 | int sq_unit; |
1358 | #endif | 1370 | #endif |
1359 | 1371 | ||
1360 | #ifdef HAS_RECORD | 1372 | #ifdef HAS_RECORD |
1361 | if (dmasound.mach.record) | 1373 | if (dmasound.mach.record) |
1362 | sq_fops.read = sq_read ; | 1374 | fops = &sq_fops_record; |
1363 | #endif | 1375 | #endif |
1364 | sq_unit = register_sound_dsp(&sq_fops, -1); | 1376 | sq_unit = register_sound_dsp(fops, -1); |
1365 | if (sq_unit < 0) { | 1377 | if (sq_unit < 0) { |
1366 | printk(KERN_ERR "dmasound_core: couldn't register fops\n") ; | 1378 | printk(KERN_ERR "dmasound_core: couldn't register fops\n") ; |
1367 | return sq_unit ; | 1379 | return sq_unit ; |