7bbf4117c6
This add support for kernel 4.9 to the ar71xx target. It was compile tested with the generic, NAND and mikrotik subtarget. Multiple members of the community tested it on their boards and did not report any major problem so far. Especially the NAND part received some changes to adapt to the new kernel APIs. The serial driver hack used for the Arduino Yun was not ported because the kernel changed there a lot. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
61 lines
1.7 KiB
Diff
61 lines
1.7 KiB
Diff
From 66e584435ac0de6e0abeb6d7166fe4fe25d6bb73 Mon Sep 17 00:00:00 2001
|
|
From: Jonas Gorski <jogo@openwrt.org>
|
|
Date: Tue, 16 Jun 2015 13:15:08 +0200
|
|
Subject: [PATCH] phy/mdio-bitbang: prevent rescheduling during command
|
|
|
|
It seems some phys have some maximum timings for accessing the MDIO line,
|
|
resulting in bit errors under cpu stress. Prevent this from happening by
|
|
disabling interrupts when sending commands.
|
|
|
|
Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
|
---
|
|
drivers/net/phy/mdio-bitbang.c | 9 +++++++++
|
|
1 file changed, 9 insertions(+)
|
|
|
|
--- a/drivers/net/phy/mdio-bitbang.c
|
|
+++ b/drivers/net/phy/mdio-bitbang.c
|
|
@@ -17,6 +17,7 @@
|
|
* kind, whether express or implied.
|
|
*/
|
|
|
|
+#include <linux/irqflags.h>
|
|
#include <linux/module.h>
|
|
#include <linux/mdio-bitbang.h>
|
|
#include <linux/types.h>
|
|
@@ -156,7 +157,9 @@ static int mdiobb_read(struct mii_bus *b
|
|
{
|
|
struct mdiobb_ctrl *ctrl = bus->priv;
|
|
int ret;
|
|
+ unsigned long flags;
|
|
|
|
+ local_irq_save(flags);
|
|
if (reg & MII_ADDR_C45) {
|
|
reg = mdiobb_cmd_addr(ctrl, phy, reg);
|
|
mdiobb_cmd(ctrl, MDIO_C45_READ, phy, reg);
|
|
@@ -169,13 +172,17 @@ static int mdiobb_read(struct mii_bus *b
|
|
|
|
ret = mdiobb_get_num(ctrl, 16);
|
|
mdiobb_get_bit(ctrl);
|
|
+ local_irq_restore(flags);
|
|
+
|
|
return ret;
|
|
}
|
|
|
|
static int mdiobb_write(struct mii_bus *bus, int phy, int reg, u16 val)
|
|
{
|
|
struct mdiobb_ctrl *ctrl = bus->priv;
|
|
+ unsigned long flags;
|
|
|
|
+ local_irq_save(flags);
|
|
if (reg & MII_ADDR_C45) {
|
|
reg = mdiobb_cmd_addr(ctrl, phy, reg);
|
|
mdiobb_cmd(ctrl, MDIO_C45_WRITE, phy, reg);
|
|
@@ -190,6 +197,8 @@ static int mdiobb_write(struct mii_bus *
|
|
|
|
ctrl->ops->set_mdio_dir(ctrl, 0);
|
|
mdiobb_get_bit(ctrl);
|
|
+ local_irq_restore(flags);
|
|
+
|
|
return 0;
|
|
}
|
|
|