1
0
Fork 0

ucc_geth: Factor out MAC initialization steps into a call

This patch factors out MAC initialization into ucc_geth_init_mac()
function that we'll use for suspend/resume.

Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
hifive-unleashed-5.1
Anton Vorontsov 2009-08-27 07:35:54 +00:00 committed by David S. Miller
parent ed24157ede
commit 54b1598384
1 changed files with 52 additions and 35 deletions

View File

@ -3429,46 +3429,25 @@ static int ucc_geth_set_mac_addr(struct net_device *dev, void *p)
return 0;
}
/* Called when something needs to use the ethernet device */
/* Returns 0 for success. */
static int ucc_geth_open(struct net_device *dev)
static int ucc_geth_init_mac(struct ucc_geth_private *ugeth)
{
struct ucc_geth_private *ugeth = netdev_priv(dev);
struct net_device *dev = ugeth->ndev;
int err;
ugeth_vdbg("%s: IN", __func__);
/* Test station address */
if (dev->dev_addr[0] & ENET_GROUP_ADDR) {
if (netif_msg_ifup(ugeth))
ugeth_err("%s: Multicast address used for station address"
" - is this what you wanted?", __func__);
return -EINVAL;
}
err = init_phy(dev);
if (err) {
if (netif_msg_ifup(ugeth))
ugeth_err("%s: Cannot initialize PHY, aborting.",
dev->name);
return err;
}
err = ucc_struct_init(ugeth);
if (err) {
if (netif_msg_ifup(ugeth))
ugeth_err("%s: Cannot configure internal struct, aborting.", dev->name);
goto out_err_stop;
ugeth_err("%s: Cannot configure internal struct, "
"aborting.", dev->name);
goto err;
}
napi_enable(&ugeth->napi);
err = ucc_geth_startup(ugeth);
if (err) {
if (netif_msg_ifup(ugeth))
ugeth_err("%s: Cannot configure net device, aborting.",
dev->name);
goto out_err;
goto err;
}
err = adjust_enet_interface(ugeth);
@ -3476,7 +3455,7 @@ static int ucc_geth_open(struct net_device *dev)
if (netif_msg_ifup(ugeth))
ugeth_err("%s: Cannot configure net device, aborting.",
dev->name);
goto out_err;
goto err;
}
/* Set MACSTNADDR1, MACSTNADDR2 */
@ -3490,13 +3469,51 @@ static int ucc_geth_open(struct net_device *dev)
&ugeth->ug_regs->macstnaddr1,
&ugeth->ug_regs->macstnaddr2);
phy_start(ugeth->phydev);
err = ugeth_enable(ugeth, COMM_DIR_RX_AND_TX);
if (err) {
if (netif_msg_ifup(ugeth))
ugeth_err("%s: Cannot enable net device, aborting.", dev->name);
goto out_err;
goto err;
}
return 0;
err:
ucc_geth_stop(ugeth);
return err;
}
/* Called when something needs to use the ethernet device */
/* Returns 0 for success. */
static int ucc_geth_open(struct net_device *dev)
{
struct ucc_geth_private *ugeth = netdev_priv(dev);
int err;
ugeth_vdbg("%s: IN", __func__);
/* Test station address */
if (dev->dev_addr[0] & ENET_GROUP_ADDR) {
if (netif_msg_ifup(ugeth))
ugeth_err("%s: Multicast address used for station "
"address - is this what you wanted?",
__func__);
return -EINVAL;
}
err = init_phy(dev);
if (err) {
if (netif_msg_ifup(ugeth))
ugeth_err("%s: Cannot initialize PHY, aborting.",
dev->name);
return err;
}
err = ucc_geth_init_mac(ugeth);
if (err) {
if (netif_msg_ifup(ugeth))
ugeth_err("%s: Cannot initialize MAC, aborting.",
dev->name);
goto err;
}
err = request_irq(ugeth->ug_info->uf_info.irq, ucc_geth_irq_handler,
@ -3505,16 +3522,16 @@ static int ucc_geth_open(struct net_device *dev)
if (netif_msg_ifup(ugeth))
ugeth_err("%s: Cannot get IRQ for net device, aborting.",
dev->name);
goto out_err;
goto err;
}
phy_start(ugeth->phydev);
napi_enable(&ugeth->napi);
netif_start_queue(dev);
return err;
out_err:
napi_disable(&ugeth->napi);
out_err_stop:
err:
ucc_geth_stop(ugeth);
return err;
}