Skip to content

Commit

Permalink
ucc_geth: Fix endless loop in stop_{tx,rx} routines
Browse files Browse the repository at this point in the history
Currently the routines wait for the various bits w/o an assumption that
bits may never get set. When timeouts happen I see that these bits never
get set and so the routines hang the kernel.

With this patch we'll wait the graceful stop for 100 ms, and then will
simply exit. There is nothing* we can do about that, but it's OK since
we'll do full reset later.

* Well, actually, there is also not-graceful variant for the TX stop,
  but specs says that we never should use it.

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 Dec 19, 2008
1 parent 6086ebc commit b3431c6
Showing 1 changed file with 6 additions and 3 deletions.
9 changes: 6 additions & 3 deletions drivers/net/ucc_geth.c
Original file line number Diff line number Diff line change
Expand Up @@ -1647,6 +1647,7 @@ static int ugeth_graceful_stop_tx(struct ucc_geth_private *ugeth)
struct ucc_fast_private *uccf;
u32 cecr_subblock;
u32 temp;
int i = 10;

uccf = ugeth->uccf;

Expand All @@ -1664,8 +1665,9 @@ static int ugeth_graceful_stop_tx(struct ucc_geth_private *ugeth)

/* Wait for command to complete */
do {
msleep(10);
temp = in_be32(uccf->p_ucce);
} while (!(temp & UCCE_GRA));
} while (!(temp & UCCE_GRA) && --i);

uccf->stopped_tx = 1;

Expand All @@ -1677,6 +1679,7 @@ static int ugeth_graceful_stop_rx(struct ucc_geth_private * ugeth)
struct ucc_fast_private *uccf;
u32 cecr_subblock;
u8 temp;
int i = 10;

uccf = ugeth->uccf;

Expand All @@ -1694,9 +1697,9 @@ static int ugeth_graceful_stop_rx(struct ucc_geth_private * ugeth)
ucc_num);
qe_issue_cmd(QE_GRACEFUL_STOP_RX, cecr_subblock,
QE_CR_PROTOCOL_ETHERNET, 0);

msleep(10);
temp = in_8(&ugeth->p_rx_glbl_pram->rxgstpack);
} while (!(temp & GRACEFUL_STOP_ACKNOWLEDGE_RX));
} while (!(temp & GRACEFUL_STOP_ACKNOWLEDGE_RX) && --i);

uccf->stopped_rx = 1;

Expand Down

0 comments on commit b3431c6

Please sign in to comment.