mirror of
git://git.yoctoproject.org/meta-rockchip.git
synced 2025-07-19 12:49:03 +02:00
Add new recipe for linux-veyron
This is the linux kernel tree used by Google on veyron-based chromebooks. Signed-off-by: Romain Perier <romain.perier@gmail.com>
This commit is contained in:
parent
5b764a3729
commit
9e09b09400
|
@ -0,0 +1,30 @@
|
||||||
|
From d1f7cbbd8efbc022222d84a697595ba9f6637de0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kevin Mihelich <kevin@archlinuxarm.org>
|
||||||
|
Date: Thu, 25 Jun 2015 20:35:06 -0600
|
||||||
|
Subject: [PATCH 1/4] use chromiumos mwifiex drivers
|
||||||
|
|
||||||
|
Signed-off-by: Kevin Mihelich <kevin@archlinuxarm.org>
|
||||||
|
---
|
||||||
|
drivers/net/wireless-3.8/mwifiex/sdio.h | 6 +++---
|
||||||
|
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless-3.8/mwifiex/sdio.h b/drivers/net/wireless-3.8/mwifiex/sdio.h
|
||||||
|
index f9ee413..9686025 100644
|
||||||
|
--- a/drivers/net/wireless-3.8/mwifiex/sdio.h
|
||||||
|
+++ b/drivers/net/wireless-3.8/mwifiex/sdio.h
|
||||||
|
@@ -30,9 +30,9 @@
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#define SD8786_DEFAULT_FW_NAME "mrvl/sd8786_uapsta.bin"
|
||||||
|
-#define SD8787_DEFAULT_FW_NAME "mrvl/sd8787_uapsta.bin"
|
||||||
|
-#define SD8797_DEFAULT_FW_NAME "mrvl/sd8797_uapsta.bin"
|
||||||
|
-#define SD8897_DEFAULT_FW_NAME "mrvl/sd8897_uapsta.bin"
|
||||||
|
+#define SD8787_DEFAULT_FW_NAME "mrvl/sd8787_uapsta_cros.bin"
|
||||||
|
+#define SD8797_DEFAULT_FW_NAME "mrvl/sd8797_uapsta_cros.bin"
|
||||||
|
+#define SD8897_DEFAULT_FW_NAME "mrvl/sd8897_uapsta_cros.bin"
|
||||||
|
#define SD8887_DEFAULT_FW_NAME "mrvl/sd8887_wlan_a2.bin"
|
||||||
|
|
||||||
|
#define BLOCK_MODE 1
|
||||||
|
--
|
||||||
|
2.4.4
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
From d24fdf29978108413eb405302255139fdbb94a16 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Bing Zhao <bzhao@marvell.com>
|
||||||
|
Date: Mon, 19 Aug 2013 16:10:21 -0700
|
||||||
|
Subject: [PATCH 2/4] mwifiex: do not create AP and P2P interfaces upon driver
|
||||||
|
loading
|
||||||
|
|
||||||
|
Bug 60747 - 1286:2044 [Microsoft Surface Pro]
|
||||||
|
Marvell 88W8797 wifi show 3 interface under network
|
||||||
|
https://bugzilla.kernel.org/show_bug.cgi?id=60747
|
||||||
|
|
||||||
|
This issue was also reported previously by OLPC and some folks from
|
||||||
|
the community.
|
||||||
|
|
||||||
|
There are 3 network interfaces with different types being created
|
||||||
|
when mwifiex driver is loaded:
|
||||||
|
|
||||||
|
1. mlan0 (infra. STA)
|
||||||
|
2. uap0 (AP)
|
||||||
|
3. p2p0 (P2P_CLIENT)
|
||||||
|
|
||||||
|
The Network Manager attempts to use all 3 interfaces above without
|
||||||
|
filtering the managed interface type. As the result, 3 identical
|
||||||
|
interfaces are displayed under network manager. If user happens to
|
||||||
|
click on an entry under which its interface is uap0 or p2p0, the
|
||||||
|
association will fail.
|
||||||
|
|
||||||
|
Work around it by removing the creation of AP and P2P interfaces
|
||||||
|
at driver loading time. These interfaces can be added with 'iw' or
|
||||||
|
other applications manually when they are needed.
|
||||||
|
|
||||||
|
Signed-off-by: Bing Zhao <bzhao@marvell.com>
|
||||||
|
Signed-off-by: Avinash Patil <patila@marvell.com>
|
||||||
|
---
|
||||||
|
drivers/net/wireless-3.8/mwifiex/main.c | 13 -------------
|
||||||
|
1 file changed, 13 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless-3.8/mwifiex/main.c b/drivers/net/wireless-3.8/mwifiex/main.c
|
||||||
|
index b3f9247..a503264 100644
|
||||||
|
--- a/drivers/net/wireless-3.8/mwifiex/main.c
|
||||||
|
+++ b/drivers/net/wireless-3.8/mwifiex/main.c
|
||||||
|
@@ -515,19 +515,6 @@ static void mwifiex_fw_dpc(const struct firmware *firmware, void *context)
|
||||||
|
goto err_add_intf;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* Create AP interface by default */
|
||||||
|
- if (!mwifiex_add_virtual_intf(adapter->wiphy, "uap%d",
|
||||||
|
- NL80211_IFTYPE_AP, NULL, NULL)) {
|
||||||
|
- dev_err(adapter->dev, "cannot create default AP interface\n");
|
||||||
|
- goto err_add_intf;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- /* Create P2P interface by default */
|
||||||
|
- if (!mwifiex_add_virtual_intf(adapter->wiphy, "p2p%d",
|
||||||
|
- NL80211_IFTYPE_P2P_CLIENT, NULL, NULL)) {
|
||||||
|
- dev_err(adapter->dev, "cannot create default P2P interface\n");
|
||||||
|
- goto err_add_intf;
|
||||||
|
- }
|
||||||
|
rtnl_unlock();
|
||||||
|
|
||||||
|
mwifiex_drv_get_driver_version(adapter, fmt, sizeof(fmt) - 1);
|
||||||
|
--
|
||||||
|
2.4.4
|
||||||
|
|
|
@ -0,0 +1,306 @@
|
||||||
|
From c0c863786b85a631e22eeae78f572d3f151af490 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Heiko Stuebner <heiko@sntech.de>
|
||||||
|
Date: Mon, 25 May 2015 16:38:07 +0200
|
||||||
|
Subject: [PATCH 3/4] UPSTREAM: soc/rockchip: add handler for usb-uart
|
||||||
|
functionality
|
||||||
|
|
||||||
|
Some Rockchip SoCs provide the possibility to use a usb-phy as passthru for
|
||||||
|
the debug uart, making it possible to get console output without needing to
|
||||||
|
open the device.
|
||||||
|
|
||||||
|
This patch adds an early_initcall to enable this functionality conditionally
|
||||||
|
and also disables the corresponding usb controller in the devicetree.
|
||||||
|
|
||||||
|
Change-Id: I397df8f402c752125cf512332398757b91a899f8
|
||||||
|
Signed-off-by: Alexandru M Stan <amstan@chromium.org>
|
||||||
|
---
|
||||||
|
drivers/soc/Kconfig | 1 +
|
||||||
|
drivers/soc/Makefile | 1 +
|
||||||
|
drivers/soc/rockchip/Kconfig | 13 ++
|
||||||
|
drivers/soc/rockchip/Makefile | 1 +
|
||||||
|
drivers/soc/rockchip/rockchip_usb_uart.c | 223 +++++++++++++++++++++++++++++++
|
||||||
|
5 files changed, 239 insertions(+)
|
||||||
|
create mode 100644 drivers/soc/rockchip/Kconfig
|
||||||
|
create mode 100644 drivers/soc/rockchip/Makefile
|
||||||
|
create mode 100644 drivers/soc/rockchip/rockchip_usb_uart.c
|
||||||
|
|
||||||
|
diff --git a/drivers/soc/Kconfig b/drivers/soc/Kconfig
|
||||||
|
index 1ee0b57..ad2f71a 100644
|
||||||
|
--- a/drivers/soc/Kconfig
|
||||||
|
+++ b/drivers/soc/Kconfig
|
||||||
|
@@ -2,6 +2,7 @@ menu "SOC (System On Chip) specific Drivers"
|
||||||
|
|
||||||
|
source "drivers/soc/img/Kconfig"
|
||||||
|
source "drivers/soc/qcom/Kconfig"
|
||||||
|
+source "drivers/soc/rockchip/Kconfig"
|
||||||
|
source "drivers/soc/tegra/Kconfig"
|
||||||
|
|
||||||
|
endmenu
|
||||||
|
diff --git a/drivers/soc/Makefile b/drivers/soc/Makefile
|
||||||
|
index bc43b87..d80386c 100644
|
||||||
|
--- a/drivers/soc/Makefile
|
||||||
|
+++ b/drivers/soc/Makefile
|
||||||
|
@@ -4,4 +4,5 @@
|
||||||
|
|
||||||
|
obj-$(CONFIG_SOC_IMG) += img/
|
||||||
|
obj-$(CONFIG_ARCH_QCOM) += qcom/
|
||||||
|
+obj-$(CONFIG_ARCH_ROCKCHIP) += rockchip/
|
||||||
|
obj-$(CONFIG_ARCH_TEGRA) += tegra/
|
||||||
|
diff --git a/drivers/soc/rockchip/Kconfig b/drivers/soc/rockchip/Kconfig
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..24d4e05
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/soc/rockchip/Kconfig
|
||||||
|
@@ -0,0 +1,13 @@
|
||||||
|
+#
|
||||||
|
+# Rockchip Soc drivers
|
||||||
|
+#
|
||||||
|
+config ROCKCHIP_USB_UART
|
||||||
|
+ bool "Rockchip usb-uart override"
|
||||||
|
+ depends on ARCH_ROCKCHIP
|
||||||
|
+ select MFD_SYSCON
|
||||||
|
+ help
|
||||||
|
+ Say y here to enable usb-uart functionality. Newer Rockchip SoCs
|
||||||
|
+ provide means to repurpose one usb phy as uart2 output, making it
|
||||||
|
+ possible to get debug output without needing to open a device.
|
||||||
|
+ To enable this function on boot, add a rockchip.usb_uart option
|
||||||
|
+ to the kernel commandline.
|
||||||
|
diff --git a/drivers/soc/rockchip/Makefile b/drivers/soc/rockchip/Makefile
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..b5dd6f8
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/soc/rockchip/Makefile
|
||||||
|
@@ -0,0 +1 @@
|
||||||
|
+obj-$(CONFIG_ROCKCHIP_USB_UART) += rockchip_usb_uart.o
|
||||||
|
diff --git a/drivers/soc/rockchip/rockchip_usb_uart.c b/drivers/soc/rockchip/rockchip_usb_uart.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..97754f9
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/soc/rockchip/rockchip_usb_uart.c
|
||||||
|
@@ -0,0 +1,223 @@
|
||||||
|
+/*
|
||||||
|
+ * Copyright (c) 2015 Heiko Stuebner <heiko@sntech.de>
|
||||||
|
+ *
|
||||||
|
+ * 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.
|
||||||
|
+ *
|
||||||
|
+ * This program is distributed in the hope that it will be useful,
|
||||||
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+ * GNU General Public License for more details.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <linux/kernel.h>
|
||||||
|
+#include <linux/init.h>
|
||||||
|
+#include <linux/errno.h>
|
||||||
|
+#include <linux/mfd/syscon.h>
|
||||||
|
+#include <linux/of_address.h>
|
||||||
|
+#include <linux/of_platform.h>
|
||||||
|
+#include <linux/regmap.h>
|
||||||
|
+#include <linux/slab.h>
|
||||||
|
+
|
||||||
|
+#define HIWORD_UPDATE(val, mask) \
|
||||||
|
+ ((val) | (mask) << 16)
|
||||||
|
+
|
||||||
|
+struct rockchip_uart_data {
|
||||||
|
+ const char *grf_compatible;
|
||||||
|
+ const char *usb_compatible;
|
||||||
|
+ phys_addr_t usb_phys_addr;
|
||||||
|
+ int (*init_uart)(const struct rockchip_uart_data *data,
|
||||||
|
+ struct regmap *grf);
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int enable_usb_uart = 0;
|
||||||
|
+
|
||||||
|
+#define RK3288_UOC0_CON0 0x320
|
||||||
|
+#define RK3288_UOC0_CON0_COMMON_ON_N BIT(0)
|
||||||
|
+#define RK3288_UOC0_CON0_DISABLE BIT(4)
|
||||||
|
+
|
||||||
|
+#define RK3288_UOC0_CON2 0x328
|
||||||
|
+#define RK3288_UOC0_CON2_SOFT_CON_SEL BIT(2)
|
||||||
|
+
|
||||||
|
+#define RK3288_UOC0_CON3 0x32c
|
||||||
|
+#define RK3288_UOC0_CON3_UTMI_SUSPENDN BIT(0)
|
||||||
|
+#define RK3288_UOC0_CON3_UTMI_OPMODE_NODRIVING (1 << 1)
|
||||||
|
+#define RK3288_UOC0_CON3_UTMI_OPMODE_MASK (3 << 1)
|
||||||
|
+#define RK3288_UOC0_CON3_UTMI_XCVRSEELCT_FSTRANSC (1 << 3)
|
||||||
|
+#define RK3288_UOC0_CON3_UTMI_XCVRSEELCT_MASK (3 << 3)
|
||||||
|
+#define RK3288_UOC0_CON3_UTMI_TERMSEL_FULLSPEED BIT(5)
|
||||||
|
+#define RK3288_UOC0_CON3_BYPASSDMEN BIT(6)
|
||||||
|
+#define RK3288_UOC0_CON3_BYPASSSEL BIT(7)
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Enable the bypass of uart2 data through the otg usb phy.
|
||||||
|
+ * Original description in the TRM.
|
||||||
|
+ * 1. Disable the OTG block by setting OTGDISABLE0 to 1’b1.
|
||||||
|
+ * 2. Disable the pull-up resistance on the D+ line by setting OPMODE0[1:0] to 2’b01.
|
||||||
|
+ * 3. To ensure that the XO, Bias, and PLL blocks are powered down in Suspend mode, set COMMONONN to 1’b1.
|
||||||
|
+ * 4. Place the USB PHY in Suspend mode by setting SUSPENDM0 to 1’b0.
|
||||||
|
+ * 5. Set BYPASSSEL0 to 1’b1.
|
||||||
|
+ * 6. To transmit data, controls BYPASSDMEN0, and BYPASSDMDATA0.
|
||||||
|
+ * To receive data, monitor FSVPLUS0.
|
||||||
|
+ *
|
||||||
|
+ * The actual code in the vendor kernel does some things differently.
|
||||||
|
+ */
|
||||||
|
+static int __init rk3288_init_usb_uart(const struct rockchip_uart_data *data,
|
||||||
|
+ struct regmap *grf)
|
||||||
|
+{
|
||||||
|
+ u32 val;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ pr_info("%s\n", __func__);
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * COMMON_ON and DISABLE settings are described in the TRM,
|
||||||
|
+ * but where not present in the original code.
|
||||||
|
+ */
|
||||||
|
+ val = HIWORD_UPDATE(RK3288_UOC0_CON0_COMMON_ON_N
|
||||||
|
+ | RK3288_UOC0_CON0_DISABLE,
|
||||||
|
+ RK3288_UOC0_CON0_COMMON_ON_N
|
||||||
|
+ | RK3288_UOC0_CON0_DISABLE);
|
||||||
|
+ ret = regmap_write(grf, RK3288_UOC0_CON0, val);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ // FIXME: this makes my system hang, for whatever reason
|
||||||
|
+ val = HIWORD_UPDATE(RK3288_UOC0_CON2_SOFT_CON_SEL,
|
||||||
|
+ RK3288_UOC0_CON2_SOFT_CON_SEL);
|
||||||
|
+ ret = regmap_write(grf, RK3288_UOC0_CON2, val);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ val = HIWORD_UPDATE(RK3288_UOC0_CON3_UTMI_OPMODE_NODRIVING
|
||||||
|
+ | RK3288_UOC0_CON3_UTMI_XCVRSEELCT_FSTRANSC
|
||||||
|
+ | RK3288_UOC0_CON3_UTMI_TERMSEL_FULLSPEED,
|
||||||
|
+ RK3288_UOC0_CON3_UTMI_SUSPENDN
|
||||||
|
+ | RK3288_UOC0_CON3_UTMI_OPMODE_MASK
|
||||||
|
+ | RK3288_UOC0_CON3_UTMI_XCVRSEELCT_MASK
|
||||||
|
+ | RK3288_UOC0_CON3_UTMI_TERMSEL_FULLSPEED);
|
||||||
|
+ ret = regmap_write(grf, RK3288_UOC0_CON3, val);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ val = HIWORD_UPDATE(RK3288_UOC0_CON3_BYPASSSEL
|
||||||
|
+ | RK3288_UOC0_CON3_BYPASSDMEN,
|
||||||
|
+ RK3288_UOC0_CON3_BYPASSSEL
|
||||||
|
+ | RK3288_UOC0_CON3_BYPASSDMEN);
|
||||||
|
+ ret = regmap_write(grf, RK3288_UOC0_CON3, val);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+const struct rockchip_uart_data rk3288_uart_data = {
|
||||||
|
+ .grf_compatible = "rockchip,rk3288-grf",
|
||||||
|
+ .usb_compatible = "rockchip,rk3288-usb",
|
||||||
|
+ .usb_phys_addr = 0xff580000,
|
||||||
|
+ .init_uart = rk3288_init_usb_uart,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct of_device_id rockchip_usb_uart_ids[] = {
|
||||||
|
+ { .compatible = "rockchip,rk3288", .data = &rk3288_uart_data },
|
||||||
|
+ { }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Find the usb controller using the shared usb-uart-phy in the dts and
|
||||||
|
+ * disable it.
|
||||||
|
+ */
|
||||||
|
+static int __init
|
||||||
|
+rockchip_disable_usb_controller(const struct rockchip_uart_data *data)
|
||||||
|
+{
|
||||||
|
+ struct device_node *np;
|
||||||
|
+
|
||||||
|
+ for_each_compatible_node(np, NULL, data->usb_compatible) {
|
||||||
|
+ struct property *new_status;
|
||||||
|
+ struct resource res;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ ret = of_address_to_resource(np, 0, &res);
|
||||||
|
+ if (ret) {
|
||||||
|
+ pr_err("%s: could not get address of usb controller %s\n",
|
||||||
|
+ __func__, np->full_name);
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* not the controller we're looking for */
|
||||||
|
+ if (res.start != data->usb_phys_addr)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ pr_info("%s: disabling usb controller %s\n",
|
||||||
|
+ __func__, np->full_name);
|
||||||
|
+
|
||||||
|
+ new_status = kzalloc(sizeof(*new_status), GFP_KERNEL);
|
||||||
|
+ if (!new_status)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ new_status->name = kstrdup("status", GFP_KERNEL);
|
||||||
|
+ new_status->length = sizeof("disabled");
|
||||||
|
+ new_status->value = kstrdup("disabled", GFP_KERNEL);
|
||||||
|
+
|
||||||
|
+ return of_update_property(np, new_status);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct of_device_id *rockchip_usb_uart_data_lookup(void)
|
||||||
|
+{
|
||||||
|
+ struct device_node *root;
|
||||||
|
+ const struct of_device_id *id;
|
||||||
|
+
|
||||||
|
+ root = of_find_node_by_path("/");
|
||||||
|
+ if (!root)
|
||||||
|
+ return NULL;
|
||||||
|
+
|
||||||
|
+ id = of_match_node(rockchip_usb_uart_ids, root);
|
||||||
|
+ of_node_put(root);
|
||||||
|
+
|
||||||
|
+ return id;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int __init rockchip_init_usb_uart(void)
|
||||||
|
+{
|
||||||
|
+ const struct of_device_id *match;
|
||||||
|
+ const struct rockchip_uart_data *data;
|
||||||
|
+ struct regmap *grf;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ if (!enable_usb_uart)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ match = rockchip_usb_uart_data_lookup();
|
||||||
|
+ if (!match)
|
||||||
|
+ return -ENOTSUPP;
|
||||||
|
+
|
||||||
|
+ pr_info("%s: using settings for %s\n", __func__, match->compatible);
|
||||||
|
+ data = match->data;
|
||||||
|
+
|
||||||
|
+ grf = syscon_regmap_lookup_by_compatible(data->grf_compatible);
|
||||||
|
+ if (IS_ERR(grf)) {
|
||||||
|
+ pr_err("%s: could not find GRF syscon\n", __func__);
|
||||||
|
+ return PTR_ERR(grf);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = data->init_uart(data, grf);
|
||||||
|
+ if (ret) {
|
||||||
|
+ pr_err("%s: could not init usb_uart\n", __func__);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return rockchip_disable_usb_controller(data);
|
||||||
|
+}
|
||||||
|
+early_initcall(rockchip_init_usb_uart);
|
||||||
|
+
|
||||||
|
+static int __init rockchip_usb_uart(char *buf)
|
||||||
|
+{
|
||||||
|
+ enable_usb_uart = true;
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+early_param("rockchip.usb_uart", rockchip_usb_uart);
|
||||||
|
--
|
||||||
|
2.4.4
|
||||||
|
|
|
@ -0,0 +1,114 @@
|
||||||
|
From 6dc781566c97f06b5c0d491f34c9b23e72cb74be Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kevin Mihelich <kevin@archlinuxarm.org>
|
||||||
|
Date: Thu, 2 Jul 2015 17:48:41 -0600
|
||||||
|
Subject: [PATCH 4/4] fix brcmfmac oops and race condition
|
||||||
|
|
||||||
|
This fixes a potential null pointer dereference by checking if null before
|
||||||
|
freeing the vif struct.
|
||||||
|
|
||||||
|
Also works around a race condition between brcm_patchram_plus loading the BT
|
||||||
|
firmware, which exposes the wireless device, and the kernel loading bcrmfmac.
|
||||||
|
100ms delay loops up to 1s are added around the first three initialization
|
||||||
|
functions to hold off a failure until the device is actually ready. This is a
|
||||||
|
hack.
|
||||||
|
|
||||||
|
Signed-off-by: Kevin Mihelich <kevin@archlinuxarm.org>
|
||||||
|
---
|
||||||
|
.../wireless-3.8/brcm80211/brcmfmac/dhd_common.c | 47 ++++++++++++++--------
|
||||||
|
.../wireless-3.8/brcm80211/brcmfmac/dhd_linux.c | 4 +-
|
||||||
|
2 files changed, 32 insertions(+), 19 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless-3.8/brcm80211/brcmfmac/dhd_common.c b/drivers/net/wireless-3.8/brcm80211/brcmfmac/dhd_common.c
|
||||||
|
index 05d4042..7006d19 100644
|
||||||
|
--- a/drivers/net/wireless-3.8/brcm80211/brcmfmac/dhd_common.c
|
||||||
|
+++ b/drivers/net/wireless-3.8/brcm80211/brcmfmac/dhd_common.c
|
||||||
|
@@ -252,25 +252,34 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
|
||||||
|
struct brcmf_join_pref_params join_pref_params[2];
|
||||||
|
char *ptr;
|
||||||
|
s32 err;
|
||||||
|
+ int i;
|
||||||
|
|
||||||
|
/* retreive mac address */
|
||||||
|
- err = brcmf_fil_iovar_data_get(ifp, "cur_etheraddr", ifp->mac_addr,
|
||||||
|
- sizeof(ifp->mac_addr));
|
||||||
|
- if (err < 0) {
|
||||||
|
- brcmf_err("Retreiving cur_etheraddr failed, %d\n",
|
||||||
|
- err);
|
||||||
|
- goto done;
|
||||||
|
+ for (i = 0; i < 9; i++) {
|
||||||
|
+ err = brcmf_fil_iovar_data_get(ifp, "cur_etheraddr", ifp->mac_addr,
|
||||||
|
+ sizeof(ifp->mac_addr));
|
||||||
|
+ if (err < 0 && i == 9) {
|
||||||
|
+ brcmf_err("Retreiving cur_etheraddr failed, %d\n",
|
||||||
|
+ err);
|
||||||
|
+ goto done;
|
||||||
|
+ } else {
|
||||||
|
+ msleep(100);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
memcpy(ifp->drvr->mac, ifp->mac_addr, sizeof(ifp->drvr->mac));
|
||||||
|
|
||||||
|
/* query for 'ver' to get version info from firmware */
|
||||||
|
- memset(buf, 0, sizeof(buf));
|
||||||
|
- strcpy(buf, "ver");
|
||||||
|
- err = brcmf_fil_iovar_data_get(ifp, "ver", buf, sizeof(buf));
|
||||||
|
- if (err < 0) {
|
||||||
|
- brcmf_err("Retreiving version information failed, %d\n",
|
||||||
|
- err);
|
||||||
|
- goto done;
|
||||||
|
+ for (i = 0; i < 10; i++) {
|
||||||
|
+ memset(buf, 0, sizeof(buf));
|
||||||
|
+ strcpy(buf, "ver");
|
||||||
|
+ err = brcmf_fil_iovar_data_get(ifp, "ver", buf, sizeof(buf));
|
||||||
|
+ if (err < 0 && i == 9) {
|
||||||
|
+ brcmf_err("Retreiving version information failed, %d\n",
|
||||||
|
+ err);
|
||||||
|
+ goto done;
|
||||||
|
+ } else {
|
||||||
|
+ msleep(100);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
ptr = (char *)buf;
|
||||||
|
strsep(&ptr, "\n");
|
||||||
|
@@ -283,10 +292,14 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
|
||||||
|
strlcpy(ifp->drvr->fwver, ptr, sizeof(ifp->drvr->fwver));
|
||||||
|
|
||||||
|
/* set mpc */
|
||||||
|
- err = brcmf_fil_iovar_int_set(ifp, "mpc", 1);
|
||||||
|
- if (err) {
|
||||||
|
- brcmf_err("failed setting mpc\n");
|
||||||
|
- goto done;
|
||||||
|
+ for (i = 0; i < 10; i++) {
|
||||||
|
+ err = brcmf_fil_iovar_int_set(ifp, "mpc", 1);
|
||||||
|
+ if (err && i == 9) {
|
||||||
|
+ brcmf_err("failed setting mpc\n");
|
||||||
|
+ goto done;
|
||||||
|
+ } else {
|
||||||
|
+ msleep(100);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
diff --git a/drivers/net/wireless-3.8/brcm80211/brcmfmac/dhd_linux.c b/drivers/net/wireless-3.8/brcm80211/brcmfmac/dhd_linux.c
|
||||||
|
index 128161c..d3db8f7 100644
|
||||||
|
--- a/drivers/net/wireless-3.8/brcm80211/brcmfmac/dhd_linux.c
|
||||||
|
+++ b/drivers/net/wireless-3.8/brcm80211/brcmfmac/dhd_linux.c
|
||||||
|
@@ -974,13 +974,13 @@ fail:
|
||||||
|
brcmf_fws_deinit(drvr);
|
||||||
|
}
|
||||||
|
if (drvr->iflist[0]) {
|
||||||
|
- if (ifp->ndev->destructor == NULL)
|
||||||
|
+ if (ifp->ndev->destructor == NULL && ifp->vif)
|
||||||
|
brcmf_free_vif(ifp->vif);
|
||||||
|
free_netdev(ifp->ndev);
|
||||||
|
drvr->iflist[0] = NULL;
|
||||||
|
}
|
||||||
|
if (p2p_ifp) {
|
||||||
|
- if (p2p_ifp->ndev->destructor == NULL)
|
||||||
|
+ if (p2p_ifp->ndev->destructor == NULL && p2p_ifp->vif)
|
||||||
|
brcmf_free_vif(p2p_ifp->vif);
|
||||||
|
free_netdev(p2p_ifp->ndev);
|
||||||
|
drvr->iflist[1] = NULL;
|
||||||
|
--
|
||||||
|
2.4.4
|
||||||
|
|
4483
recipes-kernel/linux/linux-veyron/defconfig
Normal file
4483
recipes-kernel/linux/linux-veyron/defconfig
Normal file
File diff suppressed because it is too large
Load Diff
30
recipes-kernel/linux/linux-veyron_3.14.0.bb
Normal file
30
recipes-kernel/linux/linux-veyron_3.14.0.bb
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
# Copyright (C) 2015 Romain Perier
|
||||||
|
# Released under the MIT license (see COPYING.MIT for the terms)
|
||||||
|
|
||||||
|
inherit kernel
|
||||||
|
require recipes-kernel/linux/linux-yocto.inc
|
||||||
|
|
||||||
|
# As this package is really well integrated into archlinuxarm and applies interesting fixes,
|
||||||
|
# I synced my work with it. See https://github.com/archlinuxarm/PKGBUILDs/tree/master/core/linux-veyron
|
||||||
|
SRC_URI = "git://chromium.googlesource.com/chromiumos/third_party/kernel;protocol=http;nobranch=1 \
|
||||||
|
file://0001-use-chromiumos-mwifiex-drivers.patch \
|
||||||
|
file://0002-mwifiex-do-not-create-AP-and-P2P-interfaces-upon-dri.patch \
|
||||||
|
file://0003-UPSTREAM-soc-rockchip-add-handler-for-usb-uart-funct.patch \
|
||||||
|
file://0004-fix-brcmfmac-oops-and-race-condition.patch \
|
||||||
|
file://defconfig"
|
||||||
|
SRCREV = "6fa09265d61db1c29203c8194badebcfee86d97f"
|
||||||
|
|
||||||
|
# Override this variable in order to don't pass --noallconfig to configme,
|
||||||
|
# which restarts configuration from scratch most of the time
|
||||||
|
KCONFIG_MODE = " "
|
||||||
|
LINUX_VERSION = "3.14.0"
|
||||||
|
# Override local version in order to use the one generated by linux build system
|
||||||
|
# And not "yocto-standard"
|
||||||
|
LINUX_VERSION_EXTENSION = ""
|
||||||
|
PR = "r1"
|
||||||
|
PV = "${LINUX_VERSION}"
|
||||||
|
|
||||||
|
COMPATIBLE_MACHINE = "(rk3288-veyron-speedy)"
|
||||||
|
# The chromeos kernel uses the wifi subsystem v3.8
|
||||||
|
export WIFIVERSION="-3.8"
|
||||||
|
|
Loading…
Reference in New Issue
Block a user