avoid recursive tx

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2050 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
bellard 2006-07-13 23:25:11 +00:00
parent 1dce7c3c22
commit ec607da7c2
1 changed files with 14 additions and 1 deletions

View File

@ -57,6 +57,7 @@ struct PCNetState_st {
uint64_t timer; uint64_t timer;
int xmit_pos, recv_pos; int xmit_pos, recv_pos;
uint8_t buffer[4096]; uint8_t buffer[4096];
int tx_busy;
}; };
#ifdef __GNUC__ #ifdef __GNUC__
@ -659,6 +660,8 @@ static void pcnet_s_reset(PCNetState *s)
s->csr[114] = 0x0000; s->csr[114] = 0x0000;
s->csr[122] = 0x0000; s->csr[122] = 0x0000;
s->csr[124] = 0x0000; s->csr[124] = 0x0000;
s->tx_busy = 0;
} }
static void pcnet_update_irq(PCNetState *s) static void pcnet_update_irq(PCNetState *s)
@ -1105,6 +1108,8 @@ static void pcnet_transmit(PCNetState *s)
return; return;
} }
s->tx_busy = 1;
txagain: txagain:
if (pcnet_tdte_poll(s)) { if (pcnet_tdte_poll(s)) {
struct pcnet_TMD tmd; struct pcnet_TMD tmd;
@ -1167,6 +1172,8 @@ static void pcnet_transmit(PCNetState *s)
if (count--) if (count--)
goto txagain; goto txagain;
} }
s->tx_busy = 0;
} }
static void pcnet_poll(PCNetState *s) static void pcnet_poll(PCNetState *s)
@ -1177,8 +1184,14 @@ static void pcnet_poll(PCNetState *s)
if (CSR_TDMD(s) || if (CSR_TDMD(s) ||
(CSR_TXON(s) && !CSR_DPOLL(s) && pcnet_tdte_poll(s))) (CSR_TXON(s) && !CSR_DPOLL(s) && pcnet_tdte_poll(s)))
{
/* prevent recursion */
if (s->tx_busy)
return;
pcnet_transmit(s); pcnet_transmit(s);
} }
}
static void pcnet_poll_timer(void *opaque) static void pcnet_poll_timer(void *opaque)
{ {