Contents of /trunk/kernel-magellan/patches-3.2/0117-3.2.18-all-fixes.patch
Parent Directory | Revision Log
Revision 1788 -
(show annotations)
(download)
Wed May 30 11:03:02 2012 UTC (12 years, 4 months ago) by niro
File size: 59900 byte(s)
Wed May 30 11:03:02 2012 UTC (12 years, 4 months ago) by niro
File size: 59900 byte(s)
-linux-3.2.18
1 | diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt |
2 | index 589f2da..a4399f5 100644 |
3 | --- a/Documentation/networking/ip-sysctl.txt |
4 | +++ b/Documentation/networking/ip-sysctl.txt |
5 | @@ -137,7 +137,7 @@ tcp_adv_win_scale - INTEGER |
6 | (if tcp_adv_win_scale > 0) or bytes-bytes/2^(-tcp_adv_win_scale), |
7 | if it is <= 0. |
8 | Possible values are [-31, 31], inclusive. |
9 | - Default: 2 |
10 | + Default: 1 |
11 | |
12 | tcp_allowed_congestion_control - STRING |
13 | Show/set the congestion control choices available to non-privileged |
14 | @@ -397,7 +397,7 @@ tcp_rmem - vector of 3 INTEGERs: min, default, max |
15 | net.core.rmem_max. Calling setsockopt() with SO_RCVBUF disables |
16 | automatic tuning of that socket's receive buffer size, in which |
17 | case this value is ignored. |
18 | - Default: between 87380B and 4MB, depending on RAM size. |
19 | + Default: between 87380B and 6MB, depending on RAM size. |
20 | |
21 | tcp_sack - BOOLEAN |
22 | Enable select acknowledgments (SACKS). |
23 | diff --git a/arch/arm/mach-omap2/include/mach/ctrl_module_pad_core_44xx.h b/arch/arm/mach-omap2/include/mach/ctrl_module_pad_core_44xx.h |
24 | index 1e2d332..c88420d 100644 |
25 | --- a/arch/arm/mach-omap2/include/mach/ctrl_module_pad_core_44xx.h |
26 | +++ b/arch/arm/mach-omap2/include/mach/ctrl_module_pad_core_44xx.h |
27 | @@ -941,10 +941,10 @@ |
28 | #define OMAP4_DSI2_LANEENABLE_MASK (0x7 << 29) |
29 | #define OMAP4_DSI1_LANEENABLE_SHIFT 24 |
30 | #define OMAP4_DSI1_LANEENABLE_MASK (0x1f << 24) |
31 | -#define OMAP4_DSI2_PIPD_SHIFT 19 |
32 | -#define OMAP4_DSI2_PIPD_MASK (0x1f << 19) |
33 | -#define OMAP4_DSI1_PIPD_SHIFT 14 |
34 | -#define OMAP4_DSI1_PIPD_MASK (0x1f << 14) |
35 | +#define OMAP4_DSI1_PIPD_SHIFT 19 |
36 | +#define OMAP4_DSI1_PIPD_MASK (0x1f << 19) |
37 | +#define OMAP4_DSI2_PIPD_SHIFT 14 |
38 | +#define OMAP4_DSI2_PIPD_MASK (0x1f << 14) |
39 | |
40 | /* CONTROL_MCBSPLP */ |
41 | #define OMAP4_ALBCTRLRX_FSX_SHIFT 31 |
42 | diff --git a/arch/arm/mach-orion5x/mpp.h b/arch/arm/mach-orion5x/mpp.h |
43 | index eac6897..db70e79 100644 |
44 | --- a/arch/arm/mach-orion5x/mpp.h |
45 | +++ b/arch/arm/mach-orion5x/mpp.h |
46 | @@ -65,8 +65,8 @@ |
47 | #define MPP8_GIGE MPP(8, 0x1, 0, 0, 1, 1, 1) |
48 | |
49 | #define MPP9_UNUSED MPP(9, 0x0, 0, 0, 1, 1, 1) |
50 | -#define MPP9_GPIO MPP(9, 0x0, 0, 0, 1, 1, 1) |
51 | -#define MPP9_GIGE MPP(9, 0x1, 1, 1, 1, 1, 1) |
52 | +#define MPP9_GPIO MPP(9, 0x0, 1, 1, 1, 1, 1) |
53 | +#define MPP9_GIGE MPP(9, 0x1, 0, 0, 1, 1, 1) |
54 | |
55 | #define MPP10_UNUSED MPP(10, 0x0, 0, 0, 1, 1, 1) |
56 | #define MPP10_GPIO MPP(10, 0x0, 1, 1, 1, 1, 1) |
57 | diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c |
58 | index aa33949..4b0bc37 100644 |
59 | --- a/arch/arm/mm/fault.c |
60 | +++ b/arch/arm/mm/fault.c |
61 | @@ -267,7 +267,9 @@ good_area: |
62 | return fault; |
63 | |
64 | check_stack: |
65 | - if (vma->vm_flags & VM_GROWSDOWN && !expand_stack(vma, addr)) |
66 | + /* Don't allow expansion below FIRST_USER_ADDRESS */ |
67 | + if (vma->vm_flags & VM_GROWSDOWN && |
68 | + addr >= FIRST_USER_ADDRESS && !expand_stack(vma, addr)) |
69 | goto good_area; |
70 | out: |
71 | return fault; |
72 | diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c |
73 | index 8f3ccdd..8ea07e4 100644 |
74 | --- a/arch/arm/vfp/vfpmodule.c |
75 | +++ b/arch/arm/vfp/vfpmodule.c |
76 | @@ -11,6 +11,7 @@ |
77 | #include <linux/types.h> |
78 | #include <linux/cpu.h> |
79 | #include <linux/cpu_pm.h> |
80 | +#include <linux/hardirq.h> |
81 | #include <linux/kernel.h> |
82 | #include <linux/notifier.h> |
83 | #include <linux/signal.h> |
84 | @@ -428,7 +429,10 @@ void VFP_bounce(u32 trigger, u32 fpexc, struct pt_regs *regs) |
85 | |
86 | static void vfp_enable(void *unused) |
87 | { |
88 | - u32 access = get_copro_access(); |
89 | + u32 access; |
90 | + |
91 | + BUG_ON(preemptible()); |
92 | + access = get_copro_access(); |
93 | |
94 | /* |
95 | * Enable full access to VFP (cp10 and cp11) |
96 | @@ -556,7 +560,7 @@ static int __init vfp_init(void) |
97 | unsigned int cpu_arch = cpu_architecture(); |
98 | |
99 | if (cpu_arch >= CPU_ARCH_ARMv6) |
100 | - vfp_enable(NULL); |
101 | + on_each_cpu(vfp_enable, NULL, 1); |
102 | |
103 | /* |
104 | * First check that there is a VFP that we can use. |
105 | @@ -577,8 +581,6 @@ static int __init vfp_init(void) |
106 | } else { |
107 | hotcpu_notifier(vfp_hotplug, 0); |
108 | |
109 | - smp_call_function(vfp_enable, NULL, 1); |
110 | - |
111 | VFP_arch = (vfpsid & FPSID_ARCH_MASK) >> FPSID_ARCH_BIT; /* Extract the architecture version */ |
112 | printk("implementor %02x architecture %d part %02x variant %x rev %x\n", |
113 | (vfpsid & FPSID_IMPLEMENTER_MASK) >> FPSID_IMPLEMENTER_BIT, |
114 | diff --git a/arch/ia64/include/asm/unistd.h b/arch/ia64/include/asm/unistd.h |
115 | index 7617248..7a3bd25 100644 |
116 | --- a/arch/ia64/include/asm/unistd.h |
117 | +++ b/arch/ia64/include/asm/unistd.h |
118 | @@ -323,11 +323,12 @@ |
119 | #define __NR_sendmmsg 1331 |
120 | #define __NR_process_vm_readv 1332 |
121 | #define __NR_process_vm_writev 1333 |
122 | +#define __NR_accept4 1334 |
123 | |
124 | #ifdef __KERNEL__ |
125 | |
126 | |
127 | -#define NR_syscalls 310 /* length of syscall table */ |
128 | +#define NR_syscalls 311 /* length of syscall table */ |
129 | |
130 | /* |
131 | * The following defines stop scripts/checksyscalls.sh from complaining about |
132 | diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S |
133 | index 5b31d46..1ccbe12 100644 |
134 | --- a/arch/ia64/kernel/entry.S |
135 | +++ b/arch/ia64/kernel/entry.S |
136 | @@ -1779,6 +1779,7 @@ sys_call_table: |
137 | data8 sys_sendmmsg |
138 | data8 sys_process_vm_readv |
139 | data8 sys_process_vm_writev |
140 | + data8 sys_accept4 |
141 | |
142 | .org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls |
143 | #endif /* __IA64_ASM_PARAVIRTUALIZED_NATIVE */ |
144 | diff --git a/arch/sparc/kernel/central.c b/arch/sparc/kernel/central.c |
145 | index 38d48a5..9708851 100644 |
146 | --- a/arch/sparc/kernel/central.c |
147 | +++ b/arch/sparc/kernel/central.c |
148 | @@ -269,4 +269,4 @@ static int __init sunfire_init(void) |
149 | return 0; |
150 | } |
151 | |
152 | -subsys_initcall(sunfire_init); |
153 | +fs_initcall(sunfire_init); |
154 | diff --git a/arch/sparc/mm/ultra.S b/arch/sparc/mm/ultra.S |
155 | index b57a594..874162a 100644 |
156 | --- a/arch/sparc/mm/ultra.S |
157 | +++ b/arch/sparc/mm/ultra.S |
158 | @@ -495,11 +495,11 @@ xcall_fetch_glob_regs: |
159 | stx %o7, [%g1 + GR_SNAP_O7] |
160 | stx %i7, [%g1 + GR_SNAP_I7] |
161 | /* Don't try this at home kids... */ |
162 | - rdpr %cwp, %g2 |
163 | - sub %g2, 1, %g7 |
164 | + rdpr %cwp, %g3 |
165 | + sub %g3, 1, %g7 |
166 | wrpr %g7, %cwp |
167 | mov %i7, %g7 |
168 | - wrpr %g2, %cwp |
169 | + wrpr %g3, %cwp |
170 | stx %g7, [%g1 + GR_SNAP_RPC] |
171 | sethi %hi(trap_block), %g7 |
172 | or %g7, %lo(trap_block), %g7 |
173 | diff --git a/arch/tile/kernel/compat_signal.c b/arch/tile/kernel/compat_signal.c |
174 | index a7869ad..41459d8 100644 |
175 | --- a/arch/tile/kernel/compat_signal.c |
176 | +++ b/arch/tile/kernel/compat_signal.c |
177 | @@ -406,19 +406,17 @@ int compat_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, |
178 | * Set up registers for signal handler. |
179 | * Registers that we don't modify keep the value they had from |
180 | * user-space at the time we took the signal. |
181 | + * We always pass siginfo and mcontext, regardless of SA_SIGINFO, |
182 | + * since some things rely on this (e.g. glibc's debug/segfault.c). |
183 | */ |
184 | regs->pc = ptr_to_compat_reg(ka->sa.sa_handler); |
185 | regs->ex1 = PL_ICS_EX1(USER_PL, 1); /* set crit sec in handler */ |
186 | regs->sp = ptr_to_compat_reg(frame); |
187 | regs->lr = restorer; |
188 | regs->regs[0] = (unsigned long) usig; |
189 | - |
190 | - if (ka->sa.sa_flags & SA_SIGINFO) { |
191 | - /* Need extra arguments, so mark to restore caller-saves. */ |
192 | - regs->regs[1] = ptr_to_compat_reg(&frame->info); |
193 | - regs->regs[2] = ptr_to_compat_reg(&frame->uc); |
194 | - regs->flags |= PT_FLAGS_CALLER_SAVES; |
195 | - } |
196 | + regs->regs[1] = ptr_to_compat_reg(&frame->info); |
197 | + regs->regs[2] = ptr_to_compat_reg(&frame->uc); |
198 | + regs->flags |= PT_FLAGS_CALLER_SAVES; |
199 | |
200 | /* |
201 | * Notify any tracer that was single-stepping it. |
202 | diff --git a/drivers/crypto/Kconfig b/drivers/crypto/Kconfig |
203 | index 6d16b4b..7e3002b 100644 |
204 | --- a/drivers/crypto/Kconfig |
205 | +++ b/drivers/crypto/Kconfig |
206 | @@ -173,6 +173,7 @@ config CRYPTO_DEV_MV_CESA |
207 | select CRYPTO_ALGAPI |
208 | select CRYPTO_AES |
209 | select CRYPTO_BLKCIPHER2 |
210 | + select CRYPTO_HASH |
211 | help |
212 | This driver allows you to utilize the Cryptographic Engines and |
213 | Security Accelerator (CESA) which can be found on the Marvell Orion |
214 | diff --git a/drivers/gpio/gpio-ml-ioh.c b/drivers/gpio/gpio-ml-ioh.c |
215 | index 461958f..271fd49 100644 |
216 | --- a/drivers/gpio/gpio-ml-ioh.c |
217 | +++ b/drivers/gpio/gpio-ml-ioh.c |
218 | @@ -448,6 +448,7 @@ static int __devinit ioh_gpio_probe(struct pci_dev *pdev, |
219 | chip->reg = chip->base; |
220 | chip->ch = i; |
221 | mutex_init(&chip->lock); |
222 | + spin_lock_init(&chip->spinlock); |
223 | ioh_gpio_setup(chip, num_ports[i]); |
224 | ret = gpiochip_add(&chip->gpio); |
225 | if (ret) { |
226 | diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c |
227 | index 801d92d..a417f94 100644 |
228 | --- a/drivers/md/dm-mpath.c |
229 | +++ b/drivers/md/dm-mpath.c |
230 | @@ -698,8 +698,8 @@ static int parse_hw_handler(struct dm_arg_set *as, struct multipath *m) |
231 | return 0; |
232 | |
233 | m->hw_handler_name = kstrdup(dm_shift_arg(as), GFP_KERNEL); |
234 | - request_module("scsi_dh_%s", m->hw_handler_name); |
235 | - if (scsi_dh_handler_exist(m->hw_handler_name) == 0) { |
236 | + if (!try_then_request_module(scsi_dh_handler_exist(m->hw_handler_name), |
237 | + "scsi_dh_%s", m->hw_handler_name)) { |
238 | ti->error = "unknown hardware handler type"; |
239 | ret = -EINVAL; |
240 | goto fail; |
241 | diff --git a/drivers/md/md.c b/drivers/md/md.c |
242 | index 065ab4f..adcd850 100644 |
243 | --- a/drivers/md/md.c |
244 | +++ b/drivers/md/md.c |
245 | @@ -392,6 +392,8 @@ void mddev_suspend(struct mddev *mddev) |
246 | synchronize_rcu(); |
247 | wait_event(mddev->sb_wait, atomic_read(&mddev->active_io) == 0); |
248 | mddev->pers->quiesce(mddev, 1); |
249 | + |
250 | + del_timer_sync(&mddev->safemode_timer); |
251 | } |
252 | EXPORT_SYMBOL_GPL(mddev_suspend); |
253 | |
254 | diff --git a/drivers/media/rc/ene_ir.c b/drivers/media/rc/ene_ir.c |
255 | index cf10ecf..ed77c6d 100644 |
256 | --- a/drivers/media/rc/ene_ir.c |
257 | +++ b/drivers/media/rc/ene_ir.c |
258 | @@ -1018,22 +1018,6 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id) |
259 | |
260 | spin_lock_init(&dev->hw_lock); |
261 | |
262 | - /* claim the resources */ |
263 | - error = -EBUSY; |
264 | - dev->hw_io = pnp_port_start(pnp_dev, 0); |
265 | - if (!request_region(dev->hw_io, ENE_IO_SIZE, ENE_DRIVER_NAME)) { |
266 | - dev->hw_io = -1; |
267 | - dev->irq = -1; |
268 | - goto error; |
269 | - } |
270 | - |
271 | - dev->irq = pnp_irq(pnp_dev, 0); |
272 | - if (request_irq(dev->irq, ene_isr, |
273 | - IRQF_SHARED, ENE_DRIVER_NAME, (void *)dev)) { |
274 | - dev->irq = -1; |
275 | - goto error; |
276 | - } |
277 | - |
278 | pnp_set_drvdata(pnp_dev, dev); |
279 | dev->pnp_dev = pnp_dev; |
280 | |
281 | @@ -1086,6 +1070,22 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id) |
282 | device_set_wakeup_capable(&pnp_dev->dev, true); |
283 | device_set_wakeup_enable(&pnp_dev->dev, true); |
284 | |
285 | + /* claim the resources */ |
286 | + error = -EBUSY; |
287 | + dev->hw_io = pnp_port_start(pnp_dev, 0); |
288 | + if (!request_region(dev->hw_io, ENE_IO_SIZE, ENE_DRIVER_NAME)) { |
289 | + dev->hw_io = -1; |
290 | + dev->irq = -1; |
291 | + goto error; |
292 | + } |
293 | + |
294 | + dev->irq = pnp_irq(pnp_dev, 0); |
295 | + if (request_irq(dev->irq, ene_isr, |
296 | + IRQF_SHARED, ENE_DRIVER_NAME, (void *)dev)) { |
297 | + dev->irq = -1; |
298 | + goto error; |
299 | + } |
300 | + |
301 | error = rc_register_device(rdev); |
302 | if (error < 0) |
303 | goto error; |
304 | diff --git a/drivers/media/rc/fintek-cir.c b/drivers/media/rc/fintek-cir.c |
305 | index 7f7079b..4218f73 100644 |
306 | --- a/drivers/media/rc/fintek-cir.c |
307 | +++ b/drivers/media/rc/fintek-cir.c |
308 | @@ -504,16 +504,6 @@ static int fintek_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id |
309 | |
310 | spin_lock_init(&fintek->fintek_lock); |
311 | |
312 | - ret = -EBUSY; |
313 | - /* now claim resources */ |
314 | - if (!request_region(fintek->cir_addr, |
315 | - fintek->cir_port_len, FINTEK_DRIVER_NAME)) |
316 | - goto failure; |
317 | - |
318 | - if (request_irq(fintek->cir_irq, fintek_cir_isr, IRQF_SHARED, |
319 | - FINTEK_DRIVER_NAME, (void *)fintek)) |
320 | - goto failure; |
321 | - |
322 | pnp_set_drvdata(pdev, fintek); |
323 | fintek->pdev = pdev; |
324 | |
325 | @@ -548,6 +538,16 @@ static int fintek_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id |
326 | /* rx resolution is hardwired to 50us atm, 1, 25, 100 also possible */ |
327 | rdev->rx_resolution = US_TO_NS(CIR_SAMPLE_PERIOD); |
328 | |
329 | + ret = -EBUSY; |
330 | + /* now claim resources */ |
331 | + if (!request_region(fintek->cir_addr, |
332 | + fintek->cir_port_len, FINTEK_DRIVER_NAME)) |
333 | + goto failure; |
334 | + |
335 | + if (request_irq(fintek->cir_irq, fintek_cir_isr, IRQF_SHARED, |
336 | + FINTEK_DRIVER_NAME, (void *)fintek)) |
337 | + goto failure; |
338 | + |
339 | ret = rc_register_device(rdev); |
340 | if (ret) |
341 | goto failure; |
342 | diff --git a/drivers/media/rc/ite-cir.c b/drivers/media/rc/ite-cir.c |
343 | index 682009d..0e49c99 100644 |
344 | --- a/drivers/media/rc/ite-cir.c |
345 | +++ b/drivers/media/rc/ite-cir.c |
346 | @@ -1515,16 +1515,6 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id |
347 | /* initialize raw event */ |
348 | init_ir_raw_event(&itdev->rawir); |
349 | |
350 | - ret = -EBUSY; |
351 | - /* now claim resources */ |
352 | - if (!request_region(itdev->cir_addr, |
353 | - dev_desc->io_region_size, ITE_DRIVER_NAME)) |
354 | - goto failure; |
355 | - |
356 | - if (request_irq(itdev->cir_irq, ite_cir_isr, IRQF_SHARED, |
357 | - ITE_DRIVER_NAME, (void *)itdev)) |
358 | - goto failure; |
359 | - |
360 | /* set driver data into the pnp device */ |
361 | pnp_set_drvdata(pdev, itdev); |
362 | itdev->pdev = pdev; |
363 | @@ -1600,6 +1590,16 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id |
364 | rdev->driver_name = ITE_DRIVER_NAME; |
365 | rdev->map_name = RC_MAP_RC6_MCE; |
366 | |
367 | + ret = -EBUSY; |
368 | + /* now claim resources */ |
369 | + if (!request_region(itdev->cir_addr, |
370 | + dev_desc->io_region_size, ITE_DRIVER_NAME)) |
371 | + goto failure; |
372 | + |
373 | + if (request_irq(itdev->cir_irq, ite_cir_isr, IRQF_SHARED, |
374 | + ITE_DRIVER_NAME, (void *)itdev)) |
375 | + goto failure; |
376 | + |
377 | ret = rc_register_device(rdev); |
378 | if (ret) |
379 | goto failure; |
380 | diff --git a/drivers/media/rc/nuvoton-cir.c b/drivers/media/rc/nuvoton-cir.c |
381 | index 144f3f5..8b2c071 100644 |
382 | --- a/drivers/media/rc/nuvoton-cir.c |
383 | +++ b/drivers/media/rc/nuvoton-cir.c |
384 | @@ -1021,24 +1021,6 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id) |
385 | spin_lock_init(&nvt->nvt_lock); |
386 | spin_lock_init(&nvt->tx.lock); |
387 | |
388 | - ret = -EBUSY; |
389 | - /* now claim resources */ |
390 | - if (!request_region(nvt->cir_addr, |
391 | - CIR_IOREG_LENGTH, NVT_DRIVER_NAME)) |
392 | - goto failure; |
393 | - |
394 | - if (request_irq(nvt->cir_irq, nvt_cir_isr, IRQF_SHARED, |
395 | - NVT_DRIVER_NAME, (void *)nvt)) |
396 | - goto failure; |
397 | - |
398 | - if (!request_region(nvt->cir_wake_addr, |
399 | - CIR_IOREG_LENGTH, NVT_DRIVER_NAME)) |
400 | - goto failure; |
401 | - |
402 | - if (request_irq(nvt->cir_wake_irq, nvt_cir_wake_isr, IRQF_SHARED, |
403 | - NVT_DRIVER_NAME, (void *)nvt)) |
404 | - goto failure; |
405 | - |
406 | pnp_set_drvdata(pdev, nvt); |
407 | nvt->pdev = pdev; |
408 | |
409 | @@ -1085,6 +1067,24 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id) |
410 | rdev->tx_resolution = XYZ; |
411 | #endif |
412 | |
413 | + ret = -EBUSY; |
414 | + /* now claim resources */ |
415 | + if (!request_region(nvt->cir_addr, |
416 | + CIR_IOREG_LENGTH, NVT_DRIVER_NAME)) |
417 | + goto failure; |
418 | + |
419 | + if (request_irq(nvt->cir_irq, nvt_cir_isr, IRQF_SHARED, |
420 | + NVT_DRIVER_NAME, (void *)nvt)) |
421 | + goto failure; |
422 | + |
423 | + if (!request_region(nvt->cir_wake_addr, |
424 | + CIR_IOREG_LENGTH, NVT_DRIVER_NAME)) |
425 | + goto failure; |
426 | + |
427 | + if (request_irq(nvt->cir_wake_irq, nvt_cir_wake_isr, IRQF_SHARED, |
428 | + NVT_DRIVER_NAME, (void *)nvt)) |
429 | + goto failure; |
430 | + |
431 | ret = rc_register_device(rdev); |
432 | if (ret) |
433 | goto failure; |
434 | diff --git a/drivers/media/rc/winbond-cir.c b/drivers/media/rc/winbond-cir.c |
435 | index a7e7d6f..4591770 100644 |
436 | --- a/drivers/media/rc/winbond-cir.c |
437 | +++ b/drivers/media/rc/winbond-cir.c |
438 | @@ -991,39 +991,10 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id) |
439 | "(w: 0x%lX, e: 0x%lX, s: 0x%lX, i: %u)\n", |
440 | data->wbase, data->ebase, data->sbase, data->irq); |
441 | |
442 | - if (!request_region(data->wbase, WAKEUP_IOMEM_LEN, DRVNAME)) { |
443 | - dev_err(dev, "Region 0x%lx-0x%lx already in use!\n", |
444 | - data->wbase, data->wbase + WAKEUP_IOMEM_LEN - 1); |
445 | - err = -EBUSY; |
446 | - goto exit_free_data; |
447 | - } |
448 | - |
449 | - if (!request_region(data->ebase, EHFUNC_IOMEM_LEN, DRVNAME)) { |
450 | - dev_err(dev, "Region 0x%lx-0x%lx already in use!\n", |
451 | - data->ebase, data->ebase + EHFUNC_IOMEM_LEN - 1); |
452 | - err = -EBUSY; |
453 | - goto exit_release_wbase; |
454 | - } |
455 | - |
456 | - if (!request_region(data->sbase, SP_IOMEM_LEN, DRVNAME)) { |
457 | - dev_err(dev, "Region 0x%lx-0x%lx already in use!\n", |
458 | - data->sbase, data->sbase + SP_IOMEM_LEN - 1); |
459 | - err = -EBUSY; |
460 | - goto exit_release_ebase; |
461 | - } |
462 | - |
463 | - err = request_irq(data->irq, wbcir_irq_handler, |
464 | - IRQF_DISABLED, DRVNAME, device); |
465 | - if (err) { |
466 | - dev_err(dev, "Failed to claim IRQ %u\n", data->irq); |
467 | - err = -EBUSY; |
468 | - goto exit_release_sbase; |
469 | - } |
470 | - |
471 | led_trigger_register_simple("cir-tx", &data->txtrigger); |
472 | if (!data->txtrigger) { |
473 | err = -ENOMEM; |
474 | - goto exit_free_irq; |
475 | + goto exit_free_data; |
476 | } |
477 | |
478 | led_trigger_register_simple("cir-rx", &data->rxtrigger); |
479 | @@ -1062,9 +1033,38 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id) |
480 | data->dev->priv = data; |
481 | data->dev->dev.parent = &device->dev; |
482 | |
483 | + if (!request_region(data->wbase, WAKEUP_IOMEM_LEN, DRVNAME)) { |
484 | + dev_err(dev, "Region 0x%lx-0x%lx already in use!\n", |
485 | + data->wbase, data->wbase + WAKEUP_IOMEM_LEN - 1); |
486 | + err = -EBUSY; |
487 | + goto exit_free_rc; |
488 | + } |
489 | + |
490 | + if (!request_region(data->ebase, EHFUNC_IOMEM_LEN, DRVNAME)) { |
491 | + dev_err(dev, "Region 0x%lx-0x%lx already in use!\n", |
492 | + data->ebase, data->ebase + EHFUNC_IOMEM_LEN - 1); |
493 | + err = -EBUSY; |
494 | + goto exit_release_wbase; |
495 | + } |
496 | + |
497 | + if (!request_region(data->sbase, SP_IOMEM_LEN, DRVNAME)) { |
498 | + dev_err(dev, "Region 0x%lx-0x%lx already in use!\n", |
499 | + data->sbase, data->sbase + SP_IOMEM_LEN - 1); |
500 | + err = -EBUSY; |
501 | + goto exit_release_ebase; |
502 | + } |
503 | + |
504 | + err = request_irq(data->irq, wbcir_irq_handler, |
505 | + IRQF_DISABLED, DRVNAME, device); |
506 | + if (err) { |
507 | + dev_err(dev, "Failed to claim IRQ %u\n", data->irq); |
508 | + err = -EBUSY; |
509 | + goto exit_release_sbase; |
510 | + } |
511 | + |
512 | err = rc_register_device(data->dev); |
513 | if (err) |
514 | - goto exit_free_rc; |
515 | + goto exit_free_irq; |
516 | |
517 | device_init_wakeup(&device->dev, 1); |
518 | |
519 | @@ -1072,14 +1072,6 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id) |
520 | |
521 | return 0; |
522 | |
523 | -exit_free_rc: |
524 | - rc_free_device(data->dev); |
525 | -exit_unregister_led: |
526 | - led_classdev_unregister(&data->led); |
527 | -exit_unregister_rxtrigger: |
528 | - led_trigger_unregister_simple(data->rxtrigger); |
529 | -exit_unregister_txtrigger: |
530 | - led_trigger_unregister_simple(data->txtrigger); |
531 | exit_free_irq: |
532 | free_irq(data->irq, device); |
533 | exit_release_sbase: |
534 | @@ -1088,6 +1080,14 @@ exit_release_ebase: |
535 | release_region(data->ebase, EHFUNC_IOMEM_LEN); |
536 | exit_release_wbase: |
537 | release_region(data->wbase, WAKEUP_IOMEM_LEN); |
538 | +exit_free_rc: |
539 | + rc_free_device(data->dev); |
540 | +exit_unregister_led: |
541 | + led_classdev_unregister(&data->led); |
542 | +exit_unregister_rxtrigger: |
543 | + led_trigger_unregister_simple(data->rxtrigger); |
544 | +exit_unregister_txtrigger: |
545 | + led_trigger_unregister_simple(data->txtrigger); |
546 | exit_free_data: |
547 | kfree(data); |
548 | pnp_set_drvdata(device, NULL); |
549 | diff --git a/drivers/media/video/marvell-ccic/mmp-driver.c b/drivers/media/video/marvell-ccic/mmp-driver.c |
550 | index fb0b124..a6b7657 100644 |
551 | --- a/drivers/media/video/marvell-ccic/mmp-driver.c |
552 | +++ b/drivers/media/video/marvell-ccic/mmp-driver.c |
553 | @@ -175,7 +175,6 @@ static int mmpcam_probe(struct platform_device *pdev) |
554 | INIT_LIST_HEAD(&cam->devlist); |
555 | |
556 | mcam = &cam->mcam; |
557 | - mcam->platform = MHP_Armada610; |
558 | mcam->plat_power_up = mmpcam_power_up; |
559 | mcam->plat_power_down = mmpcam_power_down; |
560 | mcam->dev = &pdev->dev; |
561 | diff --git a/drivers/media/video/s5p-fimc/fimc-capture.c b/drivers/media/video/s5p-fimc/fimc-capture.c |
562 | index 2cc3b91..327a81f 100644 |
563 | --- a/drivers/media/video/s5p-fimc/fimc-capture.c |
564 | +++ b/drivers/media/video/s5p-fimc/fimc-capture.c |
565 | @@ -1304,7 +1304,7 @@ static int fimc_subdev_set_crop(struct v4l2_subdev *sd, |
566 | fimc_capture_try_crop(ctx, r, crop->pad); |
567 | |
568 | if (crop->which == V4L2_SUBDEV_FORMAT_TRY) { |
569 | - mutex_lock(&fimc->lock); |
570 | + mutex_unlock(&fimc->lock); |
571 | *v4l2_subdev_get_try_crop(fh, crop->pad) = *r; |
572 | return 0; |
573 | } |
574 | diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c |
575 | index 3d55883..2dcac28 100644 |
576 | --- a/drivers/net/ethernet/broadcom/tg3.c |
577 | +++ b/drivers/net/ethernet/broadcom/tg3.c |
578 | @@ -879,8 +879,13 @@ static inline unsigned int tg3_has_work(struct tg3_napi *tnapi) |
579 | if (sblk->status & SD_STATUS_LINK_CHG) |
580 | work_exists = 1; |
581 | } |
582 | - /* check for RX/TX work to do */ |
583 | - if (sblk->idx[0].tx_consumer != tnapi->tx_cons || |
584 | + |
585 | + /* check for TX work to do */ |
586 | + if (sblk->idx[0].tx_consumer != tnapi->tx_cons) |
587 | + work_exists = 1; |
588 | + |
589 | + /* check for RX work to do */ |
590 | + if (tnapi->rx_rcb_prod_idx && |
591 | *(tnapi->rx_rcb_prod_idx) != tnapi->rx_rcb_ptr) |
592 | work_exists = 1; |
593 | |
594 | @@ -5895,6 +5900,9 @@ static int tg3_poll_work(struct tg3_napi *tnapi, int work_done, int budget) |
595 | return work_done; |
596 | } |
597 | |
598 | + if (!tnapi->rx_rcb_prod_idx) |
599 | + return work_done; |
600 | + |
601 | /* run RX thread, within the bounds set by NAPI. |
602 | * All RX "locking" is done by ensuring outside |
603 | * code synchronizes with tg3->napi.poll() |
604 | @@ -7448,6 +7456,12 @@ static int tg3_alloc_consistent(struct tg3 *tp) |
605 | */ |
606 | switch (i) { |
607 | default: |
608 | + if (tg3_flag(tp, ENABLE_RSS)) { |
609 | + tnapi->rx_rcb_prod_idx = NULL; |
610 | + break; |
611 | + } |
612 | + /* Fall through */ |
613 | + case 1: |
614 | tnapi->rx_rcb_prod_idx = &sblk->idx[0].rx_producer; |
615 | break; |
616 | case 2: |
617 | diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c |
618 | index cf480b5..de00805 100644 |
619 | --- a/drivers/net/ethernet/intel/e1000/e1000_main.c |
620 | +++ b/drivers/net/ethernet/intel/e1000/e1000_main.c |
621 | @@ -494,7 +494,11 @@ out: |
622 | static void e1000_down_and_stop(struct e1000_adapter *adapter) |
623 | { |
624 | set_bit(__E1000_DOWN, &adapter->flags); |
625 | - cancel_work_sync(&adapter->reset_task); |
626 | + |
627 | + /* Only kill reset task if adapter is not resetting */ |
628 | + if (!test_bit(__E1000_RESETTING, &adapter->flags)) |
629 | + cancel_work_sync(&adapter->reset_task); |
630 | + |
631 | cancel_delayed_work_sync(&adapter->watchdog_task); |
632 | cancel_delayed_work_sync(&adapter->phy_info_task); |
633 | cancel_delayed_work_sync(&adapter->fifo_stall_task); |
634 | diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c |
635 | index 7eb8a00..65c51ff 100644 |
636 | --- a/drivers/net/ethernet/marvell/sky2.c |
637 | +++ b/drivers/net/ethernet/marvell/sky2.c |
638 | @@ -2475,8 +2475,13 @@ static struct sk_buff *receive_copy(struct sky2_port *sky2, |
639 | skb_copy_from_linear_data(re->skb, skb->data, length); |
640 | skb->ip_summed = re->skb->ip_summed; |
641 | skb->csum = re->skb->csum; |
642 | + skb->rxhash = re->skb->rxhash; |
643 | + skb->vlan_tci = re->skb->vlan_tci; |
644 | + |
645 | pci_dma_sync_single_for_device(sky2->hw->pdev, re->data_addr, |
646 | length, PCI_DMA_FROMDEVICE); |
647 | + re->skb->vlan_tci = 0; |
648 | + re->skb->rxhash = 0; |
649 | re->skb->ip_summed = CHECKSUM_NONE; |
650 | skb_put(skb, length); |
651 | } |
652 | @@ -2561,9 +2566,6 @@ static struct sk_buff *sky2_receive(struct net_device *dev, |
653 | struct sk_buff *skb = NULL; |
654 | u16 count = (status & GMR_FS_LEN) >> 16; |
655 | |
656 | - if (status & GMR_FS_VLAN) |
657 | - count -= VLAN_HLEN; /* Account for vlan tag */ |
658 | - |
659 | netif_printk(sky2, rx_status, KERN_DEBUG, dev, |
660 | "rx slot %u status 0x%x len %d\n", |
661 | sky2->rx_next, status, length); |
662 | @@ -2571,6 +2573,9 @@ static struct sk_buff *sky2_receive(struct net_device *dev, |
663 | sky2->rx_next = (sky2->rx_next + 1) % sky2->rx_pending; |
664 | prefetch(sky2->rx_ring + sky2->rx_next); |
665 | |
666 | + if (vlan_tx_tag_present(re->skb)) |
667 | + count -= VLAN_HLEN; /* Account for vlan tag */ |
668 | + |
669 | /* This chip has hardware problems that generates bogus status. |
670 | * So do only marginal checking and expect higher level protocols |
671 | * to handle crap frames. |
672 | @@ -2628,11 +2633,8 @@ static inline void sky2_tx_done(struct net_device *dev, u16 last) |
673 | } |
674 | |
675 | static inline void sky2_skb_rx(const struct sky2_port *sky2, |
676 | - u32 status, struct sk_buff *skb) |
677 | + struct sk_buff *skb) |
678 | { |
679 | - if (status & GMR_FS_VLAN) |
680 | - __vlan_hwaccel_put_tag(skb, be16_to_cpu(sky2->rx_tag)); |
681 | - |
682 | if (skb->ip_summed == CHECKSUM_NONE) |
683 | netif_receive_skb(skb); |
684 | else |
685 | @@ -2686,6 +2688,14 @@ static void sky2_rx_checksum(struct sky2_port *sky2, u32 status) |
686 | } |
687 | } |
688 | |
689 | +static void sky2_rx_tag(struct sky2_port *sky2, u16 length) |
690 | +{ |
691 | + struct sk_buff *skb; |
692 | + |
693 | + skb = sky2->rx_ring[sky2->rx_next].skb; |
694 | + __vlan_hwaccel_put_tag(skb, be16_to_cpu(length)); |
695 | +} |
696 | + |
697 | static void sky2_rx_hash(struct sky2_port *sky2, u32 status) |
698 | { |
699 | struct sk_buff *skb; |
700 | @@ -2744,8 +2754,7 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx) |
701 | } |
702 | |
703 | skb->protocol = eth_type_trans(skb, dev); |
704 | - |
705 | - sky2_skb_rx(sky2, status, skb); |
706 | + sky2_skb_rx(sky2, skb); |
707 | |
708 | /* Stop after net poll weight */ |
709 | if (++work_done >= to_do) |
710 | @@ -2753,11 +2762,11 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx) |
711 | break; |
712 | |
713 | case OP_RXVLAN: |
714 | - sky2->rx_tag = length; |
715 | + sky2_rx_tag(sky2, length); |
716 | break; |
717 | |
718 | case OP_RXCHKSVLAN: |
719 | - sky2->rx_tag = length; |
720 | + sky2_rx_tag(sky2, length); |
721 | /* fall through */ |
722 | case OP_RXCHKS: |
723 | if (likely(dev->features & NETIF_F_RXCSUM)) |
724 | diff --git a/drivers/net/ethernet/marvell/sky2.h b/drivers/net/ethernet/marvell/sky2.h |
725 | index ff6f58b..3c896ce 100644 |
726 | --- a/drivers/net/ethernet/marvell/sky2.h |
727 | +++ b/drivers/net/ethernet/marvell/sky2.h |
728 | @@ -2241,7 +2241,6 @@ struct sky2_port { |
729 | u16 rx_pending; |
730 | u16 rx_data_size; |
731 | u16 rx_nfrags; |
732 | - u16 rx_tag; |
733 | |
734 | struct { |
735 | unsigned long last; |
736 | diff --git a/drivers/net/ethernet/stmicro/stmmac/mmc_core.c b/drivers/net/ethernet/stmicro/stmmac/mmc_core.c |
737 | index 41e6b33..c07cfe9 100644 |
738 | --- a/drivers/net/ethernet/stmicro/stmmac/mmc_core.c |
739 | +++ b/drivers/net/ethernet/stmicro/stmmac/mmc_core.c |
740 | @@ -22,6 +22,7 @@ |
741 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> |
742 | *******************************************************************************/ |
743 | |
744 | +#include <linux/kernel.h> |
745 | #include <linux/io.h> |
746 | #include "mmc.h" |
747 | |
748 | diff --git a/drivers/net/ethernet/sun/sungem.c b/drivers/net/ethernet/sun/sungem.c |
749 | index ceab215..c508d6a 100644 |
750 | --- a/drivers/net/ethernet/sun/sungem.c |
751 | +++ b/drivers/net/ethernet/sun/sungem.c |
752 | @@ -2340,7 +2340,7 @@ static int gem_suspend(struct pci_dev *pdev, pm_message_t state) |
753 | netif_device_detach(dev); |
754 | |
755 | /* Switch off chip, remember WOL setting */ |
756 | - gp->asleep_wol = gp->wake_on_lan; |
757 | + gp->asleep_wol = !!gp->wake_on_lan; |
758 | gem_do_stop(dev, gp->asleep_wol); |
759 | |
760 | /* Unlock the network stack */ |
761 | diff --git a/drivers/net/phy/icplus.c b/drivers/net/phy/icplus.c |
762 | index c81f136..b142300 100644 |
763 | --- a/drivers/net/phy/icplus.c |
764 | +++ b/drivers/net/phy/icplus.c |
765 | @@ -150,7 +150,8 @@ static int ip101a_config_init(struct phy_device *phydev) |
766 | /* Enable Auto Power Saving mode */ |
767 | c = phy_read(phydev, IP10XX_SPEC_CTRL_STATUS); |
768 | c |= IP101A_APS_ON; |
769 | - return c; |
770 | + |
771 | + return phy_write(phydev, IP10XX_SPEC_CTRL_STATUS, c); |
772 | } |
773 | |
774 | static int ip175c_read_status(struct phy_device *phydev) |
775 | diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c |
776 | index fda4be2..a9abee8 100644 |
777 | --- a/drivers/net/usb/asix.c |
778 | +++ b/drivers/net/usb/asix.c |
779 | @@ -403,7 +403,7 @@ static struct sk_buff *asix_tx_fixup(struct usbnet *dev, struct sk_buff *skb, |
780 | u32 packet_len; |
781 | u32 padbytes = 0xffff0000; |
782 | |
783 | - padlen = ((skb->len + 4) % 512) ? 0 : 4; |
784 | + padlen = ((skb->len + 4) & (dev->maxpacket - 1)) ? 0 : 4; |
785 | |
786 | if ((!skb_cloned(skb)) && |
787 | ((headroom + tailroom) >= (4 + padlen))) { |
788 | @@ -425,7 +425,7 @@ static struct sk_buff *asix_tx_fixup(struct usbnet *dev, struct sk_buff *skb, |
789 | cpu_to_le32s(&packet_len); |
790 | skb_copy_to_linear_data(skb, &packet_len, sizeof(packet_len)); |
791 | |
792 | - if ((skb->len % 512) == 0) { |
793 | + if (padlen) { |
794 | cpu_to_le32s(&padbytes); |
795 | memcpy(skb_tail_pointer(skb), &padbytes, sizeof(padbytes)); |
796 | skb_put(skb, sizeof(padbytes)); |
797 | diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c |
798 | index 4fd4144..2ba40cf 100644 |
799 | --- a/drivers/net/usb/cdc_ether.c |
800 | +++ b/drivers/net/usb/cdc_ether.c |
801 | @@ -83,6 +83,7 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf) |
802 | struct cdc_state *info = (void *) &dev->data; |
803 | int status; |
804 | int rndis; |
805 | + bool android_rndis_quirk = false; |
806 | struct usb_driver *driver = driver_of(intf); |
807 | struct usb_cdc_mdlm_desc *desc = NULL; |
808 | struct usb_cdc_mdlm_detail_desc *detail = NULL; |
809 | @@ -195,6 +196,11 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf) |
810 | info->control, |
811 | info->u->bSlaveInterface0, |
812 | info->data); |
813 | + /* fall back to hard-wiring for RNDIS */ |
814 | + if (rndis) { |
815 | + android_rndis_quirk = true; |
816 | + goto next_desc; |
817 | + } |
818 | goto bad_desc; |
819 | } |
820 | if (info->control != intf) { |
821 | @@ -271,11 +277,15 @@ next_desc: |
822 | /* Microsoft ActiveSync based and some regular RNDIS devices lack the |
823 | * CDC descriptors, so we'll hard-wire the interfaces and not check |
824 | * for descriptors. |
825 | + * |
826 | + * Some Android RNDIS devices have a CDC Union descriptor pointing |
827 | + * to non-existing interfaces. Ignore that and attempt the same |
828 | + * hard-wired 0 and 1 interfaces. |
829 | */ |
830 | - if (rndis && !info->u) { |
831 | + if (rndis && (!info->u || android_rndis_quirk)) { |
832 | info->control = usb_ifnum_to_if(dev->udev, 0); |
833 | info->data = usb_ifnum_to_if(dev->udev, 1); |
834 | - if (!info->control || !info->data) { |
835 | + if (!info->control || !info->data || info->control != intf) { |
836 | dev_dbg(&intf->dev, |
837 | "rndis: master #0/%p slave #1/%p\n", |
838 | info->control, |
839 | @@ -472,6 +482,7 @@ static const struct driver_info wwan_info = { |
840 | /*-------------------------------------------------------------------------*/ |
841 | |
842 | #define HUAWEI_VENDOR_ID 0x12D1 |
843 | +#define NOVATEL_VENDOR_ID 0x1410 |
844 | |
845 | static const struct usb_device_id products [] = { |
846 | /* |
847 | @@ -589,6 +600,21 @@ static const struct usb_device_id products [] = { |
848 | * because of bugs/quirks in a given product (like Zaurus, above). |
849 | */ |
850 | { |
851 | + /* Novatel USB551L */ |
852 | + /* This match must come *before* the generic CDC-ETHER match so that |
853 | + * we get FLAG_WWAN set on the device, since it's descriptors are |
854 | + * generic CDC-ETHER. |
855 | + */ |
856 | + .match_flags = USB_DEVICE_ID_MATCH_VENDOR |
857 | + | USB_DEVICE_ID_MATCH_PRODUCT |
858 | + | USB_DEVICE_ID_MATCH_INT_INFO, |
859 | + .idVendor = NOVATEL_VENDOR_ID, |
860 | + .idProduct = 0xB001, |
861 | + .bInterfaceClass = USB_CLASS_COMM, |
862 | + .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, |
863 | + .bInterfaceProtocol = USB_CDC_PROTO_NONE, |
864 | + .driver_info = (unsigned long)&wwan_info, |
865 | +}, { |
866 | USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ETHERNET, |
867 | USB_CDC_PROTO_NONE), |
868 | .driver_info = (unsigned long) &cdc_info, |
869 | diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c |
870 | index 750e330..b873b5d 100644 |
871 | --- a/drivers/net/usb/usbnet.c |
872 | +++ b/drivers/net/usb/usbnet.c |
873 | @@ -281,17 +281,32 @@ int usbnet_change_mtu (struct net_device *net, int new_mtu) |
874 | } |
875 | EXPORT_SYMBOL_GPL(usbnet_change_mtu); |
876 | |
877 | +/* The caller must hold list->lock */ |
878 | +static void __usbnet_queue_skb(struct sk_buff_head *list, |
879 | + struct sk_buff *newsk, enum skb_state state) |
880 | +{ |
881 | + struct skb_data *entry = (struct skb_data *) newsk->cb; |
882 | + |
883 | + __skb_queue_tail(list, newsk); |
884 | + entry->state = state; |
885 | +} |
886 | + |
887 | /*-------------------------------------------------------------------------*/ |
888 | |
889 | /* some LK 2.4 HCDs oopsed if we freed or resubmitted urbs from |
890 | * completion callbacks. 2.5 should have fixed those bugs... |
891 | */ |
892 | |
893 | -static void defer_bh(struct usbnet *dev, struct sk_buff *skb, struct sk_buff_head *list) |
894 | +static enum skb_state defer_bh(struct usbnet *dev, struct sk_buff *skb, |
895 | + struct sk_buff_head *list, enum skb_state state) |
896 | { |
897 | unsigned long flags; |
898 | + enum skb_state old_state; |
899 | + struct skb_data *entry = (struct skb_data *) skb->cb; |
900 | |
901 | spin_lock_irqsave(&list->lock, flags); |
902 | + old_state = entry->state; |
903 | + entry->state = state; |
904 | __skb_unlink(skb, list); |
905 | spin_unlock(&list->lock); |
906 | spin_lock(&dev->done.lock); |
907 | @@ -299,6 +314,7 @@ static void defer_bh(struct usbnet *dev, struct sk_buff *skb, struct sk_buff_hea |
908 | if (dev->done.qlen == 1) |
909 | tasklet_schedule(&dev->bh); |
910 | spin_unlock_irqrestore(&dev->done.lock, flags); |
911 | + return old_state; |
912 | } |
913 | |
914 | /* some work can't be done in tasklets, so we use keventd |
915 | @@ -339,7 +355,6 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags) |
916 | entry = (struct skb_data *) skb->cb; |
917 | entry->urb = urb; |
918 | entry->dev = dev; |
919 | - entry->state = rx_start; |
920 | entry->length = 0; |
921 | |
922 | usb_fill_bulk_urb (urb, dev->udev, dev->in, |
923 | @@ -371,7 +386,7 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags) |
924 | tasklet_schedule (&dev->bh); |
925 | break; |
926 | case 0: |
927 | - __skb_queue_tail (&dev->rxq, skb); |
928 | + __usbnet_queue_skb(&dev->rxq, skb, rx_start); |
929 | } |
930 | } else { |
931 | netif_dbg(dev, ifdown, dev->net, "rx: stopped\n"); |
932 | @@ -422,16 +437,17 @@ static void rx_complete (struct urb *urb) |
933 | struct skb_data *entry = (struct skb_data *) skb->cb; |
934 | struct usbnet *dev = entry->dev; |
935 | int urb_status = urb->status; |
936 | + enum skb_state state; |
937 | |
938 | skb_put (skb, urb->actual_length); |
939 | - entry->state = rx_done; |
940 | + state = rx_done; |
941 | entry->urb = NULL; |
942 | |
943 | switch (urb_status) { |
944 | /* success */ |
945 | case 0: |
946 | if (skb->len < dev->net->hard_header_len) { |
947 | - entry->state = rx_cleanup; |
948 | + state = rx_cleanup; |
949 | dev->net->stats.rx_errors++; |
950 | dev->net->stats.rx_length_errors++; |
951 | netif_dbg(dev, rx_err, dev->net, |
952 | @@ -470,7 +486,7 @@ static void rx_complete (struct urb *urb) |
953 | "rx throttle %d\n", urb_status); |
954 | } |
955 | block: |
956 | - entry->state = rx_cleanup; |
957 | + state = rx_cleanup; |
958 | entry->urb = urb; |
959 | urb = NULL; |
960 | break; |
961 | @@ -481,17 +497,18 @@ block: |
962 | // FALLTHROUGH |
963 | |
964 | default: |
965 | - entry->state = rx_cleanup; |
966 | + state = rx_cleanup; |
967 | dev->net->stats.rx_errors++; |
968 | netif_dbg(dev, rx_err, dev->net, "rx status %d\n", urb_status); |
969 | break; |
970 | } |
971 | |
972 | - defer_bh(dev, skb, &dev->rxq); |
973 | + state = defer_bh(dev, skb, &dev->rxq, state); |
974 | |
975 | if (urb) { |
976 | if (netif_running (dev->net) && |
977 | - !test_bit (EVENT_RX_HALT, &dev->flags)) { |
978 | + !test_bit (EVENT_RX_HALT, &dev->flags) && |
979 | + state != unlink_start) { |
980 | rx_submit (dev, urb, GFP_ATOMIC); |
981 | return; |
982 | } |
983 | @@ -577,16 +594,23 @@ EXPORT_SYMBOL_GPL(usbnet_purge_paused_rxq); |
984 | static int unlink_urbs (struct usbnet *dev, struct sk_buff_head *q) |
985 | { |
986 | unsigned long flags; |
987 | - struct sk_buff *skb, *skbnext; |
988 | + struct sk_buff *skb; |
989 | int count = 0; |
990 | |
991 | spin_lock_irqsave (&q->lock, flags); |
992 | - skb_queue_walk_safe(q, skb, skbnext) { |
993 | + while (!skb_queue_empty(q)) { |
994 | struct skb_data *entry; |
995 | struct urb *urb; |
996 | int retval; |
997 | |
998 | - entry = (struct skb_data *) skb->cb; |
999 | + skb_queue_walk(q, skb) { |
1000 | + entry = (struct skb_data *) skb->cb; |
1001 | + if (entry->state != unlink_start) |
1002 | + goto found; |
1003 | + } |
1004 | + break; |
1005 | +found: |
1006 | + entry->state = unlink_start; |
1007 | urb = entry->urb; |
1008 | |
1009 | /* |
1010 | @@ -1037,8 +1061,7 @@ static void tx_complete (struct urb *urb) |
1011 | } |
1012 | |
1013 | usb_autopm_put_interface_async(dev->intf); |
1014 | - entry->state = tx_done; |
1015 | - defer_bh(dev, skb, &dev->txq); |
1016 | + (void) defer_bh(dev, skb, &dev->txq, tx_done); |
1017 | } |
1018 | |
1019 | /*-------------------------------------------------------------------------*/ |
1020 | @@ -1094,7 +1117,6 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb, |
1021 | entry = (struct skb_data *) skb->cb; |
1022 | entry->urb = urb; |
1023 | entry->dev = dev; |
1024 | - entry->state = tx_start; |
1025 | entry->length = length; |
1026 | |
1027 | usb_fill_bulk_urb (urb, dev->udev, dev->out, |
1028 | @@ -1153,7 +1175,7 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb, |
1029 | break; |
1030 | case 0: |
1031 | net->trans_start = jiffies; |
1032 | - __skb_queue_tail (&dev->txq, skb); |
1033 | + __usbnet_queue_skb(&dev->txq, skb, tx_start); |
1034 | if (dev->txq.qlen >= TX_QLEN (dev)) |
1035 | netif_stop_queue (net); |
1036 | } |
1037 | diff --git a/drivers/net/wireless/brcm80211/brcmsmac/ampdu.c b/drivers/net/wireless/brcm80211/brcmsmac/ampdu.c |
1038 | index 7f27dbd..0515862 100644 |
1039 | --- a/drivers/net/wireless/brcm80211/brcmsmac/ampdu.c |
1040 | +++ b/drivers/net/wireless/brcm80211/brcmsmac/ampdu.c |
1041 | @@ -1053,17 +1053,13 @@ brcms_c_ampdu_dotxstatus_complete(struct ampdu_info *ampdu, struct scb *scb, |
1042 | } |
1043 | /* either retransmit or send bar if ack not recd */ |
1044 | if (!ack_recd) { |
1045 | - struct ieee80211_tx_rate *txrate = |
1046 | - tx_info->status.rates; |
1047 | - if (retry && (txrate[0].count < (int)retry_limit)) { |
1048 | + if (retry && (ini->txretry[index] < (int)retry_limit)) { |
1049 | ini->txretry[index]++; |
1050 | ini->tx_in_transit--; |
1051 | /* |
1052 | * Use high prededence for retransmit to |
1053 | * give some punch |
1054 | */ |
1055 | - /* brcms_c_txq_enq(wlc, scb, p, |
1056 | - * BRCMS_PRIO_TO_PREC(tid)); */ |
1057 | brcms_c_txq_enq(wlc, scb, p, |
1058 | BRCMS_PRIO_TO_HI_PREC(tid)); |
1059 | } else { |
1060 | diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c |
1061 | index f98becc..833cbef 100644 |
1062 | --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c |
1063 | +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c |
1064 | @@ -7879,7 +7879,7 @@ brcms_c_recvctl(struct brcms_c_info *wlc, struct d11rxhdr *rxh, |
1065 | if (wlc->hw->suspended_fifos) { |
1066 | hdr = (struct ieee80211_hdr *)p->data; |
1067 | if (ieee80211_is_beacon(hdr->frame_control)) |
1068 | - brcms_b_mute(wlc->hw, false); |
1069 | + brcms_b_mute(wlc->hw, false, 0); |
1070 | } |
1071 | |
1072 | memcpy(IEEE80211_SKB_RXCB(p), &rx_status, sizeof(rx_status)); |
1073 | diff --git a/drivers/regulator/max8997.c b/drivers/regulator/max8997.c |
1074 | index 6176129..8cba82d 100644 |
1075 | --- a/drivers/regulator/max8997.c |
1076 | +++ b/drivers/regulator/max8997.c |
1077 | @@ -689,7 +689,7 @@ static int max8997_set_voltage_buck(struct regulator_dev *rdev, |
1078 | } |
1079 | |
1080 | new_val++; |
1081 | - } while (desc->min + desc->step + new_val <= desc->max); |
1082 | + } while (desc->min + desc->step * new_val <= desc->max); |
1083 | |
1084 | new_idx = tmp_idx; |
1085 | new_val = tmp_val; |
1086 | diff --git a/drivers/spi/spi-topcliff-pch.c b/drivers/spi/spi-topcliff-pch.c |
1087 | index 54b9d2e..1590dbd 100644 |
1088 | --- a/drivers/spi/spi-topcliff-pch.c |
1089 | +++ b/drivers/spi/spi-topcliff-pch.c |
1090 | @@ -196,6 +196,7 @@ struct pch_spi_data { |
1091 | struct pch_spi_dma_ctrl dma; |
1092 | int use_dma; |
1093 | u8 irq_reg_sts; |
1094 | + int save_total_len; |
1095 | }; |
1096 | |
1097 | /** |
1098 | @@ -823,11 +824,13 @@ static void pch_spi_copy_rx_data_for_dma(struct pch_spi_data *data, int bpw) |
1099 | rx_dma_buf = data->dma.rx_buf_virt; |
1100 | for (j = 0; j < data->bpw_len; j++) |
1101 | *rx_buf++ = *rx_dma_buf++ & 0xFF; |
1102 | + data->cur_trans->rx_buf = rx_buf; |
1103 | } else { |
1104 | rx_sbuf = data->cur_trans->rx_buf; |
1105 | rx_dma_sbuf = data->dma.rx_buf_virt; |
1106 | for (j = 0; j < data->bpw_len; j++) |
1107 | *rx_sbuf++ = *rx_dma_sbuf++; |
1108 | + data->cur_trans->rx_buf = rx_sbuf; |
1109 | } |
1110 | } |
1111 | |
1112 | @@ -853,6 +856,9 @@ static int pch_spi_start_transfer(struct pch_spi_data *data) |
1113 | rtn = wait_event_interruptible_timeout(data->wait, |
1114 | data->transfer_complete, |
1115 | msecs_to_jiffies(2 * HZ)); |
1116 | + if (!rtn) |
1117 | + dev_err(&data->master->dev, |
1118 | + "%s wait-event timeout\n", __func__); |
1119 | |
1120 | dma_sync_sg_for_cpu(&data->master->dev, dma->sg_rx_p, dma->nent, |
1121 | DMA_FROM_DEVICE); |
1122 | @@ -924,7 +930,8 @@ static void pch_spi_request_dma(struct pch_spi_data *data, int bpw) |
1123 | dma_cap_set(DMA_SLAVE, mask); |
1124 | |
1125 | /* Get DMA's dev information */ |
1126 | - dma_dev = pci_get_bus_and_slot(2, PCI_DEVFN(12, 0)); |
1127 | + dma_dev = pci_get_bus_and_slot(data->board_dat->pdev->bus->number, |
1128 | + PCI_DEVFN(12, 0)); |
1129 | |
1130 | /* Set Tx DMA */ |
1131 | param = &dma->param_tx; |
1132 | @@ -988,6 +995,7 @@ static void pch_spi_handle_dma(struct pch_spi_data *data, int *bpw) |
1133 | int i; |
1134 | int size; |
1135 | int rem; |
1136 | + int head; |
1137 | unsigned long flags; |
1138 | struct pch_spi_dma_ctrl *dma; |
1139 | |
1140 | @@ -1016,6 +1024,11 @@ static void pch_spi_handle_dma(struct pch_spi_data *data, int *bpw) |
1141 | } |
1142 | data->bpw_len = data->cur_trans->len / (*bpw / 8); |
1143 | |
1144 | + if (data->bpw_len > PCH_BUF_SIZE) { |
1145 | + data->bpw_len = PCH_BUF_SIZE; |
1146 | + data->cur_trans->len -= PCH_BUF_SIZE; |
1147 | + } |
1148 | + |
1149 | /* copy Tx Data */ |
1150 | if (data->cur_trans->tx_buf != NULL) { |
1151 | if (*bpw == 8) { |
1152 | @@ -1030,10 +1043,17 @@ static void pch_spi_handle_dma(struct pch_spi_data *data, int *bpw) |
1153 | *tx_dma_sbuf++ = *tx_sbuf++; |
1154 | } |
1155 | } |
1156 | + |
1157 | + /* Calculate Rx parameter for DMA transmitting */ |
1158 | if (data->bpw_len > PCH_DMA_TRANS_SIZE) { |
1159 | - num = data->bpw_len / PCH_DMA_TRANS_SIZE + 1; |
1160 | + if (data->bpw_len % PCH_DMA_TRANS_SIZE) { |
1161 | + num = data->bpw_len / PCH_DMA_TRANS_SIZE + 1; |
1162 | + rem = data->bpw_len % PCH_DMA_TRANS_SIZE; |
1163 | + } else { |
1164 | + num = data->bpw_len / PCH_DMA_TRANS_SIZE; |
1165 | + rem = PCH_DMA_TRANS_SIZE; |
1166 | + } |
1167 | size = PCH_DMA_TRANS_SIZE; |
1168 | - rem = data->bpw_len % PCH_DMA_TRANS_SIZE; |
1169 | } else { |
1170 | num = 1; |
1171 | size = data->bpw_len; |
1172 | @@ -1093,15 +1113,23 @@ static void pch_spi_handle_dma(struct pch_spi_data *data, int *bpw) |
1173 | dma->nent = num; |
1174 | dma->desc_rx = desc_rx; |
1175 | |
1176 | - /* TX */ |
1177 | - if (data->bpw_len > PCH_DMA_TRANS_SIZE) { |
1178 | - num = data->bpw_len / PCH_DMA_TRANS_SIZE; |
1179 | + /* Calculate Tx parameter for DMA transmitting */ |
1180 | + if (data->bpw_len > PCH_MAX_FIFO_DEPTH) { |
1181 | + head = PCH_MAX_FIFO_DEPTH - PCH_DMA_TRANS_SIZE; |
1182 | + if (data->bpw_len % PCH_DMA_TRANS_SIZE > 4) { |
1183 | + num = data->bpw_len / PCH_DMA_TRANS_SIZE + 1; |
1184 | + rem = data->bpw_len % PCH_DMA_TRANS_SIZE - head; |
1185 | + } else { |
1186 | + num = data->bpw_len / PCH_DMA_TRANS_SIZE; |
1187 | + rem = data->bpw_len % PCH_DMA_TRANS_SIZE + |
1188 | + PCH_DMA_TRANS_SIZE - head; |
1189 | + } |
1190 | size = PCH_DMA_TRANS_SIZE; |
1191 | - rem = 16; |
1192 | } else { |
1193 | num = 1; |
1194 | size = data->bpw_len; |
1195 | rem = data->bpw_len; |
1196 | + head = 0; |
1197 | } |
1198 | |
1199 | dma->sg_tx_p = kzalloc(sizeof(struct scatterlist)*num, GFP_ATOMIC); |
1200 | @@ -1111,11 +1139,17 @@ static void pch_spi_handle_dma(struct pch_spi_data *data, int *bpw) |
1201 | for (i = 0; i < num; i++, sg++) { |
1202 | if (i == 0) { |
1203 | sg->offset = 0; |
1204 | + sg_set_page(sg, virt_to_page(dma->tx_buf_virt), size + head, |
1205 | + sg->offset); |
1206 | + sg_dma_len(sg) = size + head; |
1207 | + } else if (i == (num - 1)) { |
1208 | + sg->offset = head + size * i; |
1209 | + sg->offset = sg->offset * (*bpw / 8); |
1210 | sg_set_page(sg, virt_to_page(dma->tx_buf_virt), rem, |
1211 | sg->offset); |
1212 | sg_dma_len(sg) = rem; |
1213 | } else { |
1214 | - sg->offset = rem + size * (i - 1); |
1215 | + sg->offset = head + size * i; |
1216 | sg->offset = sg->offset * (*bpw / 8); |
1217 | sg_set_page(sg, virt_to_page(dma->tx_buf_virt), size, |
1218 | sg->offset); |
1219 | @@ -1203,6 +1237,7 @@ static void pch_spi_process_messages(struct work_struct *pwork) |
1220 | data->current_msg->spi->bits_per_word); |
1221 | pch_spi_writereg(data->master, PCH_SSNXCR, SSN_NO_CONTROL); |
1222 | do { |
1223 | + int cnt; |
1224 | /* If we are already processing a message get the next |
1225 | transfer structure from the message otherwise retrieve |
1226 | the 1st transfer request from the message. */ |
1227 | @@ -1222,11 +1257,28 @@ static void pch_spi_process_messages(struct work_struct *pwork) |
1228 | } |
1229 | spin_unlock(&data->lock); |
1230 | |
1231 | + if (!data->cur_trans->len) |
1232 | + goto out; |
1233 | + cnt = (data->cur_trans->len - 1) / PCH_BUF_SIZE + 1; |
1234 | + data->save_total_len = data->cur_trans->len; |
1235 | if (data->use_dma) { |
1236 | - pch_spi_handle_dma(data, &bpw); |
1237 | - if (!pch_spi_start_transfer(data)) |
1238 | - goto out; |
1239 | - pch_spi_copy_rx_data_for_dma(data, bpw); |
1240 | + int i; |
1241 | + char *save_rx_buf = data->cur_trans->rx_buf; |
1242 | + for (i = 0; i < cnt; i ++) { |
1243 | + pch_spi_handle_dma(data, &bpw); |
1244 | + if (!pch_spi_start_transfer(data)) { |
1245 | + data->transfer_complete = true; |
1246 | + data->current_msg->status = -EIO; |
1247 | + data->current_msg->complete |
1248 | + (data->current_msg->context); |
1249 | + data->bcurrent_msg_processing = false; |
1250 | + data->current_msg = NULL; |
1251 | + data->cur_trans = NULL; |
1252 | + goto out; |
1253 | + } |
1254 | + pch_spi_copy_rx_data_for_dma(data, bpw); |
1255 | + } |
1256 | + data->cur_trans->rx_buf = save_rx_buf; |
1257 | } else { |
1258 | pch_spi_set_tx(data, &bpw); |
1259 | pch_spi_set_ir(data); |
1260 | @@ -1237,6 +1289,7 @@ static void pch_spi_process_messages(struct work_struct *pwork) |
1261 | data->pkt_tx_buff = NULL; |
1262 | } |
1263 | /* increment message count */ |
1264 | + data->cur_trans->len = data->save_total_len; |
1265 | data->current_msg->actual_length += data->cur_trans->len; |
1266 | |
1267 | dev_dbg(&data->master->dev, |
1268 | @@ -1389,6 +1442,7 @@ static int __devinit pch_spi_pd_probe(struct platform_device *plat_dev) |
1269 | master->num_chipselect = PCH_MAX_CS; |
1270 | master->setup = pch_spi_setup; |
1271 | master->transfer = pch_spi_transfer; |
1272 | + master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LSB_FIRST; |
1273 | |
1274 | data->board_dat = board_dat; |
1275 | data->plat_dev = plat_dev; |
1276 | diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c |
1277 | index b4864fb..cad8b92 100644 |
1278 | --- a/drivers/target/target_core_file.c |
1279 | +++ b/drivers/target/target_core_file.c |
1280 | @@ -170,6 +170,7 @@ static struct se_device *fd_create_virtdevice( |
1281 | inode = file->f_mapping->host; |
1282 | if (S_ISBLK(inode->i_mode)) { |
1283 | struct request_queue *q; |
1284 | + unsigned long long dev_size; |
1285 | /* |
1286 | * Setup the local scope queue_limits from struct request_queue->limits |
1287 | * to pass into transport_add_device_to_core_hba() as struct se_dev_limits. |
1288 | @@ -184,13 +185,12 @@ static struct se_device *fd_create_virtdevice( |
1289 | * one (1) logical sector from underlying struct block_device |
1290 | */ |
1291 | fd_dev->fd_block_size = bdev_logical_block_size(inode->i_bdev); |
1292 | - fd_dev->fd_dev_size = (i_size_read(file->f_mapping->host) - |
1293 | + dev_size = (i_size_read(file->f_mapping->host) - |
1294 | fd_dev->fd_block_size); |
1295 | |
1296 | pr_debug("FILEIO: Using size: %llu bytes from struct" |
1297 | " block_device blocks: %llu logical_block_size: %d\n", |
1298 | - fd_dev->fd_dev_size, |
1299 | - div_u64(fd_dev->fd_dev_size, fd_dev->fd_block_size), |
1300 | + dev_size, div_u64(dev_size, fd_dev->fd_block_size), |
1301 | fd_dev->fd_block_size); |
1302 | } else { |
1303 | if (!(fd_dev->fbd_flags & FBDF_HAS_SIZE)) { |
1304 | @@ -606,10 +606,20 @@ static u32 fd_get_device_type(struct se_device *dev) |
1305 | static sector_t fd_get_blocks(struct se_device *dev) |
1306 | { |
1307 | struct fd_dev *fd_dev = dev->dev_ptr; |
1308 | - unsigned long long blocks_long = div_u64(fd_dev->fd_dev_size, |
1309 | - dev->se_sub_dev->se_dev_attrib.block_size); |
1310 | + struct file *f = fd_dev->fd_file; |
1311 | + struct inode *i = f->f_mapping->host; |
1312 | + unsigned long long dev_size; |
1313 | + /* |
1314 | + * When using a file that references an underlying struct block_device, |
1315 | + * ensure dev_size is always based on the current inode size in order |
1316 | + * to handle underlying block_device resize operations. |
1317 | + */ |
1318 | + if (S_ISBLK(i->i_mode)) |
1319 | + dev_size = (i_size_read(i) - fd_dev->fd_block_size); |
1320 | + else |
1321 | + dev_size = fd_dev->fd_dev_size; |
1322 | |
1323 | - return blocks_long; |
1324 | + return div_u64(dev_size, dev->se_sub_dev->se_dev_attrib.block_size); |
1325 | } |
1326 | |
1327 | static struct se_subsystem_api fileio_template = { |
1328 | diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c |
1329 | index 6cf6ff4..b75bc92 100644 |
1330 | --- a/drivers/target/target_core_pr.c |
1331 | +++ b/drivers/target/target_core_pr.c |
1332 | @@ -223,6 +223,9 @@ int target_scsi2_reservation_release(struct se_task *task) |
1333 | if (dev->dev_reserved_node_acl != sess->se_node_acl) |
1334 | goto out_unlock; |
1335 | |
1336 | + if (dev->dev_res_bin_isid != sess->sess_bin_isid) |
1337 | + goto out_unlock; |
1338 | + |
1339 | dev->dev_reserved_node_acl = NULL; |
1340 | dev->dev_flags &= ~DF_SPC2_RESERVATIONS; |
1341 | if (dev->dev_flags & DF_SPC2_RESERVATIONS_WITH_ISID) { |
1342 | diff --git a/drivers/target/target_core_tpg.c b/drivers/target/target_core_tpg.c |
1343 | index 8ddd133..d91fe44 100644 |
1344 | --- a/drivers/target/target_core_tpg.c |
1345 | +++ b/drivers/target/target_core_tpg.c |
1346 | @@ -63,7 +63,6 @@ static void core_clear_initiator_node_from_tpg( |
1347 | int i; |
1348 | struct se_dev_entry *deve; |
1349 | struct se_lun *lun; |
1350 | - struct se_lun_acl *acl, *acl_tmp; |
1351 | |
1352 | spin_lock_irq(&nacl->device_list_lock); |
1353 | for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) { |
1354 | @@ -84,28 +83,7 @@ static void core_clear_initiator_node_from_tpg( |
1355 | core_update_device_list_for_node(lun, NULL, deve->mapped_lun, |
1356 | TRANSPORT_LUNFLAGS_NO_ACCESS, nacl, tpg, 0); |
1357 | |
1358 | - spin_lock(&lun->lun_acl_lock); |
1359 | - list_for_each_entry_safe(acl, acl_tmp, |
1360 | - &lun->lun_acl_list, lacl_list) { |
1361 | - if (!strcmp(acl->initiatorname, nacl->initiatorname) && |
1362 | - (acl->mapped_lun == deve->mapped_lun)) |
1363 | - break; |
1364 | - } |
1365 | - |
1366 | - if (!acl) { |
1367 | - pr_err("Unable to locate struct se_lun_acl for %s," |
1368 | - " mapped_lun: %u\n", nacl->initiatorname, |
1369 | - deve->mapped_lun); |
1370 | - spin_unlock(&lun->lun_acl_lock); |
1371 | - spin_lock_irq(&nacl->device_list_lock); |
1372 | - continue; |
1373 | - } |
1374 | - |
1375 | - list_del(&acl->lacl_list); |
1376 | - spin_unlock(&lun->lun_acl_lock); |
1377 | - |
1378 | spin_lock_irq(&nacl->device_list_lock); |
1379 | - kfree(acl); |
1380 | } |
1381 | spin_unlock_irq(&nacl->device_list_lock); |
1382 | } |
1383 | diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c |
1384 | index 93a00d8..4410ae7 100644 |
1385 | --- a/fs/ext4/xattr.c |
1386 | +++ b/fs/ext4/xattr.c |
1387 | @@ -487,18 +487,19 @@ ext4_xattr_release_block(handle_t *handle, struct inode *inode, |
1388 | ext4_free_blocks(handle, inode, bh, 0, 1, |
1389 | EXT4_FREE_BLOCKS_METADATA | |
1390 | EXT4_FREE_BLOCKS_FORGET); |
1391 | + unlock_buffer(bh); |
1392 | } else { |
1393 | le32_add_cpu(&BHDR(bh)->h_refcount, -1); |
1394 | + if (ce) |
1395 | + mb_cache_entry_release(ce); |
1396 | + unlock_buffer(bh); |
1397 | error = ext4_handle_dirty_metadata(handle, inode, bh); |
1398 | if (IS_SYNC(inode)) |
1399 | ext4_handle_sync(handle); |
1400 | dquot_free_block(inode, 1); |
1401 | ea_bdebug(bh, "refcount now=%d; releasing", |
1402 | le32_to_cpu(BHDR(bh)->h_refcount)); |
1403 | - if (ce) |
1404 | - mb_cache_entry_release(ce); |
1405 | } |
1406 | - unlock_buffer(bh); |
1407 | out: |
1408 | ext4_std_error(inode->i_sb, error); |
1409 | return; |
1410 | diff --git a/fs/jffs2/gc.c b/fs/jffs2/gc.c |
1411 | index 31dce61..4bbd521 100644 |
1412 | --- a/fs/jffs2/gc.c |
1413 | +++ b/fs/jffs2/gc.c |
1414 | @@ -225,8 +225,8 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) |
1415 | return 0; |
1416 | |
1417 | D1(printk(KERN_DEBUG "No progress from erasing blocks; doing GC anyway\n")); |
1418 | - spin_lock(&c->erase_completion_lock); |
1419 | mutex_lock(&c->alloc_sem); |
1420 | + spin_lock(&c->erase_completion_lock); |
1421 | } |
1422 | |
1423 | /* First, work out which block we're garbage-collecting */ |
1424 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
1425 | index 51f6a40..bab7c58 100644 |
1426 | --- a/fs/nfs/nfs4proc.c |
1427 | +++ b/fs/nfs/nfs4proc.c |
1428 | @@ -1802,6 +1802,7 @@ static int _nfs4_do_open(struct inode *dir, struct dentry *dentry, fmode_t fmode |
1429 | nfs_setattr_update_inode(state->inode, sattr); |
1430 | nfs_post_op_update_inode(state->inode, opendata->o_res.f_attr); |
1431 | } |
1432 | + nfs_revalidate_inode(server, state->inode); |
1433 | nfs4_opendata_put(opendata); |
1434 | nfs4_put_state_owner(sp); |
1435 | *res = state; |
1436 | diff --git a/include/linux/mtd/map.h b/include/linux/mtd/map.h |
1437 | index a9e6ba4..daad4e6 100644 |
1438 | --- a/include/linux/mtd/map.h |
1439 | +++ b/include/linux/mtd/map.h |
1440 | @@ -26,7 +26,7 @@ |
1441 | #include <linux/list.h> |
1442 | #include <linux/string.h> |
1443 | #include <linux/bug.h> |
1444 | - |
1445 | +#include <linux/kernel.h> |
1446 | |
1447 | #include <asm/unaligned.h> |
1448 | #include <asm/system.h> |
1449 | diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h |
1450 | index 605b0aa..76f4396 100644 |
1451 | --- a/include/linux/usb/usbnet.h |
1452 | +++ b/include/linux/usb/usbnet.h |
1453 | @@ -191,7 +191,8 @@ extern void usbnet_cdc_status(struct usbnet *, struct urb *); |
1454 | enum skb_state { |
1455 | illegal = 0, |
1456 | tx_start, tx_done, |
1457 | - rx_start, rx_done, rx_cleanup |
1458 | + rx_start, rx_done, rx_cleanup, |
1459 | + unlink_start |
1460 | }; |
1461 | |
1462 | struct skb_data { /* skb->cb is one of these */ |
1463 | diff --git a/kernel/fork.c b/kernel/fork.c |
1464 | index 0acf42c0..26f1ab0 100644 |
1465 | --- a/kernel/fork.c |
1466 | +++ b/kernel/fork.c |
1467 | @@ -47,6 +47,7 @@ |
1468 | #include <linux/audit.h> |
1469 | #include <linux/memcontrol.h> |
1470 | #include <linux/ftrace.h> |
1471 | +#include <linux/proc_fs.h> |
1472 | #include <linux/profile.h> |
1473 | #include <linux/rmap.h> |
1474 | #include <linux/ksm.h> |
1475 | @@ -1387,6 +1388,8 @@ bad_fork_cleanup_io: |
1476 | if (p->io_context) |
1477 | exit_io_context(p); |
1478 | bad_fork_cleanup_namespaces: |
1479 | + if (unlikely(clone_flags & CLONE_NEWPID)) |
1480 | + pid_ns_release_proc(p->nsproxy->pid_ns); |
1481 | exit_task_namespaces(p); |
1482 | bad_fork_cleanup_mm: |
1483 | if (p->mm) |
1484 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c |
1485 | index bd936ed..7120c2e 100644 |
1486 | --- a/mm/hugetlb.c |
1487 | +++ b/mm/hugetlb.c |
1488 | @@ -2405,7 +2405,6 @@ retry_avoidcopy: |
1489 | if (outside_reserve) { |
1490 | BUG_ON(huge_pte_none(pte)); |
1491 | if (unmap_ref_private(mm, vma, old_page, address)) { |
1492 | - BUG_ON(page_count(old_page) != 1); |
1493 | BUG_ON(huge_pte_none(pte)); |
1494 | spin_lock(&mm->page_table_lock); |
1495 | goto retry_avoidcopy; |
1496 | diff --git a/mm/nobootmem.c b/mm/nobootmem.c |
1497 | index 7fa41b4..07c08c4 100644 |
1498 | --- a/mm/nobootmem.c |
1499 | +++ b/mm/nobootmem.c |
1500 | @@ -83,8 +83,7 @@ void __init free_bootmem_late(unsigned long addr, unsigned long size) |
1501 | |
1502 | static void __init __free_pages_memory(unsigned long start, unsigned long end) |
1503 | { |
1504 | - int i; |
1505 | - unsigned long start_aligned, end_aligned; |
1506 | + unsigned long i, start_aligned, end_aligned; |
1507 | int order = ilog2(BITS_PER_LONG); |
1508 | |
1509 | start_aligned = (start + (BITS_PER_LONG - 1)) & ~(BITS_PER_LONG - 1); |
1510 | diff --git a/mm/percpu.c b/mm/percpu.c |
1511 | index 716eb4a..5c29750 100644 |
1512 | --- a/mm/percpu.c |
1513 | +++ b/mm/percpu.c |
1514 | @@ -1642,6 +1642,16 @@ int __init pcpu_embed_first_chunk(size_t reserved_size, size_t dyn_size, |
1515 | areas[group] = ptr; |
1516 | |
1517 | base = min(ptr, base); |
1518 | + } |
1519 | + |
1520 | + /* |
1521 | + * Copy data and free unused parts. This should happen after all |
1522 | + * allocations are complete; otherwise, we may end up with |
1523 | + * overlapping groups. |
1524 | + */ |
1525 | + for (group = 0; group < ai->nr_groups; group++) { |
1526 | + struct pcpu_group_info *gi = &ai->groups[group]; |
1527 | + void *ptr = areas[group]; |
1528 | |
1529 | for (i = 0; i < gi->nr_units; i++, ptr += ai->unit_size) { |
1530 | if (gi->cpu_map[i] == NR_CPUS) { |
1531 | diff --git a/net/core/dev.c b/net/core/dev.c |
1532 | index cd5050e..61a7baa 100644 |
1533 | --- a/net/core/dev.c |
1534 | +++ b/net/core/dev.c |
1535 | @@ -1421,14 +1421,34 @@ EXPORT_SYMBOL(register_netdevice_notifier); |
1536 | * register_netdevice_notifier(). The notifier is unlinked into the |
1537 | * kernel structures and may then be reused. A negative errno code |
1538 | * is returned on a failure. |
1539 | + * |
1540 | + * After unregistering unregister and down device events are synthesized |
1541 | + * for all devices on the device list to the removed notifier to remove |
1542 | + * the need for special case cleanup code. |
1543 | */ |
1544 | |
1545 | int unregister_netdevice_notifier(struct notifier_block *nb) |
1546 | { |
1547 | + struct net_device *dev; |
1548 | + struct net *net; |
1549 | int err; |
1550 | |
1551 | rtnl_lock(); |
1552 | err = raw_notifier_chain_unregister(&netdev_chain, nb); |
1553 | + if (err) |
1554 | + goto unlock; |
1555 | + |
1556 | + for_each_net(net) { |
1557 | + for_each_netdev(net, dev) { |
1558 | + if (dev->flags & IFF_UP) { |
1559 | + nb->notifier_call(nb, NETDEV_GOING_DOWN, dev); |
1560 | + nb->notifier_call(nb, NETDEV_DOWN, dev); |
1561 | + } |
1562 | + nb->notifier_call(nb, NETDEV_UNREGISTER, dev); |
1563 | + nb->notifier_call(nb, NETDEV_UNREGISTER_BATCH, dev); |
1564 | + } |
1565 | + } |
1566 | +unlock: |
1567 | rtnl_unlock(); |
1568 | return err; |
1569 | } |
1570 | diff --git a/net/core/pktgen.c b/net/core/pktgen.c |
1571 | index 0001c24..df878de 100644 |
1572 | --- a/net/core/pktgen.c |
1573 | +++ b/net/core/pktgen.c |
1574 | @@ -1932,7 +1932,7 @@ static int pktgen_device_event(struct notifier_block *unused, |
1575 | { |
1576 | struct net_device *dev = ptr; |
1577 | |
1578 | - if (!net_eq(dev_net(dev), &init_net)) |
1579 | + if (!net_eq(dev_net(dev), &init_net) || pktgen_exiting) |
1580 | return NOTIFY_DONE; |
1581 | |
1582 | /* It is OK that we do not hold the group lock right now, |
1583 | @@ -3758,12 +3758,18 @@ static void __exit pg_cleanup(void) |
1584 | { |
1585 | struct pktgen_thread *t; |
1586 | struct list_head *q, *n; |
1587 | + LIST_HEAD(list); |
1588 | |
1589 | /* Stop all interfaces & threads */ |
1590 | pktgen_exiting = true; |
1591 | |
1592 | - list_for_each_safe(q, n, &pktgen_threads) { |
1593 | + mutex_lock(&pktgen_thread_lock); |
1594 | + list_splice_init(&pktgen_threads, &list); |
1595 | + mutex_unlock(&pktgen_thread_lock); |
1596 | + |
1597 | + list_for_each_safe(q, n, &list) { |
1598 | t = list_entry(q, struct pktgen_thread, th_list); |
1599 | + list_del(&t->th_list); |
1600 | kthread_stop(t->tsk); |
1601 | kfree(t); |
1602 | } |
1603 | diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c |
1604 | index 7904db4..11ba922 100644 |
1605 | --- a/net/ipv4/tcp.c |
1606 | +++ b/net/ipv4/tcp.c |
1607 | @@ -851,8 +851,7 @@ new_segment: |
1608 | wait_for_sndbuf: |
1609 | set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); |
1610 | wait_for_memory: |
1611 | - if (copied) |
1612 | - tcp_push(sk, flags & ~MSG_MORE, mss_now, TCP_NAGLE_PUSH); |
1613 | + tcp_push(sk, flags & ~MSG_MORE, mss_now, TCP_NAGLE_PUSH); |
1614 | |
1615 | if ((err = sk_stream_wait_memory(sk, &timeo)) != 0) |
1616 | goto do_error; |
1617 | @@ -3216,7 +3215,7 @@ void __init tcp_init(void) |
1618 | { |
1619 | struct sk_buff *skb = NULL; |
1620 | unsigned long limit; |
1621 | - int i, max_share, cnt; |
1622 | + int i, max_rshare, max_wshare, cnt; |
1623 | unsigned long jiffy = jiffies; |
1624 | |
1625 | BUILD_BUG_ON(sizeof(struct tcp_skb_cb) > sizeof(skb->cb)); |
1626 | @@ -3280,15 +3279,16 @@ void __init tcp_init(void) |
1627 | |
1628 | /* Set per-socket limits to no more than 1/128 the pressure threshold */ |
1629 | limit = ((unsigned long)sysctl_tcp_mem[1]) << (PAGE_SHIFT - 7); |
1630 | - max_share = min(4UL*1024*1024, limit); |
1631 | + max_wshare = min(4UL*1024*1024, limit); |
1632 | + max_rshare = min(6UL*1024*1024, limit); |
1633 | |
1634 | sysctl_tcp_wmem[0] = SK_MEM_QUANTUM; |
1635 | sysctl_tcp_wmem[1] = 16*1024; |
1636 | - sysctl_tcp_wmem[2] = max(64*1024, max_share); |
1637 | + sysctl_tcp_wmem[2] = max(64*1024, max_wshare); |
1638 | |
1639 | sysctl_tcp_rmem[0] = SK_MEM_QUANTUM; |
1640 | sysctl_tcp_rmem[1] = 87380; |
1641 | - sysctl_tcp_rmem[2] = max(87380, max_share); |
1642 | + sysctl_tcp_rmem[2] = max(87380, max_rshare); |
1643 | |
1644 | printk(KERN_INFO "TCP: Hash tables configured " |
1645 | "(established %u bind %u)\n", |
1646 | diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c |
1647 | index daedc07..9726927 100644 |
1648 | --- a/net/ipv4/tcp_input.c |
1649 | +++ b/net/ipv4/tcp_input.c |
1650 | @@ -83,7 +83,7 @@ int sysctl_tcp_ecn __read_mostly = 2; |
1651 | EXPORT_SYMBOL(sysctl_tcp_ecn); |
1652 | int sysctl_tcp_dsack __read_mostly = 1; |
1653 | int sysctl_tcp_app_win __read_mostly = 31; |
1654 | -int sysctl_tcp_adv_win_scale __read_mostly = 2; |
1655 | +int sysctl_tcp_adv_win_scale __read_mostly = 1; |
1656 | EXPORT_SYMBOL(sysctl_tcp_adv_win_scale); |
1657 | |
1658 | int sysctl_tcp_stdurg __read_mostly; |
1659 | @@ -2868,11 +2868,14 @@ static inline void tcp_complete_cwr(struct sock *sk) |
1660 | |
1661 | /* Do not moderate cwnd if it's already undone in cwr or recovery. */ |
1662 | if (tp->undo_marker) { |
1663 | - if (inet_csk(sk)->icsk_ca_state == TCP_CA_CWR) |
1664 | + if (inet_csk(sk)->icsk_ca_state == TCP_CA_CWR) { |
1665 | tp->snd_cwnd = min(tp->snd_cwnd, tp->snd_ssthresh); |
1666 | - else /* PRR */ |
1667 | + tp->snd_cwnd_stamp = tcp_time_stamp; |
1668 | + } else if (tp->snd_ssthresh < TCP_INFINITE_SSTHRESH) { |
1669 | + /* PRR algorithm. */ |
1670 | tp->snd_cwnd = tp->snd_ssthresh; |
1671 | - tp->snd_cwnd_stamp = tcp_time_stamp; |
1672 | + tp->snd_cwnd_stamp = tcp_time_stamp; |
1673 | + } |
1674 | } |
1675 | tcp_ca_event(sk, CA_EVENT_COMPLETE_CWR); |
1676 | } |
1677 | diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c |
1678 | index 55670ec..2a2a3e7 100644 |
1679 | --- a/net/l2tp/l2tp_ip.c |
1680 | +++ b/net/l2tp/l2tp_ip.c |
1681 | @@ -441,8 +441,9 @@ static int l2tp_ip_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *m |
1682 | |
1683 | daddr = lip->l2tp_addr.s_addr; |
1684 | } else { |
1685 | + rc = -EDESTADDRREQ; |
1686 | if (sk->sk_state != TCP_ESTABLISHED) |
1687 | - return -EDESTADDRREQ; |
1688 | + goto out; |
1689 | |
1690 | daddr = inet->inet_daddr; |
1691 | connected = 1; |
1692 | diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c |
1693 | index 7801b15..a489d8b 100644 |
1694 | --- a/net/sched/sch_netem.c |
1695 | +++ b/net/sched/sch_netem.c |
1696 | @@ -351,10 +351,8 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) |
1697 | if (q->corrupt && q->corrupt >= get_crandom(&q->corrupt_cor)) { |
1698 | if (!(skb = skb_unshare(skb, GFP_ATOMIC)) || |
1699 | (skb->ip_summed == CHECKSUM_PARTIAL && |
1700 | - skb_checksum_help(skb))) { |
1701 | - sch->qstats.drops++; |
1702 | - return NET_XMIT_DROP; |
1703 | - } |
1704 | + skb_checksum_help(skb))) |
1705 | + return qdisc_drop(skb, sch); |
1706 | |
1707 | skb->data[net_random() % skb_headlen(skb)] ^= 1<<(net_random() % 8); |
1708 | } |
1709 | diff --git a/sound/pci/echoaudio/echoaudio_dsp.c b/sound/pci/echoaudio/echoaudio_dsp.c |
1710 | index 64417a7..d8c670c 100644 |
1711 | --- a/sound/pci/echoaudio/echoaudio_dsp.c |
1712 | +++ b/sound/pci/echoaudio/echoaudio_dsp.c |
1713 | @@ -475,7 +475,7 @@ static int load_firmware(struct echoaudio *chip) |
1714 | const struct firmware *fw; |
1715 | int box_type, err; |
1716 | |
1717 | - if (snd_BUG_ON(!chip->dsp_code_to_load || !chip->comm_page)) |
1718 | + if (snd_BUG_ON(!chip->comm_page)) |
1719 | return -EPERM; |
1720 | |
1721 | /* See if the ASIC is present and working - only if the DSP is already loaded */ |
1722 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
1723 | index 192e6c0..53345bc 100644 |
1724 | --- a/sound/pci/hda/hda_intel.c |
1725 | +++ b/sound/pci/hda/hda_intel.c |
1726 | @@ -769,11 +769,13 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus, |
1727 | { |
1728 | struct azx *chip = bus->private_data; |
1729 | unsigned long timeout; |
1730 | + unsigned long loopcounter; |
1731 | int do_poll = 0; |
1732 | |
1733 | again: |
1734 | timeout = jiffies + msecs_to_jiffies(1000); |
1735 | - for (;;) { |
1736 | + |
1737 | + for (loopcounter = 0;; loopcounter++) { |
1738 | if (chip->polling_mode || do_poll) { |
1739 | spin_lock_irq(&chip->reg_lock); |
1740 | azx_update_rirb(chip); |
1741 | @@ -789,7 +791,7 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus, |
1742 | } |
1743 | if (time_after(jiffies, timeout)) |
1744 | break; |
1745 | - if (bus->needs_damn_long_delay) |
1746 | + if (bus->needs_damn_long_delay || loopcounter > 3000) |
1747 | msleep(2); /* temporary workaround */ |
1748 | else { |
1749 | udelay(10); |
1750 | diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c |
1751 | index ed67698..7b7a516 100644 |
1752 | --- a/sound/pci/hda/patch_sigmatel.c |
1753 | +++ b/sound/pci/hda/patch_sigmatel.c |
1754 | @@ -4484,9 +4484,9 @@ static int stac92xx_init(struct hda_codec *codec) |
1755 | def_conf = get_defcfg_connect(def_conf); |
1756 | /* skip any ports that don't have jacks since presence |
1757 | * detection is useless */ |
1758 | - if (def_conf != AC_JACK_PORT_COMPLEX) { |
1759 | - if (def_conf != AC_JACK_PORT_NONE) |
1760 | - stac_toggle_power_map(codec, nid, 1); |
1761 | + if (def_conf != AC_JACK_PORT_NONE && |
1762 | + !is_jack_detectable(codec, nid)) { |
1763 | + stac_toggle_power_map(codec, nid, 1); |
1764 | continue; |
1765 | } |
1766 | if (enable_pin_detect(codec, nid, STAC_PWR_EVENT)) { |
1767 | diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c |
1768 | index 7806301..3e7aa22 100644 |
1769 | --- a/sound/soc/codecs/wm8994.c |
1770 | +++ b/sound/soc/codecs/wm8994.c |
1771 | @@ -1027,7 +1027,7 @@ static int aif2clk_ev(struct snd_soc_dapm_widget *w, |
1772 | snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_5, |
1773 | WM8994_AIF2DACL_ENA | |
1774 | WM8994_AIF2DACR_ENA, 0); |
1775 | - snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_5, |
1776 | + snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_4, |
1777 | WM8994_AIF2ADCL_ENA | |
1778 | WM8994_AIF2ADCR_ENA, 0); |
1779 |