kernel: bump 4.9 to 4.9.116
Refreshed all patches Remove upstreamed patches. - 103-MIPS-ath79-fix-register-address-in-ath79_ddr_wb_flus.patch - 403-mtd_fix_cfi_cmdset_0002_status_check.patch - 001-4.11-01-mtd-m25p80-consider-max-message-size-in-m25p80_read.patch - 001-4.15-08-bcm63xx_enet-correct-clock-usage.patch - 001-4.15-09-bcm63xx_enet-do-not-write-to-random-DMA-channel-on-B.patch - 900-gen_stats-fix-netlink-stats-padding.patch Introduce a new backported patch to address ext4 breakage, introduced in 4.9.112 - backport-4.9/500-ext4-fix-check-to-prevent-initializing-reserved-inod.patch This patch has been slightly altered to compensate for a new helper function introduced in later kernels. Also add ARM64_SSBD symbol to ARM64 targets still running kernel 4.9 Compile-tested on: ar71xx, bcm2710 Runtime-tested on: ar71xx Signed-off-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
This commit is contained in:
		
							parent
							
								
									d0e0b7049f
								
							
						
					
					
						commit
						fec8fe8069
					
				@ -4,12 +4,12 @@ LINUX_RELEASE?=1
 | 
			
		||||
 | 
			
		||||
LINUX_VERSION-3.18 = .71
 | 
			
		||||
LINUX_VERSION-4.4 = .121
 | 
			
		||||
LINUX_VERSION-4.9 = .111
 | 
			
		||||
LINUX_VERSION-4.9 = .116
 | 
			
		||||
LINUX_VERSION-4.14 = .59
 | 
			
		||||
 | 
			
		||||
LINUX_KERNEL_HASH-3.18.71 = 5abc9778ad44ce02ed6c8ab52ece8a21c6d20d21f6ed8a19287b4a38a50c1240
 | 
			
		||||
LINUX_KERNEL_HASH-4.4.121 = 44a88268b5088dc326b30c9b9133ac35a9a200b636b7268d08f32abeae6ca729
 | 
			
		||||
LINUX_KERNEL_HASH-4.9.111 = 5966558959dc580f163766f3fdefd7e57c01b2b45d51202d00b3807c253759dd
 | 
			
		||||
LINUX_KERNEL_HASH-4.9.116 = 999e8291bec0bcef2e0b91b6d58d8be5eb5e7c70881df59439364b22b693ff1d
 | 
			
		||||
LINUX_KERNEL_HASH-4.14.59 = 7ec633c661bba941239e340bb35391d356eda541fb4c323d07034d09d05b319b
 | 
			
		||||
 | 
			
		||||
remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1))))
 | 
			
		||||
 | 
			
		||||
@ -1,23 +0,0 @@
 | 
			
		||||
From: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
Date: Wed, 18 May 2016 18:03:31 +0200
 | 
			
		||||
Subject: [PATCH] MIPS: ath79: fix register address in ath79_ddr_wb_flush()
 | 
			
		||||
 | 
			
		||||
ath79_ddr_wb_flush_base has the type void __iomem *, so register offsets
 | 
			
		||||
need to be a multiple of 4.
 | 
			
		||||
 | 
			
		||||
Cc: Alban Bedel <albeu@free.fr>
 | 
			
		||||
Fixes: 24b0e3e84fbf ("MIPS: ath79: Improve the DDR controller interface")
 | 
			
		||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
--- a/arch/mips/ath79/common.c
 | 
			
		||||
+++ b/arch/mips/ath79/common.c
 | 
			
		||||
@@ -58,7 +58,7 @@ EXPORT_SYMBOL_GPL(ath79_ddr_ctrl_init);
 | 
			
		||||
 
 | 
			
		||||
 void ath79_ddr_wb_flush(u32 reg)
 | 
			
		||||
 {
 | 
			
		||||
-	void __iomem *flush_reg = ath79_ddr_wb_flush_base + reg;
 | 
			
		||||
+	void __iomem *flush_reg = ath79_ddr_wb_flush_base + reg * 4;
 | 
			
		||||
 
 | 
			
		||||
 	/* Flush the DDR write buffer. */
 | 
			
		||||
 	__raw_writel(0x1, flush_reg);
 | 
			
		||||
@ -1,69 +0,0 @@
 | 
			
		||||
--- a/drivers/mtd/chips/cfi_cmdset_0002.c
 | 
			
		||||
+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
 | 
			
		||||
@@ -1631,8 +1631,8 @@ static int __xipram do_write_oneword(str
 | 
			
		||||
 			break;
 | 
			
		||||
 		}
 | 
			
		||||
 
 | 
			
		||||
-		if (chip_ready(map, adr))
 | 
			
		||||
-			break;
 | 
			
		||||
+		if (chip_good(map, adr, datum))
 | 
			
		||||
+			goto enable_xip;
 | 
			
		||||
 
 | 
			
		||||
 		/* Latency issues. Drop the lock, wait a while and retry */
 | 
			
		||||
 		UDELAY(map, chip, adr, 1);
 | 
			
		||||
@@ -1648,6 +1648,8 @@ static int __xipram do_write_oneword(str
 | 
			
		||||
 
 | 
			
		||||
 		ret = -EIO;
 | 
			
		||||
 	}
 | 
			
		||||
+
 | 
			
		||||
+ enable_xip:
 | 
			
		||||
 	xip_enable(map, chip, adr);
 | 
			
		||||
  op_done:
 | 
			
		||||
 	if (mode == FL_OTP_WRITE)
 | 
			
		||||
@@ -2226,7 +2228,6 @@ static int cfi_amdstd_panic_write(struct
 | 
			
		||||
 	return 0;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-
 | 
			
		||||
 /*
 | 
			
		||||
  * Handle devices with one erase region, that only implement
 | 
			
		||||
  * the chip erase command.
 | 
			
		||||
@@ -2291,8 +2292,8 @@ static int __xipram do_erase_chip(struct
 | 
			
		||||
 			chip->erase_suspended = 0;
 | 
			
		||||
 		}
 | 
			
		||||
 
 | 
			
		||||
-		if (chip_ready(map, adr))
 | 
			
		||||
-			break;
 | 
			
		||||
+		if (chip_good(map, adr, map_word_ff(map)))
 | 
			
		||||
+			goto op_done;
 | 
			
		||||
 
 | 
			
		||||
 		if (time_after(jiffies, timeo)) {
 | 
			
		||||
 			printk(KERN_WARNING "MTD %s(): software timeout\n",
 | 
			
		||||
@@ -2312,6 +2313,7 @@ static int __xipram do_erase_chip(struct
 | 
			
		||||
 		ret = -EIO;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
+ op_done:
 | 
			
		||||
 	chip->state = FL_READY;
 | 
			
		||||
 	xip_enable(map, chip, adr);
 | 
			
		||||
 	DISABLE_VPP(map);
 | 
			
		||||
@@ -2381,9 +2383,9 @@ static int __xipram do_erase_oneblock(st
 | 
			
		||||
 			chip->erase_suspended = 0;
 | 
			
		||||
 		}
 | 
			
		||||
 
 | 
			
		||||
-		if (chip_ready(map, adr)) {
 | 
			
		||||
+		if (chip_good(map, adr, map_word_ff(map))) {
 | 
			
		||||
 			xip_enable(map, chip, adr);
 | 
			
		||||
-			break;
 | 
			
		||||
+			goto op_done;
 | 
			
		||||
 		}
 | 
			
		||||
 
 | 
			
		||||
 		if (time_after(jiffies, timeo)) {
 | 
			
		||||
@@ -2405,6 +2407,7 @@ static int __xipram do_erase_oneblock(st
 | 
			
		||||
 		ret = -EIO;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
+ op_done:
 | 
			
		||||
 	chip->state = FL_READY;
 | 
			
		||||
 	DISABLE_VPP(map);
 | 
			
		||||
 	put_chip(map, chip, adr);
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
--- a/drivers/mtd/devices/m25p80.c
 | 
			
		||||
+++ b/drivers/mtd/devices/m25p80.c
 | 
			
		||||
@@ -194,6 +194,7 @@ static ssize_t m25p80_read(struct spi_no
 | 
			
		||||
@@ -195,6 +195,7 @@ static ssize_t m25p80_read(struct spi_no
 | 
			
		||||
  */
 | 
			
		||||
 static int m25p_probe(struct spi_device *spi)
 | 
			
		||||
 {
 | 
			
		||||
@ -8,7 +8,7 @@
 | 
			
		||||
 	struct flash_platform_data	*data;
 | 
			
		||||
 	struct m25p *flash;
 | 
			
		||||
 	struct spi_nor *nor;
 | 
			
		||||
@@ -246,8 +247,11 @@ static int m25p_probe(struct spi_device
 | 
			
		||||
@@ -247,8 +248,11 @@ static int m25p_probe(struct spi_device
 | 
			
		||||
 	if (ret)
 | 
			
		||||
 		return ret;
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
--- a/drivers/mtd/redboot.c
 | 
			
		||||
+++ b/drivers/mtd/redboot.c
 | 
			
		||||
@@ -76,12 +76,18 @@ static int parse_redboot_partitions(stru
 | 
			
		||||
@@ -77,12 +77,18 @@ static int parse_redboot_partitions(stru
 | 
			
		||||
 	static char nullstring[] = "unallocated";
 | 
			
		||||
 #endif
 | 
			
		||||
 
 | 
			
		||||
@ -19,7 +19,7 @@
 | 
			
		||||
 				return -EIO;
 | 
			
		||||
 			}
 | 
			
		||||
 			offset -= master->erasesize;
 | 
			
		||||
@@ -94,10 +100,6 @@ static int parse_redboot_partitions(stru
 | 
			
		||||
@@ -95,10 +101,6 @@ static int parse_redboot_partitions(stru
 | 
			
		||||
 				goto nogood;
 | 
			
		||||
 		}
 | 
			
		||||
 	}
 | 
			
		||||
@ -30,7 +30,7 @@
 | 
			
		||||
 
 | 
			
		||||
 	printk(KERN_NOTICE "Searching for RedBoot partition table in %s at offset 0x%lx\n",
 | 
			
		||||
 	       master->name, offset);
 | 
			
		||||
@@ -170,6 +172,11 @@ static int parse_redboot_partitions(stru
 | 
			
		||||
@@ -171,6 +173,11 @@ static int parse_redboot_partitions(stru
 | 
			
		||||
 	}
 | 
			
		||||
 	if (i == numslots) {
 | 
			
		||||
 		/* Didn't find it */
 | 
			
		||||
 | 
			
		||||
@ -7,7 +7,7 @@
 | 
			
		||||
-#define FORCE_WORD_WRITE 0
 | 
			
		||||
+#define FORCE_WORD_WRITE 1
 | 
			
		||||
 
 | 
			
		||||
 #define MAX_WORD_RETRIES 3
 | 
			
		||||
 #define MAX_RETRIES 3
 | 
			
		||||
 
 | 
			
		||||
@@ -51,7 +51,9 @@
 | 
			
		||||
 
 | 
			
		||||
@ -35,7 +35,7 @@
 | 
			
		||||
 
 | 
			
		||||
 /* Atmel chips don't use the same PRI format as AMD chips */
 | 
			
		||||
 static void fixup_convert_atmel_pri(struct mtd_info *mtd)
 | 
			
		||||
@@ -1790,6 +1794,7 @@ static int cfi_amdstd_write_words(struct
 | 
			
		||||
@@ -1788,6 +1792,7 @@ static int cfi_amdstd_write_words(struct
 | 
			
		||||
 /*
 | 
			
		||||
  * FIXME: interleaved mode not tested, and probably not supported!
 | 
			
		||||
  */
 | 
			
		||||
@ -43,7 +43,7 @@
 | 
			
		||||
 static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip,
 | 
			
		||||
 				    unsigned long adr, const u_char *buf,
 | 
			
		||||
 				    int len)
 | 
			
		||||
@@ -1918,7 +1923,6 @@ static int __xipram do_write_buffer(stru
 | 
			
		||||
@@ -1916,7 +1921,6 @@ static int __xipram do_write_buffer(stru
 | 
			
		||||
 	return ret;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@ -51,7 +51,7 @@
 | 
			
		||||
 static int cfi_amdstd_write_buffers(struct mtd_info *mtd, loff_t to, size_t len,
 | 
			
		||||
 				    size_t *retlen, const u_char *buf)
 | 
			
		||||
 {
 | 
			
		||||
@@ -1993,6 +1997,7 @@ static int cfi_amdstd_write_buffers(stru
 | 
			
		||||
@@ -1991,6 +1995,7 @@ static int cfi_amdstd_write_buffers(stru
 | 
			
		||||
 
 | 
			
		||||
 	return 0;
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 #endif /* _PHY_AT803X_PDATA_H */
 | 
			
		||||
--- a/drivers/net/phy/at803x.c
 | 
			
		||||
+++ b/drivers/net/phy/at803x.c
 | 
			
		||||
@@ -264,6 +264,7 @@ static int at803x_resume(struct phy_devi
 | 
			
		||||
@@ -261,6 +261,7 @@ static int at803x_resume(struct phy_devi
 | 
			
		||||
 
 | 
			
		||||
 static int at803x_probe(struct phy_device *phydev)
 | 
			
		||||
 {
 | 
			
		||||
@ -24,7 +24,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 	struct device *dev = &phydev->mdio.dev;
 | 
			
		||||
 	struct at803x_priv *priv;
 | 
			
		||||
 	struct gpio_desc *gpiod_reset;
 | 
			
		||||
@@ -276,6 +277,12 @@ static int at803x_probe(struct phy_devic
 | 
			
		||||
@@ -273,6 +274,12 @@ static int at803x_probe(struct phy_devic
 | 
			
		||||
 	    phydev->drv->phy_id != ATH8032_PHY_ID)
 | 
			
		||||
 		goto does_not_require_reset_workaround;
 | 
			
		||||
 
 | 
			
		||||
@ -37,7 +37,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 	gpiod_reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
 | 
			
		||||
 	if (IS_ERR(gpiod_reset))
 | 
			
		||||
 		return PTR_ERR(gpiod_reset);
 | 
			
		||||
@@ -407,15 +414,23 @@ static void at803x_link_change_notify(st
 | 
			
		||||
@@ -404,15 +411,23 @@ static void at803x_link_change_notify(st
 | 
			
		||||
 	 * cannot recover from by software.
 | 
			
		||||
 	 */
 | 
			
		||||
 	if (phydev->state == PHY_NOLINK) {
 | 
			
		||||
 | 
			
		||||
@ -250,7 +250,7 @@
 | 
			
		||||
 					       &sin->sin6_addr);
 | 
			
		||||
 			sin->sin6_scope_id = 0;
 | 
			
		||||
 		}
 | 
			
		||||
@@ -814,12 +814,12 @@ int ip6_datagram_send_ctl(struct net *ne
 | 
			
		||||
@@ -817,12 +817,12 @@ int ip6_datagram_send_ctl(struct net *ne
 | 
			
		||||
 			}
 | 
			
		||||
 
 | 
			
		||||
 			if (fl6->flowlabel&IPV6_FLOWINFO_MASK) {
 | 
			
		||||
@ -327,7 +327,7 @@
 | 
			
		||||
 	return neigh_create(&arp_tbl, pkey, dev);
 | 
			
		||||
--- a/net/ipv4/tcp_output.c
 | 
			
		||||
+++ b/net/ipv4/tcp_output.c
 | 
			
		||||
@@ -448,48 +448,53 @@ static void tcp_options_write(__be32 *pt
 | 
			
		||||
@@ -453,48 +453,53 @@ static void tcp_options_write(__be32 *pt
 | 
			
		||||
 	u16 options = opts->options;	/* mungable copy */
 | 
			
		||||
 
 | 
			
		||||
 	if (unlikely(OPTION_MD5 & options)) {
 | 
			
		||||
@ -404,7 +404,7 @@
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	if (unlikely(opts->num_sack_blocks)) {
 | 
			
		||||
@@ -497,16 +502,17 @@ static void tcp_options_write(__be32 *pt
 | 
			
		||||
@@ -502,16 +507,17 @@ static void tcp_options_write(__be32 *pt
 | 
			
		||||
 			tp->duplicate_sack : tp->selective_acks;
 | 
			
		||||
 		int this_sack;
 | 
			
		||||
 
 | 
			
		||||
@ -428,7 +428,7 @@
 | 
			
		||||
 		}
 | 
			
		||||
 
 | 
			
		||||
 		tp->rx_opt.dsack = 0;
 | 
			
		||||
@@ -519,13 +525,14 @@ static void tcp_options_write(__be32 *pt
 | 
			
		||||
@@ -524,13 +530,14 @@ static void tcp_options_write(__be32 *pt
 | 
			
		||||
 
 | 
			
		||||
 		if (foc->exp) {
 | 
			
		||||
 			len = TCPOLEN_EXP_FASTOPEN_BASE + foc->len;
 | 
			
		||||
@ -795,7 +795,7 @@
 | 
			
		||||
 
 | 
			
		||||
--- a/net/ipv4/tcp_input.c
 | 
			
		||||
+++ b/net/ipv4/tcp_input.c
 | 
			
		||||
@@ -3896,14 +3896,16 @@ static bool tcp_parse_aligned_timestamp(
 | 
			
		||||
@@ -3906,14 +3906,16 @@ static bool tcp_parse_aligned_timestamp(
 | 
			
		||||
 {
 | 
			
		||||
 	const __be32 *ptr = (const __be32 *)(th + 1);
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
@ -47,6 +47,7 @@ CONFIG_ARM64_PAGE_SHIFT=12
 | 
			
		||||
CONFIG_ARM64_PAN=y
 | 
			
		||||
# CONFIG_ARM64_PTDUMP is not set
 | 
			
		||||
# CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set
 | 
			
		||||
CONFIG_ARM64_SSBD=y
 | 
			
		||||
CONFIG_ARM64_UAO=y
 | 
			
		||||
CONFIG_ARM64_VA_BITS=39
 | 
			
		||||
CONFIG_ARM64_VA_BITS_39=y
 | 
			
		||||
 | 
			
		||||
@ -9,7 +9,7 @@ Subject: [PATCH] kbuild: Ignore dtco targets when filtering symbols
 | 
			
		||||
 | 
			
		||||
--- a/scripts/Kbuild.include
 | 
			
		||||
+++ b/scripts/Kbuild.include
 | 
			
		||||
@@ -284,7 +284,7 @@ ksym_dep_filter =
 | 
			
		||||
@@ -285,7 +285,7 @@ ksym_dep_filter =
 | 
			
		||||
 	    $(CPP) $(call flags_nodeps,c_flags) -D__KSYM_DEPS__ $< ;;        \
 | 
			
		||||
 	  as_*_S|cpp_s_S)                                                    \
 | 
			
		||||
 	    $(CPP) $(call flags_nodeps,a_flags) -D__KSYM_DEPS__ $< ;;        \
 | 
			
		||||
 | 
			
		||||
@ -696,7 +696,7 @@ Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
 | 
			
		||||
 }
 | 
			
		||||
--- a/drivers/usb/core/hub.c
 | 
			
		||||
+++ b/drivers/usb/core/hub.c
 | 
			
		||||
@@ -5064,7 +5064,7 @@ static void port_event(struct usb_hub *h
 | 
			
		||||
@@ -5068,7 +5068,7 @@ static void port_event(struct usb_hub *h
 | 
			
		||||
 	if (portchange & USB_PORT_STAT_C_OVERCURRENT) {
 | 
			
		||||
 		u16 status = 0, unused;
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
@ -28,10 +28,8 @@ w1-gpio: Sort out the pullup/parasitic power tangle
 | 
			
		||||
 include/linux/w1-gpio.h      |  1 +
 | 
			
		||||
 5 files changed, 99 insertions(+), 9 deletions(-)
 | 
			
		||||
 | 
			
		||||
Index: linux-4.9.111/drivers/w1/masters/w1-gpio.c
 | 
			
		||||
===================================================================
 | 
			
		||||
--- linux-4.9.111.orig/drivers/w1/masters/w1-gpio.c
 | 
			
		||||
+++ linux-4.9.111/drivers/w1/masters/w1-gpio.c
 | 
			
		||||
--- a/drivers/w1/masters/w1-gpio.c
 | 
			
		||||
+++ b/drivers/w1/masters/w1-gpio.c
 | 
			
		||||
@@ -23,6 +23,19 @@
 | 
			
		||||
 #include "../w1.h"
 | 
			
		||||
 #include "../w1_int.h"
 | 
			
		||||
@ -145,10 +143,8 @@ Index: linux-4.9.111/drivers/w1/masters/w1-gpio.c
 | 
			
		||||
 	return 0;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
Index: linux-4.9.111/drivers/w1/w1.h
 | 
			
		||||
===================================================================
 | 
			
		||||
--- linux-4.9.111.orig/drivers/w1/w1.h
 | 
			
		||||
+++ linux-4.9.111/drivers/w1/w1.h
 | 
			
		||||
--- a/drivers/w1/w1.h
 | 
			
		||||
+++ b/drivers/w1/w1.h
 | 
			
		||||
@@ -173,6 +173,12 @@ struct w1_bus_master
 | 
			
		||||
 
 | 
			
		||||
 	u8		(*set_pullup)(void *, int);
 | 
			
		||||
@ -162,10 +158,8 @@ Index: linux-4.9.111/drivers/w1/w1.h
 | 
			
		||||
 	void		(*search)(void *, struct w1_master *,
 | 
			
		||||
 		u8, w1_slave_found_callback);
 | 
			
		||||
 };
 | 
			
		||||
Index: linux-4.9.111/drivers/w1/w1_int.c
 | 
			
		||||
===================================================================
 | 
			
		||||
--- linux-4.9.111.orig/drivers/w1/w1_int.c
 | 
			
		||||
+++ linux-4.9.111/drivers/w1/w1_int.c
 | 
			
		||||
--- a/drivers/w1/w1_int.c
 | 
			
		||||
+++ b/drivers/w1/w1_int.c
 | 
			
		||||
@@ -122,6 +122,20 @@ int w1_add_master_device(struct w1_bus_m
 | 
			
		||||
 		return(-EINVAL);
 | 
			
		||||
 	}
 | 
			
		||||
@ -187,10 +181,8 @@ Index: linux-4.9.111/drivers/w1/w1_int.c
 | 
			
		||||
 	/* Lock until the device is added (or not) to w1_masters. */
 | 
			
		||||
 	mutex_lock(&w1_mlock);
 | 
			
		||||
 	/* Search for the first available id (starting at 1). */
 | 
			
		||||
Index: linux-4.9.111/drivers/w1/w1_io.c
 | 
			
		||||
===================================================================
 | 
			
		||||
--- linux-4.9.111.orig/drivers/w1/w1_io.c
 | 
			
		||||
+++ linux-4.9.111/drivers/w1/w1_io.c
 | 
			
		||||
--- a/drivers/w1/w1_io.c
 | 
			
		||||
+++ b/drivers/w1/w1_io.c
 | 
			
		||||
@@ -134,10 +134,22 @@ static void w1_pre_write(struct w1_maste
 | 
			
		||||
 static void w1_post_write(struct w1_master *dev)
 | 
			
		||||
 {
 | 
			
		||||
@ -217,10 +209,8 @@ Index: linux-4.9.111/drivers/w1/w1_io.c
 | 
			
		||||
 		dev->pullup_duration = 0;
 | 
			
		||||
 	}
 | 
			
		||||
 }
 | 
			
		||||
Index: linux-4.9.111/include/linux/w1-gpio.h
 | 
			
		||||
===================================================================
 | 
			
		||||
--- linux-4.9.111.orig/include/linux/w1-gpio.h
 | 
			
		||||
+++ linux-4.9.111/include/linux/w1-gpio.h
 | 
			
		||||
--- a/include/linux/w1-gpio.h
 | 
			
		||||
+++ b/include/linux/w1-gpio.h
 | 
			
		||||
@@ -18,6 +18,7 @@
 | 
			
		||||
 struct w1_gpio_platform_data {
 | 
			
		||||
 	unsigned int pin;
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
--- a/drivers/mtd/bcm47xxpart.c
 | 
			
		||||
+++ b/drivers/mtd/bcm47xxpart.c
 | 
			
		||||
@@ -102,6 +102,7 @@ static int bcm47xxpart_parse(struct mtd_
 | 
			
		||||
@@ -103,6 +103,7 @@ static int bcm47xxpart_parse(struct mtd_
 | 
			
		||||
 	int trx_num = 0; /* Number of found TRX partitions */
 | 
			
		||||
 	int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, };
 | 
			
		||||
 	int err;
 | 
			
		||||
@ -8,7 +8,7 @@
 | 
			
		||||
 
 | 
			
		||||
 	/*
 | 
			
		||||
 	 * Some really old flashes (like AT45DB*) had smaller erasesize-s, but
 | 
			
		||||
@@ -283,12 +284,23 @@ static int bcm47xxpart_parse(struct mtd_
 | 
			
		||||
@@ -284,12 +285,23 @@ static int bcm47xxpart_parse(struct mtd_
 | 
			
		||||
 		if (buf[0] == NVRAM_HEADER) {
 | 
			
		||||
 			bcm47xxpart_add_part(&parts[curr_part++], "nvram",
 | 
			
		||||
 					     master->size - blocksize, 0);
 | 
			
		||||
 | 
			
		||||
@ -1,30 +0,0 @@
 | 
			
		||||
From 80a79a889ce5df16c5261ab2f1e8e63b94b78102 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Heiner Kallweit <hkallweit1@gmail.com>
 | 
			
		||||
Date: Fri, 28 Oct 2016 07:58:46 +0200
 | 
			
		||||
Subject: [PATCH 1/8] mtd: m25p80: consider max message size in m25p80_read
 | 
			
		||||
 | 
			
		||||
Consider a message size limit when calculating the maximum amount
 | 
			
		||||
of data that can be read.
 | 
			
		||||
 | 
			
		||||
The message size limit has been introduced with 4.9, so cc it
 | 
			
		||||
to stable.
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
 | 
			
		||||
Cc: <stable@vger.kernel.org> # 4.9.x
 | 
			
		||||
Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com>
 | 
			
		||||
---
 | 
			
		||||
 drivers/mtd/devices/m25p80.c | 3 ++-
 | 
			
		||||
 1 file changed, 2 insertions(+), 1 deletion(-)
 | 
			
		||||
 | 
			
		||||
--- a/drivers/mtd/devices/m25p80.c
 | 
			
		||||
+++ b/drivers/mtd/devices/m25p80.c
 | 
			
		||||
@@ -174,7 +174,8 @@ static ssize_t m25p80_read(struct spi_no
 | 
			
		||||
 
 | 
			
		||||
 	t[1].rx_buf = buf;
 | 
			
		||||
 	t[1].rx_nbits = m25p80_rx_nbits(nor);
 | 
			
		||||
-	t[1].len = min(len, spi_max_transfer_size(spi));
 | 
			
		||||
+	t[1].len = min3(len, spi_max_transfer_size(spi),
 | 
			
		||||
+			spi_max_message_size(spi) - t[0].len);
 | 
			
		||||
 	spi_message_add_tail(&t[1], &m);
 | 
			
		||||
 
 | 
			
		||||
 	ret = spi_sync(spi, &m);
 | 
			
		||||
@ -1,101 +0,0 @@
 | 
			
		||||
From d0423d3e4fa7ae305729cb50369427f075ccb279 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Jonas Gorski <jonas.gorski@gmail.com>
 | 
			
		||||
Date: Sat, 25 Feb 2017 12:41:28 +0100
 | 
			
		||||
Subject: [PATCH 1/6] bcm63xx_enet: correct clock usage
 | 
			
		||||
 | 
			
		||||
Check the return code of prepare_enable and change one last instance of
 | 
			
		||||
enable only to prepare_enable. Also properly disable and release the
 | 
			
		||||
clock in error paths and on remove for enetsw.
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
 | 
			
		||||
---
 | 
			
		||||
 drivers/net/ethernet/broadcom/bcm63xx_enet.c | 31 +++++++++++++++++++++-------
 | 
			
		||||
 1 file changed, 23 insertions(+), 8 deletions(-)
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c
 | 
			
		||||
+++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c
 | 
			
		||||
@@ -1790,7 +1790,9 @@ static int bcm_enet_probe(struct platfor
 | 
			
		||||
 		ret = PTR_ERR(priv->mac_clk);
 | 
			
		||||
 		goto out;
 | 
			
		||||
 	}
 | 
			
		||||
-	clk_prepare_enable(priv->mac_clk);
 | 
			
		||||
+	ret = clk_prepare_enable(priv->mac_clk);
 | 
			
		||||
+	if (ret)
 | 
			
		||||
+		goto out_put_clk_mac;
 | 
			
		||||
 
 | 
			
		||||
 	/* initialize default and fetch platform data */
 | 
			
		||||
 	priv->rx_ring_size = BCMENET_DEF_RX_DESC;
 | 
			
		||||
@@ -1822,9 +1824,11 @@ static int bcm_enet_probe(struct platfor
 | 
			
		||||
 		if (IS_ERR(priv->phy_clk)) {
 | 
			
		||||
 			ret = PTR_ERR(priv->phy_clk);
 | 
			
		||||
 			priv->phy_clk = NULL;
 | 
			
		||||
-			goto out_put_clk_mac;
 | 
			
		||||
+			goto out_disable_clk_mac;
 | 
			
		||||
 		}
 | 
			
		||||
-		clk_prepare_enable(priv->phy_clk);
 | 
			
		||||
+		ret = clk_prepare_enable(priv->phy_clk);
 | 
			
		||||
+		if (ret)
 | 
			
		||||
+			goto out_put_clk_phy;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	/* do minimal hardware init to be able to probe mii bus */
 | 
			
		||||
@@ -1915,13 +1919,16 @@ out_free_mdio:
 | 
			
		||||
 out_uninit_hw:
 | 
			
		||||
 	/* turn off mdc clock */
 | 
			
		||||
 	enet_writel(priv, 0, ENET_MIISC_REG);
 | 
			
		||||
-	if (priv->phy_clk) {
 | 
			
		||||
+	if (priv->phy_clk)
 | 
			
		||||
 		clk_disable_unprepare(priv->phy_clk);
 | 
			
		||||
+
 | 
			
		||||
+out_put_clk_phy:
 | 
			
		||||
+	if (priv->phy_clk)
 | 
			
		||||
 		clk_put(priv->phy_clk);
 | 
			
		||||
-	}
 | 
			
		||||
 
 | 
			
		||||
-out_put_clk_mac:
 | 
			
		||||
+out_disable_clk_mac:
 | 
			
		||||
 	clk_disable_unprepare(priv->mac_clk);
 | 
			
		||||
+out_put_clk_mac:
 | 
			
		||||
 	clk_put(priv->mac_clk);
 | 
			
		||||
 out:
 | 
			
		||||
 	free_netdev(dev);
 | 
			
		||||
@@ -2766,7 +2773,9 @@ static int bcm_enetsw_probe(struct platf
 | 
			
		||||
 		ret = PTR_ERR(priv->mac_clk);
 | 
			
		||||
 		goto out_unmap;
 | 
			
		||||
 	}
 | 
			
		||||
-	clk_enable(priv->mac_clk);
 | 
			
		||||
+	ret = clk_prepare_enable(priv->mac_clk);
 | 
			
		||||
+	if (ret)
 | 
			
		||||
+		goto out_put_clk;
 | 
			
		||||
 
 | 
			
		||||
 	priv->rx_chan = 0;
 | 
			
		||||
 	priv->tx_chan = 1;
 | 
			
		||||
@@ -2787,7 +2796,7 @@ static int bcm_enetsw_probe(struct platf
 | 
			
		||||
 
 | 
			
		||||
 	ret = register_netdev(dev);
 | 
			
		||||
 	if (ret)
 | 
			
		||||
-		goto out_put_clk;
 | 
			
		||||
+		goto out_disable_clk;
 | 
			
		||||
 
 | 
			
		||||
 	netif_carrier_off(dev);
 | 
			
		||||
 	platform_set_drvdata(pdev, dev);
 | 
			
		||||
@@ -2796,6 +2805,9 @@ static int bcm_enetsw_probe(struct platf
 | 
			
		||||
 
 | 
			
		||||
 	return 0;
 | 
			
		||||
 
 | 
			
		||||
+out_disable_clk:
 | 
			
		||||
+	clk_disable_unprepare(priv->mac_clk);
 | 
			
		||||
+
 | 
			
		||||
 out_put_clk:
 | 
			
		||||
 	clk_put(priv->mac_clk);
 | 
			
		||||
 
 | 
			
		||||
@@ -2827,6 +2839,9 @@ static int bcm_enetsw_remove(struct plat
 | 
			
		||||
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 | 
			
		||||
 	release_mem_region(res->start, resource_size(res));
 | 
			
		||||
 
 | 
			
		||||
+	clk_disable_unprepare(priv->mac_clk);
 | 
			
		||||
+	clk_put(priv->mac_clk);
 | 
			
		||||
+
 | 
			
		||||
 	free_netdev(dev);
 | 
			
		||||
 	return 0;
 | 
			
		||||
 }
 | 
			
		||||
@ -1,29 +0,0 @@
 | 
			
		||||
From 23d94cb855b6f4f0ee1c01679224472104ac6440 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Jonas Gorski <jonas.gorski@gmail.com>
 | 
			
		||||
Date: Sat, 30 Sep 2017 14:10:18 +0200
 | 
			
		||||
Subject: [PATCH 2/6] bcm63xx_enet: do not write to random DMA channel on
 | 
			
		||||
 BCM6345
 | 
			
		||||
 | 
			
		||||
The DMA controller regs actually point to DMA channel 0, so the write to
 | 
			
		||||
ENETDMA_CFG_REG will actually modify a random DMA channel.
 | 
			
		||||
 | 
			
		||||
Since DMA controller registers do not exist on BCM6345, guard the write
 | 
			
		||||
with the usual check for dma_has_sram.
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
 | 
			
		||||
---
 | 
			
		||||
 drivers/net/ethernet/broadcom/bcm63xx_enet.c | 3 ++-
 | 
			
		||||
 1 file changed, 2 insertions(+), 1 deletion(-)
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c
 | 
			
		||||
+++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c
 | 
			
		||||
@@ -1063,7 +1063,8 @@ static int bcm_enet_open(struct net_devi
 | 
			
		||||
 	val = enet_readl(priv, ENET_CTL_REG);
 | 
			
		||||
 	val |= ENET_CTL_ENABLE_MASK;
 | 
			
		||||
 	enet_writel(priv, val, ENET_CTL_REG);
 | 
			
		||||
-	enet_dma_writel(priv, ENETDMA_CFG_EN_MASK, ENETDMA_CFG_REG);
 | 
			
		||||
+	if (priv->dma_has_sram)
 | 
			
		||||
+		enet_dma_writel(priv, ENETDMA_CFG_EN_MASK, ENETDMA_CFG_REG);
 | 
			
		||||
 	enet_dmac_writel(priv, priv->dma_chan_en_mask,
 | 
			
		||||
 			 ENETDMAC_CHANCFG, priv->rx_chan);
 | 
			
		||||
 
 | 
			
		||||
@ -23,7 +23,7 @@ Signed-off-by: Axel Gembe <ago@bastart.eu.org>
 | 
			
		||||
 	.width			= 2,
 | 
			
		||||
--- a/drivers/mtd/redboot.c
 | 
			
		||||
+++ b/drivers/mtd/redboot.c
 | 
			
		||||
@@ -72,6 +72,7 @@ static int parse_redboot_partitions(stru
 | 
			
		||||
@@ -73,6 +73,7 @@ static int parse_redboot_partitions(stru
 | 
			
		||||
 	int nulllen = 0;
 | 
			
		||||
 	int numslots;
 | 
			
		||||
 	unsigned long offset;
 | 
			
		||||
@ -31,7 +31,7 @@ Signed-off-by: Axel Gembe <ago@bastart.eu.org>
 | 
			
		||||
 #ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
 | 
			
		||||
 	static char nullstring[] = "unallocated";
 | 
			
		||||
 #endif
 | 
			
		||||
@@ -176,6 +177,16 @@ static int parse_redboot_partitions(stru
 | 
			
		||||
@@ -177,6 +178,16 @@ static int parse_redboot_partitions(stru
 | 
			
		||||
 		goto out;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
@ -48,7 +48,7 @@ Signed-off-by: Axel Gembe <ago@bastart.eu.org>
 | 
			
		||||
 	for (i = 0; i < numslots; i++) {
 | 
			
		||||
 		struct fis_list *new_fl, **prev;
 | 
			
		||||
 
 | 
			
		||||
@@ -196,10 +207,10 @@ static int parse_redboot_partitions(stru
 | 
			
		||||
@@ -197,10 +208,10 @@ static int parse_redboot_partitions(stru
 | 
			
		||||
 			goto out;
 | 
			
		||||
 		}
 | 
			
		||||
 		new_fl->img = &buf[i];
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
 | 
			
		||||
+++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
 | 
			
		||||
@@ -2457,6 +2457,56 @@
 | 
			
		||||
@@ -2642,6 +2642,56 @@ static struct board_info __initdata boar
 | 
			
		||||
 		},
 | 
			
		||||
 	},
 | 
			
		||||
 };
 | 
			
		||||
@ -57,7 +57,7 @@
 | 
			
		||||
 #endif /* CONFIG_BCM63XX_CPU_63268 */
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
@@ -2557,6 +2609,7 @@
 | 
			
		||||
@@ -2750,6 +2800,7 @@ static const struct board_info __initcon
 | 
			
		||||
 	&board_963268bu_p300,
 | 
			
		||||
 	&board_963269bhr,
 | 
			
		||||
 	&board_vw6339gu,
 | 
			
		||||
@ -65,7 +65,7 @@
 | 
			
		||||
 #endif
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
@@ -2661,6 +2714,7 @@
 | 
			
		||||
@@ -2862,6 +2913,7 @@ static struct of_device_id const bcm963x
 | 
			
		||||
 	{ .compatible = "brcm,bcm963268bu_p300", .data = &board_963268bu_p300, },
 | 
			
		||||
 	{ .compatible = "brcm,bcm963269bhr", .data = &board_963269bhr, },
 | 
			
		||||
 	{ .compatible = "inteno,vg50", .data = &board_vw6339gu, },
 | 
			
		||||
 | 
			
		||||
@ -84,7 +84,7 @@ Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
 | 
			
		||||
 | 
			
		||||
--- a/include/linux/compiler-gcc.h
 | 
			
		||||
+++ b/include/linux/compiler-gcc.h
 | 
			
		||||
@@ -315,3 +315,28 @@
 | 
			
		||||
@@ -334,3 +334,28 @@
 | 
			
		||||
  * code
 | 
			
		||||
  */
 | 
			
		||||
 #define uninitialized_var(x) x = x
 | 
			
		||||
 | 
			
		||||
@ -45,7 +45,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 	return (struct tcp_sock *)sk;
 | 
			
		||||
--- a/net/ipv4/tcp_output.c
 | 
			
		||||
+++ b/net/ipv4/tcp_output.c
 | 
			
		||||
@@ -784,10 +784,10 @@ static void tcp_tasklet_func(unsigned lo
 | 
			
		||||
@@ -789,10 +789,10 @@ static void tcp_tasklet_func(unsigned lo
 | 
			
		||||
 	}
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@ -60,7 +60,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 /**
 | 
			
		||||
  * tcp_release_cb - tcp release_sock() callback
 | 
			
		||||
  * @sk: socket
 | 
			
		||||
@@ -808,7 +808,7 @@ void tcp_release_cb(struct sock *sk)
 | 
			
		||||
@@ -813,7 +813,7 @@ void tcp_release_cb(struct sock *sk)
 | 
			
		||||
 		nflags = flags & ~TCP_DEFERRED_ALL;
 | 
			
		||||
 	} while (cmpxchg(&tp->tsq_flags, flags, nflags) != flags);
 | 
			
		||||
 
 | 
			
		||||
@ -69,7 +69,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 		tcp_tsq_handler(sk);
 | 
			
		||||
 
 | 
			
		||||
 	/* Here begins the tricky part :
 | 
			
		||||
@@ -822,15 +822,15 @@ void tcp_release_cb(struct sock *sk)
 | 
			
		||||
@@ -827,15 +827,15 @@ void tcp_release_cb(struct sock *sk)
 | 
			
		||||
 	 */
 | 
			
		||||
 	sock_release_ownership(sk);
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 | 
			
		||||
--- a/net/ipv4/tcp_output.c
 | 
			
		||||
+++ b/net/ipv4/tcp_output.c
 | 
			
		||||
@@ -860,6 +860,7 @@ void tcp_wfree(struct sk_buff *skb)
 | 
			
		||||
@@ -865,6 +865,7 @@ void tcp_wfree(struct sk_buff *skb)
 | 
			
		||||
 {
 | 
			
		||||
 	struct sock *sk = skb->sk;
 | 
			
		||||
 	struct tcp_sock *tp = tcp_sk(sk);
 | 
			
		||||
@ -25,7 +25,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 	int wmem;
 | 
			
		||||
 
 | 
			
		||||
 	/* Keep one reference on sk_wmem_alloc.
 | 
			
		||||
@@ -877,11 +878,17 @@ void tcp_wfree(struct sk_buff *skb)
 | 
			
		||||
@@ -882,11 +883,17 @@ void tcp_wfree(struct sk_buff *skb)
 | 
			
		||||
 	if (wmem >= SKB_TRUESIZE(1) && this_cpu_ksoftirqd() == current)
 | 
			
		||||
 		goto out;
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
@ -22,7 +22,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 | 
			
		||||
--- a/net/ipv4/tcp_output.c
 | 
			
		||||
+++ b/net/ipv4/tcp_output.c
 | 
			
		||||
@@ -767,19 +767,19 @@ static void tcp_tasklet_func(unsigned lo
 | 
			
		||||
@@ -772,19 +772,19 @@ static void tcp_tasklet_func(unsigned lo
 | 
			
		||||
 	list_for_each_safe(q, n, &list) {
 | 
			
		||||
 		tp = list_entry(q, struct tcp_sock, tsq_node);
 | 
			
		||||
 		list_del(&tp->tsq_node);
 | 
			
		||||
@ -51,7 +51,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 		sk_free(sk);
 | 
			
		||||
 	}
 | 
			
		||||
 }
 | 
			
		||||
@@ -884,7 +884,7 @@ void tcp_wfree(struct sk_buff *skb)
 | 
			
		||||
@@ -889,7 +889,7 @@ void tcp_wfree(struct sk_buff *skb)
 | 
			
		||||
 		if (!(oval & TSQF_THROTTLED) || (oval & TSQF_QUEUED))
 | 
			
		||||
 			goto out;
 | 
			
		||||
 
 | 
			
		||||
@ -60,7 +60,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 		nval = cmpxchg(&tp->tsq_flags, oval, nval);
 | 
			
		||||
 		if (nval != oval)
 | 
			
		||||
 			continue;
 | 
			
		||||
@@ -2210,6 +2210,8 @@ static bool tcp_write_xmit(struct sock *
 | 
			
		||||
@@ -2222,6 +2222,8 @@ static bool tcp_write_xmit(struct sock *
 | 
			
		||||
 		    unlikely(tso_fragment(sk, skb, limit, mss_now, gfp)))
 | 
			
		||||
 			break;
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 | 
			
		||||
--- a/net/ipv4/tcp_output.c
 | 
			
		||||
+++ b/net/ipv4/tcp_output.c
 | 
			
		||||
@@ -880,6 +880,7 @@ void tcp_wfree(struct sk_buff *skb)
 | 
			
		||||
@@ -885,6 +885,7 @@ void tcp_wfree(struct sk_buff *skb)
 | 
			
		||||
 
 | 
			
		||||
 	for (oval = READ_ONCE(tp->tsq_flags);; oval = nval) {
 | 
			
		||||
 		struct tsq_tasklet *tsq;
 | 
			
		||||
@ -24,7 +24,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 
 | 
			
		||||
 		if (!(oval & TSQF_THROTTLED) || (oval & TSQF_QUEUED))
 | 
			
		||||
 			goto out;
 | 
			
		||||
@@ -892,8 +893,10 @@ void tcp_wfree(struct sk_buff *skb)
 | 
			
		||||
@@ -897,8 +898,10 @@ void tcp_wfree(struct sk_buff *skb)
 | 
			
		||||
 		/* queue this socket to tasklet queue */
 | 
			
		||||
 		local_irq_save(flags);
 | 
			
		||||
 		tsq = this_cpu_ptr(&tsq_tasklet);
 | 
			
		||||
 | 
			
		||||
@ -19,7 +19,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 | 
			
		||||
--- a/net/ipv4/tcp_output.c
 | 
			
		||||
+++ b/net/ipv4/tcp_output.c
 | 
			
		||||
@@ -2115,6 +2115,15 @@ static bool tcp_small_queue_check(struct
 | 
			
		||||
@@ -2127,6 +2127,15 @@ static bool tcp_small_queue_check(struct
 | 
			
		||||
 	limit <<= factor;
 | 
			
		||||
 
 | 
			
		||||
 	if (atomic_read(&sk->sk_wmem_alloc) > limit) {
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 | 
			
		||||
--- a/net/ipv4/tcp_output.c
 | 
			
		||||
+++ b/net/ipv4/tcp_output.c
 | 
			
		||||
@@ -1948,26 +1948,26 @@ static bool tcp_can_coalesce_send_queue_
 | 
			
		||||
@@ -1960,26 +1960,26 @@ static bool tcp_can_coalesce_send_queue_
 | 
			
		||||
  */
 | 
			
		||||
 static int tcp_mtu_probe(struct sock *sk)
 | 
			
		||||
 {
 | 
			
		||||
 | 
			
		||||
@ -58,7 +58,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 			goto out;
 | 
			
		||||
--- a/net/ipv4/tcp_output.c
 | 
			
		||||
+++ b/net/ipv4/tcp_output.c
 | 
			
		||||
@@ -767,14 +767,15 @@ static void tcp_tasklet_func(unsigned lo
 | 
			
		||||
@@ -772,14 +772,15 @@ static void tcp_tasklet_func(unsigned lo
 | 
			
		||||
 	list_for_each_safe(q, n, &list) {
 | 
			
		||||
 		tp = list_entry(q, struct tcp_sock, tsq_node);
 | 
			
		||||
 		list_del(&tp->tsq_node);
 | 
			
		||||
@ -77,7 +77,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 				tcp_tsq_handler(sk);
 | 
			
		||||
 			}
 | 
			
		||||
 			bh_unlock_sock(sk);
 | 
			
		||||
@@ -797,16 +798,15 @@ static void tcp_tasklet_func(unsigned lo
 | 
			
		||||
@@ -802,16 +803,15 @@ static void tcp_tasklet_func(unsigned lo
 | 
			
		||||
  */
 | 
			
		||||
 void tcp_release_cb(struct sock *sk)
 | 
			
		||||
 {
 | 
			
		||||
@ -96,7 +96,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 
 | 
			
		||||
 	if (flags & TCPF_TSQ_DEFERRED)
 | 
			
		||||
 		tcp_tsq_handler(sk);
 | 
			
		||||
@@ -878,7 +878,7 @@ void tcp_wfree(struct sk_buff *skb)
 | 
			
		||||
@@ -883,7 +883,7 @@ void tcp_wfree(struct sk_buff *skb)
 | 
			
		||||
 	if (wmem >= SKB_TRUESIZE(1) && this_cpu_ksoftirqd() == current)
 | 
			
		||||
 		goto out;
 | 
			
		||||
 
 | 
			
		||||
@ -105,7 +105,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 		struct tsq_tasklet *tsq;
 | 
			
		||||
 		bool empty;
 | 
			
		||||
 
 | 
			
		||||
@@ -886,7 +886,7 @@ void tcp_wfree(struct sk_buff *skb)
 | 
			
		||||
@@ -891,7 +891,7 @@ void tcp_wfree(struct sk_buff *skb)
 | 
			
		||||
 			goto out;
 | 
			
		||||
 
 | 
			
		||||
 		nval = (oval & ~TSQF_THROTTLED) | TSQF_QUEUED | TCPF_TSQ_DEFERRED;
 | 
			
		||||
@ -114,7 +114,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 		if (nval != oval)
 | 
			
		||||
 			continue;
 | 
			
		||||
 
 | 
			
		||||
@@ -2124,7 +2124,7 @@ static bool tcp_small_queue_check(struct
 | 
			
		||||
@@ -2136,7 +2136,7 @@ static bool tcp_small_queue_check(struct
 | 
			
		||||
 		    skb->prev == sk->sk_write_queue.next)
 | 
			
		||||
 			return false;
 | 
			
		||||
 
 | 
			
		||||
@ -123,7 +123,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 		/* It is possible TX completion already happened
 | 
			
		||||
 		 * before we set TSQ_THROTTLED, so we must
 | 
			
		||||
 		 * test again the condition.
 | 
			
		||||
@@ -2222,8 +2222,8 @@ static bool tcp_write_xmit(struct sock *
 | 
			
		||||
@@ -2234,8 +2234,8 @@ static bool tcp_write_xmit(struct sock *
 | 
			
		||||
 		    unlikely(tso_fragment(sk, skb, limit, mss_now, gfp)))
 | 
			
		||||
 			break;
 | 
			
		||||
 
 | 
			
		||||
@ -134,7 +134,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 		if (tcp_small_queue_check(sk, skb, 0))
 | 
			
		||||
 			break;
 | 
			
		||||
 
 | 
			
		||||
@@ -3534,8 +3534,6 @@ void tcp_send_ack(struct sock *sk)
 | 
			
		||||
@@ -3546,8 +3546,6 @@ void __tcp_send_ack(struct sock *sk, u32
 | 
			
		||||
 	/* We do not want pure acks influencing TCP Small Queues or fq/pacing
 | 
			
		||||
 	 * too much.
 | 
			
		||||
 	 * SKB_TRUESIZE(max(1 .. 66, MAX_TCP_HEADER)) is unfortunately ~784
 | 
			
		||||
 | 
			
		||||
@ -30,7 +30,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 | 
			
		||||
--- a/net/ipv4/tcp_output.c
 | 
			
		||||
+++ b/net/ipv4/tcp_output.c
 | 
			
		||||
@@ -769,6 +769,7 @@ static void tcp_tasklet_func(unsigned lo
 | 
			
		||||
@@ -774,6 +774,7 @@ static void tcp_tasklet_func(unsigned lo
 | 
			
		||||
 		list_del(&tp->tsq_node);
 | 
			
		||||
 
 | 
			
		||||
 		sk = (struct sock *)tp;
 | 
			
		||||
 | 
			
		||||
@ -65,7 +65,7 @@ Cc: Kir Kolyshkin <kir@openvz.org>
 | 
			
		||||
 	 * Before updating sk_refcnt, we must commit prior changes to memory
 | 
			
		||||
--- a/net/ipv4/tcp_output.c
 | 
			
		||||
+++ b/net/ipv4/tcp_output.c
 | 
			
		||||
@@ -1581,7 +1581,7 @@ u32 tcp_tso_autosize(const struct sock *
 | 
			
		||||
@@ -1593,7 +1593,7 @@ u32 tcp_tso_autosize(const struct sock *
 | 
			
		||||
 {
 | 
			
		||||
 	u32 bytes, segs;
 | 
			
		||||
 
 | 
			
		||||
@ -74,7 +74,7 @@ Cc: Kir Kolyshkin <kir@openvz.org>
 | 
			
		||||
 		    sk->sk_gso_max_size - 1 - MAX_TCP_HEADER);
 | 
			
		||||
 
 | 
			
		||||
 	/* Goal is to send at least one packet per ms,
 | 
			
		||||
@@ -2111,7 +2111,7 @@ static bool tcp_small_queue_check(struct
 | 
			
		||||
@@ -2123,7 +2123,7 @@ static bool tcp_small_queue_check(struct
 | 
			
		||||
 {
 | 
			
		||||
 	unsigned int limit;
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
@ -52,7 +52,7 @@ Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
 | 
			
		||||
 extern void __free_page_frag(void *addr);
 | 
			
		||||
--- a/mm/page_alloc.c
 | 
			
		||||
+++ b/mm/page_alloc.c
 | 
			
		||||
@@ -3946,6 +3946,20 @@ static struct page *__page_frag_refill(s
 | 
			
		||||
@@ -3945,6 +3945,20 @@ static struct page *__page_frag_refill(s
 | 
			
		||||
 	return page;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
@ -63,7 +63,7 @@ Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
 | 
			
		||||
 void *napi_alloc_frag(unsigned int fragsz);
 | 
			
		||||
--- a/mm/page_alloc.c
 | 
			
		||||
+++ b/mm/page_alloc.c
 | 
			
		||||
@@ -3960,8 +3960,8 @@ void __page_frag_drain(struct page *page
 | 
			
		||||
@@ -3959,8 +3959,8 @@ void __page_frag_drain(struct page *page
 | 
			
		||||
 }
 | 
			
		||||
 EXPORT_SYMBOL(__page_frag_drain);
 | 
			
		||||
 
 | 
			
		||||
@ -74,7 +74,7 @@ Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
 | 
			
		||||
 {
 | 
			
		||||
 	unsigned int size = PAGE_SIZE;
 | 
			
		||||
 	struct page *page;
 | 
			
		||||
@@ -4012,19 +4012,19 @@ refill:
 | 
			
		||||
@@ -4011,19 +4011,19 @@ refill:
 | 
			
		||||
 
 | 
			
		||||
 	return nc->va + offset;
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
@ -33,7 +33,7 @@ Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
 | 
			
		||||
 extern void page_frag_free(void *addr);
 | 
			
		||||
--- a/mm/page_alloc.c
 | 
			
		||||
+++ b/mm/page_alloc.c
 | 
			
		||||
@@ -3925,8 +3925,8 @@ EXPORT_SYMBOL(free_pages);
 | 
			
		||||
@@ -3924,8 +3924,8 @@ EXPORT_SYMBOL(free_pages);
 | 
			
		||||
  * drivers to provide a backing region of memory for use as either an
 | 
			
		||||
  * sk_buff->head, or to be used in the "frags" portion of skb_shared_info.
 | 
			
		||||
  */
 | 
			
		||||
@ -44,7 +44,7 @@ Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
 | 
			
		||||
 {
 | 
			
		||||
 	struct page *page = NULL;
 | 
			
		||||
 	gfp_t gfp = gfp_mask;
 | 
			
		||||
@@ -3946,19 +3946,20 @@ static struct page *__page_frag_refill(s
 | 
			
		||||
@@ -3945,19 +3945,20 @@ static struct page *__page_frag_refill(s
 | 
			
		||||
 	return page;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@ -68,7 +68,7 @@ Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
 | 
			
		||||
 
 | 
			
		||||
 void *page_frag_alloc(struct page_frag_cache *nc,
 | 
			
		||||
 		      unsigned int fragsz, gfp_t gfp_mask)
 | 
			
		||||
@@ -3969,7 +3970,7 @@ void *page_frag_alloc(struct page_frag_c
 | 
			
		||||
@@ -3968,7 +3969,7 @@ void *page_frag_alloc(struct page_frag_c
 | 
			
		||||
 
 | 
			
		||||
 	if (unlikely(!nc->va)) {
 | 
			
		||||
 refill:
 | 
			
		||||
 | 
			
		||||
@ -214,14 +214,14 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 				   RCANFD_RFCC_RFIE);
 | 
			
		||||
--- a/drivers/net/can/xilinx_can.c
 | 
			
		||||
+++ b/drivers/net/can/xilinx_can.c
 | 
			
		||||
@@ -726,7 +726,7 @@ static int xcan_rx_poll(struct napi_stru
 | 
			
		||||
 		can_led_event(ndev, CAN_LED_EVENT_RX);
 | 
			
		||||
@@ -838,7 +838,7 @@ static int xcan_rx_poll(struct napi_stru
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	if (work_done < quota) {
 | 
			
		||||
-		napi_complete(napi);
 | 
			
		||||
+		napi_complete_done(napi, work_done);
 | 
			
		||||
 		ier = priv->read_reg(priv, XCAN_IER_OFFSET);
 | 
			
		||||
 		ier |= (XCAN_IXR_RXOK_MASK | XCAN_IXR_RXNEMP_MASK);
 | 
			
		||||
 		ier |= XCAN_IXR_RXNEMP_MASK;
 | 
			
		||||
 		priv->write_reg(priv, XCAN_IER_OFFSET, ier);
 | 
			
		||||
--- a/drivers/net/ethernet/3com/typhoon.c
 | 
			
		||||
+++ b/drivers/net/ethernet/3com/typhoon.c
 | 
			
		||||
@ -1117,7 +1117,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
 	return work_done;
 | 
			
		||||
--- a/drivers/net/ethernet/sun/sungem.c
 | 
			
		||||
+++ b/drivers/net/ethernet/sun/sungem.c
 | 
			
		||||
@@ -922,7 +922,7 @@ static int gem_poll(struct napi_struct *
 | 
			
		||||
@@ -924,7 +924,7 @@ static int gem_poll(struct napi_struct *
 | 
			
		||||
 		gp->status = readl(gp->regs + GREG_STAT);
 | 
			
		||||
 	} while (gp->status & GREG_STAT_NAPI);
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,65 @@
 | 
			
		||||
From 5012284700775a4e6e3fbe7eac4c543c4874b559 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Theodore Ts'o <tytso@mit.edu>
 | 
			
		||||
Date: Sat, 28 Jul 2018 08:12:04 -0400
 | 
			
		||||
Subject: [PATCH] ext4: fix check to prevent initializing reserved inodes
 | 
			
		||||
 | 
			
		||||
Commit 8844618d8aa7: "ext4: only look at the bg_flags field if it is
 | 
			
		||||
valid" will complain if block group zero does not have the
 | 
			
		||||
EXT4_BG_INODE_ZEROED flag set.  Unfortunately, this is not correct,
 | 
			
		||||
since a freshly created file system has this flag cleared.  It gets
 | 
			
		||||
almost immediately after the file system is mounted read-write --- but
 | 
			
		||||
the following somewhat unlikely sequence will end up triggering a
 | 
			
		||||
false positive report of a corrupted file system:
 | 
			
		||||
 | 
			
		||||
   mkfs.ext4 /dev/vdc
 | 
			
		||||
   mount -o ro /dev/vdc /vdc
 | 
			
		||||
   mount -o remount,rw /dev/vdc
 | 
			
		||||
 | 
			
		||||
Instead, when initializing the inode table for block group zero, test
 | 
			
		||||
to make sure that itable_unused count is not too large, since that is
 | 
			
		||||
the case that will result in some or all of the reserved inodes
 | 
			
		||||
getting cleared.
 | 
			
		||||
 | 
			
		||||
This fixes the failures reported by Eric Whiteney when running
 | 
			
		||||
generic/230 and generic/231 in the the nojournal test case.
 | 
			
		||||
 | 
			
		||||
Fixes: 8844618d8aa7 ("ext4: only look at the bg_flags field if it is valid")
 | 
			
		||||
Reported-by: Eric Whitney <enwlinux@gmail.com>
 | 
			
		||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
 | 
			
		||||
---
 | 
			
		||||
 fs/ext4/ialloc.c | 5 ++++-
 | 
			
		||||
 fs/ext4/super.c  | 8 +-------
 | 
			
		||||
 2 files changed, 5 insertions(+), 8 deletions(-)
 | 
			
		||||
 | 
			
		||||
--- a/fs/ext4/ialloc.c
 | 
			
		||||
+++ b/fs/ext4/ialloc.c
 | 
			
		||||
@@ -1313,7 +1313,10 @@ int ext4_init_inode_table(struct super_b
 | 
			
		||||
 			    ext4_itable_unused_count(sb, gdp)),
 | 
			
		||||
 			    sbi->s_inodes_per_block);
 | 
			
		||||
 
 | 
			
		||||
-	if ((used_blks < 0) || (used_blks > sbi->s_itb_per_group)) {
 | 
			
		||||
+	if ((used_blks < 0) || (used_blks > sbi->s_itb_per_group) ||
 | 
			
		||||
+	    ((group == 0) && ((EXT4_INODES_PER_GROUP(sb) -
 | 
			
		||||
+			       ext4_itable_unused_count(sb, gdp)) <
 | 
			
		||||
+			      EXT4_FIRST_INO(sb)))) {
 | 
			
		||||
 		ext4_error(sb, "Something is wrong with group %u: "
 | 
			
		||||
 			   "used itable blocks: %d; "
 | 
			
		||||
 			   "itable unused count: %u",
 | 
			
		||||
--- a/fs/ext4/super.c
 | 
			
		||||
+++ b/fs/ext4/super.c
 | 
			
		||||
@@ -3031,14 +3031,8 @@ static ext4_group_t ext4_has_uninit_itab
 | 
			
		||||
 		if (!gdp)
 | 
			
		||||
 			continue;
 | 
			
		||||
 
 | 
			
		||||
-		if (gdp->bg_flags & cpu_to_le16(EXT4_BG_INODE_ZEROED))
 | 
			
		||||
-			continue;
 | 
			
		||||
-		if (group != 0)
 | 
			
		||||
+		if (!(gdp->bg_flags & cpu_to_le16(EXT4_BG_INODE_ZEROED)))
 | 
			
		||||
 			break;
 | 
			
		||||
-		ext4_error(sb, "Inode table for bg 0 marked as "
 | 
			
		||||
-			   "needing zeroing");
 | 
			
		||||
-		if (sb->s_flags & MS_RDONLY)
 | 
			
		||||
-			return ngroups;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	return group;
 | 
			
		||||
@ -15,7 +15,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 | 
			
		||||
--- a/Makefile
 | 
			
		||||
+++ b/Makefile
 | 
			
		||||
@@ -1211,7 +1211,6 @@ all: modules
 | 
			
		||||
@@ -1212,7 +1212,6 @@ all: modules
 | 
			
		||||
 
 | 
			
		||||
 PHONY += modules
 | 
			
		||||
 modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) modules.builtin
 | 
			
		||||
@ -23,7 +23,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 	@$(kecho) '  Building modules, stage 2.';
 | 
			
		||||
 	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
 | 
			
		||||
 	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild
 | 
			
		||||
@@ -1241,7 +1240,6 @@ _modinst_:
 | 
			
		||||
@@ -1242,7 +1241,6 @@ _modinst_:
 | 
			
		||||
 		rm -f $(MODLIB)/build ; \
 | 
			
		||||
 		ln -s $(CURDIR) $(MODLIB)/build ; \
 | 
			
		||||
 	fi
 | 
			
		||||
 | 
			
		||||
@ -12,7 +12,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 | 
			
		||||
--- a/tools/build/Build.include
 | 
			
		||||
+++ b/tools/build/Build.include
 | 
			
		||||
@@ -95,4 +95,4 @@ cxx_flags = -Wp,-MD,$(depfile),-MT,$@ $(
 | 
			
		||||
@@ -96,4 +96,4 @@ cxx_flags = -Wp,-MD,$(depfile),-MT,$@ $(
 | 
			
		||||
 ###
 | 
			
		||||
 ## HOSTCC C flags
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
@ -33,9 +33,9 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 | 
			
		||||
 # Read KERNELRELEASE from include/config/kernel.release (if it exists)
 | 
			
		||||
 KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
 | 
			
		||||
 KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)
 | 
			
		||||
@@ -636,11 +641,6 @@ KBUILD_CFLAGS	+= $(call cc-disable-warni
 | 
			
		||||
 KBUILD_CFLAGS	+= $(call cc-disable-warning, format-overflow)
 | 
			
		||||
@@ -637,11 +642,6 @@ KBUILD_CFLAGS	+= $(call cc-disable-warni
 | 
			
		||||
 KBUILD_CFLAGS	+= $(call cc-disable-warning, int-in-bool-context)
 | 
			
		||||
 KBUILD_CFLAGS	+= $(call cc-disable-warning, attribute-alias)
 | 
			
		||||
 
 | 
			
		||||
-ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
 | 
			
		||||
-KBUILD_CFLAGS	+= $(call cc-option,-ffunction-sections,)
 | 
			
		||||
 | 
			
		||||
@ -13,11 +13,9 @@ Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>
 | 
			
		||||
 drivers/w1/masters/w1-gpio.c | 7 +++----
 | 
			
		||||
 1 file changed, 3 insertions(+), 4 deletions(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/drivers/w1/masters/w1-gpio.c b/drivers/w1/masters/w1-gpio.c
 | 
			
		||||
index a90728ceec5a..7b80762941af 100644
 | 
			
		||||
--- a/drivers/w1/masters/w1-gpio.c
 | 
			
		||||
+++ b/drivers/w1/masters/w1-gpio.c
 | 
			
		||||
@@ -112,17 +112,16 @@ static int w1_gpio_probe_dt(struct platform_device *pdev)
 | 
			
		||||
@@ -113,17 +113,16 @@ static int w1_gpio_probe_dt(struct platf
 | 
			
		||||
 static int w1_gpio_probe(struct platform_device *pdev)
 | 
			
		||||
 {
 | 
			
		||||
 	struct w1_bus_master *master;
 | 
			
		||||
@ -38,6 +36,3 @@ index a90728ceec5a..7b80762941af 100644
 | 
			
		||||
 	if (!pdata) {
 | 
			
		||||
 		dev_err(&pdev->dev, "No configuration data\n");
 | 
			
		||||
 		return -ENXIO;
 | 
			
		||||
-- 
 | 
			
		||||
2.14.1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -71,7 +71,7 @@ Signed-off-by: Tobias Wolf <dev-NTEO@vplace.de>
 | 
			
		||||
 | 
			
		||||
--- a/mm/page_alloc.c
 | 
			
		||||
+++ b/mm/page_alloc.c
 | 
			
		||||
@@ -5918,7 +5918,7 @@ static void __ref alloc_node_mem_map(str
 | 
			
		||||
@@ -5932,7 +5932,7 @@ static void __ref alloc_node_mem_map(str
 | 
			
		||||
 		mem_map = NODE_DATA(0)->node_mem_map;
 | 
			
		||||
 #if defined(CONFIG_HAVE_MEMBLOCK_NODE_MAP) || defined(CONFIG_FLATMEM)
 | 
			
		||||
 		if (page_to_pfn(mem_map) != pgdat->node_start_pfn)
 | 
			
		||||
 | 
			
		||||
@ -14,7 +14,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 | 
			
		||||
--- a/Makefile
 | 
			
		||||
+++ b/Makefile
 | 
			
		||||
@@ -642,12 +642,12 @@ KBUILD_CFLAGS	+= $(call cc-option,-fdata
 | 
			
		||||
@@ -643,12 +643,12 @@ KBUILD_CFLAGS	+= $(call cc-option,-fdata
 | 
			
		||||
 endif
 | 
			
		||||
 
 | 
			
		||||
 ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
 | 
			
		||||
 | 
			
		||||
@ -68,7 +68,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 	if (!xt_percpu_counter_alloc(alloc_state, &e->counters))
 | 
			
		||||
 		return -ENOMEM;
 | 
			
		||||
 
 | 
			
		||||
@@ -829,6 +857,7 @@ copy_entries_to_user(unsigned int total_
 | 
			
		||||
@@ -830,6 +858,7 @@ copy_entries_to_user(unsigned int total_
 | 
			
		||||
 	const struct xt_table_info *private = table->private;
 | 
			
		||||
 	int ret = 0;
 | 
			
		||||
 	const void *loc_cpu_entry;
 | 
			
		||||
@ -76,7 +76,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 
 | 
			
		||||
 	counters = alloc_counters(table);
 | 
			
		||||
 	if (IS_ERR(counters))
 | 
			
		||||
@@ -856,6 +885,14 @@ copy_entries_to_user(unsigned int total_
 | 
			
		||||
@@ -857,6 +886,14 @@ copy_entries_to_user(unsigned int total_
 | 
			
		||||
 			goto free_counters;
 | 
			
		||||
 		}
 | 
			
		||||
 
 | 
			
		||||
@ -91,7 +91,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 		for (i = sizeof(struct ipt_entry);
 | 
			
		||||
 		     i < e->target_offset;
 | 
			
		||||
 		     i += m->u.match_size) {
 | 
			
		||||
@@ -1245,12 +1282,15 @@ compat_copy_entry_to_user(struct ipt_ent
 | 
			
		||||
@@ -1246,12 +1283,15 @@ compat_copy_entry_to_user(struct ipt_ent
 | 
			
		||||
 	compat_uint_t origsize;
 | 
			
		||||
 	const struct xt_entry_match *ematch;
 | 
			
		||||
 	int ret = 0;
 | 
			
		||||
 | 
			
		||||
@ -87,7 +87,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 	if (!net_eq(dev_net(dev), sock_net(sk)))
 | 
			
		||||
 		goto drop;
 | 
			
		||||
 
 | 
			
		||||
@@ -3262,6 +3264,7 @@ static int packet_create(struct net *net
 | 
			
		||||
@@ -3260,6 +3262,7 @@ static int packet_create(struct net *net
 | 
			
		||||
 	mutex_init(&po->pg_vec_lock);
 | 
			
		||||
 	po->rollover = NULL;
 | 
			
		||||
 	po->prot_hook.func = packet_rcv;
 | 
			
		||||
@ -95,7 +95,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 
 | 
			
		||||
 	if (sock->type == SOCK_PACKET)
 | 
			
		||||
 		po->prot_hook.func = packet_rcv_spkt;
 | 
			
		||||
@@ -3875,6 +3878,16 @@ packet_setsockopt(struct socket *sock, i
 | 
			
		||||
@@ -3873,6 +3876,16 @@ packet_setsockopt(struct socket *sock, i
 | 
			
		||||
 		po->xmit = val ? packet_direct_xmit : dev_queue_xmit;
 | 
			
		||||
 		return 0;
 | 
			
		||||
 	}
 | 
			
		||||
@ -112,7 +112,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
 	default:
 | 
			
		||||
 		return -ENOPROTOOPT;
 | 
			
		||||
 	}
 | 
			
		||||
@@ -3927,6 +3940,13 @@ static int packet_getsockopt(struct sock
 | 
			
		||||
@@ -3925,6 +3938,13 @@ static int packet_getsockopt(struct sock
 | 
			
		||||
 	case PACKET_VNET_HDR:
 | 
			
		||||
 		val = po->has_vnet_hdr;
 | 
			
		||||
 		break;
 | 
			
		||||
 | 
			
		||||
@ -65,7 +65,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 /**
 | 
			
		||||
  *	ata_build_rw_tf - Build ATA taskfile for given read/write request
 | 
			
		||||
  *	@tf: Target ATA taskfile
 | 
			
		||||
@@ -4991,6 +5004,9 @@ struct ata_queued_cmd *ata_qc_new_init(s
 | 
			
		||||
@@ -4994,6 +5007,9 @@ struct ata_queued_cmd *ata_qc_new_init(s
 | 
			
		||||
 		if (tag < 0)
 | 
			
		||||
 			return NULL;
 | 
			
		||||
 	}
 | 
			
		||||
@ -75,7 +75,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 
 | 
			
		||||
 	qc = __ata_qc_from_tag(ap, tag);
 | 
			
		||||
 	qc->tag = tag;
 | 
			
		||||
@@ -5892,6 +5908,9 @@ struct ata_port *ata_port_alloc(struct a
 | 
			
		||||
@@ -5895,6 +5911,9 @@ struct ata_port *ata_port_alloc(struct a
 | 
			
		||||
 	ap->stats.unhandled_irq = 1;
 | 
			
		||||
 	ap->stats.idle_irq = 1;
 | 
			
		||||
 #endif
 | 
			
		||||
@ -85,7 +85,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 	ata_sff_port_init(ap);
 | 
			
		||||
 
 | 
			
		||||
 	return ap;
 | 
			
		||||
@@ -5913,6 +5932,12 @@ static void ata_host_release(struct devi
 | 
			
		||||
@@ -5916,6 +5935,12 @@ static void ata_host_release(struct devi
 | 
			
		||||
 
 | 
			
		||||
 		kfree(ap->pmp_link);
 | 
			
		||||
 		kfree(ap->slave_link);
 | 
			
		||||
@ -98,7 +98,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 		kfree(ap);
 | 
			
		||||
 		host->ports[i] = NULL;
 | 
			
		||||
 	}
 | 
			
		||||
@@ -6359,7 +6384,23 @@ int ata_host_register(struct ata_host *h
 | 
			
		||||
@@ -6362,7 +6387,23 @@ int ata_host_register(struct ata_host *h
 | 
			
		||||
 		host->ports[i]->print_id = atomic_inc_return(&ata_print_id);
 | 
			
		||||
 		host->ports[i]->local_port_no = i + 1;
 | 
			
		||||
 	}
 | 
			
		||||
@ -134,7 +134,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 | 
			
		||||
 
 | 
			
		||||
 /*
 | 
			
		||||
  * Define if arch has non-standard setup.  This is a _PCI_ standard
 | 
			
		||||
@@ -883,6 +886,12 @@ struct ata_port {
 | 
			
		||||
@@ -884,6 +887,12 @@ struct ata_port {
 | 
			
		||||
 #ifdef CONFIG_ATA_ACPI
 | 
			
		||||
 	struct ata_acpi_gtm	__acpi_init_gtm; /* use ata_acpi_init_gtm() */
 | 
			
		||||
 #endif
 | 
			
		||||
 | 
			
		||||
@ -1,49 +0,0 @@
 | 
			
		||||
The gen_stats facility will add a header for the toplevel nlattr of type
 | 
			
		||||
TCA_STATS2 that contains all stats added by qdisc callbacks. A reference
 | 
			
		||||
to this header is stored in the gnet_dump struct, and when all the
 | 
			
		||||
per-qdisc callbacks have finished adding their stats, the length of the
 | 
			
		||||
containing header will be adjusted to the right value.
 | 
			
		||||
 | 
			
		||||
However, on architectures that need padding (i.e., that don't set
 | 
			
		||||
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS), the padding nlattr is added
 | 
			
		||||
before the stats, which means that the stored pointer will point to the
 | 
			
		||||
padding, and so when the header is fixed up, the result is just a very
 | 
			
		||||
big padding nlattr. Because most qdiscs also supply the legacy TCA_STATS
 | 
			
		||||
struct, this problem has been mostly invisible, but we exposed it with
 | 
			
		||||
the netlink attribute-based statistics in CAKE.
 | 
			
		||||
 | 
			
		||||
Fix the issue by fixing up the stored pointer if it points to a padding
 | 
			
		||||
nlattr.
 | 
			
		||||
 | 
			
		||||
Tested-by: Pete Heist <pete@heistp.net>
 | 
			
		||||
Tested-by: Kevin Darbyshire-Bryant <kevin@darbyshire-bryant.me.uk>
 | 
			
		||||
Signed-off-by: Toke Høiland-Jørgensen <toke@toke.dk>
 | 
			
		||||
---
 | 
			
		||||
 net/core/gen_stats.c |   16 ++++++++++++++--
 | 
			
		||||
 1 file changed, 14 insertions(+), 2 deletions(-)
 | 
			
		||||
 | 
			
		||||
--- a/net/core/gen_stats.c
 | 
			
		||||
+++ b/net/core/gen_stats.c
 | 
			
		||||
@@ -77,8 +77,20 @@ gnet_stats_start_copy_compat(struct sk_b
 | 
			
		||||
 		d->lock = lock;
 | 
			
		||||
 		spin_lock_bh(lock);
 | 
			
		||||
 	}
 | 
			
		||||
-	if (d->tail)
 | 
			
		||||
-		return gnet_stats_copy(d, type, NULL, 0, padattr);
 | 
			
		||||
+	if (d->tail) {
 | 
			
		||||
+		int ret = gnet_stats_copy(d, type, NULL, 0, padattr);
 | 
			
		||||
+
 | 
			
		||||
+		/* The initial attribute added in gnet_stats_copy() may be
 | 
			
		||||
+		 * preceded by a padding attribute, in which case d->tail will
 | 
			
		||||
+		 * end up pointing at the padding instead of the real attribute.
 | 
			
		||||
+		 * Fix this so gnet_stats_finish_copy() adjusts the length of
 | 
			
		||||
+		 * the right attribute.
 | 
			
		||||
+		 */
 | 
			
		||||
+		if (ret == 0 && d->tail->nla_type == padattr)
 | 
			
		||||
+			d->tail = (struct nlattr *)((char *)d->tail +
 | 
			
		||||
+						    NLA_ALIGN(d->tail->nla_len));
 | 
			
		||||
+		return ret;
 | 
			
		||||
+	}
 | 
			
		||||
 
 | 
			
		||||
 	return 0;
 | 
			
		||||
 }
 | 
			
		||||
@ -1,15 +1,15 @@
 | 
			
		||||
--- a/drivers/mtd/redboot.c
 | 
			
		||||
+++ b/drivers/mtd/redboot.c
 | 
			
		||||
@@ -30,6 +30,8 @@
 | 
			
		||||
 #include <linux/mtd/partitions.h>
 | 
			
		||||
@@ -31,6 +31,8 @@
 | 
			
		||||
 #include <linux/module.h>
 | 
			
		||||
 #include <linux/mod_devicetable.h>
 | 
			
		||||
 
 | 
			
		||||
+#include <asm/mach-types.h>
 | 
			
		||||
+
 | 
			
		||||
 struct fis_image_desc {
 | 
			
		||||
     unsigned char name[16];      // Null terminated name
 | 
			
		||||
     uint32_t	  flash_base;    // Address within FLASH of image
 | 
			
		||||
@@ -47,7 +49,8 @@ struct fis_list {
 | 
			
		||||
@@ -48,7 +50,8 @@ struct fis_list {
 | 
			
		||||
 	struct fis_list *next;
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
@ -19,7 +19,7 @@
 | 
			
		||||
 module_param(directory, int, 0);
 | 
			
		||||
 
 | 
			
		||||
 static inline int redboot_checksum(struct fis_image_desc *img)
 | 
			
		||||
@@ -75,6 +78,8 @@ static int parse_redboot_partitions(stru
 | 
			
		||||
@@ -76,6 +79,8 @@ static int parse_redboot_partitions(stru
 | 
			
		||||
 #ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
 | 
			
		||||
 	static char nullstring[] = "unallocated";
 | 
			
		||||
 #endif
 | 
			
		||||
 | 
			
		||||
@ -10,7 +10,7 @@
 | 
			
		||||
 
 | 
			
		||||
 	/* Get the HEAD */
 | 
			
		||||
 	skb = kmem_cache_alloc_node(cache, gfp_mask & ~__GFP_DMA, node);
 | 
			
		||||
@@ -1223,6 +1226,10 @@ int pskb_expand_head(struct sk_buff *skb
 | 
			
		||||
@@ -1224,6 +1227,10 @@ int pskb_expand_head(struct sk_buff *skb
 | 
			
		||||
 	if (skb_shared(skb))
 | 
			
		||||
 		BUG();
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
@ -30,4 +30,4 @@
 | 
			
		||||
+	status = "disabled";
 | 
			
		||||
 	ethernet0-port@0 {
 | 
			
		||||
 		speed = <1000>;
 | 
			
		||||
 		duplex = <1>;
 | 
			
		||||
 		duplex = <1>;
 | 
			
		||||
 | 
			
		||||
@ -81,6 +81,7 @@ CONFIG_ARM64_PAGE_SHIFT=12
 | 
			
		||||
CONFIG_ARM64_PAN=y
 | 
			
		||||
# CONFIG_ARM64_PTDUMP is not set
 | 
			
		||||
# CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set
 | 
			
		||||
CONFIG_ARM64_SSBD=y
 | 
			
		||||
CONFIG_ARM64_UAO=y
 | 
			
		||||
CONFIG_ARM64_VA_BITS=48
 | 
			
		||||
# CONFIG_ARM64_VA_BITS_39 is not set
 | 
			
		||||
 | 
			
		||||
@ -384,7 +384,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 | 
			
		||||
 void  __kfree_skb(struct sk_buff *skb);
 | 
			
		||||
 extern struct kmem_cache *skbuff_head_cache;
 | 
			
		||||
 
 | 
			
		||||
@@ -3057,6 +3058,7 @@ static inline void skb_free_datagram_loc
 | 
			
		||||
@@ -3059,6 +3060,7 @@ static inline void skb_free_datagram_loc
 | 
			
		||||
 }
 | 
			
		||||
 int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, unsigned int flags);
 | 
			
		||||
 int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len);
 | 
			
		||||
@ -477,7 +477,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 | 
			
		||||
 /* Make sure a field is enclosed inside headers_start/headers_end section */
 | 
			
		||||
 #define CHECK_SKB_FIELD(field) \
 | 
			
		||||
 	BUILD_BUG_ON(offsetof(struct sk_buff, field) <		\
 | 
			
		||||
@@ -1074,7 +1100,7 @@ static void skb_headers_offset_update(st
 | 
			
		||||
@@ -1075,7 +1101,7 @@ static void skb_headers_offset_update(st
 | 
			
		||||
 	skb->inner_mac_header += off;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@ -486,7 +486,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 | 
			
		||||
 {
 | 
			
		||||
 	__copy_skb_header(new, old);
 | 
			
		||||
 
 | 
			
		||||
@@ -1082,6 +1108,7 @@ static void copy_skb_header(struct sk_bu
 | 
			
		||||
@@ -1083,6 +1109,7 @@ static void copy_skb_header(struct sk_bu
 | 
			
		||||
 	skb_shinfo(new)->gso_segs = skb_shinfo(old)->gso_segs;
 | 
			
		||||
 	skb_shinfo(new)->gso_type = skb_shinfo(old)->gso_type;
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
@ -25,7 +25,7 @@ Signed-off-by: Mathew McBride <matt@traverse.com.au>
 | 
			
		||||
 clean-files	:= *.dtb
 | 
			
		||||
--- a/arch/arm64/boot/dts/freescale/traverse-ls1043s.dts
 | 
			
		||||
+++ b/arch/arm64/boot/dts/freescale/traverse-ls1043s.dts
 | 
			
		||||
@@ -337,3 +337,29 @@
 | 
			
		||||
@@ -330,3 +330,29 @@
 | 
			
		||||
 &sata {
 | 
			
		||||
 	status = "disabled";
 | 
			
		||||
 };
 | 
			
		||||
@ -57,7 +57,7 @@ Signed-off-by: Mathew McBride <matt@traverse.com.au>
 | 
			
		||||
+};
 | 
			
		||||
--- a/arch/arm64/boot/dts/freescale/traverse-ls1043v.dts
 | 
			
		||||
+++ b/arch/arm64/boot/dts/freescale/traverse-ls1043v.dts
 | 
			
		||||
@@ -313,3 +313,29 @@
 | 
			
		||||
@@ -251,3 +251,29 @@
 | 
			
		||||
 &sata {
 | 
			
		||||
        status = "disabled";
 | 
			
		||||
 };
 | 
			
		||||
 | 
			
		||||
@ -1724,7 +1724,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 | 
			
		||||
 		ret = phydrv->resume(phydev);
 | 
			
		||||
 
 | 
			
		||||
 	if (ret)
 | 
			
		||||
@@ -1726,7 +1726,7 @@ static int phy_remove(struct device *dev
 | 
			
		||||
@@ -1723,7 +1723,7 @@ static int phy_remove(struct device *dev
 | 
			
		||||
 	phydev->state = PHY_DOWN;
 | 
			
		||||
 	mutex_unlock(&phydev->lock);
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
@ -87,7 +87,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 | 
			
		||||
 			pkt_len = le32_to_cpu(rx_desc->opts1) & RX_LEN_MASK;
 | 
			
		||||
 			if (pkt_len < ETH_ZLEN)
 | 
			
		||||
 				break;
 | 
			
		||||
@@ -4509,6 +4514,7 @@ static struct usb_device_id rtl8152_tabl
 | 
			
		||||
@@ -4510,6 +4515,7 @@ static struct usb_device_id rtl8152_tabl
 | 
			
		||||
 	{REALTEK_USB_DEVICE(VENDOR_ID_LENOVO,  0x304f)},
 | 
			
		||||
 	{REALTEK_USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041)},
 | 
			
		||||
 	{REALTEK_USB_DEVICE(VENDOR_ID_NVIDIA,  0x09ff)},
 | 
			
		||||
@ -156,7 +156,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 | 
			
		||||
 	int ret;
 | 
			
		||||
--- a/drivers/usb/core/hub.c
 | 
			
		||||
+++ b/drivers/usb/core/hub.c
 | 
			
		||||
@@ -4423,6 +4423,14 @@ hub_port_init(struct usb_hub *hub, struc
 | 
			
		||||
@@ -4427,6 +4427,14 @@ hub_port_init(struct usb_hub *hub, struc
 | 
			
		||||
 	else
 | 
			
		||||
 		speed = usb_speed_string(udev->speed);
 | 
			
		||||
 
 | 
			
		||||
@ -1494,7 +1494,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 | 
			
		||||
 		while (ep_ring->dequeue != td->last_trb)
 | 
			
		||||
--- a/drivers/usb/host/xhci.c
 | 
			
		||||
+++ b/drivers/usb/host/xhci.c
 | 
			
		||||
@@ -1570,14 +1570,38 @@ int xhci_urb_dequeue(struct usb_hcd *hcd
 | 
			
		||||
@@ -1604,14 +1604,38 @@ int xhci_urb_dequeue(struct usb_hcd *hcd
 | 
			
		||||
 			ret = -ENOMEM;
 | 
			
		||||
 			goto done;
 | 
			
		||||
 		}
 | 
			
		||||
@ -1542,7 +1542,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 | 
			
		||||
 	spin_unlock_irqrestore(&xhci->lock, flags);
 | 
			
		||||
--- a/drivers/usb/host/xhci.h
 | 
			
		||||
+++ b/drivers/usb/host/xhci.h
 | 
			
		||||
@@ -1621,7 +1621,7 @@ struct xhci_hcd {
 | 
			
		||||
@@ -1625,7 +1625,7 @@ struct xhci_hcd {
 | 
			
		||||
 #define XHCI_STATE_REMOVING	(1 << 2)
 | 
			
		||||
 	/* Statistics */
 | 
			
		||||
 	int			error_bitmask;
 | 
			
		||||
@ -1551,7 +1551,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 | 
			
		||||
 #define	XHCI_LINK_TRB_QUIRK	(1 << 0)
 | 
			
		||||
 #define XHCI_RESET_EP_QUIRK	(1 << 1)
 | 
			
		||||
 #define XHCI_NEC_HOST		(1 << 2)
 | 
			
		||||
@@ -1657,6 +1657,9 @@ struct xhci_hcd {
 | 
			
		||||
@@ -1661,6 +1661,9 @@ struct xhci_hcd {
 | 
			
		||||
 #define XHCI_SSIC_PORT_UNUSED	(1 << 22)
 | 
			
		||||
 #define XHCI_NO_64BIT_SUPPORT	(1 << 23)
 | 
			
		||||
 #define XHCI_MISSING_CAS	(1 << 24)
 | 
			
		||||
 | 
			
		||||
@ -3095,7 +3095,7 @@
 | 
			
		||||
 
 | 
			
		||||
 	if (priv->hw->mode->set_16kib_bfsize)
 | 
			
		||||
 		bfsize = priv->hw->mode->set_16kib_bfsize(dev->mtu);
 | 
			
		||||
@@ -1033,257 +1234,516 @@ static int init_dma_desc_rings(struct ne
 | 
			
		||||
@@ -1033,235 +1234,409 @@ static int init_dma_desc_rings(struct ne
 | 
			
		||||
 
 | 
			
		||||
 	priv->dma_buf_sz = bfsize;
 | 
			
		||||
 
 | 
			
		||||
@ -3351,10 +3351,17 @@
 | 
			
		||||
-						 priv->tx_skbuff_dma[i].buf,
 | 
			
		||||
-						 priv->tx_skbuff_dma[i].len,
 | 
			
		||||
-						 DMA_TO_DEVICE);
 | 
			
		||||
-		}
 | 
			
		||||
+	for (i = 0; i < DMA_TX_SIZE; i++)
 | 
			
		||||
+		stmmac_free_tx_buffer(priv, queue, i);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 
 | 
			
		||||
-		if (priv->tx_skbuff[i]) {
 | 
			
		||||
-			dev_kfree_skb_any(priv->tx_skbuff[i]);
 | 
			
		||||
-			priv->tx_skbuff[i] = NULL;
 | 
			
		||||
-			priv->tx_skbuff_dma[i].buf = 0;
 | 
			
		||||
-			priv->tx_skbuff_dma[i].map_as_page = false;
 | 
			
		||||
-		}
 | 
			
		||||
+/**
 | 
			
		||||
+ * free_dma_rx_desc_resources - free RX dma desc resources
 | 
			
		||||
+ * @priv: private structure
 | 
			
		||||
@ -3383,10 +3390,11 @@
 | 
			
		||||
+
 | 
			
		||||
+		kfree(rx_q->rx_skbuff_dma);
 | 
			
		||||
+		kfree(rx_q->rx_skbuff);
 | 
			
		||||
+	}
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+/**
 | 
			
		||||
 	}
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 /**
 | 
			
		||||
- * alloc_dma_desc_resources - alloc TX/RX resources.
 | 
			
		||||
+ * free_dma_tx_desc_resources - free TX dma desc resources
 | 
			
		||||
+ * @priv: private structure
 | 
			
		||||
+ */
 | 
			
		||||
@ -3419,36 +3427,90 @@
 | 
			
		||||
+
 | 
			
		||||
+/**
 | 
			
		||||
+ * alloc_dma_rx_desc_resources - alloc RX resources.
 | 
			
		||||
+ * @priv: private structure
 | 
			
		||||
+ * Description: according to which descriptor can be used (extend or basic)
 | 
			
		||||
+ * this function allocates the resources for TX and RX paths. In case of
 | 
			
		||||
+ * reception, for example, it pre-allocated the RX socket buffer in order to
 | 
			
		||||
+ * allow zero-copy mechanism.
 | 
			
		||||
+ */
 | 
			
		||||
  * @priv: private structure
 | 
			
		||||
  * Description: according to which descriptor can be used (extend or basic)
 | 
			
		||||
  * this function allocates the resources for TX and RX paths. In case of
 | 
			
		||||
  * reception, for example, it pre-allocated the RX socket buffer in order to
 | 
			
		||||
  * allow zero-copy mechanism.
 | 
			
		||||
  */
 | 
			
		||||
-static int alloc_dma_desc_resources(struct stmmac_priv *priv)
 | 
			
		||||
+static int alloc_dma_rx_desc_resources(struct stmmac_priv *priv)
 | 
			
		||||
+{
 | 
			
		||||
 {
 | 
			
		||||
+	u32 rx_count = priv->plat->rx_queues_to_use;
 | 
			
		||||
+	int ret = -ENOMEM;
 | 
			
		||||
 	int ret = -ENOMEM;
 | 
			
		||||
+	u32 queue;
 | 
			
		||||
+
 | 
			
		||||
 
 | 
			
		||||
-	priv->rx_skbuff_dma = kmalloc_array(DMA_RX_SIZE, sizeof(dma_addr_t),
 | 
			
		||||
-					    GFP_KERNEL);
 | 
			
		||||
-	if (!priv->rx_skbuff_dma)
 | 
			
		||||
-		return -ENOMEM;
 | 
			
		||||
+	/* RX queues buffers and DMA */
 | 
			
		||||
+	for (queue = 0; queue < rx_count; queue++) {
 | 
			
		||||
+		struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue];
 | 
			
		||||
+
 | 
			
		||||
 
 | 
			
		||||
-	priv->rx_skbuff = kmalloc_array(DMA_RX_SIZE, sizeof(struct sk_buff *),
 | 
			
		||||
-					GFP_KERNEL);
 | 
			
		||||
-	if (!priv->rx_skbuff)
 | 
			
		||||
-		goto err_rx_skbuff;
 | 
			
		||||
-
 | 
			
		||||
-	priv->tx_skbuff_dma = kmalloc_array(DMA_TX_SIZE,
 | 
			
		||||
-					    sizeof(*priv->tx_skbuff_dma),
 | 
			
		||||
-					    GFP_KERNEL);
 | 
			
		||||
-	if (!priv->tx_skbuff_dma)
 | 
			
		||||
-		goto err_tx_skbuff_dma;
 | 
			
		||||
-
 | 
			
		||||
-	priv->tx_skbuff = kmalloc_array(DMA_TX_SIZE, sizeof(struct sk_buff *),
 | 
			
		||||
-					GFP_KERNEL);
 | 
			
		||||
-	if (!priv->tx_skbuff)
 | 
			
		||||
-		goto err_tx_skbuff;
 | 
			
		||||
-
 | 
			
		||||
-	if (priv->extend_desc) {
 | 
			
		||||
-		priv->dma_erx = dma_zalloc_coherent(priv->device, DMA_RX_SIZE *
 | 
			
		||||
-						    sizeof(struct
 | 
			
		||||
-							   dma_extended_desc),
 | 
			
		||||
-						    &priv->dma_rx_phy,
 | 
			
		||||
-						    GFP_KERNEL);
 | 
			
		||||
-		if (!priv->dma_erx)
 | 
			
		||||
-			goto err_dma;
 | 
			
		||||
+		rx_q->queue_index = queue;
 | 
			
		||||
+		rx_q->priv_data = priv;
 | 
			
		||||
+
 | 
			
		||||
 
 | 
			
		||||
-		priv->dma_etx = dma_zalloc_coherent(priv->device, DMA_TX_SIZE *
 | 
			
		||||
-						    sizeof(struct
 | 
			
		||||
-							   dma_extended_desc),
 | 
			
		||||
-						    &priv->dma_tx_phy,
 | 
			
		||||
+		rx_q->rx_skbuff_dma = kmalloc_array(DMA_RX_SIZE,
 | 
			
		||||
+						    sizeof(dma_addr_t),
 | 
			
		||||
+						    GFP_KERNEL);
 | 
			
		||||
 						    GFP_KERNEL);
 | 
			
		||||
-		if (!priv->dma_etx) {
 | 
			
		||||
-			dma_free_coherent(priv->device, DMA_RX_SIZE *
 | 
			
		||||
-					  sizeof(struct dma_extended_desc),
 | 
			
		||||
-					  priv->dma_erx, priv->dma_rx_phy);
 | 
			
		||||
-			goto err_dma;
 | 
			
		||||
-		}
 | 
			
		||||
-	} else {
 | 
			
		||||
-		priv->dma_rx = dma_zalloc_coherent(priv->device, DMA_RX_SIZE *
 | 
			
		||||
-						   sizeof(struct dma_desc),
 | 
			
		||||
-						   &priv->dma_rx_phy,
 | 
			
		||||
-						   GFP_KERNEL);
 | 
			
		||||
-		if (!priv->dma_rx)
 | 
			
		||||
-			goto err_dma;
 | 
			
		||||
+		if (!rx_q->rx_skbuff_dma)
 | 
			
		||||
+			return -ENOMEM;
 | 
			
		||||
+
 | 
			
		||||
 
 | 
			
		||||
-		priv->dma_tx = dma_zalloc_coherent(priv->device, DMA_TX_SIZE *
 | 
			
		||||
-						   sizeof(struct dma_desc),
 | 
			
		||||
-						   &priv->dma_tx_phy,
 | 
			
		||||
-						   GFP_KERNEL);
 | 
			
		||||
-		if (!priv->dma_tx) {
 | 
			
		||||
-			dma_free_coherent(priv->device, DMA_RX_SIZE *
 | 
			
		||||
-					  sizeof(struct dma_desc),
 | 
			
		||||
-					  priv->dma_rx, priv->dma_rx_phy);
 | 
			
		||||
+		rx_q->rx_skbuff = kmalloc_array(DMA_RX_SIZE,
 | 
			
		||||
+						sizeof(struct sk_buff *),
 | 
			
		||||
+						GFP_KERNEL);
 | 
			
		||||
+		if (!rx_q->rx_skbuff)
 | 
			
		||||
+			goto err_dma;
 | 
			
		||||
 			goto err_dma;
 | 
			
		||||
+
 | 
			
		||||
+		if (priv->extend_desc) {
 | 
			
		||||
+			rx_q->dma_erx = dma_zalloc_coherent(priv->device,
 | 
			
		||||
@ -3469,12 +3531,19 @@
 | 
			
		||||
+							   GFP_KERNEL);
 | 
			
		||||
+			if (!rx_q->dma_rx)
 | 
			
		||||
+				goto err_dma;
 | 
			
		||||
+		}
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
+	return 0;
 | 
			
		||||
+
 | 
			
		||||
+err_dma:
 | 
			
		||||
 		}
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 	return 0;
 | 
			
		||||
 
 | 
			
		||||
 err_dma:
 | 
			
		||||
-	kfree(priv->tx_skbuff);
 | 
			
		||||
-err_tx_skbuff:
 | 
			
		||||
-	kfree(priv->tx_skbuff_dma);
 | 
			
		||||
-err_tx_skbuff_dma:
 | 
			
		||||
-	kfree(priv->rx_skbuff);
 | 
			
		||||
-err_rx_skbuff:
 | 
			
		||||
-	kfree(priv->rx_skbuff_dma);
 | 
			
		||||
+	free_dma_rx_desc_resources(priv);
 | 
			
		||||
+
 | 
			
		||||
+	return ret;
 | 
			
		||||
@ -3531,7 +3600,7 @@
 | 
			
		||||
+							   GFP_KERNEL);
 | 
			
		||||
+			if (!tx_q->dma_tx)
 | 
			
		||||
+				goto err_dma_buffers;
 | 
			
		||||
 		}
 | 
			
		||||
+		}
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
+	return 0;
 | 
			
		||||
@ -3560,183 +3629,14 @@
 | 
			
		||||
+
 | 
			
		||||
+	ret = alloc_dma_tx_desc_resources(priv);
 | 
			
		||||
+
 | 
			
		||||
+	return ret;
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 	return ret;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+/**
 | 
			
		||||
+ * free_dma_desc_resources - free dma desc resources
 | 
			
		||||
+ * @priv: private structure
 | 
			
		||||
+ */
 | 
			
		||||
+static void free_dma_desc_resources(struct stmmac_priv *priv)
 | 
			
		||||
+{
 | 
			
		||||
+	/* Release the DMA RX socket buffers */
 | 
			
		||||
+	free_dma_rx_desc_resources(priv);
 | 
			
		||||
+
 | 
			
		||||
+	/* Release the DMA TX socket buffers */
 | 
			
		||||
+	free_dma_tx_desc_resources(priv);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+/**
 | 
			
		||||
+ *  stmmac_mac_enable_rx_queues - Enable MAC rx queues
 | 
			
		||||
+ *  @priv: driver private structure
 | 
			
		||||
+ *  Description: It is used for enabling the rx queues in the MAC
 | 
			
		||||
+ */
 | 
			
		||||
+static void stmmac_mac_enable_rx_queues(struct stmmac_priv *priv)
 | 
			
		||||
+{
 | 
			
		||||
+	u32 rx_queues_count = priv->plat->rx_queues_to_use;
 | 
			
		||||
+	int queue;
 | 
			
		||||
+	u8 mode;
 | 
			
		||||
 
 | 
			
		||||
-		if (priv->tx_skbuff[i]) {
 | 
			
		||||
-			dev_kfree_skb_any(priv->tx_skbuff[i]);
 | 
			
		||||
-			priv->tx_skbuff[i] = NULL;
 | 
			
		||||
-			priv->tx_skbuff_dma[i].buf = 0;
 | 
			
		||||
-			priv->tx_skbuff_dma[i].map_as_page = false;
 | 
			
		||||
-		}
 | 
			
		||||
+	for (queue = 0; queue < rx_queues_count; queue++) {
 | 
			
		||||
+		mode = priv->plat->rx_queues_cfg[queue].mode_to_use;
 | 
			
		||||
+		priv->hw->mac->rx_queue_enable(priv->hw, mode, queue);
 | 
			
		||||
 	}
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 /**
 | 
			
		||||
- * alloc_dma_desc_resources - alloc TX/RX resources.
 | 
			
		||||
- * @priv: private structure
 | 
			
		||||
- * Description: according to which descriptor can be used (extend or basic)
 | 
			
		||||
- * this function allocates the resources for TX and RX paths. In case of
 | 
			
		||||
- * reception, for example, it pre-allocated the RX socket buffer in order to
 | 
			
		||||
- * allow zero-copy mechanism.
 | 
			
		||||
+ * stmmac_start_rx_dma - start RX DMA channel
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * @chan: RX channel index
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This starts a RX DMA channel
 | 
			
		||||
  */
 | 
			
		||||
-static int alloc_dma_desc_resources(struct stmmac_priv *priv)
 | 
			
		||||
+static void stmmac_start_rx_dma(struct stmmac_priv *priv, u32 chan)
 | 
			
		||||
 {
 | 
			
		||||
-	int ret = -ENOMEM;
 | 
			
		||||
-
 | 
			
		||||
-	priv->rx_skbuff_dma = kmalloc_array(DMA_RX_SIZE, sizeof(dma_addr_t),
 | 
			
		||||
-					    GFP_KERNEL);
 | 
			
		||||
-	if (!priv->rx_skbuff_dma)
 | 
			
		||||
-		return -ENOMEM;
 | 
			
		||||
-
 | 
			
		||||
-	priv->rx_skbuff = kmalloc_array(DMA_RX_SIZE, sizeof(struct sk_buff *),
 | 
			
		||||
-					GFP_KERNEL);
 | 
			
		||||
-	if (!priv->rx_skbuff)
 | 
			
		||||
-		goto err_rx_skbuff;
 | 
			
		||||
-
 | 
			
		||||
-	priv->tx_skbuff_dma = kmalloc_array(DMA_TX_SIZE,
 | 
			
		||||
-					    sizeof(*priv->tx_skbuff_dma),
 | 
			
		||||
-					    GFP_KERNEL);
 | 
			
		||||
-	if (!priv->tx_skbuff_dma)
 | 
			
		||||
-		goto err_tx_skbuff_dma;
 | 
			
		||||
-
 | 
			
		||||
-	priv->tx_skbuff = kmalloc_array(DMA_TX_SIZE, sizeof(struct sk_buff *),
 | 
			
		||||
-					GFP_KERNEL);
 | 
			
		||||
-	if (!priv->tx_skbuff)
 | 
			
		||||
-		goto err_tx_skbuff;
 | 
			
		||||
-
 | 
			
		||||
-	if (priv->extend_desc) {
 | 
			
		||||
-		priv->dma_erx = dma_zalloc_coherent(priv->device, DMA_RX_SIZE *
 | 
			
		||||
-						    sizeof(struct
 | 
			
		||||
-							   dma_extended_desc),
 | 
			
		||||
-						    &priv->dma_rx_phy,
 | 
			
		||||
-						    GFP_KERNEL);
 | 
			
		||||
-		if (!priv->dma_erx)
 | 
			
		||||
-			goto err_dma;
 | 
			
		||||
-
 | 
			
		||||
-		priv->dma_etx = dma_zalloc_coherent(priv->device, DMA_TX_SIZE *
 | 
			
		||||
-						    sizeof(struct
 | 
			
		||||
-							   dma_extended_desc),
 | 
			
		||||
-						    &priv->dma_tx_phy,
 | 
			
		||||
-						    GFP_KERNEL);
 | 
			
		||||
-		if (!priv->dma_etx) {
 | 
			
		||||
-			dma_free_coherent(priv->device, DMA_RX_SIZE *
 | 
			
		||||
-					  sizeof(struct dma_extended_desc),
 | 
			
		||||
-					  priv->dma_erx, priv->dma_rx_phy);
 | 
			
		||||
-			goto err_dma;
 | 
			
		||||
-		}
 | 
			
		||||
-	} else {
 | 
			
		||||
-		priv->dma_rx = dma_zalloc_coherent(priv->device, DMA_RX_SIZE *
 | 
			
		||||
-						   sizeof(struct dma_desc),
 | 
			
		||||
-						   &priv->dma_rx_phy,
 | 
			
		||||
-						   GFP_KERNEL);
 | 
			
		||||
-		if (!priv->dma_rx)
 | 
			
		||||
-			goto err_dma;
 | 
			
		||||
+	netdev_dbg(priv->dev, "DMA RX processes started in channel %d\n", chan);
 | 
			
		||||
+	priv->hw->dma->start_rx(priv->ioaddr, chan);
 | 
			
		||||
+}
 | 
			
		||||
 
 | 
			
		||||
-		priv->dma_tx = dma_zalloc_coherent(priv->device, DMA_TX_SIZE *
 | 
			
		||||
-						   sizeof(struct dma_desc),
 | 
			
		||||
-						   &priv->dma_tx_phy,
 | 
			
		||||
-						   GFP_KERNEL);
 | 
			
		||||
-		if (!priv->dma_tx) {
 | 
			
		||||
-			dma_free_coherent(priv->device, DMA_RX_SIZE *
 | 
			
		||||
-					  sizeof(struct dma_desc),
 | 
			
		||||
-					  priv->dma_rx, priv->dma_rx_phy);
 | 
			
		||||
-			goto err_dma;
 | 
			
		||||
-		}
 | 
			
		||||
-	}
 | 
			
		||||
+/**
 | 
			
		||||
+ * stmmac_start_tx_dma - start TX DMA channel
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * @chan: TX channel index
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This starts a TX DMA channel
 | 
			
		||||
+ */
 | 
			
		||||
+static void stmmac_start_tx_dma(struct stmmac_priv *priv, u32 chan)
 | 
			
		||||
+{
 | 
			
		||||
+	netdev_dbg(priv->dev, "DMA TX processes started in channel %d\n", chan);
 | 
			
		||||
+	priv->hw->dma->start_tx(priv->ioaddr, chan);
 | 
			
		||||
+}
 | 
			
		||||
 
 | 
			
		||||
-	return 0;
 | 
			
		||||
+/**
 | 
			
		||||
+ * stmmac_stop_rx_dma - stop RX DMA channel
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * @chan: RX channel index
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This stops a RX DMA channel
 | 
			
		||||
+ */
 | 
			
		||||
+static void stmmac_stop_rx_dma(struct stmmac_priv *priv, u32 chan)
 | 
			
		||||
+{
 | 
			
		||||
+	netdev_dbg(priv->dev, "DMA RX processes stopped in channel %d\n", chan);
 | 
			
		||||
+	priv->hw->dma->stop_rx(priv->ioaddr, chan);
 | 
			
		||||
+}
 | 
			
		||||
 
 | 
			
		||||
-err_dma:
 | 
			
		||||
-	kfree(priv->tx_skbuff);
 | 
			
		||||
-err_tx_skbuff:
 | 
			
		||||
-	kfree(priv->tx_skbuff_dma);
 | 
			
		||||
-err_tx_skbuff_dma:
 | 
			
		||||
-	kfree(priv->rx_skbuff);
 | 
			
		||||
-err_rx_skbuff:
 | 
			
		||||
-	kfree(priv->rx_skbuff_dma);
 | 
			
		||||
-	return ret;
 | 
			
		||||
+/**
 | 
			
		||||
+ * stmmac_stop_tx_dma - stop TX DMA channel
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * @chan: TX channel index
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This stops a TX DMA channel
 | 
			
		||||
+ */
 | 
			
		||||
+static void stmmac_stop_tx_dma(struct stmmac_priv *priv, u32 chan)
 | 
			
		||||
+{
 | 
			
		||||
+	netdev_dbg(priv->dev, "DMA TX processes stopped in channel %d\n", chan);
 | 
			
		||||
+	priv->hw->dma->stop_tx(priv->ioaddr, chan);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static void free_dma_desc_resources(struct stmmac_priv *priv)
 | 
			
		||||
+/**
 | 
			
		||||
+ * stmmac_start_all_dma - start all RX and TX DMA channels
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This starts all the RX and TX DMA channels
 | 
			
		||||
+ */
 | 
			
		||||
+static void stmmac_start_all_dma(struct stmmac_priv *priv)
 | 
			
		||||
 static void free_dma_desc_resources(struct stmmac_priv *priv)
 | 
			
		||||
 {
 | 
			
		||||
-	/* Release the DMA TX/RX socket buffers */
 | 
			
		||||
-	dma_free_rx_skbufs(priv);
 | 
			
		||||
@ -3762,6 +3662,99 @@
 | 
			
		||||
-	kfree(priv->rx_skbuff);
 | 
			
		||||
-	kfree(priv->tx_skbuff_dma);
 | 
			
		||||
-	kfree(priv->tx_skbuff);
 | 
			
		||||
+	/* Release the DMA RX socket buffers */
 | 
			
		||||
+	free_dma_rx_desc_resources(priv);
 | 
			
		||||
+
 | 
			
		||||
+	/* Release the DMA TX socket buffers */
 | 
			
		||||
+	free_dma_tx_desc_resources(priv);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 /**
 | 
			
		||||
@@ -1271,19 +1646,104 @@ static void free_dma_desc_resources(stru
 | 
			
		||||
  */
 | 
			
		||||
 static void stmmac_mac_enable_rx_queues(struct stmmac_priv *priv)
 | 
			
		||||
 {
 | 
			
		||||
-	int rx_count = priv->dma_cap.number_rx_queues;
 | 
			
		||||
-	int queue = 0;
 | 
			
		||||
+	u32 rx_queues_count = priv->plat->rx_queues_to_use;
 | 
			
		||||
+	int queue;
 | 
			
		||||
+	u8 mode;
 | 
			
		||||
 
 | 
			
		||||
-	/* If GMAC does not have multiple queues, then this is not necessary*/
 | 
			
		||||
-	if (rx_count == 1)
 | 
			
		||||
-		return;
 | 
			
		||||
+	for (queue = 0; queue < rx_queues_count; queue++) {
 | 
			
		||||
+		mode = priv->plat->rx_queues_cfg[queue].mode_to_use;
 | 
			
		||||
+		priv->hw->mac->rx_queue_enable(priv->hw, mode, queue);
 | 
			
		||||
+	}
 | 
			
		||||
+}
 | 
			
		||||
 
 | 
			
		||||
-	/**
 | 
			
		||||
-	 *  If the core is synthesized with multiple rx queues / multiple
 | 
			
		||||
-	 *  dma channels, then rx queues will be disabled by default.
 | 
			
		||||
-	 *  For now only rx queue 0 is enabled.
 | 
			
		||||
-	 */
 | 
			
		||||
-	priv->hw->mac->rx_queue_enable(priv->hw, queue);
 | 
			
		||||
+/**
 | 
			
		||||
+ * stmmac_start_rx_dma - start RX DMA channel
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * @chan: RX channel index
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This starts a RX DMA channel
 | 
			
		||||
+ */
 | 
			
		||||
+static void stmmac_start_rx_dma(struct stmmac_priv *priv, u32 chan)
 | 
			
		||||
+{
 | 
			
		||||
+	netdev_dbg(priv->dev, "DMA RX processes started in channel %d\n", chan);
 | 
			
		||||
+	priv->hw->dma->start_rx(priv->ioaddr, chan);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+/**
 | 
			
		||||
+ * stmmac_start_tx_dma - start TX DMA channel
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * @chan: TX channel index
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This starts a TX DMA channel
 | 
			
		||||
+ */
 | 
			
		||||
+static void stmmac_start_tx_dma(struct stmmac_priv *priv, u32 chan)
 | 
			
		||||
+{
 | 
			
		||||
+	netdev_dbg(priv->dev, "DMA TX processes started in channel %d\n", chan);
 | 
			
		||||
+	priv->hw->dma->start_tx(priv->ioaddr, chan);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+/**
 | 
			
		||||
+ * stmmac_stop_rx_dma - stop RX DMA channel
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * @chan: RX channel index
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This stops a RX DMA channel
 | 
			
		||||
+ */
 | 
			
		||||
+static void stmmac_stop_rx_dma(struct stmmac_priv *priv, u32 chan)
 | 
			
		||||
+{
 | 
			
		||||
+	netdev_dbg(priv->dev, "DMA RX processes stopped in channel %d\n", chan);
 | 
			
		||||
+	priv->hw->dma->stop_rx(priv->ioaddr, chan);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+/**
 | 
			
		||||
+ * stmmac_stop_tx_dma - stop TX DMA channel
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * @chan: TX channel index
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This stops a TX DMA channel
 | 
			
		||||
+ */
 | 
			
		||||
+static void stmmac_stop_tx_dma(struct stmmac_priv *priv, u32 chan)
 | 
			
		||||
+{
 | 
			
		||||
+	netdev_dbg(priv->dev, "DMA TX processes stopped in channel %d\n", chan);
 | 
			
		||||
+	priv->hw->dma->stop_tx(priv->ioaddr, chan);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+/**
 | 
			
		||||
+ * stmmac_start_all_dma - start all RX and TX DMA channels
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This starts all the RX and TX DMA channels
 | 
			
		||||
+ */
 | 
			
		||||
+static void stmmac_start_all_dma(struct stmmac_priv *priv)
 | 
			
		||||
+{
 | 
			
		||||
+	u32 rx_channels_count = priv->plat->rx_queues_to_use;
 | 
			
		||||
+	u32 tx_channels_count = priv->plat->tx_queues_to_use;
 | 
			
		||||
+	u32 chan = 0;
 | 
			
		||||
@ -3771,38 +3764,23 @@
 | 
			
		||||
+
 | 
			
		||||
+	for (chan = 0; chan < tx_channels_count; chan++)
 | 
			
		||||
+		stmmac_start_tx_dma(priv, chan);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 /**
 | 
			
		||||
- *  stmmac_mac_enable_rx_queues - Enable MAC rx queues
 | 
			
		||||
- *  @priv: driver private structure
 | 
			
		||||
- *  Description: It is used for enabling the rx queues in the MAC
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+/**
 | 
			
		||||
+ * stmmac_stop_all_dma - stop all RX and TX DMA channels
 | 
			
		||||
+ * @priv: driver private structure
 | 
			
		||||
+ * Description:
 | 
			
		||||
+ * This stops the RX and TX DMA channels
 | 
			
		||||
  */
 | 
			
		||||
-static void stmmac_mac_enable_rx_queues(struct stmmac_priv *priv)
 | 
			
		||||
+ */
 | 
			
		||||
+static void stmmac_stop_all_dma(struct stmmac_priv *priv)
 | 
			
		||||
 {
 | 
			
		||||
-	int rx_count = priv->dma_cap.number_rx_queues;
 | 
			
		||||
-	int queue = 0;
 | 
			
		||||
+{
 | 
			
		||||
+	u32 rx_channels_count = priv->plat->rx_queues_to_use;
 | 
			
		||||
+	u32 tx_channels_count = priv->plat->tx_queues_to_use;
 | 
			
		||||
+	u32 chan = 0;
 | 
			
		||||
 
 | 
			
		||||
-	/* If GMAC does not have multiple queues, then this is not necessary*/
 | 
			
		||||
-	if (rx_count == 1)
 | 
			
		||||
-		return;
 | 
			
		||||
+
 | 
			
		||||
+	for (chan = 0; chan < rx_channels_count; chan++)
 | 
			
		||||
+		stmmac_stop_rx_dma(priv, chan);
 | 
			
		||||
 
 | 
			
		||||
-	/**
 | 
			
		||||
-	 *  If the core is synthesized with multiple rx queues / multiple
 | 
			
		||||
-	 *  dma channels, then rx queues will be disabled by default.
 | 
			
		||||
-	 *  For now only rx queue 0 is enabled.
 | 
			
		||||
-	 */
 | 
			
		||||
-	priv->hw->mac->rx_queue_enable(priv->hw, queue);
 | 
			
		||||
+
 | 
			
		||||
+	for (chan = 0; chan < tx_channels_count; chan++)
 | 
			
		||||
+		stmmac_stop_tx_dma(priv, chan);
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user