Annotation of /trunk/kernel-magellan/patches-3.1/0108-3.1.9-all-fixes.patch
Parent Directory | Revision Log
Revision 1620 -
(hide annotations)
(download)
Mon Jan 16 18:48:12 2012 UTC (12 years, 8 months ago) by niro
File size: 47857 byte(s)
Mon Jan 16 18:48:12 2012 UTC (12 years, 8 months ago) by niro
File size: 47857 byte(s)
-added incr patch up to 3.1.9
1 | niro | 1620 | diff --git a/Documentation/HOWTO b/Documentation/HOWTO |
2 | index 81bc1a9..f7ade3b 100644 | ||
3 | --- a/Documentation/HOWTO | ||
4 | +++ b/Documentation/HOWTO | ||
5 | @@ -275,8 +275,8 @@ versions. | ||
6 | If no 2.6.x.y kernel is available, then the highest numbered 2.6.x | ||
7 | kernel is the current stable kernel. | ||
8 | |||
9 | -2.6.x.y are maintained by the "stable" team <stable@kernel.org>, and are | ||
10 | -released as needs dictate. The normal release period is approximately | ||
11 | +2.6.x.y are maintained by the "stable" team <stable@vger.kernel.org>, and | ||
12 | +are released as needs dictate. The normal release period is approximately | ||
13 | two weeks, but it can be longer if there are no pressing problems. A | ||
14 | security-related problem, instead, can cause a release to happen almost | ||
15 | instantly. | ||
16 | diff --git a/Documentation/development-process/5.Posting b/Documentation/development-process/5.Posting | ||
17 | index 903a254..8a48c9b 100644 | ||
18 | --- a/Documentation/development-process/5.Posting | ||
19 | +++ b/Documentation/development-process/5.Posting | ||
20 | @@ -271,10 +271,10 @@ copies should go to: | ||
21 | the linux-kernel list. | ||
22 | |||
23 | - If you are fixing a bug, think about whether the fix should go into the | ||
24 | - next stable update. If so, stable@kernel.org should get a copy of the | ||
25 | - patch. Also add a "Cc: stable@kernel.org" to the tags within the patch | ||
26 | - itself; that will cause the stable team to get a notification when your | ||
27 | - fix goes into the mainline. | ||
28 | + next stable update. If so, stable@vger.kernel.org should get a copy of | ||
29 | + the patch. Also add a "Cc: stable@vger.kernel.org" to the tags within | ||
30 | + the patch itself; that will cause the stable team to get a notification | ||
31 | + when your fix goes into the mainline. | ||
32 | |||
33 | When selecting recipients for a patch, it is good to have an idea of who | ||
34 | you think will eventually accept the patch and get it merged. While it | ||
35 | diff --git a/Documentation/usb/usbmon.txt b/Documentation/usb/usbmon.txt | ||
36 | index a4efa04..5335fa8 100644 | ||
37 | --- a/Documentation/usb/usbmon.txt | ||
38 | +++ b/Documentation/usb/usbmon.txt | ||
39 | @@ -47,10 +47,11 @@ This allows to filter away annoying devices that talk continuously. | ||
40 | |||
41 | 2. Find which bus connects to the desired device | ||
42 | |||
43 | -Run "cat /proc/bus/usb/devices", and find the T-line which corresponds to | ||
44 | -the device. Usually you do it by looking for the vendor string. If you have | ||
45 | -many similar devices, unplug one and compare two /proc/bus/usb/devices outputs. | ||
46 | -The T-line will have a bus number. Example: | ||
47 | +Run "cat /sys/kernel/debug/usb/devices", and find the T-line which corresponds | ||
48 | +to the device. Usually you do it by looking for the vendor string. If you have | ||
49 | +many similar devices, unplug one and compare the two | ||
50 | +/sys/kernel/debug/usb/devices outputs. The T-line will have a bus number. | ||
51 | +Example: | ||
52 | |||
53 | T: Bus=03 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 0 | ||
54 | D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 | ||
55 | @@ -58,7 +59,10 @@ P: Vendor=0557 ProdID=2004 Rev= 1.00 | ||
56 | S: Manufacturer=ATEN | ||
57 | S: Product=UC100KM V2.00 | ||
58 | |||
59 | -Bus=03 means it's bus 3. | ||
60 | +"Bus=03" means it's bus 3. Alternatively, you can look at the output from | ||
61 | +"lsusb" and get the bus number from the appropriate line. Example: | ||
62 | + | ||
63 | +Bus 003 Device 002: ID 0557:2004 ATEN UC100KM V2.00 | ||
64 | |||
65 | 3. Start 'cat' | ||
66 | |||
67 | diff --git a/MAINTAINERS b/MAINTAINERS | ||
68 | index e608038..c0bb916 100644 | ||
69 | --- a/MAINTAINERS | ||
70 | +++ b/MAINTAINERS | ||
71 | @@ -6129,7 +6129,7 @@ F: arch/alpha/kernel/srm_env.c | ||
72 | |||
73 | STABLE BRANCH | ||
74 | M: Greg Kroah-Hartman <greg@kroah.com> | ||
75 | -L: stable@kernel.org | ||
76 | +L: stable@vger.kernel.org | ||
77 | S: Maintained | ||
78 | |||
79 | STAGING SUBSYSTEM | ||
80 | diff --git a/arch/powerpc/include/asm/time.h b/arch/powerpc/include/asm/time.h | ||
81 | index fe6f7c2..bc3c745 100644 | ||
82 | --- a/arch/powerpc/include/asm/time.h | ||
83 | +++ b/arch/powerpc/include/asm/time.h | ||
84 | @@ -219,5 +219,7 @@ DECLARE_PER_CPU(struct cpu_usage, cpu_usage_array); | ||
85 | extern void secondary_cpu_time_init(void); | ||
86 | extern void iSeries_time_init_early(void); | ||
87 | |||
88 | +extern void decrementer_check_overflow(void); | ||
89 | + | ||
90 | #endif /* __KERNEL__ */ | ||
91 | #endif /* __POWERPC_TIME_H */ | ||
92 | diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c | ||
93 | index d281fb6..4b1e82a 100644 | ||
94 | --- a/arch/powerpc/kernel/irq.c | ||
95 | +++ b/arch/powerpc/kernel/irq.c | ||
96 | @@ -164,16 +164,13 @@ notrace void arch_local_irq_restore(unsigned long en) | ||
97 | */ | ||
98 | local_paca->hard_enabled = en; | ||
99 | |||
100 | -#ifndef CONFIG_BOOKE | ||
101 | - /* On server, re-trigger the decrementer if it went negative since | ||
102 | - * some processors only trigger on edge transitions of the sign bit. | ||
103 | - * | ||
104 | - * BookE has a level sensitive decrementer (latches in TSR) so we | ||
105 | - * don't need that | ||
106 | + /* | ||
107 | + * Trigger the decrementer if we have a pending event. Some processors | ||
108 | + * only trigger on edge transitions of the sign bit. We might also | ||
109 | + * have disabled interrupts long enough that the decrementer wrapped | ||
110 | + * to positive. | ||
111 | */ | ||
112 | - if ((int)mfspr(SPRN_DEC) < 0) | ||
113 | - mtspr(SPRN_DEC, 1); | ||
114 | -#endif /* CONFIG_BOOKE */ | ||
115 | + decrementer_check_overflow(); | ||
116 | |||
117 | /* | ||
118 | * Force the delivery of pending soft-disabled interrupts on PS3. | ||
119 | diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c | ||
120 | index 03b29a6..2de304a 100644 | ||
121 | --- a/arch/powerpc/kernel/time.c | ||
122 | +++ b/arch/powerpc/kernel/time.c | ||
123 | @@ -889,6 +889,15 @@ static void __init clocksource_init(void) | ||
124 | clock->name, clock->mult, clock->shift); | ||
125 | } | ||
126 | |||
127 | +void decrementer_check_overflow(void) | ||
128 | +{ | ||
129 | + u64 now = get_tb_or_rtc(); | ||
130 | + struct decrementer_clock *decrementer = &__get_cpu_var(decrementers); | ||
131 | + | ||
132 | + if (now >= decrementer->next_tb) | ||
133 | + set_dec(1); | ||
134 | +} | ||
135 | + | ||
136 | static int decrementer_set_next_event(unsigned long evt, | ||
137 | struct clock_event_device *dev) | ||
138 | { | ||
139 | diff --git a/arch/powerpc/platforms/pseries/hvCall_inst.c b/arch/powerpc/platforms/pseries/hvCall_inst.c | ||
140 | index f106662..c9311cf 100644 | ||
141 | --- a/arch/powerpc/platforms/pseries/hvCall_inst.c | ||
142 | +++ b/arch/powerpc/platforms/pseries/hvCall_inst.c | ||
143 | @@ -109,7 +109,7 @@ static void probe_hcall_entry(void *ignored, unsigned long opcode, unsigned long | ||
144 | if (opcode > MAX_HCALL_OPCODE) | ||
145 | return; | ||
146 | |||
147 | - h = &get_cpu_var(hcall_stats)[opcode / 4]; | ||
148 | + h = &__get_cpu_var(hcall_stats)[opcode / 4]; | ||
149 | h->tb_start = mftb(); | ||
150 | h->purr_start = mfspr(SPRN_PURR); | ||
151 | } | ||
152 | @@ -126,8 +126,6 @@ static void probe_hcall_exit(void *ignored, unsigned long opcode, unsigned long | ||
153 | h->num_calls++; | ||
154 | h->tb_total += mftb() - h->tb_start; | ||
155 | h->purr_total += mfspr(SPRN_PURR) - h->purr_start; | ||
156 | - | ||
157 | - put_cpu_var(hcall_stats); | ||
158 | } | ||
159 | |||
160 | static int __init hcall_inst_init(void) | ||
161 | diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c | ||
162 | index c9a29da..2178cc4 100644 | ||
163 | --- a/arch/powerpc/platforms/pseries/lpar.c | ||
164 | +++ b/arch/powerpc/platforms/pseries/lpar.c | ||
165 | @@ -553,6 +553,7 @@ void __trace_hcall_entry(unsigned long opcode, unsigned long *args) | ||
166 | goto out; | ||
167 | |||
168 | (*depth)++; | ||
169 | + preempt_disable(); | ||
170 | trace_hcall_entry(opcode, args); | ||
171 | (*depth)--; | ||
172 | |||
173 | @@ -575,6 +576,7 @@ void __trace_hcall_exit(long opcode, unsigned long retval, | ||
174 | |||
175 | (*depth)++; | ||
176 | trace_hcall_exit(opcode, retval, retbuf); | ||
177 | + preempt_enable(); | ||
178 | (*depth)--; | ||
179 | |||
180 | out: | ||
181 | diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c | ||
182 | index 06ed6b4..3719c94 100644 | ||
183 | --- a/drivers/base/firmware_class.c | ||
184 | +++ b/drivers/base/firmware_class.c | ||
185 | @@ -226,13 +226,13 @@ static ssize_t firmware_loading_store(struct device *dev, | ||
186 | int loading = simple_strtol(buf, NULL, 10); | ||
187 | int i; | ||
188 | |||
189 | + mutex_lock(&fw_lock); | ||
190 | + | ||
191 | + if (!fw_priv->fw) | ||
192 | + goto out; | ||
193 | + | ||
194 | switch (loading) { | ||
195 | case 1: | ||
196 | - mutex_lock(&fw_lock); | ||
197 | - if (!fw_priv->fw) { | ||
198 | - mutex_unlock(&fw_lock); | ||
199 | - break; | ||
200 | - } | ||
201 | firmware_free_data(fw_priv->fw); | ||
202 | memset(fw_priv->fw, 0, sizeof(struct firmware)); | ||
203 | /* If the pages are not owned by 'struct firmware' */ | ||
204 | @@ -243,7 +243,6 @@ static ssize_t firmware_loading_store(struct device *dev, | ||
205 | fw_priv->page_array_size = 0; | ||
206 | fw_priv->nr_pages = 0; | ||
207 | set_bit(FW_STATUS_LOADING, &fw_priv->status); | ||
208 | - mutex_unlock(&fw_lock); | ||
209 | break; | ||
210 | case 0: | ||
211 | if (test_bit(FW_STATUS_LOADING, &fw_priv->status)) { | ||
212 | @@ -274,7 +273,8 @@ static ssize_t firmware_loading_store(struct device *dev, | ||
213 | fw_load_abort(fw_priv); | ||
214 | break; | ||
215 | } | ||
216 | - | ||
217 | +out: | ||
218 | + mutex_unlock(&fw_lock); | ||
219 | return count; | ||
220 | } | ||
221 | |||
222 | diff --git a/drivers/infiniband/hw/qib/qib_iba6120.c b/drivers/infiniband/hw/qib/qib_iba6120.c | ||
223 | index d8ca0a0..65df26c 100644 | ||
224 | --- a/drivers/infiniband/hw/qib/qib_iba6120.c | ||
225 | +++ b/drivers/infiniband/hw/qib/qib_iba6120.c | ||
226 | @@ -2076,9 +2076,11 @@ static void qib_6120_config_ctxts(struct qib_devdata *dd) | ||
227 | static void qib_update_6120_usrhead(struct qib_ctxtdata *rcd, u64 hd, | ||
228 | u32 updegr, u32 egrhd, u32 npkts) | ||
229 | { | ||
230 | - qib_write_ureg(rcd->dd, ur_rcvhdrhead, hd, rcd->ctxt); | ||
231 | if (updegr) | ||
232 | qib_write_ureg(rcd->dd, ur_rcvegrindexhead, egrhd, rcd->ctxt); | ||
233 | + mmiowb(); | ||
234 | + qib_write_ureg(rcd->dd, ur_rcvhdrhead, hd, rcd->ctxt); | ||
235 | + mmiowb(); | ||
236 | } | ||
237 | |||
238 | static u32 qib_6120_hdrqempty(struct qib_ctxtdata *rcd) | ||
239 | diff --git a/drivers/infiniband/hw/qib/qib_iba7220.c b/drivers/infiniband/hw/qib/qib_iba7220.c | ||
240 | index e1f9474..4250c05 100644 | ||
241 | --- a/drivers/infiniband/hw/qib/qib_iba7220.c | ||
242 | +++ b/drivers/infiniband/hw/qib/qib_iba7220.c | ||
243 | @@ -2724,9 +2724,11 @@ static int qib_7220_set_loopback(struct qib_pportdata *ppd, const char *what) | ||
244 | static void qib_update_7220_usrhead(struct qib_ctxtdata *rcd, u64 hd, | ||
245 | u32 updegr, u32 egrhd, u32 npkts) | ||
246 | { | ||
247 | - qib_write_ureg(rcd->dd, ur_rcvhdrhead, hd, rcd->ctxt); | ||
248 | if (updegr) | ||
249 | qib_write_ureg(rcd->dd, ur_rcvegrindexhead, egrhd, rcd->ctxt); | ||
250 | + mmiowb(); | ||
251 | + qib_write_ureg(rcd->dd, ur_rcvhdrhead, hd, rcd->ctxt); | ||
252 | + mmiowb(); | ||
253 | } | ||
254 | |||
255 | static u32 qib_7220_hdrqempty(struct qib_ctxtdata *rcd) | ||
256 | diff --git a/drivers/infiniband/hw/qib/qib_iba7322.c b/drivers/infiniband/hw/qib/qib_iba7322.c | ||
257 | index 5ea9ece..b7c3c7d 100644 | ||
258 | --- a/drivers/infiniband/hw/qib/qib_iba7322.c | ||
259 | +++ b/drivers/infiniband/hw/qib/qib_iba7322.c | ||
260 | @@ -4084,10 +4084,12 @@ static void qib_update_7322_usrhead(struct qib_ctxtdata *rcd, u64 hd, | ||
261 | */ | ||
262 | if (hd >> IBA7322_HDRHEAD_PKTINT_SHIFT) | ||
263 | adjust_rcv_timeout(rcd, npkts); | ||
264 | - qib_write_ureg(rcd->dd, ur_rcvhdrhead, hd, rcd->ctxt); | ||
265 | - qib_write_ureg(rcd->dd, ur_rcvhdrhead, hd, rcd->ctxt); | ||
266 | if (updegr) | ||
267 | qib_write_ureg(rcd->dd, ur_rcvegrindexhead, egrhd, rcd->ctxt); | ||
268 | + mmiowb(); | ||
269 | + qib_write_ureg(rcd->dd, ur_rcvhdrhead, hd, rcd->ctxt); | ||
270 | + qib_write_ureg(rcd->dd, ur_rcvhdrhead, hd, rcd->ctxt); | ||
271 | + mmiowb(); | ||
272 | } | ||
273 | |||
274 | static u32 qib_7322_hdrqempty(struct qib_ctxtdata *rcd) | ||
275 | diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c | ||
276 | index de3d351..ba0e065 100644 | ||
277 | --- a/drivers/net/bonding/bond_main.c | ||
278 | +++ b/drivers/net/bonding/bond_main.c | ||
279 | @@ -1839,7 +1839,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | ||
280 | "but new slave device does not support netpoll.\n", | ||
281 | bond_dev->name); | ||
282 | res = -EBUSY; | ||
283 | - goto err_close; | ||
284 | + goto err_detach; | ||
285 | } | ||
286 | } | ||
287 | #endif | ||
288 | @@ -1848,7 +1848,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | ||
289 | |||
290 | res = bond_create_slave_symlinks(bond_dev, slave_dev); | ||
291 | if (res) | ||
292 | - goto err_close; | ||
293 | + goto err_detach; | ||
294 | |||
295 | res = netdev_rx_handler_register(slave_dev, bond_handle_frame, | ||
296 | new_slave); | ||
297 | @@ -1869,6 +1869,11 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | ||
298 | err_dest_symlinks: | ||
299 | bond_destroy_slave_symlinks(bond_dev, slave_dev); | ||
300 | |||
301 | +err_detach: | ||
302 | + write_lock_bh(&bond->lock); | ||
303 | + bond_detach_slave(bond, new_slave); | ||
304 | + write_unlock_bh(&bond->lock); | ||
305 | + | ||
306 | err_close: | ||
307 | dev_close(slave_dev); | ||
308 | |||
309 | diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c | ||
310 | index c5c4b4d..7105577 100644 | ||
311 | --- a/drivers/net/usb/asix.c | ||
312 | +++ b/drivers/net/usb/asix.c | ||
313 | @@ -371,7 +371,7 @@ static int asix_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | ||
314 | |||
315 | skb_pull(skb, (size + 1) & 0xfffe); | ||
316 | |||
317 | - if (skb->len == 0) | ||
318 | + if (skb->len < sizeof(header)) | ||
319 | break; | ||
320 | |||
321 | head = (u8 *) skb->data; | ||
322 | @@ -1560,6 +1560,10 @@ static const struct usb_device_id products [] = { | ||
323 | // ASIX 88772a | ||
324 | USB_DEVICE(0x0db0, 0xa877), | ||
325 | .driver_info = (unsigned long) &ax88772_info, | ||
326 | +}, { | ||
327 | + // Asus USB Ethernet Adapter | ||
328 | + USB_DEVICE (0x0b95, 0x7e2b), | ||
329 | + .driver_info = (unsigned long) &ax88772_info, | ||
330 | }, | ||
331 | { }, // END | ||
332 | }; | ||
333 | diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c | ||
334 | index dbf501c..05f9769 100644 | ||
335 | --- a/drivers/net/wireless/rt2x00/rt2800usb.c | ||
336 | +++ b/drivers/net/wireless/rt2x00/rt2800usb.c | ||
337 | @@ -970,6 +970,7 @@ static struct usb_device_id rt2800usb_device_table[] = { | ||
338 | { USB_DEVICE(0x13b1, 0x0031) }, | ||
339 | { USB_DEVICE(0x1737, 0x0070) }, | ||
340 | { USB_DEVICE(0x1737, 0x0071) }, | ||
341 | + { USB_DEVICE(0x1737, 0x0077) }, | ||
342 | /* Logitec */ | ||
343 | { USB_DEVICE(0x0789, 0x0162) }, | ||
344 | { USB_DEVICE(0x0789, 0x0163) }, | ||
345 | @@ -1165,7 +1166,6 @@ static struct usb_device_id rt2800usb_device_table[] = { | ||
346 | { USB_DEVICE(0x1740, 0x0605) }, | ||
347 | { USB_DEVICE(0x1740, 0x0615) }, | ||
348 | /* Linksys */ | ||
349 | - { USB_DEVICE(0x1737, 0x0077) }, | ||
350 | { USB_DEVICE(0x1737, 0x0078) }, | ||
351 | /* Logitec */ | ||
352 | { USB_DEVICE(0x0789, 0x0168) }, | ||
353 | diff --git a/drivers/net/wireless/wl12xx/boot.c b/drivers/net/wireless/wl12xx/boot.c | ||
354 | index 5ebc64d..454e913 100644 | ||
355 | --- a/drivers/net/wireless/wl12xx/boot.c | ||
356 | +++ b/drivers/net/wireless/wl12xx/boot.c | ||
357 | @@ -358,6 +358,9 @@ static int wl1271_boot_upload_nvs(struct wl1271 *wl) | ||
358 | nvs_ptr += 3; | ||
359 | |||
360 | for (i = 0; i < burst_len; i++) { | ||
361 | + if (nvs_ptr + 3 >= (u8 *) wl->nvs + nvs_len) | ||
362 | + goto out_badnvs; | ||
363 | + | ||
364 | val = (nvs_ptr[0] | (nvs_ptr[1] << 8) | ||
365 | | (nvs_ptr[2] << 16) | (nvs_ptr[3] << 24)); | ||
366 | |||
367 | @@ -369,6 +372,9 @@ static int wl1271_boot_upload_nvs(struct wl1271 *wl) | ||
368 | nvs_ptr += 4; | ||
369 | dest_addr += 4; | ||
370 | } | ||
371 | + | ||
372 | + if (nvs_ptr >= (u8 *) wl->nvs + nvs_len) | ||
373 | + goto out_badnvs; | ||
374 | } | ||
375 | |||
376 | /* | ||
377 | @@ -380,6 +386,10 @@ static int wl1271_boot_upload_nvs(struct wl1271 *wl) | ||
378 | */ | ||
379 | nvs_ptr = (u8 *)wl->nvs + | ||
380 | ALIGN(nvs_ptr - (u8 *)wl->nvs + 7, 4); | ||
381 | + | ||
382 | + if (nvs_ptr >= (u8 *) wl->nvs + nvs_len) | ||
383 | + goto out_badnvs; | ||
384 | + | ||
385 | nvs_len -= nvs_ptr - (u8 *)wl->nvs; | ||
386 | |||
387 | /* Now we must set the partition correctly */ | ||
388 | @@ -395,6 +405,10 @@ static int wl1271_boot_upload_nvs(struct wl1271 *wl) | ||
389 | |||
390 | kfree(nvs_aligned); | ||
391 | return 0; | ||
392 | + | ||
393 | +out_badnvs: | ||
394 | + wl1271_error("nvs data is malformed"); | ||
395 | + return -EILSEQ; | ||
396 | } | ||
397 | |||
398 | static void wl1271_boot_enable_interrupts(struct wl1271 *wl) | ||
399 | diff --git a/drivers/net/wireless/wl12xx/cmd.c b/drivers/net/wireless/wl12xx/cmd.c | ||
400 | index 97dd237..2144f60 100644 | ||
401 | --- a/drivers/net/wireless/wl12xx/cmd.c | ||
402 | +++ b/drivers/net/wireless/wl12xx/cmd.c | ||
403 | @@ -120,6 +120,11 @@ int wl1271_cmd_general_parms(struct wl1271 *wl) | ||
404 | if (!wl->nvs) | ||
405 | return -ENODEV; | ||
406 | |||
407 | + if (gp->tx_bip_fem_manufacturer >= WL1271_INI_FEM_MODULE_COUNT) { | ||
408 | + wl1271_warning("FEM index from INI out of bounds"); | ||
409 | + return -EINVAL; | ||
410 | + } | ||
411 | + | ||
412 | gen_parms = kzalloc(sizeof(*gen_parms), GFP_KERNEL); | ||
413 | if (!gen_parms) | ||
414 | return -ENOMEM; | ||
415 | @@ -148,6 +153,12 @@ int wl1271_cmd_general_parms(struct wl1271 *wl) | ||
416 | gp->tx_bip_fem_manufacturer = | ||
417 | gen_parms->general_params.tx_bip_fem_manufacturer; | ||
418 | |||
419 | + if (gp->tx_bip_fem_manufacturer >= WL1271_INI_FEM_MODULE_COUNT) { | ||
420 | + wl1271_warning("FEM index from FW out of bounds"); | ||
421 | + ret = -EINVAL; | ||
422 | + goto out; | ||
423 | + } | ||
424 | + | ||
425 | wl1271_debug(DEBUG_CMD, "FEM autodetect: %s, manufacturer: %d\n", | ||
426 | answer ? "auto" : "manual", gp->tx_bip_fem_manufacturer); | ||
427 | |||
428 | @@ -167,6 +178,11 @@ int wl128x_cmd_general_parms(struct wl1271 *wl) | ||
429 | if (!wl->nvs) | ||
430 | return -ENODEV; | ||
431 | |||
432 | + if (gp->tx_bip_fem_manufacturer >= WL1271_INI_FEM_MODULE_COUNT) { | ||
433 | + wl1271_warning("FEM index from ini out of bounds"); | ||
434 | + return -EINVAL; | ||
435 | + } | ||
436 | + | ||
437 | gen_parms = kzalloc(sizeof(*gen_parms), GFP_KERNEL); | ||
438 | if (!gen_parms) | ||
439 | return -ENOMEM; | ||
440 | @@ -191,6 +207,12 @@ int wl128x_cmd_general_parms(struct wl1271 *wl) | ||
441 | gp->tx_bip_fem_manufacturer = | ||
442 | gen_parms->general_params.tx_bip_fem_manufacturer; | ||
443 | |||
444 | + if (gp->tx_bip_fem_manufacturer >= WL1271_INI_FEM_MODULE_COUNT) { | ||
445 | + wl1271_warning("FEM index from FW out of bounds"); | ||
446 | + ret = -EINVAL; | ||
447 | + goto out; | ||
448 | + } | ||
449 | + | ||
450 | wl1271_debug(DEBUG_CMD, "FEM autodetect: %s, manufacturer: %d\n", | ||
451 | answer ? "auto" : "manual", gp->tx_bip_fem_manufacturer); | ||
452 | |||
453 | diff --git a/drivers/net/wireless/wl12xx/testmode.c b/drivers/net/wireless/wl12xx/testmode.c | ||
454 | index 4ae8eff..abfb120 100644 | ||
455 | --- a/drivers/net/wireless/wl12xx/testmode.c | ||
456 | +++ b/drivers/net/wireless/wl12xx/testmode.c | ||
457 | @@ -36,6 +36,7 @@ enum wl1271_tm_commands { | ||
458 | WL1271_TM_CMD_TEST, | ||
459 | WL1271_TM_CMD_INTERROGATE, | ||
460 | WL1271_TM_CMD_CONFIGURE, | ||
461 | + WL1271_TM_CMD_NVS_PUSH, /* Not in use. Keep to not break ABI */ | ||
462 | WL1271_TM_CMD_SET_PLT_MODE, | ||
463 | WL1271_TM_CMD_RECOVER, | ||
464 | |||
465 | diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c | ||
466 | index d3b3567..7375124 100644 | ||
467 | --- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c | ||
468 | +++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c | ||
469 | @@ -7354,6 +7354,7 @@ _scsih_remove(struct pci_dev *pdev) | ||
470 | } | ||
471 | |||
472 | sas_remove_host(shost); | ||
473 | + mpt2sas_base_detach(ioc); | ||
474 | list_del(&ioc->list); | ||
475 | scsi_remove_host(shost); | ||
476 | scsi_host_put(shost); | ||
477 | diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c | ||
478 | index b922f5d..948fc77 100644 | ||
479 | --- a/drivers/tty/serial/atmel_serial.c | ||
480 | +++ b/drivers/tty/serial/atmel_serial.c | ||
481 | @@ -199,8 +199,9 @@ void atmel_config_rs485(struct uart_port *port, struct serial_rs485 *rs485conf) | ||
482 | { | ||
483 | struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); | ||
484 | unsigned int mode; | ||
485 | + unsigned long flags; | ||
486 | |||
487 | - spin_lock(&port->lock); | ||
488 | + spin_lock_irqsave(&port->lock, flags); | ||
489 | |||
490 | /* Disable interrupts */ | ||
491 | UART_PUT_IDR(port, atmel_port->tx_done_mask); | ||
492 | @@ -231,7 +232,7 @@ void atmel_config_rs485(struct uart_port *port, struct serial_rs485 *rs485conf) | ||
493 | /* Enable interrupts */ | ||
494 | UART_PUT_IER(port, atmel_port->tx_done_mask); | ||
495 | |||
496 | - spin_unlock(&port->lock); | ||
497 | + spin_unlock_irqrestore(&port->lock, flags); | ||
498 | |||
499 | } | ||
500 | |||
501 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c | ||
502 | index 8faa23c..158f631 100644 | ||
503 | --- a/drivers/usb/class/cdc-acm.c | ||
504 | +++ b/drivers/usb/class/cdc-acm.c | ||
505 | @@ -554,10 +554,18 @@ static void acm_port_down(struct acm *acm) | ||
506 | |||
507 | static void acm_tty_hangup(struct tty_struct *tty) | ||
508 | { | ||
509 | - struct acm *acm = tty->driver_data; | ||
510 | - tty_port_hangup(&acm->port); | ||
511 | + struct acm *acm; | ||
512 | + | ||
513 | mutex_lock(&open_mutex); | ||
514 | + acm = tty->driver_data; | ||
515 | + | ||
516 | + if (!acm) | ||
517 | + goto out; | ||
518 | + | ||
519 | + tty_port_hangup(&acm->port); | ||
520 | acm_port_down(acm); | ||
521 | + | ||
522 | +out: | ||
523 | mutex_unlock(&open_mutex); | ||
524 | } | ||
525 | |||
526 | @@ -1183,6 +1191,8 @@ made_compressed_probe: | ||
527 | i = device_create_file(&intf->dev, &dev_attr_wCountryCodes); | ||
528 | if (i < 0) { | ||
529 | kfree(acm->country_codes); | ||
530 | + acm->country_codes = NULL; | ||
531 | + acm->country_code_size = 0; | ||
532 | goto skip_countries; | ||
533 | } | ||
534 | |||
535 | @@ -1191,6 +1201,8 @@ made_compressed_probe: | ||
536 | if (i < 0) { | ||
537 | device_remove_file(&intf->dev, &dev_attr_wCountryCodes); | ||
538 | kfree(acm->country_codes); | ||
539 | + acm->country_codes = NULL; | ||
540 | + acm->country_code_size = 0; | ||
541 | goto skip_countries; | ||
542 | } | ||
543 | } | ||
544 | diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c | ||
545 | index 73cbbd8..ea47c13 100644 | ||
546 | --- a/drivers/usb/core/hcd.c | ||
547 | +++ b/drivers/usb/core/hcd.c | ||
548 | @@ -1398,11 +1398,10 @@ int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb, | ||
549 | ret = -EAGAIN; | ||
550 | else | ||
551 | urb->transfer_flags |= URB_DMA_MAP_SG; | ||
552 | - if (n != urb->num_sgs) { | ||
553 | - urb->num_sgs = n; | ||
554 | + urb->num_mapped_sgs = n; | ||
555 | + if (n != urb->num_sgs) | ||
556 | urb->transfer_flags |= | ||
557 | URB_DMA_SG_COMBINED; | ||
558 | - } | ||
559 | } else if (urb->sg) { | ||
560 | struct scatterlist *sg = urb->sg; | ||
561 | urb->transfer_dma = dma_map_page( | ||
562 | diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c | ||
563 | index ecf12e1..4c65eb6 100644 | ||
564 | --- a/drivers/usb/core/quirks.c | ||
565 | +++ b/drivers/usb/core/quirks.c | ||
566 | @@ -117,9 +117,12 @@ static const struct usb_device_id usb_quirk_list[] = { | ||
567 | { USB_DEVICE(0x06a3, 0x0006), .driver_info = | ||
568 | USB_QUIRK_CONFIG_INTF_STRINGS }, | ||
569 | |||
570 | - /* Guillemot Webcam Hercules Dualpix Exchange*/ | ||
571 | + /* Guillemot Webcam Hercules Dualpix Exchange (2nd ID) */ | ||
572 | { USB_DEVICE(0x06f8, 0x0804), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
573 | |||
574 | + /* Guillemot Webcam Hercules Dualpix Exchange*/ | ||
575 | + { USB_DEVICE(0x06f8, 0x3005), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
576 | + | ||
577 | /* M-Systems Flash Disk Pioneers */ | ||
578 | { USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
579 | |||
580 | diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c | ||
581 | index 0917e3a..2499b3b 100644 | ||
582 | --- a/drivers/usb/host/ehci-q.c | ||
583 | +++ b/drivers/usb/host/ehci-q.c | ||
584 | @@ -649,7 +649,7 @@ qh_urb_transaction ( | ||
585 | /* | ||
586 | * data transfer stage: buffer setup | ||
587 | */ | ||
588 | - i = urb->num_sgs; | ||
589 | + i = urb->num_mapped_sgs; | ||
590 | if (len > 0 && i > 0) { | ||
591 | sg = urb->sg; | ||
592 | buf = sg_dma_address(sg); | ||
593 | diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c | ||
594 | index f9cf3f0..23107e2 100644 | ||
595 | --- a/drivers/usb/host/ohci-hcd.c | ||
596 | +++ b/drivers/usb/host/ohci-hcd.c | ||
597 | @@ -389,17 +389,14 @@ ohci_shutdown (struct usb_hcd *hcd) | ||
598 | struct ohci_hcd *ohci; | ||
599 | |||
600 | ohci = hcd_to_ohci (hcd); | ||
601 | - ohci_writel (ohci, OHCI_INTR_MIE, &ohci->regs->intrdisable); | ||
602 | - ohci->hc_control = ohci_readl(ohci, &ohci->regs->control); | ||
603 | + ohci_writel(ohci, (u32) ~0, &ohci->regs->intrdisable); | ||
604 | |||
605 | - /* If the SHUTDOWN quirk is set, don't put the controller in RESET */ | ||
606 | - ohci->hc_control &= (ohci->flags & OHCI_QUIRK_SHUTDOWN ? | ||
607 | - OHCI_CTRL_RWC | OHCI_CTRL_HCFS : | ||
608 | - OHCI_CTRL_RWC); | ||
609 | - ohci_writel(ohci, ohci->hc_control, &ohci->regs->control); | ||
610 | + /* Software reset, after which the controller goes into SUSPEND */ | ||
611 | + ohci_writel(ohci, OHCI_HCR, &ohci->regs->cmdstatus); | ||
612 | + ohci_readl(ohci, &ohci->regs->cmdstatus); /* flush the writes */ | ||
613 | + udelay(10); | ||
614 | |||
615 | - /* flush the writes */ | ||
616 | - (void) ohci_readl (ohci, &ohci->regs->control); | ||
617 | + ohci_writel(ohci, ohci->fminterval, &ohci->regs->fminterval); | ||
618 | } | ||
619 | |||
620 | static int check_ed(struct ohci_hcd *ohci, struct ed *ed) | ||
621 | diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c | ||
622 | index ad8166c..bc01b06 100644 | ||
623 | --- a/drivers/usb/host/ohci-pci.c | ||
624 | +++ b/drivers/usb/host/ohci-pci.c | ||
625 | @@ -175,28 +175,6 @@ static int ohci_quirk_amd700(struct usb_hcd *hcd) | ||
626 | return 0; | ||
627 | } | ||
628 | |||
629 | -/* nVidia controllers continue to drive Reset signalling on the bus | ||
630 | - * even after system shutdown, wasting power. This flag tells the | ||
631 | - * shutdown routine to leave the controller OPERATIONAL instead of RESET. | ||
632 | - */ | ||
633 | -static int ohci_quirk_nvidia_shutdown(struct usb_hcd *hcd) | ||
634 | -{ | ||
635 | - struct pci_dev *pdev = to_pci_dev(hcd->self.controller); | ||
636 | - struct ohci_hcd *ohci = hcd_to_ohci(hcd); | ||
637 | - | ||
638 | - /* Evidently nVidia fixed their later hardware; this is a guess at | ||
639 | - * the changeover point. | ||
640 | - */ | ||
641 | -#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_USB 0x026d | ||
642 | - | ||
643 | - if (pdev->device < PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_USB) { | ||
644 | - ohci->flags |= OHCI_QUIRK_SHUTDOWN; | ||
645 | - ohci_dbg(ohci, "enabled nVidia shutdown quirk\n"); | ||
646 | - } | ||
647 | - | ||
648 | - return 0; | ||
649 | -} | ||
650 | - | ||
651 | static void sb800_prefetch(struct ohci_hcd *ohci, int on) | ||
652 | { | ||
653 | struct pci_dev *pdev; | ||
654 | @@ -260,10 +238,6 @@ static const struct pci_device_id ohci_pci_quirks[] = { | ||
655 | PCI_DEVICE(PCI_VENDOR_ID_ATI, 0x4399), | ||
656 | .driver_data = (unsigned long)ohci_quirk_amd700, | ||
657 | }, | ||
658 | - { | ||
659 | - PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID), | ||
660 | - .driver_data = (unsigned long) ohci_quirk_nvidia_shutdown, | ||
661 | - }, | ||
662 | |||
663 | /* FIXME for some of the early AMD 760 southbridges, OHCI | ||
664 | * won't work at all. blacklist them. | ||
665 | diff --git a/drivers/usb/host/ohci.h b/drivers/usb/host/ohci.h | ||
666 | index 35e5fd6..0795b93 100644 | ||
667 | --- a/drivers/usb/host/ohci.h | ||
668 | +++ b/drivers/usb/host/ohci.h | ||
669 | @@ -403,7 +403,6 @@ struct ohci_hcd { | ||
670 | #define OHCI_QUIRK_HUB_POWER 0x100 /* distrust firmware power/oc setup */ | ||
671 | #define OHCI_QUIRK_AMD_PLL 0x200 /* AMD PLL quirk*/ | ||
672 | #define OHCI_QUIRK_AMD_PREFETCH 0x400 /* pre-fetch for ISO transfer */ | ||
673 | -#define OHCI_QUIRK_SHUTDOWN 0x800 /* nVidia power bug */ | ||
674 | // there are also chip quirks/bugs in init logic | ||
675 | |||
676 | struct work_struct nec_work; /* Worker for NEC quirk */ | ||
677 | diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c | ||
678 | index a495d48..23e04fb 100644 | ||
679 | --- a/drivers/usb/host/pci-quirks.c | ||
680 | +++ b/drivers/usb/host/pci-quirks.c | ||
681 | @@ -36,6 +36,7 @@ | ||
682 | #define OHCI_INTRENABLE 0x10 | ||
683 | #define OHCI_INTRDISABLE 0x14 | ||
684 | #define OHCI_FMINTERVAL 0x34 | ||
685 | +#define OHCI_HCFS (3 << 6) /* hc functional state */ | ||
686 | #define OHCI_HCR (1 << 0) /* host controller reset */ | ||
687 | #define OHCI_OCR (1 << 3) /* ownership change request */ | ||
688 | #define OHCI_CTRL_RWC (1 << 9) /* remote wakeup connected */ | ||
689 | @@ -465,6 +466,8 @@ static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev) | ||
690 | { | ||
691 | void __iomem *base; | ||
692 | u32 control; | ||
693 | + u32 fminterval; | ||
694 | + int cnt; | ||
695 | |||
696 | if (!mmio_resource_enabled(pdev, 0)) | ||
697 | return; | ||
698 | @@ -497,41 +500,32 @@ static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev) | ||
699 | } | ||
700 | #endif | ||
701 | |||
702 | - /* reset controller, preserving RWC (and possibly IR) */ | ||
703 | - writel(control & OHCI_CTRL_MASK, base + OHCI_CONTROL); | ||
704 | - readl(base + OHCI_CONTROL); | ||
705 | + /* disable interrupts */ | ||
706 | + writel((u32) ~0, base + OHCI_INTRDISABLE); | ||
707 | |||
708 | - /* Some NVIDIA controllers stop working if kept in RESET for too long */ | ||
709 | - if (pdev->vendor == PCI_VENDOR_ID_NVIDIA) { | ||
710 | - u32 fminterval; | ||
711 | - int cnt; | ||
712 | + /* Reset the USB bus, if the controller isn't already in RESET */ | ||
713 | + if (control & OHCI_HCFS) { | ||
714 | + /* Go into RESET, preserving RWC (and possibly IR) */ | ||
715 | + writel(control & OHCI_CTRL_MASK, base + OHCI_CONTROL); | ||
716 | + readl(base + OHCI_CONTROL); | ||
717 | |||
718 | - /* drive reset for at least 50 ms (7.1.7.5) */ | ||
719 | + /* drive bus reset for at least 50 ms (7.1.7.5) */ | ||
720 | msleep(50); | ||
721 | + } | ||
722 | |||
723 | - /* software reset of the controller, preserving HcFmInterval */ | ||
724 | - fminterval = readl(base + OHCI_FMINTERVAL); | ||
725 | - writel(OHCI_HCR, base + OHCI_CMDSTATUS); | ||
726 | + /* software reset of the controller, preserving HcFmInterval */ | ||
727 | + fminterval = readl(base + OHCI_FMINTERVAL); | ||
728 | + writel(OHCI_HCR, base + OHCI_CMDSTATUS); | ||
729 | |||
730 | - /* reset requires max 10 us delay */ | ||
731 | - for (cnt = 30; cnt > 0; --cnt) { /* ... allow extra time */ | ||
732 | - if ((readl(base + OHCI_CMDSTATUS) & OHCI_HCR) == 0) | ||
733 | - break; | ||
734 | - udelay(1); | ||
735 | - } | ||
736 | - writel(fminterval, base + OHCI_FMINTERVAL); | ||
737 | - | ||
738 | - /* Now we're in the SUSPEND state with all devices reset | ||
739 | - * and wakeups and interrupts disabled | ||
740 | - */ | ||
741 | + /* reset requires max 10 us delay */ | ||
742 | + for (cnt = 30; cnt > 0; --cnt) { /* ... allow extra time */ | ||
743 | + if ((readl(base + OHCI_CMDSTATUS) & OHCI_HCR) == 0) | ||
744 | + break; | ||
745 | + udelay(1); | ||
746 | } | ||
747 | + writel(fminterval, base + OHCI_FMINTERVAL); | ||
748 | |||
749 | - /* | ||
750 | - * disable interrupts | ||
751 | - */ | ||
752 | - writel(~(u32)0, base + OHCI_INTRDISABLE); | ||
753 | - writel(~(u32)0, base + OHCI_INTRSTATUS); | ||
754 | - | ||
755 | + /* Now the controller is safely in SUSPEND and nothing can wake it up */ | ||
756 | iounmap(base); | ||
757 | } | ||
758 | |||
759 | diff --git a/drivers/usb/host/uhci-q.c b/drivers/usb/host/uhci-q.c | ||
760 | index 84ed28b..8253991 100644 | ||
761 | --- a/drivers/usb/host/uhci-q.c | ||
762 | +++ b/drivers/usb/host/uhci-q.c | ||
763 | @@ -943,7 +943,7 @@ static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, | ||
764 | if (usb_pipein(urb->pipe)) | ||
765 | status |= TD_CTRL_SPD; | ||
766 | |||
767 | - i = urb->num_sgs; | ||
768 | + i = urb->num_mapped_sgs; | ||
769 | if (len > 0 && i > 0) { | ||
770 | sg = urb->sg; | ||
771 | data = sg_dma_address(sg); | ||
772 | diff --git a/drivers/usb/host/whci/qset.c b/drivers/usb/host/whci/qset.c | ||
773 | index a403b53..76083ae 100644 | ||
774 | --- a/drivers/usb/host/whci/qset.c | ||
775 | +++ b/drivers/usb/host/whci/qset.c | ||
776 | @@ -443,7 +443,7 @@ static int qset_add_urb_sg(struct whc *whc, struct whc_qset *qset, struct urb *u | ||
777 | |||
778 | remaining = urb->transfer_buffer_length; | ||
779 | |||
780 | - for_each_sg(urb->sg, sg, urb->num_sgs, i) { | ||
781 | + for_each_sg(urb->sg, sg, urb->num_mapped_sgs, i) { | ||
782 | dma_addr_t dma_addr; | ||
783 | size_t dma_remaining; | ||
784 | dma_addr_t sp, ep; | ||
785 | @@ -561,7 +561,7 @@ static int qset_add_urb_sg_linearize(struct whc *whc, struct whc_qset *qset, | ||
786 | |||
787 | remaining = urb->transfer_buffer_length; | ||
788 | |||
789 | - for_each_sg(urb->sg, sg, urb->num_sgs, i) { | ||
790 | + for_each_sg(urb->sg, sg, urb->num_mapped_sgs, i) { | ||
791 | size_t len; | ||
792 | size_t sg_remaining; | ||
793 | void *orig; | ||
794 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c | ||
795 | index 2c07fff..daddfb3 100644 | ||
796 | --- a/drivers/usb/host/xhci-ring.c | ||
797 | +++ b/drivers/usb/host/xhci-ring.c | ||
798 | @@ -2562,7 +2562,7 @@ static unsigned int count_sg_trbs_needed(struct xhci_hcd *xhci, struct urb *urb) | ||
799 | struct scatterlist *sg; | ||
800 | |||
801 | sg = NULL; | ||
802 | - num_sgs = urb->num_sgs; | ||
803 | + num_sgs = urb->num_mapped_sgs; | ||
804 | temp = urb->transfer_buffer_length; | ||
805 | |||
806 | xhci_dbg(xhci, "count sg list trbs: \n"); | ||
807 | @@ -2746,7 +2746,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | ||
808 | return -EINVAL; | ||
809 | |||
810 | num_trbs = count_sg_trbs_needed(xhci, urb); | ||
811 | - num_sgs = urb->num_sgs; | ||
812 | + num_sgs = urb->num_mapped_sgs; | ||
813 | total_packet_count = roundup(urb->transfer_buffer_length, | ||
814 | le16_to_cpu(urb->ep->desc.wMaxPacketSize)); | ||
815 | |||
816 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c | ||
817 | index 10dc1bd..5fc595f 100644 | ||
818 | --- a/drivers/usb/host/xhci.c | ||
819 | +++ b/drivers/usb/host/xhci.c | ||
820 | @@ -1568,6 +1568,7 @@ static int xhci_configure_endpoint_result(struct xhci_hcd *xhci, | ||
821 | /* FIXME: can we allocate more resources for the HC? */ | ||
822 | break; | ||
823 | case COMP_BW_ERR: | ||
824 | + case COMP_2ND_BW_ERR: | ||
825 | dev_warn(&udev->dev, "Not enough bandwidth " | ||
826 | "for new device state.\n"); | ||
827 | ret = -ENOSPC; | ||
828 | @@ -2182,8 +2183,7 @@ static int xhci_calculate_streams_and_bitmask(struct xhci_hcd *xhci, | ||
829 | if (ret < 0) | ||
830 | return ret; | ||
831 | |||
832 | - max_streams = USB_SS_MAX_STREAMS( | ||
833 | - eps[i]->ss_ep_comp.bmAttributes); | ||
834 | + max_streams = usb_ss_max_streams(&eps[i]->ss_ep_comp); | ||
835 | if (max_streams < (*num_streams - 1)) { | ||
836 | xhci_dbg(xhci, "Ep 0x%x only supports %u stream IDs.\n", | ||
837 | eps[i]->desc.bEndpointAddress, | ||
838 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h | ||
839 | index 1fb0549..c149d20 100644 | ||
840 | --- a/drivers/usb/host/xhci.h | ||
841 | +++ b/drivers/usb/host/xhci.h | ||
842 | @@ -900,7 +900,6 @@ struct xhci_transfer_event { | ||
843 | /* Invalid Stream ID Error */ | ||
844 | #define COMP_STRID_ERR 34 | ||
845 | /* Secondary Bandwidth Error - may be returned by a Configure Endpoint cmd */ | ||
846 | -/* FIXME - check for this */ | ||
847 | #define COMP_2ND_BW_ERR 35 | ||
848 | /* Split Transaction Error */ | ||
849 | #define COMP_SPLIT_ERR 36 | ||
850 | diff --git a/drivers/usb/misc/isight_firmware.c b/drivers/usb/misc/isight_firmware.c | ||
851 | index fe1d443..8f725f6 100644 | ||
852 | --- a/drivers/usb/misc/isight_firmware.c | ||
853 | +++ b/drivers/usb/misc/isight_firmware.c | ||
854 | @@ -55,8 +55,9 @@ static int isight_firmware_load(struct usb_interface *intf, | ||
855 | |||
856 | ptr = firmware->data; | ||
857 | |||
858 | + buf[0] = 0x01; | ||
859 | if (usb_control_msg | ||
860 | - (dev, usb_sndctrlpipe(dev, 0), 0xa0, 0x40, 0xe600, 0, "\1", 1, | ||
861 | + (dev, usb_sndctrlpipe(dev, 0), 0xa0, 0x40, 0xe600, 0, buf, 1, | ||
862 | 300) != 1) { | ||
863 | printk(KERN_ERR | ||
864 | "Failed to initialise isight firmware loader\n"); | ||
865 | @@ -100,8 +101,9 @@ static int isight_firmware_load(struct usb_interface *intf, | ||
866 | } | ||
867 | } | ||
868 | |||
869 | + buf[0] = 0x00; | ||
870 | if (usb_control_msg | ||
871 | - (dev, usb_sndctrlpipe(dev, 0), 0xa0, 0x40, 0xe600, 0, "\0", 1, | ||
872 | + (dev, usb_sndctrlpipe(dev, 0), 0xa0, 0x40, 0xe600, 0, buf, 1, | ||
873 | 300) != 1) { | ||
874 | printk(KERN_ERR "isight firmware loading completion failed\n"); | ||
875 | ret = -ENODEV; | ||
876 | diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c | ||
877 | index a057a5a..96c5dbd 100644 | ||
878 | --- a/drivers/usb/musb/musb_core.c | ||
879 | +++ b/drivers/usb/musb/musb_core.c | ||
880 | @@ -2013,8 +2013,6 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) | ||
881 | if (status < 0) | ||
882 | goto fail3; | ||
883 | |||
884 | - pm_runtime_put(musb->controller); | ||
885 | - | ||
886 | status = musb_init_debugfs(musb); | ||
887 | if (status < 0) | ||
888 | goto fail4; | ||
889 | diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c | ||
890 | index fd67cc5..a1a324b 100644 | ||
891 | --- a/drivers/usb/serial/cp210x.c | ||
892 | +++ b/drivers/usb/serial/cp210x.c | ||
893 | @@ -92,6 +92,7 @@ static const struct usb_device_id id_table[] = { | ||
894 | { USB_DEVICE(0x10C4, 0x818B) }, /* AVIT Research USB to TTL */ | ||
895 | { USB_DEVICE(0x10C4, 0x819F) }, /* MJS USB Toslink Switcher */ | ||
896 | { USB_DEVICE(0x10C4, 0x81A6) }, /* ThinkOptics WavIt */ | ||
897 | + { USB_DEVICE(0x10C4, 0x81A9) }, /* Multiplex RC Interface */ | ||
898 | { USB_DEVICE(0x10C4, 0x81AC) }, /* MSD Dash Hawk */ | ||
899 | { USB_DEVICE(0x10C4, 0x81AD) }, /* INSYS USB Modem */ | ||
900 | { USB_DEVICE(0x10C4, 0x81C8) }, /* Lipowsky Industrie Elektronik GmbH, Baby-JTAG */ | ||
901 | diff --git a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c | ||
902 | index 60f38d5..0a8c1e6 100644 | ||
903 | --- a/drivers/usb/serial/omninet.c | ||
904 | +++ b/drivers/usb/serial/omninet.c | ||
905 | @@ -315,7 +315,7 @@ static int omninet_write_room(struct tty_struct *tty) | ||
906 | int room = 0; /* Default: no room */ | ||
907 | |||
908 | /* FIXME: no consistent locking for write_urb_busy */ | ||
909 | - if (wport->write_urb_busy) | ||
910 | + if (!wport->write_urb_busy) | ||
911 | room = wport->bulk_out_size - OMNINET_HEADERLEN; | ||
912 | |||
913 | dbg("%s - returns %d", __func__, room); | ||
914 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
915 | index d2becb9..c96b6b6 100644 | ||
916 | --- a/drivers/usb/serial/option.c | ||
917 | +++ b/drivers/usb/serial/option.c | ||
918 | @@ -472,6 +472,14 @@ static void option_instat_callback(struct urb *urb); | ||
919 | #define YUGA_PRODUCT_CLU528 0x260D | ||
920 | #define YUGA_PRODUCT_CLU526 0x260F | ||
921 | |||
922 | +/* Viettel products */ | ||
923 | +#define VIETTEL_VENDOR_ID 0x2262 | ||
924 | +#define VIETTEL_PRODUCT_VT1000 0x0002 | ||
925 | + | ||
926 | +/* ZD Incorporated */ | ||
927 | +#define ZD_VENDOR_ID 0x0685 | ||
928 | +#define ZD_PRODUCT_7000 0x7000 | ||
929 | + | ||
930 | /* some devices interfaces need special handling due to a number of reasons */ | ||
931 | enum option_blacklist_reason { | ||
932 | OPTION_BLACKLIST_NONE = 0, | ||
933 | @@ -1173,6 +1181,8 @@ static const struct usb_device_id option_ids[] = { | ||
934 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU516) }, | ||
935 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU528) }, | ||
936 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU526) }, | ||
937 | + { USB_DEVICE_AND_INTERFACE_INFO(VIETTEL_VENDOR_ID, VIETTEL_PRODUCT_VT1000, 0xff, 0xff, 0xff) }, | ||
938 | + { USB_DEVICE_AND_INTERFACE_INFO(ZD_VENDOR_ID, ZD_PRODUCT_7000, 0xff, 0xff, 0xff) }, | ||
939 | { } /* Terminating entry */ | ||
940 | }; | ||
941 | MODULE_DEVICE_TABLE(usb, option_ids); | ||
942 | diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c | ||
943 | index c325e69..9e069ef 100644 | ||
944 | --- a/drivers/usb/storage/usb.c | ||
945 | +++ b/drivers/usb/storage/usb.c | ||
946 | @@ -1073,6 +1073,7 @@ static struct usb_driver usb_storage_driver = { | ||
947 | .id_table = usb_storage_usb_ids, | ||
948 | .supports_autosuspend = 1, | ||
949 | .soft_unbind = 1, | ||
950 | + .no_dynamic_id = 1, | ||
951 | }; | ||
952 | |||
953 | static int __init usb_stor_init(void) | ||
954 | diff --git a/drivers/video/offb.c b/drivers/video/offb.c | ||
955 | index cb163a5..3251a02 100644 | ||
956 | --- a/drivers/video/offb.c | ||
957 | +++ b/drivers/video/offb.c | ||
958 | @@ -100,36 +100,32 @@ static int offb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, | ||
959 | u_int transp, struct fb_info *info) | ||
960 | { | ||
961 | struct offb_par *par = (struct offb_par *) info->par; | ||
962 | - int i, depth; | ||
963 | - u32 *pal = info->pseudo_palette; | ||
964 | - | ||
965 | - depth = info->var.bits_per_pixel; | ||
966 | - if (depth == 16) | ||
967 | - depth = (info->var.green.length == 5) ? 15 : 16; | ||
968 | - | ||
969 | - if (regno > 255 || | ||
970 | - (depth == 16 && regno > 63) || | ||
971 | - (depth == 15 && regno > 31)) | ||
972 | - return 1; | ||
973 | - | ||
974 | - if (regno < 16) { | ||
975 | - switch (depth) { | ||
976 | - case 15: | ||
977 | - pal[regno] = (regno << 10) | (regno << 5) | regno; | ||
978 | - break; | ||
979 | - case 16: | ||
980 | - pal[regno] = (regno << 11) | (regno << 5) | regno; | ||
981 | - break; | ||
982 | - case 24: | ||
983 | - pal[regno] = (regno << 16) | (regno << 8) | regno; | ||
984 | - break; | ||
985 | - case 32: | ||
986 | - i = (regno << 8) | regno; | ||
987 | - pal[regno] = (i << 16) | i; | ||
988 | - break; | ||
989 | + | ||
990 | + if (info->fix.visual == FB_VISUAL_TRUECOLOR) { | ||
991 | + u32 *pal = info->pseudo_palette; | ||
992 | + u32 cr = red >> (16 - info->var.red.length); | ||
993 | + u32 cg = green >> (16 - info->var.green.length); | ||
994 | + u32 cb = blue >> (16 - info->var.blue.length); | ||
995 | + u32 value; | ||
996 | + | ||
997 | + if (regno >= 16) | ||
998 | + return -EINVAL; | ||
999 | + | ||
1000 | + value = (cr << info->var.red.offset) | | ||
1001 | + (cg << info->var.green.offset) | | ||
1002 | + (cb << info->var.blue.offset); | ||
1003 | + if (info->var.transp.length > 0) { | ||
1004 | + u32 mask = (1 << info->var.transp.length) - 1; | ||
1005 | + mask <<= info->var.transp.offset; | ||
1006 | + value |= mask; | ||
1007 | } | ||
1008 | + pal[regno] = value; | ||
1009 | + return 0; | ||
1010 | } | ||
1011 | |||
1012 | + if (regno > 255) | ||
1013 | + return -EINVAL; | ||
1014 | + | ||
1015 | red >>= 8; | ||
1016 | green >>= 8; | ||
1017 | blue >>= 8; | ||
1018 | @@ -381,7 +377,7 @@ static void __init offb_init_fb(const char *name, const char *full_name, | ||
1019 | int pitch, unsigned long address, | ||
1020 | int foreign_endian, struct device_node *dp) | ||
1021 | { | ||
1022 | - unsigned long res_size = pitch * height * (depth + 7) / 8; | ||
1023 | + unsigned long res_size = pitch * height; | ||
1024 | struct offb_par *par = &default_par; | ||
1025 | unsigned long res_start = address; | ||
1026 | struct fb_fix_screeninfo *fix; | ||
1027 | diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c | ||
1028 | index 12661e1..2ce3c52 100644 | ||
1029 | --- a/fs/ext3/inode.c | ||
1030 | +++ b/fs/ext3/inode.c | ||
1031 | @@ -1617,7 +1617,13 @@ static int ext3_ordered_writepage(struct page *page, | ||
1032 | int err; | ||
1033 | |||
1034 | J_ASSERT(PageLocked(page)); | ||
1035 | - WARN_ON_ONCE(IS_RDONLY(inode)); | ||
1036 | + /* | ||
1037 | + * We don't want to warn for emergency remount. The condition is | ||
1038 | + * ordered to avoid dereferencing inode->i_sb in non-error case to | ||
1039 | + * avoid slow-downs. | ||
1040 | + */ | ||
1041 | + WARN_ON_ONCE(IS_RDONLY(inode) && | ||
1042 | + !(EXT3_SB(inode->i_sb)->s_mount_state & EXT3_ERROR_FS)); | ||
1043 | |||
1044 | /* | ||
1045 | * We give up here if we're reentered, because it might be for a | ||
1046 | @@ -1692,7 +1698,13 @@ static int ext3_writeback_writepage(struct page *page, | ||
1047 | int err; | ||
1048 | |||
1049 | J_ASSERT(PageLocked(page)); | ||
1050 | - WARN_ON_ONCE(IS_RDONLY(inode)); | ||
1051 | + /* | ||
1052 | + * We don't want to warn for emergency remount. The condition is | ||
1053 | + * ordered to avoid dereferencing inode->i_sb in non-error case to | ||
1054 | + * avoid slow-downs. | ||
1055 | + */ | ||
1056 | + WARN_ON_ONCE(IS_RDONLY(inode) && | ||
1057 | + !(EXT3_SB(inode->i_sb)->s_mount_state & EXT3_ERROR_FS)); | ||
1058 | |||
1059 | if (ext3_journal_current_handle()) | ||
1060 | goto out_fail; | ||
1061 | @@ -1735,7 +1747,13 @@ static int ext3_journalled_writepage(struct page *page, | ||
1062 | int err; | ||
1063 | |||
1064 | J_ASSERT(PageLocked(page)); | ||
1065 | - WARN_ON_ONCE(IS_RDONLY(inode)); | ||
1066 | + /* | ||
1067 | + * We don't want to warn for emergency remount. The condition is | ||
1068 | + * ordered to avoid dereferencing inode->i_sb in non-error case to | ||
1069 | + * avoid slow-downs. | ||
1070 | + */ | ||
1071 | + WARN_ON_ONCE(IS_RDONLY(inode) && | ||
1072 | + !(EXT3_SB(inode->i_sb)->s_mount_state & EXT3_ERROR_FS)); | ||
1073 | |||
1074 | if (ext3_journal_current_handle()) | ||
1075 | goto no_write; | ||
1076 | diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c | ||
1077 | index 14363b9..5e3527b 100644 | ||
1078 | --- a/fs/reiserfs/super.c | ||
1079 | +++ b/fs/reiserfs/super.c | ||
1080 | @@ -453,16 +453,20 @@ int remove_save_link(struct inode *inode, int truncate) | ||
1081 | static void reiserfs_kill_sb(struct super_block *s) | ||
1082 | { | ||
1083 | if (REISERFS_SB(s)) { | ||
1084 | - if (REISERFS_SB(s)->xattr_root) { | ||
1085 | - d_invalidate(REISERFS_SB(s)->xattr_root); | ||
1086 | - dput(REISERFS_SB(s)->xattr_root); | ||
1087 | - REISERFS_SB(s)->xattr_root = NULL; | ||
1088 | - } | ||
1089 | - if (REISERFS_SB(s)->priv_root) { | ||
1090 | - d_invalidate(REISERFS_SB(s)->priv_root); | ||
1091 | - dput(REISERFS_SB(s)->priv_root); | ||
1092 | - REISERFS_SB(s)->priv_root = NULL; | ||
1093 | - } | ||
1094 | + /* | ||
1095 | + * Force any pending inode evictions to occur now. Any | ||
1096 | + * inodes to be removed that have extended attributes | ||
1097 | + * associated with them need to clean them up before | ||
1098 | + * we can release the extended attribute root dentries. | ||
1099 | + * shrink_dcache_for_umount will BUG if we don't release | ||
1100 | + * those before it's called so ->put_super is too late. | ||
1101 | + */ | ||
1102 | + shrink_dcache_sb(s); | ||
1103 | + | ||
1104 | + dput(REISERFS_SB(s)->xattr_root); | ||
1105 | + REISERFS_SB(s)->xattr_root = NULL; | ||
1106 | + dput(REISERFS_SB(s)->priv_root); | ||
1107 | + REISERFS_SB(s)->priv_root = NULL; | ||
1108 | } | ||
1109 | |||
1110 | kill_block_super(s); | ||
1111 | @@ -1164,7 +1168,8 @@ static void handle_quota_files(struct super_block *s, char **qf_names, | ||
1112 | kfree(REISERFS_SB(s)->s_qf_names[i]); | ||
1113 | REISERFS_SB(s)->s_qf_names[i] = qf_names[i]; | ||
1114 | } | ||
1115 | - REISERFS_SB(s)->s_jquota_fmt = *qfmt; | ||
1116 | + if (*qfmt) | ||
1117 | + REISERFS_SB(s)->s_jquota_fmt = *qfmt; | ||
1118 | } | ||
1119 | #endif | ||
1120 | |||
1121 | diff --git a/fs/udf/file.c b/fs/udf/file.c | ||
1122 | index d8ffa7c..dca0c38 100644 | ||
1123 | --- a/fs/udf/file.c | ||
1124 | +++ b/fs/udf/file.c | ||
1125 | @@ -125,7 +125,6 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | ||
1126 | err = udf_expand_file_adinicb(inode); | ||
1127 | if (err) { | ||
1128 | udf_debug("udf_expand_adinicb: err=%d\n", err); | ||
1129 | - up_write(&iinfo->i_data_sem); | ||
1130 | return err; | ||
1131 | } | ||
1132 | } else { | ||
1133 | @@ -133,9 +132,10 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | ||
1134 | iinfo->i_lenAlloc = pos + count; | ||
1135 | else | ||
1136 | iinfo->i_lenAlloc = inode->i_size; | ||
1137 | + up_write(&iinfo->i_data_sem); | ||
1138 | } | ||
1139 | - } | ||
1140 | - up_write(&iinfo->i_data_sem); | ||
1141 | + } else | ||
1142 | + up_write(&iinfo->i_data_sem); | ||
1143 | |||
1144 | retval = generic_file_aio_write(iocb, iov, nr_segs, ppos); | ||
1145 | if (retval > 0) | ||
1146 | diff --git a/fs/udf/inode.c b/fs/udf/inode.c | ||
1147 | index 1d1358e..262050f 100644 | ||
1148 | --- a/fs/udf/inode.c | ||
1149 | +++ b/fs/udf/inode.c | ||
1150 | @@ -145,6 +145,12 @@ const struct address_space_operations udf_aops = { | ||
1151 | .bmap = udf_bmap, | ||
1152 | }; | ||
1153 | |||
1154 | +/* | ||
1155 | + * Expand file stored in ICB to a normal one-block-file | ||
1156 | + * | ||
1157 | + * This function requires i_data_sem for writing and releases it. | ||
1158 | + * This function requires i_mutex held | ||
1159 | + */ | ||
1160 | int udf_expand_file_adinicb(struct inode *inode) | ||
1161 | { | ||
1162 | struct page *page; | ||
1163 | @@ -163,9 +169,15 @@ int udf_expand_file_adinicb(struct inode *inode) | ||
1164 | iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG; | ||
1165 | /* from now on we have normal address_space methods */ | ||
1166 | inode->i_data.a_ops = &udf_aops; | ||
1167 | + up_write(&iinfo->i_data_sem); | ||
1168 | mark_inode_dirty(inode); | ||
1169 | return 0; | ||
1170 | } | ||
1171 | + /* | ||
1172 | + * Release i_data_sem so that we can lock a page - page lock ranks | ||
1173 | + * above i_data_sem. i_mutex still protects us against file changes. | ||
1174 | + */ | ||
1175 | + up_write(&iinfo->i_data_sem); | ||
1176 | |||
1177 | page = find_or_create_page(inode->i_mapping, 0, GFP_NOFS); | ||
1178 | if (!page) | ||
1179 | @@ -181,6 +193,7 @@ int udf_expand_file_adinicb(struct inode *inode) | ||
1180 | SetPageUptodate(page); | ||
1181 | kunmap(page); | ||
1182 | } | ||
1183 | + down_write(&iinfo->i_data_sem); | ||
1184 | memset(iinfo->i_ext.i_data + iinfo->i_lenEAttr, 0x00, | ||
1185 | iinfo->i_lenAlloc); | ||
1186 | iinfo->i_lenAlloc = 0; | ||
1187 | @@ -190,17 +203,20 @@ int udf_expand_file_adinicb(struct inode *inode) | ||
1188 | iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG; | ||
1189 | /* from now on we have normal address_space methods */ | ||
1190 | inode->i_data.a_ops = &udf_aops; | ||
1191 | + up_write(&iinfo->i_data_sem); | ||
1192 | err = inode->i_data.a_ops->writepage(page, &udf_wbc); | ||
1193 | if (err) { | ||
1194 | /* Restore everything back so that we don't lose data... */ | ||
1195 | lock_page(page); | ||
1196 | kaddr = kmap(page); | ||
1197 | + down_write(&iinfo->i_data_sem); | ||
1198 | memcpy(iinfo->i_ext.i_data + iinfo->i_lenEAttr, kaddr, | ||
1199 | inode->i_size); | ||
1200 | kunmap(page); | ||
1201 | unlock_page(page); | ||
1202 | iinfo->i_alloc_type = ICBTAG_FLAG_AD_IN_ICB; | ||
1203 | inode->i_data.a_ops = &udf_adinicb_aops; | ||
1204 | + up_write(&iinfo->i_data_sem); | ||
1205 | } | ||
1206 | page_cache_release(page); | ||
1207 | mark_inode_dirty(inode); | ||
1208 | @@ -1105,10 +1121,9 @@ int udf_setsize(struct inode *inode, loff_t newsize) | ||
1209 | if (bsize < | ||
1210 | (udf_file_entry_alloc_offset(inode) + newsize)) { | ||
1211 | err = udf_expand_file_adinicb(inode); | ||
1212 | - if (err) { | ||
1213 | - up_write(&iinfo->i_data_sem); | ||
1214 | + if (err) | ||
1215 | return err; | ||
1216 | - } | ||
1217 | + down_write(&iinfo->i_data_sem); | ||
1218 | } else | ||
1219 | iinfo->i_lenAlloc = newsize; | ||
1220 | } | ||
1221 | diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c | ||
1222 | index b6c4b37..ac702a6 100644 | ||
1223 | --- a/fs/xfs/xfs_acl.c | ||
1224 | +++ b/fs/xfs/xfs_acl.c | ||
1225 | @@ -39,9 +39,11 @@ xfs_acl_from_disk(struct xfs_acl *aclp) | ||
1226 | struct posix_acl_entry *acl_e; | ||
1227 | struct posix_acl *acl; | ||
1228 | struct xfs_acl_entry *ace; | ||
1229 | - int count, i; | ||
1230 | + unsigned int count, i; | ||
1231 | |||
1232 | count = be32_to_cpu(aclp->acl_cnt); | ||
1233 | + if (count > XFS_ACL_MAX_ENTRIES) | ||
1234 | + return ERR_PTR(-EFSCORRUPTED); | ||
1235 | |||
1236 | acl = posix_acl_alloc(count, GFP_KERNEL); | ||
1237 | if (!acl) | ||
1238 | diff --git a/include/linux/usb.h b/include/linux/usb.h | ||
1239 | index 73c7df4..b08e04c 100644 | ||
1240 | --- a/include/linux/usb.h | ||
1241 | +++ b/include/linux/usb.h | ||
1242 | @@ -1202,6 +1202,7 @@ struct urb { | ||
1243 | void *transfer_buffer; /* (in) associated data buffer */ | ||
1244 | dma_addr_t transfer_dma; /* (in) dma addr for transfer_buffer */ | ||
1245 | struct scatterlist *sg; /* (in) scatter gather buffer list */ | ||
1246 | + int num_mapped_sgs; /* (internal) mapped sg entries */ | ||
1247 | int num_sgs; /* (in) number of entries in the sg list */ | ||
1248 | u32 transfer_buffer_length; /* (in) data buffer length */ | ||
1249 | u32 actual_length; /* (return) actual transfer length */ | ||
1250 | diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h | ||
1251 | index 0fd3fbd..cf65b5c 100644 | ||
1252 | --- a/include/linux/usb/ch9.h | ||
1253 | +++ b/include/linux/usb/ch9.h | ||
1254 | @@ -583,8 +583,26 @@ struct usb_ss_ep_comp_descriptor { | ||
1255 | } __attribute__ ((packed)); | ||
1256 | |||
1257 | #define USB_DT_SS_EP_COMP_SIZE 6 | ||
1258 | + | ||
1259 | /* Bits 4:0 of bmAttributes if this is a bulk endpoint */ | ||
1260 | -#define USB_SS_MAX_STREAMS(p) (1 << ((p) & 0x1f)) | ||
1261 | +static inline int | ||
1262 | +usb_ss_max_streams(const struct usb_ss_ep_comp_descriptor *comp) | ||
1263 | +{ | ||
1264 | + int max_streams; | ||
1265 | + | ||
1266 | + if (!comp) | ||
1267 | + return 0; | ||
1268 | + | ||
1269 | + max_streams = comp->bmAttributes & 0x1f; | ||
1270 | + | ||
1271 | + if (!max_streams) | ||
1272 | + return 0; | ||
1273 | + | ||
1274 | + max_streams = 1 << max_streams; | ||
1275 | + | ||
1276 | + return max_streams; | ||
1277 | +} | ||
1278 | + | ||
1279 | /* Bits 1:0 of bmAttributes if this is an isoc endpoint */ | ||
1280 | #define USB_SS_MULT(p) (1 + ((p) & 0x3)) | ||
1281 | |||
1282 | diff --git a/kernel/cgroup.c b/kernel/cgroup.c | ||
1283 | index b7ab0b8..e4cbdfb 100644 | ||
1284 | --- a/kernel/cgroup.c | ||
1285 | +++ b/kernel/cgroup.c | ||
1286 | @@ -1175,10 +1175,10 @@ static int parse_cgroupfs_options(char *data, struct cgroup_sb_opts *opts) | ||
1287 | |||
1288 | /* | ||
1289 | * If the 'all' option was specified select all the subsystems, | ||
1290 | - * otherwise 'all, 'none' and a subsystem name options were not | ||
1291 | - * specified, let's default to 'all' | ||
1292 | + * otherwise if 'none', 'name=' and a subsystem name options | ||
1293 | + * were not specified, let's default to 'all' | ||
1294 | */ | ||
1295 | - if (all_ss || (!all_ss && !one_ss && !opts->none)) { | ||
1296 | + if (all_ss || (!one_ss && !opts->none && !opts->name)) { | ||
1297 | for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) { | ||
1298 | struct cgroup_subsys *ss = subsys[i]; | ||
1299 | if (ss == NULL) | ||
1300 | diff --git a/kernel/cpu.c b/kernel/cpu.c | ||
1301 | index 12b7458..aa39dd7 100644 | ||
1302 | --- a/kernel/cpu.c | ||
1303 | +++ b/kernel/cpu.c | ||
1304 | @@ -15,6 +15,7 @@ | ||
1305 | #include <linux/stop_machine.h> | ||
1306 | #include <linux/mutex.h> | ||
1307 | #include <linux/gfp.h> | ||
1308 | +#include <linux/suspend.h> | ||
1309 | |||
1310 | #ifdef CONFIG_SMP | ||
1311 | /* Serializes the updates to cpu_online_mask, cpu_present_mask */ | ||
1312 | @@ -476,6 +477,79 @@ static int alloc_frozen_cpus(void) | ||
1313 | return 0; | ||
1314 | } | ||
1315 | core_initcall(alloc_frozen_cpus); | ||
1316 | + | ||
1317 | +/* | ||
1318 | + * Prevent regular CPU hotplug from racing with the freezer, by disabling CPU | ||
1319 | + * hotplug when tasks are about to be frozen. Also, don't allow the freezer | ||
1320 | + * to continue until any currently running CPU hotplug operation gets | ||
1321 | + * completed. | ||
1322 | + * To modify the 'cpu_hotplug_disabled' flag, we need to acquire the | ||
1323 | + * 'cpu_add_remove_lock'. And this same lock is also taken by the regular | ||
1324 | + * CPU hotplug path and released only after it is complete. Thus, we | ||
1325 | + * (and hence the freezer) will block here until any currently running CPU | ||
1326 | + * hotplug operation gets completed. | ||
1327 | + */ | ||
1328 | +void cpu_hotplug_disable_before_freeze(void) | ||
1329 | +{ | ||
1330 | + cpu_maps_update_begin(); | ||
1331 | + cpu_hotplug_disabled = 1; | ||
1332 | + cpu_maps_update_done(); | ||
1333 | +} | ||
1334 | + | ||
1335 | + | ||
1336 | +/* | ||
1337 | + * When tasks have been thawed, re-enable regular CPU hotplug (which had been | ||
1338 | + * disabled while beginning to freeze tasks). | ||
1339 | + */ | ||
1340 | +void cpu_hotplug_enable_after_thaw(void) | ||
1341 | +{ | ||
1342 | + cpu_maps_update_begin(); | ||
1343 | + cpu_hotplug_disabled = 0; | ||
1344 | + cpu_maps_update_done(); | ||
1345 | +} | ||
1346 | + | ||
1347 | +/* | ||
1348 | + * When callbacks for CPU hotplug notifications are being executed, we must | ||
1349 | + * ensure that the state of the system with respect to the tasks being frozen | ||
1350 | + * or not, as reported by the notification, remains unchanged *throughout the | ||
1351 | + * duration* of the execution of the callbacks. | ||
1352 | + * Hence we need to prevent the freezer from racing with regular CPU hotplug. | ||
1353 | + * | ||
1354 | + * This synchronization is implemented by mutually excluding regular CPU | ||
1355 | + * hotplug and Suspend/Hibernate call paths by hooking onto the Suspend/ | ||
1356 | + * Hibernate notifications. | ||
1357 | + */ | ||
1358 | +static int | ||
1359 | +cpu_hotplug_pm_callback(struct notifier_block *nb, | ||
1360 | + unsigned long action, void *ptr) | ||
1361 | +{ | ||
1362 | + switch (action) { | ||
1363 | + | ||
1364 | + case PM_SUSPEND_PREPARE: | ||
1365 | + case PM_HIBERNATION_PREPARE: | ||
1366 | + cpu_hotplug_disable_before_freeze(); | ||
1367 | + break; | ||
1368 | + | ||
1369 | + case PM_POST_SUSPEND: | ||
1370 | + case PM_POST_HIBERNATION: | ||
1371 | + cpu_hotplug_enable_after_thaw(); | ||
1372 | + break; | ||
1373 | + | ||
1374 | + default: | ||
1375 | + return NOTIFY_DONE; | ||
1376 | + } | ||
1377 | + | ||
1378 | + return NOTIFY_OK; | ||
1379 | +} | ||
1380 | + | ||
1381 | + | ||
1382 | +int cpu_hotplug_pm_sync_init(void) | ||
1383 | +{ | ||
1384 | + pm_notifier(cpu_hotplug_pm_callback, 0); | ||
1385 | + return 0; | ||
1386 | +} | ||
1387 | +core_initcall(cpu_hotplug_pm_sync_init); | ||
1388 | + | ||
1389 | #endif /* CONFIG_PM_SLEEP_SMP */ | ||
1390 | |||
1391 | /** | ||
1392 | diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c | ||
1393 | index d577199..e0d42db 100644 | ||
1394 | --- a/net/ipv4/igmp.c | ||
1395 | +++ b/net/ipv4/igmp.c | ||
1396 | @@ -875,6 +875,8 @@ static void igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb, | ||
1397 | * to be intended in a v3 query. | ||
1398 | */ | ||
1399 | max_delay = IGMPV3_MRC(ih3->code)*(HZ/IGMP_TIMER_SCALE); | ||
1400 | + if (!max_delay) | ||
1401 | + max_delay = 1; /* can't mod w/ 0 */ | ||
1402 | } else { /* v3 */ | ||
1403 | if (!pskb_may_pull(skb, sizeof(struct igmpv3_query))) | ||
1404 | return; | ||
1405 | diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c | ||
1406 | index 6c164dc..bf54c48 100644 | ||
1407 | --- a/tools/perf/util/trace-event-parse.c | ||
1408 | +++ b/tools/perf/util/trace-event-parse.c | ||
1409 | @@ -1582,6 +1582,8 @@ process_symbols(struct event *event, struct print_arg *arg, char **tok) | ||
1410 | field = malloc_or_die(sizeof(*field)); | ||
1411 | |||
1412 | type = process_arg(event, field, &token); | ||
1413 | + while (type == EVENT_OP) | ||
1414 | + type = process_op(event, field, &token); | ||
1415 | if (test_type_token(type, token, EVENT_DELIM, ",")) | ||
1416 | goto out_free; | ||
1417 |