From: Jesse Huang <[email protected]>
Change Logs:
Solve host error problem in low performance embedded system when continune down and up.
Signed-off-by: Jesse Huang <[email protected]>
---
drivers/net/sundance.c | 26 +++++++++++++++++++++++---
1 files changed, 23 insertions(+), 3 deletions(-)
c06c70e20a85facd640528ca66e0b579fc3ee745
diff --git a/drivers/net/sundance.c b/drivers/net/sundance.c
index 14b4933..b4a6010 100755
--- a/drivers/net/sundance.c
+++ b/drivers/net/sundance.c
@@ -1643,6 +1643,14 @@ static int netdev_close(struct net_devic
struct sk_buff *skb;
int i;
+ /* Wait and kill tasklet */
+ tasklet_kill(&np->rx_tasklet);
+ tasklet_kill(&np->tx_tasklet);
+ np->cur_tx = 0;
+ np->dirty_tx = 0;
+ np->cur_task = 0;
+ np->last_tx = 0;
+
netif_stop_queue(dev);
if (netif_msg_ifdown(np)) {
@@ -1663,9 +1671,20 @@ static int netdev_close(struct net_devic
/* Stop the chip's Tx and Rx processes. */
iowrite16(TxDisable | RxDisable | StatsDisable, ioaddr + MACCtrl1);
- /* Wait and kill tasklet */
- tasklet_kill(&np->rx_tasklet);
- tasklet_kill(&np->tx_tasklet);
+ for (i = 2000; i > 0; i--) {
+ if ((ioread32(ioaddr + DMACtrl) &0xC000) == 0)
+ break;
+ mdelay(1);
+ }
+
+ iowrite16(GlobalReset | DMAReset | FIFOReset | NetworkReset, ioaddr +ASICCtrl + 2);
+
+ for (i = 2000; i > 0; i--)
+ {
+ if ((ioread16(ioaddr + ASICCtrl +2) &ResetBusy) == 0)
+ break;
+ mdelay(1);
+ }
#ifdef __i386__
if (netif_msg_hw(np)) {
@@ -1703,6 +1722,7 @@ #endif /* __i386__ debugging only */
}
}
for (i = 0; i < TX_RING_SIZE; i++) {
+ np->tx_ring[i].next_desc = 0;
skb = np->tx_skbuff[i];
if (skb) {
pci_unmap_single(np->pci_dev,
--
1.3.GIT
On Mon, 02 Oct 2006 14:26:36 -0400
Jesse Huang <[email protected]> wrote:
> Solve host error problem in low performance embedded system when continune down and up.
I don't understand that. Please describe the actual problem which is being solved,
as well as the means by which it was solved, thanks.
In some low performance embedded CPU, if continued to ifconfig up
and down driver. It will cause host error. Driver need to make sure all
counter is clear to zero, and hardware actually stop.
----- Original Message -----
From: "Andrew Morton" <[email protected]>
To: "Jesse Huang" <[email protected]>
Cc: <[email protected]>; <[email protected]>;
<[email protected]>
Sent: Monday, October 02, 2006 2:51 PM
Subject: Re: [PATCH 5/5] Solve host error problem in low performance
embedded system when continune down and up.
On Mon, 02 Oct 2006 14:26:36 -0400
Jesse Huang <[email protected]> wrote:
> Solve host error problem in low performance embedded system when continune
down and up.
I don't understand that. Please describe the actual problem which is being
solved,
as well as the means by which it was solved, thanks.
On Mon, Oct 02, 2006 at 02:26:36PM -0400, Jesse Huang wrote:
> From: Jesse Huang <[email protected]>
>
> Change Logs:
> Solve host error problem in low performance embedded system when continune down and up.
>
> Signed-off-by: Jesse Huang <[email protected]>
> ---
>
> drivers/net/sundance.c | 26 +++++++++++++++++++++++---
> 1 files changed, 23 insertions(+), 3 deletions(-)
>
> c06c70e20a85facd640528ca66e0b579fc3ee745
> diff --git a/drivers/net/sundance.c b/drivers/net/sundance.c
> index 14b4933..b4a6010 100755
> --- a/drivers/net/sundance.c
> +++ b/drivers/net/sundance.c
> @@ -1643,6 +1643,14 @@ static int netdev_close(struct net_devic
> struct sk_buff *skb;
> int i;
>
> + /* Wait and kill tasklet */
> + tasklet_kill(&np->rx_tasklet);
> + tasklet_kill(&np->tx_tasklet);
> + np->cur_tx = 0;
> + np->dirty_tx = 0;
> + np->cur_task = 0;
> + np->last_tx = 0;
> +
> netif_stop_queue(dev);
>
> if (netif_msg_ifdown(np)) {
> @@ -1663,9 +1671,20 @@ static int netdev_close(struct net_devic
> /* Stop the chip's Tx and Rx processes. */
> iowrite16(TxDisable | RxDisable | StatsDisable, ioaddr + MACCtrl1);
>
> - /* Wait and kill tasklet */
> - tasklet_kill(&np->rx_tasklet);
> - tasklet_kill(&np->tx_tasklet);
> + for (i = 2000; i > 0; i--) {
> + if ((ioread32(ioaddr + DMACtrl) &0xC000) == 0)
^^^^^^^
Missing white space?
> + break;
> + mdelay(1);
> + }
> +
> + iowrite16(GlobalReset | DMAReset | FIFOReset | NetworkReset, ioaddr +ASICCtrl + 2);
^^^^^^^^^
Same here..
> +
> + for (i = 2000; i > 0; i--)
> + {
> + if ((ioread16(ioaddr + ASICCtrl +2) &ResetBusy) == 0)
^^^^^^^^^^
.. and here
> + break;
> + mdelay(1);
> + }
>
Regards,
Frederik