Skip to content

Commit

Permalink
Fix RGMII-ID handling in gianfar
Browse files Browse the repository at this point in the history
The TSEC/eTSEC can detect the interface to the PHY automatically,
but it isn't able to detect whether the RGMII connection needs internal
delay.  So we need to detect that change in the device tree, propagate
it to the platform data, and then check it if we're in RGMII.  This fixes
a bug on the 8641D HPCN board where the Vitesse PHY doesn't use the delay
for RGMII.

Signed-off-by: Andy Fleming <afleming@freescale.com>
  • Loading branch information
Andy Fleming authored and Jeff Garzik committed Jul 18, 2007
1 parent af2d940 commit 7132ab7
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 1 deletion.
9 changes: 9 additions & 0 deletions arch/powerpc/sysdev/fsl_soc.c
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@ static int __init gfar_of_init(void)
struct gianfar_platform_data gfar_data;
const unsigned int *id;
const char *model;
const char *ctype;
const void *mac_addr;
const phandle *ph;
int n_res = 2;
Expand Down Expand Up @@ -254,6 +255,14 @@ static int __init gfar_of_init(void)
FSL_GIANFAR_DEV_HAS_VLAN |
FSL_GIANFAR_DEV_HAS_EXTENDED_HASH;

ctype = of_get_property(np, "phy-connection-type", NULL);

/* We only care about rgmii-id. The rest are autodetected */
if (ctype && !strcmp(ctype, "rgmii-id"))
gfar_data.interface = PHY_INTERFACE_MODE_RGMII_ID;
else
gfar_data.interface = PHY_INTERFACE_MODE_MII;

ph = of_get_property(np, "phy-handle", NULL);
phy = of_find_node_by_phandle(*ph);

Expand Down
12 changes: 11 additions & 1 deletion drivers/net/gianfar.c
Original file line number Diff line number Diff line change
Expand Up @@ -420,8 +420,18 @@ static phy_interface_t gfar_get_interface(struct net_device *dev)
if (ecntrl & ECNTRL_REDUCED_MODE) {
if (ecntrl & ECNTRL_REDUCED_MII_MODE)
return PHY_INTERFACE_MODE_RMII;
else
else {
phy_interface_t interface = priv->einfo->interface;

/*
* This isn't autodetected right now, so it must
* be set by the device tree or platform code.
*/
if (interface == PHY_INTERFACE_MODE_RGMII_ID)
return PHY_INTERFACE_MODE_RGMII_ID;

return PHY_INTERFACE_MODE_RGMII;
}
}

if (priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_GIGABIT)
Expand Down
1 change: 1 addition & 0 deletions include/linux/fsl_devices.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ struct gianfar_platform_data {
u32 bus_id;
u32 phy_id;
u8 mac_addr[6];
phy_interface_t interface;
};

struct gianfar_mdio_data {
Expand Down

0 comments on commit 7132ab7

Please sign in to comment.