* [U-Boot] [PATCH 1/2] phylib: phy_startup() should return an error code on failure
@ 2012-07-05 20:33 Timur Tabi
2012-07-05 20:33 ` [U-Boot] [PATCH 2/2] net: abort network initialization if the PHY driver fails Timur Tabi
2012-07-11 18:31 ` [U-Boot] [PATCH 1/2] phylib: phy_startup() should return an error code on failure Joe Hershberger
0 siblings, 2 replies; 5+ messages in thread
From: Timur Tabi @ 2012-07-05 20:33 UTC (permalink / raw)
To: u-boot
phy_startup() calls the PHY driver's startup function, but it ignores the
return code from that function, and so it never returns any failures.
Signed-off-by: Timur Tabi <timur@freescale.com>
---
drivers/net/phy/phy.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index 7d327f7..baef60f 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -723,10 +723,13 @@ struct phy_device *phy_connect(struct mii_dev *bus, int addr,
return phydev;
}
+/*
+ * Start the PHY. Returns 0 on success, or a negative error code.
+ */
int phy_startup(struct phy_device *phydev)
{
if (phydev->drv->startup)
- phydev->drv->startup(phydev);
+ return phydev->drv->startup(phydev);
return 0;
}
--
1.7.3.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [U-Boot] [PATCH 2/2] net: abort network initialization if the PHY driver fails
2012-07-05 20:33 [U-Boot] [PATCH 1/2] phylib: phy_startup() should return an error code on failure Timur Tabi
@ 2012-07-05 20:33 ` Timur Tabi
2012-07-06 0:31 ` Nobuhiro Iwamatsu
2012-07-11 18:31 ` [U-Boot] [PATCH 1/2] phylib: phy_startup() should return an error code on failure Joe Hershberger
1 sibling, 1 reply; 5+ messages in thread
From: Timur Tabi @ 2012-07-05 20:33 UTC (permalink / raw)
To: u-boot
Now that phy_startup() can return an actual error code, check for that error
code and abort network initialization if the PHY fails.
Signed-off-by: Timur Tabi <timur@freescale.com>
---
drivers/net/fec_mxc.c | 7 ++++++-
drivers/net/fm/eth.c | 9 ++++++++-
drivers/net/sh_eth.c | 6 +++++-
drivers/net/tsec.c | 8 +++++++-
drivers/net/xilinx_axi_emac.c | 6 +++++-
drivers/net/xilinx_ll_temac.c | 8 +++++++-
6 files changed, 38 insertions(+), 6 deletions(-)
diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c
index eee41d7..7a3d16b 100644
--- a/drivers/net/fec_mxc.c
+++ b/drivers/net/fec_mxc.c
@@ -510,7 +510,12 @@ static int fec_open(struct eth_device *edev)
fec_eth_phy_config(edev);
if (fec->phydev) {
/* Start up the PHY */
- phy_startup(fec->phydev);
+ int ret = phy_startup(fec->phydev);
+ if (ret) {
+ printf("Could not initialize PHY %s\n",
+ fm_eth->phydev->dev->name);
+ return ret;
+ }
speed = fec->phydev->speed;
} else {
speed = _100BASET;
diff --git a/drivers/net/fm/eth.c b/drivers/net/fm/eth.c
index f34f4db..2b616ad 100644
--- a/drivers/net/fm/eth.c
+++ b/drivers/net/fm/eth.c
@@ -363,6 +363,9 @@ static int fm_eth_open(struct eth_device *dev, bd_t *bd)
{
struct fm_eth *fm_eth;
struct fsl_enet_mac *mac;
+#ifdef CONFIG_PHYLIB
+ int ret;
+#endif
fm_eth = (struct fm_eth *)dev->priv;
mac = fm_eth->mac;
@@ -384,7 +387,11 @@ static int fm_eth_open(struct eth_device *dev, bd_t *bd)
fmc_tx_port_graceful_stop_disable(fm_eth);
#ifdef CONFIG_PHYLIB
- phy_startup(fm_eth->phydev);
+ ret = phy_startup(fm_eth->phydev);
+ if (ret) {
+ printf("%s: Could not initialize\n", fm_eth->phydev->dev->name);
+ return ret;
+ }
#else
fm_eth->phydev->speed = SPEED_1000;
fm_eth->phydev->link = 1;
diff --git a/drivers/net/sh_eth.c b/drivers/net/sh_eth.c
index bb57e4d..268d884 100644
--- a/drivers/net/sh_eth.c
+++ b/drivers/net/sh_eth.c
@@ -415,7 +415,11 @@ static int sh_eth_config(struct sh_eth_dev *eth, bd_t *bd)
goto err_phy_cfg;
}
phy = port_info->phydev;
- phy_startup(phy);
+ ret = phy_startup(phy);
+ if (ret) {
+ printf(SHETHER_NAME ": phy startup failure\n");
+ return ret;
+ }
val = 0;
diff --git a/drivers/net/tsec.c b/drivers/net/tsec.c
index 3c1c8f0..f5e314b 100644
--- a/drivers/net/tsec.c
+++ b/drivers/net/tsec.c
@@ -480,6 +480,7 @@ static int tsec_init(struct eth_device *dev, bd_t * bd)
int i;
struct tsec_private *priv = (struct tsec_private *)dev->priv;
tsec_t *regs = priv->regs;
+ int ret;
/* Make sure the controller is stopped */
tsec_halt(dev);
@@ -511,7 +512,12 @@ static int tsec_init(struct eth_device *dev, bd_t * bd)
startup_tsec(dev);
/* Start up the PHY */
- phy_startup(priv->phydev);
+ ret = phy_startup(priv->phydev);
+ if (ret) {
+ printf("Could not initialize PHY %s\n",
+ priv->phydev->dev->name);
+ return ret;
+ }
adjust_link(priv, priv->phydev);
diff --git a/drivers/net/xilinx_axi_emac.c b/drivers/net/xilinx_axi_emac.c
index 7854a04..d777144 100644
--- a/drivers/net/xilinx_axi_emac.c
+++ b/drivers/net/xilinx_axi_emac.c
@@ -272,7 +272,11 @@ static int setup_phy(struct eth_device *dev)
phydev->advertising = phydev->supported;
priv->phydev = phydev;
phy_config(phydev);
- phy_startup(phydev);
+ if (phy_startup(phydev)) {
+ printf("axiemac: could not initialize PHY %s\n",
+ phydev->dev->name);
+ return 0;
+ }
switch (phydev->speed) {
case 1000:
diff --git a/drivers/net/xilinx_ll_temac.c b/drivers/net/xilinx_ll_temac.c
index 27dafc1..b67153b 100644
--- a/drivers/net/xilinx_ll_temac.c
+++ b/drivers/net/xilinx_ll_temac.c
@@ -232,6 +232,7 @@ static void ll_temac_halt(struct eth_device *dev)
static int ll_temac_init(struct eth_device *dev, bd_t *bis)
{
struct ll_temac *ll_temac = dev->priv;
+ int ret;
printf("%s: Xilinx XPS LocalLink Tri-Mode Ether MAC #%d at 0x%08X.\n",
dev->name, dev->index, dev->iobase);
@@ -240,7 +241,12 @@ static int ll_temac_init(struct eth_device *dev, bd_t *bis)
return -1;
/* Start up the PHY */
- phy_startup(ll_temac->phydev);
+ ret = phy_startup(ll_temac->phydev);
+ if (ret) {
+ printf("%s: Could not initialize PHY %s\n",
+ dev->name, ll_temac->phydev->dev->name);
+ return ret;
+ }
if (!ll_temac_adjust_link(dev)) {
ll_temac_halt(dev);
--
1.7.3.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [U-Boot] [PATCH 2/2] net: abort network initialization if the PHY driver fails
2012-07-05 20:33 ` [U-Boot] [PATCH 2/2] net: abort network initialization if the PHY driver fails Timur Tabi
@ 2012-07-06 0:31 ` Nobuhiro Iwamatsu
2012-07-06 1:58 ` Tabi Timur-B04825
0 siblings, 1 reply; 5+ messages in thread
From: Nobuhiro Iwamatsu @ 2012-07-06 0:31 UTC (permalink / raw)
To: u-boot
Hi,
2012/7/6 Timur Tabi <timur@freescale.com>:
> Now that phy_startup() can return an actual error code, check for that error
> code and abort network initialization if the PHY fails.
>
> Signed-off-by: Timur Tabi <timur@freescale.com>
> ---
> drivers/net/fec_mxc.c | 7 ++++++-
> drivers/net/fm/eth.c | 9 ++++++++-
> drivers/net/sh_eth.c | 6 +++++-
> drivers/net/tsec.c | 8 +++++++-
> drivers/net/xilinx_axi_emac.c | 6 +++++-
> drivers/net/xilinx_ll_temac.c | 8 +++++++-
> 6 files changed, 38 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c
> index eee41d7..7a3d16b 100644
> --- a/drivers/net/fec_mxc.c
> +++ b/drivers/net/fec_mxc.c
> @@ -510,7 +510,12 @@ static int fec_open(struct eth_device *edev)
> fec_eth_phy_config(edev);
> if (fec->phydev) {
> /* Start up the PHY */
> - phy_startup(fec->phydev);
> + int ret = phy_startup(fec->phydev);
> + if (ret) {
> + printf("Could not initialize PHY %s\n",
> + fm_eth->phydev->dev->name);
Probably this is fec, not fm_eth.
> + return ret;
> + }
> speed = fec->phydev->speed;
> } else {
> speed = _100BASET;
> diff --git a/drivers/net/fm/eth.c b/drivers/net/fm/eth.c
> index f34f4db..2b616ad 100644
> --- a/drivers/net/fm/eth.c
> +++ b/drivers/net/fm/eth.c
> @@ -363,6 +363,9 @@ static int fm_eth_open(struct eth_device *dev, bd_t *bd)
> {
> struct fm_eth *fm_eth;
> struct fsl_enet_mac *mac;
> +#ifdef CONFIG_PHYLIB
> + int ret;
> +#endif
>
> fm_eth = (struct fm_eth *)dev->priv;
> mac = fm_eth->mac;
> @@ -384,7 +387,11 @@ static int fm_eth_open(struct eth_device *dev, bd_t *bd)
> fmc_tx_port_graceful_stop_disable(fm_eth);
>
> #ifdef CONFIG_PHYLIB
> - phy_startup(fm_eth->phydev);
> + ret = phy_startup(fm_eth->phydev);
> + if (ret) {
> + printf("%s: Could not initialize\n", fm_eth->phydev->dev->name);
> + return ret;
> + }
> #else
> fm_eth->phydev->speed = SPEED_1000;
> fm_eth->phydev->link = 1;
> diff --git a/drivers/net/sh_eth.c b/drivers/net/sh_eth.c
> index bb57e4d..268d884 100644
> --- a/drivers/net/sh_eth.c
> +++ b/drivers/net/sh_eth.c
> @@ -415,7 +415,11 @@ static int sh_eth_config(struct sh_eth_dev *eth, bd_t *bd)
> goto err_phy_cfg;
> }
> phy = port_info->phydev;
> - phy_startup(phy);
> + ret = phy_startup(phy);
> + if (ret) {
> + printf(SHETHER_NAME ": phy startup failure\n");
> + return ret;
> + }
>
> val = 0;
>
> diff --git a/drivers/net/tsec.c b/drivers/net/tsec.c
> index 3c1c8f0..f5e314b 100644
> --- a/drivers/net/tsec.c
> +++ b/drivers/net/tsec.c
> @@ -480,6 +480,7 @@ static int tsec_init(struct eth_device *dev, bd_t * bd)
> int i;
> struct tsec_private *priv = (struct tsec_private *)dev->priv;
> tsec_t *regs = priv->regs;
> + int ret;
>
> /* Make sure the controller is stopped */
> tsec_halt(dev);
> @@ -511,7 +512,12 @@ static int tsec_init(struct eth_device *dev, bd_t * bd)
> startup_tsec(dev);
>
> /* Start up the PHY */
> - phy_startup(priv->phydev);
> + ret = phy_startup(priv->phydev);
> + if (ret) {
> + printf("Could not initialize PHY %s\n",
> + priv->phydev->dev->name);
> + return ret;
> + }
>
> adjust_link(priv, priv->phydev);
>
> diff --git a/drivers/net/xilinx_axi_emac.c b/drivers/net/xilinx_axi_emac.c
> index 7854a04..d777144 100644
> --- a/drivers/net/xilinx_axi_emac.c
> +++ b/drivers/net/xilinx_axi_emac.c
> @@ -272,7 +272,11 @@ static int setup_phy(struct eth_device *dev)
> phydev->advertising = phydev->supported;
> priv->phydev = phydev;
> phy_config(phydev);
> - phy_startup(phydev);
> + if (phy_startup(phydev)) {
> + printf("axiemac: could not initialize PHY %s\n",
> + phydev->dev->name);
> + return 0;
> + }
>
> switch (phydev->speed) {
> case 1000:
Why doesn't this driver use a ret variable?
Other driver's patch used this.
> diff --git a/drivers/net/xilinx_ll_temac.c b/drivers/net/xilinx_ll_temac.c
> index 27dafc1..b67153b 100644
> --- a/drivers/net/xilinx_ll_temac.c
> +++ b/drivers/net/xilinx_ll_temac.c
> @@ -232,6 +232,7 @@ static void ll_temac_halt(struct eth_device *dev)
> static int ll_temac_init(struct eth_device *dev, bd_t *bis)
> {
> struct ll_temac *ll_temac = dev->priv;
> + int ret;
>
> printf("%s: Xilinx XPS LocalLink Tri-Mode Ether MAC #%d at 0x%08X.\n",
> dev->name, dev->index, dev->iobase);
> @@ -240,7 +241,12 @@ static int ll_temac_init(struct eth_device *dev, bd_t *bis)
> return -1;
>
> /* Start up the PHY */
> - phy_startup(ll_temac->phydev);
> + ret = phy_startup(ll_temac->phydev);
> + if (ret) {
> + printf("%s: Could not initialize PHY %s\n",
> + dev->name, ll_temac->phydev->dev->name);
> + return ret;
> + }
>
> if (!ll_temac_adjust_link(dev)) {
> ll_temac_halt(dev);
> --
> 1.7.3.4
>
I acked sh_eth's part. Thank you.
Acked-by: Nobuhiro Iwamamatsu <nobuhiro.iwamatsu.yj@renesas.com>
Best regards,
Nobuhiro
--
Nobuhiro Iwamatsu
^ permalink raw reply [flat|nested] 5+ messages in thread
* [U-Boot] [PATCH 2/2] net: abort network initialization if the PHY driver fails
2012-07-06 0:31 ` Nobuhiro Iwamatsu
@ 2012-07-06 1:58 ` Tabi Timur-B04825
0 siblings, 0 replies; 5+ messages in thread
From: Tabi Timur-B04825 @ 2012-07-06 1:58 UTC (permalink / raw)
To: u-boot
Nobuhiro Iwamatsu wrote:
>> diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c
>> index eee41d7..7a3d16b 100644
>> --- a/drivers/net/fec_mxc.c
>> +++ b/drivers/net/fec_mxc.c
>> @@ -510,7 +510,12 @@ static int fec_open(struct eth_device *edev)
>> fec_eth_phy_config(edev);
>> if (fec->phydev) {
>> /* Start up the PHY */
>> - phy_startup(fec->phydev);
>> + int ret = phy_startup(fec->phydev);
>> + if (ret) {
>> + printf("Could not initialize PHY %s\n",
>> + fm_eth->phydev->dev->name);
>
> Probably this is fec, not fm_eth.
Thanks. I thought I was being diligent, and I ran MAKEALL, but I guess it
wasn't enough.
>> diff --git a/drivers/net/xilinx_axi_emac.c b/drivers/net/xilinx_axi_emac.c
>> index 7854a04..d777144 100644
>> --- a/drivers/net/xilinx_axi_emac.c
>> +++ b/drivers/net/xilinx_axi_emac.c
>> @@ -272,7 +272,11 @@ static int setup_phy(struct eth_device *dev)
>> phydev->advertising = phydev->supported;
>> priv->phydev = phydev;
>> phy_config(phydev);
>> - phy_startup(phydev);
>> + if (phy_startup(phydev)) {
>> + printf("axiemac: could not initialize PHY %s\n",
>> + phydev->dev->name);
>> + return 0;
>> + }
>>
>> switch (phydev->speed) {
>> case 1000:
>
> Why doesn't this driver use a ret variable?
> Other driver's patch used this.
Because setup_phy() returns either 0 (failure) or 1 (success).
--
Timur Tabi
Linux kernel developer at Freescale
^ permalink raw reply [flat|nested] 5+ messages in thread
* [U-Boot] [PATCH 1/2] phylib: phy_startup() should return an error code on failure
2012-07-05 20:33 [U-Boot] [PATCH 1/2] phylib: phy_startup() should return an error code on failure Timur Tabi
2012-07-05 20:33 ` [U-Boot] [PATCH 2/2] net: abort network initialization if the PHY driver fails Timur Tabi
@ 2012-07-11 18:31 ` Joe Hershberger
1 sibling, 0 replies; 5+ messages in thread
From: Joe Hershberger @ 2012-07-11 18:31 UTC (permalink / raw)
To: u-boot
Hi Timur Tabi,
On Thu, Jul 5, 2012 at 3:33 PM, Timur Tabi <timur@freescale.com> wrote:
> phy_startup() calls the PHY driver's startup function, but it ignores the
> return code from that function, and so it never returns any failures.
>
> Signed-off-by: Timur Tabi <timur@freescale.com>
> ---
Applied to next, thanks.
-Joe
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2012-07-11 18:31 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-07-05 20:33 [U-Boot] [PATCH 1/2] phylib: phy_startup() should return an error code on failure Timur Tabi
2012-07-05 20:33 ` [U-Boot] [PATCH 2/2] net: abort network initialization if the PHY driver fails Timur Tabi
2012-07-06 0:31 ` Nobuhiro Iwamatsu
2012-07-06 1:58 ` Tabi Timur-B04825
2012-07-11 18:31 ` [U-Boot] [PATCH 1/2] phylib: phy_startup() should return an error code on failure Joe Hershberger
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.