Skip to content

Commit

Permalink
ucc_geth: Factor out MAC initialization steps into a call
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Anton Vorontsov authored and David S. Miller committed Aug 31, 2009
1 parent ed24157 commit 54b1598
Showing 1 changed file with 52 additions and 35 deletions.
87 changes: 52 additions & 35 deletions drivers/net/ucc_geth.c
Original file line number Diff line number Diff line change
Expand Up @@ -3429,54 +3429,33 @@ 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);
if (err) {
if (netif_msg_ifup(ugeth))
ugeth_err("%s: Cannot configure net device, aborting.",
dev->name);
goto out_err;
goto err;
}

/* Set MACSTNADDR1, MACSTNADDR2 */
Expand All @@ -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,
Expand All @@ -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;
}
Expand Down

0 comments on commit 54b1598

Please sign in to comment.