* [PATCH] tc35815: Load MAC address via platform_device
@ 2007-06-29 13:34 Atsushi Nemoto
2007-06-29 13:41 ` Jeff Garzik
0 siblings, 1 reply; 3+ messages in thread
From: Atsushi Nemoto @ 2007-06-29 13:34 UTC (permalink / raw)
To: linux-mips; +Cc: ralf, sshtylyov, mlachwani, jeff
TX49XX SoCs include PCI NIC (TC35815 compatible) connected via its
internal PCI bus, but the NIC's PROM interface is not connected to
SEEPROM. So we must provide its ethernet address by another way.
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
---
A platform side of this patch is:
"[PATCH] rbtx4938: Fix secondary PCIC and glue internal NICs"
drivers/net/tc35815.c | 50 ++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 45 insertions(+), 5 deletions(-)
diff --git a/drivers/net/tc35815.c b/drivers/net/tc35815.c
index 463d600..75655ad 100644
--- a/drivers/net/tc35815.c
+++ b/drivers/net/tc35815.c
@@ -23,9 +23,9 @@
*/
#ifdef TC35815_NAPI
-#define DRV_VERSION "1.35-NAPI"
+#define DRV_VERSION "1.36-NAPI"
#else
-#define DRV_VERSION "1.35"
+#define DRV_VERSION "1.36"
#endif
static const char *version = "tc35815.c:v" DRV_VERSION "\n";
#define MODNAME "tc35815"
@@ -49,6 +49,7 @@ static const char *version = "tc35815.c:v" DRV_VERSION "\n";
#include <linux/pci.h>
#include <linux/mii.h>
#include <linux/ethtool.h>
+#include <linux/platform_device.h>
#include <asm/io.h>
#include <asm/byteorder.h>
@@ -597,13 +598,46 @@ static int tc_mdio_read(struct net_device *dev, int phy_id, int location);
static void tc_mdio_write(struct net_device *dev, int phy_id, int location,
int val);
-static void __devinit tc35815_init_dev_addr (struct net_device *dev)
+#ifdef CONFIG_CPU_TX49XX
+/*
+ * Find a platform_device providing a MAC address. The platform code
+ * should provide a "tc35815-mac" device with a MAC address in its
+ * platform_data.
+ */
+static int __devinit tc35815_mac_match(struct device *dev, void *data)
+{
+ struct platform_device *plat_dev = to_platform_device(dev);
+ struct pci_dev *pci_dev = data;
+ unsigned int id = (pci_dev->bus->number << 8) | pci_dev->devfn;
+ return !strcmp(plat_dev->name, "tc35815-mac") && plat_dev->id == id;
+}
+
+static int __devinit tc35815_read_plat_dev_addr(struct net_device *dev)
+{
+ struct tc35815_local *lp = dev->priv;
+ struct device *pd = bus_find_device(&platform_bus_type, NULL,
+ lp->pci_dev, tc35815_mac_match);
+ if (pd) {
+ if (pd->platform_data)
+ memcpy(dev->dev_addr, pd->platform_data, ETH_ALEN);
+ put_device(pd);
+ return is_valid_ether_addr(dev->dev_addr) ? 0 : -ENODEV;
+ }
+ return -ENODEV;
+}
+#else
+static int __devinit tc35815_read_plat_dev_addr(struct device *dev)
+{
+ return -ENODEV;
+}
+#endif
+
+static int __devinit tc35815_init_dev_addr (struct net_device *dev)
{
struct tc35815_regs __iomem *tr =
(struct tc35815_regs __iomem *)dev->base_addr;
int i;
- /* dev_addr will be overwritten on NETDEV_REGISTER event */
while (tc_readl(&tr->PROM_Ctl) & PROM_Busy)
;
for (i = 0; i < 6; i += 2) {
@@ -615,6 +649,9 @@ static void __devinit tc35815_init_dev_addr (struct net_device *dev)
dev->dev_addr[i] = data & 0xff;
dev->dev_addr[i+1] = data >> 8;
}
+ if (!is_valid_ether_addr(dev->dev_addr))
+ return tc35815_read_plat_dev_addr(dev);
+ return 0;
}
static int __devinit tc35815_init_one (struct pci_dev *pdev,
@@ -724,7 +761,10 @@ static int __devinit tc35815_init_one (struct pci_dev *pdev,
tc35815_chip_reset(dev);
/* Retrieve the ethernet address. */
- tc35815_init_dev_addr(dev);
+ if (tc35815_init_dev_addr(dev)) {
+ dev_warn(&pdev->dev, "not valid ether addr\n");
+ random_ether_addr(dev->dev_addr);
+ }
rc = register_netdev (dev);
if (rc)
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] tc35815: Load MAC address via platform_device
2007-06-29 13:34 [PATCH] tc35815: Load MAC address via platform_device Atsushi Nemoto
@ 2007-06-29 13:41 ` Jeff Garzik
2007-07-03 18:29 ` Ralf Baechle
0 siblings, 1 reply; 3+ messages in thread
From: Jeff Garzik @ 2007-06-29 13:41 UTC (permalink / raw)
To: Atsushi Nemoto, ralf; +Cc: linux-mips, sshtylyov, mlachwani
Atsushi Nemoto wrote:
> TX49XX SoCs include PCI NIC (TC35815 compatible) connected via its
> internal PCI bus, but the NIC's PROM interface is not connected to
> SEEPROM. So we must provide its ethernet address by another way.
>
> Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
> ---
> A platform side of this patch is:
> "[PATCH] rbtx4938: Fix secondary PCIC and glue internal NICs"
>
> drivers/net/tc35815.c | 50 ++++++++++++++++++++++++++++++++++++++++++++----
> 1 files changed, 45 insertions(+), 5 deletions(-)
ACK.
Due to platform dependency, I would prefer that Ralf push this upstream,
when he pushes the associated rbtx4938 patch.
Jeff
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] tc35815: Load MAC address via platform_device
2007-06-29 13:41 ` Jeff Garzik
@ 2007-07-03 18:29 ` Ralf Baechle
0 siblings, 0 replies; 3+ messages in thread
From: Ralf Baechle @ 2007-07-03 18:29 UTC (permalink / raw)
To: Jeff Garzik; +Cc: Atsushi Nemoto, linux-mips, sshtylyov, mlachwani
On Fri, Jun 29, 2007 at 09:41:23AM -0400, Jeff Garzik wrote:
> ACK.
>
> Due to platform dependency, I would prefer that Ralf push this upstream,
> when he pushes the associated rbtx4938 patch.
Will do.
Ralf
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2007-07-03 18:31 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-06-29 13:34 [PATCH] tc35815: Load MAC address via platform_device Atsushi Nemoto
2007-06-29 13:41 ` Jeff Garzik
2007-07-03 18:29 ` Ralf Baechle
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox