Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 60871
b: refs/heads/master
c: 5b21f9d
h: refs/heads/master
i:
  60869: ff57232
  60867: 9c78baf
  60863: d562a4f
v: v3
  • Loading branch information
Jiri Slaby authored and Linus Torvalds committed Jul 17, 2007
1 parent 412f4b5 commit 01e8b18
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 39 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: c4923b4f13156455a9e84f0b918866aef300cc57
refs/heads/master: 5b21f9dddd0817b761f1407f1950bee4f257411a
65 changes: 27 additions & 38 deletions trunk/drivers/char/isicom.c
Original file line number Diff line number Diff line change
Expand Up @@ -243,41 +243,25 @@ static inline int WaitTillCardIsFree(u16 base)

static int lock_card(struct isi_board *card)
{
char retries;
unsigned long base = card->base;
unsigned int retries, a;

for (retries = 0; retries < 100; retries++) {
for (retries = 0; retries < 10; retries++) {
spin_lock_irqsave(&card->card_lock, card->flags);
if (inw(base + 0xe) & 0x1) {
return 1;
} else {
spin_unlock_irqrestore(&card->card_lock, card->flags);
udelay(1000); /* 1ms */
for (a = 0; a < 10; a++) {
if (inw(base + 0xe) & 0x1)
return 1;
udelay(10);
}
spin_unlock_irqrestore(&card->card_lock, card->flags);
msleep(10);
}
printk(KERN_WARNING "ISICOM: Failed to lock Card (0x%lx)\n",
card->base);

return 0; /* Failed to acquire the card! */
}

static int lock_card_at_interrupt(struct isi_board *card)
{
unsigned char retries;
unsigned long base = card->base;

for (retries = 0; retries < 200; retries++) {
spin_lock_irqsave(&card->card_lock, card->flags);

if (inw(base + 0xe) & 0x1)
return 1;
else
spin_unlock_irqrestore(&card->card_lock, card->flags);
}
/* Failing in interrupt is an acceptable event */
return 0; /* Failed to acquire the card! */
}

static void unlock_card(struct isi_board *card)
{
spin_unlock_irqrestore(&card->card_lock, card->flags);
Expand Down Expand Up @@ -415,6 +399,8 @@ static inline int __isicom_paranoia_check(struct isi_port const *port,

static void isicom_tx(unsigned long _data)
{
unsigned long flags;
unsigned int retries;
short count = (BOARD_COUNT-1), card, base;
short txcount, wrd, residue, word_count, cnt;
struct isi_port *port;
Expand All @@ -435,32 +421,34 @@ static void isicom_tx(unsigned long _data)
count = isi_card[card].port_count;
port = isi_card[card].ports;
base = isi_card[card].base;

spin_lock_irqsave(&isi_card[card].card_lock, flags);
for (retries = 0; retries < 100; retries++) {
if (inw(base + 0xe) & 0x1)
break;
udelay(2);
}
if (retries >= 100)
goto unlock;

for (;count > 0;count--, port++) {
if (!lock_card_at_interrupt(&isi_card[card]))
continue;
/* port not active or tx disabled to force flow control */
if (!(port->flags & ASYNC_INITIALIZED) ||
!(port->status & ISI_TXOK))
unlock_card(&isi_card[card]);
continue;

tty = port->tty;


if (tty == NULL) {
unlock_card(&isi_card[card]);
if (tty == NULL)
continue;
}

txcount = min_t(short, TX_SIZE, port->xmit_cnt);
if (txcount <= 0 || tty->stopped || tty->hw_stopped) {
unlock_card(&isi_card[card]);
if (txcount <= 0 || tty->stopped || tty->hw_stopped)
continue;
}
if (!(inw(base + 0x02) & (1 << port->channel))) {
unlock_card(&isi_card[card]);

if (!(inw(base + 0x02) & (1 << port->channel)))
continue;
}

pr_dbg("txing %d bytes, port%d.\n", txcount,
port->channel + 1);
outw((port->channel << isi_card[card].shift_count) | txcount,
Expand Down Expand Up @@ -508,9 +496,10 @@ static void isicom_tx(unsigned long _data)
port->status &= ~ISI_TXOK;
if (port->xmit_cnt <= WAKEUP_CHARS)
tty_wakeup(tty);
unlock_card(&isi_card[card]);
}

unlock:
spin_unlock_irqrestore(&isi_card[card].card_lock, flags);
/* schedule another tx for hopefully in about 10ms */
sched_again:
if (!re_schedule) {
Expand Down

0 comments on commit 01e8b18

Please sign in to comment.