mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-26 16:51:48 +00:00
424 lines
13 KiB
Diff
424 lines
13 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index 2f9a0467..d7c0a383 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,6 +1,6 @@
|
|
VERSION = 3
|
|
PATCHLEVEL = 4
|
|
-SUBLEVEL = 69
|
|
+SUBLEVEL = 70
|
|
EXTRAVERSION =
|
|
NAME = Saber-toothed Squirrel
|
|
|
|
diff --git a/arch/arm/lib/memset.S b/arch/arm/lib/memset.S
|
|
index 650d5923..94b0650e 100644
|
|
--- a/arch/arm/lib/memset.S
|
|
+++ b/arch/arm/lib/memset.S
|
|
@@ -14,27 +14,15 @@
|
|
|
|
.text
|
|
.align 5
|
|
- .word 0
|
|
-
|
|
-1: subs r2, r2, #4 @ 1 do we have enough
|
|
- blt 5f @ 1 bytes to align with?
|
|
- cmp r3, #2 @ 1
|
|
- strltb r1, [r0], #1 @ 1
|
|
- strleb r1, [r0], #1 @ 1
|
|
- strb r1, [r0], #1 @ 1
|
|
- add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3))
|
|
-/*
|
|
- * The pointer is now aligned and the length is adjusted. Try doing the
|
|
- * memset again.
|
|
- */
|
|
|
|
ENTRY(memset)
|
|
ands r3, r0, #3 @ 1 unaligned?
|
|
- bne 1b @ 1
|
|
+ mov ip, r0 @ preserve r0 as return value
|
|
+ bne 6f @ 1
|
|
/*
|
|
- * we know that the pointer in r0 is aligned to a word boundary.
|
|
+ * we know that the pointer in ip is aligned to a word boundary.
|
|
*/
|
|
- orr r1, r1, r1, lsl #8
|
|
+1: orr r1, r1, r1, lsl #8
|
|
orr r1, r1, r1, lsl #16
|
|
mov r3, r1
|
|
cmp r2, #16
|
|
@@ -43,29 +31,28 @@ ENTRY(memset)
|
|
#if ! CALGN(1)+0
|
|
|
|
/*
|
|
- * We need an extra register for this loop - save the return address and
|
|
- * use the LR
|
|
+ * We need 2 extra registers for this loop - use r8 and the LR
|
|
*/
|
|
- str lr, [sp, #-4]!
|
|
- mov ip, r1
|
|
+ stmfd sp!, {r8, lr}
|
|
+ mov r8, r1
|
|
mov lr, r1
|
|
|
|
2: subs r2, r2, #64
|
|
- stmgeia r0!, {r1, r3, ip, lr} @ 64 bytes at a time.
|
|
- stmgeia r0!, {r1, r3, ip, lr}
|
|
- stmgeia r0!, {r1, r3, ip, lr}
|
|
- stmgeia r0!, {r1, r3, ip, lr}
|
|
+ stmgeia ip!, {r1, r3, r8, lr} @ 64 bytes at a time.
|
|
+ stmgeia ip!, {r1, r3, r8, lr}
|
|
+ stmgeia ip!, {r1, r3, r8, lr}
|
|
+ stmgeia ip!, {r1, r3, r8, lr}
|
|
bgt 2b
|
|
- ldmeqfd sp!, {pc} @ Now <64 bytes to go.
|
|
+ ldmeqfd sp!, {r8, pc} @ Now <64 bytes to go.
|
|
/*
|
|
* No need to correct the count; we're only testing bits from now on
|
|
*/
|
|
tst r2, #32
|
|
- stmneia r0!, {r1, r3, ip, lr}
|
|
- stmneia r0!, {r1, r3, ip, lr}
|
|
+ stmneia ip!, {r1, r3, r8, lr}
|
|
+ stmneia ip!, {r1, r3, r8, lr}
|
|
tst r2, #16
|
|
- stmneia r0!, {r1, r3, ip, lr}
|
|
- ldr lr, [sp], #4
|
|
+ stmneia ip!, {r1, r3, r8, lr}
|
|
+ ldmfd sp!, {r8, lr}
|
|
|
|
#else
|
|
|
|
@@ -74,54 +61,63 @@ ENTRY(memset)
|
|
* whole cache lines at once.
|
|
*/
|
|
|
|
- stmfd sp!, {r4-r7, lr}
|
|
+ stmfd sp!, {r4-r8, lr}
|
|
mov r4, r1
|
|
mov r5, r1
|
|
mov r6, r1
|
|
mov r7, r1
|
|
- mov ip, r1
|
|
+ mov r8, r1
|
|
mov lr, r1
|
|
|
|
cmp r2, #96
|
|
- tstgt r0, #31
|
|
+ tstgt ip, #31
|
|
ble 3f
|
|
|
|
- and ip, r0, #31
|
|
- rsb ip, ip, #32
|
|
- sub r2, r2, ip
|
|
- movs ip, ip, lsl #(32 - 4)
|
|
- stmcsia r0!, {r4, r5, r6, r7}
|
|
- stmmiia r0!, {r4, r5}
|
|
- tst ip, #(1 << 30)
|
|
- mov ip, r1
|
|
- strne r1, [r0], #4
|
|
+ and r8, ip, #31
|
|
+ rsb r8, r8, #32
|
|
+ sub r2, r2, r8
|
|
+ movs r8, r8, lsl #(32 - 4)
|
|
+ stmcsia ip!, {r4, r5, r6, r7}
|
|
+ stmmiia ip!, {r4, r5}
|
|
+ tst r8, #(1 << 30)
|
|
+ mov r8, r1
|
|
+ strne r1, [ip], #4
|
|
|
|
3: subs r2, r2, #64
|
|
- stmgeia r0!, {r1, r3-r7, ip, lr}
|
|
- stmgeia r0!, {r1, r3-r7, ip, lr}
|
|
+ stmgeia ip!, {r1, r3-r8, lr}
|
|
+ stmgeia ip!, {r1, r3-r8, lr}
|
|
bgt 3b
|
|
- ldmeqfd sp!, {r4-r7, pc}
|
|
+ ldmeqfd sp!, {r4-r8, pc}
|
|
|
|
tst r2, #32
|
|
- stmneia r0!, {r1, r3-r7, ip, lr}
|
|
+ stmneia ip!, {r1, r3-r8, lr}
|
|
tst r2, #16
|
|
- stmneia r0!, {r4-r7}
|
|
- ldmfd sp!, {r4-r7, lr}
|
|
+ stmneia ip!, {r4-r7}
|
|
+ ldmfd sp!, {r4-r8, lr}
|
|
|
|
#endif
|
|
|
|
4: tst r2, #8
|
|
- stmneia r0!, {r1, r3}
|
|
+ stmneia ip!, {r1, r3}
|
|
tst r2, #4
|
|
- strne r1, [r0], #4
|
|
+ strne r1, [ip], #4
|
|
/*
|
|
* When we get here, we've got less than 4 bytes to zero. We
|
|
* may have an unaligned pointer as well.
|
|
*/
|
|
5: tst r2, #2
|
|
- strneb r1, [r0], #1
|
|
- strneb r1, [r0], #1
|
|
+ strneb r1, [ip], #1
|
|
+ strneb r1, [ip], #1
|
|
tst r2, #1
|
|
- strneb r1, [r0], #1
|
|
+ strneb r1, [ip], #1
|
|
mov pc, lr
|
|
+
|
|
+6: subs r2, r2, #4 @ 1 do we have enough
|
|
+ blt 5b @ 1 bytes to align with?
|
|
+ cmp r3, #2 @ 1
|
|
+ strltb r1, [ip], #1 @ 1
|
|
+ strleb r1, [ip], #1 @ 1
|
|
+ strb r1, [ip], #1 @ 1
|
|
+ add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3))
|
|
+ b 1b
|
|
ENDPROC(memset)
|
|
diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h
|
|
index 9d7f1723..093bf0a2 100644
|
|
--- a/drivers/net/xen-netback/common.h
|
|
+++ b/drivers/net/xen-netback/common.h
|
|
@@ -88,6 +88,7 @@ struct xenvif {
|
|
unsigned long credit_usec;
|
|
unsigned long remaining_credit;
|
|
struct timer_list credit_timeout;
|
|
+ u64 credit_window_start;
|
|
|
|
/* Statistics */
|
|
unsigned long rx_gso_checksum_fixup;
|
|
diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c
|
|
index 221f4265..cfaaf685 100644
|
|
--- a/drivers/net/xen-netback/interface.c
|
|
+++ b/drivers/net/xen-netback/interface.c
|
|
@@ -273,8 +273,7 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid,
|
|
vif->credit_bytes = vif->remaining_credit = ~0UL;
|
|
vif->credit_usec = 0UL;
|
|
init_timer(&vif->credit_timeout);
|
|
- /* Initialize 'expires' now: it's used to track the credit window. */
|
|
- vif->credit_timeout.expires = jiffies;
|
|
+ vif->credit_window_start = get_jiffies_64();
|
|
|
|
dev->netdev_ops = &xenvif_netdev_ops;
|
|
dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO;
|
|
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
|
|
index 0d22cff0..d8ffbf84 100644
|
|
--- a/drivers/net/xen-netback/netback.c
|
|
+++ b/drivers/net/xen-netback/netback.c
|
|
@@ -1197,9 +1197,8 @@ out:
|
|
|
|
static bool tx_credit_exceeded(struct xenvif *vif, unsigned size)
|
|
{
|
|
- unsigned long now = jiffies;
|
|
- unsigned long next_credit =
|
|
- vif->credit_timeout.expires +
|
|
+ u64 now = get_jiffies_64();
|
|
+ u64 next_credit = vif->credit_window_start +
|
|
msecs_to_jiffies(vif->credit_usec / 1000);
|
|
|
|
/* Timer could already be pending in rare cases. */
|
|
@@ -1207,8 +1206,8 @@ static bool tx_credit_exceeded(struct xenvif *vif, unsigned size)
|
|
return true;
|
|
|
|
/* Passed the point where we can replenish credit? */
|
|
- if (time_after_eq(now, next_credit)) {
|
|
- vif->credit_timeout.expires = now;
|
|
+ if (time_after_eq64(now, next_credit)) {
|
|
+ vif->credit_window_start = now;
|
|
tx_add_credit(vif);
|
|
}
|
|
|
|
@@ -1220,6 +1219,7 @@ static bool tx_credit_exceeded(struct xenvif *vif, unsigned size)
|
|
tx_credit_callback;
|
|
mod_timer(&vif->credit_timeout,
|
|
next_credit);
|
|
+ vif->credit_window_start = next_credit;
|
|
|
|
return true;
|
|
}
|
|
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
|
|
index 54fc9880..21b9ed1d 100644
|
|
--- a/drivers/pci/pci-driver.c
|
|
+++ b/drivers/pci/pci-driver.c
|
|
@@ -680,6 +680,7 @@ static int pci_pm_suspend(struct device *dev)
|
|
goto Fixup;
|
|
}
|
|
|
|
+ pci_dev->state_saved = false;
|
|
if (pm->suspend) {
|
|
pci_power_t prev = pci_dev->current_state;
|
|
int error;
|
|
@@ -826,6 +827,7 @@ static int pci_pm_freeze(struct device *dev)
|
|
return 0;
|
|
}
|
|
|
|
+ pci_dev->state_saved = false;
|
|
if (pm->freeze) {
|
|
int error;
|
|
|
|
@@ -914,6 +916,7 @@ static int pci_pm_poweroff(struct device *dev)
|
|
goto Fixup;
|
|
}
|
|
|
|
+ pci_dev->state_saved = false;
|
|
if (pm->poweroff) {
|
|
int error;
|
|
|
|
@@ -1032,6 +1035,7 @@ static int pci_pm_runtime_suspend(struct device *dev)
|
|
if (!pm || !pm->runtime_suspend)
|
|
return -ENOSYS;
|
|
|
|
+ pci_dev->state_saved = false;
|
|
error = pm->runtime_suspend(dev);
|
|
suspend_report_result(pm->runtime_suspend, error);
|
|
if (error)
|
|
diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c
|
|
index eea85daf..be76ebac 100644
|
|
--- a/drivers/pci/setup-res.c
|
|
+++ b/drivers/pci/setup-res.c
|
|
@@ -206,7 +206,8 @@ static int pci_revert_fw_address(struct resource *res, struct pci_dev *dev,
|
|
return ret;
|
|
}
|
|
|
|
-static int _pci_assign_resource(struct pci_dev *dev, int resno, int size, resource_size_t min_align)
|
|
+static int _pci_assign_resource(struct pci_dev *dev, int resno,
|
|
+ resource_size_t size, resource_size_t min_align)
|
|
{
|
|
struct resource *res = dev->resource + resno;
|
|
struct pci_bus *bus;
|
|
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
|
|
index aa54fad7..82fce32c 100644
|
|
--- a/drivers/usb/core/hub.c
|
|
+++ b/drivers/usb/core/hub.c
|
|
@@ -1335,6 +1335,7 @@ static int hub_configure(struct usb_hub *hub,
|
|
return 0;
|
|
|
|
fail:
|
|
+ hdev->maxchild = 0;
|
|
dev_err (hub_dev, "config failed, %s (err %d)\n",
|
|
message, ret);
|
|
/* hub_disconnect() frees urb and descriptor */
|
|
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
|
|
index 57277bcc..a5477554 100644
|
|
--- a/drivers/usb/serial/option.c
|
|
+++ b/drivers/usb/serial/option.c
|
|
@@ -1391,6 +1391,23 @@ static const struct usb_device_id option_ids[] = {
|
|
.driver_info = (kernel_ulong_t)&net_intf2_blacklist },
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1426, 0xff, 0xff, 0xff), /* ZTE MF91 */
|
|
.driver_info = (kernel_ulong_t)&net_intf2_blacklist },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1533, 0xff, 0xff, 0xff) },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1534, 0xff, 0xff, 0xff) },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1535, 0xff, 0xff, 0xff) },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1545, 0xff, 0xff, 0xff) },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1546, 0xff, 0xff, 0xff) },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1547, 0xff, 0xff, 0xff) },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1565, 0xff, 0xff, 0xff) },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1566, 0xff, 0xff, 0xff) },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1567, 0xff, 0xff, 0xff) },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1589, 0xff, 0xff, 0xff) },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1590, 0xff, 0xff, 0xff) },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1591, 0xff, 0xff, 0xff) },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1592, 0xff, 0xff, 0xff) },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1594, 0xff, 0xff, 0xff) },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1596, 0xff, 0xff, 0xff) },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1598, 0xff, 0xff, 0xff) },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1600, 0xff, 0xff, 0xff) },
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2002, 0xff,
|
|
0xff, 0xff), .driver_info = (kernel_ulong_t)&zte_k3765_z_blacklist },
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2003, 0xff, 0xff, 0xff) },
|
|
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
|
|
index 5dd96266..022940f0 100644
|
|
--- a/kernel/trace/trace.c
|
|
+++ b/kernel/trace/trace.c
|
|
@@ -590,9 +590,12 @@ int trace_get_user(struct trace_parser *parser, const char __user *ubuf,
|
|
if (isspace(ch)) {
|
|
parser->buffer[parser->idx] = 0;
|
|
parser->cont = false;
|
|
- } else {
|
|
+ } else if (parser->idx < parser->size - 1) {
|
|
parser->cont = true;
|
|
parser->buffer[parser->idx++] = ch;
|
|
+ } else {
|
|
+ ret = -EINVAL;
|
|
+ goto out;
|
|
}
|
|
|
|
*ppos += read;
|
|
diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c
|
|
index 27747881..200707c6 100644
|
|
--- a/net/core/flow_dissector.c
|
|
+++ b/net/core/flow_dissector.c
|
|
@@ -35,7 +35,7 @@ again:
|
|
struct iphdr _iph;
|
|
ip:
|
|
iph = skb_header_pointer(skb, nhoff, sizeof(_iph), &_iph);
|
|
- if (!iph)
|
|
+ if (!iph || iph->ihl < 5)
|
|
return false;
|
|
|
|
if (ip_is_fragment(iph))
|
|
diff --git a/net/netfilter/nf_conntrack_sip.c b/net/netfilter/nf_conntrack_sip.c
|
|
index 93faf6a3..4a8c55bd 100644
|
|
--- a/net/netfilter/nf_conntrack_sip.c
|
|
+++ b/net/netfilter/nf_conntrack_sip.c
|
|
@@ -1468,7 +1468,7 @@ static int sip_help_tcp(struct sk_buff *skb, unsigned int protoff,
|
|
|
|
msglen = origlen = end - dptr;
|
|
if (msglen > datalen)
|
|
- return NF_DROP;
|
|
+ return NF_ACCEPT;
|
|
|
|
ret = process_sip_msg(skb, ct, dataoff, &dptr, &msglen);
|
|
if (ret != NF_ACCEPT)
|
|
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
|
|
index 02a6e3f4..ef917bf2 100644
|
|
--- a/sound/pci/hda/patch_hdmi.c
|
|
+++ b/sound/pci/hda/patch_hdmi.c
|
|
@@ -1282,23 +1282,34 @@ static int generic_hdmi_build_controls(struct hda_codec *codec)
|
|
return 0;
|
|
}
|
|
|
|
-static int generic_hdmi_init(struct hda_codec *codec)
|
|
+static int generic_hdmi_init_per_pins(struct hda_codec *codec)
|
|
{
|
|
struct hdmi_spec *spec = codec->spec;
|
|
int pin_idx;
|
|
|
|
for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) {
|
|
struct hdmi_spec_per_pin *per_pin = &spec->pins[pin_idx];
|
|
- hda_nid_t pin_nid = per_pin->pin_nid;
|
|
struct hdmi_eld *eld = &per_pin->sink_eld;
|
|
|
|
- hdmi_init_pin(codec, pin_nid);
|
|
- snd_hda_jack_detect_enable(codec, pin_nid, pin_nid);
|
|
-
|
|
per_pin->codec = codec;
|
|
INIT_DELAYED_WORK(&per_pin->work, hdmi_repoll_eld);
|
|
snd_hda_eld_proc_new(codec, eld, pin_idx);
|
|
}
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int generic_hdmi_init(struct hda_codec *codec)
|
|
+{
|
|
+ struct hdmi_spec *spec = codec->spec;
|
|
+ int pin_idx;
|
|
+
|
|
+ for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) {
|
|
+ struct hdmi_spec_per_pin *per_pin = &spec->pins[pin_idx];
|
|
+ hda_nid_t pin_nid = per_pin->pin_nid;
|
|
+
|
|
+ hdmi_init_pin(codec, pin_nid);
|
|
+ snd_hda_jack_detect_enable(codec, pin_nid, pin_nid);
|
|
+ }
|
|
snd_hda_jack_report_sync(codec);
|
|
return 0;
|
|
}
|
|
@@ -1343,6 +1354,7 @@ static int patch_generic_hdmi(struct hda_codec *codec)
|
|
return -EINVAL;
|
|
}
|
|
codec->patch_ops = generic_hdmi_patch_ops;
|
|
+ generic_hdmi_init_per_pins(codec);
|
|
|
|
init_channel_allocations();
|
|
|