Commit b3431c64 authored by Anton Vorontsov's avatar Anton Vorontsov Committed by David S. Miller

ucc_geth: Fix endless loop in stop_{tx,rx} routines

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: default avatarAnton Vorontsov <avorontsov@ru.mvista.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6086ebca
...@@ -1647,6 +1647,7 @@ static int ugeth_graceful_stop_tx(struct ucc_geth_private *ugeth) ...@@ -1647,6 +1647,7 @@ static int ugeth_graceful_stop_tx(struct ucc_geth_private *ugeth)
struct ucc_fast_private *uccf; struct ucc_fast_private *uccf;
u32 cecr_subblock; u32 cecr_subblock;
u32 temp; u32 temp;
int i = 10;
uccf = ugeth->uccf; uccf = ugeth->uccf;
...@@ -1664,8 +1665,9 @@ static int ugeth_graceful_stop_tx(struct ucc_geth_private *ugeth) ...@@ -1664,8 +1665,9 @@ static int ugeth_graceful_stop_tx(struct ucc_geth_private *ugeth)
/* Wait for command to complete */ /* Wait for command to complete */
do { do {
msleep(10);
temp = in_be32(uccf->p_ucce); temp = in_be32(uccf->p_ucce);
} while (!(temp & UCCE_GRA)); } while (!(temp & UCCE_GRA) && --i);
uccf->stopped_tx = 1; uccf->stopped_tx = 1;
...@@ -1677,6 +1679,7 @@ static int ugeth_graceful_stop_rx(struct ucc_geth_private * ugeth) ...@@ -1677,6 +1679,7 @@ static int ugeth_graceful_stop_rx(struct ucc_geth_private * ugeth)
struct ucc_fast_private *uccf; struct ucc_fast_private *uccf;
u32 cecr_subblock; u32 cecr_subblock;
u8 temp; u8 temp;
int i = 10;
uccf = ugeth->uccf; uccf = ugeth->uccf;
...@@ -1694,9 +1697,9 @@ static int ugeth_graceful_stop_rx(struct ucc_geth_private * ugeth) ...@@ -1694,9 +1697,9 @@ static int ugeth_graceful_stop_rx(struct ucc_geth_private * ugeth)
ucc_num); ucc_num);
qe_issue_cmd(QE_GRACEFUL_STOP_RX, cecr_subblock, qe_issue_cmd(QE_GRACEFUL_STOP_RX, cecr_subblock,
QE_CR_PROTOCOL_ETHERNET, 0); QE_CR_PROTOCOL_ETHERNET, 0);
msleep(10);
temp = in_8(&ugeth->p_rx_glbl_pram->rxgstpack); 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; uccf->stopped_rx = 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment