[OpenWrt-Devel] [PATCH 1/3] swconfig: add (PHY) generic helper setting port link
Rafał Miłecki
zajec5 at gmail.com
Tue Jan 26 15:16:02 EST 2016
It's quite common for switches to have PHY per port so adding a generic
helper setting link state will help many drivers. It just neede an API
to access PHYs which this patch also adds.
Signed-off-by: Rafał Miłecki <zajec5 at gmail.com>
---
.../linux/generic/files/drivers/net/phy/swconfig.c | 36 ++++++++++++++++++++++
target/linux/generic/files/include/linux/switch.h | 6 ++++
2 files changed, 42 insertions(+)
diff --git a/target/linux/generic/files/drivers/net/phy/swconfig.c b/target/linux/generic/files/drivers/net/phy/swconfig.c
index 4bfe64f..68ddd24 100644
--- a/target/linux/generic/files/drivers/net/phy/swconfig.c
+++ b/target/linux/generic/files/drivers/net/phy/swconfig.c
@@ -25,6 +25,7 @@
#include <linux/switch.h>
#include <linux/of.h>
#include <linux/version.h>
+#include <uapi/linux/mii.h>
#define SWCONFIG_DEVNAME "switch%d"
@@ -1168,6 +1169,41 @@ unregister_switch(struct switch_dev *dev)
}
EXPORT_SYMBOL_GPL(unregister_switch);
+int
+switch_generic_set_link(struct switch_dev *dev, int port,
+ struct switch_port_link *link)
+{
+ if (WARN_ON(!dev->ops->phy_write16))
+ return -ENOTSUPP;
+
+ /* Generic implementation */
+ if (link->aneg) {
+ dev->ops->phy_write16(dev, port, MII_BMCR, 0x0000);
+ dev->ops->phy_write16(dev, port, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART);
+ } else {
+ u16 bmcr = 0;
+
+ if (link->duplex)
+ bmcr |= BMCR_FULLDPLX;
+
+ switch (link->speed) {
+ case SWITCH_PORT_SPEED_10:
+ break;
+ case SWITCH_PORT_SPEED_100:
+ bmcr |= BMCR_SPEED100;
+ break;
+ case SWITCH_PORT_SPEED_1000:
+ bmcr |= BMCR_SPEED1000;
+ break;
+ default:
+ return -ENOTSUPP;
+ }
+
+ dev->ops->phy_write16(dev, port, MII_BMCR, bmcr);
+ }
+
+ return 0;
+}
static int __init
swconfig_init(void)
diff --git a/target/linux/generic/files/include/linux/switch.h b/target/linux/generic/files/include/linux/switch.h
index 4ada0e5..0c4cce7 100644
--- a/target/linux/generic/files/include/linux/switch.h
+++ b/target/linux/generic/files/include/linux/switch.h
@@ -99,6 +99,9 @@ struct switch_dev_ops {
struct switch_port_link *link);
int (*get_port_stats)(struct switch_dev *dev, int port,
struct switch_port_stats *stats);
+
+ int (*phy_read16)(struct switch_dev *dev, int addr, u8 reg, u16 *value);
+ int (*phy_write16)(struct switch_dev *dev, int addr, u8 reg, u16 value);
};
struct switch_dev {
@@ -170,4 +173,7 @@ struct switch_attr {
int max;
};
+int switch_generic_set_link(struct switch_dev *dev, int port,
+ struct switch_port_link *link);
+
#endif /* _LINUX_SWITCH_H */
--
1.8.4.5
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list