mirror of
https://github.com/hak5/wifipineapple-openwrt.git
synced 2025-10-29 16:57:19 +00:00
kernel: remove linux 4.0
Signed-off-by: Felix Fietkau <nbd@openwrt.org> git-svn-id: svn://svn.openwrt.org/openwrt/branches/chaos_calmer@45975 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
@@ -3,10 +3,8 @@
|
||||
LINUX_RELEASE?=1
|
||||
|
||||
LINUX_VERSION-3.18 = .14
|
||||
LINUX_VERSION-4.0 = .4
|
||||
|
||||
LINUX_KERNEL_MD5SUM-3.18.14 = cb6f534b83333ba52f1fed7979824a1b
|
||||
LINUX_KERNEL_MD5SUM-4.0.4 = 71d8b666438e6b59f103e9384889c15a
|
||||
|
||||
ifdef KERNEL_PATCHVER
|
||||
LINUX_VERSION:=$(KERNEL_PATCHVER)$(strip $(LINUX_VERSION-$(KERNEL_PATCHVER)))
|
||||
|
||||
@@ -1,73 +0,0 @@
|
||||
From 9a6a2b96dfd8b01336f8519a5be7fb353cfa62fb Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Sat, 14 Mar 2015 17:55:54 +0100
|
||||
Subject: [PATCH] MIPS: BCM47XX: Support SPROM prefixes for PCI devices
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Support parsing SPROMs with prefixes defined like devpath1=pci/1/1
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/9552/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/sprom.c | 33 +++++++++++++++++++++++++++++++++
|
||||
1 file changed, 33 insertions(+)
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/sprom.c b/arch/mips/bcm47xx/sprom.c
|
||||
index 2eff7fe..eff9205 100644
|
||||
--- a/arch/mips/bcm47xx/sprom.c
|
||||
+++ b/arch/mips/bcm47xx/sprom.c
|
||||
@@ -836,6 +836,38 @@ static int bcm47xx_get_sprom_ssb(struct ssb_bus *bus, struct ssb_sprom *out)
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_BCM47XX_BCMA)
|
||||
+/*
|
||||
+ * Having many NVRAM entries for PCI devices led to repeating prefixes like
|
||||
+ * pci/1/1/ all the time and wasting flash space. So at some point Broadcom
|
||||
+ * decided to introduce prefixes like 0: 1: 2: etc.
|
||||
+ * If we find e.g. devpath0=pci/2/1 or devpath0=pci/2/1/ we should use 0:
|
||||
+ * instead of pci/2/1/.
|
||||
+ */
|
||||
+static void bcm47xx_sprom_apply_prefix_alias(char *prefix, size_t prefix_size)
|
||||
+{
|
||||
+ size_t prefix_len = strlen(prefix);
|
||||
+ size_t short_len = prefix_len - 1;
|
||||
+ char nvram_var[10];
|
||||
+ char buf[20];
|
||||
+ int i;
|
||||
+
|
||||
+ /* Passed prefix has to end with a slash */
|
||||
+ if (prefix_len <= 0 || prefix[prefix_len - 1] != '/')
|
||||
+ return;
|
||||
+
|
||||
+ for (i = 0; i < 3; i++) {
|
||||
+ if (snprintf(nvram_var, sizeof(nvram_var), "devpath%d", i) <= 0)
|
||||
+ continue;
|
||||
+ if (bcm47xx_nvram_getenv(nvram_var, buf, sizeof(buf)) < 0)
|
||||
+ continue;
|
||||
+ if (!strcmp(buf, prefix) ||
|
||||
+ (short_len && strlen(buf) == short_len && !strncmp(buf, prefix, short_len))) {
|
||||
+ snprintf(prefix, prefix_size, "%d:", i);
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int bcm47xx_get_sprom_bcma(struct bcma_bus *bus, struct ssb_sprom *out)
|
||||
{
|
||||
char prefix[10];
|
||||
@@ -847,6 +879,7 @@ static int bcm47xx_get_sprom_bcma(struct bcma_bus *bus, struct ssb_sprom *out)
|
||||
snprintf(prefix, sizeof(prefix), "pci/%u/%u/",
|
||||
bus->host_pci->bus->number + 1,
|
||||
PCI_SLOT(bus->host_pci->devfn));
|
||||
+ bcm47xx_sprom_apply_prefix_alias(prefix, sizeof(prefix));
|
||||
bcm47xx_fill_sprom(out, prefix, false);
|
||||
return 0;
|
||||
case BCMA_HOSTTYPE_SOC:
|
||||
--
|
||||
1.8.4.5
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
From 23d2bc42aceb829eaf90c694941e4523c22865e8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Wed, 10 Dec 2014 11:49:53 +0100
|
||||
Subject: [PATCH] MIPS: BCM47XX: Use helpers for reading NVRAM content
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Also drop some unneeded memset-s.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Cc: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Cc: Paul Walmsley <paul@pwsan.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/8661/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/nvram.c | 7 ++-----
|
||||
1 file changed, 2 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/nvram.c b/arch/mips/bcm47xx/nvram.c
|
||||
index c5c381c..5e4ae04 100644
|
||||
--- a/arch/mips/bcm47xx/nvram.c
|
||||
+++ b/arch/mips/bcm47xx/nvram.c
|
||||
@@ -91,7 +91,6 @@ static int nvram_find_and_copy(void __iomem *iobase, u32 lim)
|
||||
return -ENXIO;
|
||||
|
||||
found:
|
||||
-
|
||||
if (header->len > size)
|
||||
pr_err("The nvram size accoridng to the header seems to be bigger than the partition on flash\n");
|
||||
if (header->len > NVRAM_SPACE)
|
||||
@@ -101,10 +100,9 @@ found:
|
||||
src = (u32 *) header;
|
||||
dst = (u32 *) nvram_buf;
|
||||
for (i = 0; i < sizeof(struct nvram_header); i += 4)
|
||||
- *dst++ = *src++;
|
||||
+ *dst++ = __raw_readl(src++);
|
||||
for (; i < header->len && i < NVRAM_SPACE && i < size; i += 4)
|
||||
- *dst++ = le32_to_cpu(*src++);
|
||||
- memset(dst, 0x0, NVRAM_SPACE - i);
|
||||
+ *dst++ = readl(src++);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -165,7 +163,6 @@ static int nvram_init(void)
|
||||
err = mtd_read(mtd, from, len, &bytes_read, dst);
|
||||
if (err)
|
||||
return err;
|
||||
- memset(dst + bytes_read, 0x0, NVRAM_SPACE - bytes_read);
|
||||
|
||||
return 0;
|
||||
}
|
||||
--
|
||||
1.8.4.5
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
From 80aaaa8b93d860f828e2cf883f307894640765f0 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Wed, 10 Dec 2014 11:49:54 +0100
|
||||
Subject: [PATCH] MIPS: BCM47XX: Use strnchr to avoid reading out of the buffer
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Cc: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Cc: Paul Walmsley <paul@pwsan.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/8662/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/nvram.c | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/nvram.c b/arch/mips/bcm47xx/nvram.c
|
||||
index 5e4ae04..d805d8a 100644
|
||||
--- a/arch/mips/bcm47xx/nvram.c
|
||||
+++ b/arch/mips/bcm47xx/nvram.c
|
||||
@@ -175,7 +175,7 @@ static int nvram_init(void)
|
||||
int bcm47xx_nvram_getenv(const char *name, char *val, size_t val_len)
|
||||
{
|
||||
char *var, *value, *end, *eq;
|
||||
- int err;
|
||||
+ int data_left, err;
|
||||
|
||||
if (!name)
|
||||
return -EINVAL;
|
||||
@@ -191,7 +191,9 @@ int bcm47xx_nvram_getenv(const char *name, char *val, size_t val_len)
|
||||
end = nvram_buf + sizeof(nvram_buf) - 2;
|
||||
end[0] = end[1] = '\0';
|
||||
for (; *var; var = value + strlen(value) + 1) {
|
||||
- eq = strchr(var, '=');
|
||||
+ data_left = end - var;
|
||||
+
|
||||
+ eq = strnchr(var, data_left, '=');
|
||||
if (!eq)
|
||||
break;
|
||||
value = eq + 1;
|
||||
--
|
||||
1.8.4.5
|
||||
|
||||
@@ -1,249 +0,0 @@
|
||||
From 138173d4e826587da66c7d321da1a91283222536 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Mon, 1 Dec 2014 07:58:18 +0100
|
||||
Subject: [PATCH] MIPS: BCM47xx: Move NVRAM header to the include/linux/.
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
There are two reasons for having this header in the common place:
|
||||
1) Simplifying drivers that read NVRAM entries. We will be able to
|
||||
safely call bcm47xx_nvram_* functions without #ifdef-s.
|
||||
2) Getting NVRAM driver out of MIPS arch code. This is needed to support
|
||||
BCM5301X arch which also requires this NVRAM driver. Patch for that
|
||||
will follow once we get is reviewed.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: Arnd Bergmann <arnd@arndb.de>
|
||||
Cc: Paul Walmsley <paul@pwsan.com>
|
||||
Cc: linux-soc@vger.kernel.org
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/8619/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/board.c | 2 +-
|
||||
arch/mips/bcm47xx/nvram.c | 2 +-
|
||||
arch/mips/bcm47xx/setup.c | 1 -
|
||||
arch/mips/bcm47xx/sprom.c | 1 -
|
||||
arch/mips/bcm47xx/time.c | 1 -
|
||||
arch/mips/include/asm/mach-bcm47xx/bcm47xx.h | 1 +
|
||||
arch/mips/include/asm/mach-bcm47xx/bcm47xx_nvram.h | 21 -------------
|
||||
drivers/bcma/driver_mips.c | 2 +-
|
||||
drivers/net/ethernet/broadcom/b44.c | 2 +-
|
||||
drivers/net/ethernet/broadcom/bgmac.c | 2 +-
|
||||
drivers/ssb/driver_chipcommon_pmu.c | 2 +-
|
||||
drivers/ssb/driver_mipscore.c | 2 +-
|
||||
include/linux/bcm47xx_nvram.h | 34 ++++++++++++++++++++++
|
||||
13 files changed, 42 insertions(+), 31 deletions(-)
|
||||
delete mode 100644 arch/mips/include/asm/mach-bcm47xx/bcm47xx_nvram.h
|
||||
create mode 100644 include/linux/bcm47xx_nvram.h
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/board.c b/arch/mips/bcm47xx/board.c
|
||||
index b3ae068..6e85130 100644
|
||||
--- a/arch/mips/bcm47xx/board.c
|
||||
+++ b/arch/mips/bcm47xx/board.c
|
||||
@@ -1,8 +1,8 @@
|
||||
#include <linux/errno.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/string.h>
|
||||
+#include <bcm47xx.h>
|
||||
#include <bcm47xx_board.h>
|
||||
-#include <bcm47xx_nvram.h>
|
||||
|
||||
struct bcm47xx_board_type {
|
||||
const enum bcm47xx_board board;
|
||||
diff --git a/arch/mips/bcm47xx/nvram.c b/arch/mips/bcm47xx/nvram.c
|
||||
index d805d8a..7c77a88 100644
|
||||
--- a/arch/mips/bcm47xx/nvram.c
|
||||
+++ b/arch/mips/bcm47xx/nvram.c
|
||||
@@ -16,7 +16,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
-#include <bcm47xx_nvram.h>
|
||||
+#include <linux/bcm47xx_nvram.h>
|
||||
|
||||
#define NVRAM_MAGIC 0x48534C46 /* 'FLSH' */
|
||||
#define NVRAM_SPACE 0x8000
|
||||
diff --git a/arch/mips/bcm47xx/setup.c b/arch/mips/bcm47xx/setup.c
|
||||
index e43b504..b26c9c2 100644
|
||||
--- a/arch/mips/bcm47xx/setup.c
|
||||
+++ b/arch/mips/bcm47xx/setup.c
|
||||
@@ -42,7 +42,6 @@
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/time.h>
|
||||
#include <bcm47xx.h>
|
||||
-#include <bcm47xx_nvram.h>
|
||||
#include <bcm47xx_board.h>
|
||||
|
||||
union bcm47xx_bus bcm47xx_bus;
|
||||
diff --git a/arch/mips/bcm47xx/sprom.c b/arch/mips/bcm47xx/sprom.c
|
||||
index eff9205..c114b02 100644
|
||||
--- a/arch/mips/bcm47xx/sprom.c
|
||||
+++ b/arch/mips/bcm47xx/sprom.c
|
||||
@@ -27,7 +27,6 @@
|
||||
*/
|
||||
|
||||
#include <bcm47xx.h>
|
||||
-#include <bcm47xx_nvram.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/etherdevice.h>
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/time.c b/arch/mips/bcm47xx/time.c
|
||||
index 2c85d92..5b46510 100644
|
||||
--- a/arch/mips/bcm47xx/time.c
|
||||
+++ b/arch/mips/bcm47xx/time.c
|
||||
@@ -27,7 +27,6 @@
|
||||
#include <linux/ssb/ssb.h>
|
||||
#include <asm/time.h>
|
||||
#include <bcm47xx.h>
|
||||
-#include <bcm47xx_nvram.h>
|
||||
#include <bcm47xx_board.h>
|
||||
|
||||
void __init plat_time_init(void)
|
||||
diff --git a/arch/mips/include/asm/mach-bcm47xx/bcm47xx.h b/arch/mips/include/asm/mach-bcm47xx/bcm47xx.h
|
||||
index 7527c1d..8ed77f6 100644
|
||||
--- a/arch/mips/include/asm/mach-bcm47xx/bcm47xx.h
|
||||
+++ b/arch/mips/include/asm/mach-bcm47xx/bcm47xx.h
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <linux/ssb/ssb.h>
|
||||
#include <linux/bcma/bcma.h>
|
||||
#include <linux/bcma/bcma_soc.h>
|
||||
+#include <linux/bcm47xx_nvram.h>
|
||||
|
||||
enum bcm47xx_bus_type {
|
||||
#ifdef CONFIG_BCM47XX_SSB
|
||||
--- a/arch/mips/include/asm/mach-bcm47xx/bcm47xx_nvram.h
|
||||
+++ b/arch/mips/include/asm/mach-bcm47xx/bcm47xx_nvram.h
|
||||
@@ -1,21 +1 @@
|
||||
-/*
|
||||
- * Copyright (C) 2005, Broadcom Corporation
|
||||
- * Copyright (C) 2006, Felix Fietkau <nbd@openwrt.org>
|
||||
- *
|
||||
- * This program is free software; you can redistribute it and/or modify it
|
||||
- * under the terms of the GNU General Public License as published by the
|
||||
- * Free Software Foundation; either version 2 of the License, or (at your
|
||||
- * option) any later version.
|
||||
- */
|
||||
-
|
||||
-#ifndef __BCM47XX_NVRAM_H
|
||||
-#define __BCM47XX_NVRAM_H
|
||||
-
|
||||
-#include <linux/types.h>
|
||||
-#include <linux/kernel.h>
|
||||
-
|
||||
-int bcm47xx_nvram_init_from_mem(u32 base, u32 lim);
|
||||
-int bcm47xx_nvram_getenv(const char *name, char *val, size_t val_len);
|
||||
-int bcm47xx_nvram_gpio_pin(const char *name);
|
||||
-
|
||||
-#endif /* __BCM47XX_NVRAM_H */
|
||||
+#include <linux/bcm47xx_nvram.h>
|
||||
diff --git a/drivers/bcma/driver_mips.c b/drivers/bcma/driver_mips.c
|
||||
index 04faf6d..24424f3 100644
|
||||
--- a/drivers/bcma/driver_mips.c
|
||||
+++ b/drivers/bcma/driver_mips.c
|
||||
@@ -21,7 +21,7 @@
|
||||
#include <linux/serial_reg.h>
|
||||
#include <linux/time.h>
|
||||
#ifdef CONFIG_BCM47XX
|
||||
-#include <bcm47xx_nvram.h>
|
||||
+#include <linux/bcm47xx_nvram.h>
|
||||
#endif
|
||||
|
||||
enum bcma_boot_dev {
|
||||
diff --git a/drivers/net/ethernet/broadcom/b44.c b/drivers/net/ethernet/broadcom/b44.c
|
||||
index bd5916a..77363d6 100644
|
||||
--- a/drivers/net/ethernet/broadcom/b44.c
|
||||
+++ b/drivers/net/ethernet/broadcom/b44.c
|
||||
@@ -400,7 +400,7 @@ static void b44_set_flow_ctrl(struct b44 *bp, u32 local, u32 remote)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BCM47XX
|
||||
-#include <bcm47xx_nvram.h>
|
||||
+#include <linux/bcm47xx_nvram.h>
|
||||
static void b44_wap54g10_workaround(struct b44 *bp)
|
||||
{
|
||||
char buf[20];
|
||||
diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c
|
||||
index 0469f72..be059df 100644
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.c
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.c
|
||||
@@ -18,7 +18,7 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/platform_data/b53.h>
|
||||
-#include <bcm47xx_nvram.h>
|
||||
+#include <linux/bcm47xx_nvram.h>
|
||||
|
||||
static const struct bcma_device_id bgmac_bcma_tbl[] = {
|
||||
BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_4706_MAC_GBIT, BCMA_ANY_REV, BCMA_ANY_CLASS),
|
||||
diff --git a/drivers/ssb/driver_chipcommon_pmu.c b/drivers/ssb/driver_chipcommon_pmu.c
|
||||
index 1173a09..0942841 100644
|
||||
--- a/drivers/ssb/driver_chipcommon_pmu.c
|
||||
+++ b/drivers/ssb/driver_chipcommon_pmu.c
|
||||
@@ -14,7 +14,7 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/export.h>
|
||||
#ifdef CONFIG_BCM47XX
|
||||
-#include <bcm47xx_nvram.h>
|
||||
+#include <linux/bcm47xx_nvram.h>
|
||||
#endif
|
||||
|
||||
#include "ssb_private.h"
|
||||
diff --git a/drivers/ssb/driver_mipscore.c b/drivers/ssb/driver_mipscore.c
|
||||
index 7b986f9..f87efef 100644
|
||||
--- a/drivers/ssb/driver_mipscore.c
|
||||
+++ b/drivers/ssb/driver_mipscore.c
|
||||
@@ -16,7 +16,7 @@
|
||||
#include <linux/serial_reg.h>
|
||||
#include <linux/time.h>
|
||||
#ifdef CONFIG_BCM47XX
|
||||
-#include <bcm47xx_nvram.h>
|
||||
+#include <linux/bcm47xx_nvram.h>
|
||||
#endif
|
||||
|
||||
#include "ssb_private.h"
|
||||
diff --git a/include/linux/bcm47xx_nvram.h b/include/linux/bcm47xx_nvram.h
|
||||
new file mode 100644
|
||||
index 0000000..b12b07e
|
||||
--- /dev/null
|
||||
+++ b/include/linux/bcm47xx_nvram.h
|
||||
@@ -0,0 +1,34 @@
|
||||
+/*
|
||||
+ * This program is free software; you can redistribute it and/or modify it
|
||||
+ * under the terms of the GNU General Public License as published by the
|
||||
+ * Free Software Foundation; either version 2 of the License, or (at your
|
||||
+ * option) any later version.
|
||||
+ */
|
||||
+
|
||||
+#ifndef __BCM47XX_NVRAM_H
|
||||
+#define __BCM47XX_NVRAM_H
|
||||
+
|
||||
+#include <linux/types.h>
|
||||
+#include <linux/kernel.h>
|
||||
+
|
||||
+#ifdef CONFIG_BCM47XX
|
||||
+int bcm47xx_nvram_init_from_mem(u32 base, u32 lim);
|
||||
+int bcm47xx_nvram_getenv(const char *name, char *val, size_t val_len);
|
||||
+int bcm47xx_nvram_gpio_pin(const char *name);
|
||||
+#else
|
||||
+static inline int bcm47xx_nvram_init_from_mem(u32 base, u32 lim)
|
||||
+{
|
||||
+ return -ENOTSUPP;
|
||||
+};
|
||||
+static inline int bcm47xx_nvram_getenv(const char *name, char *val,
|
||||
+ size_t val_len)
|
||||
+{
|
||||
+ return -ENOTSUPP;
|
||||
+};
|
||||
+static inline int bcm47xx_nvram_gpio_pin(const char *name)
|
||||
+{
|
||||
+ return -ENOTSUPP;
|
||||
+};
|
||||
+#endif
|
||||
+
|
||||
+#endif /* __BCM47XX_NVRAM_H */
|
||||
--
|
||||
1.8.4.5
|
||||
|
||||
@@ -1,277 +0,0 @@
|
||||
From d548ca6b0784a99f0fcae397f115823ccd0361a5 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Wed, 10 Dec 2014 17:38:26 +0100
|
||||
Subject: [PATCH] MIPS: BCM47XX: Fix coding style to match kernel standards
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
[ralf@linux-mips.org: Fixed conflicts.]
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: Paul Walmsley <paul@pwsan.com>
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/8665/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/bcm47xx_private.h | 4 ++++
|
||||
arch/mips/bcm47xx/board.c | 3 +--
|
||||
arch/mips/bcm47xx/nvram.c | 25 ++++++++++++++-----------
|
||||
arch/mips/bcm47xx/prom.c | 3 +--
|
||||
arch/mips/bcm47xx/serial.c | 8 ++++----
|
||||
arch/mips/bcm47xx/setup.c | 12 ++++++------
|
||||
arch/mips/bcm47xx/sprom.c | 8 ++++----
|
||||
arch/mips/bcm47xx/time.c | 1 -
|
||||
8 files changed, 34 insertions(+), 30 deletions(-)
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/bcm47xx_private.h b/arch/mips/bcm47xx/bcm47xx_private.h
|
||||
index ea909a5..41796be 100644
|
||||
--- a/arch/mips/bcm47xx/bcm47xx_private.h
|
||||
+++ b/arch/mips/bcm47xx/bcm47xx_private.h
|
||||
@@ -1,6 +1,10 @@
|
||||
#ifndef LINUX_BCM47XX_PRIVATE_H_
|
||||
#define LINUX_BCM47XX_PRIVATE_H_
|
||||
|
||||
+#ifndef pr_fmt
|
||||
+#define pr_fmt(fmt) "bcm47xx: " fmt
|
||||
+#endif
|
||||
+
|
||||
#include <linux/kernel.h>
|
||||
|
||||
/* prom.c */
|
||||
diff --git a/arch/mips/bcm47xx/board.c b/arch/mips/bcm47xx/board.c
|
||||
index 6e85130..d4a5a51 100644
|
||||
--- a/arch/mips/bcm47xx/board.c
|
||||
+++ b/arch/mips/bcm47xx/board.c
|
||||
@@ -330,9 +330,8 @@ void __init bcm47xx_board_detect(void)
|
||||
err = bcm47xx_nvram_getenv("boardtype", buf, sizeof(buf));
|
||||
|
||||
/* init of nvram failed, probably too early now */
|
||||
- if (err == -ENXIO) {
|
||||
+ if (err == -ENXIO)
|
||||
return;
|
||||
- }
|
||||
|
||||
board_detected = bcm47xx_board_get_nvram();
|
||||
bcm47xx_board.board = board_detected->board;
|
||||
diff --git a/arch/mips/bcm47xx/nvram.c b/arch/mips/bcm47xx/nvram.c
|
||||
index 7c77a88..6a97732 100644
|
||||
--- a/arch/mips/bcm47xx/nvram.c
|
||||
+++ b/arch/mips/bcm47xx/nvram.c
|
||||
@@ -18,8 +18,10 @@
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/bcm47xx_nvram.h>
|
||||
|
||||
-#define NVRAM_MAGIC 0x48534C46 /* 'FLSH' */
|
||||
-#define NVRAM_SPACE 0x8000
|
||||
+#define NVRAM_MAGIC 0x48534C46 /* 'FLSH' */
|
||||
+#define NVRAM_SPACE 0x8000
|
||||
+#define NVRAM_MAX_GPIO_ENTRIES 32
|
||||
+#define NVRAM_MAX_GPIO_VALUE_LEN 30
|
||||
|
||||
#define FLASH_MIN 0x00020000 /* Minimum flash size */
|
||||
|
||||
@@ -97,8 +99,8 @@ found:
|
||||
pr_err("nvram on flash (%i bytes) is bigger than the reserved space in memory, will just copy the first %i bytes\n",
|
||||
header->len, NVRAM_SPACE);
|
||||
|
||||
- src = (u32 *) header;
|
||||
- dst = (u32 *) nvram_buf;
|
||||
+ src = (u32 *)header;
|
||||
+ dst = (u32 *)nvram_buf;
|
||||
for (i = 0; i < sizeof(struct nvram_header); i += 4)
|
||||
*dst++ = __raw_readl(src++);
|
||||
for (; i < header->len && i < NVRAM_SPACE && i < size; i += 4)
|
||||
@@ -189,7 +191,8 @@ int bcm47xx_nvram_getenv(const char *name, char *val, size_t val_len)
|
||||
/* Look for name=value and return value */
|
||||
var = &nvram_buf[sizeof(struct nvram_header)];
|
||||
end = nvram_buf + sizeof(nvram_buf) - 2;
|
||||
- end[0] = end[1] = '\0';
|
||||
+ end[0] = '\0';
|
||||
+ end[1] = '\0';
|
||||
for (; *var; var = value + strlen(value) + 1) {
|
||||
data_left = end - var;
|
||||
|
||||
@@ -197,11 +200,10 @@ int bcm47xx_nvram_getenv(const char *name, char *val, size_t val_len)
|
||||
if (!eq)
|
||||
break;
|
||||
value = eq + 1;
|
||||
- if ((eq - var) == strlen(name) &&
|
||||
- strncmp(var, name, (eq - var)) == 0) {
|
||||
+ if (eq - var == strlen(name) &&
|
||||
+ strncmp(var, name, eq - var) == 0)
|
||||
return snprintf(val, val_len, "%s", value);
|
||||
}
|
||||
- }
|
||||
return -ENOENT;
|
||||
}
|
||||
EXPORT_SYMBOL(bcm47xx_nvram_getenv);
|
||||
@@ -209,10 +211,11 @@ EXPORT_SYMBOL(bcm47xx_nvram_getenv);
|
||||
int bcm47xx_nvram_gpio_pin(const char *name)
|
||||
{
|
||||
int i, err;
|
||||
- char nvram_var[10];
|
||||
- char buf[30];
|
||||
+ char nvram_var[] = "gpioXX";
|
||||
+ char buf[NVRAM_MAX_GPIO_VALUE_LEN];
|
||||
|
||||
- for (i = 0; i < 32; i++) {
|
||||
+ /* TODO: Optimize it to don't call getenv so many times */
|
||||
+ for (i = 0; i < NVRAM_MAX_GPIO_ENTRIES; i++) {
|
||||
err = snprintf(nvram_var, sizeof(nvram_var), "gpio%i", i);
|
||||
if (err <= 0)
|
||||
continue;
|
||||
diff --git a/arch/mips/bcm47xx/prom.c b/arch/mips/bcm47xx/prom.c
|
||||
index 1b170bf..ab698ba 100644
|
||||
--- a/arch/mips/bcm47xx/prom.c
|
||||
+++ b/arch/mips/bcm47xx/prom.c
|
||||
@@ -35,7 +35,6 @@
|
||||
#include <bcm47xx.h>
|
||||
#include <bcm47xx_board.h>
|
||||
|
||||
-
|
||||
static char bcm47xx_system_type[20] = "Broadcom BCM47XX";
|
||||
|
||||
const char *get_system_type(void)
|
||||
@@ -83,7 +82,7 @@ static __init void prom_init_mem(void)
|
||||
/* Loop condition may be not enough, off may be over 1 MiB */
|
||||
if (off + mem >= max) {
|
||||
mem = max;
|
||||
- printk(KERN_DEBUG "assume 128MB RAM\n");
|
||||
+ pr_debug("Assume 128MB RAM\n");
|
||||
break;
|
||||
}
|
||||
if (!memcmp(prom_init, prom_init + mem, 32))
|
||||
diff --git a/arch/mips/bcm47xx/serial.c b/arch/mips/bcm47xx/serial.c
|
||||
index 2f5bbd6..df761d3 100644
|
||||
--- a/arch/mips/bcm47xx/serial.c
|
||||
+++ b/arch/mips/bcm47xx/serial.c
|
||||
@@ -36,8 +36,8 @@ static int __init uart8250_init_ssb(void)
|
||||
struct plat_serial8250_port *p = &(uart8250_data[i]);
|
||||
struct ssb_serial_port *ssb_port = &(mcore->serial_ports[i]);
|
||||
|
||||
- p->mapbase = (unsigned int) ssb_port->regs;
|
||||
- p->membase = (void *) ssb_port->regs;
|
||||
+ p->mapbase = (unsigned int)ssb_port->regs;
|
||||
+ p->membase = (void *)ssb_port->regs;
|
||||
p->irq = ssb_port->irq + 2;
|
||||
p->uartclk = ssb_port->baud_base;
|
||||
p->regshift = ssb_port->reg_shift;
|
||||
@@ -62,8 +62,8 @@ static int __init uart8250_init_bcma(void)
|
||||
struct bcma_serial_port *bcma_port;
|
||||
bcma_port = &(cc->serial_ports[i]);
|
||||
|
||||
- p->mapbase = (unsigned int) bcma_port->regs;
|
||||
- p->membase = (void *) bcma_port->regs;
|
||||
+ p->mapbase = (unsigned int)bcma_port->regs;
|
||||
+ p->membase = (void *)bcma_port->regs;
|
||||
p->irq = bcma_port->irq;
|
||||
p->uartclk = bcma_port->baud_base;
|
||||
p->regshift = bcma_port->reg_shift;
|
||||
diff --git a/arch/mips/bcm47xx/setup.c b/arch/mips/bcm47xx/setup.c
|
||||
index b26c9c2..82ff9fd 100644
|
||||
--- a/arch/mips/bcm47xx/setup.c
|
||||
+++ b/arch/mips/bcm47xx/setup.c
|
||||
@@ -52,7 +52,7 @@ EXPORT_SYMBOL(bcm47xx_bus_type);
|
||||
|
||||
static void bcm47xx_machine_restart(char *command)
|
||||
{
|
||||
- printk(KERN_ALERT "Please stand by while rebooting the system...\n");
|
||||
+ pr_alert("Please stand by while rebooting the system...\n");
|
||||
local_irq_disable();
|
||||
/* Set the watchdog timer to reset immediately */
|
||||
switch (bcm47xx_bus_type) {
|
||||
@@ -107,7 +107,7 @@ static int bcm47xx_get_invariants(struct ssb_bus *bus,
|
||||
char buf[20];
|
||||
|
||||
/* Fill boardinfo structure */
|
||||
- memset(&(iv->boardinfo), 0 , sizeof(struct ssb_boardinfo));
|
||||
+ memset(&iv->boardinfo, 0 , sizeof(struct ssb_boardinfo));
|
||||
|
||||
bcm47xx_fill_ssb_boardinfo(&iv->boardinfo, NULL);
|
||||
|
||||
@@ -126,7 +126,7 @@ static void __init bcm47xx_register_ssb(void)
|
||||
char buf[100];
|
||||
struct ssb_mipscore *mcore;
|
||||
|
||||
- err = ssb_bus_ssbbus_register(&(bcm47xx_bus.ssb), SSB_ENUM_BASE,
|
||||
+ err = ssb_bus_ssbbus_register(&bcm47xx_bus.ssb, SSB_ENUM_BASE,
|
||||
bcm47xx_get_invariants);
|
||||
if (err)
|
||||
panic("Failed to initialize SSB bus (err %d)", err);
|
||||
@@ -136,7 +136,7 @@ static void __init bcm47xx_register_ssb(void)
|
||||
if (strstr(buf, "console=ttyS1")) {
|
||||
struct ssb_serial_port port;
|
||||
|
||||
- printk(KERN_DEBUG "Swapping serial ports!\n");
|
||||
+ pr_debug("Swapping serial ports!\n");
|
||||
/* swap serial ports */
|
||||
memcpy(&port, &mcore->serial_ports[0], sizeof(port));
|
||||
memcpy(&mcore->serial_ports[0], &mcore->serial_ports[1],
|
||||
@@ -168,7 +168,7 @@ void __init plat_mem_setup(void)
|
||||
struct cpuinfo_mips *c = ¤t_cpu_data;
|
||||
|
||||
if ((c->cputype == CPU_74K) || (c->cputype == CPU_1074K)) {
|
||||
- printk(KERN_INFO "bcm47xx: using bcma bus\n");
|
||||
+ pr_info("Using bcma bus\n");
|
||||
#ifdef CONFIG_BCM47XX_BCMA
|
||||
bcm47xx_bus_type = BCM47XX_BUS_TYPE_BCMA;
|
||||
bcm47xx_sprom_register_fallbacks();
|
||||
@@ -179,7 +179,7 @@ void __init plat_mem_setup(void)
|
||||
#endif
|
||||
#endif
|
||||
} else {
|
||||
- printk(KERN_INFO "bcm47xx: using ssb bus\n");
|
||||
+ pr_info("Using ssb bus\n");
|
||||
#ifdef CONFIG_BCM47XX_SSB
|
||||
bcm47xx_bus_type = BCM47XX_BUS_TYPE_SSB;
|
||||
bcm47xx_sprom_register_fallbacks();
|
||||
diff --git a/arch/mips/bcm47xx/sprom.c b/arch/mips/bcm47xx/sprom.c
|
||||
index c114b02..5d32afc 100644
|
||||
--- a/arch/mips/bcm47xx/sprom.c
|
||||
+++ b/arch/mips/bcm47xx/sprom.c
|
||||
@@ -780,8 +780,8 @@ void bcm47xx_fill_sprom(struct ssb_sprom *sprom, const char *prefix,
|
||||
bcm47xx_fill_sprom_path_r4589(sprom, prefix, fallback);
|
||||
break;
|
||||
default:
|
||||
- pr_warn("Unsupported SPROM revision %d detected. Will extract"
|
||||
- " v1\n", sprom->revision);
|
||||
+ pr_warn("Unsupported SPROM revision %d detected. Will extract v1\n",
|
||||
+ sprom->revision);
|
||||
sprom->revision = 1;
|
||||
bcm47xx_fill_sprom_r1234589(sprom, prefix, fallback);
|
||||
bcm47xx_fill_sprom_r12389(sprom, prefix, fallback);
|
||||
@@ -828,7 +828,7 @@ static int bcm47xx_get_sprom_ssb(struct ssb_bus *bus, struct ssb_sprom *out)
|
||||
bcm47xx_fill_sprom(out, prefix, false);
|
||||
return 0;
|
||||
} else {
|
||||
- pr_warn("bcm47xx: unable to fill SPROM for given bustype.\n");
|
||||
+ pr_warn("Unable to fill SPROM for given bustype.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
@@ -893,7 +893,7 @@ static int bcm47xx_get_sprom_bcma(struct bcma_bus *bus, struct ssb_sprom *out)
|
||||
}
|
||||
return 0;
|
||||
default:
|
||||
- pr_warn("bcm47xx: unable to fill SPROM for given bustype.\n");
|
||||
+ pr_warn("Unable to fill SPROM for given bustype.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
diff --git a/arch/mips/bcm47xx/time.c b/arch/mips/bcm47xx/time.c
|
||||
index 5b46510..74224cf 100644
|
||||
--- a/arch/mips/bcm47xx/time.c
|
||||
+++ b/arch/mips/bcm47xx/time.c
|
||||
@@ -22,7 +22,6 @@
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
-
|
||||
#include <linux/init.h>
|
||||
#include <linux/ssb/ssb.h>
|
||||
#include <asm/time.h>
|
||||
--
|
||||
1.8.4.5
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
From 50c979109c484c07358a1ac75b99df36d563c132 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Wed, 1 Apr 2015 08:23:03 +0200
|
||||
Subject: [PATCH] MIPS: BCM47XX: Include io.h directly and fix brace indent
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
We use IO functions like readl & ioremap_nocache, so include linux/io.h
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/9650/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/nvram.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/nvram.c b/arch/mips/bcm47xx/nvram.c
|
||||
index 6a97732..2357ea3 100644
|
||||
--- a/arch/mips/bcm47xx/nvram.c
|
||||
+++ b/arch/mips/bcm47xx/nvram.c
|
||||
@@ -11,6 +11,7 @@
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
+#include <linux/io.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
@@ -203,7 +204,7 @@ int bcm47xx_nvram_getenv(const char *name, char *val, size_t val_len)
|
||||
if (eq - var == strlen(name) &&
|
||||
strncmp(var, name, eq - var) == 0)
|
||||
return snprintf(val, val_len, "%s", value);
|
||||
- }
|
||||
+ }
|
||||
return -ENOENT;
|
||||
}
|
||||
EXPORT_SYMBOL(bcm47xx_nvram_getenv);
|
||||
--
|
||||
1.8.4.5
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
From 6ab7c29099390b3d23c97f14498fd26a5ef6b22b Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Wed, 1 Apr 2015 08:23:04 +0200
|
||||
Subject: [PATCH] MIPS: BCM47XX: Increase NVRAM buffer size to 64 KiB
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
For years Broadcom devices use 64 KiB NVRAM partition size and some of
|
||||
them indeed have it filled in more than 50%. This change allows reading
|
||||
whole NVRAM e.g. on Netgear WNDR4500 and Netgear R8000.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/9651/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/nvram.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/nvram.c b/arch/mips/bcm47xx/nvram.c
|
||||
index 2357ea3..2ac7482 100644
|
||||
--- a/arch/mips/bcm47xx/nvram.c
|
||||
+++ b/arch/mips/bcm47xx/nvram.c
|
||||
@@ -20,7 +20,7 @@
|
||||
#include <linux/bcm47xx_nvram.h>
|
||||
|
||||
#define NVRAM_MAGIC 0x48534C46 /* 'FLSH' */
|
||||
-#define NVRAM_SPACE 0x8000
|
||||
+#define NVRAM_SPACE 0x10000
|
||||
#define NVRAM_MAX_GPIO_ENTRIES 32
|
||||
#define NVRAM_MAX_GPIO_VALUE_LEN 30
|
||||
|
||||
--
|
||||
1.8.4.5
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
From 40d12172c8a5c2f3fc39642fc564b053575cd000 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Wed, 1 Apr 2015 08:23:05 +0200
|
||||
Subject: [PATCH] MIPS: BCM47XX: Don't try guessing NVRAM size on MTD partition
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When dealing with whole flash content (bcm47xx_nvram_init_from_mem) we
|
||||
need to find NVRAM start trying various partition sizes (nvram_sizes).
|
||||
This is not needed when using MTD as we have direct partition access.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/9652/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/nvram.c | 36 ++++++++++++++----------------------
|
||||
1 file changed, 14 insertions(+), 22 deletions(-)
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/nvram.c b/arch/mips/bcm47xx/nvram.c
|
||||
index 2ac7482..ba632ff 100644
|
||||
--- a/arch/mips/bcm47xx/nvram.c
|
||||
+++ b/arch/mips/bcm47xx/nvram.c
|
||||
@@ -139,36 +139,28 @@ static int nvram_init(void)
|
||||
struct mtd_info *mtd;
|
||||
struct nvram_header header;
|
||||
size_t bytes_read;
|
||||
- int err, i;
|
||||
+ int err;
|
||||
|
||||
mtd = get_mtd_device_nm("nvram");
|
||||
if (IS_ERR(mtd))
|
||||
return -ENODEV;
|
||||
|
||||
- for (i = 0; i < ARRAY_SIZE(nvram_sizes); i++) {
|
||||
- loff_t from = mtd->size - nvram_sizes[i];
|
||||
-
|
||||
- if (from < 0)
|
||||
- continue;
|
||||
-
|
||||
- err = mtd_read(mtd, from, sizeof(header), &bytes_read,
|
||||
- (uint8_t *)&header);
|
||||
- if (!err && header.magic == NVRAM_MAGIC) {
|
||||
- u8 *dst = (uint8_t *)nvram_buf;
|
||||
- size_t len = header.len;
|
||||
+ err = mtd_read(mtd, 0, sizeof(header), &bytes_read, (uint8_t *)&header);
|
||||
+ if (!err && header.magic == NVRAM_MAGIC) {
|
||||
+ u8 *dst = (uint8_t *)nvram_buf;
|
||||
+ size_t len = header.len;
|
||||
|
||||
- if (header.len > NVRAM_SPACE) {
|
||||
- pr_err("nvram on flash (%i bytes) is bigger than the reserved space in memory, will just copy the first %i bytes\n",
|
||||
- header.len, NVRAM_SPACE);
|
||||
- len = NVRAM_SPACE;
|
||||
- }
|
||||
+ if (header.len > NVRAM_SPACE) {
|
||||
+ pr_err("nvram on flash (%i bytes) is bigger than the reserved space in memory, will just copy the first %i bytes\n",
|
||||
+ header.len, NVRAM_SPACE);
|
||||
+ len = NVRAM_SPACE;
|
||||
+ }
|
||||
|
||||
- err = mtd_read(mtd, from, len, &bytes_read, dst);
|
||||
- if (err)
|
||||
- return err;
|
||||
+ err = mtd_read(mtd, 0, len, &bytes_read, dst);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
|
||||
- return 0;
|
||||
- }
|
||||
+ return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
--
|
||||
1.8.4.5
|
||||
|
||||
@@ -1,101 +0,0 @@
|
||||
From 7515c6f1da334184c3ece06e6f61461086d8e2b1 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Wed, 1 Apr 2015 18:18:01 +0200
|
||||
Subject: [PATCH] MIPS: BCM47xx: Keep ID entries for non-standard devices
|
||||
together
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/9655/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/board.c | 48 ++++++++++++++++++++---------------------------
|
||||
1 file changed, 20 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/board.c b/arch/mips/bcm47xx/board.c
|
||||
index d4a5a51..f936dcc 100644
|
||||
--- a/arch/mips/bcm47xx/board.c
|
||||
+++ b/arch/mips/bcm47xx/board.c
|
||||
@@ -40,20 +40,6 @@ struct bcm47xx_board_type_list1 bcm47xx_board_list_model_name[] __initconst = {
|
||||
{ {0}, NULL},
|
||||
};
|
||||
|
||||
-/* model_no */
|
||||
-static const
|
||||
-struct bcm47xx_board_type_list1 bcm47xx_board_list_model_no[] __initconst = {
|
||||
- {{BCM47XX_BOARD_ASUS_WL700GE, "Asus WL700"}, "WL700"},
|
||||
- { {0}, NULL},
|
||||
-};
|
||||
-
|
||||
-/* machine_name */
|
||||
-static const
|
||||
-struct bcm47xx_board_type_list1 bcm47xx_board_list_machine_name[] __initconst = {
|
||||
- {{BCM47XX_BOARD_LINKSYS_WRTSL54GS, "Linksys WRTSL54GS"}, "WRTSL54GS"},
|
||||
- { {0}, NULL},
|
||||
-};
|
||||
-
|
||||
/* hardware_version */
|
||||
static const
|
||||
struct bcm47xx_board_type_list1 bcm47xx_board_list_hardware_version[] __initconst = {
|
||||
@@ -202,6 +188,18 @@ struct bcm47xx_board_type_list2 bcm47xx_board_list_board_type_rev[] __initconst
|
||||
{ {0}, NULL},
|
||||
};
|
||||
|
||||
+/*
|
||||
+ * Some devices don't use any common NVRAM entry for identification and they
|
||||
+ * have only one model specific variable.
|
||||
+ * They don't deserve own arrays, let's group them there using key-value array.
|
||||
+ */
|
||||
+static const
|
||||
+struct bcm47xx_board_type_list2 bcm47xx_board_list_key_value[] __initconst = {
|
||||
+ {{BCM47XX_BOARD_ASUS_WL700GE, "Asus WL700"}, "model_no", "WL700"},
|
||||
+ {{BCM47XX_BOARD_LINKSYS_WRTSL54GS, "Linksys WRTSL54GS"}, "machine_name", "WRTSL54GS"},
|
||||
+ { {0}, NULL},
|
||||
+};
|
||||
+
|
||||
static const
|
||||
struct bcm47xx_board_type bcm47xx_board_unknown[] __initconst = {
|
||||
{BCM47XX_BOARD_UNKNOWN, "Unknown Board"},
|
||||
@@ -225,20 +223,6 @@ static __init const struct bcm47xx_board_type *bcm47xx_board_get_nvram(void)
|
||||
}
|
||||
}
|
||||
|
||||
- if (bcm47xx_nvram_getenv("model_no", buf1, sizeof(buf1)) >= 0) {
|
||||
- for (e1 = bcm47xx_board_list_model_no; e1->value1; e1++) {
|
||||
- if (strstarts(buf1, e1->value1))
|
||||
- return &e1->board;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- if (bcm47xx_nvram_getenv("machine_name", buf1, sizeof(buf1)) >= 0) {
|
||||
- for (e1 = bcm47xx_board_list_machine_name; e1->value1; e1++) {
|
||||
- if (strstarts(buf1, e1->value1))
|
||||
- return &e1->board;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
if (bcm47xx_nvram_getenv("hardware_version", buf1, sizeof(buf1)) >= 0) {
|
||||
for (e1 = bcm47xx_board_list_hardware_version; e1->value1; e1++) {
|
||||
if (strstarts(buf1, e1->value1))
|
||||
@@ -314,6 +298,14 @@ static __init const struct bcm47xx_board_type *bcm47xx_board_get_nvram(void)
|
||||
return &e2->board;
|
||||
}
|
||||
}
|
||||
+
|
||||
+ for (e2 = bcm47xx_board_list_key_value; e2->value1; e2++) {
|
||||
+ if (bcm47xx_nvram_getenv(e2->value1, buf1, sizeof(buf1)) >= 0) {
|
||||
+ if (!strcmp(buf1, e2->value2))
|
||||
+ return &e2->board;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
return bcm47xx_board_unknown;
|
||||
}
|
||||
|
||||
--
|
||||
1.8.4.5
|
||||
|
||||
@@ -1,158 +0,0 @@
|
||||
From 160f14312b0b7d35759535b1f60be79247b263c4 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Wed, 1 Apr 2015 18:18:02 +0200
|
||||
Subject: [PATCH] MIPS: BCM47xx: Devices database update for 4.1 (or 4.2?)
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/9656/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/board.c | 4 ++++
|
||||
arch/mips/bcm47xx/buttons.c | 18 ++++++++++++++++++
|
||||
arch/mips/bcm47xx/leds.c | 10 ++++++++++
|
||||
arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h | 4 ++++
|
||||
4 files changed, 36 insertions(+)
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/board.c b/arch/mips/bcm47xx/board.c
|
||||
index f936dcc..41b9736 100644
|
||||
--- a/arch/mips/bcm47xx/board.c
|
||||
+++ b/arch/mips/bcm47xx/board.c
|
||||
@@ -151,9 +151,11 @@ static const
|
||||
struct bcm47xx_board_type_list1 bcm47xx_board_list_board_id[] __initconst = {
|
||||
{{BCM47XX_BOARD_NETGEAR_WGR614V8, "Netgear WGR614 V8"}, "U12H072T00_NETGEAR"},
|
||||
{{BCM47XX_BOARD_NETGEAR_WGR614V9, "Netgear WGR614 V9"}, "U12H094T00_NETGEAR"},
|
||||
+ {{BCM47XX_BOARD_NETGEAR_WGR614_V10, "Netgear WGR614 V10"}, "U12H139T01_NETGEAR"},
|
||||
{{BCM47XX_BOARD_NETGEAR_WNDR3300, "Netgear WNDR3300"}, "U12H093T00_NETGEAR"},
|
||||
{{BCM47XX_BOARD_NETGEAR_WNDR3400V1, "Netgear WNDR3400 V1"}, "U12H155T00_NETGEAR"},
|
||||
{{BCM47XX_BOARD_NETGEAR_WNDR3400V2, "Netgear WNDR3400 V2"}, "U12H187T00_NETGEAR"},
|
||||
+ {{BCM47XX_BOARD_NETGEAR_WNDR3400_V3, "Netgear WNDR3400 V3"}, "U12H208T00_NETGEAR"},
|
||||
{{BCM47XX_BOARD_NETGEAR_WNDR3400VCNA, "Netgear WNDR3400 Vcna"}, "U12H155T01_NETGEAR"},
|
||||
{{BCM47XX_BOARD_NETGEAR_WNDR3700V3, "Netgear WNDR3700 V3"}, "U12H194T00_NETGEAR"},
|
||||
{{BCM47XX_BOARD_NETGEAR_WNDR4000, "Netgear WNDR4000"}, "U12H181T00_NETGEAR"},
|
||||
@@ -196,6 +198,8 @@ struct bcm47xx_board_type_list2 bcm47xx_board_list_board_type_rev[] __initconst
|
||||
static const
|
||||
struct bcm47xx_board_type_list2 bcm47xx_board_list_key_value[] __initconst = {
|
||||
{{BCM47XX_BOARD_ASUS_WL700GE, "Asus WL700"}, "model_no", "WL700"},
|
||||
+ {{BCM47XX_BOARD_LINKSYS_WRT300N_V1, "Linksys WRT300N V1"}, "router_name", "WRT300N"},
|
||||
+ {{BCM47XX_BOARD_LINKSYS_WRT600N_V11, "Linksys WRT600N V1.1"}, "Model_Name", "WRT600N"},
|
||||
{{BCM47XX_BOARD_LINKSYS_WRTSL54GS, "Linksys WRTSL54GS"}, "machine_name", "WRTSL54GS"},
|
||||
{ {0}, NULL},
|
||||
};
|
||||
diff --git a/arch/mips/bcm47xx/buttons.c b/arch/mips/bcm47xx/buttons.c
|
||||
index 913182b..276276a 100644
|
||||
--- a/arch/mips/bcm47xx/buttons.c
|
||||
+++ b/arch/mips/bcm47xx/buttons.c
|
||||
@@ -252,6 +252,12 @@ bcm47xx_buttons_linksys_wrt160nv3[] __initconst = {
|
||||
};
|
||||
|
||||
static const struct gpio_keys_button
|
||||
+bcm47xx_buttons_linksys_wrt300n_v1[] __initconst = {
|
||||
+ BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON),
|
||||
+ BCM47XX_GPIO_KEY(6, KEY_RESTART),
|
||||
+};
|
||||
+
|
||||
+static const struct gpio_keys_button
|
||||
bcm47xx_buttons_linksys_wrt300nv11[] __initconst = {
|
||||
BCM47XX_GPIO_KEY(4, KEY_UNKNOWN),
|
||||
BCM47XX_GPIO_KEY(6, KEY_RESTART),
|
||||
@@ -327,6 +333,12 @@ bcm47xx_buttons_netgear_wndr3400v1[] __initconst = {
|
||||
};
|
||||
|
||||
static const struct gpio_keys_button
|
||||
+bcm47xx_buttons_netgear_wndr3400_v3[] __initconst = {
|
||||
+ BCM47XX_GPIO_KEY(12, KEY_RESTART),
|
||||
+ BCM47XX_GPIO_KEY(23, KEY_WPS_BUTTON),
|
||||
+};
|
||||
+
|
||||
+static const struct gpio_keys_button
|
||||
bcm47xx_buttons_netgear_wndr3700v3[] __initconst = {
|
||||
BCM47XX_GPIO_KEY(2, KEY_RFKILL),
|
||||
BCM47XX_GPIO_KEY(3, KEY_RESTART),
|
||||
@@ -516,6 +528,9 @@ int __init bcm47xx_buttons_register(void)
|
||||
case BCM47XX_BOARD_LINKSYS_WRT160NV3:
|
||||
err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt160nv3);
|
||||
break;
|
||||
+ case BCM47XX_BOARD_LINKSYS_WRT300N_V1:
|
||||
+ err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt300n_v1);
|
||||
+ break;
|
||||
case BCM47XX_BOARD_LINKSYS_WRT300NV11:
|
||||
err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt300nv11);
|
||||
break;
|
||||
@@ -557,6 +572,9 @@ int __init bcm47xx_buttons_register(void)
|
||||
case BCM47XX_BOARD_NETGEAR_WNDR3400V1:
|
||||
err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr3400v1);
|
||||
break;
|
||||
+ case BCM47XX_BOARD_NETGEAR_WNDR3400_V3:
|
||||
+ err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr3400_v3);
|
||||
+ break;
|
||||
case BCM47XX_BOARD_NETGEAR_WNDR3700V3:
|
||||
err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr3700v3);
|
||||
break;
|
||||
diff --git a/arch/mips/bcm47xx/leds.c b/arch/mips/bcm47xx/leds.c
|
||||
index 903a656..0e4ade3 100644
|
||||
--- a/arch/mips/bcm47xx/leds.c
|
||||
+++ b/arch/mips/bcm47xx/leds.c
|
||||
@@ -292,6 +292,13 @@ bcm47xx_leds_linksys_wrt160nv3[] __initconst = {
|
||||
};
|
||||
|
||||
static const struct gpio_led
|
||||
+bcm47xx_leds_linksys_wrt300n_v1[] __initconst = {
|
||||
+ BCM47XX_GPIO_LED(1, "green", "power", 0, LEDS_GPIO_DEFSTATE_ON),
|
||||
+ BCM47XX_GPIO_LED(3, "amber", "wps", 1, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+ BCM47XX_GPIO_LED(5, "green", "wps", 1, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+};
|
||||
+
|
||||
+static const struct gpio_led
|
||||
bcm47xx_leds_linksys_wrt300nv11[] __initconst = {
|
||||
BCM47XX_GPIO_LED(1, "unk", "power", 0, LEDS_GPIO_DEFSTATE_ON),
|
||||
BCM47XX_GPIO_LED(3, "amber", "wps", 1, LEDS_GPIO_DEFSTATE_OFF),
|
||||
@@ -585,6 +592,9 @@ void __init bcm47xx_leds_register(void)
|
||||
case BCM47XX_BOARD_LINKSYS_WRT160NV3:
|
||||
bcm47xx_set_pdata(bcm47xx_leds_linksys_wrt160nv3);
|
||||
break;
|
||||
+ case BCM47XX_BOARD_LINKSYS_WRT300N_V1:
|
||||
+ bcm47xx_set_pdata(bcm47xx_leds_linksys_wrt300n_v1);
|
||||
+ break;
|
||||
case BCM47XX_BOARD_LINKSYS_WRT300NV11:
|
||||
bcm47xx_set_pdata(bcm47xx_leds_linksys_wrt300nv11);
|
||||
break;
|
||||
diff --git a/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h b/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h
|
||||
index 1f5643b..c41d1dc 100644
|
||||
--- a/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h
|
||||
+++ b/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h
|
||||
@@ -67,6 +67,7 @@ enum bcm47xx_board {
|
||||
BCM47XX_BOARD_LINKSYS_WRT150NV11,
|
||||
BCM47XX_BOARD_LINKSYS_WRT160NV1,
|
||||
BCM47XX_BOARD_LINKSYS_WRT160NV3,
|
||||
+ BCM47XX_BOARD_LINKSYS_WRT300N_V1,
|
||||
BCM47XX_BOARD_LINKSYS_WRT300NV11,
|
||||
BCM47XX_BOARD_LINKSYS_WRT310NV1,
|
||||
BCM47XX_BOARD_LINKSYS_WRT310NV2,
|
||||
@@ -74,6 +75,7 @@ enum bcm47xx_board {
|
||||
BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0101,
|
||||
BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0467,
|
||||
BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0708,
|
||||
+ BCM47XX_BOARD_LINKSYS_WRT600N_V11,
|
||||
BCM47XX_BOARD_LINKSYS_WRT610NV1,
|
||||
BCM47XX_BOARD_LINKSYS_WRT610NV2,
|
||||
BCM47XX_BOARD_LINKSYS_WRTSL54GS,
|
||||
@@ -86,9 +88,11 @@ enum bcm47xx_board {
|
||||
|
||||
BCM47XX_BOARD_NETGEAR_WGR614V8,
|
||||
BCM47XX_BOARD_NETGEAR_WGR614V9,
|
||||
+ BCM47XX_BOARD_NETGEAR_WGR614_V10,
|
||||
BCM47XX_BOARD_NETGEAR_WNDR3300,
|
||||
BCM47XX_BOARD_NETGEAR_WNDR3400V1,
|
||||
BCM47XX_BOARD_NETGEAR_WNDR3400V2,
|
||||
+ BCM47XX_BOARD_NETGEAR_WNDR3400_V3,
|
||||
BCM47XX_BOARD_NETGEAR_WNDR3400VCNA,
|
||||
BCM47XX_BOARD_NETGEAR_WNDR3700V3,
|
||||
BCM47XX_BOARD_NETGEAR_WNDR4000,
|
||||
--
|
||||
1.8.4.5
|
||||
|
||||
@@ -1,85 +0,0 @@
|
||||
From d55a52ccf8f80cdf51af2c5c6e56c825f98c4f85 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Thu, 2 Apr 2015 09:13:49 +0200
|
||||
Subject: [PATCH] MIPS: BCM47xx: Add generic function filling SPROM entries
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Handling many SPROM revisions became messy, we have tons of functions
|
||||
specific to various revision groups which are quite hard to track.
|
||||
For years there is yet another revision 11 asking for support, but
|
||||
adding it in current the form would make things even worse.
|
||||
To resolve this problem let's add new function with table-like entries
|
||||
that will contain revision bitmask for every SPROM variable.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Cc: Jonas Gorski <jonas.gorski@gmail.com>
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/9659/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/sprom.c | 32 +++++++++++++++++++++++++++++---
|
||||
1 file changed, 29 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/sprom.c b/arch/mips/bcm47xx/sprom.c
|
||||
index 5d32afc..77790c9 100644
|
||||
--- a/arch/mips/bcm47xx/sprom.c
|
||||
+++ b/arch/mips/bcm47xx/sprom.c
|
||||
@@ -180,6 +180,33 @@ static void nvram_read_alpha2(const char *prefix, const char *name,
|
||||
memcpy(val, buf, 2);
|
||||
}
|
||||
|
||||
+/* This is one-function-only macro, it uses local "sprom" variable! */
|
||||
+#define ENTRY(_revmask, _type, _prefix, _name, _val, _allset, _fallback) \
|
||||
+ if (_revmask & BIT(sprom->revision)) \
|
||||
+ nvram_read_ ## _type(_prefix, NULL, _name, &sprom->_val, \
|
||||
+ _allset, _fallback)
|
||||
+/*
|
||||
+ * Special version of filling function that can be safely called for any SPROM
|
||||
+ * revision. For every NVRAM to SPROM mapping it contains bitmask of revisions
|
||||
+ * for which the mapping is valid.
|
||||
+ * It obviously requires some hexadecimal/bitmasks knowledge, but allows
|
||||
+ * writing cleaner code (easy revisions handling).
|
||||
+ * Note that while SPROM revision 0 was never used, we still keep BIT(0)
|
||||
+ * reserved for it, just to keep numbering sane.
|
||||
+ */
|
||||
+static void bcm47xx_sprom_fill_auto(struct ssb_sprom *sprom,
|
||||
+ const char *prefix, bool fallback)
|
||||
+{
|
||||
+ const char *pre = prefix;
|
||||
+ bool fb = fallback;
|
||||
+
|
||||
+ ENTRY(0xfffffffe, u16, pre, "boardrev", board_rev, 0, true);
|
||||
+ ENTRY(0xfffffffe, u16, pre, "boardnum", board_num, 0, fb);
|
||||
+
|
||||
+ /* TODO: Move more mappings here */
|
||||
+}
|
||||
+#undef ENTRY /* It's specififc, uses local variable, don't use it (again). */
|
||||
+
|
||||
static void bcm47xx_fill_sprom_r1234589(struct ssb_sprom *sprom,
|
||||
const char *prefix, bool fallback)
|
||||
{
|
||||
@@ -714,9 +741,6 @@ static void bcm47xx_fill_sprom_ethernet(struct ssb_sprom *sprom,
|
||||
static void bcm47xx_fill_board_data(struct ssb_sprom *sprom, const char *prefix,
|
||||
bool fallback)
|
||||
{
|
||||
- nvram_read_u16(prefix, NULL, "boardrev", &sprom->board_rev, 0, true);
|
||||
- nvram_read_u16(prefix, NULL, "boardnum", &sprom->board_num, 0,
|
||||
- fallback);
|
||||
nvram_read_u16(prefix, NULL, "boardtype", &sprom->board_type, 0, true);
|
||||
nvram_read_u32_2(prefix, "boardflags", &sprom->boardflags_lo,
|
||||
&sprom->boardflags_hi, fallback);
|
||||
@@ -787,6 +811,8 @@ void bcm47xx_fill_sprom(struct ssb_sprom *sprom, const char *prefix,
|
||||
bcm47xx_fill_sprom_r12389(sprom, prefix, fallback);
|
||||
bcm47xx_fill_sprom_r1(sprom, prefix, fallback);
|
||||
}
|
||||
+
|
||||
+ bcm47xx_sprom_fill_auto(sprom, prefix, fallback);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BCM47XX_SSB
|
||||
--
|
||||
1.8.4.5
|
||||
|
||||
@@ -1,717 +0,0 @@
|
||||
From e754dfcfe37f49c9249152e2e98e58887a4d87c8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Thu, 2 Apr 2015 12:30:24 +0200
|
||||
Subject: [PATCH] MIPS: BCM47xx: Move filling most of SPROM to the generic
|
||||
function
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This simplifies code a lot by dropping many per-revision-group
|
||||
functions. There are still some paths left that use uncommon NVRAM read
|
||||
helpers or fill arrays. They will need to be handled in separated patch.
|
||||
|
||||
I've tested this (by printing SPROM content) for regressions on:
|
||||
1) BCM4704 (SPROM revision 2)
|
||||
2) BCM4706 (SPROM revision 8 plus 11 & 9 on extra WiFi cards)
|
||||
The only difference is not reading board_type from SPROM rev 11 which is
|
||||
unsupported and treated as rev 1. This change for rev 1 is expected.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Cc: Jonas Gorski <jonas.gorski@gmail.com>
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/9660/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/sprom.c | 605 ++++++++++++++++------------------------------
|
||||
1 file changed, 204 insertions(+), 401 deletions(-)
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/sprom.c b/arch/mips/bcm47xx/sprom.c
|
||||
index 77790c9..68ebf23 100644
|
||||
--- a/arch/mips/bcm47xx/sprom.c
|
||||
+++ b/arch/mips/bcm47xx/sprom.c
|
||||
@@ -201,9 +201,211 @@ static void bcm47xx_sprom_fill_auto(struct ssb_sprom *sprom,
|
||||
bool fb = fallback;
|
||||
|
||||
ENTRY(0xfffffffe, u16, pre, "boardrev", board_rev, 0, true);
|
||||
+ ENTRY(0x00000002, u16, pre, "boardflags", boardflags_lo, 0, fb);
|
||||
+ ENTRY(0xfffffffc, u16, pre, "boardtype", board_type, 0, true);
|
||||
ENTRY(0xfffffffe, u16, pre, "boardnum", board_num, 0, fb);
|
||||
-
|
||||
- /* TODO: Move more mappings here */
|
||||
+ ENTRY(0x00000002, u8, pre, "cc", country_code, 0, fb);
|
||||
+ ENTRY(0xfffffff8, u8, pre, "regrev", regrev, 0, fb);
|
||||
+
|
||||
+ ENTRY(0xfffffffe, u8, pre, "ledbh0", gpio0, 0xff, fb);
|
||||
+ ENTRY(0xfffffffe, u8, pre, "ledbh1", gpio1, 0xff, fb);
|
||||
+ ENTRY(0xfffffffe, u8, pre, "ledbh2", gpio2, 0xff, fb);
|
||||
+ ENTRY(0xfffffffe, u8, pre, "ledbh3", gpio3, 0xff, fb);
|
||||
+
|
||||
+ ENTRY(0x0000070e, u16, pre, "pa0b0", pa0b0, 0, fb);
|
||||
+ ENTRY(0x0000070e, u16, pre, "pa0b1", pa0b1, 0, fb);
|
||||
+ ENTRY(0x0000070e, u16, pre, "pa0b2", pa0b2, 0, fb);
|
||||
+ ENTRY(0x0000070e, u8, pre, "pa0itssit", itssi_bg, 0, fb);
|
||||
+ ENTRY(0x0000070e, u8, pre, "pa0maxpwr", maxpwr_bg, 0, fb);
|
||||
+
|
||||
+ ENTRY(0x0000070c, u8, pre, "opo", opo, 0, fb);
|
||||
+ ENTRY(0xfffffffe, u8, pre, "aa2g", ant_available_bg, 0, fb);
|
||||
+ ENTRY(0xfffffffe, u8, pre, "aa5g", ant_available_a, 0, fb);
|
||||
+ ENTRY(0x000007fe, s8, pre, "ag0", antenna_gain.a0, 0, fb);
|
||||
+ ENTRY(0x000007fe, s8, pre, "ag1", antenna_gain.a1, 0, fb);
|
||||
+ ENTRY(0x000007f0, s8, pre, "ag2", antenna_gain.a2, 0, fb);
|
||||
+ ENTRY(0x000007f0, s8, pre, "ag3", antenna_gain.a3, 0, fb);
|
||||
+
|
||||
+ ENTRY(0x0000070e, u16, pre, "pa1b0", pa1b0, 0, fb);
|
||||
+ ENTRY(0x0000070e, u16, pre, "pa1b1", pa1b1, 0, fb);
|
||||
+ ENTRY(0x0000070e, u16, pre, "pa1b2", pa1b2, 0, fb);
|
||||
+ ENTRY(0x0000070c, u16, pre, "pa1lob0", pa1lob0, 0, fb);
|
||||
+ ENTRY(0x0000070c, u16, pre, "pa1lob1", pa1lob1, 0, fb);
|
||||
+ ENTRY(0x0000070c, u16, pre, "pa1lob2", pa1lob2, 0, fb);
|
||||
+ ENTRY(0x0000070c, u16, pre, "pa1hib0", pa1hib0, 0, fb);
|
||||
+ ENTRY(0x0000070c, u16, pre, "pa1hib1", pa1hib1, 0, fb);
|
||||
+ ENTRY(0x0000070c, u16, pre, "pa1hib2", pa1hib2, 0, fb);
|
||||
+ ENTRY(0x0000070e, u8, pre, "pa1itssit", itssi_a, 0, fb);
|
||||
+ ENTRY(0x0000070e, u8, pre, "pa1maxpwr", maxpwr_a, 0, fb);
|
||||
+ ENTRY(0x0000070c, u8, pre, "pa1lomaxpwr", maxpwr_al, 0, fb);
|
||||
+ ENTRY(0x0000070c, u8, pre, "pa1himaxpwr", maxpwr_ah, 0, fb);
|
||||
+
|
||||
+ ENTRY(0x00000708, u8, pre, "bxa2g", bxa2g, 0, fb);
|
||||
+ ENTRY(0x00000708, u8, pre, "rssisav2g", rssisav2g, 0, fb);
|
||||
+ ENTRY(0x00000708, u8, pre, "rssismc2g", rssismc2g, 0, fb);
|
||||
+ ENTRY(0x00000708, u8, pre, "rssismf2g", rssismf2g, 0, fb);
|
||||
+ ENTRY(0x00000708, u8, pre, "bxa5g", bxa5g, 0, fb);
|
||||
+ ENTRY(0x00000708, u8, pre, "rssisav5g", rssisav5g, 0, fb);
|
||||
+ ENTRY(0x00000708, u8, pre, "rssismc5g", rssismc5g, 0, fb);
|
||||
+ ENTRY(0x00000708, u8, pre, "rssismf5g", rssismf5g, 0, fb);
|
||||
+ ENTRY(0x00000708, u8, pre, "tri2g", tri2g, 0, fb);
|
||||
+ ENTRY(0x00000708, u8, pre, "tri5g", tri5g, 0, fb);
|
||||
+ ENTRY(0x00000708, u8, pre, "tri5gl", tri5gl, 0, fb);
|
||||
+ ENTRY(0x00000708, u8, pre, "tri5gh", tri5gh, 0, fb);
|
||||
+ ENTRY(0x00000708, s8, pre, "rxpo2g", rxpo2g, 0, fb);
|
||||
+ ENTRY(0x00000708, s8, pre, "rxpo5g", rxpo5g, 0, fb);
|
||||
+ ENTRY(0xfffffff0, u8, pre, "txchain", txchain, 0xf, fb);
|
||||
+ ENTRY(0xfffffff0, u8, pre, "rxchain", rxchain, 0xf, fb);
|
||||
+ ENTRY(0xfffffff0, u8, pre, "antswitch", antswitch, 0xff, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "tssipos2g", fem.ghz2.tssipos, 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "extpagain2g", fem.ghz2.extpa_gain, 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "pdetrange2g", fem.ghz2.pdet_range, 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "triso2g", fem.ghz2.tr_iso, 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "antswctl2g", fem.ghz2.antswlut, 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "tssipos5g", fem.ghz5.tssipos, 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "extpagain5g", fem.ghz5.extpa_gain, 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "pdetrange5g", fem.ghz5.pdet_range, 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "triso5g", fem.ghz5.tr_iso, 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "antswctl5g", fem.ghz5.antswlut, 0, fb);
|
||||
+ ENTRY(0x000000f0, u8, pre, "txpid2ga0", txpid2g[0], 0, fb);
|
||||
+ ENTRY(0x000000f0, u8, pre, "txpid2ga1", txpid2g[1], 0, fb);
|
||||
+ ENTRY(0x000000f0, u8, pre, "txpid2ga2", txpid2g[2], 0, fb);
|
||||
+ ENTRY(0x000000f0, u8, pre, "txpid2ga3", txpid2g[3], 0, fb);
|
||||
+ ENTRY(0x000000f0, u8, pre, "txpid5ga0", txpid5g[0], 0, fb);
|
||||
+ ENTRY(0x000000f0, u8, pre, "txpid5ga1", txpid5g[1], 0, fb);
|
||||
+ ENTRY(0x000000f0, u8, pre, "txpid5ga2", txpid5g[2], 0, fb);
|
||||
+ ENTRY(0x000000f0, u8, pre, "txpid5ga3", txpid5g[3], 0, fb);
|
||||
+ ENTRY(0x000000f0, u8, pre, "txpid5gla0", txpid5gl[0], 0, fb);
|
||||
+ ENTRY(0x000000f0, u8, pre, "txpid5gla1", txpid5gl[1], 0, fb);
|
||||
+ ENTRY(0x000000f0, u8, pre, "txpid5gla2", txpid5gl[2], 0, fb);
|
||||
+ ENTRY(0x000000f0, u8, pre, "txpid5gla3", txpid5gl[3], 0, fb);
|
||||
+ ENTRY(0x000000f0, u8, pre, "txpid5gha0", txpid5gh[0], 0, fb);
|
||||
+ ENTRY(0x000000f0, u8, pre, "txpid5gha1", txpid5gh[1], 0, fb);
|
||||
+ ENTRY(0x000000f0, u8, pre, "txpid5gha2", txpid5gh[2], 0, fb);
|
||||
+ ENTRY(0x000000f0, u8, pre, "txpid5gha3", txpid5gh[3], 0, fb);
|
||||
+
|
||||
+ ENTRY(0xffffff00, u8, pre, "tempthresh", tempthresh, 0, fb);
|
||||
+ ENTRY(0xffffff00, u8, pre, "tempoffset", tempoffset, 0, fb);
|
||||
+ ENTRY(0xffffff00, u16, pre, "rawtempsense", rawtempsense, 0, fb);
|
||||
+ ENTRY(0xffffff00, u8, pre, "measpower", measpower, 0, fb);
|
||||
+ ENTRY(0xffffff00, u8, pre, "tempsense_slope", tempsense_slope, 0, fb);
|
||||
+ ENTRY(0xffffff00, u8, pre, "tempcorrx", tempcorrx, 0, fb);
|
||||
+ ENTRY(0xffffff00, u8, pre, "tempsense_option", tempsense_option, 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "freqoffset_corr", freqoffset_corr, 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "iqcal_swp_dis", iqcal_swp_dis, 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "hw_iqcal_en", hw_iqcal_en, 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "elna2g", elna2g, 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "elna5g", elna5g, 0, fb);
|
||||
+ ENTRY(0xffffff00, u8, pre, "phycal_tempdelta", phycal_tempdelta, 0, fb);
|
||||
+ ENTRY(0xffffff00, u8, pre, "temps_period", temps_period, 0, fb);
|
||||
+ ENTRY(0xffffff00, u8, pre, "temps_hysteresis", temps_hysteresis, 0, fb);
|
||||
+ ENTRY(0xffffff00, u8, pre, "measpower1", measpower1, 0, fb);
|
||||
+ ENTRY(0xffffff00, u8, pre, "measpower2", measpower2, 0, fb);
|
||||
+
|
||||
+ ENTRY(0x000001f0, u16, pre, "cck2gpo", cck2gpo, 0, fb);
|
||||
+ ENTRY(0x000001f0, u32, pre, "ofdm2gpo", ofdm2gpo, 0, fb);
|
||||
+ ENTRY(0x000001f0, u32, pre, "ofdm5gpo", ofdm5gpo, 0, fb);
|
||||
+ ENTRY(0x000001f0, u32, pre, "ofdm5glpo", ofdm5glpo, 0, fb);
|
||||
+ ENTRY(0x000001f0, u32, pre, "ofdm5ghpo", ofdm5ghpo, 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs2gpo0", mcs2gpo[0], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs2gpo1", mcs2gpo[1], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs2gpo2", mcs2gpo[2], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs2gpo3", mcs2gpo[3], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs2gpo4", mcs2gpo[4], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs2gpo5", mcs2gpo[5], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs2gpo6", mcs2gpo[6], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs2gpo7", mcs2gpo[7], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5gpo0", mcs5gpo[0], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5gpo1", mcs5gpo[1], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5gpo2", mcs5gpo[2], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5gpo3", mcs5gpo[3], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5gpo4", mcs5gpo[4], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5gpo5", mcs5gpo[5], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5gpo6", mcs5gpo[6], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5gpo7", mcs5gpo[7], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5glpo0", mcs5glpo[0], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5glpo1", mcs5glpo[1], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5glpo2", mcs5glpo[2], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5glpo3", mcs5glpo[3], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5glpo4", mcs5glpo[4], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5glpo5", mcs5glpo[5], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5glpo6", mcs5glpo[6], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5glpo7", mcs5glpo[7], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5ghpo0", mcs5ghpo[0], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5ghpo1", mcs5ghpo[1], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5ghpo2", mcs5ghpo[2], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5ghpo3", mcs5ghpo[3], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5ghpo4", mcs5ghpo[4], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5ghpo5", mcs5ghpo[5], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5ghpo6", mcs5ghpo[6], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "mcs5ghpo7", mcs5ghpo[7], 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "cddpo", cddpo, 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "stbcpo", stbcpo, 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "bw40po", bw40po, 0, fb);
|
||||
+ ENTRY(0x000001f0, u16, pre, "bwduppo", bwduppo, 0, fb);
|
||||
+
|
||||
+ ENTRY(0xfffffe00, u16, pre, "cckbw202gpo", cckbw202gpo, 0, fb);
|
||||
+ ENTRY(0xfffffe00, u16, pre, "cckbw20ul2gpo", cckbw20ul2gpo, 0, fb);
|
||||
+ ENTRY(0x00000600, u32, pre, "legofdmbw202gpo", legofdmbw202gpo, 0, fb);
|
||||
+ ENTRY(0x00000600, u32, pre, "legofdmbw20ul2gpo", legofdmbw20ul2gpo, 0, fb);
|
||||
+ ENTRY(0x00000600, u32, pre, "legofdmbw205glpo", legofdmbw205glpo, 0, fb);
|
||||
+ ENTRY(0x00000600, u32, pre, "legofdmbw20ul5glpo", legofdmbw20ul5glpo, 0, fb);
|
||||
+ ENTRY(0x00000600, u32, pre, "legofdmbw205gmpo", legofdmbw205gmpo, 0, fb);
|
||||
+ ENTRY(0x00000600, u32, pre, "legofdmbw20ul5gmpo", legofdmbw20ul5gmpo, 0, fb);
|
||||
+ ENTRY(0x00000600, u32, pre, "legofdmbw205ghpo", legofdmbw205ghpo, 0, fb);
|
||||
+ ENTRY(0x00000600, u32, pre, "legofdmbw20ul5ghpo", legofdmbw20ul5ghpo, 0, fb);
|
||||
+ ENTRY(0xfffffe00, u32, pre, "mcsbw202gpo", mcsbw202gpo, 0, fb);
|
||||
+ ENTRY(0x00000600, u32, pre, "mcsbw20ul2gpo", mcsbw20ul2gpo, 0, fb);
|
||||
+ ENTRY(0xfffffe00, u32, pre, "mcsbw402gpo", mcsbw402gpo, 0, fb);
|
||||
+ ENTRY(0xfffffe00, u32, pre, "mcsbw205glpo", mcsbw205glpo, 0, fb);
|
||||
+ ENTRY(0x00000600, u32, pre, "mcsbw20ul5glpo", mcsbw20ul5glpo, 0, fb);
|
||||
+ ENTRY(0xfffffe00, u32, pre, "mcsbw405glpo", mcsbw405glpo, 0, fb);
|
||||
+ ENTRY(0xfffffe00, u32, pre, "mcsbw205gmpo", mcsbw205gmpo, 0, fb);
|
||||
+ ENTRY(0x00000600, u32, pre, "mcsbw20ul5gmpo", mcsbw20ul5gmpo, 0, fb);
|
||||
+ ENTRY(0xfffffe00, u32, pre, "mcsbw405gmpo", mcsbw405gmpo, 0, fb);
|
||||
+ ENTRY(0xfffffe00, u32, pre, "mcsbw205ghpo", mcsbw205ghpo, 0, fb);
|
||||
+ ENTRY(0x00000600, u32, pre, "mcsbw20ul5ghpo", mcsbw20ul5ghpo, 0, fb);
|
||||
+ ENTRY(0xfffffe00, u32, pre, "mcsbw405ghpo", mcsbw405ghpo, 0, fb);
|
||||
+ ENTRY(0x00000600, u16, pre, "mcs32po", mcs32po, 0, fb);
|
||||
+ ENTRY(0x00000600, u16, pre, "legofdm40duppo", legofdm40duppo, 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "pcieingress_war", pcieingress_war, 0, fb);
|
||||
+
|
||||
+ /* TODO: rev 11 support */
|
||||
+ ENTRY(0x00000700, u8, pre, "rxgainerr2ga0", rxgainerr2ga[0], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "rxgainerr2ga1", rxgainerr2ga[1], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "rxgainerr2ga2", rxgainerr2ga[2], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "rxgainerr5gla0", rxgainerr5gla[0], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "rxgainerr5gla1", rxgainerr5gla[1], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "rxgainerr5gla2", rxgainerr5gla[2], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "rxgainerr5gma0", rxgainerr5gma[0], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "rxgainerr5gma1", rxgainerr5gma[1], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "rxgainerr5gma2", rxgainerr5gma[2], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "rxgainerr5gha0", rxgainerr5gha[0], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "rxgainerr5gha1", rxgainerr5gha[1], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "rxgainerr5gha2", rxgainerr5gha[2], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "rxgainerr5gua0", rxgainerr5gua[0], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "rxgainerr5gua1", rxgainerr5gua[1], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "rxgainerr5gua2", rxgainerr5gua[2], 0, fb);
|
||||
+
|
||||
+ ENTRY(0xfffffe00, u8, pre, "sar2g", sar2g, 0, fb);
|
||||
+ ENTRY(0xfffffe00, u8, pre, "sar5g", sar5g, 0, fb);
|
||||
+
|
||||
+ /* TODO: rev 11 support */
|
||||
+ ENTRY(0x00000700, u8, pre, "noiselvl2ga0", noiselvl2ga[0], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "noiselvl2ga1", noiselvl2ga[1], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "noiselvl2ga2", noiselvl2ga[2], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "noiselvl5gla0", noiselvl5gla[0], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "noiselvl5gla1", noiselvl5gla[1], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "noiselvl5gla2", noiselvl5gla[2], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "noiselvl5gma0", noiselvl5gma[0], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "noiselvl5gma1", noiselvl5gma[1], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "noiselvl5gma2", noiselvl5gma[2], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "noiselvl5gha0", noiselvl5gha[0], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "noiselvl5gha1", noiselvl5gha[1], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "noiselvl5gha2", noiselvl5gha[2], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "noiselvl5gua0", noiselvl5gua[0], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "noiselvl5gua1", noiselvl5gua[1], 0, fb);
|
||||
+ ENTRY(0x00000700, u8, pre, "noiselvl5gua2", noiselvl5gua[2], 0, fb);
|
||||
}
|
||||
#undef ENTRY /* It's specififc, uses local variable, don't use it (again). */
|
||||
|
||||
@@ -211,90 +413,12 @@ static void bcm47xx_fill_sprom_r1234589(struct ssb_sprom *sprom,
|
||||
const char *prefix, bool fallback)
|
||||
{
|
||||
nvram_read_u16(prefix, NULL, "devid", &sprom->dev_id, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "ledbh0", &sprom->gpio0, 0xff, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "ledbh1", &sprom->gpio1, 0xff, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "ledbh2", &sprom->gpio2, 0xff, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "ledbh3", &sprom->gpio3, 0xff, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "aa2g", &sprom->ant_available_bg, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "aa5g", &sprom->ant_available_a, 0,
|
||||
- fallback);
|
||||
- nvram_read_s8(prefix, NULL, "ag0", &sprom->antenna_gain.a0, 0,
|
||||
- fallback);
|
||||
- nvram_read_s8(prefix, NULL, "ag1", &sprom->antenna_gain.a1, 0,
|
||||
- fallback);
|
||||
nvram_read_alpha2(prefix, "ccode", sprom->alpha2, fallback);
|
||||
}
|
||||
|
||||
-static void bcm47xx_fill_sprom_r12389(struct ssb_sprom *sprom,
|
||||
- const char *prefix, bool fallback)
|
||||
-{
|
||||
- nvram_read_u16(prefix, NULL, "pa0b0", &sprom->pa0b0, 0, fallback);
|
||||
- nvram_read_u16(prefix, NULL, "pa0b1", &sprom->pa0b1, 0, fallback);
|
||||
- nvram_read_u16(prefix, NULL, "pa0b2", &sprom->pa0b2, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "pa0itssit", &sprom->itssi_bg, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "pa0maxpwr", &sprom->maxpwr_bg, 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "pa1b0", &sprom->pa1b0, 0, fallback);
|
||||
- nvram_read_u16(prefix, NULL, "pa1b1", &sprom->pa1b1, 0, fallback);
|
||||
- nvram_read_u16(prefix, NULL, "pa1b2", &sprom->pa1b2, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "pa1itssit", &sprom->itssi_a, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "pa1maxpwr", &sprom->maxpwr_a, 0, fallback);
|
||||
-}
|
||||
-
|
||||
-static void bcm47xx_fill_sprom_r1(struct ssb_sprom *sprom, const char *prefix,
|
||||
- bool fallback)
|
||||
-{
|
||||
- nvram_read_u16(prefix, NULL, "boardflags", &sprom->boardflags_lo, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "cc", &sprom->country_code, 0, fallback);
|
||||
-}
|
||||
-
|
||||
-static void bcm47xx_fill_sprom_r2389(struct ssb_sprom *sprom,
|
||||
- const char *prefix, bool fallback)
|
||||
-{
|
||||
- nvram_read_u8(prefix, NULL, "opo", &sprom->opo, 0, fallback);
|
||||
- nvram_read_u16(prefix, NULL, "pa1lob0", &sprom->pa1lob0, 0, fallback);
|
||||
- nvram_read_u16(prefix, NULL, "pa1lob1", &sprom->pa1lob1, 0, fallback);
|
||||
- nvram_read_u16(prefix, NULL, "pa1lob2", &sprom->pa1lob2, 0, fallback);
|
||||
- nvram_read_u16(prefix, NULL, "pa1hib0", &sprom->pa1hib0, 0, fallback);
|
||||
- nvram_read_u16(prefix, NULL, "pa1hib1", &sprom->pa1hib1, 0, fallback);
|
||||
- nvram_read_u16(prefix, NULL, "pa1hib2", &sprom->pa1hib2, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "pa1lomaxpwr", &sprom->maxpwr_al, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "pa1himaxpwr", &sprom->maxpwr_ah, 0,
|
||||
- fallback);
|
||||
-}
|
||||
-
|
||||
-static void bcm47xx_fill_sprom_r389(struct ssb_sprom *sprom, const char *prefix,
|
||||
- bool fallback)
|
||||
-{
|
||||
- nvram_read_u8(prefix, NULL, "bxa2g", &sprom->bxa2g, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rssisav2g", &sprom->rssisav2g, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rssismc2g", &sprom->rssismc2g, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rssismf2g", &sprom->rssismf2g, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "bxa5g", &sprom->bxa5g, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rssisav5g", &sprom->rssisav5g, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rssismc5g", &sprom->rssismc5g, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rssismf5g", &sprom->rssismf5g, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "tri2g", &sprom->tri2g, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "tri5g", &sprom->tri5g, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "tri5gl", &sprom->tri5gl, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "tri5gh", &sprom->tri5gh, 0, fallback);
|
||||
- nvram_read_s8(prefix, NULL, "rxpo2g", &sprom->rxpo2g, 0, fallback);
|
||||
- nvram_read_s8(prefix, NULL, "rxpo5g", &sprom->rxpo5g, 0, fallback);
|
||||
-}
|
||||
-
|
||||
static void bcm47xx_fill_sprom_r3(struct ssb_sprom *sprom, const char *prefix,
|
||||
bool fallback)
|
||||
{
|
||||
- nvram_read_u8(prefix, NULL, "regrev", &sprom->regrev, 0, fallback);
|
||||
nvram_read_leddc(prefix, "leddc", &sprom->leddc_on_time,
|
||||
&sprom->leddc_off_time, fallback);
|
||||
}
|
||||
@@ -302,309 +426,10 @@ static void bcm47xx_fill_sprom_r3(struct ssb_sprom *sprom, const char *prefix,
|
||||
static void bcm47xx_fill_sprom_r4589(struct ssb_sprom *sprom,
|
||||
const char *prefix, bool fallback)
|
||||
{
|
||||
- nvram_read_u8(prefix, NULL, "regrev", &sprom->regrev, 0, fallback);
|
||||
- nvram_read_s8(prefix, NULL, "ag2", &sprom->antenna_gain.a2, 0,
|
||||
- fallback);
|
||||
- nvram_read_s8(prefix, NULL, "ag3", &sprom->antenna_gain.a3, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "txchain", &sprom->txchain, 0xf, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rxchain", &sprom->rxchain, 0xf, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "antswitch", &sprom->antswitch, 0xff,
|
||||
- fallback);
|
||||
nvram_read_leddc(prefix, "leddc", &sprom->leddc_on_time,
|
||||
&sprom->leddc_off_time, fallback);
|
||||
}
|
||||
|
||||
-static void bcm47xx_fill_sprom_r458(struct ssb_sprom *sprom, const char *prefix,
|
||||
- bool fallback)
|
||||
-{
|
||||
- nvram_read_u16(prefix, NULL, "cck2gpo", &sprom->cck2gpo, 0, fallback);
|
||||
- nvram_read_u32(prefix, NULL, "ofdm2gpo", &sprom->ofdm2gpo, 0, fallback);
|
||||
- nvram_read_u32(prefix, NULL, "ofdm5gpo", &sprom->ofdm5gpo, 0, fallback);
|
||||
- nvram_read_u32(prefix, NULL, "ofdm5glpo", &sprom->ofdm5glpo, 0,
|
||||
- fallback);
|
||||
- nvram_read_u32(prefix, NULL, "ofdm5ghpo", &sprom->ofdm5ghpo, 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "cddpo", &sprom->cddpo, 0, fallback);
|
||||
- nvram_read_u16(prefix, NULL, "stbcpo", &sprom->stbcpo, 0, fallback);
|
||||
- nvram_read_u16(prefix, NULL, "bw40po", &sprom->bw40po, 0, fallback);
|
||||
- nvram_read_u16(prefix, NULL, "bwduppo", &sprom->bwduppo, 0, fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs2gpo0", &sprom->mcs2gpo[0], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs2gpo1", &sprom->mcs2gpo[1], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs2gpo2", &sprom->mcs2gpo[2], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs2gpo3", &sprom->mcs2gpo[3], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs2gpo4", &sprom->mcs2gpo[4], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs2gpo5", &sprom->mcs2gpo[5], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs2gpo6", &sprom->mcs2gpo[6], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs2gpo7", &sprom->mcs2gpo[7], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5gpo0", &sprom->mcs5gpo[0], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5gpo1", &sprom->mcs5gpo[1], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5gpo2", &sprom->mcs5gpo[2], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5gpo3", &sprom->mcs5gpo[3], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5gpo4", &sprom->mcs5gpo[4], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5gpo5", &sprom->mcs5gpo[5], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5gpo6", &sprom->mcs5gpo[6], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5gpo7", &sprom->mcs5gpo[7], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5glpo0", &sprom->mcs5glpo[0], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5glpo1", &sprom->mcs5glpo[1], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5glpo2", &sprom->mcs5glpo[2], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5glpo3", &sprom->mcs5glpo[3], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5glpo4", &sprom->mcs5glpo[4], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5glpo5", &sprom->mcs5glpo[5], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5glpo6", &sprom->mcs5glpo[6], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5glpo7", &sprom->mcs5glpo[7], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5ghpo0", &sprom->mcs5ghpo[0], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5ghpo1", &sprom->mcs5ghpo[1], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5ghpo2", &sprom->mcs5ghpo[2], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5ghpo3", &sprom->mcs5ghpo[3], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5ghpo4", &sprom->mcs5ghpo[4], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5ghpo5", &sprom->mcs5ghpo[5], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5ghpo6", &sprom->mcs5ghpo[6], 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs5ghpo7", &sprom->mcs5ghpo[7], 0,
|
||||
- fallback);
|
||||
-}
|
||||
-
|
||||
-static void bcm47xx_fill_sprom_r45(struct ssb_sprom *sprom, const char *prefix,
|
||||
- bool fallback)
|
||||
-{
|
||||
- nvram_read_u8(prefix, NULL, "txpid2ga0", &sprom->txpid2g[0], 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "txpid2ga1", &sprom->txpid2g[1], 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "txpid2ga2", &sprom->txpid2g[2], 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "txpid2ga3", &sprom->txpid2g[3], 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "txpid5ga0", &sprom->txpid5g[0], 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "txpid5ga1", &sprom->txpid5g[1], 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "txpid5ga2", &sprom->txpid5g[2], 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "txpid5ga3", &sprom->txpid5g[3], 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "txpid5gla0", &sprom->txpid5gl[0], 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "txpid5gla1", &sprom->txpid5gl[1], 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "txpid5gla2", &sprom->txpid5gl[2], 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "txpid5gla3", &sprom->txpid5gl[3], 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "txpid5gha0", &sprom->txpid5gh[0], 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "txpid5gha1", &sprom->txpid5gh[1], 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "txpid5gha2", &sprom->txpid5gh[2], 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "txpid5gha3", &sprom->txpid5gh[3], 0,
|
||||
- fallback);
|
||||
-}
|
||||
-
|
||||
-static void bcm47xx_fill_sprom_r89(struct ssb_sprom *sprom, const char *prefix,
|
||||
- bool fallback)
|
||||
-{
|
||||
- nvram_read_u8(prefix, NULL, "tssipos2g", &sprom->fem.ghz2.tssipos, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "extpagain2g",
|
||||
- &sprom->fem.ghz2.extpa_gain, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "pdetrange2g",
|
||||
- &sprom->fem.ghz2.pdet_range, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "triso2g", &sprom->fem.ghz2.tr_iso, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "antswctl2g", &sprom->fem.ghz2.antswlut, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "tssipos5g", &sprom->fem.ghz5.tssipos, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "extpagain5g",
|
||||
- &sprom->fem.ghz5.extpa_gain, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "pdetrange5g",
|
||||
- &sprom->fem.ghz5.pdet_range, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "triso5g", &sprom->fem.ghz5.tr_iso, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "antswctl5g", &sprom->fem.ghz5.antswlut, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "tempthresh", &sprom->tempthresh, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "tempoffset", &sprom->tempoffset, 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "rawtempsense", &sprom->rawtempsense, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "measpower", &sprom->measpower, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "tempsense_slope",
|
||||
- &sprom->tempsense_slope, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "tempcorrx", &sprom->tempcorrx, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "tempsense_option",
|
||||
- &sprom->tempsense_option, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "freqoffset_corr",
|
||||
- &sprom->freqoffset_corr, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "iqcal_swp_dis", &sprom->iqcal_swp_dis, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "hw_iqcal_en", &sprom->hw_iqcal_en, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "elna2g", &sprom->elna2g, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "elna5g", &sprom->elna5g, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "phycal_tempdelta",
|
||||
- &sprom->phycal_tempdelta, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "temps_period", &sprom->temps_period, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "temps_hysteresis",
|
||||
- &sprom->temps_hysteresis, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "measpower1", &sprom->measpower1, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "measpower2", &sprom->measpower2, 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rxgainerr2ga0",
|
||||
- &sprom->rxgainerr2ga[0], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rxgainerr2ga1",
|
||||
- &sprom->rxgainerr2ga[1], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rxgainerr2ga2",
|
||||
- &sprom->rxgainerr2ga[2], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rxgainerr5gla0",
|
||||
- &sprom->rxgainerr5gla[0], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rxgainerr5gla1",
|
||||
- &sprom->rxgainerr5gla[1], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rxgainerr5gla2",
|
||||
- &sprom->rxgainerr5gla[2], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rxgainerr5gma0",
|
||||
- &sprom->rxgainerr5gma[0], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rxgainerr5gma1",
|
||||
- &sprom->rxgainerr5gma[1], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rxgainerr5gma2",
|
||||
- &sprom->rxgainerr5gma[2], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rxgainerr5gha0",
|
||||
- &sprom->rxgainerr5gha[0], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rxgainerr5gha1",
|
||||
- &sprom->rxgainerr5gha[1], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rxgainerr5gha2",
|
||||
- &sprom->rxgainerr5gha[2], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rxgainerr5gua0",
|
||||
- &sprom->rxgainerr5gua[0], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rxgainerr5gua1",
|
||||
- &sprom->rxgainerr5gua[1], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "rxgainerr5gua2",
|
||||
- &sprom->rxgainerr5gua[2], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "noiselvl2ga0", &sprom->noiselvl2ga[0], 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "noiselvl2ga1", &sprom->noiselvl2ga[1], 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "noiselvl2ga2", &sprom->noiselvl2ga[2], 0,
|
||||
- fallback);
|
||||
- nvram_read_u8(prefix, NULL, "noiselvl5gla0",
|
||||
- &sprom->noiselvl5gla[0], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "noiselvl5gla1",
|
||||
- &sprom->noiselvl5gla[1], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "noiselvl5gla2",
|
||||
- &sprom->noiselvl5gla[2], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "noiselvl5gma0",
|
||||
- &sprom->noiselvl5gma[0], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "noiselvl5gma1",
|
||||
- &sprom->noiselvl5gma[1], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "noiselvl5gma2",
|
||||
- &sprom->noiselvl5gma[2], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "noiselvl5gha0",
|
||||
- &sprom->noiselvl5gha[0], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "noiselvl5gha1",
|
||||
- &sprom->noiselvl5gha[1], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "noiselvl5gha2",
|
||||
- &sprom->noiselvl5gha[2], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "noiselvl5gua0",
|
||||
- &sprom->noiselvl5gua[0], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "noiselvl5gua1",
|
||||
- &sprom->noiselvl5gua[1], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "noiselvl5gua2",
|
||||
- &sprom->noiselvl5gua[2], 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "pcieingress_war",
|
||||
- &sprom->pcieingress_war, 0, fallback);
|
||||
-}
|
||||
-
|
||||
-static void bcm47xx_fill_sprom_r9(struct ssb_sprom *sprom, const char *prefix,
|
||||
- bool fallback)
|
||||
-{
|
||||
- nvram_read_u16(prefix, NULL, "cckbw202gpo", &sprom->cckbw202gpo, 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "cckbw20ul2gpo", &sprom->cckbw20ul2gpo, 0,
|
||||
- fallback);
|
||||
- nvram_read_u32(prefix, NULL, "legofdmbw202gpo",
|
||||
- &sprom->legofdmbw202gpo, 0, fallback);
|
||||
- nvram_read_u32(prefix, NULL, "legofdmbw20ul2gpo",
|
||||
- &sprom->legofdmbw20ul2gpo, 0, fallback);
|
||||
- nvram_read_u32(prefix, NULL, "legofdmbw205glpo",
|
||||
- &sprom->legofdmbw205glpo, 0, fallback);
|
||||
- nvram_read_u32(prefix, NULL, "legofdmbw20ul5glpo",
|
||||
- &sprom->legofdmbw20ul5glpo, 0, fallback);
|
||||
- nvram_read_u32(prefix, NULL, "legofdmbw205gmpo",
|
||||
- &sprom->legofdmbw205gmpo, 0, fallback);
|
||||
- nvram_read_u32(prefix, NULL, "legofdmbw20ul5gmpo",
|
||||
- &sprom->legofdmbw20ul5gmpo, 0, fallback);
|
||||
- nvram_read_u32(prefix, NULL, "legofdmbw205ghpo",
|
||||
- &sprom->legofdmbw205ghpo, 0, fallback);
|
||||
- nvram_read_u32(prefix, NULL, "legofdmbw20ul5ghpo",
|
||||
- &sprom->legofdmbw20ul5ghpo, 0, fallback);
|
||||
- nvram_read_u32(prefix, NULL, "mcsbw202gpo", &sprom->mcsbw202gpo, 0,
|
||||
- fallback);
|
||||
- nvram_read_u32(prefix, NULL, "mcsbw20ul2gpo", &sprom->mcsbw20ul2gpo, 0,
|
||||
- fallback);
|
||||
- nvram_read_u32(prefix, NULL, "mcsbw402gpo", &sprom->mcsbw402gpo, 0,
|
||||
- fallback);
|
||||
- nvram_read_u32(prefix, NULL, "mcsbw205glpo", &sprom->mcsbw205glpo, 0,
|
||||
- fallback);
|
||||
- nvram_read_u32(prefix, NULL, "mcsbw20ul5glpo",
|
||||
- &sprom->mcsbw20ul5glpo, 0, fallback);
|
||||
- nvram_read_u32(prefix, NULL, "mcsbw405glpo", &sprom->mcsbw405glpo, 0,
|
||||
- fallback);
|
||||
- nvram_read_u32(prefix, NULL, "mcsbw205gmpo", &sprom->mcsbw205gmpo, 0,
|
||||
- fallback);
|
||||
- nvram_read_u32(prefix, NULL, "mcsbw20ul5gmpo",
|
||||
- &sprom->mcsbw20ul5gmpo, 0, fallback);
|
||||
- nvram_read_u32(prefix, NULL, "mcsbw405gmpo", &sprom->mcsbw405gmpo, 0,
|
||||
- fallback);
|
||||
- nvram_read_u32(prefix, NULL, "mcsbw205ghpo", &sprom->mcsbw205ghpo, 0,
|
||||
- fallback);
|
||||
- nvram_read_u32(prefix, NULL, "mcsbw20ul5ghpo",
|
||||
- &sprom->mcsbw20ul5ghpo, 0, fallback);
|
||||
- nvram_read_u32(prefix, NULL, "mcsbw405ghpo", &sprom->mcsbw405ghpo, 0,
|
||||
- fallback);
|
||||
- nvram_read_u16(prefix, NULL, "mcs32po", &sprom->mcs32po, 0, fallback);
|
||||
- nvram_read_u16(prefix, NULL, "legofdm40duppo",
|
||||
- &sprom->legofdm40duppo, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "sar2g", &sprom->sar2g, 0, fallback);
|
||||
- nvram_read_u8(prefix, NULL, "sar5g", &sprom->sar5g, 0, fallback);
|
||||
-}
|
||||
-
|
||||
static void bcm47xx_fill_sprom_path_r4589(struct ssb_sprom *sprom,
|
||||
const char *prefix, bool fallback)
|
||||
{
|
||||
@@ -741,7 +566,6 @@ static void bcm47xx_fill_sprom_ethernet(struct ssb_sprom *sprom,
|
||||
static void bcm47xx_fill_board_data(struct ssb_sprom *sprom, const char *prefix,
|
||||
bool fallback)
|
||||
{
|
||||
- nvram_read_u16(prefix, NULL, "boardtype", &sprom->board_type, 0, true);
|
||||
nvram_read_u32_2(prefix, "boardflags", &sprom->boardflags_lo,
|
||||
&sprom->boardflags_hi, fallback);
|
||||
nvram_read_u32_2(prefix, "boardflags2", &sprom->boardflags2_lo,
|
||||
@@ -759,48 +583,29 @@ void bcm47xx_fill_sprom(struct ssb_sprom *sprom, const char *prefix,
|
||||
switch (sprom->revision) {
|
||||
case 1:
|
||||
bcm47xx_fill_sprom_r1234589(sprom, prefix, fallback);
|
||||
- bcm47xx_fill_sprom_r12389(sprom, prefix, fallback);
|
||||
- bcm47xx_fill_sprom_r1(sprom, prefix, fallback);
|
||||
break;
|
||||
case 2:
|
||||
bcm47xx_fill_sprom_r1234589(sprom, prefix, fallback);
|
||||
- bcm47xx_fill_sprom_r12389(sprom, prefix, fallback);
|
||||
- bcm47xx_fill_sprom_r2389(sprom, prefix, fallback);
|
||||
break;
|
||||
case 3:
|
||||
bcm47xx_fill_sprom_r1234589(sprom, prefix, fallback);
|
||||
- bcm47xx_fill_sprom_r12389(sprom, prefix, fallback);
|
||||
- bcm47xx_fill_sprom_r2389(sprom, prefix, fallback);
|
||||
- bcm47xx_fill_sprom_r389(sprom, prefix, fallback);
|
||||
bcm47xx_fill_sprom_r3(sprom, prefix, fallback);
|
||||
break;
|
||||
case 4:
|
||||
case 5:
|
||||
bcm47xx_fill_sprom_r1234589(sprom, prefix, fallback);
|
||||
bcm47xx_fill_sprom_r4589(sprom, prefix, fallback);
|
||||
- bcm47xx_fill_sprom_r458(sprom, prefix, fallback);
|
||||
- bcm47xx_fill_sprom_r45(sprom, prefix, fallback);
|
||||
bcm47xx_fill_sprom_path_r4589(sprom, prefix, fallback);
|
||||
bcm47xx_fill_sprom_path_r45(sprom, prefix, fallback);
|
||||
break;
|
||||
case 8:
|
||||
bcm47xx_fill_sprom_r1234589(sprom, prefix, fallback);
|
||||
- bcm47xx_fill_sprom_r12389(sprom, prefix, fallback);
|
||||
- bcm47xx_fill_sprom_r2389(sprom, prefix, fallback);
|
||||
- bcm47xx_fill_sprom_r389(sprom, prefix, fallback);
|
||||
bcm47xx_fill_sprom_r4589(sprom, prefix, fallback);
|
||||
- bcm47xx_fill_sprom_r458(sprom, prefix, fallback);
|
||||
- bcm47xx_fill_sprom_r89(sprom, prefix, fallback);
|
||||
bcm47xx_fill_sprom_path_r4589(sprom, prefix, fallback);
|
||||
break;
|
||||
case 9:
|
||||
bcm47xx_fill_sprom_r1234589(sprom, prefix, fallback);
|
||||
- bcm47xx_fill_sprom_r12389(sprom, prefix, fallback);
|
||||
- bcm47xx_fill_sprom_r2389(sprom, prefix, fallback);
|
||||
- bcm47xx_fill_sprom_r389(sprom, prefix, fallback);
|
||||
bcm47xx_fill_sprom_r4589(sprom, prefix, fallback);
|
||||
- bcm47xx_fill_sprom_r89(sprom, prefix, fallback);
|
||||
- bcm47xx_fill_sprom_r9(sprom, prefix, fallback);
|
||||
bcm47xx_fill_sprom_path_r4589(sprom, prefix, fallback);
|
||||
break;
|
||||
default:
|
||||
@@ -808,8 +613,6 @@ void bcm47xx_fill_sprom(struct ssb_sprom *sprom, const char *prefix,
|
||||
sprom->revision);
|
||||
sprom->revision = 1;
|
||||
bcm47xx_fill_sprom_r1234589(sprom, prefix, fallback);
|
||||
- bcm47xx_fill_sprom_r12389(sprom, prefix, fallback);
|
||||
- bcm47xx_fill_sprom_r1(sprom, prefix, fallback);
|
||||
}
|
||||
|
||||
bcm47xx_sprom_fill_auto(sprom, prefix, fallback);
|
||||
--
|
||||
1.8.4.5
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
From 4ddb225376a2802a4e20e16f71c6d37b679e3169 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Tue, 12 May 2015 18:46:11 +0200
|
||||
Subject: [PATCH] MIPS: BCM47XX: Make sure NVRAM buffer ends with \0
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This will simplify reading its contents.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Cc: Hante Meuleman <meuleman@broadcom.com>
|
||||
Cc: Ian Kent <raven@themaw.net>
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/10031/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/nvram.c | 9 +++++----
|
||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/nvram.c b/arch/mips/bcm47xx/nvram.c
|
||||
index ba632ff..dee1c32 100644
|
||||
--- a/arch/mips/bcm47xx/nvram.c
|
||||
+++ b/arch/mips/bcm47xx/nvram.c
|
||||
@@ -98,7 +98,7 @@ found:
|
||||
pr_err("The nvram size accoridng to the header seems to be bigger than the partition on flash\n");
|
||||
if (header->len > NVRAM_SPACE)
|
||||
pr_err("nvram on flash (%i bytes) is bigger than the reserved space in memory, will just copy the first %i bytes\n",
|
||||
- header->len, NVRAM_SPACE);
|
||||
+ header->len, NVRAM_SPACE - 1);
|
||||
|
||||
src = (u32 *)header;
|
||||
dst = (u32 *)nvram_buf;
|
||||
@@ -106,6 +106,7 @@ found:
|
||||
*dst++ = __raw_readl(src++);
|
||||
for (; i < header->len && i < NVRAM_SPACE && i < size; i += 4)
|
||||
*dst++ = readl(src++);
|
||||
+ nvram_buf[NVRAM_SPACE - 1] = '\0';
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -150,10 +151,10 @@ static int nvram_init(void)
|
||||
u8 *dst = (uint8_t *)nvram_buf;
|
||||
size_t len = header.len;
|
||||
|
||||
- if (header.len > NVRAM_SPACE) {
|
||||
+ if (len >= NVRAM_SPACE) {
|
||||
+ len = NVRAM_SPACE - 1;
|
||||
pr_err("nvram on flash (%i bytes) is bigger than the reserved space in memory, will just copy the first %i bytes\n",
|
||||
- header.len, NVRAM_SPACE);
|
||||
- len = NVRAM_SPACE;
|
||||
+ header.len, len);
|
||||
}
|
||||
|
||||
err = mtd_read(mtd, 0, len, &bytes_read, dst);
|
||||
--
|
||||
1.8.4.5
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
From f6f895644230b13618f14f7108f9b23a21a87bfa Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Tue, 12 May 2015 18:46:12 +0200
|
||||
Subject: [PATCH] MIPS: BCM47XX: Simplify function looking for NVRAM entry
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
First of all it shouldn't modify copied NVRAM just to make sure it can
|
||||
loop over all entries. It's enough to just compare current position
|
||||
pointer with the end of buffer address.
|
||||
Secondly buffer is guaranteed to be \0 ended, so we don't need strnchr.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Cc: Hante Meuleman <meuleman@broadcom.com>
|
||||
Cc: Ian Kent <raven@themaw.net>
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/10032/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/nvram.c | 13 +++++--------
|
||||
1 file changed, 5 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/nvram.c b/arch/mips/bcm47xx/nvram.c
|
||||
index dee1c32..95d028c 100644
|
||||
--- a/arch/mips/bcm47xx/nvram.c
|
||||
+++ b/arch/mips/bcm47xx/nvram.c
|
||||
@@ -171,7 +171,7 @@ static int nvram_init(void)
|
||||
int bcm47xx_nvram_getenv(const char *name, char *val, size_t val_len)
|
||||
{
|
||||
char *var, *value, *end, *eq;
|
||||
- int data_left, err;
|
||||
+ int err;
|
||||
|
||||
if (!name)
|
||||
return -EINVAL;
|
||||
@@ -184,19 +184,16 @@ int bcm47xx_nvram_getenv(const char *name, char *val, size_t val_len)
|
||||
|
||||
/* Look for name=value and return value */
|
||||
var = &nvram_buf[sizeof(struct nvram_header)];
|
||||
- end = nvram_buf + sizeof(nvram_buf) - 2;
|
||||
- end[0] = '\0';
|
||||
- end[1] = '\0';
|
||||
- for (; *var; var = value + strlen(value) + 1) {
|
||||
- data_left = end - var;
|
||||
-
|
||||
- eq = strnchr(var, data_left, '=');
|
||||
+ end = nvram_buf + sizeof(nvram_buf);
|
||||
+ while (var < end && *var) {
|
||||
+ eq = strchr(var, '=');
|
||||
if (!eq)
|
||||
break;
|
||||
value = eq + 1;
|
||||
if (eq - var == strlen(name) &&
|
||||
strncmp(var, name, eq - var) == 0)
|
||||
return snprintf(val, val_len, "%s", value);
|
||||
+ var = value + strlen(value) + 1;
|
||||
}
|
||||
return -ENOENT;
|
||||
}
|
||||
--
|
||||
1.8.4.5
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
From ecd06daee04bae00f3dfd0a3cd46f28142f18191 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Tue, 12 May 2015 11:31:02 +0200
|
||||
Subject: [PATCH] MIPS: BCM47xx: Extract all boardflags to new u32 fields
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
For years we planned to get rid of old u16 fields, let's start doing it
|
||||
with MIPS code. This process will take some time, it requires doing the
|
||||
same in ssb/bcma and then switching all drivers to new fields. This will
|
||||
be handled in separated patches submitted to appropriate trees.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/10026/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/sprom.c | 3 +++
|
||||
include/linux/ssb/ssb.h | 5 ++++-
|
||||
2 files changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/sprom.c b/arch/mips/bcm47xx/sprom.c
|
||||
index 68ebf23..4048083 100644
|
||||
--- a/arch/mips/bcm47xx/sprom.c
|
||||
+++ b/arch/mips/bcm47xx/sprom.c
|
||||
@@ -201,6 +201,9 @@ static void bcm47xx_sprom_fill_auto(struct ssb_sprom *sprom,
|
||||
bool fb = fallback;
|
||||
|
||||
ENTRY(0xfffffffe, u16, pre, "boardrev", board_rev, 0, true);
|
||||
+ ENTRY(0xfffffffe, u32, pre, "boardflags", boardflags, 0, fb);
|
||||
+ ENTRY(0xfffffff0, u32, pre, "boardflags2", boardflags2, 0, fb);
|
||||
+ ENTRY(0xfffff800, u32, pre, "boardflags3", boardflags3, 0, fb);
|
||||
ENTRY(0x00000002, u16, pre, "boardflags", boardflags_lo, 0, fb);
|
||||
ENTRY(0xfffffffc, u16, pre, "boardtype", board_type, 0, true);
|
||||
ENTRY(0xfffffffe, u16, pre, "boardnum", board_num, 0, fb);
|
||||
@@ -1,47 +0,0 @@
|
||||
From c58ec43eaca5f970911770c17cb3a29ac102656d Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Tue, 12 May 2015 11:54:48 +0200
|
||||
Subject: [PATCH] MIPS: BCM47xx: Extract info about et2 interface
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
New devices may have more than 1 Ethernet core (device). We should
|
||||
extract info about them to make it available to Ethernet drivers.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Cc: Hante Meuleman <meuleman@broadcom.com>
|
||||
Cc: Ian Kent <raven@themaw.net>
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/10027/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/sprom.c | 6 ++++++
|
||||
include/linux/ssb/ssb.h | 3 +++
|
||||
2 files changed, 9 insertions(+)
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/sprom.c b/arch/mips/bcm47xx/sprom.c
|
||||
index 4048083..92a6c9d 100644
|
||||
--- a/arch/mips/bcm47xx/sprom.c
|
||||
+++ b/arch/mips/bcm47xx/sprom.c
|
||||
@@ -531,6 +531,8 @@ static int mac_addr_used = 2;
|
||||
static void bcm47xx_fill_sprom_ethernet(struct ssb_sprom *sprom,
|
||||
const char *prefix, bool fallback)
|
||||
{
|
||||
+ bool fb = fallback;
|
||||
+
|
||||
nvram_read_macaddr(prefix, "et0macaddr", sprom->et0mac, fallback);
|
||||
nvram_read_u8(prefix, NULL, "et0mdcport", &sprom->et0mdcport, 0,
|
||||
fallback);
|
||||
@@ -543,6 +545,10 @@ static void bcm47xx_fill_sprom_ethernet(struct ssb_sprom *sprom,
|
||||
nvram_read_u8(prefix, NULL, "et1phyaddr", &sprom->et1phyaddr, 0,
|
||||
fallback);
|
||||
|
||||
+ nvram_read_macaddr(prefix, "et2macaddr", sprom->et2mac, fb);
|
||||
+ nvram_read_u8(prefix, NULL, "et2mdcport", &sprom->et2mdcport, 0, fb);
|
||||
+ nvram_read_u8(prefix, NULL, "et2phyaddr", &sprom->et2phyaddr, 0, fb);
|
||||
+
|
||||
nvram_read_macaddr(prefix, "macaddr", sprom->il0mac, fallback);
|
||||
nvram_read_macaddr(prefix, "il0macaddr", sprom->il0mac, fallback);
|
||||
|
||||
@@ -1,141 +0,0 @@
|
||||
From 12e1ab54dcd414c3579cfd26be9d9c9e1cab92ad Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Tue, 12 May 2015 13:05:18 +0200
|
||||
Subject: [PATCH] MIPS: BCM47xx: Read board info for all bcma buses
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Extra bcma buses may be totally different models, see following dump:
|
||||
boardtype=0x0646
|
||||
pci/1/1/boardtype=0x0545
|
||||
pci/2/1/boardtype=0x62b
|
||||
We need to detect them properly to allow drivers apply some board
|
||||
specific hacks.
|
||||
|
||||
[ralf@linux-mips.org: folded in Rafal's fix.]
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/10028/
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/10048/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/setup.c | 3 --
|
||||
arch/mips/bcm47xx/sprom.c | 44 ++++++++++++++--------------
|
||||
arch/mips/include/asm/mach-bcm47xx/bcm47xx.h | 4 ---
|
||||
3 files changed, 22 insertions(+), 29 deletions(-)
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/setup.c b/arch/mips/bcm47xx/setup.c
|
||||
index 82ff9fd..98c075f 100644
|
||||
--- a/arch/mips/bcm47xx/setup.c
|
||||
+++ b/arch/mips/bcm47xx/setup.c
|
||||
@@ -206,9 +206,6 @@ void __init bcm47xx_bus_setup(void)
|
||||
err = bcma_host_soc_init(&bcm47xx_bus.bcma);
|
||||
if (err)
|
||||
panic("Failed to initialize BCMA bus (err %d)", err);
|
||||
-
|
||||
- bcm47xx_fill_bcma_boardinfo(&bcm47xx_bus.bcma.bus.boardinfo,
|
||||
- NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/sprom.c b/arch/mips/bcm47xx/sprom.c
|
||||
index 92a6c9d..b0d62e7 100644
|
||||
--- a/arch/mips/bcm47xx/sprom.c
|
||||
+++ b/arch/mips/bcm47xx/sprom.c
|
||||
@@ -640,19 +640,6 @@ void bcm47xx_fill_ssb_boardinfo(struct ssb_boardinfo *boardinfo,
|
||||
}
|
||||
#endif
|
||||
|
||||
-#ifdef CONFIG_BCM47XX_BCMA
|
||||
-void bcm47xx_fill_bcma_boardinfo(struct bcma_boardinfo *boardinfo,
|
||||
- const char *prefix)
|
||||
-{
|
||||
- nvram_read_u16(prefix, NULL, "boardvendor", &boardinfo->vendor, 0,
|
||||
- true);
|
||||
- if (!boardinfo->vendor)
|
||||
- boardinfo->vendor = SSB_BOARDVENDOR_BCM;
|
||||
-
|
||||
- nvram_read_u16(prefix, NULL, "boardtype", &boardinfo->type, 0, true);
|
||||
-}
|
||||
-#endif
|
||||
-
|
||||
#if defined(CONFIG_BCM47XX_SSB)
|
||||
static int bcm47xx_get_sprom_ssb(struct ssb_bus *bus, struct ssb_sprom *out)
|
||||
{
|
||||
@@ -707,33 +694,46 @@ static void bcm47xx_sprom_apply_prefix_alias(char *prefix, size_t prefix_size)
|
||||
|
||||
static int bcm47xx_get_sprom_bcma(struct bcma_bus *bus, struct ssb_sprom *out)
|
||||
{
|
||||
- char prefix[10];
|
||||
+ struct bcma_boardinfo *binfo = &bus->boardinfo;
|
||||
struct bcma_device *core;
|
||||
+ char buf[10];
|
||||
+ char *prefix;
|
||||
+ bool fallback = false;
|
||||
|
||||
switch (bus->hosttype) {
|
||||
case BCMA_HOSTTYPE_PCI:
|
||||
memset(out, 0, sizeof(struct ssb_sprom));
|
||||
- snprintf(prefix, sizeof(prefix), "pci/%u/%u/",
|
||||
+ snprintf(buf, sizeof(buf), "pci/%u/%u/",
|
||||
bus->host_pci->bus->number + 1,
|
||||
PCI_SLOT(bus->host_pci->devfn));
|
||||
- bcm47xx_sprom_apply_prefix_alias(prefix, sizeof(prefix));
|
||||
- bcm47xx_fill_sprom(out, prefix, false);
|
||||
- return 0;
|
||||
+ bcm47xx_sprom_apply_prefix_alias(buf, sizeof(buf));
|
||||
+ prefix = buf;
|
||||
+ break;
|
||||
case BCMA_HOSTTYPE_SOC:
|
||||
memset(out, 0, sizeof(struct ssb_sprom));
|
||||
core = bcma_find_core(bus, BCMA_CORE_80211);
|
||||
if (core) {
|
||||
- snprintf(prefix, sizeof(prefix), "sb/%u/",
|
||||
+ snprintf(buf, sizeof(buf), "sb/%u/",
|
||||
core->core_index);
|
||||
- bcm47xx_fill_sprom(out, prefix, true);
|
||||
+ prefix = buf;
|
||||
+ fallback = true;
|
||||
} else {
|
||||
- bcm47xx_fill_sprom(out, NULL, false);
|
||||
+ prefix = NULL;
|
||||
}
|
||||
- return 0;
|
||||
+ break;
|
||||
default:
|
||||
pr_warn("Unable to fill SPROM for given bustype.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
+
|
||||
+ nvram_read_u16(prefix, NULL, "boardvendor", &binfo->vendor, 0, true);
|
||||
+ if (!binfo->vendor)
|
||||
+ binfo->vendor = SSB_BOARDVENDOR_BCM;
|
||||
+ nvram_read_u16(prefix, NULL, "boardtype", &binfo->type, 0, true);
|
||||
+
|
||||
+ bcm47xx_fill_sprom(out, prefix, fallback);
|
||||
+
|
||||
+ return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
diff --git a/arch/mips/include/asm/mach-bcm47xx/bcm47xx.h b/arch/mips/include/asm/mach-bcm47xx/bcm47xx.h
|
||||
index 8ed77f6..1461c10 100644
|
||||
--- a/arch/mips/include/asm/mach-bcm47xx/bcm47xx.h
|
||||
+++ b/arch/mips/include/asm/mach-bcm47xx/bcm47xx.h
|
||||
@@ -52,10 +52,6 @@ void bcm47xx_fill_sprom(struct ssb_sprom *sprom, const char *prefix,
|
||||
void bcm47xx_fill_ssb_boardinfo(struct ssb_boardinfo *boardinfo,
|
||||
const char *prefix);
|
||||
#endif
|
||||
-#ifdef CONFIG_BCM47XX_BCMA
|
||||
-void bcm47xx_fill_bcma_boardinfo(struct bcma_boardinfo *boardinfo,
|
||||
- const char *prefix);
|
||||
-#endif
|
||||
|
||||
void bcm47xx_set_system_type(u16 chip_id);
|
||||
|
||||
--
|
||||
1.8.4.5
|
||||
|
||||
@@ -1,69 +0,0 @@
|
||||
From 50d68dfef385127a1da2957813272c610c691157 Mon Sep 17 00:00:00 2001
|
||||
From: Paul Gortmaker <paul.gortmaker@windriver.com>
|
||||
Date: Mon, 27 Apr 2015 18:47:56 -0400
|
||||
Subject: [PATCH] MIPS: BCM77xx: Remove legacy __cpuinit{,data} sections that
|
||||
crept in
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
We removed __cpuinit support (leaving no-op stubs) quite some time ago.
|
||||
However a few more crept in as of commit 6ee1d93455384cef8a0426effe85da2
|
||||
("MIPS: BCM47XX: Detect more then 128 MiB of RAM (HIGHMEM)")
|
||||
|
||||
Since we want to clobber the stubs soon, get this removed now.
|
||||
|
||||
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
|
||||
Cc: Rafał Miłecki <zajec5@gmail.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: linux-kernel@vger.kernel.org
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/9892/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/prom.c | 2 +-
|
||||
arch/mips/include/asm/pgtable-32.h | 2 +-
|
||||
arch/mips/mm/tlb-r4k.c | 2 +-
|
||||
3 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/prom.c b/arch/mips/bcm47xx/prom.c
|
||||
index ab698ba..135a540 100644
|
||||
--- a/arch/mips/bcm47xx/prom.c
|
||||
+++ b/arch/mips/bcm47xx/prom.c
|
||||
@@ -126,7 +126,7 @@ void __init prom_free_prom_memory(void)
|
||||
/* Stripped version of tlb_init, with the call to build_tlb_refill_handler
|
||||
* dropped. Calling it at this stage causes a hang.
|
||||
*/
|
||||
-void __cpuinit early_tlb_init(void)
|
||||
+void early_tlb_init(void)
|
||||
{
|
||||
write_c0_pagemask(PM_DEFAULT_MASK);
|
||||
write_c0_wired(0);
|
||||
diff --git a/arch/mips/include/asm/pgtable-32.h b/arch/mips/include/asm/pgtable-32.h
|
||||
index 7d56686..832e216 100644
|
||||
--- a/arch/mips/include/asm/pgtable-32.h
|
||||
+++ b/arch/mips/include/asm/pgtable-32.h
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
#include <asm-generic/pgtable-nopmd.h>
|
||||
|
||||
-extern int temp_tlb_entry __cpuinitdata;
|
||||
+extern int temp_tlb_entry;
|
||||
|
||||
/*
|
||||
* - add_temporary_entry() add a temporary TLB entry. We use TLB entries
|
||||
diff --git a/arch/mips/mm/tlb-r4k.c b/arch/mips/mm/tlb-r4k.c
|
||||
index 08318ec..5037d58 100644
|
||||
--- a/arch/mips/mm/tlb-r4k.c
|
||||
+++ b/arch/mips/mm/tlb-r4k.c
|
||||
@@ -411,7 +411,7 @@ int __init has_transparent_hugepage(void)
|
||||
* lifetime of the system
|
||||
*/
|
||||
|
||||
-int temp_tlb_entry __cpuinitdata;
|
||||
+int temp_tlb_entry;
|
||||
|
||||
__init int add_temporary_entry(unsigned long entrylo0, unsigned long entrylo1,
|
||||
unsigned long entryhi, unsigned long pagemask)
|
||||
--
|
||||
1.8.4.5
|
||||
|
||||
@@ -1,111 +0,0 @@
|
||||
From 981de3c2f27af27fa4c5c952d122b35ee573ab7a Mon Sep 17 00:00:00 2001
|
||||
From: Dan Haab <dhaab@luxul.com>
|
||||
Date: Wed, 22 Apr 2015 13:58:33 -0600
|
||||
Subject: [PATCH] MIPS: BCM47XX: Support Luxul XWR-1750 board
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: Dan Haab <dhaab@luxul.com>
|
||||
Acked-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Cc: Dan Haab <dhaab@luxul.com>
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/9831/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/board.c | 1 +
|
||||
arch/mips/bcm47xx/buttons.c | 11 +++++++++++
|
||||
arch/mips/bcm47xx/leds.c | 14 ++++++++++++++
|
||||
arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h | 2 ++
|
||||
4 files changed, 28 insertions(+)
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/board.c b/arch/mips/bcm47xx/board.c
|
||||
index bd56415..a88975a 100644
|
||||
--- a/arch/mips/bcm47xx/board.c
|
||||
+++ b/arch/mips/bcm47xx/board.c
|
||||
@@ -149,6 +149,7 @@ struct bcm47xx_board_type_list2 bcm47xx_board_list_boot_hw[] __initconst = {
|
||||
/* board_id */
|
||||
static const
|
||||
struct bcm47xx_board_type_list1 bcm47xx_board_list_board_id[] __initconst = {
|
||||
+ {{BCM47XX_BOARD_LUXUL_XWR_1750_V1, "Luxul XWR-1750 V1"}, "luxul_xwr1750_v1"},
|
||||
{{BCM47XX_BOARD_NETGEAR_WGR614V8, "Netgear WGR614 V8"}, "U12H072T00_NETGEAR"},
|
||||
{{BCM47XX_BOARD_NETGEAR_WGR614V9, "Netgear WGR614 V9"}, "U12H094T00_NETGEAR"},
|
||||
{{BCM47XX_BOARD_NETGEAR_WGR614_V10, "Netgear WGR614 V10"}, "U12H139T01_NETGEAR"},
|
||||
diff --git a/arch/mips/bcm47xx/buttons.c b/arch/mips/bcm47xx/buttons.c
|
||||
index 276276a..08a4abf 100644
|
||||
--- a/arch/mips/bcm47xx/buttons.c
|
||||
+++ b/arch/mips/bcm47xx/buttons.c
|
||||
@@ -299,6 +299,13 @@ bcm47xx_buttons_linksys_wrtsl54gs[] __initconst = {
|
||||
BCM47XX_GPIO_KEY(6, KEY_RESTART),
|
||||
};
|
||||
|
||||
+/* Luxul */
|
||||
+
|
||||
+static const struct gpio_keys_button
|
||||
+bcm47xx_buttons_luxul_xwr_1750_v1[] = {
|
||||
+ BCM47XX_GPIO_KEY(14, BTN_TASK),
|
||||
+};
|
||||
+
|
||||
/* Microsoft */
|
||||
|
||||
static const struct gpio_keys_button
|
||||
@@ -555,6 +562,10 @@ int __init bcm47xx_buttons_register(void)
|
||||
err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrtsl54gs);
|
||||
break;
|
||||
|
||||
+ case BCM47XX_BOARD_LUXUL_XWR_1750_V1:
|
||||
+ err = bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xwr_1750_v1);
|
||||
+ break;
|
||||
+
|
||||
case BCM47XX_BOARD_MICROSOFT_MN700:
|
||||
err = bcm47xx_copy_bdata(bcm47xx_buttons_microsoft_nm700);
|
||||
break;
|
||||
diff --git a/arch/mips/bcm47xx/leds.c b/arch/mips/bcm47xx/leds.c
|
||||
index 0e4ade3..d20ae63 100644
|
||||
--- a/arch/mips/bcm47xx/leds.c
|
||||
+++ b/arch/mips/bcm47xx/leds.c
|
||||
@@ -370,6 +370,16 @@ bcm47xx_leds_linksys_wrtsl54gs[] __initconst = {
|
||||
BCM47XX_GPIO_LED(7, "orange", "wps", 1, LEDS_GPIO_DEFSTATE_OFF),
|
||||
};
|
||||
|
||||
+/* Luxul */
|
||||
+
|
||||
+static const struct gpio_led
|
||||
+bcm47xx_leds_luxul_xwr_1750_v1[] __initconst = {
|
||||
+ BCM47XX_GPIO_LED(5, "green", "5ghz", 0, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+ BCM47XX_GPIO_LED(12, "green", "usb", 0, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+ BCM47XX_GPIO_LED_TRIGGER(13, "green", "status", 0, "timer"),
|
||||
+ BCM47XX_GPIO_LED(15, "green", "wps", 0, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+};
|
||||
+
|
||||
/* Microsoft */
|
||||
|
||||
static const struct gpio_led
|
||||
@@ -623,6 +633,10 @@ void __init bcm47xx_leds_register(void)
|
||||
bcm47xx_set_pdata(bcm47xx_leds_linksys_wrtsl54gs);
|
||||
break;
|
||||
|
||||
+ case BCM47XX_BOARD_LUXUL_XWR_1750_V1:
|
||||
+ bcm47xx_set_pdata(bcm47xx_leds_luxul_xwr_1750_v1);
|
||||
+ break;
|
||||
+
|
||||
case BCM47XX_BOARD_MICROSOFT_MN700:
|
||||
bcm47xx_set_pdata(bcm47xx_leds_microsoft_nm700);
|
||||
break;
|
||||
diff --git a/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h b/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h
|
||||
index c41d1dc..2afb840 100644
|
||||
--- a/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h
|
||||
+++ b/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h
|
||||
@@ -80,6 +80,8 @@ enum bcm47xx_board {
|
||||
BCM47XX_BOARD_LINKSYS_WRT610NV2,
|
||||
BCM47XX_BOARD_LINKSYS_WRTSL54GS,
|
||||
|
||||
+ BCM47XX_BOARD_LUXUL_XWR_1750_V1,
|
||||
+
|
||||
BCM47XX_BOARD_MICROSOFT_MN700,
|
||||
|
||||
BCM47XX_BOARD_MOTOROLA_WE800G,
|
||||
--
|
||||
1.8.4.5
|
||||
|
||||
@@ -1,164 +0,0 @@
|
||||
From 2536295c2aeafc769215a6b2883126fa94c90b9a Mon Sep 17 00:00:00 2001
|
||||
From: Hante Meuleman <meuleman@broadcom.com>
|
||||
Date: Thu, 21 May 2015 15:27:23 +0200
|
||||
Subject: [PATCH] mips: bcm47xx: allow retrieval of complete nvram contents
|
||||
|
||||
Host platforms such as routers supported by OpenWrt can
|
||||
support NVRAM reading directly from internal NVRAM store.
|
||||
The brcmfmac for one requires the complete nvram contents
|
||||
to select what needs to be sent to wireless device.
|
||||
|
||||
Signed-off-by: Arend van Spriel <arend@broadcom.com>
|
||||
Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
|
||||
Reviewed-by: Arend Van Spriel <arend@broadcom.com>
|
||||
Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
|
||||
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
|
||||
Reviewed-by: Daniel (Deognyoun) Kim <dekim@broadcom.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/10093/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/nvram.c | 60 ++++++++++++++++++++++++++++++++-----------
|
||||
include/linux/bcm47xx_nvram.h | 15 +++++++++++
|
||||
2 files changed, 60 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/nvram.c b/arch/mips/bcm47xx/nvram.c
|
||||
index 95d028c..2ed762e 100644
|
||||
--- a/arch/mips/bcm47xx/nvram.c
|
||||
+++ b/arch/mips/bcm47xx/nvram.c
|
||||
@@ -94,17 +94,22 @@ static int nvram_find_and_copy(void __iomem *iobase, u32 lim)
|
||||
return -ENXIO;
|
||||
|
||||
found:
|
||||
- if (header->len > size)
|
||||
- pr_err("The nvram size accoridng to the header seems to be bigger than the partition on flash\n");
|
||||
- if (header->len > NVRAM_SPACE)
|
||||
- pr_err("nvram on flash (%i bytes) is bigger than the reserved space in memory, will just copy the first %i bytes\n",
|
||||
- header->len, NVRAM_SPACE - 1);
|
||||
-
|
||||
src = (u32 *)header;
|
||||
dst = (u32 *)nvram_buf;
|
||||
for (i = 0; i < sizeof(struct nvram_header); i += 4)
|
||||
*dst++ = __raw_readl(src++);
|
||||
- for (; i < header->len && i < NVRAM_SPACE && i < size; i += 4)
|
||||
+ header = (struct nvram_header *)nvram_buf;
|
||||
+ if (header->len > size) {
|
||||
+ pr_err("The nvram size according to the header seems to be bigger than the partition on flash\n");
|
||||
+ header->len = size;
|
||||
+ }
|
||||
+ if (header->len >= NVRAM_SPACE) {
|
||||
+ pr_err("nvram on flash (%i bytes) is bigger than the reserved space in memory, will just copy the first %i bytes\n",
|
||||
+ header->len, NVRAM_SPACE - 1);
|
||||
+ header->len = NVRAM_SPACE - 1;
|
||||
+ }
|
||||
+ /* proceed reading data after header */
|
||||
+ for (; i < header->len; i += 4)
|
||||
*dst++ = readl(src++);
|
||||
nvram_buf[NVRAM_SPACE - 1] = '\0';
|
||||
|
||||
@@ -139,6 +144,7 @@ static int nvram_init(void)
|
||||
#ifdef CONFIG_MTD
|
||||
struct mtd_info *mtd;
|
||||
struct nvram_header header;
|
||||
+ struct nvram_header *pheader;
|
||||
size_t bytes_read;
|
||||
int err;
|
||||
|
||||
@@ -147,20 +153,21 @@ static int nvram_init(void)
|
||||
return -ENODEV;
|
||||
|
||||
err = mtd_read(mtd, 0, sizeof(header), &bytes_read, (uint8_t *)&header);
|
||||
- if (!err && header.magic == NVRAM_MAGIC) {
|
||||
- u8 *dst = (uint8_t *)nvram_buf;
|
||||
- size_t len = header.len;
|
||||
-
|
||||
- if (len >= NVRAM_SPACE) {
|
||||
- len = NVRAM_SPACE - 1;
|
||||
+ if (!err && header.magic == NVRAM_MAGIC &&
|
||||
+ header.len > sizeof(header)) {
|
||||
+ if (header.len >= NVRAM_SPACE) {
|
||||
pr_err("nvram on flash (%i bytes) is bigger than the reserved space in memory, will just copy the first %i bytes\n",
|
||||
- header.len, len);
|
||||
+ header.len, NVRAM_SPACE);
|
||||
+ header.len = NVRAM_SPACE - 1;
|
||||
}
|
||||
|
||||
- err = mtd_read(mtd, 0, len, &bytes_read, dst);
|
||||
+ err = mtd_read(mtd, 0, header.len, &bytes_read,
|
||||
+ (u8 *)nvram_buf);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
+ pheader = (struct nvram_header *)nvram_buf;
|
||||
+ pheader->len = header.len;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
@@ -219,3 +226,26 @@ int bcm47xx_nvram_gpio_pin(const char *name)
|
||||
return -ENOENT;
|
||||
}
|
||||
EXPORT_SYMBOL(bcm47xx_nvram_gpio_pin);
|
||||
+
|
||||
+char *bcm47xx_nvram_get_contents(size_t *nvram_size)
|
||||
+{
|
||||
+ int err;
|
||||
+ char *nvram;
|
||||
+ struct nvram_header *header;
|
||||
+
|
||||
+ if (!nvram_buf[0]) {
|
||||
+ err = nvram_init();
|
||||
+ if (err)
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ header = (struct nvram_header *)nvram_buf;
|
||||
+ *nvram_size = header->len - sizeof(struct nvram_header);
|
||||
+ nvram = vmalloc(*nvram_size);
|
||||
+ if (!nvram)
|
||||
+ return NULL;
|
||||
+ memcpy(nvram, &nvram_buf[sizeof(struct nvram_header)], *nvram_size);
|
||||
+
|
||||
+ return nvram;
|
||||
+}
|
||||
+EXPORT_SYMBOL(bcm47xx_nvram_get_contents);
|
||||
diff --git a/include/linux/bcm47xx_nvram.h b/include/linux/bcm47xx_nvram.h
|
||||
index b12b07e..c73927c 100644
|
||||
--- a/include/linux/bcm47xx_nvram.h
|
||||
+++ b/include/linux/bcm47xx_nvram.h
|
||||
@@ -10,11 +10,17 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
+#include <linux/vmalloc.h>
|
||||
|
||||
#ifdef CONFIG_BCM47XX
|
||||
int bcm47xx_nvram_init_from_mem(u32 base, u32 lim);
|
||||
int bcm47xx_nvram_getenv(const char *name, char *val, size_t val_len);
|
||||
int bcm47xx_nvram_gpio_pin(const char *name);
|
||||
+char *bcm47xx_nvram_get_contents(size_t *val_len);
|
||||
+static inline void bcm47xx_nvram_release_contents(char *nvram)
|
||||
+{
|
||||
+ vfree(nvram);
|
||||
+};
|
||||
#else
|
||||
static inline int bcm47xx_nvram_init_from_mem(u32 base, u32 lim)
|
||||
{
|
||||
@@ -29,6 +35,15 @@ static inline int bcm47xx_nvram_gpio_pin(const char *name)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
};
|
||||
+
|
||||
+static inline char *bcm47xx_nvram_get_contents(size_t *val_len)
|
||||
+{
|
||||
+ return NULL;
|
||||
+};
|
||||
+
|
||||
+static inline void bcm47xx_nvram_release_contents(char *nvram)
|
||||
+{
|
||||
+};
|
||||
#endif
|
||||
|
||||
#endif /* __BCM47XX_NVRAM_H */
|
||||
--
|
||||
1.8.4.5
|
||||
|
||||
@@ -1,136 +0,0 @@
|
||||
From f229d75f1472c4cd30f464e4a0f94f410046bd80 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Sat, 6 Jun 2015 23:16:23 +0200
|
||||
Subject: [PATCH] MIPS: BCM47xx: Add helper variable for storing NVRAM length
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This simplifies code just a bit (also maybe makes it a bit more
|
||||
intuitive?) and will allow us to stop storing header. Right now we copy
|
||||
whole NVRAM including its header to the internal buffer. It is not
|
||||
needed to store a header as we don't access all these details like CRC,
|
||||
flags, etc. The next improvement that should follow is copying only the
|
||||
real contents.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: Arend van Spriel <arend@broadcom.com>
|
||||
Cc: Hante Meuleman <meuleman@broadcom.com>
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/10535/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/nvram.c | 37 ++++++++++++++++---------------------
|
||||
1 file changed, 16 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/nvram.c b/arch/mips/bcm47xx/nvram.c
|
||||
index 2ed762e..9ccdce8 100644
|
||||
--- a/arch/mips/bcm47xx/nvram.c
|
||||
+++ b/arch/mips/bcm47xx/nvram.c
|
||||
@@ -35,6 +35,7 @@ struct nvram_header {
|
||||
};
|
||||
|
||||
static char nvram_buf[NVRAM_SPACE];
|
||||
+static size_t nvram_len;
|
||||
static const u32 nvram_sizes[] = {0x8000, 0xF000, 0x10000};
|
||||
|
||||
static u32 find_nvram_size(void __iomem *end)
|
||||
@@ -60,7 +61,7 @@ static int nvram_find_and_copy(void __iomem *iobase, u32 lim)
|
||||
u32 *src, *dst;
|
||||
u32 size;
|
||||
|
||||
- if (nvram_buf[0]) {
|
||||
+ if (nvram_len) {
|
||||
pr_warn("nvram already initialized\n");
|
||||
return -EEXIST;
|
||||
}
|
||||
@@ -99,17 +100,18 @@ found:
|
||||
for (i = 0; i < sizeof(struct nvram_header); i += 4)
|
||||
*dst++ = __raw_readl(src++);
|
||||
header = (struct nvram_header *)nvram_buf;
|
||||
- if (header->len > size) {
|
||||
+ nvram_len = header->len;
|
||||
+ if (nvram_len > size) {
|
||||
pr_err("The nvram size according to the header seems to be bigger than the partition on flash\n");
|
||||
- header->len = size;
|
||||
+ nvram_len = size;
|
||||
}
|
||||
- if (header->len >= NVRAM_SPACE) {
|
||||
+ if (nvram_len >= NVRAM_SPACE) {
|
||||
pr_err("nvram on flash (%i bytes) is bigger than the reserved space in memory, will just copy the first %i bytes\n",
|
||||
header->len, NVRAM_SPACE - 1);
|
||||
- header->len = NVRAM_SPACE - 1;
|
||||
+ nvram_len = NVRAM_SPACE - 1;
|
||||
}
|
||||
/* proceed reading data after header */
|
||||
- for (; i < header->len; i += 4)
|
||||
+ for (; i < nvram_len; i += 4)
|
||||
*dst++ = readl(src++);
|
||||
nvram_buf[NVRAM_SPACE - 1] = '\0';
|
||||
|
||||
@@ -144,7 +146,6 @@ static int nvram_init(void)
|
||||
#ifdef CONFIG_MTD
|
||||
struct mtd_info *mtd;
|
||||
struct nvram_header header;
|
||||
- struct nvram_header *pheader;
|
||||
size_t bytes_read;
|
||||
int err;
|
||||
|
||||
@@ -155,20 +156,16 @@ static int nvram_init(void)
|
||||
err = mtd_read(mtd, 0, sizeof(header), &bytes_read, (uint8_t *)&header);
|
||||
if (!err && header.magic == NVRAM_MAGIC &&
|
||||
header.len > sizeof(header)) {
|
||||
- if (header.len >= NVRAM_SPACE) {
|
||||
+ nvram_len = header.len;
|
||||
+ if (nvram_len >= NVRAM_SPACE) {
|
||||
pr_err("nvram on flash (%i bytes) is bigger than the reserved space in memory, will just copy the first %i bytes\n",
|
||||
header.len, NVRAM_SPACE);
|
||||
- header.len = NVRAM_SPACE - 1;
|
||||
+ nvram_len = NVRAM_SPACE - 1;
|
||||
}
|
||||
|
||||
- err = mtd_read(mtd, 0, header.len, &bytes_read,
|
||||
+ err = mtd_read(mtd, 0, nvram_len, &nvram_len,
|
||||
(u8 *)nvram_buf);
|
||||
- if (err)
|
||||
- return err;
|
||||
-
|
||||
- pheader = (struct nvram_header *)nvram_buf;
|
||||
- pheader->len = header.len;
|
||||
- return 0;
|
||||
+ return err;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -183,7 +180,7 @@ int bcm47xx_nvram_getenv(const char *name, char *val, size_t val_len)
|
||||
if (!name)
|
||||
return -EINVAL;
|
||||
|
||||
- if (!nvram_buf[0]) {
|
||||
+ if (!nvram_len) {
|
||||
err = nvram_init();
|
||||
if (err)
|
||||
return err;
|
||||
@@ -231,16 +228,14 @@ char *bcm47xx_nvram_get_contents(size_t *nvram_size)
|
||||
{
|
||||
int err;
|
||||
char *nvram;
|
||||
- struct nvram_header *header;
|
||||
|
||||
- if (!nvram_buf[0]) {
|
||||
+ if (!nvram_len) {
|
||||
err = nvram_init();
|
||||
if (err)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- header = (struct nvram_header *)nvram_buf;
|
||||
- *nvram_size = header->len - sizeof(struct nvram_header);
|
||||
+ *nvram_size = nvram_len - sizeof(struct nvram_header);
|
||||
nvram = vmalloc(*nvram_size);
|
||||
if (!nvram)
|
||||
return NULL;
|
||||
--
|
||||
1.8.4.5
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
From 5521bb0c510ed5c1881636524badfb9bc951f6ac Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Sun, 7 Jun 2015 13:26:44 +0200
|
||||
Subject: [PATCH] MIPS: BCM47xx: Don't select BCMA_HOST_PCI
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
SoC may have non-Broadcom PCI device attached or one may want to use
|
||||
totally different PCI driver.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Patchwork: https://patchwork.linux-mips.org/patch/10537/
|
||||
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||
---
|
||||
arch/mips/bcm47xx/Kconfig | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/arch/mips/bcm47xx/Kconfig b/arch/mips/bcm47xx/Kconfig
|
||||
index fc21d36..51ed599 100644
|
||||
--- a/arch/mips/bcm47xx/Kconfig
|
||||
+++ b/arch/mips/bcm47xx/Kconfig
|
||||
@@ -25,7 +25,6 @@ config BCM47XX_BCMA
|
||||
select BCMA
|
||||
select BCMA_HOST_SOC
|
||||
select BCMA_DRIVER_MIPS
|
||||
- select BCMA_HOST_PCI if PCI
|
||||
select BCMA_DRIVER_PCI_HOSTMODE if PCI
|
||||
select BCMA_DRIVER_GPIO
|
||||
default y
|
||||
--
|
||||
1.8.4.5
|
||||
|
||||
@@ -1,391 +0,0 @@
|
||||
--- a/arch/mips/include/asm/r4kcache.h
|
||||
+++ b/arch/mips/include/asm/r4kcache.h
|
||||
@@ -25,6 +25,20 @@
|
||||
extern void (*r4k_blast_dcache)(void);
|
||||
extern void (*r4k_blast_icache)(void);
|
||||
|
||||
+#ifdef CONFIG_BCM47XX
|
||||
+#include <asm/paccess.h>
|
||||
+#include <linux/ssb/ssb.h>
|
||||
+#define BCM4710_DUMMY_RREG() ((void) *((u8 *) KSEG1ADDR(SSB_ENUM_BASE)))
|
||||
+
|
||||
+#define BCM4710_FILL_TLB(addr) (*(volatile unsigned long *)(addr))
|
||||
+#define BCM4710_PROTECTED_FILL_TLB(addr) ({ unsigned long x; get_dbe(x, (volatile unsigned long *)(addr)); })
|
||||
+#else
|
||||
+#define BCM4710_DUMMY_RREG()
|
||||
+
|
||||
+#define BCM4710_FILL_TLB(addr)
|
||||
+#define BCM4710_PROTECTED_FILL_TLB(addr)
|
||||
+#endif
|
||||
+
|
||||
/*
|
||||
* This macro return a properly sign-extended address suitable as base address
|
||||
* for indexed cache operations. Two issues here:
|
||||
@@ -98,6 +112,7 @@ static inline void flush_icache_line_ind
|
||||
static inline void flush_dcache_line_indexed(unsigned long addr)
|
||||
{
|
||||
__dflush_prologue
|
||||
+ BCM4710_DUMMY_RREG();
|
||||
cache_op(Index_Writeback_Inv_D, addr);
|
||||
__dflush_epilogue
|
||||
}
|
||||
@@ -125,6 +140,7 @@ static inline void flush_icache_line(uns
|
||||
static inline void flush_dcache_line(unsigned long addr)
|
||||
{
|
||||
__dflush_prologue
|
||||
+ BCM4710_DUMMY_RREG();
|
||||
cache_op(Hit_Writeback_Inv_D, addr);
|
||||
__dflush_epilogue
|
||||
}
|
||||
@@ -132,6 +148,7 @@ static inline void flush_dcache_line(uns
|
||||
static inline void invalidate_dcache_line(unsigned long addr)
|
||||
{
|
||||
__dflush_prologue
|
||||
+ BCM4710_DUMMY_RREG();
|
||||
cache_op(Hit_Invalidate_D, addr);
|
||||
__dflush_epilogue
|
||||
}
|
||||
@@ -187,6 +204,7 @@ static inline void protected_flush_icach
|
||||
#ifdef CONFIG_EVA
|
||||
protected_cachee_op(Hit_Invalidate_I, addr);
|
||||
#else
|
||||
+ BCM4710_DUMMY_RREG();
|
||||
protected_cache_op(Hit_Invalidate_I, addr);
|
||||
#endif
|
||||
break;
|
||||
@@ -201,6 +219,7 @@ static inline void protected_flush_icach
|
||||
*/
|
||||
static inline void protected_writeback_dcache_line(unsigned long addr)
|
||||
{
|
||||
+ BCM4710_DUMMY_RREG();
|
||||
#ifdef CONFIG_EVA
|
||||
protected_cachee_op(Hit_Writeback_Inv_D, addr);
|
||||
#else
|
||||
@@ -554,8 +573,51 @@ static inline void invalidate_tcache_pag
|
||||
: "r" (base), \
|
||||
"i" (op));
|
||||
|
||||
+static inline void blast_dcache(void)
|
||||
+{
|
||||
+ unsigned long start = KSEG0;
|
||||
+ unsigned long dcache_size = current_cpu_data.dcache.waysize * current_cpu_data.dcache.ways;
|
||||
+ unsigned long end = (start + dcache_size);
|
||||
+
|
||||
+ do {
|
||||
+ BCM4710_DUMMY_RREG();
|
||||
+ cache_op(Index_Writeback_Inv_D, start);
|
||||
+ start += current_cpu_data.dcache.linesz;
|
||||
+ } while(start < end);
|
||||
+}
|
||||
+
|
||||
+static inline void blast_dcache_page(unsigned long page)
|
||||
+{
|
||||
+ unsigned long start = page;
|
||||
+ unsigned long end = start + PAGE_SIZE;
|
||||
+
|
||||
+ BCM4710_FILL_TLB(start);
|
||||
+ do {
|
||||
+ BCM4710_DUMMY_RREG();
|
||||
+ cache_op(Hit_Writeback_Inv_D, start);
|
||||
+ start += current_cpu_data.dcache.linesz;
|
||||
+ } while(start < end);
|
||||
+}
|
||||
+
|
||||
+static inline void blast_dcache_page_indexed(unsigned long page)
|
||||
+{
|
||||
+ unsigned long start = page;
|
||||
+ unsigned long end = start + PAGE_SIZE;
|
||||
+ unsigned long ws_inc = 1UL << current_cpu_data.dcache.waybit;
|
||||
+ unsigned long ws_end = current_cpu_data.dcache.ways <<
|
||||
+ current_cpu_data.dcache.waybit;
|
||||
+ unsigned long ws, addr;
|
||||
+ for (ws = 0; ws < ws_end; ws += ws_inc) {
|
||||
+ start = page + ws;
|
||||
+ for (addr = start; addr < end; addr += current_cpu_data.dcache.linesz) {
|
||||
+ BCM4710_DUMMY_RREG();
|
||||
+ cache_op(Index_Writeback_Inv_D, addr);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/* build blast_xxx, blast_xxx_page, blast_xxx_page_indexed */
|
||||
-#define __BUILD_BLAST_CACHE(pfx, desc, indexop, hitop, lsize, extra) \
|
||||
+#define __BUILD_BLAST_CACHE(pfx, desc, indexop, hitop, lsize, extra, war) \
|
||||
static inline void extra##blast_##pfx##cache##lsize(void) \
|
||||
{ \
|
||||
unsigned long start = INDEX_BASE; \
|
||||
@@ -567,6 +629,7 @@ static inline void extra##blast_##pfx##c
|
||||
\
|
||||
__##pfx##flush_prologue \
|
||||
\
|
||||
+ war \
|
||||
for (ws = 0; ws < ws_end; ws += ws_inc) \
|
||||
for (addr = start; addr < end; addr += lsize * 32) \
|
||||
cache##lsize##_unroll32(addr|ws, indexop); \
|
||||
@@ -581,6 +644,7 @@ static inline void extra##blast_##pfx##c
|
||||
\
|
||||
__##pfx##flush_prologue \
|
||||
\
|
||||
+ war \
|
||||
do { \
|
||||
cache##lsize##_unroll32(start, hitop); \
|
||||
start += lsize * 32; \
|
||||
@@ -599,6 +663,8 @@ static inline void extra##blast_##pfx##c
|
||||
current_cpu_data.desc.waybit; \
|
||||
unsigned long ws, addr; \
|
||||
\
|
||||
+ war \
|
||||
+ \
|
||||
__##pfx##flush_prologue \
|
||||
\
|
||||
for (ws = 0; ws < ws_end; ws += ws_inc) \
|
||||
@@ -608,26 +674,26 @@ static inline void extra##blast_##pfx##c
|
||||
__##pfx##flush_epilogue \
|
||||
}
|
||||
|
||||
-__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 16, )
|
||||
-__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 16, )
|
||||
-__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 16, )
|
||||
-__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 32, )
|
||||
-__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 32, )
|
||||
-__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I_Loongson2, 32, loongson2_)
|
||||
-__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 32, )
|
||||
-__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 64, )
|
||||
-__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 64, )
|
||||
-__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 64, )
|
||||
-__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 128, )
|
||||
-__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 128, )
|
||||
-__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 128, )
|
||||
-
|
||||
-__BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 16, )
|
||||
-__BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 32, )
|
||||
-__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 16, )
|
||||
-__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 32, )
|
||||
-__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 64, )
|
||||
-__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 128, )
|
||||
+__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 16, , )
|
||||
+__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 16, , BCM4710_FILL_TLB(start);)
|
||||
+__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 16, , )
|
||||
+__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 32, , )
|
||||
+__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 32, , BCM4710_FILL_TLB(start);)
|
||||
+__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I_Loongson2, 32, loongson2_, BCM4710_FILL_TLB(start);)
|
||||
+__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 32, , )
|
||||
+__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 64, , )
|
||||
+__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 64, , BCM4710_FILL_TLB(start);)
|
||||
+__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 64, , )
|
||||
+__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 128, , )
|
||||
+__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 128, , )
|
||||
+__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 128, , )
|
||||
+
|
||||
+__BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 16, , )
|
||||
+__BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 32, , )
|
||||
+__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 16, , )
|
||||
+__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 32, , )
|
||||
+__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 64, , )
|
||||
+__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 128, , )
|
||||
|
||||
#define __BUILD_BLAST_USER_CACHE(pfx, desc, indexop, hitop, lsize) \
|
||||
static inline void blast_##pfx##cache##lsize##_user_page(unsigned long page) \
|
||||
@@ -656,17 +722,19 @@ __BUILD_BLAST_USER_CACHE(d, dcache, Inde
|
||||
__BUILD_BLAST_USER_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 64)
|
||||
|
||||
/* build blast_xxx_range, protected_blast_xxx_range */
|
||||
-#define __BUILD_BLAST_CACHE_RANGE(pfx, desc, hitop, prot, extra) \
|
||||
+#define __BUILD_BLAST_CACHE_RANGE(pfx, desc, hitop, prot, extra, war, war2) \
|
||||
static inline void prot##extra##blast_##pfx##cache##_range(unsigned long start, \
|
||||
unsigned long end) \
|
||||
{ \
|
||||
unsigned long lsize = cpu_##desc##_line_size(); \
|
||||
unsigned long addr = start & ~(lsize - 1); \
|
||||
unsigned long aend = (end - 1) & ~(lsize - 1); \
|
||||
+ war \
|
||||
\
|
||||
__##pfx##flush_prologue \
|
||||
\
|
||||
while (1) { \
|
||||
+ war2 \
|
||||
prot##cache_op(hitop, addr); \
|
||||
if (addr == aend) \
|
||||
break; \
|
||||
@@ -678,8 +746,8 @@ static inline void prot##extra##blast_##
|
||||
|
||||
#ifndef CONFIG_EVA
|
||||
|
||||
-__BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, protected_, )
|
||||
-__BUILD_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I, protected_, )
|
||||
+__BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, protected_, , BCM4710_PROTECTED_FILL_TLB(addr); BCM4710_PROTECTED_FILL_TLB(aend);, BCM4710_DUMMY_RREG();)
|
||||
+__BUILD_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I, protected_, , , )
|
||||
|
||||
#else
|
||||
|
||||
@@ -716,14 +784,14 @@ __BUILD_PROT_BLAST_CACHE_RANGE(d, dcache
|
||||
__BUILD_PROT_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I)
|
||||
|
||||
#endif
|
||||
-__BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD, protected_, )
|
||||
+__BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD, protected_, , , )
|
||||
__BUILD_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I_Loongson2, \
|
||||
- protected_, loongson2_)
|
||||
-__BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, , )
|
||||
-__BUILD_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I, , )
|
||||
-__BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD, , )
|
||||
+ protected_, loongson2_, , )
|
||||
+__BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, , , BCM4710_FILL_TLB(addr); BCM4710_FILL_TLB(aend);, BCM4710_DUMMY_RREG();)
|
||||
+__BUILD_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I, , , , )
|
||||
+__BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD, , , , )
|
||||
/* blast_inv_dcache_range */
|
||||
-__BUILD_BLAST_CACHE_RANGE(inv_d, dcache, Hit_Invalidate_D, , )
|
||||
-__BUILD_BLAST_CACHE_RANGE(inv_s, scache, Hit_Invalidate_SD, , )
|
||||
+__BUILD_BLAST_CACHE_RANGE(inv_d, dcache, Hit_Invalidate_D, , , , BCM4710_DUMMY_RREG();)
|
||||
+__BUILD_BLAST_CACHE_RANGE(inv_s, scache, Hit_Invalidate_SD, , , , )
|
||||
|
||||
#endif /* _ASM_R4KCACHE_H */
|
||||
--- a/arch/mips/include/asm/stackframe.h
|
||||
+++ b/arch/mips/include/asm/stackframe.h
|
||||
@@ -333,6 +333,10 @@
|
||||
.macro RESTORE_SP_AND_RET
|
||||
LONG_L sp, PT_R29(sp)
|
||||
.set arch=r4000
|
||||
+#ifdef CONFIG_BCM47XX
|
||||
+ nop
|
||||
+ nop
|
||||
+#endif
|
||||
eret
|
||||
.set mips0
|
||||
.endm
|
||||
--- a/arch/mips/kernel/genex.S
|
||||
+++ b/arch/mips/kernel/genex.S
|
||||
@@ -32,6 +32,10 @@
|
||||
NESTED(except_vec3_generic, 0, sp)
|
||||
.set push
|
||||
.set noat
|
||||
+#ifdef CONFIG_BCM47XX
|
||||
+ nop
|
||||
+ nop
|
||||
+#endif
|
||||
#if R5432_CP0_INTERRUPT_WAR
|
||||
mfc0 k0, CP0_INDEX
|
||||
#endif
|
||||
--- a/arch/mips/mm/c-r4k.c
|
||||
+++ b/arch/mips/mm/c-r4k.c
|
||||
@@ -38,6 +38,9 @@
|
||||
#include <asm/traps.h>
|
||||
#include <asm/dma-coherence.h>
|
||||
|
||||
+/* For enabling BCM4710 cache workarounds */
|
||||
+int bcm4710 = 0;
|
||||
+
|
||||
/*
|
||||
* Special Variant of smp_call_function for use by cache functions:
|
||||
*
|
||||
@@ -149,6 +152,9 @@ static void r4k_blast_dcache_user_page_s
|
||||
{
|
||||
unsigned long dc_lsize = cpu_dcache_line_size();
|
||||
|
||||
+ if (bcm4710)
|
||||
+ r4k_blast_dcache_page = blast_dcache_page;
|
||||
+ else
|
||||
if (dc_lsize == 0)
|
||||
r4k_blast_dcache_user_page = (void *)cache_noop;
|
||||
else if (dc_lsize == 16)
|
||||
@@ -167,6 +173,9 @@ static void r4k_blast_dcache_page_indexe
|
||||
{
|
||||
unsigned long dc_lsize = cpu_dcache_line_size();
|
||||
|
||||
+ if (bcm4710)
|
||||
+ r4k_blast_dcache_page_indexed = blast_dcache_page_indexed;
|
||||
+ else
|
||||
if (dc_lsize == 0)
|
||||
r4k_blast_dcache_page_indexed = (void *)cache_noop;
|
||||
else if (dc_lsize == 16)
|
||||
@@ -186,6 +195,9 @@ static void r4k_blast_dcache_setup(void)
|
||||
{
|
||||
unsigned long dc_lsize = cpu_dcache_line_size();
|
||||
|
||||
+ if (bcm4710)
|
||||
+ r4k_blast_dcache = blast_dcache;
|
||||
+ else
|
||||
if (dc_lsize == 0)
|
||||
r4k_blast_dcache = (void *)cache_noop;
|
||||
else if (dc_lsize == 16)
|
||||
@@ -784,6 +796,8 @@ static void local_r4k_flush_cache_sigtra
|
||||
unsigned long addr = (unsigned long) arg;
|
||||
|
||||
R4600_HIT_CACHEOP_WAR_IMPL;
|
||||
+ BCM4710_PROTECTED_FILL_TLB(addr);
|
||||
+ BCM4710_PROTECTED_FILL_TLB(addr + 4);
|
||||
if (dc_lsize)
|
||||
protected_writeback_dcache_line(addr & ~(dc_lsize - 1));
|
||||
if (!cpu_icache_snoops_remote_store && scache_size)
|
||||
@@ -1580,6 +1594,17 @@ static void coherency_setup(void)
|
||||
* silly idea of putting something else there ...
|
||||
*/
|
||||
switch (current_cpu_type()) {
|
||||
+ case CPU_BMIPS3300:
|
||||
+ {
|
||||
+ u32 cm;
|
||||
+ cm = read_c0_diag();
|
||||
+ /* Enable icache */
|
||||
+ cm |= (1 << 31);
|
||||
+ /* Enable dcache */
|
||||
+ cm |= (1 << 30);
|
||||
+ write_c0_diag(cm);
|
||||
+ }
|
||||
+ break;
|
||||
case CPU_R4000PC:
|
||||
case CPU_R4000SC:
|
||||
case CPU_R4000MC:
|
||||
@@ -1626,6 +1651,15 @@ void r4k_cache_init(void)
|
||||
extern void build_copy_page(void);
|
||||
struct cpuinfo_mips *c = ¤t_cpu_data;
|
||||
|
||||
+ /* Check if special workarounds are required */
|
||||
+#ifdef CONFIG_BCM47XX
|
||||
+ if (current_cpu_data.cputype == CPU_BMIPS32 && (current_cpu_data.processor_id & 0xff) == 0) {
|
||||
+ printk("Enabling BCM4710A0 cache workarounds.\n");
|
||||
+ bcm4710 = 1;
|
||||
+ } else
|
||||
+#endif
|
||||
+ bcm4710 = 0;
|
||||
+
|
||||
probe_pcache();
|
||||
setup_scache();
|
||||
|
||||
@@ -1695,7 +1729,15 @@ void r4k_cache_init(void)
|
||||
*/
|
||||
local_r4k___flush_cache_all(NULL);
|
||||
|
||||
+#ifdef CONFIG_BCM47XX
|
||||
+ {
|
||||
+ static void (*_coherency_setup)(void);
|
||||
+ _coherency_setup = (void (*)(void)) KSEG1ADDR(coherency_setup);
|
||||
+ _coherency_setup();
|
||||
+ }
|
||||
+#else
|
||||
coherency_setup();
|
||||
+#endif
|
||||
board_cache_error_setup = r4k_cache_error_setup;
|
||||
|
||||
/*
|
||||
--- a/arch/mips/mm/tlbex.c
|
||||
+++ b/arch/mips/mm/tlbex.c
|
||||
@@ -1269,6 +1269,9 @@ static void build_r4000_tlb_refill_handl
|
||||
/* No need for uasm_i_nop */
|
||||
}
|
||||
|
||||
+#ifdef CONFIG_BCM47XX
|
||||
+ uasm_i_nop(&p);
|
||||
+#endif
|
||||
#ifdef CONFIG_64BIT
|
||||
build_get_pmde64(&p, &l, &r, K0, K1); /* get pmd in K1 */
|
||||
#else
|
||||
@@ -1831,6 +1834,9 @@ build_r4000_tlbchange_handler_head(u32 *
|
||||
{
|
||||
struct work_registers wr = build_get_work_registers(p);
|
||||
|
||||
+#ifdef CONFIG_BCM47XX
|
||||
+ uasm_i_nop(p);
|
||||
+#endif
|
||||
#ifdef CONFIG_64BIT
|
||||
build_get_pmde64(p, l, r, wr.r1, wr.r2); /* get pmd in ptr */
|
||||
#else
|
||||
@@ -1,70 +0,0 @@
|
||||
--- a/arch/mips/include/asm/cpu-features.h
|
||||
+++ b/arch/mips/include/asm/cpu-features.h
|
||||
@@ -154,6 +154,9 @@
|
||||
#ifndef cpu_has_local_ebase
|
||||
#define cpu_has_local_ebase 1
|
||||
#endif
|
||||
+#ifndef cpu_use_kmap_coherent
|
||||
+#define cpu_use_kmap_coherent 1
|
||||
+#endif
|
||||
|
||||
/*
|
||||
* I-Cache snoops remote store. This only matters on SMP. Some multiprocessors
|
||||
--- a/arch/mips/include/asm/mach-bcm47xx/cpu-feature-overrides.h
|
||||
+++ b/arch/mips/include/asm/mach-bcm47xx/cpu-feature-overrides.h
|
||||
@@ -79,4 +79,6 @@
|
||||
#define cpu_scache_line_size() 0
|
||||
#define cpu_has_vz 0
|
||||
|
||||
+#define cpu_use_kmap_coherent 0
|
||||
+
|
||||
#endif /* __ASM_MACH_BCM47XX_CPU_FEATURE_OVERRIDES_H */
|
||||
--- a/arch/mips/mm/c-r4k.c
|
||||
+++ b/arch/mips/mm/c-r4k.c
|
||||
@@ -591,7 +591,7 @@ static inline void local_r4k_flush_cache
|
||||
*/
|
||||
map_coherent = (cpu_has_dc_aliases &&
|
||||
page_mapped(page) && !Page_dcache_dirty(page));
|
||||
- if (map_coherent)
|
||||
+ if (map_coherent && cpu_use_kmap_coherent)
|
||||
vaddr = kmap_coherent(page, addr);
|
||||
else
|
||||
vaddr = kmap_atomic(page);
|
||||
@@ -616,7 +616,7 @@ static inline void local_r4k_flush_cache
|
||||
}
|
||||
|
||||
if (vaddr) {
|
||||
- if (map_coherent)
|
||||
+ if (map_coherent && cpu_use_kmap_coherent)
|
||||
kunmap_coherent();
|
||||
else
|
||||
kunmap_atomic(vaddr);
|
||||
--- a/arch/mips/mm/init.c
|
||||
+++ b/arch/mips/mm/init.c
|
||||
@@ -155,7 +155,7 @@ void copy_user_highpage(struct page *to,
|
||||
void *vfrom, *vto;
|
||||
|
||||
vto = kmap_atomic(to);
|
||||
- if (cpu_has_dc_aliases &&
|
||||
+ if (cpu_has_dc_aliases && cpu_use_kmap_coherent &&
|
||||
page_mapped(from) && !Page_dcache_dirty(from)) {
|
||||
vfrom = kmap_coherent(from, vaddr);
|
||||
copy_page(vto, vfrom);
|
||||
@@ -177,7 +177,7 @@ void copy_to_user_page(struct vm_area_st
|
||||
struct page *page, unsigned long vaddr, void *dst, const void *src,
|
||||
unsigned long len)
|
||||
{
|
||||
- if (cpu_has_dc_aliases &&
|
||||
+ if (cpu_has_dc_aliases && cpu_use_kmap_coherent &&
|
||||
page_mapped(page) && !Page_dcache_dirty(page)) {
|
||||
void *vto = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);
|
||||
memcpy(vto, src, len);
|
||||
@@ -195,7 +195,7 @@ void copy_from_user_page(struct vm_area_
|
||||
struct page *page, unsigned long vaddr, void *dst, const void *src,
|
||||
unsigned long len)
|
||||
{
|
||||
- if (cpu_has_dc_aliases &&
|
||||
+ if (cpu_has_dc_aliases && cpu_use_kmap_coherent &&
|
||||
page_mapped(page) && !Page_dcache_dirty(page)) {
|
||||
void *vfrom = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);
|
||||
memcpy(dst, vfrom, len);
|
||||
@@ -1,122 +0,0 @@
|
||||
From b36f694256f41bc71571f467646d015dda128d14 Mon Sep 17 00:00:00 2001
|
||||
From: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Date: Sat, 9 Nov 2013 17:03:59 +0100
|
||||
Subject: [PATCH 210/210] b44: register adm switch
|
||||
|
||||
---
|
||||
drivers/net/ethernet/broadcom/b44.c | 57 +++++++++++++++++++++++++++++++++++
|
||||
drivers/net/ethernet/broadcom/b44.h | 3 ++
|
||||
2 files changed, 60 insertions(+)
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/b44.c
|
||||
+++ b/drivers/net/ethernet/broadcom/b44.c
|
||||
@@ -31,6 +31,8 @@
|
||||
#include <linux/ssb/ssb.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/phy.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/platform_data/adm6996-gpio.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/io.h>
|
||||
@@ -2240,6 +2242,70 @@ static void b44_adjust_link(struct net_d
|
||||
}
|
||||
}
|
||||
|
||||
+#ifdef CONFIG_BCM47XX
|
||||
+static int b44_register_adm_switch(struct b44 *bp)
|
||||
+{
|
||||
+ int gpio;
|
||||
+ struct platform_device *pdev;
|
||||
+ struct adm6996_gpio_platform_data adm_data = {0};
|
||||
+ struct platform_device_info info = {0};
|
||||
+
|
||||
+ adm_data.model = ADM6996L;
|
||||
+ gpio = bcm47xx_nvram_gpio_pin("adm_eecs");
|
||||
+ if (gpio >= 0)
|
||||
+ adm_data.eecs = gpio;
|
||||
+ else
|
||||
+ adm_data.eecs = 2;
|
||||
+
|
||||
+ gpio = bcm47xx_nvram_gpio_pin("adm_eesk");
|
||||
+ if (gpio >= 0)
|
||||
+ adm_data.eesk = gpio;
|
||||
+ else
|
||||
+ adm_data.eesk = 3;
|
||||
+
|
||||
+ gpio = bcm47xx_nvram_gpio_pin("adm_eedi");
|
||||
+ if (gpio >= 0)
|
||||
+ adm_data.eedi = gpio;
|
||||
+ else
|
||||
+ adm_data.eedi = 4;
|
||||
+
|
||||
+ gpio = bcm47xx_nvram_gpio_pin("adm_rc");
|
||||
+ if (gpio >= 0)
|
||||
+ adm_data.eerc = gpio;
|
||||
+ else
|
||||
+ adm_data.eerc = 5;
|
||||
+
|
||||
+ info.parent = bp->sdev->dev;
|
||||
+ info.name = "adm6996_gpio";
|
||||
+ info.id = -1;
|
||||
+ info.data = &adm_data;
|
||||
+ info.size_data = sizeof(adm_data);
|
||||
+
|
||||
+ if (!bp->adm_switch) {
|
||||
+ pdev = platform_device_register_full(&info);
|
||||
+ if (IS_ERR(pdev))
|
||||
+ return PTR_ERR(pdev);
|
||||
+
|
||||
+ bp->adm_switch = pdev;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+static void b44_unregister_adm_switch(struct b44 *bp)
|
||||
+{
|
||||
+ if (bp->adm_switch)
|
||||
+ platform_device_unregister(bp->adm_switch);
|
||||
+}
|
||||
+#else
|
||||
+static int b44_register_adm_switch(struct b44 *bp)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+static void b44_unregister_adm_switch(struct b44 *bp)
|
||||
+{
|
||||
+
|
||||
+}
|
||||
+#endif /* CONFIG_BCM47XX */
|
||||
+
|
||||
static int b44_register_phy_one(struct b44 *bp)
|
||||
{
|
||||
struct mii_bus *mii_bus;
|
||||
@@ -2283,6 +2349,9 @@ static int b44_register_phy_one(struct b
|
||||
if (!bp->mii_bus->phy_map[bp->phy_addr] &&
|
||||
(sprom->boardflags_lo & (B44_BOARDFLAG_ROBO | B44_BOARDFLAG_ADM))) {
|
||||
|
||||
+ if (sprom->boardflags_lo & B44_BOARDFLAG_ADM)
|
||||
+ b44_register_adm_switch(bp);
|
||||
+
|
||||
dev_info(sdev->dev,
|
||||
"could not find PHY at %i, use fixed one\n",
|
||||
bp->phy_addr);
|
||||
@@ -2478,6 +2547,7 @@ static void b44_remove_one(struct ssb_de
|
||||
unregister_netdev(dev);
|
||||
if (bp->flags & B44_FLAG_EXTERNAL_PHY)
|
||||
b44_unregister_phy_one(bp);
|
||||
+ b44_unregister_adm_switch(bp);
|
||||
ssb_device_disable(sdev, 0);
|
||||
ssb_bus_may_powerdown(sdev->bus);
|
||||
free_netdev(dev);
|
||||
--- a/drivers/net/ethernet/broadcom/b44.h
|
||||
+++ b/drivers/net/ethernet/broadcom/b44.h
|
||||
@@ -404,6 +404,9 @@ struct b44 {
|
||||
struct mii_bus *mii_bus;
|
||||
int old_link;
|
||||
struct mii_if_info mii_if;
|
||||
+
|
||||
+ /* platform device for associated switch */
|
||||
+ struct platform_device *adm_switch;
|
||||
};
|
||||
|
||||
#endif /* _B44_H */
|
||||
@@ -1,54 +0,0 @@
|
||||
--- a/drivers/net/ethernet/broadcom/b44.c
|
||||
+++ b/drivers/net/ethernet/broadcom/b44.c
|
||||
@@ -431,10 +431,34 @@ static void b44_wap54g10_workaround(stru
|
||||
error:
|
||||
pr_warn("PHY: cannot reset MII transceiver isolate bit\n");
|
||||
}
|
||||
+
|
||||
+static void b44_bcm47xx_workarounds(struct b44 *bp)
|
||||
+{
|
||||
+ char buf[20];
|
||||
+ struct ssb_device *sdev = bp->sdev;
|
||||
+
|
||||
+ /* Toshiba WRC-1000, Siemens SE505 v1, Askey RT-210W, RT-220W */
|
||||
+ if (sdev->bus->sprom.board_num == 100) {
|
||||
+ bp->phy_addr = B44_PHY_ADDR_NO_LOCAL_PHY;
|
||||
+ } else {
|
||||
+ /* WL-HDD */
|
||||
+ if (bcm47xx_nvram_getenv("hardware_version", buf, sizeof(buf)) >= 0 &&
|
||||
+ !strncmp(buf, "WL300-", strlen("WL300-"))) {
|
||||
+ if (sdev->bus->sprom.et0phyaddr == 0 &&
|
||||
+ sdev->bus->sprom.et1phyaddr == 1)
|
||||
+ bp->phy_addr = B44_PHY_ADDR_NO_LOCAL_PHY;
|
||||
+ }
|
||||
+ }
|
||||
+ return;
|
||||
+}
|
||||
#else
|
||||
static inline void b44_wap54g10_workaround(struct b44 *bp)
|
||||
{
|
||||
}
|
||||
+
|
||||
+static inline void b44_bcm47xx_workarounds(struct b44 *bp)
|
||||
+{
|
||||
+}
|
||||
#endif
|
||||
|
||||
static int b44_setup_phy(struct b44 *bp)
|
||||
@@ -443,6 +467,7 @@ static int b44_setup_phy(struct b44 *bp)
|
||||
int err;
|
||||
|
||||
b44_wap54g10_workaround(bp);
|
||||
+ b44_bcm47xx_workarounds(bp);
|
||||
|
||||
if (bp->flags & B44_FLAG_EXTERNAL_PHY)
|
||||
return 0;
|
||||
@@ -2170,6 +2195,8 @@ static int b44_get_invariants(struct b44
|
||||
* valid PHY address. */
|
||||
bp->phy_addr &= 0x1F;
|
||||
|
||||
+ b44_bcm47xx_workarounds(bp);
|
||||
+
|
||||
memcpy(bp->dev->dev_addr, addr, ETH_ALEN);
|
||||
|
||||
if (!is_valid_ether_addr(&bp->dev->dev_addr[0])){
|
||||
@@ -1,25 +0,0 @@
|
||||
This prevents the options from being delete with make kernel_oldconfig.
|
||||
---
|
||||
drivers/ssb/Kconfig | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/bcma/Kconfig
|
||||
+++ b/drivers/bcma/Kconfig
|
||||
@@ -33,6 +33,7 @@ config BCMA_HOST_PCI
|
||||
config BCMA_HOST_SOC
|
||||
bool "Support for BCMA in a SoC"
|
||||
depends on BCMA
|
||||
+ select USB_HCD_BCMA if USB_EHCI_HCD || USB_OHCI_HCD
|
||||
help
|
||||
Host interface for a Broadcom AIX bus directly mapped into
|
||||
the memory. This only works with the Broadcom SoCs from the
|
||||
--- a/drivers/ssb/Kconfig
|
||||
+++ b/drivers/ssb/Kconfig
|
||||
@@ -147,6 +147,7 @@ config SSB_SFLASH
|
||||
config SSB_EMBEDDED
|
||||
bool
|
||||
depends on SSB_DRIVER_MIPS && SSB_PCICORE_HOSTMODE
|
||||
+ select USB_HCD_SSB if USB_EHCI_HCD || USB_OHCI_HCD
|
||||
default y
|
||||
|
||||
config SSB_DRIVER_EXTIF
|
||||
@@ -1,11 +0,0 @@
|
||||
--- a/arch/mips/include/asm/cacheflush.h
|
||||
+++ b/arch/mips/include/asm/cacheflush.h
|
||||
@@ -46,7 +46,7 @@
|
||||
extern void (*flush_cache_all)(void);
|
||||
extern void (*__flush_cache_all)(void);
|
||||
extern void (*flush_cache_mm)(struct mm_struct *mm);
|
||||
-#define flush_cache_dup_mm(mm) do { (void) (mm); } while (0)
|
||||
+#define flush_cache_dup_mm(mm) flush_cache_mm(mm)
|
||||
extern void (*flush_cache_range)(struct vm_area_struct *vma,
|
||||
unsigned long start, unsigned long end);
|
||||
extern void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page, unsigned long pfn);
|
||||
@@ -1,66 +0,0 @@
|
||||
--- a/arch/mips/include/asm/page.h
|
||||
+++ b/arch/mips/include/asm/page.h
|
||||
@@ -71,6 +71,7 @@ static inline unsigned int page_size_ftl
|
||||
#endif /* CONFIG_MIPS_HUGE_TLB_SUPPORT */
|
||||
|
||||
#include <linux/pfn.h>
|
||||
+#include <asm/cpu-features.h>
|
||||
|
||||
extern void build_clear_page(void);
|
||||
extern void build_copy_page(void);
|
||||
@@ -105,13 +106,16 @@ static inline void clear_user_page(void
|
||||
flush_data_cache_page((unsigned long)addr);
|
||||
}
|
||||
|
||||
-extern void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,
|
||||
- struct page *to);
|
||||
-struct vm_area_struct;
|
||||
-extern void copy_user_highpage(struct page *to, struct page *from,
|
||||
- unsigned long vaddr, struct vm_area_struct *vma);
|
||||
+static inline void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,
|
||||
+ struct page *to)
|
||||
+{
|
||||
+ extern void (*flush_data_cache_page)(unsigned long addr);
|
||||
|
||||
-#define __HAVE_ARCH_COPY_USER_HIGHPAGE
|
||||
+ copy_page(vto, vfrom);
|
||||
+ if (!cpu_has_ic_fills_f_dc ||
|
||||
+ pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK))
|
||||
+ flush_data_cache_page((unsigned long)vto);
|
||||
+}
|
||||
|
||||
/*
|
||||
* These are used to make use of C type-checking..
|
||||
--- a/arch/mips/mm/init.c
|
||||
+++ b/arch/mips/mm/init.c
|
||||
@@ -149,30 +149,6 @@ void kunmap_coherent(void)
|
||||
pagefault_enable();
|
||||
}
|
||||
|
||||
-void copy_user_highpage(struct page *to, struct page *from,
|
||||
- unsigned long vaddr, struct vm_area_struct *vma)
|
||||
-{
|
||||
- void *vfrom, *vto;
|
||||
-
|
||||
- vto = kmap_atomic(to);
|
||||
- if (cpu_has_dc_aliases && cpu_use_kmap_coherent &&
|
||||
- page_mapped(from) && !Page_dcache_dirty(from)) {
|
||||
- vfrom = kmap_coherent(from, vaddr);
|
||||
- copy_page(vto, vfrom);
|
||||
- kunmap_coherent();
|
||||
- } else {
|
||||
- vfrom = kmap_atomic(from);
|
||||
- copy_page(vto, vfrom);
|
||||
- kunmap_atomic(vfrom);
|
||||
- }
|
||||
- if ((!cpu_has_ic_fills_f_dc) ||
|
||||
- pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK))
|
||||
- flush_data_cache_page((unsigned long)vto);
|
||||
- kunmap_atomic(vto);
|
||||
- /* Make sure this page is cleared on other CPU's too before using it */
|
||||
- smp_wmb();
|
||||
-}
|
||||
-
|
||||
void copy_to_user_page(struct vm_area_struct *vma,
|
||||
struct page *page, unsigned long vaddr, void *dst, const void *src,
|
||||
unsigned long len)
|
||||
@@ -1,128 +0,0 @@
|
||||
--- a/arch/mips/bcm47xx/board.c
|
||||
+++ b/arch/mips/bcm47xx/board.c
|
||||
@@ -140,6 +140,7 @@ struct bcm47xx_board_type_list2 bcm47xx_
|
||||
{{BCM47XX_BOARD_LINKSYS_WRT300NV11, "Linksys WRT300N V1.1"}, "WRT300N", "1.1"},
|
||||
{{BCM47XX_BOARD_LINKSYS_WRT310NV1, "Linksys WRT310N V1"}, "WRT310N", "1.0"},
|
||||
{{BCM47XX_BOARD_LINKSYS_WRT310NV2, "Linksys WRT310N V2"}, "WRT310N", "2.0"},
|
||||
+ {{BCM47XX_BOARD_LINKSYS_WRT320N_V1, "Linksys WRT320N V1"}, "WRT320N", "1.0"},
|
||||
{{BCM47XX_BOARD_LINKSYS_WRT54G3GV2, "Linksys WRT54G3GV2-VF"}, "WRT54G3GV2-VF", "1.0"},
|
||||
{{BCM47XX_BOARD_LINKSYS_WRT610NV1, "Linksys WRT610N V1"}, "WRT610N", "1.0"},
|
||||
{{BCM47XX_BOARD_LINKSYS_WRT610NV2, "Linksys WRT610N V2"}, "WRT610N", "2.0"},
|
||||
--- a/arch/mips/bcm47xx/buttons.c
|
||||
+++ b/arch/mips/bcm47xx/buttons.c
|
||||
@@ -20,6 +20,12 @@
|
||||
/* Asus */
|
||||
|
||||
static const struct gpio_keys_button
|
||||
+bcm47xx_buttons_asus_rtn10u[] __initconst = {
|
||||
+ BCM47XX_GPIO_KEY(20, KEY_WPS_BUTTON),
|
||||
+ BCM47XX_GPIO_KEY(21, KEY_RESTART),
|
||||
+};
|
||||
+
|
||||
+static const struct gpio_keys_button
|
||||
bcm47xx_buttons_asus_rtn12[] __initconst = {
|
||||
BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON),
|
||||
BCM47XX_GPIO_KEY(1, KEY_RESTART),
|
||||
@@ -270,6 +276,18 @@ bcm47xx_buttons_linksys_wrt310nv1[] __in
|
||||
};
|
||||
|
||||
static const struct gpio_keys_button
|
||||
+bcm47xx_buttons_linksys_wrt310n_v2[] __initconst = {
|
||||
+ BCM47XX_GPIO_KEY(5, KEY_WPS_BUTTON),
|
||||
+ BCM47XX_GPIO_KEY(6, KEY_RESTART),
|
||||
+};
|
||||
+
|
||||
+static const struct gpio_keys_button
|
||||
+bcm47xx_buttons_linksys_wrt320n_v1[] __initconst = {
|
||||
+ BCM47XX_GPIO_KEY(5, KEY_WPS_BUTTON),
|
||||
+ BCM47XX_GPIO_KEY(8, KEY_RESTART),
|
||||
+};
|
||||
+
|
||||
+static const struct gpio_keys_button
|
||||
bcm47xx_buttons_linksys_wrt54g3gv2[] __initconst = {
|
||||
BCM47XX_GPIO_KEY(5, KEY_WIMAX),
|
||||
BCM47XX_GPIO_KEY(6, KEY_RESTART),
|
||||
@@ -414,6 +432,9 @@ int __init bcm47xx_buttons_register(void
|
||||
int err;
|
||||
|
||||
switch (board) {
|
||||
+ case BCM47XX_BOARD_ASUS_RTN10U:
|
||||
+ err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_rtn10u);
|
||||
+ break;
|
||||
case BCM47XX_BOARD_ASUS_RTN12:
|
||||
err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_rtn12);
|
||||
break;
|
||||
@@ -544,6 +565,12 @@ int __init bcm47xx_buttons_register(void
|
||||
case BCM47XX_BOARD_LINKSYS_WRT310NV1:
|
||||
err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt310nv1);
|
||||
break;
|
||||
+ case BCM47XX_BOARD_LINKSYS_WRT310NV2:
|
||||
+ err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt310n_v2);
|
||||
+ break;
|
||||
+ case BCM47XX_BOARD_LINKSYS_WRT320N_V1:
|
||||
+ err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt320n_v1);
|
||||
+ break;
|
||||
case BCM47XX_BOARD_LINKSYS_WRT54G3GV2:
|
||||
err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt54g3gv2);
|
||||
break;
|
||||
--- a/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h
|
||||
+++ b/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h
|
||||
@@ -71,6 +71,7 @@ enum bcm47xx_board {
|
||||
BCM47XX_BOARD_LINKSYS_WRT300NV11,
|
||||
BCM47XX_BOARD_LINKSYS_WRT310NV1,
|
||||
BCM47XX_BOARD_LINKSYS_WRT310NV2,
|
||||
+ BCM47XX_BOARD_LINKSYS_WRT320N_V1,
|
||||
BCM47XX_BOARD_LINKSYS_WRT54G3GV2,
|
||||
BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0101,
|
||||
BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0467,
|
||||
--- a/arch/mips/bcm47xx/leds.c
|
||||
+++ b/arch/mips/bcm47xx/leds.c
|
||||
@@ -29,6 +29,14 @@
|
||||
/* Asus */
|
||||
|
||||
static const struct gpio_led
|
||||
+bcm47xx_leds_asus_rtn10u[] __initconst = {
|
||||
+ BCM47XX_GPIO_LED(5, "green", "wlan", 0, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+ BCM47XX_GPIO_LED(6, "green", "power", 1, LEDS_GPIO_DEFSTATE_ON),
|
||||
+ BCM47XX_GPIO_LED(7, "green", "wps", 0, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+ BCM47XX_GPIO_LED(8, "green", "usb", 0, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+};
|
||||
+
|
||||
+static const struct gpio_led
|
||||
bcm47xx_leds_asus_rtn12[] __initconst = {
|
||||
BCM47XX_GPIO_LED(2, "unk", "power", 1, LEDS_GPIO_DEFSTATE_ON),
|
||||
BCM47XX_GPIO_LED(7, "unk", "wlan", 0, LEDS_GPIO_DEFSTATE_OFF),
|
||||
@@ -313,6 +321,13 @@ bcm47xx_leds_linksys_wrt310nv1[] __initc
|
||||
};
|
||||
|
||||
static const struct gpio_led
|
||||
+bcm47xx_leds_linksys_wrt320n_v1[] __initconst = {
|
||||
+ BCM47XX_GPIO_LED(1, "blue", "wlan", 1, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+ BCM47XX_GPIO_LED(2, "blue", "power", 0, LEDS_GPIO_DEFSTATE_ON),
|
||||
+ BCM47XX_GPIO_LED(4, "amber", "wps", 1, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+};
|
||||
+
|
||||
+static const struct gpio_led
|
||||
bcm47xx_leds_linksys_wrt54g_generic[] __initconst = {
|
||||
BCM47XX_GPIO_LED(0, "unk", "dmz", 1, LEDS_GPIO_DEFSTATE_OFF),
|
||||
BCM47XX_GPIO_LED(1, "unk", "power", 0, LEDS_GPIO_DEFSTATE_ON),
|
||||
@@ -478,6 +493,9 @@ void __init bcm47xx_leds_register(void)
|
||||
enum bcm47xx_board board = bcm47xx_board_get();
|
||||
|
||||
switch (board) {
|
||||
+ case BCM47XX_BOARD_ASUS_RTN10U:
|
||||
+ bcm47xx_set_pdata(bcm47xx_leds_asus_rtn10u);
|
||||
+ break;
|
||||
case BCM47XX_BOARD_ASUS_RTN12:
|
||||
bcm47xx_set_pdata(bcm47xx_leds_asus_rtn12);
|
||||
break;
|
||||
@@ -611,6 +629,9 @@ void __init bcm47xx_leds_register(void)
|
||||
case BCM47XX_BOARD_LINKSYS_WRT310NV1:
|
||||
bcm47xx_set_pdata(bcm47xx_leds_linksys_wrt310nv1);
|
||||
break;
|
||||
+ case BCM47XX_BOARD_LINKSYS_WRT320N_V1:
|
||||
+ bcm47xx_set_pdata(bcm47xx_leds_linksys_wrt320n_v1);
|
||||
+ break;
|
||||
case BCM47XX_BOARD_LINKSYS_WRT54G3GV2:
|
||||
bcm47xx_set_pdata(bcm47xx_leds_linksys_wrt54g3gv2);
|
||||
break;
|
||||
@@ -1,34 +0,0 @@
|
||||
--- a/drivers/mtd/bcm47xxpart.c
|
||||
+++ b/drivers/mtd/bcm47xxpart.c
|
||||
@@ -97,6 +97,7 @@ static int bcm47xxpart_parse(struct mtd_
|
||||
int trx_part = -1;
|
||||
int last_trx_part = -1;
|
||||
int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, };
|
||||
+ bool found_nvram = false;
|
||||
|
||||
/*
|
||||
* Some really old flashes (like AT45DB*) had smaller erasesize-s, but
|
||||
@@ -300,12 +301,23 @@ static int bcm47xxpart_parse(struct mtd_
|
||||
if (buf[0] == NVRAM_HEADER) {
|
||||
bcm47xxpart_add_part(&parts[curr_part++], "nvram",
|
||||
master->size - blocksize, 0);
|
||||
+ found_nvram = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
kfree(buf);
|
||||
|
||||
+ if (!found_nvram) {
|
||||
+ pr_err("can not find a nvram partition reserve last block\n");
|
||||
+ bcm47xxpart_add_part(&parts[curr_part++], "nvram_guess",
|
||||
+ master->size - blocksize * 2, MTD_WRITEABLE);
|
||||
+ for (i = 0; i < curr_part; i++) {
|
||||
+ if (parts[i].size + parts[i].offset == master->size)
|
||||
+ parts[i].offset -= blocksize * 2;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
/*
|
||||
* Assume that partitions end at the beginning of the one they are
|
||||
* followed by.
|
||||
@@ -1,14 +0,0 @@
|
||||
--- a/include/linux/ide.h
|
||||
+++ b/include/linux/ide.h
|
||||
@@ -191,7 +191,11 @@ static inline void ide_std_init_ports(st
|
||||
hw->io_ports.ctl_addr = ctl_addr;
|
||||
}
|
||||
|
||||
+#if defined CONFIG_BCM47XX
|
||||
+# define MAX_HWIFS 2
|
||||
+#else
|
||||
#define MAX_HWIFS 10
|
||||
+#endif
|
||||
|
||||
/*
|
||||
* Now for the data we need to maintain per-drive: ide_drive_t
|
||||
@@ -1,17 +0,0 @@
|
||||
When the Ethernet controller is powered down and someone wants to
|
||||
access the mdio bus like the witch driver (b53) the system crashed if
|
||||
PCI_D3hot was set before. This patch deactivates this power sawing mode
|
||||
when a switch driver is in use.
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/tg3.c
|
||||
+++ b/drivers/net/ethernet/broadcom/tg3.c
|
||||
@@ -4263,7 +4263,8 @@ static int tg3_power_down_prepare(struct
|
||||
static void tg3_power_down(struct tg3 *tp)
|
||||
{
|
||||
pci_wake_from_d3(tp->pdev, tg3_flag(tp, WOL_ENABLE));
|
||||
- pci_set_power_state(tp->pdev, PCI_D3hot);
|
||||
+ if (!tg3_flag(tp, ROBOSWITCH))
|
||||
+ pci_set_power_state(tp->pdev, PCI_D3hot);
|
||||
}
|
||||
|
||||
static void tg3_aux_stat_to_speed_duplex(struct tg3 *tp, u32 val, u16 *speed, u8 *duplex)
|
||||
@@ -1,72 +0,0 @@
|
||||
From 597715c61ae75a05ab3310a34ff3857a006f0f63 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Thu, 20 Nov 2014 21:32:42 +0100
|
||||
Subject: [PATCH] bcma: add table of serial flashes with smaller blocks
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
---
|
||||
drivers/bcma/driver_chipcommon_sflash.c | 29 +++++++++++++++++++++++++++++
|
||||
1 file changed, 29 insertions(+)
|
||||
|
||||
--- a/drivers/bcma/driver_chipcommon_sflash.c
|
||||
+++ b/drivers/bcma/driver_chipcommon_sflash.c
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/bcma/bcma.h>
|
||||
+#include <bcm47xx_board.h>
|
||||
|
||||
static struct resource bcma_sflash_resource = {
|
||||
.name = "bcma_sflash",
|
||||
@@ -41,6 +42,13 @@ static const struct bcma_sflash_tbl_e bc
|
||||
{ NULL },
|
||||
};
|
||||
|
||||
+/* Some devices use smaller blocks (and have more of them) */
|
||||
+static const struct bcma_sflash_tbl_e bcma_sflash_st_shrink_tbl[] = {
|
||||
+ { "M25P16", 0x14, 0x1000, 512, },
|
||||
+ { "M25P32", 0x15, 0x1000, 1024, },
|
||||
+ { NULL },
|
||||
+};
|
||||
+
|
||||
static const struct bcma_sflash_tbl_e bcma_sflash_sst_tbl[] = {
|
||||
{ "SST25WF512", 1, 0x1000, 16, },
|
||||
{ "SST25VF512", 0x48, 0x1000, 16, },
|
||||
@@ -84,6 +92,23 @@ static void bcma_sflash_cmd(struct bcma_
|
||||
bcma_err(cc->core->bus, "SFLASH control command failed (timeout)!\n");
|
||||
}
|
||||
|
||||
+const struct bcma_sflash_tbl_e *bcma_sflash_shrink_flash(u32 id)
|
||||
+{
|
||||
+ enum bcm47xx_board board = bcm47xx_board_get();
|
||||
+ const struct bcma_sflash_tbl_e *e;
|
||||
+
|
||||
+ switch (board) {
|
||||
+ case BCM47XX_BOARD_NETGEAR_WGR614_V10:
|
||||
+ for (e = bcma_sflash_st_shrink_tbl; e->name; e++) {
|
||||
+ if (e->id == id)
|
||||
+ return e;
|
||||
+ }
|
||||
+ return NULL;
|
||||
+ default:
|
||||
+ return NULL;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/* Initialize serial flash access */
|
||||
int bcma_sflash_init(struct bcma_drv_cc *cc)
|
||||
{
|
||||
@@ -114,6 +139,10 @@ int bcma_sflash_init(struct bcma_drv_cc
|
||||
case 0x13:
|
||||
return -ENOTSUPP;
|
||||
default:
|
||||
+ e = bcma_sflash_shrink_flash(id);
|
||||
+ if (e)
|
||||
+ break;
|
||||
+
|
||||
for (e = bcma_sflash_st_tbl; e->name; e++) {
|
||||
if (e->id == id)
|
||||
break;
|
||||
@@ -1,295 +0,0 @@
|
||||
The Netgear wgt634u uses a different format for storing the
|
||||
configuration. This patch is needed to read out the correct
|
||||
configuration. The cfe_env.c file uses a different method way to read
|
||||
out the configuration than the in kernel cfe config reader.
|
||||
|
||||
--- a/arch/mips/bcm47xx/Makefile
|
||||
+++ b/arch/mips/bcm47xx/Makefile
|
||||
@@ -5,3 +5,4 @@
|
||||
|
||||
obj-y += irq.o nvram.o prom.o serial.o setup.o time.o sprom.o
|
||||
obj-y += board.o buttons.o leds.o workarounds.o
|
||||
+obj-y += cfe_env.o
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/bcm47xx/cfe_env.c
|
||||
@@ -0,0 +1,228 @@
|
||||
+/*
|
||||
+ * CFE environment variable access
|
||||
+ *
|
||||
+ * Copyright 2001-2003, Broadcom Corporation
|
||||
+ * Copyright 2006, Felix Fietkau <nbd@openwrt.org>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify it
|
||||
+ * under the terms of the GNU General Public License as published by the
|
||||
+ * Free Software Foundation; either version 2 of the License, or (at your
|
||||
+ * option) any later version.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/string.h>
|
||||
+#include <asm/io.h>
|
||||
+#include <asm/uaccess.h>
|
||||
+
|
||||
+#define NVRAM_SIZE (0x1ff0)
|
||||
+static char _nvdata[NVRAM_SIZE];
|
||||
+static char _valuestr[256];
|
||||
+
|
||||
+/*
|
||||
+ * TLV types. These codes are used in the "type-length-value"
|
||||
+ * encoding of the items stored in the NVRAM device (flash or EEPROM)
|
||||
+ *
|
||||
+ * The layout of the flash/nvram is as follows:
|
||||
+ *
|
||||
+ * <type> <length> <data ...> <type> <length> <data ...> <type_end>
|
||||
+ *
|
||||
+ * The type code of "ENV_TLV_TYPE_END" marks the end of the list.
|
||||
+ * The "length" field marks the length of the data section, not
|
||||
+ * including the type and length fields.
|
||||
+ *
|
||||
+ * Environment variables are stored as follows:
|
||||
+ *
|
||||
+ * <type_env> <length> <flags> <name> = <value>
|
||||
+ *
|
||||
+ * If bit 0 (low bit) is set, the length is an 8-bit value.
|
||||
+ * If bit 0 (low bit) is clear, the length is a 16-bit value
|
||||
+ *
|
||||
+ * Bit 7 set indicates "user" TLVs. In this case, bit 0 still
|
||||
+ * indicates the size of the length field.
|
||||
+ *
|
||||
+ * Flags are from the constants below:
|
||||
+ *
|
||||
+ */
|
||||
+#define ENV_LENGTH_16BITS 0x00 /* for low bit */
|
||||
+#define ENV_LENGTH_8BITS 0x01
|
||||
+
|
||||
+#define ENV_TYPE_USER 0x80
|
||||
+
|
||||
+#define ENV_CODE_SYS(n,l) (((n)<<1)|(l))
|
||||
+#define ENV_CODE_USER(n,l) ((((n)<<1)|(l)) | ENV_TYPE_USER)
|
||||
+
|
||||
+/*
|
||||
+ * The actual TLV types we support
|
||||
+ */
|
||||
+
|
||||
+#define ENV_TLV_TYPE_END 0x00
|
||||
+#define ENV_TLV_TYPE_ENV ENV_CODE_SYS(0,ENV_LENGTH_8BITS)
|
||||
+
|
||||
+/*
|
||||
+ * Environment variable flags
|
||||
+ */
|
||||
+
|
||||
+#define ENV_FLG_NORMAL 0x00 /* normal read/write */
|
||||
+#define ENV_FLG_BUILTIN 0x01 /* builtin - not stored in flash */
|
||||
+#define ENV_FLG_READONLY 0x02 /* read-only - cannot be changed */
|
||||
+
|
||||
+#define ENV_FLG_MASK 0xFF /* mask of attributes we keep */
|
||||
+#define ENV_FLG_ADMIN 0x100 /* lets us internally override permissions */
|
||||
+
|
||||
+
|
||||
+/* *********************************************************************
|
||||
+ * _nvram_read(buffer,offset,length)
|
||||
+ *
|
||||
+ * Read data from the NVRAM device
|
||||
+ *
|
||||
+ * Input parameters:
|
||||
+ * buffer - destination buffer
|
||||
+ * offset - offset of data to read
|
||||
+ * length - number of bytes to read
|
||||
+ *
|
||||
+ * Return value:
|
||||
+ * number of bytes read, or <0 if error occured
|
||||
+ ********************************************************************* */
|
||||
+static int
|
||||
+_nvram_read(unsigned char *nv_buf, unsigned char *buffer, int offset, int length)
|
||||
+{
|
||||
+ int i;
|
||||
+ if (offset > NVRAM_SIZE)
|
||||
+ return -1;
|
||||
+
|
||||
+ for ( i = 0; i < length; i++) {
|
||||
+ buffer[i] = ((volatile unsigned char*)nv_buf)[offset + i];
|
||||
+ }
|
||||
+ return length;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static char*
|
||||
+_strnchr(const char *dest,int c,size_t cnt)
|
||||
+{
|
||||
+ while (*dest && (cnt > 0)) {
|
||||
+ if (*dest == c) return (char *) dest;
|
||||
+ dest++;
|
||||
+ cnt--;
|
||||
+ }
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+
|
||||
+/*
|
||||
+ * Core support API: Externally visible.
|
||||
+ */
|
||||
+
|
||||
+/*
|
||||
+ * Get the value of an NVRAM variable
|
||||
+ * @param name name of variable to get
|
||||
+ * @return value of variable or NULL if undefined
|
||||
+ */
|
||||
+
|
||||
+char *cfe_env_get(unsigned char *nv_buf, const char *name)
|
||||
+{
|
||||
+ int size;
|
||||
+ unsigned char *buffer;
|
||||
+ unsigned char *ptr;
|
||||
+ unsigned char *envval;
|
||||
+ unsigned int reclen;
|
||||
+ unsigned int rectype;
|
||||
+ int offset;
|
||||
+ int flg;
|
||||
+
|
||||
+ if (!strcmp(name, "nvram_type"))
|
||||
+ return "cfe";
|
||||
+
|
||||
+ size = NVRAM_SIZE;
|
||||
+ buffer = &_nvdata[0];
|
||||
+
|
||||
+ ptr = buffer;
|
||||
+ offset = 0;
|
||||
+
|
||||
+ /* Read the record type and length */
|
||||
+ if (_nvram_read(nv_buf, ptr,offset,1) != 1) {
|
||||
+ goto error;
|
||||
+ }
|
||||
+
|
||||
+ while ((*ptr != ENV_TLV_TYPE_END) && (size > 1)) {
|
||||
+
|
||||
+ /* Adjust pointer for TLV type */
|
||||
+ rectype = *(ptr);
|
||||
+ offset++;
|
||||
+ size--;
|
||||
+
|
||||
+ /*
|
||||
+ * Read the length. It can be either 1 or 2 bytes
|
||||
+ * depending on the code
|
||||
+ */
|
||||
+ if (rectype & ENV_LENGTH_8BITS) {
|
||||
+ /* Read the record type and length - 8 bits */
|
||||
+ if (_nvram_read(nv_buf, ptr,offset,1) != 1) {
|
||||
+ goto error;
|
||||
+ }
|
||||
+ reclen = *(ptr);
|
||||
+ size--;
|
||||
+ offset++;
|
||||
+ }
|
||||
+ else {
|
||||
+ /* Read the record type and length - 16 bits, MSB first */
|
||||
+ if (_nvram_read(nv_buf, ptr,offset,2) != 2) {
|
||||
+ goto error;
|
||||
+ }
|
||||
+ reclen = (((unsigned int) *(ptr)) << 8) + (unsigned int) *(ptr+1);
|
||||
+ size -= 2;
|
||||
+ offset += 2;
|
||||
+ }
|
||||
+
|
||||
+ if (reclen > size)
|
||||
+ break; /* should not happen, bad NVRAM */
|
||||
+
|
||||
+ switch (rectype) {
|
||||
+ case ENV_TLV_TYPE_ENV:
|
||||
+ /* Read the TLV data */
|
||||
+ if (_nvram_read(nv_buf, ptr,offset,reclen) != reclen)
|
||||
+ goto error;
|
||||
+ flg = *ptr++;
|
||||
+ envval = (unsigned char *) _strnchr(ptr,'=',(reclen-1));
|
||||
+ if (envval) {
|
||||
+ *envval++ = '\0';
|
||||
+ memcpy(_valuestr,envval,(reclen-1)-(envval-ptr));
|
||||
+ _valuestr[(reclen-1)-(envval-ptr)] = '\0';
|
||||
+#if 0
|
||||
+ printk(KERN_INFO "NVRAM:%s=%s\n", ptr, _valuestr);
|
||||
+#endif
|
||||
+ if(!strcmp(ptr, name)){
|
||||
+ return _valuestr;
|
||||
+ }
|
||||
+ if((strlen(ptr) > 1) && !strcmp(&ptr[1], name))
|
||||
+ return _valuestr;
|
||||
+ }
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ /* Unknown TLV type, skip it. */
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Advance to next TLV
|
||||
+ */
|
||||
+
|
||||
+ size -= (int)reclen;
|
||||
+ offset += reclen;
|
||||
+
|
||||
+ /* Read the next record type */
|
||||
+ ptr = buffer;
|
||||
+ if (_nvram_read(nv_buf, ptr,offset,1) != 1)
|
||||
+ goto error;
|
||||
+ }
|
||||
+
|
||||
+error:
|
||||
+ return NULL;
|
||||
+
|
||||
+}
|
||||
+
|
||||
--- a/arch/mips/bcm47xx/nvram.c
|
||||
+++ b/arch/mips/bcm47xx/nvram.c
|
||||
@@ -37,6 +37,8 @@ struct nvram_header {
|
||||
static char nvram_buf[NVRAM_SPACE];
|
||||
static size_t nvram_len;
|
||||
static const u32 nvram_sizes[] = {0x8000, 0xF000, 0x10000};
|
||||
+static int cfe_env;
|
||||
+extern char *cfe_env_get(char *nv_buf, const char *name);
|
||||
|
||||
static u32 find_nvram_size(void __iomem *end)
|
||||
{
|
||||
@@ -66,6 +68,26 @@ static int nvram_find_and_copy(void __io
|
||||
return -EEXIST;
|
||||
}
|
||||
|
||||
+ cfe_env = 0;
|
||||
+
|
||||
+ /* XXX: hack for supporting the CFE environment stuff on WGT634U */
|
||||
+ if (lim >= 8 * 1024 * 1024) {
|
||||
+ src = (u32 *)(iobase + 8 * 1024 * 1024 - 0x2000);
|
||||
+ dst = (u32 *)nvram_buf;
|
||||
+
|
||||
+ if ((*src & 0xff00ff) == 0x000001) {
|
||||
+ printk("early_nvram_init: WGT634U NVRAM found.\n");
|
||||
+
|
||||
+ for (i = 0; i < 0x1ff0; i++) {
|
||||
+ if (*src == 0xFFFFFFFF)
|
||||
+ break;
|
||||
+ *dst++ = *src++;
|
||||
+ }
|
||||
+ cfe_env = 1;
|
||||
+ return 0;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
/* TODO: when nvram is on nand flash check for bad blocks first. */
|
||||
off = FLASH_MIN;
|
||||
while (off <= lim) {
|
||||
@@ -186,6 +208,13 @@ int bcm47xx_nvram_getenv(const char *nam
|
||||
return err;
|
||||
}
|
||||
|
||||
+ if (cfe_env) {
|
||||
+ value = cfe_env_get(nvram_buf, name);
|
||||
+ if (!value)
|
||||
+ return -ENOENT;
|
||||
+ return snprintf(val, val_len, "%s", value);
|
||||
+ }
|
||||
+
|
||||
/* Look for name=value and return value */
|
||||
var = &nvram_buf[sizeof(struct nvram_header)];
|
||||
end = nvram_buf + sizeof(nvram_buf);
|
||||
@@ -1,101 +0,0 @@
|
||||
--- a/arch/mips/bcm47xx/setup.c
|
||||
+++ b/arch/mips/bcm47xx/setup.c
|
||||
@@ -36,6 +36,7 @@
|
||||
#include <linux/ssb/ssb.h>
|
||||
#include <linux/ssb/ssb_embedded.h>
|
||||
#include <linux/bcma/bcma_soc.h>
|
||||
+#include <linux/old_gpio_wdt.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/idle.h>
|
||||
#include <asm/prom.h>
|
||||
@@ -245,6 +246,33 @@ static struct fixed_phy_status bcm47xx_f
|
||||
.duplex = DUPLEX_FULL,
|
||||
};
|
||||
|
||||
+static struct gpio_wdt_platform_data gpio_wdt_data;
|
||||
+
|
||||
+static struct platform_device gpio_wdt_device = {
|
||||
+ .name = "gpio-wdt",
|
||||
+ .id = 0,
|
||||
+ .dev = {
|
||||
+ .platform_data = &gpio_wdt_data,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static int __init bcm47xx_register_gpio_watchdog(void)
|
||||
+{
|
||||
+ enum bcm47xx_board board = bcm47xx_board_get();
|
||||
+
|
||||
+ switch (board) {
|
||||
+ case BCM47XX_BOARD_HUAWEI_E970:
|
||||
+ pr_info("bcm47xx: detected Huawei E970 or similar, starting early gpio_wdt timer\n");
|
||||
+ gpio_wdt_data.gpio = 7;
|
||||
+ gpio_wdt_data.interval = HZ;
|
||||
+ gpio_wdt_data.first_interval = HZ / 5;
|
||||
+ return platform_device_register(&gpio_wdt_device);
|
||||
+ default:
|
||||
+ /* Nothing to do */
|
||||
+ return 0;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int __init bcm47xx_register_bus_complete(void)
|
||||
{
|
||||
switch (bcm47xx_bus_type) {
|
||||
@@ -264,6 +292,7 @@ static int __init bcm47xx_register_bus_c
|
||||
bcm47xx_workarounds();
|
||||
|
||||
fixed_phy_add(PHY_POLL, 0, &bcm47xx_fixed_phy_status);
|
||||
+ bcm47xx_register_gpio_watchdog();
|
||||
return 0;
|
||||
}
|
||||
device_initcall(bcm47xx_register_bus_complete);
|
||||
--- a/arch/mips/configs/bcm47xx_defconfig
|
||||
+++ b/arch/mips/configs/bcm47xx_defconfig
|
||||
@@ -67,6 +67,7 @@ CONFIG_HW_RANDOM=y
|
||||
CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_WATCHDOG=y
|
||||
CONFIG_BCM47XX_WDT=y
|
||||
+CONFIG_GPIO_WDT=y
|
||||
CONFIG_SSB_DEBUG=y
|
||||
CONFIG_SSB_DRIVER_GIGE=y
|
||||
CONFIG_BCMA_DRIVER_GMAC_CMN=y
|
||||
--- a/drivers/ssb/embedded.c
|
||||
+++ b/drivers/ssb/embedded.c
|
||||
@@ -34,11 +34,36 @@ int ssb_watchdog_timer_set(struct ssb_bu
|
||||
}
|
||||
EXPORT_SYMBOL(ssb_watchdog_timer_set);
|
||||
|
||||
+#ifdef CONFIG_BCM47XX
|
||||
+#include <bcm47xx_board.h>
|
||||
+
|
||||
+static bool ssb_watchdog_supported(void)
|
||||
+{
|
||||
+ enum bcm47xx_board board = bcm47xx_board_get();
|
||||
+
|
||||
+ /* The Huawei E970 has a hardware watchdog using a GPIO */
|
||||
+ switch (board) {
|
||||
+ case BCM47XX_BOARD_HUAWEI_E970:
|
||||
+ return false;
|
||||
+ default:
|
||||
+ return true;
|
||||
+ }
|
||||
+}
|
||||
+#else
|
||||
+static bool ssb_watchdog_supported(void)
|
||||
+{
|
||||
+ return true;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
int ssb_watchdog_register(struct ssb_bus *bus)
|
||||
{
|
||||
struct bcm47xx_wdt wdt = {};
|
||||
struct platform_device *pdev;
|
||||
|
||||
+ if (!ssb_watchdog_supported())
|
||||
+ return 0;
|
||||
+
|
||||
if (ssb_chipco_available(&bus->chipco)) {
|
||||
wdt.driver_data = &bus->chipco;
|
||||
wdt.timer_set = ssb_chipco_watchdog_timer_set_wdt;
|
||||
@@ -1,35 +0,0 @@
|
||||
From 5c81397a0147ea59c778d1de14ef54e2268221f6 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Wed, 8 Apr 2015 06:58:11 +0200
|
||||
Subject: [PATCH] ssb: reject PCI writes setting CardBus bridge resources
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
If SoC has a CardBus we can set resources of device at slot 1 only. It's
|
||||
impossigle to set bridge resources as it simply overwrites device 1
|
||||
configuration and usually results in Data bus error-s.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
---
|
||||
drivers/ssb/driver_pcicore.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/drivers/ssb/driver_pcicore.c b/drivers/ssb/driver_pcicore.c
|
||||
index 15a7ee3..c603d19 100644
|
||||
--- a/drivers/ssb/driver_pcicore.c
|
||||
+++ b/drivers/ssb/driver_pcicore.c
|
||||
@@ -164,6 +164,10 @@ static int ssb_extpci_write_config(struct ssb_pcicore *pc,
|
||||
SSB_WARN_ON(!pc->hostmode);
|
||||
if (unlikely(len != 1 && len != 2 && len != 4))
|
||||
goto out;
|
||||
+ /* CardBus SoCs allow configuring dev 1 resources only */
|
||||
+ if (extpci_core->cardbusmode && dev != 1 &&
|
||||
+ off >= PCI_BASE_ADDRESS_0 && off <= PCI_BASE_ADDRESS_5)
|
||||
+ goto out;
|
||||
addr = get_cfgspace_addr(pc, bus, dev, func, off);
|
||||
if (unlikely(!addr))
|
||||
goto out;
|
||||
--
|
||||
1.8.4.5
|
||||
|
||||
@@ -1,138 +0,0 @@
|
||||
--- a/arch/mips/include/asm/r4kcache.h
|
||||
+++ b/arch/mips/include/asm/r4kcache.h
|
||||
@@ -28,10 +28,28 @@ extern void (*r4k_blast_icache)(void);
|
||||
#ifdef CONFIG_BCM47XX
|
||||
#include <asm/paccess.h>
|
||||
#include <linux/ssb/ssb.h>
|
||||
-#define BCM4710_DUMMY_RREG() ((void) *((u8 *) KSEG1ADDR(SSB_ENUM_BASE)))
|
||||
+#define BCM4710_DUMMY_RREG() bcm4710_dummy_rreg()
|
||||
+
|
||||
+static inline unsigned long bcm4710_dummy_rreg(void)
|
||||
+{
|
||||
+ return *(volatile unsigned long *)(KSEG1ADDR(SSB_ENUM_BASE));
|
||||
+}
|
||||
+
|
||||
+#define BCM4710_FILL_TLB(addr) bcm4710_fill_tlb((void *)(addr))
|
||||
+
|
||||
+static inline unsigned long bcm4710_fill_tlb(void *addr)
|
||||
+{
|
||||
+ return *(unsigned long *)addr;
|
||||
+}
|
||||
+
|
||||
+#define BCM4710_PROTECTED_FILL_TLB(addr) bcm4710_protected_fill_tlb((void *)(addr))
|
||||
+
|
||||
+static inline void bcm4710_protected_fill_tlb(void *addr)
|
||||
+{
|
||||
+ unsigned long x;
|
||||
+ get_dbe(x, (unsigned long *)addr);;
|
||||
+}
|
||||
|
||||
-#define BCM4710_FILL_TLB(addr) (*(volatile unsigned long *)(addr))
|
||||
-#define BCM4710_PROTECTED_FILL_TLB(addr) ({ unsigned long x; get_dbe(x, (volatile unsigned long *)(addr)); })
|
||||
#else
|
||||
#define BCM4710_DUMMY_RREG()
|
||||
|
||||
--- a/arch/mips/mm/tlbex.c
|
||||
+++ b/arch/mips/mm/tlbex.c
|
||||
@@ -924,6 +924,9 @@ build_get_pgde32(u32 **p, unsigned int t
|
||||
uasm_i_srl(p, ptr, ptr, SMP_CPUID_PTRSHIFT);
|
||||
uasm_i_addu(p, ptr, tmp, ptr);
|
||||
#else
|
||||
+#ifdef CONFIG_BCM47XX
|
||||
+ uasm_i_nop(p);
|
||||
+#endif
|
||||
UASM_i_LA_mostly(p, ptr, pgdc);
|
||||
#endif
|
||||
uasm_i_mfc0(p, tmp, C0_BADVADDR); /* get faulting address */
|
||||
@@ -1269,12 +1272,12 @@ static void build_r4000_tlb_refill_handl
|
||||
/* No need for uasm_i_nop */
|
||||
}
|
||||
|
||||
-#ifdef CONFIG_BCM47XX
|
||||
- uasm_i_nop(&p);
|
||||
-#endif
|
||||
#ifdef CONFIG_64BIT
|
||||
build_get_pmde64(&p, &l, &r, K0, K1); /* get pmd in K1 */
|
||||
#else
|
||||
+# ifdef CONFIG_BCM47XX
|
||||
+ uasm_i_nop(&p);
|
||||
+# endif
|
||||
build_get_pgde32(&p, K0, K1); /* get pgd in K1 */
|
||||
#endif
|
||||
|
||||
@@ -1286,6 +1289,9 @@ static void build_r4000_tlb_refill_handl
|
||||
build_update_entries(&p, K0, K1);
|
||||
build_tlb_write_entry(&p, &l, &r, tlb_random);
|
||||
uasm_l_leave(&l, p);
|
||||
+#ifdef CONFIG_BCM47XX
|
||||
+ uasm_i_nop(&p);
|
||||
+#endif
|
||||
uasm_i_eret(&p); /* return from trap */
|
||||
}
|
||||
#ifdef CONFIG_MIPS_HUGE_TLB_SUPPORT
|
||||
@@ -1834,12 +1840,12 @@ build_r4000_tlbchange_handler_head(u32 *
|
||||
{
|
||||
struct work_registers wr = build_get_work_registers(p);
|
||||
|
||||
-#ifdef CONFIG_BCM47XX
|
||||
- uasm_i_nop(p);
|
||||
-#endif
|
||||
#ifdef CONFIG_64BIT
|
||||
build_get_pmde64(p, l, r, wr.r1, wr.r2); /* get pmd in ptr */
|
||||
#else
|
||||
+# ifdef CONFIG_BCM47XX
|
||||
+ uasm_i_nop(p);
|
||||
+# endif
|
||||
build_get_pgde32(p, wr.r1, wr.r2); /* get pgd in ptr */
|
||||
#endif
|
||||
|
||||
@@ -1886,6 +1892,9 @@ build_r4000_tlbchange_handler_tail(u32 *
|
||||
build_tlb_write_entry(p, l, r, tlb_indexed);
|
||||
uasm_l_leave(l, *p);
|
||||
build_restore_work_registers(p);
|
||||
+#ifdef CONFIG_BCM47XX
|
||||
+ uasm_i_nop(p);
|
||||
+#endif
|
||||
uasm_i_eret(p); /* return from trap */
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
--- a/arch/mips/kernel/genex.S
|
||||
+++ b/arch/mips/kernel/genex.S
|
||||
@@ -21,6 +21,19 @@
|
||||
#include <asm/war.h>
|
||||
#include <asm/thread_info.h>
|
||||
|
||||
+#ifdef CONFIG_BCM47XX
|
||||
+# ifdef eret
|
||||
+# undef eret
|
||||
+# endif
|
||||
+# define eret \
|
||||
+ .set push; \
|
||||
+ .set noreorder; \
|
||||
+ nop; \
|
||||
+ nop; \
|
||||
+ eret; \
|
||||
+ .set pop;
|
||||
+#endif
|
||||
+
|
||||
__INIT
|
||||
|
||||
/*
|
||||
@@ -34,7 +47,6 @@ NESTED(except_vec3_generic, 0, sp)
|
||||
.set noat
|
||||
#ifdef CONFIG_BCM47XX
|
||||
nop
|
||||
- nop
|
||||
#endif
|
||||
#if R5432_CP0_INTERRUPT_WAR
|
||||
mfc0 k0, CP0_INDEX
|
||||
@@ -59,6 +71,9 @@ NESTED(except_vec3_r4000, 0, sp)
|
||||
.set push
|
||||
.set arch=r4000
|
||||
.set noat
|
||||
+#ifdef CONFIG_BCM47XX
|
||||
+ nop
|
||||
+#endif
|
||||
mfc0 k1, CP0_CAUSE
|
||||
li k0, 31<<2
|
||||
andi k1, k1, 0x7c
|
||||
@@ -1,46 +0,0 @@
|
||||
--- a/drivers/pcmcia/yenta_socket.c
|
||||
+++ b/drivers/pcmcia/yenta_socket.c
|
||||
@@ -920,6 +920,8 @@ static unsigned int yenta_probe_irq(stru
|
||||
* Probe for usable interrupts using the force
|
||||
* register to generate bogus card status events.
|
||||
*/
|
||||
+#ifndef CONFIG_BCM47XX
|
||||
+ /* WRT54G3G does not like this */
|
||||
cb_writel(socket, CB_SOCKET_EVENT, -1);
|
||||
cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK);
|
||||
reg = exca_readb(socket, I365_CSCINT);
|
||||
@@ -935,6 +937,7 @@ static unsigned int yenta_probe_irq(stru
|
||||
}
|
||||
cb_writel(socket, CB_SOCKET_MASK, 0);
|
||||
exca_writeb(socket, I365_CSCINT, reg);
|
||||
+#endif
|
||||
|
||||
mask = probe_irq_mask(val) & 0xffff;
|
||||
|
||||
@@ -1019,6 +1022,10 @@ static void yenta_get_socket_capabilitie
|
||||
else
|
||||
socket->socket.irq_mask = 0;
|
||||
|
||||
+ /* irq mask probing is broken for the WRT54G3G */
|
||||
+ if (socket->socket.irq_mask == 0)
|
||||
+ socket->socket.irq_mask = 0x6f8;
|
||||
+
|
||||
dev_printk(KERN_INFO, &socket->dev->dev,
|
||||
"ISA IRQ mask 0x%04x, PCI irq %d\n",
|
||||
socket->socket.irq_mask, socket->cb_irq);
|
||||
@@ -1257,6 +1264,15 @@ static int yenta_probe(struct pci_dev *d
|
||||
dev_printk(KERN_INFO, &dev->dev,
|
||||
"Socket status: %08x\n", cb_readl(socket, CB_SOCKET_STATE));
|
||||
|
||||
+ /* Generate an interrupt on card insert/remove */
|
||||
+ config_writew(socket, CB_SOCKET_MASK, CB_CSTSMASK | CB_CDMASK);
|
||||
+
|
||||
+ /* Set up Multifunction Routing Status Register */
|
||||
+ config_writew(socket, 0x8C, 0x1000 /* MFUNC3 to GPIO3 */ | 0x2 /* MFUNC0 to INTA */);
|
||||
+
|
||||
+ /* Switch interrupts to parallelized */
|
||||
+ config_writeb(socket, 0x92, 0x64);
|
||||
+
|
||||
yenta_fixup_parent_bridge(dev->subordinate);
|
||||
|
||||
/* Register it with the pcmcia layer.. */
|
||||
@@ -1,11 +0,0 @@
|
||||
--- a/drivers/ssb/driver_pcicore.c
|
||||
+++ b/drivers/ssb/driver_pcicore.c
|
||||
@@ -389,7 +389,7 @@ static void ssb_pcicore_init_hostmode(st
|
||||
set_io_port_base(ssb_pcicore_controller.io_map_base);
|
||||
/* Give some time to the PCI controller to configure itself with the new
|
||||
* values. Not waiting at this point causes crashes of the machine. */
|
||||
- mdelay(10);
|
||||
+ mdelay(300);
|
||||
register_pci_controller(&ssb_pcicore_controller);
|
||||
}
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
--- a/arch/mips/bcm47xx/nvram.c
|
||||
+++ b/arch/mips/bcm47xx/nvram.c
|
||||
@@ -34,7 +34,8 @@ struct nvram_header {
|
||||
u32 config_ncdl; /* ncdl values for memc */
|
||||
};
|
||||
|
||||
-static char nvram_buf[NVRAM_SPACE];
|
||||
+char nvram_buf[NVRAM_SPACE];
|
||||
+EXPORT_SYMBOL(nvram_buf);
|
||||
static size_t nvram_len;
|
||||
static const u32 nvram_sizes[] = {0x8000, 0xF000, 0x10000};
|
||||
static int cfe_env;
|
||||
--- a/arch/mips/mm/cache.c
|
||||
+++ b/arch/mips/mm/cache.c
|
||||
@@ -59,6 +59,7 @@ void (*_dma_cache_wback)(unsigned long s
|
||||
void (*_dma_cache_inv)(unsigned long start, unsigned long size);
|
||||
|
||||
EXPORT_SYMBOL(_dma_cache_wback_inv);
|
||||
+EXPORT_SYMBOL(_dma_cache_inv);
|
||||
|
||||
#endif /* CONFIG_DMA_NONCOHERENT || CONFIG_DMA_MAYBE_COHERENT */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,25 +0,0 @@
|
||||
Upstream changed the default rootfs to tmpfs when none has been passed
|
||||
to the kernel - this doesn't fit our purposes, so change it back.
|
||||
|
||||
Signed-off-by: Imre Kaloz <kaloz@openwrt.org>
|
||||
|
||||
--- a/init/do_mounts.c
|
||||
+++ b/init/do_mounts.c
|
||||
@@ -625,6 +625,7 @@ int __init init_rootfs(void)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
+#if 0
|
||||
if (IS_ENABLED(CONFIG_TMPFS) && !saved_root_name[0] &&
|
||||
(!root_fs_names || strstr(root_fs_names, "tmpfs"))) {
|
||||
err = shmem_init();
|
||||
@@ -632,6 +633,9 @@ int __init init_rootfs(void)
|
||||
} else {
|
||||
err = init_ramfs_fs();
|
||||
}
|
||||
+#else
|
||||
+ err = init_ramfs_fs();
|
||||
+#endif
|
||||
|
||||
if (err)
|
||||
unregister_filesystem(&rootfs_fs_type);
|
||||
@@ -1,30 +0,0 @@
|
||||
--- a/drivers/ssb/driver_pcicore.c
|
||||
+++ b/drivers/ssb/driver_pcicore.c
|
||||
@@ -357,6 +357,16 @@ static void ssb_pcicore_init_hostmode(st
|
||||
pcicore_write32(pc, SSB_PCICORE_SBTOPCI2,
|
||||
SSB_PCICORE_SBTOPCI_MEM | SSB_PCI_DMA);
|
||||
|
||||
+ /*
|
||||
+ * Accessing PCI config without a proper delay after devices reset (not
|
||||
+ * GPIO reset) was causing reboots on WRT300N v1.0 (BCM4704).
|
||||
+ * Tested delay 850 us lowered reboot chance to 50-80%, 1000 us fixed it
|
||||
+ * completely. Flushing all writes was also tested but with no luck.
|
||||
+ * The same problem was reported for WRT350N v1 (BCM4705), so we just
|
||||
+ * sleep here unconditionally.
|
||||
+ */
|
||||
+ usleep_range(1000, 2000);
|
||||
+
|
||||
/* Enable PCI bridge BAR0 prefetch and burst */
|
||||
val = PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY;
|
||||
ssb_extpci_write_config(pc, 0, 0, 0, PCI_COMMAND, &val, 2);
|
||||
--- a/drivers/ssb/main.c
|
||||
+++ b/drivers/ssb/main.c
|
||||
@@ -1135,6 +1135,8 @@ static u32 ssb_tmslow_reject_bitmask(str
|
||||
case SSB_IDLOW_SSBREV_25: /* TODO - find the proper REJECT bit */
|
||||
case SSB_IDLOW_SSBREV_27: /* same here */
|
||||
return SSB_TMSLOW_REJECT; /* this is a guess */
|
||||
+ case SSB_IDLOW_SSBREV:
|
||||
+ break;
|
||||
default:
|
||||
WARN(1, KERN_INFO "ssb: Backplane Revision 0x%.8X\n", rev);
|
||||
}
|
||||
@@ -1,680 +0,0 @@
|
||||
--- a/drivers/bcma/bcma_private.h
|
||||
+++ b/drivers/bcma/bcma_private.h
|
||||
@@ -26,6 +26,7 @@ bool bcma_wait_value(struct bcma_device
|
||||
int timeout);
|
||||
void bcma_prepare_core(struct bcma_bus *bus, struct bcma_device *core);
|
||||
void bcma_init_bus(struct bcma_bus *bus);
|
||||
+void bcma_unregister_cores(struct bcma_bus *bus);
|
||||
int bcma_bus_register(struct bcma_bus *bus);
|
||||
void bcma_bus_unregister(struct bcma_bus *bus);
|
||||
int __init bcma_bus_early_register(struct bcma_bus *bus);
|
||||
@@ -42,6 +43,9 @@ int bcma_bus_scan(struct bcma_bus *bus);
|
||||
int bcma_sprom_get(struct bcma_bus *bus);
|
||||
|
||||
/* driver_chipcommon.c */
|
||||
+void bcma_core_chipcommon_early_init(struct bcma_drv_cc *cc);
|
||||
+void bcma_core_chipcommon_init(struct bcma_drv_cc *cc);
|
||||
+void bcma_chipco_bcm4331_ext_pa_lines_ctl(struct bcma_drv_cc *cc, bool enable);
|
||||
#ifdef CONFIG_BCMA_DRIVER_MIPS
|
||||
void bcma_chipco_serial_init(struct bcma_drv_cc *cc);
|
||||
extern struct platform_device bcma_pflash_dev;
|
||||
@@ -52,6 +56,8 @@ int bcma_core_chipcommon_b_init(struct b
|
||||
void bcma_core_chipcommon_b_free(struct bcma_drv_cc_b *ccb);
|
||||
|
||||
/* driver_chipcommon_pmu.c */
|
||||
+void bcma_pmu_early_init(struct bcma_drv_cc *cc);
|
||||
+void bcma_pmu_init(struct bcma_drv_cc *cc);
|
||||
u32 bcma_pmu_get_alp_clock(struct bcma_drv_cc *cc);
|
||||
u32 bcma_pmu_get_cpu_clock(struct bcma_drv_cc *cc);
|
||||
|
||||
@@ -100,7 +106,35 @@ static inline void __exit bcma_host_soc_
|
||||
#endif /* CONFIG_BCMA_HOST_SOC && CONFIG_OF */
|
||||
|
||||
/* driver_pci.c */
|
||||
+#ifdef CONFIG_BCMA_DRIVER_PCI
|
||||
u32 bcma_pcie_read(struct bcma_drv_pci *pc, u32 address);
|
||||
+void bcma_core_pci_early_init(struct bcma_drv_pci *pc);
|
||||
+void bcma_core_pci_init(struct bcma_drv_pci *pc);
|
||||
+void bcma_core_pci_up(struct bcma_drv_pci *pc);
|
||||
+void bcma_core_pci_down(struct bcma_drv_pci *pc);
|
||||
+#else
|
||||
+static inline void bcma_core_pci_early_init(struct bcma_drv_pci *pc)
|
||||
+{
|
||||
+ WARN_ON(pc->core->bus->hosttype == BCMA_HOSTTYPE_PCI);
|
||||
+}
|
||||
+static inline void bcma_core_pci_init(struct bcma_drv_pci *pc)
|
||||
+{
|
||||
+ /* Initialization is required for PCI hosted bus */
|
||||
+ WARN_ON(pc->core->bus->hosttype == BCMA_HOSTTYPE_PCI);
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
+/* driver_pcie2.c */
|
||||
+#ifdef CONFIG_BCMA_DRIVER_PCI
|
||||
+void bcma_core_pcie2_init(struct bcma_drv_pcie2 *pcie2);
|
||||
+void bcma_core_pcie2_up(struct bcma_drv_pcie2 *pcie2);
|
||||
+#else
|
||||
+static inline void bcma_core_pcie2_init(struct bcma_drv_pcie2 *pcie2)
|
||||
+{
|
||||
+ /* Initialization is required for PCI hosted bus */
|
||||
+ WARN_ON(pcie2->core->bus->hosttype == BCMA_HOSTTYPE_PCI);
|
||||
+}
|
||||
+#endif
|
||||
|
||||
extern int bcma_chipco_watchdog_register(struct bcma_drv_cc *cc);
|
||||
|
||||
@@ -117,6 +151,39 @@ static inline void bcma_core_pci_hostmod
|
||||
}
|
||||
#endif /* CONFIG_BCMA_DRIVER_PCI_HOSTMODE */
|
||||
|
||||
+/**************************************************
|
||||
+ * driver_mips.c
|
||||
+ **************************************************/
|
||||
+
|
||||
+#ifdef CONFIG_BCMA_DRIVER_MIPS
|
||||
+unsigned int bcma_core_mips_irq(struct bcma_device *dev);
|
||||
+void bcma_core_mips_early_init(struct bcma_drv_mips *mcore);
|
||||
+void bcma_core_mips_init(struct bcma_drv_mips *mcore);
|
||||
+#else
|
||||
+static inline unsigned int bcma_core_mips_irq(struct bcma_device *dev)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+static inline void bcma_core_mips_early_init(struct bcma_drv_mips *mcore)
|
||||
+{
|
||||
+}
|
||||
+static inline void bcma_core_mips_init(struct bcma_drv_mips *mcore)
|
||||
+{
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
+/**************************************************
|
||||
+ * driver_gmac_cmn.c
|
||||
+ **************************************************/
|
||||
+
|
||||
+#ifdef CONFIG_BCMA_DRIVER_GMAC_CMN
|
||||
+void bcma_core_gmac_cmn_init(struct bcma_drv_gmac_cmn *gc);
|
||||
+#else
|
||||
+static inline void bcma_core_gmac_cmn_init(struct bcma_drv_gmac_cmn *gc)
|
||||
+{
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
#ifdef CONFIG_BCMA_DRIVER_GPIO
|
||||
/* driver_gpio.c */
|
||||
int bcma_gpio_init(struct bcma_drv_cc *cc);
|
||||
--- a/drivers/bcma/driver_gpio.c
|
||||
+++ b/drivers/bcma/driver_gpio.c
|
||||
@@ -17,6 +17,8 @@
|
||||
|
||||
#include "bcma_private.h"
|
||||
|
||||
+#define BCMA_GPIO_MAX_PINS 32
|
||||
+
|
||||
static inline struct bcma_drv_cc *bcma_gpio_get_cc(struct gpio_chip *chip)
|
||||
{
|
||||
return container_of(chip, struct bcma_drv_cc, gpio);
|
||||
@@ -76,7 +78,7 @@ static void bcma_gpio_free(struct gpio_c
|
||||
bcma_chipco_gpio_pullup(cc, 1 << gpio, 0);
|
||||
}
|
||||
|
||||
-#if IS_BUILTIN(CONFIG_BCM47XX)
|
||||
+#if IS_BUILTIN(CONFIG_BCM47XX) || IS_BUILTIN(CONFIG_ARCH_BCM_5301X)
|
||||
static int bcma_gpio_to_irq(struct gpio_chip *chip, unsigned gpio)
|
||||
{
|
||||
struct bcma_drv_cc *cc = bcma_gpio_get_cc(chip);
|
||||
@@ -204,6 +206,7 @@ static void bcma_gpio_irq_domain_exit(st
|
||||
|
||||
int bcma_gpio_init(struct bcma_drv_cc *cc)
|
||||
{
|
||||
+ struct bcma_bus *bus = cc->core->bus;
|
||||
struct gpio_chip *chip = &cc->gpio;
|
||||
int err;
|
||||
|
||||
@@ -215,14 +218,14 @@ int bcma_gpio_init(struct bcma_drv_cc *c
|
||||
chip->set = bcma_gpio_set_value;
|
||||
chip->direction_input = bcma_gpio_direction_input;
|
||||
chip->direction_output = bcma_gpio_direction_output;
|
||||
-#if IS_BUILTIN(CONFIG_BCM47XX)
|
||||
+#if IS_BUILTIN(CONFIG_BCM47XX) || IS_BUILTIN(CONFIG_ARCH_BCM_5301X)
|
||||
chip->to_irq = bcma_gpio_to_irq;
|
||||
#endif
|
||||
#if IS_BUILTIN(CONFIG_OF)
|
||||
if (cc->core->bus->hosttype == BCMA_HOSTTYPE_SOC)
|
||||
chip->of_node = cc->core->dev.of_node;
|
||||
#endif
|
||||
- switch (cc->core->bus->chipinfo.id) {
|
||||
+ switch (bus->chipinfo.id) {
|
||||
case BCMA_CHIP_ID_BCM5357:
|
||||
case BCMA_CHIP_ID_BCM53572:
|
||||
chip->ngpio = 32;
|
||||
@@ -231,13 +234,17 @@ int bcma_gpio_init(struct bcma_drv_cc *c
|
||||
chip->ngpio = 16;
|
||||
}
|
||||
|
||||
- /* There is just one SoC in one device and its GPIO addresses should be
|
||||
- * deterministic to address them more easily. The other buses could get
|
||||
- * a random base number. */
|
||||
- if (cc->core->bus->hosttype == BCMA_HOSTTYPE_SOC)
|
||||
- chip->base = 0;
|
||||
- else
|
||||
- chip->base = -1;
|
||||
+ /*
|
||||
+ * On MIPS we register GPIO devices (LEDs, buttons) using absolute GPIO
|
||||
+ * pin numbers. We don't have Device Tree there and we can't really use
|
||||
+ * relative (per chip) numbers.
|
||||
+ * So let's use predictable base for BCM47XX and "random" for all other.
|
||||
+ */
|
||||
+#if IS_BUILTIN(CONFIG_BCM47XX)
|
||||
+ chip->base = bus->num * BCMA_GPIO_MAX_PINS;
|
||||
+#else
|
||||
+ chip->base = -1;
|
||||
+#endif
|
||||
|
||||
err = bcma_gpio_irq_domain_init(cc);
|
||||
if (err)
|
||||
--- a/drivers/bcma/driver_pci.c
|
||||
+++ b/drivers/bcma/driver_pci.c
|
||||
@@ -282,39 +282,6 @@ void bcma_core_pci_power_save(struct bcm
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(bcma_core_pci_power_save);
|
||||
|
||||
-int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc, struct bcma_device *core,
|
||||
- bool enable)
|
||||
-{
|
||||
- struct pci_dev *pdev;
|
||||
- u32 coremask, tmp;
|
||||
- int err = 0;
|
||||
-
|
||||
- if (!pc || core->bus->hosttype != BCMA_HOSTTYPE_PCI) {
|
||||
- /* This bcma device is not on a PCI host-bus. So the IRQs are
|
||||
- * not routed through the PCI core.
|
||||
- * So we must not enable routing through the PCI core. */
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
- pdev = pc->core->bus->host_pci;
|
||||
-
|
||||
- err = pci_read_config_dword(pdev, BCMA_PCI_IRQMASK, &tmp);
|
||||
- if (err)
|
||||
- goto out;
|
||||
-
|
||||
- coremask = BIT(core->core_index) << 8;
|
||||
- if (enable)
|
||||
- tmp |= coremask;
|
||||
- else
|
||||
- tmp &= ~coremask;
|
||||
-
|
||||
- err = pci_write_config_dword(pdev, BCMA_PCI_IRQMASK, tmp);
|
||||
-
|
||||
-out:
|
||||
- return err;
|
||||
-}
|
||||
-EXPORT_SYMBOL_GPL(bcma_core_pci_irq_ctl);
|
||||
-
|
||||
static void bcma_core_pci_extend_L1timer(struct bcma_drv_pci *pc, bool extend)
|
||||
{
|
||||
u32 w;
|
||||
@@ -328,28 +295,12 @@ static void bcma_core_pci_extend_L1timer
|
||||
bcma_pcie_read(pc, BCMA_CORE_PCI_DLLP_PMTHRESHREG);
|
||||
}
|
||||
|
||||
-void bcma_core_pci_up(struct bcma_bus *bus)
|
||||
+void bcma_core_pci_up(struct bcma_drv_pci *pc)
|
||||
{
|
||||
- struct bcma_drv_pci *pc;
|
||||
-
|
||||
- if (bus->hosttype != BCMA_HOSTTYPE_PCI)
|
||||
- return;
|
||||
-
|
||||
- pc = &bus->drv_pci[0];
|
||||
-
|
||||
bcma_core_pci_extend_L1timer(pc, true);
|
||||
}
|
||||
-EXPORT_SYMBOL_GPL(bcma_core_pci_up);
|
||||
|
||||
-void bcma_core_pci_down(struct bcma_bus *bus)
|
||||
+void bcma_core_pci_down(struct bcma_drv_pci *pc)
|
||||
{
|
||||
- struct bcma_drv_pci *pc;
|
||||
-
|
||||
- if (bus->hosttype != BCMA_HOSTTYPE_PCI)
|
||||
- return;
|
||||
-
|
||||
- pc = &bus->drv_pci[0];
|
||||
-
|
||||
bcma_core_pci_extend_L1timer(pc, false);
|
||||
}
|
||||
-EXPORT_SYMBOL_GPL(bcma_core_pci_down);
|
||||
--- a/drivers/bcma/driver_pci_host.c
|
||||
+++ b/drivers/bcma/driver_pci_host.c
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
#include "bcma_private.h"
|
||||
#include <linux/pci.h>
|
||||
+#include <linux/slab.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/bcma/bcma.h>
|
||||
#include <asm/paccess.h>
|
||||
--- a/drivers/bcma/driver_pcie2.c
|
||||
+++ b/drivers/bcma/driver_pcie2.c
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
#include "bcma_private.h"
|
||||
#include <linux/bcma/bcma.h>
|
||||
+#include <linux/pci.h>
|
||||
|
||||
/**************************************************
|
||||
* R/W ops.
|
||||
@@ -156,14 +157,23 @@ static void pciedev_reg_pm_clk_period(st
|
||||
|
||||
void bcma_core_pcie2_init(struct bcma_drv_pcie2 *pcie2)
|
||||
{
|
||||
- struct bcma_chipinfo *ci = &pcie2->core->bus->chipinfo;
|
||||
+ struct bcma_bus *bus = pcie2->core->bus;
|
||||
+ struct bcma_chipinfo *ci = &bus->chipinfo;
|
||||
u32 tmp;
|
||||
|
||||
tmp = pcie2_read32(pcie2, BCMA_CORE_PCIE2_SPROM(54));
|
||||
if ((tmp & 0xe) >> 1 == 2)
|
||||
bcma_core_pcie2_cfg_write(pcie2, 0x4e0, 0x17);
|
||||
|
||||
- /* TODO: Do we need pcie_reqsize? */
|
||||
+ switch (bus->chipinfo.id) {
|
||||
+ case BCMA_CHIP_ID_BCM4360:
|
||||
+ case BCMA_CHIP_ID_BCM4352:
|
||||
+ pcie2->reqsize = 1024;
|
||||
+ break;
|
||||
+ default:
|
||||
+ pcie2->reqsize = 128;
|
||||
+ break;
|
||||
+ }
|
||||
|
||||
if (ci->id == BCMA_CHIP_ID_BCM4360 && ci->rev > 3)
|
||||
bcma_core_pcie2_war_delay_perst_enab(pcie2, true);
|
||||
@@ -173,3 +183,18 @@ void bcma_core_pcie2_init(struct bcma_dr
|
||||
pciedev_crwlpciegen2_180(pcie2);
|
||||
pciedev_crwlpciegen2_182(pcie2);
|
||||
}
|
||||
+
|
||||
+/**************************************************
|
||||
+ * Runtime ops.
|
||||
+ **************************************************/
|
||||
+
|
||||
+void bcma_core_pcie2_up(struct bcma_drv_pcie2 *pcie2)
|
||||
+{
|
||||
+ struct bcma_bus *bus = pcie2->core->bus;
|
||||
+ struct pci_dev *dev = bus->host_pci;
|
||||
+ int err;
|
||||
+
|
||||
+ err = pcie_set_readrq(dev, pcie2->reqsize);
|
||||
+ if (err)
|
||||
+ bcma_err(bus, "Error setting PCI_EXP_DEVCTL_READRQ: %d\n", err);
|
||||
+}
|
||||
--- a/drivers/bcma/host_pci.c
|
||||
+++ b/drivers/bcma/host_pci.c
|
||||
@@ -213,16 +213,26 @@ static int bcma_host_pci_probe(struct pc
|
||||
/* Initialize struct, detect chip */
|
||||
bcma_init_bus(bus);
|
||||
|
||||
+ /* Scan bus to find out generation of PCIe core */
|
||||
+ err = bcma_bus_scan(bus);
|
||||
+ if (err)
|
||||
+ goto err_pci_unmap_mmio;
|
||||
+
|
||||
+ if (bcma_find_core(bus, BCMA_CORE_PCIE2))
|
||||
+ bus->host_is_pcie2 = true;
|
||||
+
|
||||
/* Register */
|
||||
err = bcma_bus_register(bus);
|
||||
if (err)
|
||||
- goto err_pci_unmap_mmio;
|
||||
+ goto err_unregister_cores;
|
||||
|
||||
pci_set_drvdata(dev, bus);
|
||||
|
||||
out:
|
||||
return err;
|
||||
|
||||
+err_unregister_cores:
|
||||
+ bcma_unregister_cores(bus);
|
||||
err_pci_unmap_mmio:
|
||||
pci_iounmap(dev, bus->mmio);
|
||||
err_pci_release_regions:
|
||||
@@ -283,9 +293,12 @@ static const struct pci_device_id bcma_p
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4357) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4358) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4359) },
|
||||
+ { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4360) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4365) },
|
||||
+ { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a0) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a9) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43aa) },
|
||||
+ { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43b1) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4727) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 43227) }, /* 0xa8db, BCM43217 (sic!) */
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 43228) }, /* 0xa8dc */
|
||||
@@ -310,3 +323,65 @@ void __exit bcma_host_pci_exit(void)
|
||||
{
|
||||
pci_unregister_driver(&bcma_pci_bridge_driver);
|
||||
}
|
||||
+
|
||||
+/**************************************************
|
||||
+ * Runtime ops for drivers.
|
||||
+ **************************************************/
|
||||
+
|
||||
+/* See also pcicore_up */
|
||||
+void bcma_host_pci_up(struct bcma_bus *bus)
|
||||
+{
|
||||
+ if (bus->hosttype != BCMA_HOSTTYPE_PCI)
|
||||
+ return;
|
||||
+
|
||||
+ if (bus->host_is_pcie2)
|
||||
+ bcma_core_pcie2_up(&bus->drv_pcie2);
|
||||
+ else
|
||||
+ bcma_core_pci_up(&bus->drv_pci[0]);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(bcma_host_pci_up);
|
||||
+
|
||||
+/* See also pcicore_down */
|
||||
+void bcma_host_pci_down(struct bcma_bus *bus)
|
||||
+{
|
||||
+ if (bus->hosttype != BCMA_HOSTTYPE_PCI)
|
||||
+ return;
|
||||
+
|
||||
+ if (!bus->host_is_pcie2)
|
||||
+ bcma_core_pci_down(&bus->drv_pci[0]);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(bcma_host_pci_down);
|
||||
+
|
||||
+/* See also si_pci_setup */
|
||||
+int bcma_host_pci_irq_ctl(struct bcma_bus *bus, struct bcma_device *core,
|
||||
+ bool enable)
|
||||
+{
|
||||
+ struct pci_dev *pdev;
|
||||
+ u32 coremask, tmp;
|
||||
+ int err = 0;
|
||||
+
|
||||
+ if (bus->hosttype != BCMA_HOSTTYPE_PCI) {
|
||||
+ /* This bcma device is not on a PCI host-bus. So the IRQs are
|
||||
+ * not routed through the PCI core.
|
||||
+ * So we must not enable routing through the PCI core. */
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ pdev = bus->host_pci;
|
||||
+
|
||||
+ err = pci_read_config_dword(pdev, BCMA_PCI_IRQMASK, &tmp);
|
||||
+ if (err)
|
||||
+ goto out;
|
||||
+
|
||||
+ coremask = BIT(core->core_index) << 8;
|
||||
+ if (enable)
|
||||
+ tmp |= coremask;
|
||||
+ else
|
||||
+ tmp &= ~coremask;
|
||||
+
|
||||
+ err = pci_write_config_dword(pdev, BCMA_PCI_IRQMASK, tmp);
|
||||
+
|
||||
+out:
|
||||
+ return err;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(bcma_host_pci_irq_ctl);
|
||||
--- a/drivers/bcma/main.c
|
||||
+++ b/drivers/bcma/main.c
|
||||
@@ -363,7 +363,7 @@ static int bcma_register_devices(struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static void bcma_unregister_cores(struct bcma_bus *bus)
|
||||
+void bcma_unregister_cores(struct bcma_bus *bus)
|
||||
{
|
||||
struct bcma_device *core, *tmp;
|
||||
|
||||
--- a/drivers/net/wireless/b43/main.c
|
||||
+++ b/drivers/net/wireless/b43/main.c
|
||||
@@ -4819,7 +4819,7 @@ static void b43_wireless_core_exit(struc
|
||||
switch (dev->dev->bus_type) {
|
||||
#ifdef CONFIG_B43_BCMA
|
||||
case B43_BUS_BCMA:
|
||||
- bcma_core_pci_down(dev->dev->bdev->bus);
|
||||
+ bcma_host_pci_down(dev->dev->bdev->bus);
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_B43_SSB
|
||||
@@ -4866,9 +4866,9 @@ static int b43_wireless_core_init(struct
|
||||
switch (dev->dev->bus_type) {
|
||||
#ifdef CONFIG_B43_BCMA
|
||||
case B43_BUS_BCMA:
|
||||
- bcma_core_pci_irq_ctl(&dev->dev->bdev->bus->drv_pci[0],
|
||||
+ bcma_host_pci_irq_ctl(dev->dev->bdev->bus,
|
||||
dev->dev->bdev, true);
|
||||
- bcma_core_pci_up(dev->dev->bdev->bus);
|
||||
+ bcma_host_pci_up(dev->dev->bdev->bus);
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_B43_SSB
|
||||
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
|
||||
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
|
||||
@@ -4668,7 +4668,7 @@ static int brcms_b_attach(struct brcms_c
|
||||
brcms_c_coredisable(wlc_hw);
|
||||
|
||||
/* Match driver "down" state */
|
||||
- bcma_core_pci_down(wlc_hw->d11core->bus);
|
||||
+ bcma_host_pci_down(wlc_hw->d11core->bus);
|
||||
|
||||
/* turn off pll and xtal to match driver "down" state */
|
||||
brcms_b_xtal(wlc_hw, OFF);
|
||||
@@ -4959,7 +4959,7 @@ static int brcms_b_up_prep(struct brcms_
|
||||
* Configure pci/pcmcia here instead of in brcms_c_attach()
|
||||
* to allow mfg hotswap: down, hotswap (chip power cycle), up.
|
||||
*/
|
||||
- bcma_core_pci_irq_ctl(&wlc_hw->d11core->bus->drv_pci[0], wlc_hw->d11core,
|
||||
+ bcma_host_pci_irq_ctl(wlc_hw->d11core->bus, wlc_hw->d11core,
|
||||
true);
|
||||
|
||||
/*
|
||||
@@ -4969,12 +4969,12 @@ static int brcms_b_up_prep(struct brcms_
|
||||
*/
|
||||
if (brcms_b_radio_read_hwdisabled(wlc_hw)) {
|
||||
/* put SB PCI in down state again */
|
||||
- bcma_core_pci_down(wlc_hw->d11core->bus);
|
||||
+ bcma_host_pci_down(wlc_hw->d11core->bus);
|
||||
brcms_b_xtal(wlc_hw, OFF);
|
||||
return -ENOMEDIUM;
|
||||
}
|
||||
|
||||
- bcma_core_pci_up(wlc_hw->d11core->bus);
|
||||
+ bcma_host_pci_up(wlc_hw->d11core->bus);
|
||||
|
||||
/* reset the d11 core */
|
||||
brcms_b_corereset(wlc_hw, BRCMS_USE_COREFLAGS);
|
||||
@@ -5171,7 +5171,7 @@ static int brcms_b_down_finish(struct br
|
||||
|
||||
/* turn off primary xtal and pll */
|
||||
if (!wlc_hw->noreset) {
|
||||
- bcma_core_pci_down(wlc_hw->d11core->bus);
|
||||
+ bcma_host_pci_down(wlc_hw->d11core->bus);
|
||||
brcms_b_xtal(wlc_hw, OFF);
|
||||
}
|
||||
}
|
||||
--- a/include/linux/bcma/bcma.h
|
||||
+++ b/include/linux/bcma/bcma.h
|
||||
@@ -434,6 +434,27 @@ static inline struct bcma_device *bcma_f
|
||||
return bcma_find_core_unit(bus, coreid, 0);
|
||||
}
|
||||
|
||||
+#ifdef CONFIG_BCMA_HOST_PCI
|
||||
+extern void bcma_host_pci_up(struct bcma_bus *bus);
|
||||
+extern void bcma_host_pci_down(struct bcma_bus *bus);
|
||||
+extern int bcma_host_pci_irq_ctl(struct bcma_bus *bus,
|
||||
+ struct bcma_device *core, bool enable);
|
||||
+#else
|
||||
+static inline void bcma_host_pci_up(struct bcma_bus *bus)
|
||||
+{
|
||||
+}
|
||||
+static inline void bcma_host_pci_down(struct bcma_bus *bus)
|
||||
+{
|
||||
+}
|
||||
+static inline int bcma_host_pci_irq_ctl(struct bcma_bus *bus,
|
||||
+ struct bcma_device *core, bool enable)
|
||||
+{
|
||||
+ if (bus->hosttype == BCMA_HOSTTYPE_PCI)
|
||||
+ return -ENOTSUPP;
|
||||
+ return 0;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
extern bool bcma_core_is_enabled(struct bcma_device *core);
|
||||
extern void bcma_core_disable(struct bcma_device *core, u32 flags);
|
||||
extern int bcma_core_enable(struct bcma_device *core, u32 flags);
|
||||
--- a/include/linux/bcma/bcma_driver_pci.h
|
||||
+++ b/include/linux/bcma/bcma_driver_pci.h
|
||||
@@ -238,13 +238,13 @@ struct bcma_drv_pci {
|
||||
#define pcicore_write16(pc, offset, val) bcma_write16((pc)->core, offset, val)
|
||||
#define pcicore_write32(pc, offset, val) bcma_write32((pc)->core, offset, val)
|
||||
|
||||
-extern void bcma_core_pci_early_init(struct bcma_drv_pci *pc);
|
||||
-extern void bcma_core_pci_init(struct bcma_drv_pci *pc);
|
||||
-extern int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc,
|
||||
- struct bcma_device *core, bool enable);
|
||||
-extern void bcma_core_pci_up(struct bcma_bus *bus);
|
||||
-extern void bcma_core_pci_down(struct bcma_bus *bus);
|
||||
+#ifdef CONFIG_BCMA_DRIVER_PCI
|
||||
extern void bcma_core_pci_power_save(struct bcma_bus *bus, bool up);
|
||||
+#else
|
||||
+static inline void bcma_core_pci_power_save(struct bcma_bus *bus, bool up)
|
||||
+{
|
||||
+}
|
||||
+#endif
|
||||
|
||||
extern int bcma_core_pci_pcibios_map_irq(const struct pci_dev *dev);
|
||||
extern int bcma_core_pci_plat_dev_init(struct pci_dev *dev);
|
||||
--- a/include/linux/bcma/bcma_driver_pcie2.h
|
||||
+++ b/include/linux/bcma/bcma_driver_pcie2.h
|
||||
@@ -143,6 +143,8 @@
|
||||
|
||||
struct bcma_drv_pcie2 {
|
||||
struct bcma_device *core;
|
||||
+
|
||||
+ u16 reqsize;
|
||||
};
|
||||
|
||||
#define pcie2_read16(pcie2, offset) bcma_read16((pcie2)->core, offset)
|
||||
@@ -153,6 +155,4 @@ struct bcma_drv_pcie2 {
|
||||
#define pcie2_set32(pcie2, offset, set) bcma_set32((pcie2)->core, offset, set)
|
||||
#define pcie2_mask32(pcie2, offset, mask) bcma_mask32((pcie2)->core, offset, mask)
|
||||
|
||||
-void bcma_core_pcie2_init(struct bcma_drv_pcie2 *pcie2);
|
||||
-
|
||||
#endif /* LINUX_BCMA_DRIVER_PCIE2_H_ */
|
||||
--- a/drivers/bcma/Kconfig
|
||||
+++ b/drivers/bcma/Kconfig
|
||||
@@ -26,6 +26,7 @@ config BCMA_HOST_PCI_POSSIBLE
|
||||
config BCMA_HOST_PCI
|
||||
bool "Support for BCMA on PCI-host bus"
|
||||
depends on BCMA_HOST_PCI_POSSIBLE
|
||||
+ select BCMA_DRIVER_PCI
|
||||
default y
|
||||
|
||||
config BCMA_DRIVER_PCI_HOSTMODE
|
||||
@@ -44,6 +45,22 @@ config BCMA_HOST_SOC
|
||||
|
||||
If unsure, say N
|
||||
|
||||
+config BCMA_DRIVER_PCI
|
||||
+ bool "BCMA Broadcom PCI core driver"
|
||||
+ depends on BCMA && PCI
|
||||
+ default y
|
||||
+ help
|
||||
+ BCMA bus may have many versions of PCIe core. This driver
|
||||
+ supports:
|
||||
+ 1) PCIe core working in clientmode
|
||||
+ 2) PCIe Gen 2 clientmode core
|
||||
+
|
||||
+ In general PCIe (Gen 2) clientmode core is required on PCIe
|
||||
+ hosted buses. It's responsible for initialization and basic
|
||||
+ hardware management.
|
||||
+ This driver is also prerequisite for a hostmode PCIe core
|
||||
+ support.
|
||||
+
|
||||
config BCMA_DRIVER_MIPS
|
||||
bool "BCMA Broadcom MIPS core driver"
|
||||
depends on BCMA && MIPS
|
||||
--- a/drivers/bcma/Makefile
|
||||
+++ b/drivers/bcma/Makefile
|
||||
@@ -3,8 +3,8 @@ bcma-y += driver_chipcommon.o driver
|
||||
bcma-y += driver_chipcommon_b.o
|
||||
bcma-$(CONFIG_BCMA_SFLASH) += driver_chipcommon_sflash.o
|
||||
bcma-$(CONFIG_BCMA_NFLASH) += driver_chipcommon_nflash.o
|
||||
-bcma-y += driver_pci.o
|
||||
-bcma-y += driver_pcie2.o
|
||||
+bcma-$(CONFIG_BCMA_DRIVER_PCI) += driver_pci.o
|
||||
+bcma-$(CONFIG_BCMA_DRIVER_PCI) += driver_pcie2.o
|
||||
bcma-$(CONFIG_BCMA_DRIVER_PCI_HOSTMODE) += driver_pci_host.o
|
||||
bcma-$(CONFIG_BCMA_DRIVER_MIPS) += driver_mips.o
|
||||
bcma-$(CONFIG_BCMA_DRIVER_GMAC_CMN) += driver_gmac_cmn.o
|
||||
--- a/include/linux/bcma/bcma_driver_chipcommon.h
|
||||
+++ b/include/linux/bcma/bcma_driver_chipcommon.h
|
||||
@@ -663,14 +663,6 @@ struct bcma_drv_cc_b {
|
||||
#define bcma_cc_maskset32(cc, offset, mask, set) \
|
||||
bcma_cc_write32(cc, offset, (bcma_cc_read32(cc, offset) & (mask)) | (set))
|
||||
|
||||
-extern void bcma_core_chipcommon_init(struct bcma_drv_cc *cc);
|
||||
-extern void bcma_core_chipcommon_early_init(struct bcma_drv_cc *cc);
|
||||
-
|
||||
-extern void bcma_chipco_suspend(struct bcma_drv_cc *cc);
|
||||
-extern void bcma_chipco_resume(struct bcma_drv_cc *cc);
|
||||
-
|
||||
-void bcma_chipco_bcm4331_ext_pa_lines_ctl(struct bcma_drv_cc *cc, bool enable);
|
||||
-
|
||||
extern u32 bcma_chipco_watchdog_timer_set(struct bcma_drv_cc *cc, u32 ticks);
|
||||
|
||||
extern u32 bcma_chipco_get_alp_clock(struct bcma_drv_cc *cc);
|
||||
@@ -690,9 +682,6 @@ u32 bcma_chipco_gpio_pullup(struct bcma_
|
||||
u32 bcma_chipco_gpio_pulldown(struct bcma_drv_cc *cc, u32 mask, u32 value);
|
||||
|
||||
/* PMU support */
|
||||
-extern void bcma_pmu_init(struct bcma_drv_cc *cc);
|
||||
-extern void bcma_pmu_early_init(struct bcma_drv_cc *cc);
|
||||
-
|
||||
extern void bcma_chipco_pll_write(struct bcma_drv_cc *cc, u32 offset,
|
||||
u32 value);
|
||||
extern void bcma_chipco_pll_maskset(struct bcma_drv_cc *cc, u32 offset,
|
||||
--- a/include/linux/bcma/bcma_driver_gmac_cmn.h
|
||||
+++ b/include/linux/bcma/bcma_driver_gmac_cmn.h
|
||||
@@ -91,10 +91,4 @@ struct bcma_drv_gmac_cmn {
|
||||
#define gmac_cmn_write16(gc, offset, val) bcma_write16((gc)->core, offset, val)
|
||||
#define gmac_cmn_write32(gc, offset, val) bcma_write32((gc)->core, offset, val)
|
||||
|
||||
-#ifdef CONFIG_BCMA_DRIVER_GMAC_CMN
|
||||
-extern void bcma_core_gmac_cmn_init(struct bcma_drv_gmac_cmn *gc);
|
||||
-#else
|
||||
-static inline void bcma_core_gmac_cmn_init(struct bcma_drv_gmac_cmn *gc) { }
|
||||
-#endif
|
||||
-
|
||||
#endif /* LINUX_BCMA_DRIVER_GMAC_CMN_H_ */
|
||||
--- a/include/linux/bcma/bcma_driver_mips.h
|
||||
+++ b/include/linux/bcma/bcma_driver_mips.h
|
||||
@@ -39,21 +39,6 @@ struct bcma_drv_mips {
|
||||
u8 early_setup_done:1;
|
||||
};
|
||||
|
||||
-#ifdef CONFIG_BCMA_DRIVER_MIPS
|
||||
-extern void bcma_core_mips_init(struct bcma_drv_mips *mcore);
|
||||
-extern void bcma_core_mips_early_init(struct bcma_drv_mips *mcore);
|
||||
-
|
||||
-extern unsigned int bcma_core_mips_irq(struct bcma_device *dev);
|
||||
-#else
|
||||
-static inline void bcma_core_mips_init(struct bcma_drv_mips *mcore) { }
|
||||
-static inline void bcma_core_mips_early_init(struct bcma_drv_mips *mcore) { }
|
||||
-
|
||||
-static inline unsigned int bcma_core_mips_irq(struct bcma_device *dev)
|
||||
-{
|
||||
- return 0;
|
||||
-}
|
||||
-#endif
|
||||
-
|
||||
extern u32 bcma_cpu_clock(struct bcma_drv_mips *mcore);
|
||||
|
||||
#endif /* LINUX_BCMA_DRIVER_MIPS_H_ */
|
||||
@@ -1,32 +0,0 @@
|
||||
--- a/include/linux/ssb/ssb.h
|
||||
+++ b/include/linux/ssb/ssb.h
|
||||
@@ -29,10 +29,13 @@ struct ssb_sprom {
|
||||
u8 il0mac[6] __aligned(sizeof(u16)); /* MAC address for 802.11b/g */
|
||||
u8 et0mac[6] __aligned(sizeof(u16)); /* MAC address for Ethernet */
|
||||
u8 et1mac[6] __aligned(sizeof(u16)); /* MAC address for 802.11a */
|
||||
+ u8 et2mac[6] __aligned(sizeof(u16)); /* MAC address for extra Ethernet */
|
||||
u8 et0phyaddr; /* MII address for enet0 */
|
||||
u8 et1phyaddr; /* MII address for enet1 */
|
||||
+ u8 et2phyaddr; /* MII address for enet2 */
|
||||
u8 et0mdcport; /* MDIO for enet0 */
|
||||
u8 et1mdcport; /* MDIO for enet1 */
|
||||
+ u8 et2mdcport; /* MDIO for enet2 */
|
||||
u16 dev_id; /* Device ID overriding e.g. PCI ID */
|
||||
u16 board_rev; /* Board revision number from SPROM. */
|
||||
u16 board_num; /* Board number from SPROM. */
|
||||
@@ -88,11 +91,14 @@ struct ssb_sprom {
|
||||
u32 ofdm5glpo; /* 5.2GHz OFDM power offset */
|
||||
u32 ofdm5gpo; /* 5.3GHz OFDM power offset */
|
||||
u32 ofdm5ghpo; /* 5.8GHz OFDM power offset */
|
||||
+ u32 boardflags;
|
||||
+ u32 boardflags2;
|
||||
+ u32 boardflags3;
|
||||
+ /* TODO: Switch all drivers to new u32 fields and drop below ones */
|
||||
u16 boardflags_lo; /* Board flags (bits 0-15) */
|
||||
u16 boardflags_hi; /* Board flags (bits 16-31) */
|
||||
u16 boardflags2_lo; /* Board flags (bits 32-47) */
|
||||
u16 boardflags2_hi; /* Board flags (bits 48-63) */
|
||||
- /* TODO store board flags in a single u64 */
|
||||
|
||||
struct ssb_sprom_core_pwr_info core_pwr_info[4];
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
--- a/drivers/bcma/driver_gpio.c
|
||||
+++ b/drivers/bcma/driver_gpio.c
|
||||
@@ -226,6 +226,7 @@ int bcma_gpio_init(struct bcma_drv_cc *c
|
||||
chip->of_node = cc->core->dev.of_node;
|
||||
#endif
|
||||
switch (bus->chipinfo.id) {
|
||||
+ case BCMA_CHIP_ID_BCM4707:
|
||||
case BCMA_CHIP_ID_BCM5357:
|
||||
case BCMA_CHIP_ID_BCM53572:
|
||||
chip->ngpio = 32;
|
||||
@@ -235,16 +236,17 @@ int bcma_gpio_init(struct bcma_drv_cc *c
|
||||
}
|
||||
|
||||
/*
|
||||
- * On MIPS we register GPIO devices (LEDs, buttons) using absolute GPIO
|
||||
- * pin numbers. We don't have Device Tree there and we can't really use
|
||||
- * relative (per chip) numbers.
|
||||
- * So let's use predictable base for BCM47XX and "random" for all other.
|
||||
+ * Register SoC GPIO devices with absolute GPIO pin base.
|
||||
+ * On MIPS, we don't have Device Tree and we can't use relative (per chip)
|
||||
+ * GPIO numbers.
|
||||
+ * On some ARM devices, user space may want to access some system GPIO
|
||||
+ * pins directly, which is easier to do with a predictable GPIO base.
|
||||
*/
|
||||
-#if IS_BUILTIN(CONFIG_BCM47XX)
|
||||
- chip->base = bus->num * BCMA_GPIO_MAX_PINS;
|
||||
-#else
|
||||
- chip->base = -1;
|
||||
-#endif
|
||||
+ if (IS_BUILTIN(CONFIG_BCM47XX) ||
|
||||
+ cc->core->bus->hosttype == BCMA_HOSTTYPE_SOC)
|
||||
+ chip->base = bus->num * BCMA_GPIO_MAX_PINS;
|
||||
+ else
|
||||
+ chip->base = -1;
|
||||
|
||||
err = bcma_gpio_irq_domain_init(cc);
|
||||
if (err)
|
||||
--- a/drivers/bcma/Kconfig
|
||||
+++ b/drivers/bcma/Kconfig
|
||||
@@ -29,12 +29,6 @@ config BCMA_HOST_PCI
|
||||
select BCMA_DRIVER_PCI
|
||||
default y
|
||||
|
||||
-config BCMA_DRIVER_PCI_HOSTMODE
|
||||
- bool "Driver for PCI core working in hostmode"
|
||||
- depends on BCMA && MIPS && BCMA_HOST_PCI
|
||||
- help
|
||||
- PCI core hostmode operation (external PCI bus).
|
||||
-
|
||||
config BCMA_HOST_SOC
|
||||
bool "Support for BCMA in a SoC"
|
||||
depends on BCMA
|
||||
@@ -61,6 +55,12 @@ config BCMA_DRIVER_PCI
|
||||
This driver is also prerequisite for a hostmode PCIe core
|
||||
support.
|
||||
|
||||
+config BCMA_DRIVER_PCI_HOSTMODE
|
||||
+ bool "Driver for PCI core working in hostmode"
|
||||
+ depends on BCMA && MIPS && BCMA_DRIVER_PCI
|
||||
+ help
|
||||
+ PCI core hostmode operation (external PCI bus).
|
||||
+
|
||||
config BCMA_DRIVER_MIPS
|
||||
bool "BCMA Broadcom MIPS core driver"
|
||||
depends on BCMA && MIPS
|
||||
--- a/include/linux/bcma/bcma_driver_pci.h
|
||||
+++ b/include/linux/bcma/bcma_driver_pci.h
|
||||
@@ -246,7 +246,18 @@ static inline void bcma_core_pci_power_s
|
||||
}
|
||||
#endif
|
||||
|
||||
+#ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE
|
||||
extern int bcma_core_pci_pcibios_map_irq(const struct pci_dev *dev);
|
||||
extern int bcma_core_pci_plat_dev_init(struct pci_dev *dev);
|
||||
+#else
|
||||
+static inline int bcma_core_pci_pcibios_map_irq(const struct pci_dev *dev)
|
||||
+{
|
||||
+ return -ENOTSUPP;
|
||||
+}
|
||||
+static inline int bcma_core_pci_plat_dev_init(struct pci_dev *dev)
|
||||
+{
|
||||
+ return -ENOTSUPP;
|
||||
+}
|
||||
+#endif
|
||||
|
||||
#endif /* LINUX_BCMA_DRIVER_PCI_H_ */
|
||||
@@ -1,509 +0,0 @@
|
||||
Subject: netfilter: conntrack: cache route for forwarded connections
|
||||
|
||||
... to avoid per-packet FIB lookup if possible.
|
||||
|
||||
The cached dst is re-used provided the input interface
|
||||
is the same as that of the previous packet in the same direction.
|
||||
|
||||
If not, the cached dst is invalidated.
|
||||
|
||||
For ipv6 we also need to store sernum, else dst_check doesn't work,
|
||||
pointed out by Eric Dumazet.
|
||||
|
||||
This should speed up forwarding when conntrack is already in use
|
||||
anyway, especially when using reverse path filtering -- active RPF
|
||||
enforces two FIB lookups for each packet.
|
||||
|
||||
Before the routing cache removal this didn't matter since RPF was performed
|
||||
only when route cache didn't yield a result; but without route cache it
|
||||
comes at higher price.
|
||||
|
||||
Julian Anastasov suggested to add NETDEV_UNREGISTER handler to
|
||||
avoid holding on to dsts of 'frozen' conntracks.
|
||||
|
||||
Signed-off-by: Florian Westphal <fw@strlen.de>
|
||||
|
||||
--- a/include/net/netfilter/nf_conntrack_extend.h
|
||||
+++ b/include/net/netfilter/nf_conntrack_extend.h
|
||||
@@ -30,6 +30,9 @@ enum nf_ct_ext_id {
|
||||
#if IS_ENABLED(CONFIG_NETFILTER_SYNPROXY)
|
||||
NF_CT_EXT_SYNPROXY,
|
||||
#endif
|
||||
+#if IS_ENABLED(CONFIG_NF_CONNTRACK_RTCACHE)
|
||||
+ NF_CT_EXT_RTCACHE,
|
||||
+#endif
|
||||
NF_CT_EXT_NUM,
|
||||
};
|
||||
|
||||
@@ -43,6 +46,7 @@ enum nf_ct_ext_id {
|
||||
#define NF_CT_EXT_TIMEOUT_TYPE struct nf_conn_timeout
|
||||
#define NF_CT_EXT_LABELS_TYPE struct nf_conn_labels
|
||||
#define NF_CT_EXT_SYNPROXY_TYPE struct nf_conn_synproxy
|
||||
+#define NF_CT_EXT_RTCACHE_TYPE struct nf_conn_rtcache
|
||||
|
||||
/* Extensions: optional stuff which isn't permanently in struct. */
|
||||
struct nf_ct_ext {
|
||||
--- /dev/null
|
||||
+++ b/include/net/netfilter/nf_conntrack_rtcache.h
|
||||
@@ -0,0 +1,34 @@
|
||||
+#include <linux/gfp.h>
|
||||
+#include <net/netfilter/nf_conntrack.h>
|
||||
+#include <net/netfilter/nf_conntrack_extend.h>
|
||||
+
|
||||
+struct dst_entry;
|
||||
+
|
||||
+struct nf_conn_dst_cache {
|
||||
+ struct dst_entry *dst;
|
||||
+ int iif;
|
||||
+#if IS_ENABLED(CONFIG_NF_CONNTRACK_IPV6)
|
||||
+ u32 cookie;
|
||||
+#endif
|
||||
+
|
||||
+};
|
||||
+
|
||||
+struct nf_conn_rtcache {
|
||||
+ struct nf_conn_dst_cache cached_dst[IP_CT_DIR_MAX];
|
||||
+};
|
||||
+
|
||||
+static inline
|
||||
+struct nf_conn_rtcache *nf_ct_rtcache_find(const struct nf_conn *ct)
|
||||
+{
|
||||
+#if IS_ENABLED(CONFIG_NF_CONNTRACK_RTCACHE)
|
||||
+ return nf_ct_ext_find(ct, NF_CT_EXT_RTCACHE);
|
||||
+#else
|
||||
+ return NULL;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+static inline int nf_conn_rtcache_iif_get(const struct nf_conn_rtcache *rtc,
|
||||
+ enum ip_conntrack_dir dir)
|
||||
+{
|
||||
+ return rtc->cached_dst[dir].iif;
|
||||
+}
|
||||
--- a/net/netfilter/Kconfig
|
||||
+++ b/net/netfilter/Kconfig
|
||||
@@ -106,6 +106,18 @@ config NF_CONNTRACK_EVENTS
|
||||
|
||||
If unsure, say `N'.
|
||||
|
||||
+config NF_CONNTRACK_RTCACHE
|
||||
+ tristate "Cache route entries in conntrack objects"
|
||||
+ depends on NETFILTER_ADVANCED
|
||||
+ depends on NF_CONNTRACK
|
||||
+ help
|
||||
+ If this option is enabled, the connection tracking code will
|
||||
+ cache routing information for each connection that is being
|
||||
+ forwarded, at a cost of 32 bytes per conntrack object.
|
||||
+
|
||||
+ To compile it as a module, choose M here. If unsure, say N.
|
||||
+ The module will be called nf_conntrack_rtcache.
|
||||
+
|
||||
config NF_CONNTRACK_TIMEOUT
|
||||
bool 'Connection tracking timeout'
|
||||
depends on NETFILTER_ADVANCED
|
||||
--- a/net/netfilter/Makefile
|
||||
+++ b/net/netfilter/Makefile
|
||||
@@ -18,6 +18,9 @@ obj-$(CONFIG_NETFILTER_NETLINK_LOG) += n
|
||||
# connection tracking
|
||||
obj-$(CONFIG_NF_CONNTRACK) += nf_conntrack.o
|
||||
|
||||
+# optional conntrack route cache extension
|
||||
+obj-$(CONFIG_NF_CONNTRACK_RTCACHE) += nf_conntrack_rtcache.o
|
||||
+
|
||||
# SCTP protocol connection tracking
|
||||
obj-$(CONFIG_NF_CT_PROTO_DCCP) += nf_conntrack_proto_dccp.o
|
||||
obj-$(CONFIG_NF_CT_PROTO_GRE) += nf_conntrack_proto_gre.o
|
||||
--- /dev/null
|
||||
+++ b/net/netfilter/nf_conntrack_rtcache.c
|
||||
@@ -0,0 +1,391 @@
|
||||
+/* route cache for netfilter.
|
||||
+ *
|
||||
+ * (C) 2014 Red Hat GmbH
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ */
|
||||
+
|
||||
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
+
|
||||
+#include <linux/types.h>
|
||||
+#include <linux/netfilter.h>
|
||||
+#include <linux/skbuff.h>
|
||||
+#include <linux/stddef.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/netdevice.h>
|
||||
+#include <linux/export.h>
|
||||
+#include <linux/module.h>
|
||||
+
|
||||
+#include <net/dst.h>
|
||||
+
|
||||
+#include <net/netfilter/nf_conntrack.h>
|
||||
+#include <net/netfilter/nf_conntrack_core.h>
|
||||
+#include <net/netfilter/nf_conntrack_extend.h>
|
||||
+#include <net/netfilter/nf_conntrack_rtcache.h>
|
||||
+
|
||||
+#if IS_ENABLED(CONFIG_NF_CONNTRACK_IPV6)
|
||||
+#include <net/ip6_fib.h>
|
||||
+#endif
|
||||
+
|
||||
+static void __nf_conn_rtcache_destroy(struct nf_conn_rtcache *rtc,
|
||||
+ enum ip_conntrack_dir dir)
|
||||
+{
|
||||
+ struct dst_entry *dst = rtc->cached_dst[dir].dst;
|
||||
+
|
||||
+ dst_release(dst);
|
||||
+}
|
||||
+
|
||||
+static void nf_conn_rtcache_destroy(struct nf_conn *ct)
|
||||
+{
|
||||
+ struct nf_conn_rtcache *rtc = nf_ct_rtcache_find(ct);
|
||||
+
|
||||
+ if (!rtc)
|
||||
+ return;
|
||||
+
|
||||
+ __nf_conn_rtcache_destroy(rtc, IP_CT_DIR_ORIGINAL);
|
||||
+ __nf_conn_rtcache_destroy(rtc, IP_CT_DIR_REPLY);
|
||||
+}
|
||||
+
|
||||
+static void nf_ct_rtcache_ext_add(struct nf_conn *ct)
|
||||
+{
|
||||
+ struct nf_conn_rtcache *rtc;
|
||||
+
|
||||
+ rtc = nf_ct_ext_add(ct, NF_CT_EXT_RTCACHE, GFP_ATOMIC);
|
||||
+ if (rtc) {
|
||||
+ rtc->cached_dst[IP_CT_DIR_ORIGINAL].iif = -1;
|
||||
+ rtc->cached_dst[IP_CT_DIR_ORIGINAL].dst = NULL;
|
||||
+ rtc->cached_dst[IP_CT_DIR_REPLY].iif = -1;
|
||||
+ rtc->cached_dst[IP_CT_DIR_REPLY].dst = NULL;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static struct nf_conn_rtcache *nf_ct_rtcache_find_usable(struct nf_conn *ct)
|
||||
+{
|
||||
+ if (nf_ct_is_untracked(ct))
|
||||
+ return NULL;
|
||||
+ return nf_ct_rtcache_find(ct);
|
||||
+}
|
||||
+
|
||||
+static struct dst_entry *
|
||||
+nf_conn_rtcache_dst_get(const struct nf_conn_rtcache *rtc,
|
||||
+ enum ip_conntrack_dir dir)
|
||||
+{
|
||||
+ return rtc->cached_dst[dir].dst;
|
||||
+}
|
||||
+
|
||||
+static u32 nf_rtcache_get_cookie(int pf, const struct dst_entry *dst)
|
||||
+{
|
||||
+#if IS_ENABLED(CONFIG_NF_CONNTRACK_IPV6)
|
||||
+ if (pf == NFPROTO_IPV6) {
|
||||
+ const struct rt6_info *rt = (const struct rt6_info *)dst;
|
||||
+
|
||||
+ if (rt->rt6i_node)
|
||||
+ return (u32)rt->rt6i_node->fn_sernum;
|
||||
+ }
|
||||
+#endif
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void nf_conn_rtcache_dst_set(int pf,
|
||||
+ struct nf_conn_rtcache *rtc,
|
||||
+ struct dst_entry *dst,
|
||||
+ enum ip_conntrack_dir dir, int iif)
|
||||
+{
|
||||
+ if (rtc->cached_dst[dir].iif != iif)
|
||||
+ rtc->cached_dst[dir].iif = iif;
|
||||
+
|
||||
+ if (rtc->cached_dst[dir].dst != dst) {
|
||||
+ struct dst_entry *old;
|
||||
+
|
||||
+ dst_hold(dst);
|
||||
+
|
||||
+ old = xchg(&rtc->cached_dst[dir].dst, dst);
|
||||
+ dst_release(old);
|
||||
+
|
||||
+#if IS_ENABLED(CONFIG_NF_CONNTRACK_IPV6)
|
||||
+ if (pf == NFPROTO_IPV6)
|
||||
+ rtc->cached_dst[dir].cookie =
|
||||
+ nf_rtcache_get_cookie(pf, dst);
|
||||
+#endif
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void nf_conn_rtcache_dst_obsolete(struct nf_conn_rtcache *rtc,
|
||||
+ enum ip_conntrack_dir dir)
|
||||
+{
|
||||
+ struct dst_entry *old;
|
||||
+
|
||||
+ pr_debug("Invalidate iif %d for dir %d on cache %p\n",
|
||||
+ rtc->cached_dst[dir].iif, dir, rtc);
|
||||
+
|
||||
+ old = xchg(&rtc->cached_dst[dir].dst, NULL);
|
||||
+ dst_release(old);
|
||||
+ rtc->cached_dst[dir].iif = -1;
|
||||
+}
|
||||
+
|
||||
+static unsigned int nf_rtcache_in(const struct nf_hook_ops *ops,
|
||||
+ struct sk_buff *skb,
|
||||
+ const struct net_device *in,
|
||||
+ const struct net_device *out,
|
||||
+ int (*okfn)(struct sk_buff *))
|
||||
+{
|
||||
+ struct nf_conn_rtcache *rtc;
|
||||
+ enum ip_conntrack_info ctinfo;
|
||||
+ enum ip_conntrack_dir dir;
|
||||
+ struct dst_entry *dst;
|
||||
+ struct nf_conn *ct;
|
||||
+ int iif;
|
||||
+ u32 cookie;
|
||||
+
|
||||
+ if (skb_dst(skb) || skb->sk)
|
||||
+ return NF_ACCEPT;
|
||||
+
|
||||
+ ct = nf_ct_get(skb, &ctinfo);
|
||||
+ if (!ct)
|
||||
+ return NF_ACCEPT;
|
||||
+
|
||||
+ rtc = nf_ct_rtcache_find_usable(ct);
|
||||
+ if (!rtc)
|
||||
+ return NF_ACCEPT;
|
||||
+
|
||||
+ /* if iif changes, don't use cache and let ip stack
|
||||
+ * do route lookup.
|
||||
+ *
|
||||
+ * If rp_filter is enabled it might toss skb, so
|
||||
+ * we don't want to avoid these checks.
|
||||
+ */
|
||||
+ dir = CTINFO2DIR(ctinfo);
|
||||
+ iif = nf_conn_rtcache_iif_get(rtc, dir);
|
||||
+ if (in->ifindex != iif) {
|
||||
+ pr_debug("ct %p, iif %d, cached iif %d, skip cached entry\n",
|
||||
+ ct, iif, in->ifindex);
|
||||
+ return NF_ACCEPT;
|
||||
+ }
|
||||
+ dst = nf_conn_rtcache_dst_get(rtc, dir);
|
||||
+ if (dst == NULL)
|
||||
+ return NF_ACCEPT;
|
||||
+
|
||||
+ cookie = nf_rtcache_get_cookie(ops->pf, dst);
|
||||
+
|
||||
+ dst = dst_check(dst, cookie);
|
||||
+ pr_debug("obtained dst %p for skb %p, cookie %d\n", dst, skb, cookie);
|
||||
+ if (likely(dst))
|
||||
+ skb_dst_set_noref(skb, dst);
|
||||
+ else
|
||||
+ nf_conn_rtcache_dst_obsolete(rtc, dir);
|
||||
+
|
||||
+ return NF_ACCEPT;
|
||||
+}
|
||||
+
|
||||
+static unsigned int nf_rtcache_forward(const struct nf_hook_ops *ops,
|
||||
+ struct sk_buff *skb,
|
||||
+ const struct net_device *in,
|
||||
+ const struct net_device *out,
|
||||
+ int (*okfn)(struct sk_buff *))
|
||||
+{
|
||||
+ struct nf_conn_rtcache *rtc;
|
||||
+ enum ip_conntrack_info ctinfo;
|
||||
+ enum ip_conntrack_dir dir;
|
||||
+ struct nf_conn *ct;
|
||||
+ struct dst_entry *dst = skb_dst(skb);
|
||||
+ int iif;
|
||||
+
|
||||
+ ct = nf_ct_get(skb, &ctinfo);
|
||||
+ if (!ct)
|
||||
+ return NF_ACCEPT;
|
||||
+
|
||||
+ if (dst && dst_xfrm(dst))
|
||||
+ return NF_ACCEPT;
|
||||
+
|
||||
+ if (!nf_ct_is_confirmed(ct)) {
|
||||
+ if (WARN_ON(nf_ct_rtcache_find(ct)))
|
||||
+ return NF_ACCEPT;
|
||||
+ nf_ct_rtcache_ext_add(ct);
|
||||
+ return NF_ACCEPT;
|
||||
+ }
|
||||
+
|
||||
+ rtc = nf_ct_rtcache_find_usable(ct);
|
||||
+ if (!rtc)
|
||||
+ return NF_ACCEPT;
|
||||
+
|
||||
+ dir = CTINFO2DIR(ctinfo);
|
||||
+ iif = nf_conn_rtcache_iif_get(rtc, dir);
|
||||
+ pr_debug("ct %p, skb %p, dir %d, iif %d, cached iif %d\n",
|
||||
+ ct, skb, dir, iif, in->ifindex);
|
||||
+ if (likely(in->ifindex == iif))
|
||||
+ return NF_ACCEPT;
|
||||
+
|
||||
+ nf_conn_rtcache_dst_set(ops->pf, rtc, skb_dst(skb), dir, in->ifindex);
|
||||
+ return NF_ACCEPT;
|
||||
+}
|
||||
+
|
||||
+static int nf_rtcache_dst_remove(struct nf_conn *ct, void *data)
|
||||
+{
|
||||
+ struct nf_conn_rtcache *rtc = nf_ct_rtcache_find(ct);
|
||||
+ struct net_device *dev = data;
|
||||
+
|
||||
+ if (!rtc)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (dev->ifindex == rtc->cached_dst[IP_CT_DIR_ORIGINAL].iif ||
|
||||
+ dev->ifindex == rtc->cached_dst[IP_CT_DIR_REPLY].iif) {
|
||||
+ nf_conn_rtcache_dst_obsolete(rtc, IP_CT_DIR_ORIGINAL);
|
||||
+ nf_conn_rtcache_dst_obsolete(rtc, IP_CT_DIR_REPLY);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int nf_rtcache_netdev_event(struct notifier_block *this,
|
||||
+ unsigned long event, void *ptr)
|
||||
+{
|
||||
+ struct net_device *dev = netdev_notifier_info_to_dev(ptr);
|
||||
+ struct net *net = dev_net(dev);
|
||||
+
|
||||
+ if (event == NETDEV_DOWN)
|
||||
+ nf_ct_iterate_cleanup(net, nf_rtcache_dst_remove, dev, 0, 0);
|
||||
+
|
||||
+ return NOTIFY_DONE;
|
||||
+}
|
||||
+
|
||||
+static struct notifier_block nf_rtcache_notifier = {
|
||||
+ .notifier_call = nf_rtcache_netdev_event,
|
||||
+};
|
||||
+
|
||||
+static struct nf_hook_ops rtcache_ops[] = {
|
||||
+ {
|
||||
+ .hook = nf_rtcache_in,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .pf = NFPROTO_IPV4,
|
||||
+ .hooknum = NF_INET_PRE_ROUTING,
|
||||
+ .priority = NF_IP_PRI_LAST,
|
||||
+ },
|
||||
+ {
|
||||
+ .hook = nf_rtcache_forward,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .pf = NFPROTO_IPV4,
|
||||
+ .hooknum = NF_INET_FORWARD,
|
||||
+ .priority = NF_IP_PRI_LAST,
|
||||
+ },
|
||||
+#if IS_ENABLED(CONFIG_NF_CONNTRACK_IPV6)
|
||||
+ {
|
||||
+ .hook = nf_rtcache_in,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .pf = NFPROTO_IPV6,
|
||||
+ .hooknum = NF_INET_PRE_ROUTING,
|
||||
+ .priority = NF_IP_PRI_LAST,
|
||||
+ },
|
||||
+ {
|
||||
+ .hook = nf_rtcache_forward,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .pf = NFPROTO_IPV6,
|
||||
+ .hooknum = NF_INET_FORWARD,
|
||||
+ .priority = NF_IP_PRI_LAST,
|
||||
+ },
|
||||
+#endif
|
||||
+};
|
||||
+
|
||||
+static struct nf_ct_ext_type rtcache_extend __read_mostly = {
|
||||
+ .len = sizeof(struct nf_conn_rtcache),
|
||||
+ .align = __alignof__(struct nf_conn_rtcache),
|
||||
+ .id = NF_CT_EXT_RTCACHE,
|
||||
+ .destroy = nf_conn_rtcache_destroy,
|
||||
+};
|
||||
+
|
||||
+static int __init nf_conntrack_rtcache_init(void)
|
||||
+{
|
||||
+ int ret = nf_ct_extend_register(&rtcache_extend);
|
||||
+
|
||||
+ if (ret < 0) {
|
||||
+ pr_err("nf_conntrack_rtcache: Unable to register extension\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ ret = nf_register_hooks(rtcache_ops, ARRAY_SIZE(rtcache_ops));
|
||||
+ if (ret < 0) {
|
||||
+ nf_ct_extend_unregister(&rtcache_extend);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ ret = register_netdevice_notifier(&nf_rtcache_notifier);
|
||||
+ if (ret) {
|
||||
+ nf_unregister_hooks(rtcache_ops, ARRAY_SIZE(rtcache_ops));
|
||||
+ nf_ct_extend_unregister(&rtcache_extend);
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int nf_rtcache_ext_remove(struct nf_conn *ct, void *data)
|
||||
+{
|
||||
+ struct nf_conn_rtcache *rtc = nf_ct_rtcache_find(ct);
|
||||
+
|
||||
+ return rtc != NULL;
|
||||
+}
|
||||
+
|
||||
+static bool __exit nf_conntrack_rtcache_wait_for_dying(struct net *net)
|
||||
+{
|
||||
+ bool wait = false;
|
||||
+ int cpu;
|
||||
+
|
||||
+ for_each_possible_cpu(cpu) {
|
||||
+ struct nf_conntrack_tuple_hash *h;
|
||||
+ struct hlist_nulls_node *n;
|
||||
+ struct nf_conn *ct;
|
||||
+ struct ct_pcpu *pcpu = per_cpu_ptr(net->ct.pcpu_lists, cpu);
|
||||
+
|
||||
+ rcu_read_lock();
|
||||
+ spin_lock_bh(&pcpu->lock);
|
||||
+
|
||||
+ hlist_nulls_for_each_entry(h, n, &pcpu->dying, hnnode) {
|
||||
+ ct = nf_ct_tuplehash_to_ctrack(h);
|
||||
+ if (nf_ct_rtcache_find(ct) != NULL) {
|
||||
+ wait = true;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ spin_unlock_bh(&pcpu->lock);
|
||||
+ rcu_read_unlock();
|
||||
+ }
|
||||
+
|
||||
+ return wait;
|
||||
+}
|
||||
+
|
||||
+static void __exit nf_conntrack_rtcache_fini(void)
|
||||
+{
|
||||
+ struct net *net;
|
||||
+ int count = 0;
|
||||
+
|
||||
+ /* remove hooks so no new connections get rtcache extension */
|
||||
+ nf_unregister_hooks(rtcache_ops, ARRAY_SIZE(rtcache_ops));
|
||||
+
|
||||
+ synchronize_net();
|
||||
+
|
||||
+ unregister_netdevice_notifier(&nf_rtcache_notifier);
|
||||
+
|
||||
+ rtnl_lock();
|
||||
+
|
||||
+ /* zap all conntracks with rtcache extension */
|
||||
+ for_each_net(net)
|
||||
+ nf_ct_iterate_cleanup(net, nf_rtcache_ext_remove, NULL, 0, 0);
|
||||
+
|
||||
+ for_each_net(net) {
|
||||
+ /* .. and make sure they're gone from dying list, too */
|
||||
+ while (nf_conntrack_rtcache_wait_for_dying(net)) {
|
||||
+ msleep(200);
|
||||
+ WARN_ONCE(++count > 25, "Waiting for all rtcache conntracks to go away\n");
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ rtnl_unlock();
|
||||
+ synchronize_net();
|
||||
+ nf_ct_extend_unregister(&rtcache_extend);
|
||||
+}
|
||||
+module_init(nf_conntrack_rtcache_init);
|
||||
+module_exit(nf_conntrack_rtcache_fini);
|
||||
+
|
||||
+MODULE_LICENSE("GPL");
|
||||
+MODULE_AUTHOR("Florian Westphal <fw@strlen.de>");
|
||||
+MODULE_DESCRIPTION("Conntrack route cache extension");
|
||||
@@ -1,22 +0,0 @@
|
||||
--- a/arch/mips/boot/compressed/string.c
|
||||
+++ b/arch/mips/boot/compressed/string.c
|
||||
@@ -26,3 +26,19 @@ void *memset(void *s, int c, size_t n)
|
||||
ss[i] = c;
|
||||
return s;
|
||||
}
|
||||
+
|
||||
+void *memmove(void *__dest, __const void *__src, size_t count)
|
||||
+{
|
||||
+ unsigned char *d = __dest;
|
||||
+ const unsigned char *s = __src;
|
||||
+
|
||||
+ if (__dest == __src)
|
||||
+ return __dest;
|
||||
+
|
||||
+ if (__dest < __src)
|
||||
+ return memcpy(__dest, __src, count);
|
||||
+
|
||||
+ while (count--)
|
||||
+ d[count] = s[count];
|
||||
+ return __dest;
|
||||
+}
|
||||
@@ -1,76 +0,0 @@
|
||||
From c25b23b8a387e7d31f7a74af8e37b61e9e6ebb21 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Fri, 20 Mar 2015 23:14:31 +0100
|
||||
Subject: [PATCH] bgmac: register fixed PHY for ARM BCM470X / BCM5301X chipsets
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
On ARM SoCs with bgmac Ethernet hardware we don't have any normal PHY.
|
||||
There is always a switch attached but it's not even controlled over MDIO
|
||||
like in case of MIPS devices.
|
||||
We need a fixed PHY to be able to send/receive packets from the switch.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/ethernet/broadcom/bgmac.c | 34 ++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 34 insertions(+)
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.c
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.c
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/mii.h>
|
||||
#include <linux/phy.h>
|
||||
+#include <linux/phy_fixed.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <bcm47xx_nvram.h>
|
||||
@@ -1330,13 +1331,46 @@ static void bgmac_adjust_link(struct net
|
||||
}
|
||||
}
|
||||
|
||||
+static int bgmac_fixed_phy_register(struct bgmac *bgmac)
|
||||
+{
|
||||
+ struct fixed_phy_status fphy_status = {
|
||||
+ .link = 1,
|
||||
+ .speed = SPEED_1000,
|
||||
+ .duplex = DUPLEX_FULL,
|
||||
+ };
|
||||
+ struct phy_device *phy_dev;
|
||||
+ int err;
|
||||
+
|
||||
+ phy_dev = fixed_phy_register(PHY_POLL, &fphy_status, NULL);
|
||||
+ if (!phy_dev || IS_ERR(phy_dev)) {
|
||||
+ bgmac_err(bgmac, "Failed to register fixed PHY device\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ err = phy_connect_direct(bgmac->net_dev, phy_dev, bgmac_adjust_link,
|
||||
+ PHY_INTERFACE_MODE_MII);
|
||||
+ if (err) {
|
||||
+ bgmac_err(bgmac, "Connecting PHY failed\n");
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ bgmac->phy_dev = phy_dev;
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
static int bgmac_mii_register(struct bgmac *bgmac)
|
||||
{
|
||||
+ struct bcma_chipinfo *ci = &bgmac->core->bus->chipinfo;
|
||||
struct mii_bus *mii_bus;
|
||||
struct phy_device *phy_dev;
|
||||
char bus_id[MII_BUS_ID_SIZE + 3];
|
||||
int i, err = 0;
|
||||
|
||||
+ if (ci->id == BCMA_CHIP_ID_BCM4707 ||
|
||||
+ ci->id == BCMA_CHIP_ID_BCM53018)
|
||||
+ return bgmac_fixed_phy_register(bgmac);
|
||||
+
|
||||
mii_bus = mdiobus_alloc();
|
||||
if (!mii_bus)
|
||||
return -ENOMEM;
|
||||
@@ -1,28 +0,0 @@
|
||||
From fc300dc3733fdc328e6e10c7b8379b60c26cd648 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Fri, 20 Mar 2015 23:14:32 +0100
|
||||
Subject: [PATCH] bgmac: allow enabling on ARCH_BCM_5301X
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Home routers based on ARM SoCs like BCM4708 also have bcma bus with core
|
||||
supported by bgmac.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/ethernet/broadcom/Kconfig | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/Kconfig
|
||||
+++ b/drivers/net/ethernet/broadcom/Kconfig
|
||||
@@ -142,7 +142,7 @@ config BNX2X_SRIOV
|
||||
|
||||
config BGMAC
|
||||
tristate "BCMA bus GBit core support"
|
||||
- depends on BCMA_HOST_SOC && HAS_DMA && BCM47XX
|
||||
+ depends on BCMA_HOST_SOC && HAS_DMA && (BCM47XX || ARCH_BCM_5301X)
|
||||
select PHYLIB
|
||||
---help---
|
||||
This driver supports GBit MAC and BCM4706 GBit MAC cores on BCMA bus.
|
||||
@@ -1,24 +0,0 @@
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
Date: Mon, 23 Mar 2015 02:40:06 +0100
|
||||
Subject: [PATCH] bgmac: fix descriptor frame start/end definitions
|
||||
|
||||
The start-of-frame and end-of-frame bits were accidentally swapped.
|
||||
In the current code it does not make any difference, since they are
|
||||
always used together.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
---
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.h
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.h
|
||||
@@ -345,8 +345,8 @@
|
||||
|
||||
#define BGMAC_DESC_CTL0_EOT 0x10000000 /* End of ring */
|
||||
#define BGMAC_DESC_CTL0_IOC 0x20000000 /* IRQ on complete */
|
||||
-#define BGMAC_DESC_CTL0_SOF 0x40000000 /* Start of frame */
|
||||
-#define BGMAC_DESC_CTL0_EOF 0x80000000 /* End of frame */
|
||||
+#define BGMAC_DESC_CTL0_EOF 0x40000000 /* End of frame */
|
||||
+#define BGMAC_DESC_CTL0_SOF 0x80000000 /* Start of frame */
|
||||
#define BGMAC_DESC_CTL1_LEN 0x00001FFF
|
||||
|
||||
#define BGMAC_PHY_NOREGS 0x1E
|
||||
@@ -1,189 +0,0 @@
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
Date: Mon, 23 Mar 2015 02:41:25 +0100
|
||||
Subject: [PATCH] bgmac: implement GRO and use build_skb
|
||||
|
||||
This improves performance for routing and local rx
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
---
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.c
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.c
|
||||
@@ -276,31 +276,31 @@ static int bgmac_dma_rx_skb_for_slot(str
|
||||
struct bgmac_slot_info *slot)
|
||||
{
|
||||
struct device *dma_dev = bgmac->core->dma_dev;
|
||||
- struct sk_buff *skb;
|
||||
dma_addr_t dma_addr;
|
||||
struct bgmac_rx_header *rx;
|
||||
+ void *buf;
|
||||
|
||||
/* Alloc skb */
|
||||
- skb = netdev_alloc_skb(bgmac->net_dev, BGMAC_RX_BUF_SIZE);
|
||||
- if (!skb)
|
||||
+ buf = netdev_alloc_frag(BGMAC_RX_ALLOC_SIZE);
|
||||
+ if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Poison - if everything goes fine, hardware will overwrite it */
|
||||
- rx = (struct bgmac_rx_header *)skb->data;
|
||||
+ rx = buf;
|
||||
rx->len = cpu_to_le16(0xdead);
|
||||
rx->flags = cpu_to_le16(0xbeef);
|
||||
|
||||
/* Map skb for the DMA */
|
||||
- dma_addr = dma_map_single(dma_dev, skb->data,
|
||||
- BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
|
||||
+ dma_addr = dma_map_single(dma_dev, buf, BGMAC_RX_BUF_SIZE,
|
||||
+ DMA_FROM_DEVICE);
|
||||
if (dma_mapping_error(dma_dev, dma_addr)) {
|
||||
bgmac_err(bgmac, "DMA mapping error\n");
|
||||
- dev_kfree_skb(skb);
|
||||
+ put_page(virt_to_head_page(buf));
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* Update the slot */
|
||||
- slot->skb = skb;
|
||||
+ slot->buf = buf;
|
||||
slot->dma_addr = dma_addr;
|
||||
|
||||
return 0;
|
||||
@@ -343,8 +343,9 @@ static int bgmac_dma_rx_read(struct bgma
|
||||
while (ring->start != ring->end) {
|
||||
struct device *dma_dev = bgmac->core->dma_dev;
|
||||
struct bgmac_slot_info *slot = &ring->slots[ring->start];
|
||||
- struct sk_buff *skb = slot->skb;
|
||||
- struct bgmac_rx_header *rx;
|
||||
+ struct bgmac_rx_header *rx = slot->buf;
|
||||
+ struct sk_buff *skb;
|
||||
+ void *buf = slot->buf;
|
||||
u16 len, flags;
|
||||
|
||||
/* Unmap buffer to make it accessible to the CPU */
|
||||
@@ -352,7 +353,6 @@ static int bgmac_dma_rx_read(struct bgma
|
||||
BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
|
||||
|
||||
/* Get info from the header */
|
||||
- rx = (struct bgmac_rx_header *)skb->data;
|
||||
len = le16_to_cpu(rx->len);
|
||||
flags = le16_to_cpu(rx->flags);
|
||||
|
||||
@@ -393,12 +393,13 @@ static int bgmac_dma_rx_read(struct bgma
|
||||
dma_unmap_single(dma_dev, old_dma_addr,
|
||||
BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
|
||||
|
||||
+ skb = build_skb(buf, BGMAC_RX_ALLOC_SIZE);
|
||||
skb_put(skb, BGMAC_RX_FRAME_OFFSET + len);
|
||||
skb_pull(skb, BGMAC_RX_FRAME_OFFSET);
|
||||
|
||||
skb_checksum_none_assert(skb);
|
||||
skb->protocol = eth_type_trans(skb, bgmac->net_dev);
|
||||
- netif_receive_skb(skb);
|
||||
+ napi_gro_receive(&bgmac->napi, skb);
|
||||
handled++;
|
||||
} while (0);
|
||||
|
||||
@@ -434,12 +435,11 @@ static bool bgmac_dma_unaligned(struct b
|
||||
return false;
|
||||
}
|
||||
|
||||
-static void bgmac_dma_ring_free(struct bgmac *bgmac,
|
||||
- struct bgmac_dma_ring *ring)
|
||||
+static void bgmac_dma_tx_ring_free(struct bgmac *bgmac,
|
||||
+ struct bgmac_dma_ring *ring)
|
||||
{
|
||||
struct device *dma_dev = bgmac->core->dma_dev;
|
||||
struct bgmac_slot_info *slot;
|
||||
- int size;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ring->num_slots; i++) {
|
||||
@@ -451,23 +451,55 @@ static void bgmac_dma_ring_free(struct b
|
||||
dev_kfree_skb(slot->skb);
|
||||
}
|
||||
}
|
||||
+}
|
||||
+
|
||||
+static void bgmac_dma_rx_ring_free(struct bgmac *bgmac,
|
||||
+ struct bgmac_dma_ring *ring)
|
||||
+{
|
||||
+ struct device *dma_dev = bgmac->core->dma_dev;
|
||||
+ struct bgmac_slot_info *slot;
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < ring->num_slots; i++) {
|
||||
+ slot = &ring->slots[i];
|
||||
+ if (!slot->buf)
|
||||
+ continue;
|
||||
|
||||
- if (ring->cpu_base) {
|
||||
- /* Free ring of descriptors */
|
||||
- size = ring->num_slots * sizeof(struct bgmac_dma_desc);
|
||||
- dma_free_coherent(dma_dev, size, ring->cpu_base,
|
||||
- ring->dma_base);
|
||||
+ if (slot->dma_addr)
|
||||
+ dma_unmap_single(dma_dev, slot->dma_addr,
|
||||
+ BGMAC_RX_BUF_SIZE,
|
||||
+ DMA_FROM_DEVICE);
|
||||
+ put_page(virt_to_head_page(slot->buf));
|
||||
}
|
||||
}
|
||||
|
||||
+static void bgmac_dma_ring_desc_free(struct bgmac *bgmac,
|
||||
+ struct bgmac_dma_ring *ring)
|
||||
+{
|
||||
+ struct device *dma_dev = bgmac->core->dma_dev;
|
||||
+ int size;
|
||||
+
|
||||
+ if (!ring->cpu_base)
|
||||
+ return;
|
||||
+
|
||||
+ /* Free ring of descriptors */
|
||||
+ size = ring->num_slots * sizeof(struct bgmac_dma_desc);
|
||||
+ dma_free_coherent(dma_dev, size, ring->cpu_base,
|
||||
+ ring->dma_base);
|
||||
+}
|
||||
+
|
||||
static void bgmac_dma_free(struct bgmac *bgmac)
|
||||
{
|
||||
int i;
|
||||
|
||||
- for (i = 0; i < BGMAC_MAX_TX_RINGS; i++)
|
||||
- bgmac_dma_ring_free(bgmac, &bgmac->tx_ring[i]);
|
||||
- for (i = 0; i < BGMAC_MAX_RX_RINGS; i++)
|
||||
- bgmac_dma_ring_free(bgmac, &bgmac->rx_ring[i]);
|
||||
+ for (i = 0; i < BGMAC_MAX_TX_RINGS; i++) {
|
||||
+ bgmac_dma_tx_ring_free(bgmac, &bgmac->tx_ring[i]);
|
||||
+ bgmac_dma_ring_desc_free(bgmac, &bgmac->tx_ring[i]);
|
||||
+ }
|
||||
+ for (i = 0; i < BGMAC_MAX_RX_RINGS; i++) {
|
||||
+ bgmac_dma_rx_ring_free(bgmac, &bgmac->rx_ring[i]);
|
||||
+ bgmac_dma_ring_desc_free(bgmac, &bgmac->rx_ring[i]);
|
||||
+ }
|
||||
}
|
||||
|
||||
static int bgmac_dma_alloc(struct bgmac *bgmac)
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.h
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.h
|
||||
@@ -362,6 +362,8 @@
|
||||
#define BGMAC_RX_FRAME_OFFSET 30 /* There are 2 unused bytes between header and real data */
|
||||
#define BGMAC_RX_MAX_FRAME_SIZE 1536 /* Copied from b44/tg3 */
|
||||
#define BGMAC_RX_BUF_SIZE (BGMAC_RX_FRAME_OFFSET + BGMAC_RX_MAX_FRAME_SIZE)
|
||||
+#define BGMAC_RX_ALLOC_SIZE (SKB_DATA_ALIGN(BGMAC_RX_BUF_SIZE) + \
|
||||
+ SKB_DATA_ALIGN(sizeof(struct skb_shared_info)))
|
||||
|
||||
#define BGMAC_BFL_ENETROBO 0x0010 /* has ephy roboswitch spi */
|
||||
#define BGMAC_BFL_ENETADM 0x0080 /* has ADMtek switch */
|
||||
@@ -383,7 +385,10 @@
|
||||
#define ETHER_MAX_LEN 1518
|
||||
|
||||
struct bgmac_slot_info {
|
||||
- struct sk_buff *skb;
|
||||
+ union {
|
||||
+ struct sk_buff *skb;
|
||||
+ void *buf;
|
||||
+ };
|
||||
dma_addr_t dma_addr;
|
||||
};
|
||||
|
||||
@@ -1,267 +0,0 @@
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
Date: Mon, 23 Mar 2015 02:42:26 +0100
|
||||
Subject: [PATCH] bgmac: implement scatter/gather support
|
||||
|
||||
Always use software checksumming, since the hardware does not have any
|
||||
checksum offload support.
|
||||
This significantly improves local TCP tx performance.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
---
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.c
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.c
|
||||
@@ -115,53 +115,91 @@ static void bgmac_dma_tx_enable(struct b
|
||||
bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL, ctl);
|
||||
}
|
||||
|
||||
+static void
|
||||
+bgmac_dma_tx_add_buf(struct bgmac *bgmac, struct bgmac_dma_ring *ring,
|
||||
+ int i, int len, u32 ctl0)
|
||||
+{
|
||||
+ struct bgmac_slot_info *slot;
|
||||
+ struct bgmac_dma_desc *dma_desc;
|
||||
+ u32 ctl1;
|
||||
+
|
||||
+ if (i == ring->num_slots - 1)
|
||||
+ ctl0 |= BGMAC_DESC_CTL0_EOT;
|
||||
+
|
||||
+ ctl1 = len & BGMAC_DESC_CTL1_LEN;
|
||||
+
|
||||
+ slot = &ring->slots[i];
|
||||
+ dma_desc = &ring->cpu_base[i];
|
||||
+ dma_desc->addr_low = cpu_to_le32(lower_32_bits(slot->dma_addr));
|
||||
+ dma_desc->addr_high = cpu_to_le32(upper_32_bits(slot->dma_addr));
|
||||
+ dma_desc->ctl0 = cpu_to_le32(ctl0);
|
||||
+ dma_desc->ctl1 = cpu_to_le32(ctl1);
|
||||
+}
|
||||
+
|
||||
static netdev_tx_t bgmac_dma_tx_add(struct bgmac *bgmac,
|
||||
struct bgmac_dma_ring *ring,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct device *dma_dev = bgmac->core->dma_dev;
|
||||
struct net_device *net_dev = bgmac->net_dev;
|
||||
- struct bgmac_dma_desc *dma_desc;
|
||||
- struct bgmac_slot_info *slot;
|
||||
- u32 ctl0, ctl1;
|
||||
+ struct bgmac_slot_info *slot = &ring->slots[ring->end];
|
||||
int free_slots;
|
||||
+ int nr_frags;
|
||||
+ u32 flags;
|
||||
+ int index = ring->end;
|
||||
+ int i;
|
||||
|
||||
if (skb->len > BGMAC_DESC_CTL1_LEN) {
|
||||
bgmac_err(bgmac, "Too long skb (%d)\n", skb->len);
|
||||
- goto err_stop_drop;
|
||||
+ goto err_drop;
|
||||
}
|
||||
|
||||
+ if (skb->ip_summed == CHECKSUM_PARTIAL)
|
||||
+ skb_checksum_help(skb);
|
||||
+
|
||||
+ nr_frags = skb_shinfo(skb)->nr_frags;
|
||||
+
|
||||
if (ring->start <= ring->end)
|
||||
free_slots = ring->start - ring->end + BGMAC_TX_RING_SLOTS;
|
||||
else
|
||||
free_slots = ring->start - ring->end;
|
||||
- if (free_slots == 1) {
|
||||
+
|
||||
+ if (free_slots <= nr_frags + 1) {
|
||||
bgmac_err(bgmac, "TX ring is full, queue should be stopped!\n");
|
||||
netif_stop_queue(net_dev);
|
||||
return NETDEV_TX_BUSY;
|
||||
}
|
||||
|
||||
- slot = &ring->slots[ring->end];
|
||||
- slot->skb = skb;
|
||||
- slot->dma_addr = dma_map_single(dma_dev, skb->data, skb->len,
|
||||
+ slot->dma_addr = dma_map_single(dma_dev, skb->data, skb_headlen(skb),
|
||||
DMA_TO_DEVICE);
|
||||
- if (dma_mapping_error(dma_dev, slot->dma_addr)) {
|
||||
- bgmac_err(bgmac, "Mapping error of skb on ring 0x%X\n",
|
||||
- ring->mmio_base);
|
||||
- goto err_stop_drop;
|
||||
- }
|
||||
+ if (unlikely(dma_mapping_error(dma_dev, slot->dma_addr)))
|
||||
+ goto err_dma_head;
|
||||
|
||||
- ctl0 = BGMAC_DESC_CTL0_IOC | BGMAC_DESC_CTL0_SOF | BGMAC_DESC_CTL0_EOF;
|
||||
- if (ring->end == ring->num_slots - 1)
|
||||
- ctl0 |= BGMAC_DESC_CTL0_EOT;
|
||||
- ctl1 = skb->len & BGMAC_DESC_CTL1_LEN;
|
||||
+ flags = BGMAC_DESC_CTL0_SOF;
|
||||
+ if (!nr_frags)
|
||||
+ flags |= BGMAC_DESC_CTL0_EOF | BGMAC_DESC_CTL0_IOC;
|
||||
+
|
||||
+ bgmac_dma_tx_add_buf(bgmac, ring, index, skb_headlen(skb), flags);
|
||||
+ flags = 0;
|
||||
+
|
||||
+ for (i = 0; i < nr_frags; i++) {
|
||||
+ struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i];
|
||||
+ int len = skb_frag_size(frag);
|
||||
+
|
||||
+ index = (index + 1) % BGMAC_TX_RING_SLOTS;
|
||||
+ slot = &ring->slots[index];
|
||||
+ slot->dma_addr = skb_frag_dma_map(dma_dev, frag, 0,
|
||||
+ len, DMA_TO_DEVICE);
|
||||
+ if (unlikely(dma_mapping_error(dma_dev, slot->dma_addr)))
|
||||
+ goto err_dma;
|
||||
|
||||
- dma_desc = ring->cpu_base;
|
||||
- dma_desc += ring->end;
|
||||
- dma_desc->addr_low = cpu_to_le32(lower_32_bits(slot->dma_addr));
|
||||
- dma_desc->addr_high = cpu_to_le32(upper_32_bits(slot->dma_addr));
|
||||
- dma_desc->ctl0 = cpu_to_le32(ctl0);
|
||||
- dma_desc->ctl1 = cpu_to_le32(ctl1);
|
||||
+ if (i == nr_frags - 1)
|
||||
+ flags |= BGMAC_DESC_CTL0_EOF | BGMAC_DESC_CTL0_IOC;
|
||||
+
|
||||
+ bgmac_dma_tx_add_buf(bgmac, ring, index, len, flags);
|
||||
+ }
|
||||
+
|
||||
+ slot->skb = skb;
|
||||
|
||||
netdev_sent_queue(net_dev, skb->len);
|
||||
|
||||
@@ -170,20 +208,35 @@ static netdev_tx_t bgmac_dma_tx_add(stru
|
||||
/* Increase ring->end to point empty slot. We tell hardware the first
|
||||
* slot it should *not* read.
|
||||
*/
|
||||
- if (++ring->end >= BGMAC_TX_RING_SLOTS)
|
||||
- ring->end = 0;
|
||||
+ ring->end = (index + 1) % BGMAC_TX_RING_SLOTS;
|
||||
bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_INDEX,
|
||||
ring->index_base +
|
||||
ring->end * sizeof(struct bgmac_dma_desc));
|
||||
|
||||
- /* Always keep one slot free to allow detecting bugged calls. */
|
||||
- if (--free_slots == 1)
|
||||
+ free_slots -= nr_frags + 1;
|
||||
+ if (free_slots < 8)
|
||||
netif_stop_queue(net_dev);
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
-err_stop_drop:
|
||||
- netif_stop_queue(net_dev);
|
||||
+err_dma:
|
||||
+ dma_unmap_single(dma_dev, slot->dma_addr, skb_headlen(skb),
|
||||
+ DMA_TO_DEVICE);
|
||||
+
|
||||
+ while (i > 0) {
|
||||
+ int index = (ring->end + i) % BGMAC_TX_RING_SLOTS;
|
||||
+ struct bgmac_slot_info *slot = &ring->slots[index];
|
||||
+ u32 ctl1 = le32_to_cpu(ring->cpu_base[index].ctl1);
|
||||
+ int len = ctl1 & BGMAC_DESC_CTL1_LEN;
|
||||
+
|
||||
+ dma_unmap_page(dma_dev, slot->dma_addr, len, DMA_TO_DEVICE);
|
||||
+ }
|
||||
+
|
||||
+err_dma_head:
|
||||
+ bgmac_err(bgmac, "Mapping error of skb on ring 0x%X\n",
|
||||
+ ring->mmio_base);
|
||||
+
|
||||
+err_drop:
|
||||
dev_kfree_skb(skb);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
@@ -205,32 +258,45 @@ static void bgmac_dma_tx_free(struct bgm
|
||||
|
||||
while (ring->start != empty_slot) {
|
||||
struct bgmac_slot_info *slot = &ring->slots[ring->start];
|
||||
+ u32 ctl1 = le32_to_cpu(ring->cpu_base[ring->start].ctl1);
|
||||
+ int len = ctl1 & BGMAC_DESC_CTL1_LEN;
|
||||
|
||||
- if (slot->skb) {
|
||||
+ if (!slot->dma_addr) {
|
||||
+ bgmac_err(bgmac, "Hardware reported transmission for empty TX ring slot %d! End of ring: %d\n",
|
||||
+ ring->start, ring->end);
|
||||
+ goto next;
|
||||
+ }
|
||||
+
|
||||
+ if (ctl1 & BGMAC_DESC_CTL0_SOF)
|
||||
/* Unmap no longer used buffer */
|
||||
- dma_unmap_single(dma_dev, slot->dma_addr,
|
||||
- slot->skb->len, DMA_TO_DEVICE);
|
||||
- slot->dma_addr = 0;
|
||||
+ dma_unmap_single(dma_dev, slot->dma_addr, len,
|
||||
+ DMA_TO_DEVICE);
|
||||
+ else
|
||||
+ dma_unmap_page(dma_dev, slot->dma_addr, len,
|
||||
+ DMA_TO_DEVICE);
|
||||
|
||||
+ if (slot->skb) {
|
||||
bytes_compl += slot->skb->len;
|
||||
pkts_compl++;
|
||||
|
||||
/* Free memory! :) */
|
||||
dev_kfree_skb(slot->skb);
|
||||
slot->skb = NULL;
|
||||
- } else {
|
||||
- bgmac_err(bgmac, "Hardware reported transmission for empty TX ring slot %d! End of ring: %d\n",
|
||||
- ring->start, ring->end);
|
||||
}
|
||||
|
||||
+next:
|
||||
+ slot->dma_addr = 0;
|
||||
if (++ring->start >= BGMAC_TX_RING_SLOTS)
|
||||
ring->start = 0;
|
||||
freed = true;
|
||||
}
|
||||
|
||||
+ if (!pkts_compl)
|
||||
+ return;
|
||||
+
|
||||
netdev_completed_queue(bgmac->net_dev, pkts_compl, bytes_compl);
|
||||
|
||||
- if (freed && netif_queue_stopped(bgmac->net_dev))
|
||||
+ if (netif_queue_stopped(bgmac->net_dev))
|
||||
netif_wake_queue(bgmac->net_dev);
|
||||
}
|
||||
|
||||
@@ -439,17 +505,25 @@ static void bgmac_dma_tx_ring_free(struc
|
||||
struct bgmac_dma_ring *ring)
|
||||
{
|
||||
struct device *dma_dev = bgmac->core->dma_dev;
|
||||
+ struct bgmac_dma_desc *dma_desc = ring->cpu_base;
|
||||
struct bgmac_slot_info *slot;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ring->num_slots; i++) {
|
||||
+ int len = dma_desc[i].ctl1 & BGMAC_DESC_CTL1_LEN;
|
||||
+
|
||||
slot = &ring->slots[i];
|
||||
- if (slot->skb) {
|
||||
- if (slot->dma_addr)
|
||||
- dma_unmap_single(dma_dev, slot->dma_addr,
|
||||
- slot->skb->len, DMA_TO_DEVICE);
|
||||
- dev_kfree_skb(slot->skb);
|
||||
- }
|
||||
+ dev_kfree_skb(slot->skb);
|
||||
+
|
||||
+ if (!slot->dma_addr)
|
||||
+ continue;
|
||||
+
|
||||
+ if (slot->skb)
|
||||
+ dma_unmap_single(dma_dev, slot->dma_addr,
|
||||
+ len, DMA_TO_DEVICE);
|
||||
+ else
|
||||
+ dma_unmap_page(dma_dev, slot->dma_addr,
|
||||
+ len, DMA_TO_DEVICE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1583,6 +1657,10 @@ static int bgmac_probe(struct bcma_devic
|
||||
goto err_dma_free;
|
||||
}
|
||||
|
||||
+ net_dev->features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
|
||||
+ net_dev->hw_features = net_dev->features;
|
||||
+ net_dev->vlan_features = net_dev->features;
|
||||
+
|
||||
err = register_netdev(bgmac->net_dev);
|
||||
if (err) {
|
||||
bgmac_err(bgmac, "Cannot register net device\n");
|
||||
@@ -1,125 +0,0 @@
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
Date: Sun, 12 Apr 2015 09:58:56 +0200
|
||||
Subject: [PATCH] bgmac: simplify tx ring index handling
|
||||
|
||||
Keep incrementing ring->start and ring->end instead of pointing it to
|
||||
the actual ring slot entry. This simplifies the calculation of the
|
||||
number of free slots.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
---
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.c
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.c
|
||||
@@ -142,11 +142,10 @@ static netdev_tx_t bgmac_dma_tx_add(stru
|
||||
{
|
||||
struct device *dma_dev = bgmac->core->dma_dev;
|
||||
struct net_device *net_dev = bgmac->net_dev;
|
||||
- struct bgmac_slot_info *slot = &ring->slots[ring->end];
|
||||
- int free_slots;
|
||||
+ int index = ring->end % BGMAC_TX_RING_SLOTS;
|
||||
+ struct bgmac_slot_info *slot = &ring->slots[index];
|
||||
int nr_frags;
|
||||
u32 flags;
|
||||
- int index = ring->end;
|
||||
int i;
|
||||
|
||||
if (skb->len > BGMAC_DESC_CTL1_LEN) {
|
||||
@@ -159,12 +158,10 @@ static netdev_tx_t bgmac_dma_tx_add(stru
|
||||
|
||||
nr_frags = skb_shinfo(skb)->nr_frags;
|
||||
|
||||
- if (ring->start <= ring->end)
|
||||
- free_slots = ring->start - ring->end + BGMAC_TX_RING_SLOTS;
|
||||
- else
|
||||
- free_slots = ring->start - ring->end;
|
||||
-
|
||||
- if (free_slots <= nr_frags + 1) {
|
||||
+ /* ring->end - ring->start will return the number of valid slots,
|
||||
+ * even when ring->end overflows
|
||||
+ */
|
||||
+ if (ring->end - ring->start + nr_frags + 1 >= BGMAC_TX_RING_SLOTS) {
|
||||
bgmac_err(bgmac, "TX ring is full, queue should be stopped!\n");
|
||||
netif_stop_queue(net_dev);
|
||||
return NETDEV_TX_BUSY;
|
||||
@@ -200,7 +197,7 @@ static netdev_tx_t bgmac_dma_tx_add(stru
|
||||
}
|
||||
|
||||
slot->skb = skb;
|
||||
-
|
||||
+ ring->end += nr_frags + 1;
|
||||
netdev_sent_queue(net_dev, skb->len);
|
||||
|
||||
wmb();
|
||||
@@ -208,13 +205,12 @@ static netdev_tx_t bgmac_dma_tx_add(stru
|
||||
/* Increase ring->end to point empty slot. We tell hardware the first
|
||||
* slot it should *not* read.
|
||||
*/
|
||||
- ring->end = (index + 1) % BGMAC_TX_RING_SLOTS;
|
||||
bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_INDEX,
|
||||
ring->index_base +
|
||||
- ring->end * sizeof(struct bgmac_dma_desc));
|
||||
+ (ring->end % BGMAC_TX_RING_SLOTS) *
|
||||
+ sizeof(struct bgmac_dma_desc));
|
||||
|
||||
- free_slots -= nr_frags + 1;
|
||||
- if (free_slots < 8)
|
||||
+ if (ring->end - ring->start >= BGMAC_TX_RING_SLOTS - 8)
|
||||
netif_stop_queue(net_dev);
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
@@ -256,17 +252,17 @@ static void bgmac_dma_tx_free(struct bgm
|
||||
empty_slot &= BGMAC_DMA_TX_STATDPTR;
|
||||
empty_slot /= sizeof(struct bgmac_dma_desc);
|
||||
|
||||
- while (ring->start != empty_slot) {
|
||||
- struct bgmac_slot_info *slot = &ring->slots[ring->start];
|
||||
- u32 ctl1 = le32_to_cpu(ring->cpu_base[ring->start].ctl1);
|
||||
- int len = ctl1 & BGMAC_DESC_CTL1_LEN;
|
||||
+ while (ring->start != ring->end) {
|
||||
+ int slot_idx = ring->start % BGMAC_TX_RING_SLOTS;
|
||||
+ struct bgmac_slot_info *slot = &ring->slots[slot_idx];
|
||||
+ u32 ctl1;
|
||||
+ int len;
|
||||
|
||||
- if (!slot->dma_addr) {
|
||||
- bgmac_err(bgmac, "Hardware reported transmission for empty TX ring slot %d! End of ring: %d\n",
|
||||
- ring->start, ring->end);
|
||||
- goto next;
|
||||
- }
|
||||
+ if (slot_idx == empty_slot)
|
||||
+ break;
|
||||
|
||||
+ ctl1 = le32_to_cpu(ring->cpu_base[slot_idx].ctl1);
|
||||
+ len = ctl1 & BGMAC_DESC_CTL1_LEN;
|
||||
if (ctl1 & BGMAC_DESC_CTL0_SOF)
|
||||
/* Unmap no longer used buffer */
|
||||
dma_unmap_single(dma_dev, slot->dma_addr, len,
|
||||
@@ -284,10 +280,8 @@ static void bgmac_dma_tx_free(struct bgm
|
||||
slot->skb = NULL;
|
||||
}
|
||||
|
||||
-next:
|
||||
slot->dma_addr = 0;
|
||||
- if (++ring->start >= BGMAC_TX_RING_SLOTS)
|
||||
- ring->start = 0;
|
||||
+ ring->start++;
|
||||
freed = true;
|
||||
}
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.h
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.h
|
||||
@@ -414,10 +414,10 @@ enum bgmac_dma_ring_type {
|
||||
* empty.
|
||||
*/
|
||||
struct bgmac_dma_ring {
|
||||
- u16 num_slots;
|
||||
- u16 start;
|
||||
- u16 end;
|
||||
+ u32 start;
|
||||
+ u32 end;
|
||||
|
||||
+ u16 num_slots;
|
||||
u16 mmio_base;
|
||||
struct bgmac_dma_desc *cpu_base;
|
||||
dma_addr_t dma_base;
|
||||
@@ -1,87 +0,0 @@
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
Date: Sun, 12 Apr 2015 10:08:04 +0200
|
||||
Subject: [PATCH] bgmac: leave interrupts disabled as long as there is work
|
||||
to do
|
||||
|
||||
Always poll rx and tx during NAPI poll instead of relying on the status
|
||||
of the first interrupt. This prevents bgmac_poll from leaving unfinished
|
||||
work around until the next IRQ.
|
||||
In my tests this makes bridging/routing throughput under heavy load more
|
||||
stable and ensures that no new IRQs arrive as long as bgmac_poll uses up
|
||||
the entire budget.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
---
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.c
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.c
|
||||
@@ -1109,8 +1109,6 @@ static void bgmac_chip_reset(struct bgma
|
||||
bgmac_phy_init(bgmac);
|
||||
|
||||
netdev_reset_queue(bgmac->net_dev);
|
||||
-
|
||||
- bgmac->int_status = 0;
|
||||
}
|
||||
|
||||
static void bgmac_chip_intrs_on(struct bgmac *bgmac)
|
||||
@@ -1225,14 +1223,13 @@ static irqreturn_t bgmac_interrupt(int i
|
||||
if (!int_status)
|
||||
return IRQ_NONE;
|
||||
|
||||
- /* Ack */
|
||||
- bgmac_write(bgmac, BGMAC_INT_STATUS, int_status);
|
||||
+ int_status &= ~(BGMAC_IS_TX0 | BGMAC_IS_RX);
|
||||
+ if (int_status)
|
||||
+ bgmac_err(bgmac, "Unknown IRQs: 0x%08X\n", int_status);
|
||||
|
||||
/* Disable new interrupts until handling existing ones */
|
||||
bgmac_chip_intrs_off(bgmac);
|
||||
|
||||
- bgmac->int_status = int_status;
|
||||
-
|
||||
napi_schedule(&bgmac->napi);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
@@ -1241,25 +1238,17 @@ static irqreturn_t bgmac_interrupt(int i
|
||||
static int bgmac_poll(struct napi_struct *napi, int weight)
|
||||
{
|
||||
struct bgmac *bgmac = container_of(napi, struct bgmac, napi);
|
||||
- struct bgmac_dma_ring *ring;
|
||||
int handled = 0;
|
||||
|
||||
- if (bgmac->int_status & BGMAC_IS_TX0) {
|
||||
- ring = &bgmac->tx_ring[0];
|
||||
- bgmac_dma_tx_free(bgmac, ring);
|
||||
- bgmac->int_status &= ~BGMAC_IS_TX0;
|
||||
- }
|
||||
+ /* Ack */
|
||||
+ bgmac_write(bgmac, BGMAC_INT_STATUS, ~0);
|
||||
|
||||
- if (bgmac->int_status & BGMAC_IS_RX) {
|
||||
- ring = &bgmac->rx_ring[0];
|
||||
- handled += bgmac_dma_rx_read(bgmac, ring, weight);
|
||||
- bgmac->int_status &= ~BGMAC_IS_RX;
|
||||
- }
|
||||
+ bgmac_dma_tx_free(bgmac, &bgmac->tx_ring[0]);
|
||||
+ handled += bgmac_dma_rx_read(bgmac, &bgmac->rx_ring[0], weight);
|
||||
|
||||
- if (bgmac->int_status) {
|
||||
- bgmac_err(bgmac, "Unknown IRQs: 0x%08X\n", bgmac->int_status);
|
||||
- bgmac->int_status = 0;
|
||||
- }
|
||||
+ /* Poll again if more events arrived in the meantime */
|
||||
+ if (bgmac_read(bgmac, BGMAC_INT_STATUS) & (BGMAC_IS_TX0 | BGMAC_IS_RX))
|
||||
+ return handled;
|
||||
|
||||
if (handled < weight) {
|
||||
napi_complete(napi);
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.h
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.h
|
||||
@@ -452,7 +452,6 @@ struct bgmac {
|
||||
|
||||
/* Int */
|
||||
u32 int_mask;
|
||||
- u32 int_status;
|
||||
|
||||
/* Current MAC state */
|
||||
int mac_speed;
|
||||
@@ -1,66 +0,0 @@
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
Date: Sun, 12 Apr 2015 10:13:28 +0200
|
||||
Subject: [PATCH] bgmac: set received skb headroom to NET_SKB_PAD
|
||||
|
||||
A packet buffer offset of 30 bytes is inefficient, because the first 2
|
||||
bytes end up in a different cacheline.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
---
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.c
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.c
|
||||
@@ -346,13 +346,13 @@ static int bgmac_dma_rx_skb_for_slot(str
|
||||
return -ENOMEM;
|
||||
|
||||
/* Poison - if everything goes fine, hardware will overwrite it */
|
||||
- rx = buf;
|
||||
+ rx = buf + BGMAC_RX_BUF_OFFSET;
|
||||
rx->len = cpu_to_le16(0xdead);
|
||||
rx->flags = cpu_to_le16(0xbeef);
|
||||
|
||||
/* Map skb for the DMA */
|
||||
- dma_addr = dma_map_single(dma_dev, buf, BGMAC_RX_BUF_SIZE,
|
||||
- DMA_FROM_DEVICE);
|
||||
+ dma_addr = dma_map_single(dma_dev, buf + BGMAC_RX_BUF_OFFSET,
|
||||
+ BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
|
||||
if (dma_mapping_error(dma_dev, dma_addr)) {
|
||||
bgmac_err(bgmac, "DMA mapping error\n");
|
||||
put_page(virt_to_head_page(buf));
|
||||
@@ -403,7 +403,7 @@ static int bgmac_dma_rx_read(struct bgma
|
||||
while (ring->start != ring->end) {
|
||||
struct device *dma_dev = bgmac->core->dma_dev;
|
||||
struct bgmac_slot_info *slot = &ring->slots[ring->start];
|
||||
- struct bgmac_rx_header *rx = slot->buf;
|
||||
+ struct bgmac_rx_header *rx = slot->buf + BGMAC_RX_BUF_OFFSET;
|
||||
struct sk_buff *skb;
|
||||
void *buf = slot->buf;
|
||||
u16 len, flags;
|
||||
@@ -454,8 +454,10 @@ static int bgmac_dma_rx_read(struct bgma
|
||||
BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
|
||||
|
||||
skb = build_skb(buf, BGMAC_RX_ALLOC_SIZE);
|
||||
- skb_put(skb, BGMAC_RX_FRAME_OFFSET + len);
|
||||
- skb_pull(skb, BGMAC_RX_FRAME_OFFSET);
|
||||
+ skb_put(skb, BGMAC_RX_FRAME_OFFSET +
|
||||
+ BGMAC_RX_BUF_OFFSET + len);
|
||||
+ skb_pull(skb, BGMAC_RX_FRAME_OFFSET +
|
||||
+ BGMAC_RX_BUF_OFFSET);
|
||||
|
||||
skb_checksum_none_assert(skb);
|
||||
skb->protocol = eth_type_trans(skb, bgmac->net_dev);
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.h
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.h
|
||||
@@ -360,9 +360,11 @@
|
||||
|
||||
#define BGMAC_RX_HEADER_LEN 28 /* Last 24 bytes are unused. Well... */
|
||||
#define BGMAC_RX_FRAME_OFFSET 30 /* There are 2 unused bytes between header and real data */
|
||||
+#define BGMAC_RX_BUF_OFFSET (NET_SKB_PAD + NET_IP_ALIGN - \
|
||||
+ BGMAC_RX_FRAME_OFFSET)
|
||||
#define BGMAC_RX_MAX_FRAME_SIZE 1536 /* Copied from b44/tg3 */
|
||||
#define BGMAC_RX_BUF_SIZE (BGMAC_RX_FRAME_OFFSET + BGMAC_RX_MAX_FRAME_SIZE)
|
||||
-#define BGMAC_RX_ALLOC_SIZE (SKB_DATA_ALIGN(BGMAC_RX_BUF_SIZE) + \
|
||||
+#define BGMAC_RX_ALLOC_SIZE (SKB_DATA_ALIGN(BGMAC_RX_BUF_SIZE + BGMAC_RX_BUF_OFFSET) + \
|
||||
SKB_DATA_ALIGN(sizeof(struct skb_shared_info)))
|
||||
|
||||
#define BGMAC_BFL_ENETROBO 0x0010 /* has ephy roboswitch spi */
|
||||
@@ -1,130 +0,0 @@
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
Date: Sun, 12 Apr 2015 22:23:07 +0200
|
||||
Subject: [PATCH] bgmac: simplify/optimize rx DMA error handling
|
||||
|
||||
Allocate a new buffer before processing the completed one. If allocation
|
||||
fails, reuse the old buffer.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
---
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.c
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.c
|
||||
@@ -386,6 +386,19 @@ static void bgmac_dma_rx_setup_desc(stru
|
||||
dma_desc->ctl1 = cpu_to_le32(ctl1);
|
||||
}
|
||||
|
||||
+static void bgmac_dma_rx_poison_buf(struct device *dma_dev,
|
||||
+ struct bgmac_slot_info *slot)
|
||||
+{
|
||||
+ struct bgmac_rx_header *rx = slot->buf + BGMAC_RX_BUF_OFFSET;
|
||||
+
|
||||
+ dma_sync_single_for_cpu(dma_dev, slot->dma_addr, BGMAC_RX_BUF_SIZE,
|
||||
+ DMA_FROM_DEVICE);
|
||||
+ rx->len = cpu_to_le16(0xdead);
|
||||
+ rx->flags = cpu_to_le16(0xbeef);
|
||||
+ dma_sync_single_for_device(dma_dev, slot->dma_addr, BGMAC_RX_BUF_SIZE,
|
||||
+ DMA_FROM_DEVICE);
|
||||
+}
|
||||
+
|
||||
static int bgmac_dma_rx_read(struct bgmac *bgmac, struct bgmac_dma_ring *ring,
|
||||
int weight)
|
||||
{
|
||||
@@ -406,53 +419,35 @@ static int bgmac_dma_rx_read(struct bgma
|
||||
struct bgmac_rx_header *rx = slot->buf + BGMAC_RX_BUF_OFFSET;
|
||||
struct sk_buff *skb;
|
||||
void *buf = slot->buf;
|
||||
+ dma_addr_t dma_addr = slot->dma_addr;
|
||||
u16 len, flags;
|
||||
|
||||
- /* Unmap buffer to make it accessible to the CPU */
|
||||
- dma_sync_single_for_cpu(dma_dev, slot->dma_addr,
|
||||
- BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
|
||||
-
|
||||
- /* Get info from the header */
|
||||
- len = le16_to_cpu(rx->len);
|
||||
- flags = le16_to_cpu(rx->flags);
|
||||
-
|
||||
do {
|
||||
- dma_addr_t old_dma_addr = slot->dma_addr;
|
||||
- int err;
|
||||
+ /* Prepare new skb as replacement */
|
||||
+ if (bgmac_dma_rx_skb_for_slot(bgmac, slot)) {
|
||||
+ bgmac_dma_rx_poison_buf(dma_dev, slot);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ /* Unmap buffer to make it accessible to the CPU */
|
||||
+ dma_unmap_single(dma_dev, dma_addr,
|
||||
+ BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
|
||||
+
|
||||
+ /* Get info from the header */
|
||||
+ len = le16_to_cpu(rx->len);
|
||||
+ flags = le16_to_cpu(rx->flags);
|
||||
|
||||
/* Check for poison and drop or pass the packet */
|
||||
if (len == 0xdead && flags == 0xbeef) {
|
||||
bgmac_err(bgmac, "Found poisoned packet at slot %d, DMA issue!\n",
|
||||
ring->start);
|
||||
- dma_sync_single_for_device(dma_dev,
|
||||
- slot->dma_addr,
|
||||
- BGMAC_RX_BUF_SIZE,
|
||||
- DMA_FROM_DEVICE);
|
||||
+ put_page(virt_to_head_page(buf));
|
||||
break;
|
||||
}
|
||||
|
||||
/* Omit CRC. */
|
||||
len -= ETH_FCS_LEN;
|
||||
|
||||
- /* Prepare new skb as replacement */
|
||||
- err = bgmac_dma_rx_skb_for_slot(bgmac, slot);
|
||||
- if (err) {
|
||||
- /* Poison the old skb */
|
||||
- rx->len = cpu_to_le16(0xdead);
|
||||
- rx->flags = cpu_to_le16(0xbeef);
|
||||
-
|
||||
- dma_sync_single_for_device(dma_dev,
|
||||
- slot->dma_addr,
|
||||
- BGMAC_RX_BUF_SIZE,
|
||||
- DMA_FROM_DEVICE);
|
||||
- break;
|
||||
- }
|
||||
- bgmac_dma_rx_setup_desc(bgmac, ring, ring->start);
|
||||
-
|
||||
- /* Unmap old skb, we'll pass it to the netfif */
|
||||
- dma_unmap_single(dma_dev, old_dma_addr,
|
||||
- BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
|
||||
-
|
||||
skb = build_skb(buf, BGMAC_RX_ALLOC_SIZE);
|
||||
skb_put(skb, BGMAC_RX_FRAME_OFFSET +
|
||||
BGMAC_RX_BUF_OFFSET + len);
|
||||
@@ -465,6 +460,8 @@ static int bgmac_dma_rx_read(struct bgma
|
||||
handled++;
|
||||
} while (0);
|
||||
|
||||
+ bgmac_dma_rx_setup_desc(bgmac, ring, ring->start);
|
||||
+
|
||||
if (++ring->start >= BGMAC_RX_RING_SLOTS)
|
||||
ring->start = 0;
|
||||
|
||||
@@ -532,14 +529,14 @@ static void bgmac_dma_rx_ring_free(struc
|
||||
|
||||
for (i = 0; i < ring->num_slots; i++) {
|
||||
slot = &ring->slots[i];
|
||||
- if (!slot->buf)
|
||||
+ if (!slot->dma_addr)
|
||||
continue;
|
||||
|
||||
- if (slot->dma_addr)
|
||||
- dma_unmap_single(dma_dev, slot->dma_addr,
|
||||
- BGMAC_RX_BUF_SIZE,
|
||||
- DMA_FROM_DEVICE);
|
||||
+ dma_unmap_single(dma_dev, slot->dma_addr,
|
||||
+ BGMAC_RX_BUF_SIZE,
|
||||
+ DMA_FROM_DEVICE);
|
||||
put_page(virt_to_head_page(slot->buf));
|
||||
+ slot->dma_addr = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
Date: Sun, 12 Apr 2015 22:28:20 +0200
|
||||
Subject: [PATCH] bgmac: add check for oversized packets
|
||||
|
||||
In very rare cases, the MAC can catch an internal buffer that is bigger
|
||||
than it's supposed to be. Instead of crashing the kernel, simply pass
|
||||
the buffer back to the hardware
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
---
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.c
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.c
|
||||
@@ -445,6 +445,13 @@ static int bgmac_dma_rx_read(struct bgma
|
||||
break;
|
||||
}
|
||||
|
||||
+ if (len > BGMAC_RX_ALLOC_SIZE) {
|
||||
+ bgmac_err(bgmac, "Found oversized packet at slot %d, DMA issue!\n",
|
||||
+ ring->start);
|
||||
+ put_page(virt_to_head_page(buf));
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
/* Omit CRC. */
|
||||
len -= ETH_FCS_LEN;
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
Date: Sun, 12 Apr 2015 22:36:16 +0200
|
||||
Subject: [PATCH] bgmac: increase rx ring size from 511 to 512
|
||||
|
||||
Limiting it to 511 looks like a failed attempt at leaving one descriptor
|
||||
empty to allow the hardware to stop processing a buffer that has not
|
||||
been prepared yet. However, this doesn't work because this affects the
|
||||
total ring size as well
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
---
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.h
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.h
|
||||
@@ -356,7 +356,7 @@
|
||||
#define BGMAC_MAX_RX_RINGS 1
|
||||
|
||||
#define BGMAC_TX_RING_SLOTS 128
|
||||
-#define BGMAC_RX_RING_SLOTS 512 - 1 /* Why -1? Well, Broadcom does that... */
|
||||
+#define BGMAC_RX_RING_SLOTS 512
|
||||
|
||||
#define BGMAC_RX_HEADER_LEN 28 /* Last 24 bytes are unused. Well... */
|
||||
#define BGMAC_RX_FRAME_OFFSET 30 /* There are 2 unused bytes between header and real data */
|
||||
@@ -1,184 +0,0 @@
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
Date: Sun, 12 Apr 2015 23:19:32 +0200
|
||||
Subject: [PATCH] bgmac: simplify dma init/cleanup
|
||||
|
||||
Instead of allocating buffers at device init time and initializing
|
||||
descriptors at device open, do both at the same time (during open).
|
||||
Free all buffers when closing the device.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
---
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.c
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.c
|
||||
@@ -562,18 +562,26 @@ static void bgmac_dma_ring_desc_free(str
|
||||
ring->dma_base);
|
||||
}
|
||||
|
||||
-static void bgmac_dma_free(struct bgmac *bgmac)
|
||||
+static void bgmac_dma_cleanup(struct bgmac *bgmac)
|
||||
{
|
||||
int i;
|
||||
|
||||
- for (i = 0; i < BGMAC_MAX_TX_RINGS; i++) {
|
||||
+ for (i = 0; i < BGMAC_MAX_TX_RINGS; i++)
|
||||
bgmac_dma_tx_ring_free(bgmac, &bgmac->tx_ring[i]);
|
||||
- bgmac_dma_ring_desc_free(bgmac, &bgmac->tx_ring[i]);
|
||||
- }
|
||||
- for (i = 0; i < BGMAC_MAX_RX_RINGS; i++) {
|
||||
+
|
||||
+ for (i = 0; i < BGMAC_MAX_RX_RINGS; i++)
|
||||
bgmac_dma_rx_ring_free(bgmac, &bgmac->rx_ring[i]);
|
||||
+}
|
||||
+
|
||||
+static void bgmac_dma_free(struct bgmac *bgmac)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < BGMAC_MAX_TX_RINGS; i++)
|
||||
+ bgmac_dma_ring_desc_free(bgmac, &bgmac->tx_ring[i]);
|
||||
+
|
||||
+ for (i = 0; i < BGMAC_MAX_RX_RINGS; i++)
|
||||
bgmac_dma_ring_desc_free(bgmac, &bgmac->rx_ring[i]);
|
||||
- }
|
||||
}
|
||||
|
||||
static int bgmac_dma_alloc(struct bgmac *bgmac)
|
||||
@@ -621,8 +629,6 @@ static int bgmac_dma_alloc(struct bgmac
|
||||
}
|
||||
|
||||
for (i = 0; i < BGMAC_MAX_RX_RINGS; i++) {
|
||||
- int j;
|
||||
-
|
||||
ring = &bgmac->rx_ring[i];
|
||||
ring->num_slots = BGMAC_RX_RING_SLOTS;
|
||||
ring->mmio_base = ring_base[i];
|
||||
@@ -645,15 +651,6 @@ static int bgmac_dma_alloc(struct bgmac
|
||||
ring->index_base = lower_32_bits(ring->dma_base);
|
||||
else
|
||||
ring->index_base = 0;
|
||||
-
|
||||
- /* Alloc RX slots */
|
||||
- for (j = 0; j < ring->num_slots; j++) {
|
||||
- err = bgmac_dma_rx_skb_for_slot(bgmac, &ring->slots[j]);
|
||||
- if (err) {
|
||||
- bgmac_err(bgmac, "Can't allocate skb for slot in RX ring\n");
|
||||
- goto err_dma_free;
|
||||
- }
|
||||
- }
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -663,10 +660,10 @@ err_dma_free:
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
-static void bgmac_dma_init(struct bgmac *bgmac)
|
||||
+static int bgmac_dma_init(struct bgmac *bgmac)
|
||||
{
|
||||
struct bgmac_dma_ring *ring;
|
||||
- int i;
|
||||
+ int i, err;
|
||||
|
||||
for (i = 0; i < BGMAC_MAX_TX_RINGS; i++) {
|
||||
ring = &bgmac->tx_ring[i];
|
||||
@@ -698,8 +695,13 @@ static void bgmac_dma_init(struct bgmac
|
||||
if (ring->unaligned)
|
||||
bgmac_dma_rx_enable(bgmac, ring);
|
||||
|
||||
- for (j = 0; j < ring->num_slots; j++)
|
||||
+ for (j = 0; j < ring->num_slots; j++) {
|
||||
+ err = bgmac_dma_rx_skb_for_slot(bgmac, &ring->slots[j]);
|
||||
+ if (err)
|
||||
+ goto error;
|
||||
+
|
||||
bgmac_dma_rx_setup_desc(bgmac, ring, j);
|
||||
+ }
|
||||
|
||||
bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_INDEX,
|
||||
ring->index_base +
|
||||
@@ -708,6 +710,12 @@ static void bgmac_dma_init(struct bgmac
|
||||
ring->start = 0;
|
||||
ring->end = 0;
|
||||
}
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+error:
|
||||
+ bgmac_dma_cleanup(bgmac);
|
||||
+ return err;
|
||||
}
|
||||
|
||||
/**************************************************
|
||||
@@ -1183,11 +1191,8 @@ static void bgmac_enable(struct bgmac *b
|
||||
}
|
||||
|
||||
/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipinit */
|
||||
-static void bgmac_chip_init(struct bgmac *bgmac, bool full_init)
|
||||
+static void bgmac_chip_init(struct bgmac *bgmac)
|
||||
{
|
||||
- struct bgmac_dma_ring *ring;
|
||||
- int i;
|
||||
-
|
||||
/* 1 interrupt per received frame */
|
||||
bgmac_write(bgmac, BGMAC_INT_RECV_LAZY, 1 << BGMAC_IRL_FC_SHIFT);
|
||||
|
||||
@@ -1205,16 +1210,7 @@ static void bgmac_chip_init(struct bgmac
|
||||
|
||||
bgmac_write(bgmac, BGMAC_RXMAX_LENGTH, 32 + ETHER_MAX_LEN);
|
||||
|
||||
- if (full_init) {
|
||||
- bgmac_dma_init(bgmac);
|
||||
- if (1) /* FIXME: is there any case we don't want IRQs? */
|
||||
- bgmac_chip_intrs_on(bgmac);
|
||||
- } else {
|
||||
- for (i = 0; i < BGMAC_MAX_RX_RINGS; i++) {
|
||||
- ring = &bgmac->rx_ring[i];
|
||||
- bgmac_dma_rx_enable(bgmac, ring);
|
||||
- }
|
||||
- }
|
||||
+ bgmac_chip_intrs_on(bgmac);
|
||||
|
||||
bgmac_enable(bgmac);
|
||||
}
|
||||
@@ -1274,23 +1270,27 @@ static int bgmac_open(struct net_device
|
||||
int err = 0;
|
||||
|
||||
bgmac_chip_reset(bgmac);
|
||||
+
|
||||
+ err = bgmac_dma_init(bgmac);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
/* Specs say about reclaiming rings here, but we do that in DMA init */
|
||||
- bgmac_chip_init(bgmac, true);
|
||||
+ bgmac_chip_init(bgmac);
|
||||
|
||||
err = request_irq(bgmac->core->irq, bgmac_interrupt, IRQF_SHARED,
|
||||
KBUILD_MODNAME, net_dev);
|
||||
if (err < 0) {
|
||||
bgmac_err(bgmac, "IRQ request error: %d!\n", err);
|
||||
- goto err_out;
|
||||
+ bgmac_dma_cleanup(bgmac);
|
||||
+ return err;
|
||||
}
|
||||
napi_enable(&bgmac->napi);
|
||||
|
||||
phy_start(bgmac->phy_dev);
|
||||
|
||||
netif_carrier_on(net_dev);
|
||||
-
|
||||
-err_out:
|
||||
- return err;
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static int bgmac_stop(struct net_device *net_dev)
|
||||
@@ -1306,6 +1306,7 @@ static int bgmac_stop(struct net_device
|
||||
free_irq(bgmac->core->irq, net_dev);
|
||||
|
||||
bgmac_chip_reset(bgmac);
|
||||
+ bgmac_dma_cleanup(bgmac);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,88 +0,0 @@
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
Date: Sun, 12 Apr 2015 11:59:47 +0200
|
||||
Subject: [PATCH] bgmac: fix DMA rx corruption
|
||||
|
||||
The driver needs to inform the hardware about the first invalid (not yet
|
||||
filled) rx slot, by writing its DMA descriptor pointer offset to the
|
||||
BGMAC_DMA_RX_INDEX register.
|
||||
|
||||
This register was set to a value exceeding the rx ring size, effectively
|
||||
allowing the hardware constant access to the full ring, regardless of
|
||||
which slots are initialized.
|
||||
|
||||
To fix this issue, always mark the last filled rx slot as invalid.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
---
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.c
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.c
|
||||
@@ -366,6 +366,16 @@ static int bgmac_dma_rx_skb_for_slot(str
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void bgmac_dma_rx_update_index(struct bgmac *bgmac,
|
||||
+ struct bgmac_dma_ring *ring)
|
||||
+{
|
||||
+ wmb();
|
||||
+
|
||||
+ bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_INDEX,
|
||||
+ ring->index_base +
|
||||
+ ring->end * sizeof(struct bgmac_dma_desc));
|
||||
+}
|
||||
+
|
||||
static void bgmac_dma_rx_setup_desc(struct bgmac *bgmac,
|
||||
struct bgmac_dma_ring *ring, int desc_idx)
|
||||
{
|
||||
@@ -384,6 +394,8 @@ static void bgmac_dma_rx_setup_desc(stru
|
||||
dma_desc->addr_high = cpu_to_le32(upper_32_bits(ring->slots[desc_idx].dma_addr));
|
||||
dma_desc->ctl0 = cpu_to_le32(ctl0);
|
||||
dma_desc->ctl1 = cpu_to_le32(ctl1);
|
||||
+
|
||||
+ ring->end = desc_idx;
|
||||
}
|
||||
|
||||
static void bgmac_dma_rx_poison_buf(struct device *dma_dev,
|
||||
@@ -411,9 +423,7 @@ static int bgmac_dma_rx_read(struct bgma
|
||||
end_slot &= BGMAC_DMA_RX_STATDPTR;
|
||||
end_slot /= sizeof(struct bgmac_dma_desc);
|
||||
|
||||
- ring->end = end_slot;
|
||||
-
|
||||
- while (ring->start != ring->end) {
|
||||
+ while (ring->start != end_slot) {
|
||||
struct device *dma_dev = bgmac->core->dma_dev;
|
||||
struct bgmac_slot_info *slot = &ring->slots[ring->start];
|
||||
struct bgmac_rx_header *rx = slot->buf + BGMAC_RX_BUF_OFFSET;
|
||||
@@ -476,6 +486,8 @@ static int bgmac_dma_rx_read(struct bgma
|
||||
break;
|
||||
}
|
||||
|
||||
+ bgmac_dma_rx_update_index(bgmac, ring);
|
||||
+
|
||||
return handled;
|
||||
}
|
||||
|
||||
@@ -695,6 +707,8 @@ static int bgmac_dma_init(struct bgmac *
|
||||
if (ring->unaligned)
|
||||
bgmac_dma_rx_enable(bgmac, ring);
|
||||
|
||||
+ ring->start = 0;
|
||||
+ ring->end = 0;
|
||||
for (j = 0; j < ring->num_slots; j++) {
|
||||
err = bgmac_dma_rx_skb_for_slot(bgmac, &ring->slots[j]);
|
||||
if (err)
|
||||
@@ -703,12 +717,7 @@ static int bgmac_dma_init(struct bgmac *
|
||||
bgmac_dma_rx_setup_desc(bgmac, ring, j);
|
||||
}
|
||||
|
||||
- bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_INDEX,
|
||||
- ring->index_base +
|
||||
- ring->num_slots * sizeof(struct bgmac_dma_desc));
|
||||
-
|
||||
- ring->start = 0;
|
||||
- ring->end = 0;
|
||||
+ bgmac_dma_rx_update_index(bgmac, ring);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -1,132 +0,0 @@
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
Date: Sun, 12 Apr 2015 23:28:38 +0200
|
||||
Subject: [PATCH] bgmac: drop ring->num_slots
|
||||
|
||||
The ring size is always known at compile time, so make the code a bit
|
||||
more efficient
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
---
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.c
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.c
|
||||
@@ -123,7 +123,7 @@ bgmac_dma_tx_add_buf(struct bgmac *bgmac
|
||||
struct bgmac_dma_desc *dma_desc;
|
||||
u32 ctl1;
|
||||
|
||||
- if (i == ring->num_slots - 1)
|
||||
+ if (i == BGMAC_TX_RING_SLOTS - 1)
|
||||
ctl0 |= BGMAC_DESC_CTL0_EOT;
|
||||
|
||||
ctl1 = len & BGMAC_DESC_CTL1_LEN;
|
||||
@@ -382,7 +382,7 @@ static void bgmac_dma_rx_setup_desc(stru
|
||||
struct bgmac_dma_desc *dma_desc = ring->cpu_base + desc_idx;
|
||||
u32 ctl0 = 0, ctl1 = 0;
|
||||
|
||||
- if (desc_idx == ring->num_slots - 1)
|
||||
+ if (desc_idx == BGMAC_RX_RING_SLOTS - 1)
|
||||
ctl0 |= BGMAC_DESC_CTL0_EOT;
|
||||
ctl1 |= BGMAC_RX_BUF_SIZE & BGMAC_DESC_CTL1_LEN;
|
||||
/* Is there any BGMAC device that requires extension? */
|
||||
@@ -521,7 +521,7 @@ static void bgmac_dma_tx_ring_free(struc
|
||||
struct bgmac_slot_info *slot;
|
||||
int i;
|
||||
|
||||
- for (i = 0; i < ring->num_slots; i++) {
|
||||
+ for (i = 0; i < BGMAC_TX_RING_SLOTS; i++) {
|
||||
int len = dma_desc[i].ctl1 & BGMAC_DESC_CTL1_LEN;
|
||||
|
||||
slot = &ring->slots[i];
|
||||
@@ -546,7 +546,7 @@ static void bgmac_dma_rx_ring_free(struc
|
||||
struct bgmac_slot_info *slot;
|
||||
int i;
|
||||
|
||||
- for (i = 0; i < ring->num_slots; i++) {
|
||||
+ for (i = 0; i < BGMAC_RX_RING_SLOTS; i++) {
|
||||
slot = &ring->slots[i];
|
||||
if (!slot->dma_addr)
|
||||
continue;
|
||||
@@ -560,7 +560,8 @@ static void bgmac_dma_rx_ring_free(struc
|
||||
}
|
||||
|
||||
static void bgmac_dma_ring_desc_free(struct bgmac *bgmac,
|
||||
- struct bgmac_dma_ring *ring)
|
||||
+ struct bgmac_dma_ring *ring,
|
||||
+ int num_slots)
|
||||
{
|
||||
struct device *dma_dev = bgmac->core->dma_dev;
|
||||
int size;
|
||||
@@ -569,7 +570,7 @@ static void bgmac_dma_ring_desc_free(str
|
||||
return;
|
||||
|
||||
/* Free ring of descriptors */
|
||||
- size = ring->num_slots * sizeof(struct bgmac_dma_desc);
|
||||
+ size = num_slots * sizeof(struct bgmac_dma_desc);
|
||||
dma_free_coherent(dma_dev, size, ring->cpu_base,
|
||||
ring->dma_base);
|
||||
}
|
||||
@@ -590,10 +591,12 @@ static void bgmac_dma_free(struct bgmac
|
||||
int i;
|
||||
|
||||
for (i = 0; i < BGMAC_MAX_TX_RINGS; i++)
|
||||
- bgmac_dma_ring_desc_free(bgmac, &bgmac->tx_ring[i]);
|
||||
+ bgmac_dma_ring_desc_free(bgmac, &bgmac->tx_ring[i],
|
||||
+ BGMAC_TX_RING_SLOTS);
|
||||
|
||||
for (i = 0; i < BGMAC_MAX_RX_RINGS; i++)
|
||||
- bgmac_dma_ring_desc_free(bgmac, &bgmac->rx_ring[i]);
|
||||
+ bgmac_dma_ring_desc_free(bgmac, &bgmac->rx_ring[i],
|
||||
+ BGMAC_RX_RING_SLOTS);
|
||||
}
|
||||
|
||||
static int bgmac_dma_alloc(struct bgmac *bgmac)
|
||||
@@ -616,11 +619,10 @@ static int bgmac_dma_alloc(struct bgmac
|
||||
|
||||
for (i = 0; i < BGMAC_MAX_TX_RINGS; i++) {
|
||||
ring = &bgmac->tx_ring[i];
|
||||
- ring->num_slots = BGMAC_TX_RING_SLOTS;
|
||||
ring->mmio_base = ring_base[i];
|
||||
|
||||
/* Alloc ring of descriptors */
|
||||
- size = ring->num_slots * sizeof(struct bgmac_dma_desc);
|
||||
+ size = BGMAC_TX_RING_SLOTS * sizeof(struct bgmac_dma_desc);
|
||||
ring->cpu_base = dma_zalloc_coherent(dma_dev, size,
|
||||
&ring->dma_base,
|
||||
GFP_KERNEL);
|
||||
@@ -642,11 +644,10 @@ static int bgmac_dma_alloc(struct bgmac
|
||||
|
||||
for (i = 0; i < BGMAC_MAX_RX_RINGS; i++) {
|
||||
ring = &bgmac->rx_ring[i];
|
||||
- ring->num_slots = BGMAC_RX_RING_SLOTS;
|
||||
ring->mmio_base = ring_base[i];
|
||||
|
||||
/* Alloc ring of descriptors */
|
||||
- size = ring->num_slots * sizeof(struct bgmac_dma_desc);
|
||||
+ size = BGMAC_RX_RING_SLOTS * sizeof(struct bgmac_dma_desc);
|
||||
ring->cpu_base = dma_zalloc_coherent(dma_dev, size,
|
||||
&ring->dma_base,
|
||||
GFP_KERNEL);
|
||||
@@ -709,7 +710,7 @@ static int bgmac_dma_init(struct bgmac *
|
||||
|
||||
ring->start = 0;
|
||||
ring->end = 0;
|
||||
- for (j = 0; j < ring->num_slots; j++) {
|
||||
+ for (j = 0; j < BGMAC_RX_RING_SLOTS; j++) {
|
||||
err = bgmac_dma_rx_skb_for_slot(bgmac, &ring->slots[j]);
|
||||
if (err)
|
||||
goto error;
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.h
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.h
|
||||
@@ -419,11 +419,10 @@ struct bgmac_dma_ring {
|
||||
u32 start;
|
||||
u32 end;
|
||||
|
||||
- u16 num_slots;
|
||||
- u16 mmio_base;
|
||||
struct bgmac_dma_desc *cpu_base;
|
||||
dma_addr_t dma_base;
|
||||
u32 index_base; /* Used for unaligned rings only, otherwise 0 */
|
||||
+ u16 mmio_base;
|
||||
bool unaligned;
|
||||
|
||||
struct bgmac_slot_info slots[BGMAC_RX_RING_SLOTS];
|
||||
@@ -1,24 +0,0 @@
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
Date: Mon, 13 Apr 2015 15:54:04 +0200
|
||||
Subject: [PATCH] bgmac: fix MAC soft-reset bit for corerev > 4
|
||||
|
||||
Only core revisions older than 4 use BGMAC_CMDCFG_SR_REV0
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
---
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.h
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.h
|
||||
@@ -198,9 +198,9 @@
|
||||
#define BGMAC_CMDCFG_TAI 0x00000200
|
||||
#define BGMAC_CMDCFG_HD 0x00000400 /* Set if in half duplex mode */
|
||||
#define BGMAC_CMDCFG_HD_SHIFT 10
|
||||
-#define BGMAC_CMDCFG_SR_REV0 0x00000800 /* Set to reset mode, for other revs */
|
||||
-#define BGMAC_CMDCFG_SR_REV4 0x00002000 /* Set to reset mode, only for core rev 4 */
|
||||
-#define BGMAC_CMDCFG_SR(rev) ((rev == 4) ? BGMAC_CMDCFG_SR_REV4 : BGMAC_CMDCFG_SR_REV0)
|
||||
+#define BGMAC_CMDCFG_SR_REV0 0x00000800 /* Set to reset mode, for core rev 0-3 */
|
||||
+#define BGMAC_CMDCFG_SR_REV4 0x00002000 /* Set to reset mode, for core rev >= 4 */
|
||||
+#define BGMAC_CMDCFG_SR(rev) ((rev >= 4) ? BGMAC_CMDCFG_SR_REV4 : BGMAC_CMDCFG_SR_REV0)
|
||||
#define BGMAC_CMDCFG_ML 0x00008000 /* Set to activate mac loopback mode */
|
||||
#define BGMAC_CMDCFG_AE 0x00400000
|
||||
#define BGMAC_CMDCFG_CFE 0x00800000
|
||||
@@ -1,28 +0,0 @@
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
Date: Mon, 13 Apr 2015 15:56:26 +0200
|
||||
Subject: [PATCH] bgmac: reset all 4 GMAC cores on init
|
||||
|
||||
On a BCM4709 based device, I found that GMAC cores may be enabled at
|
||||
probe time, but only become usable after a full reset.
|
||||
Disable cores before re-enabling them to ensure that they are properly
|
||||
reset.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
---
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.c
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.c
|
||||
@@ -1623,8 +1623,11 @@ static int bgmac_probe(struct bcma_devic
|
||||
ns_core = bcma_find_core_unit(core->bus,
|
||||
BCMA_CORE_MAC_GBIT,
|
||||
ns_gmac);
|
||||
- if (ns_core && !bcma_core_is_enabled(ns_core))
|
||||
- bcma_core_enable(ns_core, 0);
|
||||
+ if (!ns_core)
|
||||
+ continue;
|
||||
+
|
||||
+ bcma_core_disable(ns_core, 0);
|
||||
+ bcma_core_enable(ns_core, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
From 047f89922c6381432501f248d08226ff9adc4ee3 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Thu, 23 Apr 2015 20:45:25 +0200
|
||||
Subject: [PATCH][FIX 4.1] bgmac: fix requests for extra polling calls from
|
||||
NAPI
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
After d75b1ade567f ("net: less interrupt masking in NAPI") polling
|
||||
function has to return whole budget when it wants NAPI to call it again.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Cc: Felix Fietkau <nbd@openwrt.org>
|
||||
Fixes: eb64e2923a886 ("bgmac: leave interrupts disabled as long as there is work to do")
|
||||
---
|
||||
drivers/net/ethernet/broadcom/bgmac.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac.c
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac.c
|
||||
@@ -1260,7 +1260,7 @@ static int bgmac_poll(struct napi_struct
|
||||
|
||||
/* Poll again if more events arrived in the meantime */
|
||||
if (bgmac_read(bgmac, BGMAC_INT_STATUS) & (BGMAC_IS_TX0 | BGMAC_IS_RX))
|
||||
- return handled;
|
||||
+ return weight;
|
||||
|
||||
if (handled < weight) {
|
||||
napi_complete(napi);
|
||||
@@ -1,89 +0,0 @@
|
||||
From: Simon Farnsworth <simon@farnz.org.uk>
|
||||
Date: Sun, 1 Mar 2015 10:54:39 +0000
|
||||
Subject: [PATCH] pppoe: Use workqueue to die properly when a PADT is received
|
||||
|
||||
When a PADT frame is received, the socket may not be in a good state to
|
||||
close down the PPP interface. The current implementation handles this by
|
||||
simply blocking all further PPP traffic, and hoping that the lack of traffic
|
||||
will trigger the user to investigate.
|
||||
|
||||
Use schedule_work to get to a process context from which we clear down the
|
||||
PPP interface, in a fashion analogous to hangup on a TTY-based PPP
|
||||
interface. This causes pppd to disconnect immediately, and allows tools to
|
||||
take immediate corrective action.
|
||||
|
||||
Note that pppd's rp_pppoe.so plugin has code in it to disable the session
|
||||
when it disconnects; however, as a consequence of this patch, the session is
|
||||
already disabled before rp_pppoe.so is asked to disable the session. The
|
||||
result is a harmless error message:
|
||||
|
||||
Failed to disconnect PPPoE socket: 114 Operation already in progress
|
||||
|
||||
This message is safe to ignore, as long as the error is 114 Operation
|
||||
already in progress; in that specific case, it means that the PPPoE session
|
||||
has already been disabled before pppd tried to disable it.
|
||||
|
||||
Signed-off-by: Simon Farnsworth <simon@farnz.org.uk>
|
||||
Tested-by: Dan Williams <dcbw@redhat.com>
|
||||
Tested-by: Christoph Schulz <develop@kristov.de>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
|
||||
--- a/drivers/net/ppp/pppoe.c
|
||||
+++ b/drivers/net/ppp/pppoe.c
|
||||
@@ -455,6 +455,18 @@ out:
|
||||
return NET_RX_DROP;
|
||||
}
|
||||
|
||||
+static void pppoe_unbind_sock_work(struct work_struct *work)
|
||||
+{
|
||||
+ struct pppox_sock *po = container_of(work, struct pppox_sock,
|
||||
+ proto.pppoe.padt_work);
|
||||
+ struct sock *sk = sk_pppox(po);
|
||||
+
|
||||
+ lock_sock(sk);
|
||||
+ pppox_unbind_sock(sk);
|
||||
+ release_sock(sk);
|
||||
+ sock_put(sk);
|
||||
+}
|
||||
+
|
||||
/************************************************************************
|
||||
*
|
||||
* Receive a PPPoE Discovery frame.
|
||||
@@ -500,7 +512,8 @@ static int pppoe_disc_rcv(struct sk_buff
|
||||
}
|
||||
|
||||
bh_unlock_sock(sk);
|
||||
- sock_put(sk);
|
||||
+ if (!schedule_work(&po->proto.pppoe.padt_work))
|
||||
+ sock_put(sk);
|
||||
}
|
||||
|
||||
abort:
|
||||
@@ -613,6 +626,8 @@ static int pppoe_connect(struct socket *
|
||||
|
||||
lock_sock(sk);
|
||||
|
||||
+ INIT_WORK(&po->proto.pppoe.padt_work, pppoe_unbind_sock_work);
|
||||
+
|
||||
error = -EINVAL;
|
||||
if (sp->sa_protocol != PX_PROTO_OE)
|
||||
goto end;
|
||||
--- a/include/linux/if_pppox.h
|
||||
+++ b/include/linux/if_pppox.h
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/ppp_channel.h>
|
||||
#include <linux/skbuff.h>
|
||||
+#include <linux/workqueue.h>
|
||||
#include <uapi/linux/if_pppox.h>
|
||||
|
||||
static inline struct pppoe_hdr *pppoe_hdr(const struct sk_buff *skb)
|
||||
@@ -32,6 +33,7 @@ struct pppoe_opt {
|
||||
struct pppoe_addr pa; /* what this socket is bound to*/
|
||||
struct sockaddr_pppox relay; /* what socket data will be
|
||||
relayed to (PPPoE relaying) */
|
||||
+ struct work_struct padt_work;/* Work item for handling PADT */
|
||||
};
|
||||
|
||||
struct pptp_opt {
|
||||
@@ -1,27 +0,0 @@
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
Date: Sat, 9 May 2015 23:03:47 +0200
|
||||
Subject: [PATCH] pppoe: drop pppoe device in pppoe_unbind_sock_work
|
||||
|
||||
After receiving a PADT and the socket is closed, user space will no
|
||||
longer drop the reference to the pppoe device.
|
||||
This leads to errors like this:
|
||||
|
||||
[ 488.570000] unregister_netdevice: waiting for eth0.2 to become free. Usage count = 2
|
||||
|
||||
Fixes: 287f3a943fe ("pppoe: Use workqueue to die properly when a PADT is received")
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
---
|
||||
|
||||
--- a/drivers/net/ppp/pppoe.c
|
||||
+++ b/drivers/net/ppp/pppoe.c
|
||||
@@ -462,6 +462,10 @@ static void pppoe_unbind_sock_work(struc
|
||||
struct sock *sk = sk_pppox(po);
|
||||
|
||||
lock_sock(sk);
|
||||
+ if (po->pppoe_dev) {
|
||||
+ dev_put(po->pppoe_dev);
|
||||
+ po->pppoe_dev = NULL;
|
||||
+ }
|
||||
pppox_unbind_sock(sk);
|
||||
release_sock(sk);
|
||||
sock_put(sk);
|
||||
@@ -1,82 +0,0 @@
|
||||
From 1e311820ec3055e3f08e687de6564692a7cec675 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Fainelli <florian@openwrt.org>
|
||||
Date: Mon, 28 Jan 2013 20:06:29 +0100
|
||||
Subject: [PATCH 11/12] USB: EHCI: add ignore_oc flag to disable overcurrent
|
||||
checking
|
||||
|
||||
This patch adds an ignore_oc flag which can be set by EHCI controller
|
||||
not supporting or wanting to disable overcurrent checking. The EHCI
|
||||
platform data in include/linux/usb/ehci_pdriver.h is also augmented to
|
||||
take advantage of this new flag.
|
||||
|
||||
Signed-off-by: Florian Fainelli <florian@openwrt.org>
|
||||
---
|
||||
drivers/usb/host/ehci-hcd.c | 2 +-
|
||||
drivers/usb/host/ehci-hub.c | 4 ++--
|
||||
drivers/usb/host/ehci-platform.c | 1 +
|
||||
drivers/usb/host/ehci.h | 1 +
|
||||
include/linux/usb/ehci_pdriver.h | 1 +
|
||||
5 files changed, 6 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/usb/host/ehci-hcd.c
|
||||
+++ b/drivers/usb/host/ehci-hcd.c
|
||||
@@ -638,7 +638,7 @@ static int ehci_run (struct usb_hcd *hcd
|
||||
"USB %x.%x started, EHCI %x.%02x%s\n",
|
||||
((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f),
|
||||
temp >> 8, temp & 0xff,
|
||||
- ignore_oc ? ", overcurrent ignored" : "");
|
||||
+ (ignore_oc || ehci->ignore_oc) ? ", overcurrent ignored" : "");
|
||||
|
||||
ehci_writel(ehci, INTR_MASK,
|
||||
&ehci->regs->intr_enable); /* Turn On Interrupts */
|
||||
--- a/drivers/usb/host/ehci-hub.c
|
||||
+++ b/drivers/usb/host/ehci-hub.c
|
||||
@@ -633,7 +633,7 @@ ehci_hub_status_data (struct usb_hcd *hc
|
||||
* always set, seem to clear PORT_OCC and PORT_CSC when writing to
|
||||
* PORT_POWER; that's surprising, but maybe within-spec.
|
||||
*/
|
||||
- if (!ignore_oc)
|
||||
+ if (!ignore_oc && !ehci->ignore_oc)
|
||||
mask = PORT_CSC | PORT_PEC | PORT_OCC;
|
||||
else
|
||||
mask = PORT_CSC | PORT_PEC;
|
||||
@@ -995,7 +995,7 @@ int ehci_hub_control(
|
||||
if (temp & PORT_PEC)
|
||||
status |= USB_PORT_STAT_C_ENABLE << 16;
|
||||
|
||||
- if ((temp & PORT_OCC) && !ignore_oc){
|
||||
+ if ((temp & PORT_OCC) && (!ignore_oc && !ehci->ignore_oc)){
|
||||
status |= USB_PORT_STAT_C_OVERCURRENT << 16;
|
||||
|
||||
/*
|
||||
--- a/drivers/usb/host/ehci-platform.c
|
||||
+++ b/drivers/usb/host/ehci-platform.c
|
||||
@@ -264,6 +264,8 @@ static int ehci_platform_probe(struct pl
|
||||
ehci->big_endian_desc = 1;
|
||||
if (pdata->big_endian_mmio)
|
||||
ehci->big_endian_mmio = 1;
|
||||
+ if (pdata->ignore_oc)
|
||||
+ ehci->ignore_oc = 1;
|
||||
|
||||
#ifndef CONFIG_USB_EHCI_BIG_ENDIAN_MMIO
|
||||
if (ehci->big_endian_mmio) {
|
||||
--- a/drivers/usb/host/ehci.h
|
||||
+++ b/drivers/usb/host/ehci.h
|
||||
@@ -226,6 +226,7 @@ struct ehci_hcd { /* one per controlle
|
||||
unsigned frame_index_bug:1; /* MosChip (AKA NetMos) */
|
||||
unsigned need_oc_pp_cycle:1; /* MPC834X port power */
|
||||
unsigned imx28_write_fix:1; /* For Freescale i.MX28 */
|
||||
+ unsigned ignore_oc:1;
|
||||
|
||||
/* required for usb32 quirk */
|
||||
#define OHCI_CTRL_HCFS (3 << 6)
|
||||
--- a/include/linux/usb/ehci_pdriver.h
|
||||
+++ b/include/linux/usb/ehci_pdriver.h
|
||||
@@ -49,6 +49,7 @@ struct usb_ehci_pdata {
|
||||
unsigned no_io_watchdog:1;
|
||||
unsigned reset_on_resume:1;
|
||||
unsigned dma_mask_64:1;
|
||||
+ unsigned ignore_oc:1;
|
||||
|
||||
/* Turn on all power and clocks */
|
||||
int (*power_on)(struct platform_device *pdev);
|
||||
@@ -1,86 +0,0 @@
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
Date: Fri, 10 Apr 2015 13:35:29 +0200
|
||||
Subject: [PATCH] jffs2: use .rename2 and add RENAME_WHITEOUT support
|
||||
|
||||
It is required for renames on overlayfs
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
---
|
||||
|
||||
--- a/fs/jffs2/dir.c
|
||||
+++ b/fs/jffs2/dir.c
|
||||
@@ -35,7 +35,7 @@ static int jffs2_mkdir (struct inode *,s
|
||||
static int jffs2_rmdir (struct inode *,struct dentry *);
|
||||
static int jffs2_mknod (struct inode *,struct dentry *,umode_t,dev_t);
|
||||
static int jffs2_rename (struct inode *, struct dentry *,
|
||||
- struct inode *, struct dentry *);
|
||||
+ struct inode *, struct dentry *, unsigned int);
|
||||
|
||||
const struct file_operations jffs2_dir_operations =
|
||||
{
|
||||
@@ -57,7 +57,7 @@ const struct inode_operations jffs2_dir_
|
||||
.mkdir = jffs2_mkdir,
|
||||
.rmdir = jffs2_rmdir,
|
||||
.mknod = jffs2_mknod,
|
||||
- .rename = jffs2_rename,
|
||||
+ .rename2 = jffs2_rename,
|
||||
.get_acl = jffs2_get_acl,
|
||||
.set_acl = jffs2_set_acl,
|
||||
.setattr = jffs2_setattr,
|
||||
@@ -756,8 +756,27 @@ static int jffs2_mknod (struct inode *di
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static int jffs2_whiteout(struct inode *old_dir, struct dentry *old_dentry)
|
||||
+{
|
||||
+ struct dentry *wh;
|
||||
+ int err;
|
||||
+
|
||||
+ wh = d_alloc(old_dentry->d_parent, &old_dentry->d_name);
|
||||
+ if (!wh)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ err = jffs2_mknod(old_dir, wh, S_IFCHR | WHITEOUT_MODE,
|
||||
+ WHITEOUT_DEV);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ d_rehash(wh);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
|
||||
- struct inode *new_dir_i, struct dentry *new_dentry)
|
||||
+ struct inode *new_dir_i, struct dentry *new_dentry,
|
||||
+ unsigned int flags)
|
||||
{
|
||||
int ret;
|
||||
struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
|
||||
@@ -765,6 +784,9 @@ static int jffs2_rename (struct inode *o
|
||||
uint8_t type;
|
||||
uint32_t now;
|
||||
|
||||
+ if (flags & ~RENAME_WHITEOUT)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
/* The VFS will check for us and prevent trying to rename a
|
||||
* file over a directory and vice versa, but if it's a directory,
|
||||
* the VFS can't check whether the victim is empty. The filesystem
|
||||
@@ -828,9 +850,14 @@ static int jffs2_rename (struct inode *o
|
||||
if (d_is_dir(old_dentry) && !victim_f)
|
||||
inc_nlink(new_dir_i);
|
||||
|
||||
- /* Unlink the original */
|
||||
- ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
|
||||
- old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
|
||||
+ if (flags & RENAME_WHITEOUT)
|
||||
+ /* Replace with whiteout */
|
||||
+ ret = jffs2_whiteout(old_dir_i, old_dentry);
|
||||
+ else
|
||||
+ /* Unlink the original */
|
||||
+ ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
|
||||
+ old_dentry->d_name.name,
|
||||
+ old_dentry->d_name.len, NULL, now);
|
||||
|
||||
/* We don't touch inode->i_nlink */
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
Date: Sat, 25 Apr 2015 12:41:32 +0200
|
||||
Subject: [PATCH] jffs2: add RENAME_EXCHANGE support
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
---
|
||||
|
||||
--- a/fs/jffs2/dir.c
|
||||
+++ b/fs/jffs2/dir.c
|
||||
@@ -784,7 +784,7 @@ static int jffs2_rename (struct inode *o
|
||||
uint8_t type;
|
||||
uint32_t now;
|
||||
|
||||
- if (flags & ~RENAME_WHITEOUT)
|
||||
+ if (flags & ~(RENAME_WHITEOUT | RENAME_EXCHANGE))
|
||||
return -EINVAL;
|
||||
|
||||
/* The VFS will check for us and prevent trying to rename a
|
||||
@@ -792,7 +792,7 @@ static int jffs2_rename (struct inode *o
|
||||
* the VFS can't check whether the victim is empty. The filesystem
|
||||
* needs to do that for itself.
|
||||
*/
|
||||
- if (new_dentry->d_inode) {
|
||||
+ if (new_dentry->d_inode && !(flags & RENAME_EXCHANGE)) {
|
||||
victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
|
||||
if (d_is_dir(new_dentry)) {
|
||||
struct jffs2_full_dirent *fd;
|
||||
@@ -827,7 +827,7 @@ static int jffs2_rename (struct inode *o
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- if (victim_f) {
|
||||
+ if (victim_f && !(flags & RENAME_EXCHANGE)) {
|
||||
/* There was a victim. Kill it off nicely */
|
||||
if (d_is_dir(new_dentry))
|
||||
clear_nlink(new_dentry->d_inode);
|
||||
@@ -853,6 +853,12 @@ static int jffs2_rename (struct inode *o
|
||||
if (flags & RENAME_WHITEOUT)
|
||||
/* Replace with whiteout */
|
||||
ret = jffs2_whiteout(old_dir_i, old_dentry);
|
||||
+ else if (flags & RENAME_EXCHANGE)
|
||||
+ /* Replace the original */
|
||||
+ ret = jffs2_do_link(c, JFFS2_INODE_INFO(old_dir_i),
|
||||
+ new_dentry->d_inode->i_ino, type,
|
||||
+ old_dentry->d_name.name, old_dentry->d_name.len,
|
||||
+ now);
|
||||
else
|
||||
/* Unlink the original */
|
||||
ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
|
||||
@@ -879,7 +885,7 @@ static int jffs2_rename (struct inode *o
|
||||
return ret;
|
||||
}
|
||||
|
||||
- if (d_is_dir(old_dentry))
|
||||
+ if (d_is_dir(old_dentry) && !(flags & RENAME_EXCHANGE))
|
||||
drop_nlink(old_dir_i);
|
||||
|
||||
new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
|
||||
@@ -1,54 +0,0 @@
|
||||
From: Stephen Hemminger <stephen@networkplumber.org>
|
||||
Subject: bridge: allow receiption on disabled port
|
||||
|
||||
When an ethernet device is enslaved to a bridge, and the bridge STP
|
||||
detects loss of carrier (or operational state down), then normally
|
||||
packet receiption is blocked.
|
||||
|
||||
This breaks control applications like WPA which maybe expecting to
|
||||
receive packets to negotiate to bring link up. The bridge needs to
|
||||
block forwarding packets from these disabled ports, but there is no
|
||||
hard requirement to not allow local packet delivery.
|
||||
|
||||
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
|
||||
--- a/net/bridge/br_input.c
|
||||
+++ b/net/bridge/br_input.c
|
||||
@@ -207,11 +207,13 @@ EXPORT_SYMBOL_GPL(br_handle_frame_finish
|
||||
static int br_handle_local_finish(struct sk_buff *skb)
|
||||
{
|
||||
struct net_bridge_port *p = br_port_get_rcu(skb->dev);
|
||||
- u16 vid = 0;
|
||||
+ if (p->state != BR_STATE_DISABLED) {
|
||||
+ u16 vid = 0;
|
||||
|
||||
- /* check if vlan is allowed, to avoid spoofing */
|
||||
- if (p->flags & BR_LEARNING && br_should_learn(p, skb, &vid))
|
||||
- br_fdb_update(p->br, p, eth_hdr(skb)->h_source, vid, false);
|
||||
+ /* check if vlan is allowed, to avoid spoofing */
|
||||
+ if (p->flags & BR_LEARNING && br_should_learn(p, skb, &vid))
|
||||
+ br_fdb_update(p->br, p, eth_hdr(skb)->h_source, vid, false);
|
||||
+ }
|
||||
return 0; /* process further */
|
||||
}
|
||||
|
||||
@@ -285,6 +287,18 @@ rx_handler_result_t br_handle_frame(stru
|
||||
|
||||
forward:
|
||||
switch (p->state) {
|
||||
+ case BR_STATE_DISABLED:
|
||||
+ if (ether_addr_equal(p->br->dev->dev_addr, dest))
|
||||
+ skb->pkt_type = PACKET_HOST;
|
||||
+
|
||||
+ if (NF_HOOK(NFPROTO_BRIDGE, NF_BR_PRE_ROUTING, skb, skb->dev, NULL,
|
||||
+ br_handle_local_finish))
|
||||
+ break;
|
||||
+
|
||||
+ BR_INPUT_SKB_CB(skb)->brdev = p->br->dev;
|
||||
+ br_pass_frame_up(skb);
|
||||
+ break;
|
||||
+
|
||||
case BR_STATE_FORWARDING:
|
||||
rhook = rcu_dereference(br_should_route_hook);
|
||||
if (rhook) {
|
||||
@@ -1,693 +0,0 @@
|
||||
From 2c58080407554e1bac8fd50d23cb02420524caed Mon Sep 17 00:00:00 2001
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
Date: Mon, 12 Aug 2013 12:50:22 +0200
|
||||
Subject: [PATCH] MIPS: partially inline dma ops
|
||||
|
||||
Several DMA ops are no-op on many platforms, and the indirection through
|
||||
the mips_dma_map_ops function table is causing the compiler to emit
|
||||
unnecessary code.
|
||||
|
||||
Inlining visibly improves network performance in my tests (on a 24Kc
|
||||
based system), and also slightly reduces code size of a few drivers.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
---
|
||||
arch/mips/Kconfig | 4 +
|
||||
arch/mips/include/asm/dma-mapping.h | 360 +++++++++++++++++++++++++++++++++++-
|
||||
arch/mips/mm/dma-default.c | 163 ++--------------
|
||||
3 files changed, 373 insertions(+), 154 deletions(-)
|
||||
|
||||
--- a/arch/mips/Kconfig
|
||||
+++ b/arch/mips/Kconfig
|
||||
@@ -1526,6 +1526,7 @@ config CPU_CAVIUM_OCTEON
|
||||
select CPU_SUPPORTS_HUGEPAGES
|
||||
select USB_EHCI_BIG_ENDIAN_MMIO
|
||||
select MIPS_L1_CACHE_SHIFT_7
|
||||
+ select SYS_HAS_DMA_OPS
|
||||
help
|
||||
The Cavium Octeon processor is a highly integrated chip containing
|
||||
many ethernet hardware widgets for networking tasks. The processor
|
||||
@@ -1790,6 +1791,9 @@ config MIPS_MALTA_PM
|
||||
bool
|
||||
default y
|
||||
|
||||
+config SYS_HAS_DMA_OPS
|
||||
+ bool
|
||||
+
|
||||
#
|
||||
# CPU may reorder R->R, R->W, W->R, W->W
|
||||
# Reordering beyond LL and SC is handled in WEAK_REORDERING_BEYOND_LLSC
|
||||
--- a/arch/mips/include/asm/dma-mapping.h
|
||||
+++ b/arch/mips/include/asm/dma-mapping.h
|
||||
@@ -1,9 +1,16 @@
|
||||
#ifndef _ASM_DMA_MAPPING_H
|
||||
#define _ASM_DMA_MAPPING_H
|
||||
|
||||
+#include <linux/kmemcheck.h>
|
||||
+#include <linux/bug.h>
|
||||
+#include <linux/scatterlist.h>
|
||||
+#include <linux/dma-debug.h>
|
||||
+#include <linux/dma-attrs.h>
|
||||
+
|
||||
#include <asm/scatterlist.h>
|
||||
#include <asm/dma-coherence.h>
|
||||
#include <asm/cache.h>
|
||||
+#include <asm/cpu-type.h>
|
||||
#include <asm-generic/dma-coherent.h>
|
||||
|
||||
#ifndef CONFIG_SGI_IP27 /* Kludge to fix 2.6.39 build for IP27 */
|
||||
@@ -12,12 +19,48 @@
|
||||
|
||||
extern struct dma_map_ops *mips_dma_map_ops;
|
||||
|
||||
+void __dma_sync(struct page *page, unsigned long offset, size_t size,
|
||||
+ enum dma_data_direction direction);
|
||||
+void *mips_dma_alloc_coherent(struct device *dev, size_t size,
|
||||
+ dma_addr_t *dma_handle, gfp_t gfp,
|
||||
+ struct dma_attrs *attrs);
|
||||
+void mips_dma_free_coherent(struct device *dev, size_t size, void *vaddr,
|
||||
+ dma_addr_t dma_handle, struct dma_attrs *attrs);
|
||||
+
|
||||
static inline struct dma_map_ops *get_dma_ops(struct device *dev)
|
||||
{
|
||||
+#ifdef CONFIG_SYS_HAS_DMA_OPS
|
||||
if (dev && dev->archdata.dma_ops)
|
||||
return dev->archdata.dma_ops;
|
||||
else
|
||||
return mips_dma_map_ops;
|
||||
+#else
|
||||
+ return NULL;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Warning on the terminology - Linux calls an uncached area coherent;
|
||||
+ * MIPS terminology calls memory areas with hardware maintained coherency
|
||||
+ * coherent.
|
||||
+ */
|
||||
+
|
||||
+static inline int cpu_needs_post_dma_flush(struct device *dev)
|
||||
+{
|
||||
+#ifndef CONFIG_SYS_HAS_CPU_R10000
|
||||
+ return 0;
|
||||
+#endif
|
||||
+ return !plat_device_is_coherent(dev) &&
|
||||
+ (boot_cpu_type() == CPU_R10000 ||
|
||||
+ boot_cpu_type() == CPU_R12000 ||
|
||||
+ boot_cpu_type() == CPU_BMIPS5000);
|
||||
+}
|
||||
+
|
||||
+static inline struct page *dma_addr_to_page(struct device *dev,
|
||||
+ dma_addr_t dma_addr)
|
||||
+{
|
||||
+ return pfn_to_page(
|
||||
+ plat_dma_addr_to_phys(dev, dma_addr) >> PAGE_SHIFT);
|
||||
}
|
||||
|
||||
static inline bool dma_capable(struct device *dev, dma_addr_t addr, size_t size)
|
||||
@@ -30,12 +73,304 @@ static inline bool dma_capable(struct de
|
||||
|
||||
static inline void dma_mark_clean(void *addr, size_t size) {}
|
||||
|
||||
-#include <asm-generic/dma-mapping-common.h>
|
||||
+static inline dma_addr_t dma_map_single_attrs(struct device *dev, void *ptr,
|
||||
+ size_t size,
|
||||
+ enum dma_data_direction dir,
|
||||
+ struct dma_attrs *attrs)
|
||||
+{
|
||||
+ struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
+ unsigned long offset = (unsigned long)ptr & ~PAGE_MASK;
|
||||
+ struct page *page = virt_to_page(ptr);
|
||||
+ dma_addr_t addr;
|
||||
+
|
||||
+ kmemcheck_mark_initialized(ptr, size);
|
||||
+ BUG_ON(!valid_dma_direction(dir));
|
||||
+ if (ops) {
|
||||
+ addr = ops->map_page(dev, page, offset, size, dir, attrs);
|
||||
+ } else {
|
||||
+ if (!plat_device_is_coherent(dev))
|
||||
+ __dma_sync(page, offset, size, dir);
|
||||
+
|
||||
+ addr = plat_map_dma_mem_page(dev, page) + offset;
|
||||
+ }
|
||||
+ debug_dma_map_page(dev, page, offset, size, dir, addr, true);
|
||||
+ return addr;
|
||||
+}
|
||||
+
|
||||
+static inline void dma_unmap_single_attrs(struct device *dev, dma_addr_t addr,
|
||||
+ size_t size,
|
||||
+ enum dma_data_direction dir,
|
||||
+ struct dma_attrs *attrs)
|
||||
+{
|
||||
+ struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
+
|
||||
+ BUG_ON(!valid_dma_direction(dir));
|
||||
+ if (ops) {
|
||||
+ ops->unmap_page(dev, addr, size, dir, attrs);
|
||||
+ } else {
|
||||
+ if (cpu_needs_post_dma_flush(dev))
|
||||
+ __dma_sync(dma_addr_to_page(dev, addr),
|
||||
+ addr & ~PAGE_MASK, size, dir);
|
||||
+
|
||||
+ plat_unmap_dma_mem(dev, addr, size, dir);
|
||||
+ }
|
||||
+ debug_dma_unmap_page(dev, addr, size, dir, true);
|
||||
+}
|
||||
+
|
||||
+static inline int dma_map_sg_attrs(struct device *dev, struct scatterlist *sg,
|
||||
+ int nents, enum dma_data_direction dir,
|
||||
+ struct dma_attrs *attrs)
|
||||
+{
|
||||
+ struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
+ int i, ents;
|
||||
+ struct scatterlist *s;
|
||||
+
|
||||
+ for_each_sg(sg, s, nents, i)
|
||||
+ kmemcheck_mark_initialized(sg_virt(s), s->length);
|
||||
+ BUG_ON(!valid_dma_direction(dir));
|
||||
+ if (ops) {
|
||||
+ ents = ops->map_sg(dev, sg, nents, dir, attrs);
|
||||
+ } else {
|
||||
+ for_each_sg(sg, s, nents, i) {
|
||||
+ struct page *page = sg_page(s);
|
||||
+
|
||||
+ if (!plat_device_is_coherent(dev))
|
||||
+ __dma_sync(page, s->offset, s->length, dir);
|
||||
+#ifdef CONFIG_NEED_SG_DMA_LENGTH
|
||||
+ s->dma_length = s->length;
|
||||
+#endif
|
||||
+ s->dma_address =
|
||||
+ plat_map_dma_mem_page(dev, page) + s->offset;
|
||||
+ }
|
||||
+ ents = nents;
|
||||
+ }
|
||||
+ debug_dma_map_sg(dev, sg, nents, ents, dir);
|
||||
+
|
||||
+ return ents;
|
||||
+}
|
||||
+
|
||||
+static inline void dma_unmap_sg_attrs(struct device *dev, struct scatterlist *sg,
|
||||
+ int nents, enum dma_data_direction dir,
|
||||
+ struct dma_attrs *attrs)
|
||||
+{
|
||||
+ struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
+ struct scatterlist *s;
|
||||
+ int i;
|
||||
+
|
||||
+ BUG_ON(!valid_dma_direction(dir));
|
||||
+ debug_dma_unmap_sg(dev, sg, nents, dir);
|
||||
+ if (ops) {
|
||||
+ ops->unmap_sg(dev, sg, nents, dir, attrs);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ for_each_sg(sg, s, nents, i) {
|
||||
+ if (!plat_device_is_coherent(dev) && dir != DMA_TO_DEVICE)
|
||||
+ __dma_sync(sg_page(s), s->offset, s->length, dir);
|
||||
+ plat_unmap_dma_mem(dev, s->dma_address, s->length, dir);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static inline dma_addr_t dma_map_page(struct device *dev, struct page *page,
|
||||
+ size_t offset, size_t size,
|
||||
+ enum dma_data_direction dir)
|
||||
+{
|
||||
+ struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
+ dma_addr_t addr;
|
||||
+
|
||||
+ kmemcheck_mark_initialized(page_address(page) + offset, size);
|
||||
+ BUG_ON(!valid_dma_direction(dir));
|
||||
+ if (ops) {
|
||||
+ addr = ops->map_page(dev, page, offset, size, dir, NULL);
|
||||
+ } else {
|
||||
+ if (!plat_device_is_coherent(dev))
|
||||
+ __dma_sync(page, offset, size, dir);
|
||||
+
|
||||
+ addr = plat_map_dma_mem_page(dev, page) + offset;
|
||||
+ }
|
||||
+ debug_dma_map_page(dev, page, offset, size, dir, addr, false);
|
||||
+
|
||||
+ return addr;
|
||||
+}
|
||||
+
|
||||
+static inline void dma_unmap_page(struct device *dev, dma_addr_t addr,
|
||||
+ size_t size, enum dma_data_direction dir)
|
||||
+{
|
||||
+ struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
+
|
||||
+ BUG_ON(!valid_dma_direction(dir));
|
||||
+ if (ops) {
|
||||
+ ops->unmap_page(dev, addr, size, dir, NULL);
|
||||
+ } else {
|
||||
+ if (cpu_needs_post_dma_flush(dev))
|
||||
+ __dma_sync(dma_addr_to_page(dev, addr),
|
||||
+ addr & ~PAGE_MASK, size, dir);
|
||||
+
|
||||
+ plat_unmap_dma_mem(dev, addr, size, dir);
|
||||
+ }
|
||||
+ debug_dma_unmap_page(dev, addr, size, dir, false);
|
||||
+}
|
||||
+
|
||||
+static inline void dma_sync_single_for_cpu(struct device *dev, dma_addr_t addr,
|
||||
+ size_t size,
|
||||
+ enum dma_data_direction dir)
|
||||
+{
|
||||
+ struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
+
|
||||
+ BUG_ON(!valid_dma_direction(dir));
|
||||
+ if (ops)
|
||||
+ ops->sync_single_for_cpu(dev, addr, size, dir);
|
||||
+ else if (cpu_needs_post_dma_flush(dev))
|
||||
+ __dma_sync(dma_addr_to_page(dev, addr),
|
||||
+ addr & ~PAGE_MASK, size, dir);
|
||||
+ debug_dma_sync_single_for_cpu(dev, addr, size, dir);
|
||||
+}
|
||||
+
|
||||
+static inline void dma_sync_single_for_device(struct device *dev,
|
||||
+ dma_addr_t addr, size_t size,
|
||||
+ enum dma_data_direction dir)
|
||||
+{
|
||||
+ struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
+
|
||||
+ BUG_ON(!valid_dma_direction(dir));
|
||||
+ if (ops)
|
||||
+ ops->sync_single_for_device(dev, addr, size, dir);
|
||||
+ else if (!plat_device_is_coherent(dev))
|
||||
+ __dma_sync(dma_addr_to_page(dev, addr),
|
||||
+ addr & ~PAGE_MASK, size, dir);
|
||||
+ debug_dma_sync_single_for_device(dev, addr, size, dir);
|
||||
+}
|
||||
+
|
||||
+static inline void dma_sync_single_range_for_cpu(struct device *dev,
|
||||
+ dma_addr_t addr,
|
||||
+ unsigned long offset,
|
||||
+ size_t size,
|
||||
+ enum dma_data_direction dir)
|
||||
+{
|
||||
+ const struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
+
|
||||
+ BUG_ON(!valid_dma_direction(dir));
|
||||
+ if (ops)
|
||||
+ ops->sync_single_for_cpu(dev, addr + offset, size, dir);
|
||||
+ else if (cpu_needs_post_dma_flush(dev))
|
||||
+ __dma_sync(dma_addr_to_page(dev, addr + offset),
|
||||
+ (addr + offset) & ~PAGE_MASK, size, dir);
|
||||
+ debug_dma_sync_single_range_for_cpu(dev, addr, offset, size, dir);
|
||||
+}
|
||||
+
|
||||
+static inline void dma_sync_single_range_for_device(struct device *dev,
|
||||
+ dma_addr_t addr,
|
||||
+ unsigned long offset,
|
||||
+ size_t size,
|
||||
+ enum dma_data_direction dir)
|
||||
+{
|
||||
+ const struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
+
|
||||
+ BUG_ON(!valid_dma_direction(dir));
|
||||
+ if (ops)
|
||||
+ ops->sync_single_for_device(dev, addr + offset, size, dir);
|
||||
+ else if (!plat_device_is_coherent(dev))
|
||||
+ __dma_sync(dma_addr_to_page(dev, addr + offset),
|
||||
+ (addr + offset) & ~PAGE_MASK, size, dir);
|
||||
+ debug_dma_sync_single_range_for_device(dev, addr, offset, size, dir);
|
||||
+}
|
||||
+
|
||||
+static inline void
|
||||
+dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg,
|
||||
+ int nelems, enum dma_data_direction dir)
|
||||
+{
|
||||
+ struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
+ struct scatterlist *s;
|
||||
+ int i;
|
||||
+
|
||||
+ BUG_ON(!valid_dma_direction(dir));
|
||||
+ if (ops)
|
||||
+ ops->sync_sg_for_cpu(dev, sg, nelems, dir);
|
||||
+ else if (cpu_needs_post_dma_flush(dev)) {
|
||||
+ for_each_sg(sg, s, nelems, i)
|
||||
+ __dma_sync(sg_page(s), s->offset, s->length, dir);
|
||||
+ }
|
||||
+ debug_dma_sync_sg_for_cpu(dev, sg, nelems, dir);
|
||||
+}
|
||||
+
|
||||
+static inline void
|
||||
+dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg,
|
||||
+ int nelems, enum dma_data_direction dir)
|
||||
+{
|
||||
+ struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
+ struct scatterlist *s;
|
||||
+ int i;
|
||||
+
|
||||
+ BUG_ON(!valid_dma_direction(dir));
|
||||
+ if (ops)
|
||||
+ ops->sync_sg_for_device(dev, sg, nelems, dir);
|
||||
+ else if (!plat_device_is_coherent(dev)) {
|
||||
+ for_each_sg(sg, s, nelems, i)
|
||||
+ __dma_sync(sg_page(s), s->offset, s->length, dir);
|
||||
+ }
|
||||
+ debug_dma_sync_sg_for_device(dev, sg, nelems, dir);
|
||||
+
|
||||
+}
|
||||
+
|
||||
+#define dma_map_single(d, a, s, r) dma_map_single_attrs(d, a, s, r, NULL)
|
||||
+#define dma_unmap_single(d, a, s, r) dma_unmap_single_attrs(d, a, s, r, NULL)
|
||||
+#define dma_map_sg(d, s, n, r) dma_map_sg_attrs(d, s, n, r, NULL)
|
||||
+#define dma_unmap_sg(d, s, n, r) dma_unmap_sg_attrs(d, s, n, r, NULL)
|
||||
+
|
||||
+extern int dma_common_mmap(struct device *dev, struct vm_area_struct *vma,
|
||||
+ void *cpu_addr, dma_addr_t dma_addr, size_t size);
|
||||
+
|
||||
+/**
|
||||
+ * dma_mmap_attrs - map a coherent DMA allocation into user space
|
||||
+ * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
|
||||
+ * @vma: vm_area_struct describing requested user mapping
|
||||
+ * @cpu_addr: kernel CPU-view address returned from dma_alloc_attrs
|
||||
+ * @handle: device-view address returned from dma_alloc_attrs
|
||||
+ * @size: size of memory originally requested in dma_alloc_attrs
|
||||
+ * @attrs: attributes of mapping properties requested in dma_alloc_attrs
|
||||
+ *
|
||||
+ * Map a coherent DMA buffer previously allocated by dma_alloc_attrs
|
||||
+ * into user space. The coherent DMA buffer must not be freed by the
|
||||
+ * driver until the user space mapping has been released.
|
||||
+ */
|
||||
+static inline int
|
||||
+dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, void *cpu_addr,
|
||||
+ dma_addr_t dma_addr, size_t size, struct dma_attrs *attrs)
|
||||
+{
|
||||
+ struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
+ BUG_ON(!ops);
|
||||
+ if (ops && ops->mmap)
|
||||
+ return ops->mmap(dev, vma, cpu_addr, dma_addr, size, attrs);
|
||||
+ return dma_common_mmap(dev, vma, cpu_addr, dma_addr, size);
|
||||
+}
|
||||
+
|
||||
+#define dma_mmap_coherent(d, v, c, h, s) dma_mmap_attrs(d, v, c, h, s, NULL)
|
||||
+
|
||||
+int
|
||||
+dma_common_get_sgtable(struct device *dev, struct sg_table *sgt,
|
||||
+ void *cpu_addr, dma_addr_t dma_addr, size_t size);
|
||||
+
|
||||
+static inline int
|
||||
+dma_get_sgtable_attrs(struct device *dev, struct sg_table *sgt, void *cpu_addr,
|
||||
+ dma_addr_t dma_addr, size_t size, struct dma_attrs *attrs)
|
||||
+{
|
||||
+ struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
+ BUG_ON(!ops);
|
||||
+ if (ops && ops->get_sgtable)
|
||||
+ return ops->get_sgtable(dev, sgt, cpu_addr, dma_addr, size,
|
||||
+ attrs);
|
||||
+ return dma_common_get_sgtable(dev, sgt, cpu_addr, dma_addr, size);
|
||||
+}
|
||||
+
|
||||
+#define dma_get_sgtable(d, t, v, h, s) dma_get_sgtable_attrs(d, t, v, h, s, NULL)
|
||||
+
|
||||
|
||||
static inline int dma_supported(struct device *dev, u64 mask)
|
||||
{
|
||||
struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
- return ops->dma_supported(dev, mask);
|
||||
+ if (ops)
|
||||
+ return ops->dma_supported(dev, mask);
|
||||
+ return plat_dma_supported(dev, mask);
|
||||
}
|
||||
|
||||
static inline int dma_mapping_error(struct device *dev, u64 mask)
|
||||
@@ -43,7 +378,9 @@ static inline int dma_mapping_error(stru
|
||||
struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
|
||||
debug_dma_mapping_error(dev, mask);
|
||||
- return ops->mapping_error(dev, mask);
|
||||
+ if (ops)
|
||||
+ return ops->mapping_error(dev, mask);
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
@@ -54,7 +391,7 @@ dma_set_mask(struct device *dev, u64 mas
|
||||
if(!dev->dma_mask || !dma_supported(dev, mask))
|
||||
return -EIO;
|
||||
|
||||
- if (ops->set_dma_mask)
|
||||
+ if (ops && ops->set_dma_mask)
|
||||
return ops->set_dma_mask(dev, mask);
|
||||
|
||||
*dev->dma_mask = mask;
|
||||
@@ -74,7 +411,11 @@ static inline void *dma_alloc_attrs(stru
|
||||
void *ret;
|
||||
struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
|
||||
- ret = ops->alloc(dev, size, dma_handle, gfp, attrs);
|
||||
+ if (ops)
|
||||
+ ret = ops->alloc(dev, size, dma_handle, gfp, attrs);
|
||||
+ else
|
||||
+ ret = mips_dma_alloc_coherent(dev, size, dma_handle, gfp,
|
||||
+ attrs);
|
||||
|
||||
debug_dma_alloc_coherent(dev, size, *dma_handle, ret);
|
||||
|
||||
@@ -89,7 +430,10 @@ static inline void dma_free_attrs(struct
|
||||
{
|
||||
struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
|
||||
- ops->free(dev, size, vaddr, dma_handle, attrs);
|
||||
+ if (ops)
|
||||
+ ops->free(dev, size, vaddr, dma_handle, attrs);
|
||||
+ else
|
||||
+ mips_dma_free_coherent(dev, size, vaddr, dma_handle, attrs);
|
||||
|
||||
debug_dma_free_coherent(dev, size, vaddr, dma_handle);
|
||||
}
|
||||
--- a/arch/mips/mm/dma-default.c
|
||||
+++ b/arch/mips/mm/dma-default.c
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
#ifdef CONFIG_DMA_MAYBE_COHERENT
|
||||
int coherentio = 0; /* User defined DMA coherency from command line. */
|
||||
-EXPORT_SYMBOL_GPL(coherentio);
|
||||
+EXPORT_SYMBOL(coherentio);
|
||||
int hw_coherentio = 0; /* Actual hardware supported DMA coherency setting. */
|
||||
|
||||
static int __init setcoherentio(char *str)
|
||||
@@ -46,35 +46,6 @@ static int __init setnocoherentio(char *
|
||||
early_param("nocoherentio", setnocoherentio);
|
||||
#endif
|
||||
|
||||
-static inline struct page *dma_addr_to_page(struct device *dev,
|
||||
- dma_addr_t dma_addr)
|
||||
-{
|
||||
- return pfn_to_page(
|
||||
- plat_dma_addr_to_phys(dev, dma_addr) >> PAGE_SHIFT);
|
||||
-}
|
||||
-
|
||||
-/*
|
||||
- * The affected CPUs below in 'cpu_needs_post_dma_flush()' can
|
||||
- * speculatively fill random cachelines with stale data at any time,
|
||||
- * requiring an extra flush post-DMA.
|
||||
- *
|
||||
- * Warning on the terminology - Linux calls an uncached area coherent;
|
||||
- * MIPS terminology calls memory areas with hardware maintained coherency
|
||||
- * coherent.
|
||||
- *
|
||||
- * Note that the R14000 and R16000 should also be checked for in this
|
||||
- * condition. However this function is only called on non-I/O-coherent
|
||||
- * systems and only the R10000 and R12000 are used in such systems, the
|
||||
- * SGI IP28 Indigo² rsp. SGI IP32 aka O2.
|
||||
- */
|
||||
-static inline int cpu_needs_post_dma_flush(struct device *dev)
|
||||
-{
|
||||
- return !plat_device_is_coherent(dev) &&
|
||||
- (boot_cpu_type() == CPU_R10000 ||
|
||||
- boot_cpu_type() == CPU_R12000 ||
|
||||
- boot_cpu_type() == CPU_BMIPS5000);
|
||||
-}
|
||||
-
|
||||
static gfp_t massage_gfp_flags(const struct device *dev, gfp_t gfp)
|
||||
{
|
||||
gfp_t dma_flag;
|
||||
@@ -130,8 +101,9 @@ void *dma_alloc_noncoherent(struct devic
|
||||
}
|
||||
EXPORT_SYMBOL(dma_alloc_noncoherent);
|
||||
|
||||
-static void *mips_dma_alloc_coherent(struct device *dev, size_t size,
|
||||
- dma_addr_t * dma_handle, gfp_t gfp, struct dma_attrs *attrs)
|
||||
+void *mips_dma_alloc_coherent(struct device *dev, size_t size,
|
||||
+ dma_addr_t *dma_handle, gfp_t gfp,
|
||||
+ struct dma_attrs *attrs)
|
||||
{
|
||||
void *ret;
|
||||
struct page *page = NULL;
|
||||
@@ -162,6 +134,7 @@ static void *mips_dma_alloc_coherent(str
|
||||
|
||||
return ret;
|
||||
}
|
||||
+EXPORT_SYMBOL(mips_dma_alloc_coherent);
|
||||
|
||||
|
||||
void dma_free_noncoherent(struct device *dev, size_t size, void *vaddr,
|
||||
@@ -172,8 +145,8 @@ void dma_free_noncoherent(struct device
|
||||
}
|
||||
EXPORT_SYMBOL(dma_free_noncoherent);
|
||||
|
||||
-static void mips_dma_free_coherent(struct device *dev, size_t size, void *vaddr,
|
||||
- dma_addr_t dma_handle, struct dma_attrs *attrs)
|
||||
+void mips_dma_free_coherent(struct device *dev, size_t size, void *vaddr,
|
||||
+ dma_addr_t dma_handle, struct dma_attrs *attrs)
|
||||
{
|
||||
unsigned long addr = (unsigned long) vaddr;
|
||||
int order = get_order(size);
|
||||
@@ -193,6 +166,7 @@ static void mips_dma_free_coherent(struc
|
||||
if (!dma_release_from_contiguous(dev, page, count))
|
||||
__free_pages(page, get_order(size));
|
||||
}
|
||||
+EXPORT_SYMBOL(mips_dma_free_coherent);
|
||||
|
||||
static inline void __dma_sync_virtual(void *addr, size_t size,
|
||||
enum dma_data_direction direction)
|
||||
@@ -221,8 +195,8 @@ static inline void __dma_sync_virtual(vo
|
||||
* If highmem is not configured then the bulk of this loop gets
|
||||
* optimized out.
|
||||
*/
|
||||
-static inline void __dma_sync(struct page *page,
|
||||
- unsigned long offset, size_t size, enum dma_data_direction direction)
|
||||
+void __dma_sync(struct page *page, unsigned long offset, size_t size,
|
||||
+ enum dma_data_direction direction)
|
||||
{
|
||||
size_t left = size;
|
||||
|
||||
@@ -251,108 +225,7 @@ static inline void __dma_sync(struct pag
|
||||
left -= len;
|
||||
} while (left);
|
||||
}
|
||||
-
|
||||
-static void mips_dma_unmap_page(struct device *dev, dma_addr_t dma_addr,
|
||||
- size_t size, enum dma_data_direction direction, struct dma_attrs *attrs)
|
||||
-{
|
||||
- if (cpu_needs_post_dma_flush(dev))
|
||||
- __dma_sync(dma_addr_to_page(dev, dma_addr),
|
||||
- dma_addr & ~PAGE_MASK, size, direction);
|
||||
-
|
||||
- plat_unmap_dma_mem(dev, dma_addr, size, direction);
|
||||
-}
|
||||
-
|
||||
-static int mips_dma_map_sg(struct device *dev, struct scatterlist *sg,
|
||||
- int nents, enum dma_data_direction direction, struct dma_attrs *attrs)
|
||||
-{
|
||||
- int i;
|
||||
-
|
||||
- for (i = 0; i < nents; i++, sg++) {
|
||||
- if (!plat_device_is_coherent(dev))
|
||||
- __dma_sync(sg_page(sg), sg->offset, sg->length,
|
||||
- direction);
|
||||
-#ifdef CONFIG_NEED_SG_DMA_LENGTH
|
||||
- sg->dma_length = sg->length;
|
||||
-#endif
|
||||
- sg->dma_address = plat_map_dma_mem_page(dev, sg_page(sg)) +
|
||||
- sg->offset;
|
||||
- }
|
||||
-
|
||||
- return nents;
|
||||
-}
|
||||
-
|
||||
-static dma_addr_t mips_dma_map_page(struct device *dev, struct page *page,
|
||||
- unsigned long offset, size_t size, enum dma_data_direction direction,
|
||||
- struct dma_attrs *attrs)
|
||||
-{
|
||||
- if (!plat_device_is_coherent(dev))
|
||||
- __dma_sync(page, offset, size, direction);
|
||||
-
|
||||
- return plat_map_dma_mem_page(dev, page) + offset;
|
||||
-}
|
||||
-
|
||||
-static void mips_dma_unmap_sg(struct device *dev, struct scatterlist *sg,
|
||||
- int nhwentries, enum dma_data_direction direction,
|
||||
- struct dma_attrs *attrs)
|
||||
-{
|
||||
- int i;
|
||||
-
|
||||
- for (i = 0; i < nhwentries; i++, sg++) {
|
||||
- if (!plat_device_is_coherent(dev) &&
|
||||
- direction != DMA_TO_DEVICE)
|
||||
- __dma_sync(sg_page(sg), sg->offset, sg->length,
|
||||
- direction);
|
||||
- plat_unmap_dma_mem(dev, sg->dma_address, sg->length, direction);
|
||||
- }
|
||||
-}
|
||||
-
|
||||
-static void mips_dma_sync_single_for_cpu(struct device *dev,
|
||||
- dma_addr_t dma_handle, size_t size, enum dma_data_direction direction)
|
||||
-{
|
||||
- if (cpu_needs_post_dma_flush(dev))
|
||||
- __dma_sync(dma_addr_to_page(dev, dma_handle),
|
||||
- dma_handle & ~PAGE_MASK, size, direction);
|
||||
-}
|
||||
-
|
||||
-static void mips_dma_sync_single_for_device(struct device *dev,
|
||||
- dma_addr_t dma_handle, size_t size, enum dma_data_direction direction)
|
||||
-{
|
||||
- if (!plat_device_is_coherent(dev))
|
||||
- __dma_sync(dma_addr_to_page(dev, dma_handle),
|
||||
- dma_handle & ~PAGE_MASK, size, direction);
|
||||
-}
|
||||
-
|
||||
-static void mips_dma_sync_sg_for_cpu(struct device *dev,
|
||||
- struct scatterlist *sg, int nelems, enum dma_data_direction direction)
|
||||
-{
|
||||
- int i;
|
||||
-
|
||||
- if (cpu_needs_post_dma_flush(dev))
|
||||
- for (i = 0; i < nelems; i++, sg++)
|
||||
- __dma_sync(sg_page(sg), sg->offset, sg->length,
|
||||
- direction);
|
||||
-}
|
||||
-
|
||||
-static void mips_dma_sync_sg_for_device(struct device *dev,
|
||||
- struct scatterlist *sg, int nelems, enum dma_data_direction direction)
|
||||
-{
|
||||
- int i;
|
||||
-
|
||||
- if (!plat_device_is_coherent(dev))
|
||||
- for (i = 0; i < nelems; i++, sg++)
|
||||
- __dma_sync(sg_page(sg), sg->offset, sg->length,
|
||||
- direction);
|
||||
-}
|
||||
-
|
||||
-int mips_dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
|
||||
-{
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-int mips_dma_supported(struct device *dev, u64 mask)
|
||||
-{
|
||||
- return plat_dma_supported(dev, mask);
|
||||
-}
|
||||
+EXPORT_SYMBOL(__dma_sync);
|
||||
|
||||
void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
|
||||
enum dma_data_direction direction)
|
||||
@@ -365,23 +238,10 @@ void dma_cache_sync(struct device *dev,
|
||||
|
||||
EXPORT_SYMBOL(dma_cache_sync);
|
||||
|
||||
-static struct dma_map_ops mips_default_dma_map_ops = {
|
||||
- .alloc = mips_dma_alloc_coherent,
|
||||
- .free = mips_dma_free_coherent,
|
||||
- .map_page = mips_dma_map_page,
|
||||
- .unmap_page = mips_dma_unmap_page,
|
||||
- .map_sg = mips_dma_map_sg,
|
||||
- .unmap_sg = mips_dma_unmap_sg,
|
||||
- .sync_single_for_cpu = mips_dma_sync_single_for_cpu,
|
||||
- .sync_single_for_device = mips_dma_sync_single_for_device,
|
||||
- .sync_sg_for_cpu = mips_dma_sync_sg_for_cpu,
|
||||
- .sync_sg_for_device = mips_dma_sync_sg_for_device,
|
||||
- .mapping_error = mips_dma_mapping_error,
|
||||
- .dma_supported = mips_dma_supported
|
||||
-};
|
||||
-
|
||||
-struct dma_map_ops *mips_dma_map_ops = &mips_default_dma_map_ops;
|
||||
+#ifdef CONFIG_SYS_HAS_DMA_OPS
|
||||
+struct dma_map_ops *mips_dma_map_ops = NULL;
|
||||
EXPORT_SYMBOL(mips_dma_map_ops);
|
||||
+#endif
|
||||
|
||||
#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
--- a/scripts/setlocalversion
|
||||
+++ b/scripts/setlocalversion
|
||||
@@ -165,7 +165,7 @@ else
|
||||
# annotated or signed tagged state (as git describe only
|
||||
# looks at signed or annotated tags - git tag -a/-s) and
|
||||
# LOCALVERSION= is not specified
|
||||
- if test "${LOCALVERSION+set}" != "set"; then
|
||||
+ if test "${CONFIG_LOCALVERSION+set}" != "set"; then
|
||||
scm=$(scm_version --short)
|
||||
res="$res${scm:++}"
|
||||
fi
|
||||
@@ -1,14 +0,0 @@
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -614,9 +614,9 @@ include $(srctree)/arch/$(SRCARCH)/Makef
|
||||
KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks,)
|
||||
|
||||
ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
|
||||
-KBUILD_CFLAGS += -Os $(call cc-disable-warning,maybe-uninitialized,)
|
||||
+KBUILD_CFLAGS += -Os $(EXTRA_OPTIMIZATION) $(call cc-disable-warning,maybe-uninitialized,)
|
||||
else
|
||||
-KBUILD_CFLAGS += -O2
|
||||
+KBUILD_CFLAGS += -O2 -fno-reorder-blocks -fno-tree-ch $(EXTRA_OPTIMIZATION)
|
||||
endif
|
||||
|
||||
# Tell gcc to never replace conditional load with a non-conditional one
|
||||
@@ -1,11 +0,0 @@
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -410,7 +410,7 @@ KBUILD_CFLAGS_KERNEL :=
|
||||
KBUILD_AFLAGS := -D__ASSEMBLY__
|
||||
KBUILD_AFLAGS_MODULE := -DMODULE
|
||||
KBUILD_CFLAGS_MODULE := -DMODULE
|
||||
-KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds
|
||||
+KBUILD_LDFLAGS_MODULE = -T $(srctree)/scripts/module-common.lds $(if $(CONFIG_PROFILING),,-s)
|
||||
|
||||
# Read KERNELRELEASE from include/config/kernel.release (if it exists)
|
||||
KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
|
||||
@@ -1,108 +0,0 @@
|
||||
--- a/scripts/kallsyms.c
|
||||
+++ b/scripts/kallsyms.c
|
||||
@@ -58,6 +58,7 @@ static struct addr_range percpu_range =
|
||||
static struct sym_entry *table;
|
||||
static unsigned int table_size, table_cnt;
|
||||
static int all_symbols = 0;
|
||||
+static int uncompressed = 0;
|
||||
static int absolute_percpu = 0;
|
||||
static char symbol_prefix_char = '\0';
|
||||
static unsigned long long kernel_start_addr = 0;
|
||||
@@ -392,6 +393,9 @@ static void write_src(void)
|
||||
|
||||
free(markers);
|
||||
|
||||
+ if (uncompressed)
|
||||
+ return;
|
||||
+
|
||||
output_label("kallsyms_token_table");
|
||||
off = 0;
|
||||
for (i = 0; i < 256; i++) {
|
||||
@@ -450,6 +454,9 @@ static void *find_token(unsigned char *s
|
||||
{
|
||||
int i;
|
||||
|
||||
+ if (uncompressed)
|
||||
+ return NULL;
|
||||
+
|
||||
for (i = 0; i < len - 1; i++) {
|
||||
if (str[i] == token[0] && str[i+1] == token[1])
|
||||
return &str[i];
|
||||
@@ -522,6 +529,9 @@ static void optimize_result(void)
|
||||
{
|
||||
int i, best;
|
||||
|
||||
+ if (uncompressed)
|
||||
+ return;
|
||||
+
|
||||
/* using the '\0' symbol last allows compress_symbols to use standard
|
||||
* fast string functions */
|
||||
for (i = 255; i >= 0; i--) {
|
||||
@@ -692,7 +702,9 @@ int main(int argc, char **argv)
|
||||
} else if (strncmp(argv[i], "--page-offset=", 14) == 0) {
|
||||
const char *p = &argv[i][14];
|
||||
kernel_start_addr = strtoull(p, NULL, 16);
|
||||
- } else
|
||||
+ } else if (strcmp(argv[i], "--uncompressed") == 0)
|
||||
+ uncompressed = 1;
|
||||
+ else
|
||||
usage();
|
||||
}
|
||||
} else if (argc != 1)
|
||||
--- a/init/Kconfig
|
||||
+++ b/init/Kconfig
|
||||
@@ -1324,6 +1324,17 @@ config SYSCTL_ARCH_UNALIGN_ALLOW
|
||||
the unaligned access emulation.
|
||||
see arch/parisc/kernel/unaligned.c for reference
|
||||
|
||||
+config KALLSYMS_UNCOMPRESSED
|
||||
+ bool "Keep kallsyms uncompressed"
|
||||
+ depends on KALLSYMS
|
||||
+ help
|
||||
+ Normally kallsyms contains compressed symbols (using a token table),
|
||||
+ reducing the uncompressed kernel image size. Keeping the symbol table
|
||||
+ uncompressed significantly improves the size of this part in compressed
|
||||
+ kernel images.
|
||||
+
|
||||
+ Say N unless you need compressed kernel images to be small.
|
||||
+
|
||||
config HAVE_PCSPKR_PLATFORM
|
||||
bool
|
||||
|
||||
--- a/scripts/link-vmlinux.sh
|
||||
+++ b/scripts/link-vmlinux.sh
|
||||
@@ -90,6 +90,10 @@ kallsyms()
|
||||
kallsymopt="${kallsymopt} --absolute-percpu"
|
||||
fi
|
||||
|
||||
+ if [ -n "${CONFIG_KALLSYMS_UNCOMPRESSED}" ]; then
|
||||
+ kallsymopt="${kallsymopt} --uncompressed"
|
||||
+ fi
|
||||
+
|
||||
local aflags="${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL} \
|
||||
${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS}"
|
||||
|
||||
--- a/kernel/kallsyms.c
|
||||
+++ b/kernel/kallsyms.c
|
||||
@@ -109,6 +109,11 @@ static unsigned int kallsyms_expand_symb
|
||||
* For every byte on the compressed symbol data, copy the table
|
||||
* entry for that byte.
|
||||
*/
|
||||
+#ifdef CONFIG_KALLSYMS_UNCOMPRESSED
|
||||
+ memcpy(result, data + 1, len - 1);
|
||||
+ result += len - 1;
|
||||
+ len = 0;
|
||||
+#endif
|
||||
while (len) {
|
||||
tptr = &kallsyms_token_table[kallsyms_token_index[*data]];
|
||||
data++;
|
||||
@@ -141,6 +146,9 @@ tail:
|
||||
*/
|
||||
static char kallsyms_get_symbol_type(unsigned int off)
|
||||
{
|
||||
+#ifdef CONFIG_KALLSYMS_UNCOMPRESSED
|
||||
+ return kallsyms_names[off + 1];
|
||||
+#endif
|
||||
/*
|
||||
* Get just the first code, look it up in the token table,
|
||||
* and return the first char from this token.
|
||||
@@ -1,194 +0,0 @@
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
Subject: [PATCH] build: add a hack for removing non-essential module info
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
---
|
||||
--- a/include/linux/module.h
|
||||
+++ b/include/linux/module.h
|
||||
@@ -84,9 +84,10 @@ void trim_init_extable(struct module *m)
|
||||
|
||||
/* Generic info of form tag = "info" */
|
||||
#define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info)
|
||||
+#define MODULE_INFO_STRIP(tag, info) __MODULE_INFO_STRIP(tag, tag, info)
|
||||
|
||||
/* For userspace: you can also call me... */
|
||||
-#define MODULE_ALIAS(_alias) MODULE_INFO(alias, _alias)
|
||||
+#define MODULE_ALIAS(_alias) MODULE_INFO_STRIP(alias, _alias)
|
||||
|
||||
/* Soft module dependencies. See man modprobe.d for details.
|
||||
* Example: MODULE_SOFTDEP("pre: module-foo module-bar post: module-baz")
|
||||
@@ -127,12 +128,12 @@ void trim_init_extable(struct module *m)
|
||||
* Author(s), use "Name <email>" or just "Name", for multiple
|
||||
* authors use multiple MODULE_AUTHOR() statements/lines.
|
||||
*/
|
||||
-#define MODULE_AUTHOR(_author) MODULE_INFO(author, _author)
|
||||
+#define MODULE_AUTHOR(_author) MODULE_INFO_STRIP(author, _author)
|
||||
|
||||
/* What your module does. */
|
||||
-#define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description)
|
||||
+#define MODULE_DESCRIPTION(_description) MODULE_INFO_STRIP(description, _description)
|
||||
|
||||
-#ifdef MODULE
|
||||
+#if defined(MODULE) && !defined(CONFIG_MODULE_STRIPPED)
|
||||
/* Creates an alias so file2alias.c can find device table. */
|
||||
#define MODULE_DEVICE_TABLE(type, name) \
|
||||
extern const typeof(name) __mod_##type##__##name##_device_table \
|
||||
@@ -159,7 +160,9 @@ extern const typeof(name) __mod_##type##
|
||||
*/
|
||||
|
||||
#if defined(MODULE) || !defined(CONFIG_SYSFS)
|
||||
-#define MODULE_VERSION(_version) MODULE_INFO(version, _version)
|
||||
+#define MODULE_VERSION(_version) MODULE_INFO_STRIP(version, _version)
|
||||
+#elif defined(CONFIG_MODULE_STRIPPED)
|
||||
+#define MODULE_VERSION(_version) __MODULE_INFO_DISABLED(version)
|
||||
#else
|
||||
#define MODULE_VERSION(_version) \
|
||||
static struct module_version_attribute ___modver_attr = { \
|
||||
@@ -181,7 +184,7 @@ extern const typeof(name) __mod_##type##
|
||||
/* Optional firmware file (or files) needed by the module
|
||||
* format is simply firmware file name. Multiple firmware
|
||||
* files require multiple MODULE_FIRMWARE() specifiers */
|
||||
-#define MODULE_FIRMWARE(_firmware) MODULE_INFO(firmware, _firmware)
|
||||
+#define MODULE_FIRMWARE(_firmware) MODULE_INFO_STRIP(firmware, _firmware)
|
||||
|
||||
/* Given an address, look for it in the exception tables */
|
||||
const struct exception_table_entry *search_exception_tables(unsigned long add);
|
||||
--- a/include/linux/moduleparam.h
|
||||
+++ b/include/linux/moduleparam.h
|
||||
@@ -16,6 +16,16 @@
|
||||
/* Chosen so that structs with an unsigned long line up. */
|
||||
#define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long))
|
||||
|
||||
+/* This struct is here for syntactic coherency, it is not used */
|
||||
+#define __MODULE_INFO_DISABLED(name) \
|
||||
+ struct __UNIQUE_ID(name) {}
|
||||
+
|
||||
+#ifdef CONFIG_MODULE_STRIPPED
|
||||
+#define __MODULE_INFO_STRIP(tag, name, info) __MODULE_INFO_DISABLED(name)
|
||||
+#else
|
||||
+#define __MODULE_INFO_STRIP(tag, name, info) __MODULE_INFO(tag, name, info)
|
||||
+#endif
|
||||
+
|
||||
#ifdef MODULE
|
||||
#define __MODULE_INFO(tag, name, info) \
|
||||
static const char __UNIQUE_ID(name)[] \
|
||||
@@ -23,8 +33,7 @@ static const char __UNIQUE_ID(name)[]
|
||||
= __stringify(tag) "=" info
|
||||
#else /* !MODULE */
|
||||
/* This struct is here for syntactic coherency, it is not used */
|
||||
-#define __MODULE_INFO(tag, name, info) \
|
||||
- struct __UNIQUE_ID(name) {}
|
||||
+#define __MODULE_INFO(tag, name, info) __MODULE_INFO_DISABLED(name)
|
||||
#endif
|
||||
#define __MODULE_PARM_TYPE(name, _type) \
|
||||
__MODULE_INFO(parmtype, name##type, #name ":" _type)
|
||||
@@ -32,7 +41,7 @@ static const char __UNIQUE_ID(name)[]
|
||||
/* One for each parameter, describing how to use it. Some files do
|
||||
multiple of these per line, so can't just use MODULE_INFO. */
|
||||
#define MODULE_PARM_DESC(_parm, desc) \
|
||||
- __MODULE_INFO(parm, _parm, #_parm ":" desc)
|
||||
+ __MODULE_INFO_STRIP(parm, _parm, #_parm ":" desc)
|
||||
|
||||
struct kernel_param;
|
||||
|
||||
--- a/init/Kconfig
|
||||
+++ b/init/Kconfig
|
||||
@@ -1974,6 +1974,13 @@ config MODULE_COMPRESS_XZ
|
||||
|
||||
endchoice
|
||||
|
||||
+config MODULE_STRIPPED
|
||||
+ bool "Reduce module size"
|
||||
+ depends on MODULES
|
||||
+ help
|
||||
+ Remove module parameter descriptions, author info, version, aliases,
|
||||
+ device tables, etc.
|
||||
+
|
||||
endif # MODULES
|
||||
|
||||
config INIT_ALL_POSSIBLE
|
||||
--- a/kernel/module.c
|
||||
+++ b/kernel/module.c
|
||||
@@ -2680,6 +2680,7 @@ static struct module *setup_load_info(st
|
||||
|
||||
static int check_modinfo(struct module *mod, struct load_info *info, int flags)
|
||||
{
|
||||
+#ifndef CONFIG_MODULE_STRIPPED
|
||||
const char *modmagic = get_modinfo(info, "vermagic");
|
||||
int err;
|
||||
|
||||
@@ -2705,6 +2706,7 @@ static int check_modinfo(struct module *
|
||||
pr_warn("%s: module is from the staging directory, the quality "
|
||||
"is unknown, you have been warned.\n", mod->name);
|
||||
}
|
||||
+#endif
|
||||
|
||||
/* Set up license info based on the info section */
|
||||
set_license(mod, get_modinfo(info, "license"));
|
||||
--- a/scripts/mod/modpost.c
|
||||
+++ b/scripts/mod/modpost.c
|
||||
@@ -1726,7 +1726,9 @@ static void read_symbols(char *modname)
|
||||
symname = remove_dot(info.strtab + sym->st_name);
|
||||
|
||||
handle_modversions(mod, &info, sym, symname);
|
||||
+#ifndef CONFIG_MODULE_STRIPPED
|
||||
handle_moddevtable(mod, &info, sym, symname);
|
||||
+#endif
|
||||
}
|
||||
if (!is_vmlinux(modname) ||
|
||||
(is_vmlinux(modname) && vmlinux_section_warnings))
|
||||
@@ -1870,7 +1872,9 @@ static void add_header(struct buffer *b,
|
||||
buf_printf(b, "#include <linux/vermagic.h>\n");
|
||||
buf_printf(b, "#include <linux/compiler.h>\n");
|
||||
buf_printf(b, "\n");
|
||||
+#ifndef CONFIG_MODULE_STRIPPED
|
||||
buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n");
|
||||
+#endif
|
||||
buf_printf(b, "\n");
|
||||
buf_printf(b, "__visible struct module __this_module\n");
|
||||
buf_printf(b, "__attribute__((section(\".gnu.linkonce.this_module\"))) = {\n");
|
||||
@@ -1887,16 +1891,20 @@ static void add_header(struct buffer *b,
|
||||
|
||||
static void add_intree_flag(struct buffer *b, int is_intree)
|
||||
{
|
||||
+#ifndef CONFIG_MODULE_STRIPPED
|
||||
if (is_intree)
|
||||
buf_printf(b, "\nMODULE_INFO(intree, \"Y\");\n");
|
||||
+#endif
|
||||
}
|
||||
|
||||
static void add_staging_flag(struct buffer *b, const char *name)
|
||||
{
|
||||
+#ifndef CONFIG_MODULE_STRIPPED
|
||||
static const char *staging_dir = "drivers/staging";
|
||||
|
||||
if (strncmp(staging_dir, name, strlen(staging_dir)) == 0)
|
||||
buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n");
|
||||
+#endif
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1989,11 +1997,13 @@ static void add_depends(struct buffer *b
|
||||
|
||||
static void add_srcversion(struct buffer *b, struct module *mod)
|
||||
{
|
||||
+#ifndef CONFIG_MODULE_STRIPPED
|
||||
if (mod->srcversion[0]) {
|
||||
buf_printf(b, "\n");
|
||||
buf_printf(b, "MODULE_INFO(srcversion, \"%s\");\n",
|
||||
mod->srcversion);
|
||||
}
|
||||
+#endif
|
||||
}
|
||||
|
||||
static void write_if_changed(struct buffer *b, const char *fname)
|
||||
@@ -2224,7 +2234,9 @@ int main(int argc, char **argv)
|
||||
add_staging_flag(&buf, mod->name);
|
||||
err |= add_versions(&buf, mod);
|
||||
add_depends(&buf, mod, modules);
|
||||
+#ifndef CONFIG_MODULE_STRIPPED
|
||||
add_moddevtable(&buf, mod);
|
||||
+#endif
|
||||
add_srcversion(&buf, mod);
|
||||
|
||||
sprintf(fname, "%s.mod.c", mod->name);
|
||||
@@ -1,36 +0,0 @@
|
||||
--- a/lib/vsprintf.c
|
||||
+++ b/lib/vsprintf.c
|
||||
@@ -615,8 +615,10 @@ char *symbol_string(char *buf, char *end
|
||||
struct printf_spec spec, const char *fmt)
|
||||
{
|
||||
unsigned long value;
|
||||
-#ifdef CONFIG_KALLSYMS
|
||||
char sym[KSYM_SYMBOL_LEN];
|
||||
+#ifndef CONFIG_KALLSYMS
|
||||
+ struct module *mod;
|
||||
+ int len;
|
||||
#endif
|
||||
|
||||
if (fmt[1] == 'R')
|
||||
@@ -630,15 +632,15 @@ char *symbol_string(char *buf, char *end
|
||||
sprint_symbol(sym, value);
|
||||
else
|
||||
sprint_symbol_no_offset(sym, value);
|
||||
-
|
||||
- return string(buf, end, sym, spec);
|
||||
#else
|
||||
- spec.field_width = 2 * sizeof(void *);
|
||||
- spec.flags |= SPECIAL | SMALL | ZEROPAD;
|
||||
- spec.base = 16;
|
||||
+ len = snprintf(sym, sizeof(sym), "0x%lx", value);
|
||||
|
||||
- return number(buf, end, value, spec);
|
||||
+ mod = __module_address(value);
|
||||
+ if (mod)
|
||||
+ snprintf(sym + len, sizeof(sym) - len, " [%s@%p+0x%x]",
|
||||
+ mod->name, mod->module_core, mod->core_size);
|
||||
#endif
|
||||
+ return string(buf, end, sym, spec);
|
||||
}
|
||||
|
||||
static noinline_for_stack
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,51 +0,0 @@
|
||||
--- a/tools/include/tools/be_byteshift.h
|
||||
+++ b/tools/include/tools/be_byteshift.h
|
||||
@@ -1,6 +1,10 @@
|
||||
#ifndef _TOOLS_BE_BYTESHIFT_H
|
||||
#define _TOOLS_BE_BYTESHIFT_H
|
||||
|
||||
+#ifndef __linux__
|
||||
+#include "linux_types.h"
|
||||
+#endif
|
||||
+
|
||||
#include <stdint.h>
|
||||
|
||||
static inline uint16_t __get_unaligned_be16(const uint8_t *p)
|
||||
--- a/tools/include/tools/le_byteshift.h
|
||||
+++ b/tools/include/tools/le_byteshift.h
|
||||
@@ -1,6 +1,10 @@
|
||||
#ifndef _TOOLS_LE_BYTESHIFT_H
|
||||
#define _TOOLS_LE_BYTESHIFT_H
|
||||
|
||||
+#ifndef __linux__
|
||||
+#include "linux_types.h"
|
||||
+#endif
|
||||
+
|
||||
#include <stdint.h>
|
||||
|
||||
static inline uint16_t __get_unaligned_le16(const uint8_t *p)
|
||||
--- /dev/null
|
||||
+++ b/tools/include/tools/linux_types.h
|
||||
@@ -0,0 +1,22 @@
|
||||
+#ifndef __LINUX_TYPES_H
|
||||
+#define __LINUX_TYPES_H
|
||||
+
|
||||
+#include <stdint.h>
|
||||
+
|
||||
+typedef uint8_t __u8;
|
||||
+typedef uint8_t __be8;
|
||||
+typedef uint8_t __le8;
|
||||
+
|
||||
+typedef uint16_t __u16;
|
||||
+typedef uint16_t __be16;
|
||||
+typedef uint16_t __le16;
|
||||
+
|
||||
+typedef uint32_t __u32;
|
||||
+typedef uint32_t __be32;
|
||||
+typedef uint32_t __le32;
|
||||
+
|
||||
+typedef uint64_t __u64;
|
||||
+typedef uint64_t __be64;
|
||||
+typedef uint64_t __le64;
|
||||
+
|
||||
+#endif
|
||||
@@ -1,11 +0,0 @@
|
||||
--- a/include/uapi/linux/spi/spidev.h
|
||||
+++ b/include/uapi/linux/spi/spidev.h
|
||||
@@ -111,7 +111,7 @@ struct spi_ioc_transfer {
|
||||
|
||||
/* not all platforms use <asm-generic/ioctl.h> or _IOC_TYPECHECK() ... */
|
||||
#define SPI_MSGSIZE(N) \
|
||||
- ((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << _IOC_SIZEBITS)) \
|
||||
+ ((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << 13)) \
|
||||
? ((N)*(sizeof (struct spi_ioc_transfer))) : 0)
|
||||
#define SPI_IOC_MESSAGE(N) _IOW(SPI_IOC_MAGIC, 0, char[SPI_MSGSIZE(N)])
|
||||
|
||||
@@ -1,532 +0,0 @@
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
|
||||
use -ffunction-sections, -fdata-sections and --gc-sections
|
||||
|
||||
In combination with kernel symbol export stripping this significantly reduces
|
||||
the kernel image size. Used on both ARM and MIPS architectures.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
||||
---
|
||||
|
||||
--- a/arch/mips/Makefile
|
||||
+++ b/arch/mips/Makefile
|
||||
@@ -89,10 +89,14 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin
|
||||
#
|
||||
cflags-y += -G 0 -mno-abicalls -fno-pic -pipe
|
||||
cflags-y += -msoft-float
|
||||
-LDFLAGS_vmlinux += -G 0 -static -n -nostdlib
|
||||
+LDFLAGS_vmlinux += -G 0 -static -n -nostdlib --gc-sections
|
||||
KBUILD_AFLAGS_MODULE += -mlong-calls
|
||||
KBUILD_CFLAGS_MODULE += -mlong-calls
|
||||
|
||||
+ifndef CONFIG_FUNCTION_TRACER
|
||||
+KBUILD_CFLAGS_KERNEL += -ffunction-sections -fdata-sections
|
||||
+endif
|
||||
+
|
||||
#
|
||||
# pass -msoft-float to GAS if it supports it. However on newer binutils
|
||||
# (specifically newer than 2.24.51.20140728) we then also need to explicitly
|
||||
--- a/arch/mips/kernel/vmlinux.lds.S
|
||||
+++ b/arch/mips/kernel/vmlinux.lds.S
|
||||
@@ -67,7 +67,7 @@ SECTIONS
|
||||
/* Exception table for data bus errors */
|
||||
__dbe_table : {
|
||||
__start___dbe_table = .;
|
||||
- *(__dbe_table)
|
||||
+ KEEP(*(__dbe_table))
|
||||
__stop___dbe_table = .;
|
||||
}
|
||||
|
||||
@@ -112,7 +112,7 @@ SECTIONS
|
||||
. = ALIGN(4);
|
||||
.mips.machines.init : AT(ADDR(.mips.machines.init) - LOAD_OFFSET) {
|
||||
__mips_machines_start = .;
|
||||
- *(.mips.machines.init)
|
||||
+ KEEP(*(.mips.machines.init))
|
||||
__mips_machines_end = .;
|
||||
}
|
||||
|
||||
--- a/include/asm-generic/vmlinux.lds.h
|
||||
+++ b/include/asm-generic/vmlinux.lds.h
|
||||
@@ -89,7 +89,7 @@
|
||||
#ifdef CONFIG_FTRACE_MCOUNT_RECORD
|
||||
#define MCOUNT_REC() . = ALIGN(8); \
|
||||
VMLINUX_SYMBOL(__start_mcount_loc) = .; \
|
||||
- *(__mcount_loc) \
|
||||
+ KEEP(*(__mcount_loc)) \
|
||||
VMLINUX_SYMBOL(__stop_mcount_loc) = .;
|
||||
#else
|
||||
#define MCOUNT_REC()
|
||||
@@ -97,7 +97,7 @@
|
||||
|
||||
#ifdef CONFIG_TRACE_BRANCH_PROFILING
|
||||
#define LIKELY_PROFILE() VMLINUX_SYMBOL(__start_annotated_branch_profile) = .; \
|
||||
- *(_ftrace_annotated_branch) \
|
||||
+ KEEP(*(_ftrace_annotated_branch)) \
|
||||
VMLINUX_SYMBOL(__stop_annotated_branch_profile) = .;
|
||||
#else
|
||||
#define LIKELY_PROFILE()
|
||||
@@ -105,7 +105,7 @@
|
||||
|
||||
#ifdef CONFIG_PROFILE_ALL_BRANCHES
|
||||
#define BRANCH_PROFILE() VMLINUX_SYMBOL(__start_branch_profile) = .; \
|
||||
- *(_ftrace_branch) \
|
||||
+ KEEP(*(_ftrace_branch)) \
|
||||
VMLINUX_SYMBOL(__stop_branch_profile) = .;
|
||||
#else
|
||||
#define BRANCH_PROFILE()
|
||||
@@ -114,7 +114,7 @@
|
||||
#ifdef CONFIG_KPROBES
|
||||
#define KPROBE_BLACKLIST() . = ALIGN(8); \
|
||||
VMLINUX_SYMBOL(__start_kprobe_blacklist) = .; \
|
||||
- *(_kprobe_blacklist) \
|
||||
+ KEEP(*(_kprobe_blacklist)) \
|
||||
VMLINUX_SYMBOL(__stop_kprobe_blacklist) = .;
|
||||
#else
|
||||
#define KPROBE_BLACKLIST()
|
||||
@@ -123,7 +123,7 @@
|
||||
#ifdef CONFIG_EVENT_TRACING
|
||||
#define FTRACE_EVENTS() . = ALIGN(8); \
|
||||
VMLINUX_SYMBOL(__start_ftrace_events) = .; \
|
||||
- *(_ftrace_events) \
|
||||
+ KEEP(*(_ftrace_events)) \
|
||||
VMLINUX_SYMBOL(__stop_ftrace_events) = .;
|
||||
#else
|
||||
#define FTRACE_EVENTS()
|
||||
@@ -131,7 +131,7 @@
|
||||
|
||||
#ifdef CONFIG_TRACING
|
||||
#define TRACE_PRINTKS() VMLINUX_SYMBOL(__start___trace_bprintk_fmt) = .; \
|
||||
- *(__trace_printk_fmt) /* Trace_printk fmt' pointer */ \
|
||||
+ KEEP(*(__trace_printk_fmt)) /* Trace_printk fmt' pointer */ \
|
||||
VMLINUX_SYMBOL(__stop___trace_bprintk_fmt) = .;
|
||||
#define TRACEPOINT_STR() VMLINUX_SYMBOL(__start___tracepoint_str) = .; \
|
||||
*(__tracepoint_str) /* Trace_printk fmt' pointer */ \
|
||||
@@ -144,7 +144,7 @@
|
||||
#ifdef CONFIG_FTRACE_SYSCALLS
|
||||
#define TRACE_SYSCALLS() . = ALIGN(8); \
|
||||
VMLINUX_SYMBOL(__start_syscalls_metadata) = .; \
|
||||
- *(__syscalls_metadata) \
|
||||
+ KEEP(*(__syscalls_metadata)) \
|
||||
VMLINUX_SYMBOL(__stop_syscalls_metadata) = .;
|
||||
#else
|
||||
#define TRACE_SYSCALLS()
|
||||
@@ -158,8 +158,8 @@
|
||||
#define _OF_TABLE_1(name) \
|
||||
. = ALIGN(8); \
|
||||
VMLINUX_SYMBOL(__##name##_of_table) = .; \
|
||||
- *(__##name##_of_table) \
|
||||
- *(__##name##_of_table_end)
|
||||
+ KEEP(*(__##name##_of_table)) \
|
||||
+ KEEP(*(__##name##_of_table_end))
|
||||
|
||||
#define CLKSRC_OF_TABLES() OF_TABLE(CONFIG_CLKSRC_OF, clksrc)
|
||||
#define IRQCHIP_OF_MATCH_TABLE() OF_TABLE(CONFIG_IRQCHIP, irqchip)
|
||||
@@ -172,7 +172,7 @@
|
||||
#define KERNEL_DTB() \
|
||||
STRUCT_ALIGN(); \
|
||||
VMLINUX_SYMBOL(__dtb_start) = .; \
|
||||
- *(.dtb.init.rodata) \
|
||||
+ KEEP(*(.dtb.init.rodata)) \
|
||||
VMLINUX_SYMBOL(__dtb_end) = .;
|
||||
|
||||
/* .data section */
|
||||
@@ -188,16 +188,17 @@
|
||||
/* implement dynamic printk debug */ \
|
||||
. = ALIGN(8); \
|
||||
VMLINUX_SYMBOL(__start___jump_table) = .; \
|
||||
- *(__jump_table) \
|
||||
+ KEEP(*(__jump_table)) \
|
||||
VMLINUX_SYMBOL(__stop___jump_table) = .; \
|
||||
. = ALIGN(8); \
|
||||
VMLINUX_SYMBOL(__start___verbose) = .; \
|
||||
- *(__verbose) \
|
||||
+ KEEP(*(__verbose)) \
|
||||
VMLINUX_SYMBOL(__stop___verbose) = .; \
|
||||
LIKELY_PROFILE() \
|
||||
BRANCH_PROFILE() \
|
||||
TRACE_PRINTKS() \
|
||||
- TRACEPOINT_STR()
|
||||
+ TRACEPOINT_STR() \
|
||||
+ *(.data.[a-zA-Z_]*)
|
||||
|
||||
/*
|
||||
* Data section helpers
|
||||
@@ -251,35 +252,35 @@
|
||||
/* PCI quirks */ \
|
||||
.pci_fixup : AT(ADDR(.pci_fixup) - LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__start_pci_fixups_early) = .; \
|
||||
- *(.pci_fixup_early) \
|
||||
+ KEEP(*(.pci_fixup_early)) \
|
||||
VMLINUX_SYMBOL(__end_pci_fixups_early) = .; \
|
||||
VMLINUX_SYMBOL(__start_pci_fixups_header) = .; \
|
||||
- *(.pci_fixup_header) \
|
||||
+ KEEP(*(.pci_fixup_header)) \
|
||||
VMLINUX_SYMBOL(__end_pci_fixups_header) = .; \
|
||||
VMLINUX_SYMBOL(__start_pci_fixups_final) = .; \
|
||||
- *(.pci_fixup_final) \
|
||||
+ KEEP(*(.pci_fixup_final)) \
|
||||
VMLINUX_SYMBOL(__end_pci_fixups_final) = .; \
|
||||
VMLINUX_SYMBOL(__start_pci_fixups_enable) = .; \
|
||||
- *(.pci_fixup_enable) \
|
||||
+ KEEP(*(.pci_fixup_enable)) \
|
||||
VMLINUX_SYMBOL(__end_pci_fixups_enable) = .; \
|
||||
VMLINUX_SYMBOL(__start_pci_fixups_resume) = .; \
|
||||
- *(.pci_fixup_resume) \
|
||||
+ KEEP(*(.pci_fixup_resume)) \
|
||||
VMLINUX_SYMBOL(__end_pci_fixups_resume) = .; \
|
||||
VMLINUX_SYMBOL(__start_pci_fixups_resume_early) = .; \
|
||||
- *(.pci_fixup_resume_early) \
|
||||
+ KEEP(*(.pci_fixup_resume_early)) \
|
||||
VMLINUX_SYMBOL(__end_pci_fixups_resume_early) = .; \
|
||||
VMLINUX_SYMBOL(__start_pci_fixups_suspend) = .; \
|
||||
- *(.pci_fixup_suspend) \
|
||||
+ KEEP(*(.pci_fixup_suspend)) \
|
||||
VMLINUX_SYMBOL(__end_pci_fixups_suspend) = .; \
|
||||
VMLINUX_SYMBOL(__start_pci_fixups_suspend_late) = .; \
|
||||
- *(.pci_fixup_suspend_late) \
|
||||
+ KEEP(*(.pci_fixup_suspend_late)) \
|
||||
VMLINUX_SYMBOL(__end_pci_fixups_suspend_late) = .; \
|
||||
} \
|
||||
\
|
||||
/* Built-in firmware blobs */ \
|
||||
.builtin_fw : AT(ADDR(.builtin_fw) - LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__start_builtin_fw) = .; \
|
||||
- *(.builtin_fw) \
|
||||
+ KEEP(*(.builtin_fw)) \
|
||||
VMLINUX_SYMBOL(__end_builtin_fw) = .; \
|
||||
} \
|
||||
\
|
||||
@@ -288,49 +289,49 @@
|
||||
/* Kernel symbol table: Normal symbols */ \
|
||||
__ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__start___ksymtab) = .; \
|
||||
- *(SORT(___ksymtab+*)) \
|
||||
+ KEEP(*(SORT(___ksymtab+*))) \
|
||||
VMLINUX_SYMBOL(__stop___ksymtab) = .; \
|
||||
} \
|
||||
\
|
||||
/* Kernel symbol table: GPL-only symbols */ \
|
||||
__ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__start___ksymtab_gpl) = .; \
|
||||
- *(SORT(___ksymtab_gpl+*)) \
|
||||
+ KEEP(*(SORT(___ksymtab_gpl+*))) \
|
||||
VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .; \
|
||||
} \
|
||||
\
|
||||
/* Kernel symbol table: Normal unused symbols */ \
|
||||
__ksymtab_unused : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__start___ksymtab_unused) = .; \
|
||||
- *(SORT(___ksymtab_unused+*)) \
|
||||
+ KEEP(*(SORT(___ksymtab_unused+*))) \
|
||||
VMLINUX_SYMBOL(__stop___ksymtab_unused) = .; \
|
||||
} \
|
||||
\
|
||||
/* Kernel symbol table: GPL-only unused symbols */ \
|
||||
__ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__start___ksymtab_unused_gpl) = .; \
|
||||
- *(SORT(___ksymtab_unused_gpl+*)) \
|
||||
+ KEEP(*(SORT(___ksymtab_unused_gpl+*))) \
|
||||
VMLINUX_SYMBOL(__stop___ksymtab_unused_gpl) = .; \
|
||||
} \
|
||||
\
|
||||
/* Kernel symbol table: GPL-future-only symbols */ \
|
||||
__ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__start___ksymtab_gpl_future) = .; \
|
||||
- *(SORT(___ksymtab_gpl_future+*)) \
|
||||
+ KEEP(*(SORT(___ksymtab_gpl_future+*))) \
|
||||
VMLINUX_SYMBOL(__stop___ksymtab_gpl_future) = .; \
|
||||
} \
|
||||
\
|
||||
/* Kernel symbol table: Normal symbols */ \
|
||||
__kcrctab : AT(ADDR(__kcrctab) - LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__start___kcrctab) = .; \
|
||||
- *(SORT(___kcrctab+*)) \
|
||||
+ KEEP(*(SORT(___kcrctab+*))) \
|
||||
VMLINUX_SYMBOL(__stop___kcrctab) = .; \
|
||||
} \
|
||||
\
|
||||
/* Kernel symbol table: GPL-only symbols */ \
|
||||
__kcrctab_gpl : AT(ADDR(__kcrctab_gpl) - LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__start___kcrctab_gpl) = .; \
|
||||
- *(SORT(___kcrctab_gpl+*)) \
|
||||
+ KEEP(*(SORT(___kcrctab_gpl+*))) \
|
||||
VMLINUX_SYMBOL(__stop___kcrctab_gpl) = .; \
|
||||
} \
|
||||
\
|
||||
@@ -344,14 +345,14 @@
|
||||
/* Kernel symbol table: GPL-only unused symbols */ \
|
||||
__kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__start___kcrctab_unused_gpl) = .; \
|
||||
- *(SORT(___kcrctab_unused_gpl+*)) \
|
||||
+ KEEP(*(SORT(___kcrctab_unused_gpl+*))) \
|
||||
VMLINUX_SYMBOL(__stop___kcrctab_unused_gpl) = .; \
|
||||
} \
|
||||
\
|
||||
/* Kernel symbol table: GPL-future-only symbols */ \
|
||||
__kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__start___kcrctab_gpl_future) = .; \
|
||||
- *(SORT(___kcrctab_gpl_future+*)) \
|
||||
+ KEEP(*(SORT(___kcrctab_gpl_future+*))) \
|
||||
VMLINUX_SYMBOL(__stop___kcrctab_gpl_future) = .; \
|
||||
} \
|
||||
\
|
||||
@@ -370,14 +371,14 @@
|
||||
/* Built-in module parameters. */ \
|
||||
__param : AT(ADDR(__param) - LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__start___param) = .; \
|
||||
- *(__param) \
|
||||
+ KEEP(*(__param)) \
|
||||
VMLINUX_SYMBOL(__stop___param) = .; \
|
||||
} \
|
||||
\
|
||||
/* Built-in module versions. */ \
|
||||
__modver : AT(ADDR(__modver) - LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__start___modver) = .; \
|
||||
- *(__modver) \
|
||||
+ KEEP(*(__modver)) \
|
||||
VMLINUX_SYMBOL(__stop___modver) = .; \
|
||||
. = ALIGN((align)); \
|
||||
VMLINUX_SYMBOL(__end_rodata) = .; \
|
||||
@@ -433,7 +434,7 @@
|
||||
#define ENTRY_TEXT \
|
||||
ALIGN_FUNCTION(); \
|
||||
VMLINUX_SYMBOL(__entry_text_start) = .; \
|
||||
- *(.entry.text) \
|
||||
+ KEEP(*(.entry.text)) \
|
||||
VMLINUX_SYMBOL(__entry_text_end) = .;
|
||||
|
||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||
@@ -461,7 +462,7 @@
|
||||
. = ALIGN(align); \
|
||||
__ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__start___ex_table) = .; \
|
||||
- *(__ex_table) \
|
||||
+ KEEP(*(__ex_table)) \
|
||||
VMLINUX_SYMBOL(__stop___ex_table) = .; \
|
||||
}
|
||||
|
||||
@@ -477,9 +478,9 @@
|
||||
#ifdef CONFIG_CONSTRUCTORS
|
||||
#define KERNEL_CTORS() . = ALIGN(8); \
|
||||
VMLINUX_SYMBOL(__ctors_start) = .; \
|
||||
- *(.ctors) \
|
||||
+ KEEP(*(.ctors)) \
|
||||
*(SORT(.init_array.*)) \
|
||||
- *(.init_array) \
|
||||
+ KEEP(*(.init_array)) \
|
||||
VMLINUX_SYMBOL(__ctors_end) = .;
|
||||
#else
|
||||
#define KERNEL_CTORS()
|
||||
@@ -528,7 +529,7 @@
|
||||
#define SBSS(sbss_align) \
|
||||
. = ALIGN(sbss_align); \
|
||||
.sbss : AT(ADDR(.sbss) - LOAD_OFFSET) { \
|
||||
- *(.sbss) \
|
||||
+ *(.sbss .sbss.*) \
|
||||
*(.scommon) \
|
||||
}
|
||||
|
||||
@@ -546,7 +547,7 @@
|
||||
BSS_FIRST_SECTIONS \
|
||||
*(.bss..page_aligned) \
|
||||
*(.dynbss) \
|
||||
- *(.bss) \
|
||||
+ *(.bss .bss.*) \
|
||||
*(COMMON) \
|
||||
}
|
||||
|
||||
@@ -595,7 +596,7 @@
|
||||
. = ALIGN(8); \
|
||||
__bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__start___bug_table) = .; \
|
||||
- *(__bug_table) \
|
||||
+ KEEP(*(__bug_table)) \
|
||||
VMLINUX_SYMBOL(__stop___bug_table) = .; \
|
||||
}
|
||||
#else
|
||||
@@ -607,7 +608,7 @@
|
||||
. = ALIGN(4); \
|
||||
.tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__tracedata_start) = .; \
|
||||
- *(.tracedata) \
|
||||
+ KEEP(*(.tracedata)) \
|
||||
VMLINUX_SYMBOL(__tracedata_end) = .; \
|
||||
}
|
||||
#else
|
||||
@@ -624,17 +625,17 @@
|
||||
#define INIT_SETUP(initsetup_align) \
|
||||
. = ALIGN(initsetup_align); \
|
||||
VMLINUX_SYMBOL(__setup_start) = .; \
|
||||
- *(.init.setup) \
|
||||
+ KEEP(*(.init.setup)) \
|
||||
VMLINUX_SYMBOL(__setup_end) = .;
|
||||
|
||||
#define INIT_CALLS_LEVEL(level) \
|
||||
VMLINUX_SYMBOL(__initcall##level##_start) = .; \
|
||||
- *(.initcall##level##.init) \
|
||||
- *(.initcall##level##s.init) \
|
||||
+ KEEP(*(.initcall##level##.init)) \
|
||||
+ KEEP(*(.initcall##level##s.init)) \
|
||||
|
||||
#define INIT_CALLS \
|
||||
VMLINUX_SYMBOL(__initcall_start) = .; \
|
||||
- *(.initcallearly.init) \
|
||||
+ KEEP(*(.initcallearly.init)) \
|
||||
INIT_CALLS_LEVEL(0) \
|
||||
INIT_CALLS_LEVEL(1) \
|
||||
INIT_CALLS_LEVEL(2) \
|
||||
@@ -648,21 +649,21 @@
|
||||
|
||||
#define CON_INITCALL \
|
||||
VMLINUX_SYMBOL(__con_initcall_start) = .; \
|
||||
- *(.con_initcall.init) \
|
||||
+ KEEP(*(.con_initcall.init)) \
|
||||
VMLINUX_SYMBOL(__con_initcall_end) = .;
|
||||
|
||||
#define SECURITY_INITCALL \
|
||||
VMLINUX_SYMBOL(__security_initcall_start) = .; \
|
||||
- *(.security_initcall.init) \
|
||||
+ KEEP(*(.security_initcall.init)) \
|
||||
VMLINUX_SYMBOL(__security_initcall_end) = .;
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
#define INIT_RAM_FS \
|
||||
. = ALIGN(4); \
|
||||
VMLINUX_SYMBOL(__initramfs_start) = .; \
|
||||
- *(.init.ramfs) \
|
||||
+ KEEP(*(.init.ramfs)) \
|
||||
. = ALIGN(8); \
|
||||
- *(.init.ramfs.info)
|
||||
+ KEEP(*(.init.ramfs.info))
|
||||
#else
|
||||
#define INIT_RAM_FS
|
||||
#endif
|
||||
--- a/arch/arm/Makefile
|
||||
+++ b/arch/arm/Makefile
|
||||
@@ -18,11 +18,16 @@ ifeq ($(CONFIG_CPU_ENDIAN_BE8),y)
|
||||
LDFLAGS_vmlinux += --be8
|
||||
LDFLAGS_MODULE += --be8
|
||||
endif
|
||||
+LDFLAGS_vmlinux += --gc-sections
|
||||
|
||||
OBJCOPYFLAGS :=-O binary -R .comment -S
|
||||
GZFLAGS :=-9
|
||||
#KBUILD_CFLAGS +=-pipe
|
||||
|
||||
+ifndef CONFIG_FUNCTION_TRACER
|
||||
+KBUILD_CFLAGS_KERNEL += -ffunction-sections -fdata-sections
|
||||
+endif
|
||||
+
|
||||
# Never generate .eh_frame
|
||||
KBUILD_CFLAGS += $(call cc-option,-fno-dwarf2-cfi-asm)
|
||||
|
||||
--- a/arch/arm/kernel/vmlinux.lds.S
|
||||
+++ b/arch/arm/kernel/vmlinux.lds.S
|
||||
@@ -15,13 +15,13 @@
|
||||
#define PROC_INFO \
|
||||
. = ALIGN(4); \
|
||||
VMLINUX_SYMBOL(__proc_info_begin) = .; \
|
||||
- *(.proc.info.init) \
|
||||
+ KEEP(*(.proc.info.init)) \
|
||||
VMLINUX_SYMBOL(__proc_info_end) = .;
|
||||
|
||||
#define IDMAP_TEXT \
|
||||
ALIGN_FUNCTION(); \
|
||||
VMLINUX_SYMBOL(__idmap_text_start) = .; \
|
||||
- *(.idmap.text) \
|
||||
+ KEEP(*(.idmap.text)) \
|
||||
VMLINUX_SYMBOL(__idmap_text_end) = .; \
|
||||
. = ALIGN(32); \
|
||||
VMLINUX_SYMBOL(__hyp_idmap_text_start) = .; \
|
||||
@@ -101,7 +101,7 @@ SECTIONS
|
||||
.text : { /* Real text segment */
|
||||
_stext = .; /* Text and read-only data */
|
||||
__exception_text_start = .;
|
||||
- *(.exception.text)
|
||||
+ KEEP(*(.exception.text))
|
||||
__exception_text_end = .;
|
||||
IRQENTRY_TEXT
|
||||
TEXT_TEXT
|
||||
@@ -129,7 +129,7 @@ SECTIONS
|
||||
__ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
|
||||
__start___ex_table = .;
|
||||
#ifdef CONFIG_MMU
|
||||
- *(__ex_table)
|
||||
+ KEEP(*(__ex_table))
|
||||
#endif
|
||||
__stop___ex_table = .;
|
||||
}
|
||||
@@ -141,12 +141,12 @@ SECTIONS
|
||||
. = ALIGN(8);
|
||||
.ARM.unwind_idx : {
|
||||
__start_unwind_idx = .;
|
||||
- *(.ARM.exidx*)
|
||||
+ KEEP(*(.ARM.exidx*))
|
||||
__stop_unwind_idx = .;
|
||||
}
|
||||
.ARM.unwind_tab : {
|
||||
__start_unwind_tab = .;
|
||||
- *(.ARM.extab*)
|
||||
+ KEEP(*(.ARM.extab*))
|
||||
__stop_unwind_tab = .;
|
||||
}
|
||||
#endif
|
||||
@@ -169,14 +169,14 @@ SECTIONS
|
||||
*/
|
||||
__vectors_start = .;
|
||||
.vectors 0 : AT(__vectors_start) {
|
||||
- *(.vectors)
|
||||
+ KEEP(*(.vectors))
|
||||
}
|
||||
. = __vectors_start + SIZEOF(.vectors);
|
||||
__vectors_end = .;
|
||||
|
||||
__stubs_start = .;
|
||||
.stubs 0x1000 : AT(__stubs_start) {
|
||||
- *(.stubs)
|
||||
+ KEEP(*(.stubs))
|
||||
}
|
||||
. = __stubs_start + SIZEOF(.stubs);
|
||||
__stubs_end = .;
|
||||
@@ -190,24 +190,24 @@ SECTIONS
|
||||
}
|
||||
.init.arch.info : {
|
||||
__arch_info_begin = .;
|
||||
- *(.arch.info.init)
|
||||
+ KEEP(*(.arch.info.init))
|
||||
__arch_info_end = .;
|
||||
}
|
||||
.init.tagtable : {
|
||||
__tagtable_begin = .;
|
||||
- *(.taglist.init)
|
||||
+ KEEP(*(.taglist.init))
|
||||
__tagtable_end = .;
|
||||
}
|
||||
#ifdef CONFIG_SMP_ON_UP
|
||||
.init.smpalt : {
|
||||
__smpalt_begin = .;
|
||||
- *(.alt.smp.init)
|
||||
+ KEEP(*(.alt.smp.init))
|
||||
__smpalt_end = .;
|
||||
}
|
||||
#endif
|
||||
.init.pv_table : {
|
||||
__pv_table_begin = .;
|
||||
- *(.pv_table)
|
||||
+ KEEP(*(.pv_table))
|
||||
__pv_table_end = .;
|
||||
}
|
||||
.init.data : {
|
||||
--- a/arch/arm/boot/compressed/Makefile
|
||||
+++ b/arch/arm/boot/compressed/Makefile
|
||||
@@ -122,6 +122,7 @@ ifeq ($(CONFIG_FUNCTION_TRACER),y)
|
||||
ORIG_CFLAGS := $(KBUILD_CFLAGS)
|
||||
KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS))
|
||||
endif
|
||||
+KBUILD_CFLAGS_KERNEL := $(patsubst -f%-sections,,$(KBUILD_CFLAGS_KERNEL))
|
||||
|
||||
ccflags-y := -fpic -mno-single-pic-base -fno-builtin -I$(obj)
|
||||
asflags-y := -DZIMAGE
|
||||
@@ -1,88 +0,0 @@
|
||||
--- a/include/asm-generic/vmlinux.lds.h
|
||||
+++ b/include/asm-generic/vmlinux.lds.h
|
||||
@@ -54,6 +54,16 @@
|
||||
#define LOAD_OFFSET 0
|
||||
#endif
|
||||
|
||||
+#ifndef SYMTAB_KEEP
|
||||
+#define SYMTAB_KEEP KEEP(*(SORT(___ksymtab+*)))
|
||||
+#define SYMTAB_KEEP_GPL KEEP(*(SORT(___ksymtab_gpl+*)))
|
||||
+#endif
|
||||
+
|
||||
+#ifndef SYMTAB_DISCARD
|
||||
+#define SYMTAB_DISCARD
|
||||
+#define SYMTAB_DISCARD_GPL
|
||||
+#endif
|
||||
+
|
||||
#include <linux/export.h>
|
||||
|
||||
/* Align . to a 8 byte boundary equals to maximum function alignment. */
|
||||
@@ -289,14 +299,14 @@
|
||||
/* Kernel symbol table: Normal symbols */ \
|
||||
__ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__start___ksymtab) = .; \
|
||||
- KEEP(*(SORT(___ksymtab+*))) \
|
||||
+ SYMTAB_KEEP \
|
||||
VMLINUX_SYMBOL(__stop___ksymtab) = .; \
|
||||
} \
|
||||
\
|
||||
/* Kernel symbol table: GPL-only symbols */ \
|
||||
__ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__start___ksymtab_gpl) = .; \
|
||||
- KEEP(*(SORT(___ksymtab_gpl+*))) \
|
||||
+ SYMTAB_KEEP_GPL \
|
||||
VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .; \
|
||||
} \
|
||||
\
|
||||
@@ -358,7 +368,7 @@
|
||||
\
|
||||
/* Kernel symbol table: strings */ \
|
||||
__ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \
|
||||
- *(__ksymtab_strings) \
|
||||
+ *(__ksymtab_strings+*) \
|
||||
} \
|
||||
\
|
||||
/* __*init sections */ \
|
||||
@@ -682,6 +692,8 @@
|
||||
EXIT_TEXT \
|
||||
EXIT_DATA \
|
||||
EXIT_CALL \
|
||||
+ SYMTAB_DISCARD \
|
||||
+ SYMTAB_DISCARD_GPL \
|
||||
*(.discard) \
|
||||
*(.discard.*) \
|
||||
}
|
||||
--- a/scripts/Makefile.build
|
||||
+++ b/scripts/Makefile.build
|
||||
@@ -299,7 +299,7 @@ targets += $(extra-y) $(MAKECMDGOALS) $(
|
||||
# Linker scripts preprocessor (.lds.S -> .lds)
|
||||
# ---------------------------------------------------------------------------
|
||||
quiet_cmd_cpp_lds_S = LDS $@
|
||||
- cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -C -U$(ARCH) \
|
||||
+ cmd_cpp_lds_S = $(CPP) $(EXTRA_LDSFLAGS) $(cpp_flags) -P -C -U$(ARCH) \
|
||||
-D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $<
|
||||
|
||||
$(obj)/%.lds: $(src)/%.lds.S FORCE
|
||||
--- a/include/linux/export.h
|
||||
+++ b/include/linux/export.h
|
||||
@@ -52,12 +52,19 @@ extern struct module __this_module;
|
||||
#define __CRC_SYMBOL(sym, sec)
|
||||
#endif
|
||||
|
||||
+#ifdef MODULE
|
||||
+#define __EXPORT_SUFFIX(sym)
|
||||
+#else
|
||||
+#define __EXPORT_SUFFIX(sym) "+" #sym
|
||||
+#endif
|
||||
+
|
||||
/* For every exported symbol, place a struct in the __ksymtab section */
|
||||
#define __EXPORT_SYMBOL(sym, sec) \
|
||||
extern typeof(sym) sym; \
|
||||
__CRC_SYMBOL(sym, sec) \
|
||||
static const char __kstrtab_##sym[] \
|
||||
- __attribute__((section("__ksymtab_strings"), aligned(1))) \
|
||||
+ __attribute__((section("__ksymtab_strings" \
|
||||
+ __EXPORT_SUFFIX(sym)), aligned(1))) \
|
||||
= VMLINUX_SYMBOL_STR(sym); \
|
||||
extern const struct kernel_symbol __ksymtab_##sym; \
|
||||
__visible const struct kernel_symbol __ksymtab_##sym \
|
||||
@@ -1,58 +0,0 @@
|
||||
--- a/scripts/Makefile.lib
|
||||
+++ b/scripts/Makefile.lib
|
||||
@@ -323,7 +323,7 @@ cmd_bzip2 = (cat $(filter-out FORCE,$^)
|
||||
|
||||
quiet_cmd_lzma = LZMA $@
|
||||
cmd_lzma = (cat $(filter-out FORCE,$^) | \
|
||||
- lzma -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
|
||||
+ lzma e -d20 -lc1 -lp2 -pb2 -eos -si -so && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
|
||||
(rm -f $@ ; false)
|
||||
|
||||
quiet_cmd_lzo = LZO $@
|
||||
--- a/scripts/gen_initramfs_list.sh
|
||||
+++ b/scripts/gen_initramfs_list.sh
|
||||
@@ -226,7 +226,7 @@ cpio_list=
|
||||
output="/dev/stdout"
|
||||
output_file=""
|
||||
is_cpio_compressed=
|
||||
-compr="gzip -n -9 -f"
|
||||
+compr="gzip -n -9 -f -"
|
||||
|
||||
arg="$1"
|
||||
case "$arg" in
|
||||
@@ -242,13 +242,13 @@ case "$arg" in
|
||||
output=${cpio_list}
|
||||
echo "$output_file" | grep -q "\.gz$" \
|
||||
&& [ -x "`which gzip 2> /dev/null`" ] \
|
||||
- && compr="gzip -n -9 -f"
|
||||
+ && compr="gzip -n -9 -f -"
|
||||
echo "$output_file" | grep -q "\.bz2$" \
|
||||
&& [ -x "`which bzip2 2> /dev/null`" ] \
|
||||
- && compr="bzip2 -9 -f"
|
||||
+ && compr="bzip2 -9 -f -"
|
||||
echo "$output_file" | grep -q "\.lzma$" \
|
||||
&& [ -x "`which lzma 2> /dev/null`" ] \
|
||||
- && compr="lzma -9 -f"
|
||||
+ && compr="lzma e -d20 -lc1 -lp2 -pb2 -eos -si -so"
|
||||
echo "$output_file" | grep -q "\.xz$" \
|
||||
&& [ -x "`which xz 2> /dev/null`" ] \
|
||||
&& compr="xz --check=crc32 --lzma2=dict=1MiB"
|
||||
@@ -315,7 +315,7 @@ if [ ! -z ${output_file} ]; then
|
||||
if [ "${is_cpio_compressed}" = "compressed" ]; then
|
||||
cat ${cpio_tfile} > ${output_file}
|
||||
else
|
||||
- (cat ${cpio_tfile} | ${compr} - > ${output_file}) \
|
||||
+ (cat ${cpio_tfile} | ${compr} > ${output_file}) \
|
||||
|| (rm -f ${output_file} ; false)
|
||||
fi
|
||||
[ -z ${cpio_file} ] && rm ${cpio_tfile}
|
||||
--- a/lib/decompress.c
|
||||
+++ b/lib/decompress.c
|
||||
@@ -48,6 +48,7 @@ static const struct compress_format comp
|
||||
{ {0x1f, 0x9e}, "gzip", gunzip },
|
||||
{ {0x42, 0x5a}, "bzip2", bunzip2 },
|
||||
{ {0x5d, 0x00}, "lzma", unlzma },
|
||||
+ { {0x6d, 0x00}, "lzma-openwrt", unlzma },
|
||||
{ {0xfd, 0x37}, "xz", unxz },
|
||||
{ {0x89, 0x4c}, "lzo", unlzo },
|
||||
{ {0x02, 0x21}, "lz4", unlz4 },
|
||||
@@ -1,18 +0,0 @@
|
||||
--- a/net/netfilter/Kconfig
|
||||
+++ b/net/netfilter/Kconfig
|
||||
@@ -210,7 +210,6 @@ config NF_CONNTRACK_FTP
|
||||
|
||||
config NF_CONNTRACK_H323
|
||||
tristate "H.323 protocol support"
|
||||
- depends on (IPV6 || IPV6=n)
|
||||
depends on NETFILTER_ADVANCED
|
||||
help
|
||||
H.323 is a VoIP signalling protocol from ITU-T. As one of the most
|
||||
@@ -924,7 +923,6 @@ config NETFILTER_XT_TARGET_SECMARK
|
||||
|
||||
config NETFILTER_XT_TARGET_TCPMSS
|
||||
tristate '"TCPMSS" target support'
|
||||
- depends on (IPV6 || IPV6=n)
|
||||
default m if NETFILTER_ADVANCED=n
|
||||
---help---
|
||||
This option adds a `TCPMSS' target, which allows you to alter the
|
||||
@@ -1,18 +0,0 @@
|
||||
--- a/sound/core/Kconfig
|
||||
+++ b/sound/core/Kconfig
|
||||
@@ -10,13 +10,13 @@ config SND_DMAENGINE_PCM
|
||||
tristate
|
||||
|
||||
config SND_HWDEP
|
||||
- tristate
|
||||
+ tristate "Sound hardware support"
|
||||
|
||||
config SND_RAWMIDI
|
||||
tristate
|
||||
|
||||
config SND_COMPRESS_OFFLOAD
|
||||
- tristate
|
||||
+ tristate "Compression offloading support"
|
||||
|
||||
# To be effective this also requires INPUT - users should say:
|
||||
# select SND_JACK if INPUT=y || INPUT=SND
|
||||
@@ -1,10 +0,0 @@
|
||||
--- a/drivers/crypto/Kconfig
|
||||
+++ b/drivers/crypto/Kconfig
|
||||
@@ -164,6 +164,7 @@ config CRYPTO_DEV_MV_CESA
|
||||
depends on PLAT_ORION
|
||||
select CRYPTO_ALGAPI
|
||||
select CRYPTO_AES
|
||||
+ select CRYPTO_HASH2
|
||||
select CRYPTO_BLKCIPHER2
|
||||
select CRYPTO_HASH
|
||||
help
|
||||
@@ -1,29 +0,0 @@
|
||||
--- a/drivers/ssb/Kconfig
|
||||
+++ b/drivers/ssb/Kconfig
|
||||
@@ -29,6 +29,7 @@ config SSB_SPROM
|
||||
config SSB_BLOCKIO
|
||||
bool
|
||||
depends on SSB
|
||||
+ default y
|
||||
|
||||
config SSB_PCIHOST_POSSIBLE
|
||||
bool
|
||||
@@ -49,7 +50,7 @@ config SSB_PCIHOST
|
||||
config SSB_B43_PCI_BRIDGE
|
||||
bool
|
||||
depends on SSB_PCIHOST
|
||||
- default n
|
||||
+ default y
|
||||
|
||||
config SSB_PCMCIAHOST_POSSIBLE
|
||||
bool
|
||||
--- a/drivers/bcma/Kconfig
|
||||
+++ b/drivers/bcma/Kconfig
|
||||
@@ -17,6 +17,7 @@ config BCMA
|
||||
config BCMA_BLOCKIO
|
||||
bool
|
||||
depends on BCMA
|
||||
+ default y
|
||||
|
||||
config BCMA_HOST_PCI_POSSIBLE
|
||||
bool
|
||||
@@ -1,23 +0,0 @@
|
||||
--- a/lib/Kconfig
|
||||
+++ b/lib/Kconfig
|
||||
@@ -329,16 +329,16 @@ config BCH_CONST_T
|
||||
# Textsearch support is select'ed if needed
|
||||
#
|
||||
config TEXTSEARCH
|
||||
- bool
|
||||
+ boolean "Textsearch support"
|
||||
|
||||
config TEXTSEARCH_KMP
|
||||
- tristate
|
||||
+ tristate "Textsearch KMP"
|
||||
|
||||
config TEXTSEARCH_BM
|
||||
- tristate
|
||||
+ tristate "Textsearch BM"
|
||||
|
||||
config TEXTSEARCH_FSM
|
||||
- tristate
|
||||
+ tristate "Textsearch FSM"
|
||||
|
||||
config BTREE
|
||||
bool
|
||||
@@ -1,31 +0,0 @@
|
||||
--- a/net/wireless/Kconfig
|
||||
+++ b/net/wireless/Kconfig
|
||||
@@ -183,7 +183,7 @@ config CFG80211_WEXT
|
||||
extensions with cfg80211-based drivers.
|
||||
|
||||
config LIB80211
|
||||
- tristate
|
||||
+ tristate "LIB80211"
|
||||
default n
|
||||
help
|
||||
This options enables a library of common routines used
|
||||
@@ -192,13 +192,16 @@ config LIB80211
|
||||
Drivers should select this themselves if needed.
|
||||
|
||||
config LIB80211_CRYPT_WEP
|
||||
- tristate
|
||||
+ tristate "LIB80211_CRYPT_WEP"
|
||||
+ select LIB80211
|
||||
|
||||
config LIB80211_CRYPT_CCMP
|
||||
- tristate
|
||||
+ tristate "LIB80211_CRYPT_CCMP"
|
||||
+ select LIB80211
|
||||
|
||||
config LIB80211_CRYPT_TKIP
|
||||
- tristate
|
||||
+ tristate "LIB80211_CRYPT_TKIP"
|
||||
+ select LIB80211
|
||||
|
||||
config LIB80211_DEBUG
|
||||
bool "lib80211 debugging messages"
|
||||
@@ -1,47 +0,0 @@
|
||||
--- a/crypto/Kconfig
|
||||
+++ b/crypto/Kconfig
|
||||
@@ -32,7 +32,7 @@ config CRYPTO_FIPS
|
||||
this is.
|
||||
|
||||
config CRYPTO_ALGAPI
|
||||
- tristate
|
||||
+ tristate "ALGAPI"
|
||||
select CRYPTO_ALGAPI2
|
||||
help
|
||||
This option provides the API for cryptographic algorithms.
|
||||
@@ -41,7 +41,7 @@ config CRYPTO_ALGAPI2
|
||||
tristate
|
||||
|
||||
config CRYPTO_AEAD
|
||||
- tristate
|
||||
+ tristate "AEAD"
|
||||
select CRYPTO_AEAD2
|
||||
select CRYPTO_ALGAPI
|
||||
|
||||
@@ -50,7 +50,7 @@ config CRYPTO_AEAD2
|
||||
select CRYPTO_ALGAPI2
|
||||
|
||||
config CRYPTO_BLKCIPHER
|
||||
- tristate
|
||||
+ tristate "BLKCIPHER"
|
||||
select CRYPTO_BLKCIPHER2
|
||||
select CRYPTO_ALGAPI
|
||||
|
||||
@@ -61,7 +61,7 @@ config CRYPTO_BLKCIPHER2
|
||||
select CRYPTO_WORKQUEUE
|
||||
|
||||
config CRYPTO_HASH
|
||||
- tristate
|
||||
+ tristate "HASH"
|
||||
select CRYPTO_HASH2
|
||||
select CRYPTO_ALGAPI
|
||||
|
||||
@@ -70,7 +70,7 @@ config CRYPTO_HASH2
|
||||
select CRYPTO_ALGAPI2
|
||||
|
||||
config CRYPTO_RNG
|
||||
- tristate
|
||||
+ tristate "RNG"
|
||||
select CRYPTO_RNG2
|
||||
select CRYPTO_ALGAPI
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
--- a/net/wireless/Kconfig
|
||||
+++ b/net/wireless/Kconfig
|
||||
@@ -1,5 +1,5 @@
|
||||
config WIRELESS_EXT
|
||||
- bool
|
||||
+ bool "Wireless extensions"
|
||||
|
||||
config WEXT_CORE
|
||||
def_bool y
|
||||
@@ -11,10 +11,10 @@ config WEXT_PROC
|
||||
depends on WEXT_CORE
|
||||
|
||||
config WEXT_SPY
|
||||
- bool
|
||||
+ bool "WEXT_SPY"
|
||||
|
||||
config WEXT_PRIV
|
||||
- bool
|
||||
+ bool "WEXT_PRIV"
|
||||
|
||||
config CFG80211
|
||||
tristate "cfg80211 - wireless configuration API"
|
||||
@@ -1,11 +0,0 @@
|
||||
--- a/net/netfilter/Kconfig
|
||||
+++ b/net/netfilter/Kconfig
|
||||
@@ -2,7 +2,7 @@ menu "Core Netfilter Configuration"
|
||||
depends on NET && INET && NETFILTER
|
||||
|
||||
config NETFILTER_NETLINK
|
||||
- tristate
|
||||
+ tristate "Netfilter NFNETLINK interface"
|
||||
|
||||
config NETFILTER_NETLINK_ACCT
|
||||
tristate "Netfilter NFACCT over NFNETLINK interface"
|
||||
@@ -1,83 +0,0 @@
|
||||
--- a/drivers/base/regmap/Kconfig
|
||||
+++ b/drivers/base/regmap/Kconfig
|
||||
@@ -3,29 +3,35 @@
|
||||
# subsystems should select the appropriate symbols.
|
||||
|
||||
config REGMAP
|
||||
- default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI || REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ)
|
||||
select LZO_COMPRESS
|
||||
select LZO_DECOMPRESS
|
||||
select IRQ_DOMAIN if REGMAP_IRQ
|
||||
- bool
|
||||
+ tristate "Regmap"
|
||||
|
||||
config REGMAP_AC97
|
||||
+ select REGMAP
|
||||
tristate
|
||||
|
||||
config REGMAP_I2C
|
||||
- tristate
|
||||
+ tristate "Regmap I2C"
|
||||
+ select REGMAP
|
||||
depends on I2C
|
||||
|
||||
config REGMAP_SPI
|
||||
- tristate
|
||||
+ tristate "Regmap SPI"
|
||||
+ select REGMAP
|
||||
+ depends on SPI_MASTER
|
||||
depends on SPI
|
||||
|
||||
config REGMAP_SPMI
|
||||
+ select REGMAP
|
||||
tristate
|
||||
depends on SPMI
|
||||
|
||||
config REGMAP_MMIO
|
||||
+ select REGMAP
|
||||
tristate
|
||||
|
||||
config REGMAP_IRQ
|
||||
+ select REGMAP
|
||||
bool
|
||||
--- a/include/linux/regmap.h
|
||||
+++ b/include/linux/regmap.h
|
||||
@@ -50,7 +50,7 @@ struct reg_default {
|
||||
unsigned int def;
|
||||
};
|
||||
|
||||
-#ifdef CONFIG_REGMAP
|
||||
+#if IS_ENABLED(CONFIG_REGMAP)
|
||||
|
||||
enum regmap_endian {
|
||||
/* Unspecified -> 0 -> Backwards compatible default */
|
||||
--- a/drivers/base/regmap/Makefile
|
||||
+++ b/drivers/base/regmap/Makefile
|
||||
@@ -1,6 +1,8 @@
|
||||
-obj-$(CONFIG_REGMAP) += regmap.o regcache.o
|
||||
-obj-$(CONFIG_REGMAP) += regcache-rbtree.o regcache-lzo.o regcache-flat.o
|
||||
-obj-$(CONFIG_DEBUG_FS) += regmap-debugfs.o
|
||||
+regmap-core-objs = regmap.o regcache.o regcache-rbtree.o regcache-lzo.o regcache-flat.o
|
||||
+ifdef CONFIG_DEBUG_FS
|
||||
+regmap-core-objs += regmap-debugfs.o
|
||||
+endif
|
||||
+obj-$(CONFIG_REGMAP) += regmap-core.o
|
||||
obj-$(CONFIG_REGMAP_AC97) += regmap-ac97.o
|
||||
obj-$(CONFIG_REGMAP_I2C) += regmap-i2c.o
|
||||
obj-$(CONFIG_REGMAP_SPI) += regmap-spi.o
|
||||
--- a/drivers/base/regmap/regmap.c
|
||||
+++ b/drivers/base/regmap/regmap.c
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <linux/device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/export.h>
|
||||
+#include <linux/module.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/of.h>
|
||||
@@ -2632,3 +2633,5 @@ static int __init regmap_initcall(void)
|
||||
return 0;
|
||||
}
|
||||
postcore_initcall(regmap_initcall);
|
||||
+
|
||||
+MODULE_LICENSE("GPL");
|
||||
@@ -1,37 +0,0 @@
|
||||
--- a/crypto/Kconfig
|
||||
+++ b/crypto/Kconfig
|
||||
@@ -96,10 +96,10 @@ config CRYPTO_MANAGER
|
||||
|
||||
config CRYPTO_MANAGER2
|
||||
def_tristate CRYPTO_MANAGER || (CRYPTO_MANAGER!=n && CRYPTO_ALGAPI=y)
|
||||
- select CRYPTO_AEAD2
|
||||
- select CRYPTO_HASH2
|
||||
- select CRYPTO_BLKCIPHER2
|
||||
- select CRYPTO_PCOMP2
|
||||
+ select CRYPTO_AEAD2 if !CRYPTO_MANAGER_DISABLE_TESTS
|
||||
+ select CRYPTO_HASH2 if !CRYPTO_MANAGER_DISABLE_TESTS
|
||||
+ select CRYPTO_BLKCIPHER2 if !CRYPTO_MANAGER_DISABLE_TESTS
|
||||
+ select CRYPTO_PCOMP2 if !CRYPTO_MANAGER_DISABLE_TESTS
|
||||
|
||||
config CRYPTO_USER
|
||||
tristate "Userspace cryptographic algorithm configuration"
|
||||
--- a/crypto/algboss.c
|
||||
+++ b/crypto/algboss.c
|
||||
@@ -248,6 +248,9 @@ static int cryptomgr_schedule_test(struc
|
||||
type = alg->cra_flags;
|
||||
|
||||
/* This piece of crap needs to disappear into per-type test hooks. */
|
||||
+#ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
|
||||
+ type |= CRYPTO_ALG_TESTED;
|
||||
+#else
|
||||
if ((!((type ^ CRYPTO_ALG_TYPE_BLKCIPHER) &
|
||||
CRYPTO_ALG_TYPE_BLKCIPHER_MASK) && !(type & CRYPTO_ALG_GENIV) &&
|
||||
((alg->cra_flags & CRYPTO_ALG_TYPE_MASK) ==
|
||||
@@ -256,6 +259,7 @@ static int cryptomgr_schedule_test(struc
|
||||
(!((type ^ CRYPTO_ALG_TYPE_AEAD) & CRYPTO_ALG_TYPE_MASK) &&
|
||||
alg->cra_type == &crypto_nivaead_type && alg->cra_aead.ivsize))
|
||||
type |= CRYPTO_ALG_TESTED;
|
||||
+#endif
|
||||
|
||||
param->type = type;
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
--- a/lib/Kconfig
|
||||
+++ b/lib/Kconfig
|
||||
@@ -214,25 +214,25 @@ config RANDOM32_SELFTEST
|
||||
# compression support is select'ed if needed
|
||||
#
|
||||
config ZLIB_INFLATE
|
||||
- tristate
|
||||
+ tristate "ZLIB inflate support"
|
||||
|
||||
config ZLIB_DEFLATE
|
||||
- tristate
|
||||
+ tristate "ZLIB deflate support"
|
||||
|
||||
config LZO_COMPRESS
|
||||
- tristate
|
||||
+ tristate "LZO compress support"
|
||||
|
||||
config LZO_DECOMPRESS
|
||||
- tristate
|
||||
+ tristate "LZO decompress support"
|
||||
|
||||
config LZ4_COMPRESS
|
||||
- tristate
|
||||
+ tristate "LZ4 compress support"
|
||||
|
||||
config LZ4HC_COMPRESS
|
||||
- tristate
|
||||
+ tristate "LZ4HC compress support"
|
||||
|
||||
config LZ4_DECOMPRESS
|
||||
- tristate
|
||||
+ tristate "LZ4 decompress support"
|
||||
|
||||
source "lib/xz/Kconfig"
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
--- a/include/uapi/linux/if_bridge.h
|
||||
+++ b/include/uapi/linux/if_bridge.h
|
||||
@@ -15,7 +15,6 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/if_ether.h>
|
||||
-#include <linux/in6.h>
|
||||
|
||||
#define SYSFS_BRIDGE_ATTR "bridge"
|
||||
#define SYSFS_BRIDGE_FDB "brforward"
|
||||
@@ -1,39 +0,0 @@
|
||||
From: Mark Miller <mark@mirell.org>
|
||||
|
||||
This exposes the CONFIG_BOOT_RAW symbol in Kconfig. This is needed on
|
||||
certain Broadcom chipsets running CFE in order to load the kernel.
|
||||
|
||||
Signed-off-by: Mark Miller <mark@mirell.org>
|
||||
Acked-by: Rob Landley <rob@landley.net>
|
||||
---
|
||||
--- a/arch/mips/Kconfig
|
||||
+++ b/arch/mips/Kconfig
|
||||
@@ -941,9 +941,6 @@ config FW_ARC
|
||||
config ARCH_MAY_HAVE_PC_FDC
|
||||
bool
|
||||
|
||||
-config BOOT_RAW
|
||||
- bool
|
||||
-
|
||||
config CEVT_BCM1480
|
||||
bool
|
||||
|
||||
@@ -2594,6 +2591,18 @@ config USE_OF
|
||||
config BUILTIN_DTB
|
||||
bool
|
||||
|
||||
+config BOOT_RAW
|
||||
+ bool "Enable the kernel to be executed from the load address"
|
||||
+ default n
|
||||
+ help
|
||||
+ Allow the kernel to be executed from the load address for
|
||||
+ bootloaders which cannot read the ELF format. This places
|
||||
+ a jump to start_kernel at the load address.
|
||||
+
|
||||
+ If unsure, say N.
|
||||
+
|
||||
+
|
||||
+
|
||||
endmenu
|
||||
|
||||
config LOCKDEP_SUPPORT
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user