diff options
Diffstat (limited to 'recipes/linux/linux-omap-2.6.29/smsc/smsc911x-4.patch')
-rw-r--r-- | recipes/linux/linux-omap-2.6.29/smsc/smsc911x-4.patch | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/recipes/linux/linux-omap-2.6.29/smsc/smsc911x-4.patch b/recipes/linux/linux-omap-2.6.29/smsc/smsc911x-4.patch new file mode 100644 index 0000000000..8afa06f400 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/smsc/smsc911x-4.patch @@ -0,0 +1,93 @@ +From: Steve Glendinning <steve.glendinning@smsc.com> + +Some platforms (for example pcm037) do not have an EEPROM fitted, +instead storing their mac address somewhere else. The bootloader +fetches this and configures the ethernet adapter before the kernel is +started. + +This patch allows a platform to indicate to the driver via the +SMSC911X_SAVE_MAC_ADDRESS flag that the mac address has already been +configured via such a mechanism, and should be saved before resetting +the chip. + +Signed-off-by: Steve Glendinning <steve.glendinning@smsc.com> +Acked-by: Sascha Hauer <s.hauer@pengutronix.de> +Tested-by: Sascha Hauer <s.hauer@pengutronix.de> +--- + drivers/net/smsc911x.c | 30 ++++++++++++++++++++++-------- + include/linux/smsc911x.h | 1 + + 2 files changed, 23 insertions(+), 8 deletions(-) + +diff --git a/drivers/net/smsc911x.c b/drivers/net/smsc911x.c +index c7379f5..2f7399e 100644 +--- a/drivers/net/smsc911x.c ++++ b/drivers/net/smsc911x.c +@@ -1748,6 +1748,21 @@ static const struct net_device_ops smsc911x_netdev_ops = { + #endif + }; + ++/* copies the current mac address from hardware to dev->dev_addr */ ++static void __devinit smsc911x_read_mac_address(struct net_device *dev) ++{ ++ struct smsc911x_data *pdata = netdev_priv(dev); ++ u32 mac_high16 = smsc911x_mac_read(pdata, ADDRH); ++ u32 mac_low32 = smsc911x_mac_read(pdata, ADDRL); ++ ++ dev->dev_addr[0] = (u8)(mac_low32); ++ dev->dev_addr[1] = (u8)(mac_low32 >> 8); ++ dev->dev_addr[2] = (u8)(mac_low32 >> 16); ++ dev->dev_addr[3] = (u8)(mac_low32 >> 24); ++ dev->dev_addr[4] = (u8)(mac_high16); ++ dev->dev_addr[5] = (u8)(mac_high16 >> 8); ++} ++ + /* Initializing private device structures, only called from probe */ + static int __devinit smsc911x_init(struct net_device *dev) + { +@@ -1835,6 +1850,12 @@ static int __devinit smsc911x_init(struct net_device *dev) + SMSC_WARNING(PROBE, + "This driver is not intended for this chip revision"); + ++ /* workaround for platforms without an eeprom, where the mac address ++ * is stored elsewhere and set by the bootloader. This saves the ++ * mac address before resetting the device */ ++ if (pdata->config.flags & SMSC911X_SAVE_MAC_ADDRESS) ++ smsc911x_read_mac_address(dev); ++ + /* Reset the LAN911x */ + if (smsc911x_soft_reset(pdata)) + return -ENODEV; +@@ -2015,14 +2036,7 @@ static int __devinit smsc911x_drv_probe(struct platform_device *pdev) + } else { + /* Try reading mac address from device. if EEPROM is present + * it will already have been set */ +- u32 mac_high16 = smsc911x_mac_read(pdata, ADDRH); +- u32 mac_low32 = smsc911x_mac_read(pdata, ADDRL); +- dev->dev_addr[0] = (u8)(mac_low32); +- dev->dev_addr[1] = (u8)(mac_low32 >> 8); +- dev->dev_addr[2] = (u8)(mac_low32 >> 16); +- dev->dev_addr[3] = (u8)(mac_low32 >> 24); +- dev->dev_addr[4] = (u8)(mac_high16); +- dev->dev_addr[5] = (u8)(mac_high16 >> 8); ++ smsc911x_read_mac_address(dev); + + if (is_valid_ether_addr(dev->dev_addr)) { + /* eeprom values are valid so use them */ +diff --git a/include/linux/smsc911x.h b/include/linux/smsc911x.h +index 170c76b..b327250 100644 +--- a/include/linux/smsc911x.h ++++ b/include/linux/smsc911x.h +@@ -45,5 +45,6 @@ struct smsc911x_platform_config { + #define SMSC911X_USE_32BIT (BIT(1)) + #define SMSC911X_FORCE_INTERNAL_PHY (BIT(2)) + #define SMSC911X_FORCE_EXTERNAL_PHY (BIT(3)) ++#define SMSC911X_SAVE_MAC_ADDRESS (BIT(4)) + + #endif /* __LINUX_SMSC911X_H__ */ +-- +1.6.0.6 + +-- +To unsubscribe from this list: send the line "unsubscribe netdev" in +the body of a message to majordomo@vger.kernel.org +More majordomo info at http://vger.kernel.org/majordomo-info.html |