Brand new iMac G5

Chris Eagan ceagan at gmail.com
Wed Jun 15 01:40:06 EST 2005


Hey Ben,

Thanks for the patch. Unfortunately it is still giving us the same
problem where the network device is up but communication using it
fails. Is there any other information I could get off the machine that
would help?

-Chris

On 6/13/05, Benjamin Herrenschmidt <benh at kernel.crashing.org> wrote:
> On Mon, 2005-06-13 at 15:17 -0400, Chris Eagan wrote:
> > We have a brand new iMac G5 and we are having trouble with the network
> > card drivers. It seems that they load and find the device okay, but
> > then setting an ip manually does not give access to the network. DHCP
> > fails to find anything as well. We have been working on this problem
> > at http://bugs.gentoo.org/show_bug.cgi?id=94263 but nothing has worked
> > so far. I have included some information about the device here. If any
> > other information is needed, we have a cd that boots to a prompt on
> > the machine and would be happy to provide any needed information.
> 
> Hi !
> 
> Please try this patch and let me know asap:
> 
> Index: linux-work/drivers/net/sungem.c
> ===================================================================
> --- linux-work.orig/drivers/net/sungem.c        2005-05-02 10:48:28.000000000 +1000
> +++ linux-work/drivers/net/sungem.c     2005-06-14 10:17:38.000000000 +1000
> @@ -3078,7 +3078,9 @@
>         gp->phy_mii.dev = dev;
>         gp->phy_mii.mdio_read = _phy_read;
>         gp->phy_mii.mdio_write = _phy_write;
> -
> +#ifdef CONFIG_PPC_PMAC
> +       gp->phy_mii.platform_data = gp->of_node;
> +#endif
>         /* By default, we start with autoneg */
>         gp->want_autoneg = 1;
> 
> Index: linux-work/drivers/net/sungem_phy.c
> ===================================================================
> --- linux-work.orig/drivers/net/sungem_phy.c    2005-05-02 10:48:28.000000000 +1000
> +++ linux-work/drivers/net/sungem_phy.c 2005-06-14 10:36:07.000000000 +1000
> @@ -32,6 +32,10 @@
>  #include <linux/ethtool.h>
>  #include <linux/delay.h>
> 
> +#ifdef CONFIG_PPC_PMAC
> +#include <asm/prom.h>
> +#endif
> +
>  #include "sungem_phy.h"
> 
>  /* Link modes of the BCM5400 PHY */
> @@ -281,10 +285,12 @@
>  static int bcm5421_init(struct mii_phy* phy)
>  {
>         u16 data;
> -       int rev;
> +       unsigned int id;
> 
> -       rev = phy_read(phy, MII_PHYSID2) & 0x000f;
> -       if (rev == 0) {
> +       id = (phy_read(phy, MII_PHYSID1) << 16 | phy_read(phy, MII_PHYSID2));
> +
> +       /* Revision 0 of 5421 needs some fixups */
> +       if (id == 0x002060e0) {
>                 /* This is borrowed from MacOS
>                  */
>                 phy_write(phy, 0x18, 0x1007);
> @@ -297,21 +303,28 @@
>                 data = phy_read(phy, 0x15);
>                 phy_write(phy, 0x15, data | 0x0200);
>         }
> -#if 0
> -       /* This has to be verified before I enable it */
> -       /* Enable automatic low-power */
> -       phy_write(phy, 0x1c, 0x9002);
> -       phy_write(phy, 0x1c, 0xa821);
> -       phy_write(phy, 0x1c, 0x941d);
> -#endif
> -       return 0;
> -}
> 
> -static int bcm5421k2_init(struct mii_phy* phy)
> -{
> -       /* Init code borrowed from OF */
> -       phy_write(phy, 4, 0x01e1);
> -       phy_write(phy, 9, 0x0300);
> +       /* Pick up some init code from OF for K2 version */
> +       if ((id & 0xfffffff0) == 0x002062e0) {
> +               phy_write(phy, 4, 0x01e1);
> +               phy_write(phy, 9, 0x0300);
> +       }
> +
> +       /* Check if we can enable automatic low power */
> +#ifdef CONFIG_PPC_PMAC
> +       if (phy->platform_data) {
> +               struct device_node *np = of_get_parent(phy->platform_data);
> +               int can_low_power = 1;
> +               if (np == NULL || get_property(np, "no-autolowpower", NULL))
> +                       can_low_power = 0;
> +               if (can_low_power) {
> +                       /* Enable automatic low-power */
> +                       phy_write(phy, 0x1c, 0x9002);
> +                       phy_write(phy, 0x1c, 0xa821);
> +                       phy_write(phy, 0x1c, 0x941d);
> +               }
> +       }
> +#endif /* CONFIG_PPC_PMAC */
> 
>         return 0;
>  }
> @@ -762,7 +775,7 @@
> 
>  /* Broadcom BCM 5421 built-in K2 */
>  static struct mii_phy_ops bcm5421k2_phy_ops = {
> -       .init           = bcm5421k2_init,
> +       .init           = bcm5421_init,
>         .suspend        = bcm5411_suspend,
>         .setup_aneg     = bcm54xx_setup_aneg,
>         .setup_forced   = bcm54xx_setup_forced,
> @@ -779,6 +792,25 @@
>         .ops            = &bcm5421k2_phy_ops
>  };
> 
> +/* Broadcom BCM 5462 built-in Vesta */
> +static struct mii_phy_ops bcm5462V_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,
> +};
> +
> +static struct mii_phy_def bcm5462V_phy_def = {
> +       .phy_id         = 0x002062e0,
> +       .phy_id_mask    = 0xfffffff0,
> +       .name           = "BCM5462-Vesta",
> +       .features       = MII_GBIT_FEATURES,
> +       .magic_aneg     = 1,
> +       .ops            = &bcm5462V_phy_ops
> +};
> +
>  /* Marvell 88E1101 (Apple seem to deal with 2 different revs,
>   * I masked out the 8 last bits to get both, but some specs
>   * would be useful here) --BenH.
> @@ -824,6 +856,7 @@
>         &bcm5411_phy_def,
>         &bcm5421_phy_def,
>         &bcm5421k2_phy_def,
> +       &bcm5462V_phy_def,
>         &marvell_phy_def,
>         &genmii_phy_def,
>         NULL
> Index: linux-work/drivers/net/sungem_phy.h
> ===================================================================
> --- linux-work.orig/drivers/net/sungem_phy.h    2005-05-02 10:48:28.000000000 +1000
> +++ linux-work/drivers/net/sungem_phy.h 2005-06-14 10:16:14.000000000 +1000
> @@ -43,9 +43,10 @@
>         int                     pause;
> 
>         /* Provided by host chip */
> -       struct net_device*      dev;
> +       struct net_device       *dev;
>         int (*mdio_read) (struct net_device *dev, int mii_id, int reg);
>         void (*mdio_write) (struct net_device *dev, int mii_id, int reg, int val);
> +       void                    *platform_data;
>  };
> 
>  /* Pass in a struct mii_phy with dev, mdio_read and mdio_write
> 
> 
> 


-- 
Chris Eagan
ceagan at gmail.com

Want 2GB Google Mail? Just ask me!



More information about the Linuxppc64-dev mailing list