--- /dev/null
+From foo@baz Thu Jun 15 11:13:01 CEST 2017
+From: Ricardo Ribalda <ricardo.ribalda@gmail.com>
+Date: Tue, 23 May 2017 21:53:45 -0400
+Subject: i2c: piix4: Fix request_region size
+
+From: Ricardo Ribalda <ricardo.ribalda@gmail.com>
+
+
+[ Upstream commit f43128c75202f29ee71aa83e6c320a911137c189 ]
+
+Since '701dc207bf55 ("i2c: piix4: Avoid race conditions with IMC")' we
+are using the SMBSLVCNT register at offset 0x8. We need to request it.
+
+Fixes: 701dc207bf55 ("i2c: piix4: Avoid race conditions with IMC")
+Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
+Signed-off-by: Jean Delvare <jdelvare@suse.de>
+Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/i2c/busses/i2c-piix4.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/i2c/busses/i2c-piix4.c
++++ b/drivers/i2c/busses/i2c-piix4.c
+@@ -54,7 +54,7 @@
+ #define SMBSLVDAT (0xC + piix4_smba)
+
+ /* count for request_region */
+-#define SMBIOSIZE 8
++#define SMBIOSIZE 9
+
+ /* PCI Address Constants */
+ #define SMBBA 0x090
--- /dev/null
+From foo@baz Thu Jun 15 11:13:01 CEST 2017
+From: Ralf Baechle <ralf@linux-mips.org>
+Date: Tue, 23 May 2017 21:53:37 -0400
+Subject: NET: Fix /proc/net/arp for AX.25
+
+From: Ralf Baechle <ralf@linux-mips.org>
+
+
+[ Upstream commit 4872e57c812dd312bf8193b5933fa60585cda42f ]
+
+When sending ARP requests over AX.25 links the hwaddress in the neighbour
+cache are not getting initialized. For such an incomplete arp entry
+ax2asc2 will generate an empty string resulting in /proc/net/arp output
+like the following:
+
+$ cat /proc/net/arp
+IP address HW type Flags HW address Mask Device
+192.168.122.1 0x1 0x2 52:54:00:00:5d:5f * ens3
+172.20.1.99 0x3 0x0 * bpq0
+
+The missing field will confuse the procfs parsing of arp(8) resulting in
+incorrect output for the device such as the following:
+
+$ arp
+Address HWtype HWaddress Flags Mask Iface
+gateway ether 52:54:00:00:5d:5f C ens3
+172.20.1.99 (incomplete) ens3
+
+This changes the content of /proc/net/arp to:
+
+$ cat /proc/net/arp
+IP address HW type Flags HW address Mask Device
+172.20.1.99 0x3 0x0 * * bpq0
+192.168.122.1 0x1 0x2 52:54:00:00:5d:5f * ens3
+
+To do so it change ax2asc to put the string "*" in buf for a NULL address
+argument. Finally the HW address field is left aligned in a 17 character
+field (the length of an ethernet HW address in the usual hex notation) for
+readability.
+
+Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/ipv4/arp.c | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+--- a/net/ipv4/arp.c
++++ b/net/ipv4/arp.c
+@@ -1250,7 +1250,7 @@ void __init arp_init(void)
+ /*
+ * ax25 -> ASCII conversion
+ */
+-static char *ax2asc2(ax25_address *a, char *buf)
++static void ax2asc2(ax25_address *a, char *buf)
+ {
+ char c, *s;
+ int n;
+@@ -1272,10 +1272,10 @@ static char *ax2asc2(ax25_address *a, ch
+ *s++ = n + '0';
+ *s++ = '\0';
+
+- if (*buf == '\0' || *buf == '-')
+- return "*";
+-
+- return buf;
++ if (*buf == '\0' || *buf == '-') {
++ buf[0] = '*';
++ buf[1] = '\0';
++ }
+ }
+ #endif /* CONFIG_AX25 */
+
+@@ -1309,7 +1309,7 @@ static void arp_format_neigh_entry(struc
+ }
+ #endif
+ sprintf(tbuf, "%pI4", n->primary_key);
+- seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n",
++ seq_printf(seq, "%-16s 0x%-10x0x%-10x%-17s * %s\n",
+ tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name);
+ read_unlock(&n->lock);
+ }
--- /dev/null
+From foo@baz Thu Jun 15 11:13:01 CEST 2017
+From: Kejian Yan <yankejian@huawei.com>
+Date: Tue, 23 May 2017 21:53:41 -0400
+Subject: net: hns: Fix the device being used for dma mapping during TX
+
+From: Kejian Yan <yankejian@huawei.com>
+
+
+[ Upstream commit b85ea006b6bebb692628f11882af41c3e12e1e09 ]
+
+This patch fixes the device being used to DMA map skb->data.
+Erroneous device assignment causes the crash when SMMU is enabled.
+This happens during TX since buffer gets DMA mapped with device
+correspondign to net_device and gets unmapped using the device
+related to DSAF.
+
+Signed-off-by: Kejian Yan <yankejian@huawei.com>
+Reviewed-by: Yisen Zhuang <yisen.zhuang@huawei.com>
+Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/hisilicon/hns/hns_enet.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
++++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+@@ -105,8 +105,8 @@ int hns_nic_net_xmit_hw(struct net_devic
+ struct hns_nic_ring_data *ring_data)
+ {
+ struct hns_nic_priv *priv = netdev_priv(ndev);
+- struct device *dev = priv->dev;
+ struct hnae_ring *ring = ring_data->ring;
++ struct device *dev = ring_to_dev(ring);
+ struct netdev_queue *dev_queue;
+ struct skb_frag_struct *frag;
+ int buf_num;
--- /dev/null
+From foo@baz Thu Jun 15 11:13:01 CEST 2017
+From: Ralf Baechle <ralf@linux-mips.org>
+Date: Tue, 23 May 2017 21:53:40 -0400
+Subject: NET: mkiss: Fix panic
+
+From: Ralf Baechle <ralf@linux-mips.org>
+
+
+[ Upstream commit 7ba1b689038726d34e3244c1ac9e2e18c2ea4787 ]
+
+If a USB-to-serial adapter is unplugged, the driver re-initializes, with
+dev->hard_header_len and dev->addr_len set to zero, instead of the correct
+values. If then a packet is sent through the half-dead interface, the
+kernel will panic due to running out of headroom in the skb when pushing
+for the AX.25 headers resulting in this panic:
+
+[<c0595468>] (skb_panic) from [<c0401f70>] (skb_push+0x4c/0x50)
+[<c0401f70>] (skb_push) from [<bf0bdad4>] (ax25_hard_header+0x34/0xf4 [ax25])
+[<bf0bdad4>] (ax25_hard_header [ax25]) from [<bf0d05d4>] (ax_header+0x38/0x40 [mkiss])
+[<bf0d05d4>] (ax_header [mkiss]) from [<c041b584>] (neigh_compat_output+0x8c/0xd8)
+[<c041b584>] (neigh_compat_output) from [<c043e7a8>] (ip_finish_output+0x2a0/0x914)
+[<c043e7a8>] (ip_finish_output) from [<c043f948>] (ip_output+0xd8/0xf0)
+[<c043f948>] (ip_output) from [<c043f04c>] (ip_local_out_sk+0x44/0x48)
+
+This patch makes mkiss behave like the 6pack driver. 6pack does not
+panic. In 6pack.c sp_setup() (same function name here) the values for
+dev->hard_header_len and dev->addr_len are set to the same values as in
+my mkiss patch.
+
+[ralf@linux-mips.org: Massages original submission to conform to the usual
+standards for patch submissions.]
+
+Signed-off-by: Thomas Osterried <thomas@osterried.de>
+Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/hamradio/mkiss.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/hamradio/mkiss.c
++++ b/drivers/net/hamradio/mkiss.c
+@@ -648,8 +648,8 @@ static void ax_setup(struct net_device *
+ {
+ /* Finish setting up the DEVICE info. */
+ dev->mtu = AX_MTU;
+- dev->hard_header_len = 0;
+- dev->addr_len = 0;
++ dev->hard_header_len = AX25_MAX_HEADER_LEN;
++ dev->addr_len = AX25_ADDR_LEN;
+ dev->type = ARPHRD_AX25;
+ dev->tx_queue_len = 10;
+ dev->header_ops = &ax25_header_ops;
net-xilinx_emaclite-fix-receive-buffer-overflow.patch
ipv6-handle-ipv4-mapped-src-to-in6addr_any-dst.patch
ipv6-inhibit-ipv4-mapped-src-address-on-the-wire.patch
+net-fix-proc-net-arp-for-ax.25.patch
+net-mkiss-fix-panic.patch
+net-hns-fix-the-device-being-used-for-dma-mapping-during-tx.patch
+sierra_net-skip-validating-irrelevant-fields-for-idle-lsis.patch
+sierra_net-add-support-for-ipv6-and-dual-stack-link-sense-indications.patch
+i2c-piix4-fix-request_region-size.patch
--- /dev/null
+From foo@baz Thu Jun 15 11:13:01 CEST 2017
+From: Stefan Brüns <stefan.bruens@rwth-aachen.de>
+Date: Tue, 23 May 2017 21:53:43 -0400
+Subject: sierra_net: Add support for IPv6 and Dual-Stack Link Sense Indications
+
+From: Stefan Brüns <stefan.bruens@rwth-aachen.de>
+
+
+[ Upstream commit 5a70348e1187c5bf1cbd0ec51843f36befed1c2d ]
+
+If a context is configured as dualstack ("IPv4v6"), the modem indicates
+the context activation with a slightly different indication message.
+The dual-stack indication omits the link_type (IPv4/v6) and adds
+additional address fields.
+IPv6 LSIs are identical to IPv4 LSIs, but have a different link type.
+
+Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de>
+Reviewed-by: Bjørn Mork <bjorn@mork.no>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/usb/sierra_net.c | 101 ++++++++++++++++++++++++++++---------------
+ 1 file changed, 66 insertions(+), 35 deletions(-)
+
+--- a/drivers/net/usb/sierra_net.c
++++ b/drivers/net/usb/sierra_net.c
+@@ -73,8 +73,6 @@ static atomic_t iface_counter = ATOMIC_I
+ /* Private data structure */
+ struct sierra_net_data {
+
+- u8 ethr_hdr_tmpl[ETH_HLEN]; /* ethernet header template for rx'd pkts */
+-
+ u16 link_up; /* air link up or down */
+ u8 tx_hdr_template[4]; /* part of HIP hdr for tx'd packets */
+
+@@ -122,6 +120,7 @@ struct param {
+
+ /* LSI Protocol types */
+ #define SIERRA_NET_PROTOCOL_UMTS 0x01
++#define SIERRA_NET_PROTOCOL_UMTS_DS 0x04
+ /* LSI Coverage */
+ #define SIERRA_NET_COVERAGE_NONE 0x00
+ #define SIERRA_NET_COVERAGE_NOPACKET 0x01
+@@ -129,7 +128,8 @@ struct param {
+ /* LSI Session */
+ #define SIERRA_NET_SESSION_IDLE 0x00
+ /* LSI Link types */
+-#define SIERRA_NET_AS_LINK_TYPE_IPv4 0x00
++#define SIERRA_NET_AS_LINK_TYPE_IPV4 0x00
++#define SIERRA_NET_AS_LINK_TYPE_IPV6 0x02
+
+ struct lsi_umts {
+ u8 protocol;
+@@ -137,9 +137,14 @@ struct lsi_umts {
+ __be16 length;
+ /* eventually use a union for the rest - assume umts for now */
+ u8 coverage;
+- u8 unused2[41];
++ u8 network_len; /* network name len */
++ u8 network[40]; /* network name (UCS2, bigendian) */
+ u8 session_state;
+ u8 unused3[33];
++} __packed;
++
++struct lsi_umts_single {
++ struct lsi_umts lsi;
+ u8 link_type;
+ u8 pdp_addr_len; /* NW-supplied PDP address len */
+ u8 pdp_addr[16]; /* NW-supplied PDP address (bigendian)) */
+@@ -158,10 +163,31 @@ struct lsi_umts {
+ u8 reserved[8];
+ } __packed;
+
++struct lsi_umts_dual {
++ struct lsi_umts lsi;
++ u8 pdp_addr4_len; /* NW-supplied PDP IPv4 address len */
++ u8 pdp_addr4[4]; /* NW-supplied PDP IPv4 address (bigendian)) */
++ u8 pdp_addr6_len; /* NW-supplied PDP IPv6 address len */
++ u8 pdp_addr6[16]; /* NW-supplied PDP IPv6 address (bigendian)) */
++ u8 unused4[23];
++ u8 dns1_addr4_len; /* NW-supplied 1st DNS v4 address len (bigendian) */
++ u8 dns1_addr4[4]; /* NW-supplied 1st DNS v4 address */
++ u8 dns1_addr6_len; /* NW-supplied 1st DNS v6 address len */
++ u8 dns1_addr6[16]; /* NW-supplied 1st DNS v6 address (bigendian)*/
++ u8 dns2_addr4_len; /* NW-supplied 2nd DNS v4 address len (bigendian) */
++ u8 dns2_addr4[4]; /* NW-supplied 2nd DNS v4 address */
++ u8 dns2_addr6_len; /* NW-supplied 2nd DNS v6 address len */
++ u8 dns2_addr6[16]; /* NW-supplied 2nd DNS v6 address (bigendian)*/
++ u8 unused5[68];
++} __packed;
++
+ #define SIERRA_NET_LSI_COMMON_LEN 4
+-#define SIERRA_NET_LSI_UMTS_LEN (sizeof(struct lsi_umts))
++#define SIERRA_NET_LSI_UMTS_LEN (sizeof(struct lsi_umts_single))
+ #define SIERRA_NET_LSI_UMTS_STATUS_LEN \
+ (SIERRA_NET_LSI_UMTS_LEN - SIERRA_NET_LSI_COMMON_LEN)
++#define SIERRA_NET_LSI_UMTS_DS_LEN (sizeof(struct lsi_umts_dual))
++#define SIERRA_NET_LSI_UMTS_DS_STATUS_LEN \
++ (SIERRA_NET_LSI_UMTS_DS_LEN - SIERRA_NET_LSI_COMMON_LEN)
+
+ /* Forward definitions */
+ static void sierra_sync_timer(unsigned long syncdata);
+@@ -191,10 +217,11 @@ static inline void sierra_net_set_privat
+ dev->data[0] = (unsigned long)priv;
+ }
+
+-/* is packet IPv4 */
++/* is packet IPv4/IPv6 */
+ static inline int is_ip(struct sk_buff *skb)
+ {
+- return skb->protocol == cpu_to_be16(ETH_P_IP);
++ return skb->protocol == cpu_to_be16(ETH_P_IP) ||
++ skb->protocol == cpu_to_be16(ETH_P_IPV6);
+ }
+
+ /*
+@@ -350,18 +377,11 @@ static inline int sierra_net_is_valid_ad
+ static int sierra_net_parse_lsi(struct usbnet *dev, char *data, int datalen)
+ {
+ struct lsi_umts *lsi = (struct lsi_umts *)data;
++ u32 expected_length;
+
+- if (datalen < sizeof(struct lsi_umts)) {
+- netdev_err(dev->net, "%s: Data length %d, exp %Zu\n",
+- __func__, datalen,
+- sizeof(struct lsi_umts));
+- return -1;
+- }
+-
+- if (lsi->length != cpu_to_be16(SIERRA_NET_LSI_UMTS_STATUS_LEN)) {
+- netdev_err(dev->net, "%s: LSI_UMTS_STATUS_LEN %d, exp %u\n",
+- __func__, be16_to_cpu(lsi->length),
+- (u32)SIERRA_NET_LSI_UMTS_STATUS_LEN);
++ if (datalen < sizeof(struct lsi_umts_single)) {
++ netdev_err(dev->net, "%s: Data length %d, exp >= %Zu\n",
++ __func__, datalen, sizeof(struct lsi_umts_single));
+ return -1;
+ }
+
+@@ -373,22 +393,34 @@ static int sierra_net_parse_lsi(struct u
+ }
+
+ /* Validate the protocol - only support UMTS for now */
+- if (lsi->protocol != SIERRA_NET_PROTOCOL_UMTS) {
++ if (lsi->protocol == SIERRA_NET_PROTOCOL_UMTS) {
++ struct lsi_umts_single *single = (struct lsi_umts_single *)lsi;
++
++ /* Validate the link type */
++ if (single->link_type != SIERRA_NET_AS_LINK_TYPE_IPV4 &&
++ single->link_type != SIERRA_NET_AS_LINK_TYPE_IPV6) {
++ netdev_err(dev->net, "Link type unsupported: 0x%02x\n",
++ single->link_type);
++ return -1;
++ }
++ expected_length = SIERRA_NET_LSI_UMTS_STATUS_LEN;
++ } else if (lsi->protocol == SIERRA_NET_PROTOCOL_UMTS_DS) {
++ expected_length = SIERRA_NET_LSI_UMTS_DS_STATUS_LEN;
++ } else {
+ netdev_err(dev->net, "Protocol unsupported, 0x%02x\n",
+- lsi->protocol);
++ lsi->protocol);
+ return -1;
+ }
+
+- /* Validate the link type */
+- if (lsi->link_type != SIERRA_NET_AS_LINK_TYPE_IPv4) {
+- netdev_err(dev->net, "Link type unsupported: 0x%02x\n",
+- lsi->link_type);
++ if (be16_to_cpu(lsi->length) != expected_length) {
++ netdev_err(dev->net, "%s: LSI_UMTS_STATUS_LEN %d, exp %u\n",
++ __func__, be16_to_cpu(lsi->length), expected_length);
+ return -1;
+ }
+
+ /* Validate the coverage */
+- if (lsi->coverage == SIERRA_NET_COVERAGE_NONE
+- || lsi->coverage == SIERRA_NET_COVERAGE_NOPACKET) {
++ if (lsi->coverage == SIERRA_NET_COVERAGE_NONE ||
++ lsi->coverage == SIERRA_NET_COVERAGE_NOPACKET) {
+ netdev_err(dev->net, "No coverage, 0x%02x\n", lsi->coverage);
+ return 0;
+ }
+@@ -662,7 +694,6 @@ static int sierra_net_bind(struct usbnet
+ u8 numendpoints;
+ u16 fwattr = 0;
+ int status;
+- struct ethhdr *eth;
+ struct sierra_net_data *priv;
+ static const u8 sync_tmplate[sizeof(priv->sync_msg)] = {
+ 0x00, 0x00, SIERRA_NET_HIP_MSYNC_ID, 0x00};
+@@ -700,11 +731,6 @@ static int sierra_net_bind(struct usbnet
+ dev->net->dev_addr[ETH_ALEN-2] = atomic_inc_return(&iface_counter);
+ dev->net->dev_addr[ETH_ALEN-1] = ifacenum;
+
+- /* we will have to manufacture ethernet headers, prepare template */
+- eth = (struct ethhdr *)priv->ethr_hdr_tmpl;
+- memcpy(ð->h_dest, dev->net->dev_addr, ETH_ALEN);
+- eth->h_proto = cpu_to_be16(ETH_P_IP);
+-
+ /* prepare shutdown message template */
+ memcpy(priv->shdwn_msg, shdwn_tmplate, sizeof(priv->shdwn_msg));
+ /* set context index initially to 0 - prepares tx hdr template */
+@@ -833,9 +859,14 @@ static int sierra_net_rx_fixup(struct us
+
+ skb_pull(skb, hh.hdrlen);
+
+- /* We are going to accept this packet, prepare it */
+- memcpy(skb->data, sierra_net_get_private(dev)->ethr_hdr_tmpl,
+- ETH_HLEN);
++ /* We are going to accept this packet, prepare it.
++ * In case protocol is IPv6, keep it, otherwise force IPv4.
++ */
++ skb_reset_mac_header(skb);
++ if (eth_hdr(skb)->h_proto != cpu_to_be16(ETH_P_IPV6))
++ eth_hdr(skb)->h_proto = cpu_to_be16(ETH_P_IP);
++ eth_zero_addr(eth_hdr(skb)->h_source);
++ memcpy(eth_hdr(skb)->h_dest, dev->net->dev_addr, ETH_ALEN);
+
+ /* Last packet in batch handled by usbnet */
+ if (hh.payload_len.word == skb->len)
--- /dev/null
+From foo@baz Thu Jun 15 11:13:01 CEST 2017
+From: Stefan Brüns <stefan.bruens@rwth-aachen.de>
+Date: Tue, 23 May 2017 21:53:42 -0400
+Subject: sierra_net: Skip validating irrelevant fields for IDLE LSIs
+
+From: Stefan Brüns <stefan.bruens@rwth-aachen.de>
+
+
+[ Upstream commit 764895d3039e903dac3a70f219949efe43d036a0 ]
+
+When the context is deactivated, the link_type is set to 0xff, which
+triggers a warning message, and results in a wrong link status, as
+the LSI is ignored.
+
+Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/usb/sierra_net.c | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+--- a/drivers/net/usb/sierra_net.c
++++ b/drivers/net/usb/sierra_net.c
+@@ -365,6 +365,13 @@ static int sierra_net_parse_lsi(struct u
+ return -1;
+ }
+
++ /* Validate the session state */
++ if (lsi->session_state == SIERRA_NET_SESSION_IDLE) {
++ netdev_err(dev->net, "Session idle, 0x%02x\n",
++ lsi->session_state);
++ return 0;
++ }
++
+ /* Validate the protocol - only support UMTS for now */
+ if (lsi->protocol != SIERRA_NET_PROTOCOL_UMTS) {
+ netdev_err(dev->net, "Protocol unsupported, 0x%02x\n",
+@@ -386,13 +393,6 @@ static int sierra_net_parse_lsi(struct u
+ return 0;
+ }
+
+- /* Validate the session state */
+- if (lsi->session_state == SIERRA_NET_SESSION_IDLE) {
+- netdev_err(dev->net, "Session idle, 0x%02x\n",
+- lsi->session_state);
+- return 0;
+- }
+-
+ /* Set link_sense true */
+ return 1;
+ }