|
|
@@ -38,6 +38,8 @@ MODULE_DESCRIPTION("Marvell 88E6060 Switch driver");
|
|
|
MODULE_AUTHOR("Felix Fietkau");
|
|
|
MODULE_LICENSE("GPL");
|
|
|
|
|
|
+#define MVSWITCH_MAGIC 0x88E6060
|
|
|
+
|
|
|
struct mvswitch_priv {
|
|
|
/* the driver's tx function */
|
|
|
int (*hardstart)(struct sk_buff *skb, struct net_device *dev);
|
|
|
@@ -401,37 +403,6 @@ mvswitch_remove(struct phy_device *pdev)
|
|
|
kfree(priv);
|
|
|
}
|
|
|
|
|
|
-static bool
|
|
|
-mvswitch_detect(struct mii_bus *bus, int addr)
|
|
|
-{
|
|
|
- u16 reg;
|
|
|
- int i;
|
|
|
-
|
|
|
- /* we attach to phy id 31 to make sure that the late probe works */
|
|
|
- if (addr != 31)
|
|
|
- return false;
|
|
|
-
|
|
|
- /* look for the switch on the bus */
|
|
|
- reg = bus->read(bus, MV_PORTREG(IDENT, 0)) & MV_IDENT_MASK;
|
|
|
- if (reg != MV_IDENT_VALUE)
|
|
|
- return false;
|
|
|
-
|
|
|
- /*
|
|
|
- * Now that we've established that the switch actually exists, let's
|
|
|
- * get rid of the competition :)
|
|
|
- */
|
|
|
- for (i = 0; i < 31; i++) {
|
|
|
- if (!bus->phy_map[i])
|
|
|
- continue;
|
|
|
-
|
|
|
- device_unregister(&bus->phy_map[i]->dev);
|
|
|
- kfree(bus->phy_map[i]);
|
|
|
- bus->phy_map[i] = NULL;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
static int
|
|
|
mvswitch_probe(struct phy_device *pdev)
|
|
|
{
|
|
|
@@ -446,11 +417,26 @@ mvswitch_probe(struct phy_device *pdev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int
|
|
|
+mvswitch_fixup(struct phy_device *dev)
|
|
|
+{
|
|
|
+ u16 reg;
|
|
|
+
|
|
|
+ /* look for the switch on the bus */
|
|
|
+ reg = dev->bus->read(dev->bus, MV_PORTREG(IDENT, 0)) & MV_IDENT_MASK;
|
|
|
+ if (reg != MV_IDENT_VALUE)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ dev->phy_id = MVSWITCH_MAGIC;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
static struct phy_driver mvswitch_driver = {
|
|
|
.name = "Marvell 88E6060",
|
|
|
+ .phy_id = MVSWITCH_MAGIC,
|
|
|
+ .phy_id_mask = 0xffffffff,
|
|
|
.features = PHY_BASIC_FEATURES,
|
|
|
- .detect = &mvswitch_detect,
|
|
|
.probe = &mvswitch_probe,
|
|
|
.remove = &mvswitch_remove,
|
|
|
.config_init = &mvswitch_config_init,
|
|
|
@@ -462,6 +448,7 @@ static struct phy_driver mvswitch_driver = {
|
|
|
static int __init
|
|
|
mvswitch_init(void)
|
|
|
{
|
|
|
+ phy_register_fixup_for_id(PHY_ANY_ID, mvswitch_fixup);
|
|
|
return phy_driver_register(&mvswitch_driver);
|
|
|
}
|
|
|
|