struct ath79_spi {
struct spi_bitbang bitbang;
u32 ioc_base;
-@@ -69,6 +71,7 @@ static void ath79_spi_chipselect(struct
+@@ -69,6 +71,7 @@ static void ath79_spi_chipselect(struct
{
struct ath79_spi *sp = ath79_spidev_to_sp(spi);
int cs_high = (spi->mode & SPI_CS_HIGH) ? is_active : !is_active;
if (is_active) {
/* set initial clock polarity */
-@@ -80,20 +83,24 @@ static void ath79_spi_chipselect(struct
+@@ -80,20 +83,24 @@ static void ath79_spi_chipselect(struct
ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base);
}
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
-@@ -189,6 +189,12 @@ config MTD_BCM47XX_PARTS
+@@ -184,6 +184,12 @@ config MTD_BCM47XX_PARTS
This provides partitions parser for devices based on BCM47xx
boards.
depends on ADM5120 || ATHEROS_AR231X || ATHEROS_AR71XX || ATH79
--- a/drivers/mtd/Makefile
+++ b/drivers/mtd/Makefile
-@@ -20,6 +20,7 @@ obj-$(CONFIG_MTD_AR7_PARTS) += ar7part.o
+@@ -16,6 +16,7 @@ obj-$(CONFIG_MTD_AR7_PARTS) += ar7part.o
obj-$(CONFIG_MTD_BCM63XX_PARTS) += bcm63xxpart.o
obj-$(CONFIG_MTD_BCM47XX_PARTS) += bcm47xxpart.o
obj-$(CONFIG_MTD_MYLOADER_PARTS) += myloader.o
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
-@@ -191,7 +191,7 @@ config MTD_BCM47XX_PARTS
+@@ -186,7 +186,7 @@ config MTD_BCM47XX_PARTS
config MTD_WRT160NL_PARTS
tristate "Linksys WRT160NL partitioning support"
---help---
Linksys WRT160NL partitioning support
-@@ -211,6 +211,12 @@ config MTD_MYLOADER_PARTS
+@@ -206,6 +206,12 @@ config MTD_MYLOADER_PARTS
You will still need the parsing functions to be called by the driver
for your particular device. It won't happen automatically.
#
--- a/drivers/mtd/Makefile
+++ b/drivers/mtd/Makefile
-@@ -20,6 +20,7 @@ obj-$(CONFIG_MTD_AR7_PARTS) += ar7part.o
+@@ -16,6 +16,7 @@ obj-$(CONFIG_MTD_AR7_PARTS) += ar7part.o
obj-$(CONFIG_MTD_BCM63XX_PARTS) += bcm63xxpart.o
obj-$(CONFIG_MTD_BCM47XX_PARTS) += bcm47xxpart.o
obj-$(CONFIG_MTD_MYLOADER_PARTS) += myloader.o
+ size_t readlen;
+ size_t done;
+ int ret;
-
-- spi_sync(flash->spi, &m);
++
+ ret = wait_till_ready(flash);
+ if (ret) {
+ mutex_unlock(&flash->lock);
+ readlen = flash->max_read_len;
+ else
+ readlen = len;
-
-- *retlen = m.actual_length - m25p_cmdsz(flash) - dummy;
++
+ t[1].rx_buf = buf + ofs;
+ t[1].rx_nbits = m25p80_rx_nbits(flash);
+ t[1].len = readlen;
-
++
+ m25p_addr2cmd(flash, from + ofs, flash->command);
+
+ spi_sync(flash->spi, &m);
-+
+
+- spi_sync(flash->spi, &m);
+ done = m.actual_length - m25p_cmdsz(flash) -
+ dummy;
+ if (done != readlen) {
+ mutex_unlock(&flash->lock);
+ return 1;
+ }
-+
+
+- *retlen = m.actual_length - m25p_cmdsz(flash) - dummy;
+ ofs += done;
+ len -= done;
+ }
-+
+
+ *retlen = ofs;
mutex_unlock(&flash->lock);
return 0;
-@@ -1193,6 +1217,12 @@ static int m25p_probe(struct spi_device
+@@ -1193,6 +1217,12 @@ static int m25p_probe(struct spi_device
flash->mtd._unlock = m25p80_unlock;
}
--- a/drivers/mtd/devices/m25p80.c
+++ b/drivers/mtd/devices/m25p80.c
-@@ -1344,7 +1344,9 @@ static int m25p_probe(struct spi_device
+@@ -1344,7 +1344,9 @@ static int m25p_probe(struct spi_device
/* partitions should match sector boundaries; and it may be good to
* use readonly partitions for writeprotected sectors (BP2..BP0).
*/
--- a/drivers/mtd/devices/m25p80.c
+++ b/drivers/mtd/devices/m25p80.c
-@@ -1244,6 +1244,7 @@ static int m25p_probe(struct spi_device
+@@ -1244,6 +1244,7 @@ static int m25p_probe(struct spi_device
if (info->flags & M25P_NO_ERASE)
flash->mtd.flags |= MTD_NO_ERASE;
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
-@@ -951,6 +951,9 @@ config MIPS_MSC
+@@ -952,6 +952,9 @@ config MIPS_MSC
config MIPS_NILE4
bool
--- a/arch/mips/ath79/early_printk.c
+++ b/arch/mips/ath79/early_printk.c
-@@ -56,6 +56,46 @@ static void prom_putchar_dummy(unsigned
+@@ -56,6 +56,46 @@ static void prom_putchar_dummy(unsigned
/* nothing to do */
}
- u32 bootstrap;
+ void __iomem *phy_reg;
+ u32 t;
-
-- bootstrap = ath79_reset_rr(AR934X_RESET_REG_BOOTSTRAP);
-- if (bootstrap & AR934X_BOOTSTRAP_USB_MODE_DEVICE)
++
+ phy_reg = ioremap(base, 4);
+ if (!phy_reg)
- return;
-
++ return;
++
+ t = ioread32(phy_reg);
+ t &= ~0xff;
+ t |= 0x58;
+
+ iounmap(phy_reg);
+}
-+
+
+- bootstrap = ath79_reset_rr(AR934X_RESET_REG_BOOTSTRAP);
+- if (bootstrap & AR934X_BOOTSTRAP_USB_MODE_DEVICE)
+static void ar934x_usb_reset_notifier(struct platform_device *pdev)
+{
+ if (pdev->id != -1)
-+ return;
-+
+ return;
+
+ enable_tx_tx_idp_violation_fix(0x18116c94);
+ dev_info(&pdev->dev, "TX-TX IDP fix enabled\n");
+}
#define PB44_GPIO_SW_RESET (PB44_GPIO_EXP_BASE + 6)
#define PB44_GPIO_SW_JUMP (PB44_GPIO_EXP_BASE + 8)
#define PB44_GPIO_LED_JUMP1 (PB44_GPIO_EXP_BASE + 9)
-@@ -92,21 +117,66 @@ static struct ath79_spi_controller_data
+@@ -92,21 +117,66 @@ static struct ath79_spi_controller_data
.cs_line = 0,
};
+ ubnt_loco_m_xw_setup);
--- a/arch/mips/ath79/machtypes.h
+++ b/arch/mips/ath79/machtypes.h
-@@ -122,9 +122,11 @@ enum ath79_mach_type {
- ATH79_MACH_TL_WR941ND, /* TP-LINK TL-WR941ND */
+@@ -123,9 +123,11 @@ enum ath79_mach_type {
+ ATH79_MACH_TL_WR941ND_V5, /* TP-LINK TL-WR941ND v5 */
ATH79_MACH_UBNT_AIRROUTER, /* Ubiquiti AirRouter */
ATH79_MACH_UBNT_BULLET_M, /* Ubiquiti Bullet M */
+ ATH79_MACH_UBNT_LOCO_M_XW, /* Ubiquiti Loco M XW */
--- a/arch/mips/ath79/Kconfig
+++ b/arch/mips/ath79/Kconfig
-@@ -567,7 +567,7 @@ config ATH79_MACH_WNR2000
+@@ -452,7 +452,7 @@ config ATH79_MACH_WNR2000
select ATH79_DEV_WMAC
config ATH79_MACH_WNR2000_V3
select ATH79_DEV_ETH
--- a/arch/mips/ath79/machtypes.h
+++ b/arch/mips/ath79/machtypes.h
-@@ -173,6 +173,7 @@ enum ath79_mach_type {
+@@ -149,6 +149,7 @@ enum ath79_mach_type {
ATH79_MACH_WNR2000_V3, /* NETGEAR WNR2000 v3 */
ATH79_MACH_WNR2200, /* NETGEAR WNR2200 */
ATH79_MACH_WNR612_V2, /* NETGEAR WNR612 v2 */
obj-$(CONFIG_ATH79_MACH_WPE72) += mach-wpe72.o
--- a/arch/mips/ath79/machtypes.h
+++ b/arch/mips/ath79/machtypes.h
-@@ -145,6 +145,7 @@ enum ath79_mach_type {
+@@ -147,6 +147,7 @@ enum ath79_mach_type {
ATH79_MACH_WNDR4300, /* NETGEAR WNDR4300 */
ATH79_MACH_WNR2000, /* NETGEAR WNR2000 */
ATH79_MACH_WNR2000_V3, /* NETGEAR WNR2000 v3 */
+ ATH79_MACH_WNR2000_V4, /* NETGEAR WNR2000 v4 */
ATH79_MACH_WNR2200, /* NETGEAR WNR2200 */
ATH79_MACH_WNR612_V2, /* NETGEAR WNR612 v2 */
- ATH79_MACH_WP543, /* Compex WP543 */
+ ATH79_MACH_WNR1000_V2, /* NETGEAR WNR1000 v2 */
+ ATH79_MACH_TL_WR841N_V9, /* TP-LINK TL-WR841N/ND v9 */
ATH79_MACH_TL_WR842N_V2, /* TP-LINK TL-WR842N/ND v2 */
ATH79_MACH_TL_WR941ND, /* TP-LINK TL-WR941ND */
- ATH79_MACH_UBNT_AIRROUTER, /* Ubiquiti AirRouter */
+ ATH79_MACH_TL_WR941ND_V5, /* TP-LINK TL-WR941ND v5 */
#include "dev-ap9x-pci.h"
#include "dev-eth.h"
#include "dev-gpio-buttons.h"
-@@ -407,3 +409,65 @@ MIPS_MACHINE(ATH79_MACH_UBNT_NANO_M_XW,
+@@ -452,3 +454,65 @@ MIPS_MACHINE(ATH79_MACH_UBNT_NANO_M_XW,
MIPS_MACHINE(ATH79_MACH_UBNT_LOCO_M_XW, "UBNT-LOCO-XW", "Ubiquiti Loco M XW",
ubnt_loco_m_xw_setup);
+
--- a/arch/mips/ath79/machtypes.h
+++ b/arch/mips/ath79/machtypes.h
-@@ -144,6 +144,7 @@ enum ath79_mach_type {
- ATH79_MACH_TL_WR842N_V2, /* TP-LINK TL-WR842N/ND v2 */
+@@ -145,6 +145,7 @@ enum ath79_mach_type {
ATH79_MACH_TL_WR941ND, /* TP-LINK TL-WR941ND */
+ ATH79_MACH_TL_WR941ND_V5, /* TP-LINK TL-WR941ND v5 */
ATH79_MACH_TUBE2H, /* Alfa Network Tube2H */
+ ATH79_MACH_UBNT_AIRGW, /* Ubiquiti AirGateway */
ATH79_MACH_UBNT_AIRROUTER, /* Ubiquiti AirRouter */
if (cpu_wait)
--- a/arch/mips/include/asm/mach-ath79/ath79.h
+++ b/arch/mips/include/asm/mach-ath79/ath79.h
-@@ -144,6 +144,7 @@ static inline u32 ath79_pll_rr(unsigned
+@@ -144,6 +144,7 @@ static inline u32 ath79_pll_rr(unsigned
static inline void ath79_reset_wr(unsigned reg, u32 val)
{
__raw_writel(val, ath79_reset_base + reg);
--- a/arch/mips/ath79/machtypes.h
+++ b/arch/mips/ath79/machtypes.h
-@@ -185,6 +185,7 @@ enum ath79_mach_type {
+@@ -188,6 +188,7 @@ enum ath79_mach_type {
ATH79_MACH_WZR_HP_G300NH, /* Buffalo WZR-HP-G300NH */
ATH79_MACH_WZR_HP_G300NH2, /* Buffalo WZR-HP-G300NH2 */
ATH79_MACH_WZR_HP_G450H, /* Buffalo WZR-HP-G450H */
pdata->phy_if_mode = PHY_INTERFACE_MODE_GMII;
break;
-@@ -992,6 +1002,8 @@ void __init ath79_register_eth(unsigned
+@@ -992,6 +1002,8 @@ void __init ath79_register_eth(unsigned
break;
case ATH79_SOC_QCA9533:
if (id == 0) {
pdata->reset_bit = AR933X_RESET_GE0_MAC |
AR933X_RESET_GE0_MDIO;
-@@ -1097,6 +1109,8 @@ void __init ath79_register_eth(unsigned
+@@ -1097,6 +1109,8 @@ void __init ath79_register_eth(unsigned
case ATH79_SOC_AR9330:
case ATH79_SOC_AR9331:
case ATH79_SOC_QCA9533:
int __init pcibios_map_irq(const struct pci_dev *dev, uint8_t slot, uint8_t pin)
{
int irq = -1;
-@@ -86,6 +101,9 @@ int __init pcibios_map_irq(const struct
+@@ -86,6 +101,9 @@ int __init pcibios_map_irq(const struct
} else if (soc_is_qca955x()) {
ath79_pci_irq_map = qca955x_pci_irq_map;
ath79_pci_nr_irqs = ARRAY_SIZE(qca955x_pci_irq_map);
-Index: linux-3.14.28/arch/mips/ath79/Kconfig
-===================================================================
---- linux-3.14.28.orig/arch/mips/ath79/Kconfig
-+++ linux-3.14.28/arch/mips/ath79/Kconfig
+--- a/arch/mips/ath79/Kconfig
++++ b/arch/mips/ath79/Kconfig
@@ -803,6 +803,16 @@ config ATH79_MACH_TL_WAX50RE
select ATH79_DEV_M25P80
select ATH79_DEV_WMAC
config ATH79_MACH_TL_WA830RE_V2
bool "TP-LINK TL-WA830RE v2 support"
select SOC_AR934X
-Index: linux-3.14.28/arch/mips/ath79/Makefile
-===================================================================
---- linux-3.14.28.orig/arch/mips/ath79/Makefile
-+++ linux-3.14.28/arch/mips/ath79/Makefile
+--- a/arch/mips/ath79/Makefile
++++ b/arch/mips/ath79/Makefile
@@ -109,6 +109,7 @@ obj-$(CONFIG_ATH79_MACH_TL_MR13U) += mac
obj-$(CONFIG_ATH79_MACH_TL_MR3020) += mach-tl-mr3020.o
obj-$(CONFIG_ATH79_MACH_TL_MR3X20) += mach-tl-mr3x20.o
obj-$(CONFIG_ATH79_MACH_TL_WA830RE_V2) += mach-tl-wa830re-v2.o
obj-$(CONFIG_ATH79_MACH_TL_WA901ND) += mach-tl-wa901nd.o
obj-$(CONFIG_ATH79_MACH_TL_WA901ND_V2) += mach-tl-wa901nd-v2.o
-Index: linux-3.14.28/arch/mips/ath79/machtypes.h
-===================================================================
---- linux-3.14.28.orig/arch/mips/ath79/machtypes.h
-+++ linux-3.14.28/arch/mips/ath79/machtypes.h
+--- a/arch/mips/ath79/machtypes.h
++++ b/arch/mips/ath79/machtypes.h
@@ -126,6 +126,7 @@ enum ath79_mach_type {
ATH79_MACH_TL_MR3220_V2, /* TP-LINK TL-MR3220 v2 */
ATH79_MACH_TL_MR3420, /* TP-LINK TL-MR3420 */
#include <asm/uaccess.h>
#include <linux/proc_fs.h>
-@@ -771,10 +772,10 @@ static void tcp_v6_send_response(struct
+@@ -771,10 +772,10 @@ static void tcp_v6_send_response(struct
topt = (__be32 *)(t1 + 1);
if (tsecr) {
#include <linux/netdevice.h>
--- a/include/net/inet_ecn.h
+++ b/include/net/inet_ecn.h
-@@ -115,13 +115,13 @@ static inline int IP6_ECN_set_ce(struct
+@@ -115,13 +115,13 @@ static inline int IP6_ECN_set_ce(struct
{
if (INET_ECN_is_not_ect(ipv6_get_dsfield(iph)))
return 0;
ptr = ip6hoff + sizeof(struct ipv6hdr);
--- a/net/xfrm/xfrm_input.c
+++ b/net/xfrm/xfrm_input.c
-@@ -77,8 +77,8 @@ int xfrm_parse_spi(struct sk_buff *skb,
+@@ -77,8 +77,8 @@ int xfrm_parse_spi(struct sk_buff *skb,
if (!pskb_may_pull(skb, hlen))
return -EINVAL;