diff options
author | David S. Miller <davem@davemloft.net> | 2012-09-15 11:43:53 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-09-15 11:43:53 -0400 |
commit | b48b63a1f6e26b0dec2c9f1690396ed4bcb66903 (patch) | |
tree | 8d9ad227c3a7d35cd78d40ecaf9bf59375dbd21a /arch/mips | |
parent | 7f2e6a5d8608d0353b017a0fe15502307593734e (diff) | |
parent | 3f0c3c8fe30c725c1264fb6db8cc4b69db3a658a (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts:
net/netfilter/nfnetlink_log.c
net/netfilter/xt_LOG.c
Rather easy conflict resolution, the 'net' tree had bug fixes to make
sure we checked if a socket is a time-wait one or not and elide the
logging code if so.
Whereas on the 'net-next' side we are calculating the UID and GID from
the creds using different interfaces due to the user namespace changes
from Eric Biederman.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/mips')
-rw-r--r-- | arch/mips/Kconfig | 1 | ||||
-rw-r--r-- | arch/mips/alchemy/board-mtx1.c | 2 | ||||
-rw-r--r-- | arch/mips/ath79/dev-usb.c | 2 | ||||
-rw-r--r-- | arch/mips/ath79/gpio.c | 6 | ||||
-rw-r--r-- | arch/mips/bcm63xx/dev-spi.c | 4 | ||||
-rw-r--r-- | arch/mips/cavium-octeon/octeon-irq.c | 89 | ||||
-rw-r--r-- | arch/mips/include/asm/mach-ath79/ar71xx_regs.h | 3 | ||||
-rw-r--r-- | arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h | 1 | ||||
-rw-r--r-- | arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_spi.h | 2 | ||||
-rw-r--r-- | arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h | 13 | ||||
-rw-r--r-- | arch/mips/include/asm/mach-cavium-octeon/irq.h | 10 | ||||
-rw-r--r-- | arch/mips/include/asm/module.h | 1 | ||||
-rw-r--r-- | arch/mips/include/asm/r4k-timer.h | 8 | ||||
-rw-r--r-- | arch/mips/kernel/module.c | 43 | ||||
-rw-r--r-- | arch/mips/kernel/smp.c | 4 | ||||
-rw-r--r-- | arch/mips/kernel/sync-r4k.c | 26 | ||||
-rw-r--r-- | arch/mips/mti-malta/malta-pci.c | 13 | ||||
-rw-r--r-- | arch/mips/pci/pci-ar724x.c | 22 |
18 files changed, 145 insertions, 105 deletions
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 331d574df99c..faf65286574e 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -89,6 +89,7 @@ config ATH79 | |||
89 | select CEVT_R4K | 89 | select CEVT_R4K |
90 | select CSRC_R4K | 90 | select CSRC_R4K |
91 | select DMA_NONCOHERENT | 91 | select DMA_NONCOHERENT |
92 | select HAVE_CLK | ||
92 | select IRQ_CPU | 93 | select IRQ_CPU |
93 | select MIPS_MACHINE | 94 | select MIPS_MACHINE |
94 | select SYS_HAS_CPU_MIPS32_R2 | 95 | select SYS_HAS_CPU_MIPS32_R2 |
diff --git a/arch/mips/alchemy/board-mtx1.c b/arch/mips/alchemy/board-mtx1.c index 99969484c475..a124c251c0c9 100644 --- a/arch/mips/alchemy/board-mtx1.c +++ b/arch/mips/alchemy/board-mtx1.c | |||
@@ -228,6 +228,8 @@ static int mtx1_pci_idsel(unsigned int devsel, int assert) | |||
228 | * adapter on the mtx-1 "singleboard" variant. It triggers a custom | 228 | * adapter on the mtx-1 "singleboard" variant. It triggers a custom |
229 | * logic chip connected to EXT_IO3 (GPIO1) to suppress IDSEL signals. | 229 | * logic chip connected to EXT_IO3 (GPIO1) to suppress IDSEL signals. |
230 | */ | 230 | */ |
231 | udelay(1); | ||
232 | |||
231 | if (assert && devsel != 0) | 233 | if (assert && devsel != 0) |
232 | /* Suppress signal to Cardbus */ | 234 | /* Suppress signal to Cardbus */ |
233 | alchemy_gpio_set_value(1, 0); /* set EXT_IO3 OFF */ | 235 | alchemy_gpio_set_value(1, 0); /* set EXT_IO3 OFF */ |
diff --git a/arch/mips/ath79/dev-usb.c b/arch/mips/ath79/dev-usb.c index 36e9570e7bc4..b2a2311ec85b 100644 --- a/arch/mips/ath79/dev-usb.c +++ b/arch/mips/ath79/dev-usb.c | |||
@@ -145,6 +145,8 @@ static void __init ar7240_usb_setup(void) | |||
145 | 145 | ||
146 | ath79_ohci_resources[0].start = AR7240_OHCI_BASE; | 146 | ath79_ohci_resources[0].start = AR7240_OHCI_BASE; |
147 | ath79_ohci_resources[0].end = AR7240_OHCI_BASE + AR7240_OHCI_SIZE - 1; | 147 | ath79_ohci_resources[0].end = AR7240_OHCI_BASE + AR7240_OHCI_SIZE - 1; |
148 | ath79_ohci_resources[1].start = ATH79_CPU_IRQ_USB; | ||
149 | ath79_ohci_resources[1].end = ATH79_CPU_IRQ_USB; | ||
148 | platform_device_register(&ath79_ohci_device); | 150 | platform_device_register(&ath79_ohci_device); |
149 | } | 151 | } |
150 | 152 | ||
diff --git a/arch/mips/ath79/gpio.c b/arch/mips/ath79/gpio.c index 29054f211832..48fe762d2526 100644 --- a/arch/mips/ath79/gpio.c +++ b/arch/mips/ath79/gpio.c | |||
@@ -188,8 +188,10 @@ void __init ath79_gpio_init(void) | |||
188 | 188 | ||
189 | if (soc_is_ar71xx()) | 189 | if (soc_is_ar71xx()) |
190 | ath79_gpio_count = AR71XX_GPIO_COUNT; | 190 | ath79_gpio_count = AR71XX_GPIO_COUNT; |
191 | else if (soc_is_ar724x()) | 191 | else if (soc_is_ar7240()) |
192 | ath79_gpio_count = AR724X_GPIO_COUNT; | 192 | ath79_gpio_count = AR7240_GPIO_COUNT; |
193 | else if (soc_is_ar7241() || soc_is_ar7242()) | ||
194 | ath79_gpio_count = AR7241_GPIO_COUNT; | ||
193 | else if (soc_is_ar913x()) | 195 | else if (soc_is_ar913x()) |
194 | ath79_gpio_count = AR913X_GPIO_COUNT; | 196 | ath79_gpio_count = AR913X_GPIO_COUNT; |
195 | else if (soc_is_ar933x()) | 197 | else if (soc_is_ar933x()) |
diff --git a/arch/mips/bcm63xx/dev-spi.c b/arch/mips/bcm63xx/dev-spi.c index e39f73048d4f..f1c9c3e2f678 100644 --- a/arch/mips/bcm63xx/dev-spi.c +++ b/arch/mips/bcm63xx/dev-spi.c | |||
@@ -106,11 +106,15 @@ int __init bcm63xx_spi_register(void) | |||
106 | if (BCMCPU_IS_6338() || BCMCPU_IS_6348()) { | 106 | if (BCMCPU_IS_6338() || BCMCPU_IS_6348()) { |
107 | spi_resources[0].end += BCM_6338_RSET_SPI_SIZE - 1; | 107 | spi_resources[0].end += BCM_6338_RSET_SPI_SIZE - 1; |
108 | spi_pdata.fifo_size = SPI_6338_MSG_DATA_SIZE; | 108 | spi_pdata.fifo_size = SPI_6338_MSG_DATA_SIZE; |
109 | spi_pdata.msg_type_shift = SPI_6338_MSG_TYPE_SHIFT; | ||
110 | spi_pdata.msg_ctl_width = SPI_6338_MSG_CTL_WIDTH; | ||
109 | } | 111 | } |
110 | 112 | ||
111 | if (BCMCPU_IS_6358() || BCMCPU_IS_6368()) { | 113 | if (BCMCPU_IS_6358() || BCMCPU_IS_6368()) { |
112 | spi_resources[0].end += BCM_6358_RSET_SPI_SIZE - 1; | 114 | spi_resources[0].end += BCM_6358_RSET_SPI_SIZE - 1; |
113 | spi_pdata.fifo_size = SPI_6358_MSG_DATA_SIZE; | 115 | spi_pdata.fifo_size = SPI_6358_MSG_DATA_SIZE; |
116 | spi_pdata.msg_type_shift = SPI_6358_MSG_TYPE_SHIFT; | ||
117 | spi_pdata.msg_ctl_width = SPI_6358_MSG_CTL_WIDTH; | ||
114 | } | 118 | } |
115 | 119 | ||
116 | bcm63xx_spi_regs_init(); | 120 | bcm63xx_spi_regs_init(); |
diff --git a/arch/mips/cavium-octeon/octeon-irq.c b/arch/mips/cavium-octeon/octeon-irq.c index 7fb1f222b8a5..274cd4fad30c 100644 --- a/arch/mips/cavium-octeon/octeon-irq.c +++ b/arch/mips/cavium-octeon/octeon-irq.c | |||
@@ -61,6 +61,12 @@ static void octeon_irq_set_ciu_mapping(int irq, int line, int bit, | |||
61 | octeon_irq_ciu_to_irq[line][bit] = irq; | 61 | octeon_irq_ciu_to_irq[line][bit] = irq; |
62 | } | 62 | } |
63 | 63 | ||
64 | static void octeon_irq_force_ciu_mapping(struct irq_domain *domain, | ||
65 | int irq, int line, int bit) | ||
66 | { | ||
67 | irq_domain_associate(domain, irq, line << 6 | bit); | ||
68 | } | ||
69 | |||
64 | static int octeon_coreid_for_cpu(int cpu) | 70 | static int octeon_coreid_for_cpu(int cpu) |
65 | { | 71 | { |
66 | #ifdef CONFIG_SMP | 72 | #ifdef CONFIG_SMP |
@@ -183,19 +189,9 @@ static void __init octeon_irq_init_core(void) | |||
183 | mutex_init(&cd->core_irq_mutex); | 189 | mutex_init(&cd->core_irq_mutex); |
184 | 190 | ||
185 | irq = OCTEON_IRQ_SW0 + i; | 191 | irq = OCTEON_IRQ_SW0 + i; |
186 | switch (irq) { | 192 | irq_set_chip_data(irq, cd); |
187 | case OCTEON_IRQ_TIMER: | 193 | irq_set_chip_and_handler(irq, &octeon_irq_chip_core, |
188 | case OCTEON_IRQ_SW0: | 194 | handle_percpu_irq); |
189 | case OCTEON_IRQ_SW1: | ||
190 | case OCTEON_IRQ_5: | ||
191 | case OCTEON_IRQ_PERF: | ||
192 | irq_set_chip_data(irq, cd); | ||
193 | irq_set_chip_and_handler(irq, &octeon_irq_chip_core, | ||
194 | handle_percpu_irq); | ||
195 | break; | ||
196 | default: | ||
197 | break; | ||
198 | } | ||
199 | } | 195 | } |
200 | } | 196 | } |
201 | 197 | ||
@@ -890,7 +886,6 @@ static int octeon_irq_gpio_xlat(struct irq_domain *d, | |||
890 | unsigned int type; | 886 | unsigned int type; |
891 | unsigned int pin; | 887 | unsigned int pin; |
892 | unsigned int trigger; | 888 | unsigned int trigger; |
893 | struct octeon_irq_gpio_domain_data *gpiod; | ||
894 | 889 | ||
895 | if (d->of_node != node) | 890 | if (d->of_node != node) |
896 | return -EINVAL; | 891 | return -EINVAL; |
@@ -925,8 +920,7 @@ static int octeon_irq_gpio_xlat(struct irq_domain *d, | |||
925 | break; | 920 | break; |
926 | } | 921 | } |
927 | *out_type = type; | 922 | *out_type = type; |
928 | gpiod = d->host_data; | 923 | *out_hwirq = pin; |
929 | *out_hwirq = gpiod->base_hwirq + pin; | ||
930 | 924 | ||
931 | return 0; | 925 | return 0; |
932 | } | 926 | } |
@@ -996,19 +990,21 @@ static int octeon_irq_ciu_map(struct irq_domain *d, | |||
996 | static int octeon_irq_gpio_map(struct irq_domain *d, | 990 | static int octeon_irq_gpio_map(struct irq_domain *d, |
997 | unsigned int virq, irq_hw_number_t hw) | 991 | unsigned int virq, irq_hw_number_t hw) |
998 | { | 992 | { |
999 | unsigned int line = hw >> 6; | 993 | struct octeon_irq_gpio_domain_data *gpiod = d->host_data; |
1000 | unsigned int bit = hw & 63; | 994 | unsigned int line, bit; |
1001 | 995 | ||
1002 | if (!octeon_irq_virq_in_range(virq)) | 996 | if (!octeon_irq_virq_in_range(virq)) |
1003 | return -EINVAL; | 997 | return -EINVAL; |
1004 | 998 | ||
999 | hw += gpiod->base_hwirq; | ||
1000 | line = hw >> 6; | ||
1001 | bit = hw & 63; | ||
1005 | if (line > 1 || octeon_irq_ciu_to_irq[line][bit] != 0) | 1002 | if (line > 1 || octeon_irq_ciu_to_irq[line][bit] != 0) |
1006 | return -EINVAL; | 1003 | return -EINVAL; |
1007 | 1004 | ||
1008 | octeon_irq_set_ciu_mapping(virq, line, bit, | 1005 | octeon_irq_set_ciu_mapping(virq, line, bit, |
1009 | octeon_irq_gpio_chip, | 1006 | octeon_irq_gpio_chip, |
1010 | octeon_irq_handle_gpio); | 1007 | octeon_irq_handle_gpio); |
1011 | |||
1012 | return 0; | 1008 | return 0; |
1013 | } | 1009 | } |
1014 | 1010 | ||
@@ -1149,6 +1145,7 @@ static void __init octeon_irq_init_ciu(void) | |||
1149 | struct irq_chip *chip_wd; | 1145 | struct irq_chip *chip_wd; |
1150 | struct device_node *gpio_node; | 1146 | struct device_node *gpio_node; |
1151 | struct device_node *ciu_node; | 1147 | struct device_node *ciu_node; |
1148 | struct irq_domain *ciu_domain = NULL; | ||
1152 | 1149 | ||
1153 | octeon_irq_init_ciu_percpu(); | 1150 | octeon_irq_init_ciu_percpu(); |
1154 | octeon_irq_setup_secondary = octeon_irq_setup_secondary_ciu; | 1151 | octeon_irq_setup_secondary = octeon_irq_setup_secondary_ciu; |
@@ -1177,31 +1174,6 @@ static void __init octeon_irq_init_ciu(void) | |||
1177 | /* Mips internal */ | 1174 | /* Mips internal */ |
1178 | octeon_irq_init_core(); | 1175 | octeon_irq_init_core(); |
1179 | 1176 | ||
1180 | /* CIU_0 */ | ||
1181 | for (i = 0; i < 16; i++) | ||
1182 | octeon_irq_set_ciu_mapping(i + OCTEON_IRQ_WORKQ0, 0, i + 0, chip, handle_level_irq); | ||
1183 | |||
1184 | octeon_irq_set_ciu_mapping(OCTEON_IRQ_MBOX0, 0, 32, chip_mbox, handle_percpu_irq); | ||
1185 | octeon_irq_set_ciu_mapping(OCTEON_IRQ_MBOX1, 0, 33, chip_mbox, handle_percpu_irq); | ||
1186 | |||
1187 | for (i = 0; i < 4; i++) | ||
1188 | octeon_irq_set_ciu_mapping(i + OCTEON_IRQ_PCI_INT0, 0, i + 36, chip, handle_level_irq); | ||
1189 | for (i = 0; i < 4; i++) | ||
1190 | octeon_irq_set_ciu_mapping(i + OCTEON_IRQ_PCI_MSI0, 0, i + 40, chip, handle_level_irq); | ||
1191 | |||
1192 | octeon_irq_set_ciu_mapping(OCTEON_IRQ_RML, 0, 46, chip, handle_level_irq); | ||
1193 | for (i = 0; i < 4; i++) | ||
1194 | octeon_irq_set_ciu_mapping(i + OCTEON_IRQ_TIMER0, 0, i + 52, chip, handle_edge_irq); | ||
1195 | |||
1196 | octeon_irq_set_ciu_mapping(OCTEON_IRQ_USB0, 0, 56, chip, handle_level_irq); | ||
1197 | octeon_irq_set_ciu_mapping(OCTEON_IRQ_BOOTDMA, 0, 63, chip, handle_level_irq); | ||
1198 | |||
1199 | /* CIU_1 */ | ||
1200 | for (i = 0; i < 16; i++) | ||
1201 | octeon_irq_set_ciu_mapping(i + OCTEON_IRQ_WDOG0, 1, i + 0, chip_wd, handle_level_irq); | ||
1202 | |||
1203 | octeon_irq_set_ciu_mapping(OCTEON_IRQ_USB1, 1, 17, chip, handle_level_irq); | ||
1204 | |||
1205 | gpio_node = of_find_compatible_node(NULL, NULL, "cavium,octeon-3860-gpio"); | 1177 | gpio_node = of_find_compatible_node(NULL, NULL, "cavium,octeon-3860-gpio"); |
1206 | if (gpio_node) { | 1178 | if (gpio_node) { |
1207 | struct octeon_irq_gpio_domain_data *gpiod; | 1179 | struct octeon_irq_gpio_domain_data *gpiod; |
@@ -1219,10 +1191,35 @@ static void __init octeon_irq_init_ciu(void) | |||
1219 | 1191 | ||
1220 | ciu_node = of_find_compatible_node(NULL, NULL, "cavium,octeon-3860-ciu"); | 1192 | ciu_node = of_find_compatible_node(NULL, NULL, "cavium,octeon-3860-ciu"); |
1221 | if (ciu_node) { | 1193 | if (ciu_node) { |
1222 | irq_domain_add_tree(ciu_node, &octeon_irq_domain_ciu_ops, NULL); | 1194 | ciu_domain = irq_domain_add_tree(ciu_node, &octeon_irq_domain_ciu_ops, NULL); |
1223 | of_node_put(ciu_node); | 1195 | of_node_put(ciu_node); |
1224 | } else | 1196 | } else |
1225 | pr_warn("Cannot find device node for cavium,octeon-3860-ciu.\n"); | 1197 | panic("Cannot find device node for cavium,octeon-3860-ciu."); |
1198 | |||
1199 | /* CIU_0 */ | ||
1200 | for (i = 0; i < 16; i++) | ||
1201 | octeon_irq_force_ciu_mapping(ciu_domain, i + OCTEON_IRQ_WORKQ0, 0, i + 0); | ||
1202 | |||
1203 | octeon_irq_set_ciu_mapping(OCTEON_IRQ_MBOX0, 0, 32, chip_mbox, handle_percpu_irq); | ||
1204 | octeon_irq_set_ciu_mapping(OCTEON_IRQ_MBOX1, 0, 33, chip_mbox, handle_percpu_irq); | ||
1205 | |||
1206 | for (i = 0; i < 4; i++) | ||
1207 | octeon_irq_force_ciu_mapping(ciu_domain, i + OCTEON_IRQ_PCI_INT0, 0, i + 36); | ||
1208 | for (i = 0; i < 4; i++) | ||
1209 | octeon_irq_force_ciu_mapping(ciu_domain, i + OCTEON_IRQ_PCI_MSI0, 0, i + 40); | ||
1210 | |||
1211 | octeon_irq_force_ciu_mapping(ciu_domain, OCTEON_IRQ_RML, 0, 46); | ||
1212 | for (i = 0; i < 4; i++) | ||
1213 | octeon_irq_force_ciu_mapping(ciu_domain, i + OCTEON_IRQ_TIMER0, 0, i + 52); | ||
1214 | |||
1215 | octeon_irq_force_ciu_mapping(ciu_domain, OCTEON_IRQ_USB0, 0, 56); | ||
1216 | octeon_irq_force_ciu_mapping(ciu_domain, OCTEON_IRQ_BOOTDMA, 0, 63); | ||
1217 | |||
1218 | /* CIU_1 */ | ||
1219 | for (i = 0; i < 16; i++) | ||
1220 | octeon_irq_set_ciu_mapping(i + OCTEON_IRQ_WDOG0, 1, i + 0, chip_wd, handle_level_irq); | ||
1221 | |||
1222 | octeon_irq_force_ciu_mapping(ciu_domain, OCTEON_IRQ_USB1, 1, 17); | ||
1226 | 1223 | ||
1227 | /* Enable the CIU lines */ | 1224 | /* Enable the CIU lines */ |
1228 | set_c0_status(STATUSF_IP3 | STATUSF_IP2); | 1225 | set_c0_status(STATUSF_IP3 | STATUSF_IP2); |
diff --git a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h index 1caa78ad06d5..dde504477fac 100644 --- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h +++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h | |||
@@ -393,7 +393,8 @@ | |||
393 | #define AR71XX_GPIO_REG_FUNC 0x28 | 393 | #define AR71XX_GPIO_REG_FUNC 0x28 |
394 | 394 | ||
395 | #define AR71XX_GPIO_COUNT 16 | 395 | #define AR71XX_GPIO_COUNT 16 |
396 | #define AR724X_GPIO_COUNT 18 | 396 | #define AR7240_GPIO_COUNT 18 |
397 | #define AR7241_GPIO_COUNT 20 | ||
397 | #define AR913X_GPIO_COUNT 22 | 398 | #define AR913X_GPIO_COUNT 22 |
398 | #define AR933X_GPIO_COUNT 30 | 399 | #define AR933X_GPIO_COUNT 30 |
399 | #define AR934X_GPIO_COUNT 23 | 400 | #define AR934X_GPIO_COUNT 23 |
diff --git a/arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h b/arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h index 4476fa03bf36..6ddae926bf79 100644 --- a/arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h +++ b/arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h | |||
@@ -42,7 +42,6 @@ | |||
42 | #define cpu_has_mips64r1 0 | 42 | #define cpu_has_mips64r1 0 |
43 | #define cpu_has_mips64r2 0 | 43 | #define cpu_has_mips64r2 0 |
44 | 44 | ||
45 | #define cpu_has_dsp 0 | ||
46 | #define cpu_has_mipsmt 0 | 45 | #define cpu_has_mipsmt 0 |
47 | 46 | ||
48 | #define cpu_has_64bits 0 | 47 | #define cpu_has_64bits 0 |
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_spi.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_spi.h index 7d98dbe5d4b5..c9bae1362606 100644 --- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_spi.h +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_spi.h | |||
@@ -9,6 +9,8 @@ int __init bcm63xx_spi_register(void); | |||
9 | 9 | ||
10 | struct bcm63xx_spi_pdata { | 10 | struct bcm63xx_spi_pdata { |
11 | unsigned int fifo_size; | 11 | unsigned int fifo_size; |
12 | unsigned int msg_type_shift; | ||
13 | unsigned int msg_ctl_width; | ||
12 | int bus_num; | 14 | int bus_num; |
13 | int num_chipselect; | 15 | int num_chipselect; |
14 | u32 speed_hz; | 16 | u32 speed_hz; |
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h index 4ccc2a748aff..61f2a2a5099d 100644 --- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h | |||
@@ -1054,7 +1054,8 @@ | |||
1054 | #define SPI_6338_FILL_BYTE 0x07 | 1054 | #define SPI_6338_FILL_BYTE 0x07 |
1055 | #define SPI_6338_MSG_TAIL 0x09 | 1055 | #define SPI_6338_MSG_TAIL 0x09 |
1056 | #define SPI_6338_RX_TAIL 0x0b | 1056 | #define SPI_6338_RX_TAIL 0x0b |
1057 | #define SPI_6338_MSG_CTL 0x40 | 1057 | #define SPI_6338_MSG_CTL 0x40 /* 8-bits register */ |
1058 | #define SPI_6338_MSG_CTL_WIDTH 8 | ||
1058 | #define SPI_6338_MSG_DATA 0x41 | 1059 | #define SPI_6338_MSG_DATA 0x41 |
1059 | #define SPI_6338_MSG_DATA_SIZE 0x3f | 1060 | #define SPI_6338_MSG_DATA_SIZE 0x3f |
1060 | #define SPI_6338_RX_DATA 0x80 | 1061 | #define SPI_6338_RX_DATA 0x80 |
@@ -1070,7 +1071,8 @@ | |||
1070 | #define SPI_6348_FILL_BYTE 0x07 | 1071 | #define SPI_6348_FILL_BYTE 0x07 |
1071 | #define SPI_6348_MSG_TAIL 0x09 | 1072 | #define SPI_6348_MSG_TAIL 0x09 |
1072 | #define SPI_6348_RX_TAIL 0x0b | 1073 | #define SPI_6348_RX_TAIL 0x0b |
1073 | #define SPI_6348_MSG_CTL 0x40 | 1074 | #define SPI_6348_MSG_CTL 0x40 /* 8-bits register */ |
1075 | #define SPI_6348_MSG_CTL_WIDTH 8 | ||
1074 | #define SPI_6348_MSG_DATA 0x41 | 1076 | #define SPI_6348_MSG_DATA 0x41 |
1075 | #define SPI_6348_MSG_DATA_SIZE 0x3f | 1077 | #define SPI_6348_MSG_DATA_SIZE 0x3f |
1076 | #define SPI_6348_RX_DATA 0x80 | 1078 | #define SPI_6348_RX_DATA 0x80 |
@@ -1078,6 +1080,7 @@ | |||
1078 | 1080 | ||
1079 | /* BCM 6358 SPI core */ | 1081 | /* BCM 6358 SPI core */ |
1080 | #define SPI_6358_MSG_CTL 0x00 /* 16-bits register */ | 1082 | #define SPI_6358_MSG_CTL 0x00 /* 16-bits register */ |
1083 | #define SPI_6358_MSG_CTL_WIDTH 16 | ||
1081 | #define SPI_6358_MSG_DATA 0x02 | 1084 | #define SPI_6358_MSG_DATA 0x02 |
1082 | #define SPI_6358_MSG_DATA_SIZE 0x21e | 1085 | #define SPI_6358_MSG_DATA_SIZE 0x21e |
1083 | #define SPI_6358_RX_DATA 0x400 | 1086 | #define SPI_6358_RX_DATA 0x400 |
@@ -1094,6 +1097,7 @@ | |||
1094 | 1097 | ||
1095 | /* BCM 6358 SPI core */ | 1098 | /* BCM 6358 SPI core */ |
1096 | #define SPI_6368_MSG_CTL 0x00 /* 16-bits register */ | 1099 | #define SPI_6368_MSG_CTL 0x00 /* 16-bits register */ |
1100 | #define SPI_6368_MSG_CTL_WIDTH 16 | ||
1097 | #define SPI_6368_MSG_DATA 0x02 | 1101 | #define SPI_6368_MSG_DATA 0x02 |
1098 | #define SPI_6368_MSG_DATA_SIZE 0x21e | 1102 | #define SPI_6368_MSG_DATA_SIZE 0x21e |
1099 | #define SPI_6368_RX_DATA 0x400 | 1103 | #define SPI_6368_RX_DATA 0x400 |
@@ -1115,7 +1119,10 @@ | |||
1115 | #define SPI_HD_W 0x01 | 1119 | #define SPI_HD_W 0x01 |
1116 | #define SPI_HD_R 0x02 | 1120 | #define SPI_HD_R 0x02 |
1117 | #define SPI_BYTE_CNT_SHIFT 0 | 1121 | #define SPI_BYTE_CNT_SHIFT 0 |
1118 | #define SPI_MSG_TYPE_SHIFT 14 | 1122 | #define SPI_6338_MSG_TYPE_SHIFT 6 |
1123 | #define SPI_6348_MSG_TYPE_SHIFT 6 | ||
1124 | #define SPI_6358_MSG_TYPE_SHIFT 14 | ||
1125 | #define SPI_6368_MSG_TYPE_SHIFT 14 | ||
1119 | 1126 | ||
1120 | /* Command */ | 1127 | /* Command */ |
1121 | #define SPI_CMD_NOOP 0x00 | 1128 | #define SPI_CMD_NOOP 0x00 |
diff --git a/arch/mips/include/asm/mach-cavium-octeon/irq.h b/arch/mips/include/asm/mach-cavium-octeon/irq.h index 418992042f6f..c22a3078bf11 100644 --- a/arch/mips/include/asm/mach-cavium-octeon/irq.h +++ b/arch/mips/include/asm/mach-cavium-octeon/irq.h | |||
@@ -21,14 +21,10 @@ enum octeon_irq { | |||
21 | OCTEON_IRQ_TIMER, | 21 | OCTEON_IRQ_TIMER, |
22 | /* sources in CIU_INTX_EN0 */ | 22 | /* sources in CIU_INTX_EN0 */ |
23 | OCTEON_IRQ_WORKQ0, | 23 | OCTEON_IRQ_WORKQ0, |
24 | OCTEON_IRQ_GPIO0 = OCTEON_IRQ_WORKQ0 + 16, | 24 | OCTEON_IRQ_WDOG0 = OCTEON_IRQ_WORKQ0 + 16, |
25 | OCTEON_IRQ_WDOG0 = OCTEON_IRQ_GPIO0 + 16, | ||
26 | OCTEON_IRQ_WDOG15 = OCTEON_IRQ_WDOG0 + 15, | 25 | OCTEON_IRQ_WDOG15 = OCTEON_IRQ_WDOG0 + 15, |
27 | OCTEON_IRQ_MBOX0 = OCTEON_IRQ_WDOG0 + 16, | 26 | OCTEON_IRQ_MBOX0 = OCTEON_IRQ_WDOG0 + 16, |
28 | OCTEON_IRQ_MBOX1, | 27 | OCTEON_IRQ_MBOX1, |
29 | OCTEON_IRQ_UART0, | ||
30 | OCTEON_IRQ_UART1, | ||
31 | OCTEON_IRQ_UART2, | ||
32 | OCTEON_IRQ_PCI_INT0, | 28 | OCTEON_IRQ_PCI_INT0, |
33 | OCTEON_IRQ_PCI_INT1, | 29 | OCTEON_IRQ_PCI_INT1, |
34 | OCTEON_IRQ_PCI_INT2, | 30 | OCTEON_IRQ_PCI_INT2, |
@@ -38,8 +34,6 @@ enum octeon_irq { | |||
38 | OCTEON_IRQ_PCI_MSI2, | 34 | OCTEON_IRQ_PCI_MSI2, |
39 | OCTEON_IRQ_PCI_MSI3, | 35 | OCTEON_IRQ_PCI_MSI3, |
40 | 36 | ||
41 | OCTEON_IRQ_TWSI, | ||
42 | OCTEON_IRQ_TWSI2, | ||
43 | OCTEON_IRQ_RML, | 37 | OCTEON_IRQ_RML, |
44 | OCTEON_IRQ_TIMER0, | 38 | OCTEON_IRQ_TIMER0, |
45 | OCTEON_IRQ_TIMER1, | 39 | OCTEON_IRQ_TIMER1, |
@@ -47,8 +41,6 @@ enum octeon_irq { | |||
47 | OCTEON_IRQ_TIMER3, | 41 | OCTEON_IRQ_TIMER3, |
48 | OCTEON_IRQ_USB0, | 42 | OCTEON_IRQ_USB0, |
49 | OCTEON_IRQ_USB1, | 43 | OCTEON_IRQ_USB1, |
50 | OCTEON_IRQ_MII0, | ||
51 | OCTEON_IRQ_MII1, | ||
52 | OCTEON_IRQ_BOOTDMA, | 44 | OCTEON_IRQ_BOOTDMA, |
53 | #ifndef CONFIG_PCI_MSI | 45 | #ifndef CONFIG_PCI_MSI |
54 | OCTEON_IRQ_LAST = 127 | 46 | OCTEON_IRQ_LAST = 127 |
diff --git a/arch/mips/include/asm/module.h b/arch/mips/include/asm/module.h index 7531ecd654d6..dca8bce8c7ab 100644 --- a/arch/mips/include/asm/module.h +++ b/arch/mips/include/asm/module.h | |||
@@ -10,6 +10,7 @@ struct mod_arch_specific { | |||
10 | struct list_head dbe_list; | 10 | struct list_head dbe_list; |
11 | const struct exception_table_entry *dbe_start; | 11 | const struct exception_table_entry *dbe_start; |
12 | const struct exception_table_entry *dbe_end; | 12 | const struct exception_table_entry *dbe_end; |
13 | struct mips_hi16 *r_mips_hi16_list; | ||
13 | }; | 14 | }; |
14 | 15 | ||
15 | typedef uint8_t Elf64_Byte; /* Type for a 8-bit quantity. */ | 16 | typedef uint8_t Elf64_Byte; /* Type for a 8-bit quantity. */ |
diff --git a/arch/mips/include/asm/r4k-timer.h b/arch/mips/include/asm/r4k-timer.h index a37d12b3b61c..afe9e0e03fe9 100644 --- a/arch/mips/include/asm/r4k-timer.h +++ b/arch/mips/include/asm/r4k-timer.h | |||
@@ -12,16 +12,16 @@ | |||
12 | 12 | ||
13 | #ifdef CONFIG_SYNC_R4K | 13 | #ifdef CONFIG_SYNC_R4K |
14 | 14 | ||
15 | extern void synchronise_count_master(void); | 15 | extern void synchronise_count_master(int cpu); |
16 | extern void synchronise_count_slave(void); | 16 | extern void synchronise_count_slave(int cpu); |
17 | 17 | ||
18 | #else | 18 | #else |
19 | 19 | ||
20 | static inline void synchronise_count_master(void) | 20 | static inline void synchronise_count_master(int cpu) |
21 | { | 21 | { |
22 | } | 22 | } |
23 | 23 | ||
24 | static inline void synchronise_count_slave(void) | 24 | static inline void synchronise_count_slave(int cpu) |
25 | { | 25 | { |
26 | } | 26 | } |
27 | 27 | ||
diff --git a/arch/mips/kernel/module.c b/arch/mips/kernel/module.c index a5066b1c3de3..4f8c3cba8c0c 100644 --- a/arch/mips/kernel/module.c +++ b/arch/mips/kernel/module.c | |||
@@ -39,8 +39,6 @@ struct mips_hi16 { | |||
39 | Elf_Addr value; | 39 | Elf_Addr value; |
40 | }; | 40 | }; |
41 | 41 | ||
42 | static struct mips_hi16 *mips_hi16_list; | ||
43 | |||
44 | static LIST_HEAD(dbe_list); | 42 | static LIST_HEAD(dbe_list); |
45 | static DEFINE_SPINLOCK(dbe_lock); | 43 | static DEFINE_SPINLOCK(dbe_lock); |
46 | 44 | ||
@@ -128,8 +126,8 @@ static int apply_r_mips_hi16_rel(struct module *me, u32 *location, Elf_Addr v) | |||
128 | 126 | ||
129 | n->addr = (Elf_Addr *)location; | 127 | n->addr = (Elf_Addr *)location; |
130 | n->value = v; | 128 | n->value = v; |
131 | n->next = mips_hi16_list; | 129 | n->next = me->arch.r_mips_hi16_list; |
132 | mips_hi16_list = n; | 130 | me->arch.r_mips_hi16_list = n; |
133 | 131 | ||
134 | return 0; | 132 | return 0; |
135 | } | 133 | } |
@@ -142,18 +140,28 @@ static int apply_r_mips_hi16_rela(struct module *me, u32 *location, Elf_Addr v) | |||
142 | return 0; | 140 | return 0; |
143 | } | 141 | } |
144 | 142 | ||
143 | static void free_relocation_chain(struct mips_hi16 *l) | ||
144 | { | ||
145 | struct mips_hi16 *next; | ||
146 | |||
147 | while (l) { | ||
148 | next = l->next; | ||
149 | kfree(l); | ||
150 | l = next; | ||
151 | } | ||
152 | } | ||
153 | |||
145 | static int apply_r_mips_lo16_rel(struct module *me, u32 *location, Elf_Addr v) | 154 | static int apply_r_mips_lo16_rel(struct module *me, u32 *location, Elf_Addr v) |
146 | { | 155 | { |
147 | unsigned long insnlo = *location; | 156 | unsigned long insnlo = *location; |
157 | struct mips_hi16 *l; | ||
148 | Elf_Addr val, vallo; | 158 | Elf_Addr val, vallo; |
149 | 159 | ||
150 | /* Sign extend the addend we extract from the lo insn. */ | 160 | /* Sign extend the addend we extract from the lo insn. */ |
151 | vallo = ((insnlo & 0xffff) ^ 0x8000) - 0x8000; | 161 | vallo = ((insnlo & 0xffff) ^ 0x8000) - 0x8000; |
152 | 162 | ||
153 | if (mips_hi16_list != NULL) { | 163 | if (me->arch.r_mips_hi16_list != NULL) { |
154 | struct mips_hi16 *l; | 164 | l = me->arch.r_mips_hi16_list; |
155 | |||
156 | l = mips_hi16_list; | ||
157 | while (l != NULL) { | 165 | while (l != NULL) { |
158 | struct mips_hi16 *next; | 166 | struct mips_hi16 *next; |
159 | unsigned long insn; | 167 | unsigned long insn; |
@@ -188,7 +196,7 @@ static int apply_r_mips_lo16_rel(struct module *me, u32 *location, Elf_Addr v) | |||
188 | l = next; | 196 | l = next; |
189 | } | 197 | } |
190 | 198 | ||
191 | mips_hi16_list = NULL; | 199 | me->arch.r_mips_hi16_list = NULL; |
192 | } | 200 | } |
193 | 201 | ||
194 | /* | 202 | /* |
@@ -201,6 +209,9 @@ static int apply_r_mips_lo16_rel(struct module *me, u32 *location, Elf_Addr v) | |||
201 | return 0; | 209 | return 0; |
202 | 210 | ||
203 | out_danger: | 211 | out_danger: |
212 | free_relocation_chain(l); | ||
213 | me->arch.r_mips_hi16_list = NULL; | ||
214 | |||
204 | pr_err("module %s: dangerous R_MIPS_LO16 REL relocation\n", me->name); | 215 | pr_err("module %s: dangerous R_MIPS_LO16 REL relocation\n", me->name); |
205 | 216 | ||
206 | return -ENOEXEC; | 217 | return -ENOEXEC; |
@@ -273,6 +284,7 @@ int apply_relocate(Elf_Shdr *sechdrs, const char *strtab, | |||
273 | pr_debug("Applying relocate section %u to %u\n", relsec, | 284 | pr_debug("Applying relocate section %u to %u\n", relsec, |
274 | sechdrs[relsec].sh_info); | 285 | sechdrs[relsec].sh_info); |
275 | 286 | ||
287 | me->arch.r_mips_hi16_list = NULL; | ||
276 | for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) { | 288 | for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) { |
277 | /* This is where to make the change */ | 289 | /* This is where to make the change */ |
278 | location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr | 290 | location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr |
@@ -296,6 +308,19 @@ int apply_relocate(Elf_Shdr *sechdrs, const char *strtab, | |||
296 | return res; | 308 | return res; |
297 | } | 309 | } |
298 | 310 | ||
311 | /* | ||
312 | * Normally the hi16 list should be deallocated at this point. A | ||
313 | * malformed binary however could contain a series of R_MIPS_HI16 | ||
314 | * relocations not followed by a R_MIPS_LO16 relocation. In that | ||
315 | * case, free up the list and return an error. | ||
316 | */ | ||
317 | if (me->arch.r_mips_hi16_list) { | ||
318 | free_relocation_chain(me->arch.r_mips_hi16_list); | ||
319 | me->arch.r_mips_hi16_list = NULL; | ||
320 | |||
321 | return -ENOEXEC; | ||
322 | } | ||
323 | |||
299 | return 0; | 324 | return 0; |
300 | } | 325 | } |
301 | 326 | ||
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index 31637d8c8738..9005bf9fb859 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c | |||
@@ -130,7 +130,7 @@ asmlinkage __cpuinit void start_secondary(void) | |||
130 | 130 | ||
131 | cpu_set(cpu, cpu_callin_map); | 131 | cpu_set(cpu, cpu_callin_map); |
132 | 132 | ||
133 | synchronise_count_slave(); | 133 | synchronise_count_slave(cpu); |
134 | 134 | ||
135 | /* | 135 | /* |
136 | * irq will be enabled in ->smp_finish(), enabling it too early | 136 | * irq will be enabled in ->smp_finish(), enabling it too early |
@@ -173,7 +173,6 @@ void smp_send_stop(void) | |||
173 | void __init smp_cpus_done(unsigned int max_cpus) | 173 | void __init smp_cpus_done(unsigned int max_cpus) |
174 | { | 174 | { |
175 | mp_ops->cpus_done(); | 175 | mp_ops->cpus_done(); |
176 | synchronise_count_master(); | ||
177 | } | 176 | } |
178 | 177 | ||
179 | /* called from main before smp_init() */ | 178 | /* called from main before smp_init() */ |
@@ -206,6 +205,7 @@ int __cpuinit __cpu_up(unsigned int cpu, struct task_struct *tidle) | |||
206 | while (!cpu_isset(cpu, cpu_callin_map)) | 205 | while (!cpu_isset(cpu, cpu_callin_map)) |
207 | udelay(100); | 206 | udelay(100); |
208 | 207 | ||
208 | synchronise_count_master(cpu); | ||
209 | return 0; | 209 | return 0; |
210 | } | 210 | } |
211 | 211 | ||
diff --git a/arch/mips/kernel/sync-r4k.c b/arch/mips/kernel/sync-r4k.c index 842d55e411fd..7f1eca3858de 100644 --- a/arch/mips/kernel/sync-r4k.c +++ b/arch/mips/kernel/sync-r4k.c | |||
@@ -28,12 +28,11 @@ static atomic_t __cpuinitdata count_reference = ATOMIC_INIT(0); | |||
28 | #define COUNTON 100 | 28 | #define COUNTON 100 |
29 | #define NR_LOOPS 5 | 29 | #define NR_LOOPS 5 |
30 | 30 | ||
31 | void __cpuinit synchronise_count_master(void) | 31 | void __cpuinit synchronise_count_master(int cpu) |
32 | { | 32 | { |
33 | int i; | 33 | int i; |
34 | unsigned long flags; | 34 | unsigned long flags; |
35 | unsigned int initcount; | 35 | unsigned int initcount; |
36 | int nslaves; | ||
37 | 36 | ||
38 | #ifdef CONFIG_MIPS_MT_SMTC | 37 | #ifdef CONFIG_MIPS_MT_SMTC |
39 | /* | 38 | /* |
@@ -43,8 +42,7 @@ void __cpuinit synchronise_count_master(void) | |||
43 | return; | 42 | return; |
44 | #endif | 43 | #endif |
45 | 44 | ||
46 | printk(KERN_INFO "Synchronize counters across %u CPUs: ", | 45 | printk(KERN_INFO "Synchronize counters for CPU %u: ", cpu); |
47 | num_online_cpus()); | ||
48 | 46 | ||
49 | local_irq_save(flags); | 47 | local_irq_save(flags); |
50 | 48 | ||
@@ -52,7 +50,7 @@ void __cpuinit synchronise_count_master(void) | |||
52 | * Notify the slaves that it's time to start | 50 | * Notify the slaves that it's time to start |
53 | */ | 51 | */ |
54 | atomic_set(&count_reference, read_c0_count()); | 52 | atomic_set(&count_reference, read_c0_count()); |
55 | atomic_set(&count_start_flag, 1); | 53 | atomic_set(&count_start_flag, cpu); |
56 | smp_wmb(); | 54 | smp_wmb(); |
57 | 55 | ||
58 | /* Count will be initialised to current timer for all CPU's */ | 56 | /* Count will be initialised to current timer for all CPU's */ |
@@ -69,10 +67,9 @@ void __cpuinit synchronise_count_master(void) | |||
69 | * two CPUs. | 67 | * two CPUs. |
70 | */ | 68 | */ |
71 | 69 | ||
72 | nslaves = num_online_cpus()-1; | ||
73 | for (i = 0; i < NR_LOOPS; i++) { | 70 | for (i = 0; i < NR_LOOPS; i++) { |
74 | /* slaves loop on '!= ncpus' */ | 71 | /* slaves loop on '!= 2' */ |
75 | while (atomic_read(&count_count_start) != nslaves) | 72 | while (atomic_read(&count_count_start) != 1) |
76 | mb(); | 73 | mb(); |
77 | atomic_set(&count_count_stop, 0); | 74 | atomic_set(&count_count_stop, 0); |
78 | smp_wmb(); | 75 | smp_wmb(); |
@@ -89,7 +86,7 @@ void __cpuinit synchronise_count_master(void) | |||
89 | /* | 86 | /* |
90 | * Wait for all slaves to leave the synchronization point: | 87 | * Wait for all slaves to leave the synchronization point: |
91 | */ | 88 | */ |
92 | while (atomic_read(&count_count_stop) != nslaves) | 89 | while (atomic_read(&count_count_stop) != 1) |
93 | mb(); | 90 | mb(); |
94 | atomic_set(&count_count_start, 0); | 91 | atomic_set(&count_count_start, 0); |
95 | smp_wmb(); | 92 | smp_wmb(); |
@@ -97,6 +94,7 @@ void __cpuinit synchronise_count_master(void) | |||
97 | } | 94 | } |
98 | /* Arrange for an interrupt in a short while */ | 95 | /* Arrange for an interrupt in a short while */ |
99 | write_c0_compare(read_c0_count() + COUNTON); | 96 | write_c0_compare(read_c0_count() + COUNTON); |
97 | atomic_set(&count_start_flag, 0); | ||
100 | 98 | ||
101 | local_irq_restore(flags); | 99 | local_irq_restore(flags); |
102 | 100 | ||
@@ -108,11 +106,10 @@ void __cpuinit synchronise_count_master(void) | |||
108 | printk("done.\n"); | 106 | printk("done.\n"); |
109 | } | 107 | } |
110 | 108 | ||
111 | void __cpuinit synchronise_count_slave(void) | 109 | void __cpuinit synchronise_count_slave(int cpu) |
112 | { | 110 | { |
113 | int i; | 111 | int i; |
114 | unsigned int initcount; | 112 | unsigned int initcount; |
115 | int ncpus; | ||
116 | 113 | ||
117 | #ifdef CONFIG_MIPS_MT_SMTC | 114 | #ifdef CONFIG_MIPS_MT_SMTC |
118 | /* | 115 | /* |
@@ -127,16 +124,15 @@ void __cpuinit synchronise_count_slave(void) | |||
127 | * so we first wait for the master to say everyone is ready | 124 | * so we first wait for the master to say everyone is ready |
128 | */ | 125 | */ |
129 | 126 | ||
130 | while (!atomic_read(&count_start_flag)) | 127 | while (atomic_read(&count_start_flag) != cpu) |
131 | mb(); | 128 | mb(); |
132 | 129 | ||
133 | /* Count will be initialised to next expire for all CPU's */ | 130 | /* Count will be initialised to next expire for all CPU's */ |
134 | initcount = atomic_read(&count_reference); | 131 | initcount = atomic_read(&count_reference); |
135 | 132 | ||
136 | ncpus = num_online_cpus(); | ||
137 | for (i = 0; i < NR_LOOPS; i++) { | 133 | for (i = 0; i < NR_LOOPS; i++) { |
138 | atomic_inc(&count_count_start); | 134 | atomic_inc(&count_count_start); |
139 | while (atomic_read(&count_count_start) != ncpus) | 135 | while (atomic_read(&count_count_start) != 2) |
140 | mb(); | 136 | mb(); |
141 | 137 | ||
142 | /* | 138 | /* |
@@ -146,7 +142,7 @@ void __cpuinit synchronise_count_slave(void) | |||
146 | write_c0_count(initcount); | 142 | write_c0_count(initcount); |
147 | 143 | ||
148 | atomic_inc(&count_count_stop); | 144 | atomic_inc(&count_count_stop); |
149 | while (atomic_read(&count_count_stop) != ncpus) | 145 | while (atomic_read(&count_count_stop) != 2) |
150 | mb(); | 146 | mb(); |
151 | } | 147 | } |
152 | /* Arrange for an interrupt in a short while */ | 148 | /* Arrange for an interrupt in a short while */ |
diff --git a/arch/mips/mti-malta/malta-pci.c b/arch/mips/mti-malta/malta-pci.c index 284dea54faf5..2147cb34e705 100644 --- a/arch/mips/mti-malta/malta-pci.c +++ b/arch/mips/mti-malta/malta-pci.c | |||
@@ -252,16 +252,3 @@ void __init mips_pcibios_init(void) | |||
252 | 252 | ||
253 | register_pci_controller(controller); | 253 | register_pci_controller(controller); |
254 | } | 254 | } |
255 | |||
256 | /* Enable PCI 2.1 compatibility in PIIX4 */ | ||
257 | static void __devinit quirk_dlcsetup(struct pci_dev *dev) | ||
258 | { | ||
259 | u8 odlc, ndlc; | ||
260 | (void) pci_read_config_byte(dev, 0x82, &odlc); | ||
261 | /* Enable passive releases and delayed transaction */ | ||
262 | ndlc = odlc | 7; | ||
263 | (void) pci_write_config_byte(dev, 0x82, ndlc); | ||
264 | } | ||
265 | |||
266 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_0, | ||
267 | quirk_dlcsetup); | ||
diff --git a/arch/mips/pci/pci-ar724x.c b/arch/mips/pci/pci-ar724x.c index 414a7459858d..86d77a666458 100644 --- a/arch/mips/pci/pci-ar724x.c +++ b/arch/mips/pci/pci-ar724x.c | |||
@@ -23,9 +23,12 @@ | |||
23 | #define AR724X_PCI_MEM_BASE 0x10000000 | 23 | #define AR724X_PCI_MEM_BASE 0x10000000 |
24 | #define AR724X_PCI_MEM_SIZE 0x08000000 | 24 | #define AR724X_PCI_MEM_SIZE 0x08000000 |
25 | 25 | ||
26 | #define AR724X_PCI_REG_RESET 0x18 | ||
26 | #define AR724X_PCI_REG_INT_STATUS 0x4c | 27 | #define AR724X_PCI_REG_INT_STATUS 0x4c |
27 | #define AR724X_PCI_REG_INT_MASK 0x50 | 28 | #define AR724X_PCI_REG_INT_MASK 0x50 |
28 | 29 | ||
30 | #define AR724X_PCI_RESET_LINK_UP BIT(0) | ||
31 | |||
29 | #define AR724X_PCI_INT_DEV0 BIT(14) | 32 | #define AR724X_PCI_INT_DEV0 BIT(14) |
30 | 33 | ||
31 | #define AR724X_PCI_IRQ_COUNT 1 | 34 | #define AR724X_PCI_IRQ_COUNT 1 |
@@ -38,6 +41,15 @@ static void __iomem *ar724x_pci_ctrl_base; | |||
38 | 41 | ||
39 | static u32 ar724x_pci_bar0_value; | 42 | static u32 ar724x_pci_bar0_value; |
40 | static bool ar724x_pci_bar0_is_cached; | 43 | static bool ar724x_pci_bar0_is_cached; |
44 | static bool ar724x_pci_link_up; | ||
45 | |||
46 | static inline bool ar724x_pci_check_link(void) | ||
47 | { | ||
48 | u32 reset; | ||
49 | |||
50 | reset = __raw_readl(ar724x_pci_ctrl_base + AR724X_PCI_REG_RESET); | ||
51 | return reset & AR724X_PCI_RESET_LINK_UP; | ||
52 | } | ||
41 | 53 | ||
42 | static int ar724x_pci_read(struct pci_bus *bus, unsigned int devfn, int where, | 54 | static int ar724x_pci_read(struct pci_bus *bus, unsigned int devfn, int where, |
43 | int size, uint32_t *value) | 55 | int size, uint32_t *value) |
@@ -46,6 +58,9 @@ static int ar724x_pci_read(struct pci_bus *bus, unsigned int devfn, int where, | |||
46 | void __iomem *base; | 58 | void __iomem *base; |
47 | u32 data; | 59 | u32 data; |
48 | 60 | ||
61 | if (!ar724x_pci_link_up) | ||
62 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
63 | |||
49 | if (devfn) | 64 | if (devfn) |
50 | return PCIBIOS_DEVICE_NOT_FOUND; | 65 | return PCIBIOS_DEVICE_NOT_FOUND; |
51 | 66 | ||
@@ -96,6 +111,9 @@ static int ar724x_pci_write(struct pci_bus *bus, unsigned int devfn, int where, | |||
96 | u32 data; | 111 | u32 data; |
97 | int s; | 112 | int s; |
98 | 113 | ||
114 | if (!ar724x_pci_link_up) | ||
115 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
116 | |||
99 | if (devfn) | 117 | if (devfn) |
100 | return PCIBIOS_DEVICE_NOT_FOUND; | 118 | return PCIBIOS_DEVICE_NOT_FOUND; |
101 | 119 | ||
@@ -280,6 +298,10 @@ int __init ar724x_pcibios_init(int irq) | |||
280 | if (ar724x_pci_ctrl_base == NULL) | 298 | if (ar724x_pci_ctrl_base == NULL) |
281 | goto err_unmap_devcfg; | 299 | goto err_unmap_devcfg; |
282 | 300 | ||
301 | ar724x_pci_link_up = ar724x_pci_check_link(); | ||
302 | if (!ar724x_pci_link_up) | ||
303 | pr_warn("ar724x: PCIe link is down\n"); | ||
304 | |||
283 | ar724x_pci_irq_init(irq); | 305 | ar724x_pci_irq_init(irq); |
284 | register_pci_controller(&ar724x_pci_controller); | 306 | register_pci_controller(&ar724x_pci_controller); |
285 | 307 | ||