diff options
154 files changed, 1633 insertions, 2256 deletions
diff --git a/Documentation/arm/Samsung-S3C24XX/Suspend.txt b/Documentation/arm/Samsung-S3C24XX/Suspend.txt index e12bc3284a27..0dab6e32c130 100644 --- a/Documentation/arm/Samsung-S3C24XX/Suspend.txt +++ b/Documentation/arm/Samsung-S3C24XX/Suspend.txt | |||
@@ -5,10 +5,10 @@ | |||
5 | Introduction | 5 | Introduction |
6 | ------------ | 6 | ------------ |
7 | 7 | ||
8 | The S3C2410 supports a low-power suspend mode, where the SDRAM is kept | 8 | The S3C24XX supports a low-power suspend mode, where the SDRAM is kept |
9 | in Self-Refresh mode, and all but the essential peripheral blocks are | 9 | in Self-Refresh mode, and all but the essential peripheral blocks are |
10 | powered down. For more information on how this works, please look | 10 | powered down. For more information on how this works, please look |
11 | at the S3C2410 datasheets from Samsung. | 11 | at the relevant CPU datasheet from Samsung. |
12 | 12 | ||
13 | 13 | ||
14 | Requirements | 14 | Requirements |
@@ -56,6 +56,27 @@ Machine Support | |||
56 | Note, the original method of adding an late_initcall() is wrong, | 56 | Note, the original method of adding an late_initcall() is wrong, |
57 | and will end up initialising all compiled machines' pm init! | 57 | and will end up initialising all compiled machines' pm init! |
58 | 58 | ||
59 | The following is an example of code used for testing wakeup from | ||
60 | an falling edge on IRQ_EINT0: | ||
61 | |||
62 | |||
63 | static irqreturn_t button_irq(int irq, void *pw) | ||
64 | { | ||
65 | return IRQ_HANDLED; | ||
66 | } | ||
67 | |||
68 | statuc void __init machine_init(void) | ||
69 | { | ||
70 | ... | ||
71 | |||
72 | request_irq(IRQ_EINT0, button_irq, IRQF_TRIGGER_FALLING, | ||
73 | "button-irq-eint0", NULL); | ||
74 | |||
75 | enable_irq_wake(IRQ_EINT0); | ||
76 | |||
77 | s3c2410_pm_init(); | ||
78 | } | ||
79 | |||
59 | 80 | ||
60 | Debugging | 81 | Debugging |
61 | --------- | 82 | --------- |
@@ -70,6 +91,12 @@ Debugging | |||
70 | care should be taken that any external clock sources that the UARTs | 91 | care should be taken that any external clock sources that the UARTs |
71 | rely on are still enabled at that point. | 92 | rely on are still enabled at that point. |
72 | 93 | ||
94 | 3) If any debugging is placed in the resume path, then it must have the | ||
95 | relevant clocks and peripherals setup before use (ie, bootloader). | ||
96 | |||
97 | For example, if you transmit a character from the UART, the baud | ||
98 | rate and uart controls must be setup beforehand. | ||
99 | |||
73 | 100 | ||
74 | Configuration | 101 | Configuration |
75 | ------------- | 102 | ------------- |
@@ -89,6 +116,10 @@ Configuration | |||
89 | Allows the entire memory to be checksummed before and after the | 116 | Allows the entire memory to be checksummed before and after the |
90 | suspend to see if there has been any corruption of the contents. | 117 | suspend to see if there has been any corruption of the contents. |
91 | 118 | ||
119 | Note, the time to calculate the CRC is dependant on the CPU speed | ||
120 | and the size of memory. For an 64Mbyte RAM area on an 200MHz | ||
121 | S3C2410, this can take approximately 4 seconds to complete. | ||
122 | |||
92 | This support requires the CRC32 function to be enabled. | 123 | This support requires the CRC32 function to be enabled. |
93 | 124 | ||
94 | 125 | ||
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index d75879d9ddeb..ac2ffdcfbbb4 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -190,6 +190,7 @@ config ARCH_CO285 | |||
190 | config ARCH_EBSA110 | 190 | config ARCH_EBSA110 |
191 | bool "EBSA-110" | 191 | bool "EBSA-110" |
192 | select ISA | 192 | select ISA |
193 | select NO_IOPORT | ||
193 | help | 194 | help |
194 | This is an evaluation board for the StrongARM processor available | 195 | This is an evaluation board for the StrongARM processor available |
195 | from Digital. It has limited hardware on-board, including an | 196 | from Digital. It has limited hardware on-board, including an |
diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c index cbe909bad79b..70014f751bc4 100644 --- a/arch/arm/mach-omap1/board-nokia770.c +++ b/arch/arm/mach-omap1/board-nokia770.c | |||
@@ -16,6 +16,8 @@ | |||
16 | 16 | ||
17 | #include <linux/spi/spi.h> | 17 | #include <linux/spi/spi.h> |
18 | #include <linux/spi/ads7846.h> | 18 | #include <linux/spi/ads7846.h> |
19 | #include <linux/workqueue.h> | ||
20 | #include <linux/delay.h> | ||
19 | 21 | ||
20 | #include <asm/hardware.h> | 22 | #include <asm/hardware.h> |
21 | #include <asm/mach-types.h> | 23 | #include <asm/mach-types.h> |
@@ -103,7 +105,7 @@ static struct ads7846_platform_data nokia770_ads7846_platform_data __initdata = | |||
103 | 105 | ||
104 | static struct spi_board_info nokia770_spi_board_info[] __initdata = { | 106 | static struct spi_board_info nokia770_spi_board_info[] __initdata = { |
105 | [0] = { | 107 | [0] = { |
106 | .modalias = "lcd_lph8923", | 108 | .modalias = "lcd_mipid", |
107 | .bus_num = 2, | 109 | .bus_num = 2, |
108 | .chip_select = 3, | 110 | .chip_select = 3, |
109 | .max_speed_hz = 12000000, | 111 | .max_speed_hz = 12000000, |
diff --git a/arch/arm/mach-omap1/clock.c b/arch/arm/mach-omap1/clock.c index 638490e62d5f..f625f6dd228a 100644 --- a/arch/arm/mach-omap1/clock.c +++ b/arch/arm/mach-omap1/clock.c | |||
@@ -432,8 +432,7 @@ static int omap1_clk_enable(struct clk *clk) | |||
432 | } | 432 | } |
433 | 433 | ||
434 | if (clk->flags & CLOCK_NO_IDLE_PARENT) | 434 | if (clk->flags & CLOCK_NO_IDLE_PARENT) |
435 | if (!cpu_is_omap24xx()) | 435 | omap1_clk_deny_idle(clk->parent); |
436 | omap1_clk_deny_idle(clk->parent); | ||
437 | } | 436 | } |
438 | 437 | ||
439 | ret = clk->enable(clk); | 438 | ret = clk->enable(clk); |
@@ -454,8 +453,7 @@ static void omap1_clk_disable(struct clk *clk) | |||
454 | if (likely(clk->parent)) { | 453 | if (likely(clk->parent)) { |
455 | omap1_clk_disable(clk->parent); | 454 | omap1_clk_disable(clk->parent); |
456 | if (clk->flags & CLOCK_NO_IDLE_PARENT) | 455 | if (clk->flags & CLOCK_NO_IDLE_PARENT) |
457 | if (!cpu_is_omap24xx()) | 456 | omap1_clk_allow_idle(clk->parent); |
458 | omap1_clk_allow_idle(clk->parent); | ||
459 | } | 457 | } |
460 | } | 458 | } |
461 | } | 459 | } |
@@ -471,7 +469,7 @@ static int omap1_clk_enable_generic(struct clk *clk) | |||
471 | if (unlikely(clk->enable_reg == 0)) { | 469 | if (unlikely(clk->enable_reg == 0)) { |
472 | printk(KERN_ERR "clock.c: Enable for %s without enable code\n", | 470 | printk(KERN_ERR "clock.c: Enable for %s without enable code\n", |
473 | clk->name); | 471 | clk->name); |
474 | return 0; | 472 | return -EINVAL; |
475 | } | 473 | } |
476 | 474 | ||
477 | if (clk->flags & ENABLE_REG_32BIT) { | 475 | if (clk->flags & ENABLE_REG_32BIT) { |
@@ -651,10 +649,18 @@ int __init omap1_clk_init(void) | |||
651 | int crystal_type = 0; /* Default 12 MHz */ | 649 | int crystal_type = 0; /* Default 12 MHz */ |
652 | u32 reg; | 650 | u32 reg; |
653 | 651 | ||
652 | #ifdef CONFIG_DEBUG_LL | ||
653 | /* Resets some clocks that may be left on from bootloader, | ||
654 | * but leaves serial clocks on. | ||
655 | */ | ||
656 | omap_writel(0x3 << 29, MOD_CONF_CTRL_0); | ||
657 | #endif | ||
658 | |||
654 | /* USB_REQ_EN will be disabled later if necessary (usb_dc_ck) */ | 659 | /* USB_REQ_EN will be disabled later if necessary (usb_dc_ck) */ |
655 | reg = omap_readw(SOFT_REQ_REG) & (1 << 4); | 660 | reg = omap_readw(SOFT_REQ_REG) & (1 << 4); |
656 | omap_writew(reg, SOFT_REQ_REG); | 661 | omap_writew(reg, SOFT_REQ_REG); |
657 | omap_writew(0, SOFT_REQ_REG2); | 662 | if (!cpu_is_omap15xx()) |
663 | omap_writew(0, SOFT_REQ_REG2); | ||
658 | 664 | ||
659 | clk_init(&omap1_clk_functions); | 665 | clk_init(&omap1_clk_functions); |
660 | 666 | ||
@@ -685,7 +691,7 @@ int __init omap1_clk_init(void) | |||
685 | 691 | ||
686 | info = omap_get_config(OMAP_TAG_CLOCK, struct omap_clock_config); | 692 | info = omap_get_config(OMAP_TAG_CLOCK, struct omap_clock_config); |
687 | if (info != NULL) { | 693 | if (info != NULL) { |
688 | if (!cpu_is_omap1510()) | 694 | if (!cpu_is_omap15xx()) |
689 | crystal_type = info->system_clock_type; | 695 | crystal_type = info->system_clock_type; |
690 | } | 696 | } |
691 | 697 | ||
diff --git a/arch/arm/mach-omap1/irq.c b/arch/arm/mach-omap1/irq.c index 6383a12ad970..410d3e78dd0f 100644 --- a/arch/arm/mach-omap1/irq.c +++ b/arch/arm/mach-omap1/irq.c | |||
@@ -238,7 +238,7 @@ void __init omap_init_irq(void) | |||
238 | 238 | ||
239 | if (cpu_is_omap730()) | 239 | if (cpu_is_omap730()) |
240 | omap_unmask_irq(INT_730_IH2_IRQ); | 240 | omap_unmask_irq(INT_730_IH2_IRQ); |
241 | else if (cpu_is_omap1510()) | 241 | else if (cpu_is_omap15xx()) |
242 | omap_unmask_irq(INT_1510_IH2_IRQ); | 242 | omap_unmask_irq(INT_1510_IH2_IRQ); |
243 | else if (cpu_is_omap16xx()) | 243 | else if (cpu_is_omap16xx()) |
244 | omap_unmask_irq(INT_1610_IH2_IRQ); | 244 | omap_unmask_irq(INT_1610_IH2_IRQ); |
diff --git a/arch/arm/mach-omap1/pm.c b/arch/arm/mach-omap1/pm.c index 4834758d340c..49efe903dacd 100644 --- a/arch/arm/mach-omap1/pm.c +++ b/arch/arm/mach-omap1/pm.c | |||
@@ -256,7 +256,8 @@ void omap_pm_suspend(void) | |||
256 | tps65010_set_led(LED1, OFF); | 256 | tps65010_set_led(LED1, OFF); |
257 | } | 257 | } |
258 | 258 | ||
259 | omap_writew(0xffff, ULPD_SOFT_DISABLE_REQ_REG); | 259 | if (!cpu_is_omap15xx()) |
260 | omap_writew(0xffff, ULPD_SOFT_DISABLE_REQ_REG); | ||
260 | 261 | ||
261 | /* | 262 | /* |
262 | * Step 1: turn off interrupts (FIXME: NOTE: already disabled) | 263 | * Step 1: turn off interrupts (FIXME: NOTE: already disabled) |
@@ -434,7 +435,8 @@ void omap_pm_suspend(void) | |||
434 | MPUI1610_RESTORE(OMAP_IH2_3_MIR); | 435 | MPUI1610_RESTORE(OMAP_IH2_3_MIR); |
435 | } | 436 | } |
436 | 437 | ||
437 | omap_writew(0, ULPD_SOFT_DISABLE_REQ_REG); | 438 | if (!cpu_is_omap15xx()) |
439 | omap_writew(0, ULPD_SOFT_DISABLE_REQ_REG); | ||
438 | 440 | ||
439 | /* | 441 | /* |
440 | * Reenable interrupts | 442 | * Reenable interrupts |
@@ -704,6 +706,8 @@ static struct pm_ops omap_pm_ops ={ | |||
704 | 706 | ||
705 | static int __init omap_pm_init(void) | 707 | static int __init omap_pm_init(void) |
706 | { | 708 | { |
709 | int error; | ||
710 | |||
707 | printk("Power Management for TI OMAP.\n"); | 711 | printk("Power Management for TI OMAP.\n"); |
708 | 712 | ||
709 | /* | 713 | /* |
@@ -760,7 +764,9 @@ static int __init omap_pm_init(void) | |||
760 | omap_pm_init_proc(); | 764 | omap_pm_init_proc(); |
761 | #endif | 765 | #endif |
762 | 766 | ||
763 | subsys_create_file(&power_subsys, &sleep_while_idle_attr); | 767 | error = subsys_create_file(&power_subsys, &sleep_while_idle_attr); |
768 | if (error) | ||
769 | printk(KERN_ERR "subsys_create_file failed: %d\n", error); | ||
764 | 770 | ||
765 | if (cpu_is_omap16xx()) { | 771 | if (cpu_is_omap16xx()) { |
766 | /* configure LOW_PWR pin */ | 772 | /* configure LOW_PWR pin */ |
diff --git a/arch/arm/mach-omap1/serial.c b/arch/arm/mach-omap1/serial.c index 4cc98a578e4b..10a4fe88b2fd 100644 --- a/arch/arm/mach-omap1/serial.c +++ b/arch/arm/mach-omap1/serial.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * linux/arch/arm/mach-omap1/serial.c | 2 | * linux/arch/arm/mach-omap1/serial.c |
3 | * | 3 | * |
4 | * OMAP1 CPU identification code | 4 | * OMAP1 serial support. |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License version 2 as | 7 | * it under the terms of the GNU General Public License version 2 as |
@@ -59,7 +59,7 @@ static void __init omap_serial_reset(struct plat_serial8250_port *p) | |||
59 | omap_serial_outp(p, UART_OMAP_SCR, 0x08); /* TX watermark */ | 59 | omap_serial_outp(p, UART_OMAP_SCR, 0x08); /* TX watermark */ |
60 | omap_serial_outp(p, UART_OMAP_MDR1, 0x00); /* enable UART */ | 60 | omap_serial_outp(p, UART_OMAP_MDR1, 0x00); /* enable UART */ |
61 | 61 | ||
62 | if (!cpu_is_omap1510()) { | 62 | if (!cpu_is_omap15xx()) { |
63 | omap_serial_outp(p, UART_OMAP_SYSC, 0x01); | 63 | omap_serial_outp(p, UART_OMAP_SYSC, 0x01); |
64 | while (!(omap_serial_in(p, UART_OMAP_SYSC) & 0x01)); | 64 | while (!(omap_serial_in(p, UART_OMAP_SYSC) & 0x01)); |
65 | } | 65 | } |
@@ -121,7 +121,7 @@ void __init omap_serial_init(void) | |||
121 | serial_platform_data[1].irq = INT_730_UART_MODEM_IRDA_2; | 121 | serial_platform_data[1].irq = INT_730_UART_MODEM_IRDA_2; |
122 | } | 122 | } |
123 | 123 | ||
124 | if (cpu_is_omap1510()) { | 124 | if (cpu_is_omap15xx()) { |
125 | serial_platform_data[0].uartclk = OMAP1510_BASE_BAUD * 16; | 125 | serial_platform_data[0].uartclk = OMAP1510_BASE_BAUD * 16; |
126 | serial_platform_data[1].uartclk = OMAP1510_BASE_BAUD * 16; | 126 | serial_platform_data[1].uartclk = OMAP1510_BASE_BAUD * 16; |
127 | serial_platform_data[2].uartclk = OMAP1510_BASE_BAUD * 16; | 127 | serial_platform_data[2].uartclk = OMAP1510_BASE_BAUD * 16; |
@@ -147,10 +147,10 @@ void __init omap_serial_init(void) | |||
147 | printk("Could not get uart1_ck\n"); | 147 | printk("Could not get uart1_ck\n"); |
148 | else { | 148 | else { |
149 | clk_enable(uart1_ck); | 149 | clk_enable(uart1_ck); |
150 | if (cpu_is_omap1510()) | 150 | if (cpu_is_omap15xx()) |
151 | clk_set_rate(uart1_ck, 12000000); | 151 | clk_set_rate(uart1_ck, 12000000); |
152 | } | 152 | } |
153 | if (cpu_is_omap1510()) { | 153 | if (cpu_is_omap15xx()) { |
154 | omap_cfg_reg(UART1_TX); | 154 | omap_cfg_reg(UART1_TX); |
155 | omap_cfg_reg(UART1_RTS); | 155 | omap_cfg_reg(UART1_RTS); |
156 | if (machine_is_omap_innovator()) { | 156 | if (machine_is_omap_innovator()) { |
@@ -167,12 +167,12 @@ void __init omap_serial_init(void) | |||
167 | printk("Could not get uart2_ck\n"); | 167 | printk("Could not get uart2_ck\n"); |
168 | else { | 168 | else { |
169 | clk_enable(uart2_ck); | 169 | clk_enable(uart2_ck); |
170 | if (cpu_is_omap1510()) | 170 | if (cpu_is_omap15xx()) |
171 | clk_set_rate(uart2_ck, 12000000); | 171 | clk_set_rate(uart2_ck, 12000000); |
172 | else | 172 | else |
173 | clk_set_rate(uart2_ck, 48000000); | 173 | clk_set_rate(uart2_ck, 48000000); |
174 | } | 174 | } |
175 | if (cpu_is_omap1510()) { | 175 | if (cpu_is_omap15xx()) { |
176 | omap_cfg_reg(UART2_TX); | 176 | omap_cfg_reg(UART2_TX); |
177 | omap_cfg_reg(UART2_RTS); | 177 | omap_cfg_reg(UART2_RTS); |
178 | if (machine_is_omap_innovator()) { | 178 | if (machine_is_omap_innovator()) { |
@@ -189,10 +189,10 @@ void __init omap_serial_init(void) | |||
189 | printk("Could not get uart3_ck\n"); | 189 | printk("Could not get uart3_ck\n"); |
190 | else { | 190 | else { |
191 | clk_enable(uart3_ck); | 191 | clk_enable(uart3_ck); |
192 | if (cpu_is_omap1510()) | 192 | if (cpu_is_omap15xx()) |
193 | clk_set_rate(uart3_ck, 12000000); | 193 | clk_set_rate(uart3_ck, 12000000); |
194 | } | 194 | } |
195 | if (cpu_is_omap1510()) { | 195 | if (cpu_is_omap15xx()) { |
196 | omap_cfg_reg(UART3_TX); | 196 | omap_cfg_reg(UART3_TX); |
197 | omap_cfg_reg(UART3_RX); | 197 | omap_cfg_reg(UART3_RX); |
198 | } | 198 | } |
diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c index 3b1ad1d981a3..1e7ed6d22ca9 100644 --- a/arch/arm/mach-omap2/board-h4.c +++ b/arch/arm/mach-omap2/board-h4.c | |||
@@ -39,7 +39,6 @@ | |||
39 | #include "prcm-regs.h" | 39 | #include "prcm-regs.h" |
40 | 40 | ||
41 | #include <asm/io.h> | 41 | #include <asm/io.h> |
42 | #include <asm/delay.h> | ||
43 | 42 | ||
44 | static unsigned int row_gpios[6] = { 88, 89, 124, 11, 6, 96 }; | 43 | static unsigned int row_gpios[6] = { 88, 89, 124, 11, 6, 96 }; |
45 | static unsigned int col_gpios[7] = { 90, 91, 100, 36, 12, 97, 98 }; | 44 | static unsigned int col_gpios[7] = { 90, 91, 100, 36, 12, 97, 98 }; |
@@ -179,9 +178,11 @@ static int h4_select_irda(struct device *dev, int state) | |||
179 | return err; | 178 | return err; |
180 | } | 179 | } |
181 | 180 | ||
182 | static void set_trans_mode(void *data) | 181 | static void set_trans_mode(struct work_struct *work) |
183 | { | 182 | { |
184 | int *mode = data; | 183 | struct omap_irda_config *irda_config = |
184 | container_of(work, struct omap_irda_config, gpio_expa.work); | ||
185 | int mode = irda_config->mode; | ||
185 | unsigned char expa; | 186 | unsigned char expa; |
186 | int err = 0; | 187 | int err = 0; |
187 | 188 | ||
@@ -191,7 +192,7 @@ static void set_trans_mode(void *data) | |||
191 | 192 | ||
192 | expa &= ~0x01; | 193 | expa &= ~0x01; |
193 | 194 | ||
194 | if (!(*mode & IR_SIRMODE)) { /* MIR/FIR */ | 195 | if (!(mode & IR_SIRMODE)) { /* MIR/FIR */ |
195 | expa |= 0x01; | 196 | expa |= 0x01; |
196 | } | 197 | } |
197 | 198 | ||
@@ -204,9 +205,9 @@ static int h4_transceiver_mode(struct device *dev, int mode) | |||
204 | { | 205 | { |
205 | struct omap_irda_config *irda_config = dev->platform_data; | 206 | struct omap_irda_config *irda_config = dev->platform_data; |
206 | 207 | ||
208 | irda_config->mode = mode; | ||
207 | cancel_delayed_work(&irda_config->gpio_expa); | 209 | cancel_delayed_work(&irda_config->gpio_expa); |
208 | PREPARE_WORK(&irda_config->gpio_expa, set_trans_mode, &mode); | 210 | PREPARE_DELAYED_WORK(&irda_config->gpio_expa, set_trans_mode); |
209 | #error this is not permitted - mode is an argument variable | ||
210 | schedule_delayed_work(&irda_config->gpio_expa, 0); | 211 | schedule_delayed_work(&irda_config->gpio_expa, 0); |
211 | 212 | ||
212 | return 0; | 213 | return 0; |
diff --git a/arch/arm/mach-omap2/timer-gp.c b/arch/arm/mach-omap2/timer-gp.c index 973189cd9766..45d1aaa51b57 100644 --- a/arch/arm/mach-omap2/timer-gp.c +++ b/arch/arm/mach-omap2/timer-gp.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/err.h> | 24 | #include <linux/err.h> |
25 | #include <linux/clk.h> | 25 | #include <linux/clk.h> |
26 | #include <linux/delay.h> | 26 | #include <linux/delay.h> |
27 | #include <linux/irq.h> | ||
27 | 28 | ||
28 | #include <asm/mach/time.h> | 29 | #include <asm/mach/time.h> |
29 | #include <asm/arch/dmtimer.h> | 30 | #include <asm/arch/dmtimer.h> |
@@ -64,7 +65,7 @@ static void __init omap2_gp_timer_init(void) | |||
64 | BUG_ON(gptimer == NULL); | 65 | BUG_ON(gptimer == NULL); |
65 | 66 | ||
66 | omap_dm_timer_set_source(gptimer, OMAP_TIMER_SRC_SYS_CLK); | 67 | omap_dm_timer_set_source(gptimer, OMAP_TIMER_SRC_SYS_CLK); |
67 | tick_period = clk_get_rate(omap_dm_timer_get_fclk(gptimer)) / 100; | 68 | tick_period = clk_get_rate(omap_dm_timer_get_fclk(gptimer)) / HZ; |
68 | tick_period -= 1; | 69 | tick_period -= 1; |
69 | 70 | ||
70 | setup_irq(omap_dm_timer_get_irq(gptimer), &omap2_gp_timer_irq); | 71 | setup_irq(omap_dm_timer_get_irq(gptimer), &omap2_gp_timer_irq); |
diff --git a/arch/arm/mach-pxa/corgi_pm.c b/arch/arm/mach-pxa/corgi_pm.c index 165017de8d0d..392c38717362 100644 --- a/arch/arm/mach-pxa/corgi_pm.c +++ b/arch/arm/mach-pxa/corgi_pm.c | |||
@@ -16,7 +16,8 @@ | |||
16 | #include <linux/delay.h> | 16 | #include <linux/delay.h> |
17 | #include <linux/interrupt.h> | 17 | #include <linux/interrupt.h> |
18 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
19 | #include <asm/apm-emulation.h> | 19 | #include <linux/apm-emulation.h> |
20 | |||
20 | #include <asm/irq.h> | 21 | #include <asm/irq.h> |
21 | #include <asm/mach-types.h> | 22 | #include <asm/mach-types.h> |
22 | #include <asm/hardware.h> | 23 | #include <asm/hardware.h> |
diff --git a/arch/arm/mach-pxa/spitz_pm.c b/arch/arm/mach-pxa/spitz_pm.c index b97d543d9364..745a4dc7acdd 100644 --- a/arch/arm/mach-pxa/spitz_pm.c +++ b/arch/arm/mach-pxa/spitz_pm.c | |||
@@ -16,7 +16,8 @@ | |||
16 | #include <linux/delay.h> | 16 | #include <linux/delay.h> |
17 | #include <linux/interrupt.h> | 17 | #include <linux/interrupt.h> |
18 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
19 | #include <asm/apm-emulation.h> | 19 | #include <linux/apm-emulation.h> |
20 | |||
20 | #include <asm/irq.h> | 21 | #include <asm/irq.h> |
21 | #include <asm/mach-types.h> | 22 | #include <asm/mach-types.h> |
22 | #include <asm/hardware.h> | 23 | #include <asm/hardware.h> |
diff --git a/arch/arm/oprofile/common.c b/arch/arm/oprofile/common.c index 0a007b931f63..a9de727c9327 100644 --- a/arch/arm/oprofile/common.c +++ b/arch/arm/oprofile/common.c | |||
@@ -131,6 +131,8 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) | |||
131 | struct op_arm_model_spec *spec = NULL; | 131 | struct op_arm_model_spec *spec = NULL; |
132 | int ret = -ENODEV; | 132 | int ret = -ENODEV; |
133 | 133 | ||
134 | ops->backtrace = arm_backtrace; | ||
135 | |||
134 | #ifdef CONFIG_CPU_XSCALE | 136 | #ifdef CONFIG_CPU_XSCALE |
135 | spec = &op_xscale_spec; | 137 | spec = &op_xscale_spec; |
136 | #endif | 138 | #endif |
@@ -161,7 +163,6 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) | |||
161 | ops->start = op_arm_start; | 163 | ops->start = op_arm_start; |
162 | ops->stop = op_arm_stop; | 164 | ops->stop = op_arm_stop; |
163 | ops->cpu_type = op_arm_model->name; | 165 | ops->cpu_type = op_arm_model->name; |
164 | ops->backtrace = arm_backtrace; | ||
165 | printk(KERN_INFO "oprofile: using %s\n", spec->name); | 166 | printk(KERN_INFO "oprofile: using %s\n", spec->name); |
166 | } | 167 | } |
167 | 168 | ||
diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c index bb045e5ddbd8..f3f84fbf8b87 100644 --- a/arch/arm/plat-omap/dma.c +++ b/arch/arm/plat-omap/dma.c | |||
@@ -557,7 +557,7 @@ int omap_request_dma(int dev_id, const char *dev_name, | |||
557 | omap_enable_channel_irq(free_ch); | 557 | omap_enable_channel_irq(free_ch); |
558 | /* Clear the CSR register and IRQ status register */ | 558 | /* Clear the CSR register and IRQ status register */ |
559 | OMAP_DMA_CSR_REG(free_ch) = OMAP2_DMA_CSR_CLEAR_MASK; | 559 | OMAP_DMA_CSR_REG(free_ch) = OMAP2_DMA_CSR_CLEAR_MASK; |
560 | omap_writel(~0x0, OMAP_DMA4_IRQSTATUS_L0); | 560 | omap_writel(1 << free_ch, OMAP_DMA4_IRQSTATUS_L0); |
561 | } | 561 | } |
562 | 562 | ||
563 | *dma_ch_out = free_ch; | 563 | *dma_ch_out = free_ch; |
@@ -597,10 +597,7 @@ void omap_free_dma(int lch) | |||
597 | 597 | ||
598 | /* Clear the CSR register and IRQ status register */ | 598 | /* Clear the CSR register and IRQ status register */ |
599 | OMAP_DMA_CSR_REG(lch) = OMAP2_DMA_CSR_CLEAR_MASK; | 599 | OMAP_DMA_CSR_REG(lch) = OMAP2_DMA_CSR_CLEAR_MASK; |
600 | 600 | omap_writel(1 << lch, OMAP_DMA4_IRQSTATUS_L0); | |
601 | val = omap_readl(OMAP_DMA4_IRQSTATUS_L0); | ||
602 | val |= 1 << lch; | ||
603 | omap_writel(val, OMAP_DMA4_IRQSTATUS_L0); | ||
604 | 601 | ||
605 | /* Disable all DMA interrupts for the channel. */ | 602 | /* Disable all DMA interrupts for the channel. */ |
606 | OMAP_DMA_CICR_REG(lch) = 0; | 603 | OMAP_DMA_CICR_REG(lch) = 0; |
@@ -927,7 +924,6 @@ static irqreturn_t omap1_dma_irq_handler(int irq, void *dev_id) | |||
927 | static int omap2_dma_handle_ch(int ch) | 924 | static int omap2_dma_handle_ch(int ch) |
928 | { | 925 | { |
929 | u32 status = OMAP_DMA_CSR_REG(ch); | 926 | u32 status = OMAP_DMA_CSR_REG(ch); |
930 | u32 val; | ||
931 | 927 | ||
932 | if (!status) | 928 | if (!status) |
933 | return 0; | 929 | return 0; |
@@ -948,11 +944,7 @@ static int omap2_dma_handle_ch(int ch) | |||
948 | dma_chan[ch].dev_id); | 944 | dma_chan[ch].dev_id); |
949 | 945 | ||
950 | OMAP_DMA_CSR_REG(ch) = OMAP2_DMA_CSR_CLEAR_MASK; | 946 | OMAP_DMA_CSR_REG(ch) = OMAP2_DMA_CSR_CLEAR_MASK; |
951 | 947 | omap_writel(1 << ch, OMAP_DMA4_IRQSTATUS_L0); | |
952 | val = omap_readl(OMAP_DMA4_IRQSTATUS_L0); | ||
953 | /* ch in this function is from 0-31 while in register it is 1-32 */ | ||
954 | val = 1 << (ch); | ||
955 | omap_writel(val, OMAP_DMA4_IRQSTATUS_L0); | ||
956 | 948 | ||
957 | if (likely(dma_chan[ch].callback != NULL)) | 949 | if (likely(dma_chan[ch].callback != NULL)) |
958 | dma_chan[ch].callback(ch, status, dma_chan[ch].data); | 950 | dma_chan[ch].callback(ch, status, dma_chan[ch].data); |
diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c index bcbb8d7392be..45f0439bffba 100644 --- a/arch/arm/plat-omap/dmtimer.c +++ b/arch/arm/plat-omap/dmtimer.c | |||
@@ -90,8 +90,8 @@ static struct omap_dm_timer dm_timers[] = { | |||
90 | { .phys_base = 0xfffb2c00, .irq = INT_1610_GPTIMER4 }, | 90 | { .phys_base = 0xfffb2c00, .irq = INT_1610_GPTIMER4 }, |
91 | { .phys_base = 0xfffb3400, .irq = INT_1610_GPTIMER5 }, | 91 | { .phys_base = 0xfffb3400, .irq = INT_1610_GPTIMER5 }, |
92 | { .phys_base = 0xfffb3c00, .irq = INT_1610_GPTIMER6 }, | 92 | { .phys_base = 0xfffb3c00, .irq = INT_1610_GPTIMER6 }, |
93 | { .phys_base = 0xfffb4400, .irq = INT_1610_GPTIMER7 }, | 93 | { .phys_base = 0xfffb7400, .irq = INT_1610_GPTIMER7 }, |
94 | { .phys_base = 0xfffb4c00, .irq = INT_1610_GPTIMER8 }, | 94 | { .phys_base = 0xfffbd400, .irq = INT_1610_GPTIMER8 }, |
95 | }; | 95 | }; |
96 | 96 | ||
97 | #elif defined(CONFIG_ARCH_OMAP2) | 97 | #elif defined(CONFIG_ARCH_OMAP2) |
@@ -314,6 +314,8 @@ struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer) | |||
314 | __u32 omap_dm_timer_modify_idlect_mask(__u32 inputmask) | 314 | __u32 omap_dm_timer_modify_idlect_mask(__u32 inputmask) |
315 | { | 315 | { |
316 | BUG(); | 316 | BUG(); |
317 | |||
318 | return 0; | ||
317 | } | 319 | } |
318 | 320 | ||
319 | #endif | 321 | #endif |
diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c index 4f2fd5591337..b8c01de208b4 100644 --- a/arch/arm/plat-omap/gpio.c +++ b/arch/arm/plat-omap/gpio.c | |||
@@ -974,10 +974,11 @@ static struct irq_chip gpio_irq_chip = { | |||
974 | }; | 974 | }; |
975 | 975 | ||
976 | static struct irq_chip mpuio_irq_chip = { | 976 | static struct irq_chip mpuio_irq_chip = { |
977 | .name = "MPUIO", | 977 | .name = "MPUIO", |
978 | .ack = mpuio_ack_irq, | 978 | .ack = mpuio_ack_irq, |
979 | .mask = mpuio_mask_irq, | 979 | .mask = mpuio_mask_irq, |
980 | .unmask = mpuio_unmask_irq | 980 | .unmask = mpuio_unmask_irq, |
981 | .set_type = gpio_irq_type, | ||
981 | }; | 982 | }; |
982 | 983 | ||
983 | static int initialized; | 984 | static int initialized; |
diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c index ec50008a2df6..b8d6f17ff58f 100644 --- a/arch/arm/plat-omap/mcbsp.c +++ b/arch/arm/plat-omap/mcbsp.c | |||
@@ -20,8 +20,8 @@ | |||
20 | #include <linux/interrupt.h> | 20 | #include <linux/interrupt.h> |
21 | #include <linux/err.h> | 21 | #include <linux/err.h> |
22 | #include <linux/clk.h> | 22 | #include <linux/clk.h> |
23 | #include <linux/delay.h> | ||
23 | 24 | ||
24 | #include <asm/delay.h> | ||
25 | #include <asm/io.h> | 25 | #include <asm/io.h> |
26 | #include <asm/irq.h> | 26 | #include <asm/irq.h> |
27 | 27 | ||
diff --git a/arch/arm/plat-omap/mux.c b/arch/arm/plat-omap/mux.c index 042105ac30b8..6c798d288688 100644 --- a/arch/arm/plat-omap/mux.c +++ b/arch/arm/plat-omap/mux.c | |||
@@ -116,7 +116,7 @@ int __init_or_module omap_cfg_reg(const unsigned long index) | |||
116 | } | 116 | } |
117 | 117 | ||
118 | /* Check for pull up or pull down selection on 1610 */ | 118 | /* Check for pull up or pull down selection on 1610 */ |
119 | if (!cpu_is_omap1510()) { | 119 | if (!cpu_is_omap15xx()) { |
120 | if (cfg->pu_pd_reg && cfg->pull_val) { | 120 | if (cfg->pu_pd_reg && cfg->pull_val) { |
121 | spin_lock_irqsave(&mux_spin_lock, flags); | 121 | spin_lock_irqsave(&mux_spin_lock, flags); |
122 | pu_pd_orig = omap_readl(cfg->pu_pd_reg); | 122 | pu_pd_orig = omap_readl(cfg->pu_pd_reg); |
@@ -172,7 +172,7 @@ int __init_or_module omap_cfg_reg(const unsigned long index) | |||
172 | printk(" %s (0x%08x) = 0x%08x -> 0x%08x\n", | 172 | printk(" %s (0x%08x) = 0x%08x -> 0x%08x\n", |
173 | cfg->mux_reg_name, cfg->mux_reg, reg_orig, reg); | 173 | cfg->mux_reg_name, cfg->mux_reg, reg_orig, reg); |
174 | 174 | ||
175 | if (!cpu_is_omap1510()) { | 175 | if (!cpu_is_omap15xx()) { |
176 | if (cfg->pu_pd_reg && cfg->pull_val) { | 176 | if (cfg->pu_pd_reg && cfg->pull_val) { |
177 | printk(" %s (0x%08x) = 0x%08x -> 0x%08x\n", | 177 | printk(" %s (0x%08x) = 0x%08x -> 0x%08x\n", |
178 | cfg->pu_pd_name, cfg->pu_pd_reg, | 178 | cfg->pu_pd_name, cfg->pu_pd_reg, |
diff --git a/arch/arm/plat-s3c24xx/Kconfig b/arch/arm/plat-s3c24xx/Kconfig index 860869528f4c..b972f36d547c 100644 --- a/arch/arm/plat-s3c24xx/Kconfig +++ b/arch/arm/plat-s3c24xx/Kconfig | |||
@@ -58,6 +58,11 @@ config S3C2410_PM_CHECK | |||
58 | going to sleep. The blocks are then checked on resume for any | 58 | going to sleep. The blocks are then checked on resume for any |
59 | errors. | 59 | errors. |
60 | 60 | ||
61 | Note, this can take several seconds depending on memory size | ||
62 | and CPU speed. | ||
63 | |||
64 | See <file:Documentation/arm/Samsung-S3C24XX/Suspend.txt> | ||
65 | |||
61 | config S3C2410_PM_CHECK_CHUNKSIZE | 66 | config S3C2410_PM_CHECK_CHUNKSIZE |
62 | int "S3C2410 PM Suspend CRC Chunksize (KiB)" | 67 | int "S3C2410 PM Suspend CRC Chunksize (KiB)" |
63 | depends on ARCH_S3C2410 && PM && S3C2410_PM_CHECK | 68 | depends on ARCH_S3C2410 && PM && S3C2410_PM_CHECK |
@@ -68,6 +73,8 @@ config S3C2410_PM_CHECK_CHUNKSIZE | |||
68 | the CRC data block will take more memory, but wil identify any | 73 | the CRC data block will take more memory, but wil identify any |
69 | faults with better precision. | 74 | faults with better precision. |
70 | 75 | ||
76 | See <file:Documentation/arm/Samsung-S3C24XX/Suspend.txt> | ||
77 | |||
71 | config S3C2410_LOWLEVEL_UART_PORT | 78 | config S3C2410_LOWLEVEL_UART_PORT |
72 | int "S3C2410 UART to use for low-level messages" | 79 | int "S3C2410 UART to use for low-level messages" |
73 | default 0 | 80 | default 0 |
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 71729d0f013d..4ec2dd5455f3 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -176,7 +176,7 @@ config MACH_DECSTATION | |||
176 | bool "DECstations" | 176 | bool "DECstations" |
177 | select BOOT_ELF32 | 177 | select BOOT_ELF32 |
178 | select DMA_NONCOHERENT | 178 | select DMA_NONCOHERENT |
179 | select EARLY_PRINTK | 179 | select SYS_HAS_EARLY_PRINTK |
180 | select IRQ_CPU | 180 | select IRQ_CPU |
181 | select SYS_HAS_CPU_R3000 | 181 | select SYS_HAS_CPU_R3000 |
182 | select SYS_HAS_CPU_R4X00 | 182 | select SYS_HAS_CPU_R4X00 |
@@ -242,6 +242,7 @@ config MACH_JAZZ | |||
242 | config LASAT | 242 | config LASAT |
243 | bool "LASAT Networks platforms" | 243 | bool "LASAT Networks platforms" |
244 | select DMA_NONCOHERENT | 244 | select DMA_NONCOHERENT |
245 | select SYS_HAS_EARLY_PRINTK | ||
245 | select HW_HAS_PCI | 246 | select HW_HAS_PCI |
246 | select MIPS_GT64120 | 247 | select MIPS_GT64120 |
247 | select MIPS_NILE4 | 248 | select MIPS_NILE4 |
@@ -256,6 +257,7 @@ config MIPS_ATLAS | |||
256 | bool "MIPS Atlas board" | 257 | bool "MIPS Atlas board" |
257 | select BOOT_ELF32 | 258 | select BOOT_ELF32 |
258 | select DMA_NONCOHERENT | 259 | select DMA_NONCOHERENT |
260 | select SYS_HAS_EARLY_PRINTK | ||
259 | select IRQ_CPU | 261 | select IRQ_CPU |
260 | select HW_HAS_PCI | 262 | select HW_HAS_PCI |
261 | select MIPS_BOARDS_GEN | 263 | select MIPS_BOARDS_GEN |
@@ -301,6 +303,7 @@ config MIPS_MALTA | |||
301 | select SYS_HAS_CPU_MIPS64_R1 | 303 | select SYS_HAS_CPU_MIPS64_R1 |
302 | select SYS_HAS_CPU_NEVADA | 304 | select SYS_HAS_CPU_NEVADA |
303 | select SYS_HAS_CPU_RM7000 | 305 | select SYS_HAS_CPU_RM7000 |
306 | select SYS_HAS_EARLY_PRINTK | ||
304 | select SYS_SUPPORTS_32BIT_KERNEL | 307 | select SYS_SUPPORTS_32BIT_KERNEL |
305 | select SYS_SUPPORTS_64BIT_KERNEL | 308 | select SYS_SUPPORTS_64BIT_KERNEL |
306 | select SYS_SUPPORTS_BIG_ENDIAN | 309 | select SYS_SUPPORTS_BIG_ENDIAN |
@@ -316,6 +319,7 @@ config MIPS_SEAD | |||
316 | depends on EXPERIMENTAL | 319 | depends on EXPERIMENTAL |
317 | select IRQ_CPU | 320 | select IRQ_CPU |
318 | select DMA_NONCOHERENT | 321 | select DMA_NONCOHERENT |
322 | select SYS_HAS_EARLY_PRINTK | ||
319 | select MIPS_BOARDS_GEN | 323 | select MIPS_BOARDS_GEN |
320 | select SYS_HAS_CPU_MIPS32_R1 | 324 | select SYS_HAS_CPU_MIPS32_R1 |
321 | select SYS_HAS_CPU_MIPS32_R2 | 325 | select SYS_HAS_CPU_MIPS32_R2 |
@@ -353,9 +357,11 @@ config WR_PPMC | |||
353 | config MIPS_SIM | 357 | config MIPS_SIM |
354 | bool 'MIPS simulator (MIPSsim)' | 358 | bool 'MIPS simulator (MIPSsim)' |
355 | select DMA_NONCOHERENT | 359 | select DMA_NONCOHERENT |
360 | select SYS_HAS_EARLY_PRINTK | ||
356 | select IRQ_CPU | 361 | select IRQ_CPU |
357 | select SYS_HAS_CPU_MIPS32_R1 | 362 | select SYS_HAS_CPU_MIPS32_R1 |
358 | select SYS_HAS_CPU_MIPS32_R2 | 363 | select SYS_HAS_CPU_MIPS32_R2 |
364 | select SYS_HAS_EARLY_PRINTK | ||
359 | select SYS_SUPPORTS_32BIT_KERNEL | 365 | select SYS_SUPPORTS_32BIT_KERNEL |
360 | select SYS_SUPPORTS_BIG_ENDIAN | 366 | select SYS_SUPPORTS_BIG_ENDIAN |
361 | select SYS_SUPPORTS_LITTLE_ENDIAN | 367 | select SYS_SUPPORTS_LITTLE_ENDIAN |
@@ -376,6 +382,7 @@ config MOMENCO_JAGUAR_ATX | |||
376 | select RM7000_CPU_SCACHE | 382 | select RM7000_CPU_SCACHE |
377 | select SWAP_IO_SPACE | 383 | select SWAP_IO_SPACE |
378 | select SYS_HAS_CPU_RM9000 | 384 | select SYS_HAS_CPU_RM9000 |
385 | select SYS_HAS_EARLY_PRINTK | ||
379 | select SYS_SUPPORTS_32BIT_KERNEL | 386 | select SYS_SUPPORTS_32BIT_KERNEL |
380 | select SYS_SUPPORTS_64BIT_KERNEL | 387 | select SYS_SUPPORTS_64BIT_KERNEL |
381 | select SYS_SUPPORTS_BIG_ENDIAN | 388 | select SYS_SUPPORTS_BIG_ENDIAN |
@@ -513,6 +520,7 @@ config PMC_YOSEMITE | |||
513 | select IRQ_CPU_RM9K | 520 | select IRQ_CPU_RM9K |
514 | select SWAP_IO_SPACE | 521 | select SWAP_IO_SPACE |
515 | select SYS_HAS_CPU_RM9000 | 522 | select SYS_HAS_CPU_RM9000 |
523 | select SYS_HAS_EARLY_PRINTK | ||
516 | select SYS_SUPPORTS_32BIT_KERNEL | 524 | select SYS_SUPPORTS_32BIT_KERNEL |
517 | select SYS_SUPPORTS_64BIT_KERNEL | 525 | select SYS_SUPPORTS_64BIT_KERNEL |
518 | select SYS_SUPPORTS_BIG_ENDIAN | 526 | select SYS_SUPPORTS_BIG_ENDIAN |
@@ -573,6 +581,7 @@ config SGI_IP22 | |||
573 | select SWAP_IO_SPACE | 581 | select SWAP_IO_SPACE |
574 | select SYS_HAS_CPU_R4X00 | 582 | select SYS_HAS_CPU_R4X00 |
575 | select SYS_HAS_CPU_R5000 | 583 | select SYS_HAS_CPU_R5000 |
584 | select SYS_HAS_EARLY_PRINTK | ||
576 | select SYS_SUPPORTS_32BIT_KERNEL | 585 | select SYS_SUPPORTS_32BIT_KERNEL |
577 | select SYS_SUPPORTS_64BIT_KERNEL | 586 | select SYS_SUPPORTS_64BIT_KERNEL |
578 | select SYS_SUPPORTS_BIG_ENDIAN | 587 | select SYS_SUPPORTS_BIG_ENDIAN |
@@ -587,7 +596,7 @@ config SGI_IP27 | |||
587 | select ARC64 | 596 | select ARC64 |
588 | select BOOT_ELF64 | 597 | select BOOT_ELF64 |
589 | select DMA_IP27 | 598 | select DMA_IP27 |
590 | select EARLY_PRINTK | 599 | select SYS_HAS_EARLY_PRINTK |
591 | select HW_HAS_PCI | 600 | select HW_HAS_PCI |
592 | select NR_CPUS_DEFAULT_64 | 601 | select NR_CPUS_DEFAULT_64 |
593 | select PCI_DOMAINS | 602 | select PCI_DOMAINS |
@@ -749,6 +758,7 @@ config SNI_RM | |||
749 | select SYS_HAS_CPU_R5000 | 758 | select SYS_HAS_CPU_R5000 |
750 | select SYS_HAS_CPU_R10000 | 759 | select SYS_HAS_CPU_R10000 |
751 | select R5000_CPU_SCACHE | 760 | select R5000_CPU_SCACHE |
761 | select SYS_HAS_EARLY_PRINTK | ||
752 | select SYS_SUPPORTS_32BIT_KERNEL | 762 | select SYS_SUPPORTS_32BIT_KERNEL |
753 | select SYS_SUPPORTS_64BIT_KERNEL if EXPERIMENTAL | 763 | select SYS_SUPPORTS_64BIT_KERNEL if EXPERIMENTAL |
754 | select SYS_SUPPORTS_BIG_ENDIAN | 764 | select SYS_SUPPORTS_BIG_ENDIAN |
@@ -897,6 +907,20 @@ config DMA_NEED_PCI_MAP_STATE | |||
897 | bool | 907 | bool |
898 | 908 | ||
899 | config EARLY_PRINTK | 909 | config EARLY_PRINTK |
910 | bool "Early printk" if EMBEDDED && DEBUG_KERNEL | ||
911 | depends on SYS_HAS_EARLY_PRINTK | ||
912 | default y | ||
913 | help | ||
914 | This option enables special console drivers which allow the kernel | ||
915 | to print messages very early in the bootup process. | ||
916 | |||
917 | This is useful for kernel debugging when your machine crashes very | ||
918 | early before the console code is initialized. For normal operation | ||
919 | it is not recommended because it looks on some machines ugly and | ||
920 | oesn't cooperate with an X server. You should normally N here, | ||
921 | unless you want to debug such a crash. | ||
922 | |||
923 | config SYS_HAS_EARLY_PRINTK | ||
900 | bool | 924 | bool |
901 | 925 | ||
902 | config GENERIC_ISA_DMA | 926 | config GENERIC_ISA_DMA |
@@ -1033,6 +1057,7 @@ config SOC_PNX8550 | |||
1033 | select DMA_NONCOHERENT | 1057 | select DMA_NONCOHERENT |
1034 | select HW_HAS_PCI | 1058 | select HW_HAS_PCI |
1035 | select SYS_HAS_CPU_MIPS32_R1 | 1059 | select SYS_HAS_CPU_MIPS32_R1 |
1060 | select SYS_HAS_EARLY_PRINTK | ||
1036 | select SYS_SUPPORTS_32BIT_KERNEL | 1061 | select SYS_SUPPORTS_32BIT_KERNEL |
1037 | select GENERIC_HARDIRQS_NO__DO_IRQ | 1062 | select GENERIC_HARDIRQS_NO__DO_IRQ |
1038 | select SYS_SUPPORTS_KGDB | 1063 | select SYS_SUPPORTS_KGDB |
@@ -1093,7 +1118,7 @@ config HAVE_STD_PC_SERIAL_PORT | |||
1093 | 1118 | ||
1094 | config ARC_CONSOLE | 1119 | config ARC_CONSOLE |
1095 | bool "ARC console support" | 1120 | bool "ARC console support" |
1096 | depends on SGI_IP22 || SNI_RM | 1121 | depends on SGI_IP22 || (SNI_RM && CPU_LITTLE_ENDIAN) |
1097 | 1122 | ||
1098 | config ARC_MEMORY | 1123 | config ARC_MEMORY |
1099 | bool | 1124 | bool |
@@ -1895,10 +1920,6 @@ config HZ | |||
1895 | 1920 | ||
1896 | source "kernel/Kconfig.preempt" | 1921 | source "kernel/Kconfig.preempt" |
1897 | 1922 | ||
1898 | config RTC_DS1742 | ||
1899 | bool "DS1742 BRAM/RTC support" | ||
1900 | depends on TOSHIBA_JMR3927 || TOSHIBA_RBTX4927 | ||
1901 | |||
1902 | config MIPS_INSANE_LARGE | 1923 | config MIPS_INSANE_LARGE |
1903 | bool "Support for large 64-bit configurations" | 1924 | bool "Support for large 64-bit configurations" |
1904 | depends on CPU_R10000 && 64BIT | 1925 | depends on CPU_R10000 && 64BIT |
diff --git a/arch/mips/arc/console.c b/arch/mips/arc/console.c index 6a9d144512c0..0fe6032999cb 100644 --- a/arch/mips/arc/console.c +++ b/arch/mips/arc/console.c | |||
@@ -29,35 +29,3 @@ void prom_putchar(char c) | |||
29 | ArcWrite(1, &it, 1, &cnt); | 29 | ArcWrite(1, &it, 1, &cnt); |
30 | bc_enable(); | 30 | bc_enable(); |
31 | } | 31 | } |
32 | |||
33 | char prom_getchar(void) | ||
34 | { | ||
35 | ULONG cnt; | ||
36 | CHAR c; | ||
37 | |||
38 | bc_disable(); | ||
39 | ArcRead(0, &c, 1, &cnt); | ||
40 | bc_enable(); | ||
41 | |||
42 | return c; | ||
43 | } | ||
44 | |||
45 | void prom_printf(char *fmt, ...) | ||
46 | { | ||
47 | va_list args; | ||
48 | char ppbuf[1024]; | ||
49 | char *bptr; | ||
50 | |||
51 | va_start(args, fmt); | ||
52 | vsprintf(ppbuf, fmt, args); | ||
53 | |||
54 | bptr = ppbuf; | ||
55 | |||
56 | while (*bptr != 0) { | ||
57 | if (*bptr == '\n') | ||
58 | prom_putchar('\r'); | ||
59 | |||
60 | prom_putchar(*bptr++); | ||
61 | } | ||
62 | va_end(args); | ||
63 | } | ||
diff --git a/arch/mips/arc/init.c b/arch/mips/arc/init.c index 76ab505ca693..0ac8f42d3752 100644 --- a/arch/mips/arc/init.c +++ b/arch/mips/arc/init.c | |||
@@ -24,12 +24,15 @@ void __init prom_init(void) | |||
24 | { | 24 | { |
25 | PSYSTEM_PARAMETER_BLOCK pb = PROMBLOCK; | 25 | PSYSTEM_PARAMETER_BLOCK pb = PROMBLOCK; |
26 | romvec = ROMVECTOR; | 26 | romvec = ROMVECTOR; |
27 | ULONG cnt; | ||
28 | CHAR c; | ||
29 | |||
27 | prom_argc = fw_arg0; | 30 | prom_argc = fw_arg0; |
28 | _prom_argv = (LONG *) fw_arg1; | 31 | _prom_argv = (LONG *) fw_arg1; |
29 | _prom_envp = (LONG *) fw_arg2; | 32 | _prom_envp = (LONG *) fw_arg2; |
30 | 33 | ||
31 | if (pb->magic != 0x53435241) { | 34 | if (pb->magic != 0x53435241) { |
32 | prom_printf("Aieee, bad prom vector magic %08lx\n", pb->magic); | 35 | printk(KERN_CRIT "Aieee, bad prom vector magic %08lx\n", pb->magic); |
33 | while(1) | 36 | while(1) |
34 | ; | 37 | ; |
35 | } | 38 | } |
@@ -41,8 +44,8 @@ void __init prom_init(void) | |||
41 | prom_meminit(); | 44 | prom_meminit(); |
42 | 45 | ||
43 | #ifdef DEBUG_PROM_INIT | 46 | #ifdef DEBUG_PROM_INIT |
44 | prom_printf("Press a key to reboot\n"); | 47 | pr_info("Press a key to reboot\n"); |
45 | prom_getchar(); | 48 | ArcRead(0, &c, 1, &cnt); |
46 | ArcEnterInteractiveMode(); | 49 | ArcEnterInteractiveMode(); |
47 | #endif | 50 | #endif |
48 | } | 51 | } |
diff --git a/arch/mips/arc/memory.c b/arch/mips/arc/memory.c index 456cb81a32d9..83d15791ef6a 100644 --- a/arch/mips/arc/memory.c +++ b/arch/mips/arc/memory.c | |||
@@ -118,11 +118,11 @@ void __init prom_meminit(void) | |||
118 | #ifdef DEBUG | 118 | #ifdef DEBUG |
119 | int i = 0; | 119 | int i = 0; |
120 | 120 | ||
121 | prom_printf("ARCS MEMORY DESCRIPTOR dump:\n"); | 121 | printk("ARCS MEMORY DESCRIPTOR dump:\n"); |
122 | p = ArcGetMemoryDescriptor(PROM_NULL_MDESC); | 122 | p = ArcGetMemoryDescriptor(PROM_NULL_MDESC); |
123 | while(p) { | 123 | while(p) { |
124 | prom_printf("[%d,%p]: base<%08lx> pages<%08lx> type<%s>\n", | 124 | printk("[%d,%p]: base<%08lx> pages<%08lx> type<%s>\n", |
125 | i, p, p->base, p->pages, mtypes(p->type)); | 125 | i, p, p->base, p->pages, mtypes(p->type)); |
126 | p = ArcGetMemoryDescriptor(p); | 126 | p = ArcGetMemoryDescriptor(p); |
127 | i++; | 127 | i++; |
128 | } | 128 | } |
diff --git a/arch/mips/arc/tree.c b/arch/mips/arc/tree.c index 2aedd4f52839..abd1786ea09b 100644 --- a/arch/mips/arc/tree.c +++ b/arch/mips/arc/tree.c | |||
@@ -93,11 +93,11 @@ static char *iflags[] = { | |||
93 | static void __init | 93 | static void __init |
94 | dump_component(pcomponent *p) | 94 | dump_component(pcomponent *p) |
95 | { | 95 | { |
96 | prom_printf("[%p]:class<%s>type<%s>flags<%s>ver<%d>rev<%d>", | 96 | printk("[%p]:class<%s>type<%s>flags<%s>ver<%d>rev<%d>", |
97 | p, classes[p->class], types[p->type], | 97 | p, classes[p->class], types[p->type], |
98 | iflags[p->iflags], p->vers, p->rev); | 98 | iflags[p->iflags], p->vers, p->rev); |
99 | prom_printf("key<%08lx>\n\tamask<%08lx>cdsize<%d>ilen<%d>iname<%s>\n", | 99 | printk("key<%08lx>\n\tamask<%08lx>cdsize<%d>ilen<%d>iname<%s>\n", |
100 | p->key, p->amask, (int)p->cdsize, (int)p->ilen, p->iname); | 100 | p->key, p->amask, (int)p->cdsize, (int)p->ilen, p->iname); |
101 | } | 101 | } |
102 | 102 | ||
103 | static void __init | 103 | static void __init |
diff --git a/arch/mips/au1000/mtx-1/board_setup.c b/arch/mips/au1000/mtx-1/board_setup.c index 13f9bf5f91a6..7bc5af8917da 100644 --- a/arch/mips/au1000/mtx-1/board_setup.c +++ b/arch/mips/au1000/mtx-1/board_setup.c | |||
@@ -43,6 +43,9 @@ | |||
43 | #include <asm/pgtable.h> | 43 | #include <asm/pgtable.h> |
44 | #include <asm/mach-au1x00/au1000.h> | 44 | #include <asm/mach-au1x00/au1000.h> |
45 | 45 | ||
46 | extern int (*board_pci_idsel)(unsigned int devsel, int assert); | ||
47 | int mtx1_pci_idsel(unsigned int devsel, int assert); | ||
48 | |||
46 | void board_reset (void) | 49 | void board_reset (void) |
47 | { | 50 | { |
48 | /* Hit BCSR.SYSTEM_CONTROL[SW_RST] */ | 51 | /* Hit BCSR.SYSTEM_CONTROL[SW_RST] */ |
@@ -66,19 +69,43 @@ void __init board_setup(void) | |||
66 | #endif | 69 | #endif |
67 | 70 | ||
68 | // initialize sys_pinfunc: | 71 | // initialize sys_pinfunc: |
69 | // disable second ethernet port (SYS_PF_NI2) | 72 | au_writel( SYS_PF_NI2, SYS_PINFUNC ); |
70 | // set U3/GPIO23 to GPIO23 (SYS_PF_U3) | ||
71 | au_writel( SYS_PF_NI2 | SYS_PF_U3, SYS_PINFUNC ); | ||
72 | 73 | ||
73 | // initialize GPIO | 74 | // initialize GPIO |
74 | au_writel( 0xFFFFFFFF, SYS_TRIOUTCLR ); | 75 | au_writel( 0xFFFFFFFF, SYS_TRIOUTCLR ); |
75 | au_writel( 0x00000001, SYS_OUTPUTCLR ); // set M66EN (PCI 66MHz) to OFF | 76 | au_writel( 0x00000001, SYS_OUTPUTCLR ); // set M66EN (PCI 66MHz) to OFF |
76 | au_writel( 0x00000008, SYS_OUTPUTSET ); // set PCI CLKRUN# to OFF | 77 | au_writel( 0x00000008, SYS_OUTPUTSET ); // set PCI CLKRUN# to OFF |
78 | au_writel( 0x00000002, SYS_OUTPUTSET ); // set EXT_IO3 ON | ||
77 | au_writel( 0x00000020, SYS_OUTPUTCLR ); // set eth PHY TX_ER to OFF | 79 | au_writel( 0x00000020, SYS_OUTPUTCLR ); // set eth PHY TX_ER to OFF |
78 | 80 | ||
79 | // enable LED and set it to green | 81 | // enable LED and set it to green |
80 | au_writel( au_readl(GPIO2_DIR) | 0x1800, GPIO2_DIR ); | 82 | au_writel( au_readl(GPIO2_DIR) | 0x1800, GPIO2_DIR ); |
81 | au_writel( 0x18000800, GPIO2_OUTPUT ); | 83 | au_writel( 0x18000800, GPIO2_OUTPUT ); |
82 | 84 | ||
85 | board_pci_idsel = mtx1_pci_idsel; | ||
86 | |||
83 | printk("4G Systems MTX-1 Board\n"); | 87 | printk("4G Systems MTX-1 Board\n"); |
84 | } | 88 | } |
89 | |||
90 | int | ||
91 | mtx1_pci_idsel(unsigned int devsel, int assert) | ||
92 | { | ||
93 | #define MTX_IDSEL_ONLY_0_AND_3 0 | ||
94 | #if MTX_IDSEL_ONLY_0_AND_3 | ||
95 | if (devsel != 0 && devsel != 3) { | ||
96 | printk("*** not 0 or 3\n"); | ||
97 | return 0; | ||
98 | } | ||
99 | #endif | ||
100 | |||
101 | if (assert && devsel != 0) { | ||
102 | // supress signal to cardbus | ||
103 | au_writel( 0x00000002, SYS_OUTPUTCLR ); // set EXT_IO3 OFF | ||
104 | } | ||
105 | else { | ||
106 | au_writel( 0x00000002, SYS_OUTPUTSET ); // set EXT_IO3 ON | ||
107 | } | ||
108 | au_sync_udelay(1); | ||
109 | return 1; | ||
110 | } | ||
111 | |||
diff --git a/arch/mips/au1000/mtx-1/irqmap.c b/arch/mips/au1000/mtx-1/irqmap.c index 4693a4eb2b82..a4fa0f227e42 100644 --- a/arch/mips/au1000/mtx-1/irqmap.c +++ b/arch/mips/au1000/mtx-1/irqmap.c | |||
@@ -48,7 +48,7 @@ | |||
48 | #include <asm/mach-au1x00/au1000.h> | 48 | #include <asm/mach-au1x00/au1000.h> |
49 | 49 | ||
50 | char irq_tab_alchemy[][5] __initdata = { | 50 | char irq_tab_alchemy[][5] __initdata = { |
51 | [0] = { -1, INTA, INTB, INTX, INTX}, /* IDSEL 00 - AdapterA-Slot0 (top) */ | 51 | [0] = { -1, INTA, INTA, INTX, INTX}, /* IDSEL 00 - AdapterA-Slot0 (top) */ |
52 | [1] = { -1, INTB, INTA, INTX, INTX}, /* IDSEL 01 - AdapterA-Slot1 (bottom) */ | 52 | [1] = { -1, INTB, INTA, INTX, INTX}, /* IDSEL 01 - AdapterA-Slot1 (bottom) */ |
53 | [2] = { -1, INTC, INTD, INTX, INTX}, /* IDSEL 02 - AdapterB-Slot0 (top) */ | 53 | [2] = { -1, INTC, INTD, INTX, INTX}, /* IDSEL 02 - AdapterB-Slot0 (top) */ |
54 | [3] = { -1, INTD, INTC, INTX, INTX}, /* IDSEL 03 - AdapterB-Slot1 (bottom) */ | 54 | [3] = { -1, INTD, INTC, INTX, INTX}, /* IDSEL 03 - AdapterB-Slot1 (bottom) */ |
diff --git a/arch/mips/cobalt/console.c b/arch/mips/cobalt/console.c index 46c23b66bc17..fff20d28114f 100644 --- a/arch/mips/cobalt/console.c +++ b/arch/mips/cobalt/console.c | |||
@@ -19,29 +19,3 @@ static void putchar(int c) | |||
19 | 19 | ||
20 | COBALT_UART[UART_TX] = c; | 20 | COBALT_UART[UART_TX] = c; |
21 | } | 21 | } |
22 | |||
23 | static void cons_write(struct console *c, const char *s, unsigned n) | ||
24 | { | ||
25 | while(n-- && *s) | ||
26 | putchar(*s++); | ||
27 | } | ||
28 | |||
29 | static struct console cons_info = | ||
30 | { | ||
31 | .name = "uart", | ||
32 | .write = cons_write, | ||
33 | .flags = CON_PRINTBUFFER | CON_BOOT, | ||
34 | .index = -1, | ||
35 | }; | ||
36 | |||
37 | void __init cobalt_early_console(void) | ||
38 | { | ||
39 | register_console(&cons_info); | ||
40 | |||
41 | printk("Cobalt: early console registered\n"); | ||
42 | } | ||
43 | |||
44 | void __init disable_early_printk(void) | ||
45 | { | ||
46 | unregister_console(&cons_info); | ||
47 | } | ||
diff --git a/arch/mips/cobalt/setup.c b/arch/mips/cobalt/setup.c index 415ff8710b55..88d34f11385a 100644 --- a/arch/mips/cobalt/setup.c +++ b/arch/mips/cobalt/setup.c | |||
@@ -79,37 +79,38 @@ static struct resource cobalt_io_resource = { | |||
79 | .flags = IORESOURCE_IO | 79 | .flags = IORESOURCE_IO |
80 | }; | 80 | }; |
81 | 81 | ||
82 | static struct resource cobalt_io_resources[] = { | 82 | /* |
83 | { | 83 | * Cobalt doesn't have PS/2 keyboard/mouse interfaces, |
84 | * keyboard conntroller is never used. | ||
85 | * Also PCI-ISA bridge DMA contoroller is never used. | ||
86 | */ | ||
87 | static struct resource cobalt_reserved_resources[] = { | ||
88 | { /* dma1 */ | ||
84 | .start = 0x00, | 89 | .start = 0x00, |
85 | .end = 0x1f, | 90 | .end = 0x1f, |
86 | .name = "dma1", | 91 | .name = "reserved", |
87 | .flags = IORESOURCE_BUSY | 92 | .flags = IORESOURCE_BUSY | IORESOURCE_IO, |
88 | }, { | 93 | }, |
89 | .start = 0x40, | 94 | { /* keyboard */ |
90 | .end = 0x5f, | ||
91 | .name = "timer", | ||
92 | .flags = IORESOURCE_BUSY | ||
93 | }, { | ||
94 | .start = 0x60, | 95 | .start = 0x60, |
95 | .end = 0x6f, | 96 | .end = 0x6f, |
96 | .name = "keyboard", | 97 | .name = "reserved", |
97 | .flags = IORESOURCE_BUSY | 98 | .flags = IORESOURCE_BUSY | IORESOURCE_IO, |
98 | }, { | 99 | }, |
100 | { /* dma page reg */ | ||
99 | .start = 0x80, | 101 | .start = 0x80, |
100 | .end = 0x8f, | 102 | .end = 0x8f, |
101 | .name = "dma page reg", | 103 | .name = "reserved", |
102 | .flags = IORESOURCE_BUSY | 104 | .flags = IORESOURCE_BUSY | IORESOURCE_IO, |
103 | }, { | 105 | }, |
106 | { /* dma2 */ | ||
104 | .start = 0xc0, | 107 | .start = 0xc0, |
105 | .end = 0xdf, | 108 | .end = 0xdf, |
106 | .name = "dma2", | 109 | .name = "reserved", |
107 | .flags = IORESOURCE_BUSY | 110 | .flags = IORESOURCE_BUSY | IORESOURCE_IO, |
108 | }, | 111 | }, |
109 | }; | 112 | }; |
110 | 113 | ||
111 | #define COBALT_IO_RESOURCES (sizeof(cobalt_io_resources)/sizeof(struct resource)) | ||
112 | |||
113 | static struct pci_controller cobalt_pci_controller = { | 114 | static struct pci_controller cobalt_pci_controller = { |
114 | .pci_ops = >64111_pci_ops, | 115 | .pci_ops = >64111_pci_ops, |
115 | .mem_resource = &cobalt_mem_resource, | 116 | .mem_resource = &cobalt_mem_resource, |
@@ -133,9 +134,9 @@ void __init plat_mem_setup(void) | |||
133 | /* I/O port resource must include LCD/buttons */ | 134 | /* I/O port resource must include LCD/buttons */ |
134 | ioport_resource.end = 0x0fffffff; | 135 | ioport_resource.end = 0x0fffffff; |
135 | 136 | ||
136 | /* request I/O space for devices used on all i[345]86 PCs */ | 137 | /* These resources have been reserved by VIA SuperI/O chip. */ |
137 | for (i = 0; i < COBALT_IO_RESOURCES; i++) | 138 | for (i = 0; i < ARRAY_SIZE(cobalt_reserved_resources); i++) |
138 | request_resource(&ioport_resource, cobalt_io_resources + i); | 139 | request_resource(&ioport_resource, cobalt_reserved_resources + i); |
139 | 140 | ||
140 | /* Read the cobalt id register out of the PCI config space */ | 141 | /* Read the cobalt id register out of the PCI config space */ |
141 | PCI_CFG_SET(devfn, (VIA_COBALT_BRD_ID_REG & ~0x3)); | 142 | PCI_CFG_SET(devfn, (VIA_COBALT_BRD_ID_REG & ~0x3)); |
@@ -150,10 +151,6 @@ void __init plat_mem_setup(void) | |||
150 | #endif | 151 | #endif |
151 | 152 | ||
152 | if (cobalt_board_id > COBALT_BRD_ID_RAQ1) { | 153 | if (cobalt_board_id > COBALT_BRD_ID_RAQ1) { |
153 | #ifdef CONFIG_EARLY_PRINTK | ||
154 | cobalt_early_console(); | ||
155 | #endif | ||
156 | |||
157 | #ifdef CONFIG_SERIAL_8250 | 154 | #ifdef CONFIG_SERIAL_8250 |
158 | uart.line = 0; | 155 | uart.line = 0; |
159 | uart.type = PORT_UNKNOWN; | 156 | uart.type = PORT_UNKNOWN; |
diff --git a/arch/mips/configs/jmr3927_defconfig b/arch/mips/configs/jmr3927_defconfig index 9ebb522fbbbd..98b9fbc042f4 100644 --- a/arch/mips/configs/jmr3927_defconfig +++ b/arch/mips/configs/jmr3927_defconfig | |||
@@ -148,7 +148,6 @@ CONFIG_HZ=1000 | |||
148 | CONFIG_PREEMPT_NONE=y | 148 | CONFIG_PREEMPT_NONE=y |
149 | # CONFIG_PREEMPT_VOLUNTARY is not set | 149 | # CONFIG_PREEMPT_VOLUNTARY is not set |
150 | # CONFIG_PREEMPT is not set | 150 | # CONFIG_PREEMPT is not set |
151 | CONFIG_RTC_DS1742=y | ||
152 | # CONFIG_KEXEC is not set | 151 | # CONFIG_KEXEC is not set |
153 | CONFIG_LOCKDEP_SUPPORT=y | 152 | CONFIG_LOCKDEP_SUPPORT=y |
154 | CONFIG_STACKTRACE_SUPPORT=y | 153 | CONFIG_STACKTRACE_SUPPORT=y |
@@ -802,7 +801,28 @@ CONFIG_USB_ARCH_HAS_EHCI=y | |||
802 | # | 801 | # |
803 | # Real Time Clock | 802 | # Real Time Clock |
804 | # | 803 | # |
805 | # CONFIG_RTC_CLASS is not set | 804 | CONFIG_RTC_LIB=y |
805 | CONFIG_RTC_CLASS=y | ||
806 | CONFIG_RTC_HCTOSYS=y | ||
807 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
808 | # CONFIG_RTC_DEBUG is not set | ||
809 | |||
810 | # | ||
811 | # RTC interfaces | ||
812 | # | ||
813 | CONFIG_RTC_INTF_SYSFS=y | ||
814 | CONFIG_RTC_INTF_PROC=y | ||
815 | CONFIG_RTC_INTF_DEV=y | ||
816 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
817 | |||
818 | # | ||
819 | # RTC drivers | ||
820 | # | ||
821 | # CONFIG_RTC_DRV_DS1553 is not set | ||
822 | CONFIG_RTC_DRV_DS1742=y | ||
823 | # CONFIG_RTC_DRV_M48T86 is not set | ||
824 | # CONFIG_RTC_DRV_TEST is not set | ||
825 | # CONFIG_RTC_DRV_V3020 is not set | ||
806 | 826 | ||
807 | # | 827 | # |
808 | # DMA Engine support | 828 | # DMA Engine support |
diff --git a/arch/mips/dec/prom/console.c b/arch/mips/dec/prom/console.c index cade16ec7e5a..65419bf32441 100644 --- a/arch/mips/dec/prom/console.c +++ b/arch/mips/dec/prom/console.c | |||
@@ -16,40 +16,12 @@ | |||
16 | 16 | ||
17 | #include <asm/dec/prom.h> | 17 | #include <asm/dec/prom.h> |
18 | 18 | ||
19 | static void __init prom_console_write(struct console *con, const char *s, | 19 | void prom_putchar(char c) |
20 | unsigned int c) | ||
21 | { | 20 | { |
22 | static char sfmt[] __initdata = "%%%us"; | 21 | char s[2]; |
23 | char fmt[13]; | ||
24 | 22 | ||
25 | snprintf(fmt, sizeof(fmt), sfmt, c); | 23 | s[0] = c; |
26 | prom_printf(fmt, s); | 24 | s[1] = '\0'; |
27 | } | ||
28 | |||
29 | static struct console promcons __initdata = { | ||
30 | .name = "prom", | ||
31 | .write = prom_console_write, | ||
32 | .flags = CON_PRINTBUFFER, | ||
33 | .index = -1, | ||
34 | }; | ||
35 | |||
36 | static int promcons_output __initdata = 0; | ||
37 | |||
38 | void __init register_prom_console(void) | ||
39 | { | ||
40 | if (!promcons_output) { | ||
41 | promcons_output = 1; | ||
42 | register_console(&promcons); | ||
43 | } | ||
44 | } | ||
45 | 25 | ||
46 | void __init unregister_prom_console(void) | 26 | prom_printf( s); |
47 | { | ||
48 | if (promcons_output) { | ||
49 | unregister_console(&promcons); | ||
50 | promcons_output = 0; | ||
51 | } | ||
52 | } | 27 | } |
53 | |||
54 | void disable_early_printk(void) | ||
55 | __attribute__((alias("unregister_prom_console"))); | ||
diff --git a/arch/mips/dec/prom/identify.c b/arch/mips/dec/prom/identify.c index c4e3c1ea0d48..cd85924e2572 100644 --- a/arch/mips/dec/prom/identify.c +++ b/arch/mips/dec/prom/identify.c | |||
@@ -26,9 +26,6 @@ | |||
26 | 26 | ||
27 | #include "dectypes.h" | 27 | #include "dectypes.h" |
28 | 28 | ||
29 | extern unsigned long mips_machgroup; | ||
30 | extern unsigned long mips_machtype; | ||
31 | |||
32 | static const char *dec_system_strings[] = { | 29 | static const char *dec_system_strings[] = { |
33 | [MACH_DSUNKNOWN] "unknown DECstation", | 30 | [MACH_DSUNKNOWN] "unknown DECstation", |
34 | [MACH_DS23100] "DECstation 2100/3100", | 31 | [MACH_DS23100] "DECstation 2100/3100", |
diff --git a/arch/mips/gt64120/ev64120/promcon.c b/arch/mips/gt64120/ev64120/promcon.c index b5937c4ba7db..6e0ecfed9640 100644 --- a/arch/mips/gt64120/ev64120/promcon.c +++ b/arch/mips/gt64120/ev64120/promcon.c | |||
@@ -24,11 +24,6 @@ static void prom_console_write(struct console *co, const char *s, | |||
24 | } | 24 | } |
25 | } | 25 | } |
26 | 26 | ||
27 | int prom_getchar(void) | ||
28 | { | ||
29 | return 0; | ||
30 | } | ||
31 | |||
32 | static struct console sercons = { | 27 | static struct console sercons = { |
33 | .name = "ttyS", | 28 | .name = "ttyS", |
34 | .write = prom_console_write, | 29 | .write = prom_console_write, |
diff --git a/arch/mips/jmr3927/common/Makefile b/arch/mips/jmr3927/common/Makefile index cb09a8eede15..01e7db19bcbe 100644 --- a/arch/mips/jmr3927/common/Makefile +++ b/arch/mips/jmr3927/common/Makefile | |||
@@ -2,4 +2,4 @@ | |||
2 | # Makefile for the common code of TOSHIBA JMR-TX3927 board | 2 | # Makefile for the common code of TOSHIBA JMR-TX3927 board |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y += prom.o puts.o rtc_ds1742.o | 5 | obj-y += prom.o puts.o |
diff --git a/arch/mips/jmr3927/common/rtc_ds1742.c b/arch/mips/jmr3927/common/rtc_ds1742.c deleted file mode 100644 index e6561345d12a..000000000000 --- a/arch/mips/jmr3927/common/rtc_ds1742.c +++ /dev/null | |||
@@ -1,171 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2001 MontaVista Software Inc. | ||
3 | * Author: MontaVista Software, Inc. | ||
4 | * ahennessy@mvista.com | ||
5 | * | ||
6 | * arch/mips/jmr3927/common/rtc_ds1742.c | ||
7 | * Based on arch/mips/ddb5xxx/common/rtc_ds1386.c | ||
8 | * low-level RTC hookups for s for Dallas 1742 chip. | ||
9 | * | ||
10 | * Copyright (C) 2000-2001 Toshiba Corporation | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or modify it | ||
13 | * under the terms of the GNU General Public License as published by the | ||
14 | * Free Software Foundation; either version 2 of the License, or (at your | ||
15 | * option) any later version. | ||
16 | * | ||
17 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
18 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
19 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
20 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
21 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
22 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
23 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
24 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
25 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
26 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
27 | * | ||
28 | * You should have received a copy of the GNU General Public License along | ||
29 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
30 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
31 | */ | ||
32 | |||
33 | |||
34 | /* | ||
35 | * This file exports a function, rtc_ds1386_init(), which expects an | ||
36 | * uncached base address as the argument. It will set the two function | ||
37 | * pointers expected by the MIPS generic timer code. | ||
38 | */ | ||
39 | |||
40 | #include <linux/bcd.h> | ||
41 | #include <linux/types.h> | ||
42 | #include <linux/time.h> | ||
43 | #include <linux/rtc.h> | ||
44 | #include <linux/ds1742rtc.h> | ||
45 | |||
46 | #include <asm/time.h> | ||
47 | #include <asm/addrspace.h> | ||
48 | |||
49 | #include <asm/debug.h> | ||
50 | |||
51 | #define EPOCH 2000 | ||
52 | |||
53 | static unsigned long rtc_base; | ||
54 | |||
55 | static unsigned long | ||
56 | rtc_ds1742_get_time(void) | ||
57 | { | ||
58 | unsigned int year, month, day, hour, minute, second; | ||
59 | unsigned int century; | ||
60 | unsigned long flags; | ||
61 | |||
62 | spin_lock_irqsave(&rtc_lock, flags); | ||
63 | rtc_write(RTC_READ, RTC_CONTROL); | ||
64 | second = BCD2BIN(rtc_read(RTC_SECONDS) & RTC_SECONDS_MASK); | ||
65 | minute = BCD2BIN(rtc_read(RTC_MINUTES)); | ||
66 | hour = BCD2BIN(rtc_read(RTC_HOURS)); | ||
67 | day = BCD2BIN(rtc_read(RTC_DATE)); | ||
68 | month = BCD2BIN(rtc_read(RTC_MONTH)); | ||
69 | year = BCD2BIN(rtc_read(RTC_YEAR)); | ||
70 | century = BCD2BIN(rtc_read(RTC_CENTURY) & RTC_CENTURY_MASK); | ||
71 | rtc_write(0, RTC_CONTROL); | ||
72 | spin_unlock_irqrestore(&rtc_lock, flags); | ||
73 | |||
74 | year += century * 100; | ||
75 | |||
76 | return mktime(year, month, day, hour, minute, second); | ||
77 | } | ||
78 | extern void to_tm(unsigned long tim, struct rtc_time * tm); | ||
79 | |||
80 | static int | ||
81 | rtc_ds1742_set_time(unsigned long t) | ||
82 | { | ||
83 | struct rtc_time tm; | ||
84 | u8 year, month, day, hour, minute, second; | ||
85 | u8 cmos_year, cmos_month, cmos_day, cmos_hour, cmos_minute, cmos_second; | ||
86 | int cmos_century; | ||
87 | unsigned long flags; | ||
88 | |||
89 | spin_lock_irqsave(&rtc_lock, flags); | ||
90 | rtc_write(RTC_READ, RTC_CONTROL); | ||
91 | cmos_second = (u8)(rtc_read(RTC_SECONDS) & RTC_SECONDS_MASK); | ||
92 | cmos_minute = (u8)rtc_read(RTC_MINUTES); | ||
93 | cmos_hour = (u8)rtc_read(RTC_HOURS); | ||
94 | cmos_day = (u8)rtc_read(RTC_DATE); | ||
95 | cmos_month = (u8)rtc_read(RTC_MONTH); | ||
96 | cmos_year = (u8)rtc_read(RTC_YEAR); | ||
97 | cmos_century = rtc_read(RTC_CENTURY) & RTC_CENTURY_MASK; | ||
98 | |||
99 | rtc_write(RTC_WRITE, RTC_CONTROL); | ||
100 | |||
101 | /* convert */ | ||
102 | to_tm(t, &tm); | ||
103 | |||
104 | /* check each field one by one */ | ||
105 | year = BIN2BCD(tm.tm_year - EPOCH); | ||
106 | if (year != cmos_year) { | ||
107 | rtc_write(year,RTC_YEAR); | ||
108 | } | ||
109 | |||
110 | month = BIN2BCD(tm.tm_mon); | ||
111 | if (month != (cmos_month & 0x1f)) { | ||
112 | rtc_write((month & 0x1f) | (cmos_month & ~0x1f),RTC_MONTH); | ||
113 | } | ||
114 | |||
115 | day = BIN2BCD(tm.tm_mday); | ||
116 | if (day != cmos_day) { | ||
117 | |||
118 | rtc_write(day, RTC_DATE); | ||
119 | } | ||
120 | |||
121 | if (cmos_hour & 0x40) { | ||
122 | /* 12 hour format */ | ||
123 | hour = 0x40; | ||
124 | if (tm.tm_hour > 12) { | ||
125 | hour |= 0x20 | (BIN2BCD(hour-12) & 0x1f); | ||
126 | } else { | ||
127 | hour |= BIN2BCD(tm.tm_hour); | ||
128 | } | ||
129 | } else { | ||
130 | /* 24 hour format */ | ||
131 | hour = BIN2BCD(tm.tm_hour) & 0x3f; | ||
132 | } | ||
133 | if (hour != cmos_hour) rtc_write(hour, RTC_HOURS); | ||
134 | |||
135 | minute = BIN2BCD(tm.tm_min); | ||
136 | if (minute != cmos_minute) { | ||
137 | rtc_write(minute, RTC_MINUTES); | ||
138 | } | ||
139 | |||
140 | second = BIN2BCD(tm.tm_sec); | ||
141 | if (second != cmos_second) { | ||
142 | rtc_write(second & RTC_SECONDS_MASK,RTC_SECONDS); | ||
143 | } | ||
144 | |||
145 | /* RTC_CENTURY and RTC_CONTROL share same address... */ | ||
146 | rtc_write(cmos_century, RTC_CONTROL); | ||
147 | spin_unlock_irqrestore(&rtc_lock, flags); | ||
148 | |||
149 | return 0; | ||
150 | } | ||
151 | |||
152 | void | ||
153 | rtc_ds1742_init(unsigned long base) | ||
154 | { | ||
155 | u8 cmos_second; | ||
156 | |||
157 | /* remember the base */ | ||
158 | rtc_base = base; | ||
159 | db_assert((rtc_base & 0xe0000000) == KSEG1); | ||
160 | |||
161 | /* set the function pointers */ | ||
162 | rtc_mips_get_time = rtc_ds1742_get_time; | ||
163 | rtc_mips_set_time = rtc_ds1742_set_time; | ||
164 | |||
165 | /* clear oscillator stop bit */ | ||
166 | rtc_write(RTC_READ, RTC_CONTROL); | ||
167 | cmos_second = (u8)(rtc_read(RTC_SECONDS) & RTC_SECONDS_MASK); | ||
168 | rtc_write(RTC_WRITE, RTC_CONTROL); | ||
169 | rtc_write(cmos_second, RTC_SECONDS); /* clear msb */ | ||
170 | rtc_write(0, RTC_CONTROL); | ||
171 | } | ||
diff --git a/arch/mips/jmr3927/rbhma3100/setup.c b/arch/mips/jmr3927/rbhma3100/setup.c index ecabe5b08489..fc523bda068f 100644 --- a/arch/mips/jmr3927/rbhma3100/setup.c +++ b/arch/mips/jmr3927/rbhma3100/setup.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #include <linux/param.h> /* for HZ */ | 45 | #include <linux/param.h> /* for HZ */ |
46 | #include <linux/delay.h> | 46 | #include <linux/delay.h> |
47 | #include <linux/pm.h> | 47 | #include <linux/pm.h> |
48 | #include <linux/platform_device.h> | ||
48 | #ifdef CONFIG_SERIAL_TXX9 | 49 | #ifdef CONFIG_SERIAL_TXX9 |
49 | #include <linux/tty.h> | 50 | #include <linux/tty.h> |
50 | #include <linux/serial.h> | 51 | #include <linux/serial.h> |
@@ -172,19 +173,10 @@ static cycle_t jmr3927_hpt_read(void) | |||
172 | return jiffies * (JMR3927_TIMER_CLK / HZ) + jmr3927_tmrptr->trr; | 173 | return jiffies * (JMR3927_TIMER_CLK / HZ) + jmr3927_tmrptr->trr; |
173 | } | 174 | } |
174 | 175 | ||
175 | #define USE_RTC_DS1742 | ||
176 | #ifdef USE_RTC_DS1742 | ||
177 | extern void rtc_ds1742_init(unsigned long base); | ||
178 | #endif | ||
179 | static void __init jmr3927_time_init(void) | 176 | static void __init jmr3927_time_init(void) |
180 | { | 177 | { |
181 | clocksource_mips.read = jmr3927_hpt_read; | 178 | clocksource_mips.read = jmr3927_hpt_read; |
182 | mips_hpt_frequency = JMR3927_TIMER_CLK; | 179 | mips_hpt_frequency = JMR3927_TIMER_CLK; |
183 | #ifdef USE_RTC_DS1742 | ||
184 | if (jmr3927_have_nvram()) { | ||
185 | rtc_ds1742_init(JMR3927_IOC_NVRAMB_ADDR); | ||
186 | } | ||
187 | #endif | ||
188 | } | 180 | } |
189 | 181 | ||
190 | void __init plat_timer_setup(struct irqaction *irq) | 182 | void __init plat_timer_setup(struct irqaction *irq) |
@@ -540,3 +532,32 @@ void __init tx3927_setup(void) | |||
540 | printk("TX3927 D-Cache WriteBack (CWF) .\n"); | 532 | printk("TX3927 D-Cache WriteBack (CWF) .\n"); |
541 | } | 533 | } |
542 | } | 534 | } |
535 | |||
536 | /* This trick makes rtc-ds1742 driver usable as is. */ | ||
537 | unsigned long __swizzle_addr_b(unsigned long port) | ||
538 | { | ||
539 | if ((port & 0xffff0000) != JMR3927_IOC_NVRAMB_ADDR) | ||
540 | return port; | ||
541 | port = (port & 0xffff0000) | (port & 0x7fff << 1); | ||
542 | #ifdef __BIG_ENDIAN | ||
543 | return port; | ||
544 | #else | ||
545 | return port | 1; | ||
546 | #endif | ||
547 | } | ||
548 | EXPORT_SYMBOL(__swizzle_addr_b); | ||
549 | |||
550 | static int __init jmr3927_rtc_init(void) | ||
551 | { | ||
552 | struct resource res = { | ||
553 | .start = JMR3927_IOC_NVRAMB_ADDR - IO_BASE, | ||
554 | .end = JMR3927_IOC_NVRAMB_ADDR - IO_BASE + 0x800 - 1, | ||
555 | .flags = IORESOURCE_MEM, | ||
556 | }; | ||
557 | struct platform_device *dev; | ||
558 | if (!jmr3927_have_nvram()) | ||
559 | return -ENODEV; | ||
560 | dev = platform_device_register_simple("ds1742", -1, &res, 1); | ||
561 | return IS_ERR(dev) ? PTR_ERR(dev) : 0; | ||
562 | } | ||
563 | device_initcall(jmr3927_rtc_init); | ||
diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile index a3dad394acb7..49246264cc7c 100644 --- a/arch/mips/kernel/Makefile +++ b/arch/mips/kernel/Makefile | |||
@@ -65,5 +65,6 @@ obj-$(CONFIG_64BIT) += cpu-bugs64.o | |||
65 | obj-$(CONFIG_I8253) += i8253.o | 65 | obj-$(CONFIG_I8253) += i8253.o |
66 | 66 | ||
67 | obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o | 67 | obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o |
68 | obj-$(CONFIG_EARLY_PRINTK) += early_printk.o | ||
68 | 69 | ||
69 | CFLAGS_cpu-bugs64.o = $(shell if $(CC) $(CFLAGS) -Wa,-mdaddi -c -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-DHAVE_AS_SET_DADDI"; fi) | 70 | CFLAGS_cpu-bugs64.o = $(shell if $(CC) $(CFLAGS) -Wa,-mdaddi -c -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-DHAVE_AS_SET_DADDI"; fi) |
diff --git a/arch/mips/kernel/early_printk.c b/arch/mips/kernel/early_printk.c new file mode 100644 index 000000000000..304efdc5682f --- /dev/null +++ b/arch/mips/kernel/early_printk.c | |||
@@ -0,0 +1,40 @@ | |||
1 | /* | ||
2 | * This file is subject to the terms and conditions of the GNU General Public | ||
3 | * License. See the file "COPYING" in the main directory of this archive | ||
4 | * for more details. | ||
5 | * | ||
6 | * Copyright (C) 2002, 2003, 06, 07 Ralf Baechle (ralf@linux-mips.org) | ||
7 | * Copyright (C) 2007 MIPS Technologies, Inc. | ||
8 | * written by Ralf Baechle (ralf@linux-mips.org) | ||
9 | */ | ||
10 | #include <linux/console.h> | ||
11 | #include <linux/init.h> | ||
12 | |||
13 | extern void prom_putchar(char); | ||
14 | |||
15 | static void early_console_write(struct console *con, const char *s, unsigned n) | ||
16 | { | ||
17 | while (n-- && *s) { | ||
18 | if (*s == '\n') | ||
19 | prom_putchar('\r'); | ||
20 | prom_putchar(*s); | ||
21 | s++; | ||
22 | } | ||
23 | } | ||
24 | |||
25 | static struct console early_console = { | ||
26 | .name = "early", | ||
27 | .write = early_console_write, | ||
28 | .flags = CON_PRINTBUFFER | CON_BOOT, | ||
29 | .index = -1 | ||
30 | }; | ||
31 | |||
32 | void __init setup_early_printk(void) | ||
33 | { | ||
34 | register_console(&early_console); | ||
35 | } | ||
36 | |||
37 | void __init disable_early_printk(void) | ||
38 | { | ||
39 | unregister_console(&early_console); | ||
40 | } | ||
diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c index fc4dd6c9dd80..30d433f14f93 100644 --- a/arch/mips/kernel/linux32.c +++ b/arch/mips/kernel/linux32.c | |||
@@ -166,34 +166,6 @@ out: | |||
166 | return error; | 166 | return error; |
167 | } | 167 | } |
168 | 168 | ||
169 | asmlinkage long | ||
170 | sysn32_waitid(int which, compat_pid_t pid, | ||
171 | siginfo_t __user *uinfo, int options, | ||
172 | struct compat_rusage __user *uru) | ||
173 | { | ||
174 | struct rusage ru; | ||
175 | long ret; | ||
176 | mm_segment_t old_fs = get_fs(); | ||
177 | int si_signo; | ||
178 | |||
179 | if (!access_ok(VERIFY_WRITE, uinfo, sizeof(*uinfo))) | ||
180 | return -EFAULT; | ||
181 | |||
182 | set_fs (KERNEL_DS); | ||
183 | ret = sys_waitid(which, pid, uinfo, options, | ||
184 | uru ? (struct rusage __user *) &ru : NULL); | ||
185 | set_fs (old_fs); | ||
186 | |||
187 | if (__get_user(si_signo, &uinfo->si_signo)) | ||
188 | return -EFAULT; | ||
189 | if (ret < 0 || si_signo == 0) | ||
190 | return ret; | ||
191 | |||
192 | if (uru) | ||
193 | ret = put_compat_rusage(&ru, uru); | ||
194 | return ret; | ||
195 | } | ||
196 | |||
197 | #define RLIM_INFINITY32 0x7fffffff | 169 | #define RLIM_INFINITY32 0x7fffffff |
198 | #define RESOURCE32(x) ((x > RLIM_INFINITY32) ? RLIM_INFINITY32 : x) | 170 | #define RESOURCE32(x) ((x > RLIM_INFINITY32) ? RLIM_INFINITY32 : x) |
199 | 171 | ||
@@ -572,151 +544,6 @@ asmlinkage long sys32_sync_file_range(int fd, int __pad, | |||
572 | flags); | 544 | flags); |
573 | } | 545 | } |
574 | 546 | ||
575 | /* Argument list sizes for sys_socketcall */ | ||
576 | #define AL(x) ((x) * sizeof(unsigned int)) | ||
577 | static unsigned char socketcall_nargs[18]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), | ||
578 | AL(3),AL(3),AL(4),AL(4),AL(4),AL(6), | ||
579 | AL(6),AL(2),AL(5),AL(5),AL(3),AL(3)}; | ||
580 | #undef AL | ||
581 | |||
582 | /* | ||
583 | * System call vectors. | ||
584 | * | ||
585 | * Argument checking cleaned up. Saved 20% in size. | ||
586 | * This function doesn't need to set the kernel lock because | ||
587 | * it is set by the callees. | ||
588 | */ | ||
589 | |||
590 | asmlinkage long sys32_socketcall(int call, unsigned int __user *args32) | ||
591 | { | ||
592 | unsigned int a[6]; | ||
593 | unsigned int a0,a1; | ||
594 | int err; | ||
595 | |||
596 | extern asmlinkage long sys_socket(int family, int type, int protocol); | ||
597 | extern asmlinkage long sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen); | ||
598 | extern asmlinkage long sys_connect(int fd, struct sockaddr __user *uservaddr, int addrlen); | ||
599 | extern asmlinkage long sys_listen(int fd, int backlog); | ||
600 | extern asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr, int __user *upeer_addrlen); | ||
601 | extern asmlinkage long sys_getsockname(int fd, struct sockaddr __user *usockaddr, int __user *usockaddr_len); | ||
602 | extern asmlinkage long sys_getpeername(int fd, struct sockaddr __user *usockaddr, int __user *usockaddr_len); | ||
603 | extern asmlinkage long sys_socketpair(int family, int type, int protocol, int __user *usockvec); | ||
604 | extern asmlinkage long sys_send(int fd, void __user * buff, size_t len, unsigned flags); | ||
605 | extern asmlinkage long sys_sendto(int fd, void __user * buff, size_t len, unsigned flags, | ||
606 | struct sockaddr __user *addr, int addr_len); | ||
607 | extern asmlinkage long sys_recv(int fd, void __user * ubuf, size_t size, unsigned flags); | ||
608 | extern asmlinkage long sys_recvfrom(int fd, void __user * ubuf, size_t size, unsigned flags, | ||
609 | struct sockaddr __user *addr, int __user *addr_len); | ||
610 | extern asmlinkage long sys_shutdown(int fd, int how); | ||
611 | extern asmlinkage long sys_setsockopt(int fd, int level, int optname, char __user *optval, int optlen); | ||
612 | extern asmlinkage long sys_getsockopt(int fd, int level, int optname, char __user *optval, int __user *optlen); | ||
613 | extern asmlinkage long sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags); | ||
614 | extern asmlinkage long sys_recvmsg(int fd, struct msghdr __user *msg, unsigned int flags); | ||
615 | |||
616 | |||
617 | if(call<1||call>SYS_RECVMSG) | ||
618 | return -EINVAL; | ||
619 | |||
620 | /* copy_from_user should be SMP safe. */ | ||
621 | if (copy_from_user(a, args32, socketcall_nargs[call])) | ||
622 | return -EFAULT; | ||
623 | |||
624 | a0=a[0]; | ||
625 | a1=a[1]; | ||
626 | |||
627 | switch(call) | ||
628 | { | ||
629 | case SYS_SOCKET: | ||
630 | err = sys_socket(a0,a1,a[2]); | ||
631 | break; | ||
632 | case SYS_BIND: | ||
633 | err = sys_bind(a0,(struct sockaddr __user *)A(a1), a[2]); | ||
634 | break; | ||
635 | case SYS_CONNECT: | ||
636 | err = sys_connect(a0, (struct sockaddr __user *)A(a1), a[2]); | ||
637 | break; | ||
638 | case SYS_LISTEN: | ||
639 | err = sys_listen(a0,a1); | ||
640 | break; | ||
641 | case SYS_ACCEPT: | ||
642 | err = sys_accept(a0,(struct sockaddr __user *)A(a1), (int __user *)A(a[2])); | ||
643 | break; | ||
644 | case SYS_GETSOCKNAME: | ||
645 | err = sys_getsockname(a0,(struct sockaddr __user *)A(a1), (int __user *)A(a[2])); | ||
646 | break; | ||
647 | case SYS_GETPEERNAME: | ||
648 | err = sys_getpeername(a0, (struct sockaddr __user *)A(a1), (int __user *)A(a[2])); | ||
649 | break; | ||
650 | case SYS_SOCKETPAIR: | ||
651 | err = sys_socketpair(a0,a1, a[2], (int __user *)A(a[3])); | ||
652 | break; | ||
653 | case SYS_SEND: | ||
654 | err = sys_send(a0, (void __user *)A(a1), a[2], a[3]); | ||
655 | break; | ||
656 | case SYS_SENDTO: | ||
657 | err = sys_sendto(a0,(void __user *)A(a1), a[2], a[3], | ||
658 | (struct sockaddr __user *)A(a[4]), a[5]); | ||
659 | break; | ||
660 | case SYS_RECV: | ||
661 | err = sys_recv(a0, (void __user *)A(a1), a[2], a[3]); | ||
662 | break; | ||
663 | case SYS_RECVFROM: | ||
664 | err = sys_recvfrom(a0, (void __user *)A(a1), a[2], a[3], | ||
665 | (struct sockaddr __user *)A(a[4]), (int __user *)A(a[5])); | ||
666 | break; | ||
667 | case SYS_SHUTDOWN: | ||
668 | err = sys_shutdown(a0,a1); | ||
669 | break; | ||
670 | case SYS_SETSOCKOPT: | ||
671 | err = sys_setsockopt(a0, a1, a[2], (char __user *)A(a[3]), a[4]); | ||
672 | break; | ||
673 | case SYS_GETSOCKOPT: | ||
674 | err = sys_getsockopt(a0, a1, a[2], (char __user *)A(a[3]), (int __user *)A(a[4])); | ||
675 | break; | ||
676 | case SYS_SENDMSG: | ||
677 | err = sys_sendmsg(a0, (struct msghdr __user *) A(a1), a[2]); | ||
678 | break; | ||
679 | case SYS_RECVMSG: | ||
680 | err = sys_recvmsg(a0, (struct msghdr __user *) A(a1), a[2]); | ||
681 | break; | ||
682 | default: | ||
683 | err = -EINVAL; | ||
684 | break; | ||
685 | } | ||
686 | return err; | ||
687 | } | ||
688 | |||
689 | struct sigevent32 { | ||
690 | u32 sigev_value; | ||
691 | u32 sigev_signo; | ||
692 | u32 sigev_notify; | ||
693 | u32 payload[(64 / 4) - 3]; | ||
694 | }; | ||
695 | |||
696 | extern asmlinkage long | ||
697 | sys_timer_create(clockid_t which_clock, | ||
698 | struct sigevent __user *timer_event_spec, | ||
699 | timer_t __user * created_timer_id); | ||
700 | |||
701 | long | ||
702 | sys32_timer_create(u32 clock, struct sigevent32 __user *se32, timer_t __user *timer_id) | ||
703 | { | ||
704 | struct sigevent __user *p = NULL; | ||
705 | if (se32) { | ||
706 | struct sigevent se; | ||
707 | p = compat_alloc_user_space(sizeof(struct sigevent)); | ||
708 | memset(&se, 0, sizeof(struct sigevent)); | ||
709 | if (get_user(se.sigev_value.sival_int, &se32->sigev_value) || | ||
710 | __get_user(se.sigev_signo, &se32->sigev_signo) || | ||
711 | __get_user(se.sigev_notify, &se32->sigev_notify) || | ||
712 | __copy_from_user(&se._sigev_un._pad, &se32->payload, | ||
713 | sizeof(se32->payload)) || | ||
714 | copy_to_user(p, &se, sizeof(se))) | ||
715 | return -EFAULT; | ||
716 | } | ||
717 | return sys_timer_create(clock, p, timer_id); | ||
718 | } | ||
719 | |||
720 | save_static_function(sys32_clone); | 547 | save_static_function(sys32_clone); |
721 | __attribute_used__ noinline static int | 548 | __attribute_used__ noinline static int |
722 | _sys32_clone(nabi_no_regargs struct pt_regs regs) | 549 | _sys32_clone(nabi_no_regargs struct pt_regs regs) |
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index 2ceda4644a4d..f17e31e3bff2 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S | |||
@@ -340,7 +340,7 @@ EXPORT(sysn32_call_table) | |||
340 | PTR compat_sys_statfs64 | 340 | PTR compat_sys_statfs64 |
341 | PTR compat_sys_fstatfs64 | 341 | PTR compat_sys_fstatfs64 |
342 | PTR sys_sendfile64 | 342 | PTR sys_sendfile64 |
343 | PTR sys32_timer_create /* 6220 */ | 343 | PTR compat_sys_timer_create /* 6220 */ |
344 | PTR compat_sys_timer_settime | 344 | PTR compat_sys_timer_settime |
345 | PTR compat_sys_timer_gettime | 345 | PTR compat_sys_timer_gettime |
346 | PTR sys_timer_getoverrun | 346 | PTR sys_timer_getoverrun |
@@ -361,7 +361,7 @@ EXPORT(sysn32_call_table) | |||
361 | PTR compat_sys_mq_notify | 361 | PTR compat_sys_mq_notify |
362 | PTR compat_sys_mq_getsetattr | 362 | PTR compat_sys_mq_getsetattr |
363 | PTR sys_ni_syscall /* 6240, sys_vserver */ | 363 | PTR sys_ni_syscall /* 6240, sys_vserver */ |
364 | PTR sysn32_waitid | 364 | PTR compat_sys_waitid |
365 | PTR sys_ni_syscall /* available, was setaltroot */ | 365 | PTR sys_ni_syscall /* available, was setaltroot */ |
366 | PTR sys_add_key | 366 | PTR sys_add_key |
367 | PTR sys_request_key | 367 | PTR sys_request_key |
diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index bcc42489dc3c..142c9b70c026 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S | |||
@@ -307,7 +307,7 @@ sys_call_table: | |||
307 | PTR compat_sys_statfs | 307 | PTR compat_sys_statfs |
308 | PTR compat_sys_fstatfs /* 4100 */ | 308 | PTR compat_sys_fstatfs /* 4100 */ |
309 | PTR sys_ni_syscall /* sys_ioperm */ | 309 | PTR sys_ni_syscall /* sys_ioperm */ |
310 | PTR sys32_socketcall | 310 | PTR compat_sys_socketcall |
311 | PTR sys_syslog | 311 | PTR sys_syslog |
312 | PTR compat_sys_setitimer | 312 | PTR compat_sys_setitimer |
313 | PTR compat_sys_getitimer /* 4105 */ | 313 | PTR compat_sys_getitimer /* 4105 */ |
@@ -462,7 +462,7 @@ sys_call_table: | |||
462 | PTR sys_fadvise64_64 | 462 | PTR sys_fadvise64_64 |
463 | PTR compat_sys_statfs64 /* 4255 */ | 463 | PTR compat_sys_statfs64 /* 4255 */ |
464 | PTR compat_sys_fstatfs64 | 464 | PTR compat_sys_fstatfs64 |
465 | PTR sys32_timer_create | 465 | PTR compat_sys_timer_create |
466 | PTR compat_sys_timer_settime | 466 | PTR compat_sys_timer_settime |
467 | PTR compat_sys_timer_gettime | 467 | PTR compat_sys_timer_gettime |
468 | PTR sys_timer_getoverrun /* 4260 */ | 468 | PTR sys_timer_getoverrun /* 4260 */ |
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index 11ab222a2e97..4975da0bfb63 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c | |||
@@ -525,6 +525,14 @@ void __init setup_arch(char **cmdline_p) | |||
525 | { | 525 | { |
526 | cpu_probe(); | 526 | cpu_probe(); |
527 | prom_init(); | 527 | prom_init(); |
528 | |||
529 | #ifdef CONFIG_EARLY_PRINTK | ||
530 | { | ||
531 | extern void setup_early_printk(void); | ||
532 | |||
533 | setup_early_printk(); | ||
534 | } | ||
535 | #endif | ||
528 | cpu_report(); | 536 | cpu_report(); |
529 | 537 | ||
530 | #if defined(CONFIG_VT) | 538 | #if defined(CONFIG_VT) |
diff --git a/arch/mips/lasat/lasat_board.c b/arch/mips/lasat/lasat_board.c index d425120b0282..fbe9a87bd0ad 100644 --- a/arch/mips/lasat/lasat_board.c +++ b/arch/mips/lasat/lasat_board.c | |||
@@ -110,12 +110,13 @@ int lasat_init_board_info(void) | |||
110 | sizeof(struct lasat_eeprom_struct) - 4); | 110 | sizeof(struct lasat_eeprom_struct) - 4); |
111 | 111 | ||
112 | if (crc != lasat_board_info.li_eeprom_info.crc32) { | 112 | if (crc != lasat_board_info.li_eeprom_info.crc32) { |
113 | prom_printf("WARNING...\nWARNING...\nEEPROM CRC does not match calculated, attempting to soldier on...\n"); | 113 | printk(KERN_WARNING "WARNING...\nWARNING...\nEEPROM CRC does " |
114 | "not match calculated, attempting to soldier on...\n"); | ||
114 | } | 115 | } |
115 | 116 | ||
116 | if (lasat_board_info.li_eeprom_info.version != LASAT_EEPROM_VERSION) | 117 | if (lasat_board_info.li_eeprom_info.version != LASAT_EEPROM_VERSION) { |
117 | { | 118 | printk(KERN_WARNING "WARNING...\nWARNING...\nEEPROM version " |
118 | prom_printf("WARNING...\nWARNING...\nEEPROM version %d, wanted version %d, attempting to soldier on...\n", | 119 | "%d, wanted version %d, attempting to soldier on...\n", |
119 | (unsigned int)lasat_board_info.li_eeprom_info.version, | 120 | (unsigned int)lasat_board_info.li_eeprom_info.version, |
120 | LASAT_EEPROM_VERSION); | 121 | LASAT_EEPROM_VERSION); |
121 | } | 122 | } |
@@ -124,7 +125,9 @@ int lasat_init_board_info(void) | |||
124 | cfg1 = lasat_board_info.li_eeprom_info.cfg[1]; | 125 | cfg1 = lasat_board_info.li_eeprom_info.cfg[1]; |
125 | 126 | ||
126 | if ( LASAT_W0_DSCTYPE(cfg0) != 1) { | 127 | if ( LASAT_W0_DSCTYPE(cfg0) != 1) { |
127 | prom_printf("WARNING...\nWARNING...\nInvalid configuration read from EEPROM, attempting to soldier on..."); | 128 | printk(KERN_WARNING "WARNING...\nWARNING...\n" |
129 | "Invalid configuration read from EEPROM, attempting to " | ||
130 | "soldier on..."); | ||
128 | } | 131 | } |
129 | /* We have a valid configuration */ | 132 | /* We have a valid configuration */ |
130 | 133 | ||
diff --git a/arch/mips/lasat/prom.c b/arch/mips/lasat/prom.c index d47692f73a26..812c6ac366be 100644 --- a/arch/mips/lasat/prom.c +++ b/arch/mips/lasat/prom.c | |||
@@ -23,10 +23,6 @@ | |||
23 | #define PROM_PUTC_ADDR PROM_JUMP_TABLE_ENTRY(1) | 23 | #define PROM_PUTC_ADDR PROM_JUMP_TABLE_ENTRY(1) |
24 | #define PROM_MONITOR_ADDR PROM_JUMP_TABLE_ENTRY(2) | 24 | #define PROM_MONITOR_ADDR PROM_JUMP_TABLE_ENTRY(2) |
25 | 25 | ||
26 | static void null_prom_printf(const char * fmt, ...) | ||
27 | { | ||
28 | } | ||
29 | |||
30 | static void null_prom_display(const char *string, int pos, int clear) | 26 | static void null_prom_display(const char *string, int pos, int clear) |
31 | { | 27 | { |
32 | } | 28 | } |
@@ -40,50 +36,29 @@ static void null_prom_putc(char c) | |||
40 | } | 36 | } |
41 | 37 | ||
42 | /* these are functions provided by the bootloader */ | 38 | /* these are functions provided by the bootloader */ |
43 | static void (* prom_putc)(char c) = null_prom_putc; | 39 | static void (* __prom_putc)(char c) = null_prom_putc; |
44 | void (* prom_printf)(const char * fmt, ...) = null_prom_printf; | 40 | |
41 | void prom_putchar(char c) | ||
42 | { | ||
43 | __prom_putc(c); | ||
44 | } | ||
45 | |||
45 | void (* prom_display)(const char *string, int pos, int clear) = | 46 | void (* prom_display)(const char *string, int pos, int clear) = |
46 | null_prom_display; | 47 | null_prom_display; |
47 | void (* prom_monitor)(void) = null_prom_monitor; | 48 | void (* prom_monitor)(void) = null_prom_monitor; |
48 | 49 | ||
49 | unsigned int lasat_ndelay_divider; | 50 | unsigned int lasat_ndelay_divider; |
50 | 51 | ||
51 | #define PROM_PRINTFBUF_SIZE 256 | ||
52 | static char prom_printfbuf[PROM_PRINTFBUF_SIZE]; | ||
53 | |||
54 | static void real_prom_printf(const char * fmt, ...) | ||
55 | { | ||
56 | va_list ap; | ||
57 | int len; | ||
58 | char *c = prom_printfbuf; | ||
59 | int i; | ||
60 | |||
61 | va_start(ap, fmt); | ||
62 | len = vsnprintf(prom_printfbuf, PROM_PRINTFBUF_SIZE, fmt, ap); | ||
63 | va_end(ap); | ||
64 | |||
65 | /* output overflowed the buffer */ | ||
66 | if (len < 0 || len > PROM_PRINTFBUF_SIZE) | ||
67 | len = PROM_PRINTFBUF_SIZE; | ||
68 | |||
69 | for (i=0; i < len; i++) { | ||
70 | if (*c == '\n') | ||
71 | prom_putc('\r'); | ||
72 | prom_putc(*c++); | ||
73 | } | ||
74 | } | ||
75 | |||
76 | static void setup_prom_vectors(void) | 52 | static void setup_prom_vectors(void) |
77 | { | 53 | { |
78 | u32 version = *(u32 *)(RESET_VECTOR + 0x90); | 54 | u32 version = *(u32 *)(RESET_VECTOR + 0x90); |
79 | 55 | ||
80 | if (version >= 307) { | 56 | if (version >= 307) { |
81 | prom_display = (void *)PROM_DISPLAY_ADDR; | 57 | prom_display = (void *)PROM_DISPLAY_ADDR; |
82 | prom_putc = (void *)PROM_PUTC_ADDR; | 58 | __prom_putc = (void *)PROM_PUTC_ADDR; |
83 | prom_printf = real_prom_printf; | ||
84 | prom_monitor = (void *)PROM_MONITOR_ADDR; | 59 | prom_monitor = (void *)PROM_MONITOR_ADDR; |
85 | } | 60 | } |
86 | prom_printf("prom vectors set up\n"); | 61 | printk("prom vectors set up\n"); |
87 | } | 62 | } |
88 | 63 | ||
89 | static struct at93c_defs at93c_defs[N_MACHTYPES] = { | 64 | static struct at93c_defs at93c_defs[N_MACHTYPES] = { |
@@ -101,11 +76,11 @@ void __init prom_init(void) | |||
101 | setup_prom_vectors(); | 76 | setup_prom_vectors(); |
102 | 77 | ||
103 | if (current_cpu_data.cputype == CPU_R5000) { | 78 | if (current_cpu_data.cputype == CPU_R5000) { |
104 | prom_printf("LASAT 200 board\n"); | 79 | printk("LASAT 200 board\n"); |
105 | mips_machtype = MACH_LASAT_200; | 80 | mips_machtype = MACH_LASAT_200; |
106 | lasat_ndelay_divider = LASAT_200_DIVIDER; | 81 | lasat_ndelay_divider = LASAT_200_DIVIDER; |
107 | } else { | 82 | } else { |
108 | prom_printf("LASAT 100 board\n"); | 83 | printk("LASAT 100 board\n"); |
109 | mips_machtype = MACH_LASAT_100; | 84 | mips_machtype = MACH_LASAT_100; |
110 | lasat_ndelay_divider = LASAT_100_DIVIDER; | 85 | lasat_ndelay_divider = LASAT_100_DIVIDER; |
111 | } | 86 | } |
diff --git a/arch/mips/lasat/prom.h b/arch/mips/lasat/prom.h index 07be7bf1e4a3..019d45fbd268 100644 --- a/arch/mips/lasat/prom.h +++ b/arch/mips/lasat/prom.h | |||
@@ -2,5 +2,4 @@ | |||
2 | #define PROM_H | 2 | #define PROM_H |
3 | extern void (* prom_display)(const char *string, int pos, int clear); | 3 | extern void (* prom_display)(const char *string, int pos, int clear); |
4 | extern void (* prom_monitor)(void); | 4 | extern void (* prom_monitor)(void); |
5 | extern void (* prom_printf)(const char * fmt, ...); | ||
6 | #endif | 5 | #endif |
diff --git a/arch/mips/lasat/setup.c b/arch/mips/lasat/setup.c index 14c55168f1ff..488007f13988 100644 --- a/arch/mips/lasat/setup.c +++ b/arch/mips/lasat/setup.c | |||
@@ -116,7 +116,6 @@ static void lasat_time_init(void) | |||
116 | 116 | ||
117 | void __init plat_timer_setup(struct irqaction *irq) | 117 | void __init plat_timer_setup(struct irqaction *irq) |
118 | { | 118 | { |
119 | write_c0_compare( read_c0_count() + mips_hpt_frequency / HZ); | ||
120 | change_c0_status(ST0_IM, IE_IRQ0 | IE_IRQ5); | 119 | change_c0_status(ST0_IM, IE_IRQ0 | IE_IRQ5); |
121 | } | 120 | } |
122 | 121 | ||
@@ -179,5 +178,5 @@ void __init plat_mem_setup(void) | |||
179 | /* Switch from prom exception handler to normal mode */ | 178 | /* Switch from prom exception handler to normal mode */ |
180 | change_c0_status(ST0_BEV,0); | 179 | change_c0_status(ST0_BEV,0); |
181 | 180 | ||
182 | prom_printf("Lasat specific initialization complete\n"); | 181 | pr_info("Lasat specific initialization complete\n"); |
183 | } | 182 | } |
diff --git a/arch/mips/lib/Makefile b/arch/mips/lib/Makefile index 52e0ec8bcb15..d7d3b14dcfb2 100644 --- a/arch/mips/lib/Makefile +++ b/arch/mips/lib/Makefile | |||
@@ -2,8 +2,8 @@ | |||
2 | # Makefile for MIPS-specific library files.. | 2 | # Makefile for MIPS-specific library files.. |
3 | # | 3 | # |
4 | 4 | ||
5 | lib-y += csum_partial.o memcpy.o memcpy-inatomic.o memset.o promlib.o \ | 5 | lib-y += csum_partial.o memcpy.o memcpy-inatomic.o memset.o strlen_user.o \ |
6 | strlen_user.o strncpy_user.o strnlen_user.o uncached.o | 6 | strncpy_user.o strnlen_user.o uncached.o |
7 | 7 | ||
8 | obj-y += iomap.o | 8 | obj-y += iomap.o |
9 | obj-$(CONFIG_PCI) += iomap-pci.o | 9 | obj-$(CONFIG_PCI) += iomap-pci.o |
diff --git a/arch/mips/lib/promlib.c b/arch/mips/lib/promlib.c deleted file mode 100644 index dddfe98b4ded..000000000000 --- a/arch/mips/lib/promlib.c +++ /dev/null | |||
@@ -1,24 +0,0 @@ | |||
1 | #include <stdarg.h> | ||
2 | #include <linux/kernel.h> | ||
3 | |||
4 | extern void prom_putchar(char); | ||
5 | |||
6 | void prom_printf(char *fmt, ...) | ||
7 | { | ||
8 | va_list args; | ||
9 | char ppbuf[1024]; | ||
10 | char *bptr; | ||
11 | |||
12 | va_start(args, fmt); | ||
13 | vsprintf(ppbuf, fmt, args); | ||
14 | |||
15 | bptr = ppbuf; | ||
16 | |||
17 | while (*bptr != 0) { | ||
18 | if (*bptr == '\n') | ||
19 | prom_putchar('\r'); | ||
20 | |||
21 | prom_putchar(*bptr++); | ||
22 | } | ||
23 | va_end(args); | ||
24 | } | ||
diff --git a/arch/mips/mips-boards/generic/Makefile b/arch/mips/mips-boards/generic/Makefile index 0a30f5dc9b72..aade36d78787 100644 --- a/arch/mips/mips-boards/generic/Makefile +++ b/arch/mips/mips-boards/generic/Makefile | |||
@@ -18,7 +18,9 @@ | |||
18 | # Makefile for the MIPS boards generic routines under Linux. | 18 | # Makefile for the MIPS boards generic routines under Linux. |
19 | # | 19 | # |
20 | 20 | ||
21 | obj-y := reset.o display.o init.o memory.o printf.o \ | 21 | obj-y := reset.o display.o init.o memory.o \ |
22 | cmdline.o time.o | 22 | cmdline.o time.o |
23 | |||
24 | obj-$(CONFIG_EARLY_PRINTK) += console.o | ||
23 | obj-$(CONFIG_PCI) += pci.o | 25 | obj-$(CONFIG_PCI) += pci.o |
24 | obj-$(CONFIG_KGDB) += gdb_hook.o | 26 | obj-$(CONFIG_KGDB) += gdb_hook.o |
diff --git a/arch/mips/mips-boards/generic/printf.c b/arch/mips/mips-boards/generic/console.c index 1a711bd79b51..4d8ab99e4155 100644 --- a/arch/mips/mips-boards/generic/printf.c +++ b/arch/mips/mips-boards/generic/console.c | |||
@@ -17,10 +17,9 @@ | |||
17 | * | 17 | * |
18 | * Putting things on the screen/serial line using YAMONs facilities. | 18 | * Putting things on the screen/serial line using YAMONs facilities. |
19 | */ | 19 | */ |
20 | #include <linux/console.h> | ||
20 | #include <linux/init.h> | 21 | #include <linux/init.h> |
21 | #include <linux/kernel.h> | ||
22 | #include <linux/serial_reg.h> | 22 | #include <linux/serial_reg.h> |
23 | #include <linux/spinlock.h> | ||
24 | #include <asm/io.h> | 23 | #include <asm/io.h> |
25 | 24 | ||
26 | #ifdef CONFIG_MIPS_ATLAS | 25 | #ifdef CONFIG_MIPS_ATLAS |
@@ -67,12 +66,3 @@ int prom_putchar(char c) | |||
67 | 66 | ||
68 | return 1; | 67 | return 1; |
69 | } | 68 | } |
70 | |||
71 | char prom_getchar(void) | ||
72 | { | ||
73 | while (!(serial_in(UART_LSR) & UART_LSR_DR)) | ||
74 | ; | ||
75 | |||
76 | return serial_in(UART_RX); | ||
77 | } | ||
78 | |||
diff --git a/arch/mips/mips-boards/generic/init.c b/arch/mips/mips-boards/generic/init.c index 58a0fe883591..b11337600129 100644 --- a/arch/mips/mips-boards/generic/init.c +++ b/arch/mips/mips-boards/generic/init.c | |||
@@ -167,7 +167,7 @@ static void __init console_config(void) | |||
167 | flow = 'r'; | 167 | flow = 'r'; |
168 | sprintf (console_string, " console=ttyS0,%d%c%c%c", baud, parity, bits, flow); | 168 | sprintf (console_string, " console=ttyS0,%d%c%c%c", baud, parity, bits, flow); |
169 | strcat (prom_getcmdline(), console_string); | 169 | strcat (prom_getcmdline(), console_string); |
170 | prom_printf("Config serial console:%s\n", console_string); | 170 | pr_info("Config serial console:%s\n", console_string); |
171 | } | 171 | } |
172 | } | 172 | } |
173 | #endif | 173 | #endif |
@@ -210,8 +210,9 @@ void __init kgdb_config (void) | |||
210 | generic_getDebugChar = rs_getDebugChar; | 210 | generic_getDebugChar = rs_getDebugChar; |
211 | } | 211 | } |
212 | 212 | ||
213 | prom_printf("KGDB: Using serial line /dev/ttyS%d at %d for session, " | 213 | pr_info("KGDB: Using serial line /dev/ttyS%d at %d for " |
214 | "please connect your debugger\n", line ? 1 : 0, speed); | 214 | "session, please connect your debugger\n", |
215 | line ? 1 : 0, speed); | ||
215 | 216 | ||
216 | { | 217 | { |
217 | char *s; | 218 | char *s; |
@@ -382,7 +383,7 @@ void __init prom_init(void) | |||
382 | board_nmi_handler_setup = mips_nmi_setup; | 383 | board_nmi_handler_setup = mips_nmi_setup; |
383 | board_ejtag_handler_setup = mips_ejtag_setup; | 384 | board_ejtag_handler_setup = mips_ejtag_setup; |
384 | 385 | ||
385 | prom_printf("\nLINUX started...\n"); | 386 | pr_info("\nLINUX started...\n"); |
386 | prom_init_cmdline(); | 387 | prom_init_cmdline(); |
387 | prom_meminit(); | 388 | prom_meminit(); |
388 | #ifdef CONFIG_SERIAL_8250_CONSOLE | 389 | #ifdef CONFIG_SERIAL_8250_CONSOLE |
diff --git a/arch/mips/mips-boards/generic/memory.c b/arch/mips/mips-boards/generic/memory.c index ebf0e16c5a0d..ae39953da2c4 100644 --- a/arch/mips/mips-boards/generic/memory.c +++ b/arch/mips/mips-boards/generic/memory.c | |||
@@ -59,11 +59,12 @@ struct prom_pmemblock * __init prom_getmdesc(void) | |||
59 | /* otherwise look in the environment */ | 59 | /* otherwise look in the environment */ |
60 | memsize_str = prom_getenv("memsize"); | 60 | memsize_str = prom_getenv("memsize"); |
61 | if (!memsize_str) { | 61 | if (!memsize_str) { |
62 | prom_printf("memsize not set in boot prom, set to default (32Mb)\n"); | 62 | printk(KERN_WARNING |
63 | "memsize not set in boot prom, set to default (32Mb)\n"); | ||
63 | physical_memsize = 0x02000000; | 64 | physical_memsize = 0x02000000; |
64 | } else { | 65 | } else { |
65 | #ifdef DEBUG | 66 | #ifdef DEBUG |
66 | prom_printf("prom_memsize = %s\n", memsize_str); | 67 | pr_debug("prom_memsize = %s\n", memsize_str); |
67 | #endif | 68 | #endif |
68 | physical_memsize = simple_strtol(memsize_str, NULL, 0); | 69 | physical_memsize = simple_strtol(memsize_str, NULL, 0); |
69 | } | 70 | } |
@@ -141,12 +142,12 @@ void __init prom_meminit(void) | |||
141 | struct prom_pmemblock *p; | 142 | struct prom_pmemblock *p; |
142 | 143 | ||
143 | #ifdef DEBUG | 144 | #ifdef DEBUG |
144 | prom_printf("YAMON MEMORY DESCRIPTOR dump:\n"); | 145 | pr_debug("YAMON MEMORY DESCRIPTOR dump:\n"); |
145 | p = prom_getmdesc(); | 146 | p = prom_getmdesc(); |
146 | while (p->size) { | 147 | while (p->size) { |
147 | int i = 0; | 148 | int i = 0; |
148 | prom_printf("[%d,%p]: base<%08lx> size<%08lx> type<%s>\n", | 149 | pr_debug("[%d,%p]: base<%08lx> size<%08lx> type<%s>\n", |
149 | i, p, p->base, p->size, mtypes[p->type]); | 150 | i, p, p->base, p->size, mtypes[p->type]); |
150 | p++; | 151 | p++; |
151 | i++; | 152 | i++; |
152 | } | 153 | } |
diff --git a/arch/mips/mips-boards/generic/time.c b/arch/mips/mips-boards/generic/time.c index a3c3a1d462b2..df2a2bd3aa5d 100644 --- a/arch/mips/mips-boards/generic/time.c +++ b/arch/mips/mips-boards/generic/time.c | |||
@@ -295,7 +295,4 @@ void __init plat_timer_setup(struct irqaction *irq) | |||
295 | irq_desc[mips_cpu_timer_irq].status |= IRQ_PER_CPU; | 295 | irq_desc[mips_cpu_timer_irq].status |= IRQ_PER_CPU; |
296 | set_irq_handler(mips_cpu_timer_irq, handle_percpu_irq); | 296 | set_irq_handler(mips_cpu_timer_irq, handle_percpu_irq); |
297 | #endif | 297 | #endif |
298 | |||
299 | /* to generate the first timer interrupt */ | ||
300 | write_c0_compare (read_c0_count() + mips_hpt_frequency/HZ); | ||
301 | } | 298 | } |
diff --git a/arch/mips/mips-boards/sim/Makefile b/arch/mips/mips-boards/sim/Makefile index a12e32aafde0..6aeebc9122f2 100644 --- a/arch/mips/mips-boards/sim/Makefile +++ b/arch/mips/mips-boards/sim/Makefile | |||
@@ -1,5 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Copyright (C) 2005 MIPS Technologies, Inc. All rights reserved. | 2 | # Copyright (C) 2005 MIPS Technologies, Inc. All rights reserved. |
3 | # Copyright (C) 2007 MIPS Technologies, Inc. | ||
4 | # written by Ralf Baechle (ralf@linux-mips.org) | ||
3 | # | 5 | # |
4 | # This program is free software; you can distribute it and/or modify it | 6 | # This program is free software; you can distribute it and/or modify it |
5 | # under the terms of the GNU General Public License (Version 2) as | 7 | # under the terms of the GNU General Public License (Version 2) as |
@@ -15,5 +17,7 @@ | |||
15 | # 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | 17 | # 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. |
16 | # | 18 | # |
17 | 19 | ||
18 | obj-y := sim_setup.o sim_mem.o sim_time.o sim_printf.o sim_int.o sim_cmdline.o | 20 | obj-y := sim_setup.o sim_mem.o sim_time.o sim_int.o sim_cmdline.o |
21 | |||
22 | obj-$(CONFIG_EARLY_PRINTK) += sim_console.o | ||
19 | obj-$(CONFIG_SMP) += sim_smp.o | 23 | obj-$(CONFIG_SMP) += sim_smp.o |
diff --git a/arch/mips/mips-boards/sim/sim_printf.c b/arch/mips/mips-boards/sim/sim_console.c index 3ee5a0b501a6..de595a9ccb27 100644 --- a/arch/mips/mips-boards/sim/sim_printf.c +++ b/arch/mips/mips-boards/sim/sim_console.c | |||
@@ -1,7 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * Carsten Langgaard, carstenl@mips.com | ||
3 | * Copyright (C) 1999,2000 MIPS Technologies, Inc. All rights reserved. | ||
4 | * | ||
5 | * This program is free software; you can distribute it and/or modify it | 2 | * This program is free software; you can distribute it and/or modify it |
6 | * under the terms of the GNU General Public License (Version 2) as | 3 | * under the terms of the GNU General Public License (Version 2) as |
7 | * published by the Free Software Foundation. | 4 | * published by the Free Software Foundation. |
@@ -15,14 +12,14 @@ | |||
15 | * with this program; if not, write to the Free Software Foundation, Inc., | 12 | * with this program; if not, write to the Free Software Foundation, Inc., |
16 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | 13 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. |
17 | * | 14 | * |
18 | * Putting things on the screen/serial line using YAMONs facilities. | 15 | * Carsten Langgaard, carstenl@mips.com |
16 | * Copyright (C) 1999,2000 MIPS Technologies, Inc. All rights reserved. | ||
17 | * Copyright (C) 2007 MIPS Technologies, Inc. | ||
18 | * written by Ralf Baechle | ||
19 | */ | 19 | */ |
20 | #include <linux/init.h> | 20 | #include <linux/init.h> |
21 | #include <linux/kernel.h> | ||
22 | #include <linux/serial_reg.h> | 21 | #include <linux/serial_reg.h> |
23 | #include <linux/spinlock.h> | ||
24 | #include <asm/io.h> | 22 | #include <asm/io.h> |
25 | #include <asm/system.h> | ||
26 | 23 | ||
27 | static inline unsigned int serial_in(int offset) | 24 | static inline unsigned int serial_in(int offset) |
28 | { | 25 | { |
@@ -34,41 +31,10 @@ static inline void serial_out(int offset, int value) | |||
34 | outb(value, 0x3f8 + offset); | 31 | outb(value, 0x3f8 + offset); |
35 | } | 32 | } |
36 | 33 | ||
37 | int putPromChar(char c) | 34 | void __init prom_putchar(char c) |
38 | { | 35 | { |
39 | while ((serial_in(UART_LSR) & UART_LSR_THRE) == 0) | 36 | while ((serial_in(UART_LSR) & UART_LSR_THRE) == 0) |
40 | ; | 37 | ; |
41 | 38 | ||
42 | serial_out(UART_TX, c); | 39 | serial_out(UART_TX, c); |
43 | |||
44 | return 1; | ||
45 | } | ||
46 | |||
47 | char getPromChar(void) | ||
48 | { | ||
49 | while (!(serial_in(UART_LSR) & 1)) | ||
50 | ; | ||
51 | |||
52 | return serial_in(UART_RX); | ||
53 | } | ||
54 | |||
55 | void prom_printf(char *fmt, ...) | ||
56 | { | ||
57 | va_list args; | ||
58 | int l; | ||
59 | char *p, *buf_end; | ||
60 | char buf[1024]; | ||
61 | |||
62 | va_start(args, fmt); | ||
63 | l = vsprintf(buf, fmt, args); /* hopefully i < sizeof(buf) */ | ||
64 | va_end(args); | ||
65 | |||
66 | buf_end = buf + l; | ||
67 | |||
68 | for (p = buf; p < buf_end; p++) { | ||
69 | /* Crude cr/nl handling is better than none */ | ||
70 | if (*p == '\n') | ||
71 | putPromChar('\r'); | ||
72 | putPromChar(*p); | ||
73 | } | ||
74 | } | 40 | } |
diff --git a/arch/mips/mips-boards/sim/sim_mem.c b/arch/mips/mips-boards/sim/sim_mem.c index 46bc16f8b15d..e408ef0bcd6e 100644 --- a/arch/mips/mips-boards/sim/sim_mem.c +++ b/arch/mips/mips-boards/sim/sim_mem.c | |||
@@ -46,7 +46,7 @@ struct prom_pmemblock * __init prom_getmdesc(void) | |||
46 | unsigned int memsize; | 46 | unsigned int memsize; |
47 | 47 | ||
48 | memsize = 0x02000000; | 48 | memsize = 0x02000000; |
49 | prom_printf("Setting default memory size 0x%08x\n", memsize); | 49 | pr_info("Setting default memory size 0x%08x\n", memsize); |
50 | 50 | ||
51 | memset(mdesc, 0, sizeof(mdesc)); | 51 | memset(mdesc, 0, sizeof(mdesc)); |
52 | 52 | ||
diff --git a/arch/mips/mips-boards/sim/sim_setup.c b/arch/mips/mips-boards/sim/sim_setup.c index ea2066c3a1f7..b705f09e57c3 100644 --- a/arch/mips/mips-boards/sim/sim_setup.c +++ b/arch/mips/mips-boards/sim/sim_setup.c | |||
@@ -55,7 +55,7 @@ void __init plat_mem_setup(void) | |||
55 | serial_init(); | 55 | serial_init(); |
56 | 56 | ||
57 | board_time_init = sim_time_init; | 57 | board_time_init = sim_time_init; |
58 | prom_printf("Linux started...\n"); | 58 | pr_info("Linux started...\n"); |
59 | 59 | ||
60 | #ifdef CONFIG_MIPS_MT_SMP | 60 | #ifdef CONFIG_MIPS_MT_SMP |
61 | sanitize_tlb_entries(); | 61 | sanitize_tlb_entries(); |
@@ -66,7 +66,7 @@ void prom_init(void) | |||
66 | { | 66 | { |
67 | set_io_port_base(0xbfd00000); | 67 | set_io_port_base(0xbfd00000); |
68 | 68 | ||
69 | prom_printf("\nLINUX started...\n"); | 69 | pr_info("\nLINUX started...\n"); |
70 | prom_init_cmdline(); | 70 | prom_init_cmdline(); |
71 | prom_meminit(); | 71 | prom_meminit(); |
72 | } | 72 | } |
@@ -91,7 +91,7 @@ static void __init serial_init(void) | |||
91 | s.timeout = 4; | 91 | s.timeout = 4; |
92 | 92 | ||
93 | if (early_serial_setup(&s) != 0) { | 93 | if (early_serial_setup(&s) != 0) { |
94 | prom_printf(KERN_ERR "Serial setup failed!\n"); | 94 | printk(KERN_ERR "Serial setup failed!\n"); |
95 | } | 95 | } |
96 | 96 | ||
97 | #endif | 97 | #endif |
diff --git a/arch/mips/mips-boards/sim/sim_time.c b/arch/mips/mips-boards/sim/sim_time.c index 30711d016fed..d3a21c741514 100644 --- a/arch/mips/mips-boards/sim/sim_time.c +++ b/arch/mips/mips-boards/sim/sim_time.c | |||
@@ -199,7 +199,4 @@ void __init plat_timer_setup(struct irqaction *irq) | |||
199 | irq_desc[mips_cpu_timer_irq].flags |= IRQ_PER_CPU; | 199 | irq_desc[mips_cpu_timer_irq].flags |= IRQ_PER_CPU; |
200 | set_irq_handler(mips_cpu_timer_irq, handle_percpu_irq); | 200 | set_irq_handler(mips_cpu_timer_irq, handle_percpu_irq); |
201 | #endif | 201 | #endif |
202 | |||
203 | /* to generate the first timer interrupt */ | ||
204 | write_c0_compare(read_c0_count() + (mips_hpt_frequency/HZ)); | ||
205 | } | 202 | } |
diff --git a/arch/mips/mm/cerr-sb1.c b/arch/mips/mm/cerr-sb1.c index e19fbb9ee47f..11a916629d3b 100644 --- a/arch/mips/mm/cerr-sb1.c +++ b/arch/mips/mm/cerr-sb1.c | |||
@@ -77,66 +77,66 @@ static uint32_t extract_dc(unsigned short addr, int data); | |||
77 | static inline void breakout_errctl(unsigned int val) | 77 | static inline void breakout_errctl(unsigned int val) |
78 | { | 78 | { |
79 | if (val & CP0_ERRCTL_RECOVERABLE) | 79 | if (val & CP0_ERRCTL_RECOVERABLE) |
80 | prom_printf(" recoverable"); | 80 | printk(" recoverable"); |
81 | if (val & CP0_ERRCTL_DCACHE) | 81 | if (val & CP0_ERRCTL_DCACHE) |
82 | prom_printf(" dcache"); | 82 | printk(" dcache"); |
83 | if (val & CP0_ERRCTL_ICACHE) | 83 | if (val & CP0_ERRCTL_ICACHE) |
84 | prom_printf(" icache"); | 84 | printk(" icache"); |
85 | if (val & CP0_ERRCTL_MULTIBUS) | 85 | if (val & CP0_ERRCTL_MULTIBUS) |
86 | prom_printf(" multiple-buserr"); | 86 | printk(" multiple-buserr"); |
87 | prom_printf("\n"); | 87 | printk("\n"); |
88 | } | 88 | } |
89 | 89 | ||
90 | static inline void breakout_cerri(unsigned int val) | 90 | static inline void breakout_cerri(unsigned int val) |
91 | { | 91 | { |
92 | if (val & CP0_CERRI_TAG_PARITY) | 92 | if (val & CP0_CERRI_TAG_PARITY) |
93 | prom_printf(" tag-parity"); | 93 | printk(" tag-parity"); |
94 | if (val & CP0_CERRI_DATA_PARITY) | 94 | if (val & CP0_CERRI_DATA_PARITY) |
95 | prom_printf(" data-parity"); | 95 | printk(" data-parity"); |
96 | if (val & CP0_CERRI_EXTERNAL) | 96 | if (val & CP0_CERRI_EXTERNAL) |
97 | prom_printf(" external"); | 97 | printk(" external"); |
98 | prom_printf("\n"); | 98 | printk("\n"); |
99 | } | 99 | } |
100 | 100 | ||
101 | static inline void breakout_cerrd(unsigned int val) | 101 | static inline void breakout_cerrd(unsigned int val) |
102 | { | 102 | { |
103 | switch (val & CP0_CERRD_CAUSES) { | 103 | switch (val & CP0_CERRD_CAUSES) { |
104 | case CP0_CERRD_LOAD: | 104 | case CP0_CERRD_LOAD: |
105 | prom_printf(" load,"); | 105 | printk(" load,"); |
106 | break; | 106 | break; |
107 | case CP0_CERRD_STORE: | 107 | case CP0_CERRD_STORE: |
108 | prom_printf(" store,"); | 108 | printk(" store,"); |
109 | break; | 109 | break; |
110 | case CP0_CERRD_FILLWB: | 110 | case CP0_CERRD_FILLWB: |
111 | prom_printf(" fill/wb,"); | 111 | printk(" fill/wb,"); |
112 | break; | 112 | break; |
113 | case CP0_CERRD_COHERENCY: | 113 | case CP0_CERRD_COHERENCY: |
114 | prom_printf(" coherency,"); | 114 | printk(" coherency,"); |
115 | break; | 115 | break; |
116 | case CP0_CERRD_DUPTAG: | 116 | case CP0_CERRD_DUPTAG: |
117 | prom_printf(" duptags,"); | 117 | printk(" duptags,"); |
118 | break; | 118 | break; |
119 | default: | 119 | default: |
120 | prom_printf(" NO CAUSE,"); | 120 | printk(" NO CAUSE,"); |
121 | break; | 121 | break; |
122 | } | 122 | } |
123 | if (!(val & CP0_CERRD_TYPES)) | 123 | if (!(val & CP0_CERRD_TYPES)) |
124 | prom_printf(" NO TYPE"); | 124 | printk(" NO TYPE"); |
125 | else { | 125 | else { |
126 | if (val & CP0_CERRD_MULTIPLE) | 126 | if (val & CP0_CERRD_MULTIPLE) |
127 | prom_printf(" multi-err"); | 127 | printk(" multi-err"); |
128 | if (val & CP0_CERRD_TAG_STATE) | 128 | if (val & CP0_CERRD_TAG_STATE) |
129 | prom_printf(" tag-state"); | 129 | printk(" tag-state"); |
130 | if (val & CP0_CERRD_TAG_ADDRESS) | 130 | if (val & CP0_CERRD_TAG_ADDRESS) |
131 | prom_printf(" tag-address"); | 131 | printk(" tag-address"); |
132 | if (val & CP0_CERRD_DATA_SBE) | 132 | if (val & CP0_CERRD_DATA_SBE) |
133 | prom_printf(" data-SBE"); | 133 | printk(" data-SBE"); |
134 | if (val & CP0_CERRD_DATA_DBE) | 134 | if (val & CP0_CERRD_DATA_DBE) |
135 | prom_printf(" data-DBE"); | 135 | printk(" data-DBE"); |
136 | if (val & CP0_CERRD_EXTERNAL) | 136 | if (val & CP0_CERRD_EXTERNAL) |
137 | prom_printf(" external"); | 137 | printk(" external"); |
138 | } | 138 | } |
139 | prom_printf("\n"); | 139 | printk("\n"); |
140 | } | 140 | } |
141 | 141 | ||
142 | #ifndef CONFIG_SIBYTE_BUS_WATCHER | 142 | #ifndef CONFIG_SIBYTE_BUS_WATCHER |
@@ -157,18 +157,18 @@ static void check_bus_watcher(void) | |||
157 | l2_tag = in64(IO_SPACE_BASE | A_L2_ECC_TAG); | 157 | l2_tag = in64(IO_SPACE_BASE | A_L2_ECC_TAG); |
158 | #endif | 158 | #endif |
159 | memio_err = csr_in32(IOADDR(A_BUS_MEM_IO_ERRORS)); | 159 | memio_err = csr_in32(IOADDR(A_BUS_MEM_IO_ERRORS)); |
160 | prom_printf("Bus watcher error counters: %08x %08x\n", l2_err, memio_err); | 160 | printk("Bus watcher error counters: %08x %08x\n", l2_err, memio_err); |
161 | prom_printf("\nLast recorded signature:\n"); | 161 | printk("\nLast recorded signature:\n"); |
162 | prom_printf("Request %02x from %d, answered by %d with Dcode %d\n", | 162 | printk("Request %02x from %d, answered by %d with Dcode %d\n", |
163 | (unsigned int)(G_SCD_BERR_TID(status) & 0x3f), | 163 | (unsigned int)(G_SCD_BERR_TID(status) & 0x3f), |
164 | (int)(G_SCD_BERR_TID(status) >> 6), | 164 | (int)(G_SCD_BERR_TID(status) >> 6), |
165 | (int)G_SCD_BERR_RID(status), | 165 | (int)G_SCD_BERR_RID(status), |
166 | (int)G_SCD_BERR_DCODE(status)); | 166 | (int)G_SCD_BERR_DCODE(status)); |
167 | #ifdef DUMP_L2_ECC_TAG_ON_ERROR | 167 | #ifdef DUMP_L2_ECC_TAG_ON_ERROR |
168 | prom_printf("Last L2 tag w/ bad ECC: %016llx\n", l2_tag); | 168 | printk("Last L2 tag w/ bad ECC: %016llx\n", l2_tag); |
169 | #endif | 169 | #endif |
170 | } else { | 170 | } else { |
171 | prom_printf("Bus watcher indicates no error\n"); | 171 | printk("Bus watcher indicates no error\n"); |
172 | } | 172 | } |
173 | } | 173 | } |
174 | #else | 174 | #else |
@@ -187,11 +187,11 @@ asmlinkage void sb1_cache_error(void) | |||
187 | #else | 187 | #else |
188 | csr_out32(M_SCD_TRACE_CFG_FREEZE, IO_SPACE_BASE | A_SCD_TRACE_CFG); | 188 | csr_out32(M_SCD_TRACE_CFG_FREEZE, IO_SPACE_BASE | A_SCD_TRACE_CFG); |
189 | #endif | 189 | #endif |
190 | prom_printf("Trace buffer frozen\n"); | 190 | printk("Trace buffer frozen\n"); |
191 | #endif | 191 | #endif |
192 | 192 | ||
193 | prom_printf("Cache error exception on CPU %x:\n", | 193 | printk("Cache error exception on CPU %x:\n", |
194 | (read_c0_prid() >> 25) & 0x7); | 194 | (read_c0_prid() >> 25) & 0x7); |
195 | 195 | ||
196 | __asm__ __volatile__ ( | 196 | __asm__ __volatile__ ( |
197 | " .set push\n\t" | 197 | " .set push\n\t" |
@@ -209,43 +209,43 @@ asmlinkage void sb1_cache_error(void) | |||
209 | "=r" (dpahi), "=r" (dpalo), "=r" (eepc)); | 209 | "=r" (dpahi), "=r" (dpalo), "=r" (eepc)); |
210 | 210 | ||
211 | cerr_dpa = (((uint64_t)dpahi) << 32) | dpalo; | 211 | cerr_dpa = (((uint64_t)dpahi) << 32) | dpalo; |
212 | prom_printf(" c0_errorepc == %08x\n", eepc); | 212 | printk(" c0_errorepc == %08x\n", eepc); |
213 | prom_printf(" c0_errctl == %08x", errctl); | 213 | printk(" c0_errctl == %08x", errctl); |
214 | breakout_errctl(errctl); | 214 | breakout_errctl(errctl); |
215 | if (errctl & CP0_ERRCTL_ICACHE) { | 215 | if (errctl & CP0_ERRCTL_ICACHE) { |
216 | prom_printf(" c0_cerr_i == %08x", cerr_i); | 216 | printk(" c0_cerr_i == %08x", cerr_i); |
217 | breakout_cerri(cerr_i); | 217 | breakout_cerri(cerr_i); |
218 | if (CP0_CERRI_IDX_VALID(cerr_i)) { | 218 | if (CP0_CERRI_IDX_VALID(cerr_i)) { |
219 | /* Check index of EPC, allowing for delay slot */ | 219 | /* Check index of EPC, allowing for delay slot */ |
220 | if (((eepc & SB1_CACHE_INDEX_MASK) != (cerr_i & SB1_CACHE_INDEX_MASK)) && | 220 | if (((eepc & SB1_CACHE_INDEX_MASK) != (cerr_i & SB1_CACHE_INDEX_MASK)) && |
221 | ((eepc & SB1_CACHE_INDEX_MASK) != ((cerr_i & SB1_CACHE_INDEX_MASK) - 4))) | 221 | ((eepc & SB1_CACHE_INDEX_MASK) != ((cerr_i & SB1_CACHE_INDEX_MASK) - 4))) |
222 | prom_printf(" cerr_i idx doesn't match eepc\n"); | 222 | printk(" cerr_i idx doesn't match eepc\n"); |
223 | else { | 223 | else { |
224 | res = extract_ic(cerr_i & SB1_CACHE_INDEX_MASK, | 224 | res = extract_ic(cerr_i & SB1_CACHE_INDEX_MASK, |
225 | (cerr_i & CP0_CERRI_DATA) != 0); | 225 | (cerr_i & CP0_CERRI_DATA) != 0); |
226 | if (!(res & cerr_i)) | 226 | if (!(res & cerr_i)) |
227 | prom_printf("...didn't see indicated icache problem\n"); | 227 | printk("...didn't see indicated icache problem\n"); |
228 | } | 228 | } |
229 | } | 229 | } |
230 | } | 230 | } |
231 | if (errctl & CP0_ERRCTL_DCACHE) { | 231 | if (errctl & CP0_ERRCTL_DCACHE) { |
232 | prom_printf(" c0_cerr_d == %08x", cerr_d); | 232 | printk(" c0_cerr_d == %08x", cerr_d); |
233 | breakout_cerrd(cerr_d); | 233 | breakout_cerrd(cerr_d); |
234 | if (CP0_CERRD_DPA_VALID(cerr_d)) { | 234 | if (CP0_CERRD_DPA_VALID(cerr_d)) { |
235 | prom_printf(" c0_cerr_dpa == %010llx\n", cerr_dpa); | 235 | printk(" c0_cerr_dpa == %010llx\n", cerr_dpa); |
236 | if (!CP0_CERRD_IDX_VALID(cerr_d)) { | 236 | if (!CP0_CERRD_IDX_VALID(cerr_d)) { |
237 | res = extract_dc(cerr_dpa & SB1_CACHE_INDEX_MASK, | 237 | res = extract_dc(cerr_dpa & SB1_CACHE_INDEX_MASK, |
238 | (cerr_d & CP0_CERRD_DATA) != 0); | 238 | (cerr_d & CP0_CERRD_DATA) != 0); |
239 | if (!(res & cerr_d)) | 239 | if (!(res & cerr_d)) |
240 | prom_printf("...didn't see indicated dcache problem\n"); | 240 | printk("...didn't see indicated dcache problem\n"); |
241 | } else { | 241 | } else { |
242 | if ((cerr_dpa & SB1_CACHE_INDEX_MASK) != (cerr_d & SB1_CACHE_INDEX_MASK)) | 242 | if ((cerr_dpa & SB1_CACHE_INDEX_MASK) != (cerr_d & SB1_CACHE_INDEX_MASK)) |
243 | prom_printf(" cerr_d idx doesn't match cerr_dpa\n"); | 243 | printk(" cerr_d idx doesn't match cerr_dpa\n"); |
244 | else { | 244 | else { |
245 | res = extract_dc(cerr_d & SB1_CACHE_INDEX_MASK, | 245 | res = extract_dc(cerr_d & SB1_CACHE_INDEX_MASK, |
246 | (cerr_d & CP0_CERRD_DATA) != 0); | 246 | (cerr_d & CP0_CERRD_DATA) != 0); |
247 | if (!(res & cerr_d)) | 247 | if (!(res & cerr_d)) |
248 | prom_printf("...didn't see indicated problem\n"); | 248 | printk("...didn't see indicated problem\n"); |
249 | } | 249 | } |
250 | } | 250 | } |
251 | } | 251 | } |
@@ -334,7 +334,7 @@ static uint32_t extract_ic(unsigned short addr, int data) | |||
334 | uint8_t lru; | 334 | uint8_t lru; |
335 | int res = 0; | 335 | int res = 0; |
336 | 336 | ||
337 | prom_printf("Icache index 0x%04x ", addr); | 337 | printk("Icache index 0x%04x ", addr); |
338 | for (way = 0; way < 4; way++) { | 338 | for (way = 0; way < 4; way++) { |
339 | /* Index-load-tag-I */ | 339 | /* Index-load-tag-I */ |
340 | __asm__ __volatile__ ( | 340 | __asm__ __volatile__ ( |
@@ -354,7 +354,7 @@ static uint32_t extract_ic(unsigned short addr, int data) | |||
354 | taglo = ((unsigned long long)taglohi << 32) | taglolo; | 354 | taglo = ((unsigned long long)taglohi << 32) | taglolo; |
355 | if (way == 0) { | 355 | if (way == 0) { |
356 | lru = (taghi >> 14) & 0xff; | 356 | lru = (taghi >> 14) & 0xff; |
357 | prom_printf("[Bank %d Set 0x%02x] LRU > %d %d %d %d > MRU\n", | 357 | printk("[Bank %d Set 0x%02x] LRU > %d %d %d %d > MRU\n", |
358 | ((addr >> 5) & 0x3), /* bank */ | 358 | ((addr >> 5) & 0x3), /* bank */ |
359 | ((addr >> 7) & 0x3f), /* index */ | 359 | ((addr >> 7) & 0x3f), /* index */ |
360 | (lru & 0x3), | 360 | (lru & 0x3), |
@@ -369,19 +369,19 @@ static uint32_t extract_ic(unsigned short addr, int data) | |||
369 | if (valid) { | 369 | if (valid) { |
370 | tlo_tmp = taglo & 0xfff3ff; | 370 | tlo_tmp = taglo & 0xfff3ff; |
371 | if (((taglo >> 10) & 1) ^ range_parity(tlo_tmp, 23, 0)) { | 371 | if (((taglo >> 10) & 1) ^ range_parity(tlo_tmp, 23, 0)) { |
372 | prom_printf(" ** bad parity in VTag0/G/ASID\n"); | 372 | printk(" ** bad parity in VTag0/G/ASID\n"); |
373 | res |= CP0_CERRI_TAG_PARITY; | 373 | res |= CP0_CERRI_TAG_PARITY; |
374 | } | 374 | } |
375 | if (((taglo >> 11) & 1) ^ range_parity(taglo, 63, 24)) { | 375 | if (((taglo >> 11) & 1) ^ range_parity(taglo, 63, 24)) { |
376 | prom_printf(" ** bad parity in R/VTag1\n"); | 376 | printk(" ** bad parity in R/VTag1\n"); |
377 | res |= CP0_CERRI_TAG_PARITY; | 377 | res |= CP0_CERRI_TAG_PARITY; |
378 | } | 378 | } |
379 | } | 379 | } |
380 | if (valid ^ ((taghi >> 27) & 1)) { | 380 | if (valid ^ ((taghi >> 27) & 1)) { |
381 | prom_printf(" ** bad parity for valid bit\n"); | 381 | printk(" ** bad parity for valid bit\n"); |
382 | res |= CP0_CERRI_TAG_PARITY; | 382 | res |= CP0_CERRI_TAG_PARITY; |
383 | } | 383 | } |
384 | prom_printf(" %d [VA %016llx] [Vld? %d] raw tags: %08X-%016llX\n", | 384 | printk(" %d [VA %016llx] [Vld? %d] raw tags: %08X-%016llX\n", |
385 | way, va, valid, taghi, taglo); | 385 | way, va, valid, taghi, taglo); |
386 | 386 | ||
387 | if (data) { | 387 | if (data) { |
@@ -407,21 +407,21 @@ static uint32_t extract_ic(unsigned short addr, int data) | |||
407 | : "r" ((way << 13) | addr | (offset << 3))); | 407 | : "r" ((way << 13) | addr | (offset << 3))); |
408 | predecode = (datahi >> 8) & 0xff; | 408 | predecode = (datahi >> 8) & 0xff; |
409 | if (((datahi >> 16) & 1) != (uint32_t)range_parity(predecode, 7, 0)) { | 409 | if (((datahi >> 16) & 1) != (uint32_t)range_parity(predecode, 7, 0)) { |
410 | prom_printf(" ** bad parity in predecode\n"); | 410 | printk(" ** bad parity in predecode\n"); |
411 | res |= CP0_CERRI_DATA_PARITY; | 411 | res |= CP0_CERRI_DATA_PARITY; |
412 | } | 412 | } |
413 | /* XXXKW should/could check predecode bits themselves */ | 413 | /* XXXKW should/could check predecode bits themselves */ |
414 | if (((datahi >> 4) & 0xf) ^ inst_parity(insta)) { | 414 | if (((datahi >> 4) & 0xf) ^ inst_parity(insta)) { |
415 | prom_printf(" ** bad parity in instruction a\n"); | 415 | printk(" ** bad parity in instruction a\n"); |
416 | res |= CP0_CERRI_DATA_PARITY; | 416 | res |= CP0_CERRI_DATA_PARITY; |
417 | } | 417 | } |
418 | if ((datahi & 0xf) ^ inst_parity(instb)) { | 418 | if ((datahi & 0xf) ^ inst_parity(instb)) { |
419 | prom_printf(" ** bad parity in instruction b\n"); | 419 | printk(" ** bad parity in instruction b\n"); |
420 | res |= CP0_CERRI_DATA_PARITY; | 420 | res |= CP0_CERRI_DATA_PARITY; |
421 | } | 421 | } |
422 | prom_printf(" %05X-%08X%08X", datahi, insta, instb); | 422 | printk(" %05X-%08X%08X", datahi, insta, instb); |
423 | } | 423 | } |
424 | prom_printf("\n"); | 424 | printk("\n"); |
425 | } | 425 | } |
426 | } | 426 | } |
427 | return res; | 427 | return res; |
@@ -489,7 +489,7 @@ static uint32_t extract_dc(unsigned short addr, int data) | |||
489 | uint8_t ecc, lru; | 489 | uint8_t ecc, lru; |
490 | int res = 0; | 490 | int res = 0; |
491 | 491 | ||
492 | prom_printf("Dcache index 0x%04x ", addr); | 492 | printk("Dcache index 0x%04x ", addr); |
493 | for (way = 0; way < 4; way++) { | 493 | for (way = 0; way < 4; way++) { |
494 | __asm__ __volatile__ ( | 494 | __asm__ __volatile__ ( |
495 | " .set push\n\t" | 495 | " .set push\n\t" |
@@ -509,7 +509,7 @@ static uint32_t extract_dc(unsigned short addr, int data) | |||
509 | pa = (taglo & 0xFFFFFFE000ULL) | addr; | 509 | pa = (taglo & 0xFFFFFFE000ULL) | addr; |
510 | if (way == 0) { | 510 | if (way == 0) { |
511 | lru = (taghi >> 14) & 0xff; | 511 | lru = (taghi >> 14) & 0xff; |
512 | prom_printf("[Bank %d Set 0x%02x] LRU > %d %d %d %d > MRU\n", | 512 | printk("[Bank %d Set 0x%02x] LRU > %d %d %d %d > MRU\n", |
513 | ((addr >> 11) & 0x2) | ((addr >> 5) & 1), /* bank */ | 513 | ((addr >> 11) & 0x2) | ((addr >> 5) & 1), /* bank */ |
514 | ((addr >> 6) & 0x3f), /* index */ | 514 | ((addr >> 6) & 0x3f), /* index */ |
515 | (lru & 0x3), | 515 | (lru & 0x3), |
@@ -519,15 +519,15 @@ static uint32_t extract_dc(unsigned short addr, int data) | |||
519 | } | 519 | } |
520 | state = (taghi >> 25) & 0x1f; | 520 | state = (taghi >> 25) & 0x1f; |
521 | valid = DC_TAG_VALID(state); | 521 | valid = DC_TAG_VALID(state); |
522 | prom_printf(" %d [PA %010llx] [state %s (%02x)] raw tags: %08X-%016llX\n", | 522 | printk(" %d [PA %010llx] [state %s (%02x)] raw tags: %08X-%016llX\n", |
523 | way, pa, dc_state_str(state), state, taghi, taglo); | 523 | way, pa, dc_state_str(state), state, taghi, taglo); |
524 | if (valid) { | 524 | if (valid) { |
525 | if (((taglo >> 11) & 1) ^ range_parity(taglo, 39, 26)) { | 525 | if (((taglo >> 11) & 1) ^ range_parity(taglo, 39, 26)) { |
526 | prom_printf(" ** bad parity in PTag1\n"); | 526 | printk(" ** bad parity in PTag1\n"); |
527 | res |= CP0_CERRD_TAG_ADDRESS; | 527 | res |= CP0_CERRD_TAG_ADDRESS; |
528 | } | 528 | } |
529 | if (((taglo >> 10) & 1) ^ range_parity(taglo, 25, 13)) { | 529 | if (((taglo >> 10) & 1) ^ range_parity(taglo, 25, 13)) { |
530 | prom_printf(" ** bad parity in PTag0\n"); | 530 | printk(" ** bad parity in PTag0\n"); |
531 | res |= CP0_CERRD_TAG_ADDRESS; | 531 | res |= CP0_CERRD_TAG_ADDRESS; |
532 | } | 532 | } |
533 | } else { | 533 | } else { |
@@ -567,13 +567,13 @@ static uint32_t extract_dc(unsigned short addr, int data) | |||
567 | } | 567 | } |
568 | res |= (bits == 1) ? CP0_CERRD_DATA_SBE : CP0_CERRD_DATA_DBE; | 568 | res |= (bits == 1) ? CP0_CERRD_DATA_SBE : CP0_CERRD_DATA_DBE; |
569 | } | 569 | } |
570 | prom_printf(" %02X-%016llX", datahi, datalo); | 570 | printk(" %02X-%016llX", datahi, datalo); |
571 | } | 571 | } |
572 | prom_printf("\n"); | 572 | printk("\n"); |
573 | if (bad_ecc) | 573 | if (bad_ecc) |
574 | prom_printf(" dwords w/ bad ECC: %d %d %d %d\n", | 574 | printk(" dwords w/ bad ECC: %d %d %d %d\n", |
575 | !!(bad_ecc & 8), !!(bad_ecc & 4), | 575 | !!(bad_ecc & 8), !!(bad_ecc & 4), |
576 | !!(bad_ecc & 2), !!(bad_ecc & 1)); | 576 | !!(bad_ecc & 2), !!(bad_ecc & 1)); |
577 | } | 577 | } |
578 | } | 578 | } |
579 | return res; | 579 | return res; |
diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c index a72093ad105f..f503d02e403b 100644 --- a/arch/mips/mm/dma-default.c +++ b/arch/mips/mm/dma-default.c | |||
@@ -295,7 +295,7 @@ void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems, | |||
295 | 295 | ||
296 | /* Make sure that gcc doesn't leave the empty loop body. */ | 296 | /* Make sure that gcc doesn't leave the empty loop body. */ |
297 | for (i = 0; i < nelems; i++, sg++) { | 297 | for (i = 0; i < nelems; i++, sg++) { |
298 | if (!plat_device_is_coherent(dev)) | 298 | if (cpu_is_noncoherent_r10000(dev)) |
299 | __dma_sync((unsigned long)page_address(sg->page), | 299 | __dma_sync((unsigned long)page_address(sg->page), |
300 | sg->length, direction); | 300 | sg->length, direction); |
301 | plat_unmap_dma_mem(sg->dma_address); | 301 | plat_unmap_dma_mem(sg->dma_address); |
diff --git a/arch/mips/momentum/jaguar_atx/ja-console.c b/arch/mips/momentum/jaguar_atx/ja-console.c index 2292d0ec47fc..2c30b4f56245 100644 --- a/arch/mips/momentum/jaguar_atx/ja-console.c +++ b/arch/mips/momentum/jaguar_atx/ja-console.c | |||
@@ -74,11 +74,6 @@ void prom_putchar(char c) | |||
74 | uart->iu_thr = c; | 74 | uart->iu_thr = c; |
75 | } | 75 | } |
76 | 76 | ||
77 | char __init prom_getchar(void) | ||
78 | { | ||
79 | return 0; | ||
80 | } | ||
81 | |||
82 | static void inline ja_console_probe(void) | 77 | static void inline ja_console_probe(void) |
83 | { | 78 | { |
84 | struct uart_port up; | 79 | struct uart_port up; |
diff --git a/arch/mips/oprofile/op_model_mipsxx.c b/arch/mips/oprofile/op_model_mipsxx.c index 455d76ad06d8..9d08608aaa51 100644 --- a/arch/mips/oprofile/op_model_mipsxx.c +++ b/arch/mips/oprofile/op_model_mipsxx.c | |||
@@ -223,10 +223,12 @@ static inline int n_counters(void) | |||
223 | switch (current_cpu_data.cputype) { | 223 | switch (current_cpu_data.cputype) { |
224 | case CPU_R10000: | 224 | case CPU_R10000: |
225 | counters = 2; | 225 | counters = 2; |
226 | break; | ||
226 | 227 | ||
227 | case CPU_R12000: | 228 | case CPU_R12000: |
228 | case CPU_R14000: | 229 | case CPU_R14000: |
229 | counters = 4; | 230 | counters = 4; |
231 | break; | ||
230 | 232 | ||
231 | default: | 233 | default: |
232 | counters = __n_counters(); | 234 | counters = __n_counters(); |
diff --git a/arch/mips/pci/fixup-jmr3927.c b/arch/mips/pci/fixup-jmr3927.c index f8696081c5b1..6e72d213f4cd 100644 --- a/arch/mips/pci/fixup-jmr3927.c +++ b/arch/mips/pci/fixup-jmr3927.c | |||
@@ -38,6 +38,10 @@ int __init pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | |||
38 | { | 38 | { |
39 | unsigned char irq = pin; | 39 | unsigned char irq = pin; |
40 | 40 | ||
41 | /* SMSC SLC90E66 IDE uses irq 14, 15 (default) */ | ||
42 | if (dev->vendor == PCI_VENDOR_ID_EFAR && | ||
43 | dev->device == PCI_DEVICE_ID_EFAR_SLC90E66_1) | ||
44 | return irq; | ||
41 | /* IRQ rotation (PICMG) */ | 45 | /* IRQ rotation (PICMG) */ |
42 | irq--; /* 0-3 */ | 46 | irq--; /* 0-3 */ |
43 | if (dev->bus->parent == NULL && | 47 | if (dev->bus->parent == NULL && |
@@ -93,13 +97,3 @@ int pcibios_plat_dev_init(struct pci_dev *dev) | |||
93 | { | 97 | { |
94 | return 0; | 98 | return 0; |
95 | } | 99 | } |
96 | |||
97 | int __init pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | ||
98 | { | ||
99 | /* SMSC SLC90E66 IDE uses irq 14, 15 (default) */ | ||
100 | if (!(dev->vendor == PCI_VENDOR_ID_EFAR && | ||
101 | dev->device == PCI_DEVICE_ID_EFAR_SLC90E66_1)) | ||
102 | return pci_get_irq(dev, pin); | ||
103 | |||
104 | dev->irq = irq; | ||
105 | } | ||
diff --git a/arch/mips/pci/fixup-sni.c b/arch/mips/pci/fixup-sni.c index 0c9a4732d455..36e5fb1b3786 100644 --- a/arch/mips/pci/fixup-sni.c +++ b/arch/mips/pci/fixup-sni.c | |||
@@ -14,6 +14,8 @@ | |||
14 | #include <asm/mipsregs.h> | 14 | #include <asm/mipsregs.h> |
15 | #include <asm/sni.h> | 15 | #include <asm/sni.h> |
16 | 16 | ||
17 | #include <irq.h> | ||
18 | |||
17 | /* | 19 | /* |
18 | * PCIMT Shortcuts ... | 20 | * PCIMT Shortcuts ... |
19 | */ | 21 | */ |
diff --git a/arch/mips/pci/ops-au1000.c b/arch/mips/pci/ops-au1000.c index 8ae46481fcb7..7932dfe5eb9b 100644 --- a/arch/mips/pci/ops-au1000.c +++ b/arch/mips/pci/ops-au1000.c | |||
@@ -172,7 +172,11 @@ static int config_access(unsigned char access_type, struct pci_bus *bus, | |||
172 | error = -1; | 172 | error = -1; |
173 | DBG("Au1x Master Abort\n"); | 173 | DBG("Au1x Master Abort\n"); |
174 | } else if ((status >> 28) & 0xf) { | 174 | } else if ((status >> 28) & 0xf) { |
175 | DBG("PCI ERR detected: status %x\n", status); | 175 | DBG("PCI ERR detected: device %d, status %x\n", device, ((status >> 28) & 0xf)); |
176 | |||
177 | /* clear errors */ | ||
178 | au_writel(status & 0xf000ffff, Au1500_PCI_STATCMD); | ||
179 | |||
176 | *data = 0xffffffff; | 180 | *data = 0xffffffff; |
177 | error = -1; | 181 | error = -1; |
178 | } | 182 | } |
diff --git a/arch/mips/philips/pnx8550/common/prom.c b/arch/mips/philips/pnx8550/common/prom.c index 8aeed6c2b8c3..2f567452e7ac 100644 --- a/arch/mips/philips/pnx8550/common/prom.c +++ b/arch/mips/philips/pnx8550/common/prom.c | |||
@@ -112,7 +112,7 @@ void __init prom_free_prom_memory(void) | |||
112 | 112 | ||
113 | extern int pnx8550_console_port; | 113 | extern int pnx8550_console_port; |
114 | 114 | ||
115 | /* used by prom_printf */ | 115 | /* used by early printk */ |
116 | void prom_putchar(char c) | 116 | void prom_putchar(char c) |
117 | { | 117 | { |
118 | if (pnx8550_console_port != -1) { | 118 | if (pnx8550_console_port != -1) { |
diff --git a/arch/mips/philips/pnx8550/common/setup.c b/arch/mips/philips/pnx8550/common/setup.c index e62123ca9b64..5bd737477685 100644 --- a/arch/mips/philips/pnx8550/common/setup.c +++ b/arch/mips/philips/pnx8550/common/setup.c | |||
@@ -41,8 +41,6 @@ | |||
41 | #include <uart.h> | 41 | #include <uart.h> |
42 | #include <nand.h> | 42 | #include <nand.h> |
43 | 43 | ||
44 | extern void prom_printf(char *fmt, ...); | ||
45 | |||
46 | extern void __init board_setup(void); | 44 | extern void __init board_setup(void); |
47 | extern void pnx8550_machine_restart(char *); | 45 | extern void pnx8550_machine_restart(char *); |
48 | extern void pnx8550_machine_halt(void); | 46 | extern void pnx8550_machine_halt(void); |
@@ -51,7 +49,6 @@ extern struct resource ioport_resource; | |||
51 | extern struct resource iomem_resource; | 49 | extern struct resource iomem_resource; |
52 | extern void pnx8550_time_init(void); | 50 | extern void pnx8550_time_init(void); |
53 | extern void rs_kgdb_hook(int tty_no); | 51 | extern void rs_kgdb_hook(int tty_no); |
54 | extern void prom_printf(char *fmt, ...); | ||
55 | extern char *prom_getcmdline(void); | 52 | extern char *prom_getcmdline(void); |
56 | 53 | ||
57 | struct resource standard_io_resources[] = { | 54 | struct resource standard_io_resources[] = { |
@@ -141,7 +138,7 @@ void __init plat_mem_setup(void) | |||
141 | argptr += strlen("console=ttyS"); | 138 | argptr += strlen("console=ttyS"); |
142 | pnx8550_console_port = *argptr == '0' ? 0 : 1; | 139 | pnx8550_console_port = *argptr == '0' ? 0 : 1; |
143 | 140 | ||
144 | /* We must initialize the UART (console) before prom_printf */ | 141 | /* We must initialize the UART (console) before early printk */ |
145 | /* Set LCR to 8-bit and BAUD to 38400 (no 5) */ | 142 | /* Set LCR to 8-bit and BAUD to 38400 (no 5) */ |
146 | ip3106_lcr(UART_BASE, pnx8550_console_port) = | 143 | ip3106_lcr(UART_BASE, pnx8550_console_port) = |
147 | PNX8XXX_UART_LCR_8BIT; | 144 | PNX8XXX_UART_LCR_8BIT; |
@@ -155,8 +152,8 @@ void __init plat_mem_setup(void) | |||
155 | argptr += strlen("kgdb=ttyS"); | 152 | argptr += strlen("kgdb=ttyS"); |
156 | line = *argptr == '0' ? 0 : 1; | 153 | line = *argptr == '0' ? 0 : 1; |
157 | rs_kgdb_hook(line); | 154 | rs_kgdb_hook(line); |
158 | prom_printf("KGDB: Using ttyS%i for session, " | 155 | pr_info("KGDB: Using ttyS%i for session, " |
159 | "please connect your debugger\n", line ? 1 : 0); | 156 | "please connect your debugger\n", line ? 1 : 0); |
160 | } | 157 | } |
161 | #endif | 158 | #endif |
162 | return; | 159 | return; |
diff --git a/arch/mips/pmc-sierra/yosemite/py-console.c b/arch/mips/pmc-sierra/yosemite/py-console.c index 757e605693ff..b7f1d9c4a8a3 100644 --- a/arch/mips/pmc-sierra/yosemite/py-console.c +++ b/arch/mips/pmc-sierra/yosemite/py-console.c | |||
@@ -107,8 +107,3 @@ void prom_putchar(char c) | |||
107 | while ((readb_outer_space(lsr) & 0x20) == 0); | 107 | while ((readb_outer_space(lsr) & 0x20) == 0); |
108 | writeb_outer_space(thr, c); | 108 | writeb_outer_space(thr, c); |
109 | } | 109 | } |
110 | |||
111 | char __init prom_getchar(void) | ||
112 | { | ||
113 | return 0; | ||
114 | } | ||
diff --git a/arch/mips/sgi-ip27/ip27-console.c b/arch/mips/sgi-ip27/ip27-console.c index 14211e382374..3ba830651c58 100644 --- a/arch/mips/sgi-ip27/ip27-console.c +++ b/arch/mips/sgi-ip27/ip27-console.c | |||
@@ -6,12 +6,6 @@ | |||
6 | * Copyright (C) 2001, 2002 Ralf Baechle | 6 | * Copyright (C) 2001, 2002 Ralf Baechle |
7 | */ | 7 | */ |
8 | #include <linux/init.h> | 8 | #include <linux/init.h> |
9 | #include <linux/console.h> | ||
10 | #include <linux/kdev_t.h> | ||
11 | #include <linux/major.h> | ||
12 | #include <linux/termios.h> | ||
13 | #include <linux/sched.h> | ||
14 | #include <linux/tty.h> | ||
15 | 9 | ||
16 | #include <asm/page.h> | 10 | #include <asm/page.h> |
17 | #include <asm/semaphore.h> | 11 | #include <asm/semaphore.h> |
@@ -38,37 +32,10 @@ static inline struct ioc3_uartregs *console_uart(void) | |||
38 | return &ioc3->sregs.uarta; | 32 | return &ioc3->sregs.uarta; |
39 | } | 33 | } |
40 | 34 | ||
41 | void prom_putchar(char c) | 35 | void __init prom_putchar(char c) |
42 | { | 36 | { |
43 | struct ioc3_uartregs *uart = console_uart(); | 37 | struct ioc3_uartregs *uart = console_uart(); |
44 | 38 | ||
45 | while ((uart->iu_lsr & 0x20) == 0); | 39 | while ((uart->iu_lsr & 0x20) == 0); |
46 | uart->iu_thr = c; | 40 | uart->iu_thr = c; |
47 | } | 41 | } |
48 | |||
49 | static void ioc3_console_write(struct console *con, const char *s, unsigned n) | ||
50 | { | ||
51 | while (n-- && *s) { | ||
52 | if (*s == '\n') | ||
53 | prom_putchar('\r'); | ||
54 | prom_putchar(*s); | ||
55 | s++; | ||
56 | } | ||
57 | } | ||
58 | |||
59 | static struct console ioc3_console = { | ||
60 | .name = "ioc3", | ||
61 | .write = ioc3_console_write, | ||
62 | .flags = CON_PRINTBUFFER | CON_BOOT, | ||
63 | .index = -1 | ||
64 | }; | ||
65 | |||
66 | __init void ip27_setup_console(void) | ||
67 | { | ||
68 | register_console(&ioc3_console); | ||
69 | } | ||
70 | |||
71 | void __init disable_early_printk(void) | ||
72 | { | ||
73 | unregister_console(&ioc3_console); | ||
74 | } | ||
diff --git a/arch/mips/sibyte/Kconfig b/arch/mips/sibyte/Kconfig index ec7a2cffacf0..67dac6204b6d 100644 --- a/arch/mips/sibyte/Kconfig +++ b/arch/mips/sibyte/Kconfig | |||
@@ -116,6 +116,7 @@ config SB1_CERR_STALL | |||
116 | config SIBYTE_CFE | 116 | config SIBYTE_CFE |
117 | bool "Booting from CFE" | 117 | bool "Booting from CFE" |
118 | depends on SIBYTE_SB1xxx_SOC | 118 | depends on SIBYTE_SB1xxx_SOC |
119 | select SYS_HAS_EARLY_PRINTK | ||
119 | help | 120 | help |
120 | Make use of the CFE API for enumerating available memory, | 121 | Make use of the CFE API for enumerating available memory, |
121 | controlling secondary CPUs, and possibly console output. | 122 | controlling secondary CPUs, and possibly console output. |
@@ -131,6 +132,7 @@ config SIBYTE_CFE_CONSOLE | |||
131 | config SIBYTE_STANDALONE | 132 | config SIBYTE_STANDALONE |
132 | bool | 133 | bool |
133 | depends on SIBYTE_SB1xxx_SOC && !SIBYTE_CFE | 134 | depends on SIBYTE_SB1xxx_SOC && !SIBYTE_CFE |
135 | select SYS_HAS_EARLY_PRINTK | ||
134 | default y | 136 | default y |
135 | 137 | ||
136 | config SIBYTE_STANDALONE_RAM_SIZE | 138 | config SIBYTE_STANDALONE_RAM_SIZE |
diff --git a/arch/mips/sibyte/bcm1480/irq.c b/arch/mips/sibyte/bcm1480/irq.c index 1dc5d05d8962..20af0f1bb7bf 100644 --- a/arch/mips/sibyte/bcm1480/irq.c +++ b/arch/mips/sibyte/bcm1480/irq.c | |||
@@ -420,7 +420,7 @@ void __init arch_init_irq(void) | |||
420 | #ifdef CONFIG_GDB_CONSOLE | 420 | #ifdef CONFIG_GDB_CONSOLE |
421 | register_gdb_console(); | 421 | register_gdb_console(); |
422 | #endif | 422 | #endif |
423 | prom_printf("Waiting for GDB on UART port %d\n", kgdb_port); | 423 | printk("Waiting for GDB on UART port %d\n", kgdb_port); |
424 | set_debug_traps(); | 424 | set_debug_traps(); |
425 | breakpoint(); | 425 | breakpoint(); |
426 | } | 426 | } |
diff --git a/arch/mips/sibyte/bcm1480/setup.c b/arch/mips/sibyte/bcm1480/setup.c index 8236d0c48542..bdaac34ae708 100644 --- a/arch/mips/sibyte/bcm1480/setup.c +++ b/arch/mips/sibyte/bcm1480/setup.c | |||
@@ -69,7 +69,7 @@ static inline int sys_rev_decode(void) | |||
69 | break; | 69 | break; |
70 | 70 | ||
71 | default: | 71 | default: |
72 | prom_printf("Unknown part type %x\n", part_type); | 72 | printk("Unknown part type %x\n", part_type); |
73 | ret = 1; | 73 | ret = 1; |
74 | break; | 74 | break; |
75 | } | 75 | } |
@@ -102,7 +102,7 @@ static inline int setup_bcm1x80_bcm1x55(void) | |||
102 | pass_str = "B0 (pass2)"; | 102 | pass_str = "B0 (pass2)"; |
103 | break; | 103 | break; |
104 | default: | 104 | default: |
105 | prom_printf("Unknown %s rev %x\n", soc_str, soc_pass); | 105 | printk("Unknown %s rev %x\n", soc_str, soc_pass); |
106 | periph_rev = 1; | 106 | periph_rev = 1; |
107 | pass_str = "Unknown Revision"; | 107 | pass_str = "Unknown Revision"; |
108 | break; | 108 | break; |
@@ -122,14 +122,14 @@ void bcm1480_setup(void) | |||
122 | soc_pass = G_SYS_REVISION(sys_rev); | 122 | soc_pass = G_SYS_REVISION(sys_rev); |
123 | 123 | ||
124 | if (sys_rev_decode()) { | 124 | if (sys_rev_decode()) { |
125 | prom_printf("Restart after failure to identify SiByte chip\n"); | 125 | printk("Restart after failure to identify SiByte chip\n"); |
126 | machine_restart(NULL); | 126 | machine_restart(NULL); |
127 | } | 127 | } |
128 | 128 | ||
129 | plldiv = G_BCM1480_SYS_PLL_DIV(__raw_readq(IOADDR(A_SCD_SYSTEM_CFG))); | 129 | plldiv = G_BCM1480_SYS_PLL_DIV(__raw_readq(IOADDR(A_SCD_SYSTEM_CFG))); |
130 | zbbus_mhz = ((plldiv >> 1) * 50) + ((plldiv & 1) * 25); | 130 | zbbus_mhz = ((plldiv >> 1) * 50) + ((plldiv & 1) * 25); |
131 | 131 | ||
132 | prom_printf("Broadcom SiByte %s %s @ %d MHz (SB-1A rev %d)\n", | 132 | printk("Broadcom SiByte %s %s @ %d MHz (SB-1A rev %d)\n", |
133 | soc_str, pass_str, zbbus_mhz * 2, sb1_pass); | 133 | soc_str, pass_str, zbbus_mhz * 2, sb1_pass); |
134 | prom_printf("Board type: %s\n", get_system_type()); | 134 | printk("Board type: %s\n", get_system_type()); |
135 | } | 135 | } |
diff --git a/arch/mips/sibyte/cfe/setup.c b/arch/mips/sibyte/cfe/setup.c index 9e6099e69622..ae4a92c3e529 100644 --- a/arch/mips/sibyte/cfe/setup.c +++ b/arch/mips/sibyte/cfe/setup.c | |||
@@ -221,10 +221,10 @@ static int __init initrd_setup(char *str) | |||
221 | goto fail; | 221 | goto fail; |
222 | } | 222 | } |
223 | initrd_end = initrd_start + initrd_size; | 223 | initrd_end = initrd_start + initrd_size; |
224 | prom_printf("Found initrd of %lx@%lx\n", initrd_size, initrd_start); | 224 | printk("Found initrd of %lx@%lx\n", initrd_size, initrd_start); |
225 | return 1; | 225 | return 1; |
226 | fail: | 226 | fail: |
227 | prom_printf("Bad initrd argument. Disabling initrd\n"); | 227 | printk("Bad initrd argument. Disabling initrd\n"); |
228 | initrd_start = 0; | 228 | initrd_start = 0; |
229 | initrd_end = 0; | 229 | initrd_end = 0; |
230 | return 1; | 230 | return 1; |
@@ -281,7 +281,7 @@ void __init prom_init(void) | |||
281 | } | 281 | } |
282 | if (cfe_eptseal != CFE_EPTSEAL) { | 282 | if (cfe_eptseal != CFE_EPTSEAL) { |
283 | /* too early for panic to do any good */ | 283 | /* too early for panic to do any good */ |
284 | prom_printf("CFE's entrypoint seal doesn't match. Spinning."); | 284 | printk("CFE's entrypoint seal doesn't match. Spinning."); |
285 | while (1) ; | 285 | while (1) ; |
286 | } | 286 | } |
287 | cfe_init(cfe_handle, cfe_ept); | 287 | cfe_init(cfe_handle, cfe_ept); |
@@ -303,7 +303,7 @@ void __init prom_init(void) | |||
303 | } else { | 303 | } else { |
304 | /* The loader should have set the command line */ | 304 | /* The loader should have set the command line */ |
305 | /* too early for panic to do any good */ | 305 | /* too early for panic to do any good */ |
306 | prom_printf("LINUX_CMDLINE not defined in cfe."); | 306 | printk("LINUX_CMDLINE not defined in cfe."); |
307 | while (1) ; | 307 | while (1) ; |
308 | } | 308 | } |
309 | } | 309 | } |
diff --git a/arch/mips/sibyte/sb1250/setup.c b/arch/mips/sibyte/sb1250/setup.c index d0ee1d5b8223..1cb042eab720 100644 --- a/arch/mips/sibyte/sb1250/setup.c +++ b/arch/mips/sibyte/sb1250/setup.c | |||
@@ -67,7 +67,7 @@ static int __init sys_rev_decode(void) | |||
67 | ret = setup_bcm112x(); | 67 | ret = setup_bcm112x(); |
68 | break; | 68 | break; |
69 | default: | 69 | default: |
70 | prom_printf("Unknown SOC type %x\n", soc_type); | 70 | printk("Unknown SOC type %x\n", soc_type); |
71 | ret = 1; | 71 | ret = 1; |
72 | break; | 72 | break; |
73 | } | 73 | } |
@@ -112,7 +112,7 @@ static int __init setup_bcm1250(void) | |||
112 | pass_str = "A0-A6"; | 112 | pass_str = "A0-A6"; |
113 | war_pass = K_SYS_REVISION_BCM1250_PASS2; | 113 | war_pass = K_SYS_REVISION_BCM1250_PASS2; |
114 | } else { | 114 | } else { |
115 | prom_printf("Unknown BCM1250 rev %x\n", soc_pass); | 115 | printk("Unknown BCM1250 rev %x\n", soc_pass); |
116 | ret = 1; | 116 | ret = 1; |
117 | } | 117 | } |
118 | break; | 118 | break; |
@@ -140,7 +140,7 @@ static int __init setup_bcm112x(void) | |||
140 | pass_str = "A2"; | 140 | pass_str = "A2"; |
141 | break; | 141 | break; |
142 | default: | 142 | default: |
143 | prom_printf("Unknown %s rev %x\n", soc_str, soc_pass); | 143 | printk("Unknown %s rev %x\n", soc_str, soc_pass); |
144 | ret = 1; | 144 | ret = 1; |
145 | } | 145 | } |
146 | return ret; | 146 | return ret; |
@@ -158,21 +158,21 @@ void __init sb1250_setup(void) | |||
158 | soc_pass = G_SYS_REVISION(sys_rev); | 158 | soc_pass = G_SYS_REVISION(sys_rev); |
159 | 159 | ||
160 | if (sys_rev_decode()) { | 160 | if (sys_rev_decode()) { |
161 | prom_printf("Restart after failure to identify SiByte chip\n"); | 161 | printk("Restart after failure to identify SiByte chip\n"); |
162 | machine_restart(NULL); | 162 | machine_restart(NULL); |
163 | } | 163 | } |
164 | 164 | ||
165 | plldiv = G_SYS_PLL_DIV(__raw_readq(IOADDR(A_SCD_SYSTEM_CFG))); | 165 | plldiv = G_SYS_PLL_DIV(__raw_readq(IOADDR(A_SCD_SYSTEM_CFG))); |
166 | zbbus_mhz = ((plldiv >> 1) * 50) + ((plldiv & 1) * 25); | 166 | zbbus_mhz = ((plldiv >> 1) * 50) + ((plldiv & 1) * 25); |
167 | 167 | ||
168 | prom_printf("Broadcom SiByte %s %s @ %d MHz (SB1 rev %d)\n", | 168 | printk("Broadcom SiByte %s %s @ %d MHz (SB1 rev %d)\n", |
169 | soc_str, pass_str, zbbus_mhz * 2, sb1_pass); | 169 | soc_str, pass_str, zbbus_mhz * 2, sb1_pass); |
170 | prom_printf("Board type: %s\n", get_system_type()); | 170 | printk("Board type: %s\n", get_system_type()); |
171 | 171 | ||
172 | switch (war_pass) { | 172 | switch (war_pass) { |
173 | case K_SYS_REVISION_BCM1250_PASS1: | 173 | case K_SYS_REVISION_BCM1250_PASS1: |
174 | #ifndef CONFIG_SB1_PASS_1_WORKAROUNDS | 174 | #ifndef CONFIG_SB1_PASS_1_WORKAROUNDS |
175 | prom_printf("@@@@ This is a BCM1250 A0-A2 (Pass 1) board, " | 175 | printk("@@@@ This is a BCM1250 A0-A2 (Pass 1) board, " |
176 | "and the kernel doesn't have the proper " | 176 | "and the kernel doesn't have the proper " |
177 | "workarounds compiled in. @@@@\n"); | 177 | "workarounds compiled in. @@@@\n"); |
178 | bad_config = 1; | 178 | bad_config = 1; |
@@ -182,27 +182,27 @@ void __init sb1250_setup(void) | |||
182 | /* Pass 2 - easiest as default for now - so many numbers */ | 182 | /* Pass 2 - easiest as default for now - so many numbers */ |
183 | #if !defined(CONFIG_SB1_PASS_2_WORKAROUNDS) || \ | 183 | #if !defined(CONFIG_SB1_PASS_2_WORKAROUNDS) || \ |
184 | !defined(CONFIG_SB1_PASS_2_1_WORKAROUNDS) | 184 | !defined(CONFIG_SB1_PASS_2_1_WORKAROUNDS) |
185 | prom_printf("@@@@ This is a BCM1250 A3-A10 board, and the " | 185 | printk("@@@@ This is a BCM1250 A3-A10 board, and the " |
186 | "kernel doesn't have the proper workarounds " | 186 | "kernel doesn't have the proper workarounds " |
187 | "compiled in. @@@@\n"); | 187 | "compiled in. @@@@\n"); |
188 | bad_config = 1; | 188 | bad_config = 1; |
189 | #endif | 189 | #endif |
190 | #ifdef CONFIG_CPU_HAS_PREFETCH | 190 | #ifdef CONFIG_CPU_HAS_PREFETCH |
191 | prom_printf("@@@@ Prefetches may be enabled in this kernel, " | 191 | printk("@@@@ Prefetches may be enabled in this kernel, " |
192 | "but are buggy on this board. @@@@\n"); | 192 | "but are buggy on this board. @@@@\n"); |
193 | bad_config = 1; | 193 | bad_config = 1; |
194 | #endif | 194 | #endif |
195 | break; | 195 | break; |
196 | case K_SYS_REVISION_BCM1250_PASS2_2: | 196 | case K_SYS_REVISION_BCM1250_PASS2_2: |
197 | #ifndef CONFIG_SB1_PASS_2_WORKAROUNDS | 197 | #ifndef CONFIG_SB1_PASS_2_WORKAROUNDS |
198 | prom_printf("@@@@ This is a BCM1250 B1/B2. board, and the " | 198 | printk("@@@@ This is a BCM1250 B1/B2. board, and the " |
199 | "kernel doesn't have the proper workarounds " | 199 | "kernel doesn't have the proper workarounds " |
200 | "compiled in. @@@@\n"); | 200 | "compiled in. @@@@\n"); |
201 | bad_config = 1; | 201 | bad_config = 1; |
202 | #endif | 202 | #endif |
203 | #if defined(CONFIG_SB1_PASS_2_1_WORKAROUNDS) || \ | 203 | #if defined(CONFIG_SB1_PASS_2_1_WORKAROUNDS) || \ |
204 | !defined(CONFIG_CPU_HAS_PREFETCH) | 204 | !defined(CONFIG_CPU_HAS_PREFETCH) |
205 | prom_printf("@@@@ This is a BCM1250 B1/B2, but the kernel is " | 205 | printk("@@@@ This is a BCM1250 B1/B2, but the kernel is " |
206 | "conservatively configured for an 'A' stepping. " | 206 | "conservatively configured for an 'A' stepping. " |
207 | "@@@@\n"); | 207 | "@@@@\n"); |
208 | #endif | 208 | #endif |
@@ -211,7 +211,7 @@ void __init sb1250_setup(void) | |||
211 | break; | 211 | break; |
212 | } | 212 | } |
213 | if (bad_config) { | 213 | if (bad_config) { |
214 | prom_printf("Invalid configuration for this chip.\n"); | 214 | printk("Invalid configuration for this chip.\n"); |
215 | machine_restart(NULL); | 215 | machine_restart(NULL); |
216 | } | 216 | } |
217 | } | 217 | } |
diff --git a/arch/mips/sni/sniprom.c b/arch/mips/sni/sniprom.c index 6a44bbf0b732..643366eb854a 100644 --- a/arch/mips/sni/sniprom.c +++ b/arch/mips/sni/sniprom.c | |||
@@ -9,6 +9,8 @@ | |||
9 | * Copyright (C) 2005-2006 Thomas Bogendoerfer (tsbogend@alpha.franken.de) | 9 | * Copyright (C) 2005-2006 Thomas Bogendoerfer (tsbogend@alpha.franken.de) |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #define DEBUG | ||
13 | |||
12 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
13 | #include <linux/init.h> | 15 | #include <linux/init.h> |
14 | #include <linux/string.h> | 16 | #include <linux/string.h> |
@@ -32,14 +34,13 @@ | |||
32 | #define PROM_ENTRY(x) (PROM_VEC + (x)) | 34 | #define PROM_ENTRY(x) (PROM_VEC + (x)) |
33 | 35 | ||
34 | 36 | ||
35 | #define DEBUG | ||
36 | #ifdef DEBUG | ||
37 | #define DBG_PRINTF(x...) prom_printf(x) | ||
38 | #else | ||
39 | #define DBG_PRINTF(x...) | ||
40 | #endif | ||
41 | |||
42 | static int *(*__prom_putchar)(int) = (int *(*)(int))PROM_ENTRY(PROM_PUTCHAR); | 37 | static int *(*__prom_putchar)(int) = (int *(*)(int))PROM_ENTRY(PROM_PUTCHAR); |
38 | |||
39 | void prom_putchar(char c) | ||
40 | { | ||
41 | __prom_putchar(c); | ||
42 | } | ||
43 | |||
43 | static char *(*__prom_getenv)(char *) = (char *(*)(char *))PROM_ENTRY(PROM_GETENV); | 44 | static char *(*__prom_getenv)(char *) = (char *(*)(char *))PROM_ENTRY(PROM_GETENV); |
44 | static void (*__prom_get_memconf)(void *) = (void (*)(void *))PROM_ENTRY(PROM_GET_MEMCONF); | 45 | static void (*__prom_get_memconf)(void *) = (void (*)(void *))PROM_ENTRY(PROM_GET_MEMCONF); |
45 | 46 | ||
@@ -48,26 +49,6 @@ char *prom_getenv (char *s) | |||
48 | return __prom_getenv(s); | 49 | return __prom_getenv(s); |
49 | } | 50 | } |
50 | 51 | ||
51 | void prom_printf(char *fmt, ...) | ||
52 | { | ||
53 | va_list args; | ||
54 | char ppbuf[1024]; | ||
55 | char *bptr; | ||
56 | |||
57 | va_start(args, fmt); | ||
58 | vsprintf(ppbuf, fmt, args); | ||
59 | |||
60 | bptr = ppbuf; | ||
61 | |||
62 | while (*bptr != 0) { | ||
63 | if (*bptr == '\n') | ||
64 | __prom_putchar('\r'); | ||
65 | |||
66 | __prom_putchar(*bptr++); | ||
67 | } | ||
68 | va_end(args); | ||
69 | } | ||
70 | |||
71 | void __init prom_free_prom_memory(void) | 52 | void __init prom_free_prom_memory(void) |
72 | { | 53 | { |
73 | } | 54 | } |
@@ -94,15 +75,15 @@ static void sni_idprom_dump(void) | |||
94 | { | 75 | { |
95 | int i; | 76 | int i; |
96 | 77 | ||
97 | prom_printf("SNI IDProm dump:\n"); | 78 | pr_debug("SNI IDProm dump:\n"); |
98 | for (i = 0; i < 256; i++) { | 79 | for (i = 0; i < 256; i++) { |
99 | if (i%16 == 0) | 80 | if (i%16 == 0) |
100 | prom_printf("%04x ", i); | 81 | pr_debug("%04x ", i); |
101 | 82 | ||
102 | prom_printf("%02x ", *(unsigned char *) (SNI_IDPROM_BASE + i)); | 83 | printk("%02x ", *(unsigned char *) (SNI_IDPROM_BASE + i)); |
103 | 84 | ||
104 | if (i % 16 == 15) | 85 | if (i % 16 == 15) |
105 | prom_printf("\n"); | 86 | printk("\n"); |
106 | } | 87 | } |
107 | } | 88 | } |
108 | #endif | 89 | #endif |
@@ -121,12 +102,12 @@ static void sni_mem_init(void ) | |||
121 | /* MemSIZE from prom in 16MByte chunks */ | 102 | /* MemSIZE from prom in 16MByte chunks */ |
122 | memsize = *((unsigned char *) SNI_IDPROM_MEMSIZE) * 16; | 103 | memsize = *((unsigned char *) SNI_IDPROM_MEMSIZE) * 16; |
123 | 104 | ||
124 | DBG_PRINTF("IDProm memsize: %lu MByte\n", memsize); | 105 | pr_debug("IDProm memsize: %lu MByte\n", memsize); |
125 | 106 | ||
126 | /* get memory bank layout from prom */ | 107 | /* get memory bank layout from prom */ |
127 | __prom_get_memconf(&memconf); | 108 | __prom_get_memconf(&memconf); |
128 | 109 | ||
129 | DBG_PRINTF("prom_get_mem_conf memory configuration:\n"); | 110 | pr_debug("prom_get_mem_conf memory configuration:\n"); |
130 | for (i = 0;i < 8 && memconf[i].size; i++) { | 111 | for (i = 0;i < 8 && memconf[i].size; i++) { |
131 | if (sni_brd_type == SNI_BRD_PCI_TOWER || | 112 | if (sni_brd_type == SNI_BRD_PCI_TOWER || |
132 | sni_brd_type == SNI_BRD_PCI_TOWER_CPLUS) { | 113 | sni_brd_type == SNI_BRD_PCI_TOWER_CPLUS) { |
@@ -135,7 +116,7 @@ static void sni_mem_init(void ) | |||
135 | memconf[i].base -= 0x20000000; | 116 | memconf[i].base -= 0x20000000; |
136 | } | 117 | } |
137 | } | 118 | } |
138 | DBG_PRINTF("Bank%d: %08x @ %08x\n", i, | 119 | pr_debug("Bank%d: %08x @ %08x\n", i, |
139 | memconf[i].size, memconf[i].base); | 120 | memconf[i].size, memconf[i].base); |
140 | add_memory_region(memconf[i].base, memconf[i].size, BOOT_MEM_RAM); | 121 | add_memory_region(memconf[i].base, memconf[i].size, BOOT_MEM_RAM); |
141 | } | 122 | } |
@@ -248,7 +229,7 @@ void __init prom_init(void) | |||
248 | systype = "RM300-Exx"; | 229 | systype = "RM300-Exx"; |
249 | break; | 230 | break; |
250 | } | 231 | } |
251 | DBG_PRINTF("Found SNI brdtype %02x name %s\n", sni_brd_type,systype); | 232 | pr_debug("Found SNI brdtype %02x name %s\n", sni_brd_type,systype); |
252 | 233 | ||
253 | #ifdef DEBUG | 234 | #ifdef DEBUG |
254 | sni_idprom_dump(); | 235 | sni_idprom_dump(); |
diff --git a/arch/mips/tx4927/common/tx4927_setup.c b/arch/mips/tx4927/common/tx4927_setup.c index 941c441729b0..c8e49feb345b 100644 --- a/arch/mips/tx4927/common/tx4927_setup.c +++ b/arch/mips/tx4927/common/tx4927_setup.c | |||
@@ -81,18 +81,8 @@ void __init tx4927_time_init(void) | |||
81 | 81 | ||
82 | void __init plat_timer_setup(struct irqaction *irq) | 82 | void __init plat_timer_setup(struct irqaction *irq) |
83 | { | 83 | { |
84 | u32 count; | ||
85 | u32 c1; | ||
86 | u32 c2; | ||
87 | |||
88 | setup_irq(TX4927_IRQ_CPU_TIMER, irq); | 84 | setup_irq(TX4927_IRQ_CPU_TIMER, irq); |
89 | 85 | ||
90 | /* to generate the first timer interrupt */ | ||
91 | c1 = read_c0_count(); | ||
92 | count = c1 + (mips_hpt_frequency / HZ); | ||
93 | write_c0_compare(count); | ||
94 | c2 = read_c0_count(); | ||
95 | |||
96 | #ifdef CONFIG_TOSHIBA_RBTX4927 | 86 | #ifdef CONFIG_TOSHIBA_RBTX4927 |
97 | { | 87 | { |
98 | extern void toshiba_rbtx4927_timer_setup(struct irqaction | 88 | extern void toshiba_rbtx4927_timer_setup(struct irqaction |
diff --git a/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_irq.c b/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_irq.c index dcce88f403c9..5cc30c10e746 100644 --- a/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_irq.c +++ b/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_irq.c | |||
@@ -132,9 +132,6 @@ JP7 is not bus master -- do NOT use -- only 4 pci bus master's allowed -- SouthB | |||
132 | #include <asm/wbflush.h> | 132 | #include <asm/wbflush.h> |
133 | #include <linux/bootmem.h> | 133 | #include <linux/bootmem.h> |
134 | #include <linux/blkdev.h> | 134 | #include <linux/blkdev.h> |
135 | #ifdef CONFIG_RTC_DS1742 | ||
136 | #include <linux/ds1742rtc.h> | ||
137 | #endif | ||
138 | #ifdef CONFIG_TOSHIBA_FPCIB0 | 135 | #ifdef CONFIG_TOSHIBA_FPCIB0 |
139 | #include <asm/tx4927/smsc_fdc37m81x.h> | 136 | #include <asm/tx4927/smsc_fdc37m81x.h> |
140 | #endif | 137 | #endif |
diff --git a/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c b/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c index 7316a78fdd68..0f7576dfd141 100644 --- a/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c +++ b/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c | |||
@@ -53,6 +53,7 @@ | |||
53 | #include <linux/pci.h> | 53 | #include <linux/pci.h> |
54 | #include <linux/timex.h> | 54 | #include <linux/timex.h> |
55 | #include <linux/pm.h> | 55 | #include <linux/pm.h> |
56 | #include <linux/platform_device.h> | ||
56 | 57 | ||
57 | #include <asm/bootinfo.h> | 58 | #include <asm/bootinfo.h> |
58 | #include <asm/page.h> | 59 | #include <asm/page.h> |
@@ -64,9 +65,6 @@ | |||
64 | #include <asm/time.h> | 65 | #include <asm/time.h> |
65 | #include <linux/bootmem.h> | 66 | #include <linux/bootmem.h> |
66 | #include <linux/blkdev.h> | 67 | #include <linux/blkdev.h> |
67 | #ifdef CONFIG_RTC_DS1742 | ||
68 | #include <linux/ds1742rtc.h> | ||
69 | #endif | ||
70 | #ifdef CONFIG_TOSHIBA_FPCIB0 | 68 | #ifdef CONFIG_TOSHIBA_FPCIB0 |
71 | #include <asm/tx4927/smsc_fdc37m81x.h> | 69 | #include <asm/tx4927/smsc_fdc37m81x.h> |
72 | #endif | 70 | #endif |
@@ -1020,69 +1018,12 @@ void __init toshiba_rbtx4927_setup(void) | |||
1020 | "+\n"); | 1018 | "+\n"); |
1021 | } | 1019 | } |
1022 | 1020 | ||
1023 | #ifdef CONFIG_RTC_DS1742 | ||
1024 | extern unsigned long rtc_ds1742_get_time(void); | ||
1025 | extern int rtc_ds1742_set_time(unsigned long); | ||
1026 | extern void rtc_ds1742_wait(void); | ||
1027 | #endif | ||
1028 | |||
1029 | void __init | 1021 | void __init |
1030 | toshiba_rbtx4927_time_init(void) | 1022 | toshiba_rbtx4927_time_init(void) |
1031 | { | 1023 | { |
1032 | u32 c1; | ||
1033 | u32 c2; | ||
1034 | |||
1035 | TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_TIME_INIT, "-\n"); | 1024 | TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_TIME_INIT, "-\n"); |
1036 | 1025 | ||
1037 | #ifdef CONFIG_RTC_DS1742 | 1026 | mips_hpt_frequency = tx4927_cpu_clock / 2; |
1038 | |||
1039 | rtc_mips_get_time = rtc_ds1742_get_time; | ||
1040 | rtc_mips_set_time = rtc_ds1742_set_time; | ||
1041 | |||
1042 | TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_TIME_INIT, | ||
1043 | ":rtc_ds1742_init()-\n"); | ||
1044 | rtc_ds1742_init(0xbc010000); | ||
1045 | TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_TIME_INIT, | ||
1046 | ":rtc_ds1742_init()+\n"); | ||
1047 | |||
1048 | TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_TIME_INIT, | ||
1049 | ":Calibrate mips_hpt_frequency-\n"); | ||
1050 | rtc_ds1742_wait(); | ||
1051 | |||
1052 | /* get the count */ | ||
1053 | c1 = read_c0_count(); | ||
1054 | |||
1055 | /* wait for the seconds to change again */ | ||
1056 | rtc_ds1742_wait(); | ||
1057 | |||
1058 | /* get the count again */ | ||
1059 | c2 = read_c0_count(); | ||
1060 | |||
1061 | TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_TIME_INIT, | ||
1062 | ":Calibrate mips_hpt_frequency+\n"); | ||
1063 | TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_TIME_INIT, | ||
1064 | ":c1=%12u\n", c1); | ||
1065 | TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_TIME_INIT, | ||
1066 | ":c2=%12u\n", c2); | ||
1067 | |||
1068 | /* this diff is as close as we are going to get to counter ticks per sec */ | ||
1069 | mips_hpt_frequency = abs(c2 - c1); | ||
1070 | TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_TIME_INIT, | ||
1071 | ":f1=%12u\n", mips_hpt_frequency); | ||
1072 | |||
1073 | /* round to 1/10th of a MHz */ | ||
1074 | mips_hpt_frequency /= (100 * 1000); | ||
1075 | mips_hpt_frequency *= (100 * 1000); | ||
1076 | TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_TIME_INIT, | ||
1077 | ":f2=%12u\n", mips_hpt_frequency); | ||
1078 | |||
1079 | TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_INFO, | ||
1080 | ":mips_hpt_frequency=%uHz (%uMHz)\n", | ||
1081 | mips_hpt_frequency, | ||
1082 | mips_hpt_frequency / 1000000); | ||
1083 | #else | ||
1084 | mips_hpt_frequency = 100000000; | ||
1085 | #endif | ||
1086 | 1027 | ||
1087 | TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_TIME_INIT, "+\n"); | 1028 | TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_TIME_INIT, "+\n"); |
1088 | 1029 | ||
@@ -1095,3 +1036,16 @@ void __init toshiba_rbtx4927_timer_setup(struct irqaction *irq) | |||
1095 | TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_TIMER_SETUP, | 1036 | TOSHIBA_RBTX4927_SETUP_DPRINTK(TOSHIBA_RBTX4927_SETUP_TIMER_SETUP, |
1096 | "+\n"); | 1037 | "+\n"); |
1097 | } | 1038 | } |
1039 | |||
1040 | static int __init toshiba_rbtx4927_rtc_init(void) | ||
1041 | { | ||
1042 | struct resource res = { | ||
1043 | .start = 0x1c010000, | ||
1044 | .end = 0x1c010000 + 0x800 - 1, | ||
1045 | .flags = IORESOURCE_MEM, | ||
1046 | }; | ||
1047 | struct platform_device *dev = | ||
1048 | platform_device_register_simple("ds1742", -1, &res, 1); | ||
1049 | return IS_ERR(dev) ? PTR_ERR(dev) : 0; | ||
1050 | } | ||
1051 | device_initcall(toshiba_rbtx4927_rtc_init); | ||
diff --git a/arch/mips/tx4938/common/setup.c b/arch/mips/tx4938/common/setup.c index dc87d92bb08d..142abf453e40 100644 --- a/arch/mips/tx4938/common/setup.c +++ b/arch/mips/tx4938/common/setup.c | |||
@@ -55,14 +55,5 @@ tx4938_time_init(void) | |||
55 | 55 | ||
56 | void __init plat_timer_setup(struct irqaction *irq) | 56 | void __init plat_timer_setup(struct irqaction *irq) |
57 | { | 57 | { |
58 | u32 count; | ||
59 | u32 c1; | ||
60 | u32 c2; | ||
61 | |||
62 | setup_irq(TX4938_IRQ_CPU_TIMER, irq); | 58 | setup_irq(TX4938_IRQ_CPU_TIMER, irq); |
63 | |||
64 | c1 = read_c0_count(); | ||
65 | count = c1 + (mips_hpt_frequency / HZ); | ||
66 | write_c0_compare(count); | ||
67 | c2 = read_c0_count(); | ||
68 | } | 59 | } |
diff --git a/drivers/acorn/char/Makefile b/drivers/acorn/char/Makefile index 2fa9a8bf48a0..d006c9f168d2 100644 --- a/drivers/acorn/char/Makefile +++ b/drivers/acorn/char/Makefile | |||
@@ -2,5 +2,4 @@ | |||
2 | # Makefile for the acorn character device drivers. | 2 | # Makefile for the acorn character device drivers. |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-$(CONFIG_ARCH_ACORN) += i2c.o pcf8583.o | ||
6 | obj-$(CONFIG_L7200_KEYB) += defkeymap-l7200.o keyb_l7200.o | 5 | obj-$(CONFIG_L7200_KEYB) += defkeymap-l7200.o keyb_l7200.o |
diff --git a/drivers/acorn/char/i2c.c b/drivers/acorn/char/i2c.c deleted file mode 100644 index d276fd14d63a..000000000000 --- a/drivers/acorn/char/i2c.c +++ /dev/null | |||
@@ -1,368 +0,0 @@ | |||
1 | /* | ||
2 | * linux/drivers/acorn/char/i2c.c | ||
3 | * | ||
4 | * Copyright (C) 2000 Russell King | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * ARM IOC/IOMD i2c driver. | ||
11 | * | ||
12 | * On Acorn machines, the following i2c devices are on the bus: | ||
13 | * - PCF8583 real time clock & static RAM | ||
14 | */ | ||
15 | #include <linux/capability.h> | ||
16 | #include <linux/init.h> | ||
17 | #include <linux/time.h> | ||
18 | #include <linux/miscdevice.h> | ||
19 | #include <linux/rtc.h> | ||
20 | #include <linux/i2c.h> | ||
21 | #include <linux/i2c-algo-bit.h> | ||
22 | #include <linux/fs.h> | ||
23 | |||
24 | #include <asm/hardware.h> | ||
25 | #include <asm/io.h> | ||
26 | #include <asm/hardware/ioc.h> | ||
27 | #include <asm/system.h> | ||
28 | #include <asm/uaccess.h> | ||
29 | |||
30 | #include "pcf8583.h" | ||
31 | |||
32 | extern int (*set_rtc)(void); | ||
33 | |||
34 | static struct i2c_client *rtc_client; | ||
35 | static const unsigned char days_in_mon[] = | ||
36 | { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; | ||
37 | |||
38 | #define CMOS_CHECKSUM (63) | ||
39 | |||
40 | /* | ||
41 | * Acorn machines store the year in the static RAM at | ||
42 | * location 128. | ||
43 | */ | ||
44 | #define CMOS_YEAR (64 + 128) | ||
45 | |||
46 | static inline int rtc_command(int cmd, void *data) | ||
47 | { | ||
48 | int ret = -EIO; | ||
49 | |||
50 | if (rtc_client) | ||
51 | ret = rtc_client->driver->command(rtc_client, cmd, data); | ||
52 | |||
53 | return ret; | ||
54 | } | ||
55 | |||
56 | /* | ||
57 | * Update the century + year bytes in the CMOS RAM, ensuring | ||
58 | * that the check byte is correctly adjusted for the change. | ||
59 | */ | ||
60 | static int rtc_update_year(unsigned int new_year) | ||
61 | { | ||
62 | unsigned char yr[2], chk; | ||
63 | struct mem cmos_year = { CMOS_YEAR, sizeof(yr), yr }; | ||
64 | struct mem cmos_check = { CMOS_CHECKSUM, 1, &chk }; | ||
65 | int ret; | ||
66 | |||
67 | ret = rtc_command(MEM_READ, &cmos_check); | ||
68 | if (ret) | ||
69 | goto out; | ||
70 | ret = rtc_command(MEM_READ, &cmos_year); | ||
71 | if (ret) | ||
72 | goto out; | ||
73 | |||
74 | chk -= yr[1] + yr[0]; | ||
75 | |||
76 | yr[1] = new_year / 100; | ||
77 | yr[0] = new_year % 100; | ||
78 | |||
79 | chk += yr[1] + yr[0]; | ||
80 | |||
81 | ret = rtc_command(MEM_WRITE, &cmos_year); | ||
82 | if (ret == 0) | ||
83 | ret = rtc_command(MEM_WRITE, &cmos_check); | ||
84 | out: | ||
85 | return ret; | ||
86 | } | ||
87 | |||
88 | /* | ||
89 | * Read the current RTC time and date, and update xtime. | ||
90 | */ | ||
91 | static void get_rtc_time(struct rtc_tm *rtctm, unsigned int *year) | ||
92 | { | ||
93 | unsigned char ctrl, yr[2]; | ||
94 | struct mem rtcmem = { CMOS_YEAR, sizeof(yr), yr }; | ||
95 | int real_year, year_offset; | ||
96 | |||
97 | /* | ||
98 | * Ensure that the RTC is running. | ||
99 | */ | ||
100 | rtc_command(RTC_GETCTRL, &ctrl); | ||
101 | if (ctrl & 0xc0) { | ||
102 | unsigned char new_ctrl = ctrl & ~0xc0; | ||
103 | |||
104 | printk(KERN_WARNING "RTC: resetting control %02x -> %02x\n", | ||
105 | ctrl, new_ctrl); | ||
106 | |||
107 | rtc_command(RTC_SETCTRL, &new_ctrl); | ||
108 | } | ||
109 | |||
110 | if (rtc_command(RTC_GETDATETIME, rtctm) || | ||
111 | rtc_command(MEM_READ, &rtcmem)) | ||
112 | return; | ||
113 | |||
114 | real_year = yr[0]; | ||
115 | |||
116 | /* | ||
117 | * The RTC year holds the LSB two bits of the current | ||
118 | * year, which should reflect the LSB two bits of the | ||
119 | * CMOS copy of the year. Any difference indicates | ||
120 | * that we have to correct the CMOS version. | ||
121 | */ | ||
122 | year_offset = rtctm->year_off - (real_year & 3); | ||
123 | if (year_offset < 0) | ||
124 | /* | ||
125 | * RTC year wrapped. Adjust it appropriately. | ||
126 | */ | ||
127 | year_offset += 4; | ||
128 | |||
129 | *year = real_year + year_offset + yr[1] * 100; | ||
130 | } | ||
131 | |||
132 | static int set_rtc_time(struct rtc_tm *rtctm, unsigned int year) | ||
133 | { | ||
134 | unsigned char leap; | ||
135 | int ret; | ||
136 | |||
137 | leap = (!(year % 4) && (year % 100)) || !(year % 400); | ||
138 | |||
139 | if (rtctm->mon > 12 || rtctm->mon == 0 || rtctm->mday == 0) | ||
140 | return -EINVAL; | ||
141 | |||
142 | if (rtctm->mday > (days_in_mon[rtctm->mon] + (rtctm->mon == 2 && leap))) | ||
143 | return -EINVAL; | ||
144 | |||
145 | if (rtctm->hours >= 24 || rtctm->mins >= 60 || rtctm->secs >= 60) | ||
146 | return -EINVAL; | ||
147 | |||
148 | /* | ||
149 | * The RTC's own 2-bit year must reflect the least | ||
150 | * significant two bits of the CMOS year. | ||
151 | */ | ||
152 | rtctm->year_off = (year % 100) & 3; | ||
153 | |||
154 | ret = rtc_command(RTC_SETDATETIME, rtctm); | ||
155 | if (ret == 0) | ||
156 | ret = rtc_update_year(year); | ||
157 | |||
158 | return ret; | ||
159 | } | ||
160 | |||
161 | /* | ||
162 | * Set the RTC time only. Note that | ||
163 | * we do not touch the date. | ||
164 | */ | ||
165 | static int k_set_rtc_time(void) | ||
166 | { | ||
167 | struct rtc_tm new_rtctm, old_rtctm; | ||
168 | unsigned long nowtime = xtime.tv_sec; | ||
169 | |||
170 | if (rtc_command(RTC_GETDATETIME, &old_rtctm)) | ||
171 | return 0; | ||
172 | |||
173 | new_rtctm.cs = xtime.tv_nsec / 10000000; | ||
174 | new_rtctm.secs = nowtime % 60; nowtime /= 60; | ||
175 | new_rtctm.mins = nowtime % 60; nowtime /= 60; | ||
176 | new_rtctm.hours = nowtime % 24; | ||
177 | |||
178 | /* | ||
179 | * avoid writing when we're going to change the day | ||
180 | * of the month. We will retry in the next minute. | ||
181 | * This basically means that if the RTC must not drift | ||
182 | * by more than 1 minute in 11 minutes. | ||
183 | * | ||
184 | * [ rtc: 1/1/2000 23:58:00, real 2/1/2000 00:01:00, | ||
185 | * rtc gets set to 1/1/2000 00:01:00 ] | ||
186 | */ | ||
187 | if ((old_rtctm.hours == 23 && old_rtctm.mins == 59) || | ||
188 | (new_rtctm.hours == 23 && new_rtctm.mins == 59)) | ||
189 | return 1; | ||
190 | |||
191 | return rtc_command(RTC_SETTIME, &new_rtctm); | ||
192 | } | ||
193 | |||
194 | static int rtc_ioctl(struct inode *inode, struct file *file, | ||
195 | unsigned int cmd, unsigned long arg) | ||
196 | { | ||
197 | unsigned int year; | ||
198 | struct rtc_time rtctm; | ||
199 | struct rtc_tm rtc_raw; | ||
200 | |||
201 | switch (cmd) { | ||
202 | case RTC_ALM_READ: | ||
203 | case RTC_ALM_SET: | ||
204 | break; | ||
205 | |||
206 | case RTC_RD_TIME: | ||
207 | memset(&rtctm, 0, sizeof(struct rtc_time)); | ||
208 | get_rtc_time(&rtc_raw, &year); | ||
209 | rtctm.tm_sec = rtc_raw.secs; | ||
210 | rtctm.tm_min = rtc_raw.mins; | ||
211 | rtctm.tm_hour = rtc_raw.hours; | ||
212 | rtctm.tm_mday = rtc_raw.mday; | ||
213 | rtctm.tm_mon = rtc_raw.mon - 1; /* month starts at 0 */ | ||
214 | rtctm.tm_year = year - 1900; /* starts at 1900 */ | ||
215 | return copy_to_user((void *)arg, &rtctm, sizeof(rtctm)) | ||
216 | ? -EFAULT : 0; | ||
217 | |||
218 | case RTC_SET_TIME: | ||
219 | if (!capable(CAP_SYS_TIME)) | ||
220 | return -EACCES; | ||
221 | |||
222 | if (copy_from_user(&rtctm, (void *)arg, sizeof(rtctm))) | ||
223 | return -EFAULT; | ||
224 | rtc_raw.secs = rtctm.tm_sec; | ||
225 | rtc_raw.mins = rtctm.tm_min; | ||
226 | rtc_raw.hours = rtctm.tm_hour; | ||
227 | rtc_raw.mday = rtctm.tm_mday; | ||
228 | rtc_raw.mon = rtctm.tm_mon + 1; | ||
229 | year = rtctm.tm_year + 1900; | ||
230 | return set_rtc_time(&rtc_raw, year); | ||
231 | break; | ||
232 | |||
233 | case RTC_EPOCH_READ: | ||
234 | return put_user(1900, (unsigned long *)arg); | ||
235 | |||
236 | } | ||
237 | return -EINVAL; | ||
238 | } | ||
239 | |||
240 | static const struct file_operations rtc_fops = { | ||
241 | .ioctl = rtc_ioctl, | ||
242 | }; | ||
243 | |||
244 | static struct miscdevice rtc_dev = { | ||
245 | .minor = RTC_MINOR, | ||
246 | .name = "rtc", | ||
247 | .fops = &rtc_fops, | ||
248 | }; | ||
249 | |||
250 | /* IOC / IOMD i2c driver */ | ||
251 | |||
252 | #define FORCE_ONES 0xdc | ||
253 | #define SCL 0x02 | ||
254 | #define SDA 0x01 | ||
255 | |||
256 | /* | ||
257 | * We must preserve all non-i2c output bits in IOC_CONTROL. | ||
258 | * Note also that we need to preserve the value of SCL and | ||
259 | * SDA outputs as well (which may be different from the | ||
260 | * values read back from IOC_CONTROL). | ||
261 | */ | ||
262 | static u_int force_ones; | ||
263 | |||
264 | static void ioc_setscl(void *data, int state) | ||
265 | { | ||
266 | u_int ioc_control = ioc_readb(IOC_CONTROL) & ~(SCL | SDA); | ||
267 | u_int ones = force_ones; | ||
268 | |||
269 | if (state) | ||
270 | ones |= SCL; | ||
271 | else | ||
272 | ones &= ~SCL; | ||
273 | |||
274 | force_ones = ones; | ||
275 | |||
276 | ioc_writeb(ioc_control | ones, IOC_CONTROL); | ||
277 | } | ||
278 | |||
279 | static void ioc_setsda(void *data, int state) | ||
280 | { | ||
281 | u_int ioc_control = ioc_readb(IOC_CONTROL) & ~(SCL | SDA); | ||
282 | u_int ones = force_ones; | ||
283 | |||
284 | if (state) | ||
285 | ones |= SDA; | ||
286 | else | ||
287 | ones &= ~SDA; | ||
288 | |||
289 | force_ones = ones; | ||
290 | |||
291 | ioc_writeb(ioc_control | ones, IOC_CONTROL); | ||
292 | } | ||
293 | |||
294 | static int ioc_getscl(void *data) | ||
295 | { | ||
296 | return (ioc_readb(IOC_CONTROL) & SCL) != 0; | ||
297 | } | ||
298 | |||
299 | static int ioc_getsda(void *data) | ||
300 | { | ||
301 | return (ioc_readb(IOC_CONTROL) & SDA) != 0; | ||
302 | } | ||
303 | |||
304 | static struct i2c_algo_bit_data ioc_data = { | ||
305 | .setsda = ioc_setsda, | ||
306 | .setscl = ioc_setscl, | ||
307 | .getsda = ioc_getsda, | ||
308 | .getscl = ioc_getscl, | ||
309 | .udelay = 80, | ||
310 | .timeout = 100 | ||
311 | }; | ||
312 | |||
313 | static int ioc_client_reg(struct i2c_client *client) | ||
314 | { | ||
315 | if (client->driver->id == I2C_DRIVERID_PCF8583 && | ||
316 | client->addr == 0x50) { | ||
317 | struct rtc_tm rtctm; | ||
318 | unsigned int year; | ||
319 | struct timespec tv; | ||
320 | |||
321 | rtc_client = client; | ||
322 | get_rtc_time(&rtctm, &year); | ||
323 | |||
324 | tv.tv_nsec = rtctm.cs * 10000000; | ||
325 | tv.tv_sec = mktime(year, rtctm.mon, rtctm.mday, | ||
326 | rtctm.hours, rtctm.mins, rtctm.secs); | ||
327 | do_settimeofday(&tv); | ||
328 | set_rtc = k_set_rtc_time; | ||
329 | } | ||
330 | |||
331 | return 0; | ||
332 | } | ||
333 | |||
334 | static int ioc_client_unreg(struct i2c_client *client) | ||
335 | { | ||
336 | if (client == rtc_client) { | ||
337 | set_rtc = NULL; | ||
338 | rtc_client = NULL; | ||
339 | } | ||
340 | |||
341 | return 0; | ||
342 | } | ||
343 | |||
344 | static struct i2c_adapter ioc_ops = { | ||
345 | .id = I2C_HW_B_IOC, | ||
346 | .algo_data = &ioc_data, | ||
347 | .client_register = ioc_client_reg, | ||
348 | .client_unregister = ioc_client_unreg, | ||
349 | }; | ||
350 | |||
351 | static int __init i2c_ioc_init(void) | ||
352 | { | ||
353 | int ret; | ||
354 | |||
355 | force_ones = FORCE_ONES | SCL | SDA; | ||
356 | |||
357 | ret = i2c_bit_add_bus(&ioc_ops); | ||
358 | |||
359 | if (ret >= 0){ | ||
360 | ret = misc_register(&rtc_dev); | ||
361 | if(ret < 0) | ||
362 | i2c_del_adapter(&ioc_ops); | ||
363 | } | ||
364 | |||
365 | return ret; | ||
366 | } | ||
367 | |||
368 | __initcall(i2c_ioc_init); | ||
diff --git a/drivers/acorn/char/pcf8583.c b/drivers/acorn/char/pcf8583.c deleted file mode 100644 index 9b49f316ae92..000000000000 --- a/drivers/acorn/char/pcf8583.c +++ /dev/null | |||
@@ -1,284 +0,0 @@ | |||
1 | /* | ||
2 | * linux/drivers/acorn/char/pcf8583.c | ||
3 | * | ||
4 | * Copyright (C) 2000 Russell King | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * Driver for PCF8583 RTC & RAM chip | ||
11 | */ | ||
12 | #include <linux/module.h> | ||
13 | #include <linux/i2c.h> | ||
14 | #include <linux/slab.h> | ||
15 | #include <linux/string.h> | ||
16 | #include <linux/mc146818rtc.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/errno.h> | ||
19 | #include <linux/bcd.h> | ||
20 | |||
21 | #include "pcf8583.h" | ||
22 | |||
23 | static struct i2c_driver pcf8583_driver; | ||
24 | |||
25 | static unsigned short ignore[] = { I2C_CLIENT_END }; | ||
26 | static unsigned short normal_addr[] = { 0x50, I2C_CLIENT_END }; | ||
27 | static unsigned short *forces[] = { NULL }; | ||
28 | |||
29 | static struct i2c_client_address_data addr_data = { | ||
30 | .normal_i2c = normal_addr, | ||
31 | .probe = ignore, | ||
32 | .ignore = ignore, | ||
33 | .forces = forces, | ||
34 | }; | ||
35 | |||
36 | #define set_ctrl(x, v) i2c_set_clientdata(x, (void *)(unsigned int)(v)) | ||
37 | #define get_ctrl(x) ((unsigned int)i2c_get_clientdata(x)) | ||
38 | |||
39 | static int | ||
40 | pcf8583_attach(struct i2c_adapter *adap, int addr, int kind) | ||
41 | { | ||
42 | struct i2c_client *c; | ||
43 | unsigned char buf[1], ad[1] = { 0 }; | ||
44 | struct i2c_msg msgs[2] = { | ||
45 | { | ||
46 | .addr = addr, | ||
47 | .flags = 0, | ||
48 | .len = 1, | ||
49 | .buf = ad, | ||
50 | }, { | ||
51 | .addr = addr, | ||
52 | .flags = I2C_M_RD, | ||
53 | .len = 1, | ||
54 | .buf = buf, | ||
55 | } | ||
56 | }; | ||
57 | |||
58 | c = kmalloc(sizeof(*c), GFP_KERNEL); | ||
59 | if (!c) | ||
60 | return -ENOMEM; | ||
61 | |||
62 | memset(c, 0, sizeof(*c)); | ||
63 | c->addr = addr; | ||
64 | c->adapter = adap; | ||
65 | c->driver = &pcf8583_driver; | ||
66 | |||
67 | if (i2c_transfer(c->adapter, msgs, 2) == 2) | ||
68 | set_ctrl(c, buf[0]); | ||
69 | |||
70 | return i2c_attach_client(c); | ||
71 | } | ||
72 | |||
73 | static int | ||
74 | pcf8583_probe(struct i2c_adapter *adap) | ||
75 | { | ||
76 | return i2c_probe(adap, &addr_data, pcf8583_attach); | ||
77 | } | ||
78 | |||
79 | static int | ||
80 | pcf8583_detach(struct i2c_client *client) | ||
81 | { | ||
82 | i2c_detach_client(client); | ||
83 | kfree(client); | ||
84 | return 0; | ||
85 | } | ||
86 | |||
87 | static int | ||
88 | pcf8583_get_datetime(struct i2c_client *client, struct rtc_tm *dt) | ||
89 | { | ||
90 | unsigned char buf[8], addr[1] = { 1 }; | ||
91 | struct i2c_msg msgs[2] = { | ||
92 | { | ||
93 | .addr = client->addr, | ||
94 | .flags = 0, | ||
95 | .len = 1, | ||
96 | .buf = addr, | ||
97 | }, { | ||
98 | .addr = client->addr, | ||
99 | .flags = I2C_M_RD, | ||
100 | .len = 6, | ||
101 | .buf = buf, | ||
102 | } | ||
103 | }; | ||
104 | int ret = -EIO; | ||
105 | |||
106 | memset(buf, 0, sizeof(buf)); | ||
107 | |||
108 | ret = i2c_transfer(client->adapter, msgs, 2); | ||
109 | if (ret == 2) { | ||
110 | dt->year_off = buf[4] >> 6; | ||
111 | dt->wday = buf[5] >> 5; | ||
112 | |||
113 | buf[4] &= 0x3f; | ||
114 | buf[5] &= 0x1f; | ||
115 | |||
116 | dt->cs = BCD_TO_BIN(buf[0]); | ||
117 | dt->secs = BCD_TO_BIN(buf[1]); | ||
118 | dt->mins = BCD_TO_BIN(buf[2]); | ||
119 | dt->hours = BCD_TO_BIN(buf[3]); | ||
120 | dt->mday = BCD_TO_BIN(buf[4]); | ||
121 | dt->mon = BCD_TO_BIN(buf[5]); | ||
122 | |||
123 | ret = 0; | ||
124 | } | ||
125 | |||
126 | return ret; | ||
127 | } | ||
128 | |||
129 | static int | ||
130 | pcf8583_set_datetime(struct i2c_client *client, struct rtc_tm *dt, int datetoo) | ||
131 | { | ||
132 | unsigned char buf[8]; | ||
133 | int ret, len = 6; | ||
134 | |||
135 | buf[0] = 0; | ||
136 | buf[1] = get_ctrl(client) | 0x80; | ||
137 | buf[2] = BIN_TO_BCD(dt->cs); | ||
138 | buf[3] = BIN_TO_BCD(dt->secs); | ||
139 | buf[4] = BIN_TO_BCD(dt->mins); | ||
140 | buf[5] = BIN_TO_BCD(dt->hours); | ||
141 | |||
142 | if (datetoo) { | ||
143 | len = 8; | ||
144 | buf[6] = BIN_TO_BCD(dt->mday) | (dt->year_off << 6); | ||
145 | buf[7] = BIN_TO_BCD(dt->mon) | (dt->wday << 5); | ||
146 | } | ||
147 | |||
148 | ret = i2c_master_send(client, (char *)buf, len); | ||
149 | if (ret == len) | ||
150 | ret = 0; | ||
151 | |||
152 | buf[1] = get_ctrl(client); | ||
153 | i2c_master_send(client, (char *)buf, 2); | ||
154 | |||
155 | return ret; | ||
156 | } | ||
157 | |||
158 | static int | ||
159 | pcf8583_get_ctrl(struct i2c_client *client, unsigned char *ctrl) | ||
160 | { | ||
161 | *ctrl = get_ctrl(client); | ||
162 | return 0; | ||
163 | } | ||
164 | |||
165 | static int | ||
166 | pcf8583_set_ctrl(struct i2c_client *client, unsigned char *ctrl) | ||
167 | { | ||
168 | unsigned char buf[2]; | ||
169 | |||
170 | buf[0] = 0; | ||
171 | buf[1] = *ctrl; | ||
172 | set_ctrl(client, *ctrl); | ||
173 | |||
174 | return i2c_master_send(client, (char *)buf, 2); | ||
175 | } | ||
176 | |||
177 | static int | ||
178 | pcf8583_read_mem(struct i2c_client *client, struct mem *mem) | ||
179 | { | ||
180 | unsigned char addr[1]; | ||
181 | struct i2c_msg msgs[2] = { | ||
182 | { | ||
183 | .addr = client->addr, | ||
184 | .flags = 0, | ||
185 | .len = 1, | ||
186 | .buf = addr, | ||
187 | }, { | ||
188 | .addr = client->addr, | ||
189 | .flags = I2C_M_RD, | ||
190 | .len = mem->nr, | ||
191 | .buf = mem->data, | ||
192 | } | ||
193 | }; | ||
194 | |||
195 | if (mem->loc < 8) | ||
196 | return -EINVAL; | ||
197 | |||
198 | addr[0] = mem->loc; | ||
199 | |||
200 | return i2c_transfer(client->adapter, msgs, 2) == 2 ? 0 : -EIO; | ||
201 | } | ||
202 | |||
203 | static int | ||
204 | pcf8583_write_mem(struct i2c_client *client, struct mem *mem) | ||
205 | { | ||
206 | unsigned char addr[1]; | ||
207 | struct i2c_msg msgs[2] = { | ||
208 | { | ||
209 | .addr = client->addr, | ||
210 | .flags = 0, | ||
211 | .len = 1, | ||
212 | .buf = addr, | ||
213 | }, { | ||
214 | .addr = client->addr, | ||
215 | .flags = I2C_M_NOSTART, | ||
216 | .len = mem->nr, | ||
217 | .buf = mem->data, | ||
218 | } | ||
219 | }; | ||
220 | |||
221 | if (mem->loc < 8) | ||
222 | return -EINVAL; | ||
223 | |||
224 | addr[0] = mem->loc; | ||
225 | |||
226 | return i2c_transfer(client->adapter, msgs, 2) == 2 ? 0 : -EIO; | ||
227 | } | ||
228 | |||
229 | static int | ||
230 | pcf8583_command(struct i2c_client *client, unsigned int cmd, void *arg) | ||
231 | { | ||
232 | switch (cmd) { | ||
233 | case RTC_GETDATETIME: | ||
234 | return pcf8583_get_datetime(client, arg); | ||
235 | |||
236 | case RTC_SETTIME: | ||
237 | return pcf8583_set_datetime(client, arg, 0); | ||
238 | |||
239 | case RTC_SETDATETIME: | ||
240 | return pcf8583_set_datetime(client, arg, 1); | ||
241 | |||
242 | case RTC_GETCTRL: | ||
243 | return pcf8583_get_ctrl(client, arg); | ||
244 | |||
245 | case RTC_SETCTRL: | ||
246 | return pcf8583_set_ctrl(client, arg); | ||
247 | |||
248 | case MEM_READ: | ||
249 | return pcf8583_read_mem(client, arg); | ||
250 | |||
251 | case MEM_WRITE: | ||
252 | return pcf8583_write_mem(client, arg); | ||
253 | |||
254 | default: | ||
255 | return -EINVAL; | ||
256 | } | ||
257 | } | ||
258 | |||
259 | static struct i2c_driver pcf8583_driver = { | ||
260 | .driver = { | ||
261 | .name = "PCF8583", | ||
262 | }, | ||
263 | .id = I2C_DRIVERID_PCF8583, | ||
264 | .attach_adapter = pcf8583_probe, | ||
265 | .detach_client = pcf8583_detach, | ||
266 | .command = pcf8583_command | ||
267 | }; | ||
268 | |||
269 | static __init int pcf8583_init(void) | ||
270 | { | ||
271 | return i2c_add_driver(&pcf8583_driver); | ||
272 | } | ||
273 | |||
274 | static __exit void pcf8583_exit(void) | ||
275 | { | ||
276 | i2c_del_driver(&pcf8583_driver); | ||
277 | } | ||
278 | |||
279 | module_init(pcf8583_init); | ||
280 | module_exit(pcf8583_exit); | ||
281 | |||
282 | MODULE_AUTHOR("Russell King"); | ||
283 | MODULE_DESCRIPTION("PCF8583 I2C RTC driver"); | ||
284 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/acorn/char/pcf8583.h b/drivers/acorn/char/pcf8583.h deleted file mode 100644 index 847f7fdb8763..000000000000 --- a/drivers/acorn/char/pcf8583.h +++ /dev/null | |||
@@ -1,41 +0,0 @@ | |||
1 | /* | ||
2 | * linux/drivers/acorn/char/pcf8583.h | ||
3 | * | ||
4 | * Copyright (C) 2000 Russell King | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | struct rtc_tm { | ||
11 | unsigned char cs; | ||
12 | unsigned char secs; | ||
13 | unsigned char mins; | ||
14 | unsigned char hours; | ||
15 | unsigned char mday; | ||
16 | unsigned char mon; | ||
17 | unsigned char year_off; | ||
18 | unsigned char wday; | ||
19 | }; | ||
20 | |||
21 | struct mem { | ||
22 | unsigned int loc; | ||
23 | unsigned int nr; | ||
24 | unsigned char *data; | ||
25 | }; | ||
26 | |||
27 | #define RTC_GETDATETIME 0 | ||
28 | #define RTC_SETTIME 1 | ||
29 | #define RTC_SETDATETIME 2 | ||
30 | #define RTC_GETCTRL 3 | ||
31 | #define RTC_SETCTRL 4 | ||
32 | #define MEM_READ 5 | ||
33 | #define MEM_WRITE 6 | ||
34 | |||
35 | #define CTRL_STOP 0x80 | ||
36 | #define CTRL_HOLD 0x40 | ||
37 | #define CTRL_32KHZ 0x00 | ||
38 | #define CTRL_MASK 0x08 | ||
39 | #define CTRL_ALARMEN 0x04 | ||
40 | #define CTRL_ALARM 0x02 | ||
41 | #define CTRL_TIMER 0x01 | ||
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index 4d44a2db29dd..fb19dbb31e42 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig | |||
@@ -495,6 +495,16 @@ config I2C_VERSATILE | |||
495 | This driver can also be built as a module. If so, the module | 495 | This driver can also be built as a module. If so, the module |
496 | will be called i2c-versatile. | 496 | will be called i2c-versatile. |
497 | 497 | ||
498 | config I2C_ACORN | ||
499 | bool "Acorn IOC/IOMD I2C bus support" | ||
500 | depends on I2C && ARCH_ACORN | ||
501 | default y | ||
502 | select I2C_ALGOBIT | ||
503 | help | ||
504 | Say yes if you want to support the I2C bus on Acorn platforms. | ||
505 | |||
506 | If you don't know, say Y. | ||
507 | |||
498 | config I2C_VIA | 508 | config I2C_VIA |
499 | tristate "VIA 82C586B" | 509 | tristate "VIA 82C586B" |
500 | depends on I2C && PCI && EXPERIMENTAL | 510 | depends on I2C && PCI && EXPERIMENTAL |
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile index 03505aa44bbf..290b54018354 100644 --- a/drivers/i2c/busses/Makefile +++ b/drivers/i2c/busses/Makefile | |||
@@ -42,6 +42,7 @@ obj-$(CONFIG_I2C_SIS630) += i2c-sis630.o | |||
42 | obj-$(CONFIG_I2C_SIS96X) += i2c-sis96x.o | 42 | obj-$(CONFIG_I2C_SIS96X) += i2c-sis96x.o |
43 | obj-$(CONFIG_I2C_STUB) += i2c-stub.o | 43 | obj-$(CONFIG_I2C_STUB) += i2c-stub.o |
44 | obj-$(CONFIG_I2C_VERSATILE) += i2c-versatile.o | 44 | obj-$(CONFIG_I2C_VERSATILE) += i2c-versatile.o |
45 | obj-$(CONFIG_I2C_ACORN) += i2c-acorn.o | ||
45 | obj-$(CONFIG_I2C_VIA) += i2c-via.o | 46 | obj-$(CONFIG_I2C_VIA) += i2c-via.o |
46 | obj-$(CONFIG_I2C_VIAPRO) += i2c-viapro.o | 47 | obj-$(CONFIG_I2C_VIAPRO) += i2c-viapro.o |
47 | obj-$(CONFIG_I2C_VOODOO3) += i2c-voodoo3.o | 48 | obj-$(CONFIG_I2C_VOODOO3) += i2c-voodoo3.o |
diff --git a/drivers/i2c/busses/i2c-acorn.c b/drivers/i2c/busses/i2c-acorn.c new file mode 100644 index 000000000000..09bd7f40b90c --- /dev/null +++ b/drivers/i2c/busses/i2c-acorn.c | |||
@@ -0,0 +1,97 @@ | |||
1 | /* | ||
2 | * linux/drivers/acorn/char/i2c.c | ||
3 | * | ||
4 | * Copyright (C) 2000 Russell King | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * ARM IOC/IOMD i2c driver. | ||
11 | * | ||
12 | * On Acorn machines, the following i2c devices are on the bus: | ||
13 | * - PCF8583 real time clock & static RAM | ||
14 | */ | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/i2c.h> | ||
17 | #include <linux/i2c-algo-bit.h> | ||
18 | |||
19 | #include <asm/hardware.h> | ||
20 | #include <asm/io.h> | ||
21 | #include <asm/hardware/ioc.h> | ||
22 | #include <asm/system.h> | ||
23 | |||
24 | #define FORCE_ONES 0xdc | ||
25 | #define SCL 0x02 | ||
26 | #define SDA 0x01 | ||
27 | |||
28 | /* | ||
29 | * We must preserve all non-i2c output bits in IOC_CONTROL. | ||
30 | * Note also that we need to preserve the value of SCL and | ||
31 | * SDA outputs as well (which may be different from the | ||
32 | * values read back from IOC_CONTROL). | ||
33 | */ | ||
34 | static u_int force_ones; | ||
35 | |||
36 | static void ioc_setscl(void *data, int state) | ||
37 | { | ||
38 | u_int ioc_control = ioc_readb(IOC_CONTROL) & ~(SCL | SDA); | ||
39 | u_int ones = force_ones; | ||
40 | |||
41 | if (state) | ||
42 | ones |= SCL; | ||
43 | else | ||
44 | ones &= ~SCL; | ||
45 | |||
46 | force_ones = ones; | ||
47 | |||
48 | ioc_writeb(ioc_control | ones, IOC_CONTROL); | ||
49 | } | ||
50 | |||
51 | static void ioc_setsda(void *data, int state) | ||
52 | { | ||
53 | u_int ioc_control = ioc_readb(IOC_CONTROL) & ~(SCL | SDA); | ||
54 | u_int ones = force_ones; | ||
55 | |||
56 | if (state) | ||
57 | ones |= SDA; | ||
58 | else | ||
59 | ones &= ~SDA; | ||
60 | |||
61 | force_ones = ones; | ||
62 | |||
63 | ioc_writeb(ioc_control | ones, IOC_CONTROL); | ||
64 | } | ||
65 | |||
66 | static int ioc_getscl(void *data) | ||
67 | { | ||
68 | return (ioc_readb(IOC_CONTROL) & SCL) != 0; | ||
69 | } | ||
70 | |||
71 | static int ioc_getsda(void *data) | ||
72 | { | ||
73 | return (ioc_readb(IOC_CONTROL) & SDA) != 0; | ||
74 | } | ||
75 | |||
76 | static struct i2c_algo_bit_data ioc_data = { | ||
77 | .setsda = ioc_setsda, | ||
78 | .setscl = ioc_setscl, | ||
79 | .getsda = ioc_getsda, | ||
80 | .getscl = ioc_getscl, | ||
81 | .udelay = 80, | ||
82 | .timeout = 100 | ||
83 | }; | ||
84 | |||
85 | static struct i2c_adapter ioc_ops = { | ||
86 | .id = I2C_HW_B_IOC, | ||
87 | .algo_data = &ioc_data, | ||
88 | }; | ||
89 | |||
90 | static int __init i2c_ioc_init(void) | ||
91 | { | ||
92 | force_ones = FORCE_ONES | SCL | SDA; | ||
93 | |||
94 | return i2c_bit_add_bus(&ioc_ops); | ||
95 | } | ||
96 | |||
97 | __initcall(i2c_ioc_init); | ||
diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h index 04574a9d4430..0d122bf889db 100644 --- a/drivers/kvm/kvm.h +++ b/drivers/kvm/kvm.h | |||
@@ -14,6 +14,7 @@ | |||
14 | 14 | ||
15 | #include "vmx.h" | 15 | #include "vmx.h" |
16 | #include <linux/kvm.h> | 16 | #include <linux/kvm.h> |
17 | #include <linux/kvm_para.h> | ||
17 | 18 | ||
18 | #define CR0_PE_MASK (1ULL << 0) | 19 | #define CR0_PE_MASK (1ULL << 0) |
19 | #define CR0_TS_MASK (1ULL << 3) | 20 | #define CR0_TS_MASK (1ULL << 3) |
@@ -237,6 +238,9 @@ struct kvm_vcpu { | |||
237 | unsigned long cr0; | 238 | unsigned long cr0; |
238 | unsigned long cr2; | 239 | unsigned long cr2; |
239 | unsigned long cr3; | 240 | unsigned long cr3; |
241 | gpa_t para_state_gpa; | ||
242 | struct page *para_state_page; | ||
243 | gpa_t hypercall_gpa; | ||
240 | unsigned long cr4; | 244 | unsigned long cr4; |
241 | unsigned long cr8; | 245 | unsigned long cr8; |
242 | u64 pdptrs[4]; /* pae */ | 246 | u64 pdptrs[4]; /* pae */ |
@@ -305,6 +309,7 @@ struct kvm { | |||
305 | int busy; | 309 | int busy; |
306 | unsigned long rmap_overflow; | 310 | unsigned long rmap_overflow; |
307 | struct list_head vm_list; | 311 | struct list_head vm_list; |
312 | struct file *filp; | ||
308 | }; | 313 | }; |
309 | 314 | ||
310 | struct kvm_stat { | 315 | struct kvm_stat { |
@@ -339,7 +344,7 @@ struct kvm_arch_ops { | |||
339 | int (*vcpu_create)(struct kvm_vcpu *vcpu); | 344 | int (*vcpu_create)(struct kvm_vcpu *vcpu); |
340 | void (*vcpu_free)(struct kvm_vcpu *vcpu); | 345 | void (*vcpu_free)(struct kvm_vcpu *vcpu); |
341 | 346 | ||
342 | struct kvm_vcpu *(*vcpu_load)(struct kvm_vcpu *vcpu); | 347 | void (*vcpu_load)(struct kvm_vcpu *vcpu); |
343 | void (*vcpu_put)(struct kvm_vcpu *vcpu); | 348 | void (*vcpu_put)(struct kvm_vcpu *vcpu); |
344 | void (*vcpu_decache)(struct kvm_vcpu *vcpu); | 349 | void (*vcpu_decache)(struct kvm_vcpu *vcpu); |
345 | 350 | ||
@@ -382,6 +387,8 @@ struct kvm_arch_ops { | |||
382 | int (*run)(struct kvm_vcpu *vcpu, struct kvm_run *run); | 387 | int (*run)(struct kvm_vcpu *vcpu, struct kvm_run *run); |
383 | int (*vcpu_setup)(struct kvm_vcpu *vcpu); | 388 | int (*vcpu_setup)(struct kvm_vcpu *vcpu); |
384 | void (*skip_emulated_instruction)(struct kvm_vcpu *vcpu); | 389 | void (*skip_emulated_instruction)(struct kvm_vcpu *vcpu); |
390 | void (*patch_hypercall)(struct kvm_vcpu *vcpu, | ||
391 | unsigned char *hypercall_addr); | ||
385 | }; | 392 | }; |
386 | 393 | ||
387 | extern struct kvm_stat kvm_stat; | 394 | extern struct kvm_stat kvm_stat; |
@@ -476,6 +483,8 @@ void kvm_mmu_post_write(struct kvm_vcpu *vcpu, gpa_t gpa, int bytes); | |||
476 | int kvm_mmu_unprotect_page_virt(struct kvm_vcpu *vcpu, gva_t gva); | 483 | int kvm_mmu_unprotect_page_virt(struct kvm_vcpu *vcpu, gva_t gva); |
477 | void kvm_mmu_free_some_pages(struct kvm_vcpu *vcpu); | 484 | void kvm_mmu_free_some_pages(struct kvm_vcpu *vcpu); |
478 | 485 | ||
486 | int kvm_hypercall(struct kvm_vcpu *vcpu, struct kvm_run *run); | ||
487 | |||
479 | static inline int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t gva, | 488 | static inline int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t gva, |
480 | u32 error_code) | 489 | u32 error_code) |
481 | { | 490 | { |
@@ -523,7 +532,7 @@ static inline struct kvm_mmu_page *page_header(hpa_t shadow_page) | |||
523 | { | 532 | { |
524 | struct page *page = pfn_to_page(shadow_page >> PAGE_SHIFT); | 533 | struct page *page = pfn_to_page(shadow_page >> PAGE_SHIFT); |
525 | 534 | ||
526 | return (struct kvm_mmu_page *)page->private; | 535 | return (struct kvm_mmu_page *)page_private(page); |
527 | } | 536 | } |
528 | 537 | ||
529 | static inline u16 read_fs(void) | 538 | static inline u16 read_fs(void) |
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c index af866147ff25..a163bca38973 100644 --- a/drivers/kvm/kvm_main.c +++ b/drivers/kvm/kvm_main.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/kvm.h> | 20 | #include <linux/kvm.h> |
21 | #include <linux/module.h> | 21 | #include <linux/module.h> |
22 | #include <linux/errno.h> | 22 | #include <linux/errno.h> |
23 | #include <linux/magic.h> | ||
23 | #include <asm/processor.h> | 24 | #include <asm/processor.h> |
24 | #include <linux/percpu.h> | 25 | #include <linux/percpu.h> |
25 | #include <linux/gfp.h> | 26 | #include <linux/gfp.h> |
@@ -36,6 +37,9 @@ | |||
36 | #include <asm/desc.h> | 37 | #include <asm/desc.h> |
37 | #include <linux/sysdev.h> | 38 | #include <linux/sysdev.h> |
38 | #include <linux/cpu.h> | 39 | #include <linux/cpu.h> |
40 | #include <linux/file.h> | ||
41 | #include <linux/fs.h> | ||
42 | #include <linux/mount.h> | ||
39 | 43 | ||
40 | #include "x86_emulate.h" | 44 | #include "x86_emulate.h" |
41 | #include "segment_descriptor.h" | 45 | #include "segment_descriptor.h" |
@@ -72,6 +76,8 @@ static struct kvm_stats_debugfs_item { | |||
72 | 76 | ||
73 | static struct dentry *debugfs_dir; | 77 | static struct dentry *debugfs_dir; |
74 | 78 | ||
79 | struct vfsmount *kvmfs_mnt; | ||
80 | |||
75 | #define MAX_IO_MSRS 256 | 81 | #define MAX_IO_MSRS 256 |
76 | 82 | ||
77 | #define CR0_RESEVED_BITS 0xffffffff1ffaffc0ULL | 83 | #define CR0_RESEVED_BITS 0xffffffff1ffaffc0ULL |
@@ -90,6 +96,58 @@ struct segment_descriptor_64 { | |||
90 | 96 | ||
91 | #endif | 97 | #endif |
92 | 98 | ||
99 | static long kvm_vcpu_ioctl(struct file *file, unsigned int ioctl, | ||
100 | unsigned long arg); | ||
101 | |||
102 | static struct inode *kvmfs_inode(struct file_operations *fops) | ||
103 | { | ||
104 | int error = -ENOMEM; | ||
105 | struct inode *inode = new_inode(kvmfs_mnt->mnt_sb); | ||
106 | |||
107 | if (!inode) | ||
108 | goto eexit_1; | ||
109 | |||
110 | inode->i_fop = fops; | ||
111 | |||
112 | /* | ||
113 | * Mark the inode dirty from the very beginning, | ||
114 | * that way it will never be moved to the dirty | ||
115 | * list because mark_inode_dirty() will think | ||
116 | * that it already _is_ on the dirty list. | ||
117 | */ | ||
118 | inode->i_state = I_DIRTY; | ||
119 | inode->i_mode = S_IRUSR | S_IWUSR; | ||
120 | inode->i_uid = current->fsuid; | ||
121 | inode->i_gid = current->fsgid; | ||
122 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | ||
123 | return inode; | ||
124 | |||
125 | eexit_1: | ||
126 | return ERR_PTR(error); | ||
127 | } | ||
128 | |||
129 | static struct file *kvmfs_file(struct inode *inode, void *private_data) | ||
130 | { | ||
131 | struct file *file = get_empty_filp(); | ||
132 | |||
133 | if (!file) | ||
134 | return ERR_PTR(-ENFILE); | ||
135 | |||
136 | file->f_path.mnt = mntget(kvmfs_mnt); | ||
137 | file->f_path.dentry = d_alloc_anon(inode); | ||
138 | if (!file->f_path.dentry) | ||
139 | return ERR_PTR(-ENOMEM); | ||
140 | file->f_mapping = inode->i_mapping; | ||
141 | |||
142 | file->f_pos = 0; | ||
143 | file->f_flags = O_RDWR; | ||
144 | file->f_op = inode->i_fop; | ||
145 | file->f_mode = FMODE_READ | FMODE_WRITE; | ||
146 | file->f_version = 0; | ||
147 | file->private_data = private_data; | ||
148 | return file; | ||
149 | } | ||
150 | |||
93 | unsigned long segment_base(u16 selector) | 151 | unsigned long segment_base(u16 selector) |
94 | { | 152 | { |
95 | struct descriptor_table gdt; | 153 | struct descriptor_table gdt; |
@@ -126,10 +184,8 @@ static inline int valid_vcpu(int n) | |||
126 | return likely(n >= 0 && n < KVM_MAX_VCPUS); | 184 | return likely(n >= 0 && n < KVM_MAX_VCPUS); |
127 | } | 185 | } |
128 | 186 | ||
129 | int kvm_read_guest(struct kvm_vcpu *vcpu, | 187 | int kvm_read_guest(struct kvm_vcpu *vcpu, gva_t addr, unsigned long size, |
130 | gva_t addr, | 188 | void *dest) |
131 | unsigned long size, | ||
132 | void *dest) | ||
133 | { | 189 | { |
134 | unsigned char *host_buf = dest; | 190 | unsigned char *host_buf = dest; |
135 | unsigned long req_size = size; | 191 | unsigned long req_size = size; |
@@ -161,10 +217,8 @@ int kvm_read_guest(struct kvm_vcpu *vcpu, | |||
161 | } | 217 | } |
162 | EXPORT_SYMBOL_GPL(kvm_read_guest); | 218 | EXPORT_SYMBOL_GPL(kvm_read_guest); |
163 | 219 | ||
164 | int kvm_write_guest(struct kvm_vcpu *vcpu, | 220 | int kvm_write_guest(struct kvm_vcpu *vcpu, gva_t addr, unsigned long size, |
165 | gva_t addr, | 221 | void *data) |
166 | unsigned long size, | ||
167 | void *data) | ||
168 | { | 222 | { |
169 | unsigned char *host_buf = data; | 223 | unsigned char *host_buf = data; |
170 | unsigned long req_size = size; | 224 | unsigned long req_size = size; |
@@ -174,12 +228,15 @@ int kvm_write_guest(struct kvm_vcpu *vcpu, | |||
174 | unsigned now; | 228 | unsigned now; |
175 | unsigned offset; | 229 | unsigned offset; |
176 | hva_t guest_buf; | 230 | hva_t guest_buf; |
231 | gfn_t gfn; | ||
177 | 232 | ||
178 | paddr = gva_to_hpa(vcpu, addr); | 233 | paddr = gva_to_hpa(vcpu, addr); |
179 | 234 | ||
180 | if (is_error_hpa(paddr)) | 235 | if (is_error_hpa(paddr)) |
181 | break; | 236 | break; |
182 | 237 | ||
238 | gfn = vcpu->mmu.gva_to_gpa(vcpu, addr) >> PAGE_SHIFT; | ||
239 | mark_page_dirty(vcpu->kvm, gfn); | ||
183 | guest_buf = (hva_t)kmap_atomic( | 240 | guest_buf = (hva_t)kmap_atomic( |
184 | pfn_to_page(paddr >> PAGE_SHIFT), KM_USER0); | 241 | pfn_to_page(paddr >> PAGE_SHIFT), KM_USER0); |
185 | offset = addr & ~PAGE_MASK; | 242 | offset = addr & ~PAGE_MASK; |
@@ -195,24 +252,30 @@ int kvm_write_guest(struct kvm_vcpu *vcpu, | |||
195 | } | 252 | } |
196 | EXPORT_SYMBOL_GPL(kvm_write_guest); | 253 | EXPORT_SYMBOL_GPL(kvm_write_guest); |
197 | 254 | ||
198 | static int vcpu_slot(struct kvm_vcpu *vcpu) | 255 | /* |
256 | * Switches to specified vcpu, until a matching vcpu_put() | ||
257 | */ | ||
258 | static void vcpu_load(struct kvm_vcpu *vcpu) | ||
199 | { | 259 | { |
200 | return vcpu - vcpu->kvm->vcpus; | 260 | mutex_lock(&vcpu->mutex); |
261 | kvm_arch_ops->vcpu_load(vcpu); | ||
201 | } | 262 | } |
202 | 263 | ||
203 | /* | 264 | /* |
204 | * Switches to specified vcpu, until a matching vcpu_put() | 265 | * Switches to specified vcpu, until a matching vcpu_put(). Will return NULL |
266 | * if the slot is not populated. | ||
205 | */ | 267 | */ |
206 | static struct kvm_vcpu *vcpu_load(struct kvm *kvm, int vcpu_slot) | 268 | static struct kvm_vcpu *vcpu_load_slot(struct kvm *kvm, int slot) |
207 | { | 269 | { |
208 | struct kvm_vcpu *vcpu = &kvm->vcpus[vcpu_slot]; | 270 | struct kvm_vcpu *vcpu = &kvm->vcpus[slot]; |
209 | 271 | ||
210 | mutex_lock(&vcpu->mutex); | 272 | mutex_lock(&vcpu->mutex); |
211 | if (unlikely(!vcpu->vmcs)) { | 273 | if (!vcpu->vmcs) { |
212 | mutex_unlock(&vcpu->mutex); | 274 | mutex_unlock(&vcpu->mutex); |
213 | return NULL; | 275 | return NULL; |
214 | } | 276 | } |
215 | return kvm_arch_ops->vcpu_load(vcpu); | 277 | kvm_arch_ops->vcpu_load(vcpu); |
278 | return vcpu; | ||
216 | } | 279 | } |
217 | 280 | ||
218 | static void vcpu_put(struct kvm_vcpu *vcpu) | 281 | static void vcpu_put(struct kvm_vcpu *vcpu) |
@@ -221,13 +284,13 @@ static void vcpu_put(struct kvm_vcpu *vcpu) | |||
221 | mutex_unlock(&vcpu->mutex); | 284 | mutex_unlock(&vcpu->mutex); |
222 | } | 285 | } |
223 | 286 | ||
224 | static int kvm_dev_open(struct inode *inode, struct file *filp) | 287 | static struct kvm *kvm_create_vm(void) |
225 | { | 288 | { |
226 | struct kvm *kvm = kzalloc(sizeof(struct kvm), GFP_KERNEL); | 289 | struct kvm *kvm = kzalloc(sizeof(struct kvm), GFP_KERNEL); |
227 | int i; | 290 | int i; |
228 | 291 | ||
229 | if (!kvm) | 292 | if (!kvm) |
230 | return -ENOMEM; | 293 | return ERR_PTR(-ENOMEM); |
231 | 294 | ||
232 | spin_lock_init(&kvm->lock); | 295 | spin_lock_init(&kvm->lock); |
233 | INIT_LIST_HEAD(&kvm->active_mmu_pages); | 296 | INIT_LIST_HEAD(&kvm->active_mmu_pages); |
@@ -243,7 +306,11 @@ static int kvm_dev_open(struct inode *inode, struct file *filp) | |||
243 | list_add(&kvm->vm_list, &vm_list); | 306 | list_add(&kvm->vm_list, &vm_list); |
244 | spin_unlock(&kvm_lock); | 307 | spin_unlock(&kvm_lock); |
245 | } | 308 | } |
246 | filp->private_data = kvm; | 309 | return kvm; |
310 | } | ||
311 | |||
312 | static int kvm_dev_open(struct inode *inode, struct file *filp) | ||
313 | { | ||
247 | return 0; | 314 | return 0; |
248 | } | 315 | } |
249 | 316 | ||
@@ -281,9 +348,10 @@ static void kvm_free_physmem(struct kvm *kvm) | |||
281 | 348 | ||
282 | static void kvm_free_vcpu(struct kvm_vcpu *vcpu) | 349 | static void kvm_free_vcpu(struct kvm_vcpu *vcpu) |
283 | { | 350 | { |
284 | if (!vcpu_load(vcpu->kvm, vcpu_slot(vcpu))) | 351 | if (!vcpu->vmcs) |
285 | return; | 352 | return; |
286 | 353 | ||
354 | vcpu_load(vcpu); | ||
287 | kvm_mmu_destroy(vcpu); | 355 | kvm_mmu_destroy(vcpu); |
288 | vcpu_put(vcpu); | 356 | vcpu_put(vcpu); |
289 | kvm_arch_ops->vcpu_free(vcpu); | 357 | kvm_arch_ops->vcpu_free(vcpu); |
@@ -299,14 +367,24 @@ static void kvm_free_vcpus(struct kvm *kvm) | |||
299 | 367 | ||
300 | static int kvm_dev_release(struct inode *inode, struct file *filp) | 368 | static int kvm_dev_release(struct inode *inode, struct file *filp) |
301 | { | 369 | { |
302 | struct kvm *kvm = filp->private_data; | 370 | return 0; |
371 | } | ||
303 | 372 | ||
373 | static void kvm_destroy_vm(struct kvm *kvm) | ||
374 | { | ||
304 | spin_lock(&kvm_lock); | 375 | spin_lock(&kvm_lock); |
305 | list_del(&kvm->vm_list); | 376 | list_del(&kvm->vm_list); |
306 | spin_unlock(&kvm_lock); | 377 | spin_unlock(&kvm_lock); |
307 | kvm_free_vcpus(kvm); | 378 | kvm_free_vcpus(kvm); |
308 | kvm_free_physmem(kvm); | 379 | kvm_free_physmem(kvm); |
309 | kfree(kvm); | 380 | kfree(kvm); |
381 | } | ||
382 | |||
383 | static int kvm_vm_release(struct inode *inode, struct file *filp) | ||
384 | { | ||
385 | struct kvm *kvm = filp->private_data; | ||
386 | |||
387 | kvm_destroy_vm(kvm); | ||
310 | return 0; | 388 | return 0; |
311 | } | 389 | } |
312 | 390 | ||
@@ -457,7 +535,7 @@ EXPORT_SYMBOL_GPL(set_cr4); | |||
457 | void set_cr3(struct kvm_vcpu *vcpu, unsigned long cr3) | 535 | void set_cr3(struct kvm_vcpu *vcpu, unsigned long cr3) |
458 | { | 536 | { |
459 | if (is_long_mode(vcpu)) { | 537 | if (is_long_mode(vcpu)) { |
460 | if ( cr3 & CR3_L_MODE_RESEVED_BITS) { | 538 | if (cr3 & CR3_L_MODE_RESEVED_BITS) { |
461 | printk(KERN_DEBUG "set_cr3: #GP, reserved bits\n"); | 539 | printk(KERN_DEBUG "set_cr3: #GP, reserved bits\n"); |
462 | inject_gp(vcpu); | 540 | inject_gp(vcpu); |
463 | return; | 541 | return; |
@@ -533,55 +611,11 @@ void fx_init(struct kvm_vcpu *vcpu) | |||
533 | } | 611 | } |
534 | EXPORT_SYMBOL_GPL(fx_init); | 612 | EXPORT_SYMBOL_GPL(fx_init); |
535 | 613 | ||
536 | /* | 614 | static void do_remove_write_access(struct kvm_vcpu *vcpu, int slot) |
537 | * Creates some virtual cpus. Good luck creating more than one. | ||
538 | */ | ||
539 | static int kvm_dev_ioctl_create_vcpu(struct kvm *kvm, int n) | ||
540 | { | 615 | { |
541 | int r; | 616 | spin_lock(&vcpu->kvm->lock); |
542 | struct kvm_vcpu *vcpu; | 617 | kvm_mmu_slot_remove_write_access(vcpu, slot); |
543 | 618 | spin_unlock(&vcpu->kvm->lock); | |
544 | r = -EINVAL; | ||
545 | if (!valid_vcpu(n)) | ||
546 | goto out; | ||
547 | |||
548 | vcpu = &kvm->vcpus[n]; | ||
549 | |||
550 | mutex_lock(&vcpu->mutex); | ||
551 | |||
552 | if (vcpu->vmcs) { | ||
553 | mutex_unlock(&vcpu->mutex); | ||
554 | return -EEXIST; | ||
555 | } | ||
556 | |||
557 | vcpu->host_fx_image = (char*)ALIGN((hva_t)vcpu->fx_buf, | ||
558 | FX_IMAGE_ALIGN); | ||
559 | vcpu->guest_fx_image = vcpu->host_fx_image + FX_IMAGE_SIZE; | ||
560 | |||
561 | r = kvm_arch_ops->vcpu_create(vcpu); | ||
562 | if (r < 0) | ||
563 | goto out_free_vcpus; | ||
564 | |||
565 | r = kvm_mmu_create(vcpu); | ||
566 | if (r < 0) | ||
567 | goto out_free_vcpus; | ||
568 | |||
569 | kvm_arch_ops->vcpu_load(vcpu); | ||
570 | r = kvm_mmu_setup(vcpu); | ||
571 | if (r >= 0) | ||
572 | r = kvm_arch_ops->vcpu_setup(vcpu); | ||
573 | vcpu_put(vcpu); | ||
574 | |||
575 | if (r < 0) | ||
576 | goto out_free_vcpus; | ||
577 | |||
578 | return 0; | ||
579 | |||
580 | out_free_vcpus: | ||
581 | kvm_free_vcpu(vcpu); | ||
582 | mutex_unlock(&vcpu->mutex); | ||
583 | out: | ||
584 | return r; | ||
585 | } | 619 | } |
586 | 620 | ||
587 | /* | 621 | /* |
@@ -590,8 +624,8 @@ out: | |||
590 | * | 624 | * |
591 | * Discontiguous memory is allowed, mostly for framebuffers. | 625 | * Discontiguous memory is allowed, mostly for framebuffers. |
592 | */ | 626 | */ |
593 | static int kvm_dev_ioctl_set_memory_region(struct kvm *kvm, | 627 | static int kvm_vm_ioctl_set_memory_region(struct kvm *kvm, |
594 | struct kvm_memory_region *mem) | 628 | struct kvm_memory_region *mem) |
595 | { | 629 | { |
596 | int r; | 630 | int r; |
597 | gfn_t base_gfn; | 631 | gfn_t base_gfn; |
@@ -674,7 +708,7 @@ raced: | |||
674 | | __GFP_ZERO); | 708 | | __GFP_ZERO); |
675 | if (!new.phys_mem[i]) | 709 | if (!new.phys_mem[i]) |
676 | goto out_free; | 710 | goto out_free; |
677 | new.phys_mem[i]->private = 0; | 711 | set_page_private(new.phys_mem[i],0); |
678 | } | 712 | } |
679 | } | 713 | } |
680 | 714 | ||
@@ -711,9 +745,11 @@ raced: | |||
711 | for (i = 0; i < KVM_MAX_VCPUS; ++i) { | 745 | for (i = 0; i < KVM_MAX_VCPUS; ++i) { |
712 | struct kvm_vcpu *vcpu; | 746 | struct kvm_vcpu *vcpu; |
713 | 747 | ||
714 | vcpu = vcpu_load(kvm, i); | 748 | vcpu = vcpu_load_slot(kvm, i); |
715 | if (!vcpu) | 749 | if (!vcpu) |
716 | continue; | 750 | continue; |
751 | if (new.flags & KVM_MEM_LOG_DIRTY_PAGES) | ||
752 | do_remove_write_access(vcpu, mem->slot); | ||
717 | kvm_mmu_reset_context(vcpu); | 753 | kvm_mmu_reset_context(vcpu); |
718 | vcpu_put(vcpu); | 754 | vcpu_put(vcpu); |
719 | } | 755 | } |
@@ -729,18 +765,11 @@ out: | |||
729 | return r; | 765 | return r; |
730 | } | 766 | } |
731 | 767 | ||
732 | static void do_remove_write_access(struct kvm_vcpu *vcpu, int slot) | ||
733 | { | ||
734 | spin_lock(&vcpu->kvm->lock); | ||
735 | kvm_mmu_slot_remove_write_access(vcpu, slot); | ||
736 | spin_unlock(&vcpu->kvm->lock); | ||
737 | } | ||
738 | |||
739 | /* | 768 | /* |
740 | * Get (and clear) the dirty memory log for a memory slot. | 769 | * Get (and clear) the dirty memory log for a memory slot. |
741 | */ | 770 | */ |
742 | static int kvm_dev_ioctl_get_dirty_log(struct kvm *kvm, | 771 | static int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, |
743 | struct kvm_dirty_log *log) | 772 | struct kvm_dirty_log *log) |
744 | { | 773 | { |
745 | struct kvm_memory_slot *memslot; | 774 | struct kvm_memory_slot *memslot; |
746 | int r, i; | 775 | int r, i; |
@@ -765,21 +794,21 @@ static int kvm_dev_ioctl_get_dirty_log(struct kvm *kvm, | |||
765 | if (!memslot->dirty_bitmap) | 794 | if (!memslot->dirty_bitmap) |
766 | goto out; | 795 | goto out; |
767 | 796 | ||
768 | n = ALIGN(memslot->npages, 8) / 8; | 797 | n = ALIGN(memslot->npages, BITS_PER_LONG) / 8; |
769 | 798 | ||
770 | for (i = 0; !any && i < n; ++i) | 799 | for (i = 0; !any && i < n/sizeof(long); ++i) |
771 | any = memslot->dirty_bitmap[i]; | 800 | any = memslot->dirty_bitmap[i]; |
772 | 801 | ||
773 | r = -EFAULT; | 802 | r = -EFAULT; |
774 | if (copy_to_user(log->dirty_bitmap, memslot->dirty_bitmap, n)) | 803 | if (copy_to_user(log->dirty_bitmap, memslot->dirty_bitmap, n)) |
775 | goto out; | 804 | goto out; |
776 | 805 | ||
777 | |||
778 | if (any) { | 806 | if (any) { |
779 | cleared = 0; | 807 | cleared = 0; |
780 | for (i = 0; i < KVM_MAX_VCPUS; ++i) { | 808 | for (i = 0; i < KVM_MAX_VCPUS; ++i) { |
781 | struct kvm_vcpu *vcpu = vcpu_load(kvm, i); | 809 | struct kvm_vcpu *vcpu; |
782 | 810 | ||
811 | vcpu = vcpu_load_slot(kvm, i); | ||
783 | if (!vcpu) | 812 | if (!vcpu) |
784 | continue; | 813 | continue; |
785 | if (!cleared) { | 814 | if (!cleared) { |
@@ -903,8 +932,9 @@ static int emulator_read_emulated(unsigned long addr, | |||
903 | return X86EMUL_CONTINUE; | 932 | return X86EMUL_CONTINUE; |
904 | else { | 933 | else { |
905 | gpa_t gpa = vcpu->mmu.gva_to_gpa(vcpu, addr); | 934 | gpa_t gpa = vcpu->mmu.gva_to_gpa(vcpu, addr); |
935 | |||
906 | if (gpa == UNMAPPED_GVA) | 936 | if (gpa == UNMAPPED_GVA) |
907 | return vcpu_printf(vcpu, "not present\n"), X86EMUL_PROPAGATE_FAULT; | 937 | return X86EMUL_PROPAGATE_FAULT; |
908 | vcpu->mmio_needed = 1; | 938 | vcpu->mmio_needed = 1; |
909 | vcpu->mmio_phys_addr = gpa; | 939 | vcpu->mmio_phys_addr = gpa; |
910 | vcpu->mmio_size = bytes; | 940 | vcpu->mmio_size = bytes; |
@@ -928,6 +958,7 @@ static int emulator_write_phys(struct kvm_vcpu *vcpu, gpa_t gpa, | |||
928 | return 0; | 958 | return 0; |
929 | page = gfn_to_page(m, gpa >> PAGE_SHIFT); | 959 | page = gfn_to_page(m, gpa >> PAGE_SHIFT); |
930 | kvm_mmu_pre_write(vcpu, gpa, bytes); | 960 | kvm_mmu_pre_write(vcpu, gpa, bytes); |
961 | mark_page_dirty(vcpu->kvm, gpa >> PAGE_SHIFT); | ||
931 | virt = kmap_atomic(page, KM_USER0); | 962 | virt = kmap_atomic(page, KM_USER0); |
932 | memcpy(virt + offset_in_page(gpa), &val, bytes); | 963 | memcpy(virt + offset_in_page(gpa), &val, bytes); |
933 | kunmap_atomic(virt, KM_USER0); | 964 | kunmap_atomic(virt, KM_USER0); |
@@ -1142,6 +1173,42 @@ int emulate_instruction(struct kvm_vcpu *vcpu, | |||
1142 | } | 1173 | } |
1143 | EXPORT_SYMBOL_GPL(emulate_instruction); | 1174 | EXPORT_SYMBOL_GPL(emulate_instruction); |
1144 | 1175 | ||
1176 | int kvm_hypercall(struct kvm_vcpu *vcpu, struct kvm_run *run) | ||
1177 | { | ||
1178 | unsigned long nr, a0, a1, a2, a3, a4, a5, ret; | ||
1179 | |||
1180 | kvm_arch_ops->decache_regs(vcpu); | ||
1181 | ret = -KVM_EINVAL; | ||
1182 | #ifdef CONFIG_X86_64 | ||
1183 | if (is_long_mode(vcpu)) { | ||
1184 | nr = vcpu->regs[VCPU_REGS_RAX]; | ||
1185 | a0 = vcpu->regs[VCPU_REGS_RDI]; | ||
1186 | a1 = vcpu->regs[VCPU_REGS_RSI]; | ||
1187 | a2 = vcpu->regs[VCPU_REGS_RDX]; | ||
1188 | a3 = vcpu->regs[VCPU_REGS_RCX]; | ||
1189 | a4 = vcpu->regs[VCPU_REGS_R8]; | ||
1190 | a5 = vcpu->regs[VCPU_REGS_R9]; | ||
1191 | } else | ||
1192 | #endif | ||
1193 | { | ||
1194 | nr = vcpu->regs[VCPU_REGS_RBX] & -1u; | ||
1195 | a0 = vcpu->regs[VCPU_REGS_RAX] & -1u; | ||
1196 | a1 = vcpu->regs[VCPU_REGS_RCX] & -1u; | ||
1197 | a2 = vcpu->regs[VCPU_REGS_RDX] & -1u; | ||
1198 | a3 = vcpu->regs[VCPU_REGS_RSI] & -1u; | ||
1199 | a4 = vcpu->regs[VCPU_REGS_RDI] & -1u; | ||
1200 | a5 = vcpu->regs[VCPU_REGS_RBP] & -1u; | ||
1201 | } | ||
1202 | switch (nr) { | ||
1203 | default: | ||
1204 | ; | ||
1205 | } | ||
1206 | vcpu->regs[VCPU_REGS_RAX] = ret; | ||
1207 | kvm_arch_ops->cache_regs(vcpu); | ||
1208 | return 1; | ||
1209 | } | ||
1210 | EXPORT_SYMBOL_GPL(kvm_hypercall); | ||
1211 | |||
1145 | static u64 mk_cr_64(u64 curr_cr, u32 new_val) | 1212 | static u64 mk_cr_64(u64 curr_cr, u32 new_val) |
1146 | { | 1213 | { |
1147 | return (curr_cr & ~((1ULL << 32) - 1)) | new_val; | 1214 | return (curr_cr & ~((1ULL << 32) - 1)) | new_val; |
@@ -1208,6 +1275,75 @@ void realmode_set_cr(struct kvm_vcpu *vcpu, int cr, unsigned long val, | |||
1208 | } | 1275 | } |
1209 | } | 1276 | } |
1210 | 1277 | ||
1278 | /* | ||
1279 | * Register the para guest with the host: | ||
1280 | */ | ||
1281 | static int vcpu_register_para(struct kvm_vcpu *vcpu, gpa_t para_state_gpa) | ||
1282 | { | ||
1283 | struct kvm_vcpu_para_state *para_state; | ||
1284 | hpa_t para_state_hpa, hypercall_hpa; | ||
1285 | struct page *para_state_page; | ||
1286 | unsigned char *hypercall; | ||
1287 | gpa_t hypercall_gpa; | ||
1288 | |||
1289 | printk(KERN_DEBUG "kvm: guest trying to enter paravirtual mode\n"); | ||
1290 | printk(KERN_DEBUG ".... para_state_gpa: %08Lx\n", para_state_gpa); | ||
1291 | |||
1292 | /* | ||
1293 | * Needs to be page aligned: | ||
1294 | */ | ||
1295 | if (para_state_gpa != PAGE_ALIGN(para_state_gpa)) | ||
1296 | goto err_gp; | ||
1297 | |||
1298 | para_state_hpa = gpa_to_hpa(vcpu, para_state_gpa); | ||
1299 | printk(KERN_DEBUG ".... para_state_hpa: %08Lx\n", para_state_hpa); | ||
1300 | if (is_error_hpa(para_state_hpa)) | ||
1301 | goto err_gp; | ||
1302 | |||
1303 | mark_page_dirty(vcpu->kvm, para_state_gpa >> PAGE_SHIFT); | ||
1304 | para_state_page = pfn_to_page(para_state_hpa >> PAGE_SHIFT); | ||
1305 | para_state = kmap_atomic(para_state_page, KM_USER0); | ||
1306 | |||
1307 | printk(KERN_DEBUG ".... guest version: %d\n", para_state->guest_version); | ||
1308 | printk(KERN_DEBUG ".... size: %d\n", para_state->size); | ||
1309 | |||
1310 | para_state->host_version = KVM_PARA_API_VERSION; | ||
1311 | /* | ||
1312 | * We cannot support guests that try to register themselves | ||
1313 | * with a newer API version than the host supports: | ||
1314 | */ | ||
1315 | if (para_state->guest_version > KVM_PARA_API_VERSION) { | ||
1316 | para_state->ret = -KVM_EINVAL; | ||
1317 | goto err_kunmap_skip; | ||
1318 | } | ||
1319 | |||
1320 | hypercall_gpa = para_state->hypercall_gpa; | ||
1321 | hypercall_hpa = gpa_to_hpa(vcpu, hypercall_gpa); | ||
1322 | printk(KERN_DEBUG ".... hypercall_hpa: %08Lx\n", hypercall_hpa); | ||
1323 | if (is_error_hpa(hypercall_hpa)) { | ||
1324 | para_state->ret = -KVM_EINVAL; | ||
1325 | goto err_kunmap_skip; | ||
1326 | } | ||
1327 | |||
1328 | printk(KERN_DEBUG "kvm: para guest successfully registered.\n"); | ||
1329 | vcpu->para_state_page = para_state_page; | ||
1330 | vcpu->para_state_gpa = para_state_gpa; | ||
1331 | vcpu->hypercall_gpa = hypercall_gpa; | ||
1332 | |||
1333 | mark_page_dirty(vcpu->kvm, hypercall_gpa >> PAGE_SHIFT); | ||
1334 | hypercall = kmap_atomic(pfn_to_page(hypercall_hpa >> PAGE_SHIFT), | ||
1335 | KM_USER1) + (hypercall_hpa & ~PAGE_MASK); | ||
1336 | kvm_arch_ops->patch_hypercall(vcpu, hypercall); | ||
1337 | kunmap_atomic(hypercall, KM_USER1); | ||
1338 | |||
1339 | para_state->ret = 0; | ||
1340 | err_kunmap_skip: | ||
1341 | kunmap_atomic(para_state, KM_USER0); | ||
1342 | return 0; | ||
1343 | err_gp: | ||
1344 | return 1; | ||
1345 | } | ||
1346 | |||
1211 | int kvm_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata) | 1347 | int kvm_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata) |
1212 | { | 1348 | { |
1213 | u64 data; | 1349 | u64 data; |
@@ -1316,6 +1452,12 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data) | |||
1316 | case MSR_IA32_MISC_ENABLE: | 1452 | case MSR_IA32_MISC_ENABLE: |
1317 | vcpu->ia32_misc_enable_msr = data; | 1453 | vcpu->ia32_misc_enable_msr = data; |
1318 | break; | 1454 | break; |
1455 | /* | ||
1456 | * This is the 'probe whether the host is KVM' logic: | ||
1457 | */ | ||
1458 | case MSR_KVM_API_MAGIC: | ||
1459 | return vcpu_register_para(vcpu, data); | ||
1460 | |||
1319 | default: | 1461 | default: |
1320 | printk(KERN_ERR "kvm: unhandled wrmsr: 0x%x\n", msr); | 1462 | printk(KERN_ERR "kvm: unhandled wrmsr: 0x%x\n", msr); |
1321 | return 1; | 1463 | return 1; |
@@ -1338,8 +1480,7 @@ void kvm_resched(struct kvm_vcpu *vcpu) | |||
1338 | { | 1480 | { |
1339 | vcpu_put(vcpu); | 1481 | vcpu_put(vcpu); |
1340 | cond_resched(); | 1482 | cond_resched(); |
1341 | /* Cannot fail - no vcpu unplug yet. */ | 1483 | vcpu_load(vcpu); |
1342 | vcpu_load(vcpu->kvm, vcpu_slot(vcpu)); | ||
1343 | } | 1484 | } |
1344 | EXPORT_SYMBOL_GPL(kvm_resched); | 1485 | EXPORT_SYMBOL_GPL(kvm_resched); |
1345 | 1486 | ||
@@ -1361,17 +1502,11 @@ void save_msrs(struct vmx_msr_entry *e, int n) | |||
1361 | } | 1502 | } |
1362 | EXPORT_SYMBOL_GPL(save_msrs); | 1503 | EXPORT_SYMBOL_GPL(save_msrs); |
1363 | 1504 | ||
1364 | static int kvm_dev_ioctl_run(struct kvm *kvm, struct kvm_run *kvm_run) | 1505 | static int kvm_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) |
1365 | { | 1506 | { |
1366 | struct kvm_vcpu *vcpu; | ||
1367 | int r; | 1507 | int r; |
1368 | 1508 | ||
1369 | if (!valid_vcpu(kvm_run->vcpu)) | 1509 | vcpu_load(vcpu); |
1370 | return -EINVAL; | ||
1371 | |||
1372 | vcpu = vcpu_load(kvm, kvm_run->vcpu); | ||
1373 | if (!vcpu) | ||
1374 | return -ENOENT; | ||
1375 | 1510 | ||
1376 | /* re-sync apic's tpr */ | 1511 | /* re-sync apic's tpr */ |
1377 | vcpu->cr8 = kvm_run->cr8; | 1512 | vcpu->cr8 = kvm_run->cr8; |
@@ -1394,16 +1529,10 @@ static int kvm_dev_ioctl_run(struct kvm *kvm, struct kvm_run *kvm_run) | |||
1394 | return r; | 1529 | return r; |
1395 | } | 1530 | } |
1396 | 1531 | ||
1397 | static int kvm_dev_ioctl_get_regs(struct kvm *kvm, struct kvm_regs *regs) | 1532 | static int kvm_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, |
1533 | struct kvm_regs *regs) | ||
1398 | { | 1534 | { |
1399 | struct kvm_vcpu *vcpu; | 1535 | vcpu_load(vcpu); |
1400 | |||
1401 | if (!valid_vcpu(regs->vcpu)) | ||
1402 | return -EINVAL; | ||
1403 | |||
1404 | vcpu = vcpu_load(kvm, regs->vcpu); | ||
1405 | if (!vcpu) | ||
1406 | return -ENOENT; | ||
1407 | 1536 | ||
1408 | kvm_arch_ops->cache_regs(vcpu); | 1537 | kvm_arch_ops->cache_regs(vcpu); |
1409 | 1538 | ||
@@ -1440,16 +1569,10 @@ static int kvm_dev_ioctl_get_regs(struct kvm *kvm, struct kvm_regs *regs) | |||
1440 | return 0; | 1569 | return 0; |
1441 | } | 1570 | } |
1442 | 1571 | ||
1443 | static int kvm_dev_ioctl_set_regs(struct kvm *kvm, struct kvm_regs *regs) | 1572 | static int kvm_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, |
1573 | struct kvm_regs *regs) | ||
1444 | { | 1574 | { |
1445 | struct kvm_vcpu *vcpu; | 1575 | vcpu_load(vcpu); |
1446 | |||
1447 | if (!valid_vcpu(regs->vcpu)) | ||
1448 | return -EINVAL; | ||
1449 | |||
1450 | vcpu = vcpu_load(kvm, regs->vcpu); | ||
1451 | if (!vcpu) | ||
1452 | return -ENOENT; | ||
1453 | 1576 | ||
1454 | vcpu->regs[VCPU_REGS_RAX] = regs->rax; | 1577 | vcpu->regs[VCPU_REGS_RAX] = regs->rax; |
1455 | vcpu->regs[VCPU_REGS_RBX] = regs->rbx; | 1578 | vcpu->regs[VCPU_REGS_RBX] = regs->rbx; |
@@ -1486,16 +1609,12 @@ static void get_segment(struct kvm_vcpu *vcpu, | |||
1486 | return kvm_arch_ops->get_segment(vcpu, var, seg); | 1609 | return kvm_arch_ops->get_segment(vcpu, var, seg); |
1487 | } | 1610 | } |
1488 | 1611 | ||
1489 | static int kvm_dev_ioctl_get_sregs(struct kvm *kvm, struct kvm_sregs *sregs) | 1612 | static int kvm_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, |
1613 | struct kvm_sregs *sregs) | ||
1490 | { | 1614 | { |
1491 | struct kvm_vcpu *vcpu; | ||
1492 | struct descriptor_table dt; | 1615 | struct descriptor_table dt; |
1493 | 1616 | ||
1494 | if (!valid_vcpu(sregs->vcpu)) | 1617 | vcpu_load(vcpu); |
1495 | return -EINVAL; | ||
1496 | vcpu = vcpu_load(kvm, sregs->vcpu); | ||
1497 | if (!vcpu) | ||
1498 | return -ENOENT; | ||
1499 | 1618 | ||
1500 | get_segment(vcpu, &sregs->cs, VCPU_SREG_CS); | 1619 | get_segment(vcpu, &sregs->cs, VCPU_SREG_CS); |
1501 | get_segment(vcpu, &sregs->ds, VCPU_SREG_DS); | 1620 | get_segment(vcpu, &sregs->ds, VCPU_SREG_DS); |
@@ -1537,18 +1656,14 @@ static void set_segment(struct kvm_vcpu *vcpu, | |||
1537 | return kvm_arch_ops->set_segment(vcpu, var, seg); | 1656 | return kvm_arch_ops->set_segment(vcpu, var, seg); |
1538 | } | 1657 | } |
1539 | 1658 | ||
1540 | static int kvm_dev_ioctl_set_sregs(struct kvm *kvm, struct kvm_sregs *sregs) | 1659 | static int kvm_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, |
1660 | struct kvm_sregs *sregs) | ||
1541 | { | 1661 | { |
1542 | struct kvm_vcpu *vcpu; | ||
1543 | int mmu_reset_needed = 0; | 1662 | int mmu_reset_needed = 0; |
1544 | int i; | 1663 | int i; |
1545 | struct descriptor_table dt; | 1664 | struct descriptor_table dt; |
1546 | 1665 | ||
1547 | if (!valid_vcpu(sregs->vcpu)) | 1666 | vcpu_load(vcpu); |
1548 | return -EINVAL; | ||
1549 | vcpu = vcpu_load(kvm, sregs->vcpu); | ||
1550 | if (!vcpu) | ||
1551 | return -ENOENT; | ||
1552 | 1667 | ||
1553 | set_segment(vcpu, &sregs->cs, VCPU_SREG_CS); | 1668 | set_segment(vcpu, &sregs->cs, VCPU_SREG_CS); |
1554 | set_segment(vcpu, &sregs->ds, VCPU_SREG_DS); | 1669 | set_segment(vcpu, &sregs->ds, VCPU_SREG_DS); |
@@ -1654,20 +1769,14 @@ static int do_set_msr(struct kvm_vcpu *vcpu, unsigned index, u64 *data) | |||
1654 | * | 1769 | * |
1655 | * @return number of msrs set successfully. | 1770 | * @return number of msrs set successfully. |
1656 | */ | 1771 | */ |
1657 | static int __msr_io(struct kvm *kvm, struct kvm_msrs *msrs, | 1772 | static int __msr_io(struct kvm_vcpu *vcpu, struct kvm_msrs *msrs, |
1658 | struct kvm_msr_entry *entries, | 1773 | struct kvm_msr_entry *entries, |
1659 | int (*do_msr)(struct kvm_vcpu *vcpu, | 1774 | int (*do_msr)(struct kvm_vcpu *vcpu, |
1660 | unsigned index, u64 *data)) | 1775 | unsigned index, u64 *data)) |
1661 | { | 1776 | { |
1662 | struct kvm_vcpu *vcpu; | ||
1663 | int i; | 1777 | int i; |
1664 | 1778 | ||
1665 | if (!valid_vcpu(msrs->vcpu)) | 1779 | vcpu_load(vcpu); |
1666 | return -EINVAL; | ||
1667 | |||
1668 | vcpu = vcpu_load(kvm, msrs->vcpu); | ||
1669 | if (!vcpu) | ||
1670 | return -ENOENT; | ||
1671 | 1780 | ||
1672 | for (i = 0; i < msrs->nmsrs; ++i) | 1781 | for (i = 0; i < msrs->nmsrs; ++i) |
1673 | if (do_msr(vcpu, entries[i].index, &entries[i].data)) | 1782 | if (do_msr(vcpu, entries[i].index, &entries[i].data)) |
@@ -1683,7 +1792,7 @@ static int __msr_io(struct kvm *kvm, struct kvm_msrs *msrs, | |||
1683 | * | 1792 | * |
1684 | * @return number of msrs set successfully. | 1793 | * @return number of msrs set successfully. |
1685 | */ | 1794 | */ |
1686 | static int msr_io(struct kvm *kvm, struct kvm_msrs __user *user_msrs, | 1795 | static int msr_io(struct kvm_vcpu *vcpu, struct kvm_msrs __user *user_msrs, |
1687 | int (*do_msr)(struct kvm_vcpu *vcpu, | 1796 | int (*do_msr)(struct kvm_vcpu *vcpu, |
1688 | unsigned index, u64 *data), | 1797 | unsigned index, u64 *data), |
1689 | int writeback) | 1798 | int writeback) |
@@ -1711,7 +1820,7 @@ static int msr_io(struct kvm *kvm, struct kvm_msrs __user *user_msrs, | |||
1711 | if (copy_from_user(entries, user_msrs->entries, size)) | 1820 | if (copy_from_user(entries, user_msrs->entries, size)) |
1712 | goto out_free; | 1821 | goto out_free; |
1713 | 1822 | ||
1714 | r = n = __msr_io(kvm, &msrs, entries, do_msr); | 1823 | r = n = __msr_io(vcpu, &msrs, entries, do_msr); |
1715 | if (r < 0) | 1824 | if (r < 0) |
1716 | goto out_free; | 1825 | goto out_free; |
1717 | 1826 | ||
@@ -1730,38 +1839,31 @@ out: | |||
1730 | /* | 1839 | /* |
1731 | * Translate a guest virtual address to a guest physical address. | 1840 | * Translate a guest virtual address to a guest physical address. |
1732 | */ | 1841 | */ |
1733 | static int kvm_dev_ioctl_translate(struct kvm *kvm, struct kvm_translation *tr) | 1842 | static int kvm_vcpu_ioctl_translate(struct kvm_vcpu *vcpu, |
1843 | struct kvm_translation *tr) | ||
1734 | { | 1844 | { |
1735 | unsigned long vaddr = tr->linear_address; | 1845 | unsigned long vaddr = tr->linear_address; |
1736 | struct kvm_vcpu *vcpu; | ||
1737 | gpa_t gpa; | 1846 | gpa_t gpa; |
1738 | 1847 | ||
1739 | vcpu = vcpu_load(kvm, tr->vcpu); | 1848 | vcpu_load(vcpu); |
1740 | if (!vcpu) | 1849 | spin_lock(&vcpu->kvm->lock); |
1741 | return -ENOENT; | ||
1742 | spin_lock(&kvm->lock); | ||
1743 | gpa = vcpu->mmu.gva_to_gpa(vcpu, vaddr); | 1850 | gpa = vcpu->mmu.gva_to_gpa(vcpu, vaddr); |
1744 | tr->physical_address = gpa; | 1851 | tr->physical_address = gpa; |
1745 | tr->valid = gpa != UNMAPPED_GVA; | 1852 | tr->valid = gpa != UNMAPPED_GVA; |
1746 | tr->writeable = 1; | 1853 | tr->writeable = 1; |
1747 | tr->usermode = 0; | 1854 | tr->usermode = 0; |
1748 | spin_unlock(&kvm->lock); | 1855 | spin_unlock(&vcpu->kvm->lock); |
1749 | vcpu_put(vcpu); | 1856 | vcpu_put(vcpu); |
1750 | 1857 | ||
1751 | return 0; | 1858 | return 0; |
1752 | } | 1859 | } |
1753 | 1860 | ||
1754 | static int kvm_dev_ioctl_interrupt(struct kvm *kvm, struct kvm_interrupt *irq) | 1861 | static int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu, |
1862 | struct kvm_interrupt *irq) | ||
1755 | { | 1863 | { |
1756 | struct kvm_vcpu *vcpu; | ||
1757 | |||
1758 | if (!valid_vcpu(irq->vcpu)) | ||
1759 | return -EINVAL; | ||
1760 | if (irq->irq < 0 || irq->irq >= 256) | 1864 | if (irq->irq < 0 || irq->irq >= 256) |
1761 | return -EINVAL; | 1865 | return -EINVAL; |
1762 | vcpu = vcpu_load(kvm, irq->vcpu); | 1866 | vcpu_load(vcpu); |
1763 | if (!vcpu) | ||
1764 | return -ENOENT; | ||
1765 | 1867 | ||
1766 | set_bit(irq->irq, vcpu->irq_pending); | 1868 | set_bit(irq->irq, vcpu->irq_pending); |
1767 | set_bit(irq->irq / BITS_PER_LONG, &vcpu->irq_summary); | 1869 | set_bit(irq->irq / BITS_PER_LONG, &vcpu->irq_summary); |
@@ -1771,17 +1873,12 @@ static int kvm_dev_ioctl_interrupt(struct kvm *kvm, struct kvm_interrupt *irq) | |||
1771 | return 0; | 1873 | return 0; |
1772 | } | 1874 | } |
1773 | 1875 | ||
1774 | static int kvm_dev_ioctl_debug_guest(struct kvm *kvm, | 1876 | static int kvm_vcpu_ioctl_debug_guest(struct kvm_vcpu *vcpu, |
1775 | struct kvm_debug_guest *dbg) | 1877 | struct kvm_debug_guest *dbg) |
1776 | { | 1878 | { |
1777 | struct kvm_vcpu *vcpu; | ||
1778 | int r; | 1879 | int r; |
1779 | 1880 | ||
1780 | if (!valid_vcpu(dbg->vcpu)) | 1881 | vcpu_load(vcpu); |
1781 | return -EINVAL; | ||
1782 | vcpu = vcpu_load(kvm, dbg->vcpu); | ||
1783 | if (!vcpu) | ||
1784 | return -ENOENT; | ||
1785 | 1882 | ||
1786 | r = kvm_arch_ops->set_guest_debug(vcpu, dbg); | 1883 | r = kvm_arch_ops->set_guest_debug(vcpu, dbg); |
1787 | 1884 | ||
@@ -1790,30 +1887,129 @@ static int kvm_dev_ioctl_debug_guest(struct kvm *kvm, | |||
1790 | return r; | 1887 | return r; |
1791 | } | 1888 | } |
1792 | 1889 | ||
1793 | static long kvm_dev_ioctl(struct file *filp, | 1890 | static int kvm_vcpu_release(struct inode *inode, struct file *filp) |
1794 | unsigned int ioctl, unsigned long arg) | ||
1795 | { | 1891 | { |
1796 | struct kvm *kvm = filp->private_data; | 1892 | struct kvm_vcpu *vcpu = filp->private_data; |
1893 | |||
1894 | fput(vcpu->kvm->filp); | ||
1895 | return 0; | ||
1896 | } | ||
1897 | |||
1898 | static struct file_operations kvm_vcpu_fops = { | ||
1899 | .release = kvm_vcpu_release, | ||
1900 | .unlocked_ioctl = kvm_vcpu_ioctl, | ||
1901 | .compat_ioctl = kvm_vcpu_ioctl, | ||
1902 | }; | ||
1903 | |||
1904 | /* | ||
1905 | * Allocates an inode for the vcpu. | ||
1906 | */ | ||
1907 | static int create_vcpu_fd(struct kvm_vcpu *vcpu) | ||
1908 | { | ||
1909 | int fd, r; | ||
1910 | struct inode *inode; | ||
1911 | struct file *file; | ||
1912 | |||
1913 | atomic_inc(&vcpu->kvm->filp->f_count); | ||
1914 | inode = kvmfs_inode(&kvm_vcpu_fops); | ||
1915 | if (IS_ERR(inode)) { | ||
1916 | r = PTR_ERR(inode); | ||
1917 | goto out1; | ||
1918 | } | ||
1919 | |||
1920 | file = kvmfs_file(inode, vcpu); | ||
1921 | if (IS_ERR(file)) { | ||
1922 | r = PTR_ERR(file); | ||
1923 | goto out2; | ||
1924 | } | ||
1925 | |||
1926 | r = get_unused_fd(); | ||
1927 | if (r < 0) | ||
1928 | goto out3; | ||
1929 | fd = r; | ||
1930 | fd_install(fd, file); | ||
1931 | |||
1932 | return fd; | ||
1933 | |||
1934 | out3: | ||
1935 | fput(file); | ||
1936 | out2: | ||
1937 | iput(inode); | ||
1938 | out1: | ||
1939 | fput(vcpu->kvm->filp); | ||
1940 | return r; | ||
1941 | } | ||
1942 | |||
1943 | /* | ||
1944 | * Creates some virtual cpus. Good luck creating more than one. | ||
1945 | */ | ||
1946 | static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, int n) | ||
1947 | { | ||
1948 | int r; | ||
1949 | struct kvm_vcpu *vcpu; | ||
1950 | |||
1951 | r = -EINVAL; | ||
1952 | if (!valid_vcpu(n)) | ||
1953 | goto out; | ||
1954 | |||
1955 | vcpu = &kvm->vcpus[n]; | ||
1956 | |||
1957 | mutex_lock(&vcpu->mutex); | ||
1958 | |||
1959 | if (vcpu->vmcs) { | ||
1960 | mutex_unlock(&vcpu->mutex); | ||
1961 | return -EEXIST; | ||
1962 | } | ||
1963 | |||
1964 | vcpu->host_fx_image = (char*)ALIGN((hva_t)vcpu->fx_buf, | ||
1965 | FX_IMAGE_ALIGN); | ||
1966 | vcpu->guest_fx_image = vcpu->host_fx_image + FX_IMAGE_SIZE; | ||
1967 | |||
1968 | r = kvm_arch_ops->vcpu_create(vcpu); | ||
1969 | if (r < 0) | ||
1970 | goto out_free_vcpus; | ||
1971 | |||
1972 | r = kvm_mmu_create(vcpu); | ||
1973 | if (r < 0) | ||
1974 | goto out_free_vcpus; | ||
1975 | |||
1976 | kvm_arch_ops->vcpu_load(vcpu); | ||
1977 | r = kvm_mmu_setup(vcpu); | ||
1978 | if (r >= 0) | ||
1979 | r = kvm_arch_ops->vcpu_setup(vcpu); | ||
1980 | vcpu_put(vcpu); | ||
1981 | |||
1982 | if (r < 0) | ||
1983 | goto out_free_vcpus; | ||
1984 | |||
1985 | r = create_vcpu_fd(vcpu); | ||
1986 | if (r < 0) | ||
1987 | goto out_free_vcpus; | ||
1988 | |||
1989 | return r; | ||
1990 | |||
1991 | out_free_vcpus: | ||
1992 | kvm_free_vcpu(vcpu); | ||
1993 | mutex_unlock(&vcpu->mutex); | ||
1994 | out: | ||
1995 | return r; | ||
1996 | } | ||
1997 | |||
1998 | static long kvm_vcpu_ioctl(struct file *filp, | ||
1999 | unsigned int ioctl, unsigned long arg) | ||
2000 | { | ||
2001 | struct kvm_vcpu *vcpu = filp->private_data; | ||
1797 | void __user *argp = (void __user *)arg; | 2002 | void __user *argp = (void __user *)arg; |
1798 | int r = -EINVAL; | 2003 | int r = -EINVAL; |
1799 | 2004 | ||
1800 | switch (ioctl) { | 2005 | switch (ioctl) { |
1801 | case KVM_GET_API_VERSION: | ||
1802 | r = KVM_API_VERSION; | ||
1803 | break; | ||
1804 | case KVM_CREATE_VCPU: { | ||
1805 | r = kvm_dev_ioctl_create_vcpu(kvm, arg); | ||
1806 | if (r) | ||
1807 | goto out; | ||
1808 | break; | ||
1809 | } | ||
1810 | case KVM_RUN: { | 2006 | case KVM_RUN: { |
1811 | struct kvm_run kvm_run; | 2007 | struct kvm_run kvm_run; |
1812 | 2008 | ||
1813 | r = -EFAULT; | 2009 | r = -EFAULT; |
1814 | if (copy_from_user(&kvm_run, argp, sizeof kvm_run)) | 2010 | if (copy_from_user(&kvm_run, argp, sizeof kvm_run)) |
1815 | goto out; | 2011 | goto out; |
1816 | r = kvm_dev_ioctl_run(kvm, &kvm_run); | 2012 | r = kvm_vcpu_ioctl_run(vcpu, &kvm_run); |
1817 | if (r < 0 && r != -EINTR) | 2013 | if (r < 0 && r != -EINTR) |
1818 | goto out; | 2014 | goto out; |
1819 | if (copy_to_user(argp, &kvm_run, sizeof kvm_run)) { | 2015 | if (copy_to_user(argp, &kvm_run, sizeof kvm_run)) { |
@@ -1825,10 +2021,8 @@ static long kvm_dev_ioctl(struct file *filp, | |||
1825 | case KVM_GET_REGS: { | 2021 | case KVM_GET_REGS: { |
1826 | struct kvm_regs kvm_regs; | 2022 | struct kvm_regs kvm_regs; |
1827 | 2023 | ||
1828 | r = -EFAULT; | 2024 | memset(&kvm_regs, 0, sizeof kvm_regs); |
1829 | if (copy_from_user(&kvm_regs, argp, sizeof kvm_regs)) | 2025 | r = kvm_vcpu_ioctl_get_regs(vcpu, &kvm_regs); |
1830 | goto out; | ||
1831 | r = kvm_dev_ioctl_get_regs(kvm, &kvm_regs); | ||
1832 | if (r) | 2026 | if (r) |
1833 | goto out; | 2027 | goto out; |
1834 | r = -EFAULT; | 2028 | r = -EFAULT; |
@@ -1843,7 +2037,7 @@ static long kvm_dev_ioctl(struct file *filp, | |||
1843 | r = -EFAULT; | 2037 | r = -EFAULT; |
1844 | if (copy_from_user(&kvm_regs, argp, sizeof kvm_regs)) | 2038 | if (copy_from_user(&kvm_regs, argp, sizeof kvm_regs)) |
1845 | goto out; | 2039 | goto out; |
1846 | r = kvm_dev_ioctl_set_regs(kvm, &kvm_regs); | 2040 | r = kvm_vcpu_ioctl_set_regs(vcpu, &kvm_regs); |
1847 | if (r) | 2041 | if (r) |
1848 | goto out; | 2042 | goto out; |
1849 | r = 0; | 2043 | r = 0; |
@@ -1852,10 +2046,8 @@ static long kvm_dev_ioctl(struct file *filp, | |||
1852 | case KVM_GET_SREGS: { | 2046 | case KVM_GET_SREGS: { |
1853 | struct kvm_sregs kvm_sregs; | 2047 | struct kvm_sregs kvm_sregs; |
1854 | 2048 | ||
1855 | r = -EFAULT; | 2049 | memset(&kvm_sregs, 0, sizeof kvm_sregs); |
1856 | if (copy_from_user(&kvm_sregs, argp, sizeof kvm_sregs)) | 2050 | r = kvm_vcpu_ioctl_get_sregs(vcpu, &kvm_sregs); |
1857 | goto out; | ||
1858 | r = kvm_dev_ioctl_get_sregs(kvm, &kvm_sregs); | ||
1859 | if (r) | 2051 | if (r) |
1860 | goto out; | 2052 | goto out; |
1861 | r = -EFAULT; | 2053 | r = -EFAULT; |
@@ -1870,7 +2062,7 @@ static long kvm_dev_ioctl(struct file *filp, | |||
1870 | r = -EFAULT; | 2062 | r = -EFAULT; |
1871 | if (copy_from_user(&kvm_sregs, argp, sizeof kvm_sregs)) | 2063 | if (copy_from_user(&kvm_sregs, argp, sizeof kvm_sregs)) |
1872 | goto out; | 2064 | goto out; |
1873 | r = kvm_dev_ioctl_set_sregs(kvm, &kvm_sregs); | 2065 | r = kvm_vcpu_ioctl_set_sregs(vcpu, &kvm_sregs); |
1874 | if (r) | 2066 | if (r) |
1875 | goto out; | 2067 | goto out; |
1876 | r = 0; | 2068 | r = 0; |
@@ -1882,7 +2074,7 @@ static long kvm_dev_ioctl(struct file *filp, | |||
1882 | r = -EFAULT; | 2074 | r = -EFAULT; |
1883 | if (copy_from_user(&tr, argp, sizeof tr)) | 2075 | if (copy_from_user(&tr, argp, sizeof tr)) |
1884 | goto out; | 2076 | goto out; |
1885 | r = kvm_dev_ioctl_translate(kvm, &tr); | 2077 | r = kvm_vcpu_ioctl_translate(vcpu, &tr); |
1886 | if (r) | 2078 | if (r) |
1887 | goto out; | 2079 | goto out; |
1888 | r = -EFAULT; | 2080 | r = -EFAULT; |
@@ -1897,7 +2089,7 @@ static long kvm_dev_ioctl(struct file *filp, | |||
1897 | r = -EFAULT; | 2089 | r = -EFAULT; |
1898 | if (copy_from_user(&irq, argp, sizeof irq)) | 2090 | if (copy_from_user(&irq, argp, sizeof irq)) |
1899 | goto out; | 2091 | goto out; |
1900 | r = kvm_dev_ioctl_interrupt(kvm, &irq); | 2092 | r = kvm_vcpu_ioctl_interrupt(vcpu, &irq); |
1901 | if (r) | 2093 | if (r) |
1902 | goto out; | 2094 | goto out; |
1903 | r = 0; | 2095 | r = 0; |
@@ -1909,19 +2101,45 @@ static long kvm_dev_ioctl(struct file *filp, | |||
1909 | r = -EFAULT; | 2101 | r = -EFAULT; |
1910 | if (copy_from_user(&dbg, argp, sizeof dbg)) | 2102 | if (copy_from_user(&dbg, argp, sizeof dbg)) |
1911 | goto out; | 2103 | goto out; |
1912 | r = kvm_dev_ioctl_debug_guest(kvm, &dbg); | 2104 | r = kvm_vcpu_ioctl_debug_guest(vcpu, &dbg); |
1913 | if (r) | 2105 | if (r) |
1914 | goto out; | 2106 | goto out; |
1915 | r = 0; | 2107 | r = 0; |
1916 | break; | 2108 | break; |
1917 | } | 2109 | } |
2110 | case KVM_GET_MSRS: | ||
2111 | r = msr_io(vcpu, argp, get_msr, 1); | ||
2112 | break; | ||
2113 | case KVM_SET_MSRS: | ||
2114 | r = msr_io(vcpu, argp, do_set_msr, 0); | ||
2115 | break; | ||
2116 | default: | ||
2117 | ; | ||
2118 | } | ||
2119 | out: | ||
2120 | return r; | ||
2121 | } | ||
2122 | |||
2123 | static long kvm_vm_ioctl(struct file *filp, | ||
2124 | unsigned int ioctl, unsigned long arg) | ||
2125 | { | ||
2126 | struct kvm *kvm = filp->private_data; | ||
2127 | void __user *argp = (void __user *)arg; | ||
2128 | int r = -EINVAL; | ||
2129 | |||
2130 | switch (ioctl) { | ||
2131 | case KVM_CREATE_VCPU: | ||
2132 | r = kvm_vm_ioctl_create_vcpu(kvm, arg); | ||
2133 | if (r < 0) | ||
2134 | goto out; | ||
2135 | break; | ||
1918 | case KVM_SET_MEMORY_REGION: { | 2136 | case KVM_SET_MEMORY_REGION: { |
1919 | struct kvm_memory_region kvm_mem; | 2137 | struct kvm_memory_region kvm_mem; |
1920 | 2138 | ||
1921 | r = -EFAULT; | 2139 | r = -EFAULT; |
1922 | if (copy_from_user(&kvm_mem, argp, sizeof kvm_mem)) | 2140 | if (copy_from_user(&kvm_mem, argp, sizeof kvm_mem)) |
1923 | goto out; | 2141 | goto out; |
1924 | r = kvm_dev_ioctl_set_memory_region(kvm, &kvm_mem); | 2142 | r = kvm_vm_ioctl_set_memory_region(kvm, &kvm_mem); |
1925 | if (r) | 2143 | if (r) |
1926 | goto out; | 2144 | goto out; |
1927 | break; | 2145 | break; |
@@ -1932,16 +2150,112 @@ static long kvm_dev_ioctl(struct file *filp, | |||
1932 | r = -EFAULT; | 2150 | r = -EFAULT; |
1933 | if (copy_from_user(&log, argp, sizeof log)) | 2151 | if (copy_from_user(&log, argp, sizeof log)) |
1934 | goto out; | 2152 | goto out; |
1935 | r = kvm_dev_ioctl_get_dirty_log(kvm, &log); | 2153 | r = kvm_vm_ioctl_get_dirty_log(kvm, &log); |
1936 | if (r) | 2154 | if (r) |
1937 | goto out; | 2155 | goto out; |
1938 | break; | 2156 | break; |
1939 | } | 2157 | } |
1940 | case KVM_GET_MSRS: | 2158 | default: |
1941 | r = msr_io(kvm, argp, get_msr, 1); | 2159 | ; |
2160 | } | ||
2161 | out: | ||
2162 | return r; | ||
2163 | } | ||
2164 | |||
2165 | static struct page *kvm_vm_nopage(struct vm_area_struct *vma, | ||
2166 | unsigned long address, | ||
2167 | int *type) | ||
2168 | { | ||
2169 | struct kvm *kvm = vma->vm_file->private_data; | ||
2170 | unsigned long pgoff; | ||
2171 | struct kvm_memory_slot *slot; | ||
2172 | struct page *page; | ||
2173 | |||
2174 | *type = VM_FAULT_MINOR; | ||
2175 | pgoff = ((address - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff; | ||
2176 | slot = gfn_to_memslot(kvm, pgoff); | ||
2177 | if (!slot) | ||
2178 | return NOPAGE_SIGBUS; | ||
2179 | page = gfn_to_page(slot, pgoff); | ||
2180 | if (!page) | ||
2181 | return NOPAGE_SIGBUS; | ||
2182 | get_page(page); | ||
2183 | return page; | ||
2184 | } | ||
2185 | |||
2186 | static struct vm_operations_struct kvm_vm_vm_ops = { | ||
2187 | .nopage = kvm_vm_nopage, | ||
2188 | }; | ||
2189 | |||
2190 | static int kvm_vm_mmap(struct file *file, struct vm_area_struct *vma) | ||
2191 | { | ||
2192 | vma->vm_ops = &kvm_vm_vm_ops; | ||
2193 | return 0; | ||
2194 | } | ||
2195 | |||
2196 | static struct file_operations kvm_vm_fops = { | ||
2197 | .release = kvm_vm_release, | ||
2198 | .unlocked_ioctl = kvm_vm_ioctl, | ||
2199 | .compat_ioctl = kvm_vm_ioctl, | ||
2200 | .mmap = kvm_vm_mmap, | ||
2201 | }; | ||
2202 | |||
2203 | static int kvm_dev_ioctl_create_vm(void) | ||
2204 | { | ||
2205 | int fd, r; | ||
2206 | struct inode *inode; | ||
2207 | struct file *file; | ||
2208 | struct kvm *kvm; | ||
2209 | |||
2210 | inode = kvmfs_inode(&kvm_vm_fops); | ||
2211 | if (IS_ERR(inode)) { | ||
2212 | r = PTR_ERR(inode); | ||
2213 | goto out1; | ||
2214 | } | ||
2215 | |||
2216 | kvm = kvm_create_vm(); | ||
2217 | if (IS_ERR(kvm)) { | ||
2218 | r = PTR_ERR(kvm); | ||
2219 | goto out2; | ||
2220 | } | ||
2221 | |||
2222 | file = kvmfs_file(inode, kvm); | ||
2223 | if (IS_ERR(file)) { | ||
2224 | r = PTR_ERR(file); | ||
2225 | goto out3; | ||
2226 | } | ||
2227 | kvm->filp = file; | ||
2228 | |||
2229 | r = get_unused_fd(); | ||
2230 | if (r < 0) | ||
2231 | goto out4; | ||
2232 | fd = r; | ||
2233 | fd_install(fd, file); | ||
2234 | |||
2235 | return fd; | ||
2236 | |||
2237 | out4: | ||
2238 | fput(file); | ||
2239 | out3: | ||
2240 | kvm_destroy_vm(kvm); | ||
2241 | out2: | ||
2242 | iput(inode); | ||
2243 | out1: | ||
2244 | return r; | ||
2245 | } | ||
2246 | |||
2247 | static long kvm_dev_ioctl(struct file *filp, | ||
2248 | unsigned int ioctl, unsigned long arg) | ||
2249 | { | ||
2250 | void __user *argp = (void __user *)arg; | ||
2251 | int r = -EINVAL; | ||
2252 | |||
2253 | switch (ioctl) { | ||
2254 | case KVM_GET_API_VERSION: | ||
2255 | r = KVM_API_VERSION; | ||
1942 | break; | 2256 | break; |
1943 | case KVM_SET_MSRS: | 2257 | case KVM_CREATE_VM: |
1944 | r = msr_io(kvm, argp, do_set_msr, 0); | 2258 | r = kvm_dev_ioctl_create_vm(); |
1945 | break; | 2259 | break; |
1946 | case KVM_GET_MSR_INDEX_LIST: { | 2260 | case KVM_GET_MSR_INDEX_LIST: { |
1947 | struct kvm_msr_list __user *user_msr_list = argp; | 2261 | struct kvm_msr_list __user *user_msr_list = argp; |
@@ -1977,43 +2291,11 @@ out: | |||
1977 | return r; | 2291 | return r; |
1978 | } | 2292 | } |
1979 | 2293 | ||
1980 | static struct page *kvm_dev_nopage(struct vm_area_struct *vma, | ||
1981 | unsigned long address, | ||
1982 | int *type) | ||
1983 | { | ||
1984 | struct kvm *kvm = vma->vm_file->private_data; | ||
1985 | unsigned long pgoff; | ||
1986 | struct kvm_memory_slot *slot; | ||
1987 | struct page *page; | ||
1988 | |||
1989 | *type = VM_FAULT_MINOR; | ||
1990 | pgoff = ((address - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff; | ||
1991 | slot = gfn_to_memslot(kvm, pgoff); | ||
1992 | if (!slot) | ||
1993 | return NOPAGE_SIGBUS; | ||
1994 | page = gfn_to_page(slot, pgoff); | ||
1995 | if (!page) | ||
1996 | return NOPAGE_SIGBUS; | ||
1997 | get_page(page); | ||
1998 | return page; | ||
1999 | } | ||
2000 | |||
2001 | static struct vm_operations_struct kvm_dev_vm_ops = { | ||
2002 | .nopage = kvm_dev_nopage, | ||
2003 | }; | ||
2004 | |||
2005 | static int kvm_dev_mmap(struct file *file, struct vm_area_struct *vma) | ||
2006 | { | ||
2007 | vma->vm_ops = &kvm_dev_vm_ops; | ||
2008 | return 0; | ||
2009 | } | ||
2010 | |||
2011 | static struct file_operations kvm_chardev_ops = { | 2294 | static struct file_operations kvm_chardev_ops = { |
2012 | .open = kvm_dev_open, | 2295 | .open = kvm_dev_open, |
2013 | .release = kvm_dev_release, | 2296 | .release = kvm_dev_release, |
2014 | .unlocked_ioctl = kvm_dev_ioctl, | 2297 | .unlocked_ioctl = kvm_dev_ioctl, |
2015 | .compat_ioctl = kvm_dev_ioctl, | 2298 | .compat_ioctl = kvm_dev_ioctl, |
2016 | .mmap = kvm_dev_mmap, | ||
2017 | }; | 2299 | }; |
2018 | 2300 | ||
2019 | static struct miscdevice kvm_dev = { | 2301 | static struct miscdevice kvm_dev = { |
@@ -2080,13 +2362,17 @@ static int kvm_cpu_hotplug(struct notifier_block *notifier, unsigned long val, | |||
2080 | int cpu = (long)v; | 2362 | int cpu = (long)v; |
2081 | 2363 | ||
2082 | switch (val) { | 2364 | switch (val) { |
2083 | case CPU_DEAD: | 2365 | case CPU_DOWN_PREPARE: |
2084 | case CPU_UP_CANCELED: | 2366 | case CPU_UP_CANCELED: |
2367 | printk(KERN_INFO "kvm: disabling virtualization on CPU%d\n", | ||
2368 | cpu); | ||
2085 | decache_vcpus_on_cpu(cpu); | 2369 | decache_vcpus_on_cpu(cpu); |
2086 | smp_call_function_single(cpu, kvm_arch_ops->hardware_disable, | 2370 | smp_call_function_single(cpu, kvm_arch_ops->hardware_disable, |
2087 | NULL, 0, 1); | 2371 | NULL, 0, 1); |
2088 | break; | 2372 | break; |
2089 | case CPU_UP_PREPARE: | 2373 | case CPU_ONLINE: |
2374 | printk(KERN_INFO "kvm: enabling virtualization on CPU%d\n", | ||
2375 | cpu); | ||
2090 | smp_call_function_single(cpu, kvm_arch_ops->hardware_enable, | 2376 | smp_call_function_single(cpu, kvm_arch_ops->hardware_enable, |
2091 | NULL, 0, 1); | 2377 | NULL, 0, 1); |
2092 | break; | 2378 | break; |
@@ -2121,13 +2407,13 @@ static void kvm_exit_debug(void) | |||
2121 | static int kvm_suspend(struct sys_device *dev, pm_message_t state) | 2407 | static int kvm_suspend(struct sys_device *dev, pm_message_t state) |
2122 | { | 2408 | { |
2123 | decache_vcpus_on_cpu(raw_smp_processor_id()); | 2409 | decache_vcpus_on_cpu(raw_smp_processor_id()); |
2124 | on_each_cpu(kvm_arch_ops->hardware_disable, 0, 0, 1); | 2410 | on_each_cpu(kvm_arch_ops->hardware_disable, NULL, 0, 1); |
2125 | return 0; | 2411 | return 0; |
2126 | } | 2412 | } |
2127 | 2413 | ||
2128 | static int kvm_resume(struct sys_device *dev) | 2414 | static int kvm_resume(struct sys_device *dev) |
2129 | { | 2415 | { |
2130 | on_each_cpu(kvm_arch_ops->hardware_enable, 0, 0, 1); | 2416 | on_each_cpu(kvm_arch_ops->hardware_enable, NULL, 0, 1); |
2131 | return 0; | 2417 | return 0; |
2132 | } | 2418 | } |
2133 | 2419 | ||
@@ -2144,6 +2430,18 @@ static struct sys_device kvm_sysdev = { | |||
2144 | 2430 | ||
2145 | hpa_t bad_page_address; | 2431 | hpa_t bad_page_address; |
2146 | 2432 | ||
2433 | static int kvmfs_get_sb(struct file_system_type *fs_type, int flags, | ||
2434 | const char *dev_name, void *data, struct vfsmount *mnt) | ||
2435 | { | ||
2436 | return get_sb_pseudo(fs_type, "kvm:", NULL, KVMFS_SUPER_MAGIC, mnt); | ||
2437 | } | ||
2438 | |||
2439 | static struct file_system_type kvm_fs_type = { | ||
2440 | .name = "kvmfs", | ||
2441 | .get_sb = kvmfs_get_sb, | ||
2442 | .kill_sb = kill_anon_super, | ||
2443 | }; | ||
2444 | |||
2147 | int kvm_init_arch(struct kvm_arch_ops *ops, struct module *module) | 2445 | int kvm_init_arch(struct kvm_arch_ops *ops, struct module *module) |
2148 | { | 2446 | { |
2149 | int r; | 2447 | int r; |
@@ -2220,8 +2518,16 @@ void kvm_exit_arch(void) | |||
2220 | static __init int kvm_init(void) | 2518 | static __init int kvm_init(void) |
2221 | { | 2519 | { |
2222 | static struct page *bad_page; | 2520 | static struct page *bad_page; |
2223 | int r = 0; | 2521 | int r; |
2522 | |||
2523 | r = register_filesystem(&kvm_fs_type); | ||
2524 | if (r) | ||
2525 | goto out3; | ||
2224 | 2526 | ||
2527 | kvmfs_mnt = kern_mount(&kvm_fs_type); | ||
2528 | r = PTR_ERR(kvmfs_mnt); | ||
2529 | if (IS_ERR(kvmfs_mnt)) | ||
2530 | goto out2; | ||
2225 | kvm_init_debug(); | 2531 | kvm_init_debug(); |
2226 | 2532 | ||
2227 | kvm_init_msr_list(); | 2533 | kvm_init_msr_list(); |
@@ -2234,10 +2540,14 @@ static __init int kvm_init(void) | |||
2234 | bad_page_address = page_to_pfn(bad_page) << PAGE_SHIFT; | 2540 | bad_page_address = page_to_pfn(bad_page) << PAGE_SHIFT; |
2235 | memset(__va(bad_page_address), 0, PAGE_SIZE); | 2541 | memset(__va(bad_page_address), 0, PAGE_SIZE); |
2236 | 2542 | ||
2237 | return r; | 2543 | return 0; |
2238 | 2544 | ||
2239 | out: | 2545 | out: |
2240 | kvm_exit_debug(); | 2546 | kvm_exit_debug(); |
2547 | mntput(kvmfs_mnt); | ||
2548 | out2: | ||
2549 | unregister_filesystem(&kvm_fs_type); | ||
2550 | out3: | ||
2241 | return r; | 2551 | return r; |
2242 | } | 2552 | } |
2243 | 2553 | ||
@@ -2245,6 +2555,8 @@ static __exit void kvm_exit(void) | |||
2245 | { | 2555 | { |
2246 | kvm_exit_debug(); | 2556 | kvm_exit_debug(); |
2247 | __free_page(pfn_to_page(bad_page_address >> PAGE_SHIFT)); | 2557 | __free_page(pfn_to_page(bad_page_address >> PAGE_SHIFT)); |
2558 | mntput(kvmfs_mnt); | ||
2559 | unregister_filesystem(&kvm_fs_type); | ||
2248 | } | 2560 | } |
2249 | 2561 | ||
2250 | module_init(kvm_init) | 2562 | module_init(kvm_init) |
diff --git a/drivers/kvm/kvm_svm.h b/drivers/kvm/kvm_svm.h index 74cc862f4935..624f1ca48657 100644 --- a/drivers/kvm/kvm_svm.h +++ b/drivers/kvm/kvm_svm.h | |||
@@ -1,6 +1,7 @@ | |||
1 | #ifndef __KVM_SVM_H | 1 | #ifndef __KVM_SVM_H |
2 | #define __KVM_SVM_H | 2 | #define __KVM_SVM_H |
3 | 3 | ||
4 | #include <linux/kernel.h> | ||
4 | #include <linux/types.h> | 5 | #include <linux/types.h> |
5 | #include <linux/list.h> | 6 | #include <linux/list.h> |
6 | #include <asm/msr.h> | 7 | #include <asm/msr.h> |
@@ -18,7 +19,7 @@ static const u32 host_save_msrs[] = { | |||
18 | MSR_IA32_LASTBRANCHTOIP, MSR_IA32_LASTINTFROMIP,MSR_IA32_LASTINTTOIP,*/ | 19 | MSR_IA32_LASTBRANCHTOIP, MSR_IA32_LASTINTFROMIP,MSR_IA32_LASTINTTOIP,*/ |
19 | }; | 20 | }; |
20 | 21 | ||
21 | #define NR_HOST_SAVE_MSRS (sizeof(host_save_msrs) / sizeof(*host_save_msrs)) | 22 | #define NR_HOST_SAVE_MSRS ARRAY_SIZE(host_save_msrs) |
22 | #define NUM_DB_REGS 4 | 23 | #define NUM_DB_REGS 4 |
23 | 24 | ||
24 | struct vcpu_svm { | 25 | struct vcpu_svm { |
diff --git a/drivers/kvm/mmu.c b/drivers/kvm/mmu.c index be793770f31b..a1a93368f314 100644 --- a/drivers/kvm/mmu.c +++ b/drivers/kvm/mmu.c | |||
@@ -298,18 +298,18 @@ static void rmap_add(struct kvm_vcpu *vcpu, u64 *spte) | |||
298 | if (!is_rmap_pte(*spte)) | 298 | if (!is_rmap_pte(*spte)) |
299 | return; | 299 | return; |
300 | page = pfn_to_page((*spte & PT64_BASE_ADDR_MASK) >> PAGE_SHIFT); | 300 | page = pfn_to_page((*spte & PT64_BASE_ADDR_MASK) >> PAGE_SHIFT); |
301 | if (!page->private) { | 301 | if (!page_private(page)) { |
302 | rmap_printk("rmap_add: %p %llx 0->1\n", spte, *spte); | 302 | rmap_printk("rmap_add: %p %llx 0->1\n", spte, *spte); |
303 | page->private = (unsigned long)spte; | 303 | set_page_private(page,(unsigned long)spte); |
304 | } else if (!(page->private & 1)) { | 304 | } else if (!(page_private(page) & 1)) { |
305 | rmap_printk("rmap_add: %p %llx 1->many\n", spte, *spte); | 305 | rmap_printk("rmap_add: %p %llx 1->many\n", spte, *spte); |
306 | desc = mmu_alloc_rmap_desc(vcpu); | 306 | desc = mmu_alloc_rmap_desc(vcpu); |
307 | desc->shadow_ptes[0] = (u64 *)page->private; | 307 | desc->shadow_ptes[0] = (u64 *)page_private(page); |
308 | desc->shadow_ptes[1] = spte; | 308 | desc->shadow_ptes[1] = spte; |
309 | page->private = (unsigned long)desc | 1; | 309 | set_page_private(page,(unsigned long)desc | 1); |
310 | } else { | 310 | } else { |
311 | rmap_printk("rmap_add: %p %llx many->many\n", spte, *spte); | 311 | rmap_printk("rmap_add: %p %llx many->many\n", spte, *spte); |
312 | desc = (struct kvm_rmap_desc *)(page->private & ~1ul); | 312 | desc = (struct kvm_rmap_desc *)(page_private(page) & ~1ul); |
313 | while (desc->shadow_ptes[RMAP_EXT-1] && desc->more) | 313 | while (desc->shadow_ptes[RMAP_EXT-1] && desc->more) |
314 | desc = desc->more; | 314 | desc = desc->more; |
315 | if (desc->shadow_ptes[RMAP_EXT-1]) { | 315 | if (desc->shadow_ptes[RMAP_EXT-1]) { |
@@ -337,12 +337,12 @@ static void rmap_desc_remove_entry(struct kvm_vcpu *vcpu, | |||
337 | if (j != 0) | 337 | if (j != 0) |
338 | return; | 338 | return; |
339 | if (!prev_desc && !desc->more) | 339 | if (!prev_desc && !desc->more) |
340 | page->private = (unsigned long)desc->shadow_ptes[0]; | 340 | set_page_private(page,(unsigned long)desc->shadow_ptes[0]); |
341 | else | 341 | else |
342 | if (prev_desc) | 342 | if (prev_desc) |
343 | prev_desc->more = desc->more; | 343 | prev_desc->more = desc->more; |
344 | else | 344 | else |
345 | page->private = (unsigned long)desc->more | 1; | 345 | set_page_private(page,(unsigned long)desc->more | 1); |
346 | mmu_free_rmap_desc(vcpu, desc); | 346 | mmu_free_rmap_desc(vcpu, desc); |
347 | } | 347 | } |
348 | 348 | ||
@@ -356,20 +356,20 @@ static void rmap_remove(struct kvm_vcpu *vcpu, u64 *spte) | |||
356 | if (!is_rmap_pte(*spte)) | 356 | if (!is_rmap_pte(*spte)) |
357 | return; | 357 | return; |
358 | page = pfn_to_page((*spte & PT64_BASE_ADDR_MASK) >> PAGE_SHIFT); | 358 | page = pfn_to_page((*spte & PT64_BASE_ADDR_MASK) >> PAGE_SHIFT); |
359 | if (!page->private) { | 359 | if (!page_private(page)) { |
360 | printk(KERN_ERR "rmap_remove: %p %llx 0->BUG\n", spte, *spte); | 360 | printk(KERN_ERR "rmap_remove: %p %llx 0->BUG\n", spte, *spte); |
361 | BUG(); | 361 | BUG(); |
362 | } else if (!(page->private & 1)) { | 362 | } else if (!(page_private(page) & 1)) { |
363 | rmap_printk("rmap_remove: %p %llx 1->0\n", spte, *spte); | 363 | rmap_printk("rmap_remove: %p %llx 1->0\n", spte, *spte); |
364 | if ((u64 *)page->private != spte) { | 364 | if ((u64 *)page_private(page) != spte) { |
365 | printk(KERN_ERR "rmap_remove: %p %llx 1->BUG\n", | 365 | printk(KERN_ERR "rmap_remove: %p %llx 1->BUG\n", |
366 | spte, *spte); | 366 | spte, *spte); |
367 | BUG(); | 367 | BUG(); |
368 | } | 368 | } |
369 | page->private = 0; | 369 | set_page_private(page,0); |
370 | } else { | 370 | } else { |
371 | rmap_printk("rmap_remove: %p %llx many->many\n", spte, *spte); | 371 | rmap_printk("rmap_remove: %p %llx many->many\n", spte, *spte); |
372 | desc = (struct kvm_rmap_desc *)(page->private & ~1ul); | 372 | desc = (struct kvm_rmap_desc *)(page_private(page) & ~1ul); |
373 | prev_desc = NULL; | 373 | prev_desc = NULL; |
374 | while (desc) { | 374 | while (desc) { |
375 | for (i = 0; i < RMAP_EXT && desc->shadow_ptes[i]; ++i) | 375 | for (i = 0; i < RMAP_EXT && desc->shadow_ptes[i]; ++i) |
@@ -398,11 +398,11 @@ static void rmap_write_protect(struct kvm_vcpu *vcpu, u64 gfn) | |||
398 | BUG_ON(!slot); | 398 | BUG_ON(!slot); |
399 | page = gfn_to_page(slot, gfn); | 399 | page = gfn_to_page(slot, gfn); |
400 | 400 | ||
401 | while (page->private) { | 401 | while (page_private(page)) { |
402 | if (!(page->private & 1)) | 402 | if (!(page_private(page) & 1)) |
403 | spte = (u64 *)page->private; | 403 | spte = (u64 *)page_private(page); |
404 | else { | 404 | else { |
405 | desc = (struct kvm_rmap_desc *)(page->private & ~1ul); | 405 | desc = (struct kvm_rmap_desc *)(page_private(page) & ~1ul); |
406 | spte = desc->shadow_ptes[0]; | 406 | spte = desc->shadow_ptes[0]; |
407 | } | 407 | } |
408 | BUG_ON(!spte); | 408 | BUG_ON(!spte); |
@@ -1218,7 +1218,7 @@ static int alloc_mmu_pages(struct kvm_vcpu *vcpu) | |||
1218 | INIT_LIST_HEAD(&page_header->link); | 1218 | INIT_LIST_HEAD(&page_header->link); |
1219 | if ((page = alloc_page(GFP_KERNEL)) == NULL) | 1219 | if ((page = alloc_page(GFP_KERNEL)) == NULL) |
1220 | goto error_1; | 1220 | goto error_1; |
1221 | page->private = (unsigned long)page_header; | 1221 | set_page_private(page, (unsigned long)page_header); |
1222 | page_header->page_hpa = (hpa_t)page_to_pfn(page) << PAGE_SHIFT; | 1222 | page_header->page_hpa = (hpa_t)page_to_pfn(page) << PAGE_SHIFT; |
1223 | memset(__va(page_header->page_hpa), 0, PAGE_SIZE); | 1223 | memset(__va(page_header->page_hpa), 0, PAGE_SIZE); |
1224 | list_add(&page_header->link, &vcpu->free_pages); | 1224 | list_add(&page_header->link, &vcpu->free_pages); |
diff --git a/drivers/kvm/paging_tmpl.h b/drivers/kvm/paging_tmpl.h index b6b90e9e1301..f3bcee904651 100644 --- a/drivers/kvm/paging_tmpl.h +++ b/drivers/kvm/paging_tmpl.h | |||
@@ -128,8 +128,10 @@ static int FNAME(walk_addr)(struct guest_walker *walker, | |||
128 | goto access_error; | 128 | goto access_error; |
129 | #endif | 129 | #endif |
130 | 130 | ||
131 | if (!(*ptep & PT_ACCESSED_MASK)) | 131 | if (!(*ptep & PT_ACCESSED_MASK)) { |
132 | *ptep |= PT_ACCESSED_MASK; /* avoid rmw */ | 132 | mark_page_dirty(vcpu->kvm, table_gfn); |
133 | *ptep |= PT_ACCESSED_MASK; | ||
134 | } | ||
133 | 135 | ||
134 | if (walker->level == PT_PAGE_TABLE_LEVEL) { | 136 | if (walker->level == PT_PAGE_TABLE_LEVEL) { |
135 | walker->gfn = (*ptep & PT_BASE_ADDR_MASK) | 137 | walker->gfn = (*ptep & PT_BASE_ADDR_MASK) |
@@ -185,6 +187,12 @@ static void FNAME(release_walker)(struct guest_walker *walker) | |||
185 | kunmap_atomic(walker->table, KM_USER0); | 187 | kunmap_atomic(walker->table, KM_USER0); |
186 | } | 188 | } |
187 | 189 | ||
190 | static void FNAME(mark_pagetable_dirty)(struct kvm *kvm, | ||
191 | struct guest_walker *walker) | ||
192 | { | ||
193 | mark_page_dirty(kvm, walker->table_gfn[walker->level - 1]); | ||
194 | } | ||
195 | |||
188 | static void FNAME(set_pte)(struct kvm_vcpu *vcpu, u64 guest_pte, | 196 | static void FNAME(set_pte)(struct kvm_vcpu *vcpu, u64 guest_pte, |
189 | u64 *shadow_pte, u64 access_bits, gfn_t gfn) | 197 | u64 *shadow_pte, u64 access_bits, gfn_t gfn) |
190 | { | 198 | { |
@@ -348,12 +356,15 @@ static int FNAME(fix_write_pf)(struct kvm_vcpu *vcpu, | |||
348 | } else if (kvm_mmu_lookup_page(vcpu, gfn)) { | 356 | } else if (kvm_mmu_lookup_page(vcpu, gfn)) { |
349 | pgprintk("%s: found shadow page for %lx, marking ro\n", | 357 | pgprintk("%s: found shadow page for %lx, marking ro\n", |
350 | __FUNCTION__, gfn); | 358 | __FUNCTION__, gfn); |
359 | mark_page_dirty(vcpu->kvm, gfn); | ||
360 | FNAME(mark_pagetable_dirty)(vcpu->kvm, walker); | ||
351 | *guest_ent |= PT_DIRTY_MASK; | 361 | *guest_ent |= PT_DIRTY_MASK; |
352 | *write_pt = 1; | 362 | *write_pt = 1; |
353 | return 0; | 363 | return 0; |
354 | } | 364 | } |
355 | mark_page_dirty(vcpu->kvm, gfn); | 365 | mark_page_dirty(vcpu->kvm, gfn); |
356 | *shadow_ent |= PT_WRITABLE_MASK; | 366 | *shadow_ent |= PT_WRITABLE_MASK; |
367 | FNAME(mark_pagetable_dirty)(vcpu->kvm, walker); | ||
357 | *guest_ent |= PT_DIRTY_MASK; | 368 | *guest_ent |= PT_DIRTY_MASK; |
358 | rmap_add(vcpu, shadow_ent); | 369 | rmap_add(vcpu, shadow_ent); |
359 | 370 | ||
@@ -430,9 +441,8 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr, | |||
430 | /* | 441 | /* |
431 | * mmio: emulate if accessible, otherwise its a guest fault. | 442 | * mmio: emulate if accessible, otherwise its a guest fault. |
432 | */ | 443 | */ |
433 | if (is_io_pte(*shadow_pte)) { | 444 | if (is_io_pte(*shadow_pte)) |
434 | return 1; | 445 | return 1; |
435 | } | ||
436 | 446 | ||
437 | ++kvm_stat.pf_fixed; | 447 | ++kvm_stat.pf_fixed; |
438 | kvm_mmu_audit(vcpu, "post page fault (fixed)"); | 448 | kvm_mmu_audit(vcpu, "post page fault (fixed)"); |
diff --git a/drivers/kvm/svm.c b/drivers/kvm/svm.c index 83da4ea150a3..3d8ea7ac2ecc 100644 --- a/drivers/kvm/svm.c +++ b/drivers/kvm/svm.c | |||
@@ -15,6 +15,7 @@ | |||
15 | */ | 15 | */ |
16 | 16 | ||
17 | #include <linux/module.h> | 17 | #include <linux/module.h> |
18 | #include <linux/kernel.h> | ||
18 | #include <linux/vmalloc.h> | 19 | #include <linux/vmalloc.h> |
19 | #include <linux/highmem.h> | 20 | #include <linux/highmem.h> |
20 | #include <linux/profile.h> | 21 | #include <linux/profile.h> |
@@ -75,7 +76,7 @@ struct svm_init_data { | |||
75 | 76 | ||
76 | static u32 msrpm_ranges[] = {0, 0xc0000000, 0xc0010000}; | 77 | static u32 msrpm_ranges[] = {0, 0xc0000000, 0xc0010000}; |
77 | 78 | ||
78 | #define NUM_MSR_MAPS (sizeof(msrpm_ranges) / sizeof(*msrpm_ranges)) | 79 | #define NUM_MSR_MAPS ARRAY_SIZE(msrpm_ranges) |
79 | #define MSRS_RANGE_SIZE 2048 | 80 | #define MSRS_RANGE_SIZE 2048 |
80 | #define MSRS_IN_RANGE (MSRS_RANGE_SIZE * 8 / 2) | 81 | #define MSRS_IN_RANGE (MSRS_RANGE_SIZE * 8 / 2) |
81 | 82 | ||
@@ -485,6 +486,7 @@ static void init_vmcb(struct vmcb *vmcb) | |||
485 | 486 | ||
486 | control->intercept = (1ULL << INTERCEPT_INTR) | | 487 | control->intercept = (1ULL << INTERCEPT_INTR) | |
487 | (1ULL << INTERCEPT_NMI) | | 488 | (1ULL << INTERCEPT_NMI) | |
489 | (1ULL << INTERCEPT_SMI) | | ||
488 | /* | 490 | /* |
489 | * selective cr0 intercept bug? | 491 | * selective cr0 intercept bug? |
490 | * 0: 0f 22 d8 mov %eax,%cr3 | 492 | * 0: 0f 22 d8 mov %eax,%cr3 |
@@ -553,7 +555,7 @@ static void init_vmcb(struct vmcb *vmcb) | |||
553 | * cr0 val on cpu init should be 0x60000010, we enable cpu | 555 | * cr0 val on cpu init should be 0x60000010, we enable cpu |
554 | * cache by default. the orderly way is to enable cache in bios. | 556 | * cache by default. the orderly way is to enable cache in bios. |
555 | */ | 557 | */ |
556 | save->cr0 = 0x00000010 | CR0_PG_MASK; | 558 | save->cr0 = 0x00000010 | CR0_PG_MASK | CR0_WP_MASK; |
557 | save->cr4 = CR4_PAE_MASK; | 559 | save->cr4 = CR4_PAE_MASK; |
558 | /* rdx = ?? */ | 560 | /* rdx = ?? */ |
559 | } | 561 | } |
@@ -598,10 +600,9 @@ static void svm_free_vcpu(struct kvm_vcpu *vcpu) | |||
598 | kfree(vcpu->svm); | 600 | kfree(vcpu->svm); |
599 | } | 601 | } |
600 | 602 | ||
601 | static struct kvm_vcpu *svm_vcpu_load(struct kvm_vcpu *vcpu) | 603 | static void svm_vcpu_load(struct kvm_vcpu *vcpu) |
602 | { | 604 | { |
603 | get_cpu(); | 605 | get_cpu(); |
604 | return vcpu; | ||
605 | } | 606 | } |
606 | 607 | ||
607 | static void svm_vcpu_put(struct kvm_vcpu *vcpu) | 608 | static void svm_vcpu_put(struct kvm_vcpu *vcpu) |
@@ -1042,22 +1043,22 @@ static int io_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
1042 | 1043 | ||
1043 | addr_mask = io_adress(vcpu, _in, &kvm_run->io.address); | 1044 | addr_mask = io_adress(vcpu, _in, &kvm_run->io.address); |
1044 | if (!addr_mask) { | 1045 | if (!addr_mask) { |
1045 | printk(KERN_DEBUG "%s: get io address failed\n", __FUNCTION__); | 1046 | printk(KERN_DEBUG "%s: get io address failed\n", |
1047 | __FUNCTION__); | ||
1046 | return 1; | 1048 | return 1; |
1047 | } | 1049 | } |
1048 | 1050 | ||
1049 | if (kvm_run->io.rep) { | 1051 | if (kvm_run->io.rep) { |
1050 | kvm_run->io.count = vcpu->regs[VCPU_REGS_RCX] & addr_mask; | 1052 | kvm_run->io.count |
1053 | = vcpu->regs[VCPU_REGS_RCX] & addr_mask; | ||
1051 | kvm_run->io.string_down = (vcpu->svm->vmcb->save.rflags | 1054 | kvm_run->io.string_down = (vcpu->svm->vmcb->save.rflags |
1052 | & X86_EFLAGS_DF) != 0; | 1055 | & X86_EFLAGS_DF) != 0; |
1053 | } | 1056 | } |
1054 | } else { | 1057 | } else |
1055 | kvm_run->io.value = vcpu->svm->vmcb->save.rax; | 1058 | kvm_run->io.value = vcpu->svm->vmcb->save.rax; |
1056 | } | ||
1057 | return 0; | 1059 | return 0; |
1058 | } | 1060 | } |
1059 | 1061 | ||
1060 | |||
1061 | static int nop_on_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | 1062 | static int nop_on_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) |
1062 | { | 1063 | { |
1063 | return 1; | 1064 | return 1; |
@@ -1075,6 +1076,12 @@ static int halt_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
1075 | return 0; | 1076 | return 0; |
1076 | } | 1077 | } |
1077 | 1078 | ||
1079 | static int vmmcall_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | ||
1080 | { | ||
1081 | vcpu->svm->vmcb->save.rip += 3; | ||
1082 | return kvm_hypercall(vcpu, kvm_run); | ||
1083 | } | ||
1084 | |||
1078 | static int invalid_op_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | 1085 | static int invalid_op_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) |
1079 | { | 1086 | { |
1080 | inject_ud(vcpu); | 1087 | inject_ud(vcpu); |
@@ -1275,7 +1282,7 @@ static int (*svm_exit_handlers[])(struct kvm_vcpu *vcpu, | |||
1275 | [SVM_EXIT_TASK_SWITCH] = task_switch_interception, | 1282 | [SVM_EXIT_TASK_SWITCH] = task_switch_interception, |
1276 | [SVM_EXIT_SHUTDOWN] = shutdown_interception, | 1283 | [SVM_EXIT_SHUTDOWN] = shutdown_interception, |
1277 | [SVM_EXIT_VMRUN] = invalid_op_interception, | 1284 | [SVM_EXIT_VMRUN] = invalid_op_interception, |
1278 | [SVM_EXIT_VMMCALL] = invalid_op_interception, | 1285 | [SVM_EXIT_VMMCALL] = vmmcall_interception, |
1279 | [SVM_EXIT_VMLOAD] = invalid_op_interception, | 1286 | [SVM_EXIT_VMLOAD] = invalid_op_interception, |
1280 | [SVM_EXIT_VMSAVE] = invalid_op_interception, | 1287 | [SVM_EXIT_VMSAVE] = invalid_op_interception, |
1281 | [SVM_EXIT_STGI] = invalid_op_interception, | 1288 | [SVM_EXIT_STGI] = invalid_op_interception, |
@@ -1297,7 +1304,7 @@ static int handle_exit(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
1297 | __FUNCTION__, vcpu->svm->vmcb->control.exit_int_info, | 1304 | __FUNCTION__, vcpu->svm->vmcb->control.exit_int_info, |
1298 | exit_code); | 1305 | exit_code); |
1299 | 1306 | ||
1300 | if (exit_code >= sizeof(svm_exit_handlers) / sizeof(*svm_exit_handlers) | 1307 | if (exit_code >= ARRAY_SIZE(svm_exit_handlers) |
1301 | || svm_exit_handlers[exit_code] == 0) { | 1308 | || svm_exit_handlers[exit_code] == 0) { |
1302 | kvm_run->exit_reason = KVM_EXIT_UNKNOWN; | 1309 | kvm_run->exit_reason = KVM_EXIT_UNKNOWN; |
1303 | printk(KERN_ERR "%s: 0x%x @ 0x%llx cr0 0x%lx rflags 0x%llx\n", | 1310 | printk(KERN_ERR "%s: 0x%x @ 0x%llx cr0 0x%lx rflags 0x%llx\n", |
@@ -1668,6 +1675,18 @@ static int is_disabled(void) | |||
1668 | return 0; | 1675 | return 0; |
1669 | } | 1676 | } |
1670 | 1677 | ||
1678 | static void | ||
1679 | svm_patch_hypercall(struct kvm_vcpu *vcpu, unsigned char *hypercall) | ||
1680 | { | ||
1681 | /* | ||
1682 | * Patch in the VMMCALL instruction: | ||
1683 | */ | ||
1684 | hypercall[0] = 0x0f; | ||
1685 | hypercall[1] = 0x01; | ||
1686 | hypercall[2] = 0xd9; | ||
1687 | hypercall[3] = 0xc3; | ||
1688 | } | ||
1689 | |||
1671 | static struct kvm_arch_ops svm_arch_ops = { | 1690 | static struct kvm_arch_ops svm_arch_ops = { |
1672 | .cpu_has_kvm_support = has_svm, | 1691 | .cpu_has_kvm_support = has_svm, |
1673 | .disabled_by_bios = is_disabled, | 1692 | .disabled_by_bios = is_disabled, |
@@ -1716,6 +1735,7 @@ static struct kvm_arch_ops svm_arch_ops = { | |||
1716 | .run = svm_vcpu_run, | 1735 | .run = svm_vcpu_run, |
1717 | .skip_emulated_instruction = skip_emulated_instruction, | 1736 | .skip_emulated_instruction = skip_emulated_instruction, |
1718 | .vcpu_setup = svm_vcpu_setup, | 1737 | .vcpu_setup = svm_vcpu_setup, |
1738 | .patch_hypercall = svm_patch_hypercall, | ||
1719 | }; | 1739 | }; |
1720 | 1740 | ||
1721 | static int __init svm_init(void) | 1741 | static int __init svm_init(void) |
diff --git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c index fd4e91734388..c07178e61122 100644 --- a/drivers/kvm/vmx.c +++ b/drivers/kvm/vmx.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include "vmx.h" | 19 | #include "vmx.h" |
20 | #include "kvm_vmx.h" | 20 | #include "kvm_vmx.h" |
21 | #include <linux/module.h> | 21 | #include <linux/module.h> |
22 | #include <linux/kernel.h> | ||
22 | #include <linux/mm.h> | 23 | #include <linux/mm.h> |
23 | #include <linux/highmem.h> | 24 | #include <linux/highmem.h> |
24 | #include <linux/profile.h> | 25 | #include <linux/profile.h> |
@@ -27,7 +28,6 @@ | |||
27 | 28 | ||
28 | #include "segment_descriptor.h" | 29 | #include "segment_descriptor.h" |
29 | 30 | ||
30 | |||
31 | MODULE_AUTHOR("Qumranet"); | 31 | MODULE_AUTHOR("Qumranet"); |
32 | MODULE_LICENSE("GPL"); | 32 | MODULE_LICENSE("GPL"); |
33 | 33 | ||
@@ -76,7 +76,7 @@ static const u32 vmx_msr_index[] = { | |||
76 | #endif | 76 | #endif |
77 | MSR_EFER, MSR_K6_STAR, | 77 | MSR_EFER, MSR_K6_STAR, |
78 | }; | 78 | }; |
79 | #define NR_VMX_MSR (sizeof(vmx_msr_index) / sizeof(*vmx_msr_index)) | 79 | #define NR_VMX_MSR ARRAY_SIZE(vmx_msr_index) |
80 | 80 | ||
81 | static inline int is_page_fault(u32 intr_info) | 81 | static inline int is_page_fault(u32 intr_info) |
82 | { | 82 | { |
@@ -204,7 +204,7 @@ static void vmcs_write64(unsigned long field, u64 value) | |||
204 | * Switches to specified vcpu, until a matching vcpu_put(), but assumes | 204 | * Switches to specified vcpu, until a matching vcpu_put(), but assumes |
205 | * vcpu mutex is already taken. | 205 | * vcpu mutex is already taken. |
206 | */ | 206 | */ |
207 | static struct kvm_vcpu *vmx_vcpu_load(struct kvm_vcpu *vcpu) | 207 | static void vmx_vcpu_load(struct kvm_vcpu *vcpu) |
208 | { | 208 | { |
209 | u64 phys_addr = __pa(vcpu->vmcs); | 209 | u64 phys_addr = __pa(vcpu->vmcs); |
210 | int cpu; | 210 | int cpu; |
@@ -242,7 +242,6 @@ static struct kvm_vcpu *vmx_vcpu_load(struct kvm_vcpu *vcpu) | |||
242 | rdmsrl(MSR_IA32_SYSENTER_ESP, sysenter_esp); | 242 | rdmsrl(MSR_IA32_SYSENTER_ESP, sysenter_esp); |
243 | vmcs_writel(HOST_IA32_SYSENTER_ESP, sysenter_esp); /* 22.2.3 */ | 243 | vmcs_writel(HOST_IA32_SYSENTER_ESP, sysenter_esp); /* 22.2.3 */ |
244 | } | 244 | } |
245 | return vcpu; | ||
246 | } | 245 | } |
247 | 246 | ||
248 | static void vmx_vcpu_put(struct kvm_vcpu *vcpu) | 247 | static void vmx_vcpu_put(struct kvm_vcpu *vcpu) |
@@ -418,10 +417,9 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data) | |||
418 | case MSR_IA32_SYSENTER_ESP: | 417 | case MSR_IA32_SYSENTER_ESP: |
419 | vmcs_write32(GUEST_SYSENTER_ESP, data); | 418 | vmcs_write32(GUEST_SYSENTER_ESP, data); |
420 | break; | 419 | break; |
421 | case MSR_IA32_TIME_STAMP_COUNTER: { | 420 | case MSR_IA32_TIME_STAMP_COUNTER: |
422 | guest_write_tsc(data); | 421 | guest_write_tsc(data); |
423 | break; | 422 | break; |
424 | } | ||
425 | default: | 423 | default: |
426 | msr = find_msr_entry(vcpu, msr_index); | 424 | msr = find_msr_entry(vcpu, msr_index); |
427 | if (msr) { | 425 | if (msr) { |
@@ -793,6 +791,9 @@ static void vmx_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0) | |||
793 | */ | 791 | */ |
794 | static void vmx_set_cr0_no_modeswitch(struct kvm_vcpu *vcpu, unsigned long cr0) | 792 | static void vmx_set_cr0_no_modeswitch(struct kvm_vcpu *vcpu, unsigned long cr0) |
795 | { | 793 | { |
794 | if (!vcpu->rmode.active && !(cr0 & CR0_PE_MASK)) | ||
795 | enter_rmode(vcpu); | ||
796 | |||
796 | vcpu->rmode.active = ((cr0 & CR0_PE_MASK) == 0); | 797 | vcpu->rmode.active = ((cr0 & CR0_PE_MASK) == 0); |
797 | update_exception_bitmap(vcpu); | 798 | update_exception_bitmap(vcpu); |
798 | vmcs_writel(CR0_READ_SHADOW, cr0); | 799 | vmcs_writel(CR0_READ_SHADOW, cr0); |
@@ -1467,6 +1468,18 @@ static int handle_io(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
1467 | return 0; | 1468 | return 0; |
1468 | } | 1469 | } |
1469 | 1470 | ||
1471 | static void | ||
1472 | vmx_patch_hypercall(struct kvm_vcpu *vcpu, unsigned char *hypercall) | ||
1473 | { | ||
1474 | /* | ||
1475 | * Patch in the VMCALL instruction: | ||
1476 | */ | ||
1477 | hypercall[0] = 0x0f; | ||
1478 | hypercall[1] = 0x01; | ||
1479 | hypercall[2] = 0xc1; | ||
1480 | hypercall[3] = 0xc3; | ||
1481 | } | ||
1482 | |||
1470 | static int handle_cr(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | 1483 | static int handle_cr(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) |
1471 | { | 1484 | { |
1472 | u64 exit_qualification; | 1485 | u64 exit_qualification; |
@@ -1643,6 +1656,12 @@ static int handle_halt(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
1643 | return 0; | 1656 | return 0; |
1644 | } | 1657 | } |
1645 | 1658 | ||
1659 | static int handle_vmcall(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | ||
1660 | { | ||
1661 | vmcs_writel(GUEST_RIP, vmcs_readl(GUEST_RIP)+3); | ||
1662 | return kvm_hypercall(vcpu, kvm_run); | ||
1663 | } | ||
1664 | |||
1646 | /* | 1665 | /* |
1647 | * The exit handlers return 1 if the exit was handled fully and guest execution | 1666 | * The exit handlers return 1 if the exit was handled fully and guest execution |
1648 | * may resume. Otherwise they set the kvm_run parameter to indicate what needs | 1667 | * may resume. Otherwise they set the kvm_run parameter to indicate what needs |
@@ -1661,6 +1680,7 @@ static int (*kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu, | |||
1661 | [EXIT_REASON_MSR_WRITE] = handle_wrmsr, | 1680 | [EXIT_REASON_MSR_WRITE] = handle_wrmsr, |
1662 | [EXIT_REASON_PENDING_INTERRUPT] = handle_interrupt_window, | 1681 | [EXIT_REASON_PENDING_INTERRUPT] = handle_interrupt_window, |
1663 | [EXIT_REASON_HLT] = handle_halt, | 1682 | [EXIT_REASON_HLT] = handle_halt, |
1683 | [EXIT_REASON_VMCALL] = handle_vmcall, | ||
1664 | }; | 1684 | }; |
1665 | 1685 | ||
1666 | static const int kvm_vmx_max_exit_handlers = | 1686 | static const int kvm_vmx_max_exit_handlers = |
@@ -2062,6 +2082,7 @@ static struct kvm_arch_ops vmx_arch_ops = { | |||
2062 | .run = vmx_vcpu_run, | 2082 | .run = vmx_vcpu_run, |
2063 | .skip_emulated_instruction = skip_emulated_instruction, | 2083 | .skip_emulated_instruction = skip_emulated_instruction, |
2064 | .vcpu_setup = vmx_vcpu_setup, | 2084 | .vcpu_setup = vmx_vcpu_setup, |
2085 | .patch_hypercall = vmx_patch_hypercall, | ||
2065 | }; | 2086 | }; |
2066 | 2087 | ||
2067 | static int __init vmx_init(void) | 2088 | static int __init vmx_init(void) |
diff --git a/drivers/media/video/cx88/cx88-blackbird.c b/drivers/media/video/cx88/cx88-blackbird.c index a1be1e279df4..b0466b88f52c 100644 --- a/drivers/media/video/cx88/cx88-blackbird.c +++ b/drivers/media/video/cx88/cx88-blackbird.c | |||
@@ -56,7 +56,8 @@ MODULE_PARM_DESC(debug,"enable debug messages [blackbird]"); | |||
56 | 56 | ||
57 | /* ------------------------------------------------------------------ */ | 57 | /* ------------------------------------------------------------------ */ |
58 | 58 | ||
59 | #define BLACKBIRD_FIRM_IMAGE_SIZE 256*1024 | 59 | #define OLD_BLACKBIRD_FIRM_IMAGE_SIZE 262144 |
60 | #define BLACKBIRD_FIRM_IMAGE_SIZE 376836 | ||
60 | 61 | ||
61 | /* defines below are from ivtv-driver.h */ | 62 | /* defines below are from ivtv-driver.h */ |
62 | 63 | ||
@@ -404,7 +405,7 @@ static int blackbird_find_mailbox(struct cx8802_dev *dev) | |||
404 | u32 value; | 405 | u32 value; |
405 | int i; | 406 | int i; |
406 | 407 | ||
407 | for (i = 0; i < BLACKBIRD_FIRM_IMAGE_SIZE; i++) { | 408 | for (i = 0; i < dev->fw_size; i++) { |
408 | memory_read(dev->core, i, &value); | 409 | memory_read(dev->core, i, &value); |
409 | if (value == signature[signaturecnt]) | 410 | if (value == signature[signaturecnt]) |
410 | signaturecnt++; | 411 | signaturecnt++; |
@@ -452,12 +453,15 @@ static int blackbird_load_firmware(struct cx8802_dev *dev) | |||
452 | return -1; | 453 | return -1; |
453 | } | 454 | } |
454 | 455 | ||
455 | if (firmware->size != BLACKBIRD_FIRM_IMAGE_SIZE) { | 456 | if ((firmware->size != BLACKBIRD_FIRM_IMAGE_SIZE) && |
456 | dprintk(0, "ERROR: Firmware size mismatch (have %zd, expected %d)\n", | 457 | (firmware->size != OLD_BLACKBIRD_FIRM_IMAGE_SIZE)) { |
457 | firmware->size, BLACKBIRD_FIRM_IMAGE_SIZE); | 458 | dprintk(0, "ERROR: Firmware size mismatch (have %zd, expected %d or %d)\n", |
459 | firmware->size, BLACKBIRD_FIRM_IMAGE_SIZE, | ||
460 | OLD_BLACKBIRD_FIRM_IMAGE_SIZE); | ||
458 | release_firmware(firmware); | 461 | release_firmware(firmware); |
459 | return -1; | 462 | return -1; |
460 | } | 463 | } |
464 | dev->fw_size = firmware->size; | ||
461 | 465 | ||
462 | if (0 != memcmp(firmware->data, magic, 8)) { | 466 | if (0 != memcmp(firmware->data, magic, 8)) { |
463 | dprintk(0, "ERROR: Firmware magic mismatch, wrong file?\n"); | 467 | dprintk(0, "ERROR: Firmware magic mismatch, wrong file?\n"); |
diff --git a/drivers/media/video/cx88/cx88.h b/drivers/media/video/cx88/cx88.h index d2ecfba9bb4d..a4f7befda5b0 100644 --- a/drivers/media/video/cx88/cx88.h +++ b/drivers/media/video/cx88/cx88.h | |||
@@ -463,6 +463,7 @@ struct cx8802_dev { | |||
463 | u32 mailbox; | 463 | u32 mailbox; |
464 | int width; | 464 | int width; |
465 | int height; | 465 | int height; |
466 | int fw_size; | ||
466 | 467 | ||
467 | #if defined(CONFIG_VIDEO_BUF_DVB) || defined(CONFIG_VIDEO_BUF_DVB_MODULE) | 468 | #if defined(CONFIG_VIDEO_BUF_DVB) || defined(CONFIG_VIDEO_BUF_DVB_MODULE) |
468 | /* for dvb only */ | 469 | /* for dvb only */ |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c index 1cd4bb3ae260..1ff5138e4bb6 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c | |||
@@ -1268,7 +1268,7 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw) | |||
1268 | if (fw_len % sizeof(u32)) { | 1268 | if (fw_len % sizeof(u32)) { |
1269 | pvr2_trace(PVR2_TRACE_ERROR_LEGS, | 1269 | pvr2_trace(PVR2_TRACE_ERROR_LEGS, |
1270 | "size of %s firmware" | 1270 | "size of %s firmware" |
1271 | " must be a multiple of %u bytes", | 1271 | " must be a multiple of %zu bytes", |
1272 | fw_files[fwidx],sizeof(u32)); | 1272 | fw_files[fwidx],sizeof(u32)); |
1273 | release_firmware(fw_entry); | 1273 | release_firmware(fw_entry); |
1274 | return -1; | 1274 | return -1; |
diff --git a/drivers/net/8139cp.c b/drivers/net/8139cp.c index 6f93a765e564..12c8453f44bc 100644 --- a/drivers/net/8139cp.c +++ b/drivers/net/8139cp.c | |||
@@ -448,8 +448,7 @@ static void cp_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | |||
448 | spin_lock_irqsave(&cp->lock, flags); | 448 | spin_lock_irqsave(&cp->lock, flags); |
449 | cp->cpcmd &= ~RxVlanOn; | 449 | cp->cpcmd &= ~RxVlanOn; |
450 | cpw16(CpCmd, cp->cpcmd); | 450 | cpw16(CpCmd, cp->cpcmd); |
451 | if (cp->vlgrp) | 451 | vlan_group_set_device(cp->vlgrp, vid, NULL); |
452 | cp->vlgrp->vlan_devices[vid] = NULL; | ||
453 | spin_unlock_irqrestore(&cp->lock, flags); | 452 | spin_unlock_irqrestore(&cp->lock, flags); |
454 | } | 453 | } |
455 | #endif /* CP_VLAN_TAG_USED */ | 454 | #endif /* CP_VLAN_TAG_USED */ |
diff --git a/drivers/net/acenic.c b/drivers/net/acenic.c index 33c6645455ae..7138e0e025bc 100644 --- a/drivers/net/acenic.c +++ b/drivers/net/acenic.c | |||
@@ -2293,10 +2293,7 @@ static void ace_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | |||
2293 | 2293 | ||
2294 | local_irq_save(flags); | 2294 | local_irq_save(flags); |
2295 | ace_mask_irq(dev); | 2295 | ace_mask_irq(dev); |
2296 | 2296 | vlan_group_set_device(ap->vlgrp, vid, NULL); | |
2297 | if (ap->vlgrp) | ||
2298 | ap->vlgrp->vlan_devices[vid] = NULL; | ||
2299 | |||
2300 | ace_unmask_irq(dev); | 2297 | ace_unmask_irq(dev); |
2301 | local_irq_restore(flags); | 2298 | local_irq_restore(flags); |
2302 | } | 2299 | } |
diff --git a/drivers/net/amd8111e.c b/drivers/net/amd8111e.c index 9c399aaefbdd..962c954c2d56 100644 --- a/drivers/net/amd8111e.c +++ b/drivers/net/amd8111e.c | |||
@@ -1737,8 +1737,7 @@ static void amd8111e_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid | |||
1737 | { | 1737 | { |
1738 | struct amd8111e_priv *lp = netdev_priv(dev); | 1738 | struct amd8111e_priv *lp = netdev_priv(dev); |
1739 | spin_lock_irq(&lp->lock); | 1739 | spin_lock_irq(&lp->lock); |
1740 | if (lp->vlgrp) | 1740 | vlan_group_set_device(lp->vlgrp, vid, NULL); |
1741 | lp->vlgrp->vlan_devices[vid] = NULL; | ||
1742 | spin_unlock_irq(&lp->lock); | 1741 | spin_unlock_irq(&lp->lock); |
1743 | } | 1742 | } |
1744 | #endif | 1743 | #endif |
diff --git a/drivers/net/atl1/atl1_main.c b/drivers/net/atl1/atl1_main.c index 65673485bb6b..88d4f70035bb 100644 --- a/drivers/net/atl1/atl1_main.c +++ b/drivers/net/atl1/atl1_main.c | |||
@@ -1252,8 +1252,7 @@ static void atl1_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) | |||
1252 | 1252 | ||
1253 | spin_lock_irqsave(&adapter->lock, flags); | 1253 | spin_lock_irqsave(&adapter->lock, flags); |
1254 | /* atl1_irq_disable(adapter); */ | 1254 | /* atl1_irq_disable(adapter); */ |
1255 | if (adapter->vlgrp) | 1255 | vlan_group_set_device(adapter->vlgrp, vid, NULL); |
1256 | adapter->vlgrp->vlan_devices[vid] = NULL; | ||
1257 | /* atl1_irq_enable(adapter); */ | 1256 | /* atl1_irq_enable(adapter); */ |
1258 | spin_unlock_irqrestore(&adapter->lock, flags); | 1257 | spin_unlock_irqrestore(&adapter->lock, flags); |
1259 | /* We don't do Vlan filtering */ | 1258 | /* We don't do Vlan filtering */ |
@@ -1266,7 +1265,7 @@ static void atl1_restore_vlan(struct atl1_adapter *adapter) | |||
1266 | if (adapter->vlgrp) { | 1265 | if (adapter->vlgrp) { |
1267 | u16 vid; | 1266 | u16 vid; |
1268 | for (vid = 0; vid < VLAN_GROUP_ARRAY_LEN; vid++) { | 1267 | for (vid = 0; vid < VLAN_GROUP_ARRAY_LEN; vid++) { |
1269 | if (!adapter->vlgrp->vlan_devices[vid]) | 1268 | if (!vlan_group_get_device(adapter->vlgrp, vid)) |
1270 | continue; | 1269 | continue; |
1271 | atl1_vlan_rx_add_vid(adapter->netdev, vid); | 1270 | atl1_vlan_rx_add_vid(adapter->netdev, vid); |
1272 | } | 1271 | } |
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 5a96d7611af1..c12e5ea61819 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
@@ -4467,9 +4467,7 @@ bnx2_vlan_rx_kill_vid(struct net_device *dev, uint16_t vid) | |||
4467 | struct bnx2 *bp = netdev_priv(dev); | 4467 | struct bnx2 *bp = netdev_priv(dev); |
4468 | 4468 | ||
4469 | bnx2_netif_stop(bp); | 4469 | bnx2_netif_stop(bp); |
4470 | 4470 | vlan_group_set_device(bp->vlgrp, vid, NULL); | |
4471 | if (bp->vlgrp) | ||
4472 | bp->vlgrp->vlan_devices[vid] = NULL; | ||
4473 | bnx2_set_rx_mode(dev); | 4471 | bnx2_set_rx_mode(dev); |
4474 | 4472 | ||
4475 | bnx2_netif_start(bp); | 4473 | bnx2_netif_start(bp); |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index a7c8f98a890c..ea73ebff4387 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -488,9 +488,9 @@ static void bond_vlan_rx_kill_vid(struct net_device *bond_dev, uint16_t vid) | |||
488 | /* Save and then restore vlan_dev in the grp array, | 488 | /* Save and then restore vlan_dev in the grp array, |
489 | * since the slave's driver might clear it. | 489 | * since the slave's driver might clear it. |
490 | */ | 490 | */ |
491 | vlan_dev = bond->vlgrp->vlan_devices[vid]; | 491 | vlan_dev = vlan_group_get_device(bond->vlgrp, vid); |
492 | slave_dev->vlan_rx_kill_vid(slave_dev, vid); | 492 | slave_dev->vlan_rx_kill_vid(slave_dev, vid); |
493 | bond->vlgrp->vlan_devices[vid] = vlan_dev; | 493 | vlan_group_set_device(bond->vlgrp, vid, vlan_dev); |
494 | } | 494 | } |
495 | } | 495 | } |
496 | 496 | ||
@@ -550,9 +550,9 @@ static void bond_del_vlans_from_slave(struct bonding *bond, struct net_device *s | |||
550 | /* Save and then restore vlan_dev in the grp array, | 550 | /* Save and then restore vlan_dev in the grp array, |
551 | * since the slave's driver might clear it. | 551 | * since the slave's driver might clear it. |
552 | */ | 552 | */ |
553 | vlan_dev = bond->vlgrp->vlan_devices[vlan->vlan_id]; | 553 | vlan_dev = vlan_group_get_device(bond->vlgrp, vlan->vlan_id); |
554 | slave_dev->vlan_rx_kill_vid(slave_dev, vlan->vlan_id); | 554 | slave_dev->vlan_rx_kill_vid(slave_dev, vlan->vlan_id); |
555 | bond->vlgrp->vlan_devices[vlan->vlan_id] = vlan_dev; | 555 | vlan_group_set_device(bond->vlgrp, vlan->vlan_id, vlan_dev); |
556 | } | 556 | } |
557 | 557 | ||
558 | unreg: | 558 | unreg: |
@@ -2397,7 +2397,7 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave) | |||
2397 | vlan_id = 0; | 2397 | vlan_id = 0; |
2398 | list_for_each_entry_safe(vlan, vlan_next, &bond->vlan_list, | 2398 | list_for_each_entry_safe(vlan, vlan_next, &bond->vlan_list, |
2399 | vlan_list) { | 2399 | vlan_list) { |
2400 | vlan_dev = bond->vlgrp->vlan_devices[vlan->vlan_id]; | 2400 | vlan_dev = vlan_group_get_device(bond->vlgrp, vlan->vlan_id); |
2401 | if (vlan_dev == rt->u.dst.dev) { | 2401 | if (vlan_dev == rt->u.dst.dev) { |
2402 | vlan_id = vlan->vlan_id; | 2402 | vlan_id = vlan->vlan_id; |
2403 | dprintk("basa: vlan match on %s %d\n", | 2403 | dprintk("basa: vlan match on %s %d\n", |
@@ -2444,7 +2444,7 @@ static void bond_send_gratuitous_arp(struct bonding *bond) | |||
2444 | } | 2444 | } |
2445 | 2445 | ||
2446 | list_for_each_entry(vlan, &bond->vlan_list, vlan_list) { | 2446 | list_for_each_entry(vlan, &bond->vlan_list, vlan_list) { |
2447 | vlan_dev = bond->vlgrp->vlan_devices[vlan->vlan_id]; | 2447 | vlan_dev = vlan_group_get_device(bond->vlgrp, vlan->vlan_id); |
2448 | if (vlan->vlan_ip) { | 2448 | if (vlan->vlan_ip) { |
2449 | bond_arp_send(slave->dev, ARPOP_REPLY, vlan->vlan_ip, | 2449 | bond_arp_send(slave->dev, ARPOP_REPLY, vlan->vlan_ip, |
2450 | vlan->vlan_ip, vlan->vlan_id); | 2450 | vlan->vlan_ip, vlan->vlan_id); |
@@ -3371,7 +3371,7 @@ static int bond_inetaddr_event(struct notifier_block *this, unsigned long event, | |||
3371 | 3371 | ||
3372 | list_for_each_entry_safe(vlan, vlan_next, &bond->vlan_list, | 3372 | list_for_each_entry_safe(vlan, vlan_next, &bond->vlan_list, |
3373 | vlan_list) { | 3373 | vlan_list) { |
3374 | vlan_dev = bond->vlgrp->vlan_devices[vlan->vlan_id]; | 3374 | vlan_dev = vlan_group_get_device(bond->vlgrp, vlan->vlan_id); |
3375 | if (vlan_dev == event_dev) { | 3375 | if (vlan_dev == event_dev) { |
3376 | switch (event) { | 3376 | switch (event) { |
3377 | case NETDEV_UP: | 3377 | case NETDEV_UP: |
diff --git a/drivers/net/chelsio/cxgb2.c b/drivers/net/chelsio/cxgb2.c index 7d0f24f69777..125c9b105869 100644 --- a/drivers/net/chelsio/cxgb2.c +++ b/drivers/net/chelsio/cxgb2.c | |||
@@ -889,8 +889,7 @@ static void vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | |||
889 | struct adapter *adapter = dev->priv; | 889 | struct adapter *adapter = dev->priv; |
890 | 890 | ||
891 | spin_lock_irq(&adapter->async_lock); | 891 | spin_lock_irq(&adapter->async_lock); |
892 | if (adapter->vlan_grp) | 892 | vlan_group_set_device(adapter->vlan_grp, vid, NULL); |
893 | adapter->vlan_grp->vlan_devices[vid] = NULL; | ||
894 | spin_unlock_irq(&adapter->async_lock); | 893 | spin_unlock_irq(&adapter->async_lock); |
895 | } | 894 | } |
896 | #endif | 895 | #endif |
diff --git a/drivers/net/cxgb3/cxgb3_offload.c b/drivers/net/cxgb3/cxgb3_offload.c index b2cf5f6feb4a..f6ed033efb56 100644 --- a/drivers/net/cxgb3/cxgb3_offload.c +++ b/drivers/net/cxgb3/cxgb3_offload.c | |||
@@ -160,14 +160,16 @@ static struct net_device *get_iff_from_mac(struct adapter *adapter, | |||
160 | int i; | 160 | int i; |
161 | 161 | ||
162 | for_each_port(adapter, i) { | 162 | for_each_port(adapter, i) { |
163 | const struct vlan_group *grp; | 163 | struct vlan_group *grp; |
164 | struct net_device *dev = adapter->port[i]; | 164 | struct net_device *dev = adapter->port[i]; |
165 | const struct port_info *p = netdev_priv(dev); | 165 | const struct port_info *p = netdev_priv(dev); |
166 | 166 | ||
167 | if (!memcmp(dev->dev_addr, mac, ETH_ALEN)) { | 167 | if (!memcmp(dev->dev_addr, mac, ETH_ALEN)) { |
168 | if (vlan && vlan != VLAN_VID_MASK) { | 168 | if (vlan && vlan != VLAN_VID_MASK) { |
169 | grp = p->vlan_grp; | 169 | grp = p->vlan_grp; |
170 | dev = grp ? grp->vlan_devices[vlan] : NULL; | 170 | dev = NULL; |
171 | if (grp) | ||
172 | dev = vlan_group_get_device(grp, vlan); | ||
171 | } else | 173 | } else |
172 | while (dev->master) | 174 | while (dev->master) |
173 | dev = dev->master; | 175 | dev = dev->master; |
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index 98215fdd7d10..1d08e937af82 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -376,7 +376,7 @@ e1000_update_mng_vlan(struct e1000_adapter *adapter) | |||
376 | uint16_t vid = adapter->hw.mng_cookie.vlan_id; | 376 | uint16_t vid = adapter->hw.mng_cookie.vlan_id; |
377 | uint16_t old_vid = adapter->mng_vlan_id; | 377 | uint16_t old_vid = adapter->mng_vlan_id; |
378 | if (adapter->vlgrp) { | 378 | if (adapter->vlgrp) { |
379 | if (!adapter->vlgrp->vlan_devices[vid]) { | 379 | if (!vlan_group_get_device(adapter->vlgrp, vid)) { |
380 | if (adapter->hw.mng_cookie.status & | 380 | if (adapter->hw.mng_cookie.status & |
381 | E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) { | 381 | E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) { |
382 | e1000_vlan_rx_add_vid(netdev, vid); | 382 | e1000_vlan_rx_add_vid(netdev, vid); |
@@ -386,7 +386,7 @@ e1000_update_mng_vlan(struct e1000_adapter *adapter) | |||
386 | 386 | ||
387 | if ((old_vid != (uint16_t)E1000_MNG_VLAN_NONE) && | 387 | if ((old_vid != (uint16_t)E1000_MNG_VLAN_NONE) && |
388 | (vid != old_vid) && | 388 | (vid != old_vid) && |
389 | !adapter->vlgrp->vlan_devices[old_vid]) | 389 | !vlan_group_get_device(adapter->vlgrp, old_vid)) |
390 | e1000_vlan_rx_kill_vid(netdev, old_vid); | 390 | e1000_vlan_rx_kill_vid(netdev, old_vid); |
391 | } else | 391 | } else |
392 | adapter->mng_vlan_id = vid; | 392 | adapter->mng_vlan_id = vid; |
@@ -1482,7 +1482,7 @@ e1000_close(struct net_device *netdev) | |||
1482 | if ((adapter->hw.mng_cookie.status & | 1482 | if ((adapter->hw.mng_cookie.status & |
1483 | E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) && | 1483 | E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) && |
1484 | !(adapter->vlgrp && | 1484 | !(adapter->vlgrp && |
1485 | adapter->vlgrp->vlan_devices[adapter->mng_vlan_id])) { | 1485 | vlan_group_get_device(adapter->vlgrp, adapter->mng_vlan_id))) { |
1486 | e1000_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id); | 1486 | e1000_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id); |
1487 | } | 1487 | } |
1488 | 1488 | ||
@@ -4998,10 +4998,7 @@ e1000_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid) | |||
4998 | uint32_t vfta, index; | 4998 | uint32_t vfta, index; |
4999 | 4999 | ||
5000 | e1000_irq_disable(adapter); | 5000 | e1000_irq_disable(adapter); |
5001 | 5001 | vlan_group_set_device(adapter->vlgrp, vid, NULL); | |
5002 | if (adapter->vlgrp) | ||
5003 | adapter->vlgrp->vlan_devices[vid] = NULL; | ||
5004 | |||
5005 | e1000_irq_enable(adapter); | 5002 | e1000_irq_enable(adapter); |
5006 | 5003 | ||
5007 | if ((adapter->hw.mng_cookie.status & | 5004 | if ((adapter->hw.mng_cookie.status & |
@@ -5027,7 +5024,7 @@ e1000_restore_vlan(struct e1000_adapter *adapter) | |||
5027 | if (adapter->vlgrp) { | 5024 | if (adapter->vlgrp) { |
5028 | uint16_t vid; | 5025 | uint16_t vid; |
5029 | for (vid = 0; vid < VLAN_GROUP_ARRAY_LEN; vid++) { | 5026 | for (vid = 0; vid < VLAN_GROUP_ARRAY_LEN; vid++) { |
5030 | if (!adapter->vlgrp->vlan_devices[vid]) | 5027 | if (!vlan_group_get_device(adapter->vlgrp, vid)) |
5031 | continue; | 5028 | continue; |
5032 | e1000_vlan_rx_add_vid(adapter->netdev, vid); | 5029 | e1000_vlan_rx_add_vid(adapter->netdev, vid); |
5033 | } | 5030 | } |
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c index 88ad1c8bcee4..0e4042bc0a48 100644 --- a/drivers/net/ehea/ehea_main.c +++ b/drivers/net/ehea/ehea_main.c | |||
@@ -1939,8 +1939,7 @@ static void ehea_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | |||
1939 | int index; | 1939 | int index; |
1940 | u64 hret; | 1940 | u64 hret; |
1941 | 1941 | ||
1942 | if (port->vgrp) | 1942 | vlan_group_set_device(port->vgrp, vid, NULL); |
1943 | port->vgrp->vlan_devices[vid] = NULL; | ||
1944 | 1943 | ||
1945 | cb1 = kzalloc(PAGE_SIZE, GFP_KERNEL); | 1944 | cb1 = kzalloc(PAGE_SIZE, GFP_KERNEL); |
1946 | if (!cb1) { | 1945 | if (!cb1) { |
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index 1f83988a6a64..02b61b85b62c 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
@@ -1132,8 +1132,7 @@ static void gfar_vlan_rx_kill_vid(struct net_device *dev, uint16_t vid) | |||
1132 | 1132 | ||
1133 | spin_lock_irqsave(&priv->rxlock, flags); | 1133 | spin_lock_irqsave(&priv->rxlock, flags); |
1134 | 1134 | ||
1135 | if (priv->vlgrp) | 1135 | vlan_group_set_device(priv->vgrp, vid, NULL); |
1136 | priv->vlgrp->vlan_devices[vid] = NULL; | ||
1137 | 1136 | ||
1138 | spin_unlock_irqrestore(&priv->rxlock, flags); | 1137 | spin_unlock_irqrestore(&priv->rxlock, flags); |
1139 | } | 1138 | } |
diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c index 0c3682889344..afc2ec72529e 100644 --- a/drivers/net/ixgb/ixgb_main.c +++ b/drivers/net/ixgb/ixgb_main.c | |||
@@ -2213,8 +2213,7 @@ ixgb_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid) | |||
2213 | 2213 | ||
2214 | ixgb_irq_disable(adapter); | 2214 | ixgb_irq_disable(adapter); |
2215 | 2215 | ||
2216 | if(adapter->vlgrp) | 2216 | vlan_group_set_device(adapter->vlgrp, vid, NULL); |
2217 | adapter->vlgrp->vlan_devices[vid] = NULL; | ||
2218 | 2217 | ||
2219 | ixgb_irq_enable(adapter); | 2218 | ixgb_irq_enable(adapter); |
2220 | 2219 | ||
@@ -2234,7 +2233,7 @@ ixgb_restore_vlan(struct ixgb_adapter *adapter) | |||
2234 | if(adapter->vlgrp) { | 2233 | if(adapter->vlgrp) { |
2235 | uint16_t vid; | 2234 | uint16_t vid; |
2236 | for(vid = 0; vid < VLAN_GROUP_ARRAY_LEN; vid++) { | 2235 | for(vid = 0; vid < VLAN_GROUP_ARRAY_LEN; vid++) { |
2237 | if(!adapter->vlgrp->vlan_devices[vid]) | 2236 | if(!vlan_group_get_device(adapter->vlgrp, vid)) |
2238 | continue; | 2237 | continue; |
2239 | ixgb_vlan_rx_add_vid(adapter->netdev, vid); | 2238 | ixgb_vlan_rx_add_vid(adapter->netdev, vid); |
2240 | } | 2239 | } |
diff --git a/drivers/net/ns83820.c b/drivers/net/ns83820.c index 568daeb3e9d8..9ec6e9e54f47 100644 --- a/drivers/net/ns83820.c +++ b/drivers/net/ns83820.c | |||
@@ -514,8 +514,7 @@ static void ns83820_vlan_rx_kill_vid(struct net_device *ndev, unsigned short vid | |||
514 | 514 | ||
515 | spin_lock_irq(&dev->misc_lock); | 515 | spin_lock_irq(&dev->misc_lock); |
516 | spin_lock(&dev->tx_lock); | 516 | spin_lock(&dev->tx_lock); |
517 | if (dev->vlgrp) | 517 | vlan_group_set_device(dev->vlgrp, vid, NULL); |
518 | dev->vlgrp->vlan_devices[vid] = NULL; | ||
519 | spin_unlock(&dev->tx_lock); | 518 | spin_unlock(&dev->tx_lock); |
520 | spin_unlock_irq(&dev->misc_lock); | 519 | spin_unlock_irq(&dev->misc_lock); |
521 | } | 520 | } |
diff --git a/drivers/net/pppoe.c b/drivers/net/pppoe.c index 860bb0f60f68..86e56f1f2f0b 100644 --- a/drivers/net/pppoe.c +++ b/drivers/net/pppoe.c | |||
@@ -7,6 +7,12 @@ | |||
7 | * | 7 | * |
8 | * Version: 0.7.0 | 8 | * Version: 0.7.0 |
9 | * | 9 | * |
10 | * 070228 : Fix to allow multiple sessions with same remote MAC and same | ||
11 | * session id by including the local device ifindex in the | ||
12 | * tuple identifying a session. This also ensures packets can't | ||
13 | * be injected into a session from interfaces other than the one | ||
14 | * specified by userspace. Florian Zumbiehl <florz@florz.de> | ||
15 | * (Oh, BTW, this one is YYMMDD, in case you were wondering ...) | ||
10 | * 220102 : Fix module use count on failure in pppoe_create, pppox_sk -acme | 16 | * 220102 : Fix module use count on failure in pppoe_create, pppox_sk -acme |
11 | * 030700 : Fixed connect logic to allow for disconnect. | 17 | * 030700 : Fixed connect logic to allow for disconnect. |
12 | * 270700 : Fixed potential SMP problems; we must protect against | 18 | * 270700 : Fixed potential SMP problems; we must protect against |
@@ -127,14 +133,14 @@ static struct pppox_sock *item_hash_table[PPPOE_HASH_SIZE]; | |||
127 | * Set/get/delete/rehash items (internal versions) | 133 | * Set/get/delete/rehash items (internal versions) |
128 | * | 134 | * |
129 | **********************************************************************/ | 135 | **********************************************************************/ |
130 | static struct pppox_sock *__get_item(unsigned long sid, unsigned char *addr) | 136 | static struct pppox_sock *__get_item(unsigned long sid, unsigned char *addr, int ifindex) |
131 | { | 137 | { |
132 | int hash = hash_item(sid, addr); | 138 | int hash = hash_item(sid, addr); |
133 | struct pppox_sock *ret; | 139 | struct pppox_sock *ret; |
134 | 140 | ||
135 | ret = item_hash_table[hash]; | 141 | ret = item_hash_table[hash]; |
136 | 142 | ||
137 | while (ret && !cmp_addr(&ret->pppoe_pa, sid, addr)) | 143 | while (ret && !(cmp_addr(&ret->pppoe_pa, sid, addr) && ret->pppoe_dev->ifindex == ifindex)) |
138 | ret = ret->next; | 144 | ret = ret->next; |
139 | 145 | ||
140 | return ret; | 146 | return ret; |
@@ -147,21 +153,19 @@ static int __set_item(struct pppox_sock *po) | |||
147 | 153 | ||
148 | ret = item_hash_table[hash]; | 154 | ret = item_hash_table[hash]; |
149 | while (ret) { | 155 | while (ret) { |
150 | if (cmp_2_addr(&ret->pppoe_pa, &po->pppoe_pa)) | 156 | if (cmp_2_addr(&ret->pppoe_pa, &po->pppoe_pa) && ret->pppoe_dev->ifindex == po->pppoe_dev->ifindex) |
151 | return -EALREADY; | 157 | return -EALREADY; |
152 | 158 | ||
153 | ret = ret->next; | 159 | ret = ret->next; |
154 | } | 160 | } |
155 | 161 | ||
156 | if (!ret) { | 162 | po->next = item_hash_table[hash]; |
157 | po->next = item_hash_table[hash]; | 163 | item_hash_table[hash] = po; |
158 | item_hash_table[hash] = po; | ||
159 | } | ||
160 | 164 | ||
161 | return 0; | 165 | return 0; |
162 | } | 166 | } |
163 | 167 | ||
164 | static struct pppox_sock *__delete_item(unsigned long sid, char *addr) | 168 | static struct pppox_sock *__delete_item(unsigned long sid, char *addr, int ifindex) |
165 | { | 169 | { |
166 | int hash = hash_item(sid, addr); | 170 | int hash = hash_item(sid, addr); |
167 | struct pppox_sock *ret, **src; | 171 | struct pppox_sock *ret, **src; |
@@ -170,7 +174,7 @@ static struct pppox_sock *__delete_item(unsigned long sid, char *addr) | |||
170 | src = &item_hash_table[hash]; | 174 | src = &item_hash_table[hash]; |
171 | 175 | ||
172 | while (ret) { | 176 | while (ret) { |
173 | if (cmp_addr(&ret->pppoe_pa, sid, addr)) { | 177 | if (cmp_addr(&ret->pppoe_pa, sid, addr) && ret->pppoe_dev->ifindex == ifindex) { |
174 | *src = ret->next; | 178 | *src = ret->next; |
175 | break; | 179 | break; |
176 | } | 180 | } |
@@ -188,12 +192,12 @@ static struct pppox_sock *__delete_item(unsigned long sid, char *addr) | |||
188 | * | 192 | * |
189 | **********************************************************************/ | 193 | **********************************************************************/ |
190 | static inline struct pppox_sock *get_item(unsigned long sid, | 194 | static inline struct pppox_sock *get_item(unsigned long sid, |
191 | unsigned char *addr) | 195 | unsigned char *addr, int ifindex) |
192 | { | 196 | { |
193 | struct pppox_sock *po; | 197 | struct pppox_sock *po; |
194 | 198 | ||
195 | read_lock_bh(&pppoe_hash_lock); | 199 | read_lock_bh(&pppoe_hash_lock); |
196 | po = __get_item(sid, addr); | 200 | po = __get_item(sid, addr, ifindex); |
197 | if (po) | 201 | if (po) |
198 | sock_hold(sk_pppox(po)); | 202 | sock_hold(sk_pppox(po)); |
199 | read_unlock_bh(&pppoe_hash_lock); | 203 | read_unlock_bh(&pppoe_hash_lock); |
@@ -203,7 +207,15 @@ static inline struct pppox_sock *get_item(unsigned long sid, | |||
203 | 207 | ||
204 | static inline struct pppox_sock *get_item_by_addr(struct sockaddr_pppox *sp) | 208 | static inline struct pppox_sock *get_item_by_addr(struct sockaddr_pppox *sp) |
205 | { | 209 | { |
206 | return get_item(sp->sa_addr.pppoe.sid, sp->sa_addr.pppoe.remote); | 210 | struct net_device *dev = NULL; |
211 | int ifindex; | ||
212 | |||
213 | dev = dev_get_by_name(sp->sa_addr.pppoe.dev); | ||
214 | if(!dev) | ||
215 | return NULL; | ||
216 | ifindex = dev->ifindex; | ||
217 | dev_put(dev); | ||
218 | return get_item(sp->sa_addr.pppoe.sid, sp->sa_addr.pppoe.remote, ifindex); | ||
207 | } | 219 | } |
208 | 220 | ||
209 | static inline int set_item(struct pppox_sock *po) | 221 | static inline int set_item(struct pppox_sock *po) |
@@ -220,12 +232,12 @@ static inline int set_item(struct pppox_sock *po) | |||
220 | return i; | 232 | return i; |
221 | } | 233 | } |
222 | 234 | ||
223 | static inline struct pppox_sock *delete_item(unsigned long sid, char *addr) | 235 | static inline struct pppox_sock *delete_item(unsigned long sid, char *addr, int ifindex) |
224 | { | 236 | { |
225 | struct pppox_sock *ret; | 237 | struct pppox_sock *ret; |
226 | 238 | ||
227 | write_lock_bh(&pppoe_hash_lock); | 239 | write_lock_bh(&pppoe_hash_lock); |
228 | ret = __delete_item(sid, addr); | 240 | ret = __delete_item(sid, addr, ifindex); |
229 | write_unlock_bh(&pppoe_hash_lock); | 241 | write_unlock_bh(&pppoe_hash_lock); |
230 | 242 | ||
231 | return ret; | 243 | return ret; |
@@ -391,7 +403,7 @@ static int pppoe_rcv(struct sk_buff *skb, | |||
391 | 403 | ||
392 | ph = (struct pppoe_hdr *) skb->nh.raw; | 404 | ph = (struct pppoe_hdr *) skb->nh.raw; |
393 | 405 | ||
394 | po = get_item((unsigned long) ph->sid, eth_hdr(skb)->h_source); | 406 | po = get_item((unsigned long) ph->sid, eth_hdr(skb)->h_source, dev->ifindex); |
395 | if (po != NULL) | 407 | if (po != NULL) |
396 | return sk_receive_skb(sk_pppox(po), skb, 0); | 408 | return sk_receive_skb(sk_pppox(po), skb, 0); |
397 | drop: | 409 | drop: |
@@ -425,7 +437,7 @@ static int pppoe_disc_rcv(struct sk_buff *skb, | |||
425 | if (ph->code != PADT_CODE) | 437 | if (ph->code != PADT_CODE) |
426 | goto abort; | 438 | goto abort; |
427 | 439 | ||
428 | po = get_item((unsigned long) ph->sid, eth_hdr(skb)->h_source); | 440 | po = get_item((unsigned long) ph->sid, eth_hdr(skb)->h_source, dev->ifindex); |
429 | if (po) { | 441 | if (po) { |
430 | struct sock *sk = sk_pppox(po); | 442 | struct sock *sk = sk_pppox(po); |
431 | 443 | ||
@@ -517,7 +529,7 @@ static int pppoe_release(struct socket *sock) | |||
517 | 529 | ||
518 | po = pppox_sk(sk); | 530 | po = pppox_sk(sk); |
519 | if (po->pppoe_pa.sid) { | 531 | if (po->pppoe_pa.sid) { |
520 | delete_item(po->pppoe_pa.sid, po->pppoe_pa.remote); | 532 | delete_item(po->pppoe_pa.sid, po->pppoe_pa.remote, po->pppoe_dev->ifindex); |
521 | } | 533 | } |
522 | 534 | ||
523 | if (po->pppoe_dev) | 535 | if (po->pppoe_dev) |
@@ -539,7 +551,7 @@ static int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr, | |||
539 | int sockaddr_len, int flags) | 551 | int sockaddr_len, int flags) |
540 | { | 552 | { |
541 | struct sock *sk = sock->sk; | 553 | struct sock *sk = sock->sk; |
542 | struct net_device *dev = NULL; | 554 | struct net_device *dev; |
543 | struct sockaddr_pppox *sp = (struct sockaddr_pppox *) uservaddr; | 555 | struct sockaddr_pppox *sp = (struct sockaddr_pppox *) uservaddr; |
544 | struct pppox_sock *po = pppox_sk(sk); | 556 | struct pppox_sock *po = pppox_sk(sk); |
545 | int error; | 557 | int error; |
@@ -565,7 +577,7 @@ static int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr, | |||
565 | pppox_unbind_sock(sk); | 577 | pppox_unbind_sock(sk); |
566 | 578 | ||
567 | /* Delete the old binding */ | 579 | /* Delete the old binding */ |
568 | delete_item(po->pppoe_pa.sid,po->pppoe_pa.remote); | 580 | delete_item(po->pppoe_pa.sid,po->pppoe_pa.remote,po->pppoe_dev->ifindex); |
569 | 581 | ||
570 | if(po->pppoe_dev) | 582 | if(po->pppoe_dev) |
571 | dev_put(po->pppoe_dev); | 583 | dev_put(po->pppoe_dev); |
@@ -705,7 +717,7 @@ static int pppoe_ioctl(struct socket *sock, unsigned int cmd, | |||
705 | break; | 717 | break; |
706 | 718 | ||
707 | /* PPPoE address from the user specifies an outbound | 719 | /* PPPoE address from the user specifies an outbound |
708 | PPPoE address to which frames are forwarded to */ | 720 | PPPoE address which frames are forwarded to */ |
709 | err = -EFAULT; | 721 | err = -EFAULT; |
710 | if (copy_from_user(&po->pppoe_relay, | 722 | if (copy_from_user(&po->pppoe_relay, |
711 | (void __user *)arg, | 723 | (void __user *)arg, |
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 13cf06ee97f7..15d954e50cae 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
@@ -890,8 +890,7 @@ static void rtl8169_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | |||
890 | unsigned long flags; | 890 | unsigned long flags; |
891 | 891 | ||
892 | spin_lock_irqsave(&tp->lock, flags); | 892 | spin_lock_irqsave(&tp->lock, flags); |
893 | if (tp->vlgrp) | 893 | vlan_group_set_device(tp->vlgrp, vid, NULL); |
894 | tp->vlgrp->vlan_devices[vid] = NULL; | ||
895 | spin_unlock_irqrestore(&tp->lock, flags); | 894 | spin_unlock_irqrestore(&tp->lock, flags); |
896 | } | 895 | } |
897 | 896 | ||
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index 44bb2395af84..46ebf141ee5a 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
@@ -325,8 +325,7 @@ static void s2io_vlan_rx_kill_vid(struct net_device *dev, unsigned long vid) | |||
325 | unsigned long flags; | 325 | unsigned long flags; |
326 | 326 | ||
327 | spin_lock_irqsave(&nic->tx_lock, flags); | 327 | spin_lock_irqsave(&nic->tx_lock, flags); |
328 | if (nic->vlgrp) | 328 | vlan_group_set_device(nic->vlgrp, vid, NULL); |
329 | nic->vlgrp->vlan_devices[vid] = NULL; | ||
330 | spin_unlock_irqrestore(&nic->tx_lock, flags); | 329 | spin_unlock_irqrestore(&nic->tx_lock, flags); |
331 | } | 330 | } |
332 | 331 | ||
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 52edbd7ac17e..53839979cfb8 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
@@ -1053,8 +1053,7 @@ static void sky2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | |||
1053 | 1053 | ||
1054 | sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), RX_VLAN_STRIP_OFF); | 1054 | sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), RX_VLAN_STRIP_OFF); |
1055 | sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), TX_VLAN_TAG_OFF); | 1055 | sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), TX_VLAN_TAG_OFF); |
1056 | if (sky2->vlgrp) | 1056 | vlan_group_set_device(sky2->vlgrp, vid, NULL); |
1057 | sky2->vlgrp->vlan_devices[vid] = NULL; | ||
1058 | 1057 | ||
1059 | netif_tx_unlock_bh(dev); | 1058 | netif_tx_unlock_bh(dev); |
1060 | } | 1059 | } |
diff --git a/drivers/net/starfire.c b/drivers/net/starfire.c index bf873ea25797..8bba2e3da7e1 100644 --- a/drivers/net/starfire.c +++ b/drivers/net/starfire.c | |||
@@ -677,8 +677,7 @@ static void netdev_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | |||
677 | spin_lock(&np->lock); | 677 | spin_lock(&np->lock); |
678 | if (debug > 1) | 678 | if (debug > 1) |
679 | printk("%s: removing vlanid %d from vlan filter\n", dev->name, vid); | 679 | printk("%s: removing vlanid %d from vlan filter\n", dev->name, vid); |
680 | if (np->vlgrp) | 680 | vlan_group_set_device(np->vlgrp, vid, NULL); |
681 | np->vlgrp->vlan_devices[vid] = NULL; | ||
682 | set_rx_mode(dev); | 681 | set_rx_mode(dev); |
683 | spin_unlock(&np->lock); | 682 | spin_unlock(&np->lock); |
684 | } | 683 | } |
@@ -1738,7 +1737,7 @@ static void set_rx_mode(struct net_device *dev) | |||
1738 | int vlan_count = 0; | 1737 | int vlan_count = 0; |
1739 | void __iomem *filter_addr = ioaddr + HashTable + 8; | 1738 | void __iomem *filter_addr = ioaddr + HashTable + 8; |
1740 | for (i = 0; i < VLAN_VID_MASK; i++) { | 1739 | for (i = 0; i < VLAN_VID_MASK; i++) { |
1741 | if (np->vlgrp->vlan_devices[i]) { | 1740 | if (vlan_group_get_device(np->vlgrp, i)) { |
1742 | if (vlan_count >= 32) | 1741 | if (vlan_count >= 32) |
1743 | break; | 1742 | break; |
1744 | writew(cpu_to_be16(i), filter_addr); | 1743 | writew(cpu_to_be16(i), filter_addr); |
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 26c6ac48288c..8c8f9f4d47a5 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -9114,8 +9114,7 @@ static void tg3_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | |||
9114 | tg3_netif_stop(tp); | 9114 | tg3_netif_stop(tp); |
9115 | 9115 | ||
9116 | tg3_full_lock(tp, 0); | 9116 | tg3_full_lock(tp, 0); |
9117 | if (tp->vlgrp) | 9117 | vlan_group_set_device(tp->vlgrp, vid, NULL); |
9118 | tp->vlgrp->vlan_devices[vid] = NULL; | ||
9119 | tg3_full_unlock(tp); | 9118 | tg3_full_unlock(tp); |
9120 | 9119 | ||
9121 | if (netif_running(dev)) | 9120 | if (netif_running(dev)) |
diff --git a/drivers/net/typhoon.c b/drivers/net/typhoon.c index 9781b16bb8b6..0d91d094edd9 100644 --- a/drivers/net/typhoon.c +++ b/drivers/net/typhoon.c | |||
@@ -746,8 +746,7 @@ typhoon_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | |||
746 | { | 746 | { |
747 | struct typhoon *tp = netdev_priv(dev); | 747 | struct typhoon *tp = netdev_priv(dev); |
748 | spin_lock_bh(&tp->state_lock); | 748 | spin_lock_bh(&tp->state_lock); |
749 | if(tp->vlgrp) | 749 | vlan_group_set_device(tp->vlgrp, vid, NULL); |
750 | tp->vlgrp->vlan_devices[vid] = NULL; | ||
751 | spin_unlock_bh(&tp->state_lock); | 750 | spin_unlock_bh(&tp->state_lock); |
752 | } | 751 | } |
753 | 752 | ||
diff --git a/drivers/net/wan/hdlc.c b/drivers/net/wan/hdlc.c index 9040d7cf651e..65ad2e24caf0 100644 --- a/drivers/net/wan/hdlc.c +++ b/drivers/net/wan/hdlc.c | |||
@@ -38,7 +38,7 @@ | |||
38 | #include <linux/hdlc.h> | 38 | #include <linux/hdlc.h> |
39 | 39 | ||
40 | 40 | ||
41 | static const char* version = "HDLC support module revision 1.20"; | 41 | static const char* version = "HDLC support module revision 1.21"; |
42 | 42 | ||
43 | #undef DEBUG_LINK | 43 | #undef DEBUG_LINK |
44 | 44 | ||
@@ -222,19 +222,31 @@ int hdlc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | |||
222 | return -EINVAL; | 222 | return -EINVAL; |
223 | } | 223 | } |
224 | 224 | ||
225 | static void hdlc_setup_dev(struct net_device *dev) | ||
226 | { | ||
227 | /* Re-init all variables changed by HDLC protocol drivers, | ||
228 | * including ether_setup() called from hdlc_raw_eth.c. | ||
229 | */ | ||
230 | dev->get_stats = hdlc_get_stats; | ||
231 | dev->flags = IFF_POINTOPOINT | IFF_NOARP; | ||
232 | dev->mtu = HDLC_MAX_MTU; | ||
233 | dev->type = ARPHRD_RAWHDLC; | ||
234 | dev->hard_header_len = 16; | ||
235 | dev->addr_len = 0; | ||
236 | dev->hard_header = NULL; | ||
237 | dev->rebuild_header = NULL; | ||
238 | dev->set_mac_address = NULL; | ||
239 | dev->hard_header_cache = NULL; | ||
240 | dev->header_cache_update = NULL; | ||
241 | dev->change_mtu = hdlc_change_mtu; | ||
242 | dev->hard_header_parse = NULL; | ||
243 | } | ||
244 | |||
225 | static void hdlc_setup(struct net_device *dev) | 245 | static void hdlc_setup(struct net_device *dev) |
226 | { | 246 | { |
227 | hdlc_device *hdlc = dev_to_hdlc(dev); | 247 | hdlc_device *hdlc = dev_to_hdlc(dev); |
228 | 248 | ||
229 | dev->get_stats = hdlc_get_stats; | 249 | hdlc_setup_dev(dev); |
230 | dev->change_mtu = hdlc_change_mtu; | ||
231 | dev->mtu = HDLC_MAX_MTU; | ||
232 | |||
233 | dev->type = ARPHRD_RAWHDLC; | ||
234 | dev->hard_header_len = 16; | ||
235 | |||
236 | dev->flags = IFF_POINTOPOINT | IFF_NOARP; | ||
237 | |||
238 | hdlc->carrier = 1; | 250 | hdlc->carrier = 1; |
239 | hdlc->open = 0; | 251 | hdlc->open = 0; |
240 | spin_lock_init(&hdlc->state_lock); | 252 | spin_lock_init(&hdlc->state_lock); |
@@ -294,6 +306,7 @@ void detach_hdlc_protocol(struct net_device *dev) | |||
294 | } | 306 | } |
295 | kfree(hdlc->state); | 307 | kfree(hdlc->state); |
296 | hdlc->state = NULL; | 308 | hdlc->state = NULL; |
309 | hdlc_setup_dev(dev); | ||
297 | } | 310 | } |
298 | 311 | ||
299 | 312 | ||
diff --git a/drivers/net/wan/hdlc_cisco.c b/drivers/net/wan/hdlc_cisco.c index b0bc5ddcf1b1..c9664fd8a917 100644 --- a/drivers/net/wan/hdlc_cisco.c +++ b/drivers/net/wan/hdlc_cisco.c | |||
@@ -365,10 +365,7 @@ static int cisco_ioctl(struct net_device *dev, struct ifreq *ifr) | |||
365 | memcpy(&state(hdlc)->settings, &new_settings, size); | 365 | memcpy(&state(hdlc)->settings, &new_settings, size); |
366 | dev->hard_start_xmit = hdlc->xmit; | 366 | dev->hard_start_xmit = hdlc->xmit; |
367 | dev->hard_header = cisco_hard_header; | 367 | dev->hard_header = cisco_hard_header; |
368 | dev->hard_header_cache = NULL; | ||
369 | dev->type = ARPHRD_CISCO; | 368 | dev->type = ARPHRD_CISCO; |
370 | dev->flags = IFF_POINTOPOINT | IFF_NOARP; | ||
371 | dev->addr_len = 0; | ||
372 | netif_dormant_on(dev); | 369 | netif_dormant_on(dev); |
373 | return 0; | 370 | return 0; |
374 | } | 371 | } |
diff --git a/drivers/net/wan/hdlc_fr.c b/drivers/net/wan/hdlc_fr.c index b45ab680d2d6..c6c3c757d6f1 100644 --- a/drivers/net/wan/hdlc_fr.c +++ b/drivers/net/wan/hdlc_fr.c | |||
@@ -1289,10 +1289,7 @@ static int fr_ioctl(struct net_device *dev, struct ifreq *ifr) | |||
1289 | memcpy(&state(hdlc)->settings, &new_settings, size); | 1289 | memcpy(&state(hdlc)->settings, &new_settings, size); |
1290 | 1290 | ||
1291 | dev->hard_start_xmit = hdlc->xmit; | 1291 | dev->hard_start_xmit = hdlc->xmit; |
1292 | dev->hard_header = NULL; | ||
1293 | dev->type = ARPHRD_FRAD; | 1292 | dev->type = ARPHRD_FRAD; |
1294 | dev->flags = IFF_POINTOPOINT | IFF_NOARP; | ||
1295 | dev->addr_len = 0; | ||
1296 | return 0; | 1293 | return 0; |
1297 | 1294 | ||
1298 | case IF_PROTO_FR_ADD_PVC: | 1295 | case IF_PROTO_FR_ADD_PVC: |
diff --git a/drivers/net/wan/hdlc_ppp.c b/drivers/net/wan/hdlc_ppp.c index e9f717070fde..4591437dd2f3 100644 --- a/drivers/net/wan/hdlc_ppp.c +++ b/drivers/net/wan/hdlc_ppp.c | |||
@@ -127,9 +127,7 @@ static int ppp_ioctl(struct net_device *dev, struct ifreq *ifr) | |||
127 | if (result) | 127 | if (result) |
128 | return result; | 128 | return result; |
129 | dev->hard_start_xmit = hdlc->xmit; | 129 | dev->hard_start_xmit = hdlc->xmit; |
130 | dev->hard_header = NULL; | ||
131 | dev->type = ARPHRD_PPP; | 130 | dev->type = ARPHRD_PPP; |
132 | dev->addr_len = 0; | ||
133 | netif_dormant_off(dev); | 131 | netif_dormant_off(dev); |
134 | return 0; | 132 | return 0; |
135 | } | 133 | } |
diff --git a/drivers/net/wan/hdlc_raw.c b/drivers/net/wan/hdlc_raw.c index fe3cae5c6b9d..e23bc6656267 100644 --- a/drivers/net/wan/hdlc_raw.c +++ b/drivers/net/wan/hdlc_raw.c | |||
@@ -88,10 +88,7 @@ static int raw_ioctl(struct net_device *dev, struct ifreq *ifr) | |||
88 | return result; | 88 | return result; |
89 | memcpy(hdlc->state, &new_settings, size); | 89 | memcpy(hdlc->state, &new_settings, size); |
90 | dev->hard_start_xmit = hdlc->xmit; | 90 | dev->hard_start_xmit = hdlc->xmit; |
91 | dev->hard_header = NULL; | ||
92 | dev->type = ARPHRD_RAWHDLC; | 91 | dev->type = ARPHRD_RAWHDLC; |
93 | dev->flags = IFF_POINTOPOINT | IFF_NOARP; | ||
94 | dev->addr_len = 0; | ||
95 | netif_dormant_off(dev); | 92 | netif_dormant_off(dev); |
96 | return 0; | 93 | return 0; |
97 | } | 94 | } |
diff --git a/drivers/net/wan/hdlc_x25.c b/drivers/net/wan/hdlc_x25.c index e4bb9f8ad433..cd7b22f50edc 100644 --- a/drivers/net/wan/hdlc_x25.c +++ b/drivers/net/wan/hdlc_x25.c | |||
@@ -215,9 +215,7 @@ static int x25_ioctl(struct net_device *dev, struct ifreq *ifr) | |||
215 | x25_rx, 0)) != 0) | 215 | x25_rx, 0)) != 0) |
216 | return result; | 216 | return result; |
217 | dev->hard_start_xmit = x25_xmit; | 217 | dev->hard_start_xmit = x25_xmit; |
218 | dev->hard_header = NULL; | ||
219 | dev->type = ARPHRD_X25; | 218 | dev->type = ARPHRD_X25; |
220 | dev->addr_len = 0; | ||
221 | netif_dormant_off(dev); | 219 | netif_dormant_off(dev); |
222 | return 0; | 220 | return 0; |
223 | } | 221 | } |
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index deef29646e0e..95826b92ca4b 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig | |||
@@ -207,10 +207,12 @@ config RTC_DRV_PCF8563 | |||
207 | 207 | ||
208 | config RTC_DRV_PCF8583 | 208 | config RTC_DRV_PCF8583 |
209 | tristate "Philips PCF8583" | 209 | tristate "Philips PCF8583" |
210 | depends on RTC_CLASS && I2C | 210 | depends on RTC_CLASS && I2C && ARCH_RPC |
211 | help | 211 | help |
212 | If you say yes here you get support for the | 212 | If you say yes here you get support for the Philips PCF8583 |
213 | Philips PCF8583 RTC chip. | 213 | RTC chip found on Acorn RiscPCs. This driver supports the |
214 | platform specific method of retrieving the current year from | ||
215 | the RTC's SRAM. | ||
214 | 216 | ||
215 | This driver can also be built as a module. If so, the module | 217 | This driver can also be built as a module. If so, the module |
216 | will be called rtc-pcf8583. | 218 | will be called rtc-pcf8583. |
diff --git a/drivers/rtc/rtc-pcf8583.c b/drivers/rtc/rtc-pcf8583.c index 5875ebb8c79d..d48b03374586 100644 --- a/drivers/rtc/rtc-pcf8583.c +++ b/drivers/rtc/rtc-pcf8583.c | |||
@@ -40,7 +40,7 @@ struct pcf8583 { | |||
40 | #define CTRL_ALARM 0x02 | 40 | #define CTRL_ALARM 0x02 |
41 | #define CTRL_TIMER 0x01 | 41 | #define CTRL_TIMER 0x01 |
42 | 42 | ||
43 | static unsigned short normal_i2c[] = { I2C_CLIENT_END }; | 43 | static unsigned short normal_i2c[] = { 0x50, I2C_CLIENT_END }; |
44 | 44 | ||
45 | /* Module parameters */ | 45 | /* Module parameters */ |
46 | I2C_CLIENT_INSMOD; | 46 | I2C_CLIENT_INSMOD; |
@@ -81,11 +81,11 @@ static int pcf8583_get_datetime(struct i2c_client *client, struct rtc_time *dt) | |||
81 | buf[4] &= 0x3f; | 81 | buf[4] &= 0x3f; |
82 | buf[5] &= 0x1f; | 82 | buf[5] &= 0x1f; |
83 | 83 | ||
84 | dt->tm_sec = BCD_TO_BIN(buf[1]); | 84 | dt->tm_sec = BCD2BIN(buf[1]); |
85 | dt->tm_min = BCD_TO_BIN(buf[2]); | 85 | dt->tm_min = BCD2BIN(buf[2]); |
86 | dt->tm_hour = BCD_TO_BIN(buf[3]); | 86 | dt->tm_hour = BCD2BIN(buf[3]); |
87 | dt->tm_mday = BCD_TO_BIN(buf[4]); | 87 | dt->tm_mday = BCD2BIN(buf[4]); |
88 | dt->tm_mon = BCD_TO_BIN(buf[5]); | 88 | dt->tm_mon = BCD2BIN(buf[5]) - 1; |
89 | } | 89 | } |
90 | 90 | ||
91 | return ret == 2 ? 0 : -EIO; | 91 | return ret == 2 ? 0 : -EIO; |
@@ -99,14 +99,14 @@ static int pcf8583_set_datetime(struct i2c_client *client, struct rtc_time *dt, | |||
99 | buf[0] = 0; | 99 | buf[0] = 0; |
100 | buf[1] = get_ctrl(client) | 0x80; | 100 | buf[1] = get_ctrl(client) | 0x80; |
101 | buf[2] = 0; | 101 | buf[2] = 0; |
102 | buf[3] = BIN_TO_BCD(dt->tm_sec); | 102 | buf[3] = BIN2BCD(dt->tm_sec); |
103 | buf[4] = BIN_TO_BCD(dt->tm_min); | 103 | buf[4] = BIN2BCD(dt->tm_min); |
104 | buf[5] = BIN_TO_BCD(dt->tm_hour); | 104 | buf[5] = BIN2BCD(dt->tm_hour); |
105 | 105 | ||
106 | if (datetoo) { | 106 | if (datetoo) { |
107 | len = 8; | 107 | len = 8; |
108 | buf[6] = BIN_TO_BCD(dt->tm_mday) | (dt->tm_year << 6); | 108 | buf[6] = BIN2BCD(dt->tm_mday) | (dt->tm_year << 6); |
109 | buf[7] = BIN_TO_BCD(dt->tm_mon) | (dt->tm_wday << 5); | 109 | buf[7] = BIN2BCD(dt->tm_mon + 1) | (dt->tm_wday << 5); |
110 | } | 110 | } |
111 | 111 | ||
112 | ret = i2c_master_send(client, (char *)buf, len); | 112 | ret = i2c_master_send(client, (char *)buf, len); |
@@ -226,7 +226,7 @@ static int pcf8583_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
226 | */ | 226 | */ |
227 | year_offset += 4; | 227 | year_offset += 4; |
228 | 228 | ||
229 | tm->tm_year = real_year + year_offset + year[1] * 100; | 229 | tm->tm_year = (real_year + year_offset + year[1] * 100) - 1900; |
230 | 230 | ||
231 | return 0; | 231 | return 0; |
232 | } | 232 | } |
@@ -237,6 +237,7 @@ static int pcf8583_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
237 | unsigned char year[2], chk; | 237 | unsigned char year[2], chk; |
238 | struct rtc_mem cmos_year = { CMOS_YEAR, sizeof(year), year }; | 238 | struct rtc_mem cmos_year = { CMOS_YEAR, sizeof(year), year }; |
239 | struct rtc_mem cmos_check = { CMOS_CHECKSUM, 1, &chk }; | 239 | struct rtc_mem cmos_check = { CMOS_CHECKSUM, 1, &chk }; |
240 | unsigned int proper_year = tm->tm_year + 1900; | ||
240 | int ret; | 241 | int ret; |
241 | 242 | ||
242 | /* | 243 | /* |
@@ -258,8 +259,8 @@ static int pcf8583_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
258 | 259 | ||
259 | chk -= year[1] + year[0]; | 260 | chk -= year[1] + year[0]; |
260 | 261 | ||
261 | year[1] = tm->tm_year / 100; | 262 | year[1] = proper_year / 100; |
262 | year[0] = tm->tm_year % 100; | 263 | year[0] = proper_year % 100; |
263 | 264 | ||
264 | chk += year[1] + year[0]; | 265 | chk += year[1] + year[0]; |
265 | 266 | ||
diff --git a/drivers/s390/net/qeth_main.c b/drivers/s390/net/qeth_main.c index 2257e45594b3..d8a86f5af379 100644 --- a/drivers/s390/net/qeth_main.c +++ b/drivers/s390/net/qeth_main.c | |||
@@ -3654,7 +3654,7 @@ qeth_verify_vlan_dev(struct net_device *dev, struct qeth_card *card) | |||
3654 | return rc; | 3654 | return rc; |
3655 | 3655 | ||
3656 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++){ | 3656 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++){ |
3657 | if (vg->vlan_devices[i] == dev){ | 3657 | if (vlan_group_get_device(vg, i) == dev){ |
3658 | rc = QETH_VLAN_CARD; | 3658 | rc = QETH_VLAN_CARD; |
3659 | break; | 3659 | break; |
3660 | } | 3660 | } |
@@ -5261,7 +5261,7 @@ qeth_free_vlan_addresses4(struct qeth_card *card, unsigned short vid) | |||
5261 | QETH_DBF_TEXT(trace, 4, "frvaddr4"); | 5261 | QETH_DBF_TEXT(trace, 4, "frvaddr4"); |
5262 | 5262 | ||
5263 | rcu_read_lock(); | 5263 | rcu_read_lock(); |
5264 | in_dev = __in_dev_get_rcu(card->vlangrp->vlan_devices[vid]); | 5264 | in_dev = __in_dev_get_rcu(vlan_group_get_device(card->vlangrp, vid)); |
5265 | if (!in_dev) | 5265 | if (!in_dev) |
5266 | goto out; | 5266 | goto out; |
5267 | for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) { | 5267 | for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) { |
@@ -5288,7 +5288,7 @@ qeth_free_vlan_addresses6(struct qeth_card *card, unsigned short vid) | |||
5288 | 5288 | ||
5289 | QETH_DBF_TEXT(trace, 4, "frvaddr6"); | 5289 | QETH_DBF_TEXT(trace, 4, "frvaddr6"); |
5290 | 5290 | ||
5291 | in6_dev = in6_dev_get(card->vlangrp->vlan_devices[vid]); | 5291 | in6_dev = in6_dev_get(vlan_group_get_device(card->vlangrp, vid)); |
5292 | if (!in6_dev) | 5292 | if (!in6_dev) |
5293 | return; | 5293 | return; |
5294 | for (ifa = in6_dev->addr_list; ifa; ifa = ifa->lst_next){ | 5294 | for (ifa = in6_dev->addr_list; ifa; ifa = ifa->lst_next){ |
@@ -5360,7 +5360,7 @@ qeth_layer2_process_vlans(struct qeth_card *card, int clear) | |||
5360 | if (!card->vlangrp) | 5360 | if (!card->vlangrp) |
5361 | return; | 5361 | return; |
5362 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { | 5362 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { |
5363 | if (card->vlangrp->vlan_devices[i] == NULL) | 5363 | if (vlan_group_get_device(card->vlangrp, i) == NULL) |
5364 | continue; | 5364 | continue; |
5365 | if (clear) | 5365 | if (clear) |
5366 | qeth_layer2_send_setdelvlan(card, i, IPA_CMD_DELVLAN); | 5366 | qeth_layer2_send_setdelvlan(card, i, IPA_CMD_DELVLAN); |
@@ -5398,8 +5398,7 @@ qeth_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | |||
5398 | spin_lock_irqsave(&card->vlanlock, flags); | 5398 | spin_lock_irqsave(&card->vlanlock, flags); |
5399 | /* unregister IP addresses of vlan device */ | 5399 | /* unregister IP addresses of vlan device */ |
5400 | qeth_free_vlan_addresses(card, vid); | 5400 | qeth_free_vlan_addresses(card, vid); |
5401 | if (card->vlangrp) | 5401 | vlan_group_set_device(card->vlangrp, vid, NULL); |
5402 | card->vlangrp->vlan_devices[vid] = NULL; | ||
5403 | spin_unlock_irqrestore(&card->vlanlock, flags); | 5402 | spin_unlock_irqrestore(&card->vlanlock, flags); |
5404 | if (card->options.layer2) | 5403 | if (card->options.layer2) |
5405 | qeth_layer2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN); | 5404 | qeth_layer2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN); |
@@ -5662,10 +5661,11 @@ qeth_add_vlan_mc(struct qeth_card *card) | |||
5662 | 5661 | ||
5663 | vg = card->vlangrp; | 5662 | vg = card->vlangrp; |
5664 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { | 5663 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { |
5665 | if (vg->vlan_devices[i] == NULL || | 5664 | struct net_device *netdev = vlan_group_get_device(vg, i); |
5666 | !(vg->vlan_devices[i]->flags & IFF_UP)) | 5665 | if (netdev == NULL || |
5666 | !(netdev->flags & IFF_UP)) | ||
5667 | continue; | 5667 | continue; |
5668 | in_dev = in_dev_get(vg->vlan_devices[i]); | 5668 | in_dev = in_dev_get(netdev); |
5669 | if (!in_dev) | 5669 | if (!in_dev) |
5670 | continue; | 5670 | continue; |
5671 | read_lock(&in_dev->mc_list_lock); | 5671 | read_lock(&in_dev->mc_list_lock); |
@@ -5749,10 +5749,11 @@ qeth_add_vlan_mc6(struct qeth_card *card) | |||
5749 | 5749 | ||
5750 | vg = card->vlangrp; | 5750 | vg = card->vlangrp; |
5751 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { | 5751 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { |
5752 | if (vg->vlan_devices[i] == NULL || | 5752 | struct net_device *netdev = vlan_group_get_device(vg, i); |
5753 | !(vg->vlan_devices[i]->flags & IFF_UP)) | 5753 | if (netdev == NULL || |
5754 | !(netdev->flags & IFF_UP)) | ||
5754 | continue; | 5755 | continue; |
5755 | in_dev = in6_dev_get(vg->vlan_devices[i]); | 5756 | in_dev = in6_dev_get(netdev); |
5756 | if (!in_dev) | 5757 | if (!in_dev) |
5757 | continue; | 5758 | continue; |
5758 | read_lock(&in_dev->lock); | 5759 | read_lock(&in_dev->lock); |
diff --git a/drivers/scsi/arm/cumana_2.c b/drivers/scsi/arm/cumana_2.c index d2d51dc51ab8..82add77ad131 100644 --- a/drivers/scsi/arm/cumana_2.c +++ b/drivers/scsi/arm/cumana_2.c | |||
@@ -178,10 +178,10 @@ cumanascsi_2_dma_setup(struct Scsi_Host *host, struct scsi_pointer *SCp, | |||
178 | dma_dir = DMA_MODE_READ, | 178 | dma_dir = DMA_MODE_READ, |
179 | alatch_dir = ALATCH_DMA_IN; | 179 | alatch_dir = ALATCH_DMA_IN; |
180 | 180 | ||
181 | dma_map_sg(dev, info->sg, bufs + 1, map_dir); | 181 | dma_map_sg(dev, info->sg, bufs, map_dir); |
182 | 182 | ||
183 | disable_dma(dmach); | 183 | disable_dma(dmach); |
184 | set_dma_sg(dmach, info->sg, bufs + 1); | 184 | set_dma_sg(dmach, info->sg, bufs); |
185 | writeb(alatch_dir, info->base + CUMANASCSI2_ALATCH); | 185 | writeb(alatch_dir, info->base + CUMANASCSI2_ALATCH); |
186 | set_dma_mode(dmach, dma_dir); | 186 | set_dma_mode(dmach, dma_dir); |
187 | enable_dma(dmach); | 187 | enable_dma(dmach); |
diff --git a/drivers/scsi/arm/eesox.c b/drivers/scsi/arm/eesox.c index d4136524fc46..ed06a8c19ad6 100644 --- a/drivers/scsi/arm/eesox.c +++ b/drivers/scsi/arm/eesox.c | |||
@@ -175,10 +175,10 @@ eesoxscsi_dma_setup(struct Scsi_Host *host, struct scsi_pointer *SCp, | |||
175 | map_dir = DMA_FROM_DEVICE, | 175 | map_dir = DMA_FROM_DEVICE, |
176 | dma_dir = DMA_MODE_READ; | 176 | dma_dir = DMA_MODE_READ; |
177 | 177 | ||
178 | dma_map_sg(dev, info->sg, bufs + 1, map_dir); | 178 | dma_map_sg(dev, info->sg, bufs, map_dir); |
179 | 179 | ||
180 | disable_dma(dmach); | 180 | disable_dma(dmach); |
181 | set_dma_sg(dmach, info->sg, bufs + 1); | 181 | set_dma_sg(dmach, info->sg, bufs); |
182 | set_dma_mode(dmach, dma_dir); | 182 | set_dma_mode(dmach, dma_dir); |
183 | enable_dma(dmach); | 183 | enable_dma(dmach); |
184 | return fasdma_real_all; | 184 | return fasdma_real_all; |
diff --git a/drivers/scsi/arm/fas216.c b/drivers/scsi/arm/fas216.c index 2969cc0ff259..fb5f20284389 100644 --- a/drivers/scsi/arm/fas216.c +++ b/drivers/scsi/arm/fas216.c | |||
@@ -633,7 +633,7 @@ static void fas216_updateptrs(FAS216_Info *info, int bytes_transferred) | |||
633 | 633 | ||
634 | BUG_ON(bytes_transferred < 0); | 634 | BUG_ON(bytes_transferred < 0); |
635 | 635 | ||
636 | info->SCpnt->request_bufflen -= bytes_transferred; | 636 | SCp->phase -= bytes_transferred; |
637 | 637 | ||
638 | while (bytes_transferred != 0) { | 638 | while (bytes_transferred != 0) { |
639 | if (SCp->this_residual > bytes_transferred) | 639 | if (SCp->this_residual > bytes_transferred) |
@@ -715,7 +715,7 @@ static void fas216_cleanuptransfer(FAS216_Info *info) | |||
715 | return; | 715 | return; |
716 | 716 | ||
717 | if (dmatype == fasdma_real_all) | 717 | if (dmatype == fasdma_real_all) |
718 | total = info->SCpnt->request_bufflen; | 718 | total = info->scsi.SCp.phase; |
719 | else | 719 | else |
720 | total = info->scsi.SCp.this_residual; | 720 | total = info->scsi.SCp.this_residual; |
721 | 721 | ||
@@ -753,7 +753,7 @@ static void fas216_transfer(FAS216_Info *info) | |||
753 | fas216_log(info, LOG_BUFFER, | 753 | fas216_log(info, LOG_BUFFER, |
754 | "starttransfer: buffer %p length 0x%06x reqlen 0x%06x", | 754 | "starttransfer: buffer %p length 0x%06x reqlen 0x%06x", |
755 | info->scsi.SCp.ptr, info->scsi.SCp.this_residual, | 755 | info->scsi.SCp.ptr, info->scsi.SCp.this_residual, |
756 | info->SCpnt->request_bufflen); | 756 | info->scsi.SCp.phase); |
757 | 757 | ||
758 | if (!info->scsi.SCp.ptr) { | 758 | if (!info->scsi.SCp.ptr) { |
759 | fas216_log(info, LOG_ERROR, "null buffer passed to " | 759 | fas216_log(info, LOG_ERROR, "null buffer passed to " |
@@ -784,7 +784,7 @@ static void fas216_transfer(FAS216_Info *info) | |||
784 | info->dma.transfer_type = dmatype; | 784 | info->dma.transfer_type = dmatype; |
785 | 785 | ||
786 | if (dmatype == fasdma_real_all) | 786 | if (dmatype == fasdma_real_all) |
787 | fas216_set_stc(info, info->SCpnt->request_bufflen); | 787 | fas216_set_stc(info, info->scsi.SCp.phase); |
788 | else | 788 | else |
789 | fas216_set_stc(info, info->scsi.SCp.this_residual); | 789 | fas216_set_stc(info, info->scsi.SCp.this_residual); |
790 | 790 | ||
@@ -2114,6 +2114,7 @@ request_sense: | |||
2114 | SCpnt->SCp.buffers_residual = 0; | 2114 | SCpnt->SCp.buffers_residual = 0; |
2115 | SCpnt->SCp.ptr = (char *)SCpnt->sense_buffer; | 2115 | SCpnt->SCp.ptr = (char *)SCpnt->sense_buffer; |
2116 | SCpnt->SCp.this_residual = sizeof(SCpnt->sense_buffer); | 2116 | SCpnt->SCp.this_residual = sizeof(SCpnt->sense_buffer); |
2117 | SCpnt->SCp.phase = sizeof(SCpnt->sense_buffer); | ||
2117 | SCpnt->SCp.Message = 0; | 2118 | SCpnt->SCp.Message = 0; |
2118 | SCpnt->SCp.Status = 0; | 2119 | SCpnt->SCp.Status = 0; |
2119 | SCpnt->request_bufflen = sizeof(SCpnt->sense_buffer); | 2120 | SCpnt->request_bufflen = sizeof(SCpnt->sense_buffer); |
diff --git a/drivers/scsi/arm/powertec.c b/drivers/scsi/arm/powertec.c index f9cd20bfb958..159047a34997 100644 --- a/drivers/scsi/arm/powertec.c +++ b/drivers/scsi/arm/powertec.c | |||
@@ -148,10 +148,10 @@ powertecscsi_dma_setup(struct Scsi_Host *host, struct scsi_pointer *SCp, | |||
148 | map_dir = DMA_FROM_DEVICE, | 148 | map_dir = DMA_FROM_DEVICE, |
149 | dma_dir = DMA_MODE_READ; | 149 | dma_dir = DMA_MODE_READ; |
150 | 150 | ||
151 | dma_map_sg(dev, info->sg, bufs + 1, map_dir); | 151 | dma_map_sg(dev, info->sg, bufs, map_dir); |
152 | 152 | ||
153 | disable_dma(dmach); | 153 | disable_dma(dmach); |
154 | set_dma_sg(dmach, info->sg, bufs + 1); | 154 | set_dma_sg(dmach, info->sg, bufs); |
155 | set_dma_mode(dmach, dma_dir); | 155 | set_dma_mode(dmach, dma_dir); |
156 | enable_dma(dmach); | 156 | enable_dma(dmach); |
157 | return fasdma_real_all; | 157 | return fasdma_real_all; |
@@ -342,6 +342,7 @@ powertecscsi_probe(struct expansion_card *ec, const struct ecard_id *id) | |||
342 | info->base = base; | 342 | info->base = base; |
343 | powertecscsi_terminator_ctl(host, term[ec->slot_no]); | 343 | powertecscsi_terminator_ctl(host, term[ec->slot_no]); |
344 | 344 | ||
345 | info->ec = ec; | ||
345 | info->info.scsi.io_base = base + POWERTEC_FAS216_OFFSET; | 346 | info->info.scsi.io_base = base + POWERTEC_FAS216_OFFSET; |
346 | info->info.scsi.io_shift = POWERTEC_FAS216_SHIFT; | 347 | info->info.scsi.io_shift = POWERTEC_FAS216_SHIFT; |
347 | info->info.scsi.irq = ec->irq; | 348 | info->info.scsi.irq = ec->irq; |
diff --git a/drivers/scsi/arm/scsi.h b/drivers/scsi/arm/scsi.h index 3a39579bd08e..21ba57155bea 100644 --- a/drivers/scsi/arm/scsi.h +++ b/drivers/scsi/arm/scsi.h | |||
@@ -80,6 +80,7 @@ static inline void init_SCp(struct scsi_cmnd *SCpnt) | |||
80 | (page_address(SCpnt->SCp.buffer->page) + | 80 | (page_address(SCpnt->SCp.buffer->page) + |
81 | SCpnt->SCp.buffer->offset); | 81 | SCpnt->SCp.buffer->offset); |
82 | SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; | 82 | SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; |
83 | SCpnt->SCp.phase = SCpnt->request_bufflen; | ||
83 | 84 | ||
84 | #ifdef BELT_AND_BRACES | 85 | #ifdef BELT_AND_BRACES |
85 | /* | 86 | /* |
@@ -98,6 +99,7 @@ static inline void init_SCp(struct scsi_cmnd *SCpnt) | |||
98 | } else { | 99 | } else { |
99 | SCpnt->SCp.ptr = (unsigned char *)SCpnt->request_buffer; | 100 | SCpnt->SCp.ptr = (unsigned char *)SCpnt->request_buffer; |
100 | SCpnt->SCp.this_residual = SCpnt->request_bufflen; | 101 | SCpnt->SCp.this_residual = SCpnt->request_bufflen; |
102 | SCpnt->SCp.phase = SCpnt->request_bufflen; | ||
101 | } | 103 | } |
102 | 104 | ||
103 | /* | 105 | /* |
diff --git a/include/asm-arm/arch-omap/entry-macro.S b/include/asm-arm/arch-omap/entry-macro.S index c90dff4828f7..f6967c8df323 100644 --- a/include/asm-arm/arch-omap/entry-macro.S +++ b/include/asm-arm/arch-omap/entry-macro.S | |||
@@ -61,6 +61,12 @@ | |||
61 | .macro disable_fiq | 61 | .macro disable_fiq |
62 | .endm | 62 | .endm |
63 | 63 | ||
64 | .macro get_irqnr_preamble, base, tmp | ||
65 | .endm | ||
66 | |||
67 | .macro arch_ret_to_user, tmp1, tmp2 | ||
68 | .endm | ||
69 | |||
64 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | 70 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp |
65 | ldr \base, =VA_IC_BASE | 71 | ldr \base, =VA_IC_BASE |
66 | ldr \irqnr, [\base, #0x98] /* IRQ pending reg 1 */ | 72 | ldr \irqnr, [\base, #0x98] /* IRQ pending reg 1 */ |
diff --git a/include/asm-arm/arch-omap/memory.h b/include/asm-arm/arch-omap/memory.h index df50dd53e1dd..48fabc493163 100644 --- a/include/asm-arm/arch-omap/memory.h +++ b/include/asm-arm/arch-omap/memory.h | |||
@@ -70,7 +70,7 @@ | |||
70 | 70 | ||
71 | #define virt_to_lbus(x) ((x) - PAGE_OFFSET + OMAP1510_LB_OFFSET) | 71 | #define virt_to_lbus(x) ((x) - PAGE_OFFSET + OMAP1510_LB_OFFSET) |
72 | #define lbus_to_virt(x) ((x) - OMAP1510_LB_OFFSET + PAGE_OFFSET) | 72 | #define lbus_to_virt(x) ((x) - OMAP1510_LB_OFFSET + PAGE_OFFSET) |
73 | #define is_lbus_device(dev) (cpu_is_omap1510() && dev && (strncmp(dev->bus_id, "ohci", 4) == 0)) | 73 | #define is_lbus_device(dev) (cpu_is_omap15xx() && dev && (strncmp(dev->bus_id, "ohci", 4) == 0)) |
74 | 74 | ||
75 | #define __arch_page_to_dma(dev, page) ({is_lbus_device(dev) ? \ | 75 | #define __arch_page_to_dma(dev, page) ({is_lbus_device(dev) ? \ |
76 | (dma_addr_t)virt_to_lbus(page_address(page)) : \ | 76 | (dma_addr_t)virt_to_lbus(page_address(page)) : \ |
diff --git a/include/asm-arm/arch-omap/omap-alsa.h b/include/asm-arm/arch-omap/omap-alsa.h index df4695474e3d..fcaf44c14714 100644 --- a/include/asm-arm/arch-omap/omap-alsa.h +++ b/include/asm-arm/arch-omap/omap-alsa.h | |||
@@ -65,7 +65,7 @@ struct audio_stream { | |||
65 | int period; /* current transfer period */ | 65 | int period; /* current transfer period */ |
66 | int periods; /* current count of periods registerd in the DMA engine */ | 66 | int periods; /* current count of periods registerd in the DMA engine */ |
67 | spinlock_t dma_lock; /* for locking in DMA operations */ | 67 | spinlock_t dma_lock; /* for locking in DMA operations */ |
68 | snd_pcm_substream_t *stream; /* the pcm stream */ | 68 | struct snd_pcm_substream *stream; /* the pcm stream */ |
69 | unsigned linked:1; /* dma channels linked */ | 69 | unsigned linked:1; /* dma channels linked */ |
70 | int offset; /* store start position of the last period in the alsa buffer */ | 70 | int offset; /* store start position of the last period in the alsa buffer */ |
71 | int (*hw_start)(void); /* interface to start HW interface, e.g. McBSP */ | 71 | int (*hw_start)(void); /* interface to start HW interface, e.g. McBSP */ |
@@ -76,8 +76,8 @@ struct audio_stream { | |||
76 | * Alsa card structure for aic23 | 76 | * Alsa card structure for aic23 |
77 | */ | 77 | */ |
78 | struct snd_card_omap_codec { | 78 | struct snd_card_omap_codec { |
79 | snd_card_t *card; | 79 | struct snd_card *card; |
80 | snd_pcm_t *pcm; | 80 | struct snd_pcm *pcm; |
81 | long samplerate; | 81 | long samplerate; |
82 | struct audio_stream s[2]; /* playback & capture */ | 82 | struct audio_stream s[2]; /* playback & capture */ |
83 | }; | 83 | }; |
@@ -89,9 +89,9 @@ struct snd_card_omap_codec { | |||
89 | struct omap_alsa_codec_config { | 89 | struct omap_alsa_codec_config { |
90 | char *name; | 90 | char *name; |
91 | struct omap_mcbsp_reg_cfg *mcbsp_regs_alsa; | 91 | struct omap_mcbsp_reg_cfg *mcbsp_regs_alsa; |
92 | snd_pcm_hw_constraint_list_t *hw_constraints_rates; | 92 | struct snd_pcm_hw_constraint_list *hw_constraints_rates; |
93 | snd_pcm_hardware_t *snd_omap_alsa_playback; | 93 | struct snd_pcm_hardware *snd_omap_alsa_playback; |
94 | snd_pcm_hardware_t *snd_omap_alsa_capture; | 94 | struct snd_pcm_hardware *snd_omap_alsa_capture; |
95 | void (*codec_configure_dev)(void); | 95 | void (*codec_configure_dev)(void); |
96 | void (*codec_set_samplerate)(long); | 96 | void (*codec_set_samplerate)(long); |
97 | void (*codec_clock_setup)(void); | 97 | void (*codec_clock_setup)(void); |
diff --git a/include/asm-arm/system.h b/include/asm-arm/system.h index f4386906b200..f06d8a43fdee 100644 --- a/include/asm-arm/system.h +++ b/include/asm-arm/system.h | |||
@@ -167,11 +167,25 @@ extern unsigned int user_debug; | |||
167 | : : "r" (0) : "memory") | 167 | : : "r" (0) : "memory") |
168 | #define dmb() __asm__ __volatile__ ("" : : : "memory") | 168 | #define dmb() __asm__ __volatile__ ("" : : : "memory") |
169 | #endif | 169 | #endif |
170 | #define mb() dmb() | 170 | |
171 | #define rmb() mb() | 171 | #define mb() barrier() |
172 | #define wmb() mb() | 172 | #define rmb() barrier() |
173 | #define read_barrier_depends() do { } while(0) | 173 | #define wmb() barrier() |
174 | #define set_mb(var, value) do { var = value; mb(); } while (0) | 174 | #define read_barrier_depends() do { } while(0) |
175 | |||
176 | #ifdef CONFIG_SMP | ||
177 | #define smp_mb() dmb() | ||
178 | #define smp_rmb() dmb() | ||
179 | #define smp_wmb() dmb() | ||
180 | #define smp_read_barrier_depends() read_barrier_depends() | ||
181 | #else | ||
182 | #define smp_mb() barrier() | ||
183 | #define smp_rmb() barrier() | ||
184 | #define smp_wmb() barrier() | ||
185 | #define smp_read_barrier_depends() read_barrier_depends() | ||
186 | #endif /* CONFIG_SMP */ | ||
187 | |||
188 | #define set_mb(var, value) do { var = value; smp_mb(); } while (0) | ||
175 | #define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t"); | 189 | #define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t"); |
176 | 190 | ||
177 | extern unsigned long cr_no_alignment; /* defined in entry-armv.S */ | 191 | extern unsigned long cr_no_alignment; /* defined in entry-armv.S */ |
@@ -243,22 +257,6 @@ static inline void sched_cacheflush(void) | |||
243 | { | 257 | { |
244 | } | 258 | } |
245 | 259 | ||
246 | #ifdef CONFIG_SMP | ||
247 | |||
248 | #define smp_mb() mb() | ||
249 | #define smp_rmb() rmb() | ||
250 | #define smp_wmb() wmb() | ||
251 | #define smp_read_barrier_depends() read_barrier_depends() | ||
252 | |||
253 | #else | ||
254 | |||
255 | #define smp_mb() barrier() | ||
256 | #define smp_rmb() barrier() | ||
257 | #define smp_wmb() barrier() | ||
258 | #define smp_read_barrier_depends() do { } while(0) | ||
259 | |||
260 | #endif /* CONFIG_SMP */ | ||
261 | |||
262 | #if defined(CONFIG_CPU_SA1100) || defined(CONFIG_CPU_SA110) | 260 | #if defined(CONFIG_CPU_SA1100) || defined(CONFIG_CPU_SA110) |
263 | /* | 261 | /* |
264 | * On the StrongARM, "swp" is terminally broken since it bypasses the | 262 | * On the StrongARM, "swp" is terminally broken since it bypasses the |
diff --git a/include/asm-mips/ds1742.h b/include/asm-mips/ds1742.h deleted file mode 100644 index c2f2c32da637..000000000000 --- a/include/asm-mips/ds1742.h +++ /dev/null | |||
@@ -1,13 +0,0 @@ | |||
1 | /* | ||
2 | * This file is subject to the terms and conditions of the GNU General Public | ||
3 | * License. See the file "COPYING" in the main directory of this archive | ||
4 | * for more details. | ||
5 | * | ||
6 | * Copyright (C) 2006 by Ralf Baechle (ralf@linux-mips.org) | ||
7 | */ | ||
8 | #ifndef _ASM_DS1742_H | ||
9 | #define _ASM_DS1742_H | ||
10 | |||
11 | #include <ds1742.h> | ||
12 | |||
13 | #endif /* _ASM_DS1742_H */ | ||
diff --git a/include/asm-mips/jmr3927/jmr3927.h b/include/asm-mips/jmr3927/jmr3927.h index baf412967afa..c50e68ffa3af 100644 --- a/include/asm-mips/jmr3927/jmr3927.h +++ b/include/asm-mips/jmr3927/jmr3927.h | |||
@@ -179,12 +179,6 @@ static inline int jmr3927_have_isac(void) | |||
179 | #define jmr3927_have_nvram() \ | 179 | #define jmr3927_have_nvram() \ |
180 | ((jmr3927_ioc_reg_in(JMR3927_IOC_REV_ADDR) & JMR3927_IDT_MASK) == JMR3927_IOC_IDT) | 180 | ((jmr3927_ioc_reg_in(JMR3927_IOC_REV_ADDR) & JMR3927_IDT_MASK) == JMR3927_IOC_IDT) |
181 | 181 | ||
182 | /* NVRAM macro */ | ||
183 | #define jmr3927_nvram_in(ofs) \ | ||
184 | jmr3927_ioc_reg_in(JMR3927_IOC_NVRAMB_ADDR + ((ofs) << 1)) | ||
185 | #define jmr3927_nvram_out(d, ofs) \ | ||
186 | jmr3927_ioc_reg_out(d, JMR3927_IOC_NVRAMB_ADDR + ((ofs) << 1)) | ||
187 | |||
188 | /* LED macro */ | 182 | /* LED macro */ |
189 | #define jmr3927_led_set(n/*0-16*/) jmr3927_ioc_reg_out(~(n), JMR3927_IOC_LED_ADDR) | 183 | #define jmr3927_led_set(n/*0-16*/) jmr3927_ioc_reg_out(~(n), JMR3927_IOC_LED_ADDR) |
190 | #define jmr3927_io_led_set(n/*0-3*/) jmr3927_isac_reg_out((n), JMR3927_ISAC_LED_ADDR) | 184 | #define jmr3927_io_led_set(n/*0-3*/) jmr3927_isac_reg_out((n), JMR3927_ISAC_LED_ADDR) |
diff --git a/include/asm-mips/lasat/lasat.h b/include/asm-mips/lasat/lasat.h index 181afc5c0f1d..42077e367a5b 100644 --- a/include/asm-mips/lasat/lasat.h +++ b/include/asm-mips/lasat/lasat.h | |||
@@ -237,8 +237,6 @@ static inline void lasat_ndelay(unsigned int ns) | |||
237 | __delay(ns / lasat_ndelay_divider); | 237 | __delay(ns / lasat_ndelay_divider); |
238 | } | 238 | } |
239 | 239 | ||
240 | extern void (* prom_printf)(const char *fmt, ...); | ||
241 | |||
242 | #endif /* !defined (_LANGUAGE_ASSEMBLY) */ | 240 | #endif /* !defined (_LANGUAGE_ASSEMBLY) */ |
243 | 241 | ||
244 | #define LASAT_SERVICEMODE_MAGIC_1 0xdeadbeef | 242 | #define LASAT_SERVICEMODE_MAGIC_1 0xdeadbeef |
diff --git a/include/asm-mips/mach-atlas/mc146818rtc.h b/include/asm-mips/mach-atlas/mc146818rtc.h index a73a5698420c..51d337e1bbd1 100644 --- a/include/asm-mips/mach-atlas/mc146818rtc.h +++ b/include/asm-mips/mach-atlas/mc146818rtc.h | |||
@@ -55,6 +55,6 @@ static inline void CMOS_WRITE(unsigned char data, unsigned long addr) | |||
55 | 55 | ||
56 | #define RTC_ALWAYS_BCD 0 | 56 | #define RTC_ALWAYS_BCD 0 |
57 | 57 | ||
58 | #define mc146818_decode_year(year) ((year) < 70 ? (year) + 2000 : (year) + 1970) | 58 | #define mc146818_decode_year(year) ((year) < 70 ? (year) + 2000 : (year) + 1900) |
59 | 59 | ||
60 | #endif /* __ASM_MACH_ATLAS_MC146818RTC_H */ | 60 | #endif /* __ASM_MACH_ATLAS_MC146818RTC_H */ |
diff --git a/include/asm-mips/mach-generic/dma-coherence.h b/include/asm-mips/mach-generic/dma-coherence.h index df71822fd27b..76e04e7feb84 100644 --- a/include/asm-mips/mach-generic/dma-coherence.h +++ b/include/asm-mips/mach-generic/dma-coherence.h | |||
@@ -11,22 +11,24 @@ | |||
11 | 11 | ||
12 | struct device; | 12 | struct device; |
13 | 13 | ||
14 | static dma_addr_t plat_map_dma_mem(struct device *dev, void *addr, size_t size) | 14 | static inline dma_addr_t plat_map_dma_mem(struct device *dev, void *addr, |
15 | size_t size) | ||
15 | { | 16 | { |
16 | return virt_to_phys(addr); | 17 | return virt_to_phys(addr); |
17 | } | 18 | } |
18 | 19 | ||
19 | static dma_addr_t plat_map_dma_mem_page(struct device *dev, struct page *page) | 20 | static inline dma_addr_t plat_map_dma_mem_page(struct device *dev, |
21 | struct page *page) | ||
20 | { | 22 | { |
21 | return page_to_phys(page); | 23 | return page_to_phys(page); |
22 | } | 24 | } |
23 | 25 | ||
24 | static unsigned long plat_dma_addr_to_phys(dma_addr_t dma_addr) | 26 | static inline unsigned long plat_dma_addr_to_phys(dma_addr_t dma_addr) |
25 | { | 27 | { |
26 | return dma_addr; | 28 | return dma_addr; |
27 | } | 29 | } |
28 | 30 | ||
29 | static void plat_unmap_dma_mem(dma_addr_t dma_addr) | 31 | static inline void plat_unmap_dma_mem(dma_addr_t dma_addr) |
30 | { | 32 | { |
31 | } | 33 | } |
32 | 34 | ||
diff --git a/include/asm-mips/mach-generic/mc146818rtc.h b/include/asm-mips/mach-generic/mc146818rtc.h index 90c2e6f77faa..0b9a942f079d 100644 --- a/include/asm-mips/mach-generic/mc146818rtc.h +++ b/include/asm-mips/mach-generic/mc146818rtc.h | |||
@@ -30,7 +30,7 @@ static inline void CMOS_WRITE(unsigned char data, unsigned long addr) | |||
30 | #define RTC_ALWAYS_BCD 1 | 30 | #define RTC_ALWAYS_BCD 1 |
31 | 31 | ||
32 | #ifndef mc146818_decode_year | 32 | #ifndef mc146818_decode_year |
33 | #define mc146818_decode_year(year) ((year) < 70 ? (year) + 2000 : (year) + 1970) | 33 | #define mc146818_decode_year(year) ((year) < 70 ? (year) + 2000 : (year) + 1900) |
34 | #endif | 34 | #endif |
35 | 35 | ||
36 | #endif /* __ASM_MACH_GENERIC_MC146818RTC_H */ | 36 | #endif /* __ASM_MACH_GENERIC_MC146818RTC_H */ |
diff --git a/include/asm-mips/mach-jmr3927/ds1742.h b/include/asm-mips/mach-jmr3927/ds1742.h deleted file mode 100644 index 8a8fef6d07fa..000000000000 --- a/include/asm-mips/mach-jmr3927/ds1742.h +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | /* | ||
2 | * This file is subject to the terms and conditions of the GNU General Public | ||
3 | * License. See the file "COPYING" in the main directory of this archive | ||
4 | * for more details. | ||
5 | * | ||
6 | * Copyright (C) 2003, 06 by Ralf Baechle | ||
7 | */ | ||
8 | #ifndef __ASM_MACH_JMR3927_DS1742_H | ||
9 | #define __ASM_MACH_JMR3927_DS1742_H | ||
10 | |||
11 | #include <asm/jmr3927/jmr3927.h> | ||
12 | |||
13 | #define rtc_read(reg) (jmr3927_nvram_in(reg)) | ||
14 | #define rtc_write(data, reg) (jmr3927_nvram_out((data),(reg))) | ||
15 | |||
16 | #endif /* __ASM_MACH_JMR3927_DS1742_H */ | ||
diff --git a/include/asm-mips/mach-jmr3927/mangle-port.h b/include/asm-mips/mach-jmr3927/mangle-port.h new file mode 100644 index 000000000000..501a202631b5 --- /dev/null +++ b/include/asm-mips/mach-jmr3927/mangle-port.h | |||
@@ -0,0 +1,18 @@ | |||
1 | #ifndef __ASM_MACH_JMR3927_MANGLE_PORT_H | ||
2 | #define __ASM_MACH_JMR3927_MANGLE_PORT_H | ||
3 | |||
4 | extern unsigned long __swizzle_addr_b(unsigned long port); | ||
5 | #define __swizzle_addr_w(port) (port) | ||
6 | #define __swizzle_addr_l(port) (port) | ||
7 | #define __swizzle_addr_q(port) (port) | ||
8 | |||
9 | #define ioswabb(a,x) (x) | ||
10 | #define __mem_ioswabb(a,x) (x) | ||
11 | #define ioswabw(a,x) le16_to_cpu(x) | ||
12 | #define __mem_ioswabw(a,x) (x) | ||
13 | #define ioswabl(a,x) le32_to_cpu(x) | ||
14 | #define __mem_ioswabl(a,x) (x) | ||
15 | #define ioswabq(a,x) le64_to_cpu(x) | ||
16 | #define __mem_ioswabq(a,x) (x) | ||
17 | |||
18 | #endif /* __ASM_MACH_JMR3927_MANGLE_PORT_H */ | ||
diff --git a/include/asm-mips/mach-mips/mc146818rtc.h b/include/asm-mips/mach-mips/mc146818rtc.h index 6730ba066576..ea612f37f614 100644 --- a/include/asm-mips/mach-mips/mc146818rtc.h +++ b/include/asm-mips/mach-mips/mc146818rtc.h | |||
@@ -43,6 +43,6 @@ static inline void CMOS_WRITE(unsigned char data, unsigned long addr) | |||
43 | 43 | ||
44 | #define RTC_ALWAYS_BCD 0 | 44 | #define RTC_ALWAYS_BCD 0 |
45 | 45 | ||
46 | #define mc146818_decode_year(year) ((year) < 70 ? (year) + 2000 : (year) + 1970) | 46 | #define mc146818_decode_year(year) ((year) < 70 ? (year) + 2000 : (year) + 1900) |
47 | 47 | ||
48 | #endif /* __ASM_MACH_MALTA_MC146818RTC_H */ | 48 | #endif /* __ASM_MACH_MALTA_MC146818RTC_H */ |
diff --git a/include/asm-mips/mach-rm/mc146818rtc.h b/include/asm-mips/mach-rm/mc146818rtc.h index d37ae68dc6a3..145bce096fe9 100644 --- a/include/asm-mips/mach-rm/mc146818rtc.h +++ b/include/asm-mips/mach-rm/mc146818rtc.h | |||
@@ -7,11 +7,15 @@ | |||
7 | * | 7 | * |
8 | * RTC routines for PC style attached Dallas chip with ARC epoch. | 8 | * RTC routines for PC style attached Dallas chip with ARC epoch. |
9 | */ | 9 | */ |
10 | #ifndef __ASM_MACH_RM200_MC146818RTC_H | 10 | #ifndef __ASM_MACH_RM_MC146818RTC_H |
11 | #define __ASM_MACH_RM200_MC146818RTC_H | 11 | #define __ASM_MACH_RM_MC146818RTC_H |
12 | 12 | ||
13 | #ifdef CONFIG_CPU_BIG_ENDIAN | ||
14 | #define mc146818_decode_year(year) ((year) < 70 ? (year) + 2000 : (year) + 1900) | ||
15 | #else | ||
13 | #define mc146818_decode_year(year) ((year) + 1980) | 16 | #define mc146818_decode_year(year) ((year) + 1980) |
17 | #endif | ||
14 | 18 | ||
15 | #include_next <mc146818rtc.h> | 19 | #include_next <mc146818rtc.h> |
16 | 20 | ||
17 | #endif /* __ASM_MACH_RM200_MC146818RTC_H */ | 21 | #endif /* __ASM_MACH_RM_MC146818RTC_H */ |
diff --git a/include/asm-mips/mips-boards/prom.h b/include/asm-mips/mips-boards/prom.h index 7bf6f5f6ab9c..daaf9f98fc63 100644 --- a/include/asm-mips/mips-boards/prom.h +++ b/include/asm-mips/mips-boards/prom.h | |||
@@ -28,8 +28,6 @@ | |||
28 | 28 | ||
29 | extern char *prom_getcmdline(void); | 29 | extern char *prom_getcmdline(void); |
30 | extern char *prom_getenv(char *name); | 30 | extern char *prom_getenv(char *name); |
31 | extern void setup_prom_printf(int tty_no); | ||
32 | extern void prom_printf(char *fmt, ...); | ||
33 | extern void prom_init_cmdline(void); | 31 | extern void prom_init_cmdline(void); |
34 | extern void prom_meminit(void); | 32 | extern void prom_meminit(void); |
35 | extern void prom_fixup_mem_map(unsigned long start_mem, unsigned long end_mem); | 33 | extern void prom_fixup_mem_map(unsigned long start_mem, unsigned long end_mem); |
diff --git a/include/asm-mips/sgialib.h b/include/asm-mips/sgialib.h index 73f097315502..bfce5c786f1c 100644 --- a/include/asm-mips/sgialib.h +++ b/include/asm-mips/sgialib.h | |||
@@ -33,9 +33,6 @@ extern int prom_flags; | |||
33 | extern void prom_putchar(char c); | 33 | extern void prom_putchar(char c); |
34 | extern char prom_getchar(void); | 34 | extern char prom_getchar(void); |
35 | 35 | ||
36 | /* Generic printf() using ARCS console I/O. */ | ||
37 | extern void prom_printf(char *fmt, ...); | ||
38 | |||
39 | /* Memory descriptor management. */ | 36 | /* Memory descriptor management. */ |
40 | #define PROM_MAX_PMEMBLOCKS 32 | 37 | #define PROM_MAX_PMEMBLOCKS 32 |
41 | struct prom_pmemblock { | 38 | struct prom_pmemblock { |
diff --git a/include/asm-mips/sibyte/sb1250.h b/include/asm-mips/sibyte/sb1250.h index 2ba6988ddc8e..dfb29e13bce0 100644 --- a/include/asm-mips/sibyte/sb1250.h +++ b/include/asm-mips/sibyte/sb1250.h | |||
@@ -57,8 +57,6 @@ extern void bcm1480_mask_irq(int cpu, int irq); | |||
57 | extern void bcm1480_unmask_irq(int cpu, int irq); | 57 | extern void bcm1480_unmask_irq(int cpu, int irq); |
58 | extern void bcm1480_smp_finish(void); | 58 | extern void bcm1480_smp_finish(void); |
59 | 59 | ||
60 | extern void prom_printf(char *fmt, ...); | ||
61 | |||
62 | #define AT_spin \ | 60 | #define AT_spin \ |
63 | __asm__ __volatile__ ( \ | 61 | __asm__ __volatile__ ( \ |
64 | ".set noat\n" \ | 62 | ".set noat\n" \ |
diff --git a/include/linux/ds1742rtc.h b/include/linux/ds1742rtc.h deleted file mode 100644 index a83cdd1cafc9..000000000000 --- a/include/linux/ds1742rtc.h +++ /dev/null | |||
@@ -1,53 +0,0 @@ | |||
1 | /* | ||
2 | * ds1742rtc.h - register definitions for the Real-Time-Clock / CMOS RAM | ||
3 | * | ||
4 | * Copyright (C) 1999-2001 Toshiba Corporation | ||
5 | * Copyright (C) 2003 Ralf Baechle (ralf@linux-mips.org) | ||
6 | * | ||
7 | * Permission is hereby granted to copy, modify and redistribute this code | ||
8 | * in terms of the GNU Library General Public License, Version 2 or later, | ||
9 | * at your option. | ||
10 | */ | ||
11 | #ifndef __LINUX_DS1742RTC_H | ||
12 | #define __LINUX_DS1742RTC_H | ||
13 | |||
14 | #include <asm/ds1742.h> | ||
15 | |||
16 | #define RTC_BRAM_SIZE 0x800 | ||
17 | #define RTC_OFFSET 0x7f8 | ||
18 | |||
19 | /* | ||
20 | * Register summary | ||
21 | */ | ||
22 | #define RTC_CONTROL (RTC_OFFSET + 0) | ||
23 | #define RTC_CENTURY (RTC_OFFSET + 0) | ||
24 | #define RTC_SECONDS (RTC_OFFSET + 1) | ||
25 | #define RTC_MINUTES (RTC_OFFSET + 2) | ||
26 | #define RTC_HOURS (RTC_OFFSET + 3) | ||
27 | #define RTC_DAY (RTC_OFFSET + 4) | ||
28 | #define RTC_DATE (RTC_OFFSET + 5) | ||
29 | #define RTC_MONTH (RTC_OFFSET + 6) | ||
30 | #define RTC_YEAR (RTC_OFFSET + 7) | ||
31 | |||
32 | #define RTC_CENTURY_MASK 0x3f | ||
33 | #define RTC_SECONDS_MASK 0x7f | ||
34 | #define RTC_DAY_MASK 0x07 | ||
35 | |||
36 | /* | ||
37 | * Bits in the Control/Century register | ||
38 | */ | ||
39 | #define RTC_WRITE 0x80 | ||
40 | #define RTC_READ 0x40 | ||
41 | |||
42 | /* | ||
43 | * Bits in the Seconds register | ||
44 | */ | ||
45 | #define RTC_STOP 0x80 | ||
46 | |||
47 | /* | ||
48 | * Bits in the Day register | ||
49 | */ | ||
50 | #define RTC_BATT_FLAG 0x80 | ||
51 | #define RTC_FREQ_TEST 0x40 | ||
52 | |||
53 | #endif /* __LINUX_DS1742RTC_H */ | ||
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index 35cb38573583..d103580c72d2 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h | |||
@@ -70,15 +70,34 @@ extern void vlan_ioctl_set(int (*hook)(void __user *)); | |||
70 | * depends on completely exhausting the VLAN identifier space. Thus | 70 | * depends on completely exhausting the VLAN identifier space. Thus |
71 | * it gives constant time look-up, but in many cases it wastes memory. | 71 | * it gives constant time look-up, but in many cases it wastes memory. |
72 | */ | 72 | */ |
73 | #define VLAN_GROUP_ARRAY_LEN 4096 | 73 | #define VLAN_GROUP_ARRAY_LEN 4096 |
74 | #define VLAN_GROUP_ARRAY_SPLIT_PARTS 8 | ||
75 | #define VLAN_GROUP_ARRAY_PART_LEN (VLAN_GROUP_ARRAY_LEN/VLAN_GROUP_ARRAY_SPLIT_PARTS) | ||
74 | 76 | ||
75 | struct vlan_group { | 77 | struct vlan_group { |
76 | int real_dev_ifindex; /* The ifindex of the ethernet(like) device the vlan is attached to. */ | 78 | int real_dev_ifindex; /* The ifindex of the ethernet(like) device the vlan is attached to. */ |
77 | struct hlist_node hlist; /* linked list */ | 79 | struct hlist_node hlist; /* linked list */ |
78 | struct net_device *vlan_devices[VLAN_GROUP_ARRAY_LEN]; | 80 | struct net_device **vlan_devices_arrays[VLAN_GROUP_ARRAY_SPLIT_PARTS]; |
79 | struct rcu_head rcu; | 81 | struct rcu_head rcu; |
80 | }; | 82 | }; |
81 | 83 | ||
84 | static inline struct net_device *vlan_group_get_device(struct vlan_group *vg, int vlan_id) | ||
85 | { | ||
86 | struct net_device **array; | ||
87 | array = vg->vlan_devices_arrays[vlan_id / VLAN_GROUP_ARRAY_PART_LEN]; | ||
88 | return array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN]; | ||
89 | } | ||
90 | |||
91 | static inline void vlan_group_set_device(struct vlan_group *vg, int vlan_id, | ||
92 | struct net_device *dev) | ||
93 | { | ||
94 | struct net_device **array; | ||
95 | if (!vg) | ||
96 | return; | ||
97 | array = vg->vlan_devices_arrays[vlan_id / VLAN_GROUP_ARRAY_PART_LEN]; | ||
98 | array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN] = dev; | ||
99 | } | ||
100 | |||
82 | struct vlan_priority_tci_mapping { | 101 | struct vlan_priority_tci_mapping { |
83 | unsigned long priority; | 102 | unsigned long priority; |
84 | unsigned short vlan_qos; /* This should be shifted when first set, so we only do it | 103 | unsigned short vlan_qos; /* This should be shifted when first set, so we only do it |
@@ -160,7 +179,7 @@ static inline int __vlan_hwaccel_rx(struct sk_buff *skb, | |||
160 | return NET_RX_DROP; | 179 | return NET_RX_DROP; |
161 | } | 180 | } |
162 | 181 | ||
163 | skb->dev = grp->vlan_devices[vlan_tag & VLAN_VID_MASK]; | 182 | skb->dev = vlan_group_get_device(grp, vlan_tag & VLAN_VID_MASK); |
164 | if (skb->dev == NULL) { | 183 | if (skb->dev == NULL) { |
165 | dev_kfree_skb_any(skb); | 184 | dev_kfree_skb_any(skb); |
166 | 185 | ||
diff --git a/include/linux/kvm.h b/include/linux/kvm.h index f3604593fb76..275354ffa1cb 100644 --- a/include/linux/kvm.h +++ b/include/linux/kvm.h | |||
@@ -11,7 +11,7 @@ | |||
11 | #include <asm/types.h> | 11 | #include <asm/types.h> |
12 | #include <linux/ioctl.h> | 12 | #include <linux/ioctl.h> |
13 | 13 | ||
14 | #define KVM_API_VERSION 3 | 14 | #define KVM_API_VERSION 4 |
15 | 15 | ||
16 | /* | 16 | /* |
17 | * Architectural interrupt line count, and the size of the bitmap needed | 17 | * Architectural interrupt line count, and the size of the bitmap needed |
@@ -52,11 +52,10 @@ enum kvm_exit_reason { | |||
52 | /* for KVM_RUN */ | 52 | /* for KVM_RUN */ |
53 | struct kvm_run { | 53 | struct kvm_run { |
54 | /* in */ | 54 | /* in */ |
55 | __u32 vcpu; | ||
56 | __u32 emulated; /* skip current instruction */ | 55 | __u32 emulated; /* skip current instruction */ |
57 | __u32 mmio_completed; /* mmio request completed */ | 56 | __u32 mmio_completed; /* mmio request completed */ |
58 | __u8 request_interrupt_window; | 57 | __u8 request_interrupt_window; |
59 | __u8 padding1[3]; | 58 | __u8 padding1[7]; |
60 | 59 | ||
61 | /* out */ | 60 | /* out */ |
62 | __u32 exit_type; | 61 | __u32 exit_type; |
@@ -111,10 +110,6 @@ struct kvm_run { | |||
111 | 110 | ||
112 | /* for KVM_GET_REGS and KVM_SET_REGS */ | 111 | /* for KVM_GET_REGS and KVM_SET_REGS */ |
113 | struct kvm_regs { | 112 | struct kvm_regs { |
114 | /* in */ | ||
115 | __u32 vcpu; | ||
116 | __u32 padding; | ||
117 | |||
118 | /* out (KVM_GET_REGS) / in (KVM_SET_REGS) */ | 113 | /* out (KVM_GET_REGS) / in (KVM_SET_REGS) */ |
119 | __u64 rax, rbx, rcx, rdx; | 114 | __u64 rax, rbx, rcx, rdx; |
120 | __u64 rsi, rdi, rsp, rbp; | 115 | __u64 rsi, rdi, rsp, rbp; |
@@ -141,10 +136,6 @@ struct kvm_dtable { | |||
141 | 136 | ||
142 | /* for KVM_GET_SREGS and KVM_SET_SREGS */ | 137 | /* for KVM_GET_SREGS and KVM_SET_SREGS */ |
143 | struct kvm_sregs { | 138 | struct kvm_sregs { |
144 | /* in */ | ||
145 | __u32 vcpu; | ||
146 | __u32 padding; | ||
147 | |||
148 | /* out (KVM_GET_SREGS) / in (KVM_SET_SREGS) */ | 139 | /* out (KVM_GET_SREGS) / in (KVM_SET_SREGS) */ |
149 | struct kvm_segment cs, ds, es, fs, gs, ss; | 140 | struct kvm_segment cs, ds, es, fs, gs, ss; |
150 | struct kvm_segment tr, ldt; | 141 | struct kvm_segment tr, ldt; |
@@ -163,8 +154,8 @@ struct kvm_msr_entry { | |||
163 | 154 | ||
164 | /* for KVM_GET_MSRS and KVM_SET_MSRS */ | 155 | /* for KVM_GET_MSRS and KVM_SET_MSRS */ |
165 | struct kvm_msrs { | 156 | struct kvm_msrs { |
166 | __u32 vcpu; | ||
167 | __u32 nmsrs; /* number of msrs in entries */ | 157 | __u32 nmsrs; /* number of msrs in entries */ |
158 | __u32 pad; | ||
168 | 159 | ||
169 | struct kvm_msr_entry entries[0]; | 160 | struct kvm_msr_entry entries[0]; |
170 | }; | 161 | }; |
@@ -179,8 +170,6 @@ struct kvm_msr_list { | |||
179 | struct kvm_translation { | 170 | struct kvm_translation { |
180 | /* in */ | 171 | /* in */ |
181 | __u64 linear_address; | 172 | __u64 linear_address; |
182 | __u32 vcpu; | ||
183 | __u32 padding; | ||
184 | 173 | ||
185 | /* out */ | 174 | /* out */ |
186 | __u64 physical_address; | 175 | __u64 physical_address; |
@@ -193,7 +182,6 @@ struct kvm_translation { | |||
193 | /* for KVM_INTERRUPT */ | 182 | /* for KVM_INTERRUPT */ |
194 | struct kvm_interrupt { | 183 | struct kvm_interrupt { |
195 | /* in */ | 184 | /* in */ |
196 | __u32 vcpu; | ||
197 | __u32 irq; | 185 | __u32 irq; |
198 | }; | 186 | }; |
199 | 187 | ||
@@ -206,8 +194,8 @@ struct kvm_breakpoint { | |||
206 | /* for KVM_DEBUG_GUEST */ | 194 | /* for KVM_DEBUG_GUEST */ |
207 | struct kvm_debug_guest { | 195 | struct kvm_debug_guest { |
208 | /* int */ | 196 | /* int */ |
209 | __u32 vcpu; | ||
210 | __u32 enabled; | 197 | __u32 enabled; |
198 | __u32 pad; | ||
211 | struct kvm_breakpoint breakpoints[4]; | 199 | struct kvm_breakpoint breakpoints[4]; |
212 | __u32 singlestep; | 200 | __u32 singlestep; |
213 | }; | 201 | }; |
@@ -224,20 +212,36 @@ struct kvm_dirty_log { | |||
224 | 212 | ||
225 | #define KVMIO 0xAE | 213 | #define KVMIO 0xAE |
226 | 214 | ||
215 | /* | ||
216 | * ioctls for /dev/kvm fds: | ||
217 | */ | ||
227 | #define KVM_GET_API_VERSION _IO(KVMIO, 1) | 218 | #define KVM_GET_API_VERSION _IO(KVMIO, 1) |
219 | #define KVM_CREATE_VM _IO(KVMIO, 2) /* returns a VM fd */ | ||
220 | #define KVM_GET_MSR_INDEX_LIST _IOWR(KVMIO, 15, struct kvm_msr_list) | ||
221 | |||
222 | /* | ||
223 | * ioctls for VM fds | ||
224 | */ | ||
225 | #define KVM_SET_MEMORY_REGION _IOW(KVMIO, 10, struct kvm_memory_region) | ||
226 | /* | ||
227 | * KVM_CREATE_VCPU receives as a parameter the vcpu slot, and returns | ||
228 | * a vcpu fd. | ||
229 | */ | ||
230 | #define KVM_CREATE_VCPU _IOW(KVMIO, 11, int) | ||
231 | #define KVM_GET_DIRTY_LOG _IOW(KVMIO, 12, struct kvm_dirty_log) | ||
232 | |||
233 | /* | ||
234 | * ioctls for vcpu fds | ||
235 | */ | ||
228 | #define KVM_RUN _IOWR(KVMIO, 2, struct kvm_run) | 236 | #define KVM_RUN _IOWR(KVMIO, 2, struct kvm_run) |
229 | #define KVM_GET_REGS _IOWR(KVMIO, 3, struct kvm_regs) | 237 | #define KVM_GET_REGS _IOR(KVMIO, 3, struct kvm_regs) |
230 | #define KVM_SET_REGS _IOW(KVMIO, 4, struct kvm_regs) | 238 | #define KVM_SET_REGS _IOW(KVMIO, 4, struct kvm_regs) |
231 | #define KVM_GET_SREGS _IOWR(KVMIO, 5, struct kvm_sregs) | 239 | #define KVM_GET_SREGS _IOR(KVMIO, 5, struct kvm_sregs) |
232 | #define KVM_SET_SREGS _IOW(KVMIO, 6, struct kvm_sregs) | 240 | #define KVM_SET_SREGS _IOW(KVMIO, 6, struct kvm_sregs) |
233 | #define KVM_TRANSLATE _IOWR(KVMIO, 7, struct kvm_translation) | 241 | #define KVM_TRANSLATE _IOWR(KVMIO, 7, struct kvm_translation) |
234 | #define KVM_INTERRUPT _IOW(KVMIO, 8, struct kvm_interrupt) | 242 | #define KVM_INTERRUPT _IOW(KVMIO, 8, struct kvm_interrupt) |
235 | #define KVM_DEBUG_GUEST _IOW(KVMIO, 9, struct kvm_debug_guest) | 243 | #define KVM_DEBUG_GUEST _IOW(KVMIO, 9, struct kvm_debug_guest) |
236 | #define KVM_SET_MEMORY_REGION _IOW(KVMIO, 10, struct kvm_memory_region) | ||
237 | #define KVM_CREATE_VCPU _IOW(KVMIO, 11, int /* vcpu_slot */) | ||
238 | #define KVM_GET_DIRTY_LOG _IOW(KVMIO, 12, struct kvm_dirty_log) | ||
239 | #define KVM_GET_MSRS _IOWR(KVMIO, 13, struct kvm_msrs) | 244 | #define KVM_GET_MSRS _IOWR(KVMIO, 13, struct kvm_msrs) |
240 | #define KVM_SET_MSRS _IOWR(KVMIO, 14, struct kvm_msrs) | 245 | #define KVM_SET_MSRS _IOW(KVMIO, 14, struct kvm_msrs) |
241 | #define KVM_GET_MSR_INDEX_LIST _IOWR(KVMIO, 15, struct kvm_msr_list) | ||
242 | 246 | ||
243 | #endif | 247 | #endif |
diff --git a/include/linux/kvm_para.h b/include/linux/kvm_para.h new file mode 100644 index 000000000000..3b292565a693 --- /dev/null +++ b/include/linux/kvm_para.h | |||
@@ -0,0 +1,73 @@ | |||
1 | #ifndef __LINUX_KVM_PARA_H | ||
2 | #define __LINUX_KVM_PARA_H | ||
3 | |||
4 | /* | ||
5 | * Guest OS interface for KVM paravirtualization | ||
6 | * | ||
7 | * Note: this interface is totally experimental, and is certain to change | ||
8 | * as we make progress. | ||
9 | */ | ||
10 | |||
11 | /* | ||
12 | * Per-VCPU descriptor area shared between guest and host. Writable to | ||
13 | * both guest and host. Registered with the host by the guest when | ||
14 | * a guest acknowledges paravirtual mode. | ||
15 | * | ||
16 | * NOTE: all addresses are guest-physical addresses (gpa), to make it | ||
17 | * easier for the hypervisor to map between the various addresses. | ||
18 | */ | ||
19 | struct kvm_vcpu_para_state { | ||
20 | /* | ||
21 | * API version information for compatibility. If there's any support | ||
22 | * mismatch (too old host trying to execute too new guest) then | ||
23 | * the host will deny entry into paravirtual mode. Any other | ||
24 | * combination (new host + old guest and new host + new guest) | ||
25 | * is supposed to work - new host versions will support all old | ||
26 | * guest API versions. | ||
27 | */ | ||
28 | u32 guest_version; | ||
29 | u32 host_version; | ||
30 | u32 size; | ||
31 | u32 ret; | ||
32 | |||
33 | /* | ||
34 | * The address of the vm exit instruction (VMCALL or VMMCALL), | ||
35 | * which the host will patch according to the CPU model the | ||
36 | * VM runs on: | ||
37 | */ | ||
38 | u64 hypercall_gpa; | ||
39 | |||
40 | } __attribute__ ((aligned(PAGE_SIZE))); | ||
41 | |||
42 | #define KVM_PARA_API_VERSION 1 | ||
43 | |||
44 | /* | ||
45 | * This is used for an RDMSR's ECX parameter to probe for a KVM host. | ||
46 | * Hopefully no CPU vendor will use up this number. This is placed well | ||
47 | * out of way of the typical space occupied by CPU vendors' MSR indices, | ||
48 | * and we think (or at least hope) it wont be occupied in the future | ||
49 | * either. | ||
50 | */ | ||
51 | #define MSR_KVM_API_MAGIC 0x87655678 | ||
52 | |||
53 | #define KVM_EINVAL 1 | ||
54 | |||
55 | /* | ||
56 | * Hypercall calling convention: | ||
57 | * | ||
58 | * Each hypercall may have 0-6 parameters. | ||
59 | * | ||
60 | * 64-bit hypercall index is in RAX, goes from 0 to __NR_hypercalls-1 | ||
61 | * | ||
62 | * 64-bit parameters 1-6 are in the standard gcc x86_64 calling convention | ||
63 | * order: RDI, RSI, RDX, RCX, R8, R9. | ||
64 | * | ||
65 | * 32-bit index is EBX, parameters are: EAX, ECX, EDX, ESI, EDI, EBP. | ||
66 | * (the first 3 are according to the gcc regparm calling convention) | ||
67 | * | ||
68 | * No registers are clobbered by the hypercall, except that the | ||
69 | * return value is in RAX. | ||
70 | */ | ||
71 | #define __NR_hypercalls 0 | ||
72 | |||
73 | #endif | ||
diff --git a/include/linux/magic.h b/include/linux/magic.h index b32c8a97fcec..a9c6567fe70c 100644 --- a/include/linux/magic.h +++ b/include/linux/magic.h | |||
@@ -13,6 +13,7 @@ | |||
13 | #define HPFS_SUPER_MAGIC 0xf995e849 | 13 | #define HPFS_SUPER_MAGIC 0xf995e849 |
14 | #define ISOFS_SUPER_MAGIC 0x9660 | 14 | #define ISOFS_SUPER_MAGIC 0x9660 |
15 | #define JFFS2_SUPER_MAGIC 0x72b6 | 15 | #define JFFS2_SUPER_MAGIC 0x72b6 |
16 | #define KVMFS_SUPER_MAGIC 0x19700426 | ||
16 | 17 | ||
17 | #define MINIX_SUPER_MAGIC 0x137F /* original minix fs */ | 18 | #define MINIX_SUPER_MAGIC 0x137F /* original minix fs */ |
18 | #define MINIX_SUPER_MAGIC2 0x138F /* minix fs, 30 char names */ | 19 | #define MINIX_SUPER_MAGIC2 0x138F /* minix fs, 30 char names */ |
diff --git a/include/net/sock.h b/include/net/sock.h index 2c7d60ca3548..849c7df23181 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -426,7 +426,7 @@ static inline void sk_acceptq_added(struct sock *sk) | |||
426 | 426 | ||
427 | static inline int sk_acceptq_is_full(struct sock *sk) | 427 | static inline int sk_acceptq_is_full(struct sock *sk) |
428 | { | 428 | { |
429 | return sk->sk_ack_backlog > sk->sk_max_ack_backlog; | 429 | return sk->sk_ack_backlog >= sk->sk_max_ack_backlog; |
430 | } | 430 | } |
431 | 431 | ||
432 | /* | 432 | /* |
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index c1c205fad4fb..eb1c71ed7dfe 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c | |||
@@ -184,14 +184,23 @@ struct net_device *__find_vlan_dev(struct net_device *real_dev, | |||
184 | struct vlan_group *grp = __vlan_find_group(real_dev->ifindex); | 184 | struct vlan_group *grp = __vlan_find_group(real_dev->ifindex); |
185 | 185 | ||
186 | if (grp) | 186 | if (grp) |
187 | return grp->vlan_devices[VID]; | 187 | return vlan_group_get_device(grp, VID); |
188 | 188 | ||
189 | return NULL; | 189 | return NULL; |
190 | } | 190 | } |
191 | 191 | ||
192 | static void vlan_group_free(struct vlan_group *grp) | ||
193 | { | ||
194 | int i; | ||
195 | |||
196 | for (i=0; i < VLAN_GROUP_ARRAY_SPLIT_PARTS; i++) | ||
197 | kfree(grp->vlan_devices_arrays[i]); | ||
198 | kfree(grp); | ||
199 | } | ||
200 | |||
192 | static void vlan_rcu_free(struct rcu_head *rcu) | 201 | static void vlan_rcu_free(struct rcu_head *rcu) |
193 | { | 202 | { |
194 | kfree(container_of(rcu, struct vlan_group, rcu)); | 203 | vlan_group_free(container_of(rcu, struct vlan_group, rcu)); |
195 | } | 204 | } |
196 | 205 | ||
197 | 206 | ||
@@ -223,7 +232,7 @@ static int unregister_vlan_dev(struct net_device *real_dev, | |||
223 | ret = 0; | 232 | ret = 0; |
224 | 233 | ||
225 | if (grp) { | 234 | if (grp) { |
226 | dev = grp->vlan_devices[vlan_id]; | 235 | dev = vlan_group_get_device(grp, vlan_id); |
227 | if (dev) { | 236 | if (dev) { |
228 | /* Remove proc entry */ | 237 | /* Remove proc entry */ |
229 | vlan_proc_rem_dev(dev); | 238 | vlan_proc_rem_dev(dev); |
@@ -237,7 +246,7 @@ static int unregister_vlan_dev(struct net_device *real_dev, | |||
237 | real_dev->vlan_rx_kill_vid(real_dev, vlan_id); | 246 | real_dev->vlan_rx_kill_vid(real_dev, vlan_id); |
238 | } | 247 | } |
239 | 248 | ||
240 | grp->vlan_devices[vlan_id] = NULL; | 249 | vlan_group_set_device(grp, vlan_id, NULL); |
241 | synchronize_net(); | 250 | synchronize_net(); |
242 | 251 | ||
243 | 252 | ||
@@ -251,7 +260,7 @@ static int unregister_vlan_dev(struct net_device *real_dev, | |||
251 | * group. | 260 | * group. |
252 | */ | 261 | */ |
253 | for (i = 0; i < VLAN_VID_MASK; i++) | 262 | for (i = 0; i < VLAN_VID_MASK; i++) |
254 | if (grp->vlan_devices[i]) | 263 | if (vlan_group_get_device(grp, i)) |
255 | break; | 264 | break; |
256 | 265 | ||
257 | if (i == VLAN_VID_MASK) { | 266 | if (i == VLAN_VID_MASK) { |
@@ -379,6 +388,7 @@ static struct net_device *register_vlan_device(const char *eth_IF_name, | |||
379 | struct net_device *new_dev; | 388 | struct net_device *new_dev; |
380 | struct net_device *real_dev; /* the ethernet device */ | 389 | struct net_device *real_dev; /* the ethernet device */ |
381 | char name[IFNAMSIZ]; | 390 | char name[IFNAMSIZ]; |
391 | int i; | ||
382 | 392 | ||
383 | #ifdef VLAN_DEBUG | 393 | #ifdef VLAN_DEBUG |
384 | printk(VLAN_DBG "%s: if_name -:%s:- vid: %i\n", | 394 | printk(VLAN_DBG "%s: if_name -:%s:- vid: %i\n", |
@@ -544,6 +554,15 @@ static struct net_device *register_vlan_device(const char *eth_IF_name, | |||
544 | if (!grp) | 554 | if (!grp) |
545 | goto out_free_unregister; | 555 | goto out_free_unregister; |
546 | 556 | ||
557 | for (i=0; i < VLAN_GROUP_ARRAY_SPLIT_PARTS; i++) { | ||
558 | grp->vlan_devices_arrays[i] = kzalloc( | ||
559 | sizeof(struct net_device *)*VLAN_GROUP_ARRAY_PART_LEN, | ||
560 | GFP_KERNEL); | ||
561 | |||
562 | if (!grp->vlan_devices_arrays[i]) | ||
563 | goto out_free_arrays; | ||
564 | } | ||
565 | |||
547 | /* printk(KERN_ALERT "VLAN REGISTER: Allocated new group.\n"); */ | 566 | /* printk(KERN_ALERT "VLAN REGISTER: Allocated new group.\n"); */ |
548 | grp->real_dev_ifindex = real_dev->ifindex; | 567 | grp->real_dev_ifindex = real_dev->ifindex; |
549 | 568 | ||
@@ -554,7 +573,7 @@ static struct net_device *register_vlan_device(const char *eth_IF_name, | |||
554 | real_dev->vlan_rx_register(real_dev, grp); | 573 | real_dev->vlan_rx_register(real_dev, grp); |
555 | } | 574 | } |
556 | 575 | ||
557 | grp->vlan_devices[VLAN_ID] = new_dev; | 576 | vlan_group_set_device(grp, VLAN_ID, new_dev); |
558 | 577 | ||
559 | if (vlan_proc_add_dev(new_dev)<0)/* create it's proc entry */ | 578 | if (vlan_proc_add_dev(new_dev)<0)/* create it's proc entry */ |
560 | printk(KERN_WARNING "VLAN: failed to add proc entry for %s\n", | 579 | printk(KERN_WARNING "VLAN: failed to add proc entry for %s\n", |
@@ -571,6 +590,9 @@ static struct net_device *register_vlan_device(const char *eth_IF_name, | |||
571 | #endif | 590 | #endif |
572 | return new_dev; | 591 | return new_dev; |
573 | 592 | ||
593 | out_free_arrays: | ||
594 | vlan_group_free(grp); | ||
595 | |||
574 | out_free_unregister: | 596 | out_free_unregister: |
575 | unregister_netdev(new_dev); | 597 | unregister_netdev(new_dev); |
576 | goto out_unlock; | 598 | goto out_unlock; |
@@ -606,7 +628,7 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event, | |||
606 | case NETDEV_CHANGE: | 628 | case NETDEV_CHANGE: |
607 | /* Propagate real device state to vlan devices */ | 629 | /* Propagate real device state to vlan devices */ |
608 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { | 630 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { |
609 | vlandev = grp->vlan_devices[i]; | 631 | vlandev = vlan_group_get_device(grp, i); |
610 | if (!vlandev) | 632 | if (!vlandev) |
611 | continue; | 633 | continue; |
612 | 634 | ||
@@ -617,7 +639,7 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event, | |||
617 | case NETDEV_DOWN: | 639 | case NETDEV_DOWN: |
618 | /* Put all VLANs for this dev in the down state too. */ | 640 | /* Put all VLANs for this dev in the down state too. */ |
619 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { | 641 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { |
620 | vlandev = grp->vlan_devices[i]; | 642 | vlandev = vlan_group_get_device(grp, i); |
621 | if (!vlandev) | 643 | if (!vlandev) |
622 | continue; | 644 | continue; |
623 | 645 | ||
@@ -632,7 +654,7 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event, | |||
632 | case NETDEV_UP: | 654 | case NETDEV_UP: |
633 | /* Put all VLANs for this dev in the up state too. */ | 655 | /* Put all VLANs for this dev in the up state too. */ |
634 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { | 656 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { |
635 | vlandev = grp->vlan_devices[i]; | 657 | vlandev = vlan_group_get_device(grp, i); |
636 | if (!vlandev) | 658 | if (!vlandev) |
637 | continue; | 659 | continue; |
638 | 660 | ||
@@ -649,7 +671,7 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event, | |||
649 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { | 671 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { |
650 | int ret; | 672 | int ret; |
651 | 673 | ||
652 | vlandev = grp->vlan_devices[i]; | 674 | vlandev = vlan_group_get_device(grp, i); |
653 | if (!vlandev) | 675 | if (!vlandev) |
654 | continue; | 676 | continue; |
655 | 677 | ||
diff --git a/net/ipv4/cipso_ipv4.c b/net/ipv4/cipso_ipv4.c index 60aafb4a8adf..c976dd7e9758 100644 --- a/net/ipv4/cipso_ipv4.c +++ b/net/ipv4/cipso_ipv4.c | |||
@@ -732,11 +732,12 @@ static int cipso_v4_map_lvl_hton(const struct cipso_v4_doi *doi_def, | |||
732 | *net_lvl = host_lvl; | 732 | *net_lvl = host_lvl; |
733 | return 0; | 733 | return 0; |
734 | case CIPSO_V4_MAP_STD: | 734 | case CIPSO_V4_MAP_STD: |
735 | if (host_lvl < doi_def->map.std->lvl.local_size) { | 735 | if (host_lvl < doi_def->map.std->lvl.local_size && |
736 | doi_def->map.std->lvl.local[host_lvl] < CIPSO_V4_INV_LVL) { | ||
736 | *net_lvl = doi_def->map.std->lvl.local[host_lvl]; | 737 | *net_lvl = doi_def->map.std->lvl.local[host_lvl]; |
737 | return 0; | 738 | return 0; |
738 | } | 739 | } |
739 | break; | 740 | return -EPERM; |
740 | } | 741 | } |
741 | 742 | ||
742 | return -EINVAL; | 743 | return -EINVAL; |
@@ -771,7 +772,7 @@ static int cipso_v4_map_lvl_ntoh(const struct cipso_v4_doi *doi_def, | |||
771 | *host_lvl = doi_def->map.std->lvl.cipso[net_lvl]; | 772 | *host_lvl = doi_def->map.std->lvl.cipso[net_lvl]; |
772 | return 0; | 773 | return 0; |
773 | } | 774 | } |
774 | break; | 775 | return -EPERM; |
775 | } | 776 | } |
776 | 777 | ||
777 | return -EINVAL; | 778 | return -EINVAL; |
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 606971645b33..51ca4383c388 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
@@ -934,7 +934,7 @@ static long unix_wait_for_peer(struct sock *other, long timeo) | |||
934 | 934 | ||
935 | sched = !sock_flag(other, SOCK_DEAD) && | 935 | sched = !sock_flag(other, SOCK_DEAD) && |
936 | !(other->sk_shutdown & RCV_SHUTDOWN) && | 936 | !(other->sk_shutdown & RCV_SHUTDOWN) && |
937 | (skb_queue_len(&other->sk_receive_queue) > | 937 | (skb_queue_len(&other->sk_receive_queue) >= |
938 | other->sk_max_ack_backlog); | 938 | other->sk_max_ack_backlog); |
939 | 939 | ||
940 | unix_state_runlock(other); | 940 | unix_state_runlock(other); |
@@ -1008,7 +1008,7 @@ restart: | |||
1008 | if (other->sk_state != TCP_LISTEN) | 1008 | if (other->sk_state != TCP_LISTEN) |
1009 | goto out_unlock; | 1009 | goto out_unlock; |
1010 | 1010 | ||
1011 | if (skb_queue_len(&other->sk_receive_queue) > | 1011 | if (skb_queue_len(&other->sk_receive_queue) >= |
1012 | other->sk_max_ack_backlog) { | 1012 | other->sk_max_ack_backlog) { |
1013 | err = -EAGAIN; | 1013 | err = -EAGAIN; |
1014 | if (!timeo) | 1014 | if (!timeo) |
@@ -1381,7 +1381,7 @@ restart: | |||
1381 | } | 1381 | } |
1382 | 1382 | ||
1383 | if (unix_peer(other) != sk && | 1383 | if (unix_peer(other) != sk && |
1384 | (skb_queue_len(&other->sk_receive_queue) > | 1384 | (skb_queue_len(&other->sk_receive_queue) >= |
1385 | other->sk_max_ack_backlog)) { | 1385 | other->sk_max_ack_backlog)) { |
1386 | if (!timeo) { | 1386 | if (!timeo) { |
1387 | err = -EAGAIN; | 1387 | err = -EAGAIN; |