9
0
Fork 0

smc91111: add fixup for qemu phy support

as today qemu does not support phy, it will return always 0x0 to any read
on the mii bus. So the phy_id is 0 and the link is donw.

To have the norwork running on versatilpb & other qenu board for the link up
at 100Mbps.

Only enable if qemu_fixup is set.

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Jean-Christophe PLAGNIOL-VILLARD 2013-09-22 07:12:23 +02:00 committed by Sascha Hauer
parent 38b3be6f35
commit 7e6b99fd09
2 changed files with 43 additions and 1 deletions

View File

@ -66,6 +66,7 @@
#include <clock.h>
#include <io.h>
#include <linux/phy.h>
#include <net/smc91111.h>
/*---------------------------------------------------------------
.
@ -446,6 +447,7 @@ struct smc91c111_priv {
struct mii_bus miibus;
struct accessors a;
void __iomem *base;
int qemu_fixup;
};
#if (SMC_DEBUG > 2 )
@ -882,6 +884,7 @@ static void smc91c111_enable(struct eth_device *edev)
static int smc91c111_eth_open(struct eth_device *edev)
{
struct smc91c111_priv *priv = (struct smc91c111_priv *)edev->priv;
int ret;
/* Configure the Receive/Phy Control register */
SMC_SELECT_BANK(priv, 0);
@ -889,8 +892,27 @@ static int smc91c111_eth_open(struct eth_device *edev)
smc91c111_enable(edev);
return phy_device_connect(edev, &priv->miibus, 0, NULL,
ret = phy_device_connect(edev, &priv->miibus, 0, NULL,
0, PHY_INTERFACE_MODE_NA);
if (ret)
return ret;
if (priv->qemu_fixup && edev->phydev->phy_id == 0x00000000) {
struct phy_device *dev = edev->phydev;
dev->speed = SPEED_100;
dev->duplex = DUPLEX_FULL;
dev->autoneg = !AUTONEG_ENABLE;
dev->force = 1;
dev->link = 1;
dev_info(edev->parent, "phy with id 0x%08x detected this might be qemu\n",
dev->phy_id);
dev_info(edev->parent, "force link at 100Mpbs\n");
}
return 0;
}
static int smc91c111_eth_send(struct eth_device *edev, void *packet,
@ -1286,6 +1308,12 @@ static int smc91c111_probe(struct device_d *dev)
priv = edev->priv;
if (dev->platform_data) {
struct smc91c111_pdata *pdata = dev->platform_data;
priv->qemu_fixup = pdata->qemu_fixup;
}
priv->a = access_via_32bit;
edev->init = smc91c111_init_dev;

14
include/net/smc91111.h Normal file
View File

@ -0,0 +1,14 @@
/*
* Copyright (C) 2013 Jean-Christophe PLAGNIOL-VILLARD <plagnio@jcrosoft.com>
*
* Under GPLv2 only
*/
#ifndef __SMC91111_H__
#define __SMC91111_H__
struct smc91c111_pdata {
int qemu_fixup;
};
#endif /* __SMC91111_H__ */