[kernel] r15472 - in dists/sid/linux-2.6/debian: . patches/features/all patches/series

Ben Hutchings benh at alioth.debian.org
Fri Apr 2 16:55:38 UTC 2010


Author: benh
Date: Fri Apr  2 16:55:32 2010
New Revision: 15472

Log:
phylib: Support PHY module autoloading (Closes: #553024)

Added:
   dists/sid/linux-2.6/debian/patches/features/all/phylib-Add-module-table-to-all-existing-phy-drivers.patch
   dists/sid/linux-2.6/debian/patches/features/all/phylib-Support-phy-module-autoloading.patch
Modified:
   dists/sid/linux-2.6/debian/changelog
   dists/sid/linux-2.6/debian/patches/series/11

Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog	Fri Apr  2 16:41:06 2010	(r15471)
+++ dists/sid/linux-2.6/debian/changelog	Fri Apr  2 16:55:32 2010	(r15472)
@@ -18,6 +18,7 @@
   * linux-base: Fix the conditions for attempting disk ID conversion
     - Always if $DEBCONF_RECONFIGURE is set
     - Never during a fresh installation (Closes: #576243)
+  * phylib: Support PHY module autoloading (Closes: #553024)
 
   [ maximilian attems]
   * [alpha, hppa] Disable oprofile as tracing code is unsupported here.

Added: dists/sid/linux-2.6/debian/patches/features/all/phylib-Add-module-table-to-all-existing-phy-drivers.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/phylib-Add-module-table-to-all-existing-phy-drivers.patch	Fri Apr  2 16:55:32 2010	(r15472)
@@ -0,0 +1,265 @@
+From: David Woodhouse <dwmw2 at infradead.org>
+Date: Fri, 02 Apr 2010 12:05:56 +0100
+Subject: [PATCH 2/2] phylib: Add module table to all existing phy drivers
+
+Signed-off-by: David Woodhouse <David.Woodhouse at intel.com>
+[bwh: Backport to 2.6.32 as suggested in follow-up by dwmw2]
+---
+ drivers/net/phy/bcm63xx.c  |    8 ++++++++
+ drivers/net/phy/broadcom.c |   16 ++++++++++++++++
+ drivers/net/phy/cicada.c   |    8 ++++++++
+ drivers/net/phy/davicom.c  |    9 +++++++++
+ drivers/net/phy/et1011c.c  |    7 +++++++
+ drivers/net/phy/icplus.c   |    7 +++++++
+ drivers/net/phy/lxt.c      |    8 ++++++++
+ drivers/net/phy/marvell.c  |   13 +++++++++++++
+ drivers/net/phy/national.c |    7 +++++++
+ drivers/net/phy/qsemi.c    |    7 +++++++
+ drivers/net/phy/realtek.c  |    7 +++++++
+ drivers/net/phy/smsc.c     |   11 +++++++++++
+ drivers/net/phy/ste10Xp.c  |    8 ++++++++
+ drivers/net/phy/vitesse.c  |    8 ++++++++
+ 14 files changed, 124 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/net/phy/bcm63xx.c b/drivers/net/phy/bcm63xx.c
+index 4fed95e..ac5e498 100644
+--- a/drivers/net/phy/bcm63xx.c
++++ b/drivers/net/phy/bcm63xx.c
+@@ -130,3 +130,11 @@ static void __exit bcm63xx_phy_exit(void)
+ 
+ module_init(bcm63xx_phy_init);
+ module_exit(bcm63xx_phy_exit);
++
++static struct mdio_device_id bcm63xx_tbl[] = {
++	{ 0x00406000, 0xfffffc00 },
++	{ 0x002bdc00, 0xfffffc00 },
++	{ }
++};
++
++MODULE_DEVICE_TABLE(mdio, bcm64xx_tbl);
+diff --git a/drivers/net/phy/broadcom.c b/drivers/net/phy/broadcom.c
+index f482fc4..cecdbbd 100644
+--- a/drivers/net/phy/broadcom.c
++++ b/drivers/net/phy/broadcom.c
+@@ -908,3 +908,19 @@ static void __exit broadcom_exit(void)
+ 
+ module_init(broadcom_init);
+ module_exit(broadcom_exit);
++
++static struct mdio_device_id broadcom_tbl[] = {
++	{ 0x00206070, 0xfffffff0 },
++	{ 0x002060e0, 0xfffffff0 },
++	{ 0x002060c0, 0xfffffff0 },
++	{ 0x002060b0, 0xfffffff0 },
++	{ 0x0143bca0, 0xfffffff0 },
++	{ 0x0143bcb0, 0xfffffff0 },
++	{ PHY_ID_BCM50610, 0xfffffff0 },
++	{ PHY_ID_BCM50610M, 0xfffffff0 },
++	{ PHY_ID_BCM57780, 0xfffffff0 },
++	{ 0x0143bc70, 0xfffffff0 },
++	{ }
++};
++
++MODULE_DEVICE_TABLE(mdio, broadcom_tbl);
+diff --git a/drivers/net/phy/cicada.c b/drivers/net/phy/cicada.c
+index a1bd599..efc608f 100644
+--- a/drivers/net/phy/cicada.c
++++ b/drivers/net/phy/cicada.c
+@@ -159,3 +159,11 @@ static void __exit cicada_exit(void)
+ 
+ module_init(cicada_init);
+ module_exit(cicada_exit);
++
++static struct mdio_device_id cicada_tbl[] = {
++	{ 0x000fc410, 0x000ffff0 },
++	{ 0x000fc440, 0x000fffc0 },
++	{ }
++};
++
++MODULE_DEVICE_TABLE(mdio, cicada_tbl);
+diff --git a/drivers/net/phy/davicom.c b/drivers/net/phy/davicom.c
+index d926168..e02b18c 100644
+--- a/drivers/net/phy/davicom.c
++++ b/drivers/net/phy/davicom.c
+@@ -219,3 +219,12 @@ static void __exit davicom_exit(void)
+ 
+ module_init(davicom_init);
+ module_exit(davicom_exit);
++
++static struct mdio_device_id davicom_tbl[] = {
++	{ 0x0181b880, 0x0ffffff0 },
++	{ 0x0181b8a0, 0x0ffffff0 },
++	{ 0x00181b80, 0x0ffffff0 },
++	{ }
++};
++
++MODULE_DEVICE_TABLE(mdio, davicom_tbl);
+diff --git a/drivers/net/phy/et1011c.c b/drivers/net/phy/et1011c.c
+index b031fa2..500f0fd 100644
+--- a/drivers/net/phy/et1011c.c
++++ b/drivers/net/phy/et1011c.c
+@@ -111,3 +111,10 @@ static void __exit et1011c_exit(void)
+ 
+ module_init(et1011c_init);
+ module_exit(et1011c_exit);
++
++static struct mdio_device_id et1011c_tbl[] = {
++	{ 0x0282f014, 0xfffffff0 },
++	{ }
++};
++
++MODULE_DEVICE_TABLE(mdio, et1011c_tbl);
+diff --git a/drivers/net/phy/icplus.c b/drivers/net/phy/icplus.c
+index af3f1f2..e661e90 100644
+--- a/drivers/net/phy/icplus.c
++++ b/drivers/net/phy/icplus.c
+@@ -132,3 +132,10 @@ static void __exit ip175c_exit(void)
+ 
+ module_init(ip175c_init);
+ module_exit(ip175c_exit);
++
++static struct mdio_device_id icplus_tbl[] = {
++	{ 0x02430d80, 0x0ffffff0 },
++	{ }
++};
++
++MODULE_DEVICE_TABLE(mdio, icplus_tbl);
+diff --git a/drivers/net/phy/lxt.c b/drivers/net/phy/lxt.c
+index 4cf3324..1d94f1d 100644
+--- a/drivers/net/phy/lxt.c
++++ b/drivers/net/phy/lxt.c
+@@ -174,3 +174,11 @@ static void __exit lxt_exit(void)
+ 
+ module_init(lxt_init);
+ module_exit(lxt_exit);
++
++static struct mdio_device_id lxt_tbl[] = {
++	{ 0x78100000, 0xfffffff0 },
++	{ 0x001378e0, 0xfffffff0 },
++	{ }
++};
++
++MODULE_DEVICE_TABLE(mdio, lxt_tbl);
+diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c
+index 65ed385..c7e5b9f 100644
+--- a/drivers/net/phy/marvell.c
++++ b/drivers/net/phy/marvell.c
+@@ -649,3 +649,16 @@ static void __exit marvell_exit(void)
+ 
+ module_init(marvell_init);
+ module_exit(marvell_exit);
++
++static struct mdio_device_id marvell_tbl[] = {
++	{ 0x01410c60, 0xfffffff0 },
++	{ 0x01410c90, 0xfffffff0 },
++	{ 0x01410cc0, 0xfffffff0 },
++	{ 0x01410e10, 0xfffffff0 },
++	{ 0x01410cb0, 0xfffffff0 },
++	{ 0x01410cd0, 0xfffffff0 },
++	{ 0x01410e30, 0xfffffff0 },
++	{ }
++};
++
++MODULE_DEVICE_TABLE(mdio, marvell_tbl);
+diff --git a/drivers/net/phy/national.c b/drivers/net/phy/national.c
+index 6c636eb..729ab29 100644
+--- a/drivers/net/phy/national.c
++++ b/drivers/net/phy/national.c
+@@ -153,3 +153,10 @@ MODULE_LICENSE("GPL");
+ 
+ module_init(ns_init);
+ module_exit(ns_exit);
++
++static struct mdio_device_id ns_tbl[] = {
++	{ DP83865_PHY_ID, 0xfffffff0 },
++	{ }
++};
++
++MODULE_DEVICE_TABLE(mdio, ns_tbl);
+diff --git a/drivers/net/phy/qsemi.c b/drivers/net/phy/qsemi.c
+index 23062d0..3ec9610 100644
+--- a/drivers/net/phy/qsemi.c
++++ b/drivers/net/phy/qsemi.c
+@@ -138,3 +138,10 @@ static void __exit qs6612_exit(void)
+ 
+ module_init(qs6612_init);
+ module_exit(qs6612_exit);
++
++static struct mdio_device_id qs6612_tbl[] = {
++	{ 0x00181440, 0xfffffff0 },
++	{ }
++};
++
++MODULE_DEVICE_TABLE(mdio, qs6612_tbl);
+diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c
+index a052a67..f567c0e 100644
+--- a/drivers/net/phy/realtek.c
++++ b/drivers/net/phy/realtek.c
+@@ -78,3 +78,10 @@ static void __exit realtek_exit(void)
+ 
+ module_init(realtek_init);
+ module_exit(realtek_exit);
++
++static struct mdio_device_id realtek_tbl[] = {
++	{ 0x001cc912, 0x001fffff },
++	{ }
++};
++
++MODULE_DEVICE_TABLE(mdio, realtek_tbl);
+diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c
+index ed2644a..78fa988 100644
+--- a/drivers/net/phy/smsc.c
++++ b/drivers/net/phy/smsc.c
+@@ -253,3 +253,14 @@ MODULE_LICENSE("GPL");
+ 
+ module_init(smsc_init);
+ module_exit(smsc_exit);
++
++static struct mdio_device_id smsc_tbl[] = {
++	{ 0x0007c0a0, 0xfffffff0 },
++	{ 0x0007c0b0, 0xfffffff0 },
++	{ 0x0007c0c0, 0xfffffff0 },
++	{ 0x0007c0d0, 0xfffffff0 },
++	{ 0x0007c0f0, 0xfffffff0 },
++	{ }
++};
++
++MODULE_DEVICE_TABLE(mdio, smsc_tbl);
+diff --git a/drivers/net/phy/ste10Xp.c b/drivers/net/phy/ste10Xp.c
+index 6bdb0d5..7229009 100644
+--- a/drivers/net/phy/ste10Xp.c
++++ b/drivers/net/phy/ste10Xp.c
+@@ -132,6 +132,14 @@ static void __exit ste10Xp_exit(void)
+ module_init(ste10Xp_init);
+ module_exit(ste10Xp_exit);
+ 
++static struct mdio_device_id ste10Xp_tbl[] = {
++	{ STE101P_PHY_ID, 0xfffffff0 },
++	{ STE100P_PHY_ID, 0xffffffff },
++	{ }
++};
++
++MODULE_DEVICE_TABLE(mdio, ste10Xp_tbl);
++
+ MODULE_DESCRIPTION("STMicroelectronics STe10Xp PHY driver");
+ MODULE_AUTHOR("Giuseppe Cavallaro <peppe.cavallaro at st.com>");
+ MODULE_LICENSE("GPL");
+diff --git a/drivers/net/phy/vitesse.c b/drivers/net/phy/vitesse.c
+index dd3b244..45cce50 100644
+--- a/drivers/net/phy/vitesse.c
++++ b/drivers/net/phy/vitesse.c
+@@ -191,3 +191,11 @@ static void __exit vsc82xx_exit(void)
+ 
+ module_init(vsc82xx_init);
+ module_exit(vsc82xx_exit);
++
++static struct mdio_device_id vitesse_tbl[] = {
++	{ PHY_ID_VSC8244, 0x000fffc0 },
++	{ PHY_ID_VSC8221, 0x000ffff0 },
++	{ }
++};
++
++MODULE_DEVICE_TABLE(mdio, vitesse_tbl);
+-- 
+1.6.6.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/phylib-Support-phy-module-autoloading.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/phylib-Support-phy-module-autoloading.patch	Fri Apr  2 16:55:32 2010	(r15472)
@@ -0,0 +1,146 @@
+From: David Woodhouse <dwmw2 at infradead.org>
+Date: Fri, 02 Apr 2010 12:05:27 +0100
+Subject: [PATCH 1/2] phylib: Support phy module autoloading
+
+We don't use the normal hotplug mechanism because it doesn't work. It will
+load the module some time after the device appears, but that's not good
+enough for us -- we need the driver loaded _immediately_ because otherwise
+the NIC driver may just abort and then the phy 'device' goes away.
+
+[bwh: s/phy/mdio/ in module alias, kerneldoc for struct mdio_device_id]
+
+Signed-off-by: David Woodhouse <David.Woodhouse at intel.com>
+Signed-off-by: Ben Hutchings <ben at decadent.org.uk>
+[bwh: Backport to 2.6.32 as suggested in follow-up by dwmw2]
+---
+ drivers/net/phy/phy_device.c    |   12 ++++++++++++
+ include/linux/mod_devicetable.h |   26 ++++++++++++++++++++++++++
+ include/linux/phy.h             |    1 +
+ scripts/mod/file2alias.c        |   26 ++++++++++++++++++++++++++
+ 4 files changed, 65 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
+index db17945..1a99bb2 100644
+--- a/drivers/net/phy/phy_device.c
++++ b/drivers/net/phy/phy_device.c
+@@ -149,6 +149,7 @@ EXPORT_SYMBOL(phy_scan_fixups);
+ struct phy_device* phy_device_create(struct mii_bus *bus, int addr, int phy_id)
+ {
+ 	struct phy_device *dev;
++
+ 	/* We allocate the device, and initialize the
+ 	 * default values */
+ 	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+@@ -179,6 +180,17 @@ struct phy_device* phy_device_create(struct mii_bus *bus, int addr, int phy_id)
+ 
+ 	mutex_init(&dev->lock);
+ 
++	/* Request the appropriate module unconditionally; don't
++	   bother trying to do so only if it isn't already loaded,
++	   because that gets complicated. A hotplug event would have
++	   done an unconditional modprobe anyway.
++	   We don't do normal hotplug because it won't work for MDIO
++	   -- because it relies on the device staying around for long
++	   enough for the driver to get loaded. With MDIO, the NIC
++	   driver will get bored and give up as soon as it finds that
++	   there's no driver _already_ loaded. */
++	request_module(MDIO_MODULE_PREFIX MDIO_ID_FMT, MDIO_ID_ARGS(phy_id));
++
+ 	return dev;
+ }
+ EXPORT_SYMBOL(phy_device_create);
+diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h
+index f58e9d8..55f1f9c 100644
+--- a/include/linux/mod_devicetable.h
++++ b/include/linux/mod_devicetable.h
+@@ -474,4 +474,30 @@ struct platform_device_id {
+ 			__attribute__((aligned(sizeof(kernel_ulong_t))));
+ };
+ 
++#define MDIO_MODULE_PREFIX	"mdio:"
++
++#define MDIO_ID_FMT "%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d"
++#define MDIO_ID_ARGS(_id) \
++	(_id)>>31, ((_id)>>30) & 1, ((_id)>>29) & 1, ((_id)>>28) & 1,	\
++	((_id)>>27) & 1, ((_id)>>26) & 1, ((_id)>>25) & 1, ((_id)>>24) & 1, \
++	((_id)>>23) & 1, ((_id)>>22) & 1, ((_id)>>21) & 1, ((_id)>>20) & 1, \
++	((_id)>>19) & 1, ((_id)>>18) & 1, ((_id)>>17) & 1, ((_id)>>16) & 1, \
++	((_id)>>15) & 1, ((_id)>>14) & 1, ((_id)>>13) & 1, ((_id)>>12) & 1, \
++	((_id)>>11) & 1, ((_id)>>10) & 1, ((_id)>>9) & 1, ((_id)>>8) & 1, \
++	((_id)>>7) & 1, ((_id)>>6) & 1, ((_id)>>5) & 1, ((_id)>>4) & 1, \
++	((_id)>>3) & 1, ((_id)>>2) & 1, ((_id)>>1) & 1, (_id) & 1
++
++/**
++ * struct mdio_device_id - identifies PHY devices on an MDIO/MII bus
++ * @phy_id: The result of
++ *     (mdio_read(&MII_PHYSID1) << 16 | mdio_read(&PHYSID2)) & @phy_id_mask
++ *     for this PHY type
++ * @phy_id_mask: Defines the significant bits of @phy_id.  A value of 0
++ *     is used to terminate an array of struct mdio_device_id.
++ */
++struct mdio_device_id {
++	__u32 phy_id;
++	__u32 phy_id_mask;
++};
++
+ #endif /* LINUX_MOD_DEVICETABLE_H */
+diff --git a/include/linux/phy.h b/include/linux/phy.h
+index 14d7fdf..f269f1b 100644
+--- a/include/linux/phy.h
++++ b/include/linux/phy.h
+@@ -24,6 +24,7 @@
+ #include <linux/mii.h>
+ #include <linux/timer.h>
+ #include <linux/workqueue.h>
++#include <linux/mod_devicetable.h>
+ 
+ #include <asm/atomic.h>
+ 
+diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
+index 220213e..36a60a8 100644
+--- a/scripts/mod/file2alias.c
++++ b/scripts/mod/file2alias.c
+@@ -796,6 +796,28 @@ static int do_platform_entry(const char *filename,
+ 	return 1;
+ }
+ 
++static int do_mdio_entry(const char *filename,
++			 struct mdio_device_id *id, char *alias)
++{
++	int i;
++
++	alias += sprintf(alias, MDIO_MODULE_PREFIX);
++
++	for (i = 0; i < 32; i++) {
++		if (!((id->phy_id_mask >> (31-i)) & 1))
++			*(alias++) = '?';
++		else if ((id->phy_id >> (31-i)) & 1)
++			*(alias++) = '1';
++		else
++			*(alias++) = '0';
++	}
++
++	/* Terminate the string */
++	*alias = 0;
++
++	return 1;
++}
++
+ /* Ignore any prefix, eg. some architectures prepend _ */
+ static inline int sym_is(const char *symbol, const char *name)
+ {
+@@ -943,6 +965,10 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
+ 		do_table(symval, sym->st_size,
+ 			 sizeof(struct platform_device_id), "platform",
+ 			 do_platform_entry, mod);
++	else if (sym_is(symname, "__mod_mdio_device_table"))
++		do_table(symval, sym->st_size,
++			 sizeof(struct mdio_device_id), "mdio",
++			 do_mdio_entry, mod);
+ 	free(zeros);
+ }
+ 
+-- 
+1.6.6.1
+
+

Modified: dists/sid/linux-2.6/debian/patches/series/11
==============================================================================
--- dists/sid/linux-2.6/debian/patches/series/11	Fri Apr  2 16:41:06 2010	(r15471)
+++ dists/sid/linux-2.6/debian/patches/series/11	Fri Apr  2 16:55:32 2010	(r15472)
@@ -17,3 +17,5 @@
 + bugfix/all/drm-i915-fix-small-leak-on-overlay-error-path.patch
 + bugfix/all/drm-nouveau-report-unknown-connector-state-if-lid-closed.patch
 - bugfix/all/hrtimer-tune-hrtimer_interrupt-hang-logic.patch
++ features/all/phylib-Support-phy-module-autoloading.patch
++ features/all/phylib-Add-module-table-to-all-existing-phy-drivers.patch



More information about the Kernel-svn-changes mailing list