Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 122782
b: refs/heads/master
c: 1762a29
h: refs/heads/master
v: v3
  • Loading branch information
Anton Vorontsov authored and David S. Miller committed Dec 19, 2008
1 parent 59662a0 commit f913b69
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 9 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b3431c647662a3647f3500a12ec85d65e3622759
refs/heads/master: 1762a29ae5ebdd974eb2ba0c36b56ab6f7a9c16d
37 changes: 29 additions & 8 deletions trunk/drivers/net/ucc_geth.c
Original file line number Diff line number Diff line change
Expand Up @@ -3355,13 +3355,17 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth)
return 0;
}

/* ucc_geth_timeout gets called when a packet has not been
* transmitted after a set amount of time.
* For now, assume that clearing out all the structures, and
* starting over will fix the problem. */
static void ucc_geth_timeout(struct net_device *dev)
static int ucc_geth_close(struct net_device *dev);
static int ucc_geth_open(struct net_device *dev);

/* Reopen device. This will reset the MAC and PHY. */
static void ucc_geth_timeout_work(struct work_struct *work)
{
struct ucc_geth_private *ugeth = netdev_priv(dev);
struct ucc_geth_private *ugeth;
struct net_device *dev;

ugeth = container_of(work, struct ucc_geth_private, timeout_work);
dev = ugeth->dev;

ugeth_vdbg("%s: IN", __func__);

Expand All @@ -3370,13 +3374,29 @@ static void ucc_geth_timeout(struct net_device *dev)
ugeth_dump_regs(ugeth);

if (dev->flags & IFF_UP) {
ucc_geth_stop(ugeth);
ucc_geth_startup(ugeth);
/*
* Must reset MAC *and* PHY. This is done by reopening
* the device.
*/
ucc_geth_close(dev);
ucc_geth_open(dev);
}

netif_tx_schedule_all(dev);
}

/*
* ucc_geth_timeout gets called when a packet has not been
* transmitted after a set amount of time.
*/
static void ucc_geth_timeout(struct net_device *dev)
{
struct ucc_geth_private *ugeth = netdev_priv(dev);

netif_carrier_off(dev);
schedule_work(&ugeth->timeout_work);
}

/* This is called by the kernel when a frame is ready for transmission. */
/* It is pointed to by the dev->hard_start_xmit function pointer */
static int ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev)
Expand Down Expand Up @@ -4027,6 +4047,7 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma
dev->hard_start_xmit = ucc_geth_start_xmit;
dev->tx_timeout = ucc_geth_timeout;
dev->watchdog_timeo = TX_TIMEOUT;
INIT_WORK(&ugeth->timeout_work, ucc_geth_timeout_work);
netif_napi_add(dev, &ugeth->napi, ucc_geth_poll, UCC_GETH_DEV_WEIGHT);
#ifdef CONFIG_NET_POLL_CONTROLLER
dev->poll_controller = ucc_netpoll;
Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/net/ucc_geth.h
Original file line number Diff line number Diff line change
Expand Up @@ -1186,6 +1186,7 @@ struct ucc_geth_private {
struct ucc_fast_private *uccf;
struct net_device *dev;
struct napi_struct napi;
struct work_struct timeout_work;
struct ucc_geth __iomem *ug_regs;
struct ucc_geth_init_pram *p_init_enet_param_shadow;
struct ucc_geth_exf_global_pram __iomem *p_exf_glbl_param;
Expand Down

0 comments on commit f913b69

Please sign in to comment.