diff options
author | Olaf Hartmann <olaf.hartmann@s1998.tu-chemnitz.de> | 2007-12-17 01:09:44 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2007-12-17 01:09:44 +0300 |
commit | ea332912b8a2e0b2f51ac3b6c197b71d3a18cbb7 (patch) | |
tree | 978fae8676916c47b9cd66071a988070c4de03d7 /drivers/net/irda | |
parent | 2638698df30b7b57a8dad7029a0c89fe6c4f6783 (diff) | |
download | linux-ea332912b8a2e0b2f51ac3b6c197b71d3a18cbb7.tar.xz |
[IRDA]: stir4200 fixes.
From: Olaf Hartmann <olaf.hartmann@s1998.tu-chemnitz.de>
The attached patch observes the stir4200 fifo size and will clear the
fifo, if the size is increasing, while it should be transmitting bytes
Signed-off-by: Samuel Ortiz <samuel@sortiz.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/irda')
-rw-r--r-- | drivers/net/irda/stir4200.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/net/irda/stir4200.c b/drivers/net/irda/stir4200.c index 042bc2f0417d..e59c485bc497 100644 --- a/drivers/net/irda/stir4200.c +++ b/drivers/net/irda/stir4200.c @@ -142,9 +142,6 @@ enum StirCtrl2Mask { }; enum StirFifoCtlMask { - FIFOCTL_EOF = 0x80, - FIFOCTL_UNDER = 0x40, - FIFOCTL_OVER = 0x20, FIFOCTL_DIR = 0x10, FIFOCTL_CLR = 0x08, FIFOCTL_EMPTY = 0x04, @@ -594,9 +591,10 @@ static int fifo_txwait(struct stir_cb *stir, int space) { int err; unsigned long count, status; + unsigned long prev_count = 0x1fff; /* Read FIFO status and count */ - for(;;) { + for (;; prev_count = count) { err = read_reg(stir, REG_FIFOCTL, stir->fifo_status, FIFO_REGS_SIZE); if (unlikely(err != FIFO_REGS_SIZE)) { @@ -629,6 +627,10 @@ static int fifo_txwait(struct stir_cb *stir, int space) if (space >= 0 && STIR_FIFO_SIZE - 4 > space + count) return 0; + /* queue confused */ + if (prev_count < count) + break; + /* estimate transfer time for remaining chars */ msleep((count * 8000) / stir->speed); } |