diff options
| -rw-r--r-- | .mailmap | 3 | ||||
| -rw-r--r-- | MAINTAINERS | 9 | ||||
| -rw-r--r-- | arch/mips/generic/board-ni169445.its.S | 2 | ||||
| -rw-r--r-- | arch/mips/generic/init.c | 2 | ||||
| -rw-r--r-- | arch/mips/generic/kexec.c | 2 | ||||
| -rw-r--r-- | arch/mips/include/asm/mips-cm.h | 4 | ||||
| -rw-r--r-- | arch/mips/include/asm/stackframe.h | 8 | ||||
| -rw-r--r-- | arch/mips/kernel/probes-common.h | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/smp-cmp.c | 6 | ||||
| -rw-r--r-- | arch/mips/kernel/smp-cps.c | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/smp.c | 24 | ||||
| -rw-r--r-- | arch/mips/mm/uasm-micromips.c | 2 | ||||
| -rw-r--r-- | arch/mips/net/ebpf_jit.c | 2 |
13 files changed, 40 insertions, 28 deletions
| @@ -15,6 +15,7 @@ Adriana Reus <adi.reus@gmail.com> <adriana.reus@intel.com> | |||
| 15 | Alan Cox <alan@lxorguk.ukuu.org.uk> | 15 | Alan Cox <alan@lxorguk.ukuu.org.uk> |
| 16 | Alan Cox <root@hraefn.swansea.linux.org.uk> | 16 | Alan Cox <root@hraefn.swansea.linux.org.uk> |
| 17 | Aleksey Gorelov <aleksey_gorelov@phoenix.com> | 17 | Aleksey Gorelov <aleksey_gorelov@phoenix.com> |
| 18 | Aleksandar Markovic <aleksandar.markovic@mips.com> <aleksandar.markovic@imgtec.com> | ||
| 18 | Al Viro <viro@ftp.linux.org.uk> | 19 | Al Viro <viro@ftp.linux.org.uk> |
| 19 | Al Viro <viro@zenIV.linux.org.uk> | 20 | Al Viro <viro@zenIV.linux.org.uk> |
| 20 | Andreas Herrmann <aherrman@de.ibm.com> | 21 | Andreas Herrmann <aherrman@de.ibm.com> |
| @@ -101,6 +102,7 @@ Leonid I Ananiev <leonid.i.ananiev@intel.com> | |||
| 101 | Linas Vepstas <linas@austin.ibm.com> | 102 | Linas Vepstas <linas@austin.ibm.com> |
| 102 | Linus Lüssing <linus.luessing@c0d3.blue> <linus.luessing@web.de> | 103 | Linus Lüssing <linus.luessing@c0d3.blue> <linus.luessing@web.de> |
| 103 | Linus Lüssing <linus.luessing@c0d3.blue> <linus.luessing@ascom.ch> | 104 | Linus Lüssing <linus.luessing@c0d3.blue> <linus.luessing@ascom.ch> |
| 105 | Marcin Nowakowski <marcin.nowakowski@mips.com> <marcin.nowakowski@imgtec.com> | ||
| 104 | Mark Brown <broonie@sirena.org.uk> | 106 | Mark Brown <broonie@sirena.org.uk> |
| 105 | Martin Kepplinger <martink@posteo.de> <martin.kepplinger@theobroma-systems.com> | 107 | Martin Kepplinger <martink@posteo.de> <martin.kepplinger@theobroma-systems.com> |
| 106 | Martin Kepplinger <martink@posteo.de> <martin.kepplinger@ginzinger.com> | 108 | Martin Kepplinger <martink@posteo.de> <martin.kepplinger@ginzinger.com> |
| @@ -119,6 +121,7 @@ Matt Redfearn <matt.redfearn@mips.com> <matt.redfearn@imgtec.com> | |||
| 119 | Mayuresh Janorkar <mayur@ti.com> | 121 | Mayuresh Janorkar <mayur@ti.com> |
| 120 | Michael Buesch <m@bues.ch> | 122 | Michael Buesch <m@bues.ch> |
| 121 | Michel Dänzer <michel@tungstengraphics.com> | 123 | Michel Dänzer <michel@tungstengraphics.com> |
| 124 | Miodrag Dinic <miodrag.dinic@mips.com> <miodrag.dinic@imgtec.com> | ||
| 122 | Mitesh shah <mshah@teja.com> | 125 | Mitesh shah <mshah@teja.com> |
| 123 | Mohit Kumar <mohit.kumar@st.com> <mohit.kumar.dhaka@gmail.com> | 126 | Mohit Kumar <mohit.kumar@st.com> <mohit.kumar.dhaka@gmail.com> |
| 124 | Morten Welinder <terra@gnome.org> | 127 | Morten Welinder <terra@gnome.org> |
diff --git a/MAINTAINERS b/MAINTAINERS index 00b0fda6c2e1..2f4e462aa4a2 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -873,7 +873,7 @@ F: drivers/android/ | |||
| 873 | F: drivers/staging/android/ | 873 | F: drivers/staging/android/ |
| 874 | 874 | ||
| 875 | ANDROID GOLDFISH RTC DRIVER | 875 | ANDROID GOLDFISH RTC DRIVER |
| 876 | M: Miodrag Dinic <miodrag.dinic@imgtec.com> | 876 | M: Miodrag Dinic <miodrag.dinic@mips.com> |
| 877 | S: Supported | 877 | S: Supported |
| 878 | F: Documentation/devicetree/bindings/rtc/google,goldfish-rtc.txt | 878 | F: Documentation/devicetree/bindings/rtc/google,goldfish-rtc.txt |
| 879 | F: drivers/rtc/rtc-goldfish.c | 879 | F: drivers/rtc/rtc-goldfish.c |
| @@ -9019,7 +9019,7 @@ F: drivers/*/*loongson1* | |||
| 9019 | F: drivers/*/*/*loongson1* | 9019 | F: drivers/*/*/*loongson1* |
| 9020 | 9020 | ||
| 9021 | MIPS RINT INSTRUCTION EMULATION | 9021 | MIPS RINT INSTRUCTION EMULATION |
| 9022 | M: Aleksandar Markovic <aleksandar.markovic@imgtec.com> | 9022 | M: Aleksandar Markovic <aleksandar.markovic@mips.com> |
| 9023 | L: linux-mips@linux-mips.org | 9023 | L: linux-mips@linux-mips.org |
| 9024 | S: Supported | 9024 | S: Supported |
| 9025 | F: arch/mips/math-emu/sp_rint.c | 9025 | F: arch/mips/math-emu/sp_rint.c |
| @@ -10683,10 +10683,9 @@ S: Maintained | |||
| 10683 | F: drivers/pinctrl/spear/ | 10683 | F: drivers/pinctrl/spear/ |
| 10684 | 10684 | ||
| 10685 | PISTACHIO SOC SUPPORT | 10685 | PISTACHIO SOC SUPPORT |
| 10686 | M: James Hartley <james.hartley@imgtec.com> | 10686 | M: James Hartley <james.hartley@sondrel.com> |
| 10687 | M: Ionela Voinescu <ionela.voinescu@imgtec.com> | ||
| 10688 | L: linux-mips@linux-mips.org | 10687 | L: linux-mips@linux-mips.org |
| 10689 | S: Maintained | 10688 | S: Odd Fixes |
| 10690 | F: arch/mips/pistachio/ | 10689 | F: arch/mips/pistachio/ |
| 10691 | F: arch/mips/include/asm/mach-pistachio/ | 10690 | F: arch/mips/include/asm/mach-pistachio/ |
| 10692 | F: arch/mips/boot/dts/img/pistachio* | 10691 | F: arch/mips/boot/dts/img/pistachio* |
diff --git a/arch/mips/generic/board-ni169445.its.S b/arch/mips/generic/board-ni169445.its.S index d12e12fe90be..e4cb4f95a8cc 100644 --- a/arch/mips/generic/board-ni169445.its.S +++ b/arch/mips/generic/board-ni169445.its.S | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | { | 1 | / { |
| 2 | images { | 2 | images { |
| 3 | fdt@ni169445 { | 3 | fdt@ni169445 { |
| 4 | description = "NI 169445 device tree"; | 4 | description = "NI 169445 device tree"; |
diff --git a/arch/mips/generic/init.c b/arch/mips/generic/init.c index cf409ba358a1..5ba6fcc26fa7 100644 --- a/arch/mips/generic/init.c +++ b/arch/mips/generic/init.c | |||
| @@ -20,7 +20,7 @@ | |||
| 20 | #include <asm/fw/fw.h> | 20 | #include <asm/fw/fw.h> |
| 21 | #include <asm/irq_cpu.h> | 21 | #include <asm/irq_cpu.h> |
| 22 | #include <asm/machine.h> | 22 | #include <asm/machine.h> |
| 23 | #include <asm/mips-cpc.h> | 23 | #include <asm/mips-cps.h> |
| 24 | #include <asm/prom.h> | 24 | #include <asm/prom.h> |
| 25 | #include <asm/smp-ops.h> | 25 | #include <asm/smp-ops.h> |
| 26 | #include <asm/time.h> | 26 | #include <asm/time.h> |
diff --git a/arch/mips/generic/kexec.c b/arch/mips/generic/kexec.c index e9fb735299e3..1ca409f58929 100644 --- a/arch/mips/generic/kexec.c +++ b/arch/mips/generic/kexec.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2016 Imagination Technologies | 2 | * Copyright (C) 2016 Imagination Technologies |
| 3 | * Author: Marcin Nowakowski <marcin.nowakowski@imgtec.com> | 3 | * Author: Marcin Nowakowski <marcin.nowakowski@mips.com> |
| 4 | * | 4 | * |
| 5 | * This program is free software; you can redistribute it and/or modify it | 5 | * This program is free software; you can redistribute it and/or modify it |
| 6 | * under the terms of the GNU General Public License as published by the | 6 | * under the terms of the GNU General Public License as published by the |
diff --git a/arch/mips/include/asm/mips-cm.h b/arch/mips/include/asm/mips-cm.h index 3708b8ccc0b4..8bc5df49b0e1 100644 --- a/arch/mips/include/asm/mips-cm.h +++ b/arch/mips/include/asm/mips-cm.h | |||
| @@ -142,8 +142,8 @@ GCR_ACCESSOR_RO(64, 0x000, config) | |||
| 142 | GCR_ACCESSOR_RW(64, 0x008, base) | 142 | GCR_ACCESSOR_RW(64, 0x008, base) |
| 143 | #define CM_GCR_BASE_GCRBASE GENMASK_ULL(47, 15) | 143 | #define CM_GCR_BASE_GCRBASE GENMASK_ULL(47, 15) |
| 144 | #define CM_GCR_BASE_CMDEFTGT GENMASK(1, 0) | 144 | #define CM_GCR_BASE_CMDEFTGT GENMASK(1, 0) |
| 145 | #define CM_GCR_BASE_CMDEFTGT_DISABLED 0 | 145 | #define CM_GCR_BASE_CMDEFTGT_MEM 0 |
| 146 | #define CM_GCR_BASE_CMDEFTGT_MEM 1 | 146 | #define CM_GCR_BASE_CMDEFTGT_RESERVED 1 |
| 147 | #define CM_GCR_BASE_CMDEFTGT_IOCU0 2 | 147 | #define CM_GCR_BASE_CMDEFTGT_IOCU0 2 |
| 148 | #define CM_GCR_BASE_CMDEFTGT_IOCU1 3 | 148 | #define CM_GCR_BASE_CMDEFTGT_IOCU1 3 |
| 149 | 149 | ||
diff --git a/arch/mips/include/asm/stackframe.h b/arch/mips/include/asm/stackframe.h index 5d3563c55e0c..2161357cc68f 100644 --- a/arch/mips/include/asm/stackframe.h +++ b/arch/mips/include/asm/stackframe.h | |||
| @@ -199,6 +199,10 @@ | |||
| 199 | sll k0, 3 /* extract cu0 bit */ | 199 | sll k0, 3 /* extract cu0 bit */ |
| 200 | .set noreorder | 200 | .set noreorder |
| 201 | bltz k0, 8f | 201 | bltz k0, 8f |
| 202 | move k0, sp | ||
| 203 | .if \docfi | ||
| 204 | .cfi_register sp, k0 | ||
| 205 | .endif | ||
| 202 | #ifdef CONFIG_EVA | 206 | #ifdef CONFIG_EVA |
| 203 | /* | 207 | /* |
| 204 | * Flush interAptiv's Return Prediction Stack (RPS) by writing | 208 | * Flush interAptiv's Return Prediction Stack (RPS) by writing |
| @@ -225,10 +229,6 @@ | |||
| 225 | MTC0 k0, CP0_ENTRYHI | 229 | MTC0 k0, CP0_ENTRYHI |
| 226 | #endif | 230 | #endif |
| 227 | .set reorder | 231 | .set reorder |
| 228 | move k0, sp | ||
| 229 | .if \docfi | ||
| 230 | .cfi_register sp, k0 | ||
| 231 | .endif | ||
| 232 | /* Called from user mode, new stack. */ | 232 | /* Called from user mode, new stack. */ |
| 233 | get_saved_sp docfi=\docfi tosp=1 | 233 | get_saved_sp docfi=\docfi tosp=1 |
| 234 | 8: | 234 | 8: |
diff --git a/arch/mips/kernel/probes-common.h b/arch/mips/kernel/probes-common.h index dd08e41134b6..d2bf77b18822 100644 --- a/arch/mips/kernel/probes-common.h +++ b/arch/mips/kernel/probes-common.h | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2016 Imagination Technologies | 2 | * Copyright (C) 2016 Imagination Technologies |
| 3 | * Author: Marcin Nowakowski <marcin.nowakowski@imgtec.com> | 3 | * Author: Marcin Nowakowski <marcin.nowakowski@mips.com> |
| 4 | * | 4 | * |
| 5 | * This program is free software; you can redistribute it and/or modify it | 5 | * This program is free software; you can redistribute it and/or modify it |
| 6 | * under the terms of the GNU General Public License as published by the | 6 | * under the terms of the GNU General Public License as published by the |
diff --git a/arch/mips/kernel/smp-cmp.c b/arch/mips/kernel/smp-cmp.c index 05295a4909f1..a2322009cac3 100644 --- a/arch/mips/kernel/smp-cmp.c +++ b/arch/mips/kernel/smp-cmp.c | |||
| @@ -19,7 +19,7 @@ | |||
| 19 | #undef DEBUG | 19 | #undef DEBUG |
| 20 | 20 | ||
| 21 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> |
| 22 | #include <linux/sched.h> | 22 | #include <linux/sched/task_stack.h> |
| 23 | #include <linux/smp.h> | 23 | #include <linux/smp.h> |
| 24 | #include <linux/cpumask.h> | 24 | #include <linux/cpumask.h> |
| 25 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
| @@ -50,8 +50,8 @@ static void cmp_init_secondary(void) | |||
| 50 | 50 | ||
| 51 | #ifdef CONFIG_MIPS_MT_SMP | 51 | #ifdef CONFIG_MIPS_MT_SMP |
| 52 | if (cpu_has_mipsmt) | 52 | if (cpu_has_mipsmt) |
| 53 | c->vpe_id = (read_c0_tcbind() >> TCBIND_CURVPE_SHIFT) & | 53 | cpu_set_vpe_id(c, (read_c0_tcbind() >> TCBIND_CURVPE_SHIFT) & |
| 54 | TCBIND_CURVPE; | 54 | TCBIND_CURVPE); |
| 55 | #endif | 55 | #endif |
| 56 | } | 56 | } |
| 57 | 57 | ||
diff --git a/arch/mips/kernel/smp-cps.c b/arch/mips/kernel/smp-cps.c index 7d6af41888e8..ecc1a853f48d 100644 --- a/arch/mips/kernel/smp-cps.c +++ b/arch/mips/kernel/smp-cps.c | |||
| @@ -306,7 +306,7 @@ static int cps_boot_secondary(int cpu, struct task_struct *idle) | |||
| 306 | int err; | 306 | int err; |
| 307 | 307 | ||
| 308 | /* We don't yet support booting CPUs in other clusters */ | 308 | /* We don't yet support booting CPUs in other clusters */ |
| 309 | if (cpu_cluster(&cpu_data[cpu]) != cpu_cluster(¤t_cpu_data)) | 309 | if (cpu_cluster(&cpu_data[cpu]) != cpu_cluster(&raw_current_cpu_data)) |
| 310 | return -ENOSYS; | 310 | return -ENOSYS; |
| 311 | 311 | ||
| 312 | vpe_cfg->pc = (unsigned long)&smp_bootstrap; | 312 | vpe_cfg->pc = (unsigned long)&smp_bootstrap; |
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index bbe19b64def5..88be966d3e61 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c | |||
| @@ -42,7 +42,7 @@ | |||
| 42 | #include <asm/processor.h> | 42 | #include <asm/processor.h> |
| 43 | #include <asm/idle.h> | 43 | #include <asm/idle.h> |
| 44 | #include <asm/r4k-timer.h> | 44 | #include <asm/r4k-timer.h> |
| 45 | #include <asm/mips-cpc.h> | 45 | #include <asm/mips-cps.h> |
| 46 | #include <asm/mmu_context.h> | 46 | #include <asm/mmu_context.h> |
| 47 | #include <asm/time.h> | 47 | #include <asm/time.h> |
| 48 | #include <asm/setup.h> | 48 | #include <asm/setup.h> |
| @@ -66,6 +66,7 @@ EXPORT_SYMBOL(cpu_sibling_map); | |||
| 66 | cpumask_t cpu_core_map[NR_CPUS] __read_mostly; | 66 | cpumask_t cpu_core_map[NR_CPUS] __read_mostly; |
| 67 | EXPORT_SYMBOL(cpu_core_map); | 67 | EXPORT_SYMBOL(cpu_core_map); |
| 68 | 68 | ||
| 69 | static DECLARE_COMPLETION(cpu_starting); | ||
| 69 | static DECLARE_COMPLETION(cpu_running); | 70 | static DECLARE_COMPLETION(cpu_running); |
| 70 | 71 | ||
| 71 | /* | 72 | /* |
| @@ -374,6 +375,12 @@ asmlinkage void start_secondary(void) | |||
| 374 | cpumask_set_cpu(cpu, &cpu_coherent_mask); | 375 | cpumask_set_cpu(cpu, &cpu_coherent_mask); |
| 375 | notify_cpu_starting(cpu); | 376 | notify_cpu_starting(cpu); |
| 376 | 377 | ||
| 378 | /* Notify boot CPU that we're starting & ready to sync counters */ | ||
| 379 | complete(&cpu_starting); | ||
| 380 | |||
| 381 | synchronise_count_slave(cpu); | ||
| 382 | |||
| 383 | /* The CPU is running and counters synchronised, now mark it online */ | ||
| 377 | set_cpu_online(cpu, true); | 384 | set_cpu_online(cpu, true); |
| 378 | 385 | ||
| 379 | set_cpu_sibling_map(cpu); | 386 | set_cpu_sibling_map(cpu); |
| @@ -381,8 +388,11 @@ asmlinkage void start_secondary(void) | |||
| 381 | 388 | ||
| 382 | calculate_cpu_foreign_map(); | 389 | calculate_cpu_foreign_map(); |
| 383 | 390 | ||
| 391 | /* | ||
| 392 | * Notify boot CPU that we're up & online and it can safely return | ||
| 393 | * from __cpu_up | ||
| 394 | */ | ||
| 384 | complete(&cpu_running); | 395 | complete(&cpu_running); |
| 385 | synchronise_count_slave(cpu); | ||
| 386 | 396 | ||
| 387 | /* | 397 | /* |
| 388 | * irq will be enabled in ->smp_finish(), enabling it too early | 398 | * irq will be enabled in ->smp_finish(), enabling it too early |
| @@ -445,17 +455,17 @@ int __cpu_up(unsigned int cpu, struct task_struct *tidle) | |||
| 445 | if (err) | 455 | if (err) |
| 446 | return err; | 456 | return err; |
| 447 | 457 | ||
| 448 | /* | 458 | /* Wait for CPU to start and be ready to sync counters */ |
| 449 | * We must check for timeout here, as the CPU will not be marked | 459 | if (!wait_for_completion_timeout(&cpu_starting, |
| 450 | * online until the counters are synchronised. | ||
| 451 | */ | ||
| 452 | if (!wait_for_completion_timeout(&cpu_running, | ||
| 453 | msecs_to_jiffies(1000))) { | 460 | msecs_to_jiffies(1000))) { |
| 454 | pr_crit("CPU%u: failed to start\n", cpu); | 461 | pr_crit("CPU%u: failed to start\n", cpu); |
| 455 | return -EIO; | 462 | return -EIO; |
| 456 | } | 463 | } |
| 457 | 464 | ||
| 458 | synchronise_count_master(cpu); | 465 | synchronise_count_master(cpu); |
| 466 | |||
| 467 | /* Wait for CPU to finish startup & mark itself online before return */ | ||
| 468 | wait_for_completion(&cpu_running); | ||
| 459 | return 0; | 469 | return 0; |
| 460 | } | 470 | } |
| 461 | 471 | ||
diff --git a/arch/mips/mm/uasm-micromips.c b/arch/mips/mm/uasm-micromips.c index c28ff53c8da0..cdb5a191b9d5 100644 --- a/arch/mips/mm/uasm-micromips.c +++ b/arch/mips/mm/uasm-micromips.c | |||
| @@ -80,7 +80,7 @@ static const struct insn const insn_table_MM[insn_invalid] = { | |||
| 80 | [insn_jr] = {M(mm_pool32a_op, 0, 0, 0, mm_jalr_op, mm_pool32axf_op), RS}, | 80 | [insn_jr] = {M(mm_pool32a_op, 0, 0, 0, mm_jalr_op, mm_pool32axf_op), RS}, |
| 81 | [insn_lb] = {M(mm_lb32_op, 0, 0, 0, 0, 0), RT | RS | SIMM}, | 81 | [insn_lb] = {M(mm_lb32_op, 0, 0, 0, 0, 0), RT | RS | SIMM}, |
| 82 | [insn_ld] = {0, 0}, | 82 | [insn_ld] = {0, 0}, |
| 83 | [insn_lh] = {M(mm_lh32_op, 0, 0, 0, 0, 0), RS | RS | SIMM}, | 83 | [insn_lh] = {M(mm_lh32_op, 0, 0, 0, 0, 0), RT | RS | SIMM}, |
| 84 | [insn_ll] = {M(mm_pool32c_op, 0, 0, (mm_ll_func << 1), 0, 0), RS | RT | SIMM}, | 84 | [insn_ll] = {M(mm_pool32c_op, 0, 0, (mm_ll_func << 1), 0, 0), RS | RT | SIMM}, |
| 85 | [insn_lld] = {0, 0}, | 85 | [insn_lld] = {0, 0}, |
| 86 | [insn_lui] = {M(mm_pool32i_op, mm_lui_op, 0, 0, 0, 0), RS | SIMM}, | 86 | [insn_lui] = {M(mm_pool32i_op, mm_lui_op, 0, 0, 0, 0), RS | SIMM}, |
diff --git a/arch/mips/net/ebpf_jit.c b/arch/mips/net/ebpf_jit.c index 01b7a87ea678..962b0259b4b6 100644 --- a/arch/mips/net/ebpf_jit.c +++ b/arch/mips/net/ebpf_jit.c | |||
| @@ -1513,7 +1513,7 @@ ld_skb_common: | |||
| 1513 | } | 1513 | } |
| 1514 | src = ebpf_to_mips_reg(ctx, insn, src_reg_no_fp); | 1514 | src = ebpf_to_mips_reg(ctx, insn, src_reg_no_fp); |
| 1515 | if (src < 0) | 1515 | if (src < 0) |
| 1516 | return dst; | 1516 | return src; |
| 1517 | if (BPF_MODE(insn->code) == BPF_XADD) { | 1517 | if (BPF_MODE(insn->code) == BPF_XADD) { |
| 1518 | switch (BPF_SIZE(insn->code)) { | 1518 | switch (BPF_SIZE(insn->code)) { |
| 1519 | case BPF_W: | 1519 | case BPF_W: |
