Annotation of /trunk/kernel-lts/patches-3.4/0169-3.4.70-all-fixes.patch
Parent Directory | Revision Log
Revision 2334 -
(hide annotations)
(download)
Thu Dec 12 08:43:27 2013 UTC (10 years, 9 months ago) by niro
File size: 12689 byte(s)
Thu Dec 12 08:43:27 2013 UTC (10 years, 9 months ago) by niro
File size: 12689 byte(s)
-linux-3.4.70
1 | niro | 2334 | diff --git a/arch/arm/lib/memset.S b/arch/arm/lib/memset.S |
2 | index 650d5923..94b0650e 100644 | ||
3 | --- a/arch/arm/lib/memset.S | ||
4 | +++ b/arch/arm/lib/memset.S | ||
5 | @@ -14,27 +14,15 @@ | ||
6 | |||
7 | .text | ||
8 | .align 5 | ||
9 | - .word 0 | ||
10 | - | ||
11 | -1: subs r2, r2, #4 @ 1 do we have enough | ||
12 | - blt 5f @ 1 bytes to align with? | ||
13 | - cmp r3, #2 @ 1 | ||
14 | - strltb r1, [r0], #1 @ 1 | ||
15 | - strleb r1, [r0], #1 @ 1 | ||
16 | - strb r1, [r0], #1 @ 1 | ||
17 | - add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3)) | ||
18 | -/* | ||
19 | - * The pointer is now aligned and the length is adjusted. Try doing the | ||
20 | - * memset again. | ||
21 | - */ | ||
22 | |||
23 | ENTRY(memset) | ||
24 | ands r3, r0, #3 @ 1 unaligned? | ||
25 | - bne 1b @ 1 | ||
26 | + mov ip, r0 @ preserve r0 as return value | ||
27 | + bne 6f @ 1 | ||
28 | /* | ||
29 | - * we know that the pointer in r0 is aligned to a word boundary. | ||
30 | + * we know that the pointer in ip is aligned to a word boundary. | ||
31 | */ | ||
32 | - orr r1, r1, r1, lsl #8 | ||
33 | +1: orr r1, r1, r1, lsl #8 | ||
34 | orr r1, r1, r1, lsl #16 | ||
35 | mov r3, r1 | ||
36 | cmp r2, #16 | ||
37 | @@ -43,29 +31,28 @@ ENTRY(memset) | ||
38 | #if ! CALGN(1)+0 | ||
39 | |||
40 | /* | ||
41 | - * We need an extra register for this loop - save the return address and | ||
42 | - * use the LR | ||
43 | + * We need 2 extra registers for this loop - use r8 and the LR | ||
44 | */ | ||
45 | - str lr, [sp, #-4]! | ||
46 | - mov ip, r1 | ||
47 | + stmfd sp!, {r8, lr} | ||
48 | + mov r8, r1 | ||
49 | mov lr, r1 | ||
50 | |||
51 | 2: subs r2, r2, #64 | ||
52 | - stmgeia r0!, {r1, r3, ip, lr} @ 64 bytes at a time. | ||
53 | - stmgeia r0!, {r1, r3, ip, lr} | ||
54 | - stmgeia r0!, {r1, r3, ip, lr} | ||
55 | - stmgeia r0!, {r1, r3, ip, lr} | ||
56 | + stmgeia ip!, {r1, r3, r8, lr} @ 64 bytes at a time. | ||
57 | + stmgeia ip!, {r1, r3, r8, lr} | ||
58 | + stmgeia ip!, {r1, r3, r8, lr} | ||
59 | + stmgeia ip!, {r1, r3, r8, lr} | ||
60 | bgt 2b | ||
61 | - ldmeqfd sp!, {pc} @ Now <64 bytes to go. | ||
62 | + ldmeqfd sp!, {r8, pc} @ Now <64 bytes to go. | ||
63 | /* | ||
64 | * No need to correct the count; we're only testing bits from now on | ||
65 | */ | ||
66 | tst r2, #32 | ||
67 | - stmneia r0!, {r1, r3, ip, lr} | ||
68 | - stmneia r0!, {r1, r3, ip, lr} | ||
69 | + stmneia ip!, {r1, r3, r8, lr} | ||
70 | + stmneia ip!, {r1, r3, r8, lr} | ||
71 | tst r2, #16 | ||
72 | - stmneia r0!, {r1, r3, ip, lr} | ||
73 | - ldr lr, [sp], #4 | ||
74 | + stmneia ip!, {r1, r3, r8, lr} | ||
75 | + ldmfd sp!, {r8, lr} | ||
76 | |||
77 | #else | ||
78 | |||
79 | @@ -74,54 +61,63 @@ ENTRY(memset) | ||
80 | * whole cache lines at once. | ||
81 | */ | ||
82 | |||
83 | - stmfd sp!, {r4-r7, lr} | ||
84 | + stmfd sp!, {r4-r8, lr} | ||
85 | mov r4, r1 | ||
86 | mov r5, r1 | ||
87 | mov r6, r1 | ||
88 | mov r7, r1 | ||
89 | - mov ip, r1 | ||
90 | + mov r8, r1 | ||
91 | mov lr, r1 | ||
92 | |||
93 | cmp r2, #96 | ||
94 | - tstgt r0, #31 | ||
95 | + tstgt ip, #31 | ||
96 | ble 3f | ||
97 | |||
98 | - and ip, r0, #31 | ||
99 | - rsb ip, ip, #32 | ||
100 | - sub r2, r2, ip | ||
101 | - movs ip, ip, lsl #(32 - 4) | ||
102 | - stmcsia r0!, {r4, r5, r6, r7} | ||
103 | - stmmiia r0!, {r4, r5} | ||
104 | - tst ip, #(1 << 30) | ||
105 | - mov ip, r1 | ||
106 | - strne r1, [r0], #4 | ||
107 | + and r8, ip, #31 | ||
108 | + rsb r8, r8, #32 | ||
109 | + sub r2, r2, r8 | ||
110 | + movs r8, r8, lsl #(32 - 4) | ||
111 | + stmcsia ip!, {r4, r5, r6, r7} | ||
112 | + stmmiia ip!, {r4, r5} | ||
113 | + tst r8, #(1 << 30) | ||
114 | + mov r8, r1 | ||
115 | + strne r1, [ip], #4 | ||
116 | |||
117 | 3: subs r2, r2, #64 | ||
118 | - stmgeia r0!, {r1, r3-r7, ip, lr} | ||
119 | - stmgeia r0!, {r1, r3-r7, ip, lr} | ||
120 | + stmgeia ip!, {r1, r3-r8, lr} | ||
121 | + stmgeia ip!, {r1, r3-r8, lr} | ||
122 | bgt 3b | ||
123 | - ldmeqfd sp!, {r4-r7, pc} | ||
124 | + ldmeqfd sp!, {r4-r8, pc} | ||
125 | |||
126 | tst r2, #32 | ||
127 | - stmneia r0!, {r1, r3-r7, ip, lr} | ||
128 | + stmneia ip!, {r1, r3-r8, lr} | ||
129 | tst r2, #16 | ||
130 | - stmneia r0!, {r4-r7} | ||
131 | - ldmfd sp!, {r4-r7, lr} | ||
132 | + stmneia ip!, {r4-r7} | ||
133 | + ldmfd sp!, {r4-r8, lr} | ||
134 | |||
135 | #endif | ||
136 | |||
137 | 4: tst r2, #8 | ||
138 | - stmneia r0!, {r1, r3} | ||
139 | + stmneia ip!, {r1, r3} | ||
140 | tst r2, #4 | ||
141 | - strne r1, [r0], #4 | ||
142 | + strne r1, [ip], #4 | ||
143 | /* | ||
144 | * When we get here, we've got less than 4 bytes to zero. We | ||
145 | * may have an unaligned pointer as well. | ||
146 | */ | ||
147 | 5: tst r2, #2 | ||
148 | - strneb r1, [r0], #1 | ||
149 | - strneb r1, [r0], #1 | ||
150 | + strneb r1, [ip], #1 | ||
151 | + strneb r1, [ip], #1 | ||
152 | tst r2, #1 | ||
153 | - strneb r1, [r0], #1 | ||
154 | + strneb r1, [ip], #1 | ||
155 | mov pc, lr | ||
156 | + | ||
157 | +6: subs r2, r2, #4 @ 1 do we have enough | ||
158 | + blt 5b @ 1 bytes to align with? | ||
159 | + cmp r3, #2 @ 1 | ||
160 | + strltb r1, [ip], #1 @ 1 | ||
161 | + strleb r1, [ip], #1 @ 1 | ||
162 | + strb r1, [ip], #1 @ 1 | ||
163 | + add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3)) | ||
164 | + b 1b | ||
165 | ENDPROC(memset) | ||
166 | diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h | ||
167 | index 9d7f1723..093bf0a2 100644 | ||
168 | --- a/drivers/net/xen-netback/common.h | ||
169 | +++ b/drivers/net/xen-netback/common.h | ||
170 | @@ -88,6 +88,7 @@ struct xenvif { | ||
171 | unsigned long credit_usec; | ||
172 | unsigned long remaining_credit; | ||
173 | struct timer_list credit_timeout; | ||
174 | + u64 credit_window_start; | ||
175 | |||
176 | /* Statistics */ | ||
177 | unsigned long rx_gso_checksum_fixup; | ||
178 | diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c | ||
179 | index 221f4265..cfaaf685 100644 | ||
180 | --- a/drivers/net/xen-netback/interface.c | ||
181 | +++ b/drivers/net/xen-netback/interface.c | ||
182 | @@ -273,8 +273,7 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid, | ||
183 | vif->credit_bytes = vif->remaining_credit = ~0UL; | ||
184 | vif->credit_usec = 0UL; | ||
185 | init_timer(&vif->credit_timeout); | ||
186 | - /* Initialize 'expires' now: it's used to track the credit window. */ | ||
187 | - vif->credit_timeout.expires = jiffies; | ||
188 | + vif->credit_window_start = get_jiffies_64(); | ||
189 | |||
190 | dev->netdev_ops = &xenvif_netdev_ops; | ||
191 | dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO; | ||
192 | diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c | ||
193 | index 0d22cff0..d8ffbf84 100644 | ||
194 | --- a/drivers/net/xen-netback/netback.c | ||
195 | +++ b/drivers/net/xen-netback/netback.c | ||
196 | @@ -1197,9 +1197,8 @@ out: | ||
197 | |||
198 | static bool tx_credit_exceeded(struct xenvif *vif, unsigned size) | ||
199 | { | ||
200 | - unsigned long now = jiffies; | ||
201 | - unsigned long next_credit = | ||
202 | - vif->credit_timeout.expires + | ||
203 | + u64 now = get_jiffies_64(); | ||
204 | + u64 next_credit = vif->credit_window_start + | ||
205 | msecs_to_jiffies(vif->credit_usec / 1000); | ||
206 | |||
207 | /* Timer could already be pending in rare cases. */ | ||
208 | @@ -1207,8 +1206,8 @@ static bool tx_credit_exceeded(struct xenvif *vif, unsigned size) | ||
209 | return true; | ||
210 | |||
211 | /* Passed the point where we can replenish credit? */ | ||
212 | - if (time_after_eq(now, next_credit)) { | ||
213 | - vif->credit_timeout.expires = now; | ||
214 | + if (time_after_eq64(now, next_credit)) { | ||
215 | + vif->credit_window_start = now; | ||
216 | tx_add_credit(vif); | ||
217 | } | ||
218 | |||
219 | @@ -1220,6 +1219,7 @@ static bool tx_credit_exceeded(struct xenvif *vif, unsigned size) | ||
220 | tx_credit_callback; | ||
221 | mod_timer(&vif->credit_timeout, | ||
222 | next_credit); | ||
223 | + vif->credit_window_start = next_credit; | ||
224 | |||
225 | return true; | ||
226 | } | ||
227 | diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c | ||
228 | index 54fc9880..21b9ed1d 100644 | ||
229 | --- a/drivers/pci/pci-driver.c | ||
230 | +++ b/drivers/pci/pci-driver.c | ||
231 | @@ -680,6 +680,7 @@ static int pci_pm_suspend(struct device *dev) | ||
232 | goto Fixup; | ||
233 | } | ||
234 | |||
235 | + pci_dev->state_saved = false; | ||
236 | if (pm->suspend) { | ||
237 | pci_power_t prev = pci_dev->current_state; | ||
238 | int error; | ||
239 | @@ -826,6 +827,7 @@ static int pci_pm_freeze(struct device *dev) | ||
240 | return 0; | ||
241 | } | ||
242 | |||
243 | + pci_dev->state_saved = false; | ||
244 | if (pm->freeze) { | ||
245 | int error; | ||
246 | |||
247 | @@ -914,6 +916,7 @@ static int pci_pm_poweroff(struct device *dev) | ||
248 | goto Fixup; | ||
249 | } | ||
250 | |||
251 | + pci_dev->state_saved = false; | ||
252 | if (pm->poweroff) { | ||
253 | int error; | ||
254 | |||
255 | @@ -1032,6 +1035,7 @@ static int pci_pm_runtime_suspend(struct device *dev) | ||
256 | if (!pm || !pm->runtime_suspend) | ||
257 | return -ENOSYS; | ||
258 | |||
259 | + pci_dev->state_saved = false; | ||
260 | error = pm->runtime_suspend(dev); | ||
261 | suspend_report_result(pm->runtime_suspend, error); | ||
262 | if (error) | ||
263 | diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c | ||
264 | index eea85daf..be76ebac 100644 | ||
265 | --- a/drivers/pci/setup-res.c | ||
266 | +++ b/drivers/pci/setup-res.c | ||
267 | @@ -206,7 +206,8 @@ static int pci_revert_fw_address(struct resource *res, struct pci_dev *dev, | ||
268 | return ret; | ||
269 | } | ||
270 | |||
271 | -static int _pci_assign_resource(struct pci_dev *dev, int resno, int size, resource_size_t min_align) | ||
272 | +static int _pci_assign_resource(struct pci_dev *dev, int resno, | ||
273 | + resource_size_t size, resource_size_t min_align) | ||
274 | { | ||
275 | struct resource *res = dev->resource + resno; | ||
276 | struct pci_bus *bus; | ||
277 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c | ||
278 | index aa54fad7..82fce32c 100644 | ||
279 | --- a/drivers/usb/core/hub.c | ||
280 | +++ b/drivers/usb/core/hub.c | ||
281 | @@ -1335,6 +1335,7 @@ static int hub_configure(struct usb_hub *hub, | ||
282 | return 0; | ||
283 | |||
284 | fail: | ||
285 | + hdev->maxchild = 0; | ||
286 | dev_err (hub_dev, "config failed, %s (err %d)\n", | ||
287 | message, ret); | ||
288 | /* hub_disconnect() frees urb and descriptor */ | ||
289 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
290 | index 57277bcc..a5477554 100644 | ||
291 | --- a/drivers/usb/serial/option.c | ||
292 | +++ b/drivers/usb/serial/option.c | ||
293 | @@ -1391,6 +1391,23 @@ static const struct usb_device_id option_ids[] = { | ||
294 | .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, | ||
295 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1426, 0xff, 0xff, 0xff), /* ZTE MF91 */ | ||
296 | .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, | ||
297 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1533, 0xff, 0xff, 0xff) }, | ||
298 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1534, 0xff, 0xff, 0xff) }, | ||
299 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1535, 0xff, 0xff, 0xff) }, | ||
300 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1545, 0xff, 0xff, 0xff) }, | ||
301 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1546, 0xff, 0xff, 0xff) }, | ||
302 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1547, 0xff, 0xff, 0xff) }, | ||
303 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1565, 0xff, 0xff, 0xff) }, | ||
304 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1566, 0xff, 0xff, 0xff) }, | ||
305 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1567, 0xff, 0xff, 0xff) }, | ||
306 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1589, 0xff, 0xff, 0xff) }, | ||
307 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1590, 0xff, 0xff, 0xff) }, | ||
308 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1591, 0xff, 0xff, 0xff) }, | ||
309 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1592, 0xff, 0xff, 0xff) }, | ||
310 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1594, 0xff, 0xff, 0xff) }, | ||
311 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1596, 0xff, 0xff, 0xff) }, | ||
312 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1598, 0xff, 0xff, 0xff) }, | ||
313 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1600, 0xff, 0xff, 0xff) }, | ||
314 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2002, 0xff, | ||
315 | 0xff, 0xff), .driver_info = (kernel_ulong_t)&zte_k3765_z_blacklist }, | ||
316 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2003, 0xff, 0xff, 0xff) }, | ||
317 | diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c | ||
318 | index 5dd96266..022940f0 100644 | ||
319 | --- a/kernel/trace/trace.c | ||
320 | +++ b/kernel/trace/trace.c | ||
321 | @@ -590,9 +590,12 @@ int trace_get_user(struct trace_parser *parser, const char __user *ubuf, | ||
322 | if (isspace(ch)) { | ||
323 | parser->buffer[parser->idx] = 0; | ||
324 | parser->cont = false; | ||
325 | - } else { | ||
326 | + } else if (parser->idx < parser->size - 1) { | ||
327 | parser->cont = true; | ||
328 | parser->buffer[parser->idx++] = ch; | ||
329 | + } else { | ||
330 | + ret = -EINVAL; | ||
331 | + goto out; | ||
332 | } | ||
333 | |||
334 | *ppos += read; | ||
335 | diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c | ||
336 | index 27747881..200707c6 100644 | ||
337 | --- a/net/core/flow_dissector.c | ||
338 | +++ b/net/core/flow_dissector.c | ||
339 | @@ -35,7 +35,7 @@ again: | ||
340 | struct iphdr _iph; | ||
341 | ip: | ||
342 | iph = skb_header_pointer(skb, nhoff, sizeof(_iph), &_iph); | ||
343 | - if (!iph) | ||
344 | + if (!iph || iph->ihl < 5) | ||
345 | return false; | ||
346 | |||
347 | if (ip_is_fragment(iph)) | ||
348 | diff --git a/net/netfilter/nf_conntrack_sip.c b/net/netfilter/nf_conntrack_sip.c | ||
349 | index 93faf6a3..4a8c55bd 100644 | ||
350 | --- a/net/netfilter/nf_conntrack_sip.c | ||
351 | +++ b/net/netfilter/nf_conntrack_sip.c | ||
352 | @@ -1468,7 +1468,7 @@ static int sip_help_tcp(struct sk_buff *skb, unsigned int protoff, | ||
353 | |||
354 | msglen = origlen = end - dptr; | ||
355 | if (msglen > datalen) | ||
356 | - return NF_DROP; | ||
357 | + return NF_ACCEPT; | ||
358 | |||
359 | ret = process_sip_msg(skb, ct, dataoff, &dptr, &msglen); | ||
360 | if (ret != NF_ACCEPT) | ||
361 | diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c | ||
362 | index 02a6e3f4..ef917bf2 100644 | ||
363 | --- a/sound/pci/hda/patch_hdmi.c | ||
364 | +++ b/sound/pci/hda/patch_hdmi.c | ||
365 | @@ -1282,23 +1282,34 @@ static int generic_hdmi_build_controls(struct hda_codec *codec) | ||
366 | return 0; | ||
367 | } | ||
368 | |||
369 | -static int generic_hdmi_init(struct hda_codec *codec) | ||
370 | +static int generic_hdmi_init_per_pins(struct hda_codec *codec) | ||
371 | { | ||
372 | struct hdmi_spec *spec = codec->spec; | ||
373 | int pin_idx; | ||
374 | |||
375 | for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { | ||
376 | struct hdmi_spec_per_pin *per_pin = &spec->pins[pin_idx]; | ||
377 | - hda_nid_t pin_nid = per_pin->pin_nid; | ||
378 | struct hdmi_eld *eld = &per_pin->sink_eld; | ||
379 | |||
380 | - hdmi_init_pin(codec, pin_nid); | ||
381 | - snd_hda_jack_detect_enable(codec, pin_nid, pin_nid); | ||
382 | - | ||
383 | per_pin->codec = codec; | ||
384 | INIT_DELAYED_WORK(&per_pin->work, hdmi_repoll_eld); | ||
385 | snd_hda_eld_proc_new(codec, eld, pin_idx); | ||
386 | } | ||
387 | + return 0; | ||
388 | +} | ||
389 | + | ||
390 | +static int generic_hdmi_init(struct hda_codec *codec) | ||
391 | +{ | ||
392 | + struct hdmi_spec *spec = codec->spec; | ||
393 | + int pin_idx; | ||
394 | + | ||
395 | + for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { | ||
396 | + struct hdmi_spec_per_pin *per_pin = &spec->pins[pin_idx]; | ||
397 | + hda_nid_t pin_nid = per_pin->pin_nid; | ||
398 | + | ||
399 | + hdmi_init_pin(codec, pin_nid); | ||
400 | + snd_hda_jack_detect_enable(codec, pin_nid, pin_nid); | ||
401 | + } | ||
402 | snd_hda_jack_report_sync(codec); | ||
403 | return 0; | ||
404 | } | ||
405 | @@ -1343,6 +1354,7 @@ static int patch_generic_hdmi(struct hda_codec *codec) | ||
406 | return -EINVAL; | ||
407 | } | ||
408 | codec->patch_ops = generic_hdmi_patch_ops; | ||
409 | + generic_hdmi_init_per_pins(codec); | ||
410 | |||
411 | init_channel_allocations(); | ||
412 |