Annotation of /trunk/kernel-magellan/patches-3.1.4-r1/0100-3.1.1-all-fixes.patch
Parent Directory | Revision Log
Revision 1592 -
(hide annotations)
(download)
Thu Dec 1 16:53:20 2011 UTC (12 years, 9 months ago) by niro
File size: 403626 byte(s)
Thu Dec 1 16:53:20 2011 UTC (12 years, 9 months ago) by niro
File size: 403626 byte(s)
3.1.4-magellan-r1
1 | niro | 1592 | diff --git a/Documentation/hwspinlock.txt b/Documentation/hwspinlock.txt |
2 | index 7dcd1a4..6996681 100644 | ||
3 | --- a/Documentation/hwspinlock.txt | ||
4 | +++ b/Documentation/hwspinlock.txt | ||
5 | @@ -39,23 +39,20 @@ independent, drivers. | ||
6 | in case an unused hwspinlock isn't available. Users of this | ||
7 | API will usually want to communicate the lock's id to the remote core | ||
8 | before it can be used to achieve synchronization. | ||
9 | - Can be called from an atomic context (this function will not sleep) but | ||
10 | - not from within interrupt context. | ||
11 | + Should be called from a process context (might sleep). | ||
12 | |||
13 | struct hwspinlock *hwspin_lock_request_specific(unsigned int id); | ||
14 | - assign a specific hwspinlock id and return its address, or NULL | ||
15 | if that hwspinlock is already in use. Usually board code will | ||
16 | be calling this function in order to reserve specific hwspinlock | ||
17 | ids for predefined purposes. | ||
18 | - Can be called from an atomic context (this function will not sleep) but | ||
19 | - not from within interrupt context. | ||
20 | + Should be called from a process context (might sleep). | ||
21 | |||
22 | int hwspin_lock_free(struct hwspinlock *hwlock); | ||
23 | - free a previously-assigned hwspinlock; returns 0 on success, or an | ||
24 | appropriate error code on failure (e.g. -EINVAL if the hwspinlock | ||
25 | is already free). | ||
26 | - Can be called from an atomic context (this function will not sleep) but | ||
27 | - not from within interrupt context. | ||
28 | + Should be called from a process context (might sleep). | ||
29 | |||
30 | int hwspin_lock_timeout(struct hwspinlock *hwlock, unsigned int timeout); | ||
31 | - lock a previously-assigned hwspinlock with a timeout limit (specified in | ||
32 | @@ -232,15 +229,14 @@ int hwspinlock_example2(void) | ||
33 | |||
34 | int hwspin_lock_register(struct hwspinlock *hwlock); | ||
35 | - to be called from the underlying platform-specific implementation, in | ||
36 | - order to register a new hwspinlock instance. Can be called from an atomic | ||
37 | - context (this function will not sleep) but not from within interrupt | ||
38 | - context. Returns 0 on success, or appropriate error code on failure. | ||
39 | + order to register a new hwspinlock instance. Should be called from | ||
40 | + a process context (this function might sleep). | ||
41 | + Returns 0 on success, or appropriate error code on failure. | ||
42 | |||
43 | struct hwspinlock *hwspin_lock_unregister(unsigned int id); | ||
44 | - to be called from the underlying vendor-specific implementation, in order | ||
45 | to unregister an existing (and unused) hwspinlock instance. | ||
46 | - Can be called from an atomic context (will not sleep) but not from | ||
47 | - within interrupt context. | ||
48 | + Should be called from a process context (this function might sleep). | ||
49 | Returns the address of hwspinlock on success, or NULL on error (e.g. | ||
50 | if the hwspinlock is sill in use). | ||
51 | |||
52 | diff --git a/Documentation/power/runtime_pm.txt b/Documentation/power/runtime_pm.txt | ||
53 | index 6066e3a..d3710dc 100644 | ||
54 | --- a/Documentation/power/runtime_pm.txt | ||
55 | +++ b/Documentation/power/runtime_pm.txt | ||
56 | @@ -782,6 +782,16 @@ will behave normally, not taking the autosuspend delay into account. | ||
57 | Similarly, if the power.use_autosuspend field isn't set then the autosuspend | ||
58 | helper functions will behave just like the non-autosuspend counterparts. | ||
59 | |||
60 | +Under some circumstances a driver or subsystem may want to prevent a device | ||
61 | +from autosuspending immediately, even though the usage counter is zero and the | ||
62 | +autosuspend delay time has expired. If the ->runtime_suspend() callback | ||
63 | +returns -EAGAIN or -EBUSY, and if the next autosuspend delay expiration time is | ||
64 | +in the future (as it normally would be if the callback invoked | ||
65 | +pm_runtime_mark_last_busy()), the PM core will automatically reschedule the | ||
66 | +autosuspend. The ->runtime_suspend() callback can't do this rescheduling | ||
67 | +itself because no suspend requests of any kind are accepted while the device is | ||
68 | +suspending (i.e., while the callback is running). | ||
69 | + | ||
70 | The implementation is well suited for asynchronous use in interrupt contexts. | ||
71 | However such use inevitably involves races, because the PM core can't | ||
72 | synchronize ->runtime_suspend() callbacks with the arrival of I/O requests. | ||
73 | diff --git a/Documentation/stable_kernel_rules.txt b/Documentation/stable_kernel_rules.txt | ||
74 | index e213f45..21fd05c 100644 | ||
75 | --- a/Documentation/stable_kernel_rules.txt | ||
76 | +++ b/Documentation/stable_kernel_rules.txt | ||
77 | @@ -24,10 +24,10 @@ Rules on what kind of patches are accepted, and which ones are not, into the | ||
78 | Procedure for submitting patches to the -stable tree: | ||
79 | |||
80 | - Send the patch, after verifying that it follows the above rules, to | ||
81 | - stable@kernel.org. You must note the upstream commit ID in the changelog | ||
82 | - of your submission. | ||
83 | + stable@vger.kernel.org. You must note the upstream commit ID in the | ||
84 | + changelog of your submission. | ||
85 | - To have the patch automatically included in the stable tree, add the tag | ||
86 | - Cc: stable@kernel.org | ||
87 | + Cc: stable@vger.kernel.org | ||
88 | in the sign-off area. Once the patch is merged it will be applied to | ||
89 | the stable tree without anything else needing to be done by the author | ||
90 | or subsystem maintainer. | ||
91 | @@ -35,10 +35,10 @@ Procedure for submitting patches to the -stable tree: | ||
92 | cherry-picked than this can be specified in the following format in | ||
93 | the sign-off area: | ||
94 | |||
95 | - Cc: <stable@kernel.org> # .32.x: a1f84a3: sched: Check for idle | ||
96 | - Cc: <stable@kernel.org> # .32.x: 1b9508f: sched: Rate-limit newidle | ||
97 | - Cc: <stable@kernel.org> # .32.x: fd21073: sched: Fix affinity logic | ||
98 | - Cc: <stable@kernel.org> # .32.x | ||
99 | + Cc: <stable@vger.kernel.org> # .32.x: a1f84a3: sched: Check for idle | ||
100 | + Cc: <stable@vger.kernel.org> # .32.x: 1b9508f: sched: Rate-limit newidle | ||
101 | + Cc: <stable@vger.kernel.org> # .32.x: fd21073: sched: Fix affinity logic | ||
102 | + Cc: <stable@vger.kernel.org> # .32.x | ||
103 | Signed-off-by: Ingo Molnar <mingo@elte.hu> | ||
104 | |||
105 | The tag sequence has the meaning of: | ||
106 | diff --git a/MAINTAINERS b/MAINTAINERS | ||
107 | index 6185d05..e608038 100644 | ||
108 | --- a/MAINTAINERS | ||
109 | +++ b/MAINTAINERS | ||
110 | @@ -1230,7 +1230,7 @@ F: Documentation/aoe/ | ||
111 | F: drivers/block/aoe/ | ||
112 | |||
113 | ATHEROS ATH GENERIC UTILITIES | ||
114 | -M: "Luis R. Rodriguez" <lrodriguez@atheros.com> | ||
115 | +M: "Luis R. Rodriguez" <mcgrof@qca.qualcomm.com> | ||
116 | L: linux-wireless@vger.kernel.org | ||
117 | S: Supported | ||
118 | F: drivers/net/wireless/ath/* | ||
119 | @@ -1238,7 +1238,7 @@ F: drivers/net/wireless/ath/* | ||
120 | ATHEROS ATH5K WIRELESS DRIVER | ||
121 | M: Jiri Slaby <jirislaby@gmail.com> | ||
122 | M: Nick Kossifidis <mickflemm@gmail.com> | ||
123 | -M: "Luis R. Rodriguez" <lrodriguez@atheros.com> | ||
124 | +M: "Luis R. Rodriguez" <mcgrof@qca.qualcomm.com> | ||
125 | M: Bob Copeland <me@bobcopeland.com> | ||
126 | L: linux-wireless@vger.kernel.org | ||
127 | L: ath5k-devel@lists.ath5k.org | ||
128 | @@ -1247,10 +1247,10 @@ S: Maintained | ||
129 | F: drivers/net/wireless/ath/ath5k/ | ||
130 | |||
131 | ATHEROS ATH9K WIRELESS DRIVER | ||
132 | -M: "Luis R. Rodriguez" <lrodriguez@atheros.com> | ||
133 | -M: Jouni Malinen <jmalinen@atheros.com> | ||
134 | -M: Vasanthakumar Thiagarajan <vasanth@atheros.com> | ||
135 | -M: Senthil Balasubramanian <senthilkumar@atheros.com> | ||
136 | +M: "Luis R. Rodriguez" <mcgrof@qca.qualcomm.com> | ||
137 | +M: Jouni Malinen <jouni@qca.qualcomm.com> | ||
138 | +M: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com> | ||
139 | +M: Senthil Balasubramanian <senthilb@qca.qualcomm.com> | ||
140 | L: linux-wireless@vger.kernel.org | ||
141 | L: ath9k-devel@lists.ath9k.org | ||
142 | W: http://wireless.kernel.org/en/users/Drivers/ath9k | ||
143 | diff --git a/arch/arm/mach-exynos4/platsmp.c b/arch/arm/mach-exynos4/platsmp.c | ||
144 | index df6ef1b..0c90896 100644 | ||
145 | --- a/arch/arm/mach-exynos4/platsmp.c | ||
146 | +++ b/arch/arm/mach-exynos4/platsmp.c | ||
147 | @@ -193,12 +193,10 @@ void __init smp_init_cpus(void) | ||
148 | ncores = scu_base ? scu_get_core_count(scu_base) : 1; | ||
149 | |||
150 | /* sanity check */ | ||
151 | - if (ncores > NR_CPUS) { | ||
152 | - printk(KERN_WARNING | ||
153 | - "EXYNOS4: no. of cores (%d) greater than configured " | ||
154 | - "maximum of %d - clipping\n", | ||
155 | - ncores, NR_CPUS); | ||
156 | - ncores = NR_CPUS; | ||
157 | + if (ncores > nr_cpu_ids) { | ||
158 | + pr_warn("SMP: %u cores greater than maximum (%u), clipping\n", | ||
159 | + ncores, nr_cpu_ids); | ||
160 | + ncores = nr_cpu_ids; | ||
161 | } | ||
162 | |||
163 | for (i = 0; i < ncores; i++) | ||
164 | diff --git a/arch/arm/mach-msm/platsmp.c b/arch/arm/mach-msm/platsmp.c | ||
165 | index 1a1af9e..7276595 100644 | ||
166 | --- a/arch/arm/mach-msm/platsmp.c | ||
167 | +++ b/arch/arm/mach-msm/platsmp.c | ||
168 | @@ -156,6 +156,12 @@ void __init smp_init_cpus(void) | ||
169 | { | ||
170 | unsigned int i, ncores = get_core_count(); | ||
171 | |||
172 | + if (ncores > nr_cpu_ids) { | ||
173 | + pr_warn("SMP: %u cores greater than maximum (%u), clipping\n", | ||
174 | + ncores, nr_cpu_ids); | ||
175 | + ncores = nr_cpu_ids; | ||
176 | + } | ||
177 | + | ||
178 | for (i = 0; i < ncores; i++) | ||
179 | set_cpu_possible(i, true); | ||
180 | |||
181 | diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c | ||
182 | index ce65e93..889464d 100644 | ||
183 | --- a/arch/arm/mach-omap2/omap-smp.c | ||
184 | +++ b/arch/arm/mach-omap2/omap-smp.c | ||
185 | @@ -109,12 +109,10 @@ void __init smp_init_cpus(void) | ||
186 | ncores = scu_get_core_count(scu_base); | ||
187 | |||
188 | /* sanity check */ | ||
189 | - if (ncores > NR_CPUS) { | ||
190 | - printk(KERN_WARNING | ||
191 | - "OMAP4: no. of cores (%d) greater than configured " | ||
192 | - "maximum of %d - clipping\n", | ||
193 | - ncores, NR_CPUS); | ||
194 | - ncores = NR_CPUS; | ||
195 | + if (ncores > nr_cpu_ids) { | ||
196 | + pr_warn("SMP: %u cores greater than maximum (%u), clipping\n", | ||
197 | + ncores, nr_cpu_ids); | ||
198 | + ncores = nr_cpu_ids; | ||
199 | } | ||
200 | |||
201 | for (i = 0; i < ncores; i++) | ||
202 | diff --git a/arch/arm/mach-pxa/cm-x300.c b/arch/arm/mach-pxa/cm-x300.c | ||
203 | index b6a5134..3814e12 100644 | ||
204 | --- a/arch/arm/mach-pxa/cm-x300.c | ||
205 | +++ b/arch/arm/mach-pxa/cm-x300.c | ||
206 | @@ -775,7 +775,6 @@ static struct gpio cm_x300_wi2wi_gpios[] __initdata = { | ||
207 | |||
208 | static void __init cm_x300_init_wi2wi(void) | ||
209 | { | ||
210 | - int bt_reset, wlan_en; | ||
211 | int err; | ||
212 | |||
213 | if (system_rev < 130) { | ||
214 | @@ -791,12 +790,11 @@ static void __init cm_x300_init_wi2wi(void) | ||
215 | } | ||
216 | |||
217 | udelay(10); | ||
218 | - gpio_set_value(bt_reset, 0); | ||
219 | + gpio_set_value(cm_x300_wi2wi_gpios[1].gpio, 0); | ||
220 | udelay(10); | ||
221 | - gpio_set_value(bt_reset, 1); | ||
222 | + gpio_set_value(cm_x300_wi2wi_gpios[1].gpio, 1); | ||
223 | |||
224 | - gpio_free(wlan_en); | ||
225 | - gpio_free(bt_reset); | ||
226 | + gpio_free_array(ARRAY_AND_SIZE(cm_x300_wi2wi_gpios)); | ||
227 | } | ||
228 | |||
229 | /* MFP */ | ||
230 | diff --git a/arch/arm/mach-realview/platsmp.c b/arch/arm/mach-realview/platsmp.c | ||
231 | index 4ae943b..e83c654 100644 | ||
232 | --- a/arch/arm/mach-realview/platsmp.c | ||
233 | +++ b/arch/arm/mach-realview/platsmp.c | ||
234 | @@ -52,12 +52,10 @@ void __init smp_init_cpus(void) | ||
235 | ncores = scu_base ? scu_get_core_count(scu_base) : 1; | ||
236 | |||
237 | /* sanity check */ | ||
238 | - if (ncores > NR_CPUS) { | ||
239 | - printk(KERN_WARNING | ||
240 | - "Realview: no. of cores (%d) greater than configured " | ||
241 | - "maximum of %d - clipping\n", | ||
242 | - ncores, NR_CPUS); | ||
243 | - ncores = NR_CPUS; | ||
244 | + if (ncores > nr_cpu_ids) { | ||
245 | + pr_warn("SMP: %u cores greater than maximum (%u), clipping\n", | ||
246 | + ncores, nr_cpu_ids); | ||
247 | + ncores = nr_cpu_ids; | ||
248 | } | ||
249 | |||
250 | for (i = 0; i < ncores; i++) | ||
251 | diff --git a/arch/arm/mach-shmobile/platsmp.c b/arch/arm/mach-shmobile/platsmp.c | ||
252 | index 66f9806..e4e485f 100644 | ||
253 | --- a/arch/arm/mach-shmobile/platsmp.c | ||
254 | +++ b/arch/arm/mach-shmobile/platsmp.c | ||
255 | @@ -56,6 +56,12 @@ void __init smp_init_cpus(void) | ||
256 | unsigned int ncores = shmobile_smp_get_core_count(); | ||
257 | unsigned int i; | ||
258 | |||
259 | + if (ncores > nr_cpu_ids) { | ||
260 | + pr_warn("SMP: %u cores greater than maximum (%u), clipping\n", | ||
261 | + ncores, nr_cpu_ids); | ||
262 | + ncores = nr_cpu_ids; | ||
263 | + } | ||
264 | + | ||
265 | for (i = 0; i < ncores; i++) | ||
266 | set_cpu_possible(i, true); | ||
267 | |||
268 | diff --git a/arch/arm/mach-tegra/platsmp.c b/arch/arm/mach-tegra/platsmp.c | ||
269 | index 0886cbc..7d2b5d0 100644 | ||
270 | --- a/arch/arm/mach-tegra/platsmp.c | ||
271 | +++ b/arch/arm/mach-tegra/platsmp.c | ||
272 | @@ -114,10 +114,10 @@ void __init smp_init_cpus(void) | ||
273 | { | ||
274 | unsigned int i, ncores = scu_get_core_count(scu_base); | ||
275 | |||
276 | - if (ncores > NR_CPUS) { | ||
277 | - printk(KERN_ERR "Tegra: no. of cores (%u) greater than configured (%u), clipping\n", | ||
278 | - ncores, NR_CPUS); | ||
279 | - ncores = NR_CPUS; | ||
280 | + if (ncores > nr_cpu_ids) { | ||
281 | + pr_warn("SMP: %u cores greater than maximum (%u), clipping\n", | ||
282 | + ncores, nr_cpu_ids); | ||
283 | + ncores = nr_cpu_ids; | ||
284 | } | ||
285 | |||
286 | for (i = 0; i < ncores; i++) | ||
287 | diff --git a/arch/arm/mach-ux500/cpu.c b/arch/arm/mach-ux500/cpu.c | ||
288 | index 1da23bb..8aa104a 100644 | ||
289 | --- a/arch/arm/mach-ux500/cpu.c | ||
290 | +++ b/arch/arm/mach-ux500/cpu.c | ||
291 | @@ -99,7 +99,27 @@ static void ux500_l2x0_inv_all(void) | ||
292 | ux500_cache_sync(); | ||
293 | } | ||
294 | |||
295 | -static int ux500_l2x0_init(void) | ||
296 | +static int __init ux500_l2x0_unlock(void) | ||
297 | +{ | ||
298 | + int i; | ||
299 | + | ||
300 | + /* | ||
301 | + * Unlock Data and Instruction Lock if locked. Ux500 U-Boot versions | ||
302 | + * apparently locks both caches before jumping to the kernel. The | ||
303 | + * l2x0 core will not touch the unlock registers if the l2x0 is | ||
304 | + * already enabled, so we do it right here instead. The PL310 has | ||
305 | + * 8 sets of registers, one per possible CPU. | ||
306 | + */ | ||
307 | + for (i = 0; i < 8; i++) { | ||
308 | + writel_relaxed(0x0, l2x0_base + L2X0_LOCKDOWN_WAY_D_BASE + | ||
309 | + i * L2X0_LOCKDOWN_STRIDE); | ||
310 | + writel_relaxed(0x0, l2x0_base + L2X0_LOCKDOWN_WAY_I_BASE + | ||
311 | + i * L2X0_LOCKDOWN_STRIDE); | ||
312 | + } | ||
313 | + return 0; | ||
314 | +} | ||
315 | + | ||
316 | +static int __init ux500_l2x0_init(void) | ||
317 | { | ||
318 | if (cpu_is_u5500()) | ||
319 | l2x0_base = __io_address(U5500_L2CC_BASE); | ||
320 | @@ -108,6 +128,9 @@ static int ux500_l2x0_init(void) | ||
321 | else | ||
322 | ux500_unknown_soc(); | ||
323 | |||
324 | + /* Unlock before init */ | ||
325 | + ux500_l2x0_unlock(); | ||
326 | + | ||
327 | /* 64KB way size, 8 way associativity, force WA */ | ||
328 | l2x0_init(l2x0_base, 0x3e060000, 0xc0000fff); | ||
329 | |||
330 | diff --git a/arch/arm/mach-ux500/platsmp.c b/arch/arm/mach-ux500/platsmp.c | ||
331 | index a33df5f..eb51991 100644 | ||
332 | --- a/arch/arm/mach-ux500/platsmp.c | ||
333 | +++ b/arch/arm/mach-ux500/platsmp.c | ||
334 | @@ -156,12 +156,10 @@ void __init smp_init_cpus(void) | ||
335 | ncores = scu_base ? scu_get_core_count(scu_base) : 1; | ||
336 | |||
337 | /* sanity check */ | ||
338 | - if (ncores > NR_CPUS) { | ||
339 | - printk(KERN_WARNING | ||
340 | - "U8500: no. of cores (%d) greater than configured " | ||
341 | - "maximum of %d - clipping\n", | ||
342 | - ncores, NR_CPUS); | ||
343 | - ncores = NR_CPUS; | ||
344 | + if (ncores > nr_cpu_ids) { | ||
345 | + pr_warn("SMP: %u cores greater than maximum (%u), clipping\n", | ||
346 | + ncores, nr_cpu_ids); | ||
347 | + ncores = nr_cpu_ids; | ||
348 | } | ||
349 | |||
350 | for (i = 0; i < ncores; i++) | ||
351 | diff --git a/arch/arm/mach-vexpress/ct-ca9x4.c b/arch/arm/mach-vexpress/ct-ca9x4.c | ||
352 | index bfd32f5..2b1e836 100644 | ||
353 | --- a/arch/arm/mach-vexpress/ct-ca9x4.c | ||
354 | +++ b/arch/arm/mach-vexpress/ct-ca9x4.c | ||
355 | @@ -221,6 +221,12 @@ static void ct_ca9x4_init_cpu_map(void) | ||
356 | { | ||
357 | int i, ncores = scu_get_core_count(MMIO_P2V(A9_MPCORE_SCU)); | ||
358 | |||
359 | + if (ncores > nr_cpu_ids) { | ||
360 | + pr_warn("SMP: %u cores greater than maximum (%u), clipping\n", | ||
361 | + ncores, nr_cpu_ids); | ||
362 | + ncores = nr_cpu_ids; | ||
363 | + } | ||
364 | + | ||
365 | for (i = 0; i < ncores; ++i) | ||
366 | set_cpu_possible(i, true); | ||
367 | |||
368 | diff --git a/arch/arm/plat-mxc/include/mach/iomux-v3.h b/arch/arm/plat-mxc/include/mach/iomux-v3.h | ||
369 | index ebbce33..4509956 100644 | ||
370 | --- a/arch/arm/plat-mxc/include/mach/iomux-v3.h | ||
371 | +++ b/arch/arm/plat-mxc/include/mach/iomux-v3.h | ||
372 | @@ -89,11 +89,11 @@ typedef u64 iomux_v3_cfg_t; | ||
373 | #define PAD_CTL_HYS (1 << 8) | ||
374 | |||
375 | #define PAD_CTL_PKE (1 << 7) | ||
376 | -#define PAD_CTL_PUE (1 << 6) | ||
377 | -#define PAD_CTL_PUS_100K_DOWN (0 << 4) | ||
378 | -#define PAD_CTL_PUS_47K_UP (1 << 4) | ||
379 | -#define PAD_CTL_PUS_100K_UP (2 << 4) | ||
380 | -#define PAD_CTL_PUS_22K_UP (3 << 4) | ||
381 | +#define PAD_CTL_PUE (1 << 6 | PAD_CTL_PKE) | ||
382 | +#define PAD_CTL_PUS_100K_DOWN (0 << 4 | PAD_CTL_PUE) | ||
383 | +#define PAD_CTL_PUS_47K_UP (1 << 4 | PAD_CTL_PUE) | ||
384 | +#define PAD_CTL_PUS_100K_UP (2 << 4 | PAD_CTL_PUE) | ||
385 | +#define PAD_CTL_PUS_22K_UP (3 << 4 | PAD_CTL_PUE) | ||
386 | |||
387 | #define PAD_CTL_ODE (1 << 3) | ||
388 | |||
389 | diff --git a/arch/powerpc/include/asm/sparsemem.h b/arch/powerpc/include/asm/sparsemem.h | ||
390 | index 54a47ea..0c5fa31 100644 | ||
391 | --- a/arch/powerpc/include/asm/sparsemem.h | ||
392 | +++ b/arch/powerpc/include/asm/sparsemem.h | ||
393 | @@ -16,7 +16,7 @@ | ||
394 | #endif /* CONFIG_SPARSEMEM */ | ||
395 | |||
396 | #ifdef CONFIG_MEMORY_HOTPLUG | ||
397 | -extern void create_section_mapping(unsigned long start, unsigned long end); | ||
398 | +extern int create_section_mapping(unsigned long start, unsigned long end); | ||
399 | extern int remove_section_mapping(unsigned long start, unsigned long end); | ||
400 | #ifdef CONFIG_NUMA | ||
401 | extern int hot_add_scn_to_nid(unsigned long scn_addr); | ||
402 | diff --git a/arch/powerpc/mm/gup.c b/arch/powerpc/mm/gup.c | ||
403 | index fec1320..d7efdbf 100644 | ||
404 | --- a/arch/powerpc/mm/gup.c | ||
405 | +++ b/arch/powerpc/mm/gup.c | ||
406 | @@ -16,16 +16,6 @@ | ||
407 | |||
408 | #ifdef __HAVE_ARCH_PTE_SPECIAL | ||
409 | |||
410 | -static inline void get_huge_page_tail(struct page *page) | ||
411 | -{ | ||
412 | - /* | ||
413 | - * __split_huge_page_refcount() cannot run | ||
414 | - * from under us. | ||
415 | - */ | ||
416 | - VM_BUG_ON(atomic_read(&page->_count) < 0); | ||
417 | - atomic_inc(&page->_count); | ||
418 | -} | ||
419 | - | ||
420 | /* | ||
421 | * The performance critical leaf functions are made noinline otherwise gcc | ||
422 | * inlines everything into a single function which results in too much | ||
423 | @@ -57,8 +47,6 @@ static noinline int gup_pte_range(pmd_t pmd, unsigned long addr, | ||
424 | put_page(page); | ||
425 | return 0; | ||
426 | } | ||
427 | - if (PageTail(page)) | ||
428 | - get_huge_page_tail(page); | ||
429 | pages[*nr] = page; | ||
430 | (*nr)++; | ||
431 | |||
432 | diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c | ||
433 | index 26b2872..07f9e9f 100644 | ||
434 | --- a/arch/powerpc/mm/hash_utils_64.c | ||
435 | +++ b/arch/powerpc/mm/hash_utils_64.c | ||
436 | @@ -534,11 +534,11 @@ static unsigned long __init htab_get_table_size(void) | ||
437 | } | ||
438 | |||
439 | #ifdef CONFIG_MEMORY_HOTPLUG | ||
440 | -void create_section_mapping(unsigned long start, unsigned long end) | ||
441 | +int create_section_mapping(unsigned long start, unsigned long end) | ||
442 | { | ||
443 | - BUG_ON(htab_bolt_mapping(start, end, __pa(start), | ||
444 | + return htab_bolt_mapping(start, end, __pa(start), | ||
445 | pgprot_val(PAGE_KERNEL), mmu_linear_psize, | ||
446 | - mmu_kernel_ssize)); | ||
447 | + mmu_kernel_ssize); | ||
448 | } | ||
449 | |||
450 | int remove_section_mapping(unsigned long start, unsigned long end) | ||
451 | diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c | ||
452 | index 0b9a5c1..da5eb38 100644 | ||
453 | --- a/arch/powerpc/mm/hugetlbpage.c | ||
454 | +++ b/arch/powerpc/mm/hugetlbpage.c | ||
455 | @@ -390,7 +390,7 @@ static noinline int gup_hugepte(pte_t *ptep, unsigned long sz, unsigned long add | ||
456 | { | ||
457 | unsigned long mask; | ||
458 | unsigned long pte_end; | ||
459 | - struct page *head, *page; | ||
460 | + struct page *head, *page, *tail; | ||
461 | pte_t pte; | ||
462 | int refs; | ||
463 | |||
464 | @@ -413,6 +413,7 @@ static noinline int gup_hugepte(pte_t *ptep, unsigned long sz, unsigned long add | ||
465 | head = pte_page(pte); | ||
466 | |||
467 | page = head + ((addr & (sz-1)) >> PAGE_SHIFT); | ||
468 | + tail = page; | ||
469 | do { | ||
470 | VM_BUG_ON(compound_head(page) != head); | ||
471 | pages[*nr] = page; | ||
472 | @@ -428,10 +429,20 @@ static noinline int gup_hugepte(pte_t *ptep, unsigned long sz, unsigned long add | ||
473 | |||
474 | if (unlikely(pte_val(pte) != pte_val(*ptep))) { | ||
475 | /* Could be optimized better */ | ||
476 | - while (*nr) { | ||
477 | - put_page(page); | ||
478 | - (*nr)--; | ||
479 | - } | ||
480 | + *nr -= refs; | ||
481 | + while (refs--) | ||
482 | + put_page(head); | ||
483 | + return 0; | ||
484 | + } | ||
485 | + | ||
486 | + /* | ||
487 | + * Any tail page need their mapcount reference taken before we | ||
488 | + * return. | ||
489 | + */ | ||
490 | + while (refs--) { | ||
491 | + if (PageTail(tail)) | ||
492 | + get_huge_page_tail(tail); | ||
493 | + tail++; | ||
494 | } | ||
495 | |||
496 | return 1; | ||
497 | diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c | ||
498 | index c781bbc..95985f2 100644 | ||
499 | --- a/arch/powerpc/mm/mem.c | ||
500 | +++ b/arch/powerpc/mm/mem.c | ||
501 | @@ -123,7 +123,8 @@ int arch_add_memory(int nid, u64 start, u64 size) | ||
502 | pgdata = NODE_DATA(nid); | ||
503 | |||
504 | start = (unsigned long)__va(start); | ||
505 | - create_section_mapping(start, start + size); | ||
506 | + if (create_section_mapping(start, start + size)) | ||
507 | + return -EINVAL; | ||
508 | |||
509 | /* this should work for most non-highmem platforms */ | ||
510 | zone = pgdata->node_zones; | ||
511 | diff --git a/arch/powerpc/mm/mmu_context_hash64.c b/arch/powerpc/mm/mmu_context_hash64.c | ||
512 | index 3bafc3d..4ff587e 100644 | ||
513 | --- a/arch/powerpc/mm/mmu_context_hash64.c | ||
514 | +++ b/arch/powerpc/mm/mmu_context_hash64.c | ||
515 | @@ -136,8 +136,8 @@ int use_cop(unsigned long acop, struct mm_struct *mm) | ||
516 | if (!mm || !acop) | ||
517 | return -EINVAL; | ||
518 | |||
519 | - /* We need to make sure mm_users doesn't change */ | ||
520 | - down_read(&mm->mmap_sem); | ||
521 | + /* The page_table_lock ensures mm_users won't change under us */ | ||
522 | + spin_lock(&mm->page_table_lock); | ||
523 | spin_lock(mm->context.cop_lockp); | ||
524 | |||
525 | if (mm->context.cop_pid == COP_PID_NONE) { | ||
526 | @@ -164,7 +164,7 @@ int use_cop(unsigned long acop, struct mm_struct *mm) | ||
527 | |||
528 | out: | ||
529 | spin_unlock(mm->context.cop_lockp); | ||
530 | - up_read(&mm->mmap_sem); | ||
531 | + spin_unlock(&mm->page_table_lock); | ||
532 | |||
533 | return ret; | ||
534 | } | ||
535 | @@ -185,8 +185,8 @@ void drop_cop(unsigned long acop, struct mm_struct *mm) | ||
536 | if (WARN_ON_ONCE(!mm)) | ||
537 | return; | ||
538 | |||
539 | - /* We need to make sure mm_users doesn't change */ | ||
540 | - down_read(&mm->mmap_sem); | ||
541 | + /* The page_table_lock ensures mm_users won't change under us */ | ||
542 | + spin_lock(&mm->page_table_lock); | ||
543 | spin_lock(mm->context.cop_lockp); | ||
544 | |||
545 | mm->context.acop &= ~acop; | ||
546 | @@ -213,7 +213,7 @@ void drop_cop(unsigned long acop, struct mm_struct *mm) | ||
547 | } | ||
548 | |||
549 | spin_unlock(mm->context.cop_lockp); | ||
550 | - up_read(&mm->mmap_sem); | ||
551 | + spin_unlock(&mm->page_table_lock); | ||
552 | } | ||
553 | EXPORT_SYMBOL_GPL(drop_cop); | ||
554 | |||
555 | diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c | ||
556 | index 2164006..2c1ae7a 100644 | ||
557 | --- a/arch/powerpc/mm/numa.c | ||
558 | +++ b/arch/powerpc/mm/numa.c | ||
559 | @@ -1214,11 +1214,12 @@ int hot_add_node_scn_to_nid(unsigned long scn_addr) | ||
560 | break; | ||
561 | } | ||
562 | |||
563 | - of_node_put(memory); | ||
564 | if (nid >= 0) | ||
565 | break; | ||
566 | } | ||
567 | |||
568 | + of_node_put(memory); | ||
569 | + | ||
570 | return nid; | ||
571 | } | ||
572 | |||
573 | diff --git a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platforms/pseries/dlpar.c | ||
574 | index e9be25b..0f1b706 100644 | ||
575 | --- a/arch/powerpc/platforms/pseries/dlpar.c | ||
576 | +++ b/arch/powerpc/platforms/pseries/dlpar.c | ||
577 | @@ -112,6 +112,7 @@ void dlpar_free_cc_nodes(struct device_node *dn) | ||
578 | dlpar_free_one_cc_node(dn); | ||
579 | } | ||
580 | |||
581 | +#define COMPLETE 0 | ||
582 | #define NEXT_SIBLING 1 | ||
583 | #define NEXT_CHILD 2 | ||
584 | #define NEXT_PROPERTY 3 | ||
585 | @@ -158,6 +159,9 @@ struct device_node *dlpar_configure_connector(u32 drc_index) | ||
586 | spin_unlock(&rtas_data_buf_lock); | ||
587 | |||
588 | switch (rc) { | ||
589 | + case COMPLETE: | ||
590 | + break; | ||
591 | + | ||
592 | case NEXT_SIBLING: | ||
593 | dn = dlpar_parse_cc_node(ccwa); | ||
594 | if (!dn) | ||
595 | diff --git a/arch/powerpc/platforms/pseries/eeh.c b/arch/powerpc/platforms/pseries/eeh.c | ||
596 | index ada6e07..d42f37d 100644 | ||
597 | --- a/arch/powerpc/platforms/pseries/eeh.c | ||
598 | +++ b/arch/powerpc/platforms/pseries/eeh.c | ||
599 | @@ -1338,7 +1338,7 @@ static const struct file_operations proc_eeh_operations = { | ||
600 | static int __init eeh_init_proc(void) | ||
601 | { | ||
602 | if (machine_is(pseries)) | ||
603 | - proc_create("ppc64/eeh", 0, NULL, &proc_eeh_operations); | ||
604 | + proc_create("powerpc/eeh", 0, NULL, &proc_eeh_operations); | ||
605 | return 0; | ||
606 | } | ||
607 | __initcall(eeh_init_proc); | ||
608 | diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c | ||
609 | index ef86ad2..ae0e14b 100644 | ||
610 | --- a/arch/s390/kernel/ptrace.c | ||
611 | +++ b/arch/s390/kernel/ptrace.c | ||
612 | @@ -47,29 +47,31 @@ enum s390_regset { | ||
613 | |||
614 | void update_per_regs(struct task_struct *task) | ||
615 | { | ||
616 | - static const struct per_regs per_single_step = { | ||
617 | - .control = PER_EVENT_IFETCH, | ||
618 | - .start = 0, | ||
619 | - .end = PSW_ADDR_INSN, | ||
620 | - }; | ||
621 | struct pt_regs *regs = task_pt_regs(task); | ||
622 | struct thread_struct *thread = &task->thread; | ||
623 | - const struct per_regs *new; | ||
624 | - struct per_regs old; | ||
625 | + struct per_regs old, new; | ||
626 | |||
627 | - /* TIF_SINGLE_STEP overrides the user specified PER registers. */ | ||
628 | - new = test_tsk_thread_flag(task, TIF_SINGLE_STEP) ? | ||
629 | - &per_single_step : &thread->per_user; | ||
630 | + /* Copy user specified PER registers */ | ||
631 | + new.control = thread->per_user.control; | ||
632 | + new.start = thread->per_user.start; | ||
633 | + new.end = thread->per_user.end; | ||
634 | + | ||
635 | + /* merge TIF_SINGLE_STEP into user specified PER registers. */ | ||
636 | + if (test_tsk_thread_flag(task, TIF_SINGLE_STEP)) { | ||
637 | + new.control |= PER_EVENT_IFETCH; | ||
638 | + new.start = 0; | ||
639 | + new.end = PSW_ADDR_INSN; | ||
640 | + } | ||
641 | |||
642 | /* Take care of the PER enablement bit in the PSW. */ | ||
643 | - if (!(new->control & PER_EVENT_MASK)) { | ||
644 | + if (!(new.control & PER_EVENT_MASK)) { | ||
645 | regs->psw.mask &= ~PSW_MASK_PER; | ||
646 | return; | ||
647 | } | ||
648 | regs->psw.mask |= PSW_MASK_PER; | ||
649 | __ctl_store(old, 9, 11); | ||
650 | - if (memcmp(new, &old, sizeof(struct per_regs)) != 0) | ||
651 | - __ctl_load(*new, 9, 11); | ||
652 | + if (memcmp(&new, &old, sizeof(struct per_regs)) != 0) | ||
653 | + __ctl_load(new, 9, 11); | ||
654 | } | ||
655 | |||
656 | void user_enable_single_step(struct task_struct *task) | ||
657 | diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c | ||
658 | index dc2b580..0cba935 100644 | ||
659 | --- a/arch/s390/kvm/kvm-s390.c | ||
660 | +++ b/arch/s390/kvm/kvm-s390.c | ||
661 | @@ -312,11 +312,17 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) | ||
662 | struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, | ||
663 | unsigned int id) | ||
664 | { | ||
665 | - struct kvm_vcpu *vcpu = kzalloc(sizeof(struct kvm_vcpu), GFP_KERNEL); | ||
666 | - int rc = -ENOMEM; | ||
667 | + struct kvm_vcpu *vcpu; | ||
668 | + int rc = -EINVAL; | ||
669 | + | ||
670 | + if (id >= KVM_MAX_VCPUS) | ||
671 | + goto out; | ||
672 | + | ||
673 | + rc = -ENOMEM; | ||
674 | |||
675 | + vcpu = kzalloc(sizeof(struct kvm_vcpu), GFP_KERNEL); | ||
676 | if (!vcpu) | ||
677 | - goto out_nomem; | ||
678 | + goto out; | ||
679 | |||
680 | vcpu->arch.sie_block = (struct kvm_s390_sie_block *) | ||
681 | get_zeroed_page(GFP_KERNEL); | ||
682 | @@ -352,7 +358,7 @@ out_free_sie_block: | ||
683 | free_page((unsigned long)(vcpu->arch.sie_block)); | ||
684 | out_free_cpu: | ||
685 | kfree(vcpu); | ||
686 | -out_nomem: | ||
687 | +out: | ||
688 | return ERR_PTR(rc); | ||
689 | } | ||
690 | |||
691 | diff --git a/arch/s390/mm/gup.c b/arch/s390/mm/gup.c | ||
692 | index 45b405c..65cb06e 100644 | ||
693 | --- a/arch/s390/mm/gup.c | ||
694 | +++ b/arch/s390/mm/gup.c | ||
695 | @@ -52,7 +52,7 @@ static inline int gup_huge_pmd(pmd_t *pmdp, pmd_t pmd, unsigned long addr, | ||
696 | unsigned long end, int write, struct page **pages, int *nr) | ||
697 | { | ||
698 | unsigned long mask, result; | ||
699 | - struct page *head, *page; | ||
700 | + struct page *head, *page, *tail; | ||
701 | int refs; | ||
702 | |||
703 | result = write ? 0 : _SEGMENT_ENTRY_RO; | ||
704 | @@ -64,6 +64,7 @@ static inline int gup_huge_pmd(pmd_t *pmdp, pmd_t pmd, unsigned long addr, | ||
705 | refs = 0; | ||
706 | head = pmd_page(pmd); | ||
707 | page = head + ((addr & ~PMD_MASK) >> PAGE_SHIFT); | ||
708 | + tail = page; | ||
709 | do { | ||
710 | VM_BUG_ON(compound_head(page) != head); | ||
711 | pages[*nr] = page; | ||
712 | @@ -81,6 +82,17 @@ static inline int gup_huge_pmd(pmd_t *pmdp, pmd_t pmd, unsigned long addr, | ||
713 | *nr -= refs; | ||
714 | while (refs--) | ||
715 | put_page(head); | ||
716 | + return 0; | ||
717 | + } | ||
718 | + | ||
719 | + /* | ||
720 | + * Any tail page need their mapcount reference taken before we | ||
721 | + * return. | ||
722 | + */ | ||
723 | + while (refs--) { | ||
724 | + if (PageTail(tail)) | ||
725 | + get_huge_page_tail(tail); | ||
726 | + tail++; | ||
727 | } | ||
728 | |||
729 | return 1; | ||
730 | diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c | ||
731 | index 5d56c2b..529a088 100644 | ||
732 | --- a/arch/s390/mm/pgtable.c | ||
733 | +++ b/arch/s390/mm/pgtable.c | ||
734 | @@ -662,8 +662,9 @@ void page_table_free_rcu(struct mmu_gather *tlb, unsigned long *table) | ||
735 | |||
736 | void __tlb_remove_table(void *_table) | ||
737 | { | ||
738 | - void *table = (void *)((unsigned long) _table & PAGE_MASK); | ||
739 | - unsigned type = (unsigned long) _table & ~PAGE_MASK; | ||
740 | + const unsigned long mask = (FRAG_MASK << 4) | FRAG_MASK; | ||
741 | + void *table = (void *)((unsigned long) _table & ~mask); | ||
742 | + unsigned type = (unsigned long) _table & mask; | ||
743 | |||
744 | if (type) | ||
745 | __page_table_free_rcu(table, type); | ||
746 | diff --git a/arch/sparc/mm/gup.c b/arch/sparc/mm/gup.c | ||
747 | index a986b5d..42c55df 100644 | ||
748 | --- a/arch/sparc/mm/gup.c | ||
749 | +++ b/arch/sparc/mm/gup.c | ||
750 | @@ -56,6 +56,8 @@ static noinline int gup_pte_range(pmd_t pmd, unsigned long addr, | ||
751 | put_page(head); | ||
752 | return 0; | ||
753 | } | ||
754 | + if (head != page) | ||
755 | + get_huge_page_tail(page); | ||
756 | |||
757 | pages[*nr] = page; | ||
758 | (*nr)++; | ||
759 | diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c | ||
760 | index 620f5b7..0491e40 100644 | ||
761 | --- a/arch/um/drivers/ubd_kern.c | ||
762 | +++ b/arch/um/drivers/ubd_kern.c | ||
763 | @@ -513,8 +513,37 @@ __uml_exitcall(kill_io_thread); | ||
764 | static inline int ubd_file_size(struct ubd *ubd_dev, __u64 *size_out) | ||
765 | { | ||
766 | char *file; | ||
767 | + int fd; | ||
768 | + int err; | ||
769 | + | ||
770 | + __u32 version; | ||
771 | + __u32 align; | ||
772 | + char *backing_file; | ||
773 | + time_t mtime; | ||
774 | + unsigned long long size; | ||
775 | + int sector_size; | ||
776 | + int bitmap_offset; | ||
777 | + | ||
778 | + if (ubd_dev->file && ubd_dev->cow.file) { | ||
779 | + file = ubd_dev->cow.file; | ||
780 | + | ||
781 | + goto out; | ||
782 | + } | ||
783 | |||
784 | - file = ubd_dev->cow.file ? ubd_dev->cow.file : ubd_dev->file; | ||
785 | + fd = os_open_file(ubd_dev->file, global_openflags, 0); | ||
786 | + if (fd < 0) | ||
787 | + return fd; | ||
788 | + | ||
789 | + err = read_cow_header(file_reader, &fd, &version, &backing_file, \ | ||
790 | + &mtime, &size, §or_size, &align, &bitmap_offset); | ||
791 | + os_close_file(fd); | ||
792 | + | ||
793 | + if(err == -EINVAL) | ||
794 | + file = ubd_dev->file; | ||
795 | + else | ||
796 | + file = backing_file; | ||
797 | + | ||
798 | +out: | ||
799 | return os_file_size(file, size_out); | ||
800 | } | ||
801 | |||
802 | diff --git a/arch/um/sys-x86_64/vdso/vma.c b/arch/um/sys-x86_64/vdso/vma.c | ||
803 | index 9495c8d..91f4ec9 100644 | ||
804 | --- a/arch/um/sys-x86_64/vdso/vma.c | ||
805 | +++ b/arch/um/sys-x86_64/vdso/vma.c | ||
806 | @@ -28,7 +28,7 @@ static int __init init_vdso(void) | ||
807 | |||
808 | um_vdso_addr = task_size - PAGE_SIZE; | ||
809 | |||
810 | - vdsop = kmalloc(GFP_KERNEL, sizeof(struct page *)); | ||
811 | + vdsop = kmalloc(sizeof(struct page *), GFP_KERNEL); | ||
812 | if (!vdsop) | ||
813 | goto oom; | ||
814 | |||
815 | diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h | ||
816 | index 7b3ca83..9b7273c 100644 | ||
817 | --- a/arch/x86/include/asm/apic.h | ||
818 | +++ b/arch/x86/include/asm/apic.h | ||
819 | @@ -495,7 +495,7 @@ static inline void default_wait_for_init_deassert(atomic_t *deassert) | ||
820 | return; | ||
821 | } | ||
822 | |||
823 | -extern struct apic *generic_bigsmp_probe(void); | ||
824 | +extern void generic_bigsmp_probe(void); | ||
825 | |||
826 | |||
827 | #ifdef CONFIG_X86_LOCAL_APIC | ||
828 | diff --git a/arch/x86/include/asm/uv/uv_bau.h b/arch/x86/include/asm/uv/uv_bau.h | ||
829 | index 37d3698..0c767a8 100644 | ||
830 | --- a/arch/x86/include/asm/uv/uv_bau.h | ||
831 | +++ b/arch/x86/include/asm/uv/uv_bau.h | ||
832 | @@ -55,6 +55,7 @@ | ||
833 | #define UV_BAU_TUNABLES_DIR "sgi_uv" | ||
834 | #define UV_BAU_TUNABLES_FILE "bau_tunables" | ||
835 | #define WHITESPACE " \t\n" | ||
836 | +#define uv_mmask ((1UL << uv_hub_info->m_val) - 1) | ||
837 | #define uv_physnodeaddr(x) ((__pa((unsigned long)(x)) & uv_mmask)) | ||
838 | #define cpubit_isset(cpu, bau_local_cpumask) \ | ||
839 | test_bit((cpu), (bau_local_cpumask).bits) | ||
840 | diff --git a/arch/x86/include/asm/uv/uv_hub.h b/arch/x86/include/asm/uv/uv_hub.h | ||
841 | index f26544a..54a13aa 100644 | ||
842 | --- a/arch/x86/include/asm/uv/uv_hub.h | ||
843 | +++ b/arch/x86/include/asm/uv/uv_hub.h | ||
844 | @@ -46,6 +46,13 @@ | ||
845 | * PNODE - the low N bits of the GNODE. The PNODE is the most useful variant | ||
846 | * of the nasid for socket usage. | ||
847 | * | ||
848 | + * GPA - (global physical address) a socket physical address converted | ||
849 | + * so that it can be used by the GRU as a global address. Socket | ||
850 | + * physical addresses 1) need additional NASID (node) bits added | ||
851 | + * to the high end of the address, and 2) unaliased if the | ||
852 | + * partition does not have a physical address 0. In addition, on | ||
853 | + * UV2 rev 1, GPAs need the gnode left shifted to bits 39 or 40. | ||
854 | + * | ||
855 | * | ||
856 | * NumaLink Global Physical Address Format: | ||
857 | * +--------------------------------+---------------------+ | ||
858 | @@ -141,6 +148,8 @@ struct uv_hub_info_s { | ||
859 | unsigned int gnode_extra; | ||
860 | unsigned char hub_revision; | ||
861 | unsigned char apic_pnode_shift; | ||
862 | + unsigned char m_shift; | ||
863 | + unsigned char n_lshift; | ||
864 | unsigned long gnode_upper; | ||
865 | unsigned long lowmem_remap_top; | ||
866 | unsigned long lowmem_remap_base; | ||
867 | @@ -177,6 +186,16 @@ static inline int is_uv2_hub(void) | ||
868 | return uv_hub_info->hub_revision >= UV2_HUB_REVISION_BASE; | ||
869 | } | ||
870 | |||
871 | +static inline int is_uv2_1_hub(void) | ||
872 | +{ | ||
873 | + return uv_hub_info->hub_revision == UV2_HUB_REVISION_BASE; | ||
874 | +} | ||
875 | + | ||
876 | +static inline int is_uv2_2_hub(void) | ||
877 | +{ | ||
878 | + return uv_hub_info->hub_revision == UV2_HUB_REVISION_BASE + 1; | ||
879 | +} | ||
880 | + | ||
881 | union uvh_apicid { | ||
882 | unsigned long v; | ||
883 | struct uvh_apicid_s { | ||
884 | @@ -276,7 +295,10 @@ static inline unsigned long uv_soc_phys_ram_to_gpa(unsigned long paddr) | ||
885 | { | ||
886 | if (paddr < uv_hub_info->lowmem_remap_top) | ||
887 | paddr |= uv_hub_info->lowmem_remap_base; | ||
888 | - return paddr | uv_hub_info->gnode_upper; | ||
889 | + paddr |= uv_hub_info->gnode_upper; | ||
890 | + paddr = ((paddr << uv_hub_info->m_shift) >> uv_hub_info->m_shift) | | ||
891 | + ((paddr >> uv_hub_info->m_val) << uv_hub_info->n_lshift); | ||
892 | + return paddr; | ||
893 | } | ||
894 | |||
895 | |||
896 | @@ -300,16 +322,19 @@ static inline unsigned long uv_gpa_to_soc_phys_ram(unsigned long gpa) | ||
897 | unsigned long remap_base = uv_hub_info->lowmem_remap_base; | ||
898 | unsigned long remap_top = uv_hub_info->lowmem_remap_top; | ||
899 | |||
900 | + gpa = ((gpa << uv_hub_info->m_shift) >> uv_hub_info->m_shift) | | ||
901 | + ((gpa >> uv_hub_info->n_lshift) << uv_hub_info->m_val); | ||
902 | + gpa = gpa & uv_hub_info->gpa_mask; | ||
903 | if (paddr >= remap_base && paddr < remap_base + remap_top) | ||
904 | paddr -= remap_base; | ||
905 | return paddr; | ||
906 | } | ||
907 | |||
908 | |||
909 | -/* gnode -> pnode */ | ||
910 | +/* gpa -> pnode */ | ||
911 | static inline unsigned long uv_gpa_to_gnode(unsigned long gpa) | ||
912 | { | ||
913 | - return gpa >> uv_hub_info->m_val; | ||
914 | + return gpa >> uv_hub_info->n_lshift; | ||
915 | } | ||
916 | |||
917 | /* gpa -> pnode */ | ||
918 | @@ -320,6 +345,12 @@ static inline int uv_gpa_to_pnode(unsigned long gpa) | ||
919 | return uv_gpa_to_gnode(gpa) & n_mask; | ||
920 | } | ||
921 | |||
922 | +/* gpa -> node offset*/ | ||
923 | +static inline unsigned long uv_gpa_to_offset(unsigned long gpa) | ||
924 | +{ | ||
925 | + return (gpa << uv_hub_info->m_shift) >> uv_hub_info->m_shift; | ||
926 | +} | ||
927 | + | ||
928 | /* pnode, offset --> socket virtual */ | ||
929 | static inline void *uv_pnode_offset_to_vaddr(int pnode, unsigned long offset) | ||
930 | { | ||
931 | diff --git a/arch/x86/kernel/apic/bigsmp_32.c b/arch/x86/kernel/apic/bigsmp_32.c | ||
932 | index efd737e..521bead 100644 | ||
933 | --- a/arch/x86/kernel/apic/bigsmp_32.c | ||
934 | +++ b/arch/x86/kernel/apic/bigsmp_32.c | ||
935 | @@ -255,12 +255,24 @@ static struct apic apic_bigsmp = { | ||
936 | .x86_32_early_logical_apicid = bigsmp_early_logical_apicid, | ||
937 | }; | ||
938 | |||
939 | -struct apic * __init generic_bigsmp_probe(void) | ||
940 | +void __init generic_bigsmp_probe(void) | ||
941 | { | ||
942 | - if (probe_bigsmp()) | ||
943 | - return &apic_bigsmp; | ||
944 | + unsigned int cpu; | ||
945 | |||
946 | - return NULL; | ||
947 | + if (!probe_bigsmp()) | ||
948 | + return; | ||
949 | + | ||
950 | + apic = &apic_bigsmp; | ||
951 | + | ||
952 | + for_each_possible_cpu(cpu) { | ||
953 | + if (early_per_cpu(x86_cpu_to_logical_apicid, | ||
954 | + cpu) == BAD_APICID) | ||
955 | + continue; | ||
956 | + early_per_cpu(x86_cpu_to_logical_apicid, cpu) = | ||
957 | + bigsmp_early_logical_apicid(cpu); | ||
958 | + } | ||
959 | + | ||
960 | + pr_info("Overriding APIC driver with %s\n", apic_bigsmp.name); | ||
961 | } | ||
962 | |||
963 | apic_driver(apic_bigsmp); | ||
964 | diff --git a/arch/x86/kernel/apic/probe_32.c b/arch/x86/kernel/apic/probe_32.c | ||
965 | index b5254ad..0787bb3 100644 | ||
966 | --- a/arch/x86/kernel/apic/probe_32.c | ||
967 | +++ b/arch/x86/kernel/apic/probe_32.c | ||
968 | @@ -200,14 +200,8 @@ void __init default_setup_apic_routing(void) | ||
969 | * - we find more than 8 CPUs in acpi LAPIC listing with xAPIC support | ||
970 | */ | ||
971 | |||
972 | - if (!cmdline_apic && apic == &apic_default) { | ||
973 | - struct apic *bigsmp = generic_bigsmp_probe(); | ||
974 | - if (bigsmp) { | ||
975 | - apic = bigsmp; | ||
976 | - printk(KERN_INFO "Overriding APIC driver with %s\n", | ||
977 | - apic->name); | ||
978 | - } | ||
979 | - } | ||
980 | + if (!cmdline_apic && apic == &apic_default) | ||
981 | + generic_bigsmp_probe(); | ||
982 | #endif | ||
983 | |||
984 | if (apic->setup_apic_routing) | ||
985 | diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c | ||
986 | index 34b1859..cfeb978 100644 | ||
987 | --- a/arch/x86/kernel/apic/x2apic_uv_x.c | ||
988 | +++ b/arch/x86/kernel/apic/x2apic_uv_x.c | ||
989 | @@ -832,6 +832,10 @@ void __init uv_system_init(void) | ||
990 | uv_cpu_hub_info(cpu)->apic_pnode_shift = uvh_apicid.s.pnode_shift; | ||
991 | uv_cpu_hub_info(cpu)->hub_revision = uv_hub_info->hub_revision; | ||
992 | |||
993 | + uv_cpu_hub_info(cpu)->m_shift = 64 - m_val; | ||
994 | + uv_cpu_hub_info(cpu)->n_lshift = is_uv2_1_hub() ? | ||
995 | + (m_val == 40 ? 40 : 39) : m_val; | ||
996 | + | ||
997 | pnode = uv_apicid_to_pnode(apicid); | ||
998 | blade = boot_pnode_to_blade(pnode); | ||
999 | lcpu = uv_blade_info[blade].nr_possible_cpus; | ||
1000 | @@ -862,8 +866,7 @@ void __init uv_system_init(void) | ||
1001 | if (uv_node_to_blade[nid] >= 0) | ||
1002 | continue; | ||
1003 | paddr = node_start_pfn(nid) << PAGE_SHIFT; | ||
1004 | - paddr = uv_soc_phys_ram_to_gpa(paddr); | ||
1005 | - pnode = (paddr >> m_val) & pnode_mask; | ||
1006 | + pnode = uv_gpa_to_pnode(uv_soc_phys_ram_to_gpa(paddr)); | ||
1007 | blade = boot_pnode_to_blade(pnode); | ||
1008 | uv_node_to_blade[nid] = blade; | ||
1009 | } | ||
1010 | diff --git a/arch/x86/kernel/kprobes.c b/arch/x86/kernel/kprobes.c | ||
1011 | index f1a6244..794bc95 100644 | ||
1012 | --- a/arch/x86/kernel/kprobes.c | ||
1013 | +++ b/arch/x86/kernel/kprobes.c | ||
1014 | @@ -75,8 +75,10 @@ DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk); | ||
1015 | /* | ||
1016 | * Undefined/reserved opcodes, conditional jump, Opcode Extension | ||
1017 | * Groups, and some special opcodes can not boost. | ||
1018 | + * This is non-const to keep gcc from statically optimizing it out, as | ||
1019 | + * variable_test_bit makes gcc think only *(unsigned long*) is used. | ||
1020 | */ | ||
1021 | -static const u32 twobyte_is_boostable[256 / 32] = { | ||
1022 | +static u32 twobyte_is_boostable[256 / 32] = { | ||
1023 | /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ | ||
1024 | /* ---------------------------------------------- */ | ||
1025 | W(0x00, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0) | /* 00 */ | ||
1026 | diff --git a/arch/x86/mm/gup.c b/arch/x86/mm/gup.c | ||
1027 | index dbe34b9..ea30585 100644 | ||
1028 | --- a/arch/x86/mm/gup.c | ||
1029 | +++ b/arch/x86/mm/gup.c | ||
1030 | @@ -108,16 +108,6 @@ static inline void get_head_page_multiple(struct page *page, int nr) | ||
1031 | SetPageReferenced(page); | ||
1032 | } | ||
1033 | |||
1034 | -static inline void get_huge_page_tail(struct page *page) | ||
1035 | -{ | ||
1036 | - /* | ||
1037 | - * __split_huge_page_refcount() cannot run | ||
1038 | - * from under us. | ||
1039 | - */ | ||
1040 | - VM_BUG_ON(atomic_read(&page->_count) < 0); | ||
1041 | - atomic_inc(&page->_count); | ||
1042 | -} | ||
1043 | - | ||
1044 | static noinline int gup_huge_pmd(pmd_t pmd, unsigned long addr, | ||
1045 | unsigned long end, int write, struct page **pages, int *nr) | ||
1046 | { | ||
1047 | diff --git a/arch/x86/platform/uv/tlb_uv.c b/arch/x86/platform/uv/tlb_uv.c | ||
1048 | index db8b915..5b55219 100644 | ||
1049 | --- a/arch/x86/platform/uv/tlb_uv.c | ||
1050 | +++ b/arch/x86/platform/uv/tlb_uv.c | ||
1051 | @@ -115,9 +115,6 @@ early_param("nobau", setup_nobau); | ||
1052 | |||
1053 | /* base pnode in this partition */ | ||
1054 | static int uv_base_pnode __read_mostly; | ||
1055 | -/* position of pnode (which is nasid>>1): */ | ||
1056 | -static int uv_nshift __read_mostly; | ||
1057 | -static unsigned long uv_mmask __read_mostly; | ||
1058 | |||
1059 | static DEFINE_PER_CPU(struct ptc_stats, ptcstats); | ||
1060 | static DEFINE_PER_CPU(struct bau_control, bau_control); | ||
1061 | @@ -1435,7 +1432,7 @@ static void activation_descriptor_init(int node, int pnode, int base_pnode) | ||
1062 | { | ||
1063 | int i; | ||
1064 | int cpu; | ||
1065 | - unsigned long pa; | ||
1066 | + unsigned long gpa; | ||
1067 | unsigned long m; | ||
1068 | unsigned long n; | ||
1069 | size_t dsize; | ||
1070 | @@ -1451,9 +1448,9 @@ static void activation_descriptor_init(int node, int pnode, int base_pnode) | ||
1071 | bau_desc = kmalloc_node(dsize, GFP_KERNEL, node); | ||
1072 | BUG_ON(!bau_desc); | ||
1073 | |||
1074 | - pa = uv_gpa(bau_desc); /* need the real nasid*/ | ||
1075 | - n = pa >> uv_nshift; | ||
1076 | - m = pa & uv_mmask; | ||
1077 | + gpa = uv_gpa(bau_desc); | ||
1078 | + n = uv_gpa_to_gnode(gpa); | ||
1079 | + m = uv_gpa_to_offset(gpa); | ||
1080 | |||
1081 | /* the 14-bit pnode */ | ||
1082 | write_mmr_descriptor_base(pnode, (n << UV_DESC_PSHIFT | m)); | ||
1083 | @@ -1525,9 +1522,9 @@ static void pq_init(int node, int pnode) | ||
1084 | bcp->queue_last = pqp + (DEST_Q_SIZE - 1); | ||
1085 | } | ||
1086 | /* | ||
1087 | - * need the pnode of where the memory was really allocated | ||
1088 | + * need the gnode of where the memory was really allocated | ||
1089 | */ | ||
1090 | - pn = uv_gpa(pqp) >> uv_nshift; | ||
1091 | + pn = uv_gpa_to_gnode(uv_gpa(pqp)); | ||
1092 | first = uv_physnodeaddr(pqp); | ||
1093 | pn_first = ((unsigned long)pn << UV_PAYLOADQ_PNODE_SHIFT) | first; | ||
1094 | last = uv_physnodeaddr(pqp + (DEST_Q_SIZE - 1)); | ||
1095 | @@ -1837,8 +1834,6 @@ static int __init uv_bau_init(void) | ||
1096 | zalloc_cpumask_var_node(mask, GFP_KERNEL, cpu_to_node(cur_cpu)); | ||
1097 | } | ||
1098 | |||
1099 | - uv_nshift = uv_hub_info->m_val; | ||
1100 | - uv_mmask = (1UL << uv_hub_info->m_val) - 1; | ||
1101 | nuvhubs = uv_num_possible_blades(); | ||
1102 | spin_lock_init(&disable_lock); | ||
1103 | congested_cycles = usec_2_cycles(congested_respns_us); | ||
1104 | diff --git a/block/blk-core.c b/block/blk-core.c | ||
1105 | index d34433a..795154e 100644 | ||
1106 | --- a/block/blk-core.c | ||
1107 | +++ b/block/blk-core.c | ||
1108 | @@ -1725,6 +1725,8 @@ int blk_insert_cloned_request(struct request_queue *q, struct request *rq) | ||
1109 | where = ELEVATOR_INSERT_FLUSH; | ||
1110 | |||
1111 | add_acct_request(q, rq, where); | ||
1112 | + if (where == ELEVATOR_INSERT_FLUSH) | ||
1113 | + __blk_run_queue(q); | ||
1114 | spin_unlock_irqrestore(q->queue_lock, flags); | ||
1115 | |||
1116 | return 0; | ||
1117 | diff --git a/block/blk-flush.c b/block/blk-flush.c | ||
1118 | index 491eb30..720ad60 100644 | ||
1119 | --- a/block/blk-flush.c | ||
1120 | +++ b/block/blk-flush.c | ||
1121 | @@ -320,7 +320,7 @@ void blk_insert_flush(struct request *rq) | ||
1122 | return; | ||
1123 | } | ||
1124 | |||
1125 | - BUG_ON(!rq->bio || rq->bio != rq->biotail); | ||
1126 | + BUG_ON(rq->bio != rq->biotail); /*assumes zero or single bio rq */ | ||
1127 | |||
1128 | /* | ||
1129 | * If there's data but flush is not necessary, the request can be | ||
1130 | @@ -330,7 +330,6 @@ void blk_insert_flush(struct request *rq) | ||
1131 | if ((policy & REQ_FSEQ_DATA) && | ||
1132 | !(policy & (REQ_FSEQ_PREFLUSH | REQ_FSEQ_POSTFLUSH))) { | ||
1133 | list_add_tail(&rq->queuelist, &q->queue_head); | ||
1134 | - blk_run_queue_async(q); | ||
1135 | return; | ||
1136 | } | ||
1137 | |||
1138 | diff --git a/block/genhd.c b/block/genhd.c | ||
1139 | index e2f6790..d261b73 100644 | ||
1140 | --- a/block/genhd.c | ||
1141 | +++ b/block/genhd.c | ||
1142 | @@ -611,6 +611,12 @@ void add_disk(struct gendisk *disk) | ||
1143 | register_disk(disk); | ||
1144 | blk_register_queue(disk); | ||
1145 | |||
1146 | + /* | ||
1147 | + * Take an extra ref on queue which will be put on disk_release() | ||
1148 | + * so that it sticks around as long as @disk is there. | ||
1149 | + */ | ||
1150 | + WARN_ON_ONCE(blk_get_queue(disk->queue)); | ||
1151 | + | ||
1152 | retval = sysfs_create_link(&disk_to_dev(disk)->kobj, &bdi->dev->kobj, | ||
1153 | "bdi"); | ||
1154 | WARN_ON(retval); | ||
1155 | @@ -1095,6 +1101,8 @@ static void disk_release(struct device *dev) | ||
1156 | disk_replace_part_tbl(disk, NULL); | ||
1157 | free_part_stats(&disk->part0); | ||
1158 | free_part_info(&disk->part0); | ||
1159 | + if (disk->queue) | ||
1160 | + blk_put_queue(disk->queue); | ||
1161 | kfree(disk); | ||
1162 | } | ||
1163 | struct class block_class = { | ||
1164 | diff --git a/crypto/cryptd.c b/crypto/cryptd.c | ||
1165 | index e46d21a..671d4d6 100644 | ||
1166 | --- a/crypto/cryptd.c | ||
1167 | +++ b/crypto/cryptd.c | ||
1168 | @@ -945,7 +945,7 @@ static void __exit cryptd_exit(void) | ||
1169 | crypto_unregister_template(&cryptd_tmpl); | ||
1170 | } | ||
1171 | |||
1172 | -module_init(cryptd_init); | ||
1173 | +subsys_initcall(cryptd_init); | ||
1174 | module_exit(cryptd_exit); | ||
1175 | |||
1176 | MODULE_LICENSE("GPL"); | ||
1177 | diff --git a/drivers/acpi/atomicio.c b/drivers/acpi/atomicio.c | ||
1178 | index 7489b89..f151afe 100644 | ||
1179 | --- a/drivers/acpi/atomicio.c | ||
1180 | +++ b/drivers/acpi/atomicio.c | ||
1181 | @@ -76,7 +76,7 @@ static void __iomem *__acpi_ioremap_fast(phys_addr_t paddr, | ||
1182 | { | ||
1183 | struct acpi_iomap *map; | ||
1184 | |||
1185 | - map = __acpi_find_iomap(paddr, size); | ||
1186 | + map = __acpi_find_iomap(paddr, size/8); | ||
1187 | if (map) | ||
1188 | return map->vaddr + (paddr - map->paddr); | ||
1189 | else | ||
1190 | diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c | ||
1191 | index 43107e9..cc431d6 100644 | ||
1192 | --- a/drivers/ata/ata_piix.c | ||
1193 | +++ b/drivers/ata/ata_piix.c | ||
1194 | @@ -113,6 +113,8 @@ enum { | ||
1195 | PIIX_PATA_FLAGS = ATA_FLAG_SLAVE_POSS, | ||
1196 | PIIX_SATA_FLAGS = ATA_FLAG_SATA | PIIX_FLAG_CHECKINTR, | ||
1197 | |||
1198 | + PIIX_FLAG_PIO16 = (1 << 30), /*support 16bit PIO only*/ | ||
1199 | + | ||
1200 | PIIX_80C_PRI = (1 << 5) | (1 << 4), | ||
1201 | PIIX_80C_SEC = (1 << 7) | (1 << 6), | ||
1202 | |||
1203 | @@ -147,6 +149,7 @@ enum piix_controller_ids { | ||
1204 | ich8m_apple_sata, /* locks up on second port enable */ | ||
1205 | tolapai_sata, | ||
1206 | piix_pata_vmw, /* PIIX4 for VMware, spurious DMA_ERR */ | ||
1207 | + ich8_sata_snb, | ||
1208 | }; | ||
1209 | |||
1210 | struct piix_map_db { | ||
1211 | @@ -177,6 +180,7 @@ static int piix_sidpr_scr_write(struct ata_link *link, | ||
1212 | static int piix_sidpr_set_lpm(struct ata_link *link, enum ata_lpm_policy policy, | ||
1213 | unsigned hints); | ||
1214 | static bool piix_irq_check(struct ata_port *ap); | ||
1215 | +static int piix_port_start(struct ata_port *ap); | ||
1216 | #ifdef CONFIG_PM | ||
1217 | static int piix_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg); | ||
1218 | static int piix_pci_device_resume(struct pci_dev *pdev); | ||
1219 | @@ -298,21 +302,21 @@ static const struct pci_device_id piix_pci_tbl[] = { | ||
1220 | /* SATA Controller IDE (PCH) */ | ||
1221 | { 0x8086, 0x3b2e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | ||
1222 | /* SATA Controller IDE (CPT) */ | ||
1223 | - { 0x8086, 0x1c00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | ||
1224 | + { 0x8086, 0x1c00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, | ||
1225 | /* SATA Controller IDE (CPT) */ | ||
1226 | - { 0x8086, 0x1c01, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | ||
1227 | + { 0x8086, 0x1c01, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, | ||
1228 | /* SATA Controller IDE (CPT) */ | ||
1229 | { 0x8086, 0x1c08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | ||
1230 | /* SATA Controller IDE (CPT) */ | ||
1231 | { 0x8086, 0x1c09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | ||
1232 | /* SATA Controller IDE (PBG) */ | ||
1233 | - { 0x8086, 0x1d00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | ||
1234 | + { 0x8086, 0x1d00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, | ||
1235 | /* SATA Controller IDE (PBG) */ | ||
1236 | { 0x8086, 0x1d08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | ||
1237 | /* SATA Controller IDE (Panther Point) */ | ||
1238 | - { 0x8086, 0x1e00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | ||
1239 | + { 0x8086, 0x1e00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, | ||
1240 | /* SATA Controller IDE (Panther Point) */ | ||
1241 | - { 0x8086, 0x1e01, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | ||
1242 | + { 0x8086, 0x1e01, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, | ||
1243 | /* SATA Controller IDE (Panther Point) */ | ||
1244 | { 0x8086, 0x1e08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | ||
1245 | /* SATA Controller IDE (Panther Point) */ | ||
1246 | @@ -338,6 +342,7 @@ static struct scsi_host_template piix_sht = { | ||
1247 | static struct ata_port_operations piix_sata_ops = { | ||
1248 | .inherits = &ata_bmdma32_port_ops, | ||
1249 | .sff_irq_check = piix_irq_check, | ||
1250 | + .port_start = piix_port_start, | ||
1251 | }; | ||
1252 | |||
1253 | static struct ata_port_operations piix_pata_ops = { | ||
1254 | @@ -478,6 +483,7 @@ static const struct piix_map_db *piix_map_db_table[] = { | ||
1255 | [ich8_2port_sata] = &ich8_2port_map_db, | ||
1256 | [ich8m_apple_sata] = &ich8m_apple_map_db, | ||
1257 | [tolapai_sata] = &tolapai_map_db, | ||
1258 | + [ich8_sata_snb] = &ich8_map_db, | ||
1259 | }; | ||
1260 | |||
1261 | static struct ata_port_info piix_port_info[] = { | ||
1262 | @@ -606,6 +612,19 @@ static struct ata_port_info piix_port_info[] = { | ||
1263 | .port_ops = &piix_vmw_ops, | ||
1264 | }, | ||
1265 | |||
1266 | + /* | ||
1267 | + * some Sandybridge chipsets have broken 32 mode up to now, | ||
1268 | + * see https://bugzilla.kernel.org/show_bug.cgi?id=40592 | ||
1269 | + */ | ||
1270 | + [ich8_sata_snb] = | ||
1271 | + { | ||
1272 | + .flags = PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR | PIIX_FLAG_PIO16, | ||
1273 | + .pio_mask = ATA_PIO4, | ||
1274 | + .mwdma_mask = ATA_MWDMA2, | ||
1275 | + .udma_mask = ATA_UDMA6, | ||
1276 | + .port_ops = &piix_sata_ops, | ||
1277 | + }, | ||
1278 | + | ||
1279 | }; | ||
1280 | |||
1281 | static struct pci_bits piix_enable_bits[] = { | ||
1282 | @@ -649,6 +668,14 @@ static const struct ich_laptop ich_laptop[] = { | ||
1283 | { 0, } | ||
1284 | }; | ||
1285 | |||
1286 | +static int piix_port_start(struct ata_port *ap) | ||
1287 | +{ | ||
1288 | + if (!(ap->flags & PIIX_FLAG_PIO16)) | ||
1289 | + ap->pflags |= ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32CHANGE; | ||
1290 | + | ||
1291 | + return ata_bmdma_port_start(ap); | ||
1292 | +} | ||
1293 | + | ||
1294 | /** | ||
1295 | * ich_pata_cable_detect - Probe host controller cable detect info | ||
1296 | * @ap: Port for which cable detect info is desired | ||
1297 | diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c | ||
1298 | index acb3f83..6a7f7b0 100644 | ||
1299 | --- a/drivers/base/power/runtime.c | ||
1300 | +++ b/drivers/base/power/runtime.c | ||
1301 | @@ -285,6 +285,9 @@ static int rpm_callback(int (*cb)(struct device *), struct device *dev) | ||
1302 | * If a deferred resume was requested while the callback was running then carry | ||
1303 | * it out; otherwise send an idle notification for the device (if the suspend | ||
1304 | * failed) or for its parent (if the suspend succeeded). | ||
1305 | + * If ->runtime_suspend failed with -EAGAIN or -EBUSY, and if the RPM_AUTO | ||
1306 | + * flag is set and the next autosuspend-delay expiration time is in the | ||
1307 | + * future, schedule another autosuspend attempt. | ||
1308 | * | ||
1309 | * This function must be called under dev->power.lock with interrupts disabled. | ||
1310 | */ | ||
1311 | @@ -396,10 +399,21 @@ static int rpm_suspend(struct device *dev, int rpmflags) | ||
1312 | if (retval) { | ||
1313 | __update_runtime_status(dev, RPM_ACTIVE); | ||
1314 | dev->power.deferred_resume = false; | ||
1315 | - if (retval == -EAGAIN || retval == -EBUSY) | ||
1316 | + if (retval == -EAGAIN || retval == -EBUSY) { | ||
1317 | dev->power.runtime_error = 0; | ||
1318 | - else | ||
1319 | + | ||
1320 | + /* | ||
1321 | + * If the callback routine failed an autosuspend, and | ||
1322 | + * if the last_busy time has been updated so that there | ||
1323 | + * is a new autosuspend expiration time, automatically | ||
1324 | + * reschedule another autosuspend. | ||
1325 | + */ | ||
1326 | + if ((rpmflags & RPM_AUTO) && | ||
1327 | + pm_runtime_autosuspend_expiration(dev) != 0) | ||
1328 | + goto repeat; | ||
1329 | + } else { | ||
1330 | pm_runtime_cancel_pending(dev); | ||
1331 | + } | ||
1332 | } else { | ||
1333 | no_callback: | ||
1334 | __update_runtime_status(dev, RPM_SUSPENDED); | ||
1335 | diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c | ||
1336 | index 8f4ef65..c2f9b3e 100644 | ||
1337 | --- a/drivers/block/cciss.c | ||
1338 | +++ b/drivers/block/cciss.c | ||
1339 | @@ -4533,6 +4533,13 @@ static int cciss_controller_hard_reset(struct pci_dev *pdev, | ||
1340 | pmcsr &= ~PCI_PM_CTRL_STATE_MASK; | ||
1341 | pmcsr |= PCI_D0; | ||
1342 | pci_write_config_word(pdev, pos + PCI_PM_CTRL, pmcsr); | ||
1343 | + | ||
1344 | + /* | ||
1345 | + * The P600 requires a small delay when changing states. | ||
1346 | + * Otherwise we may think the board did not reset and we bail. | ||
1347 | + * This for kdump only and is particular to the P600. | ||
1348 | + */ | ||
1349 | + msleep(500); | ||
1350 | } | ||
1351 | return 0; | ||
1352 | } | ||
1353 | diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c | ||
1354 | index 2330a9a..2f01073 100644 | ||
1355 | --- a/drivers/block/xen-blkback/blkback.c | ||
1356 | +++ b/drivers/block/xen-blkback/blkback.c | ||
1357 | @@ -685,7 +685,7 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif, | ||
1358 | |||
1359 | if (operation == READ) | ||
1360 | blkif->st_rd_sect += preq.nr_sects; | ||
1361 | - else if (operation == WRITE || operation == WRITE_FLUSH) | ||
1362 | + else if (operation & WRITE) | ||
1363 | blkif->st_wr_sect += preq.nr_sects; | ||
1364 | |||
1365 | return 0; | ||
1366 | diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c | ||
1367 | index 44fef5e..7c64db4 100644 | ||
1368 | --- a/drivers/gpu/drm/i915/intel_dp.c | ||
1369 | +++ b/drivers/gpu/drm/i915/intel_dp.c | ||
1370 | @@ -1683,6 +1683,31 @@ g4x_dp_detect(struct intel_dp *intel_dp) | ||
1371 | return intel_dp_detect_dpcd(intel_dp); | ||
1372 | } | ||
1373 | |||
1374 | +static struct edid * | ||
1375 | +intel_dp_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) | ||
1376 | +{ | ||
1377 | + struct intel_dp *intel_dp = intel_attached_dp(connector); | ||
1378 | + struct edid *edid; | ||
1379 | + | ||
1380 | + ironlake_edp_panel_vdd_on(intel_dp); | ||
1381 | + edid = drm_get_edid(connector, adapter); | ||
1382 | + ironlake_edp_panel_vdd_off(intel_dp); | ||
1383 | + return edid; | ||
1384 | +} | ||
1385 | + | ||
1386 | +static int | ||
1387 | +intel_dp_get_edid_modes(struct drm_connector *connector, struct i2c_adapter *adapter) | ||
1388 | +{ | ||
1389 | + struct intel_dp *intel_dp = intel_attached_dp(connector); | ||
1390 | + int ret; | ||
1391 | + | ||
1392 | + ironlake_edp_panel_vdd_on(intel_dp); | ||
1393 | + ret = intel_ddc_get_modes(connector, adapter); | ||
1394 | + ironlake_edp_panel_vdd_off(intel_dp); | ||
1395 | + return ret; | ||
1396 | +} | ||
1397 | + | ||
1398 | + | ||
1399 | /** | ||
1400 | * Uses CRT_HOTPLUG_EN and CRT_HOTPLUG_STAT to detect DP connection. | ||
1401 | * | ||
1402 | @@ -1715,7 +1740,7 @@ intel_dp_detect(struct drm_connector *connector, bool force) | ||
1403 | if (intel_dp->force_audio) { | ||
1404 | intel_dp->has_audio = intel_dp->force_audio > 0; | ||
1405 | } else { | ||
1406 | - edid = drm_get_edid(connector, &intel_dp->adapter); | ||
1407 | + edid = intel_dp_get_edid(connector, &intel_dp->adapter); | ||
1408 | if (edid) { | ||
1409 | intel_dp->has_audio = drm_detect_monitor_audio(edid); | ||
1410 | connector->display_info.raw_edid = NULL; | ||
1411 | @@ -1736,7 +1761,7 @@ static int intel_dp_get_modes(struct drm_connector *connector) | ||
1412 | /* We should parse the EDID data and find out if it has an audio sink | ||
1413 | */ | ||
1414 | |||
1415 | - ret = intel_ddc_get_modes(connector, &intel_dp->adapter); | ||
1416 | + ret = intel_dp_get_edid_modes(connector, &intel_dp->adapter); | ||
1417 | if (ret) { | ||
1418 | if (is_edp(intel_dp) && !dev_priv->panel_fixed_mode) { | ||
1419 | struct drm_display_mode *newmode; | ||
1420 | @@ -1772,7 +1797,7 @@ intel_dp_detect_audio(struct drm_connector *connector) | ||
1421 | struct edid *edid; | ||
1422 | bool has_audio = false; | ||
1423 | |||
1424 | - edid = drm_get_edid(connector, &intel_dp->adapter); | ||
1425 | + edid = intel_dp_get_edid(connector, &intel_dp->adapter); | ||
1426 | if (edid) { | ||
1427 | has_audio = drm_detect_monitor_audio(edid); | ||
1428 | |||
1429 | diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h | ||
1430 | index fe1099d..2480cfa 100644 | ||
1431 | --- a/drivers/gpu/drm/i915/intel_drv.h | ||
1432 | +++ b/drivers/gpu/drm/i915/intel_drv.h | ||
1433 | @@ -184,7 +184,7 @@ struct intel_crtc { | ||
1434 | #define DIP_VERSION_AVI 0x2 | ||
1435 | #define DIP_LEN_AVI 13 | ||
1436 | |||
1437 | -#define DIP_TYPE_SPD 0x3 | ||
1438 | +#define DIP_TYPE_SPD 0x83 | ||
1439 | #define DIP_VERSION_SPD 0x1 | ||
1440 | #define DIP_LEN_SPD 25 | ||
1441 | #define DIP_SPD_UNKNOWN 0 | ||
1442 | diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c | ||
1443 | index a9e0c7b..af08ff3 100644 | ||
1444 | --- a/drivers/gpu/drm/i915/intel_panel.c | ||
1445 | +++ b/drivers/gpu/drm/i915/intel_panel.c | ||
1446 | @@ -226,7 +226,7 @@ static void intel_pch_panel_set_backlight(struct drm_device *dev, u32 level) | ||
1447 | I915_WRITE(BLC_PWM_CPU_CTL, val | level); | ||
1448 | } | ||
1449 | |||
1450 | -void intel_panel_set_backlight(struct drm_device *dev, u32 level) | ||
1451 | +static void intel_panel_actually_set_backlight(struct drm_device *dev, u32 level) | ||
1452 | { | ||
1453 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1454 | u32 tmp; | ||
1455 | @@ -254,16 +254,21 @@ void intel_panel_set_backlight(struct drm_device *dev, u32 level) | ||
1456 | I915_WRITE(BLC_PWM_CTL, tmp | level); | ||
1457 | } | ||
1458 | |||
1459 | -void intel_panel_disable_backlight(struct drm_device *dev) | ||
1460 | +void intel_panel_set_backlight(struct drm_device *dev, u32 level) | ||
1461 | { | ||
1462 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1463 | |||
1464 | - if (dev_priv->backlight_enabled) { | ||
1465 | - dev_priv->backlight_level = intel_panel_get_backlight(dev); | ||
1466 | - dev_priv->backlight_enabled = false; | ||
1467 | - } | ||
1468 | + dev_priv->backlight_level = level; | ||
1469 | + if (dev_priv->backlight_enabled) | ||
1470 | + intel_panel_actually_set_backlight(dev, level); | ||
1471 | +} | ||
1472 | + | ||
1473 | +void intel_panel_disable_backlight(struct drm_device *dev) | ||
1474 | +{ | ||
1475 | + struct drm_i915_private *dev_priv = dev->dev_private; | ||
1476 | |||
1477 | - intel_panel_set_backlight(dev, 0); | ||
1478 | + dev_priv->backlight_enabled = false; | ||
1479 | + intel_panel_actually_set_backlight(dev, 0); | ||
1480 | } | ||
1481 | |||
1482 | void intel_panel_enable_backlight(struct drm_device *dev) | ||
1483 | @@ -273,8 +278,8 @@ void intel_panel_enable_backlight(struct drm_device *dev) | ||
1484 | if (dev_priv->backlight_level == 0) | ||
1485 | dev_priv->backlight_level = intel_panel_get_max_backlight(dev); | ||
1486 | |||
1487 | - intel_panel_set_backlight(dev, dev_priv->backlight_level); | ||
1488 | dev_priv->backlight_enabled = true; | ||
1489 | + intel_panel_actually_set_backlight(dev, dev_priv->backlight_level); | ||
1490 | } | ||
1491 | |||
1492 | static void intel_panel_init_backlight(struct drm_device *dev) | ||
1493 | diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c | ||
1494 | index 79e8ebc..b5628ce 100644 | ||
1495 | --- a/drivers/gpu/drm/radeon/atombios_dp.c | ||
1496 | +++ b/drivers/gpu/drm/radeon/atombios_dp.c | ||
1497 | @@ -553,6 +553,7 @@ static void radeon_dp_set_panel_mode(struct drm_encoder *encoder, | ||
1498 | { | ||
1499 | struct drm_device *dev = encoder->dev; | ||
1500 | struct radeon_device *rdev = dev->dev_private; | ||
1501 | + struct radeon_connector *radeon_connector = to_radeon_connector(connector); | ||
1502 | int panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE; | ||
1503 | |||
1504 | if (!ASIC_IS_DCE4(rdev)) | ||
1505 | @@ -560,10 +561,20 @@ static void radeon_dp_set_panel_mode(struct drm_encoder *encoder, | ||
1506 | |||
1507 | if (radeon_connector_encoder_is_dp_bridge(connector)) | ||
1508 | panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE; | ||
1509 | + else if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { | ||
1510 | + u8 tmp = radeon_read_dpcd_reg(radeon_connector, DP_EDP_CONFIGURATION_CAP); | ||
1511 | + if (tmp & 1) | ||
1512 | + panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE; | ||
1513 | + } | ||
1514 | |||
1515 | atombios_dig_encoder_setup(encoder, | ||
1516 | ATOM_ENCODER_CMD_SETUP_PANEL_MODE, | ||
1517 | panel_mode); | ||
1518 | + | ||
1519 | + if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) && | ||
1520 | + (panel_mode == DP_PANEL_MODE_INTERNAL_DP2_MODE)) { | ||
1521 | + radeon_write_dpcd_reg(radeon_connector, DP_EDP_CONFIGURATION_SET, 1); | ||
1522 | + } | ||
1523 | } | ||
1524 | |||
1525 | void radeon_dp_set_link_config(struct drm_connector *connector, | ||
1526 | diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c | ||
1527 | index c4ffa14f..fb0a00a 100644 | ||
1528 | --- a/drivers/gpu/drm/radeon/evergreen.c | ||
1529 | +++ b/drivers/gpu/drm/radeon/evergreen.c | ||
1530 | @@ -353,6 +353,7 @@ void evergreen_hpd_init(struct radeon_device *rdev) | ||
1531 | default: | ||
1532 | break; | ||
1533 | } | ||
1534 | + radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd); | ||
1535 | } | ||
1536 | if (rdev->irq.installed) | ||
1537 | evergreen_irq_set(rdev); | ||
1538 | diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c | ||
1539 | index 7fcdbbb..c9a0dae 100644 | ||
1540 | --- a/drivers/gpu/drm/radeon/r100.c | ||
1541 | +++ b/drivers/gpu/drm/radeon/r100.c | ||
1542 | @@ -434,6 +434,7 @@ void r100_hpd_init(struct radeon_device *rdev) | ||
1543 | default: | ||
1544 | break; | ||
1545 | } | ||
1546 | + radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd); | ||
1547 | } | ||
1548 | if (rdev->irq.installed) | ||
1549 | r100_irq_set(rdev); | ||
1550 | diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c | ||
1551 | index 720dd99..9b62a97 100644 | ||
1552 | --- a/drivers/gpu/drm/radeon/r600.c | ||
1553 | +++ b/drivers/gpu/drm/radeon/r600.c | ||
1554 | @@ -762,13 +762,14 @@ void r600_hpd_init(struct radeon_device *rdev) | ||
1555 | struct drm_device *dev = rdev->ddev; | ||
1556 | struct drm_connector *connector; | ||
1557 | |||
1558 | - if (ASIC_IS_DCE3(rdev)) { | ||
1559 | - u32 tmp = DC_HPDx_CONNECTION_TIMER(0x9c4) | DC_HPDx_RX_INT_TIMER(0xfa); | ||
1560 | - if (ASIC_IS_DCE32(rdev)) | ||
1561 | - tmp |= DC_HPDx_EN; | ||
1562 | + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | ||
1563 | + struct radeon_connector *radeon_connector = to_radeon_connector(connector); | ||
1564 | + | ||
1565 | + if (ASIC_IS_DCE3(rdev)) { | ||
1566 | + u32 tmp = DC_HPDx_CONNECTION_TIMER(0x9c4) | DC_HPDx_RX_INT_TIMER(0xfa); | ||
1567 | + if (ASIC_IS_DCE32(rdev)) | ||
1568 | + tmp |= DC_HPDx_EN; | ||
1569 | |||
1570 | - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | ||
1571 | - struct radeon_connector *radeon_connector = to_radeon_connector(connector); | ||
1572 | switch (radeon_connector->hpd.hpd) { | ||
1573 | case RADEON_HPD_1: | ||
1574 | WREG32(DC_HPD1_CONTROL, tmp); | ||
1575 | @@ -798,10 +799,7 @@ void r600_hpd_init(struct radeon_device *rdev) | ||
1576 | default: | ||
1577 | break; | ||
1578 | } | ||
1579 | - } | ||
1580 | - } else { | ||
1581 | - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | ||
1582 | - struct radeon_connector *radeon_connector = to_radeon_connector(connector); | ||
1583 | + } else { | ||
1584 | switch (radeon_connector->hpd.hpd) { | ||
1585 | case RADEON_HPD_1: | ||
1586 | WREG32(DC_HOT_PLUG_DETECT1_CONTROL, DC_HOT_PLUG_DETECTx_EN); | ||
1587 | @@ -819,6 +817,7 @@ void r600_hpd_init(struct radeon_device *rdev) | ||
1588 | break; | ||
1589 | } | ||
1590 | } | ||
1591 | + radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd); | ||
1592 | } | ||
1593 | if (rdev->irq.installed) | ||
1594 | r600_irq_set(rdev); | ||
1595 | diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h | ||
1596 | index c1e056b..184628c 100644 | ||
1597 | --- a/drivers/gpu/drm/radeon/radeon.h | ||
1598 | +++ b/drivers/gpu/drm/radeon/radeon.h | ||
1599 | @@ -93,6 +93,7 @@ extern int radeon_audio; | ||
1600 | extern int radeon_disp_priority; | ||
1601 | extern int radeon_hw_i2c; | ||
1602 | extern int radeon_pcie_gen2; | ||
1603 | +extern int radeon_msi; | ||
1604 | |||
1605 | /* | ||
1606 | * Copy from radeon_drv.h so we don't have to include both and have conflicting | ||
1607 | diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c | ||
1608 | index 6367524..8bf83c4 100644 | ||
1609 | --- a/drivers/gpu/drm/radeon/radeon_combios.c | ||
1610 | +++ b/drivers/gpu/drm/radeon/radeon_combios.c | ||
1611 | @@ -620,8 +620,8 @@ static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rde | ||
1612 | i2c.y_data_mask = 0x80; | ||
1613 | } else { | ||
1614 | /* default masks for ddc pads */ | ||
1615 | - i2c.mask_clk_mask = RADEON_GPIO_EN_1; | ||
1616 | - i2c.mask_data_mask = RADEON_GPIO_EN_0; | ||
1617 | + i2c.mask_clk_mask = RADEON_GPIO_MASK_1; | ||
1618 | + i2c.mask_data_mask = RADEON_GPIO_MASK_0; | ||
1619 | i2c.a_clk_mask = RADEON_GPIO_A_1; | ||
1620 | i2c.a_data_mask = RADEON_GPIO_A_0; | ||
1621 | i2c.en_clk_mask = RADEON_GPIO_EN_1; | ||
1622 | diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c | ||
1623 | index 449c3d8..ff6a2e0 100644 | ||
1624 | --- a/drivers/gpu/drm/radeon/radeon_connectors.c | ||
1625 | +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | ||
1626 | @@ -724,6 +724,7 @@ radeon_vga_detect(struct drm_connector *connector, bool force) | ||
1627 | dret = radeon_ddc_probe(radeon_connector, | ||
1628 | radeon_connector->requires_extended_probe); | ||
1629 | if (dret) { | ||
1630 | + radeon_connector->detected_by_load = false; | ||
1631 | if (radeon_connector->edid) { | ||
1632 | kfree(radeon_connector->edid); | ||
1633 | radeon_connector->edid = NULL; | ||
1634 | @@ -750,12 +751,21 @@ radeon_vga_detect(struct drm_connector *connector, bool force) | ||
1635 | } else { | ||
1636 | |||
1637 | /* if we aren't forcing don't do destructive polling */ | ||
1638 | - if (!force) | ||
1639 | - return connector->status; | ||
1640 | + if (!force) { | ||
1641 | + /* only return the previous status if we last | ||
1642 | + * detected a monitor via load. | ||
1643 | + */ | ||
1644 | + if (radeon_connector->detected_by_load) | ||
1645 | + return connector->status; | ||
1646 | + else | ||
1647 | + return ret; | ||
1648 | + } | ||
1649 | |||
1650 | if (radeon_connector->dac_load_detect && encoder) { | ||
1651 | encoder_funcs = encoder->helper_private; | ||
1652 | ret = encoder_funcs->detect(encoder, connector); | ||
1653 | + if (ret != connector_status_disconnected) | ||
1654 | + radeon_connector->detected_by_load = true; | ||
1655 | } | ||
1656 | } | ||
1657 | |||
1658 | @@ -897,6 +907,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) | ||
1659 | dret = radeon_ddc_probe(radeon_connector, | ||
1660 | radeon_connector->requires_extended_probe); | ||
1661 | if (dret) { | ||
1662 | + radeon_connector->detected_by_load = false; | ||
1663 | if (radeon_connector->edid) { | ||
1664 | kfree(radeon_connector->edid); | ||
1665 | radeon_connector->edid = NULL; | ||
1666 | @@ -959,8 +970,18 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) | ||
1667 | if ((ret == connector_status_connected) && (radeon_connector->use_digital == true)) | ||
1668 | goto out; | ||
1669 | |||
1670 | + /* DVI-D and HDMI-A are digital only */ | ||
1671 | + if ((connector->connector_type == DRM_MODE_CONNECTOR_DVID) || | ||
1672 | + (connector->connector_type == DRM_MODE_CONNECTOR_HDMIA)) | ||
1673 | + goto out; | ||
1674 | + | ||
1675 | + /* if we aren't forcing don't do destructive polling */ | ||
1676 | if (!force) { | ||
1677 | - ret = connector->status; | ||
1678 | + /* only return the previous status if we last | ||
1679 | + * detected a monitor via load. | ||
1680 | + */ | ||
1681 | + if (radeon_connector->detected_by_load) | ||
1682 | + ret = connector->status; | ||
1683 | goto out; | ||
1684 | } | ||
1685 | |||
1686 | @@ -985,6 +1006,8 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) | ||
1687 | if (ret == connector_status_connected) { | ||
1688 | radeon_connector->use_digital = false; | ||
1689 | } | ||
1690 | + if (ret != connector_status_disconnected) | ||
1691 | + radeon_connector->detected_by_load = true; | ||
1692 | } | ||
1693 | break; | ||
1694 | } | ||
1695 | diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c | ||
1696 | index e71d2ed..c12b077 100644 | ||
1697 | --- a/drivers/gpu/drm/radeon/radeon_drv.c | ||
1698 | +++ b/drivers/gpu/drm/radeon/radeon_drv.c | ||
1699 | @@ -118,6 +118,7 @@ int radeon_audio = 0; | ||
1700 | int radeon_disp_priority = 0; | ||
1701 | int radeon_hw_i2c = 0; | ||
1702 | int radeon_pcie_gen2 = 0; | ||
1703 | +int radeon_msi = -1; | ||
1704 | |||
1705 | MODULE_PARM_DESC(no_wb, "Disable AGP writeback for scratch registers"); | ||
1706 | module_param_named(no_wb, radeon_no_wb, int, 0444); | ||
1707 | @@ -164,6 +165,9 @@ module_param_named(hw_i2c, radeon_hw_i2c, int, 0444); | ||
1708 | MODULE_PARM_DESC(pcie_gen2, "PCIE Gen2 mode (1 = enable)"); | ||
1709 | module_param_named(pcie_gen2, radeon_pcie_gen2, int, 0444); | ||
1710 | |||
1711 | +MODULE_PARM_DESC(msi, "MSI support (1 = enable, 0 = disable, -1 = auto)"); | ||
1712 | +module_param_named(msi, radeon_msi, int, 0444); | ||
1713 | + | ||
1714 | static int radeon_suspend(struct drm_device *dev, pm_message_t state) | ||
1715 | { | ||
1716 | drm_radeon_private_t *dev_priv = dev->dev_private; | ||
1717 | diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c | ||
1718 | index 9ec830c..fecc1aa 100644 | ||
1719 | --- a/drivers/gpu/drm/radeon/radeon_irq_kms.c | ||
1720 | +++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c | ||
1721 | @@ -108,6 +108,46 @@ void radeon_driver_irq_uninstall_kms(struct drm_device *dev) | ||
1722 | radeon_irq_set(rdev); | ||
1723 | } | ||
1724 | |||
1725 | +static bool radeon_msi_ok(struct radeon_device *rdev) | ||
1726 | +{ | ||
1727 | + /* RV370/RV380 was first asic with MSI support */ | ||
1728 | + if (rdev->family < CHIP_RV380) | ||
1729 | + return false; | ||
1730 | + | ||
1731 | + /* MSIs don't work on AGP */ | ||
1732 | + if (rdev->flags & RADEON_IS_AGP) | ||
1733 | + return false; | ||
1734 | + | ||
1735 | + /* force MSI on */ | ||
1736 | + if (radeon_msi == 1) | ||
1737 | + return true; | ||
1738 | + else if (radeon_msi == 0) | ||
1739 | + return false; | ||
1740 | + | ||
1741 | + /* Quirks */ | ||
1742 | + /* HP RS690 only seems to work with MSIs. */ | ||
1743 | + if ((rdev->pdev->device == 0x791f) && | ||
1744 | + (rdev->pdev->subsystem_vendor == 0x103c) && | ||
1745 | + (rdev->pdev->subsystem_device == 0x30c2)) | ||
1746 | + return true; | ||
1747 | + | ||
1748 | + /* Dell RS690 only seems to work with MSIs. */ | ||
1749 | + if ((rdev->pdev->device == 0x791f) && | ||
1750 | + (rdev->pdev->subsystem_vendor == 0x1028) && | ||
1751 | + (rdev->pdev->subsystem_device == 0x01fd)) | ||
1752 | + return true; | ||
1753 | + | ||
1754 | + if (rdev->flags & RADEON_IS_IGP) { | ||
1755 | + /* APUs work fine with MSIs */ | ||
1756 | + if (rdev->family >= CHIP_PALM) | ||
1757 | + return true; | ||
1758 | + /* lots of IGPs have problems with MSIs */ | ||
1759 | + return false; | ||
1760 | + } | ||
1761 | + | ||
1762 | + return true; | ||
1763 | +} | ||
1764 | + | ||
1765 | int radeon_irq_kms_init(struct radeon_device *rdev) | ||
1766 | { | ||
1767 | int i; | ||
1768 | @@ -124,12 +164,8 @@ int radeon_irq_kms_init(struct radeon_device *rdev) | ||
1769 | } | ||
1770 | /* enable msi */ | ||
1771 | rdev->msi_enabled = 0; | ||
1772 | - /* MSIs don't seem to work reliably on all IGP | ||
1773 | - * chips. Disable MSI on them for now. | ||
1774 | - */ | ||
1775 | - if ((rdev->family >= CHIP_RV380) && | ||
1776 | - ((!(rdev->flags & RADEON_IS_IGP)) || (rdev->family >= CHIP_PALM)) && | ||
1777 | - (!(rdev->flags & RADEON_IS_AGP))) { | ||
1778 | + | ||
1779 | + if (radeon_msi_ok(rdev)) { | ||
1780 | int ret = pci_enable_msi(rdev->pdev); | ||
1781 | if (!ret) { | ||
1782 | rdev->msi_enabled = 1; | ||
1783 | diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h | ||
1784 | index 68820f5..ed0178f 100644 | ||
1785 | --- a/drivers/gpu/drm/radeon/radeon_mode.h | ||
1786 | +++ b/drivers/gpu/drm/radeon/radeon_mode.h | ||
1787 | @@ -447,6 +447,7 @@ struct radeon_connector { | ||
1788 | struct edid *edid; | ||
1789 | void *con_priv; | ||
1790 | bool dac_load_detect; | ||
1791 | + bool detected_by_load; /* if the connection status was determined by load */ | ||
1792 | uint16_t connector_object_id; | ||
1793 | struct radeon_hpd hpd; | ||
1794 | struct radeon_router router; | ||
1795 | diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c | ||
1796 | index 4b5d0e6..29d85cf 100644 | ||
1797 | --- a/drivers/gpu/drm/radeon/rs600.c | ||
1798 | +++ b/drivers/gpu/drm/radeon/rs600.c | ||
1799 | @@ -287,6 +287,7 @@ void rs600_hpd_init(struct radeon_device *rdev) | ||
1800 | default: | ||
1801 | break; | ||
1802 | } | ||
1803 | + radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd); | ||
1804 | } | ||
1805 | if (rdev->irq.installed) | ||
1806 | rs600_irq_set(rdev); | ||
1807 | diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig | ||
1808 | index 1130a89..7978c55 100644 | ||
1809 | --- a/drivers/hid/Kconfig | ||
1810 | +++ b/drivers/hid/Kconfig | ||
1811 | @@ -69,7 +69,7 @@ config HID_ACRUX | ||
1812 | Say Y here if you want to enable support for ACRUX game controllers. | ||
1813 | |||
1814 | config HID_ACRUX_FF | ||
1815 | - tristate "ACRUX force feedback support" | ||
1816 | + bool "ACRUX force feedback support" | ||
1817 | depends on HID_ACRUX | ||
1818 | select INPUT_FF_MEMLESS | ||
1819 | ---help--- | ||
1820 | @@ -328,6 +328,7 @@ config HID_MULTITOUCH | ||
1821 | - Hanvon dual touch panels | ||
1822 | - Ilitek dual touch panels | ||
1823 | - IrTouch Infrared USB panels | ||
1824 | + - LG Display panels (Dell ST2220Tc) | ||
1825 | - Lumio CrystalTouch panels | ||
1826 | - MosArt dual-touch panels | ||
1827 | - PenMount dual touch panels | ||
1828 | diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c | ||
1829 | index 18b3bc6..299d238 100644 | ||
1830 | --- a/drivers/hid/hid-apple.c | ||
1831 | +++ b/drivers/hid/hid-apple.c | ||
1832 | @@ -455,6 +455,9 @@ static const struct hid_device_id apple_devices[] = { | ||
1833 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO), | ||
1834 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | ||
1835 | APPLE_ISO_KEYBOARD }, | ||
1836 | + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO), | ||
1837 | + .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | ||
1838 | + APPLE_ISO_KEYBOARD }, | ||
1839 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS), | ||
1840 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | ||
1841 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI), | ||
1842 | @@ -493,6 +496,24 @@ static const struct hid_device_id apple_devices[] = { | ||
1843 | .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, | ||
1844 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_JIS), | ||
1845 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | ||
1846 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI), | ||
1847 | + .driver_data = APPLE_HAS_FN }, | ||
1848 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ISO), | ||
1849 | + .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, | ||
1850 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_JIS), | ||
1851 | + .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | ||
1852 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI), | ||
1853 | + .driver_data = APPLE_HAS_FN }, | ||
1854 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO), | ||
1855 | + .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, | ||
1856 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS), | ||
1857 | + .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | ||
1858 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI), | ||
1859 | + .driver_data = APPLE_HAS_FN }, | ||
1860 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO), | ||
1861 | + .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, | ||
1862 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS), | ||
1863 | + .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | ||
1864 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI), | ||
1865 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | ||
1866 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO), | ||
1867 | diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c | ||
1868 | index 242353d..5be9f47 100644 | ||
1869 | --- a/drivers/hid/hid-core.c | ||
1870 | +++ b/drivers/hid/hid-core.c | ||
1871 | @@ -1340,12 +1340,22 @@ static const struct hid_device_id hid_have_special_driver[] = { | ||
1872 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI) }, | ||
1873 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ISO) }, | ||
1874 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_JIS) }, | ||
1875 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI) }, | ||
1876 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO) }, | ||
1877 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS) }, | ||
1878 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI) }, | ||
1879 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ISO) }, | ||
1880 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_JIS) }, | ||
1881 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI) }, | ||
1882 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO) }, | ||
1883 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS) }, | ||
1884 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ANSI) }, | ||
1885 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ISO) }, | ||
1886 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_JIS) }, | ||
1887 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI) }, | ||
1888 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO) }, | ||
1889 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) }, | ||
1890 | + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO) }, | ||
1891 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, | ||
1892 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, | ||
1893 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_T91MT) }, | ||
1894 | @@ -1399,6 +1409,7 @@ static const struct hid_device_id hid_have_special_driver[] = { | ||
1895 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) }, | ||
1896 | { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) }, | ||
1897 | { HID_USB_DEVICE(USB_VENDOR_ID_LCPOWER, USB_DEVICE_ID_LCPOWER_LC1000 ) }, | ||
1898 | + { HID_USB_DEVICE(USB_VENDOR_ID_LG, USB_DEVICE_ID_LG_MULTITOUCH) }, | ||
1899 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER) }, | ||
1900 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER) }, | ||
1901 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2) }, | ||
1902 | @@ -1892,6 +1903,9 @@ static const struct hid_device_id hid_mouse_ignore_list[] = { | ||
1903 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI) }, | ||
1904 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ISO) }, | ||
1905 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_JIS) }, | ||
1906 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI) }, | ||
1907 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO) }, | ||
1908 | + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS) }, | ||
1909 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, | ||
1910 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, | ||
1911 | { } | ||
1912 | diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h | ||
1913 | index 7484e1b..0d87d98 100644 | ||
1914 | --- a/drivers/hid/hid-ids.h | ||
1915 | +++ b/drivers/hid/hid-ids.h | ||
1916 | @@ -109,12 +109,22 @@ | ||
1917 | #define USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI 0x0245 | ||
1918 | #define USB_DEVICE_ID_APPLE_WELLSPRING5_ISO 0x0246 | ||
1919 | #define USB_DEVICE_ID_APPLE_WELLSPRING5_JIS 0x0247 | ||
1920 | +#define USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI 0x0249 | ||
1921 | +#define USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO 0x024a | ||
1922 | +#define USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS 0x024b | ||
1923 | +#define USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI 0x024c | ||
1924 | +#define USB_DEVICE_ID_APPLE_WELLSPRING6_ISO 0x024d | ||
1925 | +#define USB_DEVICE_ID_APPLE_WELLSPRING6_JIS 0x024e | ||
1926 | #define USB_DEVICE_ID_APPLE_ALU_REVB_ANSI 0x024f | ||
1927 | #define USB_DEVICE_ID_APPLE_ALU_REVB_ISO 0x0250 | ||
1928 | #define USB_DEVICE_ID_APPLE_ALU_REVB_JIS 0x0251 | ||
1929 | +#define USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI 0x0252 | ||
1930 | +#define USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO 0x0253 | ||
1931 | +#define USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS 0x0254 | ||
1932 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI 0x0239 | ||
1933 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO 0x023a | ||
1934 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b | ||
1935 | +#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO 0x0256 | ||
1936 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a | ||
1937 | #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b | ||
1938 | #define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241 | ||
1939 | @@ -423,6 +433,9 @@ | ||
1940 | #define USB_DEVICE_ID_LD_HYBRID 0x2090 | ||
1941 | #define USB_DEVICE_ID_LD_HEATCONTROL 0x20A0 | ||
1942 | |||
1943 | +#define USB_VENDOR_ID_LG 0x1fd2 | ||
1944 | +#define USB_DEVICE_ID_LG_MULTITOUCH 0x0064 | ||
1945 | + | ||
1946 | #define USB_VENDOR_ID_LOGITECH 0x046d | ||
1947 | #define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101 | ||
1948 | #define USB_DEVICE_ID_LOGITECH_HARMONY_FIRST 0xc110 | ||
1949 | diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c | ||
1950 | index 58d0e7a..9fc15e1 100644 | ||
1951 | --- a/drivers/hid/hid-multitouch.c | ||
1952 | +++ b/drivers/hid/hid-multitouch.c | ||
1953 | @@ -672,6 +672,11 @@ static const struct hid_device_id mt_devices[] = { | ||
1954 | HID_USB_DEVICE(USB_VENDOR_ID_IRTOUCHSYSTEMS, | ||
1955 | USB_DEVICE_ID_IRTOUCH_INFRARED_USB) }, | ||
1956 | |||
1957 | + /* LG Display panels */ | ||
1958 | + { .driver_data = MT_CLS_DEFAULT, | ||
1959 | + HID_USB_DEVICE(USB_VENDOR_ID_LG, | ||
1960 | + USB_DEVICE_ID_LG_MULTITOUCH) }, | ||
1961 | + | ||
1962 | /* Lumio panels */ | ||
1963 | { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, | ||
1964 | HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, | ||
1965 | diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c | ||
1966 | index 9323837..62800de 100644 | ||
1967 | --- a/drivers/hwmon/coretemp.c | ||
1968 | +++ b/drivers/hwmon/coretemp.c | ||
1969 | @@ -60,14 +60,13 @@ MODULE_PARM_DESC(tjmax, "TjMax value in degrees Celsius"); | ||
1970 | #ifdef CONFIG_SMP | ||
1971 | #define TO_PHYS_ID(cpu) cpu_data(cpu).phys_proc_id | ||
1972 | #define TO_CORE_ID(cpu) cpu_data(cpu).cpu_core_id | ||
1973 | -#define TO_ATTR_NO(cpu) (TO_CORE_ID(cpu) + BASE_SYSFS_ATTR_NO) | ||
1974 | #define for_each_sibling(i, cpu) for_each_cpu(i, cpu_sibling_mask(cpu)) | ||
1975 | #else | ||
1976 | #define TO_PHYS_ID(cpu) (cpu) | ||
1977 | #define TO_CORE_ID(cpu) (cpu) | ||
1978 | -#define TO_ATTR_NO(cpu) (cpu) | ||
1979 | #define for_each_sibling(i, cpu) for (i = 0; false; ) | ||
1980 | #endif | ||
1981 | +#define TO_ATTR_NO(cpu) (TO_CORE_ID(cpu) + BASE_SYSFS_ATTR_NO) | ||
1982 | |||
1983 | /* | ||
1984 | * Per-Core Temperature Data | ||
1985 | diff --git a/drivers/hwmon/w83627ehf.c b/drivers/hwmon/w83627ehf.c | ||
1986 | index 36d7f27..4b2fc50 100644 | ||
1987 | --- a/drivers/hwmon/w83627ehf.c | ||
1988 | +++ b/drivers/hwmon/w83627ehf.c | ||
1989 | @@ -1756,7 +1756,17 @@ static inline void __devinit w83627ehf_init_device(struct w83627ehf_data *data, | ||
1990 | diode = 0x70; | ||
1991 | } | ||
1992 | for (i = 0; i < 3; i++) { | ||
1993 | - if ((tmp & (0x02 << i))) | ||
1994 | + const char *label = NULL; | ||
1995 | + | ||
1996 | + if (data->temp_label) | ||
1997 | + label = data->temp_label[data->temp_src[i]]; | ||
1998 | + | ||
1999 | + /* Digital source overrides analog type */ | ||
2000 | + if (label && strncmp(label, "PECI", 4) == 0) | ||
2001 | + data->temp_type[i] = 6; | ||
2002 | + else if (label && strncmp(label, "AMD", 3) == 0) | ||
2003 | + data->temp_type[i] = 5; | ||
2004 | + else if ((tmp & (0x02 << i))) | ||
2005 | data->temp_type[i] = (diode & (0x10 << i)) ? 1 : 3; | ||
2006 | else | ||
2007 | data->temp_type[i] = 4; /* thermistor */ | ||
2008 | diff --git a/drivers/hwspinlock/hwspinlock_core.c b/drivers/hwspinlock/hwspinlock_core.c | ||
2009 | index 43a6271..12f7c83 100644 | ||
2010 | --- a/drivers/hwspinlock/hwspinlock_core.c | ||
2011 | +++ b/drivers/hwspinlock/hwspinlock_core.c | ||
2012 | @@ -26,6 +26,7 @@ | ||
2013 | #include <linux/radix-tree.h> | ||
2014 | #include <linux/hwspinlock.h> | ||
2015 | #include <linux/pm_runtime.h> | ||
2016 | +#include <linux/mutex.h> | ||
2017 | |||
2018 | #include "hwspinlock_internal.h" | ||
2019 | |||
2020 | @@ -52,10 +53,12 @@ | ||
2021 | static RADIX_TREE(hwspinlock_tree, GFP_KERNEL); | ||
2022 | |||
2023 | /* | ||
2024 | - * Synchronization of access to the tree is achieved using this spinlock, | ||
2025 | + * Synchronization of access to the tree is achieved using this mutex, | ||
2026 | * as the radix-tree API requires that users provide all synchronisation. | ||
2027 | + * A mutex is needed because we're using non-atomic radix tree allocations. | ||
2028 | */ | ||
2029 | -static DEFINE_SPINLOCK(hwspinlock_tree_lock); | ||
2030 | +static DEFINE_MUTEX(hwspinlock_tree_lock); | ||
2031 | + | ||
2032 | |||
2033 | /** | ||
2034 | * __hwspin_trylock() - attempt to lock a specific hwspinlock | ||
2035 | @@ -261,8 +264,7 @@ EXPORT_SYMBOL_GPL(__hwspin_unlock); | ||
2036 | * This function should be called from the underlying platform-specific | ||
2037 | * implementation, to register a new hwspinlock instance. | ||
2038 | * | ||
2039 | - * Can be called from an atomic context (will not sleep) but not from | ||
2040 | - * within interrupt context. | ||
2041 | + * Should be called from a process context (might sleep) | ||
2042 | * | ||
2043 | * Returns 0 on success, or an appropriate error code on failure | ||
2044 | */ | ||
2045 | @@ -279,7 +281,7 @@ int hwspin_lock_register(struct hwspinlock *hwlock) | ||
2046 | |||
2047 | spin_lock_init(&hwlock->lock); | ||
2048 | |||
2049 | - spin_lock(&hwspinlock_tree_lock); | ||
2050 | + mutex_lock(&hwspinlock_tree_lock); | ||
2051 | |||
2052 | ret = radix_tree_insert(&hwspinlock_tree, hwlock->id, hwlock); | ||
2053 | if (ret) | ||
2054 | @@ -293,7 +295,7 @@ int hwspin_lock_register(struct hwspinlock *hwlock) | ||
2055 | WARN_ON(tmp != hwlock); | ||
2056 | |||
2057 | out: | ||
2058 | - spin_unlock(&hwspinlock_tree_lock); | ||
2059 | + mutex_unlock(&hwspinlock_tree_lock); | ||
2060 | return ret; | ||
2061 | } | ||
2062 | EXPORT_SYMBOL_GPL(hwspin_lock_register); | ||
2063 | @@ -305,8 +307,7 @@ EXPORT_SYMBOL_GPL(hwspin_lock_register); | ||
2064 | * This function should be called from the underlying platform-specific | ||
2065 | * implementation, to unregister an existing (and unused) hwspinlock. | ||
2066 | * | ||
2067 | - * Can be called from an atomic context (will not sleep) but not from | ||
2068 | - * within interrupt context. | ||
2069 | + * Should be called from a process context (might sleep) | ||
2070 | * | ||
2071 | * Returns the address of hwspinlock @id on success, or NULL on failure | ||
2072 | */ | ||
2073 | @@ -315,7 +316,7 @@ struct hwspinlock *hwspin_lock_unregister(unsigned int id) | ||
2074 | struct hwspinlock *hwlock = NULL; | ||
2075 | int ret; | ||
2076 | |||
2077 | - spin_lock(&hwspinlock_tree_lock); | ||
2078 | + mutex_lock(&hwspinlock_tree_lock); | ||
2079 | |||
2080 | /* make sure the hwspinlock is not in use (tag is set) */ | ||
2081 | ret = radix_tree_tag_get(&hwspinlock_tree, id, HWSPINLOCK_UNUSED); | ||
2082 | @@ -331,7 +332,7 @@ struct hwspinlock *hwspin_lock_unregister(unsigned int id) | ||
2083 | } | ||
2084 | |||
2085 | out: | ||
2086 | - spin_unlock(&hwspinlock_tree_lock); | ||
2087 | + mutex_unlock(&hwspinlock_tree_lock); | ||
2088 | return hwlock; | ||
2089 | } | ||
2090 | EXPORT_SYMBOL_GPL(hwspin_lock_unregister); | ||
2091 | @@ -400,9 +401,7 @@ EXPORT_SYMBOL_GPL(hwspin_lock_get_id); | ||
2092 | * to the remote core before it can be used for synchronization (to get the | ||
2093 | * id of a given hwlock, use hwspin_lock_get_id()). | ||
2094 | * | ||
2095 | - * Can be called from an atomic context (will not sleep) but not from | ||
2096 | - * within interrupt context (simply because there is no use case for | ||
2097 | - * that yet). | ||
2098 | + * Should be called from a process context (might sleep) | ||
2099 | * | ||
2100 | * Returns the address of the assigned hwspinlock, or NULL on error | ||
2101 | */ | ||
2102 | @@ -411,7 +410,7 @@ struct hwspinlock *hwspin_lock_request(void) | ||
2103 | struct hwspinlock *hwlock; | ||
2104 | int ret; | ||
2105 | |||
2106 | - spin_lock(&hwspinlock_tree_lock); | ||
2107 | + mutex_lock(&hwspinlock_tree_lock); | ||
2108 | |||
2109 | /* look for an unused lock */ | ||
2110 | ret = radix_tree_gang_lookup_tag(&hwspinlock_tree, (void **)&hwlock, | ||
2111 | @@ -431,7 +430,7 @@ struct hwspinlock *hwspin_lock_request(void) | ||
2112 | hwlock = NULL; | ||
2113 | |||
2114 | out: | ||
2115 | - spin_unlock(&hwspinlock_tree_lock); | ||
2116 | + mutex_unlock(&hwspinlock_tree_lock); | ||
2117 | return hwlock; | ||
2118 | } | ||
2119 | EXPORT_SYMBOL_GPL(hwspin_lock_request); | ||
2120 | @@ -445,9 +444,7 @@ EXPORT_SYMBOL_GPL(hwspin_lock_request); | ||
2121 | * Usually early board code will be calling this function in order to | ||
2122 | * reserve specific hwspinlock ids for predefined purposes. | ||
2123 | * | ||
2124 | - * Can be called from an atomic context (will not sleep) but not from | ||
2125 | - * within interrupt context (simply because there is no use case for | ||
2126 | - * that yet). | ||
2127 | + * Should be called from a process context (might sleep) | ||
2128 | * | ||
2129 | * Returns the address of the assigned hwspinlock, or NULL on error | ||
2130 | */ | ||
2131 | @@ -456,7 +453,7 @@ struct hwspinlock *hwspin_lock_request_specific(unsigned int id) | ||
2132 | struct hwspinlock *hwlock; | ||
2133 | int ret; | ||
2134 | |||
2135 | - spin_lock(&hwspinlock_tree_lock); | ||
2136 | + mutex_lock(&hwspinlock_tree_lock); | ||
2137 | |||
2138 | /* make sure this hwspinlock exists */ | ||
2139 | hwlock = radix_tree_lookup(&hwspinlock_tree, id); | ||
2140 | @@ -482,7 +479,7 @@ struct hwspinlock *hwspin_lock_request_specific(unsigned int id) | ||
2141 | hwlock = NULL; | ||
2142 | |||
2143 | out: | ||
2144 | - spin_unlock(&hwspinlock_tree_lock); | ||
2145 | + mutex_unlock(&hwspinlock_tree_lock); | ||
2146 | return hwlock; | ||
2147 | } | ||
2148 | EXPORT_SYMBOL_GPL(hwspin_lock_request_specific); | ||
2149 | @@ -495,9 +492,7 @@ EXPORT_SYMBOL_GPL(hwspin_lock_request_specific); | ||
2150 | * Should only be called with an @hwlock that was retrieved from | ||
2151 | * an earlier call to omap_hwspin_lock_request{_specific}. | ||
2152 | * | ||
2153 | - * Can be called from an atomic context (will not sleep) but not from | ||
2154 | - * within interrupt context (simply because there is no use case for | ||
2155 | - * that yet). | ||
2156 | + * Should be called from a process context (might sleep) | ||
2157 | * | ||
2158 | * Returns 0 on success, or an appropriate error code on failure | ||
2159 | */ | ||
2160 | @@ -511,7 +506,7 @@ int hwspin_lock_free(struct hwspinlock *hwlock) | ||
2161 | return -EINVAL; | ||
2162 | } | ||
2163 | |||
2164 | - spin_lock(&hwspinlock_tree_lock); | ||
2165 | + mutex_lock(&hwspinlock_tree_lock); | ||
2166 | |||
2167 | /* make sure the hwspinlock is used */ | ||
2168 | ret = radix_tree_tag_get(&hwspinlock_tree, hwlock->id, | ||
2169 | @@ -538,7 +533,7 @@ int hwspin_lock_free(struct hwspinlock *hwlock) | ||
2170 | module_put(hwlock->owner); | ||
2171 | |||
2172 | out: | ||
2173 | - spin_unlock(&hwspinlock_tree_lock); | ||
2174 | + mutex_unlock(&hwspinlock_tree_lock); | ||
2175 | return ret; | ||
2176 | } | ||
2177 | EXPORT_SYMBOL_GPL(hwspin_lock_free); | ||
2178 | diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c | ||
2179 | index 0e4227f..cc79045 100644 | ||
2180 | --- a/drivers/iommu/amd_iommu.c | ||
2181 | +++ b/drivers/iommu/amd_iommu.c | ||
2182 | @@ -1283,7 +1283,7 @@ static int alloc_new_range(struct dma_ops_domain *dma_dom, | ||
2183 | if (!pte || !IOMMU_PTE_PRESENT(*pte)) | ||
2184 | continue; | ||
2185 | |||
2186 | - dma_ops_reserve_addresses(dma_dom, i << PAGE_SHIFT, 1); | ||
2187 | + dma_ops_reserve_addresses(dma_dom, i >> PAGE_SHIFT, 1); | ||
2188 | } | ||
2189 | |||
2190 | update_domain(&dma_dom->domain); | ||
2191 | diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c | ||
2192 | index dc3d3d8..661b692 100644 | ||
2193 | --- a/drivers/leds/led-class.c | ||
2194 | +++ b/drivers/leds/led-class.c | ||
2195 | @@ -267,9 +267,14 @@ void led_blink_set(struct led_classdev *led_cdev, | ||
2196 | unsigned long *delay_on, | ||
2197 | unsigned long *delay_off) | ||
2198 | { | ||
2199 | + del_timer_sync(&led_cdev->blink_timer); | ||
2200 | + | ||
2201 | if (led_cdev->blink_set && | ||
2202 | - !led_cdev->blink_set(led_cdev, delay_on, delay_off)) | ||
2203 | + !led_cdev->blink_set(led_cdev, delay_on, delay_off)) { | ||
2204 | + led_cdev->blink_delay_on = *delay_on; | ||
2205 | + led_cdev->blink_delay_off = *delay_off; | ||
2206 | return; | ||
2207 | + } | ||
2208 | |||
2209 | /* blink with 1 Hz as default if nothing specified */ | ||
2210 | if (!*delay_on && !*delay_off) | ||
2211 | diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c | ||
2212 | index 0cd9672..1d44228 100644 | ||
2213 | --- a/drivers/md/raid10.c | ||
2214 | +++ b/drivers/md/raid10.c | ||
2215 | @@ -1337,7 +1337,7 @@ static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) | ||
2216 | mirror_info_t *p = &conf->mirrors[mirror]; | ||
2217 | if (p->recovery_disabled == mddev->recovery_disabled) | ||
2218 | continue; | ||
2219 | - if (!p->rdev) | ||
2220 | + if (p->rdev) | ||
2221 | continue; | ||
2222 | |||
2223 | disk_stack_limits(mddev->gendisk, rdev->bdev, | ||
2224 | diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c | ||
2225 | index ac5e8b5..b6200c3 100644 | ||
2226 | --- a/drivers/md/raid5.c | ||
2227 | +++ b/drivers/md/raid5.c | ||
2228 | @@ -3069,7 +3069,7 @@ static void analyse_stripe(struct stripe_head *sh, struct stripe_head_state *s) | ||
2229 | } | ||
2230 | } else if (test_bit(In_sync, &rdev->flags)) | ||
2231 | set_bit(R5_Insync, &dev->flags); | ||
2232 | - else { | ||
2233 | + else if (!test_bit(Faulty, &rdev->flags)) { | ||
2234 | /* in sync if before recovery_offset */ | ||
2235 | if (sh->sector + STRIPE_SECTORS <= rdev->recovery_offset) | ||
2236 | set_bit(R5_Insync, &dev->flags); | ||
2237 | @@ -3116,7 +3116,7 @@ static void handle_stripe(struct stripe_head *sh) | ||
2238 | struct r5dev *pdev, *qdev; | ||
2239 | |||
2240 | clear_bit(STRIPE_HANDLE, &sh->state); | ||
2241 | - if (test_and_set_bit(STRIPE_ACTIVE, &sh->state)) { | ||
2242 | + if (test_and_set_bit_lock(STRIPE_ACTIVE, &sh->state)) { | ||
2243 | /* already being handled, ensure it gets handled | ||
2244 | * again when current action finishes */ | ||
2245 | set_bit(STRIPE_HANDLE, &sh->state); | ||
2246 | @@ -3165,10 +3165,14 @@ static void handle_stripe(struct stripe_head *sh) | ||
2247 | /* check if the array has lost more than max_degraded devices and, | ||
2248 | * if so, some requests might need to be failed. | ||
2249 | */ | ||
2250 | - if (s.failed > conf->max_degraded && s.to_read+s.to_write+s.written) | ||
2251 | - handle_failed_stripe(conf, sh, &s, disks, &s.return_bi); | ||
2252 | - if (s.failed > conf->max_degraded && s.syncing) | ||
2253 | - handle_failed_sync(conf, sh, &s); | ||
2254 | + if (s.failed > conf->max_degraded) { | ||
2255 | + sh->check_state = 0; | ||
2256 | + sh->reconstruct_state = 0; | ||
2257 | + if (s.to_read+s.to_write+s.written) | ||
2258 | + handle_failed_stripe(conf, sh, &s, disks, &s.return_bi); | ||
2259 | + if (s.syncing) | ||
2260 | + handle_failed_sync(conf, sh, &s); | ||
2261 | + } | ||
2262 | |||
2263 | /* | ||
2264 | * might be able to return some write requests if the parity blocks | ||
2265 | @@ -3377,7 +3381,7 @@ finish: | ||
2266 | |||
2267 | return_io(s.return_bi); | ||
2268 | |||
2269 | - clear_bit(STRIPE_ACTIVE, &sh->state); | ||
2270 | + clear_bit_unlock(STRIPE_ACTIVE, &sh->state); | ||
2271 | } | ||
2272 | |||
2273 | static void raid5_activate_delayed(raid5_conf_t *conf) | ||
2274 | diff --git a/drivers/media/dvb/dvb-usb/dib0700_core.c b/drivers/media/dvb/dvb-usb/dib0700_core.c | ||
2275 | index 5eb91b4..a224e94 100644 | ||
2276 | --- a/drivers/media/dvb/dvb-usb/dib0700_core.c | ||
2277 | +++ b/drivers/media/dvb/dvb-usb/dib0700_core.c | ||
2278 | @@ -30,6 +30,11 @@ int dib0700_get_version(struct dvb_usb_device *d, u32 *hwversion, | ||
2279 | struct dib0700_state *st = d->priv; | ||
2280 | int ret; | ||
2281 | |||
2282 | + if (mutex_lock_interruptible(&d->usb_mutex) < 0) { | ||
2283 | + deb_info("could not acquire lock"); | ||
2284 | + return 0; | ||
2285 | + } | ||
2286 | + | ||
2287 | ret = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), | ||
2288 | REQUEST_GET_VERSION, | ||
2289 | USB_TYPE_VENDOR | USB_DIR_IN, 0, 0, | ||
2290 | @@ -46,6 +51,7 @@ int dib0700_get_version(struct dvb_usb_device *d, u32 *hwversion, | ||
2291 | if (fwtype != NULL) | ||
2292 | *fwtype = (st->buf[12] << 24) | (st->buf[13] << 16) | | ||
2293 | (st->buf[14] << 8) | st->buf[15]; | ||
2294 | + mutex_unlock(&d->usb_mutex); | ||
2295 | return ret; | ||
2296 | } | ||
2297 | |||
2298 | @@ -108,7 +114,12 @@ int dib0700_ctrl_rd(struct dvb_usb_device *d, u8 *tx, u8 txlen, u8 *rx, u8 rxlen | ||
2299 | int dib0700_set_gpio(struct dvb_usb_device *d, enum dib07x0_gpios gpio, u8 gpio_dir, u8 gpio_val) | ||
2300 | { | ||
2301 | struct dib0700_state *st = d->priv; | ||
2302 | - s16 ret; | ||
2303 | + int ret; | ||
2304 | + | ||
2305 | + if (mutex_lock_interruptible(&d->usb_mutex) < 0) { | ||
2306 | + deb_info("could not acquire lock"); | ||
2307 | + return 0; | ||
2308 | + } | ||
2309 | |||
2310 | st->buf[0] = REQUEST_SET_GPIO; | ||
2311 | st->buf[1] = gpio; | ||
2312 | @@ -116,6 +127,7 @@ int dib0700_set_gpio(struct dvb_usb_device *d, enum dib07x0_gpios gpio, u8 gpio_ | ||
2313 | |||
2314 | ret = dib0700_ctrl_wr(d, st->buf, 3); | ||
2315 | |||
2316 | + mutex_unlock(&d->usb_mutex); | ||
2317 | return ret; | ||
2318 | } | ||
2319 | |||
2320 | @@ -125,6 +137,11 @@ static int dib0700_set_usb_xfer_len(struct dvb_usb_device *d, u16 nb_ts_packets) | ||
2321 | int ret; | ||
2322 | |||
2323 | if (st->fw_version >= 0x10201) { | ||
2324 | + if (mutex_lock_interruptible(&d->usb_mutex) < 0) { | ||
2325 | + deb_info("could not acquire lock"); | ||
2326 | + return 0; | ||
2327 | + } | ||
2328 | + | ||
2329 | st->buf[0] = REQUEST_SET_USB_XFER_LEN; | ||
2330 | st->buf[1] = (nb_ts_packets >> 8) & 0xff; | ||
2331 | st->buf[2] = nb_ts_packets & 0xff; | ||
2332 | @@ -132,6 +149,7 @@ static int dib0700_set_usb_xfer_len(struct dvb_usb_device *d, u16 nb_ts_packets) | ||
2333 | deb_info("set the USB xfer len to %i Ts packet\n", nb_ts_packets); | ||
2334 | |||
2335 | ret = dib0700_ctrl_wr(d, st->buf, 3); | ||
2336 | + mutex_unlock(&d->usb_mutex); | ||
2337 | } else { | ||
2338 | deb_info("this firmware does not allow to change the USB xfer len\n"); | ||
2339 | ret = -EIO; | ||
2340 | @@ -208,6 +226,10 @@ static int dib0700_i2c_xfer_new(struct i2c_adapter *adap, struct i2c_msg *msg, | ||
2341 | |||
2342 | } else { | ||
2343 | /* Write request */ | ||
2344 | + if (mutex_lock_interruptible(&d->usb_mutex) < 0) { | ||
2345 | + deb_info("could not acquire lock"); | ||
2346 | + return 0; | ||
2347 | + } | ||
2348 | st->buf[0] = REQUEST_NEW_I2C_WRITE; | ||
2349 | st->buf[1] = msg[i].addr << 1; | ||
2350 | st->buf[2] = (en_start << 7) | (en_stop << 6) | | ||
2351 | @@ -227,6 +249,7 @@ static int dib0700_i2c_xfer_new(struct i2c_adapter *adap, struct i2c_msg *msg, | ||
2352 | USB_TYPE_VENDOR | USB_DIR_OUT, | ||
2353 | 0, 0, st->buf, msg[i].len + 4, | ||
2354 | USB_CTRL_GET_TIMEOUT); | ||
2355 | + mutex_unlock(&d->usb_mutex); | ||
2356 | if (result < 0) { | ||
2357 | deb_info("i2c write error (status = %d)\n", result); | ||
2358 | break; | ||
2359 | @@ -249,6 +272,10 @@ static int dib0700_i2c_xfer_legacy(struct i2c_adapter *adap, | ||
2360 | |||
2361 | if (mutex_lock_interruptible(&d->i2c_mutex) < 0) | ||
2362 | return -EAGAIN; | ||
2363 | + if (mutex_lock_interruptible(&d->usb_mutex) < 0) { | ||
2364 | + deb_info("could not acquire lock"); | ||
2365 | + return 0; | ||
2366 | + } | ||
2367 | |||
2368 | for (i = 0; i < num; i++) { | ||
2369 | /* fill in the address */ | ||
2370 | @@ -279,6 +306,7 @@ static int dib0700_i2c_xfer_legacy(struct i2c_adapter *adap, | ||
2371 | break; | ||
2372 | } | ||
2373 | } | ||
2374 | + mutex_unlock(&d->usb_mutex); | ||
2375 | mutex_unlock(&d->i2c_mutex); | ||
2376 | |||
2377 | return i; | ||
2378 | @@ -337,7 +365,12 @@ static int dib0700_set_clock(struct dvb_usb_device *d, u8 en_pll, | ||
2379 | u16 pll_loopdiv, u16 free_div, u16 dsuScaler) | ||
2380 | { | ||
2381 | struct dib0700_state *st = d->priv; | ||
2382 | - s16 ret; | ||
2383 | + int ret; | ||
2384 | + | ||
2385 | + if (mutex_lock_interruptible(&d->usb_mutex) < 0) { | ||
2386 | + deb_info("could not acquire lock"); | ||
2387 | + return 0; | ||
2388 | + } | ||
2389 | |||
2390 | st->buf[0] = REQUEST_SET_CLOCK; | ||
2391 | st->buf[1] = (en_pll << 7) | (pll_src << 6) | | ||
2392 | @@ -352,6 +385,7 @@ static int dib0700_set_clock(struct dvb_usb_device *d, u8 en_pll, | ||
2393 | st->buf[9] = dsuScaler & 0xff; /* LSB */ | ||
2394 | |||
2395 | ret = dib0700_ctrl_wr(d, st->buf, 10); | ||
2396 | + mutex_unlock(&d->usb_mutex); | ||
2397 | |||
2398 | return ret; | ||
2399 | } | ||
2400 | @@ -360,10 +394,16 @@ int dib0700_set_i2c_speed(struct dvb_usb_device *d, u16 scl_kHz) | ||
2401 | { | ||
2402 | struct dib0700_state *st = d->priv; | ||
2403 | u16 divider; | ||
2404 | + int ret; | ||
2405 | |||
2406 | if (scl_kHz == 0) | ||
2407 | return -EINVAL; | ||
2408 | |||
2409 | + if (mutex_lock_interruptible(&d->usb_mutex) < 0) { | ||
2410 | + deb_info("could not acquire lock"); | ||
2411 | + return 0; | ||
2412 | + } | ||
2413 | + | ||
2414 | st->buf[0] = REQUEST_SET_I2C_PARAM; | ||
2415 | divider = (u16) (30000 / scl_kHz); | ||
2416 | st->buf[1] = 0; | ||
2417 | @@ -379,7 +419,11 @@ int dib0700_set_i2c_speed(struct dvb_usb_device *d, u16 scl_kHz) | ||
2418 | deb_info("setting I2C speed: %04x %04x %04x (%d kHz).", | ||
2419 | (st->buf[2] << 8) | (st->buf[3]), (st->buf[4] << 8) | | ||
2420 | st->buf[5], (st->buf[6] << 8) | st->buf[7], scl_kHz); | ||
2421 | - return dib0700_ctrl_wr(d, st->buf, 8); | ||
2422 | + | ||
2423 | + ret = dib0700_ctrl_wr(d, st->buf, 8); | ||
2424 | + mutex_unlock(&d->usb_mutex); | ||
2425 | + | ||
2426 | + return ret; | ||
2427 | } | ||
2428 | |||
2429 | |||
2430 | @@ -515,6 +559,11 @@ int dib0700_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff) | ||
2431 | } | ||
2432 | } | ||
2433 | |||
2434 | + if (mutex_lock_interruptible(&adap->dev->usb_mutex) < 0) { | ||
2435 | + deb_info("could not acquire lock"); | ||
2436 | + return 0; | ||
2437 | + } | ||
2438 | + | ||
2439 | st->buf[0] = REQUEST_ENABLE_VIDEO; | ||
2440 | /* this bit gives a kind of command, | ||
2441 | * rather than enabling something or not */ | ||
2442 | @@ -548,7 +597,10 @@ int dib0700_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff) | ||
2443 | |||
2444 | deb_info("data for streaming: %x %x\n", st->buf[1], st->buf[2]); | ||
2445 | |||
2446 | - return dib0700_ctrl_wr(adap->dev, st->buf, 4); | ||
2447 | + ret = dib0700_ctrl_wr(adap->dev, st->buf, 4); | ||
2448 | + mutex_unlock(&adap->dev->usb_mutex); | ||
2449 | + | ||
2450 | + return ret; | ||
2451 | } | ||
2452 | |||
2453 | int dib0700_change_protocol(struct rc_dev *rc, u64 rc_type) | ||
2454 | @@ -557,6 +609,11 @@ int dib0700_change_protocol(struct rc_dev *rc, u64 rc_type) | ||
2455 | struct dib0700_state *st = d->priv; | ||
2456 | int new_proto, ret; | ||
2457 | |||
2458 | + if (mutex_lock_interruptible(&d->usb_mutex) < 0) { | ||
2459 | + deb_info("could not acquire lock"); | ||
2460 | + return 0; | ||
2461 | + } | ||
2462 | + | ||
2463 | st->buf[0] = REQUEST_SET_RC; | ||
2464 | st->buf[1] = 0; | ||
2465 | st->buf[2] = 0; | ||
2466 | @@ -567,23 +624,29 @@ int dib0700_change_protocol(struct rc_dev *rc, u64 rc_type) | ||
2467 | else if (rc_type == RC_TYPE_NEC) | ||
2468 | new_proto = 0; | ||
2469 | else if (rc_type == RC_TYPE_RC6) { | ||
2470 | - if (st->fw_version < 0x10200) | ||
2471 | - return -EINVAL; | ||
2472 | + if (st->fw_version < 0x10200) { | ||
2473 | + ret = -EINVAL; | ||
2474 | + goto out; | ||
2475 | + } | ||
2476 | |||
2477 | new_proto = 2; | ||
2478 | - } else | ||
2479 | - return -EINVAL; | ||
2480 | + } else { | ||
2481 | + ret = -EINVAL; | ||
2482 | + goto out; | ||
2483 | + } | ||
2484 | |||
2485 | st->buf[1] = new_proto; | ||
2486 | |||
2487 | ret = dib0700_ctrl_wr(d, st->buf, 3); | ||
2488 | if (ret < 0) { | ||
2489 | err("ir protocol setup failed"); | ||
2490 | - return ret; | ||
2491 | + goto out; | ||
2492 | } | ||
2493 | |||
2494 | d->props.rc.core.protocol = rc_type; | ||
2495 | |||
2496 | +out: | ||
2497 | + mutex_unlock(&d->usb_mutex); | ||
2498 | return ret; | ||
2499 | } | ||
2500 | |||
2501 | diff --git a/drivers/media/dvb/frontends/dib0070.c b/drivers/media/dvb/frontends/dib0070.c | ||
2502 | index 1d47d4d..dc1cb17 100644 | ||
2503 | --- a/drivers/media/dvb/frontends/dib0070.c | ||
2504 | +++ b/drivers/media/dvb/frontends/dib0070.c | ||
2505 | @@ -27,6 +27,7 @@ | ||
2506 | #include <linux/kernel.h> | ||
2507 | #include <linux/slab.h> | ||
2508 | #include <linux/i2c.h> | ||
2509 | +#include <linux/mutex.h> | ||
2510 | |||
2511 | #include "dvb_frontend.h" | ||
2512 | |||
2513 | @@ -78,10 +79,18 @@ struct dib0070_state { | ||
2514 | struct i2c_msg msg[2]; | ||
2515 | u8 i2c_write_buffer[3]; | ||
2516 | u8 i2c_read_buffer[2]; | ||
2517 | + struct mutex i2c_buffer_lock; | ||
2518 | }; | ||
2519 | |||
2520 | -static uint16_t dib0070_read_reg(struct dib0070_state *state, u8 reg) | ||
2521 | +static u16 dib0070_read_reg(struct dib0070_state *state, u8 reg) | ||
2522 | { | ||
2523 | + u16 ret; | ||
2524 | + | ||
2525 | + if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) { | ||
2526 | + dprintk("could not acquire lock"); | ||
2527 | + return 0; | ||
2528 | + } | ||
2529 | + | ||
2530 | state->i2c_write_buffer[0] = reg; | ||
2531 | |||
2532 | memset(state->msg, 0, 2 * sizeof(struct i2c_msg)); | ||
2533 | @@ -96,13 +105,23 @@ static uint16_t dib0070_read_reg(struct dib0070_state *state, u8 reg) | ||
2534 | |||
2535 | if (i2c_transfer(state->i2c, state->msg, 2) != 2) { | ||
2536 | printk(KERN_WARNING "DiB0070 I2C read failed\n"); | ||
2537 | - return 0; | ||
2538 | - } | ||
2539 | - return (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1]; | ||
2540 | + ret = 0; | ||
2541 | + } else | ||
2542 | + ret = (state->i2c_read_buffer[0] << 8) | ||
2543 | + | state->i2c_read_buffer[1]; | ||
2544 | + | ||
2545 | + mutex_unlock(&state->i2c_buffer_lock); | ||
2546 | + return ret; | ||
2547 | } | ||
2548 | |||
2549 | static int dib0070_write_reg(struct dib0070_state *state, u8 reg, u16 val) | ||
2550 | { | ||
2551 | + int ret; | ||
2552 | + | ||
2553 | + if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) { | ||
2554 | + dprintk("could not acquire lock"); | ||
2555 | + return -EINVAL; | ||
2556 | + } | ||
2557 | state->i2c_write_buffer[0] = reg; | ||
2558 | state->i2c_write_buffer[1] = val >> 8; | ||
2559 | state->i2c_write_buffer[2] = val & 0xff; | ||
2560 | @@ -115,9 +134,12 @@ static int dib0070_write_reg(struct dib0070_state *state, u8 reg, u16 val) | ||
2561 | |||
2562 | if (i2c_transfer(state->i2c, state->msg, 1) != 1) { | ||
2563 | printk(KERN_WARNING "DiB0070 I2C write failed\n"); | ||
2564 | - return -EREMOTEIO; | ||
2565 | - } | ||
2566 | - return 0; | ||
2567 | + ret = -EREMOTEIO; | ||
2568 | + } else | ||
2569 | + ret = 0; | ||
2570 | + | ||
2571 | + mutex_unlock(&state->i2c_buffer_lock); | ||
2572 | + return ret; | ||
2573 | } | ||
2574 | |||
2575 | #define HARD_RESET(state) do { \ | ||
2576 | @@ -734,6 +756,7 @@ struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, struct i2c_adapter | ||
2577 | state->cfg = cfg; | ||
2578 | state->i2c = i2c; | ||
2579 | state->fe = fe; | ||
2580 | + mutex_init(&state->i2c_buffer_lock); | ||
2581 | fe->tuner_priv = state; | ||
2582 | |||
2583 | if (dib0070_reset(fe) != 0) | ||
2584 | diff --git a/drivers/media/dvb/frontends/dib0090.c b/drivers/media/dvb/frontends/dib0090.c | ||
2585 | index c9c935a..b174d1c 100644 | ||
2586 | --- a/drivers/media/dvb/frontends/dib0090.c | ||
2587 | +++ b/drivers/media/dvb/frontends/dib0090.c | ||
2588 | @@ -27,6 +27,7 @@ | ||
2589 | #include <linux/kernel.h> | ||
2590 | #include <linux/slab.h> | ||
2591 | #include <linux/i2c.h> | ||
2592 | +#include <linux/mutex.h> | ||
2593 | |||
2594 | #include "dvb_frontend.h" | ||
2595 | |||
2596 | @@ -196,6 +197,7 @@ struct dib0090_state { | ||
2597 | struct i2c_msg msg[2]; | ||
2598 | u8 i2c_write_buffer[3]; | ||
2599 | u8 i2c_read_buffer[2]; | ||
2600 | + struct mutex i2c_buffer_lock; | ||
2601 | }; | ||
2602 | |||
2603 | struct dib0090_fw_state { | ||
2604 | @@ -208,10 +210,18 @@ struct dib0090_fw_state { | ||
2605 | struct i2c_msg msg; | ||
2606 | u8 i2c_write_buffer[2]; | ||
2607 | u8 i2c_read_buffer[2]; | ||
2608 | + struct mutex i2c_buffer_lock; | ||
2609 | }; | ||
2610 | |||
2611 | static u16 dib0090_read_reg(struct dib0090_state *state, u8 reg) | ||
2612 | { | ||
2613 | + u16 ret; | ||
2614 | + | ||
2615 | + if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) { | ||
2616 | + dprintk("could not acquire lock"); | ||
2617 | + return 0; | ||
2618 | + } | ||
2619 | + | ||
2620 | state->i2c_write_buffer[0] = reg; | ||
2621 | |||
2622 | memset(state->msg, 0, 2 * sizeof(struct i2c_msg)); | ||
2623 | @@ -226,14 +236,24 @@ static u16 dib0090_read_reg(struct dib0090_state *state, u8 reg) | ||
2624 | |||
2625 | if (i2c_transfer(state->i2c, state->msg, 2) != 2) { | ||
2626 | printk(KERN_WARNING "DiB0090 I2C read failed\n"); | ||
2627 | - return 0; | ||
2628 | - } | ||
2629 | + ret = 0; | ||
2630 | + } else | ||
2631 | + ret = (state->i2c_read_buffer[0] << 8) | ||
2632 | + | state->i2c_read_buffer[1]; | ||
2633 | |||
2634 | - return (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1]; | ||
2635 | + mutex_unlock(&state->i2c_buffer_lock); | ||
2636 | + return ret; | ||
2637 | } | ||
2638 | |||
2639 | static int dib0090_write_reg(struct dib0090_state *state, u32 reg, u16 val) | ||
2640 | { | ||
2641 | + int ret; | ||
2642 | + | ||
2643 | + if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) { | ||
2644 | + dprintk("could not acquire lock"); | ||
2645 | + return -EINVAL; | ||
2646 | + } | ||
2647 | + | ||
2648 | state->i2c_write_buffer[0] = reg & 0xff; | ||
2649 | state->i2c_write_buffer[1] = val >> 8; | ||
2650 | state->i2c_write_buffer[2] = val & 0xff; | ||
2651 | @@ -246,13 +266,23 @@ static int dib0090_write_reg(struct dib0090_state *state, u32 reg, u16 val) | ||
2652 | |||
2653 | if (i2c_transfer(state->i2c, state->msg, 1) != 1) { | ||
2654 | printk(KERN_WARNING "DiB0090 I2C write failed\n"); | ||
2655 | - return -EREMOTEIO; | ||
2656 | - } | ||
2657 | - return 0; | ||
2658 | + ret = -EREMOTEIO; | ||
2659 | + } else | ||
2660 | + ret = 0; | ||
2661 | + | ||
2662 | + mutex_unlock(&state->i2c_buffer_lock); | ||
2663 | + return ret; | ||
2664 | } | ||
2665 | |||
2666 | static u16 dib0090_fw_read_reg(struct dib0090_fw_state *state, u8 reg) | ||
2667 | { | ||
2668 | + u16 ret; | ||
2669 | + | ||
2670 | + if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) { | ||
2671 | + dprintk("could not acquire lock"); | ||
2672 | + return 0; | ||
2673 | + } | ||
2674 | + | ||
2675 | state->i2c_write_buffer[0] = reg; | ||
2676 | |||
2677 | memset(&state->msg, 0, sizeof(struct i2c_msg)); | ||
2678 | @@ -262,13 +292,24 @@ static u16 dib0090_fw_read_reg(struct dib0090_fw_state *state, u8 reg) | ||
2679 | state->msg.len = 2; | ||
2680 | if (i2c_transfer(state->i2c, &state->msg, 1) != 1) { | ||
2681 | printk(KERN_WARNING "DiB0090 I2C read failed\n"); | ||
2682 | - return 0; | ||
2683 | - } | ||
2684 | - return (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1]; | ||
2685 | + ret = 0; | ||
2686 | + } else | ||
2687 | + ret = (state->i2c_read_buffer[0] << 8) | ||
2688 | + | state->i2c_read_buffer[1]; | ||
2689 | + | ||
2690 | + mutex_unlock(&state->i2c_buffer_lock); | ||
2691 | + return ret; | ||
2692 | } | ||
2693 | |||
2694 | static int dib0090_fw_write_reg(struct dib0090_fw_state *state, u8 reg, u16 val) | ||
2695 | { | ||
2696 | + int ret; | ||
2697 | + | ||
2698 | + if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) { | ||
2699 | + dprintk("could not acquire lock"); | ||
2700 | + return -EINVAL; | ||
2701 | + } | ||
2702 | + | ||
2703 | state->i2c_write_buffer[0] = val >> 8; | ||
2704 | state->i2c_write_buffer[1] = val & 0xff; | ||
2705 | |||
2706 | @@ -279,9 +320,12 @@ static int dib0090_fw_write_reg(struct dib0090_fw_state *state, u8 reg, u16 val) | ||
2707 | state->msg.len = 2; | ||
2708 | if (i2c_transfer(state->i2c, &state->msg, 1) != 1) { | ||
2709 | printk(KERN_WARNING "DiB0090 I2C write failed\n"); | ||
2710 | - return -EREMOTEIO; | ||
2711 | - } | ||
2712 | - return 0; | ||
2713 | + ret = -EREMOTEIO; | ||
2714 | + } else | ||
2715 | + ret = 0; | ||
2716 | + | ||
2717 | + mutex_unlock(&state->i2c_buffer_lock); | ||
2718 | + return ret; | ||
2719 | } | ||
2720 | |||
2721 | #define HARD_RESET(state) do { if (cfg->reset) { if (cfg->sleep) cfg->sleep(fe, 0); msleep(10); cfg->reset(fe, 1); msleep(10); cfg->reset(fe, 0); msleep(10); } } while (0) | ||
2722 | @@ -2440,6 +2484,7 @@ struct dvb_frontend *dib0090_register(struct dvb_frontend *fe, struct i2c_adapte | ||
2723 | st->config = config; | ||
2724 | st->i2c = i2c; | ||
2725 | st->fe = fe; | ||
2726 | + mutex_init(&st->i2c_buffer_lock); | ||
2727 | fe->tuner_priv = st; | ||
2728 | |||
2729 | if (config->wbd == NULL) | ||
2730 | @@ -2471,6 +2516,7 @@ struct dvb_frontend *dib0090_fw_register(struct dvb_frontend *fe, struct i2c_ada | ||
2731 | st->config = config; | ||
2732 | st->i2c = i2c; | ||
2733 | st->fe = fe; | ||
2734 | + mutex_init(&st->i2c_buffer_lock); | ||
2735 | fe->tuner_priv = st; | ||
2736 | |||
2737 | if (dib0090_fw_reset_digital(fe, st->config) != 0) | ||
2738 | diff --git a/drivers/media/dvb/frontends/dib7000m.c b/drivers/media/dvb/frontends/dib7000m.c | ||
2739 | index 79cb1c2..dbb76d7 100644 | ||
2740 | --- a/drivers/media/dvb/frontends/dib7000m.c | ||
2741 | +++ b/drivers/media/dvb/frontends/dib7000m.c | ||
2742 | @@ -11,6 +11,7 @@ | ||
2743 | #include <linux/kernel.h> | ||
2744 | #include <linux/slab.h> | ||
2745 | #include <linux/i2c.h> | ||
2746 | +#include <linux/mutex.h> | ||
2747 | |||
2748 | #include "dvb_frontend.h" | ||
2749 | |||
2750 | @@ -55,6 +56,7 @@ struct dib7000m_state { | ||
2751 | struct i2c_msg msg[2]; | ||
2752 | u8 i2c_write_buffer[4]; | ||
2753 | u8 i2c_read_buffer[2]; | ||
2754 | + struct mutex i2c_buffer_lock; | ||
2755 | }; | ||
2756 | |||
2757 | enum dib7000m_power_mode { | ||
2758 | @@ -69,6 +71,13 @@ enum dib7000m_power_mode { | ||
2759 | |||
2760 | static u16 dib7000m_read_word(struct dib7000m_state *state, u16 reg) | ||
2761 | { | ||
2762 | + u16 ret; | ||
2763 | + | ||
2764 | + if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) { | ||
2765 | + dprintk("could not acquire lock"); | ||
2766 | + return 0; | ||
2767 | + } | ||
2768 | + | ||
2769 | state->i2c_write_buffer[0] = (reg >> 8) | 0x80; | ||
2770 | state->i2c_write_buffer[1] = reg & 0xff; | ||
2771 | |||
2772 | @@ -85,11 +94,21 @@ static u16 dib7000m_read_word(struct dib7000m_state *state, u16 reg) | ||
2773 | if (i2c_transfer(state->i2c_adap, state->msg, 2) != 2) | ||
2774 | dprintk("i2c read error on %d",reg); | ||
2775 | |||
2776 | - return (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1]; | ||
2777 | + ret = (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1]; | ||
2778 | + mutex_unlock(&state->i2c_buffer_lock); | ||
2779 | + | ||
2780 | + return ret; | ||
2781 | } | ||
2782 | |||
2783 | static int dib7000m_write_word(struct dib7000m_state *state, u16 reg, u16 val) | ||
2784 | { | ||
2785 | + int ret; | ||
2786 | + | ||
2787 | + if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) { | ||
2788 | + dprintk("could not acquire lock"); | ||
2789 | + return -EINVAL; | ||
2790 | + } | ||
2791 | + | ||
2792 | state->i2c_write_buffer[0] = (reg >> 8) & 0xff; | ||
2793 | state->i2c_write_buffer[1] = reg & 0xff; | ||
2794 | state->i2c_write_buffer[2] = (val >> 8) & 0xff; | ||
2795 | @@ -101,7 +120,10 @@ static int dib7000m_write_word(struct dib7000m_state *state, u16 reg, u16 val) | ||
2796 | state->msg[0].buf = state->i2c_write_buffer; | ||
2797 | state->msg[0].len = 4; | ||
2798 | |||
2799 | - return i2c_transfer(state->i2c_adap, state->msg, 1) != 1 ? -EREMOTEIO : 0; | ||
2800 | + ret = (i2c_transfer(state->i2c_adap, state->msg, 1) != 1 ? | ||
2801 | + -EREMOTEIO : 0); | ||
2802 | + mutex_unlock(&state->i2c_buffer_lock); | ||
2803 | + return ret; | ||
2804 | } | ||
2805 | static void dib7000m_write_tab(struct dib7000m_state *state, u16 *buf) | ||
2806 | { | ||
2807 | @@ -1385,6 +1407,7 @@ struct dvb_frontend * dib7000m_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, | ||
2808 | demod = &st->demod; | ||
2809 | demod->demodulator_priv = st; | ||
2810 | memcpy(&st->demod.ops, &dib7000m_ops, sizeof(struct dvb_frontend_ops)); | ||
2811 | + mutex_init(&st->i2c_buffer_lock); | ||
2812 | |||
2813 | st->timf_default = cfg->bw->timf; | ||
2814 | |||
2815 | diff --git a/drivers/media/dvb/frontends/dib7000p.c b/drivers/media/dvb/frontends/dib7000p.c | ||
2816 | index a64a538..4eb9c2b 100644 | ||
2817 | --- a/drivers/media/dvb/frontends/dib7000p.c | ||
2818 | +++ b/drivers/media/dvb/frontends/dib7000p.c | ||
2819 | @@ -10,6 +10,7 @@ | ||
2820 | #include <linux/kernel.h> | ||
2821 | #include <linux/slab.h> | ||
2822 | #include <linux/i2c.h> | ||
2823 | +#include <linux/mutex.h> | ||
2824 | |||
2825 | #include "dvb_math.h" | ||
2826 | #include "dvb_frontend.h" | ||
2827 | @@ -68,6 +69,7 @@ struct dib7000p_state { | ||
2828 | struct i2c_msg msg[2]; | ||
2829 | u8 i2c_write_buffer[4]; | ||
2830 | u8 i2c_read_buffer[2]; | ||
2831 | + struct mutex i2c_buffer_lock; | ||
2832 | }; | ||
2833 | |||
2834 | enum dib7000p_power_mode { | ||
2835 | @@ -81,6 +83,13 @@ static int dib7090_set_diversity_in(struct dvb_frontend *fe, int onoff); | ||
2836 | |||
2837 | static u16 dib7000p_read_word(struct dib7000p_state *state, u16 reg) | ||
2838 | { | ||
2839 | + u16 ret; | ||
2840 | + | ||
2841 | + if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) { | ||
2842 | + dprintk("could not acquire lock"); | ||
2843 | + return 0; | ||
2844 | + } | ||
2845 | + | ||
2846 | state->i2c_write_buffer[0] = reg >> 8; | ||
2847 | state->i2c_write_buffer[1] = reg & 0xff; | ||
2848 | |||
2849 | @@ -97,11 +106,20 @@ static u16 dib7000p_read_word(struct dib7000p_state *state, u16 reg) | ||
2850 | if (i2c_transfer(state->i2c_adap, state->msg, 2) != 2) | ||
2851 | dprintk("i2c read error on %d", reg); | ||
2852 | |||
2853 | - return (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1]; | ||
2854 | + ret = (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1]; | ||
2855 | + mutex_unlock(&state->i2c_buffer_lock); | ||
2856 | + return ret; | ||
2857 | } | ||
2858 | |||
2859 | static int dib7000p_write_word(struct dib7000p_state *state, u16 reg, u16 val) | ||
2860 | { | ||
2861 | + int ret; | ||
2862 | + | ||
2863 | + if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) { | ||
2864 | + dprintk("could not acquire lock"); | ||
2865 | + return -EINVAL; | ||
2866 | + } | ||
2867 | + | ||
2868 | state->i2c_write_buffer[0] = (reg >> 8) & 0xff; | ||
2869 | state->i2c_write_buffer[1] = reg & 0xff; | ||
2870 | state->i2c_write_buffer[2] = (val >> 8) & 0xff; | ||
2871 | @@ -113,7 +131,10 @@ static int dib7000p_write_word(struct dib7000p_state *state, u16 reg, u16 val) | ||
2872 | state->msg[0].buf = state->i2c_write_buffer; | ||
2873 | state->msg[0].len = 4; | ||
2874 | |||
2875 | - return i2c_transfer(state->i2c_adap, state->msg, 1) != 1 ? -EREMOTEIO : 0; | ||
2876 | + ret = (i2c_transfer(state->i2c_adap, state->msg, 1) != 1 ? | ||
2877 | + -EREMOTEIO : 0); | ||
2878 | + mutex_unlock(&state->i2c_buffer_lock); | ||
2879 | + return ret; | ||
2880 | } | ||
2881 | |||
2882 | static void dib7000p_write_tab(struct dib7000p_state *state, u16 * buf) | ||
2883 | @@ -1646,6 +1667,7 @@ int dib7000p_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 defau | ||
2884 | return -ENOMEM; | ||
2885 | |||
2886 | dpst->i2c_adap = i2c; | ||
2887 | + mutex_init(&dpst->i2c_buffer_lock); | ||
2888 | |||
2889 | for (k = no_of_demods - 1; k >= 0; k--) { | ||
2890 | dpst->cfg = cfg[k]; | ||
2891 | @@ -2324,6 +2346,7 @@ struct dvb_frontend *dib7000p_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, | ||
2892 | demod = &st->demod; | ||
2893 | demod->demodulator_priv = st; | ||
2894 | memcpy(&st->demod.ops, &dib7000p_ops, sizeof(struct dvb_frontend_ops)); | ||
2895 | + mutex_init(&st->i2c_buffer_lock); | ||
2896 | |||
2897 | dib7000p_write_word(st, 1287, 0x0003); /* sram lead in, rdy */ | ||
2898 | |||
2899 | @@ -2333,8 +2356,9 @@ struct dvb_frontend *dib7000p_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, | ||
2900 | st->version = dib7000p_read_word(st, 897); | ||
2901 | |||
2902 | /* FIXME: make sure the dev.parent field is initialized, or else | ||
2903 | - request_firmware() will hit an OOPS (this should be moved somewhere | ||
2904 | - more common) */ | ||
2905 | + request_firmware() will hit an OOPS (this should be moved somewhere | ||
2906 | + more common) */ | ||
2907 | + st->i2c_master.gated_tuner_i2c_adap.dev.parent = i2c_adap->dev.parent; | ||
2908 | |||
2909 | /* FIXME: make sure the dev.parent field is initialized, or else | ||
2910 | request_firmware() will hit an OOPS (this should be moved somewhere | ||
2911 | diff --git a/drivers/media/dvb/frontends/dib8000.c b/drivers/media/dvb/frontends/dib8000.c | ||
2912 | index 7d2ea11..fe284d5 100644 | ||
2913 | --- a/drivers/media/dvb/frontends/dib8000.c | ||
2914 | +++ b/drivers/media/dvb/frontends/dib8000.c | ||
2915 | @@ -10,6 +10,8 @@ | ||
2916 | #include <linux/kernel.h> | ||
2917 | #include <linux/slab.h> | ||
2918 | #include <linux/i2c.h> | ||
2919 | +#include <linux/mutex.h> | ||
2920 | + | ||
2921 | #include "dvb_math.h" | ||
2922 | |||
2923 | #include "dvb_frontend.h" | ||
2924 | @@ -37,6 +39,7 @@ struct i2c_device { | ||
2925 | u8 addr; | ||
2926 | u8 *i2c_write_buffer; | ||
2927 | u8 *i2c_read_buffer; | ||
2928 | + struct mutex *i2c_buffer_lock; | ||
2929 | }; | ||
2930 | |||
2931 | struct dib8000_state { | ||
2932 | @@ -77,6 +80,7 @@ struct dib8000_state { | ||
2933 | struct i2c_msg msg[2]; | ||
2934 | u8 i2c_write_buffer[4]; | ||
2935 | u8 i2c_read_buffer[2]; | ||
2936 | + struct mutex i2c_buffer_lock; | ||
2937 | }; | ||
2938 | |||
2939 | enum dib8000_power_mode { | ||
2940 | @@ -86,24 +90,39 @@ enum dib8000_power_mode { | ||
2941 | |||
2942 | static u16 dib8000_i2c_read16(struct i2c_device *i2c, u16 reg) | ||
2943 | { | ||
2944 | + u16 ret; | ||
2945 | struct i2c_msg msg[2] = { | ||
2946 | - {.addr = i2c->addr >> 1, .flags = 0, | ||
2947 | - .buf = i2c->i2c_write_buffer, .len = 2}, | ||
2948 | - {.addr = i2c->addr >> 1, .flags = I2C_M_RD, | ||
2949 | - .buf = i2c->i2c_read_buffer, .len = 2}, | ||
2950 | + {.addr = i2c->addr >> 1, .flags = 0, .len = 2}, | ||
2951 | + {.addr = i2c->addr >> 1, .flags = I2C_M_RD, .len = 2}, | ||
2952 | }; | ||
2953 | |||
2954 | + if (mutex_lock_interruptible(i2c->i2c_buffer_lock) < 0) { | ||
2955 | + dprintk("could not acquire lock"); | ||
2956 | + return 0; | ||
2957 | + } | ||
2958 | + | ||
2959 | + msg[0].buf = i2c->i2c_write_buffer; | ||
2960 | msg[0].buf[0] = reg >> 8; | ||
2961 | msg[0].buf[1] = reg & 0xff; | ||
2962 | + msg[1].buf = i2c->i2c_read_buffer; | ||
2963 | |||
2964 | if (i2c_transfer(i2c->adap, msg, 2) != 2) | ||
2965 | dprintk("i2c read error on %d", reg); | ||
2966 | |||
2967 | - return (msg[1].buf[0] << 8) | msg[1].buf[1]; | ||
2968 | + ret = (msg[1].buf[0] << 8) | msg[1].buf[1]; | ||
2969 | + mutex_unlock(i2c->i2c_buffer_lock); | ||
2970 | + return ret; | ||
2971 | } | ||
2972 | |||
2973 | static u16 dib8000_read_word(struct dib8000_state *state, u16 reg) | ||
2974 | { | ||
2975 | + u16 ret; | ||
2976 | + | ||
2977 | + if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) { | ||
2978 | + dprintk("could not acquire lock"); | ||
2979 | + return 0; | ||
2980 | + } | ||
2981 | + | ||
2982 | state->i2c_write_buffer[0] = reg >> 8; | ||
2983 | state->i2c_write_buffer[1] = reg & 0xff; | ||
2984 | |||
2985 | @@ -120,7 +139,10 @@ static u16 dib8000_read_word(struct dib8000_state *state, u16 reg) | ||
2986 | if (i2c_transfer(state->i2c.adap, state->msg, 2) != 2) | ||
2987 | dprintk("i2c read error on %d", reg); | ||
2988 | |||
2989 | - return (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1]; | ||
2990 | + ret = (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1]; | ||
2991 | + mutex_unlock(&state->i2c_buffer_lock); | ||
2992 | + | ||
2993 | + return ret; | ||
2994 | } | ||
2995 | |||
2996 | static u32 dib8000_read32(struct dib8000_state *state, u16 reg) | ||
2997 | @@ -135,22 +157,35 @@ static u32 dib8000_read32(struct dib8000_state *state, u16 reg) | ||
2998 | |||
2999 | static int dib8000_i2c_write16(struct i2c_device *i2c, u16 reg, u16 val) | ||
3000 | { | ||
3001 | - struct i2c_msg msg = {.addr = i2c->addr >> 1, .flags = 0, | ||
3002 | - .buf = i2c->i2c_write_buffer, .len = 4}; | ||
3003 | + struct i2c_msg msg = {.addr = i2c->addr >> 1, .flags = 0, .len = 4}; | ||
3004 | int ret = 0; | ||
3005 | |||
3006 | + if (mutex_lock_interruptible(i2c->i2c_buffer_lock) < 0) { | ||
3007 | + dprintk("could not acquire lock"); | ||
3008 | + return -EINVAL; | ||
3009 | + } | ||
3010 | + | ||
3011 | + msg.buf = i2c->i2c_write_buffer; | ||
3012 | msg.buf[0] = (reg >> 8) & 0xff; | ||
3013 | msg.buf[1] = reg & 0xff; | ||
3014 | msg.buf[2] = (val >> 8) & 0xff; | ||
3015 | msg.buf[3] = val & 0xff; | ||
3016 | |||
3017 | ret = i2c_transfer(i2c->adap, &msg, 1) != 1 ? -EREMOTEIO : 0; | ||
3018 | + mutex_unlock(i2c->i2c_buffer_lock); | ||
3019 | |||
3020 | return ret; | ||
3021 | } | ||
3022 | |||
3023 | static int dib8000_write_word(struct dib8000_state *state, u16 reg, u16 val) | ||
3024 | { | ||
3025 | + int ret; | ||
3026 | + | ||
3027 | + if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) { | ||
3028 | + dprintk("could not acquire lock"); | ||
3029 | + return -EINVAL; | ||
3030 | + } | ||
3031 | + | ||
3032 | state->i2c_write_buffer[0] = (reg >> 8) & 0xff; | ||
3033 | state->i2c_write_buffer[1] = reg & 0xff; | ||
3034 | state->i2c_write_buffer[2] = (val >> 8) & 0xff; | ||
3035 | @@ -162,7 +197,11 @@ static int dib8000_write_word(struct dib8000_state *state, u16 reg, u16 val) | ||
3036 | state->msg[0].buf = state->i2c_write_buffer; | ||
3037 | state->msg[0].len = 4; | ||
3038 | |||
3039 | - return i2c_transfer(state->i2c.adap, state->msg, 1) != 1 ? -EREMOTEIO : 0; | ||
3040 | + ret = (i2c_transfer(state->i2c.adap, state->msg, 1) != 1 ? | ||
3041 | + -EREMOTEIO : 0); | ||
3042 | + mutex_unlock(&state->i2c_buffer_lock); | ||
3043 | + | ||
3044 | + return ret; | ||
3045 | } | ||
3046 | |||
3047 | static const s16 coeff_2k_sb_1seg_dqpsk[8] = { | ||
3048 | @@ -2434,8 +2473,15 @@ int dib8000_i2c_enumeration(struct i2c_adapter *host, int no_of_demods, u8 defau | ||
3049 | if (!client.i2c_read_buffer) { | ||
3050 | dprintk("%s: not enough memory", __func__); | ||
3051 | ret = -ENOMEM; | ||
3052 | - goto error_memory; | ||
3053 | + goto error_memory_read; | ||
3054 | + } | ||
3055 | + client.i2c_buffer_lock = kzalloc(sizeof(struct mutex), GFP_KERNEL); | ||
3056 | + if (!client.i2c_buffer_lock) { | ||
3057 | + dprintk("%s: not enough memory", __func__); | ||
3058 | + ret = -ENOMEM; | ||
3059 | + goto error_memory_lock; | ||
3060 | } | ||
3061 | + mutex_init(client.i2c_buffer_lock); | ||
3062 | |||
3063 | for (k = no_of_demods - 1; k >= 0; k--) { | ||
3064 | /* designated i2c address */ | ||
3065 | @@ -2476,8 +2522,10 @@ int dib8000_i2c_enumeration(struct i2c_adapter *host, int no_of_demods, u8 defau | ||
3066 | } | ||
3067 | |||
3068 | error: | ||
3069 | + kfree(client.i2c_buffer_lock); | ||
3070 | +error_memory_lock: | ||
3071 | kfree(client.i2c_read_buffer); | ||
3072 | -error_memory: | ||
3073 | +error_memory_read: | ||
3074 | kfree(client.i2c_write_buffer); | ||
3075 | |||
3076 | return ret; | ||
3077 | @@ -2581,6 +2629,8 @@ struct dvb_frontend *dib8000_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, s | ||
3078 | state->i2c.addr = i2c_addr; | ||
3079 | state->i2c.i2c_write_buffer = state->i2c_write_buffer; | ||
3080 | state->i2c.i2c_read_buffer = state->i2c_read_buffer; | ||
3081 | + mutex_init(&state->i2c_buffer_lock); | ||
3082 | + state->i2c.i2c_buffer_lock = &state->i2c_buffer_lock; | ||
3083 | state->gpio_val = cfg->gpio_val; | ||
3084 | state->gpio_dir = cfg->gpio_dir; | ||
3085 | |||
3086 | diff --git a/drivers/media/dvb/frontends/dib9000.c b/drivers/media/dvb/frontends/dib9000.c | ||
3087 | index a085588..b931074 100644 | ||
3088 | --- a/drivers/media/dvb/frontends/dib9000.c | ||
3089 | +++ b/drivers/media/dvb/frontends/dib9000.c | ||
3090 | @@ -38,6 +38,15 @@ struct i2c_device { | ||
3091 | #define DibInitLock(lock) mutex_init(lock) | ||
3092 | #define DibFreeLock(lock) | ||
3093 | |||
3094 | +struct dib9000_pid_ctrl { | ||
3095 | +#define DIB9000_PID_FILTER_CTRL 0 | ||
3096 | +#define DIB9000_PID_FILTER 1 | ||
3097 | + u8 cmd; | ||
3098 | + u8 id; | ||
3099 | + u16 pid; | ||
3100 | + u8 onoff; | ||
3101 | +}; | ||
3102 | + | ||
3103 | struct dib9000_state { | ||
3104 | struct i2c_device i2c; | ||
3105 | |||
3106 | @@ -99,6 +108,10 @@ struct dib9000_state { | ||
3107 | struct i2c_msg msg[2]; | ||
3108 | u8 i2c_write_buffer[255]; | ||
3109 | u8 i2c_read_buffer[255]; | ||
3110 | + DIB_LOCK demod_lock; | ||
3111 | + u8 get_frontend_internal; | ||
3112 | + struct dib9000_pid_ctrl pid_ctrl[10]; | ||
3113 | + s8 pid_ctrl_index; /* -1: empty list; -2: do not use the list */ | ||
3114 | }; | ||
3115 | |||
3116 | static const u32 fe_info[44] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
3117 | @@ -1743,19 +1756,56 @@ EXPORT_SYMBOL(dib9000_set_gpio); | ||
3118 | int dib9000_fw_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff) | ||
3119 | { | ||
3120 | struct dib9000_state *state = fe->demodulator_priv; | ||
3121 | - u16 val = dib9000_read_word(state, 294 + 1) & 0xffef; | ||
3122 | + u16 val; | ||
3123 | + int ret; | ||
3124 | + | ||
3125 | + if ((state->pid_ctrl_index != -2) && (state->pid_ctrl_index < 9)) { | ||
3126 | + /* postpone the pid filtering cmd */ | ||
3127 | + dprintk("pid filter cmd postpone"); | ||
3128 | + state->pid_ctrl_index++; | ||
3129 | + state->pid_ctrl[state->pid_ctrl_index].cmd = DIB9000_PID_FILTER_CTRL; | ||
3130 | + state->pid_ctrl[state->pid_ctrl_index].onoff = onoff; | ||
3131 | + return 0; | ||
3132 | + } | ||
3133 | + | ||
3134 | + DibAcquireLock(&state->demod_lock); | ||
3135 | + | ||
3136 | + val = dib9000_read_word(state, 294 + 1) & 0xffef; | ||
3137 | val |= (onoff & 0x1) << 4; | ||
3138 | |||
3139 | dprintk("PID filter enabled %d", onoff); | ||
3140 | - return dib9000_write_word(state, 294 + 1, val); | ||
3141 | + ret = dib9000_write_word(state, 294 + 1, val); | ||
3142 | + DibReleaseLock(&state->demod_lock); | ||
3143 | + return ret; | ||
3144 | + | ||
3145 | } | ||
3146 | EXPORT_SYMBOL(dib9000_fw_pid_filter_ctrl); | ||
3147 | |||
3148 | int dib9000_fw_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff) | ||
3149 | { | ||
3150 | struct dib9000_state *state = fe->demodulator_priv; | ||
3151 | + int ret; | ||
3152 | + | ||
3153 | + if (state->pid_ctrl_index != -2) { | ||
3154 | + /* postpone the pid filtering cmd */ | ||
3155 | + dprintk("pid filter postpone"); | ||
3156 | + if (state->pid_ctrl_index < 9) { | ||
3157 | + state->pid_ctrl_index++; | ||
3158 | + state->pid_ctrl[state->pid_ctrl_index].cmd = DIB9000_PID_FILTER; | ||
3159 | + state->pid_ctrl[state->pid_ctrl_index].id = id; | ||
3160 | + state->pid_ctrl[state->pid_ctrl_index].pid = pid; | ||
3161 | + state->pid_ctrl[state->pid_ctrl_index].onoff = onoff; | ||
3162 | + } else | ||
3163 | + dprintk("can not add any more pid ctrl cmd"); | ||
3164 | + return 0; | ||
3165 | + } | ||
3166 | + | ||
3167 | + DibAcquireLock(&state->demod_lock); | ||
3168 | dprintk("Index %x, PID %d, OnOff %d", id, pid, onoff); | ||
3169 | - return dib9000_write_word(state, 300 + 1 + id, onoff ? (1 << 13) | pid : 0); | ||
3170 | + ret = dib9000_write_word(state, 300 + 1 + id, | ||
3171 | + onoff ? (1 << 13) | pid : 0); | ||
3172 | + DibReleaseLock(&state->demod_lock); | ||
3173 | + return ret; | ||
3174 | } | ||
3175 | EXPORT_SYMBOL(dib9000_fw_pid_filter); | ||
3176 | |||
3177 | @@ -1778,6 +1828,7 @@ static void dib9000_release(struct dvb_frontend *demod) | ||
3178 | DibFreeLock(&state->platform.risc.mbx_lock); | ||
3179 | DibFreeLock(&state->platform.risc.mem_lock); | ||
3180 | DibFreeLock(&state->platform.risc.mem_mbx_lock); | ||
3181 | + DibFreeLock(&state->demod_lock); | ||
3182 | dibx000_exit_i2c_master(&st->i2c_master); | ||
3183 | |||
3184 | i2c_del_adapter(&st->tuner_adap); | ||
3185 | @@ -1795,14 +1846,19 @@ static int dib9000_sleep(struct dvb_frontend *fe) | ||
3186 | { | ||
3187 | struct dib9000_state *state = fe->demodulator_priv; | ||
3188 | u8 index_frontend; | ||
3189 | - int ret; | ||
3190 | + int ret = 0; | ||
3191 | |||
3192 | + DibAcquireLock(&state->demod_lock); | ||
3193 | for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) { | ||
3194 | ret = state->fe[index_frontend]->ops.sleep(state->fe[index_frontend]); | ||
3195 | if (ret < 0) | ||
3196 | - return ret; | ||
3197 | + goto error; | ||
3198 | } | ||
3199 | - return dib9000_mbx_send(state, OUT_MSG_FE_SLEEP, NULL, 0); | ||
3200 | + ret = dib9000_mbx_send(state, OUT_MSG_FE_SLEEP, NULL, 0); | ||
3201 | + | ||
3202 | +error: | ||
3203 | + DibReleaseLock(&state->demod_lock); | ||
3204 | + return ret; | ||
3205 | } | ||
3206 | |||
3207 | static int dib9000_fe_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings *tune) | ||
3208 | @@ -1816,7 +1872,10 @@ static int dib9000_get_frontend(struct dvb_frontend *fe, struct dvb_frontend_par | ||
3209 | struct dib9000_state *state = fe->demodulator_priv; | ||
3210 | u8 index_frontend, sub_index_frontend; | ||
3211 | fe_status_t stat; | ||
3212 | - int ret; | ||
3213 | + int ret = 0; | ||
3214 | + | ||
3215 | + if (state->get_frontend_internal == 0) | ||
3216 | + DibAcquireLock(&state->demod_lock); | ||
3217 | |||
3218 | for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) { | ||
3219 | state->fe[index_frontend]->ops.read_status(state->fe[index_frontend], &stat); | ||
3220 | @@ -1846,14 +1905,15 @@ static int dib9000_get_frontend(struct dvb_frontend *fe, struct dvb_frontend_par | ||
3221 | state->fe[index_frontend]->dtv_property_cache.rolloff; | ||
3222 | } | ||
3223 | } | ||
3224 | - return 0; | ||
3225 | + ret = 0; | ||
3226 | + goto return_value; | ||
3227 | } | ||
3228 | } | ||
3229 | |||
3230 | /* get the channel from master chip */ | ||
3231 | ret = dib9000_fw_get_channel(fe, fep); | ||
3232 | if (ret != 0) | ||
3233 | - return ret; | ||
3234 | + goto return_value; | ||
3235 | |||
3236 | /* synchronize the cache with the other frontends */ | ||
3237 | for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) { | ||
3238 | @@ -1866,8 +1926,12 @@ static int dib9000_get_frontend(struct dvb_frontend *fe, struct dvb_frontend_par | ||
3239 | state->fe[index_frontend]->dtv_property_cache.code_rate_LP = fe->dtv_property_cache.code_rate_LP; | ||
3240 | state->fe[index_frontend]->dtv_property_cache.rolloff = fe->dtv_property_cache.rolloff; | ||
3241 | } | ||
3242 | + ret = 0; | ||
3243 | |||
3244 | - return 0; | ||
3245 | +return_value: | ||
3246 | + if (state->get_frontend_internal == 0) | ||
3247 | + DibReleaseLock(&state->demod_lock); | ||
3248 | + return ret; | ||
3249 | } | ||
3250 | |||
3251 | static int dib9000_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state) | ||
3252 | @@ -1912,6 +1976,10 @@ static int dib9000_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_par | ||
3253 | dprintk("dib9000: must specify bandwidth "); | ||
3254 | return 0; | ||
3255 | } | ||
3256 | + | ||
3257 | + state->pid_ctrl_index = -1; /* postpone the pid filtering cmd */ | ||
3258 | + DibAcquireLock(&state->demod_lock); | ||
3259 | + | ||
3260 | fe->dtv_property_cache.delivery_system = SYS_DVBT; | ||
3261 | |||
3262 | /* set the master status */ | ||
3263 | @@ -1974,13 +2042,18 @@ static int dib9000_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_par | ||
3264 | /* check the tune result */ | ||
3265 | if (exit_condition == 1) { /* tune failed */ | ||
3266 | dprintk("tune failed"); | ||
3267 | + DibReleaseLock(&state->demod_lock); | ||
3268 | + /* tune failed; put all the pid filtering cmd to junk */ | ||
3269 | + state->pid_ctrl_index = -1; | ||
3270 | return 0; | ||
3271 | } | ||
3272 | |||
3273 | dprintk("tune success on frontend%i", index_frontend_success); | ||
3274 | |||
3275 | /* synchronize all the channel cache */ | ||
3276 | + state->get_frontend_internal = 1; | ||
3277 | dib9000_get_frontend(state->fe[0], fep); | ||
3278 | + state->get_frontend_internal = 0; | ||
3279 | |||
3280 | /* retune the other frontends with the found channel */ | ||
3281 | channel_status.status = CHANNEL_STATUS_PARAMETERS_SET; | ||
3282 | @@ -2025,6 +2098,28 @@ static int dib9000_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_par | ||
3283 | /* turn off the diversity for the last frontend */ | ||
3284 | dib9000_fw_set_diversity_in(state->fe[index_frontend - 1], 0); | ||
3285 | |||
3286 | + DibReleaseLock(&state->demod_lock); | ||
3287 | + if (state->pid_ctrl_index >= 0) { | ||
3288 | + u8 index_pid_filter_cmd; | ||
3289 | + u8 pid_ctrl_index = state->pid_ctrl_index; | ||
3290 | + | ||
3291 | + state->pid_ctrl_index = -2; | ||
3292 | + for (index_pid_filter_cmd = 0; | ||
3293 | + index_pid_filter_cmd <= pid_ctrl_index; | ||
3294 | + index_pid_filter_cmd++) { | ||
3295 | + if (state->pid_ctrl[index_pid_filter_cmd].cmd == DIB9000_PID_FILTER_CTRL) | ||
3296 | + dib9000_fw_pid_filter_ctrl(state->fe[0], | ||
3297 | + state->pid_ctrl[index_pid_filter_cmd].onoff); | ||
3298 | + else if (state->pid_ctrl[index_pid_filter_cmd].cmd == DIB9000_PID_FILTER) | ||
3299 | + dib9000_fw_pid_filter(state->fe[0], | ||
3300 | + state->pid_ctrl[index_pid_filter_cmd].id, | ||
3301 | + state->pid_ctrl[index_pid_filter_cmd].pid, | ||
3302 | + state->pid_ctrl[index_pid_filter_cmd].onoff); | ||
3303 | + } | ||
3304 | + } | ||
3305 | + /* do not postpone any more the pid filtering */ | ||
3306 | + state->pid_ctrl_index = -2; | ||
3307 | + | ||
3308 | return 0; | ||
3309 | } | ||
3310 | |||
3311 | @@ -2041,6 +2136,7 @@ static int dib9000_read_status(struct dvb_frontend *fe, fe_status_t * stat) | ||
3312 | u8 index_frontend; | ||
3313 | u16 lock = 0, lock_slave = 0; | ||
3314 | |||
3315 | + DibAcquireLock(&state->demod_lock); | ||
3316 | for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) | ||
3317 | lock_slave |= dib9000_read_lock(state->fe[index_frontend]); | ||
3318 | |||
3319 | @@ -2059,6 +2155,8 @@ static int dib9000_read_status(struct dvb_frontend *fe, fe_status_t * stat) | ||
3320 | if ((lock & 0x0008) || (lock_slave & 0x0008)) | ||
3321 | *stat |= FE_HAS_LOCK; | ||
3322 | |||
3323 | + DibReleaseLock(&state->demod_lock); | ||
3324 | + | ||
3325 | return 0; | ||
3326 | } | ||
3327 | |||
3328 | @@ -2066,10 +2164,14 @@ static int dib9000_read_ber(struct dvb_frontend *fe, u32 * ber) | ||
3329 | { | ||
3330 | struct dib9000_state *state = fe->demodulator_priv; | ||
3331 | u16 *c; | ||
3332 | + int ret = 0; | ||
3333 | |||
3334 | + DibAcquireLock(&state->demod_lock); | ||
3335 | DibAcquireLock(&state->platform.risc.mem_mbx_lock); | ||
3336 | - if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) | ||
3337 | - return -EIO; | ||
3338 | + if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) { | ||
3339 | + ret = -EIO; | ||
3340 | + goto error; | ||
3341 | + } | ||
3342 | dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, | ||
3343 | state->i2c_read_buffer, 16 * 2); | ||
3344 | DibReleaseLock(&state->platform.risc.mem_mbx_lock); | ||
3345 | @@ -2077,7 +2179,10 @@ static int dib9000_read_ber(struct dvb_frontend *fe, u32 * ber) | ||
3346 | c = (u16 *)state->i2c_read_buffer; | ||
3347 | |||
3348 | *ber = c[10] << 16 | c[11]; | ||
3349 | - return 0; | ||
3350 | + | ||
3351 | +error: | ||
3352 | + DibReleaseLock(&state->demod_lock); | ||
3353 | + return ret; | ||
3354 | } | ||
3355 | |||
3356 | static int dib9000_read_signal_strength(struct dvb_frontend *fe, u16 * strength) | ||
3357 | @@ -2086,7 +2191,9 @@ static int dib9000_read_signal_strength(struct dvb_frontend *fe, u16 * strength) | ||
3358 | u8 index_frontend; | ||
3359 | u16 *c = (u16 *)state->i2c_read_buffer; | ||
3360 | u16 val; | ||
3361 | + int ret = 0; | ||
3362 | |||
3363 | + DibAcquireLock(&state->demod_lock); | ||
3364 | *strength = 0; | ||
3365 | for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) { | ||
3366 | state->fe[index_frontend]->ops.read_signal_strength(state->fe[index_frontend], &val); | ||
3367 | @@ -2097,8 +2204,10 @@ static int dib9000_read_signal_strength(struct dvb_frontend *fe, u16 * strength) | ||
3368 | } | ||
3369 | |||
3370 | DibAcquireLock(&state->platform.risc.mem_mbx_lock); | ||
3371 | - if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) | ||
3372 | - return -EIO; | ||
3373 | + if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) { | ||
3374 | + ret = -EIO; | ||
3375 | + goto error; | ||
3376 | + } | ||
3377 | dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2); | ||
3378 | DibReleaseLock(&state->platform.risc.mem_mbx_lock); | ||
3379 | |||
3380 | @@ -2107,7 +2216,10 @@ static int dib9000_read_signal_strength(struct dvb_frontend *fe, u16 * strength) | ||
3381 | *strength = 65535; | ||
3382 | else | ||
3383 | *strength += val; | ||
3384 | - return 0; | ||
3385 | + | ||
3386 | +error: | ||
3387 | + DibReleaseLock(&state->demod_lock); | ||
3388 | + return ret; | ||
3389 | } | ||
3390 | |||
3391 | static u32 dib9000_get_snr(struct dvb_frontend *fe) | ||
3392 | @@ -2151,6 +2263,7 @@ static int dib9000_read_snr(struct dvb_frontend *fe, u16 * snr) | ||
3393 | u8 index_frontend; | ||
3394 | u32 snr_master; | ||
3395 | |||
3396 | + DibAcquireLock(&state->demod_lock); | ||
3397 | snr_master = dib9000_get_snr(fe); | ||
3398 | for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) | ||
3399 | snr_master += dib9000_get_snr(state->fe[index_frontend]); | ||
3400 | @@ -2161,6 +2274,8 @@ static int dib9000_read_snr(struct dvb_frontend *fe, u16 * snr) | ||
3401 | } else | ||
3402 | *snr = 0; | ||
3403 | |||
3404 | + DibReleaseLock(&state->demod_lock); | ||
3405 | + | ||
3406 | return 0; | ||
3407 | } | ||
3408 | |||
3409 | @@ -2168,15 +2283,22 @@ static int dib9000_read_unc_blocks(struct dvb_frontend *fe, u32 * unc) | ||
3410 | { | ||
3411 | struct dib9000_state *state = fe->demodulator_priv; | ||
3412 | u16 *c = (u16 *)state->i2c_read_buffer; | ||
3413 | + int ret = 0; | ||
3414 | |||
3415 | + DibAcquireLock(&state->demod_lock); | ||
3416 | DibAcquireLock(&state->platform.risc.mem_mbx_lock); | ||
3417 | - if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) | ||
3418 | - return -EIO; | ||
3419 | + if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) { | ||
3420 | + ret = -EIO; | ||
3421 | + goto error; | ||
3422 | + } | ||
3423 | dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2); | ||
3424 | DibReleaseLock(&state->platform.risc.mem_mbx_lock); | ||
3425 | |||
3426 | *unc = c[12]; | ||
3427 | - return 0; | ||
3428 | + | ||
3429 | +error: | ||
3430 | + DibReleaseLock(&state->demod_lock); | ||
3431 | + return ret; | ||
3432 | } | ||
3433 | |||
3434 | int dib9000_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, u8 first_addr) | ||
3435 | @@ -2322,6 +2444,10 @@ struct dvb_frontend *dib9000_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, c | ||
3436 | DibInitLock(&st->platform.risc.mbx_lock); | ||
3437 | DibInitLock(&st->platform.risc.mem_lock); | ||
3438 | DibInitLock(&st->platform.risc.mem_mbx_lock); | ||
3439 | + DibInitLock(&st->demod_lock); | ||
3440 | + st->get_frontend_internal = 0; | ||
3441 | + | ||
3442 | + st->pid_ctrl_index = -2; | ||
3443 | |||
3444 | st->fe[0] = fe; | ||
3445 | fe->demodulator_priv = st; | ||
3446 | diff --git a/drivers/media/dvb/frontends/dibx000_common.c b/drivers/media/dvb/frontends/dibx000_common.c | ||
3447 | index dc5d17a..774d507 100644 | ||
3448 | --- a/drivers/media/dvb/frontends/dibx000_common.c | ||
3449 | +++ b/drivers/media/dvb/frontends/dibx000_common.c | ||
3450 | @@ -1,4 +1,5 @@ | ||
3451 | #include <linux/i2c.h> | ||
3452 | +#include <linux/mutex.h> | ||
3453 | |||
3454 | #include "dibx000_common.h" | ||
3455 | |||
3456 | @@ -10,6 +11,13 @@ MODULE_PARM_DESC(debug, "turn on debugging (default: 0)"); | ||
3457 | |||
3458 | static int dibx000_write_word(struct dibx000_i2c_master *mst, u16 reg, u16 val) | ||
3459 | { | ||
3460 | + int ret; | ||
3461 | + | ||
3462 | + if (mutex_lock_interruptible(&mst->i2c_buffer_lock) < 0) { | ||
3463 | + dprintk("could not acquire lock"); | ||
3464 | + return -EINVAL; | ||
3465 | + } | ||
3466 | + | ||
3467 | mst->i2c_write_buffer[0] = (reg >> 8) & 0xff; | ||
3468 | mst->i2c_write_buffer[1] = reg & 0xff; | ||
3469 | mst->i2c_write_buffer[2] = (val >> 8) & 0xff; | ||
3470 | @@ -21,11 +29,21 @@ static int dibx000_write_word(struct dibx000_i2c_master *mst, u16 reg, u16 val) | ||
3471 | mst->msg[0].buf = mst->i2c_write_buffer; | ||
3472 | mst->msg[0].len = 4; | ||
3473 | |||
3474 | - return i2c_transfer(mst->i2c_adap, mst->msg, 1) != 1 ? -EREMOTEIO : 0; | ||
3475 | + ret = i2c_transfer(mst->i2c_adap, mst->msg, 1) != 1 ? -EREMOTEIO : 0; | ||
3476 | + mutex_unlock(&mst->i2c_buffer_lock); | ||
3477 | + | ||
3478 | + return ret; | ||
3479 | } | ||
3480 | |||
3481 | static u16 dibx000_read_word(struct dibx000_i2c_master *mst, u16 reg) | ||
3482 | { | ||
3483 | + u16 ret; | ||
3484 | + | ||
3485 | + if (mutex_lock_interruptible(&mst->i2c_buffer_lock) < 0) { | ||
3486 | + dprintk("could not acquire lock"); | ||
3487 | + return 0; | ||
3488 | + } | ||
3489 | + | ||
3490 | mst->i2c_write_buffer[0] = reg >> 8; | ||
3491 | mst->i2c_write_buffer[1] = reg & 0xff; | ||
3492 | |||
3493 | @@ -42,7 +60,10 @@ static u16 dibx000_read_word(struct dibx000_i2c_master *mst, u16 reg) | ||
3494 | if (i2c_transfer(mst->i2c_adap, mst->msg, 2) != 2) | ||
3495 | dprintk("i2c read error on %d", reg); | ||
3496 | |||
3497 | - return (mst->i2c_read_buffer[0] << 8) | mst->i2c_read_buffer[1]; | ||
3498 | + ret = (mst->i2c_read_buffer[0] << 8) | mst->i2c_read_buffer[1]; | ||
3499 | + mutex_unlock(&mst->i2c_buffer_lock); | ||
3500 | + | ||
3501 | + return ret; | ||
3502 | } | ||
3503 | |||
3504 | static int dibx000_is_i2c_done(struct dibx000_i2c_master *mst) | ||
3505 | @@ -257,6 +278,7 @@ static int dibx000_i2c_gated_gpio67_xfer(struct i2c_adapter *i2c_adap, | ||
3506 | struct i2c_msg msg[], int num) | ||
3507 | { | ||
3508 | struct dibx000_i2c_master *mst = i2c_get_adapdata(i2c_adap); | ||
3509 | + int ret; | ||
3510 | |||
3511 | if (num > 32) { | ||
3512 | dprintk("%s: too much I2C message to be transmitted (%i).\ | ||
3513 | @@ -264,10 +286,15 @@ static int dibx000_i2c_gated_gpio67_xfer(struct i2c_adapter *i2c_adap, | ||
3514 | return -ENOMEM; | ||
3515 | } | ||
3516 | |||
3517 | - memset(mst->msg, 0, sizeof(struct i2c_msg) * (2 + num)); | ||
3518 | - | ||
3519 | dibx000_i2c_select_interface(mst, DIBX000_I2C_INTERFACE_GPIO_6_7); | ||
3520 | |||
3521 | + if (mutex_lock_interruptible(&mst->i2c_buffer_lock) < 0) { | ||
3522 | + dprintk("could not acquire lock"); | ||
3523 | + return -EINVAL; | ||
3524 | + } | ||
3525 | + | ||
3526 | + memset(mst->msg, 0, sizeof(struct i2c_msg) * (2 + num)); | ||
3527 | + | ||
3528 | /* open the gate */ | ||
3529 | dibx000_i2c_gate_ctrl(mst, &mst->i2c_write_buffer[0], msg[0].addr, 1); | ||
3530 | mst->msg[0].addr = mst->i2c_addr; | ||
3531 | @@ -282,7 +309,11 @@ static int dibx000_i2c_gated_gpio67_xfer(struct i2c_adapter *i2c_adap, | ||
3532 | mst->msg[num + 1].buf = &mst->i2c_write_buffer[4]; | ||
3533 | mst->msg[num + 1].len = 4; | ||
3534 | |||
3535 | - return i2c_transfer(mst->i2c_adap, mst->msg, 2 + num) == 2 + num ? num : -EIO; | ||
3536 | + ret = (i2c_transfer(mst->i2c_adap, mst->msg, 2 + num) == 2 + num ? | ||
3537 | + num : -EIO); | ||
3538 | + | ||
3539 | + mutex_unlock(&mst->i2c_buffer_lock); | ||
3540 | + return ret; | ||
3541 | } | ||
3542 | |||
3543 | static struct i2c_algorithm dibx000_i2c_gated_gpio67_algo = { | ||
3544 | @@ -294,6 +325,7 @@ static int dibx000_i2c_gated_tuner_xfer(struct i2c_adapter *i2c_adap, | ||
3545 | struct i2c_msg msg[], int num) | ||
3546 | { | ||
3547 | struct dibx000_i2c_master *mst = i2c_get_adapdata(i2c_adap); | ||
3548 | + int ret; | ||
3549 | |||
3550 | if (num > 32) { | ||
3551 | dprintk("%s: too much I2C message to be transmitted (%i).\ | ||
3552 | @@ -301,10 +333,14 @@ static int dibx000_i2c_gated_tuner_xfer(struct i2c_adapter *i2c_adap, | ||
3553 | return -ENOMEM; | ||
3554 | } | ||
3555 | |||
3556 | - memset(mst->msg, 0, sizeof(struct i2c_msg) * (2 + num)); | ||
3557 | - | ||
3558 | dibx000_i2c_select_interface(mst, DIBX000_I2C_INTERFACE_TUNER); | ||
3559 | |||
3560 | + if (mutex_lock_interruptible(&mst->i2c_buffer_lock) < 0) { | ||
3561 | + dprintk("could not acquire lock"); | ||
3562 | + return -EINVAL; | ||
3563 | + } | ||
3564 | + memset(mst->msg, 0, sizeof(struct i2c_msg) * (2 + num)); | ||
3565 | + | ||
3566 | /* open the gate */ | ||
3567 | dibx000_i2c_gate_ctrl(mst, &mst->i2c_write_buffer[0], msg[0].addr, 1); | ||
3568 | mst->msg[0].addr = mst->i2c_addr; | ||
3569 | @@ -319,7 +355,10 @@ static int dibx000_i2c_gated_tuner_xfer(struct i2c_adapter *i2c_adap, | ||
3570 | mst->msg[num + 1].buf = &mst->i2c_write_buffer[4]; | ||
3571 | mst->msg[num + 1].len = 4; | ||
3572 | |||
3573 | - return i2c_transfer(mst->i2c_adap, mst->msg, 2 + num) == 2 + num ? num : -EIO; | ||
3574 | + ret = (i2c_transfer(mst->i2c_adap, mst->msg, 2 + num) == 2 + num ? | ||
3575 | + num : -EIO); | ||
3576 | + mutex_unlock(&mst->i2c_buffer_lock); | ||
3577 | + return ret; | ||
3578 | } | ||
3579 | |||
3580 | static struct i2c_algorithm dibx000_i2c_gated_tuner_algo = { | ||
3581 | @@ -390,8 +429,18 @@ static int i2c_adapter_init(struct i2c_adapter *i2c_adap, | ||
3582 | int dibx000_init_i2c_master(struct dibx000_i2c_master *mst, u16 device_rev, | ||
3583 | struct i2c_adapter *i2c_adap, u8 i2c_addr) | ||
3584 | { | ||
3585 | - u8 tx[4]; | ||
3586 | - struct i2c_msg m = {.addr = i2c_addr >> 1,.buf = tx,.len = 4 }; | ||
3587 | + int ret; | ||
3588 | + | ||
3589 | + mutex_init(&mst->i2c_buffer_lock); | ||
3590 | + if (mutex_lock_interruptible(&mst->i2c_buffer_lock) < 0) { | ||
3591 | + dprintk("could not acquire lock"); | ||
3592 | + return -EINVAL; | ||
3593 | + } | ||
3594 | + memset(mst->msg, 0, sizeof(struct i2c_msg)); | ||
3595 | + mst->msg[0].addr = i2c_addr >> 1; | ||
3596 | + mst->msg[0].flags = 0; | ||
3597 | + mst->msg[0].buf = mst->i2c_write_buffer; | ||
3598 | + mst->msg[0].len = 4; | ||
3599 | |||
3600 | mst->device_rev = device_rev; | ||
3601 | mst->i2c_adap = i2c_adap; | ||
3602 | @@ -431,9 +480,12 @@ int dibx000_init_i2c_master(struct dibx000_i2c_master *mst, u16 device_rev, | ||
3603 | "DiBX000: could not initialize the master i2c_adapter\n"); | ||
3604 | |||
3605 | /* initialize the i2c-master by closing the gate */ | ||
3606 | - dibx000_i2c_gate_ctrl(mst, tx, 0, 0); | ||
3607 | + dibx000_i2c_gate_ctrl(mst, mst->i2c_write_buffer, 0, 0); | ||
3608 | + | ||
3609 | + ret = (i2c_transfer(i2c_adap, mst->msg, 1) == 1); | ||
3610 | + mutex_unlock(&mst->i2c_buffer_lock); | ||
3611 | |||
3612 | - return i2c_transfer(i2c_adap, &m, 1) == 1; | ||
3613 | + return ret; | ||
3614 | } | ||
3615 | |||
3616 | EXPORT_SYMBOL(dibx000_init_i2c_master); | ||
3617 | diff --git a/drivers/media/dvb/frontends/dibx000_common.h b/drivers/media/dvb/frontends/dibx000_common.h | ||
3618 | index f031165..5e01147 100644 | ||
3619 | --- a/drivers/media/dvb/frontends/dibx000_common.h | ||
3620 | +++ b/drivers/media/dvb/frontends/dibx000_common.h | ||
3621 | @@ -33,6 +33,7 @@ struct dibx000_i2c_master { | ||
3622 | struct i2c_msg msg[34]; | ||
3623 | u8 i2c_write_buffer[8]; | ||
3624 | u8 i2c_read_buffer[2]; | ||
3625 | + struct mutex i2c_buffer_lock; | ||
3626 | }; | ||
3627 | |||
3628 | extern int dibx000_init_i2c_master(struct dibx000_i2c_master *mst, | ||
3629 | diff --git a/drivers/media/video/cx23885/cx23885-dvb.c b/drivers/media/video/cx23885/cx23885-dvb.c | ||
3630 | index aa83f07..bcb45be 100644 | ||
3631 | --- a/drivers/media/video/cx23885/cx23885-dvb.c | ||
3632 | +++ b/drivers/media/video/cx23885/cx23885-dvb.c | ||
3633 | @@ -844,7 +844,7 @@ static int dvb_register(struct cx23885_tsport *port) | ||
3634 | static struct xc2028_ctrl ctl = { | ||
3635 | .fname = XC3028L_DEFAULT_FIRMWARE, | ||
3636 | .max_len = 64, | ||
3637 | - .demod = 5000, | ||
3638 | + .demod = XC3028_FE_DIBCOM52, | ||
3639 | /* This is true for all demods with | ||
3640 | v36 firmware? */ | ||
3641 | .type = XC2028_D2633, | ||
3642 | diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c | ||
3643 | index b27b940..d637982 100644 | ||
3644 | --- a/drivers/mmc/core/core.c | ||
3645 | +++ b/drivers/mmc/core/core.c | ||
3646 | @@ -1151,7 +1151,7 @@ static void mmc_power_up(struct mmc_host *host) | ||
3647 | mmc_host_clk_release(host); | ||
3648 | } | ||
3649 | |||
3650 | -static void mmc_power_off(struct mmc_host *host) | ||
3651 | +void mmc_power_off(struct mmc_host *host) | ||
3652 | { | ||
3653 | mmc_host_clk_hold(host); | ||
3654 | |||
3655 | @@ -1241,8 +1241,7 @@ void mmc_attach_bus(struct mmc_host *host, const struct mmc_bus_ops *ops) | ||
3656 | } | ||
3657 | |||
3658 | /* | ||
3659 | - * Remove the current bus handler from a host. Assumes that there are | ||
3660 | - * no interesting cards left, so the bus is powered down. | ||
3661 | + * Remove the current bus handler from a host. | ||
3662 | */ | ||
3663 | void mmc_detach_bus(struct mmc_host *host) | ||
3664 | { | ||
3665 | @@ -1259,8 +1258,6 @@ void mmc_detach_bus(struct mmc_host *host) | ||
3666 | |||
3667 | spin_unlock_irqrestore(&host->lock, flags); | ||
3668 | |||
3669 | - mmc_power_off(host); | ||
3670 | - | ||
3671 | mmc_bus_put(host); | ||
3672 | } | ||
3673 | |||
3674 | @@ -1845,6 +1842,7 @@ void mmc_stop_host(struct mmc_host *host) | ||
3675 | |||
3676 | mmc_claim_host(host); | ||
3677 | mmc_detach_bus(host); | ||
3678 | + mmc_power_off(host); | ||
3679 | mmc_release_host(host); | ||
3680 | mmc_bus_put(host); | ||
3681 | return; | ||
3682 | @@ -1974,6 +1972,7 @@ int mmc_suspend_host(struct mmc_host *host) | ||
3683 | host->bus_ops->remove(host); | ||
3684 | mmc_claim_host(host); | ||
3685 | mmc_detach_bus(host); | ||
3686 | + mmc_power_off(host); | ||
3687 | mmc_release_host(host); | ||
3688 | host->pm_flags = 0; | ||
3689 | err = 0; | ||
3690 | @@ -2061,6 +2060,7 @@ int mmc_pm_notify(struct notifier_block *notify_block, | ||
3691 | host->bus_ops->remove(host); | ||
3692 | |||
3693 | mmc_detach_bus(host); | ||
3694 | + mmc_power_off(host); | ||
3695 | mmc_release_host(host); | ||
3696 | host->pm_flags = 0; | ||
3697 | break; | ||
3698 | diff --git a/drivers/mmc/core/core.h b/drivers/mmc/core/core.h | ||
3699 | index d9411ed..14664f1 100644 | ||
3700 | --- a/drivers/mmc/core/core.h | ||
3701 | +++ b/drivers/mmc/core/core.h | ||
3702 | @@ -43,6 +43,7 @@ int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage, | ||
3703 | bool cmd11); | ||
3704 | void mmc_set_timing(struct mmc_host *host, unsigned int timing); | ||
3705 | void mmc_set_driver_type(struct mmc_host *host, unsigned int drv_type); | ||
3706 | +void mmc_power_off(struct mmc_host *host); | ||
3707 | |||
3708 | static inline void mmc_delay(unsigned int ms) | ||
3709 | { | ||
3710 | diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c | ||
3711 | index 5700b1c..6952f77 100644 | ||
3712 | --- a/drivers/mmc/core/mmc.c | ||
3713 | +++ b/drivers/mmc/core/mmc.c | ||
3714 | @@ -359,6 +359,7 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) | ||
3715 | * card has the Enhanced area enabled. If so, export enhanced | ||
3716 | * area offset and size to user by adding sysfs interface. | ||
3717 | */ | ||
3718 | + card->ext_csd.raw_partition_support = ext_csd[EXT_CSD_PARTITION_SUPPORT]; | ||
3719 | if ((ext_csd[EXT_CSD_PARTITION_SUPPORT] & 0x2) && | ||
3720 | (ext_csd[EXT_CSD_PARTITION_ATTRIBUTE] & 0x1)) { | ||
3721 | u8 hc_erase_grp_sz = | ||
3722 | @@ -405,6 +406,7 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) | ||
3723 | if (card->ext_csd.rev >= 5) | ||
3724 | card->ext_csd.rel_param = ext_csd[EXT_CSD_WR_REL_PARAM]; | ||
3725 | |||
3726 | + card->ext_csd.raw_erased_mem_count = ext_csd[EXT_CSD_ERASED_MEM_CONT]; | ||
3727 | if (ext_csd[EXT_CSD_ERASED_MEM_CONT]) | ||
3728 | card->erased_byte = 0xFF; | ||
3729 | else | ||
3730 | @@ -891,6 +893,7 @@ static void mmc_detect(struct mmc_host *host) | ||
3731 | |||
3732 | mmc_claim_host(host); | ||
3733 | mmc_detach_bus(host); | ||
3734 | + mmc_power_off(host); | ||
3735 | mmc_release_host(host); | ||
3736 | } | ||
3737 | } | ||
3738 | diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c | ||
3739 | index 0370e03..4c281a4 100644 | ||
3740 | --- a/drivers/mmc/core/sd.c | ||
3741 | +++ b/drivers/mmc/core/sd.c | ||
3742 | @@ -1043,6 +1043,7 @@ static void mmc_sd_detect(struct mmc_host *host) | ||
3743 | |||
3744 | mmc_claim_host(host); | ||
3745 | mmc_detach_bus(host); | ||
3746 | + mmc_power_off(host); | ||
3747 | mmc_release_host(host); | ||
3748 | } | ||
3749 | } | ||
3750 | diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c | ||
3751 | index 262fff0..ac492ac 100644 | ||
3752 | --- a/drivers/mmc/core/sdio.c | ||
3753 | +++ b/drivers/mmc/core/sdio.c | ||
3754 | @@ -597,6 +597,7 @@ out: | ||
3755 | |||
3756 | mmc_claim_host(host); | ||
3757 | mmc_detach_bus(host); | ||
3758 | + mmc_power_off(host); | ||
3759 | mmc_release_host(host); | ||
3760 | } | ||
3761 | } | ||
3762 | diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c | ||
3763 | index f1af222..49e20a4 100644 | ||
3764 | --- a/drivers/mtd/mtdchar.c | ||
3765 | +++ b/drivers/mtd/mtdchar.c | ||
3766 | @@ -320,6 +320,7 @@ static ssize_t mtd_write(struct file *file, const char __user *buf, size_t count | ||
3767 | ops.mode = MTD_OOB_RAW; | ||
3768 | ops.datbuf = kbuf; | ||
3769 | ops.oobbuf = NULL; | ||
3770 | + ops.ooboffs = 0; | ||
3771 | ops.len = len; | ||
3772 | |||
3773 | ret = mtd->write_oob(mtd, *ppos, &ops); | ||
3774 | diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c | ||
3775 | index a46e9bb..86f05f4 100644 | ||
3776 | --- a/drivers/mtd/nand/nand_base.c | ||
3777 | +++ b/drivers/mtd/nand/nand_base.c | ||
3778 | @@ -2097,14 +2097,22 @@ static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip, | ||
3779 | |||
3780 | /** | ||
3781 | * nand_fill_oob - [Internal] Transfer client buffer to oob | ||
3782 | - * @chip: nand chip structure | ||
3783 | + * @mtd: MTD device structure | ||
3784 | * @oob: oob data buffer | ||
3785 | * @len: oob data write length | ||
3786 | * @ops: oob ops structure | ||
3787 | */ | ||
3788 | -static uint8_t *nand_fill_oob(struct nand_chip *chip, uint8_t *oob, size_t len, | ||
3789 | - struct mtd_oob_ops *ops) | ||
3790 | +static uint8_t *nand_fill_oob(struct mtd_info *mtd, uint8_t *oob, size_t len, | ||
3791 | + struct mtd_oob_ops *ops) | ||
3792 | { | ||
3793 | + struct nand_chip *chip = mtd->priv; | ||
3794 | + | ||
3795 | + /* | ||
3796 | + * Initialise to all 0xFF, to avoid the possibility of left over OOB | ||
3797 | + * data from a previous OOB read. | ||
3798 | + */ | ||
3799 | + memset(chip->oob_poi, 0xff, mtd->oobsize); | ||
3800 | + | ||
3801 | switch (ops->mode) { | ||
3802 | |||
3803 | case MTD_OOB_PLACE: | ||
3804 | @@ -2201,10 +2209,6 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to, | ||
3805 | (chip->pagebuf << chip->page_shift) < (to + ops->len)) | ||
3806 | chip->pagebuf = -1; | ||
3807 | |||
3808 | - /* If we're not given explicit OOB data, let it be 0xFF */ | ||
3809 | - if (likely(!oob)) | ||
3810 | - memset(chip->oob_poi, 0xff, mtd->oobsize); | ||
3811 | - | ||
3812 | /* Don't allow multipage oob writes with offset */ | ||
3813 | if (oob && ops->ooboffs && (ops->ooboffs + ops->ooblen > oobmaxlen)) | ||
3814 | return -EINVAL; | ||
3815 | @@ -2226,8 +2230,11 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to, | ||
3816 | |||
3817 | if (unlikely(oob)) { | ||
3818 | size_t len = min(oobwritelen, oobmaxlen); | ||
3819 | - oob = nand_fill_oob(chip, oob, len, ops); | ||
3820 | + oob = nand_fill_oob(mtd, oob, len, ops); | ||
3821 | oobwritelen -= len; | ||
3822 | + } else { | ||
3823 | + /* We still need to erase leftover OOB data */ | ||
3824 | + memset(chip->oob_poi, 0xff, mtd->oobsize); | ||
3825 | } | ||
3826 | |||
3827 | ret = chip->write_page(mtd, chip, wbuf, page, cached, | ||
3828 | @@ -2401,10 +2408,8 @@ static int nand_do_write_oob(struct mtd_info *mtd, loff_t to, | ||
3829 | if (page == chip->pagebuf) | ||
3830 | chip->pagebuf = -1; | ||
3831 | |||
3832 | - memset(chip->oob_poi, 0xff, mtd->oobsize); | ||
3833 | - nand_fill_oob(chip, ops->oobbuf, ops->ooblen, ops); | ||
3834 | + nand_fill_oob(mtd, ops->oobbuf, ops->ooblen, ops); | ||
3835 | status = chip->ecc.write_oob(mtd, chip, page & chip->pagemask); | ||
3836 | - memset(chip->oob_poi, 0xff, mtd->oobsize); | ||
3837 | |||
3838 | if (status) | ||
3839 | return status; | ||
3840 | diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c | ||
3841 | index 1fb3b3a..30689cc 100644 | ||
3842 | --- a/drivers/mtd/nand/pxa3xx_nand.c | ||
3843 | +++ b/drivers/mtd/nand/pxa3xx_nand.c | ||
3844 | @@ -685,6 +685,8 @@ static int pxa3xx_nand_read_page_hwecc(struct mtd_info *mtd, | ||
3845 | * OOB, ignore such double bit errors | ||
3846 | */ | ||
3847 | if (is_buf_blank(buf, mtd->writesize)) | ||
3848 | + info->retcode = ERR_NONE; | ||
3849 | + else | ||
3850 | mtd->ecc_stats.failed++; | ||
3851 | } | ||
3852 | |||
3853 | @@ -813,7 +815,7 @@ static int pxa3xx_nand_detect_config(struct pxa3xx_nand_info *info) | ||
3854 | info->page_size = ndcr & NDCR_PAGE_SZ ? 2048 : 512; | ||
3855 | /* set info fields needed to read id */ | ||
3856 | info->read_id_bytes = (info->page_size == 2048) ? 4 : 2; | ||
3857 | - info->reg_ndcr = ndcr; | ||
3858 | + info->reg_ndcr = ndcr & ~NDCR_INT_MASK; | ||
3859 | info->cmdset = &default_cmdset; | ||
3860 | |||
3861 | info->ndtr0cs0 = nand_readl(info, NDTR0CS0); | ||
3862 | @@ -882,7 +884,7 @@ static int pxa3xx_nand_scan(struct mtd_info *mtd) | ||
3863 | struct pxa3xx_nand_info *info = mtd->priv; | ||
3864 | struct platform_device *pdev = info->pdev; | ||
3865 | struct pxa3xx_nand_platform_data *pdata = pdev->dev.platform_data; | ||
3866 | - struct nand_flash_dev pxa3xx_flash_ids[2] = { {NULL,}, {NULL,} }; | ||
3867 | + struct nand_flash_dev pxa3xx_flash_ids[2], *def = NULL; | ||
3868 | const struct pxa3xx_nand_flash *f = NULL; | ||
3869 | struct nand_chip *chip = mtd->priv; | ||
3870 | uint32_t id = -1; | ||
3871 | @@ -942,8 +944,10 @@ static int pxa3xx_nand_scan(struct mtd_info *mtd) | ||
3872 | pxa3xx_flash_ids[0].erasesize = f->page_size * f->page_per_block; | ||
3873 | if (f->flash_width == 16) | ||
3874 | pxa3xx_flash_ids[0].options = NAND_BUSWIDTH_16; | ||
3875 | + pxa3xx_flash_ids[1].name = NULL; | ||
3876 | + def = pxa3xx_flash_ids; | ||
3877 | KEEP_CONFIG: | ||
3878 | - if (nand_scan_ident(mtd, 1, pxa3xx_flash_ids)) | ||
3879 | + if (nand_scan_ident(mtd, 1, def)) | ||
3880 | return -ENODEV; | ||
3881 | /* calculate addressing information */ | ||
3882 | info->col_addr_cycles = (mtd->writesize >= 2048) ? 2 : 1; | ||
3883 | @@ -954,9 +958,9 @@ KEEP_CONFIG: | ||
3884 | info->row_addr_cycles = 2; | ||
3885 | mtd->name = mtd_names[0]; | ||
3886 | chip->ecc.mode = NAND_ECC_HW; | ||
3887 | - chip->ecc.size = f->page_size; | ||
3888 | + chip->ecc.size = info->page_size; | ||
3889 | |||
3890 | - chip->options = (f->flash_width == 16) ? NAND_BUSWIDTH_16 : 0; | ||
3891 | + chip->options = (info->reg_ndcr & NDCR_DWIDTH_M) ? NAND_BUSWIDTH_16 : 0; | ||
3892 | chip->options |= NAND_NO_AUTOINCR; | ||
3893 | chip->options |= NAND_NO_READRDY; | ||
3894 | |||
3895 | diff --git a/drivers/mtd/redboot.c b/drivers/mtd/redboot.c | ||
3896 | index 7a87d07..4938bd0 100644 | ||
3897 | --- a/drivers/mtd/redboot.c | ||
3898 | +++ b/drivers/mtd/redboot.c | ||
3899 | @@ -297,6 +297,9 @@ static struct mtd_part_parser redboot_parser = { | ||
3900 | .name = "RedBoot", | ||
3901 | }; | ||
3902 | |||
3903 | +/* mtd parsers will request the module by parser name */ | ||
3904 | +MODULE_ALIAS("RedBoot"); | ||
3905 | + | ||
3906 | static int __init redboot_parser_init(void) | ||
3907 | { | ||
3908 | return register_mtd_parser(&redboot_parser); | ||
3909 | diff --git a/drivers/net/phy/dp83640.c b/drivers/net/phy/dp83640.c | ||
3910 | index edd7304..dc44b73 100644 | ||
3911 | --- a/drivers/net/phy/dp83640.c | ||
3912 | +++ b/drivers/net/phy/dp83640.c | ||
3913 | @@ -875,6 +875,7 @@ static void dp83640_remove(struct phy_device *phydev) | ||
3914 | struct dp83640_clock *clock; | ||
3915 | struct list_head *this, *next; | ||
3916 | struct dp83640_private *tmp, *dp83640 = phydev->priv; | ||
3917 | + struct sk_buff *skb; | ||
3918 | |||
3919 | if (phydev->addr == BROADCAST_ADDR) | ||
3920 | return; | ||
3921 | @@ -882,6 +883,12 @@ static void dp83640_remove(struct phy_device *phydev) | ||
3922 | enable_status_frames(phydev, false); | ||
3923 | cancel_work_sync(&dp83640->ts_work); | ||
3924 | |||
3925 | + while ((skb = skb_dequeue(&dp83640->rx_queue)) != NULL) | ||
3926 | + kfree_skb(skb); | ||
3927 | + | ||
3928 | + while ((skb = skb_dequeue(&dp83640->tx_queue)) != NULL) | ||
3929 | + skb_complete_tx_timestamp(skb, NULL); | ||
3930 | + | ||
3931 | clock = dp83640_clock_get(dp83640->clock); | ||
3932 | |||
3933 | if (dp83640 == clock->chosen) { | ||
3934 | @@ -1060,7 +1067,7 @@ static void dp83640_txtstamp(struct phy_device *phydev, | ||
3935 | struct dp83640_private *dp83640 = phydev->priv; | ||
3936 | |||
3937 | if (!dp83640->hwts_tx_en) { | ||
3938 | - kfree_skb(skb); | ||
3939 | + skb_complete_tx_timestamp(skb, NULL); | ||
3940 | return; | ||
3941 | } | ||
3942 | skb_queue_tail(&dp83640->tx_queue, skb); | ||
3943 | diff --git a/drivers/net/rionet.c b/drivers/net/rionet.c | ||
3944 | index 3bb1311..7145714 100644 | ||
3945 | --- a/drivers/net/rionet.c | ||
3946 | +++ b/drivers/net/rionet.c | ||
3947 | @@ -88,8 +88,8 @@ static struct rio_dev **rionet_active; | ||
3948 | #define dev_rionet_capable(dev) \ | ||
3949 | is_rionet_capable(dev->src_ops, dev->dst_ops) | ||
3950 | |||
3951 | -#define RIONET_MAC_MATCH(x) (*(u32 *)x == 0x00010001) | ||
3952 | -#define RIONET_GET_DESTID(x) (*(u16 *)(x + 4)) | ||
3953 | +#define RIONET_MAC_MATCH(x) (!memcmp((x), "\00\01\00\01", 4)) | ||
3954 | +#define RIONET_GET_DESTID(x) ((*((u8 *)x + 4) << 8) | *((u8 *)x + 5)) | ||
3955 | |||
3956 | static int rionet_rx_clean(struct net_device *ndev) | ||
3957 | { | ||
3958 | diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c | ||
3959 | index c11a2b8..d469004 100644 | ||
3960 | --- a/drivers/net/tg3.c | ||
3961 | +++ b/drivers/net/tg3.c | ||
3962 | @@ -6029,12 +6029,12 @@ static void tg3_tx_skb_unmap(struct tg3_napi *tnapi, u32 entry, int last) | ||
3963 | |||
3964 | /* Workaround 4GB and 40-bit hardware DMA bugs. */ | ||
3965 | static int tigon3_dma_hwbug_workaround(struct tg3_napi *tnapi, | ||
3966 | - struct sk_buff *skb, | ||
3967 | + struct sk_buff **pskb, | ||
3968 | u32 *entry, u32 *budget, | ||
3969 | u32 base_flags, u32 mss, u32 vlan) | ||
3970 | { | ||
3971 | struct tg3 *tp = tnapi->tp; | ||
3972 | - struct sk_buff *new_skb; | ||
3973 | + struct sk_buff *new_skb, *skb = *pskb; | ||
3974 | dma_addr_t new_addr = 0; | ||
3975 | int ret = 0; | ||
3976 | |||
3977 | @@ -6076,7 +6076,7 @@ static int tigon3_dma_hwbug_workaround(struct tg3_napi *tnapi, | ||
3978 | } | ||
3979 | |||
3980 | dev_kfree_skb(skb); | ||
3981 | - | ||
3982 | + *pskb = new_skb; | ||
3983 | return ret; | ||
3984 | } | ||
3985 | |||
3986 | @@ -6305,7 +6305,7 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) | ||
3987 | */ | ||
3988 | entry = tnapi->tx_prod; | ||
3989 | budget = tg3_tx_avail(tnapi); | ||
3990 | - if (tigon3_dma_hwbug_workaround(tnapi, skb, &entry, &budget, | ||
3991 | + if (tigon3_dma_hwbug_workaround(tnapi, &skb, &entry, &budget, | ||
3992 | base_flags, mss, vlan)) | ||
3993 | goto out_unlock; | ||
3994 | } | ||
3995 | diff --git a/drivers/net/wireless/ath/ath9k/ani.c b/drivers/net/wireless/ath/ath9k/ani.c | ||
3996 | index bfb6481..4e4e7c3 100644 | ||
3997 | --- a/drivers/net/wireless/ath/ath9k/ani.c | ||
3998 | +++ b/drivers/net/wireless/ath/ath9k/ani.c | ||
3999 | @@ -502,9 +502,6 @@ static void ath9k_ani_reset_old(struct ath_hw *ah, bool is_scanning) | ||
4000 | ath9k_hw_ani_control(ah, ATH9K_ANI_CCK_WEAK_SIGNAL_THR, | ||
4001 | ATH9K_ANI_CCK_WEAK_SIG_THR); | ||
4002 | |||
4003 | - ath9k_hw_setrxfilter(ah, ath9k_hw_getrxfilter(ah) | | ||
4004 | - ATH9K_RX_FILTER_PHYERR); | ||
4005 | - | ||
4006 | ath9k_ani_restart(ah); | ||
4007 | return; | ||
4008 | } | ||
4009 | @@ -525,8 +522,6 @@ static void ath9k_ani_reset_old(struct ath_hw *ah, bool is_scanning) | ||
4010 | ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, | ||
4011 | aniState->firstepLevel); | ||
4012 | |||
4013 | - ath9k_hw_setrxfilter(ah, ath9k_hw_getrxfilter(ah) & | ||
4014 | - ~ATH9K_RX_FILTER_PHYERR); | ||
4015 | ath9k_ani_restart(ah); | ||
4016 | |||
4017 | ENABLE_REGWRITE_BUFFER(ah); | ||
4018 | diff --git a/drivers/net/wireless/ath/ath9k/ar9003_calib.c b/drivers/net/wireless/ath/ath9k/ar9003_calib.c | ||
4019 | index f48051c..7c2aaad 100644 | ||
4020 | --- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c | ||
4021 | +++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c | ||
4022 | @@ -643,8 +643,9 @@ static void ar9003_hw_detect_outlier(int *mp_coeff, int nmeasurement, | ||
4023 | outlier_idx = max_idx; | ||
4024 | else | ||
4025 | outlier_idx = min_idx; | ||
4026 | + | ||
4027 | + mp_coeff[outlier_idx] = mp_avg; | ||
4028 | } | ||
4029 | - mp_coeff[outlier_idx] = mp_avg; | ||
4030 | } | ||
4031 | |||
4032 | static void ar9003_hw_tx_iqcal_load_avg_2_passes(struct ath_hw *ah, | ||
4033 | diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mac.c b/drivers/net/wireless/ath/ath9k/ar9003_mac.c | ||
4034 | index 8ff0b88..048f6af 100644 | ||
4035 | --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c | ||
4036 | +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c | ||
4037 | @@ -253,8 +253,6 @@ static int ar9003_hw_proc_txdesc(struct ath_hw *ah, void *ds, | ||
4038 | return -EIO; | ||
4039 | } | ||
4040 | |||
4041 | - if (status & AR_TxOpExceeded) | ||
4042 | - ts->ts_status |= ATH9K_TXERR_XTXOP; | ||
4043 | ts->ts_rateindex = MS(status, AR_FinalTxIdx); | ||
4044 | ts->ts_seqnum = MS(status, AR_SeqNum); | ||
4045 | ts->tid = MS(status, AR_TxTid); | ||
4046 | @@ -264,6 +262,8 @@ static int ar9003_hw_proc_txdesc(struct ath_hw *ah, void *ds, | ||
4047 | ts->ts_status = 0; | ||
4048 | ts->ts_flags = 0; | ||
4049 | |||
4050 | + if (status & AR_TxOpExceeded) | ||
4051 | + ts->ts_status |= ATH9K_TXERR_XTXOP; | ||
4052 | status = ACCESS_ONCE(ads->status2); | ||
4053 | ts->ts_rssi_ctl0 = MS(status, AR_TxRSSIAnt00); | ||
4054 | ts->ts_rssi_ctl1 = MS(status, AR_TxRSSIAnt01); | ||
4055 | diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.h b/drivers/net/wireless/ath/ath9k/ar9003_phy.h | ||
4056 | index 5c59042..32ac05f 100644 | ||
4057 | --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.h | ||
4058 | +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.h | ||
4059 | @@ -572,12 +572,12 @@ | ||
4060 | |||
4061 | #define AR_PHY_TXGAIN_TABLE (AR_SM_BASE + 0x300) | ||
4062 | |||
4063 | -#define AR_PHY_TX_IQCAL_CONTROL_1 (AR_SM_BASE + AR_SREV_9485(ah) ? \ | ||
4064 | - 0x3c8 : 0x448) | ||
4065 | -#define AR_PHY_TX_IQCAL_START (AR_SM_BASE + AR_SREV_9485(ah) ? \ | ||
4066 | - 0x3c4 : 0x440) | ||
4067 | -#define AR_PHY_TX_IQCAL_STATUS_B0 (AR_SM_BASE + AR_SREV_9485(ah) ? \ | ||
4068 | - 0x3f0 : 0x48c) | ||
4069 | +#define AR_PHY_TX_IQCAL_CONTROL_1 (AR_SM_BASE + (AR_SREV_9485(ah) ? \ | ||
4070 | + 0x3c8 : 0x448)) | ||
4071 | +#define AR_PHY_TX_IQCAL_START (AR_SM_BASE + (AR_SREV_9485(ah) ? \ | ||
4072 | + 0x3c4 : 0x440)) | ||
4073 | +#define AR_PHY_TX_IQCAL_STATUS_B0 (AR_SM_BASE + (AR_SREV_9485(ah) ? \ | ||
4074 | + 0x3f0 : 0x48c)) | ||
4075 | #define AR_PHY_TX_IQCAL_CORR_COEFF_B0(_i) (AR_SM_BASE + \ | ||
4076 | (AR_SREV_9485(ah) ? \ | ||
4077 | 0x3d0 : 0x450) + ((_i) << 2)) | ||
4078 | diff --git a/drivers/net/wireless/ath/ath9k/ar9485_initvals.h b/drivers/net/wireless/ath/ath9k/ar9485_initvals.h | ||
4079 | index 611ea6c..d16d029 100644 | ||
4080 | --- a/drivers/net/wireless/ath/ath9k/ar9485_initvals.h | ||
4081 | +++ b/drivers/net/wireless/ath/ath9k/ar9485_initvals.h | ||
4082 | @@ -521,7 +521,7 @@ static const u32 ar9485_1_1_radio_postamble[][2] = { | ||
4083 | {0x000160ac, 0x24611800}, | ||
4084 | {0x000160b0, 0x03284f3e}, | ||
4085 | {0x0001610c, 0x00170000}, | ||
4086 | - {0x00016140, 0x10804008}, | ||
4087 | + {0x00016140, 0x50804008}, | ||
4088 | }; | ||
4089 | |||
4090 | static const u32 ar9485_1_1_mac_postamble[][5] = { | ||
4091 | @@ -603,7 +603,7 @@ static const u32 ar9485_1_1_radio_core[][2] = { | ||
4092 | |||
4093 | static const u32 ar9485_1_1_pcie_phy_pll_on_clkreq_enable_L1[][2] = { | ||
4094 | /* Addr allmodes */ | ||
4095 | - {0x00018c00, 0x10052e5e}, | ||
4096 | + {0x00018c00, 0x18052e5e}, | ||
4097 | {0x00018c04, 0x000801d8}, | ||
4098 | {0x00018c08, 0x0000080c}, | ||
4099 | }; | ||
4100 | @@ -776,7 +776,7 @@ static const u32 ar9485_modes_green_ob_db_tx_gain_1_1[][5] = { | ||
4101 | |||
4102 | static const u32 ar9485_1_1_pcie_phy_clkreq_disable_L1[][2] = { | ||
4103 | /* Addr allmodes */ | ||
4104 | - {0x00018c00, 0x10013e5e}, | ||
4105 | + {0x00018c00, 0x18013e5e}, | ||
4106 | {0x00018c04, 0x000801d8}, | ||
4107 | {0x00018c08, 0x0000080c}, | ||
4108 | }; | ||
4109 | @@ -882,7 +882,7 @@ static const u32 ar9485_fast_clock_1_1_baseband_postamble[][3] = { | ||
4110 | |||
4111 | static const u32 ar9485_1_1_pcie_phy_pll_on_clkreq_disable_L1[][2] = { | ||
4112 | /* Addr allmodes */ | ||
4113 | - {0x00018c00, 0x10012e5e}, | ||
4114 | + {0x00018c00, 0x18012e5e}, | ||
4115 | {0x00018c04, 0x000801d8}, | ||
4116 | {0x00018c08, 0x0000080c}, | ||
4117 | }; | ||
4118 | @@ -1021,7 +1021,7 @@ static const u32 ar9485_common_rx_gain_1_1[][2] = { | ||
4119 | |||
4120 | static const u32 ar9485_1_1_pcie_phy_clkreq_enable_L1[][2] = { | ||
4121 | /* Addr allmodes */ | ||
4122 | - {0x00018c00, 0x10053e5e}, | ||
4123 | + {0x00018c00, 0x18053e5e}, | ||
4124 | {0x00018c04, 0x000801d8}, | ||
4125 | {0x00018c08, 0x0000080c}, | ||
4126 | }; | ||
4127 | diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c | ||
4128 | index d3f4a59..77c8ded 100644 | ||
4129 | --- a/drivers/net/wireless/ath/ath9k/hif_usb.c | ||
4130 | +++ b/drivers/net/wireless/ath/ath9k/hif_usb.c | ||
4131 | @@ -38,6 +38,7 @@ static struct usb_device_id ath9k_hif_usb_ids[] = { | ||
4132 | { USB_DEVICE(0x04CA, 0x4605) }, /* Liteon */ | ||
4133 | { USB_DEVICE(0x040D, 0x3801) }, /* VIA */ | ||
4134 | { USB_DEVICE(0x0cf3, 0xb003) }, /* Ubiquiti WifiStation Ext */ | ||
4135 | + { USB_DEVICE(0x057c, 0x8403) }, /* AVM FRITZ!WLAN 11N v2 USB */ | ||
4136 | |||
4137 | { USB_DEVICE(0x0cf3, 0x7015), | ||
4138 | .driver_info = AR9287_USB }, /* Atheros */ | ||
4139 | diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c | ||
4140 | index 8dcefe7..0be84b1 100644 | ||
4141 | --- a/drivers/net/wireless/ath/ath9k/hw.c | ||
4142 | +++ b/drivers/net/wireless/ath/ath9k/hw.c | ||
4143 | @@ -2101,6 +2101,10 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah) | ||
4144 | pCap->num_gpio_pins = AR9271_NUM_GPIO; | ||
4145 | else if (AR_DEVID_7010(ah)) | ||
4146 | pCap->num_gpio_pins = AR7010_NUM_GPIO; | ||
4147 | + else if (AR_SREV_9300_20_OR_LATER(ah)) | ||
4148 | + pCap->num_gpio_pins = AR9300_NUM_GPIO; | ||
4149 | + else if (AR_SREV_9287_11_OR_LATER(ah)) | ||
4150 | + pCap->num_gpio_pins = AR9287_NUM_GPIO; | ||
4151 | else if (AR_SREV_9285_12_OR_LATER(ah)) | ||
4152 | pCap->num_gpio_pins = AR9285_NUM_GPIO; | ||
4153 | else if (AR_SREV_9280_20_OR_LATER(ah)) | ||
4154 | diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c | ||
4155 | index 4c21f8c..60a3bb2 100644 | ||
4156 | --- a/drivers/net/wireless/ath/ath9k/recv.c | ||
4157 | +++ b/drivers/net/wireless/ath/ath9k/recv.c | ||
4158 | @@ -433,12 +433,9 @@ void ath_rx_cleanup(struct ath_softc *sc) | ||
4159 | |||
4160 | u32 ath_calcrxfilter(struct ath_softc *sc) | ||
4161 | { | ||
4162 | -#define RX_FILTER_PRESERVE (ATH9K_RX_FILTER_PHYERR | ATH9K_RX_FILTER_PHYRADAR) | ||
4163 | - | ||
4164 | u32 rfilt; | ||
4165 | |||
4166 | - rfilt = (ath9k_hw_getrxfilter(sc->sc_ah) & RX_FILTER_PRESERVE) | ||
4167 | - | ATH9K_RX_FILTER_UCAST | ATH9K_RX_FILTER_BCAST | ||
4168 | + rfilt = ATH9K_RX_FILTER_UCAST | ATH9K_RX_FILTER_BCAST | ||
4169 | | ATH9K_RX_FILTER_MCAST; | ||
4170 | |||
4171 | if (sc->rx.rxfilter & FIF_PROBE_REQ) | ||
4172 | diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c b/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c | ||
4173 | index d42ef17..a7ddc98 100644 | ||
4174 | --- a/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c | ||
4175 | +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c | ||
4176 | @@ -295,8 +295,8 @@ static int iwlagn_rxon_connect(struct iwl_priv *priv, | ||
4177 | return ret; | ||
4178 | } | ||
4179 | |||
4180 | - if ((ctx->vif && ctx->vif->type == NL80211_IFTYPE_STATION) && | ||
4181 | - priv->cfg->ht_params->smps_mode) | ||
4182 | + if (ctx->vif && ctx->vif->type == NL80211_IFTYPE_STATION && | ||
4183 | + priv->cfg->ht_params && priv->cfg->ht_params->smps_mode) | ||
4184 | ieee80211_request_smps(ctx->vif, | ||
4185 | priv->cfg->ht_params->smps_mode); | ||
4186 | |||
4187 | diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c b/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c | ||
4188 | index 5621100..a5c5a0a 100644 | ||
4189 | --- a/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c | ||
4190 | +++ b/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c | ||
4191 | @@ -113,13 +113,8 @@ static int iwlagn_load_section(struct iwl_priv *priv, const char *name, | ||
4192 | FH_TCSR_TX_CONFIG_REG_VAL_CIRQ_HOST_ENDTFD); | ||
4193 | |||
4194 | IWL_DEBUG_FW(priv, "%s uCode section being loaded...\n", name); | ||
4195 | - ret = wait_event_interruptible_timeout(priv->wait_command_queue, | ||
4196 | - priv->ucode_write_complete, 5 * HZ); | ||
4197 | - if (ret == -ERESTARTSYS) { | ||
4198 | - IWL_ERR(priv, "Could not load the %s uCode section due " | ||
4199 | - "to interrupt\n", name); | ||
4200 | - return ret; | ||
4201 | - } | ||
4202 | + ret = wait_event_timeout(priv->wait_command_queue, | ||
4203 | + priv->ucode_write_complete, 5 * HZ); | ||
4204 | if (!ret) { | ||
4205 | IWL_ERR(priv, "Could not load the %s uCode section\n", | ||
4206 | name); | ||
4207 | diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c | ||
4208 | index cf376f6..d652778 100644 | ||
4209 | --- a/drivers/net/wireless/iwlwifi/iwl-core.c | ||
4210 | +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | ||
4211 | @@ -867,7 +867,7 @@ void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand) | ||
4212 | * commands by clearing the ready bit */ | ||
4213 | clear_bit(STATUS_READY, &priv->status); | ||
4214 | |||
4215 | - wake_up_interruptible(&priv->wait_command_queue); | ||
4216 | + wake_up(&priv->wait_command_queue); | ||
4217 | |||
4218 | if (!ondemand) { | ||
4219 | /* | ||
4220 | @@ -918,7 +918,7 @@ void iwl_irq_handle_error(struct iwl_priv *priv) | ||
4221 | */ | ||
4222 | clear_bit(STATUS_READY, &priv->status); | ||
4223 | clear_bit(STATUS_HCMD_ACTIVE, &priv->status); | ||
4224 | - wake_up_interruptible(&priv->wait_command_queue); | ||
4225 | + wake_up(&priv->wait_command_queue); | ||
4226 | IWL_ERR(priv, "RF is used by WiMAX\n"); | ||
4227 | return; | ||
4228 | } | ||
4229 | diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c | ||
4230 | index 8e31400..732f01b 100644 | ||
4231 | --- a/drivers/net/wireless/iwlwifi/iwl-rx.c | ||
4232 | +++ b/drivers/net/wireless/iwlwifi/iwl-rx.c | ||
4233 | @@ -561,7 +561,7 @@ static void iwl_rx_card_state_notif(struct iwl_priv *priv, | ||
4234 | wiphy_rfkill_set_hw_state(priv->hw->wiphy, | ||
4235 | test_bit(STATUS_RF_KILL_HW, &priv->status)); | ||
4236 | else | ||
4237 | - wake_up_interruptible(&priv->wait_command_queue); | ||
4238 | + wake_up(&priv->wait_command_queue); | ||
4239 | } | ||
4240 | |||
4241 | static void iwl_rx_missed_beacon_notif(struct iwl_priv *priv, | ||
4242 | diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-rx-pcie.c b/drivers/net/wireless/iwlwifi/iwl-trans-rx-pcie.c | ||
4243 | index 4748602..f9f0df0 100644 | ||
4244 | --- a/drivers/net/wireless/iwlwifi/iwl-trans-rx-pcie.c | ||
4245 | +++ b/drivers/net/wireless/iwlwifi/iwl-trans-rx-pcie.c | ||
4246 | @@ -671,7 +671,7 @@ void iwl_irq_tasklet(struct iwl_priv *priv) | ||
4247 | handled |= CSR_INT_BIT_FH_TX; | ||
4248 | /* Wake up uCode load routine, now that load is complete */ | ||
4249 | priv->ucode_write_complete = 1; | ||
4250 | - wake_up_interruptible(&priv->wait_command_queue); | ||
4251 | + wake_up(&priv->wait_command_queue); | ||
4252 | } | ||
4253 | |||
4254 | if (inta & ~handled) { | ||
4255 | diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-tx-pcie.c b/drivers/net/wireless/iwlwifi/iwl-trans-tx-pcie.c | ||
4256 | index 222d410..2bf3107 100644 | ||
4257 | --- a/drivers/net/wireless/iwlwifi/iwl-trans-tx-pcie.c | ||
4258 | +++ b/drivers/net/wireless/iwlwifi/iwl-trans-tx-pcie.c | ||
4259 | @@ -790,7 +790,7 @@ void iwl_tx_cmd_complete(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb) | ||
4260 | clear_bit(STATUS_HCMD_ACTIVE, &priv->status); | ||
4261 | IWL_DEBUG_INFO(priv, "Clearing HCMD_ACTIVE for command %s\n", | ||
4262 | get_cmd_string(cmd->hdr.cmd)); | ||
4263 | - wake_up_interruptible(&priv->wait_command_queue); | ||
4264 | + wake_up(&priv->wait_command_queue); | ||
4265 | } | ||
4266 | |||
4267 | meta->flags = 0; | ||
4268 | @@ -957,7 +957,7 @@ static int iwl_send_cmd_sync(struct iwl_priv *priv, struct iwl_host_cmd *cmd) | ||
4269 | return ret; | ||
4270 | } | ||
4271 | |||
4272 | - ret = wait_event_interruptible_timeout(priv->wait_command_queue, | ||
4273 | + ret = wait_event_timeout(priv->wait_command_queue, | ||
4274 | !test_bit(STATUS_HCMD_ACTIVE, &priv->status), | ||
4275 | HOST_COMPLETE_TIMEOUT); | ||
4276 | if (!ret) { | ||
4277 | diff --git a/drivers/net/wireless/wl12xx/scan.c b/drivers/net/wireless/wl12xx/scan.c | ||
4278 | index edfe01c..afb7356 100644 | ||
4279 | --- a/drivers/net/wireless/wl12xx/scan.c | ||
4280 | +++ b/drivers/net/wireless/wl12xx/scan.c | ||
4281 | @@ -83,14 +83,18 @@ static int wl1271_get_scan_channels(struct wl1271 *wl, | ||
4282 | for (i = 0, j = 0; | ||
4283 | i < req->n_channels && j < WL1271_SCAN_MAX_CHANNELS; | ||
4284 | i++) { | ||
4285 | - | ||
4286 | flags = req->channels[i]->flags; | ||
4287 | |||
4288 | if (!test_bit(i, wl->scan.scanned_ch) && | ||
4289 | !(flags & IEEE80211_CHAN_DISABLED) && | ||
4290 | - ((!!(flags & IEEE80211_CHAN_PASSIVE_SCAN)) == passive) && | ||
4291 | - (req->channels[i]->band == band)) { | ||
4292 | - | ||
4293 | + (req->channels[i]->band == band) && | ||
4294 | + /* | ||
4295 | + * In passive scans, we scan all remaining | ||
4296 | + * channels, even if not marked as such. | ||
4297 | + * In active scans, we only scan channels not | ||
4298 | + * marked as passive. | ||
4299 | + */ | ||
4300 | + (passive || !(flags & IEEE80211_CHAN_PASSIVE_SCAN))) { | ||
4301 | wl1271_debug(DEBUG_SCAN, "band %d, center_freq %d ", | ||
4302 | req->channels[i]->band, | ||
4303 | req->channels[i]->center_freq); | ||
4304 | @@ -142,6 +146,10 @@ static int wl1271_scan_send(struct wl1271 *wl, enum ieee80211_band band, | ||
4305 | int ret; | ||
4306 | u16 scan_options = 0; | ||
4307 | |||
4308 | + /* skip active scans if we don't have SSIDs */ | ||
4309 | + if (!passive && wl->scan.req->n_ssids == 0) | ||
4310 | + return WL1271_NOTHING_TO_SCAN; | ||
4311 | + | ||
4312 | cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); | ||
4313 | trigger = kzalloc(sizeof(*trigger), GFP_KERNEL); | ||
4314 | if (!cmd || !trigger) { | ||
4315 | @@ -152,8 +160,7 @@ static int wl1271_scan_send(struct wl1271 *wl, enum ieee80211_band band, | ||
4316 | /* We always use high priority scans */ | ||
4317 | scan_options = WL1271_SCAN_OPT_PRIORITY_HIGH; | ||
4318 | |||
4319 | - /* No SSIDs means that we have a forced passive scan */ | ||
4320 | - if (passive || wl->scan.req->n_ssids == 0) | ||
4321 | + if (passive) | ||
4322 | scan_options |= WL1271_SCAN_OPT_PASSIVE; | ||
4323 | |||
4324 | cmd->params.scan_options = cpu_to_le16(scan_options); | ||
4325 | diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c | ||
4326 | index 1196f61..cec4629 100644 | ||
4327 | --- a/drivers/pci/quirks.c | ||
4328 | +++ b/drivers/pci/quirks.c | ||
4329 | @@ -2745,20 +2745,6 @@ static void ricoh_mmc_fixup_r5c832(struct pci_dev *dev) | ||
4330 | /* disable must be done via function #0 */ | ||
4331 | if (PCI_FUNC(dev->devfn)) | ||
4332 | return; | ||
4333 | - | ||
4334 | - pci_read_config_byte(dev, 0xCB, &disable); | ||
4335 | - | ||
4336 | - if (disable & 0x02) | ||
4337 | - return; | ||
4338 | - | ||
4339 | - pci_read_config_byte(dev, 0xCA, &write_enable); | ||
4340 | - pci_write_config_byte(dev, 0xCA, 0x57); | ||
4341 | - pci_write_config_byte(dev, 0xCB, disable | 0x02); | ||
4342 | - pci_write_config_byte(dev, 0xCA, write_enable); | ||
4343 | - | ||
4344 | - dev_notice(&dev->dev, "proprietary Ricoh MMC controller disabled (via firewire function)\n"); | ||
4345 | - dev_notice(&dev->dev, "MMC cards are now supported by standard SDHCI controller\n"); | ||
4346 | - | ||
4347 | /* | ||
4348 | * RICOH 0xe823 SD/MMC card reader fails to recognize | ||
4349 | * certain types of SD/MMC cards. Lowering the SD base | ||
4350 | @@ -2781,6 +2767,20 @@ static void ricoh_mmc_fixup_r5c832(struct pci_dev *dev) | ||
4351 | |||
4352 | dev_notice(&dev->dev, "MMC controller base frequency changed to 50Mhz.\n"); | ||
4353 | } | ||
4354 | + | ||
4355 | + pci_read_config_byte(dev, 0xCB, &disable); | ||
4356 | + | ||
4357 | + if (disable & 0x02) | ||
4358 | + return; | ||
4359 | + | ||
4360 | + pci_read_config_byte(dev, 0xCA, &write_enable); | ||
4361 | + pci_write_config_byte(dev, 0xCA, 0x57); | ||
4362 | + pci_write_config_byte(dev, 0xCB, disable | 0x02); | ||
4363 | + pci_write_config_byte(dev, 0xCA, write_enable); | ||
4364 | + | ||
4365 | + dev_notice(&dev->dev, "proprietary Ricoh MMC controller disabled (via firewire function)\n"); | ||
4366 | + dev_notice(&dev->dev, "MMC cards are now supported by standard SDHCI controller\n"); | ||
4367 | + | ||
4368 | } | ||
4369 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832); | ||
4370 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832); | ||
4371 | diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c | ||
4372 | index 6fa215a..90832a9 100644 | ||
4373 | --- a/drivers/pci/xen-pcifront.c | ||
4374 | +++ b/drivers/pci/xen-pcifront.c | ||
4375 | @@ -400,9 +400,8 @@ static int pcifront_claim_resource(struct pci_dev *dev, void *data) | ||
4376 | dev_info(&pdev->xdev->dev, "claiming resource %s/%d\n", | ||
4377 | pci_name(dev), i); | ||
4378 | if (pci_claim_resource(dev, i)) { | ||
4379 | - dev_err(&pdev->xdev->dev, "Could not claim " | ||
4380 | - "resource %s/%d! Device offline. Try " | ||
4381 | - "giving less than 4GB to domain.\n", | ||
4382 | + dev_err(&pdev->xdev->dev, "Could not claim resource %s/%d! " | ||
4383 | + "Device offline. Try using e820_host=1 in the guest config.\n", | ||
4384 | pci_name(dev), i); | ||
4385 | } | ||
4386 | } | ||
4387 | diff --git a/drivers/platform/x86/samsung-laptop.c b/drivers/platform/x86/samsung-laptop.c | ||
4388 | index 3591630..59ac26c 100644 | ||
4389 | --- a/drivers/platform/x86/samsung-laptop.c | ||
4390 | +++ b/drivers/platform/x86/samsung-laptop.c | ||
4391 | @@ -370,15 +370,17 @@ static u8 read_brightness(void) | ||
4392 | &sretval); | ||
4393 | if (!retval) { | ||
4394 | user_brightness = sretval.retval[0]; | ||
4395 | - if (user_brightness != 0) | ||
4396 | + if (user_brightness > sabi_config->min_brightness) | ||
4397 | user_brightness -= sabi_config->min_brightness; | ||
4398 | + else | ||
4399 | + user_brightness = 0; | ||
4400 | } | ||
4401 | return user_brightness; | ||
4402 | } | ||
4403 | |||
4404 | static void set_brightness(u8 user_brightness) | ||
4405 | { | ||
4406 | - u8 user_level = user_brightness - sabi_config->min_brightness; | ||
4407 | + u8 user_level = user_brightness + sabi_config->min_brightness; | ||
4408 | |||
4409 | sabi_set_command(sabi_config->commands.set_brightness, user_level); | ||
4410 | } | ||
4411 | @@ -641,6 +643,15 @@ static struct dmi_system_id __initdata samsung_dmi_table[] = { | ||
4412 | .callback = dmi_check_cb, | ||
4413 | }, | ||
4414 | { | ||
4415 | + .ident = "R700", | ||
4416 | + .matches = { | ||
4417 | + DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), | ||
4418 | + DMI_MATCH(DMI_PRODUCT_NAME, "SR700"), | ||
4419 | + DMI_MATCH(DMI_BOARD_NAME, "SR700"), | ||
4420 | + }, | ||
4421 | + .callback = dmi_check_cb, | ||
4422 | + }, | ||
4423 | + { | ||
4424 | .ident = "R530/R730", | ||
4425 | .matches = { | ||
4426 | DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), | ||
4427 | @@ -686,6 +697,24 @@ static struct dmi_system_id __initdata samsung_dmi_table[] = { | ||
4428 | }, | ||
4429 | .callback = dmi_check_cb, | ||
4430 | }, | ||
4431 | + { | ||
4432 | + .ident = "X520", | ||
4433 | + .matches = { | ||
4434 | + DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), | ||
4435 | + DMI_MATCH(DMI_PRODUCT_NAME, "X520"), | ||
4436 | + DMI_MATCH(DMI_BOARD_NAME, "X520"), | ||
4437 | + }, | ||
4438 | + .callback = dmi_check_cb, | ||
4439 | + }, | ||
4440 | + { | ||
4441 | + .ident = "R528/R728", | ||
4442 | + .matches = { | ||
4443 | + DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), | ||
4444 | + DMI_MATCH(DMI_PRODUCT_NAME, "R528/R728"), | ||
4445 | + DMI_MATCH(DMI_BOARD_NAME, "R528/R728"), | ||
4446 | + }, | ||
4447 | + .callback = dmi_check_cb, | ||
4448 | + }, | ||
4449 | { }, | ||
4450 | }; | ||
4451 | MODULE_DEVICE_TABLE(dmi, samsung_dmi_table); | ||
4452 | @@ -770,7 +799,7 @@ static int __init samsung_init(void) | ||
4453 | sabi_iface = ioremap_nocache(ifaceP, 16); | ||
4454 | if (!sabi_iface) { | ||
4455 | pr_err("Can't remap %x\n", ifaceP); | ||
4456 | - goto exit; | ||
4457 | + goto error_no_signature; | ||
4458 | } | ||
4459 | if (debug) { | ||
4460 | printk(KERN_DEBUG "ifaceP = 0x%08x\n", ifaceP); | ||
4461 | @@ -802,7 +831,8 @@ static int __init samsung_init(void) | ||
4462 | /* create a backlight device to talk to this one */ | ||
4463 | memset(&props, 0, sizeof(struct backlight_properties)); | ||
4464 | props.type = BACKLIGHT_PLATFORM; | ||
4465 | - props.max_brightness = sabi_config->max_brightness; | ||
4466 | + props.max_brightness = sabi_config->max_brightness - | ||
4467 | + sabi_config->min_brightness; | ||
4468 | backlight_device = backlight_device_register("samsung", &sdev->dev, | ||
4469 | NULL, &backlight_ops, | ||
4470 | &props); | ||
4471 | @@ -821,7 +851,6 @@ static int __init samsung_init(void) | ||
4472 | if (retval) | ||
4473 | goto error_file_create; | ||
4474 | |||
4475 | -exit: | ||
4476 | return 0; | ||
4477 | |||
4478 | error_file_create: | ||
4479 | diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c | ||
4480 | index f23d5a8..9b88be4 100644 | ||
4481 | --- a/drivers/platform/x86/wmi.c | ||
4482 | +++ b/drivers/platform/x86/wmi.c | ||
4483 | @@ -754,9 +754,13 @@ static void wmi_free_devices(void) | ||
4484 | struct wmi_block *wblock, *next; | ||
4485 | |||
4486 | /* Delete devices for all the GUIDs */ | ||
4487 | - list_for_each_entry_safe(wblock, next, &wmi_block_list, list) | ||
4488 | + list_for_each_entry_safe(wblock, next, &wmi_block_list, list) { | ||
4489 | + list_del(&wblock->list); | ||
4490 | if (wblock->dev.class) | ||
4491 | device_unregister(&wblock->dev); | ||
4492 | + else | ||
4493 | + kfree(wblock); | ||
4494 | + } | ||
4495 | } | ||
4496 | |||
4497 | static bool guid_already_parsed(const char *guid_string) | ||
4498 | diff --git a/drivers/power/ds2780_battery.c b/drivers/power/ds2780_battery.c | ||
4499 | index 1fefe82..91a783d 100644 | ||
4500 | --- a/drivers/power/ds2780_battery.c | ||
4501 | +++ b/drivers/power/ds2780_battery.c | ||
4502 | @@ -39,6 +39,7 @@ struct ds2780_device_info { | ||
4503 | struct device *dev; | ||
4504 | struct power_supply bat; | ||
4505 | struct device *w1_dev; | ||
4506 | + struct task_struct *mutex_holder; | ||
4507 | }; | ||
4508 | |||
4509 | enum current_types { | ||
4510 | @@ -49,8 +50,8 @@ enum current_types { | ||
4511 | static const char model[] = "DS2780"; | ||
4512 | static const char manufacturer[] = "Maxim/Dallas"; | ||
4513 | |||
4514 | -static inline struct ds2780_device_info *to_ds2780_device_info( | ||
4515 | - struct power_supply *psy) | ||
4516 | +static inline struct ds2780_device_info * | ||
4517 | +to_ds2780_device_info(struct power_supply *psy) | ||
4518 | { | ||
4519 | return container_of(psy, struct ds2780_device_info, bat); | ||
4520 | } | ||
4521 | @@ -60,17 +61,28 @@ static inline struct power_supply *to_power_supply(struct device *dev) | ||
4522 | return dev_get_drvdata(dev); | ||
4523 | } | ||
4524 | |||
4525 | -static inline int ds2780_read8(struct device *dev, u8 *val, int addr) | ||
4526 | +static inline int ds2780_battery_io(struct ds2780_device_info *dev_info, | ||
4527 | + char *buf, int addr, size_t count, int io) | ||
4528 | { | ||
4529 | - return w1_ds2780_io(dev, val, addr, sizeof(u8), 0); | ||
4530 | + if (dev_info->mutex_holder == current) | ||
4531 | + return w1_ds2780_io_nolock(dev_info->w1_dev, buf, addr, count, io); | ||
4532 | + else | ||
4533 | + return w1_ds2780_io(dev_info->w1_dev, buf, addr, count, io); | ||
4534 | +} | ||
4535 | + | ||
4536 | +static inline int ds2780_read8(struct ds2780_device_info *dev_info, u8 *val, | ||
4537 | + int addr) | ||
4538 | +{ | ||
4539 | + return ds2780_battery_io(dev_info, val, addr, sizeof(u8), 0); | ||
4540 | } | ||
4541 | |||
4542 | -static int ds2780_read16(struct device *dev, s16 *val, int addr) | ||
4543 | +static int ds2780_read16(struct ds2780_device_info *dev_info, s16 *val, | ||
4544 | + int addr) | ||
4545 | { | ||
4546 | int ret; | ||
4547 | u8 raw[2]; | ||
4548 | |||
4549 | - ret = w1_ds2780_io(dev, raw, addr, sizeof(u8) * 2, 0); | ||
4550 | + ret = ds2780_battery_io(dev_info, raw, addr, sizeof(raw), 0); | ||
4551 | if (ret < 0) | ||
4552 | return ret; | ||
4553 | |||
4554 | @@ -79,16 +91,16 @@ static int ds2780_read16(struct device *dev, s16 *val, int addr) | ||
4555 | return 0; | ||
4556 | } | ||
4557 | |||
4558 | -static inline int ds2780_read_block(struct device *dev, u8 *val, int addr, | ||
4559 | - size_t count) | ||
4560 | +static inline int ds2780_read_block(struct ds2780_device_info *dev_info, | ||
4561 | + u8 *val, int addr, size_t count) | ||
4562 | { | ||
4563 | - return w1_ds2780_io(dev, val, addr, count, 0); | ||
4564 | + return ds2780_battery_io(dev_info, val, addr, count, 0); | ||
4565 | } | ||
4566 | |||
4567 | -static inline int ds2780_write(struct device *dev, u8 *val, int addr, | ||
4568 | - size_t count) | ||
4569 | +static inline int ds2780_write(struct ds2780_device_info *dev_info, u8 *val, | ||
4570 | + int addr, size_t count) | ||
4571 | { | ||
4572 | - return w1_ds2780_io(dev, val, addr, count, 1); | ||
4573 | + return ds2780_battery_io(dev_info, val, addr, count, 1); | ||
4574 | } | ||
4575 | |||
4576 | static inline int ds2780_store_eeprom(struct device *dev, int addr) | ||
4577 | @@ -122,7 +134,7 @@ static int ds2780_set_sense_register(struct ds2780_device_info *dev_info, | ||
4578 | { | ||
4579 | int ret; | ||
4580 | |||
4581 | - ret = ds2780_write(dev_info->w1_dev, &conductance, | ||
4582 | + ret = ds2780_write(dev_info, &conductance, | ||
4583 | DS2780_RSNSP_REG, sizeof(u8)); | ||
4584 | if (ret < 0) | ||
4585 | return ret; | ||
4586 | @@ -134,7 +146,7 @@ static int ds2780_set_sense_register(struct ds2780_device_info *dev_info, | ||
4587 | static int ds2780_get_rsgain_register(struct ds2780_device_info *dev_info, | ||
4588 | u16 *rsgain) | ||
4589 | { | ||
4590 | - return ds2780_read16(dev_info->w1_dev, rsgain, DS2780_RSGAIN_MSB_REG); | ||
4591 | + return ds2780_read16(dev_info, rsgain, DS2780_RSGAIN_MSB_REG); | ||
4592 | } | ||
4593 | |||
4594 | /* Set RSGAIN value from 0 to 1.999 in steps of 0.001 */ | ||
4595 | @@ -144,8 +156,8 @@ static int ds2780_set_rsgain_register(struct ds2780_device_info *dev_info, | ||
4596 | int ret; | ||
4597 | u8 raw[] = {rsgain >> 8, rsgain & 0xFF}; | ||
4598 | |||
4599 | - ret = ds2780_write(dev_info->w1_dev, raw, | ||
4600 | - DS2780_RSGAIN_MSB_REG, sizeof(u8) * 2); | ||
4601 | + ret = ds2780_write(dev_info, raw, | ||
4602 | + DS2780_RSGAIN_MSB_REG, sizeof(raw)); | ||
4603 | if (ret < 0) | ||
4604 | return ret; | ||
4605 | |||
4606 | @@ -167,7 +179,7 @@ static int ds2780_get_voltage(struct ds2780_device_info *dev_info, | ||
4607 | * Bits 2 - 0 of the voltage value are in bits 7 - 5 of the | ||
4608 | * voltage LSB register | ||
4609 | */ | ||
4610 | - ret = ds2780_read16(dev_info->w1_dev, &voltage_raw, | ||
4611 | + ret = ds2780_read16(dev_info, &voltage_raw, | ||
4612 | DS2780_VOLT_MSB_REG); | ||
4613 | if (ret < 0) | ||
4614 | return ret; | ||
4615 | @@ -196,7 +208,7 @@ static int ds2780_get_temperature(struct ds2780_device_info *dev_info, | ||
4616 | * Bits 2 - 0 of the temperature value are in bits 7 - 5 of the | ||
4617 | * temperature LSB register | ||
4618 | */ | ||
4619 | - ret = ds2780_read16(dev_info->w1_dev, &temperature_raw, | ||
4620 | + ret = ds2780_read16(dev_info, &temperature_raw, | ||
4621 | DS2780_TEMP_MSB_REG); | ||
4622 | if (ret < 0) | ||
4623 | return ret; | ||
4624 | @@ -222,13 +234,13 @@ static int ds2780_get_current(struct ds2780_device_info *dev_info, | ||
4625 | * The units of measurement for current are dependent on the value of | ||
4626 | * the sense resistor. | ||
4627 | */ | ||
4628 | - ret = ds2780_read8(dev_info->w1_dev, &sense_res_raw, DS2780_RSNSP_REG); | ||
4629 | + ret = ds2780_read8(dev_info, &sense_res_raw, DS2780_RSNSP_REG); | ||
4630 | if (ret < 0) | ||
4631 | return ret; | ||
4632 | |||
4633 | if (sense_res_raw == 0) { | ||
4634 | dev_err(dev_info->dev, "sense resistor value is 0\n"); | ||
4635 | - return -ENXIO; | ||
4636 | + return -EINVAL; | ||
4637 | } | ||
4638 | sense_res = 1000 / sense_res_raw; | ||
4639 | |||
4640 | @@ -248,7 +260,7 @@ static int ds2780_get_current(struct ds2780_device_info *dev_info, | ||
4641 | * Bits 7 - 0 of the current value are in bits 7 - 0 of the current | ||
4642 | * LSB register | ||
4643 | */ | ||
4644 | - ret = ds2780_read16(dev_info->w1_dev, ¤t_raw, reg_msb); | ||
4645 | + ret = ds2780_read16(dev_info, ¤t_raw, reg_msb); | ||
4646 | if (ret < 0) | ||
4647 | return ret; | ||
4648 | |||
4649 | @@ -267,7 +279,7 @@ static int ds2780_get_accumulated_current(struct ds2780_device_info *dev_info, | ||
4650 | * The units of measurement for accumulated current are dependent on | ||
4651 | * the value of the sense resistor. | ||
4652 | */ | ||
4653 | - ret = ds2780_read8(dev_info->w1_dev, &sense_res_raw, DS2780_RSNSP_REG); | ||
4654 | + ret = ds2780_read8(dev_info, &sense_res_raw, DS2780_RSNSP_REG); | ||
4655 | if (ret < 0) | ||
4656 | return ret; | ||
4657 | |||
4658 | @@ -285,7 +297,7 @@ static int ds2780_get_accumulated_current(struct ds2780_device_info *dev_info, | ||
4659 | * Bits 7 - 0 of the ACR value are in bits 7 - 0 of the ACR | ||
4660 | * LSB register | ||
4661 | */ | ||
4662 | - ret = ds2780_read16(dev_info->w1_dev, ¤t_raw, DS2780_ACR_MSB_REG); | ||
4663 | + ret = ds2780_read16(dev_info, ¤t_raw, DS2780_ACR_MSB_REG); | ||
4664 | if (ret < 0) | ||
4665 | return ret; | ||
4666 | |||
4667 | @@ -299,7 +311,7 @@ static int ds2780_get_capacity(struct ds2780_device_info *dev_info, | ||
4668 | int ret; | ||
4669 | u8 raw; | ||
4670 | |||
4671 | - ret = ds2780_read8(dev_info->w1_dev, &raw, DS2780_RARC_REG); | ||
4672 | + ret = ds2780_read8(dev_info, &raw, DS2780_RARC_REG); | ||
4673 | if (ret < 0) | ||
4674 | return ret; | ||
4675 | |||
4676 | @@ -345,7 +357,7 @@ static int ds2780_get_charge_now(struct ds2780_device_info *dev_info, | ||
4677 | * Bits 7 - 0 of the RAAC value are in bits 7 - 0 of the RAAC | ||
4678 | * LSB register | ||
4679 | */ | ||
4680 | - ret = ds2780_read16(dev_info->w1_dev, &charge_raw, DS2780_RAAC_MSB_REG); | ||
4681 | + ret = ds2780_read16(dev_info, &charge_raw, DS2780_RAAC_MSB_REG); | ||
4682 | if (ret < 0) | ||
4683 | return ret; | ||
4684 | |||
4685 | @@ -356,7 +368,7 @@ static int ds2780_get_charge_now(struct ds2780_device_info *dev_info, | ||
4686 | static int ds2780_get_control_register(struct ds2780_device_info *dev_info, | ||
4687 | u8 *control_reg) | ||
4688 | { | ||
4689 | - return ds2780_read8(dev_info->w1_dev, control_reg, DS2780_CONTROL_REG); | ||
4690 | + return ds2780_read8(dev_info, control_reg, DS2780_CONTROL_REG); | ||
4691 | } | ||
4692 | |||
4693 | static int ds2780_set_control_register(struct ds2780_device_info *dev_info, | ||
4694 | @@ -364,7 +376,7 @@ static int ds2780_set_control_register(struct ds2780_device_info *dev_info, | ||
4695 | { | ||
4696 | int ret; | ||
4697 | |||
4698 | - ret = ds2780_write(dev_info->w1_dev, &control_reg, | ||
4699 | + ret = ds2780_write(dev_info, &control_reg, | ||
4700 | DS2780_CONTROL_REG, sizeof(u8)); | ||
4701 | if (ret < 0) | ||
4702 | return ret; | ||
4703 | @@ -503,7 +515,7 @@ static ssize_t ds2780_get_sense_resistor_value(struct device *dev, | ||
4704 | struct power_supply *psy = to_power_supply(dev); | ||
4705 | struct ds2780_device_info *dev_info = to_ds2780_device_info(psy); | ||
4706 | |||
4707 | - ret = ds2780_read8(dev_info->w1_dev, &sense_resistor, DS2780_RSNSP_REG); | ||
4708 | + ret = ds2780_read8(dev_info, &sense_resistor, DS2780_RSNSP_REG); | ||
4709 | if (ret < 0) | ||
4710 | return ret; | ||
4711 | |||
4712 | @@ -584,7 +596,7 @@ static ssize_t ds2780_get_pio_pin(struct device *dev, | ||
4713 | struct power_supply *psy = to_power_supply(dev); | ||
4714 | struct ds2780_device_info *dev_info = to_ds2780_device_info(psy); | ||
4715 | |||
4716 | - ret = ds2780_read8(dev_info->w1_dev, &sfr, DS2780_SFR_REG); | ||
4717 | + ret = ds2780_read8(dev_info, &sfr, DS2780_SFR_REG); | ||
4718 | if (ret < 0) | ||
4719 | return ret; | ||
4720 | |||
4721 | @@ -611,7 +623,7 @@ static ssize_t ds2780_set_pio_pin(struct device *dev, | ||
4722 | return -EINVAL; | ||
4723 | } | ||
4724 | |||
4725 | - ret = ds2780_write(dev_info->w1_dev, &new_setting, | ||
4726 | + ret = ds2780_write(dev_info, &new_setting, | ||
4727 | DS2780_SFR_REG, sizeof(u8)); | ||
4728 | if (ret < 0) | ||
4729 | return ret; | ||
4730 | @@ -632,7 +644,7 @@ static ssize_t ds2780_read_param_eeprom_bin(struct file *filp, | ||
4731 | DS2780_EEPROM_BLOCK1_END - | ||
4732 | DS2780_EEPROM_BLOCK1_START + 1 - off); | ||
4733 | |||
4734 | - return ds2780_read_block(dev_info->w1_dev, buf, | ||
4735 | + return ds2780_read_block(dev_info, buf, | ||
4736 | DS2780_EEPROM_BLOCK1_START + off, count); | ||
4737 | } | ||
4738 | |||
4739 | @@ -650,7 +662,7 @@ static ssize_t ds2780_write_param_eeprom_bin(struct file *filp, | ||
4740 | DS2780_EEPROM_BLOCK1_END - | ||
4741 | DS2780_EEPROM_BLOCK1_START + 1 - off); | ||
4742 | |||
4743 | - ret = ds2780_write(dev_info->w1_dev, buf, | ||
4744 | + ret = ds2780_write(dev_info, buf, | ||
4745 | DS2780_EEPROM_BLOCK1_START + off, count); | ||
4746 | if (ret < 0) | ||
4747 | return ret; | ||
4748 | @@ -685,9 +697,8 @@ static ssize_t ds2780_read_user_eeprom_bin(struct file *filp, | ||
4749 | DS2780_EEPROM_BLOCK0_END - | ||
4750 | DS2780_EEPROM_BLOCK0_START + 1 - off); | ||
4751 | |||
4752 | - return ds2780_read_block(dev_info->w1_dev, buf, | ||
4753 | + return ds2780_read_block(dev_info, buf, | ||
4754 | DS2780_EEPROM_BLOCK0_START + off, count); | ||
4755 | - | ||
4756 | } | ||
4757 | |||
4758 | static ssize_t ds2780_write_user_eeprom_bin(struct file *filp, | ||
4759 | @@ -704,7 +715,7 @@ static ssize_t ds2780_write_user_eeprom_bin(struct file *filp, | ||
4760 | DS2780_EEPROM_BLOCK0_END - | ||
4761 | DS2780_EEPROM_BLOCK0_START + 1 - off); | ||
4762 | |||
4763 | - ret = ds2780_write(dev_info->w1_dev, buf, | ||
4764 | + ret = ds2780_write(dev_info, buf, | ||
4765 | DS2780_EEPROM_BLOCK0_START + off, count); | ||
4766 | if (ret < 0) | ||
4767 | return ret; | ||
4768 | @@ -768,6 +779,7 @@ static int __devinit ds2780_battery_probe(struct platform_device *pdev) | ||
4769 | dev_info->bat.properties = ds2780_battery_props; | ||
4770 | dev_info->bat.num_properties = ARRAY_SIZE(ds2780_battery_props); | ||
4771 | dev_info->bat.get_property = ds2780_battery_get_property; | ||
4772 | + dev_info->mutex_holder = current; | ||
4773 | |||
4774 | ret = power_supply_register(&pdev->dev, &dev_info->bat); | ||
4775 | if (ret) { | ||
4776 | @@ -797,6 +809,8 @@ static int __devinit ds2780_battery_probe(struct platform_device *pdev) | ||
4777 | goto fail_remove_bin_file; | ||
4778 | } | ||
4779 | |||
4780 | + dev_info->mutex_holder = NULL; | ||
4781 | + | ||
4782 | return 0; | ||
4783 | |||
4784 | fail_remove_bin_file: | ||
4785 | @@ -816,6 +830,8 @@ static int __devexit ds2780_battery_remove(struct platform_device *pdev) | ||
4786 | { | ||
4787 | struct ds2780_device_info *dev_info = platform_get_drvdata(pdev); | ||
4788 | |||
4789 | + dev_info->mutex_holder = current; | ||
4790 | + | ||
4791 | /* remove attributes */ | ||
4792 | sysfs_remove_group(&dev_info->bat.dev->kobj, &ds2780_attr_group); | ||
4793 | |||
4794 | diff --git a/drivers/s390/cio/ccwgroup.c b/drivers/s390/cio/ccwgroup.c | ||
4795 | index 5c56741..cda9bd6 100644 | ||
4796 | --- a/drivers/s390/cio/ccwgroup.c | ||
4797 | +++ b/drivers/s390/cio/ccwgroup.c | ||
4798 | @@ -87,6 +87,12 @@ static void __ccwgroup_remove_cdev_refs(struct ccwgroup_device *gdev) | ||
4799 | } | ||
4800 | } | ||
4801 | |||
4802 | +static ssize_t ccwgroup_online_store(struct device *dev, | ||
4803 | + struct device_attribute *attr, | ||
4804 | + const char *buf, size_t count); | ||
4805 | +static ssize_t ccwgroup_online_show(struct device *dev, | ||
4806 | + struct device_attribute *attr, | ||
4807 | + char *buf); | ||
4808 | /* | ||
4809 | * Provide an 'ungroup' attribute so the user can remove group devices no | ||
4810 | * longer needed or accidentially created. Saves memory :) | ||
4811 | @@ -134,6 +140,20 @@ out: | ||
4812 | } | ||
4813 | |||
4814 | static DEVICE_ATTR(ungroup, 0200, NULL, ccwgroup_ungroup_store); | ||
4815 | +static DEVICE_ATTR(online, 0644, ccwgroup_online_show, ccwgroup_online_store); | ||
4816 | + | ||
4817 | +static struct attribute *ccwgroup_attrs[] = { | ||
4818 | + &dev_attr_online.attr, | ||
4819 | + &dev_attr_ungroup.attr, | ||
4820 | + NULL, | ||
4821 | +}; | ||
4822 | +static struct attribute_group ccwgroup_attr_group = { | ||
4823 | + .attrs = ccwgroup_attrs, | ||
4824 | +}; | ||
4825 | +static const struct attribute_group *ccwgroup_attr_groups[] = { | ||
4826 | + &ccwgroup_attr_group, | ||
4827 | + NULL, | ||
4828 | +}; | ||
4829 | |||
4830 | static void | ||
4831 | ccwgroup_release (struct device *dev) | ||
4832 | @@ -293,25 +313,17 @@ int ccwgroup_create_from_string(struct device *root, unsigned int creator_id, | ||
4833 | } | ||
4834 | |||
4835 | dev_set_name(&gdev->dev, "%s", dev_name(&gdev->cdev[0]->dev)); | ||
4836 | - | ||
4837 | + gdev->dev.groups = ccwgroup_attr_groups; | ||
4838 | rc = device_add(&gdev->dev); | ||
4839 | if (rc) | ||
4840 | goto error; | ||
4841 | get_device(&gdev->dev); | ||
4842 | - rc = device_create_file(&gdev->dev, &dev_attr_ungroup); | ||
4843 | - | ||
4844 | - if (rc) { | ||
4845 | - device_unregister(&gdev->dev); | ||
4846 | - goto error; | ||
4847 | - } | ||
4848 | - | ||
4849 | rc = __ccwgroup_create_symlinks(gdev); | ||
4850 | if (!rc) { | ||
4851 | mutex_unlock(&gdev->reg_mutex); | ||
4852 | put_device(&gdev->dev); | ||
4853 | return 0; | ||
4854 | } | ||
4855 | - device_remove_file(&gdev->dev, &dev_attr_ungroup); | ||
4856 | device_unregister(&gdev->dev); | ||
4857 | error: | ||
4858 | for (i = 0; i < num_devices; i++) | ||
4859 | @@ -423,7 +435,7 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const | ||
4860 | int ret; | ||
4861 | |||
4862 | if (!dev->driver) | ||
4863 | - return -ENODEV; | ||
4864 | + return -EINVAL; | ||
4865 | |||
4866 | gdev = to_ccwgroupdev(dev); | ||
4867 | gdrv = to_ccwgroupdrv(dev->driver); | ||
4868 | @@ -456,8 +468,6 @@ ccwgroup_online_show (struct device *dev, struct device_attribute *attr, char *b | ||
4869 | return sprintf(buf, online ? "1\n" : "0\n"); | ||
4870 | } | ||
4871 | |||
4872 | -static DEVICE_ATTR(online, 0644, ccwgroup_online_show, ccwgroup_online_store); | ||
4873 | - | ||
4874 | static int | ||
4875 | ccwgroup_probe (struct device *dev) | ||
4876 | { | ||
4877 | @@ -469,12 +479,7 @@ ccwgroup_probe (struct device *dev) | ||
4878 | gdev = to_ccwgroupdev(dev); | ||
4879 | gdrv = to_ccwgroupdrv(dev->driver); | ||
4880 | |||
4881 | - if ((ret = device_create_file(dev, &dev_attr_online))) | ||
4882 | - return ret; | ||
4883 | - | ||
4884 | ret = gdrv->probe ? gdrv->probe(gdev) : -ENODEV; | ||
4885 | - if (ret) | ||
4886 | - device_remove_file(dev, &dev_attr_online); | ||
4887 | |||
4888 | return ret; | ||
4889 | } | ||
4890 | @@ -485,9 +490,6 @@ ccwgroup_remove (struct device *dev) | ||
4891 | struct ccwgroup_device *gdev; | ||
4892 | struct ccwgroup_driver *gdrv; | ||
4893 | |||
4894 | - device_remove_file(dev, &dev_attr_online); | ||
4895 | - device_remove_file(dev, &dev_attr_ungroup); | ||
4896 | - | ||
4897 | if (!dev->driver) | ||
4898 | return 0; | ||
4899 | |||
4900 | diff --git a/drivers/scsi/device_handler/scsi_dh.c b/drivers/scsi/device_handler/scsi_dh.c | ||
4901 | index 0119b81..d973325 100644 | ||
4902 | --- a/drivers/scsi/device_handler/scsi_dh.c | ||
4903 | +++ b/drivers/scsi/device_handler/scsi_dh.c | ||
4904 | @@ -398,7 +398,15 @@ int scsi_dh_activate(struct request_queue *q, activate_complete fn, void *data) | ||
4905 | |||
4906 | spin_lock_irqsave(q->queue_lock, flags); | ||
4907 | sdev = q->queuedata; | ||
4908 | - if (sdev && sdev->scsi_dh_data) | ||
4909 | + if (!sdev) { | ||
4910 | + spin_unlock_irqrestore(q->queue_lock, flags); | ||
4911 | + err = SCSI_DH_NOSYS; | ||
4912 | + if (fn) | ||
4913 | + fn(data, err); | ||
4914 | + return err; | ||
4915 | + } | ||
4916 | + | ||
4917 | + if (sdev->scsi_dh_data) | ||
4918 | scsi_dh = sdev->scsi_dh_data->scsi_dh; | ||
4919 | dev = get_device(&sdev->sdev_gendev); | ||
4920 | if (!scsi_dh || !dev || | ||
4921 | diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c | ||
4922 | index 4f7a582..351dc0b 100644 | ||
4923 | --- a/drivers/scsi/hosts.c | ||
4924 | +++ b/drivers/scsi/hosts.c | ||
4925 | @@ -286,6 +286,7 @@ static void scsi_host_dev_release(struct device *dev) | ||
4926 | { | ||
4927 | struct Scsi_Host *shost = dev_to_shost(dev); | ||
4928 | struct device *parent = dev->parent; | ||
4929 | + struct request_queue *q; | ||
4930 | |||
4931 | scsi_proc_hostdir_rm(shost->hostt); | ||
4932 | |||
4933 | @@ -293,9 +294,11 @@ static void scsi_host_dev_release(struct device *dev) | ||
4934 | kthread_stop(shost->ehandler); | ||
4935 | if (shost->work_q) | ||
4936 | destroy_workqueue(shost->work_q); | ||
4937 | - if (shost->uspace_req_q) { | ||
4938 | - kfree(shost->uspace_req_q->queuedata); | ||
4939 | - scsi_free_queue(shost->uspace_req_q); | ||
4940 | + q = shost->uspace_req_q; | ||
4941 | + if (q) { | ||
4942 | + kfree(q->queuedata); | ||
4943 | + q->queuedata = NULL; | ||
4944 | + scsi_free_queue(q); | ||
4945 | } | ||
4946 | |||
4947 | scsi_destroy_command_freelist(shost); | ||
4948 | diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c | ||
4949 | index b200b73..8c713d3 100644 | ||
4950 | --- a/drivers/scsi/hpsa.c | ||
4951 | +++ b/drivers/scsi/hpsa.c | ||
4952 | @@ -3300,6 +3300,13 @@ static int hpsa_controller_hard_reset(struct pci_dev *pdev, | ||
4953 | pmcsr &= ~PCI_PM_CTRL_STATE_MASK; | ||
4954 | pmcsr |= PCI_D0; | ||
4955 | pci_write_config_word(pdev, pos + PCI_PM_CTRL, pmcsr); | ||
4956 | + | ||
4957 | + /* | ||
4958 | + * The P600 requires a small delay when changing states. | ||
4959 | + * Otherwise we may think the board did not reset and we bail. | ||
4960 | + * This for kdump only and is particular to the P600. | ||
4961 | + */ | ||
4962 | + msleep(500); | ||
4963 | } | ||
4964 | return 0; | ||
4965 | } | ||
4966 | diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c | ||
4967 | index 8d63630..acbb924 100644 | ||
4968 | --- a/drivers/scsi/ipr.c | ||
4969 | +++ b/drivers/scsi/ipr.c | ||
4970 | @@ -8812,7 +8812,7 @@ static int __devinit ipr_probe_ioa(struct pci_dev *pdev, | ||
4971 | uproc = readl(ioa_cfg->regs.sense_uproc_interrupt_reg32); | ||
4972 | if ((mask & IPR_PCII_HRRQ_UPDATED) == 0 || (uproc & IPR_UPROCI_RESET_ALERT)) | ||
4973 | ioa_cfg->needs_hard_reset = 1; | ||
4974 | - if (interrupts & IPR_PCII_ERROR_INTERRUPTS) | ||
4975 | + if ((interrupts & IPR_PCII_ERROR_INTERRUPTS) || reset_devices) | ||
4976 | ioa_cfg->needs_hard_reset = 1; | ||
4977 | if (interrupts & IPR_PCII_IOA_UNIT_CHECKED) | ||
4978 | ioa_cfg->ioa_unit_checked = 1; | ||
4979 | diff --git a/drivers/scsi/isci/isci.h b/drivers/scsi/isci/isci.h | ||
4980 | index d1de633..8efeb6b 100644 | ||
4981 | --- a/drivers/scsi/isci/isci.h | ||
4982 | +++ b/drivers/scsi/isci/isci.h | ||
4983 | @@ -97,7 +97,7 @@ | ||
4984 | #define SCU_MAX_COMPLETION_QUEUE_SHIFT (ilog2(SCU_MAX_COMPLETION_QUEUE_ENTRIES)) | ||
4985 | |||
4986 | #define SCU_ABSOLUTE_MAX_UNSOLICITED_FRAMES (4096) | ||
4987 | -#define SCU_UNSOLICITED_FRAME_BUFFER_SIZE (1024) | ||
4988 | +#define SCU_UNSOLICITED_FRAME_BUFFER_SIZE (1024U) | ||
4989 | #define SCU_INVALID_FRAME_INDEX (0xFFFF) | ||
4990 | |||
4991 | #define SCU_IO_REQUEST_MAX_SGE_SIZE (0x00FFFFFF) | ||
4992 | diff --git a/drivers/scsi/isci/port_config.c b/drivers/scsi/isci/port_config.c | ||
4993 | index 486b113..38a99d2 100644 | ||
4994 | --- a/drivers/scsi/isci/port_config.c | ||
4995 | +++ b/drivers/scsi/isci/port_config.c | ||
4996 | @@ -678,7 +678,7 @@ static void apc_agent_timeout(unsigned long data) | ||
4997 | configure_phy_mask = ~port_agent->phy_configured_mask & port_agent->phy_ready_mask; | ||
4998 | |||
4999 | if (!configure_phy_mask) | ||
5000 | - return; | ||
5001 | + goto done; | ||
5002 | |||
5003 | for (index = 0; index < SCI_MAX_PHYS; index++) { | ||
5004 | if ((configure_phy_mask & (1 << index)) == 0) | ||
5005 | diff --git a/drivers/scsi/isci/request.c b/drivers/scsi/isci/request.c | ||
5006 | index b5d3a8c..225b196 100644 | ||
5007 | --- a/drivers/scsi/isci/request.c | ||
5008 | +++ b/drivers/scsi/isci/request.c | ||
5009 | @@ -1490,29 +1490,30 @@ sci_io_request_frame_handler(struct isci_request *ireq, | ||
5010 | return SCI_SUCCESS; | ||
5011 | |||
5012 | case SCI_REQ_SMP_WAIT_RESP: { | ||
5013 | - struct smp_resp *rsp_hdr = &ireq->smp.rsp; | ||
5014 | - void *frame_header; | ||
5015 | + struct sas_task *task = isci_request_access_task(ireq); | ||
5016 | + struct scatterlist *sg = &task->smp_task.smp_resp; | ||
5017 | + void *frame_header, *kaddr; | ||
5018 | + u8 *rsp; | ||
5019 | |||
5020 | sci_unsolicited_frame_control_get_header(&ihost->uf_control, | ||
5021 | - frame_index, | ||
5022 | - &frame_header); | ||
5023 | - | ||
5024 | - /* byte swap the header. */ | ||
5025 | - word_cnt = SMP_RESP_HDR_SZ / sizeof(u32); | ||
5026 | - sci_swab32_cpy(rsp_hdr, frame_header, word_cnt); | ||
5027 | + frame_index, | ||
5028 | + &frame_header); | ||
5029 | + kaddr = kmap_atomic(sg_page(sg), KM_IRQ0); | ||
5030 | + rsp = kaddr + sg->offset; | ||
5031 | + sci_swab32_cpy(rsp, frame_header, 1); | ||
5032 | |||
5033 | - if (rsp_hdr->frame_type == SMP_RESPONSE) { | ||
5034 | + if (rsp[0] == SMP_RESPONSE) { | ||
5035 | void *smp_resp; | ||
5036 | |||
5037 | sci_unsolicited_frame_control_get_buffer(&ihost->uf_control, | ||
5038 | - frame_index, | ||
5039 | - &smp_resp); | ||
5040 | + frame_index, | ||
5041 | + &smp_resp); | ||
5042 | |||
5043 | - word_cnt = (sizeof(struct smp_resp) - SMP_RESP_HDR_SZ) / | ||
5044 | - sizeof(u32); | ||
5045 | - | ||
5046 | - sci_swab32_cpy(((u8 *) rsp_hdr) + SMP_RESP_HDR_SZ, | ||
5047 | - smp_resp, word_cnt); | ||
5048 | + word_cnt = (sg->length/4)-1; | ||
5049 | + if (word_cnt > 0) | ||
5050 | + word_cnt = min_t(unsigned int, word_cnt, | ||
5051 | + SCU_UNSOLICITED_FRAME_BUFFER_SIZE/4); | ||
5052 | + sci_swab32_cpy(rsp + 4, smp_resp, word_cnt); | ||
5053 | |||
5054 | ireq->scu_status = SCU_TASK_DONE_GOOD; | ||
5055 | ireq->sci_status = SCI_SUCCESS; | ||
5056 | @@ -1528,12 +1529,13 @@ sci_io_request_frame_handler(struct isci_request *ireq, | ||
5057 | __func__, | ||
5058 | ireq, | ||
5059 | frame_index, | ||
5060 | - rsp_hdr->frame_type); | ||
5061 | + rsp[0]); | ||
5062 | |||
5063 | ireq->scu_status = SCU_TASK_DONE_SMP_FRM_TYPE_ERR; | ||
5064 | ireq->sci_status = SCI_FAILURE_CONTROLLER_SPECIFIC_IO_ERR; | ||
5065 | sci_change_state(&ireq->sm, SCI_REQ_COMPLETED); | ||
5066 | } | ||
5067 | + kunmap_atomic(kaddr, KM_IRQ0); | ||
5068 | |||
5069 | sci_controller_release_frame(ihost, frame_index); | ||
5070 | |||
5071 | @@ -2603,18 +2605,7 @@ static void isci_request_io_request_complete(struct isci_host *ihost, | ||
5072 | status = SAM_STAT_GOOD; | ||
5073 | set_bit(IREQ_COMPLETE_IN_TARGET, &request->flags); | ||
5074 | |||
5075 | - if (task->task_proto == SAS_PROTOCOL_SMP) { | ||
5076 | - void *rsp = &request->smp.rsp; | ||
5077 | - | ||
5078 | - dev_dbg(&ihost->pdev->dev, | ||
5079 | - "%s: SMP protocol completion\n", | ||
5080 | - __func__); | ||
5081 | - | ||
5082 | - sg_copy_from_buffer( | ||
5083 | - &task->smp_task.smp_resp, 1, | ||
5084 | - rsp, sizeof(struct smp_resp)); | ||
5085 | - } else if (completion_status | ||
5086 | - == SCI_IO_SUCCESS_IO_DONE_EARLY) { | ||
5087 | + if (completion_status == SCI_IO_SUCCESS_IO_DONE_EARLY) { | ||
5088 | |||
5089 | /* This was an SSP / STP / SATA transfer. | ||
5090 | * There is a possibility that less data than | ||
5091 | diff --git a/drivers/scsi/isci/request.h b/drivers/scsi/isci/request.h | ||
5092 | index 7a1d5a9..58d70b6 100644 | ||
5093 | --- a/drivers/scsi/isci/request.h | ||
5094 | +++ b/drivers/scsi/isci/request.h | ||
5095 | @@ -174,9 +174,6 @@ struct isci_request { | ||
5096 | }; | ||
5097 | } ssp; | ||
5098 | struct { | ||
5099 | - struct smp_resp rsp; | ||
5100 | - } smp; | ||
5101 | - struct { | ||
5102 | struct isci_stp_request req; | ||
5103 | struct host_to_dev_fis cmd; | ||
5104 | struct dev_to_host_fis rsp; | ||
5105 | diff --git a/drivers/scsi/isci/sas.h b/drivers/scsi/isci/sas.h | ||
5106 | index 462b151..dc26b4a 100644 | ||
5107 | --- a/drivers/scsi/isci/sas.h | ||
5108 | +++ b/drivers/scsi/isci/sas.h | ||
5109 | @@ -204,8 +204,6 @@ struct smp_req { | ||
5110 | u8 req_data[0]; | ||
5111 | } __packed; | ||
5112 | |||
5113 | -#define SMP_RESP_HDR_SZ 4 | ||
5114 | - | ||
5115 | /* | ||
5116 | * struct sci_sas_address - This structure depicts how a SAS address is | ||
5117 | * represented by SCI. | ||
5118 | diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c | ||
5119 | index 16ad97d..37cbe4d 100644 | ||
5120 | --- a/drivers/scsi/libsas/sas_expander.c | ||
5121 | +++ b/drivers/scsi/libsas/sas_expander.c | ||
5122 | @@ -199,6 +199,8 @@ static void sas_set_ex_phy(struct domain_device *dev, int phy_id, | ||
5123 | phy->virtual = dr->virtual; | ||
5124 | phy->last_da_index = -1; | ||
5125 | |||
5126 | + phy->phy->identify.sas_address = SAS_ADDR(phy->attached_sas_addr); | ||
5127 | + phy->phy->identify.device_type = phy->attached_dev_type; | ||
5128 | phy->phy->identify.initiator_port_protocols = phy->attached_iproto; | ||
5129 | phy->phy->identify.target_port_protocols = phy->attached_tproto; | ||
5130 | phy->phy->identify.phy_identifier = phy_id; | ||
5131 | diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c | ||
5132 | index 776d019..839ad7b 100644 | ||
5133 | --- a/drivers/scsi/megaraid/megaraid_sas_base.c | ||
5134 | +++ b/drivers/scsi/megaraid/megaraid_sas_base.c | ||
5135 | @@ -1907,7 +1907,6 @@ static int megasas_generic_reset(struct scsi_cmnd *scmd) | ||
5136 | static enum | ||
5137 | blk_eh_timer_return megasas_reset_timer(struct scsi_cmnd *scmd) | ||
5138 | { | ||
5139 | - struct megasas_cmd *cmd = (struct megasas_cmd *)scmd->SCp.ptr; | ||
5140 | struct megasas_instance *instance; | ||
5141 | unsigned long flags; | ||
5142 | |||
5143 | @@ -1916,7 +1915,7 @@ blk_eh_timer_return megasas_reset_timer(struct scsi_cmnd *scmd) | ||
5144 | return BLK_EH_NOT_HANDLED; | ||
5145 | } | ||
5146 | |||
5147 | - instance = cmd->instance; | ||
5148 | + instance = (struct megasas_instance *)scmd->device->host->hostdata; | ||
5149 | if (!(instance->flag & MEGASAS_FW_BUSY)) { | ||
5150 | /* FW is busy, throttle IO */ | ||
5151 | spin_lock_irqsave(instance->host->host_lock, flags); | ||
5152 | diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c | ||
5153 | index 6abd2fc..97aac82 100644 | ||
5154 | --- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c | ||
5155 | +++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c | ||
5156 | @@ -7461,22 +7461,27 @@ _scsih_probe_sas(struct MPT2SAS_ADAPTER *ioc) | ||
5157 | /* SAS Device List */ | ||
5158 | list_for_each_entry_safe(sas_device, next, &ioc->sas_device_init_list, | ||
5159 | list) { | ||
5160 | - spin_lock_irqsave(&ioc->sas_device_lock, flags); | ||
5161 | - list_move_tail(&sas_device->list, &ioc->sas_device_list); | ||
5162 | - spin_unlock_irqrestore(&ioc->sas_device_lock, flags); | ||
5163 | |||
5164 | if (ioc->hide_drives) | ||
5165 | continue; | ||
5166 | |||
5167 | if (!mpt2sas_transport_port_add(ioc, sas_device->handle, | ||
5168 | sas_device->sas_address_parent)) { | ||
5169 | - _scsih_sas_device_remove(ioc, sas_device); | ||
5170 | + list_del(&sas_device->list); | ||
5171 | + kfree(sas_device); | ||
5172 | + continue; | ||
5173 | } else if (!sas_device->starget) { | ||
5174 | mpt2sas_transport_port_remove(ioc, | ||
5175 | sas_device->sas_address, | ||
5176 | sas_device->sas_address_parent); | ||
5177 | - _scsih_sas_device_remove(ioc, sas_device); | ||
5178 | + list_del(&sas_device->list); | ||
5179 | + kfree(sas_device); | ||
5180 | + continue; | ||
5181 | + | ||
5182 | } | ||
5183 | + spin_lock_irqsave(&ioc->sas_device_lock, flags); | ||
5184 | + list_move_tail(&sas_device->list, &ioc->sas_device_list); | ||
5185 | + spin_unlock_irqrestore(&ioc->sas_device_lock, flags); | ||
5186 | } | ||
5187 | } | ||
5188 | |||
5189 | diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c | ||
5190 | index fc3f168..b4d43ae 100644 | ||
5191 | --- a/drivers/scsi/scsi_lib.c | ||
5192 | +++ b/drivers/scsi/scsi_lib.c | ||
5193 | @@ -1698,6 +1698,15 @@ struct request_queue *scsi_alloc_queue(struct scsi_device *sdev) | ||
5194 | |||
5195 | void scsi_free_queue(struct request_queue *q) | ||
5196 | { | ||
5197 | + unsigned long flags; | ||
5198 | + | ||
5199 | + WARN_ON(q->queuedata); | ||
5200 | + | ||
5201 | + /* cause scsi_request_fn() to kill all non-finished requests */ | ||
5202 | + spin_lock_irqsave(q->queue_lock, flags); | ||
5203 | + q->request_fn(q); | ||
5204 | + spin_unlock_irqrestore(q->queue_lock, flags); | ||
5205 | + | ||
5206 | blk_cleanup_queue(q); | ||
5207 | } | ||
5208 | |||
5209 | diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c | ||
5210 | index 44e8ca3..72273a0 100644 | ||
5211 | --- a/drivers/scsi/scsi_scan.c | ||
5212 | +++ b/drivers/scsi/scsi_scan.c | ||
5213 | @@ -322,6 +322,7 @@ out_device_destroy: | ||
5214 | scsi_device_set_state(sdev, SDEV_DEL); | ||
5215 | transport_destroy_device(&sdev->sdev_gendev); | ||
5216 | put_device(&sdev->sdev_dev); | ||
5217 | + scsi_free_queue(sdev->request_queue); | ||
5218 | put_device(&sdev->sdev_gendev); | ||
5219 | out: | ||
5220 | if (display_failure_msg) | ||
5221 | diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c | ||
5222 | index 1871b8a..9b28f39 100644 | ||
5223 | --- a/drivers/scsi/st.c | ||
5224 | +++ b/drivers/scsi/st.c | ||
5225 | @@ -462,14 +462,16 @@ static void st_scsi_execute_end(struct request *req, int uptodate) | ||
5226 | { | ||
5227 | struct st_request *SRpnt = req->end_io_data; | ||
5228 | struct scsi_tape *STp = SRpnt->stp; | ||
5229 | + struct bio *tmp; | ||
5230 | |||
5231 | STp->buffer->cmdstat.midlevel_result = SRpnt->result = req->errors; | ||
5232 | STp->buffer->cmdstat.residual = req->resid_len; | ||
5233 | |||
5234 | + tmp = SRpnt->bio; | ||
5235 | if (SRpnt->waiting) | ||
5236 | complete(SRpnt->waiting); | ||
5237 | |||
5238 | - blk_rq_unmap_user(SRpnt->bio); | ||
5239 | + blk_rq_unmap_user(tmp); | ||
5240 | __blk_put_request(req->q, req); | ||
5241 | } | ||
5242 | |||
5243 | diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c | ||
5244 | index fde3a2d..322be7a 100644 | ||
5245 | --- a/drivers/spi/spi-omap2-mcspi.c | ||
5246 | +++ b/drivers/spi/spi-omap2-mcspi.c | ||
5247 | @@ -1116,15 +1116,16 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev) | ||
5248 | status = -ENODEV; | ||
5249 | goto err1; | ||
5250 | } | ||
5251 | + | ||
5252 | + r->start += pdata->regs_offset; | ||
5253 | + r->end += pdata->regs_offset; | ||
5254 | + mcspi->phys = r->start; | ||
5255 | if (!request_mem_region(r->start, resource_size(r), | ||
5256 | dev_name(&pdev->dev))) { | ||
5257 | status = -EBUSY; | ||
5258 | goto err1; | ||
5259 | } | ||
5260 | |||
5261 | - r->start += pdata->regs_offset; | ||
5262 | - r->end += pdata->regs_offset; | ||
5263 | - mcspi->phys = r->start; | ||
5264 | mcspi->base = ioremap(r->start, resource_size(r)); | ||
5265 | if (!mcspi->base) { | ||
5266 | dev_dbg(&pdev->dev, "can't ioremap MCSPI\n"); | ||
5267 | diff --git a/drivers/staging/hv/hyperv_storage.h b/drivers/staging/hv/hyperv_storage.h | ||
5268 | index a01f9a0..5af82f4 100644 | ||
5269 | --- a/drivers/staging/hv/hyperv_storage.h | ||
5270 | +++ b/drivers/staging/hv/hyperv_storage.h | ||
5271 | @@ -218,6 +218,7 @@ struct vstor_packet { | ||
5272 | #define STORVSC_MAX_LUNS_PER_TARGET 64 | ||
5273 | #define STORVSC_MAX_TARGETS 1 | ||
5274 | #define STORVSC_MAX_CHANNELS 1 | ||
5275 | +#define STORVSC_MAX_CMD_LEN 16 | ||
5276 | |||
5277 | struct hv_storvsc_request; | ||
5278 | |||
5279 | diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c | ||
5280 | index 61989f0..88d5193 100644 | ||
5281 | --- a/drivers/staging/hv/netvsc_drv.c | ||
5282 | +++ b/drivers/staging/hv/netvsc_drv.c | ||
5283 | @@ -217,8 +217,8 @@ void netvsc_linkstatus_callback(struct hv_device *device_obj, | ||
5284 | if (status == 1) { | ||
5285 | netif_carrier_on(net); | ||
5286 | netif_wake_queue(net); | ||
5287 | - netif_notify_peers(net); | ||
5288 | ndev_ctx = netdev_priv(net); | ||
5289 | + schedule_delayed_work(&ndev_ctx->dwork, 0); | ||
5290 | schedule_delayed_work(&ndev_ctx->dwork, msecs_to_jiffies(20)); | ||
5291 | } else { | ||
5292 | netif_carrier_off(net); | ||
5293 | diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c | ||
5294 | index 7effaf3..26983ac 100644 | ||
5295 | --- a/drivers/staging/hv/storvsc_drv.c | ||
5296 | +++ b/drivers/staging/hv/storvsc_drv.c | ||
5297 | @@ -701,6 +701,8 @@ static int storvsc_probe(struct hv_device *device) | ||
5298 | host->max_id = STORVSC_MAX_TARGETS; | ||
5299 | /* max # of channels */ | ||
5300 | host->max_channel = STORVSC_MAX_CHANNELS - 1; | ||
5301 | + /* max cmd length */ | ||
5302 | + host->max_cmd_len = STORVSC_MAX_CMD_LEN; | ||
5303 | |||
5304 | /* Register the HBA and start the scsi bus scan */ | ||
5305 | ret = scsi_add_host(host, &device->device); | ||
5306 | diff --git a/drivers/staging/quatech_usb2/quatech_usb2.c b/drivers/staging/quatech_usb2/quatech_usb2.c | ||
5307 | index ca098ca..02fafec 100644 | ||
5308 | --- a/drivers/staging/quatech_usb2/quatech_usb2.c | ||
5309 | +++ b/drivers/staging/quatech_usb2/quatech_usb2.c | ||
5310 | @@ -916,9 +916,10 @@ static int qt2_ioctl(struct tty_struct *tty, | ||
5311 | dbg("%s() port %d, cmd == TIOCMIWAIT enter", | ||
5312 | __func__, port->number); | ||
5313 | prev_msr_value = port_extra->shadowMSR & QT2_SERIAL_MSR_MASK; | ||
5314 | + barrier(); | ||
5315 | + __set_current_state(TASK_INTERRUPTIBLE); | ||
5316 | while (1) { | ||
5317 | add_wait_queue(&port_extra->wait, &wait); | ||
5318 | - set_current_state(TASK_INTERRUPTIBLE); | ||
5319 | schedule(); | ||
5320 | dbg("%s(): port %d, cmd == TIOCMIWAIT here\n", | ||
5321 | __func__, port->number); | ||
5322 | @@ -926,9 +927,12 @@ static int qt2_ioctl(struct tty_struct *tty, | ||
5323 | /* see if a signal woke us up */ | ||
5324 | if (signal_pending(current)) | ||
5325 | return -ERESTARTSYS; | ||
5326 | + set_current_state(TASK_INTERRUPTIBLE); | ||
5327 | msr_value = port_extra->shadowMSR & QT2_SERIAL_MSR_MASK; | ||
5328 | - if (msr_value == prev_msr_value) | ||
5329 | + if (msr_value == prev_msr_value) { | ||
5330 | + __set_current_state(TASK_RUNNING); | ||
5331 | return -EIO; /* no change - error */ | ||
5332 | + } | ||
5333 | if ((arg & TIOCM_RNG && | ||
5334 | ((prev_msr_value & QT2_SERIAL_MSR_RI) == | ||
5335 | (msr_value & QT2_SERIAL_MSR_RI))) || | ||
5336 | @@ -941,6 +945,7 @@ static int qt2_ioctl(struct tty_struct *tty, | ||
5337 | (arg & TIOCM_CTS && | ||
5338 | ((prev_msr_value & QT2_SERIAL_MSR_CTS) == | ||
5339 | (msr_value & QT2_SERIAL_MSR_CTS)))) { | ||
5340 | + __set_current_state(TASK_RUNNING); | ||
5341 | return 0; | ||
5342 | } | ||
5343 | } /* end inifinite while */ | ||
5344 | diff --git a/drivers/staging/serqt_usb2/serqt_usb2.c b/drivers/staging/serqt_usb2/serqt_usb2.c | ||
5345 | index 12f5eba..48aa61e 100644 | ||
5346 | --- a/drivers/staging/serqt_usb2/serqt_usb2.c | ||
5347 | +++ b/drivers/staging/serqt_usb2/serqt_usb2.c | ||
5348 | @@ -24,7 +24,6 @@ static int debug; | ||
5349 | #define DRIVER_DESC "Quatech USB to Serial Driver" | ||
5350 | |||
5351 | #define USB_VENDOR_ID_QUATECH 0x061d /* Quatech VID */ | ||
5352 | -#define QUATECH_SSU100 0xC020 /* SSU100 */ | ||
5353 | #define QUATECH_SSU200 0xC030 /* SSU200 */ | ||
5354 | #define QUATECH_DSU100 0xC040 /* DSU100 */ | ||
5355 | #define QUATECH_DSU200 0xC050 /* DSU200 */ | ||
5356 | @@ -127,7 +126,6 @@ static int debug; | ||
5357 | #define RS232_MODE 0x00 | ||
5358 | |||
5359 | static const struct usb_device_id serqt_id_table[] = { | ||
5360 | - {USB_DEVICE(USB_VENDOR_ID_QUATECH, QUATECH_SSU100)}, | ||
5361 | {USB_DEVICE(USB_VENDOR_ID_QUATECH, QUATECH_SSU200)}, | ||
5362 | {USB_DEVICE(USB_VENDOR_ID_QUATECH, QUATECH_DSU100)}, | ||
5363 | {USB_DEVICE(USB_VENDOR_ID_QUATECH, QUATECH_DSU200)}, | ||
5364 | @@ -775,7 +773,6 @@ static int qt_startup(struct usb_serial *serial) | ||
5365 | } | ||
5366 | |||
5367 | switch (serial->dev->descriptor.idProduct) { | ||
5368 | - case QUATECH_SSU100: | ||
5369 | case QUATECH_DSU100: | ||
5370 | case QUATECH_QSU100: | ||
5371 | case QUATECH_ESU100A: | ||
5372 | diff --git a/drivers/staging/usbip/usbip_common.h b/drivers/staging/usbip/usbip_common.h | ||
5373 | index 074ac42..be21617 100644 | ||
5374 | --- a/drivers/staging/usbip/usbip_common.h | ||
5375 | +++ b/drivers/staging/usbip/usbip_common.h | ||
5376 | @@ -126,12 +126,12 @@ extern struct device_attribute dev_attr_usbip_debug; | ||
5377 | * | ||
5378 | */ | ||
5379 | #define USBIP_CMD_SUBMIT 0x0001 | ||
5380 | -#define USBIP_RET_SUBMIT 0x0002 | ||
5381 | -#define USBIP_CMD_UNLINK 0x0003 | ||
5382 | +#define USBIP_CMD_UNLINK 0x0002 | ||
5383 | +#define USBIP_RET_SUBMIT 0x0003 | ||
5384 | #define USBIP_RET_UNLINK 0x0004 | ||
5385 | |||
5386 | -#define USBIP_DIR_IN 0x00 | ||
5387 | -#define USBIP_DIR_OUT 0x01 | ||
5388 | +#define USBIP_DIR_OUT 0x00 | ||
5389 | +#define USBIP_DIR_IN 0x01 | ||
5390 | |||
5391 | /** | ||
5392 | * struct usbip_header_basic - data pertinent to every request | ||
5393 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c | ||
5394 | index 6a4ea29..26a5d8b 100644 | ||
5395 | --- a/drivers/target/iscsi/iscsi_target.c | ||
5396 | +++ b/drivers/target/iscsi/iscsi_target.c | ||
5397 | @@ -1079,7 +1079,9 @@ attach_cmd: | ||
5398 | */ | ||
5399 | if (!cmd->immediate_data) { | ||
5400 | cmdsn_ret = iscsit_sequence_cmd(conn, cmd, hdr->cmdsn); | ||
5401 | - if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) | ||
5402 | + if (cmdsn_ret == CMDSN_LOWER_THAN_EXP) | ||
5403 | + return 0; | ||
5404 | + else if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) | ||
5405 | return iscsit_add_reject_from_cmd( | ||
5406 | ISCSI_REASON_PROTOCOL_ERROR, | ||
5407 | 1, 0, buf, cmd); | ||
5408 | @@ -1819,17 +1821,16 @@ attach: | ||
5409 | int cmdsn_ret = iscsit_sequence_cmd(conn, cmd, hdr->cmdsn); | ||
5410 | if (cmdsn_ret == CMDSN_HIGHER_THAN_EXP) | ||
5411 | out_of_order_cmdsn = 1; | ||
5412 | - else if (cmdsn_ret == CMDSN_LOWER_THAN_EXP) { | ||
5413 | + else if (cmdsn_ret == CMDSN_LOWER_THAN_EXP) | ||
5414 | return 0; | ||
5415 | - } else { /* (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) */ | ||
5416 | + else if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) | ||
5417 | return iscsit_add_reject_from_cmd( | ||
5418 | ISCSI_REASON_PROTOCOL_ERROR, | ||
5419 | 1, 0, buf, cmd); | ||
5420 | - } | ||
5421 | } | ||
5422 | iscsit_ack_from_expstatsn(conn, hdr->exp_statsn); | ||
5423 | |||
5424 | - if (out_of_order_cmdsn) | ||
5425 | + if (out_of_order_cmdsn || !(hdr->opcode & ISCSI_OP_IMMEDIATE)) | ||
5426 | return 0; | ||
5427 | /* | ||
5428 | * Found the referenced task, send to transport for processing. | ||
5429 | diff --git a/drivers/target/loopback/tcm_loop.c b/drivers/target/loopback/tcm_loop.c | ||
5430 | index aa2d6799..fb85b35 100644 | ||
5431 | --- a/drivers/target/loopback/tcm_loop.c | ||
5432 | +++ b/drivers/target/loopback/tcm_loop.c | ||
5433 | @@ -174,6 +174,24 @@ static int tcm_loop_new_cmd_map(struct se_cmd *se_cmd) | ||
5434 | sgl_bidi = sdb->table.sgl; | ||
5435 | sgl_bidi_count = sdb->table.nents; | ||
5436 | } | ||
5437 | + /* | ||
5438 | + * Because some userspace code via scsi-generic do not memset their | ||
5439 | + * associated read buffers, go ahead and do that here for type | ||
5440 | + * SCF_SCSI_CONTROL_SG_IO_CDB. Also note that this is currently | ||
5441 | + * guaranteed to be a single SGL for SCF_SCSI_CONTROL_SG_IO_CDB | ||
5442 | + * by target core in transport_generic_allocate_tasks() -> | ||
5443 | + * transport_generic_cmd_sequencer(). | ||
5444 | + */ | ||
5445 | + if (se_cmd->se_cmd_flags & SCF_SCSI_CONTROL_SG_IO_CDB && | ||
5446 | + se_cmd->data_direction == DMA_FROM_DEVICE) { | ||
5447 | + struct scatterlist *sg = scsi_sglist(sc); | ||
5448 | + unsigned char *buf = kmap(sg_page(sg)) + sg->offset; | ||
5449 | + | ||
5450 | + if (buf != NULL) { | ||
5451 | + memset(buf, 0, sg->length); | ||
5452 | + kunmap(sg_page(sg)); | ||
5453 | + } | ||
5454 | + } | ||
5455 | |||
5456 | /* Tell the core about our preallocated memory */ | ||
5457 | ret = transport_generic_map_mem_to_cmd(se_cmd, scsi_sglist(sc), | ||
5458 | diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c | ||
5459 | index 98c98a3..8badcb4 100644 | ||
5460 | --- a/drivers/target/target_core_alua.c | ||
5461 | +++ b/drivers/target/target_core_alua.c | ||
5462 | @@ -68,6 +68,15 @@ int core_emulate_report_target_port_groups(struct se_cmd *cmd) | ||
5463 | unsigned char *buf; | ||
5464 | u32 rd_len = 0, off = 4; /* Skip over RESERVED area to first | ||
5465 | Target port group descriptor */ | ||
5466 | + /* | ||
5467 | + * Need at least 4 bytes of response data or else we can't | ||
5468 | + * even fit the return data length. | ||
5469 | + */ | ||
5470 | + if (cmd->data_length < 4) { | ||
5471 | + pr_warn("REPORT TARGET PORT GROUPS allocation length %u" | ||
5472 | + " too small\n", cmd->data_length); | ||
5473 | + return -EINVAL; | ||
5474 | + } | ||
5475 | |||
5476 | buf = transport_kmap_first_data_page(cmd); | ||
5477 | |||
5478 | @@ -75,6 +84,17 @@ int core_emulate_report_target_port_groups(struct se_cmd *cmd) | ||
5479 | list_for_each_entry(tg_pt_gp, &su_dev->t10_alua.tg_pt_gps_list, | ||
5480 | tg_pt_gp_list) { | ||
5481 | /* | ||
5482 | + * Check if the Target port group and Target port descriptor list | ||
5483 | + * based on tg_pt_gp_members count will fit into the response payload. | ||
5484 | + * Otherwise, bump rd_len to let the initiator know we have exceeded | ||
5485 | + * the allocation length and the response is truncated. | ||
5486 | + */ | ||
5487 | + if ((off + 8 + (tg_pt_gp->tg_pt_gp_members * 4)) > | ||
5488 | + cmd->data_length) { | ||
5489 | + rd_len += 8 + (tg_pt_gp->tg_pt_gp_members * 4); | ||
5490 | + continue; | ||
5491 | + } | ||
5492 | + /* | ||
5493 | * PREF: Preferred target port bit, determine if this | ||
5494 | * bit should be set for port group. | ||
5495 | */ | ||
5496 | diff --git a/drivers/target/target_core_tmr.c b/drivers/target/target_core_tmr.c | ||
5497 | index 27d4925..5c1b8c5 100644 | ||
5498 | --- a/drivers/target/target_core_tmr.c | ||
5499 | +++ b/drivers/target/target_core_tmr.c | ||
5500 | @@ -67,15 +67,16 @@ void core_tmr_release_req( | ||
5501 | struct se_tmr_req *tmr) | ||
5502 | { | ||
5503 | struct se_device *dev = tmr->tmr_dev; | ||
5504 | + unsigned long flags; | ||
5505 | |||
5506 | if (!dev) { | ||
5507 | kmem_cache_free(se_tmr_req_cache, tmr); | ||
5508 | return; | ||
5509 | } | ||
5510 | |||
5511 | - spin_lock_irq(&dev->se_tmr_lock); | ||
5512 | + spin_lock_irqsave(&dev->se_tmr_lock, flags); | ||
5513 | list_del(&tmr->tmr_list); | ||
5514 | - spin_unlock_irq(&dev->se_tmr_lock); | ||
5515 | + spin_unlock_irqrestore(&dev->se_tmr_lock, flags); | ||
5516 | |||
5517 | kmem_cache_free(se_tmr_req_cache, tmr); | ||
5518 | } | ||
5519 | @@ -100,54 +101,20 @@ static void core_tmr_handle_tas_abort( | ||
5520 | transport_cmd_finish_abort(cmd, 0); | ||
5521 | } | ||
5522 | |||
5523 | -int core_tmr_lun_reset( | ||
5524 | +static void core_tmr_drain_tmr_list( | ||
5525 | struct se_device *dev, | ||
5526 | struct se_tmr_req *tmr, | ||
5527 | - struct list_head *preempt_and_abort_list, | ||
5528 | - struct se_cmd *prout_cmd) | ||
5529 | + struct list_head *preempt_and_abort_list) | ||
5530 | { | ||
5531 | - struct se_cmd *cmd, *tcmd; | ||
5532 | - struct se_node_acl *tmr_nacl = NULL; | ||
5533 | - struct se_portal_group *tmr_tpg = NULL; | ||
5534 | - struct se_queue_obj *qobj = &dev->dev_queue_obj; | ||
5535 | + LIST_HEAD(drain_tmr_list); | ||
5536 | struct se_tmr_req *tmr_p, *tmr_pp; | ||
5537 | - struct se_task *task, *task_tmp; | ||
5538 | + struct se_cmd *cmd; | ||
5539 | unsigned long flags; | ||
5540 | - int fe_count, tas; | ||
5541 | - /* | ||
5542 | - * TASK_ABORTED status bit, this is configurable via ConfigFS | ||
5543 | - * struct se_device attributes. spc4r17 section 7.4.6 Control mode page | ||
5544 | - * | ||
5545 | - * A task aborted status (TAS) bit set to zero specifies that aborted | ||
5546 | - * tasks shall be terminated by the device server without any response | ||
5547 | - * to the application client. A TAS bit set to one specifies that tasks | ||
5548 | - * aborted by the actions of an I_T nexus other than the I_T nexus on | ||
5549 | - * which the command was received shall be completed with TASK ABORTED | ||
5550 | - * status (see SAM-4). | ||
5551 | - */ | ||
5552 | - tas = dev->se_sub_dev->se_dev_attrib.emulate_tas; | ||
5553 | - /* | ||
5554 | - * Determine if this se_tmr is coming from a $FABRIC_MOD | ||
5555 | - * or struct se_device passthrough.. | ||
5556 | - */ | ||
5557 | - if (tmr && tmr->task_cmd && tmr->task_cmd->se_sess) { | ||
5558 | - tmr_nacl = tmr->task_cmd->se_sess->se_node_acl; | ||
5559 | - tmr_tpg = tmr->task_cmd->se_sess->se_tpg; | ||
5560 | - if (tmr_nacl && tmr_tpg) { | ||
5561 | - pr_debug("LUN_RESET: TMR caller fabric: %s" | ||
5562 | - " initiator port %s\n", | ||
5563 | - tmr_tpg->se_tpg_tfo->get_fabric_name(), | ||
5564 | - tmr_nacl->initiatorname); | ||
5565 | - } | ||
5566 | - } | ||
5567 | - pr_debug("LUN_RESET: %s starting for [%s], tas: %d\n", | ||
5568 | - (preempt_and_abort_list) ? "Preempt" : "TMR", | ||
5569 | - dev->transport->name, tas); | ||
5570 | /* | ||
5571 | * Release all pending and outgoing TMRs aside from the received | ||
5572 | * LUN_RESET tmr.. | ||
5573 | */ | ||
5574 | - spin_lock_irq(&dev->se_tmr_lock); | ||
5575 | + spin_lock_irqsave(&dev->se_tmr_lock, flags); | ||
5576 | list_for_each_entry_safe(tmr_p, tmr_pp, &dev->dev_tmr_list, tmr_list) { | ||
5577 | /* | ||
5578 | * Allow the received TMR to return with FUNCTION_COMPLETE. | ||
5579 | @@ -169,29 +136,48 @@ int core_tmr_lun_reset( | ||
5580 | (core_scsi3_check_cdb_abort_and_preempt( | ||
5581 | preempt_and_abort_list, cmd) != 0)) | ||
5582 | continue; | ||
5583 | - spin_unlock_irq(&dev->se_tmr_lock); | ||
5584 | |||
5585 | - spin_lock_irqsave(&cmd->t_state_lock, flags); | ||
5586 | + spin_lock(&cmd->t_state_lock); | ||
5587 | if (!atomic_read(&cmd->t_transport_active)) { | ||
5588 | - spin_unlock_irqrestore(&cmd->t_state_lock, flags); | ||
5589 | - spin_lock_irq(&dev->se_tmr_lock); | ||
5590 | + spin_unlock(&cmd->t_state_lock); | ||
5591 | continue; | ||
5592 | } | ||
5593 | if (cmd->t_state == TRANSPORT_ISTATE_PROCESSING) { | ||
5594 | - spin_unlock_irqrestore(&cmd->t_state_lock, flags); | ||
5595 | - spin_lock_irq(&dev->se_tmr_lock); | ||
5596 | + spin_unlock(&cmd->t_state_lock); | ||
5597 | continue; | ||
5598 | } | ||
5599 | + spin_unlock(&cmd->t_state_lock); | ||
5600 | + | ||
5601 | + list_move_tail(&tmr_p->tmr_list, &drain_tmr_list); | ||
5602 | + } | ||
5603 | + spin_unlock_irqrestore(&dev->se_tmr_lock, flags); | ||
5604 | + | ||
5605 | + while (!list_empty(&drain_tmr_list)) { | ||
5606 | + tmr = list_entry(drain_tmr_list.next, struct se_tmr_req, tmr_list); | ||
5607 | + list_del(&tmr->tmr_list); | ||
5608 | + cmd = tmr->task_cmd; | ||
5609 | + | ||
5610 | pr_debug("LUN_RESET: %s releasing TMR %p Function: 0x%02x," | ||
5611 | " Response: 0x%02x, t_state: %d\n", | ||
5612 | - (preempt_and_abort_list) ? "Preempt" : "", tmr_p, | ||
5613 | - tmr_p->function, tmr_p->response, cmd->t_state); | ||
5614 | - spin_unlock_irqrestore(&cmd->t_state_lock, flags); | ||
5615 | + (preempt_and_abort_list) ? "Preempt" : "", tmr, | ||
5616 | + tmr->function, tmr->response, cmd->t_state); | ||
5617 | |||
5618 | transport_cmd_finish_abort_tmr(cmd); | ||
5619 | - spin_lock_irq(&dev->se_tmr_lock); | ||
5620 | } | ||
5621 | - spin_unlock_irq(&dev->se_tmr_lock); | ||
5622 | +} | ||
5623 | + | ||
5624 | +static void core_tmr_drain_task_list( | ||
5625 | + struct se_device *dev, | ||
5626 | + struct se_cmd *prout_cmd, | ||
5627 | + struct se_node_acl *tmr_nacl, | ||
5628 | + int tas, | ||
5629 | + struct list_head *preempt_and_abort_list) | ||
5630 | +{ | ||
5631 | + LIST_HEAD(drain_task_list); | ||
5632 | + struct se_cmd *cmd; | ||
5633 | + struct se_task *task, *task_tmp; | ||
5634 | + unsigned long flags; | ||
5635 | + int fe_count; | ||
5636 | /* | ||
5637 | * Complete outstanding struct se_task CDBs with TASK_ABORTED SAM status. | ||
5638 | * This is following sam4r17, section 5.6 Aborting commands, Table 38 | ||
5639 | @@ -236,9 +222,23 @@ int core_tmr_lun_reset( | ||
5640 | if (prout_cmd == cmd) | ||
5641 | continue; | ||
5642 | |||
5643 | - list_del(&task->t_state_list); | ||
5644 | + list_move_tail(&task->t_state_list, &drain_task_list); | ||
5645 | atomic_set(&task->task_state_active, 0); | ||
5646 | - spin_unlock_irqrestore(&dev->execute_task_lock, flags); | ||
5647 | + /* | ||
5648 | + * Remove from task execute list before processing drain_task_list | ||
5649 | + */ | ||
5650 | + if (atomic_read(&task->task_execute_queue) != 0) { | ||
5651 | + list_del(&task->t_execute_list); | ||
5652 | + atomic_set(&task->task_execute_queue, 0); | ||
5653 | + atomic_dec(&dev->execute_tasks); | ||
5654 | + } | ||
5655 | + } | ||
5656 | + spin_unlock_irqrestore(&dev->execute_task_lock, flags); | ||
5657 | + | ||
5658 | + while (!list_empty(&drain_task_list)) { | ||
5659 | + task = list_entry(drain_task_list.next, struct se_task, t_state_list); | ||
5660 | + list_del(&task->t_state_list); | ||
5661 | + cmd = task->task_se_cmd; | ||
5662 | |||
5663 | spin_lock_irqsave(&cmd->t_state_lock, flags); | ||
5664 | pr_debug("LUN_RESET: %s cmd: %p task: %p" | ||
5665 | @@ -275,20 +275,14 @@ int core_tmr_lun_reset( | ||
5666 | |||
5667 | atomic_set(&task->task_active, 0); | ||
5668 | atomic_set(&task->task_stop, 0); | ||
5669 | - } else { | ||
5670 | - if (atomic_read(&task->task_execute_queue) != 0) | ||
5671 | - transport_remove_task_from_execute_queue(task, dev); | ||
5672 | } | ||
5673 | __transport_stop_task_timer(task, &flags); | ||
5674 | |||
5675 | if (!atomic_dec_and_test(&cmd->t_task_cdbs_ex_left)) { | ||
5676 | - spin_unlock_irqrestore( | ||
5677 | - &cmd->t_state_lock, flags); | ||
5678 | + spin_unlock_irqrestore(&cmd->t_state_lock, flags); | ||
5679 | pr_debug("LUN_RESET: Skipping task: %p, dev: %p for" | ||
5680 | " t_task_cdbs_ex_left: %d\n", task, dev, | ||
5681 | atomic_read(&cmd->t_task_cdbs_ex_left)); | ||
5682 | - | ||
5683 | - spin_lock_irqsave(&dev->execute_task_lock, flags); | ||
5684 | continue; | ||
5685 | } | ||
5686 | fe_count = atomic_read(&cmd->t_fe_count); | ||
5687 | @@ -298,22 +292,31 @@ int core_tmr_lun_reset( | ||
5688 | " task: %p, t_fe_count: %d dev: %p\n", task, | ||
5689 | fe_count, dev); | ||
5690 | atomic_set(&cmd->t_transport_aborted, 1); | ||
5691 | - spin_unlock_irqrestore(&cmd->t_state_lock, | ||
5692 | - flags); | ||
5693 | - core_tmr_handle_tas_abort(tmr_nacl, cmd, tas, fe_count); | ||
5694 | + spin_unlock_irqrestore(&cmd->t_state_lock, flags); | ||
5695 | |||
5696 | - spin_lock_irqsave(&dev->execute_task_lock, flags); | ||
5697 | + core_tmr_handle_tas_abort(tmr_nacl, cmd, tas, fe_count); | ||
5698 | continue; | ||
5699 | } | ||
5700 | pr_debug("LUN_RESET: Got t_transport_active = 0 for task: %p," | ||
5701 | " t_fe_count: %d dev: %p\n", task, fe_count, dev); | ||
5702 | atomic_set(&cmd->t_transport_aborted, 1); | ||
5703 | spin_unlock_irqrestore(&cmd->t_state_lock, flags); | ||
5704 | - core_tmr_handle_tas_abort(tmr_nacl, cmd, tas, fe_count); | ||
5705 | |||
5706 | - spin_lock_irqsave(&dev->execute_task_lock, flags); | ||
5707 | + core_tmr_handle_tas_abort(tmr_nacl, cmd, tas, fe_count); | ||
5708 | } | ||
5709 | - spin_unlock_irqrestore(&dev->execute_task_lock, flags); | ||
5710 | +} | ||
5711 | + | ||
5712 | +static void core_tmr_drain_cmd_list( | ||
5713 | + struct se_device *dev, | ||
5714 | + struct se_cmd *prout_cmd, | ||
5715 | + struct se_node_acl *tmr_nacl, | ||
5716 | + int tas, | ||
5717 | + struct list_head *preempt_and_abort_list) | ||
5718 | +{ | ||
5719 | + LIST_HEAD(drain_cmd_list); | ||
5720 | + struct se_queue_obj *qobj = &dev->dev_queue_obj; | ||
5721 | + struct se_cmd *cmd, *tcmd; | ||
5722 | + unsigned long flags; | ||
5723 | /* | ||
5724 | * Release all commands remaining in the struct se_device cmd queue. | ||
5725 | * | ||
5726 | @@ -337,11 +340,26 @@ int core_tmr_lun_reset( | ||
5727 | */ | ||
5728 | if (prout_cmd == cmd) | ||
5729 | continue; | ||
5730 | + /* | ||
5731 | + * Skip direct processing of TRANSPORT_FREE_CMD_INTR for | ||
5732 | + * HW target mode fabrics. | ||
5733 | + */ | ||
5734 | + spin_lock(&cmd->t_state_lock); | ||
5735 | + if (cmd->t_state == TRANSPORT_FREE_CMD_INTR) { | ||
5736 | + spin_unlock(&cmd->t_state_lock); | ||
5737 | + continue; | ||
5738 | + } | ||
5739 | + spin_unlock(&cmd->t_state_lock); | ||
5740 | |||
5741 | - atomic_dec(&cmd->t_transport_queue_active); | ||
5742 | + atomic_set(&cmd->t_transport_queue_active, 0); | ||
5743 | atomic_dec(&qobj->queue_cnt); | ||
5744 | - list_del(&cmd->se_queue_node); | ||
5745 | - spin_unlock_irqrestore(&qobj->cmd_queue_lock, flags); | ||
5746 | + list_move_tail(&cmd->se_queue_node, &drain_cmd_list); | ||
5747 | + } | ||
5748 | + spin_unlock_irqrestore(&qobj->cmd_queue_lock, flags); | ||
5749 | + | ||
5750 | + while (!list_empty(&drain_cmd_list)) { | ||
5751 | + cmd = list_entry(drain_cmd_list.next, struct se_cmd, se_queue_node); | ||
5752 | + list_del_init(&cmd->se_queue_node); | ||
5753 | |||
5754 | pr_debug("LUN_RESET: %s from Device Queue: cmd: %p t_state:" | ||
5755 | " %d t_fe_count: %d\n", (preempt_and_abort_list) ? | ||
5756 | @@ -354,9 +372,53 @@ int core_tmr_lun_reset( | ||
5757 | |||
5758 | core_tmr_handle_tas_abort(tmr_nacl, cmd, tas, | ||
5759 | atomic_read(&cmd->t_fe_count)); | ||
5760 | - spin_lock_irqsave(&qobj->cmd_queue_lock, flags); | ||
5761 | } | ||
5762 | - spin_unlock_irqrestore(&qobj->cmd_queue_lock, flags); | ||
5763 | +} | ||
5764 | + | ||
5765 | +int core_tmr_lun_reset( | ||
5766 | + struct se_device *dev, | ||
5767 | + struct se_tmr_req *tmr, | ||
5768 | + struct list_head *preempt_and_abort_list, | ||
5769 | + struct se_cmd *prout_cmd) | ||
5770 | +{ | ||
5771 | + struct se_node_acl *tmr_nacl = NULL; | ||
5772 | + struct se_portal_group *tmr_tpg = NULL; | ||
5773 | + int tas; | ||
5774 | + /* | ||
5775 | + * TASK_ABORTED status bit, this is configurable via ConfigFS | ||
5776 | + * struct se_device attributes. spc4r17 section 7.4.6 Control mode page | ||
5777 | + * | ||
5778 | + * A task aborted status (TAS) bit set to zero specifies that aborted | ||
5779 | + * tasks shall be terminated by the device server without any response | ||
5780 | + * to the application client. A TAS bit set to one specifies that tasks | ||
5781 | + * aborted by the actions of an I_T nexus other than the I_T nexus on | ||
5782 | + * which the command was received shall be completed with TASK ABORTED | ||
5783 | + * status (see SAM-4). | ||
5784 | + */ | ||
5785 | + tas = dev->se_sub_dev->se_dev_attrib.emulate_tas; | ||
5786 | + /* | ||
5787 | + * Determine if this se_tmr is coming from a $FABRIC_MOD | ||
5788 | + * or struct se_device passthrough.. | ||
5789 | + */ | ||
5790 | + if (tmr && tmr->task_cmd && tmr->task_cmd->se_sess) { | ||
5791 | + tmr_nacl = tmr->task_cmd->se_sess->se_node_acl; | ||
5792 | + tmr_tpg = tmr->task_cmd->se_sess->se_tpg; | ||
5793 | + if (tmr_nacl && tmr_tpg) { | ||
5794 | + pr_debug("LUN_RESET: TMR caller fabric: %s" | ||
5795 | + " initiator port %s\n", | ||
5796 | + tmr_tpg->se_tpg_tfo->get_fabric_name(), | ||
5797 | + tmr_nacl->initiatorname); | ||
5798 | + } | ||
5799 | + } | ||
5800 | + pr_debug("LUN_RESET: %s starting for [%s], tas: %d\n", | ||
5801 | + (preempt_and_abort_list) ? "Preempt" : "TMR", | ||
5802 | + dev->transport->name, tas); | ||
5803 | + | ||
5804 | + core_tmr_drain_tmr_list(dev, tmr, preempt_and_abort_list); | ||
5805 | + core_tmr_drain_task_list(dev, prout_cmd, tmr_nacl, tas, | ||
5806 | + preempt_and_abort_list); | ||
5807 | + core_tmr_drain_cmd_list(dev, prout_cmd, tmr_nacl, tas, | ||
5808 | + preempt_and_abort_list); | ||
5809 | /* | ||
5810 | * Clear any legacy SPC-2 reservation when called during | ||
5811 | * LOGICAL UNIT RESET | ||
5812 | @@ -379,3 +441,4 @@ int core_tmr_lun_reset( | ||
5813 | dev->transport->name); | ||
5814 | return 0; | ||
5815 | } | ||
5816 | + | ||
5817 | diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c | ||
5818 | index a4b0a8d..013c100 100644 | ||
5819 | --- a/drivers/target/target_core_transport.c | ||
5820 | +++ b/drivers/target/target_core_transport.c | ||
5821 | @@ -594,13 +594,14 @@ check_lun: | ||
5822 | |||
5823 | void transport_cmd_finish_abort(struct se_cmd *cmd, int remove) | ||
5824 | { | ||
5825 | - transport_remove_cmd_from_queue(cmd, &cmd->se_dev->dev_queue_obj); | ||
5826 | transport_lun_remove_cmd(cmd); | ||
5827 | |||
5828 | if (transport_cmd_check_stop_to_fabric(cmd)) | ||
5829 | return; | ||
5830 | - if (remove) | ||
5831 | + if (remove) { | ||
5832 | + transport_remove_cmd_from_queue(cmd, &cmd->se_dev->dev_queue_obj); | ||
5833 | transport_generic_remove(cmd, 0); | ||
5834 | + } | ||
5835 | } | ||
5836 | |||
5837 | void transport_cmd_finish_abort_tmr(struct se_cmd *cmd) | ||
5838 | @@ -621,8 +622,6 @@ static void transport_add_cmd_to_queue( | ||
5839 | struct se_queue_obj *qobj = &dev->dev_queue_obj; | ||
5840 | unsigned long flags; | ||
5841 | |||
5842 | - INIT_LIST_HEAD(&cmd->se_queue_node); | ||
5843 | - | ||
5844 | if (t_state) { | ||
5845 | spin_lock_irqsave(&cmd->t_state_lock, flags); | ||
5846 | cmd->t_state = t_state; | ||
5847 | @@ -631,15 +630,21 @@ static void transport_add_cmd_to_queue( | ||
5848 | } | ||
5849 | |||
5850 | spin_lock_irqsave(&qobj->cmd_queue_lock, flags); | ||
5851 | + | ||
5852 | + /* If the cmd is already on the list, remove it before we add it */ | ||
5853 | + if (!list_empty(&cmd->se_queue_node)) | ||
5854 | + list_del(&cmd->se_queue_node); | ||
5855 | + else | ||
5856 | + atomic_inc(&qobj->queue_cnt); | ||
5857 | + | ||
5858 | if (cmd->se_cmd_flags & SCF_EMULATE_QUEUE_FULL) { | ||
5859 | cmd->se_cmd_flags &= ~SCF_EMULATE_QUEUE_FULL; | ||
5860 | list_add(&cmd->se_queue_node, &qobj->qobj_list); | ||
5861 | } else | ||
5862 | list_add_tail(&cmd->se_queue_node, &qobj->qobj_list); | ||
5863 | - atomic_inc(&cmd->t_transport_queue_active); | ||
5864 | + atomic_set(&cmd->t_transport_queue_active, 1); | ||
5865 | spin_unlock_irqrestore(&qobj->cmd_queue_lock, flags); | ||
5866 | |||
5867 | - atomic_inc(&qobj->queue_cnt); | ||
5868 | wake_up_interruptible(&qobj->thread_wq); | ||
5869 | } | ||
5870 | |||
5871 | @@ -656,9 +661,9 @@ transport_get_cmd_from_queue(struct se_queue_obj *qobj) | ||
5872 | } | ||
5873 | cmd = list_first_entry(&qobj->qobj_list, struct se_cmd, se_queue_node); | ||
5874 | |||
5875 | - atomic_dec(&cmd->t_transport_queue_active); | ||
5876 | + atomic_set(&cmd->t_transport_queue_active, 0); | ||
5877 | |||
5878 | - list_del(&cmd->se_queue_node); | ||
5879 | + list_del_init(&cmd->se_queue_node); | ||
5880 | atomic_dec(&qobj->queue_cnt); | ||
5881 | spin_unlock_irqrestore(&qobj->cmd_queue_lock, flags); | ||
5882 | |||
5883 | @@ -668,7 +673,6 @@ transport_get_cmd_from_queue(struct se_queue_obj *qobj) | ||
5884 | static void transport_remove_cmd_from_queue(struct se_cmd *cmd, | ||
5885 | struct se_queue_obj *qobj) | ||
5886 | { | ||
5887 | - struct se_cmd *t; | ||
5888 | unsigned long flags; | ||
5889 | |||
5890 | spin_lock_irqsave(&qobj->cmd_queue_lock, flags); | ||
5891 | @@ -676,14 +680,9 @@ static void transport_remove_cmd_from_queue(struct se_cmd *cmd, | ||
5892 | spin_unlock_irqrestore(&qobj->cmd_queue_lock, flags); | ||
5893 | return; | ||
5894 | } | ||
5895 | - | ||
5896 | - list_for_each_entry(t, &qobj->qobj_list, se_queue_node) | ||
5897 | - if (t == cmd) { | ||
5898 | - atomic_dec(&cmd->t_transport_queue_active); | ||
5899 | - atomic_dec(&qobj->queue_cnt); | ||
5900 | - list_del(&cmd->se_queue_node); | ||
5901 | - break; | ||
5902 | - } | ||
5903 | + atomic_set(&cmd->t_transport_queue_active, 0); | ||
5904 | + atomic_dec(&qobj->queue_cnt); | ||
5905 | + list_del_init(&cmd->se_queue_node); | ||
5906 | spin_unlock_irqrestore(&qobj->cmd_queue_lock, flags); | ||
5907 | |||
5908 | if (atomic_read(&cmd->t_transport_queue_active)) { | ||
5909 | @@ -1067,7 +1066,7 @@ static void transport_release_all_cmds(struct se_device *dev) | ||
5910 | list_for_each_entry_safe(cmd, tcmd, &dev->dev_queue_obj.qobj_list, | ||
5911 | se_queue_node) { | ||
5912 | t_state = cmd->t_state; | ||
5913 | - list_del(&cmd->se_queue_node); | ||
5914 | + list_del_init(&cmd->se_queue_node); | ||
5915 | spin_unlock_irqrestore(&dev->dev_queue_obj.cmd_queue_lock, | ||
5916 | flags); | ||
5917 | |||
5918 | @@ -1598,6 +1597,7 @@ void transport_init_se_cmd( | ||
5919 | INIT_LIST_HEAD(&cmd->se_delayed_node); | ||
5920 | INIT_LIST_HEAD(&cmd->se_ordered_node); | ||
5921 | INIT_LIST_HEAD(&cmd->se_qf_node); | ||
5922 | + INIT_LIST_HEAD(&cmd->se_queue_node); | ||
5923 | |||
5924 | INIT_LIST_HEAD(&cmd->t_task_list); | ||
5925 | init_completion(&cmd->transport_lun_fe_stop_comp); | ||
5926 | @@ -4920,6 +4920,15 @@ EXPORT_SYMBOL(transport_check_aborted_status); | ||
5927 | |||
5928 | void transport_send_task_abort(struct se_cmd *cmd) | ||
5929 | { | ||
5930 | + unsigned long flags; | ||
5931 | + | ||
5932 | + spin_lock_irqsave(&cmd->t_state_lock, flags); | ||
5933 | + if (cmd->se_cmd_flags & SCF_SENT_CHECK_CONDITION) { | ||
5934 | + spin_unlock_irqrestore(&cmd->t_state_lock, flags); | ||
5935 | + return; | ||
5936 | + } | ||
5937 | + spin_unlock_irqrestore(&cmd->t_state_lock, flags); | ||
5938 | + | ||
5939 | /* | ||
5940 | * If there are still expected incoming fabric WRITEs, we wait | ||
5941 | * until until they have completed before sending a TASK_ABORTED | ||
5942 | diff --git a/drivers/tty/pty.c b/drivers/tty/pty.c | ||
5943 | index e809e9d..e18604b 100644 | ||
5944 | --- a/drivers/tty/pty.c | ||
5945 | +++ b/drivers/tty/pty.c | ||
5946 | @@ -670,12 +670,18 @@ static int ptmx_open(struct inode *inode, struct file *filp) | ||
5947 | |||
5948 | nonseekable_open(inode, filp); | ||
5949 | |||
5950 | + retval = tty_alloc_file(filp); | ||
5951 | + if (retval) | ||
5952 | + return retval; | ||
5953 | + | ||
5954 | /* find a device that is not in use. */ | ||
5955 | tty_lock(); | ||
5956 | index = devpts_new_index(inode); | ||
5957 | tty_unlock(); | ||
5958 | - if (index < 0) | ||
5959 | - return index; | ||
5960 | + if (index < 0) { | ||
5961 | + retval = index; | ||
5962 | + goto err_file; | ||
5963 | + } | ||
5964 | |||
5965 | mutex_lock(&tty_mutex); | ||
5966 | tty_lock(); | ||
5967 | @@ -689,27 +695,27 @@ static int ptmx_open(struct inode *inode, struct file *filp) | ||
5968 | |||
5969 | set_bit(TTY_PTY_LOCK, &tty->flags); /* LOCK THE SLAVE */ | ||
5970 | |||
5971 | - retval = tty_add_file(tty, filp); | ||
5972 | - if (retval) | ||
5973 | - goto out; | ||
5974 | + tty_add_file(tty, filp); | ||
5975 | |||
5976 | retval = devpts_pty_new(inode, tty->link); | ||
5977 | if (retval) | ||
5978 | - goto out1; | ||
5979 | + goto err_release; | ||
5980 | |||
5981 | retval = ptm_driver->ops->open(tty, filp); | ||
5982 | if (retval) | ||
5983 | - goto out2; | ||
5984 | -out1: | ||
5985 | + goto err_release; | ||
5986 | + | ||
5987 | tty_unlock(); | ||
5988 | - return retval; | ||
5989 | -out2: | ||
5990 | + return 0; | ||
5991 | +err_release: | ||
5992 | tty_unlock(); | ||
5993 | tty_release(inode, filp); | ||
5994 | return retval; | ||
5995 | out: | ||
5996 | devpts_kill_index(inode, index); | ||
5997 | tty_unlock(); | ||
5998 | +err_file: | ||
5999 | + tty_free_file(filp); | ||
6000 | return retval; | ||
6001 | } | ||
6002 | |||
6003 | diff --git a/drivers/tty/serial/jsm/jsm.h b/drivers/tty/serial/jsm/jsm.h | ||
6004 | index b704c8c..5b837e7 100644 | ||
6005 | --- a/drivers/tty/serial/jsm/jsm.h | ||
6006 | +++ b/drivers/tty/serial/jsm/jsm.h | ||
6007 | @@ -183,10 +183,8 @@ struct jsm_board | ||
6008 | /* Our Read/Error/Write queue sizes */ | ||
6009 | #define RQUEUEMASK 0x1FFF /* 8 K - 1 */ | ||
6010 | #define EQUEUEMASK 0x1FFF /* 8 K - 1 */ | ||
6011 | -#define WQUEUEMASK 0x0FFF /* 4 K - 1 */ | ||
6012 | #define RQUEUESIZE (RQUEUEMASK + 1) | ||
6013 | #define EQUEUESIZE RQUEUESIZE | ||
6014 | -#define WQUEUESIZE (WQUEUEMASK + 1) | ||
6015 | |||
6016 | |||
6017 | /************************************************************************ | ||
6018 | @@ -226,10 +224,6 @@ struct jsm_channel { | ||
6019 | u16 ch_e_head; /* Head location of the error queue */ | ||
6020 | u16 ch_e_tail; /* Tail location of the error queue */ | ||
6021 | |||
6022 | - u8 *ch_wqueue; /* Our write queue buffer - malloc'ed */ | ||
6023 | - u16 ch_w_head; /* Head location of the write queue */ | ||
6024 | - u16 ch_w_tail; /* Tail location of the write queue */ | ||
6025 | - | ||
6026 | u64 ch_rxcount; /* total of data received so far */ | ||
6027 | u64 ch_txcount; /* total of data transmitted so far */ | ||
6028 | |||
6029 | @@ -378,7 +372,6 @@ extern int jsm_debug; | ||
6030 | * Prototypes for non-static functions used in more than one module | ||
6031 | * | ||
6032 | *************************************************************************/ | ||
6033 | -int jsm_tty_write(struct uart_port *port); | ||
6034 | int jsm_tty_init(struct jsm_board *); | ||
6035 | int jsm_uart_port_init(struct jsm_board *); | ||
6036 | int jsm_remove_uart_port(struct jsm_board *); | ||
6037 | diff --git a/drivers/tty/serial/jsm/jsm_driver.c b/drivers/tty/serial/jsm/jsm_driver.c | ||
6038 | index 96da178..2aaafa9 100644 | ||
6039 | --- a/drivers/tty/serial/jsm/jsm_driver.c | ||
6040 | +++ b/drivers/tty/serial/jsm/jsm_driver.c | ||
6041 | @@ -211,7 +211,6 @@ static void __devexit jsm_remove_one(struct pci_dev *pdev) | ||
6042 | if (brd->channels[i]) { | ||
6043 | kfree(brd->channels[i]->ch_rqueue); | ||
6044 | kfree(brd->channels[i]->ch_equeue); | ||
6045 | - kfree(brd->channels[i]->ch_wqueue); | ||
6046 | kfree(brd->channels[i]); | ||
6047 | } | ||
6048 | } | ||
6049 | diff --git a/drivers/tty/serial/jsm/jsm_neo.c b/drivers/tty/serial/jsm/jsm_neo.c | ||
6050 | index 4538c3e..bd6e846 100644 | ||
6051 | --- a/drivers/tty/serial/jsm/jsm_neo.c | ||
6052 | +++ b/drivers/tty/serial/jsm/jsm_neo.c | ||
6053 | @@ -496,12 +496,15 @@ static void neo_copy_data_from_queue_to_uart(struct jsm_channel *ch) | ||
6054 | int s; | ||
6055 | int qlen; | ||
6056 | u32 len_written = 0; | ||
6057 | + struct circ_buf *circ; | ||
6058 | |||
6059 | if (!ch) | ||
6060 | return; | ||
6061 | |||
6062 | + circ = &ch->uart_port.state->xmit; | ||
6063 | + | ||
6064 | /* No data to write to the UART */ | ||
6065 | - if (ch->ch_w_tail == ch->ch_w_head) | ||
6066 | + if (uart_circ_empty(circ)) | ||
6067 | return; | ||
6068 | |||
6069 | /* If port is "stopped", don't send any data to the UART */ | ||
6070 | @@ -517,11 +520,10 @@ static void neo_copy_data_from_queue_to_uart(struct jsm_channel *ch) | ||
6071 | if (ch->ch_cached_lsr & UART_LSR_THRE) { | ||
6072 | ch->ch_cached_lsr &= ~(UART_LSR_THRE); | ||
6073 | |||
6074 | - writeb(ch->ch_wqueue[ch->ch_w_tail], &ch->ch_neo_uart->txrx); | ||
6075 | + writeb(circ->buf[circ->tail], &ch->ch_neo_uart->txrx); | ||
6076 | jsm_printk(WRITE, INFO, &ch->ch_bd->pci_dev, | ||
6077 | - "Tx data: %x\n", ch->ch_wqueue[ch->ch_w_head]); | ||
6078 | - ch->ch_w_tail++; | ||
6079 | - ch->ch_w_tail &= WQUEUEMASK; | ||
6080 | + "Tx data: %x\n", circ->buf[circ->head]); | ||
6081 | + circ->tail = (circ->tail + 1) & (UART_XMIT_SIZE - 1); | ||
6082 | ch->ch_txcount++; | ||
6083 | } | ||
6084 | return; | ||
6085 | @@ -536,36 +538,36 @@ static void neo_copy_data_from_queue_to_uart(struct jsm_channel *ch) | ||
6086 | n = UART_17158_TX_FIFOSIZE - ch->ch_t_tlevel; | ||
6087 | |||
6088 | /* cache head and tail of queue */ | ||
6089 | - head = ch->ch_w_head & WQUEUEMASK; | ||
6090 | - tail = ch->ch_w_tail & WQUEUEMASK; | ||
6091 | - qlen = (head - tail) & WQUEUEMASK; | ||
6092 | + head = circ->head & (UART_XMIT_SIZE - 1); | ||
6093 | + tail = circ->tail & (UART_XMIT_SIZE - 1); | ||
6094 | + qlen = uart_circ_chars_pending(circ); | ||
6095 | |||
6096 | /* Find minimum of the FIFO space, versus queue length */ | ||
6097 | n = min(n, qlen); | ||
6098 | |||
6099 | while (n > 0) { | ||
6100 | |||
6101 | - s = ((head >= tail) ? head : WQUEUESIZE) - tail; | ||
6102 | + s = ((head >= tail) ? head : UART_XMIT_SIZE) - tail; | ||
6103 | s = min(s, n); | ||
6104 | |||
6105 | if (s <= 0) | ||
6106 | break; | ||
6107 | |||
6108 | - memcpy_toio(&ch->ch_neo_uart->txrxburst, ch->ch_wqueue + tail, s); | ||
6109 | + memcpy_toio(&ch->ch_neo_uart->txrxburst, circ->buf + tail, s); | ||
6110 | /* Add and flip queue if needed */ | ||
6111 | - tail = (tail + s) & WQUEUEMASK; | ||
6112 | + tail = (tail + s) & (UART_XMIT_SIZE - 1); | ||
6113 | n -= s; | ||
6114 | ch->ch_txcount += s; | ||
6115 | len_written += s; | ||
6116 | } | ||
6117 | |||
6118 | /* Update the final tail */ | ||
6119 | - ch->ch_w_tail = tail & WQUEUEMASK; | ||
6120 | + circ->tail = tail & (UART_XMIT_SIZE - 1); | ||
6121 | |||
6122 | if (len_written >= ch->ch_t_tlevel) | ||
6123 | ch->ch_flags &= ~(CH_TX_FIFO_EMPTY | CH_TX_FIFO_LWM); | ||
6124 | |||
6125 | - if (!jsm_tty_write(&ch->uart_port)) | ||
6126 | + if (uart_circ_empty(circ)) | ||
6127 | uart_write_wakeup(&ch->uart_port); | ||
6128 | } | ||
6129 | |||
6130 | @@ -946,7 +948,6 @@ static void neo_param(struct jsm_channel *ch) | ||
6131 | if ((ch->ch_c_cflag & (CBAUD)) == 0) { | ||
6132 | ch->ch_r_head = ch->ch_r_tail = 0; | ||
6133 | ch->ch_e_head = ch->ch_e_tail = 0; | ||
6134 | - ch->ch_w_head = ch->ch_w_tail = 0; | ||
6135 | |||
6136 | neo_flush_uart_write(ch); | ||
6137 | neo_flush_uart_read(ch); | ||
6138 | diff --git a/drivers/tty/serial/jsm/jsm_tty.c b/drivers/tty/serial/jsm/jsm_tty.c | ||
6139 | index 7a4a914..434bd88 100644 | ||
6140 | --- a/drivers/tty/serial/jsm/jsm_tty.c | ||
6141 | +++ b/drivers/tty/serial/jsm/jsm_tty.c | ||
6142 | @@ -118,6 +118,19 @@ static void jsm_tty_set_mctrl(struct uart_port *port, unsigned int mctrl) | ||
6143 | udelay(10); | ||
6144 | } | ||
6145 | |||
6146 | +/* | ||
6147 | + * jsm_tty_write() | ||
6148 | + * | ||
6149 | + * Take data from the user or kernel and send it out to the FEP. | ||
6150 | + * In here exists all the Transparent Print magic as well. | ||
6151 | + */ | ||
6152 | +static void jsm_tty_write(struct uart_port *port) | ||
6153 | +{ | ||
6154 | + struct jsm_channel *channel; | ||
6155 | + channel = container_of(port, struct jsm_channel, uart_port); | ||
6156 | + channel->ch_bd->bd_ops->copy_data_from_queue_to_uart(channel); | ||
6157 | +} | ||
6158 | + | ||
6159 | static void jsm_tty_start_tx(struct uart_port *port) | ||
6160 | { | ||
6161 | struct jsm_channel *channel = (struct jsm_channel *)port; | ||
6162 | @@ -216,14 +229,6 @@ static int jsm_tty_open(struct uart_port *port) | ||
6163 | return -ENOMEM; | ||
6164 | } | ||
6165 | } | ||
6166 | - if (!channel->ch_wqueue) { | ||
6167 | - channel->ch_wqueue = kzalloc(WQUEUESIZE, GFP_KERNEL); | ||
6168 | - if (!channel->ch_wqueue) { | ||
6169 | - jsm_printk(INIT, ERR, &channel->ch_bd->pci_dev, | ||
6170 | - "unable to allocate write queue buf"); | ||
6171 | - return -ENOMEM; | ||
6172 | - } | ||
6173 | - } | ||
6174 | |||
6175 | channel->ch_flags &= ~(CH_OPENING); | ||
6176 | /* | ||
6177 | @@ -237,7 +242,6 @@ static int jsm_tty_open(struct uart_port *port) | ||
6178 | */ | ||
6179 | channel->ch_r_head = channel->ch_r_tail = 0; | ||
6180 | channel->ch_e_head = channel->ch_e_tail = 0; | ||
6181 | - channel->ch_w_head = channel->ch_w_tail = 0; | ||
6182 | |||
6183 | brd->bd_ops->flush_uart_write(channel); | ||
6184 | brd->bd_ops->flush_uart_read(channel); | ||
6185 | @@ -836,75 +840,3 @@ void jsm_check_queue_flow_control(struct jsm_channel *ch) | ||
6186 | } | ||
6187 | } | ||
6188 | } | ||
6189 | - | ||
6190 | -/* | ||
6191 | - * jsm_tty_write() | ||
6192 | - * | ||
6193 | - * Take data from the user or kernel and send it out to the FEP. | ||
6194 | - * In here exists all the Transparent Print magic as well. | ||
6195 | - */ | ||
6196 | -int jsm_tty_write(struct uart_port *port) | ||
6197 | -{ | ||
6198 | - int bufcount; | ||
6199 | - int data_count = 0,data_count1 =0; | ||
6200 | - u16 head; | ||
6201 | - u16 tail; | ||
6202 | - u16 tmask; | ||
6203 | - u32 remain; | ||
6204 | - int temp_tail = port->state->xmit.tail; | ||
6205 | - struct jsm_channel *channel = (struct jsm_channel *)port; | ||
6206 | - | ||
6207 | - tmask = WQUEUEMASK; | ||
6208 | - head = (channel->ch_w_head) & tmask; | ||
6209 | - tail = (channel->ch_w_tail) & tmask; | ||
6210 | - | ||
6211 | - if ((bufcount = tail - head - 1) < 0) | ||
6212 | - bufcount += WQUEUESIZE; | ||
6213 | - | ||
6214 | - bufcount = min(bufcount, 56); | ||
6215 | - remain = WQUEUESIZE - head; | ||
6216 | - | ||
6217 | - data_count = 0; | ||
6218 | - if (bufcount >= remain) { | ||
6219 | - bufcount -= remain; | ||
6220 | - while ((port->state->xmit.head != temp_tail) && | ||
6221 | - (data_count < remain)) { | ||
6222 | - channel->ch_wqueue[head++] = | ||
6223 | - port->state->xmit.buf[temp_tail]; | ||
6224 | - | ||
6225 | - temp_tail++; | ||
6226 | - temp_tail &= (UART_XMIT_SIZE - 1); | ||
6227 | - data_count++; | ||
6228 | - } | ||
6229 | - if (data_count == remain) head = 0; | ||
6230 | - } | ||
6231 | - | ||
6232 | - data_count1 = 0; | ||
6233 | - if (bufcount > 0) { | ||
6234 | - remain = bufcount; | ||
6235 | - while ((port->state->xmit.head != temp_tail) && | ||
6236 | - (data_count1 < remain)) { | ||
6237 | - channel->ch_wqueue[head++] = | ||
6238 | - port->state->xmit.buf[temp_tail]; | ||
6239 | - | ||
6240 | - temp_tail++; | ||
6241 | - temp_tail &= (UART_XMIT_SIZE - 1); | ||
6242 | - data_count1++; | ||
6243 | - | ||
6244 | - } | ||
6245 | - } | ||
6246 | - | ||
6247 | - port->state->xmit.tail = temp_tail; | ||
6248 | - | ||
6249 | - data_count += data_count1; | ||
6250 | - if (data_count) { | ||
6251 | - head &= tmask; | ||
6252 | - channel->ch_w_head = head; | ||
6253 | - } | ||
6254 | - | ||
6255 | - if (data_count) { | ||
6256 | - channel->ch_bd->bd_ops->copy_data_from_queue_to_uart(channel); | ||
6257 | - } | ||
6258 | - | ||
6259 | - return data_count; | ||
6260 | -} | ||
6261 | diff --git a/drivers/tty/serial/pxa.c b/drivers/tty/serial/pxa.c | ||
6262 | index 531931c..5c8e3bb 100644 | ||
6263 | --- a/drivers/tty/serial/pxa.c | ||
6264 | +++ b/drivers/tty/serial/pxa.c | ||
6265 | @@ -100,6 +100,16 @@ static inline void receive_chars(struct uart_pxa_port *up, int *status) | ||
6266 | int max_count = 256; | ||
6267 | |||
6268 | do { | ||
6269 | + /* work around Errata #20 according to | ||
6270 | + * Intel(R) PXA27x Processor Family | ||
6271 | + * Specification Update (May 2005) | ||
6272 | + * | ||
6273 | + * Step 2 | ||
6274 | + * Disable the Reciever Time Out Interrupt via IER[RTOEI] | ||
6275 | + */ | ||
6276 | + up->ier &= ~UART_IER_RTOIE; | ||
6277 | + serial_out(up, UART_IER, up->ier); | ||
6278 | + | ||
6279 | ch = serial_in(up, UART_RX); | ||
6280 | flag = TTY_NORMAL; | ||
6281 | up->port.icount.rx++; | ||
6282 | @@ -156,6 +166,16 @@ static inline void receive_chars(struct uart_pxa_port *up, int *status) | ||
6283 | *status = serial_in(up, UART_LSR); | ||
6284 | } while ((*status & UART_LSR_DR) && (max_count-- > 0)); | ||
6285 | tty_flip_buffer_push(tty); | ||
6286 | + | ||
6287 | + /* work around Errata #20 according to | ||
6288 | + * Intel(R) PXA27x Processor Family | ||
6289 | + * Specification Update (May 2005) | ||
6290 | + * | ||
6291 | + * Step 6: | ||
6292 | + * No more data in FIFO: Re-enable RTO interrupt via IER[RTOIE] | ||
6293 | + */ | ||
6294 | + up->ier |= UART_IER_RTOIE; | ||
6295 | + serial_out(up, UART_IER, up->ier); | ||
6296 | } | ||
6297 | |||
6298 | static void transmit_chars(struct uart_pxa_port *up) | ||
6299 | diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c | ||
6300 | index a3efbea..25f3094 100644 | ||
6301 | --- a/drivers/tty/serial/serial_core.c | ||
6302 | +++ b/drivers/tty/serial/serial_core.c | ||
6303 | @@ -2008,6 +2008,8 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport) | ||
6304 | if (port->tty && port->tty->termios && termios.c_cflag == 0) | ||
6305 | termios = *(port->tty->termios); | ||
6306 | |||
6307 | + if (console_suspend_enabled) | ||
6308 | + uart_change_pm(state, 0); | ||
6309 | uport->ops->set_termios(uport, &termios, NULL); | ||
6310 | if (console_suspend_enabled) | ||
6311 | console_start(uport->cons); | ||
6312 | diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c | ||
6313 | index 4f1fc81..1a890e2 100644 | ||
6314 | --- a/drivers/tty/tty_io.c | ||
6315 | +++ b/drivers/tty/tty_io.c | ||
6316 | @@ -194,8 +194,7 @@ static inline struct tty_struct *file_tty(struct file *file) | ||
6317 | return ((struct tty_file_private *)file->private_data)->tty; | ||
6318 | } | ||
6319 | |||
6320 | -/* Associate a new file with the tty structure */ | ||
6321 | -int tty_add_file(struct tty_struct *tty, struct file *file) | ||
6322 | +int tty_alloc_file(struct file *file) | ||
6323 | { | ||
6324 | struct tty_file_private *priv; | ||
6325 | |||
6326 | @@ -203,15 +202,36 @@ int tty_add_file(struct tty_struct *tty, struct file *file) | ||
6327 | if (!priv) | ||
6328 | return -ENOMEM; | ||
6329 | |||
6330 | + file->private_data = priv; | ||
6331 | + | ||
6332 | + return 0; | ||
6333 | +} | ||
6334 | + | ||
6335 | +/* Associate a new file with the tty structure */ | ||
6336 | +void tty_add_file(struct tty_struct *tty, struct file *file) | ||
6337 | +{ | ||
6338 | + struct tty_file_private *priv = file->private_data; | ||
6339 | + | ||
6340 | priv->tty = tty; | ||
6341 | priv->file = file; | ||
6342 | - file->private_data = priv; | ||
6343 | |||
6344 | spin_lock(&tty_files_lock); | ||
6345 | list_add(&priv->list, &tty->tty_files); | ||
6346 | spin_unlock(&tty_files_lock); | ||
6347 | +} | ||
6348 | |||
6349 | - return 0; | ||
6350 | +/** | ||
6351 | + * tty_free_file - free file->private_data | ||
6352 | + * | ||
6353 | + * This shall be used only for fail path handling when tty_add_file was not | ||
6354 | + * called yet. | ||
6355 | + */ | ||
6356 | +void tty_free_file(struct file *file) | ||
6357 | +{ | ||
6358 | + struct tty_file_private *priv = file->private_data; | ||
6359 | + | ||
6360 | + file->private_data = NULL; | ||
6361 | + kfree(priv); | ||
6362 | } | ||
6363 | |||
6364 | /* Delete file from its tty */ | ||
6365 | @@ -222,8 +242,7 @@ void tty_del_file(struct file *file) | ||
6366 | spin_lock(&tty_files_lock); | ||
6367 | list_del(&priv->list); | ||
6368 | spin_unlock(&tty_files_lock); | ||
6369 | - file->private_data = NULL; | ||
6370 | - kfree(priv); | ||
6371 | + tty_free_file(file); | ||
6372 | } | ||
6373 | |||
6374 | |||
6375 | @@ -1811,6 +1830,10 @@ static int tty_open(struct inode *inode, struct file *filp) | ||
6376 | nonseekable_open(inode, filp); | ||
6377 | |||
6378 | retry_open: | ||
6379 | + retval = tty_alloc_file(filp); | ||
6380 | + if (retval) | ||
6381 | + return -ENOMEM; | ||
6382 | + | ||
6383 | noctty = filp->f_flags & O_NOCTTY; | ||
6384 | index = -1; | ||
6385 | retval = 0; | ||
6386 | @@ -1823,6 +1846,7 @@ retry_open: | ||
6387 | if (!tty) { | ||
6388 | tty_unlock(); | ||
6389 | mutex_unlock(&tty_mutex); | ||
6390 | + tty_free_file(filp); | ||
6391 | return -ENXIO; | ||
6392 | } | ||
6393 | driver = tty_driver_kref_get(tty->driver); | ||
6394 | @@ -1855,6 +1879,7 @@ retry_open: | ||
6395 | } | ||
6396 | tty_unlock(); | ||
6397 | mutex_unlock(&tty_mutex); | ||
6398 | + tty_free_file(filp); | ||
6399 | return -ENODEV; | ||
6400 | } | ||
6401 | |||
6402 | @@ -1862,6 +1887,7 @@ retry_open: | ||
6403 | if (!driver) { | ||
6404 | tty_unlock(); | ||
6405 | mutex_unlock(&tty_mutex); | ||
6406 | + tty_free_file(filp); | ||
6407 | return -ENODEV; | ||
6408 | } | ||
6409 | got_driver: | ||
6410 | @@ -1872,6 +1898,8 @@ got_driver: | ||
6411 | if (IS_ERR(tty)) { | ||
6412 | tty_unlock(); | ||
6413 | mutex_unlock(&tty_mutex); | ||
6414 | + tty_driver_kref_put(driver); | ||
6415 | + tty_free_file(filp); | ||
6416 | return PTR_ERR(tty); | ||
6417 | } | ||
6418 | } | ||
6419 | @@ -1887,15 +1915,11 @@ got_driver: | ||
6420 | tty_driver_kref_put(driver); | ||
6421 | if (IS_ERR(tty)) { | ||
6422 | tty_unlock(); | ||
6423 | + tty_free_file(filp); | ||
6424 | return PTR_ERR(tty); | ||
6425 | } | ||
6426 | |||
6427 | - retval = tty_add_file(tty, filp); | ||
6428 | - if (retval) { | ||
6429 | - tty_unlock(); | ||
6430 | - tty_release(inode, filp); | ||
6431 | - return retval; | ||
6432 | - } | ||
6433 | + tty_add_file(tty, filp); | ||
6434 | |||
6435 | check_tty_count(tty, "tty_open"); | ||
6436 | if (tty->driver->type == TTY_DRIVER_TYPE_PTY && | ||
6437 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c | ||
6438 | index dac7676..5112f57 100644 | ||
6439 | --- a/drivers/usb/class/cdc-acm.c | ||
6440 | +++ b/drivers/usb/class/cdc-acm.c | ||
6441 | @@ -1534,6 +1534,9 @@ static const struct usb_device_id acm_ids[] = { | ||
6442 | { NOKIA_PCSUITE_ACM_INFO(0x03cd), }, /* Nokia C7 */ | ||
6443 | { SAMSUNG_PCSUITE_ACM_INFO(0x6651), }, /* Samsung GTi8510 (INNOV8) */ | ||
6444 | |||
6445 | + /* Support for Owen devices */ | ||
6446 | + { USB_DEVICE(0x03eb, 0x0030), }, /* Owen SI30 */ | ||
6447 | + | ||
6448 | /* NOTE: non-Nokia COMM/ACM/0xff is likely MSFT RNDIS... NOT a modem! */ | ||
6449 | |||
6450 | /* Support Lego NXT using pbLua firmware */ | ||
6451 | diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c | ||
6452 | index 37518df..0ca54e2 100644 | ||
6453 | --- a/drivers/usb/core/devio.c | ||
6454 | +++ b/drivers/usb/core/devio.c | ||
6455 | @@ -407,7 +407,7 @@ static void async_completed(struct urb *urb) | ||
6456 | sinfo.si_errno = as->status; | ||
6457 | sinfo.si_code = SI_ASYNCIO; | ||
6458 | sinfo.si_addr = as->userurb; | ||
6459 | - pid = as->pid; | ||
6460 | + pid = get_pid(as->pid); | ||
6461 | uid = as->uid; | ||
6462 | euid = as->euid; | ||
6463 | secid = as->secid; | ||
6464 | @@ -422,9 +422,11 @@ static void async_completed(struct urb *urb) | ||
6465 | cancel_bulk_urbs(ps, as->bulk_addr); | ||
6466 | spin_unlock(&ps->lock); | ||
6467 | |||
6468 | - if (signr) | ||
6469 | + if (signr) { | ||
6470 | kill_pid_info_as_uid(sinfo.si_signo, &sinfo, pid, uid, | ||
6471 | euid, secid); | ||
6472 | + put_pid(pid); | ||
6473 | + } | ||
6474 | |||
6475 | wake_up(&ps->wait); | ||
6476 | } | ||
6477 | @@ -607,9 +609,10 @@ static int findintfep(struct usb_device *dev, unsigned int ep) | ||
6478 | } | ||
6479 | |||
6480 | static int check_ctrlrecip(struct dev_state *ps, unsigned int requesttype, | ||
6481 | - unsigned int index) | ||
6482 | + unsigned int request, unsigned int index) | ||
6483 | { | ||
6484 | int ret = 0; | ||
6485 | + struct usb_host_interface *alt_setting; | ||
6486 | |||
6487 | if (ps->dev->state != USB_STATE_UNAUTHENTICATED | ||
6488 | && ps->dev->state != USB_STATE_ADDRESS | ||
6489 | @@ -618,6 +621,19 @@ static int check_ctrlrecip(struct dev_state *ps, unsigned int requesttype, | ||
6490 | if (USB_TYPE_VENDOR == (USB_TYPE_MASK & requesttype)) | ||
6491 | return 0; | ||
6492 | |||
6493 | + /* | ||
6494 | + * check for the special corner case 'get_device_id' in the printer | ||
6495 | + * class specification, where wIndex is (interface << 8 | altsetting) | ||
6496 | + * instead of just interface | ||
6497 | + */ | ||
6498 | + if (requesttype == 0xa1 && request == 0) { | ||
6499 | + alt_setting = usb_find_alt_setting(ps->dev->actconfig, | ||
6500 | + index >> 8, index & 0xff); | ||
6501 | + if (alt_setting | ||
6502 | + && alt_setting->desc.bInterfaceClass == USB_CLASS_PRINTER) | ||
6503 | + index >>= 8; | ||
6504 | + } | ||
6505 | + | ||
6506 | index &= 0xff; | ||
6507 | switch (requesttype & USB_RECIP_MASK) { | ||
6508 | case USB_RECIP_ENDPOINT: | ||
6509 | @@ -770,7 +786,8 @@ static int proc_control(struct dev_state *ps, void __user *arg) | ||
6510 | |||
6511 | if (copy_from_user(&ctrl, arg, sizeof(ctrl))) | ||
6512 | return -EFAULT; | ||
6513 | - ret = check_ctrlrecip(ps, ctrl.bRequestType, ctrl.wIndex); | ||
6514 | + ret = check_ctrlrecip(ps, ctrl.bRequestType, ctrl.bRequest, | ||
6515 | + ctrl.wIndex); | ||
6516 | if (ret) | ||
6517 | return ret; | ||
6518 | wLength = ctrl.wLength; /* To suppress 64k PAGE_SIZE warning */ | ||
6519 | @@ -1100,7 +1117,7 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb, | ||
6520 | kfree(dr); | ||
6521 | return -EINVAL; | ||
6522 | } | ||
6523 | - ret = check_ctrlrecip(ps, dr->bRequestType, | ||
6524 | + ret = check_ctrlrecip(ps, dr->bRequestType, dr->bRequest, | ||
6525 | le16_to_cpup(&dr->wIndex)); | ||
6526 | if (ret) { | ||
6527 | kfree(dr); | ||
6528 | diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c | ||
6529 | index 34e3da5..75b4bc0 100644 | ||
6530 | --- a/drivers/usb/core/driver.c | ||
6531 | +++ b/drivers/usb/core/driver.c | ||
6532 | @@ -1583,7 +1583,7 @@ int usb_autopm_get_interface_async(struct usb_interface *intf) | ||
6533 | dev_vdbg(&intf->dev, "%s: cnt %d -> %d\n", | ||
6534 | __func__, atomic_read(&intf->dev.power.usage_count), | ||
6535 | status); | ||
6536 | - if (status > 0) | ||
6537 | + if (status > 0 || status == -EINPROGRESS) | ||
6538 | status = 0; | ||
6539 | return status; | ||
6540 | } | ||
6541 | @@ -1668,6 +1668,11 @@ int usb_runtime_suspend(struct device *dev) | ||
6542 | return -EAGAIN; | ||
6543 | |||
6544 | status = usb_suspend_both(udev, PMSG_AUTO_SUSPEND); | ||
6545 | + | ||
6546 | + /* Allow a retry if autosuspend failed temporarily */ | ||
6547 | + if (status == -EAGAIN || status == -EBUSY) | ||
6548 | + usb_mark_last_busy(udev); | ||
6549 | + | ||
6550 | /* The PM core reacts badly unless the return code is 0, | ||
6551 | * -EAGAIN, or -EBUSY, so always return -EBUSY on an error. | ||
6552 | */ | ||
6553 | diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c | ||
6554 | index 81ce6a8..d6a8d82 100644 | ||
6555 | --- a/drivers/usb/core/quirks.c | ||
6556 | +++ b/drivers/usb/core/quirks.c | ||
6557 | @@ -38,6 +38,27 @@ static const struct usb_device_id usb_quirk_list[] = { | ||
6558 | /* Creative SB Audigy 2 NX */ | ||
6559 | { USB_DEVICE(0x041e, 0x3020), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
6560 | |||
6561 | + /* Logitech Webcam C200 */ | ||
6562 | + { USB_DEVICE(0x046d, 0x0802), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
6563 | + | ||
6564 | + /* Logitech Webcam C250 */ | ||
6565 | + { USB_DEVICE(0x046d, 0x0804), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
6566 | + | ||
6567 | + /* Logitech Webcam C300 */ | ||
6568 | + { USB_DEVICE(0x046d, 0x0805), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
6569 | + | ||
6570 | + /* Logitech Webcam B/C500 */ | ||
6571 | + { USB_DEVICE(0x046d, 0x0807), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
6572 | + | ||
6573 | + /* Logitech Webcam Pro 9000 */ | ||
6574 | + { USB_DEVICE(0x046d, 0x0809), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
6575 | + | ||
6576 | + /* Logitech Webcam C310 */ | ||
6577 | + { USB_DEVICE(0x046d, 0x081b), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
6578 | + | ||
6579 | + /* Logitech Webcam C270 */ | ||
6580 | + { USB_DEVICE(0x046d, 0x0825), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
6581 | + | ||
6582 | /* Logitech Harmony 700-series */ | ||
6583 | { USB_DEVICE(0x046d, 0xc122), .driver_info = USB_QUIRK_DELAY_INIT }, | ||
6584 | |||
6585 | @@ -69,6 +90,9 @@ static const struct usb_device_id usb_quirk_list[] = { | ||
6586 | { USB_DEVICE(0x06a3, 0x0006), .driver_info = | ||
6587 | USB_QUIRK_CONFIG_INTF_STRINGS }, | ||
6588 | |||
6589 | + /* Guillemot Webcam Hercules Dualpix Exchange*/ | ||
6590 | + { USB_DEVICE(0x06f8, 0x0804), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
6591 | + | ||
6592 | /* M-Systems Flash Disk Pioneers */ | ||
6593 | { USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
6594 | |||
6595 | diff --git a/drivers/usb/gadget/printer.c b/drivers/usb/gadget/printer.c | ||
6596 | index a341dde..0c06d80 100644 | ||
6597 | --- a/drivers/usb/gadget/printer.c | ||
6598 | +++ b/drivers/usb/gadget/printer.c | ||
6599 | @@ -1611,7 +1611,7 @@ cleanup(void) | ||
6600 | if (status) | ||
6601 | ERROR(dev, "usb_gadget_unregister_driver %x\n", status); | ||
6602 | |||
6603 | - unregister_chrdev_region(g_printer_devno, 2); | ||
6604 | + unregister_chrdev_region(g_printer_devno, 1); | ||
6605 | class_destroy(usb_gadget_class); | ||
6606 | mutex_unlock(&usb_printer_gadget.lock_printer_io); | ||
6607 | } | ||
6608 | diff --git a/drivers/usb/host/ehci-dbg.c b/drivers/usb/host/ehci-dbg.c | ||
6609 | index 40a844c..3e2ccb0 100644 | ||
6610 | --- a/drivers/usb/host/ehci-dbg.c | ||
6611 | +++ b/drivers/usb/host/ehci-dbg.c | ||
6612 | @@ -808,7 +808,7 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf) | ||
6613 | next += temp; | ||
6614 | |||
6615 | temp = scnprintf (next, size, "uframe %04x\n", | ||
6616 | - ehci_readl(ehci, &ehci->regs->frame_index)); | ||
6617 | + ehci_read_frame_index(ehci)); | ||
6618 | size -= temp; | ||
6619 | next += temp; | ||
6620 | |||
6621 | diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c | ||
6622 | index f72ae0b..d7318e3 100644 | ||
6623 | --- a/drivers/usb/host/ehci-hcd.c | ||
6624 | +++ b/drivers/usb/host/ehci-hcd.c | ||
6625 | @@ -768,6 +768,35 @@ static int ehci_run (struct usb_hcd *hcd) | ||
6626 | return 0; | ||
6627 | } | ||
6628 | |||
6629 | +static int __maybe_unused ehci_setup (struct usb_hcd *hcd) | ||
6630 | +{ | ||
6631 | + struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
6632 | + int retval; | ||
6633 | + | ||
6634 | + ehci->regs = (void __iomem *)ehci->caps + | ||
6635 | + HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); | ||
6636 | + dbg_hcs_params(ehci, "reset"); | ||
6637 | + dbg_hcc_params(ehci, "reset"); | ||
6638 | + | ||
6639 | + /* cache this readonly data; minimize chip reads */ | ||
6640 | + ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); | ||
6641 | + | ||
6642 | + ehci->sbrn = HCD_USB2; | ||
6643 | + | ||
6644 | + retval = ehci_halt(ehci); | ||
6645 | + if (retval) | ||
6646 | + return retval; | ||
6647 | + | ||
6648 | + /* data structure init */ | ||
6649 | + retval = ehci_init(hcd); | ||
6650 | + if (retval) | ||
6651 | + return retval; | ||
6652 | + | ||
6653 | + ehci_reset(ehci); | ||
6654 | + | ||
6655 | + return 0; | ||
6656 | +} | ||
6657 | + | ||
6658 | /*-------------------------------------------------------------------------*/ | ||
6659 | |||
6660 | static irqreturn_t ehci_irq (struct usb_hcd *hcd) | ||
6661 | @@ -1166,8 +1195,7 @@ ehci_endpoint_reset(struct usb_hcd *hcd, struct usb_host_endpoint *ep) | ||
6662 | static int ehci_get_frame (struct usb_hcd *hcd) | ||
6663 | { | ||
6664 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); | ||
6665 | - return (ehci_readl(ehci, &ehci->regs->frame_index) >> 3) % | ||
6666 | - ehci->periodic_size; | ||
6667 | + return (ehci_read_frame_index(ehci) >> 3) % ehci->periodic_size; | ||
6668 | } | ||
6669 | |||
6670 | /*-------------------------------------------------------------------------*/ | ||
6671 | diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c | ||
6672 | index 1102ce6..1d1caa6 100644 | ||
6673 | --- a/drivers/usb/host/ehci-pci.c | ||
6674 | +++ b/drivers/usb/host/ehci-pci.c | ||
6675 | @@ -224,6 +224,11 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | ||
6676 | pci_dev_put(p_smbus); | ||
6677 | } | ||
6678 | break; | ||
6679 | + case PCI_VENDOR_ID_NETMOS: | ||
6680 | + /* MosChip frame-index-register bug */ | ||
6681 | + ehci_info(ehci, "applying MosChip frame-index workaround\n"); | ||
6682 | + ehci->frame_index_bug = 1; | ||
6683 | + break; | ||
6684 | } | ||
6685 | |||
6686 | /* optional debug port, normally in the first BAR */ | ||
6687 | diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c | ||
6688 | index 2abf854..29bec34 100644 | ||
6689 | --- a/drivers/usb/host/ehci-sched.c | ||
6690 | +++ b/drivers/usb/host/ehci-sched.c | ||
6691 | @@ -36,6 +36,27 @@ | ||
6692 | |||
6693 | static int ehci_get_frame (struct usb_hcd *hcd); | ||
6694 | |||
6695 | +#ifdef CONFIG_PCI | ||
6696 | + | ||
6697 | +static unsigned ehci_read_frame_index(struct ehci_hcd *ehci) | ||
6698 | +{ | ||
6699 | + unsigned uf; | ||
6700 | + | ||
6701 | + /* | ||
6702 | + * The MosChip MCS9990 controller updates its microframe counter | ||
6703 | + * a little before the frame counter, and occasionally we will read | ||
6704 | + * the invalid intermediate value. Avoid problems by checking the | ||
6705 | + * microframe number (the low-order 3 bits); if they are 0 then | ||
6706 | + * re-read the register to get the correct value. | ||
6707 | + */ | ||
6708 | + uf = ehci_readl(ehci, &ehci->regs->frame_index); | ||
6709 | + if (unlikely(ehci->frame_index_bug && ((uf & 7) == 0))) | ||
6710 | + uf = ehci_readl(ehci, &ehci->regs->frame_index); | ||
6711 | + return uf; | ||
6712 | +} | ||
6713 | + | ||
6714 | +#endif | ||
6715 | + | ||
6716 | /*-------------------------------------------------------------------------*/ | ||
6717 | |||
6718 | /* | ||
6719 | @@ -482,7 +503,7 @@ static int enable_periodic (struct ehci_hcd *ehci) | ||
6720 | ehci_to_hcd(ehci)->state = HC_STATE_RUNNING; | ||
6721 | |||
6722 | /* make sure ehci_work scans these */ | ||
6723 | - ehci->next_uframe = ehci_readl(ehci, &ehci->regs->frame_index) | ||
6724 | + ehci->next_uframe = ehci_read_frame_index(ehci) | ||
6725 | % (ehci->periodic_size << 3); | ||
6726 | if (unlikely(ehci->broken_periodic)) | ||
6727 | ehci->last_periodic_enable = ktime_get_real(); | ||
6728 | @@ -1409,7 +1430,7 @@ iso_stream_schedule ( | ||
6729 | goto fail; | ||
6730 | } | ||
6731 | |||
6732 | - now = ehci_readl(ehci, &ehci->regs->frame_index) & (mod - 1); | ||
6733 | + now = ehci_read_frame_index(ehci) & (mod - 1); | ||
6734 | |||
6735 | /* Typical case: reuse current schedule, stream is still active. | ||
6736 | * Hopefully there are no gaps from the host falling behind | ||
6737 | @@ -2276,7 +2297,7 @@ scan_periodic (struct ehci_hcd *ehci) | ||
6738 | */ | ||
6739 | now_uframe = ehci->next_uframe; | ||
6740 | if (HC_IS_RUNNING(ehci_to_hcd(ehci)->state)) { | ||
6741 | - clock = ehci_readl(ehci, &ehci->regs->frame_index); | ||
6742 | + clock = ehci_read_frame_index(ehci); | ||
6743 | clock_frame = (clock >> 3) & (ehci->periodic_size - 1); | ||
6744 | } else { | ||
6745 | clock = now_uframe + mod - 1; | ||
6746 | @@ -2455,8 +2476,7 @@ restart: | ||
6747 | || ehci->periodic_sched == 0) | ||
6748 | break; | ||
6749 | ehci->next_uframe = now_uframe; | ||
6750 | - now = ehci_readl(ehci, &ehci->regs->frame_index) & | ||
6751 | - (mod - 1); | ||
6752 | + now = ehci_read_frame_index(ehci) & (mod - 1); | ||
6753 | if (now_uframe == now) | ||
6754 | break; | ||
6755 | |||
6756 | diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h | ||
6757 | index cc7d337..d92ed5c 100644 | ||
6758 | --- a/drivers/usb/host/ehci.h | ||
6759 | +++ b/drivers/usb/host/ehci.h | ||
6760 | @@ -139,6 +139,7 @@ struct ehci_hcd { /* one per controller */ | ||
6761 | unsigned fs_i_thresh:1; /* Intel iso scheduling */ | ||
6762 | unsigned use_dummy_qh:1; /* AMD Frame List table quirk*/ | ||
6763 | unsigned has_synopsys_hc_bug:1; /* Synopsys HC */ | ||
6764 | + unsigned frame_index_bug:1; /* MosChip (AKA NetMos) */ | ||
6765 | |||
6766 | /* required for usb32 quirk */ | ||
6767 | #define OHCI_CTRL_HCFS (3 << 6) | ||
6768 | @@ -740,6 +741,22 @@ static inline u32 hc32_to_cpup (const struct ehci_hcd *ehci, const __hc32 *x) | ||
6769 | |||
6770 | /*-------------------------------------------------------------------------*/ | ||
6771 | |||
6772 | +#ifdef CONFIG_PCI | ||
6773 | + | ||
6774 | +/* For working around the MosChip frame-index-register bug */ | ||
6775 | +static unsigned ehci_read_frame_index(struct ehci_hcd *ehci); | ||
6776 | + | ||
6777 | +#else | ||
6778 | + | ||
6779 | +static inline unsigned ehci_read_frame_index(struct ehci_hcd *ehci) | ||
6780 | +{ | ||
6781 | + return ehci_readl(ehci, &ehci->regs->frame_index); | ||
6782 | +} | ||
6783 | + | ||
6784 | +#endif | ||
6785 | + | ||
6786 | +/*-------------------------------------------------------------------------*/ | ||
6787 | + | ||
6788 | #ifndef DEBUG | ||
6789 | #define STUB_DEBUG_FILES | ||
6790 | #endif /* DEBUG */ | ||
6791 | diff --git a/drivers/usb/host/fhci-sched.c b/drivers/usb/host/fhci-sched.c | ||
6792 | index a42ef38..2df851b 100644 | ||
6793 | --- a/drivers/usb/host/fhci-sched.c | ||
6794 | +++ b/drivers/usb/host/fhci-sched.c | ||
6795 | @@ -1,7 +1,7 @@ | ||
6796 | /* | ||
6797 | * Freescale QUICC Engine USB Host Controller Driver | ||
6798 | * | ||
6799 | - * Copyright (c) Freescale Semicondutor, Inc. 2006. | ||
6800 | + * Copyright (c) Freescale Semicondutor, Inc. 2006, 2011. | ||
6801 | * Shlomi Gridish <gridish@freescale.com> | ||
6802 | * Jerry Huang <Chang-Ming.Huang@freescale.com> | ||
6803 | * Copyright (c) Logic Product Development, Inc. 2007 | ||
6804 | @@ -810,9 +810,11 @@ void fhci_queue_urb(struct fhci_hcd *fhci, struct urb *urb) | ||
6805 | ed->dev_addr = usb_pipedevice(urb->pipe); | ||
6806 | ed->max_pkt_size = usb_maxpacket(urb->dev, urb->pipe, | ||
6807 | usb_pipeout(urb->pipe)); | ||
6808 | + /* setup stage */ | ||
6809 | td = fhci_td_fill(fhci, urb, urb_priv, ed, cnt++, FHCI_TA_SETUP, | ||
6810 | USB_TD_TOGGLE_DATA0, urb->setup_packet, 8, 0, 0, true); | ||
6811 | |||
6812 | + /* data stage */ | ||
6813 | if (data_len > 0) { | ||
6814 | td = fhci_td_fill(fhci, urb, urb_priv, ed, cnt++, | ||
6815 | usb_pipeout(urb->pipe) ? FHCI_TA_OUT : | ||
6816 | @@ -820,9 +822,18 @@ void fhci_queue_urb(struct fhci_hcd *fhci, struct urb *urb) | ||
6817 | USB_TD_TOGGLE_DATA1, data, data_len, 0, 0, | ||
6818 | true); | ||
6819 | } | ||
6820 | - td = fhci_td_fill(fhci, urb, urb_priv, ed, cnt++, | ||
6821 | - usb_pipeout(urb->pipe) ? FHCI_TA_IN : FHCI_TA_OUT, | ||
6822 | - USB_TD_TOGGLE_DATA1, data, 0, 0, 0, true); | ||
6823 | + | ||
6824 | + /* status stage */ | ||
6825 | + if (data_len > 0) | ||
6826 | + td = fhci_td_fill(fhci, urb, urb_priv, ed, cnt++, | ||
6827 | + (usb_pipeout(urb->pipe) ? FHCI_TA_IN : | ||
6828 | + FHCI_TA_OUT), | ||
6829 | + USB_TD_TOGGLE_DATA1, data, 0, 0, 0, true); | ||
6830 | + else | ||
6831 | + td = fhci_td_fill(fhci, urb, urb_priv, ed, cnt++, | ||
6832 | + FHCI_TA_IN, | ||
6833 | + USB_TD_TOGGLE_DATA1, data, 0, 0, 0, true); | ||
6834 | + | ||
6835 | urb_state = US_CTRL_SETUP; | ||
6836 | break; | ||
6837 | case FHCI_TF_ISO: | ||
6838 | diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c | ||
6839 | index 9154615..2f00040 100644 | ||
6840 | --- a/drivers/usb/host/ohci-hub.c | ||
6841 | +++ b/drivers/usb/host/ohci-hub.c | ||
6842 | @@ -356,10 +356,7 @@ static void ohci_finish_controller_resume(struct usb_hcd *hcd) | ||
6843 | msleep(20); | ||
6844 | } | ||
6845 | |||
6846 | - /* Does the root hub have a port wakeup pending? */ | ||
6847 | - if (ohci_readl(ohci, &ohci->regs->intrstatus) & | ||
6848 | - (OHCI_INTR_RD | OHCI_INTR_RHSC)) | ||
6849 | - usb_hcd_resume_root_hub(hcd); | ||
6850 | + usb_hcd_resume_root_hub(hcd); | ||
6851 | } | ||
6852 | |||
6853 | /* Carry out polling-, autostop-, and autoresume-related state changes */ | ||
6854 | diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c | ||
6855 | index 723f823..ce9f974 100644 | ||
6856 | --- a/drivers/usb/host/xhci-hub.c | ||
6857 | +++ b/drivers/usb/host/xhci-hub.c | ||
6858 | @@ -392,6 +392,20 @@ static int xhci_get_ports(struct usb_hcd *hcd, __le32 __iomem ***port_array) | ||
6859 | return max_ports; | ||
6860 | } | ||
6861 | |||
6862 | +/* Test and clear port RWC bit */ | ||
6863 | +void xhci_test_and_clear_bit(struct xhci_hcd *xhci, __le32 __iomem **port_array, | ||
6864 | + int port_id, u32 port_bit) | ||
6865 | +{ | ||
6866 | + u32 temp; | ||
6867 | + | ||
6868 | + temp = xhci_readl(xhci, port_array[port_id]); | ||
6869 | + if (temp & port_bit) { | ||
6870 | + temp = xhci_port_state_to_neutral(temp); | ||
6871 | + temp |= port_bit; | ||
6872 | + xhci_writel(xhci, temp, port_array[port_id]); | ||
6873 | + } | ||
6874 | +} | ||
6875 | + | ||
6876 | int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | ||
6877 | u16 wIndex, char *buf, u16 wLength) | ||
6878 | { | ||
6879 | @@ -938,12 +952,8 @@ int xhci_bus_resume(struct usb_hcd *hcd) | ||
6880 | spin_lock_irqsave(&xhci->lock, flags); | ||
6881 | |||
6882 | /* Clear PLC */ | ||
6883 | - temp = xhci_readl(xhci, port_array[port_index]); | ||
6884 | - if (temp & PORT_PLC) { | ||
6885 | - temp = xhci_port_state_to_neutral(temp); | ||
6886 | - temp |= PORT_PLC; | ||
6887 | - xhci_writel(xhci, temp, port_array[port_index]); | ||
6888 | - } | ||
6889 | + xhci_test_and_clear_bit(xhci, port_array, port_index, | ||
6890 | + PORT_PLC); | ||
6891 | |||
6892 | slot_id = xhci_find_slot_id_by_port(hcd, | ||
6893 | xhci, port_index + 1); | ||
6894 | diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c | ||
6895 | index d446886..3428528 100644 | ||
6896 | --- a/drivers/usb/host/xhci-mem.c | ||
6897 | +++ b/drivers/usb/host/xhci-mem.c | ||
6898 | @@ -81,7 +81,7 @@ static void xhci_segment_free(struct xhci_hcd *xhci, struct xhci_segment *seg) | ||
6899 | * related flags, such as End TRB, Toggle Cycle, and no snoop. | ||
6900 | */ | ||
6901 | static void xhci_link_segments(struct xhci_hcd *xhci, struct xhci_segment *prev, | ||
6902 | - struct xhci_segment *next, bool link_trbs) | ||
6903 | + struct xhci_segment *next, bool link_trbs, bool isoc) | ||
6904 | { | ||
6905 | u32 val; | ||
6906 | |||
6907 | @@ -97,7 +97,9 @@ static void xhci_link_segments(struct xhci_hcd *xhci, struct xhci_segment *prev, | ||
6908 | val &= ~TRB_TYPE_BITMASK; | ||
6909 | val |= TRB_TYPE(TRB_LINK); | ||
6910 | /* Always set the chain bit with 0.95 hardware */ | ||
6911 | - if (xhci_link_trb_quirk(xhci)) | ||
6912 | + /* Set chain bit for isoc rings on AMD 0.96 host */ | ||
6913 | + if (xhci_link_trb_quirk(xhci) || | ||
6914 | + (isoc && (xhci->quirks & XHCI_AMD_0x96_HOST))) | ||
6915 | val |= TRB_CHAIN; | ||
6916 | prev->trbs[TRBS_PER_SEGMENT-1].link.control = cpu_to_le32(val); | ||
6917 | } | ||
6918 | @@ -112,18 +114,20 @@ void xhci_ring_free(struct xhci_hcd *xhci, struct xhci_ring *ring) | ||
6919 | struct xhci_segment *seg; | ||
6920 | struct xhci_segment *first_seg; | ||
6921 | |||
6922 | - if (!ring || !ring->first_seg) | ||
6923 | + if (!ring) | ||
6924 | return; | ||
6925 | - first_seg = ring->first_seg; | ||
6926 | - seg = first_seg->next; | ||
6927 | - xhci_dbg(xhci, "Freeing ring at %p\n", ring); | ||
6928 | - while (seg != first_seg) { | ||
6929 | - struct xhci_segment *next = seg->next; | ||
6930 | - xhci_segment_free(xhci, seg); | ||
6931 | - seg = next; | ||
6932 | + if (ring->first_seg) { | ||
6933 | + first_seg = ring->first_seg; | ||
6934 | + seg = first_seg->next; | ||
6935 | + xhci_dbg(xhci, "Freeing ring at %p\n", ring); | ||
6936 | + while (seg != first_seg) { | ||
6937 | + struct xhci_segment *next = seg->next; | ||
6938 | + xhci_segment_free(xhci, seg); | ||
6939 | + seg = next; | ||
6940 | + } | ||
6941 | + xhci_segment_free(xhci, first_seg); | ||
6942 | + ring->first_seg = NULL; | ||
6943 | } | ||
6944 | - xhci_segment_free(xhci, first_seg); | ||
6945 | - ring->first_seg = NULL; | ||
6946 | kfree(ring); | ||
6947 | } | ||
6948 | |||
6949 | @@ -152,7 +156,7 @@ static void xhci_initialize_ring_info(struct xhci_ring *ring) | ||
6950 | * See section 4.9.1 and figures 15 and 16. | ||
6951 | */ | ||
6952 | static struct xhci_ring *xhci_ring_alloc(struct xhci_hcd *xhci, | ||
6953 | - unsigned int num_segs, bool link_trbs, gfp_t flags) | ||
6954 | + unsigned int num_segs, bool link_trbs, bool isoc, gfp_t flags) | ||
6955 | { | ||
6956 | struct xhci_ring *ring; | ||
6957 | struct xhci_segment *prev; | ||
6958 | @@ -178,12 +182,12 @@ static struct xhci_ring *xhci_ring_alloc(struct xhci_hcd *xhci, | ||
6959 | next = xhci_segment_alloc(xhci, flags); | ||
6960 | if (!next) | ||
6961 | goto fail; | ||
6962 | - xhci_link_segments(xhci, prev, next, link_trbs); | ||
6963 | + xhci_link_segments(xhci, prev, next, link_trbs, isoc); | ||
6964 | |||
6965 | prev = next; | ||
6966 | num_segs--; | ||
6967 | } | ||
6968 | - xhci_link_segments(xhci, prev, ring->first_seg, link_trbs); | ||
6969 | + xhci_link_segments(xhci, prev, ring->first_seg, link_trbs, isoc); | ||
6970 | |||
6971 | if (link_trbs) { | ||
6972 | /* See section 4.9.2.1 and 6.4.4.1 */ | ||
6973 | @@ -229,14 +233,14 @@ void xhci_free_or_cache_endpoint_ring(struct xhci_hcd *xhci, | ||
6974 | * pointers to the beginning of the ring. | ||
6975 | */ | ||
6976 | static void xhci_reinit_cached_ring(struct xhci_hcd *xhci, | ||
6977 | - struct xhci_ring *ring) | ||
6978 | + struct xhci_ring *ring, bool isoc) | ||
6979 | { | ||
6980 | struct xhci_segment *seg = ring->first_seg; | ||
6981 | do { | ||
6982 | memset(seg->trbs, 0, | ||
6983 | sizeof(union xhci_trb)*TRBS_PER_SEGMENT); | ||
6984 | /* All endpoint rings have link TRBs */ | ||
6985 | - xhci_link_segments(xhci, seg, seg->next, 1); | ||
6986 | + xhci_link_segments(xhci, seg, seg->next, 1, isoc); | ||
6987 | seg = seg->next; | ||
6988 | } while (seg != ring->first_seg); | ||
6989 | xhci_initialize_ring_info(ring); | ||
6990 | @@ -540,7 +544,7 @@ struct xhci_stream_info *xhci_alloc_stream_info(struct xhci_hcd *xhci, | ||
6991 | */ | ||
6992 | for (cur_stream = 1; cur_stream < num_streams; cur_stream++) { | ||
6993 | stream_info->stream_rings[cur_stream] = | ||
6994 | - xhci_ring_alloc(xhci, 1, true, mem_flags); | ||
6995 | + xhci_ring_alloc(xhci, 1, true, false, mem_flags); | ||
6996 | cur_ring = stream_info->stream_rings[cur_stream]; | ||
6997 | if (!cur_ring) | ||
6998 | goto cleanup_rings; | ||
6999 | @@ -765,7 +769,7 @@ int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id, | ||
7000 | } | ||
7001 | |||
7002 | /* Allocate endpoint 0 ring */ | ||
7003 | - dev->eps[0].ring = xhci_ring_alloc(xhci, 1, true, flags); | ||
7004 | + dev->eps[0].ring = xhci_ring_alloc(xhci, 1, true, false, flags); | ||
7005 | if (!dev->eps[0].ring) | ||
7006 | goto fail; | ||
7007 | |||
7008 | @@ -1175,10 +1179,10 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, | ||
7009 | */ | ||
7010 | if (usb_endpoint_xfer_isoc(&ep->desc)) | ||
7011 | virt_dev->eps[ep_index].new_ring = | ||
7012 | - xhci_ring_alloc(xhci, 8, true, mem_flags); | ||
7013 | + xhci_ring_alloc(xhci, 8, true, true, mem_flags); | ||
7014 | else | ||
7015 | virt_dev->eps[ep_index].new_ring = | ||
7016 | - xhci_ring_alloc(xhci, 1, true, mem_flags); | ||
7017 | + xhci_ring_alloc(xhci, 1, true, false, mem_flags); | ||
7018 | if (!virt_dev->eps[ep_index].new_ring) { | ||
7019 | /* Attempt to use the ring cache */ | ||
7020 | if (virt_dev->num_rings_cached == 0) | ||
7021 | @@ -1187,7 +1191,8 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, | ||
7022 | virt_dev->ring_cache[virt_dev->num_rings_cached]; | ||
7023 | virt_dev->ring_cache[virt_dev->num_rings_cached] = NULL; | ||
7024 | virt_dev->num_rings_cached--; | ||
7025 | - xhci_reinit_cached_ring(xhci, virt_dev->eps[ep_index].new_ring); | ||
7026 | + xhci_reinit_cached_ring(xhci, virt_dev->eps[ep_index].new_ring, | ||
7027 | + usb_endpoint_xfer_isoc(&ep->desc) ? true : false); | ||
7028 | } | ||
7029 | virt_dev->eps[ep_index].skip = false; | ||
7030 | ep_ring = virt_dev->eps[ep_index].new_ring; | ||
7031 | @@ -2001,7 +2006,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | ||
7032 | goto fail; | ||
7033 | |||
7034 | /* Set up the command ring to have one segments for now. */ | ||
7035 | - xhci->cmd_ring = xhci_ring_alloc(xhci, 1, true, flags); | ||
7036 | + xhci->cmd_ring = xhci_ring_alloc(xhci, 1, true, false, flags); | ||
7037 | if (!xhci->cmd_ring) | ||
7038 | goto fail; | ||
7039 | xhci_dbg(xhci, "Allocated command ring at %p\n", xhci->cmd_ring); | ||
7040 | @@ -2032,7 +2037,8 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | ||
7041 | * the event ring segment table (ERST). Section 4.9.3. | ||
7042 | */ | ||
7043 | xhci_dbg(xhci, "// Allocating event ring\n"); | ||
7044 | - xhci->event_ring = xhci_ring_alloc(xhci, ERST_NUM_SEGS, false, flags); | ||
7045 | + xhci->event_ring = xhci_ring_alloc(xhci, ERST_NUM_SEGS, false, false, | ||
7046 | + flags); | ||
7047 | if (!xhci->event_ring) | ||
7048 | goto fail; | ||
7049 | if (xhci_check_trb_in_td_math(xhci, flags) < 0) | ||
7050 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c | ||
7051 | index cb16de2..50e7156 100644 | ||
7052 | --- a/drivers/usb/host/xhci-pci.c | ||
7053 | +++ b/drivers/usb/host/xhci-pci.c | ||
7054 | @@ -128,6 +128,9 @@ static int xhci_pci_setup(struct usb_hcd *hcd) | ||
7055 | if (pdev->vendor == PCI_VENDOR_ID_NEC) | ||
7056 | xhci->quirks |= XHCI_NEC_HOST; | ||
7057 | |||
7058 | + if (pdev->vendor == PCI_VENDOR_ID_AMD && xhci->hci_version == 0x96) | ||
7059 | + xhci->quirks |= XHCI_AMD_0x96_HOST; | ||
7060 | + | ||
7061 | /* AMD PLL quirk */ | ||
7062 | if (pdev->vendor == PCI_VENDOR_ID_AMD && usb_amd_find_chipset_info()) | ||
7063 | xhci->quirks |= XHCI_AMD_PLL_FIX; | ||
7064 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c | ||
7065 | index 952e2de..dd3eb6f 100644 | ||
7066 | --- a/drivers/usb/host/xhci-ring.c | ||
7067 | +++ b/drivers/usb/host/xhci-ring.c | ||
7068 | @@ -185,7 +185,7 @@ static void inc_deq(struct xhci_hcd *xhci, struct xhci_ring *ring, bool consumer | ||
7069 | * prepare_transfer()? | ||
7070 | */ | ||
7071 | static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, | ||
7072 | - bool consumer, bool more_trbs_coming) | ||
7073 | + bool consumer, bool more_trbs_coming, bool isoc) | ||
7074 | { | ||
7075 | u32 chain; | ||
7076 | union xhci_trb *next; | ||
7077 | @@ -212,11 +212,13 @@ static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, | ||
7078 | if (!chain && !more_trbs_coming) | ||
7079 | break; | ||
7080 | |||
7081 | - /* If we're not dealing with 0.95 hardware, | ||
7082 | + /* If we're not dealing with 0.95 hardware or | ||
7083 | + * isoc rings on AMD 0.96 host, | ||
7084 | * carry over the chain bit of the previous TRB | ||
7085 | * (which may mean the chain bit is cleared). | ||
7086 | */ | ||
7087 | - if (!xhci_link_trb_quirk(xhci)) { | ||
7088 | + if (!(isoc && (xhci->quirks & XHCI_AMD_0x96_HOST)) | ||
7089 | + && !xhci_link_trb_quirk(xhci)) { | ||
7090 | next->link.control &= | ||
7091 | cpu_to_le32(~TRB_CHAIN); | ||
7092 | next->link.control |= | ||
7093 | @@ -1342,10 +1344,8 @@ static void handle_port_status(struct xhci_hcd *xhci, | ||
7094 | xhci_ring_device(xhci, slot_id); | ||
7095 | xhci_dbg(xhci, "resume SS port %d finished\n", port_id); | ||
7096 | /* Clear PORT_PLC */ | ||
7097 | - temp = xhci_readl(xhci, port_array[faked_port_index]); | ||
7098 | - temp = xhci_port_state_to_neutral(temp); | ||
7099 | - temp |= PORT_PLC; | ||
7100 | - xhci_writel(xhci, temp, port_array[faked_port_index]); | ||
7101 | + xhci_test_and_clear_bit(xhci, port_array, | ||
7102 | + faked_port_index, PORT_PLC); | ||
7103 | } else { | ||
7104 | xhci_dbg(xhci, "resume HS port %d\n", port_id); | ||
7105 | bus_state->resume_done[faked_port_index] = jiffies + | ||
7106 | @@ -1356,6 +1356,10 @@ static void handle_port_status(struct xhci_hcd *xhci, | ||
7107 | } | ||
7108 | } | ||
7109 | |||
7110 | + if (hcd->speed != HCD_USB3) | ||
7111 | + xhci_test_and_clear_bit(xhci, port_array, faked_port_index, | ||
7112 | + PORT_PLC); | ||
7113 | + | ||
7114 | cleanup: | ||
7115 | /* Update event ring dequeue pointer before dropping the lock */ | ||
7116 | inc_deq(xhci, xhci->event_ring, true); | ||
7117 | @@ -2409,7 +2413,7 @@ irqreturn_t xhci_msi_irq(int irq, struct usb_hcd *hcd) | ||
7118 | * prepare_transfer()? | ||
7119 | */ | ||
7120 | static void queue_trb(struct xhci_hcd *xhci, struct xhci_ring *ring, | ||
7121 | - bool consumer, bool more_trbs_coming, | ||
7122 | + bool consumer, bool more_trbs_coming, bool isoc, | ||
7123 | u32 field1, u32 field2, u32 field3, u32 field4) | ||
7124 | { | ||
7125 | struct xhci_generic_trb *trb; | ||
7126 | @@ -2419,7 +2423,7 @@ static void queue_trb(struct xhci_hcd *xhci, struct xhci_ring *ring, | ||
7127 | trb->field[1] = cpu_to_le32(field2); | ||
7128 | trb->field[2] = cpu_to_le32(field3); | ||
7129 | trb->field[3] = cpu_to_le32(field4); | ||
7130 | - inc_enq(xhci, ring, consumer, more_trbs_coming); | ||
7131 | + inc_enq(xhci, ring, consumer, more_trbs_coming, isoc); | ||
7132 | } | ||
7133 | |||
7134 | /* | ||
7135 | @@ -2427,7 +2431,7 @@ static void queue_trb(struct xhci_hcd *xhci, struct xhci_ring *ring, | ||
7136 | * FIXME allocate segments if the ring is full. | ||
7137 | */ | ||
7138 | static int prepare_ring(struct xhci_hcd *xhci, struct xhci_ring *ep_ring, | ||
7139 | - u32 ep_state, unsigned int num_trbs, gfp_t mem_flags) | ||
7140 | + u32 ep_state, unsigned int num_trbs, bool isoc, gfp_t mem_flags) | ||
7141 | { | ||
7142 | /* Make sure the endpoint has been added to xHC schedule */ | ||
7143 | switch (ep_state) { | ||
7144 | @@ -2469,10 +2473,11 @@ static int prepare_ring(struct xhci_hcd *xhci, struct xhci_ring *ep_ring, | ||
7145 | next = ring->enqueue; | ||
7146 | |||
7147 | while (last_trb(xhci, ring, ring->enq_seg, next)) { | ||
7148 | - /* If we're not dealing with 0.95 hardware, | ||
7149 | - * clear the chain bit. | ||
7150 | + /* If we're not dealing with 0.95 hardware or isoc rings | ||
7151 | + * on AMD 0.96 host, clear the chain bit. | ||
7152 | */ | ||
7153 | - if (!xhci_link_trb_quirk(xhci)) | ||
7154 | + if (!xhci_link_trb_quirk(xhci) && !(isoc && | ||
7155 | + (xhci->quirks & XHCI_AMD_0x96_HOST))) | ||
7156 | next->link.control &= cpu_to_le32(~TRB_CHAIN); | ||
7157 | else | ||
7158 | next->link.control |= cpu_to_le32(TRB_CHAIN); | ||
7159 | @@ -2505,6 +2510,7 @@ static int prepare_transfer(struct xhci_hcd *xhci, | ||
7160 | unsigned int num_trbs, | ||
7161 | struct urb *urb, | ||
7162 | unsigned int td_index, | ||
7163 | + bool isoc, | ||
7164 | gfp_t mem_flags) | ||
7165 | { | ||
7166 | int ret; | ||
7167 | @@ -2522,7 +2528,7 @@ static int prepare_transfer(struct xhci_hcd *xhci, | ||
7168 | |||
7169 | ret = prepare_ring(xhci, ep_ring, | ||
7170 | le32_to_cpu(ep_ctx->ep_info) & EP_STATE_MASK, | ||
7171 | - num_trbs, mem_flags); | ||
7172 | + num_trbs, isoc, mem_flags); | ||
7173 | if (ret) | ||
7174 | return ret; | ||
7175 | |||
7176 | @@ -2745,7 +2751,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | ||
7177 | |||
7178 | trb_buff_len = prepare_transfer(xhci, xhci->devs[slot_id], | ||
7179 | ep_index, urb->stream_id, | ||
7180 | - num_trbs, urb, 0, mem_flags); | ||
7181 | + num_trbs, urb, 0, false, mem_flags); | ||
7182 | if (trb_buff_len < 0) | ||
7183 | return trb_buff_len; | ||
7184 | |||
7185 | @@ -2840,7 +2846,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | ||
7186 | more_trbs_coming = true; | ||
7187 | else | ||
7188 | more_trbs_coming = false; | ||
7189 | - queue_trb(xhci, ep_ring, false, more_trbs_coming, | ||
7190 | + queue_trb(xhci, ep_ring, false, more_trbs_coming, false, | ||
7191 | lower_32_bits(addr), | ||
7192 | upper_32_bits(addr), | ||
7193 | length_field, | ||
7194 | @@ -2931,7 +2937,7 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | ||
7195 | |||
7196 | ret = prepare_transfer(xhci, xhci->devs[slot_id], | ||
7197 | ep_index, urb->stream_id, | ||
7198 | - num_trbs, urb, 0, mem_flags); | ||
7199 | + num_trbs, urb, 0, false, mem_flags); | ||
7200 | if (ret < 0) | ||
7201 | return ret; | ||
7202 | |||
7203 | @@ -3003,7 +3009,7 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | ||
7204 | more_trbs_coming = true; | ||
7205 | else | ||
7206 | more_trbs_coming = false; | ||
7207 | - queue_trb(xhci, ep_ring, false, more_trbs_coming, | ||
7208 | + queue_trb(xhci, ep_ring, false, more_trbs_coming, false, | ||
7209 | lower_32_bits(addr), | ||
7210 | upper_32_bits(addr), | ||
7211 | length_field, | ||
7212 | @@ -3063,7 +3069,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | ||
7213 | num_trbs++; | ||
7214 | ret = prepare_transfer(xhci, xhci->devs[slot_id], | ||
7215 | ep_index, urb->stream_id, | ||
7216 | - num_trbs, urb, 0, mem_flags); | ||
7217 | + num_trbs, urb, 0, false, mem_flags); | ||
7218 | if (ret < 0) | ||
7219 | return ret; | ||
7220 | |||
7221 | @@ -3096,7 +3102,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | ||
7222 | } | ||
7223 | } | ||
7224 | |||
7225 | - queue_trb(xhci, ep_ring, false, true, | ||
7226 | + queue_trb(xhci, ep_ring, false, true, false, | ||
7227 | setup->bRequestType | setup->bRequest << 8 | le16_to_cpu(setup->wValue) << 16, | ||
7228 | le16_to_cpu(setup->wIndex) | le16_to_cpu(setup->wLength) << 16, | ||
7229 | TRB_LEN(8) | TRB_INTR_TARGET(0), | ||
7230 | @@ -3116,7 +3122,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | ||
7231 | if (urb->transfer_buffer_length > 0) { | ||
7232 | if (setup->bRequestType & USB_DIR_IN) | ||
7233 | field |= TRB_DIR_IN; | ||
7234 | - queue_trb(xhci, ep_ring, false, true, | ||
7235 | + queue_trb(xhci, ep_ring, false, true, false, | ||
7236 | lower_32_bits(urb->transfer_dma), | ||
7237 | upper_32_bits(urb->transfer_dma), | ||
7238 | length_field, | ||
7239 | @@ -3132,7 +3138,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | ||
7240 | field = 0; | ||
7241 | else | ||
7242 | field = TRB_DIR_IN; | ||
7243 | - queue_trb(xhci, ep_ring, false, false, | ||
7244 | + queue_trb(xhci, ep_ring, false, false, false, | ||
7245 | 0, | ||
7246 | 0, | ||
7247 | TRB_INTR_TARGET(0), | ||
7248 | @@ -3281,7 +3287,8 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | ||
7249 | trbs_per_td = count_isoc_trbs_needed(xhci, urb, i); | ||
7250 | |||
7251 | ret = prepare_transfer(xhci, xhci->devs[slot_id], ep_index, | ||
7252 | - urb->stream_id, trbs_per_td, urb, i, mem_flags); | ||
7253 | + urb->stream_id, trbs_per_td, urb, i, true, | ||
7254 | + mem_flags); | ||
7255 | if (ret < 0) { | ||
7256 | if (i == 0) | ||
7257 | return ret; | ||
7258 | @@ -3351,7 +3358,7 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | ||
7259 | remainder | | ||
7260 | TRB_INTR_TARGET(0); | ||
7261 | |||
7262 | - queue_trb(xhci, ep_ring, false, more_trbs_coming, | ||
7263 | + queue_trb(xhci, ep_ring, false, more_trbs_coming, true, | ||
7264 | lower_32_bits(addr), | ||
7265 | upper_32_bits(addr), | ||
7266 | length_field, | ||
7267 | @@ -3433,7 +3440,7 @@ int xhci_queue_isoc_tx_prepare(struct xhci_hcd *xhci, gfp_t mem_flags, | ||
7268 | * Do not insert any td of the urb to the ring if the check failed. | ||
7269 | */ | ||
7270 | ret = prepare_ring(xhci, ep_ring, le32_to_cpu(ep_ctx->ep_info) & EP_STATE_MASK, | ||
7271 | - num_trbs, mem_flags); | ||
7272 | + num_trbs, true, mem_flags); | ||
7273 | if (ret) | ||
7274 | return ret; | ||
7275 | |||
7276 | @@ -3492,7 +3499,7 @@ static int queue_command(struct xhci_hcd *xhci, u32 field1, u32 field2, | ||
7277 | reserved_trbs++; | ||
7278 | |||
7279 | ret = prepare_ring(xhci, xhci->cmd_ring, EP_STATE_RUNNING, | ||
7280 | - reserved_trbs, GFP_ATOMIC); | ||
7281 | + reserved_trbs, false, GFP_ATOMIC); | ||
7282 | if (ret < 0) { | ||
7283 | xhci_err(xhci, "ERR: No room for command on command ring\n"); | ||
7284 | if (command_must_succeed) | ||
7285 | @@ -3500,8 +3507,8 @@ static int queue_command(struct xhci_hcd *xhci, u32 field1, u32 field2, | ||
7286 | "unfailable commands failed.\n"); | ||
7287 | return ret; | ||
7288 | } | ||
7289 | - queue_trb(xhci, xhci->cmd_ring, false, false, field1, field2, field3, | ||
7290 | - field4 | xhci->cmd_ring->cycle_state); | ||
7291 | + queue_trb(xhci, xhci->cmd_ring, false, false, false, field1, field2, | ||
7292 | + field3, field4 | xhci->cmd_ring->cycle_state); | ||
7293 | return 0; | ||
7294 | } | ||
7295 | |||
7296 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c | ||
7297 | index 3a0f695..3770004 100644 | ||
7298 | --- a/drivers/usb/host/xhci.c | ||
7299 | +++ b/drivers/usb/host/xhci.c | ||
7300 | @@ -1888,6 +1888,12 @@ int xhci_check_bandwidth(struct usb_hcd *hcd, struct usb_device *udev) | ||
7301 | ctrl_ctx->add_flags |= cpu_to_le32(SLOT_FLAG); | ||
7302 | ctrl_ctx->add_flags &= cpu_to_le32(~EP0_FLAG); | ||
7303 | ctrl_ctx->drop_flags &= cpu_to_le32(~(SLOT_FLAG | EP0_FLAG)); | ||
7304 | + | ||
7305 | + /* Don't issue the command if there's no endpoints to update. */ | ||
7306 | + if (ctrl_ctx->add_flags == cpu_to_le32(SLOT_FLAG) && | ||
7307 | + ctrl_ctx->drop_flags == 0) | ||
7308 | + return 0; | ||
7309 | + | ||
7310 | xhci_dbg(xhci, "New Input Control Context:\n"); | ||
7311 | slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->in_ctx); | ||
7312 | xhci_dbg_ctx(xhci, virt_dev->in_ctx, | ||
7313 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h | ||
7314 | index cae8e23..1fb0549 100644 | ||
7315 | --- a/drivers/usb/host/xhci.h | ||
7316 | +++ b/drivers/usb/host/xhci.h | ||
7317 | @@ -1318,6 +1318,7 @@ struct xhci_hcd { | ||
7318 | #define XHCI_EP_LIMIT_QUIRK (1 << 5) | ||
7319 | #define XHCI_BROKEN_MSI (1 << 6) | ||
7320 | #define XHCI_RESET_ON_RESUME (1 << 7) | ||
7321 | +#define XHCI_AMD_0x96_HOST (1 << 9) | ||
7322 | unsigned int num_active_eps; | ||
7323 | unsigned int limit_active_eps; | ||
7324 | /* There are two roothubs to keep track of bus suspend info for */ | ||
7325 | @@ -1572,6 +1573,8 @@ void xhci_ring_ep_doorbell(struct xhci_hcd *xhci, unsigned int slot_id, | ||
7326 | unsigned int ep_index, unsigned int stream_id); | ||
7327 | |||
7328 | /* xHCI roothub code */ | ||
7329 | +void xhci_test_and_clear_bit(struct xhci_hcd *xhci, __le32 __iomem **port_array, | ||
7330 | + int port_id, u32 port_bit); | ||
7331 | int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, u16 wIndex, | ||
7332 | char *buf, u16 wLength); | ||
7333 | int xhci_hub_status_data(struct usb_hcd *hcd, char *buf); | ||
7334 | diff --git a/drivers/usb/mon/mon_bin.c b/drivers/usb/mon/mon_bin.c | ||
7335 | index a09dbd2..a04b2ff 100644 | ||
7336 | --- a/drivers/usb/mon/mon_bin.c | ||
7337 | +++ b/drivers/usb/mon/mon_bin.c | ||
7338 | @@ -1101,7 +1101,7 @@ static long mon_bin_ioctl(struct file *file, unsigned int cmd, unsigned long arg | ||
7339 | nevents = mon_bin_queued(rp); | ||
7340 | |||
7341 | sp = (struct mon_bin_stats __user *)arg; | ||
7342 | - if (put_user(rp->cnt_lost, &sp->dropped)) | ||
7343 | + if (put_user(ndropped, &sp->dropped)) | ||
7344 | return -EFAULT; | ||
7345 | if (put_user(nevents, &sp->queued)) | ||
7346 | return -EFAULT; | ||
7347 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
7348 | index 5fc13e7..f34f6ed 100644 | ||
7349 | --- a/drivers/usb/serial/ftdi_sio.c | ||
7350 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
7351 | @@ -207,6 +207,8 @@ static struct usb_device_id id_table_combined [] = { | ||
7352 | { USB_DEVICE(FTDI_VID, FTDI_XF_640_PID) }, | ||
7353 | { USB_DEVICE(FTDI_VID, FTDI_XF_642_PID) }, | ||
7354 | { USB_DEVICE(FTDI_VID, FTDI_DSS20_PID) }, | ||
7355 | + { USB_DEVICE(FTDI_VID, FTDI_URBAN_0_PID) }, | ||
7356 | + { USB_DEVICE(FTDI_VID, FTDI_URBAN_1_PID) }, | ||
7357 | { USB_DEVICE(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID) }, | ||
7358 | { USB_DEVICE(FTDI_VID, FTDI_VNHCPCUSB_D_PID) }, | ||
7359 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_0_PID) }, | ||
7360 | @@ -745,6 +747,8 @@ static struct usb_device_id id_table_combined [] = { | ||
7361 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
7362 | { USB_DEVICE(FTDI_VID, LMI_LM3S_EVAL_BOARD_PID), | ||
7363 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
7364 | + { USB_DEVICE(FTDI_VID, LMI_LM3S_ICDI_BOARD_PID), | ||
7365 | + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
7366 | { USB_DEVICE(FTDI_VID, FTDI_TURTELIZER_PID), | ||
7367 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
7368 | { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) }, | ||
7369 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h | ||
7370 | index bf5227a..571fa96 100644 | ||
7371 | --- a/drivers/usb/serial/ftdi_sio_ids.h | ||
7372 | +++ b/drivers/usb/serial/ftdi_sio_ids.h | ||
7373 | @@ -54,6 +54,7 @@ | ||
7374 | /* FTDI 2332C Dual channel device, side A=245 FIFO (JTAG), Side B=RS232 UART */ | ||
7375 | #define LMI_LM3S_DEVEL_BOARD_PID 0xbcd8 | ||
7376 | #define LMI_LM3S_EVAL_BOARD_PID 0xbcd9 | ||
7377 | +#define LMI_LM3S_ICDI_BOARD_PID 0xbcda | ||
7378 | |||
7379 | #define FTDI_TURTELIZER_PID 0xBDC8 /* JTAG/RS-232 adapter by egnite GmbH */ | ||
7380 | |||
7381 | @@ -420,9 +421,11 @@ | ||
7382 | #define PROTEGO_SPECIAL_4 0xFC73 /* special/unknown device */ | ||
7383 | |||
7384 | /* | ||
7385 | - * DSS-20 Sync Station for Sony Ericsson P800 | ||
7386 | + * Sony Ericsson product ids | ||
7387 | */ | ||
7388 | -#define FTDI_DSS20_PID 0xFC82 | ||
7389 | +#define FTDI_DSS20_PID 0xFC82 /* DSS-20 Sync Station for Sony Ericsson P800 */ | ||
7390 | +#define FTDI_URBAN_0_PID 0xFC8A /* Sony Ericsson Urban, uart #0 */ | ||
7391 | +#define FTDI_URBAN_1_PID 0xFC8B /* Sony Ericsson Urban, uart #1 */ | ||
7392 | |||
7393 | /* www.irtrans.de device */ | ||
7394 | #define FTDI_IRTRANS_PID 0xFC60 /* Product Id */ | ||
7395 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
7396 | index fe22e90..89ae1f6 100644 | ||
7397 | --- a/drivers/usb/serial/option.c | ||
7398 | +++ b/drivers/usb/serial/option.c | ||
7399 | @@ -475,31 +475,54 @@ enum option_blacklist_reason { | ||
7400 | OPTION_BLACKLIST_RESERVED_IF = 2 | ||
7401 | }; | ||
7402 | |||
7403 | +#define MAX_BL_NUM 8 | ||
7404 | struct option_blacklist_info { | ||
7405 | - const u32 infolen; /* number of interface numbers on blacklist */ | ||
7406 | - const u8 *ifaceinfo; /* pointer to the array holding the numbers */ | ||
7407 | - enum option_blacklist_reason reason; | ||
7408 | + /* bitfield of interface numbers for OPTION_BLACKLIST_SENDSETUP */ | ||
7409 | + const unsigned long sendsetup; | ||
7410 | + /* bitfield of interface numbers for OPTION_BLACKLIST_RESERVED_IF */ | ||
7411 | + const unsigned long reserved; | ||
7412 | }; | ||
7413 | |||
7414 | -static const u8 four_g_w14_no_sendsetup[] = { 0, 1 }; | ||
7415 | static const struct option_blacklist_info four_g_w14_blacklist = { | ||
7416 | - .infolen = ARRAY_SIZE(four_g_w14_no_sendsetup), | ||
7417 | - .ifaceinfo = four_g_w14_no_sendsetup, | ||
7418 | - .reason = OPTION_BLACKLIST_SENDSETUP | ||
7419 | + .sendsetup = BIT(0) | BIT(1), | ||
7420 | }; | ||
7421 | |||
7422 | -static const u8 alcatel_x200_no_sendsetup[] = { 0, 1 }; | ||
7423 | static const struct option_blacklist_info alcatel_x200_blacklist = { | ||
7424 | - .infolen = ARRAY_SIZE(alcatel_x200_no_sendsetup), | ||
7425 | - .ifaceinfo = alcatel_x200_no_sendsetup, | ||
7426 | - .reason = OPTION_BLACKLIST_SENDSETUP | ||
7427 | + .sendsetup = BIT(0) | BIT(1), | ||
7428 | +}; | ||
7429 | + | ||
7430 | +static const struct option_blacklist_info zte_0037_blacklist = { | ||
7431 | + .sendsetup = BIT(0) | BIT(1), | ||
7432 | }; | ||
7433 | |||
7434 | -static const u8 zte_k3765_z_no_sendsetup[] = { 0, 1, 2 }; | ||
7435 | static const struct option_blacklist_info zte_k3765_z_blacklist = { | ||
7436 | - .infolen = ARRAY_SIZE(zte_k3765_z_no_sendsetup), | ||
7437 | - .ifaceinfo = zte_k3765_z_no_sendsetup, | ||
7438 | - .reason = OPTION_BLACKLIST_SENDSETUP | ||
7439 | + .sendsetup = BIT(0) | BIT(1) | BIT(2), | ||
7440 | + .reserved = BIT(4), | ||
7441 | +}; | ||
7442 | + | ||
7443 | +static const struct option_blacklist_info huawei_cdc12_blacklist = { | ||
7444 | + .reserved = BIT(1) | BIT(2), | ||
7445 | +}; | ||
7446 | + | ||
7447 | +static const struct option_blacklist_info net_intf1_blacklist = { | ||
7448 | + .reserved = BIT(1), | ||
7449 | +}; | ||
7450 | + | ||
7451 | +static const struct option_blacklist_info net_intf3_blacklist = { | ||
7452 | + .reserved = BIT(3), | ||
7453 | +}; | ||
7454 | + | ||
7455 | +static const struct option_blacklist_info net_intf4_blacklist = { | ||
7456 | + .reserved = BIT(4), | ||
7457 | +}; | ||
7458 | + | ||
7459 | +static const struct option_blacklist_info net_intf5_blacklist = { | ||
7460 | + .reserved = BIT(5), | ||
7461 | +}; | ||
7462 | + | ||
7463 | +static const struct option_blacklist_info zte_mf626_blacklist = { | ||
7464 | + .sendsetup = BIT(0) | BIT(1), | ||
7465 | + .reserved = BIT(4), | ||
7466 | }; | ||
7467 | |||
7468 | static const struct usb_device_id option_ids[] = { | ||
7469 | @@ -599,12 +622,15 @@ static const struct usb_device_id option_ids[] = { | ||
7470 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143D, 0xff, 0xff, 0xff) }, | ||
7471 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143E, 0xff, 0xff, 0xff) }, | ||
7472 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143F, 0xff, 0xff, 0xff) }, | ||
7473 | - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4505, 0xff, 0xff, 0xff) }, | ||
7474 | - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff) }, | ||
7475 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4505, 0xff, 0xff, 0xff), | ||
7476 | + .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, | ||
7477 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff), | ||
7478 | + .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, | ||
7479 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_ETS1220, 0xff, 0xff, 0xff) }, | ||
7480 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E14AC, 0xff, 0xff, 0xff) }, | ||
7481 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3806, 0xff, 0xff, 0xff) }, | ||
7482 | - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0xff, 0xff) }, | ||
7483 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0xff, 0xff), | ||
7484 | + .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, | ||
7485 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3770, 0xff, 0x02, 0x31) }, | ||
7486 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3770, 0xff, 0x02, 0x32) }, | ||
7487 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3771, 0xff, 0x02, 0x31) }, | ||
7488 | @@ -705,7 +731,8 @@ static const struct usb_device_id option_ids[] = { | ||
7489 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, | ||
7490 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864G) }, | ||
7491 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ | ||
7492 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff) }, | ||
7493 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff), | ||
7494 | + .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, | ||
7495 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0003, 0xff, 0xff, 0xff) }, | ||
7496 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0004, 0xff, 0xff, 0xff) }, | ||
7497 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0005, 0xff, 0xff, 0xff) }, | ||
7498 | @@ -720,51 +747,62 @@ static const struct usb_device_id option_ids[] = { | ||
7499 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x000f, 0xff, 0xff, 0xff) }, | ||
7500 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0010, 0xff, 0xff, 0xff) }, | ||
7501 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0011, 0xff, 0xff, 0xff) }, | ||
7502 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0012, 0xff, 0xff, 0xff) }, | ||
7503 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0012, 0xff, 0xff, 0xff), | ||
7504 | + .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, | ||
7505 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0013, 0xff, 0xff, 0xff) }, | ||
7506 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0014, 0xff, 0xff, 0xff) }, | ||
7507 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628, 0xff, 0xff, 0xff) }, | ||
7508 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0016, 0xff, 0xff, 0xff) }, | ||
7509 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0017, 0xff, 0xff, 0xff) }, | ||
7510 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0017, 0xff, 0xff, 0xff), | ||
7511 | + .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, | ||
7512 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0018, 0xff, 0xff, 0xff) }, | ||
7513 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0019, 0xff, 0xff, 0xff) }, | ||
7514 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0020, 0xff, 0xff, 0xff) }, | ||
7515 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0021, 0xff, 0xff, 0xff) }, | ||
7516 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0021, 0xff, 0xff, 0xff), | ||
7517 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
7518 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0022, 0xff, 0xff, 0xff) }, | ||
7519 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0023, 0xff, 0xff, 0xff) }, | ||
7520 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0024, 0xff, 0xff, 0xff) }, | ||
7521 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0025, 0xff, 0xff, 0xff) }, | ||
7522 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0025, 0xff, 0xff, 0xff), | ||
7523 | + .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, | ||
7524 | /* { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0026, 0xff, 0xff, 0xff) }, */ | ||
7525 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0028, 0xff, 0xff, 0xff) }, | ||
7526 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0029, 0xff, 0xff, 0xff) }, | ||
7527 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0030, 0xff, 0xff, 0xff) }, | ||
7528 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF626, 0xff, | ||
7529 | - 0xff, 0xff), .driver_info = (kernel_ulong_t)&four_g_w14_blacklist }, | ||
7530 | + 0xff, 0xff), .driver_info = (kernel_ulong_t)&zte_mf626_blacklist }, | ||
7531 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0032, 0xff, 0xff, 0xff) }, | ||
7532 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0033, 0xff, 0xff, 0xff) }, | ||
7533 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0034, 0xff, 0xff, 0xff) }, | ||
7534 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0037, 0xff, 0xff, 0xff) }, | ||
7535 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0037, 0xff, 0xff, 0xff), | ||
7536 | + .driver_info = (kernel_ulong_t)&zte_0037_blacklist }, | ||
7537 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0038, 0xff, 0xff, 0xff) }, | ||
7538 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0039, 0xff, 0xff, 0xff) }, | ||
7539 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0040, 0xff, 0xff, 0xff) }, | ||
7540 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0042, 0xff, 0xff, 0xff) }, | ||
7541 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0042, 0xff, 0xff, 0xff), | ||
7542 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
7543 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0043, 0xff, 0xff, 0xff) }, | ||
7544 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0044, 0xff, 0xff, 0xff) }, | ||
7545 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0048, 0xff, 0xff, 0xff) }, | ||
7546 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0049, 0xff, 0xff, 0xff) }, | ||
7547 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0049, 0xff, 0xff, 0xff), | ||
7548 | + .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, | ||
7549 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0050, 0xff, 0xff, 0xff) }, | ||
7550 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0051, 0xff, 0xff, 0xff) }, | ||
7551 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0052, 0xff, 0xff, 0xff) }, | ||
7552 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0052, 0xff, 0xff, 0xff), | ||
7553 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
7554 | /* { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0053, 0xff, 0xff, 0xff) }, */ | ||
7555 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0054, 0xff, 0xff, 0xff) }, | ||
7556 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0055, 0xff, 0xff, 0xff) }, | ||
7557 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0055, 0xff, 0xff, 0xff), | ||
7558 | + .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, | ||
7559 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0056, 0xff, 0xff, 0xff) }, | ||
7560 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0057, 0xff, 0xff, 0xff) }, | ||
7561 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0058, 0xff, 0xff, 0xff) }, | ||
7562 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0058, 0xff, 0xff, 0xff), | ||
7563 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
7564 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0059, 0xff, 0xff, 0xff) }, | ||
7565 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0061, 0xff, 0xff, 0xff) }, | ||
7566 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0062, 0xff, 0xff, 0xff) }, | ||
7567 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0063, 0xff, 0xff, 0xff) }, | ||
7568 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0063, 0xff, 0xff, 0xff), | ||
7569 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
7570 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0064, 0xff, 0xff, 0xff) }, | ||
7571 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0065, 0xff, 0xff, 0xff) }, | ||
7572 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0066, 0xff, 0xff, 0xff) }, | ||
7573 | @@ -779,11 +817,13 @@ static const struct usb_device_id option_ids[] = { | ||
7574 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0083, 0xff, 0xff, 0xff) }, | ||
7575 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0086, 0xff, 0xff, 0xff) }, | ||
7576 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0087, 0xff, 0xff, 0xff) }, | ||
7577 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0104, 0xff, 0xff, 0xff) }, | ||
7578 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0104, 0xff, 0xff, 0xff), | ||
7579 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
7580 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0105, 0xff, 0xff, 0xff) }, | ||
7581 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0106, 0xff, 0xff, 0xff) }, | ||
7582 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0108, 0xff, 0xff, 0xff) }, | ||
7583 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0113, 0xff, 0xff, 0xff) }, | ||
7584 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0113, 0xff, 0xff, 0xff), | ||
7585 | + .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, | ||
7586 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0117, 0xff, 0xff, 0xff) }, | ||
7587 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0118, 0xff, 0xff, 0xff) }, | ||
7588 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0121, 0xff, 0xff, 0xff) }, | ||
7589 | @@ -1214,10 +1254,35 @@ static void __exit option_exit(void) | ||
7590 | module_init(option_init); | ||
7591 | module_exit(option_exit); | ||
7592 | |||
7593 | +static bool is_blacklisted(const u8 ifnum, enum option_blacklist_reason reason, | ||
7594 | + const struct option_blacklist_info *blacklist) | ||
7595 | +{ | ||
7596 | + unsigned long num; | ||
7597 | + const unsigned long *intf_list; | ||
7598 | + | ||
7599 | + if (blacklist) { | ||
7600 | + if (reason == OPTION_BLACKLIST_SENDSETUP) | ||
7601 | + intf_list = &blacklist->sendsetup; | ||
7602 | + else if (reason == OPTION_BLACKLIST_RESERVED_IF) | ||
7603 | + intf_list = &blacklist->reserved; | ||
7604 | + else { | ||
7605 | + BUG_ON(reason); | ||
7606 | + return false; | ||
7607 | + } | ||
7608 | + | ||
7609 | + for_each_set_bit(num, intf_list, MAX_BL_NUM + 1) { | ||
7610 | + if (num == ifnum) | ||
7611 | + return true; | ||
7612 | + } | ||
7613 | + } | ||
7614 | + return false; | ||
7615 | +} | ||
7616 | + | ||
7617 | static int option_probe(struct usb_serial *serial, | ||
7618 | const struct usb_device_id *id) | ||
7619 | { | ||
7620 | struct usb_wwan_intf_private *data; | ||
7621 | + | ||
7622 | /* D-Link DWM 652 still exposes CD-Rom emulation interface in modem mode */ | ||
7623 | if (serial->dev->descriptor.idVendor == DLINK_VENDOR_ID && | ||
7624 | serial->dev->descriptor.idProduct == DLINK_PRODUCT_DWM_652 && | ||
7625 | @@ -1230,14 +1295,14 @@ static int option_probe(struct usb_serial *serial, | ||
7626 | serial->interface->cur_altsetting->desc.bInterfaceClass != 0xff) | ||
7627 | return -ENODEV; | ||
7628 | |||
7629 | - /* Don't bind network interfaces on Huawei K3765, K4505 & K4605 */ | ||
7630 | - if (serial->dev->descriptor.idVendor == HUAWEI_VENDOR_ID && | ||
7631 | - (serial->dev->descriptor.idProduct == HUAWEI_PRODUCT_K3765 || | ||
7632 | - serial->dev->descriptor.idProduct == HUAWEI_PRODUCT_K4505 || | ||
7633 | - serial->dev->descriptor.idProduct == HUAWEI_PRODUCT_K4605) && | ||
7634 | - (serial->interface->cur_altsetting->desc.bInterfaceNumber == 1 || | ||
7635 | - serial->interface->cur_altsetting->desc.bInterfaceNumber == 2)) | ||
7636 | - return -ENODEV; | ||
7637 | + /* Don't bind reserved interfaces (like network ones) which often have | ||
7638 | + * the same class/subclass/protocol as the serial interfaces. Look at | ||
7639 | + * the Windows driver .INF files for reserved interface numbers. | ||
7640 | + */ | ||
7641 | + if (is_blacklisted( | ||
7642 | + serial->interface->cur_altsetting->desc.bInterfaceNumber, | ||
7643 | + OPTION_BLACKLIST_RESERVED_IF, | ||
7644 | + (const struct option_blacklist_info *) id->driver_info)) | ||
7645 | |||
7646 | /* Don't bind network interface on Samsung GT-B3730, it is handled by a separate module */ | ||
7647 | if (serial->dev->descriptor.idVendor == SAMSUNG_VENDOR_ID && | ||
7648 | @@ -1246,7 +1311,6 @@ static int option_probe(struct usb_serial *serial, | ||
7649 | return -ENODEV; | ||
7650 | |||
7651 | data = serial->private = kzalloc(sizeof(struct usb_wwan_intf_private), GFP_KERNEL); | ||
7652 | - | ||
7653 | if (!data) | ||
7654 | return -ENOMEM; | ||
7655 | data->send_setup = option_send_setup; | ||
7656 | @@ -1255,23 +1319,6 @@ static int option_probe(struct usb_serial *serial, | ||
7657 | return 0; | ||
7658 | } | ||
7659 | |||
7660 | -static enum option_blacklist_reason is_blacklisted(const u8 ifnum, | ||
7661 | - const struct option_blacklist_info *blacklist) | ||
7662 | -{ | ||
7663 | - const u8 *info; | ||
7664 | - int i; | ||
7665 | - | ||
7666 | - if (blacklist) { | ||
7667 | - info = blacklist->ifaceinfo; | ||
7668 | - | ||
7669 | - for (i = 0; i < blacklist->infolen; i++) { | ||
7670 | - if (info[i] == ifnum) | ||
7671 | - return blacklist->reason; | ||
7672 | - } | ||
7673 | - } | ||
7674 | - return OPTION_BLACKLIST_NONE; | ||
7675 | -} | ||
7676 | - | ||
7677 | static void option_instat_callback(struct urb *urb) | ||
7678 | { | ||
7679 | int err; | ||
7680 | @@ -1343,9 +1390,8 @@ static int option_send_setup(struct usb_serial_port *port) | ||
7681 | int val = 0; | ||
7682 | dbg("%s", __func__); | ||
7683 | |||
7684 | - if (is_blacklisted(ifNum, | ||
7685 | - (struct option_blacklist_info *) intfdata->private) | ||
7686 | - == OPTION_BLACKLIST_SENDSETUP) { | ||
7687 | + if (is_blacklisted(ifNum, OPTION_BLACKLIST_SENDSETUP, | ||
7688 | + (struct option_blacklist_info *) intfdata->private)) { | ||
7689 | dbg("No send_setup on blacklisted interface #%d\n", ifNum); | ||
7690 | return -EIO; | ||
7691 | } | ||
7692 | diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c | ||
7693 | index 1d33260..614fabc 100644 | ||
7694 | --- a/drivers/usb/serial/pl2303.c | ||
7695 | +++ b/drivers/usb/serial/pl2303.c | ||
7696 | @@ -92,6 +92,7 @@ static const struct usb_device_id id_table[] = { | ||
7697 | { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) }, | ||
7698 | { USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) }, | ||
7699 | { USB_DEVICE(WINCHIPHEAD_VENDOR_ID, WINCHIPHEAD_USBSER_PRODUCT_ID) }, | ||
7700 | + { USB_DEVICE(SMART_VENDOR_ID, SMART_PRODUCT_ID) }, | ||
7701 | { } /* Terminating entry */ | ||
7702 | }; | ||
7703 | |||
7704 | diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h | ||
7705 | index ca0d237..3d10d7f 100644 | ||
7706 | --- a/drivers/usb/serial/pl2303.h | ||
7707 | +++ b/drivers/usb/serial/pl2303.h | ||
7708 | @@ -148,3 +148,8 @@ | ||
7709 | /* WinChipHead USB->RS 232 adapter */ | ||
7710 | #define WINCHIPHEAD_VENDOR_ID 0x4348 | ||
7711 | #define WINCHIPHEAD_USBSER_PRODUCT_ID 0x5523 | ||
7712 | + | ||
7713 | +/* SMART USB Serial Adapter */ | ||
7714 | +#define SMART_VENDOR_ID 0x0b8c | ||
7715 | +#define SMART_PRODUCT_ID 0x2303 | ||
7716 | + | ||
7717 | diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c | ||
7718 | index aeccc7f..b9bb247 100644 | ||
7719 | --- a/drivers/usb/serial/qcserial.c | ||
7720 | +++ b/drivers/usb/serial/qcserial.c | ||
7721 | @@ -28,6 +28,7 @@ static const struct usb_device_id id_table[] = { | ||
7722 | {USB_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ | ||
7723 | {USB_DEVICE(0x03f0, 0x1f1d)}, /* HP un2400 Gobi Modem Device */ | ||
7724 | {USB_DEVICE(0x03f0, 0x201d)}, /* HP un2400 Gobi QDL Device */ | ||
7725 | + {USB_DEVICE(0x03f0, 0x371d)}, /* HP un2430 Mobile Broadband Module */ | ||
7726 | {USB_DEVICE(0x04da, 0x250d)}, /* Panasonic Gobi Modem device */ | ||
7727 | {USB_DEVICE(0x04da, 0x250c)}, /* Panasonic Gobi QDL device */ | ||
7728 | {USB_DEVICE(0x413c, 0x8172)}, /* Dell Gobi Modem device */ | ||
7729 | @@ -84,6 +85,7 @@ static const struct usb_device_id id_table[] = { | ||
7730 | {USB_DEVICE(0x16d8, 0x8002)}, /* CMDTech Gobi 2000 Modem device (VU922) */ | ||
7731 | {USB_DEVICE(0x05c6, 0x9204)}, /* Gobi 2000 QDL device */ | ||
7732 | {USB_DEVICE(0x05c6, 0x9205)}, /* Gobi 2000 Modem device */ | ||
7733 | + {USB_DEVICE(0x1199, 0x9013)}, /* Sierra Wireless Gobi 3000 Modem device (MC8355) */ | ||
7734 | { } /* Terminating entry */ | ||
7735 | }; | ||
7736 | MODULE_DEVICE_TABLE(usb, id_table); | ||
7737 | diff --git a/drivers/usb/storage/Kconfig b/drivers/usb/storage/Kconfig | ||
7738 | index bedc4b9..fe2d803 100644 | ||
7739 | --- a/drivers/usb/storage/Kconfig | ||
7740 | +++ b/drivers/usb/storage/Kconfig | ||
7741 | @@ -42,7 +42,7 @@ config USB_STORAGE_REALTEK | ||
7742 | |||
7743 | config REALTEK_AUTOPM | ||
7744 | bool "Realtek Card Reader autosuspend support" | ||
7745 | - depends on USB_STORAGE_REALTEK && CONFIG_PM_RUNTIME | ||
7746 | + depends on USB_STORAGE_REALTEK && PM_RUNTIME | ||
7747 | default y | ||
7748 | |||
7749 | config USB_STORAGE_DATAFAB | ||
7750 | diff --git a/drivers/usb/storage/realtek_cr.c b/drivers/usb/storage/realtek_cr.c | ||
7751 | index 34adc4b..232167a 100644 | ||
7752 | --- a/drivers/usb/storage/realtek_cr.c | ||
7753 | +++ b/drivers/usb/storage/realtek_cr.c | ||
7754 | @@ -320,6 +320,11 @@ static int rts51x_read_mem(struct us_data *us, u16 addr, u8 *data, u16 len) | ||
7755 | { | ||
7756 | int retval; | ||
7757 | u8 cmnd[12] = { 0 }; | ||
7758 | + u8 *buf; | ||
7759 | + | ||
7760 | + buf = kmalloc(len, GFP_NOIO); | ||
7761 | + if (buf == NULL) | ||
7762 | + return USB_STOR_TRANSPORT_ERROR; | ||
7763 | |||
7764 | US_DEBUGP("%s, addr = 0x%x, len = %d\n", __func__, addr, len); | ||
7765 | |||
7766 | @@ -331,10 +336,14 @@ static int rts51x_read_mem(struct us_data *us, u16 addr, u8 *data, u16 len) | ||
7767 | cmnd[5] = (u8) len; | ||
7768 | |||
7769 | retval = rts51x_bulk_transport(us, 0, cmnd, 12, | ||
7770 | - data, len, DMA_FROM_DEVICE, NULL); | ||
7771 | - if (retval != USB_STOR_TRANSPORT_GOOD) | ||
7772 | + buf, len, DMA_FROM_DEVICE, NULL); | ||
7773 | + if (retval != USB_STOR_TRANSPORT_GOOD) { | ||
7774 | + kfree(buf); | ||
7775 | return -EIO; | ||
7776 | + } | ||
7777 | |||
7778 | + memcpy(data, buf, len); | ||
7779 | + kfree(buf); | ||
7780 | return 0; | ||
7781 | } | ||
7782 | |||
7783 | @@ -342,6 +351,12 @@ static int rts51x_write_mem(struct us_data *us, u16 addr, u8 *data, u16 len) | ||
7784 | { | ||
7785 | int retval; | ||
7786 | u8 cmnd[12] = { 0 }; | ||
7787 | + u8 *buf; | ||
7788 | + | ||
7789 | + buf = kmalloc(len, GFP_NOIO); | ||
7790 | + if (buf == NULL) | ||
7791 | + return USB_STOR_TRANSPORT_ERROR; | ||
7792 | + memcpy(buf, data, len); | ||
7793 | |||
7794 | US_DEBUGP("%s, addr = 0x%x, len = %d\n", __func__, addr, len); | ||
7795 | |||
7796 | @@ -353,7 +368,8 @@ static int rts51x_write_mem(struct us_data *us, u16 addr, u8 *data, u16 len) | ||
7797 | cmnd[5] = (u8) len; | ||
7798 | |||
7799 | retval = rts51x_bulk_transport(us, 0, cmnd, 12, | ||
7800 | - data, len, DMA_TO_DEVICE, NULL); | ||
7801 | + buf, len, DMA_TO_DEVICE, NULL); | ||
7802 | + kfree(buf); | ||
7803 | if (retval != USB_STOR_TRANSPORT_GOOD) | ||
7804 | return -EIO; | ||
7805 | |||
7806 | @@ -365,6 +381,11 @@ static int rts51x_read_status(struct us_data *us, | ||
7807 | { | ||
7808 | int retval; | ||
7809 | u8 cmnd[12] = { 0 }; | ||
7810 | + u8 *buf; | ||
7811 | + | ||
7812 | + buf = kmalloc(len, GFP_NOIO); | ||
7813 | + if (buf == NULL) | ||
7814 | + return USB_STOR_TRANSPORT_ERROR; | ||
7815 | |||
7816 | US_DEBUGP("%s, lun = %d\n", __func__, lun); | ||
7817 | |||
7818 | @@ -372,10 +393,14 @@ static int rts51x_read_status(struct us_data *us, | ||
7819 | cmnd[1] = 0x09; | ||
7820 | |||
7821 | retval = rts51x_bulk_transport(us, lun, cmnd, 12, | ||
7822 | - status, len, DMA_FROM_DEVICE, actlen); | ||
7823 | - if (retval != USB_STOR_TRANSPORT_GOOD) | ||
7824 | + buf, len, DMA_FROM_DEVICE, actlen); | ||
7825 | + if (retval != USB_STOR_TRANSPORT_GOOD) { | ||
7826 | + kfree(buf); | ||
7827 | return -EIO; | ||
7828 | + } | ||
7829 | |||
7830 | + memcpy(status, buf, len); | ||
7831 | + kfree(buf); | ||
7832 | return 0; | ||
7833 | } | ||
7834 | |||
7835 | diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c | ||
7836 | index e8ae21b..ff32390 100644 | ||
7837 | --- a/drivers/usb/storage/transport.c | ||
7838 | +++ b/drivers/usb/storage/transport.c | ||
7839 | @@ -691,6 +691,9 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) | ||
7840 | int temp_result; | ||
7841 | struct scsi_eh_save ses; | ||
7842 | int sense_size = US_SENSE_SIZE; | ||
7843 | + struct scsi_sense_hdr sshdr; | ||
7844 | + const u8 *scdd; | ||
7845 | + u8 fm_ili; | ||
7846 | |||
7847 | /* device supports and needs bigger sense buffer */ | ||
7848 | if (us->fflags & US_FL_SANE_SENSE) | ||
7849 | @@ -774,32 +777,30 @@ Retry_Sense: | ||
7850 | srb->sense_buffer[7] = (US_SENSE_SIZE - 8); | ||
7851 | } | ||
7852 | |||
7853 | + scsi_normalize_sense(srb->sense_buffer, SCSI_SENSE_BUFFERSIZE, | ||
7854 | + &sshdr); | ||
7855 | + | ||
7856 | US_DEBUGP("-- Result from auto-sense is %d\n", temp_result); | ||
7857 | US_DEBUGP("-- code: 0x%x, key: 0x%x, ASC: 0x%x, ASCQ: 0x%x\n", | ||
7858 | - srb->sense_buffer[0], | ||
7859 | - srb->sense_buffer[2] & 0xf, | ||
7860 | - srb->sense_buffer[12], | ||
7861 | - srb->sense_buffer[13]); | ||
7862 | + sshdr.response_code, sshdr.sense_key, | ||
7863 | + sshdr.asc, sshdr.ascq); | ||
7864 | #ifdef CONFIG_USB_STORAGE_DEBUG | ||
7865 | - usb_stor_show_sense( | ||
7866 | - srb->sense_buffer[2] & 0xf, | ||
7867 | - srb->sense_buffer[12], | ||
7868 | - srb->sense_buffer[13]); | ||
7869 | + usb_stor_show_sense(sshdr.sense_key, sshdr.asc, sshdr.ascq); | ||
7870 | #endif | ||
7871 | |||
7872 | /* set the result so the higher layers expect this data */ | ||
7873 | srb->result = SAM_STAT_CHECK_CONDITION; | ||
7874 | |||
7875 | + scdd = scsi_sense_desc_find(srb->sense_buffer, | ||
7876 | + SCSI_SENSE_BUFFERSIZE, 4); | ||
7877 | + fm_ili = (scdd ? scdd[3] : srb->sense_buffer[2]) & 0xA0; | ||
7878 | + | ||
7879 | /* We often get empty sense data. This could indicate that | ||
7880 | * everything worked or that there was an unspecified | ||
7881 | * problem. We have to decide which. | ||
7882 | */ | ||
7883 | - if ( /* Filemark 0, ignore EOM, ILI 0, no sense */ | ||
7884 | - (srb->sense_buffer[2] & 0xaf) == 0 && | ||
7885 | - /* No ASC or ASCQ */ | ||
7886 | - srb->sense_buffer[12] == 0 && | ||
7887 | - srb->sense_buffer[13] == 0) { | ||
7888 | - | ||
7889 | + if (sshdr.sense_key == 0 && sshdr.asc == 0 && sshdr.ascq == 0 && | ||
7890 | + fm_ili == 0) { | ||
7891 | /* If things are really okay, then let's show that. | ||
7892 | * Zero out the sense buffer so the higher layers | ||
7893 | * won't realize we did an unsolicited auto-sense. | ||
7894 | @@ -814,7 +815,10 @@ Retry_Sense: | ||
7895 | */ | ||
7896 | } else { | ||
7897 | srb->result = DID_ERROR << 16; | ||
7898 | - srb->sense_buffer[2] = HARDWARE_ERROR; | ||
7899 | + if ((sshdr.response_code & 0x72) == 0x72) | ||
7900 | + srb->sense_buffer[1] = HARDWARE_ERROR; | ||
7901 | + else | ||
7902 | + srb->sense_buffer[2] = HARDWARE_ERROR; | ||
7903 | } | ||
7904 | } | ||
7905 | } | ||
7906 | diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c | ||
7907 | index 0ca0958..c325e69 100644 | ||
7908 | --- a/drivers/usb/storage/usb.c | ||
7909 | +++ b/drivers/usb/storage/usb.c | ||
7910 | @@ -831,12 +831,22 @@ static int usb_stor_scan_thread(void * __us) | ||
7911 | |||
7912 | dev_dbg(dev, "device found\n"); | ||
7913 | |||
7914 | - set_freezable(); | ||
7915 | - /* Wait for the timeout to expire or for a disconnect */ | ||
7916 | + set_freezable_with_signal(); | ||
7917 | + /* | ||
7918 | + * Wait for the timeout to expire or for a disconnect | ||
7919 | + * | ||
7920 | + * We can't freeze in this thread or we risk causing khubd to | ||
7921 | + * fail to freeze, but we can't be non-freezable either. Nor can | ||
7922 | + * khubd freeze while waiting for scanning to complete as it may | ||
7923 | + * hold the device lock, causing a hang when suspending devices. | ||
7924 | + * So we request a fake signal when freezing and use | ||
7925 | + * interruptible sleep to kick us out of our wait early when | ||
7926 | + * freezing happens. | ||
7927 | + */ | ||
7928 | if (delay_use > 0) { | ||
7929 | dev_dbg(dev, "waiting for device to settle " | ||
7930 | "before scanning\n"); | ||
7931 | - wait_event_freezable_timeout(us->delay_wait, | ||
7932 | + wait_event_interruptible_timeout(us->delay_wait, | ||
7933 | test_bit(US_FLIDX_DONT_SCAN, &us->dflags), | ||
7934 | delay_use * HZ); | ||
7935 | } | ||
7936 | diff --git a/drivers/video/carminefb.c b/drivers/video/carminefb.c | ||
7937 | index caaa27d..cb09aa1f 100644 | ||
7938 | --- a/drivers/video/carminefb.c | ||
7939 | +++ b/drivers/video/carminefb.c | ||
7940 | @@ -32,11 +32,11 @@ | ||
7941 | #define CARMINEFB_DEFAULT_VIDEO_MODE 1 | ||
7942 | |||
7943 | static unsigned int fb_mode = CARMINEFB_DEFAULT_VIDEO_MODE; | ||
7944 | -module_param(fb_mode, uint, 444); | ||
7945 | +module_param(fb_mode, uint, 0444); | ||
7946 | MODULE_PARM_DESC(fb_mode, "Initial video mode as integer."); | ||
7947 | |||
7948 | static char *fb_mode_str; | ||
7949 | -module_param(fb_mode_str, charp, 444); | ||
7950 | +module_param(fb_mode_str, charp, 0444); | ||
7951 | MODULE_PARM_DESC(fb_mode_str, "Initial video mode in characters."); | ||
7952 | |||
7953 | /* | ||
7954 | @@ -46,7 +46,7 @@ MODULE_PARM_DESC(fb_mode_str, "Initial video mode in characters."); | ||
7955 | * 0b010 Display 1 | ||
7956 | */ | ||
7957 | static int fb_displays = CARMINE_USE_DISPLAY0 | CARMINE_USE_DISPLAY1; | ||
7958 | -module_param(fb_displays, int, 444); | ||
7959 | +module_param(fb_displays, int, 0444); | ||
7960 | MODULE_PARM_DESC(fb_displays, "Bit mode, which displays are used"); | ||
7961 | |||
7962 | struct carmine_hw { | ||
7963 | diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c | ||
7964 | index 5aac00e..ad93629 100644 | ||
7965 | --- a/drivers/video/fbmem.c | ||
7966 | +++ b/drivers/video/fbmem.c | ||
7967 | @@ -1738,8 +1738,6 @@ void fb_set_suspend(struct fb_info *info, int state) | ||
7968 | { | ||
7969 | struct fb_event event; | ||
7970 | |||
7971 | - if (!lock_fb_info(info)) | ||
7972 | - return; | ||
7973 | event.info = info; | ||
7974 | if (state) { | ||
7975 | fb_notifier_call_chain(FB_EVENT_SUSPEND, &event); | ||
7976 | @@ -1748,7 +1746,6 @@ void fb_set_suspend(struct fb_info *info, int state) | ||
7977 | info->state = FBINFO_STATE_RUNNING; | ||
7978 | fb_notifier_call_chain(FB_EVENT_RESUME, &event); | ||
7979 | } | ||
7980 | - unlock_fb_info(info); | ||
7981 | } | ||
7982 | |||
7983 | /** | ||
7984 | diff --git a/drivers/video/fbsysfs.c b/drivers/video/fbsysfs.c | ||
7985 | index 04251ce..67afa9c 100644 | ||
7986 | --- a/drivers/video/fbsysfs.c | ||
7987 | +++ b/drivers/video/fbsysfs.c | ||
7988 | @@ -399,9 +399,12 @@ static ssize_t store_fbstate(struct device *device, | ||
7989 | |||
7990 | state = simple_strtoul(buf, &last, 0); | ||
7991 | |||
7992 | + if (!lock_fb_info(fb_info)) | ||
7993 | + return -ENODEV; | ||
7994 | console_lock(); | ||
7995 | fb_set_suspend(fb_info, (int)state); | ||
7996 | console_unlock(); | ||
7997 | + unlock_fb_info(fb_info); | ||
7998 | |||
7999 | return count; | ||
8000 | } | ||
8001 | diff --git a/drivers/video/sh_mobile_hdmi.c b/drivers/video/sh_mobile_hdmi.c | ||
8002 | index 7d54e2c..647ba98 100644 | ||
8003 | --- a/drivers/video/sh_mobile_hdmi.c | ||
8004 | +++ b/drivers/video/sh_mobile_hdmi.c | ||
8005 | @@ -1111,6 +1111,7 @@ static long sh_hdmi_clk_configure(struct sh_hdmi *hdmi, unsigned long hdmi_rate, | ||
8006 | static void sh_hdmi_edid_work_fn(struct work_struct *work) | ||
8007 | { | ||
8008 | struct sh_hdmi *hdmi = container_of(work, struct sh_hdmi, edid_work.work); | ||
8009 | + struct fb_info *info; | ||
8010 | struct sh_mobile_hdmi_info *pdata = hdmi->dev->platform_data; | ||
8011 | struct sh_mobile_lcdc_chan *ch; | ||
8012 | int ret; | ||
8013 | @@ -1123,8 +1124,9 @@ static void sh_hdmi_edid_work_fn(struct work_struct *work) | ||
8014 | |||
8015 | mutex_lock(&hdmi->mutex); | ||
8016 | |||
8017 | + info = hdmi->info; | ||
8018 | + | ||
8019 | if (hdmi->hp_state == HDMI_HOTPLUG_CONNECTED) { | ||
8020 | - struct fb_info *info = hdmi->info; | ||
8021 | unsigned long parent_rate = 0, hdmi_rate; | ||
8022 | |||
8023 | ret = sh_hdmi_read_edid(hdmi, &hdmi_rate, &parent_rate); | ||
8024 | @@ -1148,42 +1150,45 @@ static void sh_hdmi_edid_work_fn(struct work_struct *work) | ||
8025 | |||
8026 | ch = info->par; | ||
8027 | |||
8028 | - console_lock(); | ||
8029 | + if (lock_fb_info(info)) { | ||
8030 | + console_lock(); | ||
8031 | |||
8032 | - /* HDMI plug in */ | ||
8033 | - if (!sh_hdmi_must_reconfigure(hdmi) && | ||
8034 | - info->state == FBINFO_STATE_RUNNING) { | ||
8035 | - /* | ||
8036 | - * First activation with the default monitor - just turn | ||
8037 | - * on, if we run a resume here, the logo disappears | ||
8038 | - */ | ||
8039 | - if (lock_fb_info(info)) { | ||
8040 | + /* HDMI plug in */ | ||
8041 | + if (!sh_hdmi_must_reconfigure(hdmi) && | ||
8042 | + info->state == FBINFO_STATE_RUNNING) { | ||
8043 | + /* | ||
8044 | + * First activation with the default monitor - just turn | ||
8045 | + * on, if we run a resume here, the logo disappears | ||
8046 | + */ | ||
8047 | info->var.width = hdmi->var.width; | ||
8048 | info->var.height = hdmi->var.height; | ||
8049 | sh_hdmi_display_on(hdmi, info); | ||
8050 | - unlock_fb_info(info); | ||
8051 | + } else { | ||
8052 | + /* New monitor or have to wake up */ | ||
8053 | + fb_set_suspend(info, 0); | ||
8054 | } | ||
8055 | - } else { | ||
8056 | - /* New monitor or have to wake up */ | ||
8057 | - fb_set_suspend(info, 0); | ||
8058 | - } | ||
8059 | |||
8060 | - console_unlock(); | ||
8061 | + console_unlock(); | ||
8062 | + unlock_fb_info(info); | ||
8063 | + } | ||
8064 | } else { | ||
8065 | ret = 0; | ||
8066 | - if (!hdmi->info) | ||
8067 | + if (!info) | ||
8068 | goto out; | ||
8069 | |||
8070 | hdmi->monspec.modedb_len = 0; | ||
8071 | fb_destroy_modedb(hdmi->monspec.modedb); | ||
8072 | hdmi->monspec.modedb = NULL; | ||
8073 | |||
8074 | - console_lock(); | ||
8075 | + if (lock_fb_info(info)) { | ||
8076 | + console_lock(); | ||
8077 | |||
8078 | - /* HDMI disconnect */ | ||
8079 | - fb_set_suspend(hdmi->info, 1); | ||
8080 | + /* HDMI disconnect */ | ||
8081 | + fb_set_suspend(info, 1); | ||
8082 | |||
8083 | - console_unlock(); | ||
8084 | + console_unlock(); | ||
8085 | + unlock_fb_info(info); | ||
8086 | + } | ||
8087 | } | ||
8088 | |||
8089 | out: | ||
8090 | diff --git a/drivers/video/via/via_modesetting.h b/drivers/video/via/via_modesetting.h | ||
8091 | index ae35cfd..0138845 100644 | ||
8092 | --- a/drivers/video/via/via_modesetting.h | ||
8093 | +++ b/drivers/video/via/via_modesetting.h | ||
8094 | @@ -28,6 +28,11 @@ | ||
8095 | |||
8096 | #include <linux/types.h> | ||
8097 | |||
8098 | + | ||
8099 | +#define VIA_PITCH_SIZE (1<<3) | ||
8100 | +#define VIA_PITCH_MAX 0x3FF8 | ||
8101 | + | ||
8102 | + | ||
8103 | void via_set_primary_address(u32 addr); | ||
8104 | void via_set_secondary_address(u32 addr); | ||
8105 | void via_set_primary_pitch(u32 pitch); | ||
8106 | diff --git a/drivers/video/via/viafbdev.c b/drivers/video/via/viafbdev.c | ||
8107 | index 53aa443..09fa57c 100644 | ||
8108 | --- a/drivers/video/via/viafbdev.c | ||
8109 | +++ b/drivers/video/via/viafbdev.c | ||
8110 | @@ -151,7 +151,8 @@ static void viafb_update_fix(struct fb_info *info) | ||
8111 | |||
8112 | info->fix.visual = | ||
8113 | bpp == 8 ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR; | ||
8114 | - info->fix.line_length = (info->var.xres_virtual * bpp / 8 + 7) & ~7; | ||
8115 | + info->fix.line_length = ALIGN(info->var.xres_virtual * bpp / 8, | ||
8116 | + VIA_PITCH_SIZE); | ||
8117 | } | ||
8118 | |||
8119 | static void viafb_setup_fixinfo(struct fb_fix_screeninfo *fix, | ||
8120 | @@ -238,8 +239,12 @@ static int viafb_check_var(struct fb_var_screeninfo *var, | ||
8121 | depth = 24; | ||
8122 | |||
8123 | viafb_fill_var_color_info(var, depth); | ||
8124 | - line = (var->xres_virtual * var->bits_per_pixel / 8 + 7) & ~7; | ||
8125 | - if (line * var->yres_virtual > ppar->memsize) | ||
8126 | + if (var->xres_virtual < var->xres) | ||
8127 | + var->xres_virtual = var->xres; | ||
8128 | + | ||
8129 | + line = ALIGN(var->xres_virtual * var->bits_per_pixel / 8, | ||
8130 | + VIA_PITCH_SIZE); | ||
8131 | + if (line > VIA_PITCH_MAX || line * var->yres_virtual > ppar->memsize) | ||
8132 | return -EINVAL; | ||
8133 | |||
8134 | /* Based on var passed in to calculate the refresh, | ||
8135 | @@ -348,8 +353,9 @@ static int viafb_pan_display(struct fb_var_screeninfo *var, | ||
8136 | struct fb_info *info) | ||
8137 | { | ||
8138 | struct viafb_par *viapar = info->par; | ||
8139 | - u32 vram_addr = (var->yoffset * var->xres_virtual + var->xoffset) | ||
8140 | - * (var->bits_per_pixel / 8) + viapar->vram_addr; | ||
8141 | + u32 vram_addr = viapar->vram_addr | ||
8142 | + + var->yoffset * info->fix.line_length | ||
8143 | + + var->xoffset * info->var.bits_per_pixel / 8; | ||
8144 | |||
8145 | DEBUG_MSG(KERN_DEBUG "viafb_pan_display, address = %d\n", vram_addr); | ||
8146 | if (!viafb_dual_fb) { | ||
8147 | diff --git a/drivers/w1/slaves/w1_ds2780.c b/drivers/w1/slaves/w1_ds2780.c | ||
8148 | index 274c8f3..505b17d 100644 | ||
8149 | --- a/drivers/w1/slaves/w1_ds2780.c | ||
8150 | +++ b/drivers/w1/slaves/w1_ds2780.c | ||
8151 | @@ -26,20 +26,14 @@ | ||
8152 | #include "../w1_family.h" | ||
8153 | #include "w1_ds2780.h" | ||
8154 | |||
8155 | -int w1_ds2780_io(struct device *dev, char *buf, int addr, size_t count, | ||
8156 | - int io) | ||
8157 | +static int w1_ds2780_do_io(struct device *dev, char *buf, int addr, | ||
8158 | + size_t count, int io) | ||
8159 | { | ||
8160 | struct w1_slave *sl = container_of(dev, struct w1_slave, dev); | ||
8161 | |||
8162 | - if (!dev) | ||
8163 | - return -ENODEV; | ||
8164 | + if (addr > DS2780_DATA_SIZE || addr < 0) | ||
8165 | + return 0; | ||
8166 | |||
8167 | - mutex_lock(&sl->master->mutex); | ||
8168 | - | ||
8169 | - if (addr > DS2780_DATA_SIZE || addr < 0) { | ||
8170 | - count = 0; | ||
8171 | - goto out; | ||
8172 | - } | ||
8173 | count = min_t(int, count, DS2780_DATA_SIZE - addr); | ||
8174 | |||
8175 | if (w1_reset_select_slave(sl) == 0) { | ||
8176 | @@ -47,7 +41,6 @@ int w1_ds2780_io(struct device *dev, char *buf, int addr, size_t count, | ||
8177 | w1_write_8(sl->master, W1_DS2780_WRITE_DATA); | ||
8178 | w1_write_8(sl->master, addr); | ||
8179 | w1_write_block(sl->master, buf, count); | ||
8180 | - /* XXX w1_write_block returns void, not n_written */ | ||
8181 | } else { | ||
8182 | w1_write_8(sl->master, W1_DS2780_READ_DATA); | ||
8183 | w1_write_8(sl->master, addr); | ||
8184 | @@ -55,13 +48,42 @@ int w1_ds2780_io(struct device *dev, char *buf, int addr, size_t count, | ||
8185 | } | ||
8186 | } | ||
8187 | |||
8188 | -out: | ||
8189 | + return count; | ||
8190 | +} | ||
8191 | + | ||
8192 | +int w1_ds2780_io(struct device *dev, char *buf, int addr, size_t count, | ||
8193 | + int io) | ||
8194 | +{ | ||
8195 | + struct w1_slave *sl = container_of(dev, struct w1_slave, dev); | ||
8196 | + int ret; | ||
8197 | + | ||
8198 | + if (!dev) | ||
8199 | + return -ENODEV; | ||
8200 | + | ||
8201 | + mutex_lock(&sl->master->mutex); | ||
8202 | + | ||
8203 | + ret = w1_ds2780_do_io(dev, buf, addr, count, io); | ||
8204 | + | ||
8205 | mutex_unlock(&sl->master->mutex); | ||
8206 | |||
8207 | - return count; | ||
8208 | + return ret; | ||
8209 | } | ||
8210 | EXPORT_SYMBOL(w1_ds2780_io); | ||
8211 | |||
8212 | +int w1_ds2780_io_nolock(struct device *dev, char *buf, int addr, size_t count, | ||
8213 | + int io) | ||
8214 | +{ | ||
8215 | + int ret; | ||
8216 | + | ||
8217 | + if (!dev) | ||
8218 | + return -ENODEV; | ||
8219 | + | ||
8220 | + ret = w1_ds2780_do_io(dev, buf, addr, count, io); | ||
8221 | + | ||
8222 | + return ret; | ||
8223 | +} | ||
8224 | +EXPORT_SYMBOL(w1_ds2780_io_nolock); | ||
8225 | + | ||
8226 | int w1_ds2780_eeprom_cmd(struct device *dev, int addr, int cmd) | ||
8227 | { | ||
8228 | struct w1_slave *sl = container_of(dev, struct w1_slave, dev); | ||
8229 | diff --git a/drivers/w1/slaves/w1_ds2780.h b/drivers/w1/slaves/w1_ds2780.h | ||
8230 | index a1fba79..7373793 100644 | ||
8231 | --- a/drivers/w1/slaves/w1_ds2780.h | ||
8232 | +++ b/drivers/w1/slaves/w1_ds2780.h | ||
8233 | @@ -124,6 +124,8 @@ | ||
8234 | |||
8235 | extern int w1_ds2780_io(struct device *dev, char *buf, int addr, size_t count, | ||
8236 | int io); | ||
8237 | +extern int w1_ds2780_io_nolock(struct device *dev, char *buf, int addr, | ||
8238 | + size_t count, int io); | ||
8239 | extern int w1_ds2780_eeprom_cmd(struct device *dev, int addr, int cmd); | ||
8240 | |||
8241 | #endif /* !_W1_DS2780_H */ | ||
8242 | diff --git a/drivers/xen/events.c b/drivers/xen/events.c | ||
8243 | index 7523719..44490de 100644 | ||
8244 | --- a/drivers/xen/events.c | ||
8245 | +++ b/drivers/xen/events.c | ||
8246 | @@ -1021,7 +1021,7 @@ int bind_ipi_to_irqhandler(enum ipi_vector ipi, | ||
8247 | if (irq < 0) | ||
8248 | return irq; | ||
8249 | |||
8250 | - irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME; | ||
8251 | + irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME | IRQF_EARLY_RESUME; | ||
8252 | retval = request_irq(irq, handler, irqflags, devname, dev_id); | ||
8253 | if (retval != 0) { | ||
8254 | unbind_from_irq(irq); | ||
8255 | diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c | ||
8256 | index 6e8c15a..84f317e 100644 | ||
8257 | --- a/drivers/xen/swiotlb-xen.c | ||
8258 | +++ b/drivers/xen/swiotlb-xen.c | ||
8259 | @@ -278,9 +278,10 @@ dma_addr_t xen_swiotlb_map_page(struct device *dev, struct page *page, | ||
8260 | /* | ||
8261 | * Ensure that the address returned is DMA'ble | ||
8262 | */ | ||
8263 | - if (!dma_capable(dev, dev_addr, size)) | ||
8264 | - panic("map_single: bounce buffer is not DMA'ble"); | ||
8265 | - | ||
8266 | + if (!dma_capable(dev, dev_addr, size)) { | ||
8267 | + swiotlb_tbl_unmap_single(dev, map, size, dir); | ||
8268 | + dev_addr = 0; | ||
8269 | + } | ||
8270 | return dev_addr; | ||
8271 | } | ||
8272 | EXPORT_SYMBOL_GPL(xen_swiotlb_map_page); | ||
8273 | diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c | ||
8274 | index dd0fdfc..21ac5ee 100644 | ||
8275 | --- a/fs/binfmt_elf.c | ||
8276 | +++ b/fs/binfmt_elf.c | ||
8277 | @@ -795,7 +795,16 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) | ||
8278 | * might try to exec. This is because the brk will | ||
8279 | * follow the loader, and is not movable. */ | ||
8280 | #if defined(CONFIG_X86) || defined(CONFIG_ARM) | ||
8281 | - load_bias = 0; | ||
8282 | + /* Memory randomization might have been switched off | ||
8283 | + * in runtime via sysctl. | ||
8284 | + * If that is the case, retain the original non-zero | ||
8285 | + * load_bias value in order to establish proper | ||
8286 | + * non-randomized mappings. | ||
8287 | + */ | ||
8288 | + if (current->flags & PF_RANDOMIZE) | ||
8289 | + load_bias = 0; | ||
8290 | + else | ||
8291 | + load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr); | ||
8292 | #else | ||
8293 | load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr); | ||
8294 | #endif | ||
8295 | diff --git a/fs/block_dev.c b/fs/block_dev.c | ||
8296 | index 95f786e..1c44b8d 100644 | ||
8297 | --- a/fs/block_dev.c | ||
8298 | +++ b/fs/block_dev.c | ||
8299 | @@ -1085,6 +1085,7 @@ static int __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part); | ||
8300 | static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) | ||
8301 | { | ||
8302 | struct gendisk *disk; | ||
8303 | + struct module *owner; | ||
8304 | int ret; | ||
8305 | int partno; | ||
8306 | int perm = 0; | ||
8307 | @@ -1110,6 +1111,7 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) | ||
8308 | disk = get_gendisk(bdev->bd_dev, &partno); | ||
8309 | if (!disk) | ||
8310 | goto out; | ||
8311 | + owner = disk->fops->owner; | ||
8312 | |||
8313 | disk_block_events(disk); | ||
8314 | mutex_lock_nested(&bdev->bd_mutex, for_part); | ||
8315 | @@ -1137,8 +1139,8 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) | ||
8316 | bdev->bd_disk = NULL; | ||
8317 | mutex_unlock(&bdev->bd_mutex); | ||
8318 | disk_unblock_events(disk); | ||
8319 | - module_put(disk->fops->owner); | ||
8320 | put_disk(disk); | ||
8321 | + module_put(owner); | ||
8322 | goto restart; | ||
8323 | } | ||
8324 | } | ||
8325 | @@ -1194,8 +1196,8 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) | ||
8326 | goto out_unlock_bdev; | ||
8327 | } | ||
8328 | /* only one opener holds refs to the module and disk */ | ||
8329 | - module_put(disk->fops->owner); | ||
8330 | put_disk(disk); | ||
8331 | + module_put(owner); | ||
8332 | } | ||
8333 | bdev->bd_openers++; | ||
8334 | if (for_part) | ||
8335 | @@ -1215,8 +1217,8 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) | ||
8336 | out_unlock_bdev: | ||
8337 | mutex_unlock(&bdev->bd_mutex); | ||
8338 | disk_unblock_events(disk); | ||
8339 | - module_put(disk->fops->owner); | ||
8340 | put_disk(disk); | ||
8341 | + module_put(owner); | ||
8342 | out: | ||
8343 | bdput(bdev); | ||
8344 | |||
8345 | @@ -1442,14 +1444,15 @@ static int __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part) | ||
8346 | if (!bdev->bd_openers) { | ||
8347 | struct module *owner = disk->fops->owner; | ||
8348 | |||
8349 | - put_disk(disk); | ||
8350 | - module_put(owner); | ||
8351 | disk_put_part(bdev->bd_part); | ||
8352 | bdev->bd_part = NULL; | ||
8353 | bdev->bd_disk = NULL; | ||
8354 | if (bdev != bdev->bd_contains) | ||
8355 | victim = bdev->bd_contains; | ||
8356 | bdev->bd_contains = NULL; | ||
8357 | + | ||
8358 | + put_disk(disk); | ||
8359 | + module_put(owner); | ||
8360 | } | ||
8361 | mutex_unlock(&bdev->bd_mutex); | ||
8362 | bdput(bdev); | ||
8363 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c | ||
8364 | index 71beb02..28bba57 100644 | ||
8365 | --- a/fs/cifs/connect.c | ||
8366 | +++ b/fs/cifs/connect.c | ||
8367 | @@ -2807,10 +2807,10 @@ void cifs_setup_cifs_sb(struct smb_vol *pvolume_info, | ||
8368 | |||
8369 | /* | ||
8370 | * When the server doesn't allow large posix writes, only allow a wsize of | ||
8371 | - * 128k minus the size of the WRITE_AND_X header. That allows for a write up | ||
8372 | + * 2^17-1 minus the size of the WRITE_AND_X header. That allows for a write up | ||
8373 | * to the maximum size described by RFC1002. | ||
8374 | */ | ||
8375 | -#define CIFS_MAX_RFC1002_WSIZE (128 * 1024 - sizeof(WRITE_REQ) + 4) | ||
8376 | +#define CIFS_MAX_RFC1002_WSIZE ((1<<17) - 1 - sizeof(WRITE_REQ) + 4) | ||
8377 | |||
8378 | /* | ||
8379 | * The default wsize is 1M. find_get_pages seems to return a maximum of 256 | ||
8380 | diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c | ||
8381 | index a7b2dcd..745e5cd 100644 | ||
8382 | --- a/fs/cifs/inode.c | ||
8383 | +++ b/fs/cifs/inode.c | ||
8384 | @@ -562,7 +562,16 @@ int cifs_get_file_info(struct file *filp) | ||
8385 | |||
8386 | xid = GetXid(); | ||
8387 | rc = CIFSSMBQFileInfo(xid, tcon, cfile->netfid, &find_data); | ||
8388 | - if (rc == -EOPNOTSUPP || rc == -EINVAL) { | ||
8389 | + switch (rc) { | ||
8390 | + case 0: | ||
8391 | + cifs_all_info_to_fattr(&fattr, &find_data, cifs_sb, false); | ||
8392 | + break; | ||
8393 | + case -EREMOTE: | ||
8394 | + cifs_create_dfs_fattr(&fattr, inode->i_sb); | ||
8395 | + rc = 0; | ||
8396 | + break; | ||
8397 | + case -EOPNOTSUPP: | ||
8398 | + case -EINVAL: | ||
8399 | /* | ||
8400 | * FIXME: legacy server -- fall back to path-based call? | ||
8401 | * for now, just skip revalidating and mark inode for | ||
8402 | @@ -570,18 +579,14 @@ int cifs_get_file_info(struct file *filp) | ||
8403 | */ | ||
8404 | rc = 0; | ||
8405 | CIFS_I(inode)->time = 0; | ||
8406 | + default: | ||
8407 | goto cgfi_exit; | ||
8408 | - } else if (rc == -EREMOTE) { | ||
8409 | - cifs_create_dfs_fattr(&fattr, inode->i_sb); | ||
8410 | - rc = 0; | ||
8411 | - } else if (rc) | ||
8412 | - goto cgfi_exit; | ||
8413 | + } | ||
8414 | |||
8415 | /* | ||
8416 | * don't bother with SFU junk here -- just mark inode as needing | ||
8417 | * revalidation. | ||
8418 | */ | ||
8419 | - cifs_all_info_to_fattr(&fattr, &find_data, cifs_sb, false); | ||
8420 | fattr.cf_uniqueid = CIFS_I(inode)->uniqueid; | ||
8421 | fattr.cf_flags |= CIFS_FATTR_NEED_REVAL; | ||
8422 | cifs_fattr_to_inode(inode, &fattr); | ||
8423 | diff --git a/fs/eventpoll.c b/fs/eventpoll.c | ||
8424 | index fe047d96..2d1744a 100644 | ||
8425 | --- a/fs/eventpoll.c | ||
8426 | +++ b/fs/eventpoll.c | ||
8427 | @@ -70,6 +70,15 @@ | ||
8428 | * simultaneous inserts (A into B and B into A) from racing and | ||
8429 | * constructing a cycle without either insert observing that it is | ||
8430 | * going to. | ||
8431 | + * It is necessary to acquire multiple "ep->mtx"es at once in the | ||
8432 | + * case when one epoll fd is added to another. In this case, we | ||
8433 | + * always acquire the locks in the order of nesting (i.e. after | ||
8434 | + * epoll_ctl(e1, EPOLL_CTL_ADD, e2), e1->mtx will always be acquired | ||
8435 | + * before e2->mtx). Since we disallow cycles of epoll file | ||
8436 | + * descriptors, this ensures that the mutexes are well-ordered. In | ||
8437 | + * order to communicate this nesting to lockdep, when walking a tree | ||
8438 | + * of epoll file descriptors, we use the current recursion depth as | ||
8439 | + * the lockdep subkey. | ||
8440 | * It is possible to drop the "ep->mtx" and to use the global | ||
8441 | * mutex "epmutex" (together with "ep->lock") to have it working, | ||
8442 | * but having "ep->mtx" will make the interface more scalable. | ||
8443 | @@ -464,13 +473,15 @@ static void ep_unregister_pollwait(struct eventpoll *ep, struct epitem *epi) | ||
8444 | * @ep: Pointer to the epoll private data structure. | ||
8445 | * @sproc: Pointer to the scan callback. | ||
8446 | * @priv: Private opaque data passed to the @sproc callback. | ||
8447 | + * @depth: The current depth of recursive f_op->poll calls. | ||
8448 | * | ||
8449 | * Returns: The same integer error code returned by the @sproc callback. | ||
8450 | */ | ||
8451 | static int ep_scan_ready_list(struct eventpoll *ep, | ||
8452 | int (*sproc)(struct eventpoll *, | ||
8453 | struct list_head *, void *), | ||
8454 | - void *priv) | ||
8455 | + void *priv, | ||
8456 | + int depth) | ||
8457 | { | ||
8458 | int error, pwake = 0; | ||
8459 | unsigned long flags; | ||
8460 | @@ -481,7 +492,7 @@ static int ep_scan_ready_list(struct eventpoll *ep, | ||
8461 | * We need to lock this because we could be hit by | ||
8462 | * eventpoll_release_file() and epoll_ctl(). | ||
8463 | */ | ||
8464 | - mutex_lock(&ep->mtx); | ||
8465 | + mutex_lock_nested(&ep->mtx, depth); | ||
8466 | |||
8467 | /* | ||
8468 | * Steal the ready list, and re-init the original one to the | ||
8469 | @@ -670,7 +681,7 @@ static int ep_read_events_proc(struct eventpoll *ep, struct list_head *head, | ||
8470 | |||
8471 | static int ep_poll_readyevents_proc(void *priv, void *cookie, int call_nests) | ||
8472 | { | ||
8473 | - return ep_scan_ready_list(priv, ep_read_events_proc, NULL); | ||
8474 | + return ep_scan_ready_list(priv, ep_read_events_proc, NULL, call_nests + 1); | ||
8475 | } | ||
8476 | |||
8477 | static unsigned int ep_eventpoll_poll(struct file *file, poll_table *wait) | ||
8478 | @@ -737,7 +748,7 @@ void eventpoll_release_file(struct file *file) | ||
8479 | |||
8480 | ep = epi->ep; | ||
8481 | list_del_init(&epi->fllink); | ||
8482 | - mutex_lock(&ep->mtx); | ||
8483 | + mutex_lock_nested(&ep->mtx, 0); | ||
8484 | ep_remove(ep, epi); | ||
8485 | mutex_unlock(&ep->mtx); | ||
8486 | } | ||
8487 | @@ -1134,7 +1145,7 @@ static int ep_send_events(struct eventpoll *ep, | ||
8488 | esed.maxevents = maxevents; | ||
8489 | esed.events = events; | ||
8490 | |||
8491 | - return ep_scan_ready_list(ep, ep_send_events_proc, &esed); | ||
8492 | + return ep_scan_ready_list(ep, ep_send_events_proc, &esed, 0); | ||
8493 | } | ||
8494 | |||
8495 | static inline struct timespec ep_set_mstimeout(long ms) | ||
8496 | @@ -1267,7 +1278,7 @@ static int ep_loop_check_proc(void *priv, void *cookie, int call_nests) | ||
8497 | struct rb_node *rbp; | ||
8498 | struct epitem *epi; | ||
8499 | |||
8500 | - mutex_lock(&ep->mtx); | ||
8501 | + mutex_lock_nested(&ep->mtx, call_nests + 1); | ||
8502 | for (rbp = rb_first(&ep->rbr); rbp; rbp = rb_next(rbp)) { | ||
8503 | epi = rb_entry(rbp, struct epitem, rbn); | ||
8504 | if (unlikely(is_file_epoll(epi->ffd.file))) { | ||
8505 | @@ -1409,7 +1420,7 @@ SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd, | ||
8506 | } | ||
8507 | |||
8508 | |||
8509 | - mutex_lock(&ep->mtx); | ||
8510 | + mutex_lock_nested(&ep->mtx, 0); | ||
8511 | |||
8512 | /* | ||
8513 | * Try to lookup the file inside our RB tree, Since we grabbed "mtx" | ||
8514 | diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h | ||
8515 | index b7d7bd0..5c38120 100644 | ||
8516 | --- a/fs/ext4/ext4.h | ||
8517 | +++ b/fs/ext4/ext4.h | ||
8518 | @@ -358,8 +358,7 @@ struct flex_groups { | ||
8519 | |||
8520 | /* Flags that should be inherited by new inodes from their parent. */ | ||
8521 | #define EXT4_FL_INHERITED (EXT4_SECRM_FL | EXT4_UNRM_FL | EXT4_COMPR_FL |\ | ||
8522 | - EXT4_SYNC_FL | EXT4_IMMUTABLE_FL | EXT4_APPEND_FL |\ | ||
8523 | - EXT4_NODUMP_FL | EXT4_NOATIME_FL |\ | ||
8524 | + EXT4_SYNC_FL | EXT4_NODUMP_FL | EXT4_NOATIME_FL |\ | ||
8525 | EXT4_NOCOMPR_FL | EXT4_JOURNAL_DATA_FL |\ | ||
8526 | EXT4_NOTAIL_FL | EXT4_DIRSYNC_FL) | ||
8527 | |||
8528 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c | ||
8529 | index 986e238..89c47f4 100644 | ||
8530 | --- a/fs/ext4/inode.c | ||
8531 | +++ b/fs/ext4/inode.c | ||
8532 | @@ -4416,6 +4416,7 @@ retry_alloc: | ||
8533 | PAGE_CACHE_SIZE, NULL, do_journal_get_write_access)) { | ||
8534 | unlock_page(page); | ||
8535 | ret = VM_FAULT_SIGBUS; | ||
8536 | + ext4_journal_stop(handle); | ||
8537 | goto out; | ||
8538 | } | ||
8539 | ext4_set_inode_state(inode, EXT4_STATE_JDATA); | ||
8540 | diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c | ||
8541 | index 1c924fa..50c7294 100644 | ||
8542 | --- a/fs/ext4/namei.c | ||
8543 | +++ b/fs/ext4/namei.c | ||
8544 | @@ -1586,7 +1586,7 @@ static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry, | ||
8545 | dxtrace(dx_show_index("node", frames[1].entries)); | ||
8546 | dxtrace(dx_show_index("node", | ||
8547 | ((struct dx_node *) bh2->b_data)->entries)); | ||
8548 | - err = ext4_handle_dirty_metadata(handle, inode, bh2); | ||
8549 | + err = ext4_handle_dirty_metadata(handle, dir, bh2); | ||
8550 | if (err) | ||
8551 | goto journal_error; | ||
8552 | brelse (bh2); | ||
8553 | @@ -1612,7 +1612,7 @@ static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry, | ||
8554 | if (err) | ||
8555 | goto journal_error; | ||
8556 | } | ||
8557 | - err = ext4_handle_dirty_metadata(handle, inode, frames[0].bh); | ||
8558 | + err = ext4_handle_dirty_metadata(handle, dir, frames[0].bh); | ||
8559 | if (err) { | ||
8560 | ext4_std_error(inode->i_sb, err); | ||
8561 | goto cleanup; | ||
8562 | @@ -1863,7 +1863,7 @@ retry: | ||
8563 | ext4_set_de_type(dir->i_sb, de, S_IFDIR); | ||
8564 | inode->i_nlink = 2; | ||
8565 | BUFFER_TRACE(dir_block, "call ext4_handle_dirty_metadata"); | ||
8566 | - err = ext4_handle_dirty_metadata(handle, dir, dir_block); | ||
8567 | + err = ext4_handle_dirty_metadata(handle, inode, dir_block); | ||
8568 | if (err) | ||
8569 | goto out_clear_inode; | ||
8570 | err = ext4_mark_inode_dirty(handle, inode); | ||
8571 | @@ -2530,7 +2530,7 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry, | ||
8572 | PARENT_INO(dir_bh->b_data, new_dir->i_sb->s_blocksize) = | ||
8573 | cpu_to_le32(new_dir->i_ino); | ||
8574 | BUFFER_TRACE(dir_bh, "call ext4_handle_dirty_metadata"); | ||
8575 | - retval = ext4_handle_dirty_metadata(handle, old_dir, dir_bh); | ||
8576 | + retval = ext4_handle_dirty_metadata(handle, old_inode, dir_bh); | ||
8577 | if (retval) { | ||
8578 | ext4_std_error(old_dir->i_sb, retval); | ||
8579 | goto end_rename; | ||
8580 | diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c | ||
8581 | index c757adc..19fe4e3 100644 | ||
8582 | --- a/fs/ext4/xattr.c | ||
8583 | +++ b/fs/ext4/xattr.c | ||
8584 | @@ -820,8 +820,14 @@ inserted: | ||
8585 | if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) | ||
8586 | goal = goal & EXT4_MAX_BLOCK_FILE_PHYS; | ||
8587 | |||
8588 | + /* | ||
8589 | + * take i_data_sem because we will test | ||
8590 | + * i_delalloc_reserved_flag in ext4_mb_new_blocks | ||
8591 | + */ | ||
8592 | + down_read((&EXT4_I(inode)->i_data_sem)); | ||
8593 | block = ext4_new_meta_blocks(handle, inode, goal, 0, | ||
8594 | NULL, &error); | ||
8595 | + up_read((&EXT4_I(inode)->i_data_sem)); | ||
8596 | if (error) | ||
8597 | goto cleanup; | ||
8598 | |||
8599 | diff --git a/fs/namei.c b/fs/namei.c | ||
8600 | index 0b3138d..3d15072 100644 | ||
8601 | --- a/fs/namei.c | ||
8602 | +++ b/fs/namei.c | ||
8603 | @@ -137,7 +137,7 @@ static int do_getname(const char __user *filename, char *page) | ||
8604 | return retval; | ||
8605 | } | ||
8606 | |||
8607 | -static char *getname_flags(const char __user * filename, int flags) | ||
8608 | +static char *getname_flags(const char __user *filename, int flags, int *empty) | ||
8609 | { | ||
8610 | char *tmp, *result; | ||
8611 | |||
8612 | @@ -148,6 +148,8 @@ static char *getname_flags(const char __user * filename, int flags) | ||
8613 | |||
8614 | result = tmp; | ||
8615 | if (retval < 0) { | ||
8616 | + if (retval == -ENOENT && empty) | ||
8617 | + *empty = 1; | ||
8618 | if (retval != -ENOENT || !(flags & LOOKUP_EMPTY)) { | ||
8619 | __putname(tmp); | ||
8620 | result = ERR_PTR(retval); | ||
8621 | @@ -160,7 +162,7 @@ static char *getname_flags(const char __user * filename, int flags) | ||
8622 | |||
8623 | char *getname(const char __user * filename) | ||
8624 | { | ||
8625 | - return getname_flags(filename, 0); | ||
8626 | + return getname_flags(filename, 0, 0); | ||
8627 | } | ||
8628 | |||
8629 | #ifdef CONFIG_AUDITSYSCALL | ||
8630 | @@ -850,7 +852,7 @@ static int follow_managed(struct path *path, unsigned flags) | ||
8631 | mntput(path->mnt); | ||
8632 | if (ret == -EISDIR) | ||
8633 | ret = 0; | ||
8634 | - return ret; | ||
8635 | + return ret < 0 ? ret : need_mntput; | ||
8636 | } | ||
8637 | |||
8638 | int follow_down_one(struct path *path) | ||
8639 | @@ -898,6 +900,7 @@ static bool __follow_mount_rcu(struct nameidata *nd, struct path *path, | ||
8640 | break; | ||
8641 | path->mnt = mounted; | ||
8642 | path->dentry = mounted->mnt_root; | ||
8643 | + nd->flags |= LOOKUP_JUMPED; | ||
8644 | nd->seq = read_seqcount_begin(&path->dentry->d_seq); | ||
8645 | /* | ||
8646 | * Update the inode too. We don't need to re-check the | ||
8647 | @@ -1211,6 +1214,8 @@ retry: | ||
8648 | path_put_conditional(path, nd); | ||
8649 | return err; | ||
8650 | } | ||
8651 | + if (err) | ||
8652 | + nd->flags |= LOOKUP_JUMPED; | ||
8653 | *inode = path->dentry->d_inode; | ||
8654 | return 0; | ||
8655 | } | ||
8656 | @@ -1798,11 +1803,11 @@ struct dentry *lookup_one_len(const char *name, struct dentry *base, int len) | ||
8657 | return __lookup_hash(&this, base, NULL); | ||
8658 | } | ||
8659 | |||
8660 | -int user_path_at(int dfd, const char __user *name, unsigned flags, | ||
8661 | - struct path *path) | ||
8662 | +int user_path_at_empty(int dfd, const char __user *name, unsigned flags, | ||
8663 | + struct path *path, int *empty) | ||
8664 | { | ||
8665 | struct nameidata nd; | ||
8666 | - char *tmp = getname_flags(name, flags); | ||
8667 | + char *tmp = getname_flags(name, flags, empty); | ||
8668 | int err = PTR_ERR(tmp); | ||
8669 | if (!IS_ERR(tmp)) { | ||
8670 | |||
8671 | @@ -1816,6 +1821,12 @@ int user_path_at(int dfd, const char __user *name, unsigned flags, | ||
8672 | return err; | ||
8673 | } | ||
8674 | |||
8675 | +int user_path_at(int dfd, const char __user *name, unsigned flags, | ||
8676 | + struct path *path) | ||
8677 | +{ | ||
8678 | + return user_path_at_empty(dfd, name, flags, path, 0); | ||
8679 | +} | ||
8680 | + | ||
8681 | static int user_path_parent(int dfd, const char __user *path, | ||
8682 | struct nameidata *nd, char **name) | ||
8683 | { | ||
8684 | @@ -2141,6 +2152,10 @@ static struct file *do_last(struct nameidata *nd, struct path *path, | ||
8685 | } | ||
8686 | |||
8687 | /* create side of things */ | ||
8688 | + /* | ||
8689 | + * This will *only* deal with leaving RCU mode - LOOKUP_JUMPED has been | ||
8690 | + * cleared when we got to the last component we are about to look up | ||
8691 | + */ | ||
8692 | error = complete_walk(nd); | ||
8693 | if (error) | ||
8694 | return ERR_PTR(error); | ||
8695 | @@ -2209,6 +2224,9 @@ static struct file *do_last(struct nameidata *nd, struct path *path, | ||
8696 | if (error < 0) | ||
8697 | goto exit_dput; | ||
8698 | |||
8699 | + if (error) | ||
8700 | + nd->flags |= LOOKUP_JUMPED; | ||
8701 | + | ||
8702 | error = -ENOENT; | ||
8703 | if (!path->dentry->d_inode) | ||
8704 | goto exit_dput; | ||
8705 | @@ -2218,6 +2236,10 @@ static struct file *do_last(struct nameidata *nd, struct path *path, | ||
8706 | |||
8707 | path_to_nameidata(path, nd); | ||
8708 | nd->inode = path->dentry->d_inode; | ||
8709 | + /* Why this, you ask? _Now_ we might have grown LOOKUP_JUMPED... */ | ||
8710 | + error = complete_walk(nd); | ||
8711 | + if (error) | ||
8712 | + goto exit; | ||
8713 | error = -EISDIR; | ||
8714 | if (S_ISDIR(nd->inode->i_mode)) | ||
8715 | goto exit; | ||
8716 | diff --git a/fs/namespace.c b/fs/namespace.c | ||
8717 | index b4febb2..e5e1c7d 100644 | ||
8718 | --- a/fs/namespace.c | ||
8719 | +++ b/fs/namespace.c | ||
8720 | @@ -1109,6 +1109,7 @@ static int show_vfsstat(struct seq_file *m, void *v) | ||
8721 | |||
8722 | /* device */ | ||
8723 | if (mnt->mnt_sb->s_op->show_devname) { | ||
8724 | + seq_puts(m, "device "); | ||
8725 | err = mnt->mnt_sb->s_op->show_devname(m, mnt); | ||
8726 | } else { | ||
8727 | if (mnt->mnt_devname) { | ||
8728 | diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c | ||
8729 | index 9561c8f..281ae95 100644 | ||
8730 | --- a/fs/nfs/blocklayout/blocklayout.c | ||
8731 | +++ b/fs/nfs/blocklayout/blocklayout.c | ||
8732 | @@ -176,17 +176,6 @@ retry: | ||
8733 | return bio; | ||
8734 | } | ||
8735 | |||
8736 | -static void bl_set_lo_fail(struct pnfs_layout_segment *lseg) | ||
8737 | -{ | ||
8738 | - if (lseg->pls_range.iomode == IOMODE_RW) { | ||
8739 | - dprintk("%s Setting layout IOMODE_RW fail bit\n", __func__); | ||
8740 | - set_bit(lo_fail_bit(IOMODE_RW), &lseg->pls_layout->plh_flags); | ||
8741 | - } else { | ||
8742 | - dprintk("%s Setting layout IOMODE_READ fail bit\n", __func__); | ||
8743 | - set_bit(lo_fail_bit(IOMODE_READ), &lseg->pls_layout->plh_flags); | ||
8744 | - } | ||
8745 | -} | ||
8746 | - | ||
8747 | /* This is basically copied from mpage_end_io_read */ | ||
8748 | static void bl_end_io_read(struct bio *bio, int err) | ||
8749 | { | ||
8750 | @@ -206,7 +195,7 @@ static void bl_end_io_read(struct bio *bio, int err) | ||
8751 | if (!uptodate) { | ||
8752 | if (!rdata->pnfs_error) | ||
8753 | rdata->pnfs_error = -EIO; | ||
8754 | - bl_set_lo_fail(rdata->lseg); | ||
8755 | + pnfs_set_lo_fail(rdata->lseg); | ||
8756 | } | ||
8757 | bio_put(bio); | ||
8758 | put_parallel(par); | ||
8759 | @@ -303,6 +292,7 @@ bl_read_pagelist(struct nfs_read_data *rdata) | ||
8760 | bl_end_io_read, par); | ||
8761 | if (IS_ERR(bio)) { | ||
8762 | rdata->pnfs_error = PTR_ERR(bio); | ||
8763 | + bio = NULL; | ||
8764 | goto out; | ||
8765 | } | ||
8766 | } | ||
8767 | @@ -370,7 +360,7 @@ static void bl_end_io_write_zero(struct bio *bio, int err) | ||
8768 | if (!uptodate) { | ||
8769 | if (!wdata->pnfs_error) | ||
8770 | wdata->pnfs_error = -EIO; | ||
8771 | - bl_set_lo_fail(wdata->lseg); | ||
8772 | + pnfs_set_lo_fail(wdata->lseg); | ||
8773 | } | ||
8774 | bio_put(bio); | ||
8775 | put_parallel(par); | ||
8776 | @@ -386,7 +376,7 @@ static void bl_end_io_write(struct bio *bio, int err) | ||
8777 | if (!uptodate) { | ||
8778 | if (!wdata->pnfs_error) | ||
8779 | wdata->pnfs_error = -EIO; | ||
8780 | - bl_set_lo_fail(wdata->lseg); | ||
8781 | + pnfs_set_lo_fail(wdata->lseg); | ||
8782 | } | ||
8783 | bio_put(bio); | ||
8784 | put_parallel(par); | ||
8785 | @@ -543,6 +533,11 @@ bl_write_pagelist(struct nfs_write_data *wdata, int sync) | ||
8786 | fill_invalid_ext: | ||
8787 | dprintk("%s need to zero %d pages\n", __func__, npg_zero); | ||
8788 | for (;npg_zero > 0; npg_zero--) { | ||
8789 | + if (bl_is_sector_init(be->be_inval, isect)) { | ||
8790 | + dprintk("isect %llu already init\n", | ||
8791 | + (unsigned long long)isect); | ||
8792 | + goto next_page; | ||
8793 | + } | ||
8794 | /* page ref released in bl_end_io_write_zero */ | ||
8795 | index = isect >> PAGE_CACHE_SECTOR_SHIFT; | ||
8796 | dprintk("%s zero %dth page: index %lu isect %llu\n", | ||
8797 | @@ -562,8 +557,7 @@ fill_invalid_ext: | ||
8798 | * PageUptodate: It was read before | ||
8799 | * sector_initialized: already written out | ||
8800 | */ | ||
8801 | - if (PageDirty(page) || PageWriteback(page) || | ||
8802 | - bl_is_sector_init(be->be_inval, isect)) { | ||
8803 | + if (PageDirty(page) || PageWriteback(page)) { | ||
8804 | print_page(page); | ||
8805 | unlock_page(page); | ||
8806 | page_cache_release(page); | ||
8807 | @@ -592,6 +586,7 @@ fill_invalid_ext: | ||
8808 | bl_end_io_write_zero, par); | ||
8809 | if (IS_ERR(bio)) { | ||
8810 | wdata->pnfs_error = PTR_ERR(bio); | ||
8811 | + bio = NULL; | ||
8812 | goto out; | ||
8813 | } | ||
8814 | /* FIXME: This should be done in bi_end_io */ | ||
8815 | @@ -640,6 +635,7 @@ next_page: | ||
8816 | bl_end_io_write, par); | ||
8817 | if (IS_ERR(bio)) { | ||
8818 | wdata->pnfs_error = PTR_ERR(bio); | ||
8819 | + bio = NULL; | ||
8820 | goto out; | ||
8821 | } | ||
8822 | isect += PAGE_CACHE_SECTORS; | ||
8823 | @@ -805,7 +801,7 @@ nfs4_blk_get_deviceinfo(struct nfs_server *server, const struct nfs_fh *fh, | ||
8824 | struct nfs4_deviceid *d_id) | ||
8825 | { | ||
8826 | struct pnfs_device *dev; | ||
8827 | - struct pnfs_block_dev *rv = NULL; | ||
8828 | + struct pnfs_block_dev *rv; | ||
8829 | u32 max_resp_sz; | ||
8830 | int max_pages; | ||
8831 | struct page **pages = NULL; | ||
8832 | @@ -823,18 +819,20 @@ nfs4_blk_get_deviceinfo(struct nfs_server *server, const struct nfs_fh *fh, | ||
8833 | dev = kmalloc(sizeof(*dev), GFP_NOFS); | ||
8834 | if (!dev) { | ||
8835 | dprintk("%s kmalloc failed\n", __func__); | ||
8836 | - return NULL; | ||
8837 | + return ERR_PTR(-ENOMEM); | ||
8838 | } | ||
8839 | |||
8840 | pages = kzalloc(max_pages * sizeof(struct page *), GFP_NOFS); | ||
8841 | if (pages == NULL) { | ||
8842 | kfree(dev); | ||
8843 | - return NULL; | ||
8844 | + return ERR_PTR(-ENOMEM); | ||
8845 | } | ||
8846 | for (i = 0; i < max_pages; i++) { | ||
8847 | pages[i] = alloc_page(GFP_NOFS); | ||
8848 | - if (!pages[i]) | ||
8849 | + if (!pages[i]) { | ||
8850 | + rv = ERR_PTR(-ENOMEM); | ||
8851 | goto out_free; | ||
8852 | + } | ||
8853 | } | ||
8854 | |||
8855 | memcpy(&dev->dev_id, d_id, sizeof(*d_id)); | ||
8856 | @@ -847,8 +845,10 @@ nfs4_blk_get_deviceinfo(struct nfs_server *server, const struct nfs_fh *fh, | ||
8857 | dprintk("%s: dev_id: %s\n", __func__, dev->dev_id.data); | ||
8858 | rc = nfs4_proc_getdeviceinfo(server, dev); | ||
8859 | dprintk("%s getdevice info returns %d\n", __func__, rc); | ||
8860 | - if (rc) | ||
8861 | + if (rc) { | ||
8862 | + rv = ERR_PTR(rc); | ||
8863 | goto out_free; | ||
8864 | + } | ||
8865 | |||
8866 | rv = nfs4_blk_decode_device(server, dev); | ||
8867 | out_free: | ||
8868 | @@ -866,7 +866,7 @@ bl_set_layoutdriver(struct nfs_server *server, const struct nfs_fh *fh) | ||
8869 | struct pnfs_devicelist *dlist = NULL; | ||
8870 | struct pnfs_block_dev *bdev; | ||
8871 | LIST_HEAD(block_disklist); | ||
8872 | - int status = 0, i; | ||
8873 | + int status, i; | ||
8874 | |||
8875 | dprintk("%s enter\n", __func__); | ||
8876 | |||
8877 | @@ -898,8 +898,8 @@ bl_set_layoutdriver(struct nfs_server *server, const struct nfs_fh *fh) | ||
8878 | for (i = 0; i < dlist->num_devs; i++) { | ||
8879 | bdev = nfs4_blk_get_deviceinfo(server, fh, | ||
8880 | &dlist->dev_id[i]); | ||
8881 | - if (!bdev) { | ||
8882 | - status = -ENODEV; | ||
8883 | + if (IS_ERR(bdev)) { | ||
8884 | + status = PTR_ERR(bdev); | ||
8885 | goto out_error; | ||
8886 | } | ||
8887 | spin_lock(&b_mt_id->bm_lock); | ||
8888 | @@ -960,7 +960,7 @@ static struct pnfs_layoutdriver_type blocklayout_type = { | ||
8889 | }; | ||
8890 | |||
8891 | static const struct rpc_pipe_ops bl_upcall_ops = { | ||
8892 | - .upcall = bl_pipe_upcall, | ||
8893 | + .upcall = rpc_pipe_generic_upcall, | ||
8894 | .downcall = bl_pipe_downcall, | ||
8895 | .destroy_msg = bl_pipe_destroy_msg, | ||
8896 | }; | ||
8897 | @@ -989,17 +989,20 @@ static int __init nfs4blocklayout_init(void) | ||
8898 | mnt, | ||
8899 | NFS_PIPE_DIRNAME, 0, &path); | ||
8900 | if (ret) | ||
8901 | - goto out_remove; | ||
8902 | + goto out_putrpc; | ||
8903 | |||
8904 | bl_device_pipe = rpc_mkpipe(path.dentry, "blocklayout", NULL, | ||
8905 | &bl_upcall_ops, 0); | ||
8906 | + path_put(&path); | ||
8907 | if (IS_ERR(bl_device_pipe)) { | ||
8908 | ret = PTR_ERR(bl_device_pipe); | ||
8909 | - goto out_remove; | ||
8910 | + goto out_putrpc; | ||
8911 | } | ||
8912 | out: | ||
8913 | return ret; | ||
8914 | |||
8915 | +out_putrpc: | ||
8916 | + rpc_put_mount(); | ||
8917 | out_remove: | ||
8918 | pnfs_unregister_layoutdriver(&blocklayout_type); | ||
8919 | return ret; | ||
8920 | @@ -1012,6 +1015,7 @@ static void __exit nfs4blocklayout_exit(void) | ||
8921 | |||
8922 | pnfs_unregister_layoutdriver(&blocklayout_type); | ||
8923 | rpc_unlink(bl_device_pipe); | ||
8924 | + rpc_put_mount(); | ||
8925 | } | ||
8926 | |||
8927 | MODULE_ALIAS("nfs-layouttype4-3"); | ||
8928 | diff --git a/fs/nfs/blocklayout/blocklayout.h b/fs/nfs/blocklayout/blocklayout.h | ||
8929 | index f27d827..42acf7e 100644 | ||
8930 | --- a/fs/nfs/blocklayout/blocklayout.h | ||
8931 | +++ b/fs/nfs/blocklayout/blocklayout.h | ||
8932 | @@ -150,7 +150,7 @@ BLK_LSEG2EXT(struct pnfs_layout_segment *lseg) | ||
8933 | } | ||
8934 | |||
8935 | struct bl_dev_msg { | ||
8936 | - int status; | ||
8937 | + int32_t status; | ||
8938 | uint32_t major, minor; | ||
8939 | }; | ||
8940 | |||
8941 | @@ -169,8 +169,6 @@ extern wait_queue_head_t bl_wq; | ||
8942 | #define BL_DEVICE_REQUEST_ERR 0x2 /* User level process fails */ | ||
8943 | |||
8944 | /* blocklayoutdev.c */ | ||
8945 | -ssize_t bl_pipe_upcall(struct file *, struct rpc_pipe_msg *, | ||
8946 | - char __user *, size_t); | ||
8947 | ssize_t bl_pipe_downcall(struct file *, const char __user *, size_t); | ||
8948 | void bl_pipe_destroy_msg(struct rpc_pipe_msg *); | ||
8949 | struct block_device *nfs4_blkdev_get(dev_t dev); | ||
8950 | diff --git a/fs/nfs/blocklayout/blocklayoutdev.c b/fs/nfs/blocklayout/blocklayoutdev.c | ||
8951 | index a83b393..d08ba91 100644 | ||
8952 | --- a/fs/nfs/blocklayout/blocklayoutdev.c | ||
8953 | +++ b/fs/nfs/blocklayout/blocklayoutdev.c | ||
8954 | @@ -79,28 +79,6 @@ int nfs4_blkdev_put(struct block_device *bdev) | ||
8955 | return blkdev_put(bdev, FMODE_READ); | ||
8956 | } | ||
8957 | |||
8958 | -/* | ||
8959 | - * Shouldn't there be a rpc_generic_upcall() to do this for us? | ||
8960 | - */ | ||
8961 | -ssize_t bl_pipe_upcall(struct file *filp, struct rpc_pipe_msg *msg, | ||
8962 | - char __user *dst, size_t buflen) | ||
8963 | -{ | ||
8964 | - char *data = (char *)msg->data + msg->copied; | ||
8965 | - size_t mlen = min(msg->len - msg->copied, buflen); | ||
8966 | - unsigned long left; | ||
8967 | - | ||
8968 | - left = copy_to_user(dst, data, mlen); | ||
8969 | - if (left == mlen) { | ||
8970 | - msg->errno = -EFAULT; | ||
8971 | - return -EFAULT; | ||
8972 | - } | ||
8973 | - | ||
8974 | - mlen -= left; | ||
8975 | - msg->copied += mlen; | ||
8976 | - msg->errno = 0; | ||
8977 | - return mlen; | ||
8978 | -} | ||
8979 | - | ||
8980 | static struct bl_dev_msg bl_mount_reply; | ||
8981 | |||
8982 | ssize_t bl_pipe_downcall(struct file *filp, const char __user *src, | ||
8983 | @@ -131,7 +109,7 @@ struct pnfs_block_dev * | ||
8984 | nfs4_blk_decode_device(struct nfs_server *server, | ||
8985 | struct pnfs_device *dev) | ||
8986 | { | ||
8987 | - struct pnfs_block_dev *rv = NULL; | ||
8988 | + struct pnfs_block_dev *rv; | ||
8989 | struct block_device *bd = NULL; | ||
8990 | struct rpc_pipe_msg msg; | ||
8991 | struct bl_msg_hdr bl_msg = { | ||
8992 | @@ -141,7 +119,7 @@ nfs4_blk_decode_device(struct nfs_server *server, | ||
8993 | uint8_t *dataptr; | ||
8994 | DECLARE_WAITQUEUE(wq, current); | ||
8995 | struct bl_dev_msg *reply = &bl_mount_reply; | ||
8996 | - int offset, len, i; | ||
8997 | + int offset, len, i, rc; | ||
8998 | |||
8999 | dprintk("%s CREATING PIPEFS MESSAGE\n", __func__); | ||
9000 | dprintk("%s: deviceid: %s, mincount: %d\n", __func__, dev->dev_id.data, | ||
9001 | @@ -168,8 +146,10 @@ nfs4_blk_decode_device(struct nfs_server *server, | ||
9002 | |||
9003 | dprintk("%s CALLING USERSPACE DAEMON\n", __func__); | ||
9004 | add_wait_queue(&bl_wq, &wq); | ||
9005 | - if (rpc_queue_upcall(bl_device_pipe->d_inode, &msg) < 0) { | ||
9006 | + rc = rpc_queue_upcall(bl_device_pipe->d_inode, &msg); | ||
9007 | + if (rc < 0) { | ||
9008 | remove_wait_queue(&bl_wq, &wq); | ||
9009 | + rv = ERR_PTR(rc); | ||
9010 | goto out; | ||
9011 | } | ||
9012 | |||
9013 | @@ -187,8 +167,9 @@ nfs4_blk_decode_device(struct nfs_server *server, | ||
9014 | |||
9015 | bd = nfs4_blkdev_get(MKDEV(reply->major, reply->minor)); | ||
9016 | if (IS_ERR(bd)) { | ||
9017 | - dprintk("%s failed to open device : %ld\n", | ||
9018 | - __func__, PTR_ERR(bd)); | ||
9019 | + rc = PTR_ERR(bd); | ||
9020 | + dprintk("%s failed to open device : %d\n", __func__, rc); | ||
9021 | + rv = ERR_PTR(rc); | ||
9022 | goto out; | ||
9023 | } | ||
9024 | |||
9025 | diff --git a/fs/nfs/idmap.c b/fs/nfs/idmap.c | ||
9026 | index f20801a..47d1c6f 100644 | ||
9027 | --- a/fs/nfs/idmap.c | ||
9028 | +++ b/fs/nfs/idmap.c | ||
9029 | @@ -336,8 +336,6 @@ struct idmap { | ||
9030 | struct idmap_hashtable idmap_group_hash; | ||
9031 | }; | ||
9032 | |||
9033 | -static ssize_t idmap_pipe_upcall(struct file *, struct rpc_pipe_msg *, | ||
9034 | - char __user *, size_t); | ||
9035 | static ssize_t idmap_pipe_downcall(struct file *, const char __user *, | ||
9036 | size_t); | ||
9037 | static void idmap_pipe_destroy_msg(struct rpc_pipe_msg *); | ||
9038 | @@ -345,7 +343,7 @@ static void idmap_pipe_destroy_msg(struct rpc_pipe_msg *); | ||
9039 | static unsigned int fnvhash32(const void *, size_t); | ||
9040 | |||
9041 | static const struct rpc_pipe_ops idmap_upcall_ops = { | ||
9042 | - .upcall = idmap_pipe_upcall, | ||
9043 | + .upcall = rpc_pipe_generic_upcall, | ||
9044 | .downcall = idmap_pipe_downcall, | ||
9045 | .destroy_msg = idmap_pipe_destroy_msg, | ||
9046 | }; | ||
9047 | @@ -595,27 +593,6 @@ nfs_idmap_name(struct idmap *idmap, struct idmap_hashtable *h, | ||
9048 | return ret; | ||
9049 | } | ||
9050 | |||
9051 | -/* RPC pipefs upcall/downcall routines */ | ||
9052 | -static ssize_t | ||
9053 | -idmap_pipe_upcall(struct file *filp, struct rpc_pipe_msg *msg, | ||
9054 | - char __user *dst, size_t buflen) | ||
9055 | -{ | ||
9056 | - char *data = (char *)msg->data + msg->copied; | ||
9057 | - size_t mlen = min(msg->len, buflen); | ||
9058 | - unsigned long left; | ||
9059 | - | ||
9060 | - left = copy_to_user(dst, data, mlen); | ||
9061 | - if (left == mlen) { | ||
9062 | - msg->errno = -EFAULT; | ||
9063 | - return -EFAULT; | ||
9064 | - } | ||
9065 | - | ||
9066 | - mlen -= left; | ||
9067 | - msg->copied += mlen; | ||
9068 | - msg->errno = 0; | ||
9069 | - return mlen; | ||
9070 | -} | ||
9071 | - | ||
9072 | static ssize_t | ||
9073 | idmap_pipe_downcall(struct file *filp, const char __user *src, size_t mlen) | ||
9074 | { | ||
9075 | diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c | ||
9076 | index e8915d4..4c78c62 100644 | ||
9077 | --- a/fs/nfs/nfs4filelayout.c | ||
9078 | +++ b/fs/nfs/nfs4filelayout.c | ||
9079 | @@ -77,19 +77,6 @@ filelayout_get_dserver_offset(struct pnfs_layout_segment *lseg, loff_t offset) | ||
9080 | BUG(); | ||
9081 | } | ||
9082 | |||
9083 | -/* For data server errors we don't recover from */ | ||
9084 | -static void | ||
9085 | -filelayout_set_lo_fail(struct pnfs_layout_segment *lseg) | ||
9086 | -{ | ||
9087 | - if (lseg->pls_range.iomode == IOMODE_RW) { | ||
9088 | - dprintk("%s Setting layout IOMODE_RW fail bit\n", __func__); | ||
9089 | - set_bit(lo_fail_bit(IOMODE_RW), &lseg->pls_layout->plh_flags); | ||
9090 | - } else { | ||
9091 | - dprintk("%s Setting layout IOMODE_READ fail bit\n", __func__); | ||
9092 | - set_bit(lo_fail_bit(IOMODE_READ), &lseg->pls_layout->plh_flags); | ||
9093 | - } | ||
9094 | -} | ||
9095 | - | ||
9096 | static int filelayout_async_handle_error(struct rpc_task *task, | ||
9097 | struct nfs4_state *state, | ||
9098 | struct nfs_client *clp, | ||
9099 | @@ -145,7 +132,7 @@ static int filelayout_read_done_cb(struct rpc_task *task, | ||
9100 | dprintk("%s calling restart ds_clp %p ds_clp->cl_session %p\n", | ||
9101 | __func__, data->ds_clp, data->ds_clp->cl_session); | ||
9102 | if (reset) { | ||
9103 | - filelayout_set_lo_fail(data->lseg); | ||
9104 | + pnfs_set_lo_fail(data->lseg); | ||
9105 | nfs4_reset_read(task, data); | ||
9106 | clp = NFS_SERVER(data->inode)->nfs_client; | ||
9107 | } | ||
9108 | @@ -221,7 +208,7 @@ static int filelayout_write_done_cb(struct rpc_task *task, | ||
9109 | dprintk("%s calling restart ds_clp %p ds_clp->cl_session %p\n", | ||
9110 | __func__, data->ds_clp, data->ds_clp->cl_session); | ||
9111 | if (reset) { | ||
9112 | - filelayout_set_lo_fail(data->lseg); | ||
9113 | + pnfs_set_lo_fail(data->lseg); | ||
9114 | nfs4_reset_write(task, data); | ||
9115 | clp = NFS_SERVER(data->inode)->nfs_client; | ||
9116 | } else | ||
9117 | @@ -256,7 +243,7 @@ static int filelayout_commit_done_cb(struct rpc_task *task, | ||
9118 | __func__, data->ds_clp, data->ds_clp->cl_session); | ||
9119 | if (reset) { | ||
9120 | prepare_to_resend_writes(data); | ||
9121 | - filelayout_set_lo_fail(data->lseg); | ||
9122 | + pnfs_set_lo_fail(data->lseg); | ||
9123 | } else | ||
9124 | nfs_restart_rpc(task, data->ds_clp); | ||
9125 | return -EAGAIN; | ||
9126 | diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c | ||
9127 | index e550e88..ee73d9a 100644 | ||
9128 | --- a/fs/nfs/pnfs.c | ||
9129 | +++ b/fs/nfs/pnfs.c | ||
9130 | @@ -1168,23 +1168,17 @@ EXPORT_SYMBOL_GPL(pnfs_generic_pg_test); | ||
9131 | /* | ||
9132 | * Called by non rpc-based layout drivers | ||
9133 | */ | ||
9134 | -int | ||
9135 | -pnfs_ld_write_done(struct nfs_write_data *data) | ||
9136 | +void pnfs_ld_write_done(struct nfs_write_data *data) | ||
9137 | { | ||
9138 | - int status; | ||
9139 | - | ||
9140 | - if (!data->pnfs_error) { | ||
9141 | + if (likely(!data->pnfs_error)) { | ||
9142 | pnfs_set_layoutcommit(data); | ||
9143 | data->mds_ops->rpc_call_done(&data->task, data); | ||
9144 | - data->mds_ops->rpc_release(data); | ||
9145 | - return 0; | ||
9146 | + } else { | ||
9147 | + put_lseg(data->lseg); | ||
9148 | + data->lseg = NULL; | ||
9149 | + dprintk("pnfs write error = %d\n", data->pnfs_error); | ||
9150 | } | ||
9151 | - | ||
9152 | - dprintk("%s: pnfs_error=%d, retry via MDS\n", __func__, | ||
9153 | - data->pnfs_error); | ||
9154 | - status = nfs_initiate_write(data, NFS_CLIENT(data->inode), | ||
9155 | - data->mds_ops, NFS_FILE_SYNC); | ||
9156 | - return status ? : -EAGAIN; | ||
9157 | + data->mds_ops->rpc_release(data); | ||
9158 | } | ||
9159 | EXPORT_SYMBOL_GPL(pnfs_ld_write_done); | ||
9160 | |||
9161 | @@ -1268,23 +1262,17 @@ EXPORT_SYMBOL_GPL(pnfs_generic_pg_writepages); | ||
9162 | /* | ||
9163 | * Called by non rpc-based layout drivers | ||
9164 | */ | ||
9165 | -int | ||
9166 | -pnfs_ld_read_done(struct nfs_read_data *data) | ||
9167 | +void pnfs_ld_read_done(struct nfs_read_data *data) | ||
9168 | { | ||
9169 | - int status; | ||
9170 | - | ||
9171 | - if (!data->pnfs_error) { | ||
9172 | + if (likely(!data->pnfs_error)) { | ||
9173 | __nfs4_read_done_cb(data); | ||
9174 | data->mds_ops->rpc_call_done(&data->task, data); | ||
9175 | - data->mds_ops->rpc_release(data); | ||
9176 | - return 0; | ||
9177 | + } else { | ||
9178 | + put_lseg(data->lseg); | ||
9179 | + data->lseg = NULL; | ||
9180 | + dprintk("pnfs write error = %d\n", data->pnfs_error); | ||
9181 | } | ||
9182 | - | ||
9183 | - dprintk("%s: pnfs_error=%d, retry via MDS\n", __func__, | ||
9184 | - data->pnfs_error); | ||
9185 | - status = nfs_initiate_read(data, NFS_CLIENT(data->inode), | ||
9186 | - data->mds_ops); | ||
9187 | - return status ? : -EAGAIN; | ||
9188 | + data->mds_ops->rpc_release(data); | ||
9189 | } | ||
9190 | EXPORT_SYMBOL_GPL(pnfs_ld_read_done); | ||
9191 | |||
9192 | @@ -1381,6 +1369,18 @@ static void pnfs_list_write_lseg(struct inode *inode, struct list_head *listp) | ||
9193 | } | ||
9194 | } | ||
9195 | |||
9196 | +void pnfs_set_lo_fail(struct pnfs_layout_segment *lseg) | ||
9197 | +{ | ||
9198 | + if (lseg->pls_range.iomode == IOMODE_RW) { | ||
9199 | + dprintk("%s Setting layout IOMODE_RW fail bit\n", __func__); | ||
9200 | + set_bit(lo_fail_bit(IOMODE_RW), &lseg->pls_layout->plh_flags); | ||
9201 | + } else { | ||
9202 | + dprintk("%s Setting layout IOMODE_READ fail bit\n", __func__); | ||
9203 | + set_bit(lo_fail_bit(IOMODE_READ), &lseg->pls_layout->plh_flags); | ||
9204 | + } | ||
9205 | +} | ||
9206 | +EXPORT_SYMBOL_GPL(pnfs_set_lo_fail); | ||
9207 | + | ||
9208 | void | ||
9209 | pnfs_set_layoutcommit(struct nfs_write_data *wdata) | ||
9210 | { | ||
9211 | diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h | ||
9212 | index 01cbfd5..1509530 100644 | ||
9213 | --- a/fs/nfs/pnfs.h | ||
9214 | +++ b/fs/nfs/pnfs.h | ||
9215 | @@ -178,6 +178,7 @@ int pnfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc); | ||
9216 | void pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *, struct nfs_page *); | ||
9217 | int pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc); | ||
9218 | bool pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, struct nfs_page *req); | ||
9219 | +void pnfs_set_lo_fail(struct pnfs_layout_segment *lseg); | ||
9220 | int pnfs_layout_process(struct nfs4_layoutget *lgp); | ||
9221 | void pnfs_free_lseg_list(struct list_head *tmp_list); | ||
9222 | void pnfs_destroy_layout(struct nfs_inode *); | ||
9223 | @@ -200,8 +201,8 @@ void pnfs_set_layoutcommit(struct nfs_write_data *wdata); | ||
9224 | void pnfs_cleanup_layoutcommit(struct nfs4_layoutcommit_data *data); | ||
9225 | int pnfs_layoutcommit_inode(struct inode *inode, bool sync); | ||
9226 | int _pnfs_return_layout(struct inode *); | ||
9227 | -int pnfs_ld_write_done(struct nfs_write_data *); | ||
9228 | -int pnfs_ld_read_done(struct nfs_read_data *); | ||
9229 | +void pnfs_ld_write_done(struct nfs_write_data *); | ||
9230 | +void pnfs_ld_read_done(struct nfs_read_data *); | ||
9231 | struct pnfs_layout_segment *pnfs_update_layout(struct inode *ino, | ||
9232 | struct nfs_open_context *ctx, | ||
9233 | loff_t pos, | ||
9234 | diff --git a/fs/nfs/read.c b/fs/nfs/read.c | ||
9235 | index 2171c04..bfc20b1 100644 | ||
9236 | --- a/fs/nfs/read.c | ||
9237 | +++ b/fs/nfs/read.c | ||
9238 | @@ -541,13 +541,23 @@ static void nfs_readpage_result_full(struct rpc_task *task, void *calldata) | ||
9239 | static void nfs_readpage_release_full(void *calldata) | ||
9240 | { | ||
9241 | struct nfs_read_data *data = calldata; | ||
9242 | + struct nfs_pageio_descriptor pgio; | ||
9243 | |||
9244 | + if (data->pnfs_error) { | ||
9245 | + nfs_pageio_init_read_mds(&pgio, data->inode); | ||
9246 | + pgio.pg_recoalesce = 1; | ||
9247 | + } | ||
9248 | while (!list_empty(&data->pages)) { | ||
9249 | struct nfs_page *req = nfs_list_entry(data->pages.next); | ||
9250 | |||
9251 | nfs_list_remove_request(req); | ||
9252 | - nfs_readpage_release(req); | ||
9253 | + if (!data->pnfs_error) | ||
9254 | + nfs_readpage_release(req); | ||
9255 | + else | ||
9256 | + nfs_pageio_add_request(&pgio, req); | ||
9257 | } | ||
9258 | + if (data->pnfs_error) | ||
9259 | + nfs_pageio_complete(&pgio); | ||
9260 | nfs_readdata_release(calldata); | ||
9261 | } | ||
9262 | |||
9263 | diff --git a/fs/nfs/write.c b/fs/nfs/write.c | ||
9264 | index c9bd2a6..106fd06 100644 | ||
9265 | --- a/fs/nfs/write.c | ||
9266 | +++ b/fs/nfs/write.c | ||
9267 | @@ -428,7 +428,6 @@ static void | ||
9268 | nfs_mark_request_dirty(struct nfs_page *req) | ||
9269 | { | ||
9270 | __set_page_dirty_nobuffers(req->wb_page); | ||
9271 | - __mark_inode_dirty(req->wb_page->mapping->host, I_DIRTY_DATASYNC); | ||
9272 | } | ||
9273 | |||
9274 | #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) | ||
9275 | @@ -762,6 +761,8 @@ int nfs_updatepage(struct file *file, struct page *page, | ||
9276 | status = nfs_writepage_setup(ctx, page, offset, count); | ||
9277 | if (status < 0) | ||
9278 | nfs_set_pageerror(page); | ||
9279 | + else | ||
9280 | + __set_page_dirty_nobuffers(page); | ||
9281 | |||
9282 | dprintk("NFS: nfs_updatepage returns %d (isize %lld)\n", | ||
9283 | status, (long long)i_size_read(inode)); | ||
9284 | @@ -1165,7 +1166,13 @@ static void nfs_writeback_done_full(struct rpc_task *task, void *calldata) | ||
9285 | static void nfs_writeback_release_full(void *calldata) | ||
9286 | { | ||
9287 | struct nfs_write_data *data = calldata; | ||
9288 | - int status = data->task.tk_status; | ||
9289 | + int ret, status = data->task.tk_status; | ||
9290 | + struct nfs_pageio_descriptor pgio; | ||
9291 | + | ||
9292 | + if (data->pnfs_error) { | ||
9293 | + nfs_pageio_init_write_mds(&pgio, data->inode, FLUSH_STABLE); | ||
9294 | + pgio.pg_recoalesce = 1; | ||
9295 | + } | ||
9296 | |||
9297 | /* Update attributes as result of writeback. */ | ||
9298 | while (!list_empty(&data->pages)) { | ||
9299 | @@ -1181,6 +1188,11 @@ static void nfs_writeback_release_full(void *calldata) | ||
9300 | req->wb_bytes, | ||
9301 | (long long)req_offset(req)); | ||
9302 | |||
9303 | + if (data->pnfs_error) { | ||
9304 | + dprintk(", pnfs error = %d\n", data->pnfs_error); | ||
9305 | + goto next; | ||
9306 | + } | ||
9307 | + | ||
9308 | if (status < 0) { | ||
9309 | nfs_set_pageerror(page); | ||
9310 | nfs_context_set_write_error(req->wb_context, status); | ||
9311 | @@ -1200,7 +1212,19 @@ remove_request: | ||
9312 | next: | ||
9313 | nfs_clear_page_tag_locked(req); | ||
9314 | nfs_end_page_writeback(page); | ||
9315 | + if (data->pnfs_error) { | ||
9316 | + lock_page(page); | ||
9317 | + nfs_pageio_cond_complete(&pgio, page->index); | ||
9318 | + ret = nfs_page_async_flush(&pgio, page, 0); | ||
9319 | + if (ret) { | ||
9320 | + nfs_set_pageerror(page); | ||
9321 | + dprintk("rewrite to MDS error = %d\n", ret); | ||
9322 | + } | ||
9323 | + unlock_page(page); | ||
9324 | + } | ||
9325 | } | ||
9326 | + if (data->pnfs_error) | ||
9327 | + nfs_pageio_complete(&pgio); | ||
9328 | nfs_writedata_release(calldata); | ||
9329 | } | ||
9330 | |||
9331 | @@ -1553,6 +1577,10 @@ static int nfs_commit_unstable_pages(struct inode *inode, struct writeback_contr | ||
9332 | int flags = FLUSH_SYNC; | ||
9333 | int ret = 0; | ||
9334 | |||
9335 | + /* no commits means nothing needs to be done */ | ||
9336 | + if (!nfsi->ncommit) | ||
9337 | + return ret; | ||
9338 | + | ||
9339 | if (wbc->sync_mode == WB_SYNC_NONE) { | ||
9340 | /* Don't commit yet if this is a non-blocking flush and there | ||
9341 | * are a lot of outstanding writes for this mapping. | ||
9342 | @@ -1686,34 +1714,20 @@ out_error: | ||
9343 | int nfs_migrate_page(struct address_space *mapping, struct page *newpage, | ||
9344 | struct page *page) | ||
9345 | { | ||
9346 | - struct nfs_page *req; | ||
9347 | - int ret; | ||
9348 | + /* | ||
9349 | + * If PagePrivate is set, then the page is currently associated with | ||
9350 | + * an in-progress read or write request. Don't try to migrate it. | ||
9351 | + * | ||
9352 | + * FIXME: we could do this in principle, but we'll need a way to ensure | ||
9353 | + * that we can safely release the inode reference while holding | ||
9354 | + * the page lock. | ||
9355 | + */ | ||
9356 | + if (PagePrivate(page)) | ||
9357 | + return -EBUSY; | ||
9358 | |||
9359 | nfs_fscache_release_page(page, GFP_KERNEL); | ||
9360 | |||
9361 | - req = nfs_find_and_lock_request(page, false); | ||
9362 | - ret = PTR_ERR(req); | ||
9363 | - if (IS_ERR(req)) | ||
9364 | - goto out; | ||
9365 | - | ||
9366 | - ret = migrate_page(mapping, newpage, page); | ||
9367 | - if (!req) | ||
9368 | - goto out; | ||
9369 | - if (ret) | ||
9370 | - goto out_unlock; | ||
9371 | - page_cache_get(newpage); | ||
9372 | - spin_lock(&mapping->host->i_lock); | ||
9373 | - req->wb_page = newpage; | ||
9374 | - SetPagePrivate(newpage); | ||
9375 | - set_page_private(newpage, (unsigned long)req); | ||
9376 | - ClearPagePrivate(page); | ||
9377 | - set_page_private(page, 0); | ||
9378 | - spin_unlock(&mapping->host->i_lock); | ||
9379 | - page_cache_release(page); | ||
9380 | -out_unlock: | ||
9381 | - nfs_clear_page_tag_locked(req); | ||
9382 | -out: | ||
9383 | - return ret; | ||
9384 | + return migrate_page(mapping, newpage, page); | ||
9385 | } | ||
9386 | #endif | ||
9387 | |||
9388 | diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c | ||
9389 | index e807776..05b397c 100644 | ||
9390 | --- a/fs/nfsd/nfs4proc.c | ||
9391 | +++ b/fs/nfsd/nfs4proc.c | ||
9392 | @@ -156,6 +156,8 @@ do_open_permission(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfs | ||
9393 | !(open->op_share_access & NFS4_SHARE_ACCESS_WRITE)) | ||
9394 | return nfserr_inval; | ||
9395 | |||
9396 | + accmode |= NFSD_MAY_READ_IF_EXEC; | ||
9397 | + | ||
9398 | if (open->op_share_access & NFS4_SHARE_ACCESS_READ) | ||
9399 | accmode |= NFSD_MAY_READ; | ||
9400 | if (open->op_share_access & NFS4_SHARE_ACCESS_WRITE) | ||
9401 | @@ -691,7 +693,7 @@ nfsd4_readdir(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | ||
9402 | readdir->rd_bmval[1] &= nfsd_suppattrs1(cstate->minorversion); | ||
9403 | readdir->rd_bmval[2] &= nfsd_suppattrs2(cstate->minorversion); | ||
9404 | |||
9405 | - if ((cookie > ~(u32)0) || (cookie == 1) || (cookie == 2) || | ||
9406 | + if ((cookie == 1) || (cookie == 2) || | ||
9407 | (cookie == 0 && memcmp(readdir->rd_verf.data, zeroverf.data, NFS4_VERIFIER_SIZE))) | ||
9408 | return nfserr_bad_cookie; | ||
9409 | |||
9410 | @@ -930,7 +932,7 @@ _nfsd4_verify(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | ||
9411 | count = 4 + (verify->ve_attrlen >> 2); | ||
9412 | buf = kmalloc(count << 2, GFP_KERNEL); | ||
9413 | if (!buf) | ||
9414 | - return nfserr_resource; | ||
9415 | + return nfserr_jukebox; | ||
9416 | |||
9417 | status = nfsd4_encode_fattr(&cstate->current_fh, | ||
9418 | cstate->current_fh.fh_export, | ||
9419 | diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c | ||
9420 | index 29d77f6..02eb38e 100644 | ||
9421 | --- a/fs/nfsd/nfs4recover.c | ||
9422 | +++ b/fs/nfsd/nfs4recover.c | ||
9423 | @@ -88,7 +88,7 @@ nfs4_make_rec_clidname(char *dname, struct xdr_netobj *clname) | ||
9424 | struct xdr_netobj cksum; | ||
9425 | struct hash_desc desc; | ||
9426 | struct scatterlist sg; | ||
9427 | - __be32 status = nfserr_resource; | ||
9428 | + __be32 status = nfserr_jukebox; | ||
9429 | |||
9430 | dprintk("NFSD: nfs4_make_rec_clidname for %.*s\n", | ||
9431 | clname->len, clname->data); | ||
9432 | diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c | ||
9433 | index 3787ec1..6f8bcc7 100644 | ||
9434 | --- a/fs/nfsd/nfs4state.c | ||
9435 | +++ b/fs/nfsd/nfs4state.c | ||
9436 | @@ -192,8 +192,15 @@ static void nfs4_file_put_fd(struct nfs4_file *fp, int oflag) | ||
9437 | static void __nfs4_file_put_access(struct nfs4_file *fp, int oflag) | ||
9438 | { | ||
9439 | if (atomic_dec_and_test(&fp->fi_access[oflag])) { | ||
9440 | - nfs4_file_put_fd(fp, O_RDWR); | ||
9441 | nfs4_file_put_fd(fp, oflag); | ||
9442 | + /* | ||
9443 | + * It's also safe to get rid of the RDWR open *if* | ||
9444 | + * we no longer have need of the other kind of access | ||
9445 | + * or if we already have the other kind of open: | ||
9446 | + */ | ||
9447 | + if (fp->fi_fds[1-oflag] | ||
9448 | + || atomic_read(&fp->fi_access[1 - oflag]) == 0) | ||
9449 | + nfs4_file_put_fd(fp, O_RDWR); | ||
9450 | } | ||
9451 | } | ||
9452 | |||
9453 | @@ -1946,7 +1953,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | ||
9454 | * of 5 bullet points, labeled as CASE0 - CASE4 below. | ||
9455 | */ | ||
9456 | unconf = find_unconfirmed_client_by_str(dname, strhashval); | ||
9457 | - status = nfserr_resource; | ||
9458 | + status = nfserr_jukebox; | ||
9459 | if (!conf) { | ||
9460 | /* | ||
9461 | * RFC 3530 14.2.33 CASE 4: | ||
9462 | @@ -2483,7 +2490,7 @@ renew: | ||
9463 | if (open->op_stateowner == NULL) { | ||
9464 | sop = alloc_init_open_stateowner(strhashval, clp, open); | ||
9465 | if (sop == NULL) | ||
9466 | - return nfserr_resource; | ||
9467 | + return nfserr_jukebox; | ||
9468 | open->op_stateowner = sop; | ||
9469 | } | ||
9470 | list_del_init(&sop->so_close_lru); | ||
9471 | @@ -2619,7 +2626,7 @@ nfs4_new_open(struct svc_rqst *rqstp, struct nfs4_stateid **stpp, | ||
9472 | |||
9473 | stp = nfs4_alloc_stateid(); | ||
9474 | if (stp == NULL) | ||
9475 | - return nfserr_resource; | ||
9476 | + return nfserr_jukebox; | ||
9477 | |||
9478 | status = nfs4_get_vfs_file(rqstp, fp, cur_fh, open); | ||
9479 | if (status) { | ||
9480 | @@ -2850,7 +2857,7 @@ nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nf | ||
9481 | status = nfserr_bad_stateid; | ||
9482 | if (open->op_claim_type == NFS4_OPEN_CLAIM_DELEGATE_CUR) | ||
9483 | goto out; | ||
9484 | - status = nfserr_resource; | ||
9485 | + status = nfserr_jukebox; | ||
9486 | fp = alloc_init_file(ino); | ||
9487 | if (fp == NULL) | ||
9488 | goto out; | ||
9489 | @@ -3530,8 +3537,9 @@ static inline void nfs4_file_downgrade(struct nfs4_stateid *stp, unsigned int to | ||
9490 | int i; | ||
9491 | |||
9492 | for (i = 1; i < 4; i++) { | ||
9493 | - if (test_bit(i, &stp->st_access_bmap) && !(i & to_access)) { | ||
9494 | - nfs4_file_put_access(stp->st_file, i); | ||
9495 | + if (test_bit(i, &stp->st_access_bmap) | ||
9496 | + && ((i & to_access) != i)) { | ||
9497 | + nfs4_file_put_access(stp->st_file, nfs4_access_to_omode(i)); | ||
9498 | __clear_bit(i, &stp->st_access_bmap); | ||
9499 | } | ||
9500 | } | ||
9501 | @@ -3562,6 +3570,8 @@ nfsd4_open_downgrade(struct svc_rqst *rqstp, | ||
9502 | if (!access_valid(od->od_share_access, cstate->minorversion) | ||
9503 | || !deny_valid(od->od_share_deny)) | ||
9504 | return nfserr_inval; | ||
9505 | + /* We don't yet support WANT bits: */ | ||
9506 | + od->od_share_access &= NFS4_SHARE_ACCESS_MASK; | ||
9507 | |||
9508 | nfs4_lock_state(); | ||
9509 | if ((status = nfs4_preprocess_seqid_op(cstate, | ||
9510 | @@ -4035,7 +4045,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | ||
9511 | /* XXX: Do we need to check for duplicate stateowners on | ||
9512 | * the same file, or should they just be allowed (and | ||
9513 | * create new stateids)? */ | ||
9514 | - status = nfserr_resource; | ||
9515 | + status = nfserr_jukebox; | ||
9516 | lock_sop = alloc_init_lock_stateowner(strhashval, | ||
9517 | open_sop->so_client, open_stp, lock); | ||
9518 | if (lock_sop == NULL) | ||
9519 | @@ -4119,9 +4129,9 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | ||
9520 | case (EDEADLK): | ||
9521 | status = nfserr_deadlock; | ||
9522 | break; | ||
9523 | - default: | ||
9524 | + default: | ||
9525 | dprintk("NFSD: nfsd4_lock: vfs_lock_file() failed! status %d\n",err); | ||
9526 | - status = nfserr_resource; | ||
9527 | + status = nfserrno(err); | ||
9528 | break; | ||
9529 | } | ||
9530 | out: | ||
9531 | diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c | ||
9532 | index c8bf405..f810996 100644 | ||
9533 | --- a/fs/nfsd/nfs4xdr.c | ||
9534 | +++ b/fs/nfsd/nfs4xdr.c | ||
9535 | @@ -1623,6 +1623,18 @@ static void write_cinfo(__be32 **p, struct nfsd4_change_info *c) | ||
9536 | \ | ||
9537 | save = resp->p; | ||
9538 | |||
9539 | +static bool seqid_mutating_err(__be32 err) | ||
9540 | +{ | ||
9541 | + /* rfc 3530 section 8.1.5: */ | ||
9542 | + return err != nfserr_stale_clientid && | ||
9543 | + err != nfserr_stale_stateid && | ||
9544 | + err != nfserr_bad_stateid && | ||
9545 | + err != nfserr_bad_seqid && | ||
9546 | + err != nfserr_bad_xdr && | ||
9547 | + err != nfserr_resource && | ||
9548 | + err != nfserr_nofilehandle; | ||
9549 | +} | ||
9550 | + | ||
9551 | /* | ||
9552 | * Routine for encoding the result of a "seqid-mutating" NFSv4 operation. This | ||
9553 | * is where sequence id's are incremented, and the replay cache is filled. | ||
9554 | diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h | ||
9555 | index 4eefaf1..5cfebe5 100644 | ||
9556 | --- a/fs/nfsd/state.h | ||
9557 | +++ b/fs/nfsd/state.h | ||
9558 | @@ -447,12 +447,6 @@ struct nfs4_stateid { | ||
9559 | #define WR_STATE 0x00000020 | ||
9560 | #define CLOSE_STATE 0x00000040 | ||
9561 | |||
9562 | -#define seqid_mutating_err(err) \ | ||
9563 | - (((err) != nfserr_stale_clientid) && \ | ||
9564 | - ((err) != nfserr_bad_seqid) && \ | ||
9565 | - ((err) != nfserr_stale_stateid) && \ | ||
9566 | - ((err) != nfserr_bad_stateid)) | ||
9567 | - | ||
9568 | struct nfsd4_compound_state; | ||
9569 | |||
9570 | extern __be32 nfs4_preprocess_stateid_op(struct nfsd4_compound_state *cstate, | ||
9571 | diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c | ||
9572 | index fd0acca..acf88ae 100644 | ||
9573 | --- a/fs/nfsd/vfs.c | ||
9574 | +++ b/fs/nfsd/vfs.c | ||
9575 | @@ -2114,7 +2114,8 @@ nfsd_permission(struct svc_rqst *rqstp, struct svc_export *exp, | ||
9576 | |||
9577 | /* Allow read access to binaries even when mode 111 */ | ||
9578 | if (err == -EACCES && S_ISREG(inode->i_mode) && | ||
9579 | - acc == (NFSD_MAY_READ | NFSD_MAY_OWNER_OVERRIDE)) | ||
9580 | + (acc == (NFSD_MAY_READ | NFSD_MAY_OWNER_OVERRIDE) || | ||
9581 | + acc == (NFSD_MAY_READ | NFSD_MAY_READ_IF_EXEC))) | ||
9582 | err = inode_permission(inode, MAY_EXEC); | ||
9583 | |||
9584 | return err? nfserrno(err) : 0; | ||
9585 | diff --git a/fs/nfsd/vfs.h b/fs/nfsd/vfs.h | ||
9586 | index e0bbac0..a22e40e 100644 | ||
9587 | --- a/fs/nfsd/vfs.h | ||
9588 | +++ b/fs/nfsd/vfs.h | ||
9589 | @@ -25,6 +25,7 @@ | ||
9590 | #define NFSD_MAY_BYPASS_GSS_ON_ROOT 256 | ||
9591 | #define NFSD_MAY_NOT_BREAK_LEASE 512 | ||
9592 | #define NFSD_MAY_BYPASS_GSS 1024 | ||
9593 | +#define NFSD_MAY_READ_IF_EXEC 2048 | ||
9594 | |||
9595 | #define NFSD_MAY_CREATE (NFSD_MAY_EXEC|NFSD_MAY_WRITE) | ||
9596 | #define NFSD_MAY_REMOVE (NFSD_MAY_EXEC|NFSD_MAY_WRITE|NFSD_MAY_TRUNC) | ||
9597 | diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c | ||
9598 | index 5afaa58..c7d4ee6 100644 | ||
9599 | --- a/fs/proc/task_mmu.c | ||
9600 | +++ b/fs/proc/task_mmu.c | ||
9601 | @@ -1039,6 +1039,9 @@ static int show_numa_map(struct seq_file *m, void *v) | ||
9602 | seq_printf(m, " stack"); | ||
9603 | } | ||
9604 | |||
9605 | + if (is_vm_hugetlb_page(vma)) | ||
9606 | + seq_printf(m, " huge"); | ||
9607 | + | ||
9608 | walk_page_range(vma->vm_start, vma->vm_end, &walk); | ||
9609 | |||
9610 | if (!md->pages) | ||
9611 | diff --git a/fs/stat.c b/fs/stat.c | ||
9612 | index 78a3aa8..8806b89 100644 | ||
9613 | --- a/fs/stat.c | ||
9614 | +++ b/fs/stat.c | ||
9615 | @@ -294,15 +294,16 @@ SYSCALL_DEFINE4(readlinkat, int, dfd, const char __user *, pathname, | ||
9616 | { | ||
9617 | struct path path; | ||
9618 | int error; | ||
9619 | + int empty = 0; | ||
9620 | |||
9621 | if (bufsiz <= 0) | ||
9622 | return -EINVAL; | ||
9623 | |||
9624 | - error = user_path_at(dfd, pathname, LOOKUP_EMPTY, &path); | ||
9625 | + error = user_path_at_empty(dfd, pathname, LOOKUP_EMPTY, &path, &empty); | ||
9626 | if (!error) { | ||
9627 | struct inode *inode = path.dentry->d_inode; | ||
9628 | |||
9629 | - error = -EINVAL; | ||
9630 | + error = empty ? -ENOENT : -EINVAL; | ||
9631 | if (inode->i_op->readlink) { | ||
9632 | error = security_inode_readlink(path.dentry); | ||
9633 | if (!error) { | ||
9634 | diff --git a/fs/statfs.c b/fs/statfs.c | ||
9635 | index 8244924..9cf04a1 100644 | ||
9636 | --- a/fs/statfs.c | ||
9637 | +++ b/fs/statfs.c | ||
9638 | @@ -76,7 +76,7 @@ EXPORT_SYMBOL(vfs_statfs); | ||
9639 | int user_statfs(const char __user *pathname, struct kstatfs *st) | ||
9640 | { | ||
9641 | struct path path; | ||
9642 | - int error = user_path(pathname, &path); | ||
9643 | + int error = user_path_at(AT_FDCWD, pathname, LOOKUP_FOLLOW|LOOKUP_AUTOMOUNT, &path); | ||
9644 | if (!error) { | ||
9645 | error = vfs_statfs(&path, st); | ||
9646 | path_put(&path); | ||
9647 | diff --git a/include/acpi/acpi_drivers.h b/include/acpi/acpi_drivers.h | ||
9648 | index e49c36d..bb145e4 100644 | ||
9649 | --- a/include/acpi/acpi_drivers.h | ||
9650 | +++ b/include/acpi/acpi_drivers.h | ||
9651 | @@ -144,7 +144,7 @@ static inline void unregister_dock_notifier(struct notifier_block *nb) | ||
9652 | { | ||
9653 | } | ||
9654 | static inline int register_hotplug_dock_device(acpi_handle handle, | ||
9655 | - struct acpi_dock_ops *ops, | ||
9656 | + const struct acpi_dock_ops *ops, | ||
9657 | void *context) | ||
9658 | { | ||
9659 | return -ENODEV; | ||
9660 | diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h | ||
9661 | index 91567bb..03eb1d6 100644 | ||
9662 | --- a/include/drm/drm_dp_helper.h | ||
9663 | +++ b/include/drm/drm_dp_helper.h | ||
9664 | @@ -72,6 +72,7 @@ | ||
9665 | |||
9666 | #define DP_MAIN_LINK_CHANNEL_CODING 0x006 | ||
9667 | |||
9668 | +#define DP_EDP_CONFIGURATION_CAP 0x00d | ||
9669 | #define DP_TRAINING_AUX_RD_INTERVAL 0x00e | ||
9670 | |||
9671 | /* link configuration */ | ||
9672 | @@ -133,6 +134,8 @@ | ||
9673 | #define DP_MAIN_LINK_CHANNEL_CODING_SET 0x108 | ||
9674 | # define DP_SET_ANSI_8B10B (1 << 0) | ||
9675 | |||
9676 | +#define DP_EDP_CONFIGURATION_SET 0x10a | ||
9677 | + | ||
9678 | #define DP_LANE0_1_STATUS 0x202 | ||
9679 | #define DP_LANE2_3_STATUS 0x203 | ||
9680 | # define DP_LANE_CR_DONE (1 << 0) | ||
9681 | diff --git a/include/linux/ext2_fs.h b/include/linux/ext2_fs.h | ||
9682 | index 53792bf..ce1b719 100644 | ||
9683 | --- a/include/linux/ext2_fs.h | ||
9684 | +++ b/include/linux/ext2_fs.h | ||
9685 | @@ -197,8 +197,8 @@ struct ext2_group_desc | ||
9686 | |||
9687 | /* Flags that should be inherited by new inodes from their parent. */ | ||
9688 | #define EXT2_FL_INHERITED (EXT2_SECRM_FL | EXT2_UNRM_FL | EXT2_COMPR_FL |\ | ||
9689 | - EXT2_SYNC_FL | EXT2_IMMUTABLE_FL | EXT2_APPEND_FL |\ | ||
9690 | - EXT2_NODUMP_FL | EXT2_NOATIME_FL | EXT2_COMPRBLK_FL|\ | ||
9691 | + EXT2_SYNC_FL | EXT2_NODUMP_FL |\ | ||
9692 | + EXT2_NOATIME_FL | EXT2_COMPRBLK_FL |\ | ||
9693 | EXT2_NOCOMP_FL | EXT2_JOURNAL_DATA_FL |\ | ||
9694 | EXT2_NOTAIL_FL | EXT2_DIRSYNC_FL) | ||
9695 | |||
9696 | diff --git a/include/linux/ext3_fs.h b/include/linux/ext3_fs.h | ||
9697 | index 67a803a..0244611 100644 | ||
9698 | --- a/include/linux/ext3_fs.h | ||
9699 | +++ b/include/linux/ext3_fs.h | ||
9700 | @@ -180,8 +180,8 @@ struct ext3_group_desc | ||
9701 | |||
9702 | /* Flags that should be inherited by new inodes from their parent. */ | ||
9703 | #define EXT3_FL_INHERITED (EXT3_SECRM_FL | EXT3_UNRM_FL | EXT3_COMPR_FL |\ | ||
9704 | - EXT3_SYNC_FL | EXT3_IMMUTABLE_FL | EXT3_APPEND_FL |\ | ||
9705 | - EXT3_NODUMP_FL | EXT3_NOATIME_FL | EXT3_COMPRBLK_FL|\ | ||
9706 | + EXT3_SYNC_FL | EXT3_NODUMP_FL |\ | ||
9707 | + EXT3_NOATIME_FL | EXT3_COMPRBLK_FL |\ | ||
9708 | EXT3_NOCOMPR_FL | EXT3_JOURNAL_DATA_FL |\ | ||
9709 | EXT3_NOTAIL_FL | EXT3_DIRSYNC_FL) | ||
9710 | |||
9711 | diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h | ||
9712 | index a103732..f51a81b 100644 | ||
9713 | --- a/include/linux/interrupt.h | ||
9714 | +++ b/include/linux/interrupt.h | ||
9715 | @@ -59,6 +59,8 @@ | ||
9716 | * IRQF_NO_SUSPEND - Do not disable this IRQ during suspend | ||
9717 | * IRQF_FORCE_RESUME - Force enable it on resume even if IRQF_NO_SUSPEND is set | ||
9718 | * IRQF_NO_THREAD - Interrupt cannot be threaded | ||
9719 | + * IRQF_EARLY_RESUME - Resume IRQ early during syscore instead of at device | ||
9720 | + * resume time. | ||
9721 | */ | ||
9722 | #define IRQF_DISABLED 0x00000020 | ||
9723 | #define IRQF_SAMPLE_RANDOM 0x00000040 | ||
9724 | @@ -72,6 +74,7 @@ | ||
9725 | #define IRQF_NO_SUSPEND 0x00004000 | ||
9726 | #define IRQF_FORCE_RESUME 0x00008000 | ||
9727 | #define IRQF_NO_THREAD 0x00010000 | ||
9728 | +#define IRQF_EARLY_RESUME 0x00020000 | ||
9729 | |||
9730 | #define IRQF_TIMER (__IRQF_TIMER | IRQF_NO_SUSPEND | IRQF_NO_THREAD) | ||
9731 | |||
9732 | diff --git a/include/linux/io-mapping.h b/include/linux/io-mapping.h | ||
9733 | index 8cdcc2a1..1feeb52 100644 | ||
9734 | --- a/include/linux/io-mapping.h | ||
9735 | +++ b/include/linux/io-mapping.h | ||
9736 | @@ -117,6 +117,8 @@ io_mapping_unmap(void __iomem *vaddr) | ||
9737 | |||
9738 | #else | ||
9739 | |||
9740 | +#include <linux/uaccess.h> | ||
9741 | + | ||
9742 | /* this struct isn't actually defined anywhere */ | ||
9743 | struct io_mapping; | ||
9744 | |||
9745 | @@ -138,12 +140,14 @@ static inline void __iomem * | ||
9746 | io_mapping_map_atomic_wc(struct io_mapping *mapping, | ||
9747 | unsigned long offset) | ||
9748 | { | ||
9749 | + pagefault_disable(); | ||
9750 | return ((char __force __iomem *) mapping) + offset; | ||
9751 | } | ||
9752 | |||
9753 | static inline void | ||
9754 | io_mapping_unmap_atomic(void __iomem *vaddr) | ||
9755 | { | ||
9756 | + pagefault_enable(); | ||
9757 | } | ||
9758 | |||
9759 | /* Non-atomic map/unmap */ | ||
9760 | diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h | ||
9761 | index f97672a..265e2c3 100644 | ||
9762 | --- a/include/linux/jiffies.h | ||
9763 | +++ b/include/linux/jiffies.h | ||
9764 | @@ -303,7 +303,7 @@ extern void jiffies_to_timespec(const unsigned long jiffies, | ||
9765 | extern unsigned long timeval_to_jiffies(const struct timeval *value); | ||
9766 | extern void jiffies_to_timeval(const unsigned long jiffies, | ||
9767 | struct timeval *value); | ||
9768 | -extern clock_t jiffies_to_clock_t(long x); | ||
9769 | +extern clock_t jiffies_to_clock_t(unsigned long x); | ||
9770 | extern unsigned long clock_t_to_jiffies(unsigned long x); | ||
9771 | extern u64 jiffies_64_to_clock_t(u64 x); | ||
9772 | extern u64 nsec_to_clock_t(u64 x); | ||
9773 | diff --git a/include/linux/mm.h b/include/linux/mm.h | ||
9774 | index 7438071..fedc5f0 100644 | ||
9775 | --- a/include/linux/mm.h | ||
9776 | +++ b/include/linux/mm.h | ||
9777 | @@ -356,36 +356,50 @@ static inline struct page *compound_head(struct page *page) | ||
9778 | return page; | ||
9779 | } | ||
9780 | |||
9781 | +/* | ||
9782 | + * The atomic page->_mapcount, starts from -1: so that transitions | ||
9783 | + * both from it and to it can be tracked, using atomic_inc_and_test | ||
9784 | + * and atomic_add_negative(-1). | ||
9785 | + */ | ||
9786 | +static inline void reset_page_mapcount(struct page *page) | ||
9787 | +{ | ||
9788 | + atomic_set(&(page)->_mapcount, -1); | ||
9789 | +} | ||
9790 | + | ||
9791 | +static inline int page_mapcount(struct page *page) | ||
9792 | +{ | ||
9793 | + return atomic_read(&(page)->_mapcount) + 1; | ||
9794 | +} | ||
9795 | + | ||
9796 | static inline int page_count(struct page *page) | ||
9797 | { | ||
9798 | return atomic_read(&compound_head(page)->_count); | ||
9799 | } | ||
9800 | |||
9801 | +static inline void get_huge_page_tail(struct page *page) | ||
9802 | +{ | ||
9803 | + /* | ||
9804 | + * __split_huge_page_refcount() cannot run | ||
9805 | + * from under us. | ||
9806 | + */ | ||
9807 | + VM_BUG_ON(page_mapcount(page) < 0); | ||
9808 | + VM_BUG_ON(atomic_read(&page->_count) != 0); | ||
9809 | + atomic_inc(&page->_mapcount); | ||
9810 | +} | ||
9811 | + | ||
9812 | +extern bool __get_page_tail(struct page *page); | ||
9813 | + | ||
9814 | static inline void get_page(struct page *page) | ||
9815 | { | ||
9816 | + if (unlikely(PageTail(page))) | ||
9817 | + if (likely(__get_page_tail(page))) | ||
9818 | + return; | ||
9819 | /* | ||
9820 | * Getting a normal page or the head of a compound page | ||
9821 | - * requires to already have an elevated page->_count. Only if | ||
9822 | - * we're getting a tail page, the elevated page->_count is | ||
9823 | - * required only in the head page, so for tail pages the | ||
9824 | - * bugcheck only verifies that the page->_count isn't | ||
9825 | - * negative. | ||
9826 | + * requires to already have an elevated page->_count. | ||
9827 | */ | ||
9828 | - VM_BUG_ON(atomic_read(&page->_count) < !PageTail(page)); | ||
9829 | + VM_BUG_ON(atomic_read(&page->_count) <= 0); | ||
9830 | atomic_inc(&page->_count); | ||
9831 | - /* | ||
9832 | - * Getting a tail page will elevate both the head and tail | ||
9833 | - * page->_count(s). | ||
9834 | - */ | ||
9835 | - if (unlikely(PageTail(page))) { | ||
9836 | - /* | ||
9837 | - * This is safe only because | ||
9838 | - * __split_huge_page_refcount can't run under | ||
9839 | - * get_page(). | ||
9840 | - */ | ||
9841 | - VM_BUG_ON(atomic_read(&page->first_page->_count) <= 0); | ||
9842 | - atomic_inc(&page->first_page->_count); | ||
9843 | - } | ||
9844 | } | ||
9845 | |||
9846 | static inline struct page *virt_to_head_page(const void *x) | ||
9847 | @@ -804,21 +818,6 @@ static inline pgoff_t page_index(struct page *page) | ||
9848 | } | ||
9849 | |||
9850 | /* | ||
9851 | - * The atomic page->_mapcount, like _count, starts from -1: | ||
9852 | - * so that transitions both from it and to it can be tracked, | ||
9853 | - * using atomic_inc_and_test and atomic_add_negative(-1). | ||
9854 | - */ | ||
9855 | -static inline void reset_page_mapcount(struct page *page) | ||
9856 | -{ | ||
9857 | - atomic_set(&(page)->_mapcount, -1); | ||
9858 | -} | ||
9859 | - | ||
9860 | -static inline int page_mapcount(struct page *page) | ||
9861 | -{ | ||
9862 | - return atomic_read(&(page)->_mapcount) + 1; | ||
9863 | -} | ||
9864 | - | ||
9865 | -/* | ||
9866 | * Return true if this page is mapped into pagetables. | ||
9867 | */ | ||
9868 | static inline int page_mapped(struct page *page) | ||
9869 | diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h | ||
9870 | index 774b895..10a2f62 100644 | ||
9871 | --- a/include/linux/mm_types.h | ||
9872 | +++ b/include/linux/mm_types.h | ||
9873 | @@ -62,10 +62,23 @@ struct page { | ||
9874 | struct { | ||
9875 | |||
9876 | union { | ||
9877 | - atomic_t _mapcount; /* Count of ptes mapped in mms, | ||
9878 | - * to show when page is mapped | ||
9879 | - * & limit reverse map searches. | ||
9880 | - */ | ||
9881 | + /* | ||
9882 | + * Count of ptes mapped in | ||
9883 | + * mms, to show when page is | ||
9884 | + * mapped & limit reverse map | ||
9885 | + * searches. | ||
9886 | + * | ||
9887 | + * Used also for tail pages | ||
9888 | + * refcounting instead of | ||
9889 | + * _count. Tail pages cannot | ||
9890 | + * be mapped and keeping the | ||
9891 | + * tail page _count zero at | ||
9892 | + * all times guarantees | ||
9893 | + * get_page_unless_zero() will | ||
9894 | + * never succeed on tail | ||
9895 | + * pages. | ||
9896 | + */ | ||
9897 | + atomic_t _mapcount; | ||
9898 | |||
9899 | struct { | ||
9900 | unsigned inuse:16; | ||
9901 | diff --git a/include/linux/namei.h b/include/linux/namei.h | ||
9902 | index 409328d..ffc0213 100644 | ||
9903 | --- a/include/linux/namei.h | ||
9904 | +++ b/include/linux/namei.h | ||
9905 | @@ -67,6 +67,7 @@ enum {LAST_NORM, LAST_ROOT, LAST_DOT, LAST_DOTDOT, LAST_BIND}; | ||
9906 | #define LOOKUP_EMPTY 0x4000 | ||
9907 | |||
9908 | extern int user_path_at(int, const char __user *, unsigned, struct path *); | ||
9909 | +extern int user_path_at_empty(int, const char __user *, unsigned, struct path *, int *empty); | ||
9910 | |||
9911 | #define user_path(name, path) user_path_at(AT_FDCWD, name, LOOKUP_FOLLOW, path) | ||
9912 | #define user_lpath(name, path) user_path_at(AT_FDCWD, name, 0, path) | ||
9913 | diff --git a/include/linux/phy.h b/include/linux/phy.h | ||
9914 | index 54fc413..79f337c 100644 | ||
9915 | --- a/include/linux/phy.h | ||
9916 | +++ b/include/linux/phy.h | ||
9917 | @@ -420,7 +420,7 @@ struct phy_driver { | ||
9918 | |||
9919 | /* | ||
9920 | * Requests a Tx timestamp for 'skb'. The phy driver promises | ||
9921 | - * to deliver it to the socket's error queue as soon as a | ||
9922 | + * to deliver it using skb_complete_tx_timestamp() as soon as a | ||
9923 | * timestamp becomes available. One of the PTP_CLASS_ values | ||
9924 | * is passed in 'type'. | ||
9925 | */ | ||
9926 | diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h | ||
9927 | index 8bd383c..0f96646 100644 | ||
9928 | --- a/include/linux/skbuff.h | ||
9929 | +++ b/include/linux/skbuff.h | ||
9930 | @@ -2020,8 +2020,13 @@ static inline bool skb_defer_rx_timestamp(struct sk_buff *skb) | ||
9931 | /** | ||
9932 | * skb_complete_tx_timestamp() - deliver cloned skb with tx timestamps | ||
9933 | * | ||
9934 | + * PHY drivers may accept clones of transmitted packets for | ||
9935 | + * timestamping via their phy_driver.txtstamp method. These drivers | ||
9936 | + * must call this function to return the skb back to the stack, with | ||
9937 | + * or without a timestamp. | ||
9938 | + * | ||
9939 | * @skb: clone of the the original outgoing packet | ||
9940 | - * @hwtstamps: hardware time stamps | ||
9941 | + * @hwtstamps: hardware time stamps, may be NULL if not available | ||
9942 | * | ||
9943 | */ | ||
9944 | void skb_complete_tx_timestamp(struct sk_buff *skb, | ||
9945 | diff --git a/include/linux/sunrpc/rpc_pipe_fs.h b/include/linux/sunrpc/rpc_pipe_fs.h | ||
9946 | index cf14db9..e4ea430 100644 | ||
9947 | --- a/include/linux/sunrpc/rpc_pipe_fs.h | ||
9948 | +++ b/include/linux/sunrpc/rpc_pipe_fs.h | ||
9949 | @@ -44,6 +44,8 @@ RPC_I(struct inode *inode) | ||
9950 | return container_of(inode, struct rpc_inode, vfs_inode); | ||
9951 | } | ||
9952 | |||
9953 | +extern ssize_t rpc_pipe_generic_upcall(struct file *, struct rpc_pipe_msg *, | ||
9954 | + char __user *, size_t); | ||
9955 | extern int rpc_queue_upcall(struct inode *, struct rpc_pipe_msg *); | ||
9956 | |||
9957 | struct rpc_clnt; | ||
9958 | diff --git a/include/linux/tty.h b/include/linux/tty.h | ||
9959 | index 5f2ede8..d553ea4 100644 | ||
9960 | --- a/include/linux/tty.h | ||
9961 | +++ b/include/linux/tty.h | ||
9962 | @@ -473,7 +473,9 @@ extern void proc_clear_tty(struct task_struct *p); | ||
9963 | extern struct tty_struct *get_current_tty(void); | ||
9964 | extern void tty_default_fops(struct file_operations *fops); | ||
9965 | extern struct tty_struct *alloc_tty_struct(void); | ||
9966 | -extern int tty_add_file(struct tty_struct *tty, struct file *file); | ||
9967 | +extern int tty_alloc_file(struct file *file); | ||
9968 | +extern void tty_add_file(struct tty_struct *tty, struct file *file); | ||
9969 | +extern void tty_free_file(struct file *file); | ||
9970 | extern void free_tty_struct(struct tty_struct *tty); | ||
9971 | extern void initialize_tty_struct(struct tty_struct *tty, | ||
9972 | struct tty_driver *driver, int idx); | ||
9973 | diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h | ||
9974 | index 0097136..c0ecc5a 100644 | ||
9975 | --- a/include/linux/usb/hcd.h | ||
9976 | +++ b/include/linux/usb/hcd.h | ||
9977 | @@ -178,7 +178,7 @@ struct usb_hcd { | ||
9978 | * this structure. | ||
9979 | */ | ||
9980 | unsigned long hcd_priv[0] | ||
9981 | - __attribute__ ((aligned(sizeof(unsigned long)))); | ||
9982 | + __attribute__ ((aligned(sizeof(s64)))); | ||
9983 | }; | ||
9984 | |||
9985 | /* 2.4 does this a bit differently ... */ | ||
9986 | diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h | ||
9987 | index 9332e52..687fb11 100644 | ||
9988 | --- a/include/linux/vmalloc.h | ||
9989 | +++ b/include/linux/vmalloc.h | ||
9990 | @@ -13,6 +13,7 @@ struct vm_area_struct; /* vma defining user mapping in mm_types.h */ | ||
9991 | #define VM_MAP 0x00000004 /* vmap()ed pages */ | ||
9992 | #define VM_USERMAP 0x00000008 /* suitable for remap_vmalloc_range */ | ||
9993 | #define VM_VPAGES 0x00000010 /* buffer for pages was vmalloc'ed */ | ||
9994 | +#define VM_UNLIST 0x00000020 /* vm_struct is not listed in vmlist */ | ||
9995 | /* bits [20..32] reserved for arch specific ioremap internals */ | ||
9996 | |||
9997 | /* | ||
9998 | diff --git a/kernel/irq/pm.c b/kernel/irq/pm.c | ||
9999 | index f76fc00..15e53b1 100644 | ||
10000 | --- a/kernel/irq/pm.c | ||
10001 | +++ b/kernel/irq/pm.c | ||
10002 | @@ -9,6 +9,7 @@ | ||
10003 | #include <linux/irq.h> | ||
10004 | #include <linux/module.h> | ||
10005 | #include <linux/interrupt.h> | ||
10006 | +#include <linux/syscore_ops.h> | ||
10007 | |||
10008 | #include "internals.h" | ||
10009 | |||
10010 | @@ -39,25 +40,58 @@ void suspend_device_irqs(void) | ||
10011 | } | ||
10012 | EXPORT_SYMBOL_GPL(suspend_device_irqs); | ||
10013 | |||
10014 | -/** | ||
10015 | - * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs() | ||
10016 | - * | ||
10017 | - * Enable all interrupt lines previously disabled by suspend_device_irqs() that | ||
10018 | - * have the IRQS_SUSPENDED flag set. | ||
10019 | - */ | ||
10020 | -void resume_device_irqs(void) | ||
10021 | +static void resume_irqs(bool want_early) | ||
10022 | { | ||
10023 | struct irq_desc *desc; | ||
10024 | int irq; | ||
10025 | |||
10026 | for_each_irq_desc(irq, desc) { | ||
10027 | unsigned long flags; | ||
10028 | + bool is_early = desc->action && | ||
10029 | + desc->action->flags & IRQF_EARLY_RESUME; | ||
10030 | + | ||
10031 | + if (is_early != want_early) | ||
10032 | + continue; | ||
10033 | |||
10034 | raw_spin_lock_irqsave(&desc->lock, flags); | ||
10035 | __enable_irq(desc, irq, true); | ||
10036 | raw_spin_unlock_irqrestore(&desc->lock, flags); | ||
10037 | } | ||
10038 | } | ||
10039 | + | ||
10040 | +/** | ||
10041 | + * irq_pm_syscore_ops - enable interrupt lines early | ||
10042 | + * | ||
10043 | + * Enable all interrupt lines with %IRQF_EARLY_RESUME set. | ||
10044 | + */ | ||
10045 | +static void irq_pm_syscore_resume(void) | ||
10046 | +{ | ||
10047 | + resume_irqs(true); | ||
10048 | +} | ||
10049 | + | ||
10050 | +static struct syscore_ops irq_pm_syscore_ops = { | ||
10051 | + .resume = irq_pm_syscore_resume, | ||
10052 | +}; | ||
10053 | + | ||
10054 | +static int __init irq_pm_init_ops(void) | ||
10055 | +{ | ||
10056 | + register_syscore_ops(&irq_pm_syscore_ops); | ||
10057 | + return 0; | ||
10058 | +} | ||
10059 | + | ||
10060 | +device_initcall(irq_pm_init_ops); | ||
10061 | + | ||
10062 | +/** | ||
10063 | + * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs() | ||
10064 | + * | ||
10065 | + * Enable all non-%IRQF_EARLY_RESUME interrupt lines previously | ||
10066 | + * disabled by suspend_device_irqs() that have the IRQS_SUSPENDED flag | ||
10067 | + * set as well as those with %IRQF_FORCE_RESUME. | ||
10068 | + */ | ||
10069 | +void resume_device_irqs(void) | ||
10070 | +{ | ||
10071 | + resume_irqs(false); | ||
10072 | +} | ||
10073 | EXPORT_SYMBOL_GPL(resume_device_irqs); | ||
10074 | |||
10075 | /** | ||
10076 | diff --git a/kernel/kmod.c b/kernel/kmod.c | ||
10077 | index ddc7644..a4bea97 100644 | ||
10078 | --- a/kernel/kmod.c | ||
10079 | +++ b/kernel/kmod.c | ||
10080 | @@ -114,10 +114,12 @@ int __request_module(bool wait, const char *fmt, ...) | ||
10081 | atomic_inc(&kmod_concurrent); | ||
10082 | if (atomic_read(&kmod_concurrent) > max_modprobes) { | ||
10083 | /* We may be blaming an innocent here, but unlikely */ | ||
10084 | - if (kmod_loop_msg++ < 5) | ||
10085 | + if (kmod_loop_msg < 5) { | ||
10086 | printk(KERN_ERR | ||
10087 | "request_module: runaway loop modprobe %s\n", | ||
10088 | module_name); | ||
10089 | + kmod_loop_msg++; | ||
10090 | + } | ||
10091 | atomic_dec(&kmod_concurrent); | ||
10092 | return -ENOMEM; | ||
10093 | } | ||
10094 | diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c | ||
10095 | index b6b71ad..d3caa76 100644 | ||
10096 | --- a/kernel/power/suspend.c | ||
10097 | +++ b/kernel/power/suspend.c | ||
10098 | @@ -315,7 +315,7 @@ int enter_state(suspend_state_t state) | ||
10099 | */ | ||
10100 | int pm_suspend(suspend_state_t state) | ||
10101 | { | ||
10102 | - if (state > PM_SUSPEND_ON && state <= PM_SUSPEND_MAX) | ||
10103 | + if (state > PM_SUSPEND_ON && state < PM_SUSPEND_MAX) | ||
10104 | return enter_state(state); | ||
10105 | return -EINVAL; | ||
10106 | } | ||
10107 | diff --git a/kernel/time.c b/kernel/time.c | ||
10108 | index 8e8dc6d..d776062 100644 | ||
10109 | --- a/kernel/time.c | ||
10110 | +++ b/kernel/time.c | ||
10111 | @@ -575,7 +575,7 @@ EXPORT_SYMBOL(jiffies_to_timeval); | ||
10112 | /* | ||
10113 | * Convert jiffies/jiffies_64 to clock_t and back. | ||
10114 | */ | ||
10115 | -clock_t jiffies_to_clock_t(long x) | ||
10116 | +clock_t jiffies_to_clock_t(unsigned long x) | ||
10117 | { | ||
10118 | #if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0 | ||
10119 | # if HZ < USER_HZ | ||
10120 | diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c | ||
10121 | index e5df02c..17a2d44 100644 | ||
10122 | --- a/kernel/trace/trace.c | ||
10123 | +++ b/kernel/trace/trace.c | ||
10124 | @@ -3808,8 +3808,6 @@ tracing_buffers_read(struct file *filp, char __user *ubuf, | ||
10125 | if (info->read < PAGE_SIZE) | ||
10126 | goto read; | ||
10127 | |||
10128 | - info->read = 0; | ||
10129 | - | ||
10130 | trace_access_lock(info->cpu); | ||
10131 | ret = ring_buffer_read_page(info->tr->buffer, | ||
10132 | &info->spare, | ||
10133 | @@ -3819,6 +3817,8 @@ tracing_buffers_read(struct file *filp, char __user *ubuf, | ||
10134 | if (ret < 0) | ||
10135 | return 0; | ||
10136 | |||
10137 | + info->read = 0; | ||
10138 | + | ||
10139 | read: | ||
10140 | size = PAGE_SIZE - info->read; | ||
10141 | if (size > count) | ||
10142 | diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c | ||
10143 | index 5fb3697..00d527c 100644 | ||
10144 | --- a/kernel/trace/trace_kprobe.c | ||
10145 | +++ b/kernel/trace/trace_kprobe.c | ||
10146 | @@ -836,11 +836,17 @@ static void __unregister_trace_probe(struct trace_probe *tp) | ||
10147 | } | ||
10148 | |||
10149 | /* Unregister a trace_probe and probe_event: call with locking probe_lock */ | ||
10150 | -static void unregister_trace_probe(struct trace_probe *tp) | ||
10151 | +static int unregister_trace_probe(struct trace_probe *tp) | ||
10152 | { | ||
10153 | + /* Enabled event can not be unregistered */ | ||
10154 | + if (trace_probe_is_enabled(tp)) | ||
10155 | + return -EBUSY; | ||
10156 | + | ||
10157 | __unregister_trace_probe(tp); | ||
10158 | list_del(&tp->list); | ||
10159 | unregister_probe_event(tp); | ||
10160 | + | ||
10161 | + return 0; | ||
10162 | } | ||
10163 | |||
10164 | /* Register a trace_probe and probe_event */ | ||
10165 | @@ -854,7 +860,9 @@ static int register_trace_probe(struct trace_probe *tp) | ||
10166 | /* Delete old (same name) event if exist */ | ||
10167 | old_tp = find_trace_probe(tp->call.name, tp->call.class->system); | ||
10168 | if (old_tp) { | ||
10169 | - unregister_trace_probe(old_tp); | ||
10170 | + ret = unregister_trace_probe(old_tp); | ||
10171 | + if (ret < 0) | ||
10172 | + goto end; | ||
10173 | free_trace_probe(old_tp); | ||
10174 | } | ||
10175 | |||
10176 | @@ -892,6 +900,7 @@ static int trace_probe_module_callback(struct notifier_block *nb, | ||
10177 | mutex_lock(&probe_lock); | ||
10178 | list_for_each_entry(tp, &probe_list, list) { | ||
10179 | if (trace_probe_within_module(tp, mod)) { | ||
10180 | + /* Don't need to check busy - this should have gone. */ | ||
10181 | __unregister_trace_probe(tp); | ||
10182 | ret = __register_trace_probe(tp); | ||
10183 | if (ret) | ||
10184 | @@ -1205,10 +1214,11 @@ static int create_trace_probe(int argc, char **argv) | ||
10185 | return -ENOENT; | ||
10186 | } | ||
10187 | /* delete an event */ | ||
10188 | - unregister_trace_probe(tp); | ||
10189 | - free_trace_probe(tp); | ||
10190 | + ret = unregister_trace_probe(tp); | ||
10191 | + if (ret == 0) | ||
10192 | + free_trace_probe(tp); | ||
10193 | mutex_unlock(&probe_lock); | ||
10194 | - return 0; | ||
10195 | + return ret; | ||
10196 | } | ||
10197 | |||
10198 | if (argc < 2) { | ||
10199 | @@ -1317,18 +1327,29 @@ error: | ||
10200 | return ret; | ||
10201 | } | ||
10202 | |||
10203 | -static void release_all_trace_probes(void) | ||
10204 | +static int release_all_trace_probes(void) | ||
10205 | { | ||
10206 | struct trace_probe *tp; | ||
10207 | + int ret = 0; | ||
10208 | |||
10209 | mutex_lock(&probe_lock); | ||
10210 | + /* Ensure no probe is in use. */ | ||
10211 | + list_for_each_entry(tp, &probe_list, list) | ||
10212 | + if (trace_probe_is_enabled(tp)) { | ||
10213 | + ret = -EBUSY; | ||
10214 | + goto end; | ||
10215 | + } | ||
10216 | /* TODO: Use batch unregistration */ | ||
10217 | while (!list_empty(&probe_list)) { | ||
10218 | tp = list_entry(probe_list.next, struct trace_probe, list); | ||
10219 | unregister_trace_probe(tp); | ||
10220 | free_trace_probe(tp); | ||
10221 | } | ||
10222 | + | ||
10223 | +end: | ||
10224 | mutex_unlock(&probe_lock); | ||
10225 | + | ||
10226 | + return ret; | ||
10227 | } | ||
10228 | |||
10229 | /* Probes listing interfaces */ | ||
10230 | @@ -1380,9 +1401,13 @@ static const struct seq_operations probes_seq_op = { | ||
10231 | |||
10232 | static int probes_open(struct inode *inode, struct file *file) | ||
10233 | { | ||
10234 | - if ((file->f_mode & FMODE_WRITE) && | ||
10235 | - (file->f_flags & O_TRUNC)) | ||
10236 | - release_all_trace_probes(); | ||
10237 | + int ret; | ||
10238 | + | ||
10239 | + if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) { | ||
10240 | + ret = release_all_trace_probes(); | ||
10241 | + if (ret < 0) | ||
10242 | + return ret; | ||
10243 | + } | ||
10244 | |||
10245 | return seq_open(file, &probes_seq_op); | ||
10246 | } | ||
10247 | @@ -2055,6 +2080,21 @@ static __init int kprobe_trace_self_tests_init(void) | ||
10248 | |||
10249 | ret = target(1, 2, 3, 4, 5, 6); | ||
10250 | |||
10251 | + /* Disable trace points before removing it */ | ||
10252 | + tp = find_trace_probe("testprobe", KPROBE_EVENT_SYSTEM); | ||
10253 | + if (WARN_ON_ONCE(tp == NULL)) { | ||
10254 | + pr_warning("error on getting test probe.\n"); | ||
10255 | + warn++; | ||
10256 | + } else | ||
10257 | + disable_trace_probe(tp, TP_FLAG_TRACE); | ||
10258 | + | ||
10259 | + tp = find_trace_probe("testprobe2", KPROBE_EVENT_SYSTEM); | ||
10260 | + if (WARN_ON_ONCE(tp == NULL)) { | ||
10261 | + pr_warning("error on getting 2nd test probe.\n"); | ||
10262 | + warn++; | ||
10263 | + } else | ||
10264 | + disable_trace_probe(tp, TP_FLAG_TRACE); | ||
10265 | + | ||
10266 | ret = command_trace_probe("-:testprobe"); | ||
10267 | if (WARN_ON_ONCE(ret)) { | ||
10268 | pr_warning("error on deleting a probe.\n"); | ||
10269 | diff --git a/lib/kobject_uevent.c b/lib/kobject_uevent.c | ||
10270 | index 70af0a7..ad72a03 100644 | ||
10271 | --- a/lib/kobject_uevent.c | ||
10272 | +++ b/lib/kobject_uevent.c | ||
10273 | @@ -282,7 +282,7 @@ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action, | ||
10274 | kobj_bcast_filter, | ||
10275 | kobj); | ||
10276 | /* ENOBUFS should be handled in userspace */ | ||
10277 | - if (retval == -ENOBUFS) | ||
10278 | + if (retval == -ENOBUFS || retval == -ESRCH) | ||
10279 | retval = 0; | ||
10280 | } else | ||
10281 | retval = -ENOMEM; | ||
10282 | diff --git a/lib/nlattr.c b/lib/nlattr.c | ||
10283 | index ac09f22..a8408b6 100644 | ||
10284 | --- a/lib/nlattr.c | ||
10285 | +++ b/lib/nlattr.c | ||
10286 | @@ -20,6 +20,7 @@ static const u16 nla_attr_minlen[NLA_TYPE_MAX+1] = { | ||
10287 | [NLA_U16] = sizeof(u16), | ||
10288 | [NLA_U32] = sizeof(u32), | ||
10289 | [NLA_U64] = sizeof(u64), | ||
10290 | + [NLA_MSECS] = sizeof(u64), | ||
10291 | [NLA_NESTED] = NLA_HDRLEN, | ||
10292 | }; | ||
10293 | |||
10294 | diff --git a/mm/huge_memory.c b/mm/huge_memory.c | ||
10295 | index e2d1587..d819d93 100644 | ||
10296 | --- a/mm/huge_memory.c | ||
10297 | +++ b/mm/huge_memory.c | ||
10298 | @@ -989,7 +989,7 @@ struct page *follow_trans_huge_pmd(struct mm_struct *mm, | ||
10299 | page += (addr & ~HPAGE_PMD_MASK) >> PAGE_SHIFT; | ||
10300 | VM_BUG_ON(!PageCompound(page)); | ||
10301 | if (flags & FOLL_GET) | ||
10302 | - get_page(page); | ||
10303 | + get_page_foll(page); | ||
10304 | |||
10305 | out: | ||
10306 | return page; | ||
10307 | @@ -1156,6 +1156,7 @@ static void __split_huge_page_refcount(struct page *page) | ||
10308 | unsigned long head_index = page->index; | ||
10309 | struct zone *zone = page_zone(page); | ||
10310 | int zonestat; | ||
10311 | + int tail_count = 0; | ||
10312 | |||
10313 | /* prevent PageLRU to go away from under us, and freeze lru stats */ | ||
10314 | spin_lock_irq(&zone->lru_lock); | ||
10315 | @@ -1164,11 +1165,27 @@ static void __split_huge_page_refcount(struct page *page) | ||
10316 | for (i = 1; i < HPAGE_PMD_NR; i++) { | ||
10317 | struct page *page_tail = page + i; | ||
10318 | |||
10319 | - /* tail_page->_count cannot change */ | ||
10320 | - atomic_sub(atomic_read(&page_tail->_count), &page->_count); | ||
10321 | - BUG_ON(page_count(page) <= 0); | ||
10322 | - atomic_add(page_mapcount(page) + 1, &page_tail->_count); | ||
10323 | - BUG_ON(atomic_read(&page_tail->_count) <= 0); | ||
10324 | + /* tail_page->_mapcount cannot change */ | ||
10325 | + BUG_ON(page_mapcount(page_tail) < 0); | ||
10326 | + tail_count += page_mapcount(page_tail); | ||
10327 | + /* check for overflow */ | ||
10328 | + BUG_ON(tail_count < 0); | ||
10329 | + BUG_ON(atomic_read(&page_tail->_count) != 0); | ||
10330 | + /* | ||
10331 | + * tail_page->_count is zero and not changing from | ||
10332 | + * under us. But get_page_unless_zero() may be running | ||
10333 | + * from under us on the tail_page. If we used | ||
10334 | + * atomic_set() below instead of atomic_add(), we | ||
10335 | + * would then run atomic_set() concurrently with | ||
10336 | + * get_page_unless_zero(), and atomic_set() is | ||
10337 | + * implemented in C not using locked ops. spin_unlock | ||
10338 | + * on x86 sometime uses locked ops because of PPro | ||
10339 | + * errata 66, 92, so unless somebody can guarantee | ||
10340 | + * atomic_set() here would be safe on all archs (and | ||
10341 | + * not only on x86), it's safer to use atomic_add(). | ||
10342 | + */ | ||
10343 | + atomic_add(page_mapcount(page) + page_mapcount(page_tail) + 1, | ||
10344 | + &page_tail->_count); | ||
10345 | |||
10346 | /* after clearing PageTail the gup refcount can be released */ | ||
10347 | smp_mb(); | ||
10348 | @@ -1186,10 +1203,7 @@ static void __split_huge_page_refcount(struct page *page) | ||
10349 | (1L << PG_uptodate))); | ||
10350 | page_tail->flags |= (1L << PG_dirty); | ||
10351 | |||
10352 | - /* | ||
10353 | - * 1) clear PageTail before overwriting first_page | ||
10354 | - * 2) clear PageTail before clearing PageHead for VM_BUG_ON | ||
10355 | - */ | ||
10356 | + /* clear PageTail before overwriting first_page */ | ||
10357 | smp_wmb(); | ||
10358 | |||
10359 | /* | ||
10360 | @@ -1206,7 +1220,6 @@ static void __split_huge_page_refcount(struct page *page) | ||
10361 | * status is achieved setting a reserved bit in the | ||
10362 | * pmd, not by clearing the present bit. | ||
10363 | */ | ||
10364 | - BUG_ON(page_mapcount(page_tail)); | ||
10365 | page_tail->_mapcount = page->_mapcount; | ||
10366 | |||
10367 | BUG_ON(page_tail->mapping); | ||
10368 | @@ -1223,6 +1236,8 @@ static void __split_huge_page_refcount(struct page *page) | ||
10369 | |||
10370 | lru_add_page_tail(zone, page, page_tail); | ||
10371 | } | ||
10372 | + atomic_sub(tail_count, &page->_count); | ||
10373 | + BUG_ON(atomic_read(&page->_count) <= 0); | ||
10374 | |||
10375 | __dec_zone_page_state(page, NR_ANON_TRANSPARENT_HUGEPAGES); | ||
10376 | __mod_zone_page_state(zone, NR_ANON_PAGES, HPAGE_PMD_NR); | ||
10377 | diff --git a/mm/internal.h b/mm/internal.h | ||
10378 | index d071d38..2189af4 100644 | ||
10379 | --- a/mm/internal.h | ||
10380 | +++ b/mm/internal.h | ||
10381 | @@ -37,6 +37,52 @@ static inline void __put_page(struct page *page) | ||
10382 | atomic_dec(&page->_count); | ||
10383 | } | ||
10384 | |||
10385 | +static inline void __get_page_tail_foll(struct page *page, | ||
10386 | + bool get_page_head) | ||
10387 | +{ | ||
10388 | + /* | ||
10389 | + * If we're getting a tail page, the elevated page->_count is | ||
10390 | + * required only in the head page and we will elevate the head | ||
10391 | + * page->_count and tail page->_mapcount. | ||
10392 | + * | ||
10393 | + * We elevate page_tail->_mapcount for tail pages to force | ||
10394 | + * page_tail->_count to be zero at all times to avoid getting | ||
10395 | + * false positives from get_page_unless_zero() with | ||
10396 | + * speculative page access (like in | ||
10397 | + * page_cache_get_speculative()) on tail pages. | ||
10398 | + */ | ||
10399 | + VM_BUG_ON(atomic_read(&page->first_page->_count) <= 0); | ||
10400 | + VM_BUG_ON(atomic_read(&page->_count) != 0); | ||
10401 | + VM_BUG_ON(page_mapcount(page) < 0); | ||
10402 | + if (get_page_head) | ||
10403 | + atomic_inc(&page->first_page->_count); | ||
10404 | + atomic_inc(&page->_mapcount); | ||
10405 | +} | ||
10406 | + | ||
10407 | +/* | ||
10408 | + * This is meant to be called as the FOLL_GET operation of | ||
10409 | + * follow_page() and it must be called while holding the proper PT | ||
10410 | + * lock while the pte (or pmd_trans_huge) is still mapping the page. | ||
10411 | + */ | ||
10412 | +static inline void get_page_foll(struct page *page) | ||
10413 | +{ | ||
10414 | + if (unlikely(PageTail(page))) | ||
10415 | + /* | ||
10416 | + * This is safe only because | ||
10417 | + * __split_huge_page_refcount() can't run under | ||
10418 | + * get_page_foll() because we hold the proper PT lock. | ||
10419 | + */ | ||
10420 | + __get_page_tail_foll(page, true); | ||
10421 | + else { | ||
10422 | + /* | ||
10423 | + * Getting a normal page or the head of a compound page | ||
10424 | + * requires to already have an elevated page->_count. | ||
10425 | + */ | ||
10426 | + VM_BUG_ON(atomic_read(&page->_count) <= 0); | ||
10427 | + atomic_inc(&page->_count); | ||
10428 | + } | ||
10429 | +} | ||
10430 | + | ||
10431 | extern unsigned long highest_memmap_pfn; | ||
10432 | |||
10433 | /* | ||
10434 | diff --git a/mm/memory.c b/mm/memory.c | ||
10435 | index a56e3ba..b2b8731 100644 | ||
10436 | --- a/mm/memory.c | ||
10437 | +++ b/mm/memory.c | ||
10438 | @@ -1503,7 +1503,7 @@ split_fallthrough: | ||
10439 | } | ||
10440 | |||
10441 | if (flags & FOLL_GET) | ||
10442 | - get_page(page); | ||
10443 | + get_page_foll(page); | ||
10444 | if (flags & FOLL_TOUCH) { | ||
10445 | if ((flags & FOLL_WRITE) && | ||
10446 | !pte_dirty(pte) && !PageDirty(page)) | ||
10447 | diff --git a/mm/swap.c b/mm/swap.c | ||
10448 | index 3a442f1..87627f1 100644 | ||
10449 | --- a/mm/swap.c | ||
10450 | +++ b/mm/swap.c | ||
10451 | @@ -78,39 +78,22 @@ static void put_compound_page(struct page *page) | ||
10452 | { | ||
10453 | if (unlikely(PageTail(page))) { | ||
10454 | /* __split_huge_page_refcount can run under us */ | ||
10455 | - struct page *page_head = page->first_page; | ||
10456 | - smp_rmb(); | ||
10457 | - /* | ||
10458 | - * If PageTail is still set after smp_rmb() we can be sure | ||
10459 | - * that the page->first_page we read wasn't a dangling pointer. | ||
10460 | - * See __split_huge_page_refcount() smp_wmb(). | ||
10461 | - */ | ||
10462 | - if (likely(PageTail(page) && get_page_unless_zero(page_head))) { | ||
10463 | + struct page *page_head = compound_trans_head(page); | ||
10464 | + | ||
10465 | + if (likely(page != page_head && | ||
10466 | + get_page_unless_zero(page_head))) { | ||
10467 | unsigned long flags; | ||
10468 | /* | ||
10469 | - * Verify that our page_head wasn't converted | ||
10470 | - * to a a regular page before we got a | ||
10471 | - * reference on it. | ||
10472 | + * page_head wasn't a dangling pointer but it | ||
10473 | + * may not be a head page anymore by the time | ||
10474 | + * we obtain the lock. That is ok as long as it | ||
10475 | + * can't be freed from under us. | ||
10476 | */ | ||
10477 | - if (unlikely(!PageHead(page_head))) { | ||
10478 | - /* PageHead is cleared after PageTail */ | ||
10479 | - smp_rmb(); | ||
10480 | - VM_BUG_ON(PageTail(page)); | ||
10481 | - goto out_put_head; | ||
10482 | - } | ||
10483 | - /* | ||
10484 | - * Only run compound_lock on a valid PageHead, | ||
10485 | - * after having it pinned with | ||
10486 | - * get_page_unless_zero() above. | ||
10487 | - */ | ||
10488 | - smp_mb(); | ||
10489 | - /* page_head wasn't a dangling pointer */ | ||
10490 | flags = compound_lock_irqsave(page_head); | ||
10491 | if (unlikely(!PageTail(page))) { | ||
10492 | /* __split_huge_page_refcount run before us */ | ||
10493 | compound_unlock_irqrestore(page_head, flags); | ||
10494 | VM_BUG_ON(PageHead(page_head)); | ||
10495 | - out_put_head: | ||
10496 | if (put_page_testzero(page_head)) | ||
10497 | __put_single_page(page_head); | ||
10498 | out_put_single: | ||
10499 | @@ -121,16 +104,17 @@ static void put_compound_page(struct page *page) | ||
10500 | VM_BUG_ON(page_head != page->first_page); | ||
10501 | /* | ||
10502 | * We can release the refcount taken by | ||
10503 | - * get_page_unless_zero now that | ||
10504 | - * split_huge_page_refcount is blocked on the | ||
10505 | - * compound_lock. | ||
10506 | + * get_page_unless_zero() now that | ||
10507 | + * __split_huge_page_refcount() is blocked on | ||
10508 | + * the compound_lock. | ||
10509 | */ | ||
10510 | if (put_page_testzero(page_head)) | ||
10511 | VM_BUG_ON(1); | ||
10512 | /* __split_huge_page_refcount will wait now */ | ||
10513 | - VM_BUG_ON(atomic_read(&page->_count) <= 0); | ||
10514 | - atomic_dec(&page->_count); | ||
10515 | + VM_BUG_ON(page_mapcount(page) <= 0); | ||
10516 | + atomic_dec(&page->_mapcount); | ||
10517 | VM_BUG_ON(atomic_read(&page_head->_count) <= 0); | ||
10518 | + VM_BUG_ON(atomic_read(&page->_count) != 0); | ||
10519 | compound_unlock_irqrestore(page_head, flags); | ||
10520 | if (put_page_testzero(page_head)) { | ||
10521 | if (PageHead(page_head)) | ||
10522 | @@ -160,6 +144,45 @@ void put_page(struct page *page) | ||
10523 | } | ||
10524 | EXPORT_SYMBOL(put_page); | ||
10525 | |||
10526 | +/* | ||
10527 | + * This function is exported but must not be called by anything other | ||
10528 | + * than get_page(). It implements the slow path of get_page(). | ||
10529 | + */ | ||
10530 | +bool __get_page_tail(struct page *page) | ||
10531 | +{ | ||
10532 | + /* | ||
10533 | + * This takes care of get_page() if run on a tail page | ||
10534 | + * returned by one of the get_user_pages/follow_page variants. | ||
10535 | + * get_user_pages/follow_page itself doesn't need the compound | ||
10536 | + * lock because it runs __get_page_tail_foll() under the | ||
10537 | + * proper PT lock that already serializes against | ||
10538 | + * split_huge_page(). | ||
10539 | + */ | ||
10540 | + unsigned long flags; | ||
10541 | + bool got = false; | ||
10542 | + struct page *page_head = compound_trans_head(page); | ||
10543 | + | ||
10544 | + if (likely(page != page_head && get_page_unless_zero(page_head))) { | ||
10545 | + /* | ||
10546 | + * page_head wasn't a dangling pointer but it | ||
10547 | + * may not be a head page anymore by the time | ||
10548 | + * we obtain the lock. That is ok as long as it | ||
10549 | + * can't be freed from under us. | ||
10550 | + */ | ||
10551 | + flags = compound_lock_irqsave(page_head); | ||
10552 | + /* here __split_huge_page_refcount won't run anymore */ | ||
10553 | + if (likely(PageTail(page))) { | ||
10554 | + __get_page_tail_foll(page, false); | ||
10555 | + got = true; | ||
10556 | + } | ||
10557 | + compound_unlock_irqrestore(page_head, flags); | ||
10558 | + if (unlikely(!got)) | ||
10559 | + put_page(page_head); | ||
10560 | + } | ||
10561 | + return got; | ||
10562 | +} | ||
10563 | +EXPORT_SYMBOL(__get_page_tail); | ||
10564 | + | ||
10565 | /** | ||
10566 | * put_pages_list() - release a list of pages | ||
10567 | * @pages: list of pages threaded on page->lru | ||
10568 | diff --git a/mm/vmalloc.c b/mm/vmalloc.c | ||
10569 | index 5016f19..56faf31 100644 | ||
10570 | --- a/mm/vmalloc.c | ||
10571 | +++ b/mm/vmalloc.c | ||
10572 | @@ -1253,18 +1253,22 @@ EXPORT_SYMBOL_GPL(map_vm_area); | ||
10573 | DEFINE_RWLOCK(vmlist_lock); | ||
10574 | struct vm_struct *vmlist; | ||
10575 | |||
10576 | -static void insert_vmalloc_vm(struct vm_struct *vm, struct vmap_area *va, | ||
10577 | +static void setup_vmalloc_vm(struct vm_struct *vm, struct vmap_area *va, | ||
10578 | unsigned long flags, void *caller) | ||
10579 | { | ||
10580 | - struct vm_struct *tmp, **p; | ||
10581 | - | ||
10582 | vm->flags = flags; | ||
10583 | vm->addr = (void *)va->va_start; | ||
10584 | vm->size = va->va_end - va->va_start; | ||
10585 | vm->caller = caller; | ||
10586 | va->private = vm; | ||
10587 | va->flags |= VM_VM_AREA; | ||
10588 | +} | ||
10589 | + | ||
10590 | +static void insert_vmalloc_vmlist(struct vm_struct *vm) | ||
10591 | +{ | ||
10592 | + struct vm_struct *tmp, **p; | ||
10593 | |||
10594 | + vm->flags &= ~VM_UNLIST; | ||
10595 | write_lock(&vmlist_lock); | ||
10596 | for (p = &vmlist; (tmp = *p) != NULL; p = &tmp->next) { | ||
10597 | if (tmp->addr >= vm->addr) | ||
10598 | @@ -1275,6 +1279,13 @@ static void insert_vmalloc_vm(struct vm_struct *vm, struct vmap_area *va, | ||
10599 | write_unlock(&vmlist_lock); | ||
10600 | } | ||
10601 | |||
10602 | +static void insert_vmalloc_vm(struct vm_struct *vm, struct vmap_area *va, | ||
10603 | + unsigned long flags, void *caller) | ||
10604 | +{ | ||
10605 | + setup_vmalloc_vm(vm, va, flags, caller); | ||
10606 | + insert_vmalloc_vmlist(vm); | ||
10607 | +} | ||
10608 | + | ||
10609 | static struct vm_struct *__get_vm_area_node(unsigned long size, | ||
10610 | unsigned long align, unsigned long flags, unsigned long start, | ||
10611 | unsigned long end, int node, gfp_t gfp_mask, void *caller) | ||
10612 | @@ -1313,7 +1324,18 @@ static struct vm_struct *__get_vm_area_node(unsigned long size, | ||
10613 | return NULL; | ||
10614 | } | ||
10615 | |||
10616 | - insert_vmalloc_vm(area, va, flags, caller); | ||
10617 | + /* | ||
10618 | + * When this function is called from __vmalloc_node_range, | ||
10619 | + * we do not add vm_struct to vmlist here to avoid | ||
10620 | + * accessing uninitialized members of vm_struct such as | ||
10621 | + * pages and nr_pages fields. They will be set later. | ||
10622 | + * To distinguish it from others, we use a VM_UNLIST flag. | ||
10623 | + */ | ||
10624 | + if (flags & VM_UNLIST) | ||
10625 | + setup_vmalloc_vm(area, va, flags, caller); | ||
10626 | + else | ||
10627 | + insert_vmalloc_vm(area, va, flags, caller); | ||
10628 | + | ||
10629 | return area; | ||
10630 | } | ||
10631 | |||
10632 | @@ -1381,17 +1403,20 @@ struct vm_struct *remove_vm_area(const void *addr) | ||
10633 | va = find_vmap_area((unsigned long)addr); | ||
10634 | if (va && va->flags & VM_VM_AREA) { | ||
10635 | struct vm_struct *vm = va->private; | ||
10636 | - struct vm_struct *tmp, **p; | ||
10637 | - /* | ||
10638 | - * remove from list and disallow access to this vm_struct | ||
10639 | - * before unmap. (address range confliction is maintained by | ||
10640 | - * vmap.) | ||
10641 | - */ | ||
10642 | - write_lock(&vmlist_lock); | ||
10643 | - for (p = &vmlist; (tmp = *p) != vm; p = &tmp->next) | ||
10644 | - ; | ||
10645 | - *p = tmp->next; | ||
10646 | - write_unlock(&vmlist_lock); | ||
10647 | + | ||
10648 | + if (!(vm->flags & VM_UNLIST)) { | ||
10649 | + struct vm_struct *tmp, **p; | ||
10650 | + /* | ||
10651 | + * remove from list and disallow access to | ||
10652 | + * this vm_struct before unmap. (address range | ||
10653 | + * confliction is maintained by vmap.) | ||
10654 | + */ | ||
10655 | + write_lock(&vmlist_lock); | ||
10656 | + for (p = &vmlist; (tmp = *p) != vm; p = &tmp->next) | ||
10657 | + ; | ||
10658 | + *p = tmp->next; | ||
10659 | + write_unlock(&vmlist_lock); | ||
10660 | + } | ||
10661 | |||
10662 | vmap_debug_free_range(va->va_start, va->va_end); | ||
10663 | free_unmap_vmap_area(va); | ||
10664 | @@ -1602,8 +1627,8 @@ void *__vmalloc_node_range(unsigned long size, unsigned long align, | ||
10665 | if (!size || (size >> PAGE_SHIFT) > totalram_pages) | ||
10666 | return NULL; | ||
10667 | |||
10668 | - area = __get_vm_area_node(size, align, VM_ALLOC, start, end, node, | ||
10669 | - gfp_mask, caller); | ||
10670 | + area = __get_vm_area_node(size, align, VM_ALLOC | VM_UNLIST, | ||
10671 | + start, end, node, gfp_mask, caller); | ||
10672 | |||
10673 | if (!area) | ||
10674 | return NULL; | ||
10675 | @@ -1611,6 +1636,12 @@ void *__vmalloc_node_range(unsigned long size, unsigned long align, | ||
10676 | addr = __vmalloc_area_node(area, gfp_mask, prot, node, caller); | ||
10677 | |||
10678 | /* | ||
10679 | + * In this function, newly allocated vm_struct is not added | ||
10680 | + * to vmlist at __get_vm_area_node(). so, it is added here. | ||
10681 | + */ | ||
10682 | + insert_vmalloc_vmlist(area); | ||
10683 | + | ||
10684 | + /* | ||
10685 | * A ref_count = 3 is needed because the vm_struct and vmap_area | ||
10686 | * structures allocated in the __get_vm_area_node() function contain | ||
10687 | * references to the virtual address of the vmalloc'ed block. | ||
10688 | diff --git a/net/caif/caif_dev.c b/net/caif/caif_dev.c | ||
10689 | index 7f9ac07..47fc8f3 100644 | ||
10690 | --- a/net/caif/caif_dev.c | ||
10691 | +++ b/net/caif/caif_dev.c | ||
10692 | @@ -212,8 +212,7 @@ static int caif_device_notify(struct notifier_block *me, unsigned long what, | ||
10693 | enum cfcnfg_phy_preference pref; | ||
10694 | enum cfcnfg_phy_type phy_type; | ||
10695 | struct cfcnfg *cfg; | ||
10696 | - struct caif_device_entry_list *caifdevs = | ||
10697 | - caif_device_list(dev_net(dev)); | ||
10698 | + struct caif_device_entry_list *caifdevs; | ||
10699 | |||
10700 | if (dev->type != ARPHRD_CAIF) | ||
10701 | return 0; | ||
10702 | @@ -222,6 +221,8 @@ static int caif_device_notify(struct notifier_block *me, unsigned long what, | ||
10703 | if (cfg == NULL) | ||
10704 | return 0; | ||
10705 | |||
10706 | + caifdevs = caif_device_list(dev_net(dev)); | ||
10707 | + | ||
10708 | switch (what) { | ||
10709 | case NETDEV_REGISTER: | ||
10710 | caifd = caif_device_alloc(dev); | ||
10711 | diff --git a/net/core/dev.c b/net/core/dev.c | ||
10712 | index b10ff0a..ae5cf2d 100644 | ||
10713 | --- a/net/core/dev.c | ||
10714 | +++ b/net/core/dev.c | ||
10715 | @@ -6115,6 +6115,7 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char | ||
10716 | */ | ||
10717 | call_netdevice_notifiers(NETDEV_UNREGISTER, dev); | ||
10718 | call_netdevice_notifiers(NETDEV_UNREGISTER_BATCH, dev); | ||
10719 | + rtmsg_ifinfo(RTM_DELLINK, dev, ~0U); | ||
10720 | |||
10721 | /* | ||
10722 | * Flush the unicast and multicast chains | ||
10723 | diff --git a/net/core/sock.c b/net/core/sock.c | ||
10724 | index bc745d0..11d67b3 100644 | ||
10725 | --- a/net/core/sock.c | ||
10726 | +++ b/net/core/sock.c | ||
10727 | @@ -1260,6 +1260,7 @@ struct sock *sk_clone(const struct sock *sk, const gfp_t priority) | ||
10728 | /* It is still raw copy of parent, so invalidate | ||
10729 | * destructor and make plain sk_free() */ | ||
10730 | newsk->sk_destruct = NULL; | ||
10731 | + bh_unlock_sock(newsk); | ||
10732 | sk_free(newsk); | ||
10733 | newsk = NULL; | ||
10734 | goto out; | ||
10735 | diff --git a/net/core/timestamping.c b/net/core/timestamping.c | ||
10736 | index 98a5264..82fb288 100644 | ||
10737 | --- a/net/core/timestamping.c | ||
10738 | +++ b/net/core/timestamping.c | ||
10739 | @@ -57,9 +57,13 @@ void skb_clone_tx_timestamp(struct sk_buff *skb) | ||
10740 | case PTP_CLASS_V2_VLAN: | ||
10741 | phydev = skb->dev->phydev; | ||
10742 | if (likely(phydev->drv->txtstamp)) { | ||
10743 | + if (!atomic_inc_not_zero(&sk->sk_refcnt)) | ||
10744 | + return; | ||
10745 | clone = skb_clone(skb, GFP_ATOMIC); | ||
10746 | - if (!clone) | ||
10747 | + if (!clone) { | ||
10748 | + sock_put(sk); | ||
10749 | return; | ||
10750 | + } | ||
10751 | clone->sk = sk; | ||
10752 | phydev->drv->txtstamp(phydev, clone, type); | ||
10753 | } | ||
10754 | @@ -77,8 +81,11 @@ void skb_complete_tx_timestamp(struct sk_buff *skb, | ||
10755 | struct sock_exterr_skb *serr; | ||
10756 | int err; | ||
10757 | |||
10758 | - if (!hwtstamps) | ||
10759 | + if (!hwtstamps) { | ||
10760 | + sock_put(sk); | ||
10761 | + kfree_skb(skb); | ||
10762 | return; | ||
10763 | + } | ||
10764 | |||
10765 | *skb_hwtstamps(skb) = *hwtstamps; | ||
10766 | serr = SKB_EXT_ERR(skb); | ||
10767 | @@ -87,6 +94,7 @@ void skb_complete_tx_timestamp(struct sk_buff *skb, | ||
10768 | serr->ee.ee_origin = SO_EE_ORIGIN_TIMESTAMPING; | ||
10769 | skb->sk = NULL; | ||
10770 | err = sock_queue_err_skb(sk, skb); | ||
10771 | + sock_put(sk); | ||
10772 | if (err) | ||
10773 | kfree_skb(skb); | ||
10774 | } | ||
10775 | diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c | ||
10776 | index fc5368a..a0b4c5d 100644 | ||
10777 | --- a/net/ipv4/xfrm4_policy.c | ||
10778 | +++ b/net/ipv4/xfrm4_policy.c | ||
10779 | @@ -79,13 +79,13 @@ static int xfrm4_fill_dst(struct xfrm_dst *xdst, struct net_device *dev, | ||
10780 | struct rtable *rt = (struct rtable *)xdst->route; | ||
10781 | const struct flowi4 *fl4 = &fl->u.ip4; | ||
10782 | |||
10783 | - rt->rt_key_dst = fl4->daddr; | ||
10784 | - rt->rt_key_src = fl4->saddr; | ||
10785 | - rt->rt_key_tos = fl4->flowi4_tos; | ||
10786 | - rt->rt_route_iif = fl4->flowi4_iif; | ||
10787 | - rt->rt_iif = fl4->flowi4_iif; | ||
10788 | - rt->rt_oif = fl4->flowi4_oif; | ||
10789 | - rt->rt_mark = fl4->flowi4_mark; | ||
10790 | + xdst->u.rt.rt_key_dst = fl4->daddr; | ||
10791 | + xdst->u.rt.rt_key_src = fl4->saddr; | ||
10792 | + xdst->u.rt.rt_key_tos = fl4->flowi4_tos; | ||
10793 | + xdst->u.rt.rt_route_iif = fl4->flowi4_iif; | ||
10794 | + xdst->u.rt.rt_iif = fl4->flowi4_iif; | ||
10795 | + xdst->u.rt.rt_oif = fl4->flowi4_oif; | ||
10796 | + xdst->u.rt.rt_mark = fl4->flowi4_mark; | ||
10797 | |||
10798 | xdst->u.dst.dev = dev; | ||
10799 | dev_hold(dev); | ||
10800 | diff --git a/net/ipv6/route.c b/net/ipv6/route.c | ||
10801 | index fb545ed..57b82dc 100644 | ||
10802 | --- a/net/ipv6/route.c | ||
10803 | +++ b/net/ipv6/route.c | ||
10804 | @@ -1086,11 +1086,10 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev, | ||
10805 | rt->dst.output = ip6_output; | ||
10806 | dst_set_neighbour(&rt->dst, neigh); | ||
10807 | atomic_set(&rt->dst.__refcnt, 1); | ||
10808 | - dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 255); | ||
10809 | - | ||
10810 | ipv6_addr_copy(&rt->rt6i_dst.addr, addr); | ||
10811 | rt->rt6i_dst.plen = 128; | ||
10812 | rt->rt6i_idev = idev; | ||
10813 | + dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 255); | ||
10814 | |||
10815 | spin_lock_bh(&icmp6_dst_lock); | ||
10816 | rt->dst.next = icmp6_dst_gc_list; | ||
10817 | diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c | ||
10818 | index 3d1b091..10c95be 100644 | ||
10819 | --- a/net/mac80211/cfg.c | ||
10820 | +++ b/net/mac80211/cfg.c | ||
10821 | @@ -1821,7 +1821,7 @@ ieee80211_offchan_tx_done(struct ieee80211_work *wk, struct sk_buff *skb) | ||
10822 | * so in that case userspace will have to deal with it. | ||
10823 | */ | ||
10824 | |||
10825 | - if (wk->offchan_tx.wait && wk->offchan_tx.frame) | ||
10826 | + if (wk->offchan_tx.wait && !wk->offchan_tx.status) | ||
10827 | cfg80211_mgmt_tx_status(wk->sdata->dev, | ||
10828 | (unsigned long) wk->offchan_tx.frame, | ||
10829 | wk->ie, wk->ie_len, false, GFP_KERNEL); | ||
10830 | diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h | ||
10831 | index 400c09b..9fab144 100644 | ||
10832 | --- a/net/mac80211/ieee80211_i.h | ||
10833 | +++ b/net/mac80211/ieee80211_i.h | ||
10834 | @@ -345,6 +345,7 @@ struct ieee80211_work { | ||
10835 | struct { | ||
10836 | struct sk_buff *frame; | ||
10837 | u32 wait; | ||
10838 | + bool status; | ||
10839 | } offchan_tx; | ||
10840 | }; | ||
10841 | |||
10842 | @@ -389,6 +390,7 @@ struct ieee80211_if_managed { | ||
10843 | |||
10844 | unsigned long timers_running; /* used for quiesce/restart */ | ||
10845 | bool powersave; /* powersave requested for this iface */ | ||
10846 | + bool broken_ap; /* AP is broken -- turn off powersave */ | ||
10847 | enum ieee80211_smps_mode req_smps, /* requested smps mode */ | ||
10848 | ap_smps, /* smps mode AP thinks we're in */ | ||
10849 | driver_smps_mode; /* smps mode request */ | ||
10850 | diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c | ||
10851 | index d6470c7..0f48368 100644 | ||
10852 | --- a/net/mac80211/mlme.c | ||
10853 | +++ b/net/mac80211/mlme.c | ||
10854 | @@ -613,6 +613,9 @@ static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata) | ||
10855 | if (!mgd->powersave) | ||
10856 | return false; | ||
10857 | |||
10858 | + if (mgd->broken_ap) | ||
10859 | + return false; | ||
10860 | + | ||
10861 | if (!mgd->associated) | ||
10862 | return false; | ||
10863 | |||
10864 | @@ -1467,10 +1470,21 @@ static bool ieee80211_assoc_success(struct ieee80211_work *wk, | ||
10865 | capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info); | ||
10866 | |||
10867 | if ((aid & (BIT(15) | BIT(14))) != (BIT(15) | BIT(14))) | ||
10868 | - printk(KERN_DEBUG "%s: invalid aid value %d; bits 15:14 not " | ||
10869 | - "set\n", sdata->name, aid); | ||
10870 | + printk(KERN_DEBUG | ||
10871 | + "%s: invalid AID value 0x%x; bits 15:14 not set\n", | ||
10872 | + sdata->name, aid); | ||
10873 | aid &= ~(BIT(15) | BIT(14)); | ||
10874 | |||
10875 | + ifmgd->broken_ap = false; | ||
10876 | + | ||
10877 | + if (aid == 0 || aid > IEEE80211_MAX_AID) { | ||
10878 | + printk(KERN_DEBUG | ||
10879 | + "%s: invalid AID value %d (out of range), turn off PS\n", | ||
10880 | + sdata->name, aid); | ||
10881 | + aid = 0; | ||
10882 | + ifmgd->broken_ap = true; | ||
10883 | + } | ||
10884 | + | ||
10885 | pos = mgmt->u.assoc_resp.variable; | ||
10886 | ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), &elems); | ||
10887 | |||
10888 | diff --git a/net/mac80211/status.c b/net/mac80211/status.c | ||
10889 | index 1658efa..04cdbaf 100644 | ||
10890 | --- a/net/mac80211/status.c | ||
10891 | +++ b/net/mac80211/status.c | ||
10892 | @@ -336,7 +336,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) | ||
10893 | continue; | ||
10894 | if (wk->offchan_tx.frame != skb) | ||
10895 | continue; | ||
10896 | - wk->offchan_tx.frame = NULL; | ||
10897 | + wk->offchan_tx.status = true; | ||
10898 | break; | ||
10899 | } | ||
10900 | rcu_read_unlock(); | ||
10901 | diff --git a/net/mac80211/work.c b/net/mac80211/work.c | ||
10902 | index 380b9a7..7737f20 100644 | ||
10903 | --- a/net/mac80211/work.c | ||
10904 | +++ b/net/mac80211/work.c | ||
10905 | @@ -579,7 +579,7 @@ ieee80211_offchannel_tx(struct ieee80211_work *wk) | ||
10906 | /* | ||
10907 | * After this, offchan_tx.frame remains but now is no | ||
10908 | * longer a valid pointer -- we still need it as the | ||
10909 | - * cookie for canceling this work. | ||
10910 | + * cookie for canceling this work/status matching. | ||
10911 | */ | ||
10912 | ieee80211_tx_skb(wk->sdata, wk->offchan_tx.frame); | ||
10913 | |||
10914 | @@ -1086,14 +1086,13 @@ static void ieee80211_work_work(struct work_struct *work) | ||
10915 | continue; | ||
10916 | if (wk->chan != local->tmp_channel) | ||
10917 | continue; | ||
10918 | - if (ieee80211_work_ct_coexists(wk->chan_type, | ||
10919 | - local->tmp_channel_type)) | ||
10920 | + if (!ieee80211_work_ct_coexists(wk->chan_type, | ||
10921 | + local->tmp_channel_type)) | ||
10922 | continue; | ||
10923 | remain_off_channel = true; | ||
10924 | } | ||
10925 | |||
10926 | if (!remain_off_channel && local->tmp_channel) { | ||
10927 | - bool on_oper_chan = ieee80211_cfg_on_oper_channel(local); | ||
10928 | local->tmp_channel = NULL; | ||
10929 | /* If tmp_channel wasn't operating channel, then | ||
10930 | * we need to go back on-channel. | ||
10931 | @@ -1103,7 +1102,7 @@ static void ieee80211_work_work(struct work_struct *work) | ||
10932 | * we still need to do a hardware config. Currently, | ||
10933 | * we cannot be here while scanning, however. | ||
10934 | */ | ||
10935 | - if (ieee80211_cfg_on_oper_channel(local) && !on_oper_chan) | ||
10936 | + if (!ieee80211_cfg_on_oper_channel(local)) | ||
10937 | ieee80211_hw_config(local, 0); | ||
10938 | |||
10939 | /* At the least, we need to disable offchannel_ps, | ||
10940 | diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c | ||
10941 | index 364eb45..e9b7693 100644 | ||
10942 | --- a/net/sunrpc/auth_gss/auth_gss.c | ||
10943 | +++ b/net/sunrpc/auth_gss/auth_gss.c | ||
10944 | @@ -603,26 +603,6 @@ out: | ||
10945 | return err; | ||
10946 | } | ||
10947 | |||
10948 | -static ssize_t | ||
10949 | -gss_pipe_upcall(struct file *filp, struct rpc_pipe_msg *msg, | ||
10950 | - char __user *dst, size_t buflen) | ||
10951 | -{ | ||
10952 | - char *data = (char *)msg->data + msg->copied; | ||
10953 | - size_t mlen = min(msg->len, buflen); | ||
10954 | - unsigned long left; | ||
10955 | - | ||
10956 | - left = copy_to_user(dst, data, mlen); | ||
10957 | - if (left == mlen) { | ||
10958 | - msg->errno = -EFAULT; | ||
10959 | - return -EFAULT; | ||
10960 | - } | ||
10961 | - | ||
10962 | - mlen -= left; | ||
10963 | - msg->copied += mlen; | ||
10964 | - msg->errno = 0; | ||
10965 | - return mlen; | ||
10966 | -} | ||
10967 | - | ||
10968 | #define MSG_BUF_MAXSIZE 1024 | ||
10969 | |||
10970 | static ssize_t | ||
10971 | @@ -1590,7 +1570,7 @@ static const struct rpc_credops gss_nullops = { | ||
10972 | }; | ||
10973 | |||
10974 | static const struct rpc_pipe_ops gss_upcall_ops_v0 = { | ||
10975 | - .upcall = gss_pipe_upcall, | ||
10976 | + .upcall = rpc_pipe_generic_upcall, | ||
10977 | .downcall = gss_pipe_downcall, | ||
10978 | .destroy_msg = gss_pipe_destroy_msg, | ||
10979 | .open_pipe = gss_pipe_open_v0, | ||
10980 | @@ -1598,7 +1578,7 @@ static const struct rpc_pipe_ops gss_upcall_ops_v0 = { | ||
10981 | }; | ||
10982 | |||
10983 | static const struct rpc_pipe_ops gss_upcall_ops_v1 = { | ||
10984 | - .upcall = gss_pipe_upcall, | ||
10985 | + .upcall = rpc_pipe_generic_upcall, | ||
10986 | .downcall = gss_pipe_downcall, | ||
10987 | .destroy_msg = gss_pipe_destroy_msg, | ||
10988 | .open_pipe = gss_pipe_open_v1, | ||
10989 | diff --git a/net/sunrpc/auth_unix.c b/net/sunrpc/auth_unix.c | ||
10990 | index 4cb70dc..e50502d 100644 | ||
10991 | --- a/net/sunrpc/auth_unix.c | ||
10992 | +++ b/net/sunrpc/auth_unix.c | ||
10993 | @@ -129,6 +129,9 @@ unx_match(struct auth_cred *acred, struct rpc_cred *rcred, int flags) | ||
10994 | for (i = 0; i < groups ; i++) | ||
10995 | if (cred->uc_gids[i] != GROUP_AT(acred->group_info, i)) | ||
10996 | return 0; | ||
10997 | + if (groups < NFS_NGROUPS && | ||
10998 | + cred->uc_gids[groups] != NOGROUP) | ||
10999 | + return 0; | ||
11000 | return 1; | ||
11001 | } | ||
11002 | |||
11003 | diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c | ||
11004 | index b181e34..67dbc18 100644 | ||
11005 | --- a/net/sunrpc/rpc_pipe.c | ||
11006 | +++ b/net/sunrpc/rpc_pipe.c | ||
11007 | @@ -77,6 +77,26 @@ rpc_timeout_upcall_queue(struct work_struct *work) | ||
11008 | rpc_purge_list(rpci, &free_list, destroy_msg, -ETIMEDOUT); | ||
11009 | } | ||
11010 | |||
11011 | +ssize_t rpc_pipe_generic_upcall(struct file *filp, struct rpc_pipe_msg *msg, | ||
11012 | + char __user *dst, size_t buflen) | ||
11013 | +{ | ||
11014 | + char *data = (char *)msg->data + msg->copied; | ||
11015 | + size_t mlen = min(msg->len - msg->copied, buflen); | ||
11016 | + unsigned long left; | ||
11017 | + | ||
11018 | + left = copy_to_user(dst, data, mlen); | ||
11019 | + if (left == mlen) { | ||
11020 | + msg->errno = -EFAULT; | ||
11021 | + return -EFAULT; | ||
11022 | + } | ||
11023 | + | ||
11024 | + mlen -= left; | ||
11025 | + msg->copied += mlen; | ||
11026 | + msg->errno = 0; | ||
11027 | + return mlen; | ||
11028 | +} | ||
11029 | +EXPORT_SYMBOL_GPL(rpc_pipe_generic_upcall); | ||
11030 | + | ||
11031 | /** | ||
11032 | * rpc_queue_upcall - queue an upcall message to userspace | ||
11033 | * @inode: inode of upcall pipe on which to queue given message | ||
11034 | diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c | ||
11035 | index d660086..beeb92e 100644 | ||
11036 | --- a/scripts/kconfig/menu.c | ||
11037 | +++ b/scripts/kconfig/menu.c | ||
11038 | @@ -597,11 +597,10 @@ void menu_get_ext_help(struct menu *menu, struct gstr *help) | ||
11039 | struct symbol *sym = menu->sym; | ||
11040 | |||
11041 | if (menu_has_help(menu)) { | ||
11042 | - if (sym->name) { | ||
11043 | + if (sym->name) | ||
11044 | str_printf(help, "%s%s:\n\n", CONFIG_, sym->name); | ||
11045 | - str_append(help, _(menu_get_help(menu))); | ||
11046 | - str_append(help, "\n"); | ||
11047 | - } | ||
11048 | + str_append(help, _(menu_get_help(menu))); | ||
11049 | + str_append(help, "\n"); | ||
11050 | } else { | ||
11051 | str_append(help, nohelp_text); | ||
11052 | } | ||
11053 | diff --git a/sound/pci/hda/alc269_quirks.c b/sound/pci/hda/alc269_quirks.c | ||
11054 | index 5ac0e21..9aeeb32 100644 | ||
11055 | --- a/sound/pci/hda/alc269_quirks.c | ||
11056 | +++ b/sound/pci/hda/alc269_quirks.c | ||
11057 | @@ -577,6 +577,9 @@ static const struct alc_config_preset alc269_presets[] = { | ||
11058 | alc269_laptop_amic_init_verbs }, | ||
11059 | .num_dacs = ARRAY_SIZE(alc269_dac_nids), | ||
11060 | .dac_nids = alc269_dac_nids, | ||
11061 | + .adc_nids = alc269_adc_nids, | ||
11062 | + .capsrc_nids = alc269_capsrc_nids, | ||
11063 | + .num_adc_nids = ARRAY_SIZE(alc269_adc_nids), | ||
11064 | .hp_nid = 0x03, | ||
11065 | .num_channel_mode = ARRAY_SIZE(alc269_modes), | ||
11066 | .channel_mode = alc269_modes, | ||
11067 | @@ -591,6 +594,9 @@ static const struct alc_config_preset alc269_presets[] = { | ||
11068 | alc269_laptop_dmic_init_verbs }, | ||
11069 | .num_dacs = ARRAY_SIZE(alc269_dac_nids), | ||
11070 | .dac_nids = alc269_dac_nids, | ||
11071 | + .adc_nids = alc269_adc_nids, | ||
11072 | + .capsrc_nids = alc269_capsrc_nids, | ||
11073 | + .num_adc_nids = ARRAY_SIZE(alc269_adc_nids), | ||
11074 | .hp_nid = 0x03, | ||
11075 | .num_channel_mode = ARRAY_SIZE(alc269_modes), | ||
11076 | .channel_mode = alc269_modes, | ||
11077 | @@ -605,6 +611,9 @@ static const struct alc_config_preset alc269_presets[] = { | ||
11078 | alc269vb_laptop_amic_init_verbs }, | ||
11079 | .num_dacs = ARRAY_SIZE(alc269_dac_nids), | ||
11080 | .dac_nids = alc269_dac_nids, | ||
11081 | + .adc_nids = alc269vb_adc_nids, | ||
11082 | + .capsrc_nids = alc269vb_capsrc_nids, | ||
11083 | + .num_adc_nids = ARRAY_SIZE(alc269vb_adc_nids), | ||
11084 | .hp_nid = 0x03, | ||
11085 | .num_channel_mode = ARRAY_SIZE(alc269_modes), | ||
11086 | .channel_mode = alc269_modes, | ||
11087 | @@ -619,6 +628,9 @@ static const struct alc_config_preset alc269_presets[] = { | ||
11088 | alc269vb_laptop_dmic_init_verbs }, | ||
11089 | .num_dacs = ARRAY_SIZE(alc269_dac_nids), | ||
11090 | .dac_nids = alc269_dac_nids, | ||
11091 | + .adc_nids = alc269vb_adc_nids, | ||
11092 | + .capsrc_nids = alc269vb_capsrc_nids, | ||
11093 | + .num_adc_nids = ARRAY_SIZE(alc269vb_adc_nids), | ||
11094 | .hp_nid = 0x03, | ||
11095 | .num_channel_mode = ARRAY_SIZE(alc269_modes), | ||
11096 | .channel_mode = alc269_modes, | ||
11097 | @@ -633,6 +645,8 @@ static const struct alc_config_preset alc269_presets[] = { | ||
11098 | alc269_laptop_dmic_init_verbs }, | ||
11099 | .num_dacs = ARRAY_SIZE(alc269_dac_nids), | ||
11100 | .dac_nids = alc269_dac_nids, | ||
11101 | + .adc_nids = alc269_adc_nids, | ||
11102 | + .capsrc_nids = alc269_capsrc_nids, | ||
11103 | .hp_nid = 0x03, | ||
11104 | .num_channel_mode = ARRAY_SIZE(alc269_modes), | ||
11105 | .channel_mode = alc269_modes, | ||
11106 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c | ||
11107 | index 191284a..f665975 100644 | ||
11108 | --- a/sound/pci/hda/hda_intel.c | ||
11109 | +++ b/sound/pci/hda/hda_intel.c | ||
11110 | @@ -2912,12 +2912,12 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { | ||
11111 | .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, | ||
11112 | .class_mask = 0xffffff, | ||
11113 | .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND | | ||
11114 | - AZX_DCAPS_RIRB_PRE_DELAY }, | ||
11115 | + AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB }, | ||
11116 | #else | ||
11117 | /* this entry seems still valid -- i.e. without emu20kx chip */ | ||
11118 | { PCI_DEVICE(0x1102, 0x0009), | ||
11119 | .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND | | ||
11120 | - AZX_DCAPS_RIRB_PRE_DELAY }, | ||
11121 | + AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB }, | ||
11122 | #endif | ||
11123 | /* Vortex86MX */ | ||
11124 | { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC }, | ||
11125 | diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c | ||
11126 | index 76752d8e..41fecc1 100644 | ||
11127 | --- a/sound/pci/hda/patch_conexant.c | ||
11128 | +++ b/sound/pci/hda/patch_conexant.c | ||
11129 | @@ -136,6 +136,8 @@ struct conexant_spec { | ||
11130 | unsigned int thinkpad:1; | ||
11131 | unsigned int hp_laptop:1; | ||
11132 | unsigned int asus:1; | ||
11133 | + unsigned int pin_eapd_ctrls:1; | ||
11134 | + unsigned int single_adc_amp:1; | ||
11135 | |||
11136 | unsigned int adc_switching:1; | ||
11137 | |||
11138 | @@ -3473,12 +3475,14 @@ static void cx_auto_turn_eapd(struct hda_codec *codec, int num_pins, | ||
11139 | static void do_automute(struct hda_codec *codec, int num_pins, | ||
11140 | hda_nid_t *pins, bool on) | ||
11141 | { | ||
11142 | + struct conexant_spec *spec = codec->spec; | ||
11143 | int i; | ||
11144 | for (i = 0; i < num_pins; i++) | ||
11145 | snd_hda_codec_write(codec, pins[i], 0, | ||
11146 | AC_VERB_SET_PIN_WIDGET_CONTROL, | ||
11147 | on ? PIN_OUT : 0); | ||
11148 | - cx_auto_turn_eapd(codec, num_pins, pins, on); | ||
11149 | + if (spec->pin_eapd_ctrls) | ||
11150 | + cx_auto_turn_eapd(codec, num_pins, pins, on); | ||
11151 | } | ||
11152 | |||
11153 | static int detect_jacks(struct hda_codec *codec, int num_pins, hda_nid_t *pins) | ||
11154 | @@ -3503,9 +3507,12 @@ static void cx_auto_update_speakers(struct hda_codec *codec) | ||
11155 | int on = 1; | ||
11156 | |||
11157 | /* turn on HP EAPD when HP jacks are present */ | ||
11158 | - if (spec->auto_mute) | ||
11159 | - on = spec->hp_present; | ||
11160 | - cx_auto_turn_eapd(codec, cfg->hp_outs, cfg->hp_pins, on); | ||
11161 | + if (spec->pin_eapd_ctrls) { | ||
11162 | + if (spec->auto_mute) | ||
11163 | + on = spec->hp_present; | ||
11164 | + cx_auto_turn_eapd(codec, cfg->hp_outs, cfg->hp_pins, on); | ||
11165 | + } | ||
11166 | + | ||
11167 | /* mute speakers in auto-mode if HP or LO jacks are plugged */ | ||
11168 | if (spec->auto_mute) | ||
11169 | on = !(spec->hp_present || | ||
11170 | @@ -3932,20 +3939,10 @@ static void cx_auto_parse_beep(struct hda_codec *codec) | ||
11171 | #define cx_auto_parse_beep(codec) | ||
11172 | #endif | ||
11173 | |||
11174 | -static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums) | ||
11175 | -{ | ||
11176 | - int i; | ||
11177 | - for (i = 0; i < nums; i++) | ||
11178 | - if (list[i] == nid) | ||
11179 | - return true; | ||
11180 | - return false; | ||
11181 | -} | ||
11182 | - | ||
11183 | -/* parse extra-EAPD that aren't assigned to any pins */ | ||
11184 | +/* parse EAPDs */ | ||
11185 | static void cx_auto_parse_eapd(struct hda_codec *codec) | ||
11186 | { | ||
11187 | struct conexant_spec *spec = codec->spec; | ||
11188 | - struct auto_pin_cfg *cfg = &spec->autocfg; | ||
11189 | hda_nid_t nid, end_nid; | ||
11190 | |||
11191 | end_nid = codec->start_nid + codec->num_nodes; | ||
11192 | @@ -3954,14 +3951,18 @@ static void cx_auto_parse_eapd(struct hda_codec *codec) | ||
11193 | continue; | ||
11194 | if (!(snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)) | ||
11195 | continue; | ||
11196 | - if (found_in_nid_list(nid, cfg->line_out_pins, cfg->line_outs) || | ||
11197 | - found_in_nid_list(nid, cfg->hp_pins, cfg->hp_outs) || | ||
11198 | - found_in_nid_list(nid, cfg->speaker_pins, cfg->speaker_outs)) | ||
11199 | - continue; | ||
11200 | spec->eapds[spec->num_eapds++] = nid; | ||
11201 | if (spec->num_eapds >= ARRAY_SIZE(spec->eapds)) | ||
11202 | break; | ||
11203 | } | ||
11204 | + | ||
11205 | + /* NOTE: below is a wild guess; if we have more than two EAPDs, | ||
11206 | + * it's a new chip, where EAPDs are supposed to be associated to | ||
11207 | + * pins, and we can control EAPD per pin. | ||
11208 | + * OTOH, if only one or two EAPDs are found, it's an old chip, | ||
11209 | + * thus it might control over all pins. | ||
11210 | + */ | ||
11211 | + spec->pin_eapd_ctrls = spec->num_eapds > 2; | ||
11212 | } | ||
11213 | |||
11214 | static int cx_auto_parse_auto_config(struct hda_codec *codec) | ||
11215 | @@ -4067,8 +4068,9 @@ static void cx_auto_init_output(struct hda_codec *codec) | ||
11216 | } | ||
11217 | } | ||
11218 | cx_auto_update_speakers(codec); | ||
11219 | - /* turn on/off extra EAPDs, too */ | ||
11220 | - cx_auto_turn_eapd(codec, spec->num_eapds, spec->eapds, true); | ||
11221 | + /* turn on all EAPDs if no individual EAPD control is available */ | ||
11222 | + if (!spec->pin_eapd_ctrls) | ||
11223 | + cx_auto_turn_eapd(codec, spec->num_eapds, spec->eapds, true); | ||
11224 | } | ||
11225 | |||
11226 | static void cx_auto_init_input(struct hda_codec *codec) | ||
11227 | @@ -4255,6 +4257,8 @@ static int cx_auto_add_capture_volume(struct hda_codec *codec, hda_nid_t nid, | ||
11228 | int idx = get_input_connection(codec, adc_nid, nid); | ||
11229 | if (idx < 0) | ||
11230 | continue; | ||
11231 | + if (spec->single_adc_amp) | ||
11232 | + idx = 0; | ||
11233 | return cx_auto_add_volume_idx(codec, label, pfx, | ||
11234 | cidx, adc_nid, HDA_INPUT, idx); | ||
11235 | } | ||
11236 | @@ -4295,14 +4299,21 @@ static int cx_auto_build_input_controls(struct hda_codec *codec) | ||
11237 | struct hda_input_mux *imux = &spec->private_imux; | ||
11238 | const char *prev_label; | ||
11239 | int input_conn[HDA_MAX_NUM_INPUTS]; | ||
11240 | - int i, err, cidx; | ||
11241 | + int i, j, err, cidx; | ||
11242 | int multi_connection; | ||
11243 | |||
11244 | + if (!imux->num_items) | ||
11245 | + return 0; | ||
11246 | + | ||
11247 | multi_connection = 0; | ||
11248 | for (i = 0; i < imux->num_items; i++) { | ||
11249 | cidx = get_input_connection(codec, spec->imux_info[i].adc, | ||
11250 | spec->imux_info[i].pin); | ||
11251 | - input_conn[i] = (spec->imux_info[i].adc << 8) | cidx; | ||
11252 | + if (cidx < 0) | ||
11253 | + continue; | ||
11254 | + input_conn[i] = spec->imux_info[i].adc; | ||
11255 | + if (!spec->single_adc_amp) | ||
11256 | + input_conn[i] |= cidx << 8; | ||
11257 | if (i > 0 && input_conn[i] != input_conn[0]) | ||
11258 | multi_connection = 1; | ||
11259 | } | ||
11260 | @@ -4331,6 +4342,15 @@ static int cx_auto_build_input_controls(struct hda_codec *codec) | ||
11261 | err = cx_auto_add_capture_volume(codec, nid, | ||
11262 | "Capture", "", cidx); | ||
11263 | } else { | ||
11264 | + bool dup_found = false; | ||
11265 | + for (j = 0; j < i; j++) { | ||
11266 | + if (input_conn[j] == input_conn[i]) { | ||
11267 | + dup_found = true; | ||
11268 | + break; | ||
11269 | + } | ||
11270 | + } | ||
11271 | + if (dup_found) | ||
11272 | + continue; | ||
11273 | err = cx_auto_add_capture_volume(codec, nid, | ||
11274 | label, " Capture", cidx); | ||
11275 | } | ||
11276 | @@ -4407,6 +4427,13 @@ static int patch_conexant_auto(struct hda_codec *codec) | ||
11277 | return -ENOMEM; | ||
11278 | codec->spec = spec; | ||
11279 | codec->pin_amp_workaround = 1; | ||
11280 | + | ||
11281 | + switch (codec->vendor_id) { | ||
11282 | + case 0x14f15045: | ||
11283 | + spec->single_adc_amp = 1; | ||
11284 | + break; | ||
11285 | + } | ||
11286 | + | ||
11287 | err = cx_auto_search_adcs(codec); | ||
11288 | if (err < 0) | ||
11289 | return err; | ||
11290 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
11291 | index 7a73621..be79c9f 100644 | ||
11292 | --- a/sound/pci/hda/patch_realtek.c | ||
11293 | +++ b/sound/pci/hda/patch_realtek.c | ||
11294 | @@ -1566,27 +1566,29 @@ static void alc_auto_init_digital(struct hda_codec *codec) | ||
11295 | static void alc_auto_parse_digital(struct hda_codec *codec) | ||
11296 | { | ||
11297 | struct alc_spec *spec = codec->spec; | ||
11298 | - int i, err; | ||
11299 | + int i, err, nums; | ||
11300 | hda_nid_t dig_nid; | ||
11301 | |||
11302 | /* support multiple SPDIFs; the secondary is set up as a slave */ | ||
11303 | + nums = 0; | ||
11304 | for (i = 0; i < spec->autocfg.dig_outs; i++) { | ||
11305 | hda_nid_t conn[4]; | ||
11306 | err = snd_hda_get_connections(codec, | ||
11307 | spec->autocfg.dig_out_pins[i], | ||
11308 | conn, ARRAY_SIZE(conn)); | ||
11309 | - if (err < 0) | ||
11310 | + if (err <= 0) | ||
11311 | continue; | ||
11312 | dig_nid = conn[0]; /* assume the first element is audio-out */ | ||
11313 | - if (!i) { | ||
11314 | + if (!nums) { | ||
11315 | spec->multiout.dig_out_nid = dig_nid; | ||
11316 | spec->dig_out_type = spec->autocfg.dig_out_type[0]; | ||
11317 | } else { | ||
11318 | spec->multiout.slave_dig_outs = spec->slave_dig_outs; | ||
11319 | - if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1) | ||
11320 | + if (nums >= ARRAY_SIZE(spec->slave_dig_outs) - 1) | ||
11321 | break; | ||
11322 | - spec->slave_dig_outs[i - 1] = dig_nid; | ||
11323 | + spec->slave_dig_outs[nums - 1] = dig_nid; | ||
11324 | } | ||
11325 | + nums++; | ||
11326 | } | ||
11327 | |||
11328 | if (spec->autocfg.dig_in_pin) { | ||
11329 | @@ -2232,6 +2234,7 @@ static int alc_build_pcms(struct hda_codec *codec) | ||
11330 | struct alc_spec *spec = codec->spec; | ||
11331 | struct hda_pcm *info = spec->pcm_rec; | ||
11332 | const struct hda_pcm_stream *p; | ||
11333 | + bool have_multi_adcs; | ||
11334 | int i; | ||
11335 | |||
11336 | codec->num_pcms = 1; | ||
11337 | @@ -2310,8 +2313,11 @@ static int alc_build_pcms(struct hda_codec *codec) | ||
11338 | /* If the use of more than one ADC is requested for the current | ||
11339 | * model, configure a second analog capture-only PCM. | ||
11340 | */ | ||
11341 | + have_multi_adcs = (spec->num_adc_nids > 1) && | ||
11342 | + !spec->dyn_adc_switch && !spec->auto_mic && | ||
11343 | + (!spec->input_mux || spec->input_mux->num_items > 1); | ||
11344 | /* Additional Analaog capture for index #2 */ | ||
11345 | - if (spec->alt_dac_nid || spec->num_adc_nids > 1) { | ||
11346 | + if (spec->alt_dac_nid || have_multi_adcs) { | ||
11347 | codec->num_pcms = 3; | ||
11348 | info = spec->pcm_rec + 2; | ||
11349 | info->name = spec->stream_name_analog; | ||
11350 | @@ -2327,7 +2333,7 @@ static int alc_build_pcms(struct hda_codec *codec) | ||
11351 | alc_pcm_null_stream; | ||
11352 | info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0; | ||
11353 | } | ||
11354 | - if (spec->num_adc_nids > 1) { | ||
11355 | + if (have_multi_adcs) { | ||
11356 | p = spec->stream_analog_alt_capture; | ||
11357 | if (!p) | ||
11358 | p = &alc_pcm_analog_alt_capture; | ||
11359 | @@ -3071,6 +3077,12 @@ static void alc_auto_set_output_and_unmute(struct hda_codec *codec, | ||
11360 | if (nid) | ||
11361 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, | ||
11362 | AMP_OUT_ZERO); | ||
11363 | + | ||
11364 | + /* unmute DAC if it's not assigned to a mixer */ | ||
11365 | + nid = alc_look_for_out_mute_nid(codec, pin, dac); | ||
11366 | + if (nid == mix && nid_has_mute(codec, dac, HDA_OUTPUT)) | ||
11367 | + snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE, | ||
11368 | + AMP_OUT_ZERO); | ||
11369 | } | ||
11370 | |||
11371 | static void alc_auto_init_multi_out(struct hda_codec *codec) | ||
11372 | @@ -5421,6 +5433,8 @@ static const struct hda_codec_preset snd_hda_preset_realtek[] = { | ||
11373 | .patch = patch_alc882 }, | ||
11374 | { .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1", | ||
11375 | .patch = patch_alc662 }, | ||
11376 | + { .id = 0x10ec0662, .rev = 0x100300, .name = "ALC662 rev3", | ||
11377 | + .patch = patch_alc662 }, | ||
11378 | { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 }, | ||
11379 | { .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 }, | ||
11380 | { .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 }, | ||
11381 | diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c | ||
11382 | index 987e3cf..d0671a8 100644 | ||
11383 | --- a/sound/pci/hda/patch_sigmatel.c | ||
11384 | +++ b/sound/pci/hda/patch_sigmatel.c | ||
11385 | @@ -5585,9 +5585,7 @@ static void stac92hd8x_fill_auto_spec(struct hda_codec *codec) | ||
11386 | static int patch_stac92hd83xxx(struct hda_codec *codec) | ||
11387 | { | ||
11388 | struct sigmatel_spec *spec; | ||
11389 | - hda_nid_t conn[STAC92HD83_DAC_COUNT + 1]; | ||
11390 | int err; | ||
11391 | - int num_dacs; | ||
11392 | |||
11393 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | ||
11394 | if (spec == NULL) | ||
11395 | @@ -5627,26 +5625,8 @@ again: | ||
11396 | stac92xx_set_config_regs(codec, | ||
11397 | stac92hd83xxx_brd_tbl[spec->board_config]); | ||
11398 | |||
11399 | - switch (codec->vendor_id) { | ||
11400 | - case 0x111d76d1: | ||
11401 | - case 0x111d76d9: | ||
11402 | - case 0x111d76df: | ||
11403 | - case 0x111d76e5: | ||
11404 | - case 0x111d7666: | ||
11405 | - case 0x111d7667: | ||
11406 | - case 0x111d7668: | ||
11407 | - case 0x111d7669: | ||
11408 | - case 0x111d76e3: | ||
11409 | - case 0x111d7604: | ||
11410 | - case 0x111d76d4: | ||
11411 | - case 0x111d7605: | ||
11412 | - case 0x111d76d5: | ||
11413 | - case 0x111d76e7: | ||
11414 | - if (spec->board_config == STAC_92HD83XXX_PWR_REF) | ||
11415 | - break; | ||
11416 | + if (spec->board_config != STAC_92HD83XXX_PWR_REF) | ||
11417 | spec->num_pwrs = 0; | ||
11418 | - break; | ||
11419 | - } | ||
11420 | |||
11421 | codec->patch_ops = stac92xx_patch_ops; | ||
11422 | |||
11423 | @@ -5673,7 +5653,11 @@ again: | ||
11424 | } | ||
11425 | #endif | ||
11426 | |||
11427 | - err = stac92xx_parse_auto_config(codec, 0x1d, 0); | ||
11428 | + /* 92HD65/66 series has S/PDIF-IN */ | ||
11429 | + if (codec->vendor_id >= 0x111d76e8 && codec->vendor_id <= 0x111d76f3) | ||
11430 | + err = stac92xx_parse_auto_config(codec, 0x1d, 0x22); | ||
11431 | + else | ||
11432 | + err = stac92xx_parse_auto_config(codec, 0x1d, 0); | ||
11433 | if (!err) { | ||
11434 | if (spec->board_config < 0) { | ||
11435 | printk(KERN_WARNING "hda_codec: No auto-config is " | ||
11436 | @@ -5689,22 +5673,6 @@ again: | ||
11437 | return err; | ||
11438 | } | ||
11439 | |||
11440 | - /* docking output support */ | ||
11441 | - num_dacs = snd_hda_get_connections(codec, 0xF, | ||
11442 | - conn, STAC92HD83_DAC_COUNT + 1) - 1; | ||
11443 | - /* skip non-DAC connections */ | ||
11444 | - while (num_dacs >= 0 && | ||
11445 | - (get_wcaps_type(get_wcaps(codec, conn[num_dacs])) | ||
11446 | - != AC_WID_AUD_OUT)) | ||
11447 | - num_dacs--; | ||
11448 | - /* set port E and F to select the last DAC */ | ||
11449 | - if (num_dacs >= 0) { | ||
11450 | - snd_hda_codec_write_cache(codec, 0xE, 0, | ||
11451 | - AC_VERB_SET_CONNECT_SEL, num_dacs); | ||
11452 | - snd_hda_codec_write_cache(codec, 0xF, 0, | ||
11453 | - AC_VERB_SET_CONNECT_SEL, num_dacs); | ||
11454 | - } | ||
11455 | - | ||
11456 | codec->proc_widget_hook = stac92hd_proc_hook; | ||
11457 | |||
11458 | return 0; | ||
11459 | @@ -6579,6 +6547,18 @@ static const struct hda_codec_preset snd_hda_preset_sigmatel[] = { | ||
11460 | { .id = 0x111d76e3, .name = "92HD98BXX", .patch = patch_stac92hd83xxx}, | ||
11461 | { .id = 0x111d76e5, .name = "92HD99BXX", .patch = patch_stac92hd83xxx}, | ||
11462 | { .id = 0x111d76e7, .name = "92HD90BXX", .patch = patch_stac92hd83xxx}, | ||
11463 | + { .id = 0x111d76e8, .name = "92HD66B1X5", .patch = patch_stac92hd83xxx}, | ||
11464 | + { .id = 0x111d76e9, .name = "92HD66B2X5", .patch = patch_stac92hd83xxx}, | ||
11465 | + { .id = 0x111d76ea, .name = "92HD66B3X5", .patch = patch_stac92hd83xxx}, | ||
11466 | + { .id = 0x111d76eb, .name = "92HD66C1X5", .patch = patch_stac92hd83xxx}, | ||
11467 | + { .id = 0x111d76ec, .name = "92HD66C2X5", .patch = patch_stac92hd83xxx}, | ||
11468 | + { .id = 0x111d76ed, .name = "92HD66C3X5", .patch = patch_stac92hd83xxx}, | ||
11469 | + { .id = 0x111d76ee, .name = "92HD66B1X3", .patch = patch_stac92hd83xxx}, | ||
11470 | + { .id = 0x111d76ef, .name = "92HD66B2X3", .patch = patch_stac92hd83xxx}, | ||
11471 | + { .id = 0x111d76f0, .name = "92HD66B3X3", .patch = patch_stac92hd83xxx}, | ||
11472 | + { .id = 0x111d76f1, .name = "92HD66C1X3", .patch = patch_stac92hd83xxx}, | ||
11473 | + { .id = 0x111d76f2, .name = "92HD66C2X3", .patch = patch_stac92hd83xxx}, | ||
11474 | + { .id = 0x111d76f3, .name = "92HD66C3/65", .patch = patch_stac92hd83xxx}, | ||
11475 | {} /* terminator */ | ||
11476 | }; | ||
11477 | |||
11478 | diff --git a/sound/soc/codecs/ak4535.c b/sound/soc/codecs/ak4535.c | ||
11479 | index e1a214e..65abd09 100644 | ||
11480 | --- a/sound/soc/codecs/ak4535.c | ||
11481 | +++ b/sound/soc/codecs/ak4535.c | ||
11482 | @@ -40,11 +40,11 @@ struct ak4535_priv { | ||
11483 | /* | ||
11484 | * ak4535 register cache | ||
11485 | */ | ||
11486 | -static const u16 ak4535_reg[AK4535_CACHEREGNUM] = { | ||
11487 | - 0x0000, 0x0080, 0x0000, 0x0003, | ||
11488 | - 0x0002, 0x0000, 0x0011, 0x0001, | ||
11489 | - 0x0000, 0x0040, 0x0036, 0x0010, | ||
11490 | - 0x0000, 0x0000, 0x0057, 0x0000, | ||
11491 | +static const u8 ak4535_reg[AK4535_CACHEREGNUM] = { | ||
11492 | + 0x00, 0x80, 0x00, 0x03, | ||
11493 | + 0x02, 0x00, 0x11, 0x01, | ||
11494 | + 0x00, 0x40, 0x36, 0x10, | ||
11495 | + 0x00, 0x00, 0x57, 0x00, | ||
11496 | }; | ||
11497 | |||
11498 | /* | ||
11499 | diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c | ||
11500 | index 65f4604..79c1b3d 100644 | ||
11501 | --- a/sound/soc/codecs/ak4642.c | ||
11502 | +++ b/sound/soc/codecs/ak4642.c | ||
11503 | @@ -162,17 +162,17 @@ struct ak4642_priv { | ||
11504 | /* | ||
11505 | * ak4642 register cache | ||
11506 | */ | ||
11507 | -static const u16 ak4642_reg[AK4642_CACHEREGNUM] = { | ||
11508 | - 0x0000, 0x0000, 0x0001, 0x0000, | ||
11509 | - 0x0002, 0x0000, 0x0000, 0x0000, | ||
11510 | - 0x00e1, 0x00e1, 0x0018, 0x0000, | ||
11511 | - 0x00e1, 0x0018, 0x0011, 0x0008, | ||
11512 | - 0x0000, 0x0000, 0x0000, 0x0000, | ||
11513 | - 0x0000, 0x0000, 0x0000, 0x0000, | ||
11514 | - 0x0000, 0x0000, 0x0000, 0x0000, | ||
11515 | - 0x0000, 0x0000, 0x0000, 0x0000, | ||
11516 | - 0x0000, 0x0000, 0x0000, 0x0000, | ||
11517 | - 0x0000, | ||
11518 | +static const u8 ak4642_reg[AK4642_CACHEREGNUM] = { | ||
11519 | + 0x00, 0x00, 0x01, 0x00, | ||
11520 | + 0x02, 0x00, 0x00, 0x00, | ||
11521 | + 0xe1, 0xe1, 0x18, 0x00, | ||
11522 | + 0xe1, 0x18, 0x11, 0x08, | ||
11523 | + 0x00, 0x00, 0x00, 0x00, | ||
11524 | + 0x00, 0x00, 0x00, 0x00, | ||
11525 | + 0x00, 0x00, 0x00, 0x00, | ||
11526 | + 0x00, 0x00, 0x00, 0x00, | ||
11527 | + 0x00, 0x00, 0x00, 0x00, | ||
11528 | + 0x00, | ||
11529 | }; | ||
11530 | |||
11531 | /* | ||
11532 | diff --git a/sound/soc/codecs/wm8711.c b/sound/soc/codecs/wm8711.c | ||
11533 | index a537e4a..1dae5c4 100644 | ||
11534 | --- a/sound/soc/codecs/wm8711.c | ||
11535 | +++ b/sound/soc/codecs/wm8711.c | ||
11536 | @@ -150,7 +150,7 @@ static int wm8711_hw_params(struct snd_pcm_substream *substream, | ||
11537 | { | ||
11538 | struct snd_soc_codec *codec = dai->codec; | ||
11539 | struct wm8711_priv *wm8711 = snd_soc_codec_get_drvdata(codec); | ||
11540 | - u16 iface = snd_soc_read(codec, WM8711_IFACE) & 0xfffc; | ||
11541 | + u16 iface = snd_soc_read(codec, WM8711_IFACE) & 0xfff3; | ||
11542 | int i = get_coeff(wm8711->sysclk, params_rate(params)); | ||
11543 | u16 srate = (coeff_div[i].sr << 2) | | ||
11544 | (coeff_div[i].bosr << 1) | coeff_div[i].usb; | ||
11545 | @@ -231,7 +231,7 @@ static int wm8711_set_dai_fmt(struct snd_soc_dai *codec_dai, | ||
11546 | unsigned int fmt) | ||
11547 | { | ||
11548 | struct snd_soc_codec *codec = codec_dai->codec; | ||
11549 | - u16 iface = 0; | ||
11550 | + u16 iface = snd_soc_read(codec, WM8711_IFACE) & 0x000c; | ||
11551 | |||
11552 | /* set master/slave audio interface */ | ||
11553 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { | ||
11554 | diff --git a/sound/soc/codecs/wm8741.c b/sound/soc/codecs/wm8741.c | ||
11555 | index 25af901..c173aee 100644 | ||
11556 | --- a/sound/soc/codecs/wm8741.c | ||
11557 | +++ b/sound/soc/codecs/wm8741.c | ||
11558 | @@ -337,10 +337,10 @@ static int wm8741_set_dai_fmt(struct snd_soc_dai *codec_dai, | ||
11559 | iface |= 0x0004; | ||
11560 | break; | ||
11561 | case SND_SOC_DAIFMT_DSP_A: | ||
11562 | - iface |= 0x0003; | ||
11563 | + iface |= 0x000C; | ||
11564 | break; | ||
11565 | case SND_SOC_DAIFMT_DSP_B: | ||
11566 | - iface |= 0x0013; | ||
11567 | + iface |= 0x001C; | ||
11568 | break; | ||
11569 | default: | ||
11570 | return -EINVAL; | ||
11571 | diff --git a/sound/soc/codecs/wm8904.c b/sound/soc/codecs/wm8904.c | ||
11572 | index b085575..cbba0b1 100644 | ||
11573 | --- a/sound/soc/codecs/wm8904.c | ||
11574 | +++ b/sound/soc/codecs/wm8904.c | ||
11575 | @@ -868,7 +868,7 @@ SOC_ENUM("Right Capture Mode", rin_mode), | ||
11576 | SOC_DOUBLE_R("Capture Volume", WM8904_ANALOGUE_LEFT_INPUT_0, | ||
11577 | WM8904_ANALOGUE_RIGHT_INPUT_0, 0, 31, 0), | ||
11578 | SOC_DOUBLE_R("Capture Switch", WM8904_ANALOGUE_LEFT_INPUT_0, | ||
11579 | - WM8904_ANALOGUE_RIGHT_INPUT_0, 7, 1, 0), | ||
11580 | + WM8904_ANALOGUE_RIGHT_INPUT_0, 7, 1, 1), | ||
11581 | |||
11582 | SOC_SINGLE("High Pass Filter Switch", WM8904_ADC_DIGITAL_0, 4, 1, 0), | ||
11583 | SOC_ENUM("High Pass Filter Mode", hpf_mode), | ||
11584 | diff --git a/sound/soc/codecs/wm8940.c b/sound/soc/codecs/wm8940.c | ||
11585 | index 056daa0..d40da04 100644 | ||
11586 | --- a/sound/soc/codecs/wm8940.c | ||
11587 | +++ b/sound/soc/codecs/wm8940.c | ||
11588 | @@ -470,6 +470,8 @@ static int wm8940_set_bias_level(struct snd_soc_codec *codec, | ||
11589 | break; | ||
11590 | } | ||
11591 | |||
11592 | + codec->dapm.bias_level = level; | ||
11593 | + | ||
11594 | return ret; | ||
11595 | } | ||
11596 | |||
11597 | diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c | ||
11598 | index d2c315f..c610675 100644 | ||
11599 | --- a/sound/soc/codecs/wm8962.c | ||
11600 | +++ b/sound/soc/codecs/wm8962.c | ||
11601 | @@ -1959,7 +1959,13 @@ static int wm8962_readable_register(struct snd_soc_codec *codec, unsigned int re | ||
11602 | |||
11603 | static int wm8962_reset(struct snd_soc_codec *codec) | ||
11604 | { | ||
11605 | - return snd_soc_write(codec, WM8962_SOFTWARE_RESET, 0x6243); | ||
11606 | + int ret; | ||
11607 | + | ||
11608 | + ret = snd_soc_write(codec, WM8962_SOFTWARE_RESET, 0x6243); | ||
11609 | + if (ret != 0) | ||
11610 | + return ret; | ||
11611 | + | ||
11612 | + return snd_soc_write(codec, WM8962_PLL_SOFTWARE_RESET, 0); | ||
11613 | } | ||
11614 | |||
11615 | static const DECLARE_TLV_DB_SCALE(inpga_tlv, -2325, 75, 0); | ||
11616 | @@ -2021,7 +2027,6 @@ static int wm8962_put_spk_sw(struct snd_kcontrol *kcontrol, | ||
11617 | struct snd_ctl_elem_value *ucontrol) | ||
11618 | { | ||
11619 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | ||
11620 | - u16 *reg_cache = codec->reg_cache; | ||
11621 | int ret; | ||
11622 | |||
11623 | /* Apply the update (if any) */ | ||
11624 | @@ -2030,16 +2035,19 @@ static int wm8962_put_spk_sw(struct snd_kcontrol *kcontrol, | ||
11625 | return 0; | ||
11626 | |||
11627 | /* If the left PGA is enabled hit that VU bit... */ | ||
11628 | - if (reg_cache[WM8962_PWR_MGMT_2] & WM8962_SPKOUTL_PGA_ENA) | ||
11629 | - return snd_soc_write(codec, WM8962_SPKOUTL_VOLUME, | ||
11630 | - reg_cache[WM8962_SPKOUTL_VOLUME]); | ||
11631 | + ret = snd_soc_read(codec, WM8962_PWR_MGMT_2); | ||
11632 | + if (ret & WM8962_SPKOUTL_PGA_ENA) { | ||
11633 | + snd_soc_write(codec, WM8962_SPKOUTL_VOLUME, | ||
11634 | + snd_soc_read(codec, WM8962_SPKOUTL_VOLUME)); | ||
11635 | + return 1; | ||
11636 | + } | ||
11637 | |||
11638 | /* ...otherwise the right. The VU is stereo. */ | ||
11639 | - if (reg_cache[WM8962_PWR_MGMT_2] & WM8962_SPKOUTR_PGA_ENA) | ||
11640 | - return snd_soc_write(codec, WM8962_SPKOUTR_VOLUME, | ||
11641 | - reg_cache[WM8962_SPKOUTR_VOLUME]); | ||
11642 | + if (ret & WM8962_SPKOUTR_PGA_ENA) | ||
11643 | + snd_soc_write(codec, WM8962_SPKOUTR_VOLUME, | ||
11644 | + snd_soc_read(codec, WM8962_SPKOUTR_VOLUME)); | ||
11645 | |||
11646 | - return 0; | ||
11647 | + return 1; | ||
11648 | } | ||
11649 | |||
11650 | static const char *cap_hpf_mode_text[] = { | ||
11651 | @@ -2225,15 +2233,14 @@ static int sysclk_event(struct snd_soc_dapm_widget *w, | ||
11652 | |||
11653 | snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1, | ||
11654 | WM8962_FLL_ENA, WM8962_FLL_ENA); | ||
11655 | - if (wm8962->irq) { | ||
11656 | - timeout = msecs_to_jiffies(5); | ||
11657 | - timeout = wait_for_completion_timeout(&wm8962->fll_lock, | ||
11658 | - timeout); | ||
11659 | |||
11660 | - if (timeout == 0) | ||
11661 | - dev_err(codec->dev, | ||
11662 | - "Timed out starting FLL\n"); | ||
11663 | - } | ||
11664 | + timeout = msecs_to_jiffies(5); | ||
11665 | + timeout = wait_for_completion_timeout(&wm8962->fll_lock, | ||
11666 | + timeout); | ||
11667 | + | ||
11668 | + if (wm8962->irq && timeout == 0) | ||
11669 | + dev_err(codec->dev, | ||
11670 | + "Timed out starting FLL\n"); | ||
11671 | } | ||
11672 | break; | ||
11673 | |||
11674 | @@ -2365,7 +2372,6 @@ static int out_pga_event(struct snd_soc_dapm_widget *w, | ||
11675 | struct snd_kcontrol *kcontrol, int event) | ||
11676 | { | ||
11677 | struct snd_soc_codec *codec = w->codec; | ||
11678 | - u16 *reg_cache = codec->reg_cache; | ||
11679 | int reg; | ||
11680 | |||
11681 | switch (w->shift) { | ||
11682 | @@ -2388,7 +2394,7 @@ static int out_pga_event(struct snd_soc_dapm_widget *w, | ||
11683 | |||
11684 | switch (event) { | ||
11685 | case SND_SOC_DAPM_POST_PMU: | ||
11686 | - return snd_soc_write(codec, reg, reg_cache[reg]); | ||
11687 | + return snd_soc_write(codec, reg, snd_soc_read(codec, reg)); | ||
11688 | default: | ||
11689 | BUG(); | ||
11690 | return -EINVAL; | ||
11691 | @@ -3058,9 +3064,9 @@ static int wm8962_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) | ||
11692 | int aif0 = 0; | ||
11693 | |||
11694 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { | ||
11695 | - case SND_SOC_DAIFMT_DSP_A: | ||
11696 | - aif0 |= WM8962_LRCLK_INV; | ||
11697 | case SND_SOC_DAIFMT_DSP_B: | ||
11698 | + aif0 |= WM8962_LRCLK_INV | 3; | ||
11699 | + case SND_SOC_DAIFMT_DSP_A: | ||
11700 | aif0 |= 3; | ||
11701 | |||
11702 | switch (fmt & SND_SOC_DAIFMT_INV_MASK) { | ||
11703 | @@ -3847,6 +3853,11 @@ static int wm8962_probe(struct snd_soc_codec *codec) | ||
11704 | snd_soc_update_bits(codec, WM8962_CLOCKING2, | ||
11705 | WM8962_CLKREG_OVD, WM8962_CLKREG_OVD); | ||
11706 | |||
11707 | + /* Ensure that the oscillator and PLLs are disabled */ | ||
11708 | + snd_soc_update_bits(codec, WM8962_PLL2, | ||
11709 | + WM8962_OSC_ENA | WM8962_PLL2_ENA | WM8962_PLL3_ENA, | ||
11710 | + 0); | ||
11711 | + | ||
11712 | regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), wm8962->supplies); | ||
11713 | |||
11714 | if (pdata) { | ||
11715 | diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c | ||
11716 | index b393f9f..8468363 100644 | ||
11717 | --- a/sound/soc/codecs/wm8994.c | ||
11718 | +++ b/sound/soc/codecs/wm8994.c | ||
11719 | @@ -1282,7 +1282,7 @@ SND_SOC_DAPM_MUX("AIF2DAC Mux", SND_SOC_NOPM, 0, 0, &aif2dac_mux), | ||
11720 | SND_SOC_DAPM_MUX("AIF2ADC Mux", SND_SOC_NOPM, 0, 0, &aif2adc_mux), | ||
11721 | |||
11722 | SND_SOC_DAPM_AIF_IN("AIF3DACDAT", "AIF3 Playback", 0, SND_SOC_NOPM, 0, 0), | ||
11723 | -SND_SOC_DAPM_AIF_IN("AIF3ADCDAT", "AIF3 Capture", 0, SND_SOC_NOPM, 0, 0), | ||
11724 | +SND_SOC_DAPM_AIF_OUT("AIF3ADCDAT", "AIF3 Capture", 0, SND_SOC_NOPM, 0, 0), | ||
11725 | |||
11726 | SND_SOC_DAPM_SUPPLY("TOCLK", WM8994_CLOCKING_1, 4, 0, NULL, 0), | ||
11727 | |||
11728 | @@ -2311,7 +2311,7 @@ static void wm8994_aif_shutdown(struct snd_pcm_substream *substream, | ||
11729 | rate_reg = WM8994_AIF1_RATE; | ||
11730 | break; | ||
11731 | case 2: | ||
11732 | - rate_reg = WM8994_AIF1_RATE; | ||
11733 | + rate_reg = WM8994_AIF2_RATE; | ||
11734 | break; | ||
11735 | default: | ||
11736 | break; | ||
11737 | diff --git a/sound/soc/codecs/wm8996.c b/sound/soc/codecs/wm8996.c | ||
11738 | index 0cdb9d1..c9c4e5c 100644 | ||
11739 | --- a/sound/soc/codecs/wm8996.c | ||
11740 | +++ b/sound/soc/codecs/wm8996.c | ||
11741 | @@ -1847,7 +1847,7 @@ static int wm8996_hw_params(struct snd_pcm_substream *substream, | ||
11742 | snd_soc_update_bits(codec, lrclk_reg, WM8996_AIF1RX_RATE_MASK, | ||
11743 | lrclk); | ||
11744 | snd_soc_update_bits(codec, WM8996_AIF_CLOCKING_2, | ||
11745 | - WM8996_DSP1_DIV_SHIFT << dsp_shift, dsp); | ||
11746 | + WM8996_DSP1_DIV_MASK << dsp_shift, dsp); | ||
11747 | |||
11748 | return 0; | ||
11749 | } | ||
11750 | diff --git a/sound/usb/misc/ua101.c b/sound/usb/misc/ua101.c | ||
11751 | index 67bec76..c0609c2 100644 | ||
11752 | --- a/sound/usb/misc/ua101.c | ||
11753 | +++ b/sound/usb/misc/ua101.c | ||
11754 | @@ -459,7 +459,8 @@ static void kill_stream_urbs(struct ua101_stream *stream) | ||
11755 | unsigned int i; | ||
11756 | |||
11757 | for (i = 0; i < stream->queue_length; ++i) | ||
11758 | - usb_kill_urb(&stream->urbs[i]->urb); | ||
11759 | + if (stream->urbs[i]) | ||
11760 | + usb_kill_urb(&stream->urbs[i]->urb); | ||
11761 | } | ||
11762 | |||
11763 | static int enable_iso_interface(struct ua101 *ua, unsigned int intf_index) | ||
11764 | @@ -484,6 +485,9 @@ static void disable_iso_interface(struct ua101 *ua, unsigned int intf_index) | ||
11765 | { | ||
11766 | struct usb_host_interface *alts; | ||
11767 | |||
11768 | + if (!ua->intf[intf_index]) | ||
11769 | + return; | ||
11770 | + | ||
11771 | alts = ua->intf[intf_index]->cur_altsetting; | ||
11772 | if (alts->desc.bAlternateSetting != 0) { | ||
11773 | int err = usb_set_interface(ua->dev, | ||
11774 | @@ -1144,27 +1148,37 @@ static void free_stream_urbs(struct ua101_stream *stream) | ||
11775 | { | ||
11776 | unsigned int i; | ||
11777 | |||
11778 | - for (i = 0; i < stream->queue_length; ++i) | ||
11779 | + for (i = 0; i < stream->queue_length; ++i) { | ||
11780 | kfree(stream->urbs[i]); | ||
11781 | + stream->urbs[i] = NULL; | ||
11782 | + } | ||
11783 | } | ||
11784 | |||
11785 | static void free_usb_related_resources(struct ua101 *ua, | ||
11786 | struct usb_interface *interface) | ||
11787 | { | ||
11788 | unsigned int i; | ||
11789 | + struct usb_interface *intf; | ||
11790 | |||
11791 | + mutex_lock(&ua->mutex); | ||
11792 | free_stream_urbs(&ua->capture); | ||
11793 | free_stream_urbs(&ua->playback); | ||
11794 | + mutex_unlock(&ua->mutex); | ||
11795 | free_stream_buffers(ua, &ua->capture); | ||
11796 | free_stream_buffers(ua, &ua->playback); | ||
11797 | |||
11798 | - for (i = 0; i < ARRAY_SIZE(ua->intf); ++i) | ||
11799 | - if (ua->intf[i]) { | ||
11800 | - usb_set_intfdata(ua->intf[i], NULL); | ||
11801 | - if (ua->intf[i] != interface) | ||
11802 | + for (i = 0; i < ARRAY_SIZE(ua->intf); ++i) { | ||
11803 | + mutex_lock(&ua->mutex); | ||
11804 | + intf = ua->intf[i]; | ||
11805 | + ua->intf[i] = NULL; | ||
11806 | + mutex_unlock(&ua->mutex); | ||
11807 | + if (intf) { | ||
11808 | + usb_set_intfdata(intf, NULL); | ||
11809 | + if (intf != interface) | ||
11810 | usb_driver_release_interface(&ua101_driver, | ||
11811 | - ua->intf[i]); | ||
11812 | + intf); | ||
11813 | } | ||
11814 | + } | ||
11815 | } | ||
11816 | |||
11817 | static void ua101_card_free(struct snd_card *card) | ||
11818 | diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c | ||
11819 | index 1c7bfa5..eb25900 100644 | ||
11820 | --- a/tools/perf/util/probe-event.c | ||
11821 | +++ b/tools/perf/util/probe-event.c | ||
11822 | @@ -1956,8 +1956,10 @@ static int __del_trace_probe_event(int fd, struct str_node *ent) | ||
11823 | |||
11824 | pr_debug("Writing event: %s\n", buf); | ||
11825 | ret = write(fd, buf, strlen(buf)); | ||
11826 | - if (ret < 0) | ||
11827 | + if (ret < 0) { | ||
11828 | + ret = -errno; | ||
11829 | goto error; | ||
11830 | + } | ||
11831 | |||
11832 | printf("Remove event: %s\n", ent->s); | ||
11833 | return 0; |