Magellan Linux

Contents of /trunk/kernel-lts/patches-3.4/0169-3.4.70-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2334 - (show annotations) (download)
Thu Dec 12 08:43:27 2013 UTC (10 years, 5 months ago) by niro
File size: 12689 byte(s)
-linux-3.4.70
1 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