diff --git a/target/linux/generic/patches-3.2/710-phy-add-mdio_register_board_info.patch b/target/linux/generic/patches-3.2/710-phy-add-mdio_register_board_info.patch index 8cd6713785..aa62425b7a 100644 --- a/target/linux/generic/patches-3.2/710-phy-add-mdio_register_board_info.patch +++ b/target/linux/generic/patches-3.2/710-phy-add-mdio_register_board_info.patch @@ -1,51 +1,15 @@ --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c -@@ -36,6 +36,44 @@ +@@ -36,6 +36,8 @@ #include #include -+struct mdio_board_entry { -+ struct list_head list; -+ struct mdio_board_info board_info; -+}; -+ -+static LIST_HEAD(mdio_board_list); -+static DEFINE_MUTEX(mdio_board_lock); -+ -+/** -+ * mdio_register_board_info - register PHY devices for a given board -+ * @info: array of chip descriptors -+ * @n: how many descriptors are provided -+ * Context: can sleep -+ * -+ * The board info passed can safely be __initdata ... but be careful of -+ * any embedded pointers (platform_data, etc), they're copied as-is. -+ */ -+int __init -+mdiobus_register_board_info(struct mdio_board_info const *info, unsigned n) -+{ -+ struct mdio_board_entry *be; -+ int i; -+ -+ be = kzalloc(n * sizeof(*be), GFP_KERNEL); -+ if (!be) -+ return -ENOMEM; -+ -+ for (i = 0; i < n; i++, be++, info++) { -+ memcpy(&be->board_info, info, sizeof(*info)); -+ mutex_lock(&mdio_board_lock); -+ list_add_tail(&be->list, &mdio_board_list); -+ mutex_unlock(&mdio_board_lock); -+ } -+ -+ return 0; -+} -+ ++#include "mdio-boardinfo.h" + /** * mdiobus_alloc - allocate a mii_bus structure * -@@ -179,15 +217,31 @@ void mdiobus_free(struct mii_bus *bus) +@@ -179,15 +181,33 @@ void mdiobus_free(struct mii_bus *bus) } EXPORT_SYMBOL(mdiobus_free); @@ -70,26 +34,17 @@ if (IS_ERR(phydev) || phydev == NULL) return phydev; -+ list_for_each_entry(be, &mdio_board_list, list) ++ mutex_lock(&__mdio_board_lock); ++ list_for_each_entry(be, &__mdio_board_list, list) + mdiobus_setup_phydev_from_boardinfo(bus, phydev, + &be->board_info); ++ mutex_unlock(&__mdio_board_lock); + err = phy_device_register(phydev); if (err) { phy_device_free(phydev); --- a/include/linux/phy.h +++ b/include/linux/phy.h -@@ -394,8 +394,8 @@ struct phy_driver { - /* Determines the negotiated speed and duplex */ - int (*read_status)(struct phy_device *phydev); - -- /* -- * Update the value in phydev->link to reflect the -+ /* -+ * Update the value in phydev->link to reflect the - * current link value - */ - int (*update_link)(struct phy_device *phydev); @@ -538,4 +538,22 @@ int __init mdio_bus_init(void); void mdio_bus_exit(void); @@ -102,14 +57,135 @@ + const void *platform_data; +}; + -+#ifdef CONFIG_PHYLIB -+int mdiobus_register_board_info(struct mdio_board_info const *info, unsigned n); ++#ifdef CONFIG_MDIO_BOARDINFO ++int mdiobus_register_board_info(const struct mdio_board_info *info, unsigned n); +#else +static inline int -+mdiobus_register_board_info(struct mdio_board_info const *info, unsigned n) ++mdiobus_register_board_info(const struct mdio_board_info *info, unsigned n) +{ + return 0; +} +#endif + #endif /* __PHY_H */ +--- a/drivers/net/phy/Kconfig ++++ b/drivers/net/phy/Kconfig +@@ -13,6 +13,10 @@ menuconfig PHYLIB + + if PHYLIB + ++config MDIO_BOARDINFO ++ bool ++ default y ++ + config SWCONFIG + tristate "Switch configuration API" + ---help--- +--- a/drivers/net/phy/Makefile ++++ b/drivers/net/phy/Makefile +@@ -2,6 +2,8 @@ + + libphy-objs := phy.o phy_device.o mdio_bus.o + ++obj-$(CONFIG_MDIO_BOARDINFO) += mdio-boardinfo.o ++ + obj-$(CONFIG_PHYLIB) += libphy.o + obj-$(CONFIG_SWCONFIG) += swconfig.o + obj-$(CONFIG_MARVELL_PHY) += marvell.o +--- /dev/null ++++ b/drivers/net/phy/mdio-boardinfo.c +@@ -0,0 +1,58 @@ ++/* ++ * mdio-boardinfo.c - collect pre-declarations of PHY devices ++ * ++ * 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 ++#include ++#include ++#include ++#include ++#include ++ ++#include "mdio-boardinfo.h" ++ ++/* ++ * These symbols are exported ONLY FOR the mdio_bus component. ++ * No other users will be supported. ++ */ ++ ++LIST_HEAD(__mdio_board_list); ++EXPORT_SYMBOL_GPL(__mdio_board_list); ++ ++DEFINE_MUTEX(__mdio_board_lock); ++EXPORT_SYMBOL_GPL(__mdio_board_lock); ++ ++/** ++ * mdio_register_board_info - register PHY devices for a given board ++ * @info: array of chip descriptors ++ * @n: how many descriptors are provided ++ * Context: can sleep ++ * ++ * The board info passed can safely be __initdata ... but be careful of ++ * any embedded pointers (platform_data, etc), they're copied as-is. ++ */ ++int __init ++mdiobus_register_board_info(struct mdio_board_info const *info, unsigned n) ++{ ++ struct mdio_board_entry *be; ++ int i; ++ ++ be = kzalloc(n * sizeof(*be), GFP_KERNEL); ++ if (!be) ++ return -ENOMEM; ++ ++ for (i = 0; i < n; i++, be++, info++) { ++ memcpy(&be->board_info, info, sizeof(*info)); ++ mutex_lock(&__mdio_board_lock); ++ list_add_tail(&be->list, &__mdio_board_list); ++ mutex_unlock(&__mdio_board_lock); ++ } ++ ++ return 0; ++} +--- /dev/null ++++ b/drivers/net/phy/mdio-boardinfo.h +@@ -0,0 +1,22 @@ ++/* ++ * mdio-boardinfo.h - boardinfo interface internal to the mdio_bus component ++ * ++ * 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 ++ ++struct mdio_board_entry { ++ struct list_head list; ++ struct mdio_board_info board_info; ++}; ++ ++/* __mdio_board_lock protects __mdio_board_list ++ * only mdio_bus components are allowed to use these symbols. ++ */ ++extern struct mutex __mdio_board_lock; ++extern struct list_head __mdio_board_list; +--- a/drivers/net/Makefile ++++ b/drivers/net/Makefile +@@ -15,7 +15,7 @@ obj-$(CONFIG_MII) += mii.o + obj-$(CONFIG_MDIO) += mdio.o + obj-$(CONFIG_NET) += Space.o loopback.o + obj-$(CONFIG_NETCONSOLE) += netconsole.o +-obj-$(CONFIG_PHYLIB) += phy/ ++obj-y += phy/ + obj-$(CONFIG_RIONET) += rionet.o + obj-$(CONFIG_TUN) += tun.o + obj-$(CONFIG_VETH) += veth.o diff --git a/target/linux/generic/patches-3.2/720-phy_adm6996.patch b/target/linux/generic/patches-3.2/720-phy_adm6996.patch index d4dbbb5c88..c99824a6b0 100644 --- a/target/linux/generic/patches-3.2/720-phy_adm6996.patch +++ b/target/linux/generic/patches-3.2/720-phy_adm6996.patch @@ -1,6 +1,6 @@ --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig -@@ -102,6 +102,13 @@ config MICREL_PHY +@@ -106,6 +106,13 @@ config MICREL_PHY ---help--- Supports the KSZ9021, VSC8201, KS8001 PHYs. @@ -16,7 +16,7 @@ depends on PHYLIB=y --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile -@@ -14,6 +14,7 @@ obj-$(CONFIG_VITESSE_PHY) += vitesse.o +@@ -16,6 +16,7 @@ obj-$(CONFIG_VITESSE_PHY) += vitesse.o obj-$(CONFIG_BROADCOM_PHY) += broadcom.o obj-$(CONFIG_BCM63XX_PHY) += bcm63xx.o obj-$(CONFIG_ICPLUS_PHY) += icplus.o diff --git a/target/linux/generic/patches-3.2/722-phy_mvswitch.patch b/target/linux/generic/patches-3.2/722-phy_mvswitch.patch index 925cc4561f..8b5bac2b1f 100644 --- a/target/linux/generic/patches-3.2/722-phy_mvswitch.patch +++ b/target/linux/generic/patches-3.2/722-phy_mvswitch.patch @@ -1,6 +1,6 @@ --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig -@@ -109,6 +109,9 @@ config ADM6996_PHY +@@ -113,6 +113,9 @@ config ADM6996_PHY Currently supports the ADM6996FC and ADM6996M switches. Support for FC is very limited. @@ -12,7 +12,7 @@ depends on PHYLIB=y --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile -@@ -15,6 +15,7 @@ obj-$(CONFIG_BROADCOM_PHY) += broadcom.o +@@ -17,6 +17,7 @@ obj-$(CONFIG_BROADCOM_PHY) += broadcom.o obj-$(CONFIG_BCM63XX_PHY) += bcm63xx.o obj-$(CONFIG_ICPLUS_PHY) += icplus.o obj-$(CONFIG_ADM6996_PHY) += adm6996.o diff --git a/target/linux/generic/patches-3.2/723-phy_ip175c.patch b/target/linux/generic/patches-3.2/723-phy_ip175c.patch index 0ac339e9a2..05b9619099 100644 --- a/target/linux/generic/patches-3.2/723-phy_ip175c.patch +++ b/target/linux/generic/patches-3.2/723-phy_ip175c.patch @@ -1,6 +1,6 @@ --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig -@@ -112,6 +112,10 @@ config ADM6996_PHY +@@ -116,6 +116,10 @@ config ADM6996_PHY config MVSWITCH_PHY tristate "Driver for Marvell 88E6060 switches" @@ -13,7 +13,7 @@ depends on PHYLIB=y --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile -@@ -16,6 +16,7 @@ obj-$(CONFIG_BCM63XX_PHY) += bcm63xx.o +@@ -18,6 +18,7 @@ obj-$(CONFIG_BCM63XX_PHY) += bcm63xx.o obj-$(CONFIG_ICPLUS_PHY) += icplus.o obj-$(CONFIG_ADM6996_PHY) += adm6996.o obj-$(CONFIG_MVSWITCH_PHY) += mvswitch.o diff --git a/target/linux/generic/patches-3.2/724-phy_ar8216.patch b/target/linux/generic/patches-3.2/724-phy_ar8216.patch index 7a51dccee8..79169db74d 100644 --- a/target/linux/generic/patches-3.2/724-phy_ar8216.patch +++ b/target/linux/generic/patches-3.2/724-phy_ar8216.patch @@ -1,6 +1,6 @@ --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig -@@ -116,6 +116,10 @@ config IP17XX_PHY +@@ -120,6 +120,10 @@ config IP17XX_PHY tristate "Driver for IC+ IP17xx switches" select SWCONFIG @@ -13,7 +13,7 @@ depends on PHYLIB=y --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile -@@ -18,6 +18,7 @@ obj-$(CONFIG_ADM6996_PHY) += adm6996.o +@@ -20,6 +20,7 @@ obj-$(CONFIG_ADM6996_PHY) += adm6996.o obj-$(CONFIG_MVSWITCH_PHY) += mvswitch.o obj-$(CONFIG_IP17XX_PHY) += ip17xx.o obj-$(CONFIG_REALTEK_PHY) += realtek.o diff --git a/target/linux/generic/patches-3.2/725-phy_rtl8306.patch b/target/linux/generic/patches-3.2/725-phy_rtl8306.patch index 42cd274ca7..e243afe108 100644 --- a/target/linux/generic/patches-3.2/725-phy_rtl8306.patch +++ b/target/linux/generic/patches-3.2/725-phy_rtl8306.patch @@ -1,6 +1,6 @@ --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig -@@ -120,6 +120,10 @@ config AR8216_PHY +@@ -124,6 +124,10 @@ config AR8216_PHY tristate "Driver for Atheros AR8216 switches" select SWCONFIG @@ -13,7 +13,7 @@ depends on PHYLIB=y --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile -@@ -19,6 +19,7 @@ obj-$(CONFIG_MVSWITCH_PHY) += mvswitch.o +@@ -21,6 +21,7 @@ obj-$(CONFIG_MVSWITCH_PHY) += mvswitch.o obj-$(CONFIG_IP17XX_PHY) += ip17xx.o obj-$(CONFIG_REALTEK_PHY) += realtek.o obj-$(CONFIG_AR8216_PHY) += ar8216.o diff --git a/target/linux/generic/patches-3.2/726-phy_rtl8366.patch b/target/linux/generic/patches-3.2/726-phy_rtl8366.patch index 080793d707..ee636ee783 100644 --- a/target/linux/generic/patches-3.2/726-phy_rtl8366.patch +++ b/target/linux/generic/patches-3.2/726-phy_rtl8366.patch @@ -1,6 +1,6 @@ --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig -@@ -162,4 +162,29 @@ config MDIO_OCTEON +@@ -166,4 +166,29 @@ config MDIO_OCTEON If in doubt, say Y. @@ -32,7 +32,7 @@ endif # PHYLIB --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile -@@ -20,6 +20,9 @@ obj-$(CONFIG_IP17XX_PHY) += ip17xx.o +@@ -22,6 +22,9 @@ obj-$(CONFIG_IP17XX_PHY) += ip17xx.o obj-$(CONFIG_REALTEK_PHY) += realtek.o obj-$(CONFIG_AR8216_PHY) += ar8216.o obj-$(CONFIG_RTL8306_PHY) += rtl8306.o diff --git a/target/linux/generic/patches-3.2/727-phy-rtl8367.patch b/target/linux/generic/patches-3.2/727-phy-rtl8367.patch index 820bda0cdb..ca8ccdf613 100644 --- a/target/linux/generic/patches-3.2/727-phy-rtl8367.patch +++ b/target/linux/generic/patches-3.2/727-phy-rtl8367.patch @@ -1,6 +1,6 @@ --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig -@@ -179,6 +179,10 @@ config RTL8366RB_PHY +@@ -183,6 +183,10 @@ config RTL8366RB_PHY tristate "Driver for the Realtek RTL8366RB switch" select SWCONFIG @@ -13,7 +13,7 @@ depends on RTL8366S_PHY || RTL8366RB_PHY --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile -@@ -23,6 +23,7 @@ obj-$(CONFIG_RTL8306_PHY) += rtl8306.o +@@ -25,6 +25,7 @@ obj-$(CONFIG_RTL8306_PHY) += rtl8306.o obj-$(CONFIG_RTL8366_SMI) += rtl8366_smi.o obj-$(CONFIG_RTL8366S_PHY) += rtl8366s.o obj-$(CONFIG_RTL8366RB_PHY) += rtl8366rb.o