Hi,

the BCM5421 and (now) 5461 chips that we use on our boards contain a 
serdes/fiber
interface in addition to the copper interface.

Up to now we were using the generic init code in drivers/net/sungem_phy.c and 
some
additional code to set up the serdes/fiber mode in our driver 
(drivers/net/spider_net.c).

In a first step I want to get rid of the BCM init code in spider_ net.c and 
move this to
sungem_phy.c where it belongs in my opinion. For this I added a enable_fiber
function pointer and two separate enable_fiber functions for the 5421 and the 
5461.

A second step would then be to move the sungem_phy code over to the generic 
kernel
phy infrastructure code and use this in the affected drivers (sungem.c and 
spidernet.c).

Questions / comments / suggestions ?

Jens

Index: linux-2.6.16/drivers/net/sungem_phy.c
===================================================================
--- linux-2.6.16.orig/drivers/net/sungem_phy.c
+++ linux-2.6.16/drivers/net/sungem_phy.c
@@ -329,6 +329,30 @@ static int bcm5421_init(struct mii_phy* 
        return 0;
 }
 
+static int bcm5421_enable_fiber(struct mii_phy* phy)
+{
+       /* enable fiber mode */
+       phy_write(phy, MII_NCONFIG, 0x9020);
+       /* LEDs active in both modes, autosense prio = fiber */
+       phy_write(phy, MII_NCONFIG, 0x945f);
+
+       /* switch off fibre autoneg */
+       phy_write(phy, MII_NCONFIG, 0xfc01);
+       phy_write(phy, 0x0b, 0x0004);
+
+       return 0;
+}
+
+static int bcm5461_enable_fiber(struct mii_phy* phy)
+{
+        phy_write(phy, MII_NCONFIG, 0xfc0c);
+        phy_write(phy, MII_BMCR, 0x4140);
+        phy_write(phy, MII_NCONFIG, 0xfc0b);
+       phy_write(phy, MII_BMCR, 0x0140);
+
+       return 0;
+}
+
 static int bcm54xx_setup_aneg(struct mii_phy *phy, u32 advertise)
 {
        u16 ctl, adv;
@@ -762,6 +786,7 @@ static struct mii_phy_ops bcm5421_phy_op
        .setup_forced   = bcm54xx_setup_forced,
        .poll_link      = genmii_poll_link,
        .read_link      = bcm54xx_read_link,
+       .enable_fiber   = bcm5421_enable_fiber,
 };
 
 static struct mii_phy_def bcm5421_phy_def = {
@@ -792,6 +817,25 @@ static struct mii_phy_def bcm5421k2_phy_
        .ops            = &bcm5421k2_phy_ops
 };
 
+static struct mii_phy_ops bcm5461_phy_ops = {
+       .init           = bcm5421_init,
+       .suspend        = bcm5411_suspend,
+       .setup_aneg     = bcm54xx_setup_aneg,
+       .setup_forced   = bcm54xx_setup_forced,
+       .poll_link      = genmii_poll_link,
+       .read_link      = bcm54xx_read_link,
+       .enable_fiber   = bcm5461_enable_fiber,
+};
+
+static struct mii_phy_def bcm5461_phy_def = {
+       .phy_id         = 0x002060c0,
+       .phy_id_mask    = 0xfffffff0,
+       .name           = "BCM5461",
+       .features       = MII_GBIT_FEATURES,
+       .magic_aneg     = 1,
+       .ops            = &bcm5461_phy_ops
+};
+
 /* Broadcom BCM 5462 built-in Vesta */
 static struct mii_phy_ops bcm5462V_phy_ops = {
        .init           = bcm5421_init,
@@ -856,6 +900,7 @@ static struct mii_phy_def* mii_phy_table
        &bcm5411_phy_def,
        &bcm5421_phy_def,
        &bcm5421k2_phy_def,
+       &bcm5461_phy_def,
        &bcm5462V_phy_def,
        &marvell_phy_def,
        &genmii_phy_def,
Index: linux-2.6.16/drivers/net/spider_net.c
===================================================================
--- linux-2.6.16.orig/drivers/net/spider_net.c
+++ linux-2.6.16/drivers/net/spider_net.c
@@ -1792,16 +1792,8 @@ spider_net_setup_phy(struct spider_net_c
        if (phy->def->ops->setup_forced)
                phy->def->ops->setup_forced(phy, SPEED_1000, DUPLEX_FULL);
 
-       /* the following two writes could be moved to sungem_phy.c */
-       /* enable fiber mode */
-       spider_net_write_phy(card->netdev, 1, MII_NCONFIG, 0x9020);
-       /* LEDs active in both modes, autosense prio = fiber */
-       spider_net_write_phy(card->netdev, 1, MII_NCONFIG, 0x945f);
-
-       /* switch off fibre autoneg */
-       spider_net_write_phy(card->netdev, 1, MII_NCONFIG, 0xfc01);
-       spider_net_write_phy(card->netdev, 1, 0x0b, 0x0004);
-
+       phy->def->ops->enable_fiber(phy);
+
        phy->def->ops->read_link(phy);
        pr_info("Found %s with %i Mbps, %s-duplex.\n", phy->def->name,
                phy->speed, phy->duplex==1 ? "Full" : "Half");
Index: linux-2.6.16/drivers/net/sungem_phy.h
===================================================================
--- linux-2.6.16.orig/drivers/net/sungem_phy.h
+++ linux-2.6.16/drivers/net/sungem_phy.h
@@ -12,6 +12,7 @@ struct mii_phy_ops
        int             (*setup_forced)(struct mii_phy *phy, int speed, int fd);
        int             (*poll_link)(struct mii_phy *phy);
        int             (*read_link)(struct mii_phy *phy);
+       int             (*enable_fiber)(struct mii_phy *phy);
 };
 
 /* Structure used to statically define an mii/gii based PHY */

-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to