* Revision 2.8 1993/10/15 10:59:56 davidg

* increase maximum time to wait for transmit DMA to complete to 120us.
 * call ed_reset() if the time limit is reached instead of trying
 * to abort the remote DMA.
 *
 * Revision 2.7  1993/10/15  10:49:10  davidg
 * minor change to way the mbuf pointer temp variable is assigned in
 * ed_start (slightly improves code readability)
 *
 * Revision 2.6  93/10/02  01:12:20  davidg
 * use ETHER_ADDR_LEN in NE probe rather than '6'.
This commit is contained in:
David Greenman 1993-10-15 11:06:41 +00:00
parent 960173b9b2
commit 836e51b4a3
2 changed files with 42 additions and 20 deletions

View File

@ -20,12 +20,24 @@
*/
/*
* $Id: if_ed.c,v 2.5 93/09/30 17:44:14 davidg Exp Locker: davidg $
* $Id: if_ed.c,v 2.8 1993/10/15 10:59:56 davidg Exp davidg $
*/
/*
* Modification history
*
* Revision 2.8 1993/10/15 10:59:56 davidg
* increase maximum time to wait for transmit DMA to complete to 120us.
* call ed_reset() if the time limit is reached instead of trying
* to abort the remote DMA.
*
* Revision 2.7 1993/10/15 10:49:10 davidg
* minor change to way the mbuf pointer temp variable is assigned in
* ed_start (slightly improves code readability)
*
* Revision 2.6 93/10/02 01:12:20 davidg
* use ETHER_ADDR_LEN in NE probe rather than '6'.
*
* Revision 2.5 93/09/30 17:44:14 davidg
* patch from vak@zebub.msk.su (Serge V.Vakulenko) to work around
* a hardware bug in cheap WD clone boards where the PROM checksum
@ -916,7 +928,7 @@ ed_probe_Novell(isa_dev)
sc->mem_ring = sc->mem_start + sc->txb_cnt * ED_PAGE_SIZE * ED_TXBUF_SIZE;
ed_pio_readmem(sc, 0, romdata, 16);
for (n = 0; n < 6; n++)
for (n = 0; n < ETHER_ADDR_LEN; n++)
sc->arpcom.ac_enaddr[n] = romdata[n*(sc->isa16bit+1)];
/* clear any pending interrupts that might have occurred above */
@ -1336,6 +1348,8 @@ outloop:
* Copy the mbuf chain into the transmit buffer
*/
m0 = m;
/* txb_new points to next open buffer slot */
buffer = sc->mem_start + (sc->txb_new * ED_TXBUF_SIZE * ED_PAGE_SIZE);
@ -1367,7 +1381,7 @@ outloop:
}
}
for (len = 0, m0 = m; m != 0; m = m->m_next) {
for (len = 0; m != 0; m = m->m_next) {
bcopy(mtod(m, caddr_t), buffer, m->m_len);
buffer += m->m_len;
len += m->m_len;
@ -1388,7 +1402,7 @@ outloop:
}
}
} else {
len = ed_pio_write_mbufs(sc, m0 = m, buffer);
len = ed_pio_write_mbufs(sc, m, buffer);
}
sc->txb_len[sc->txb_new] = MAX(len, ETHER_MIN_LEN);
@ -2108,7 +2122,7 @@ ed_pio_writemem(sc,src,dst,len)
unsigned short dst;
unsigned short len;
{
int maxwait=20; /* about 25us */
int maxwait=100; /* about 120us */
/* select page 0 registers */
outb(sc->nic_addr + ED_P0_CR, ED_CR_RD2|ED_CR_STA);
@ -2154,7 +2168,7 @@ ed_pio_write_mbufs(sc,m,dst)
unsigned short len, mb_offset;
struct mbuf *mp;
unsigned char residual[2];
int maxwait=20; /* about 25us */
int maxwait=100; /* about 120us */
/* First, count up the total number of bytes to copy */
for (len = 0, mp = m; mp; mp = mp->m_next)
@ -2239,10 +2253,7 @@ ed_pio_write_mbufs(sc,m,dst)
if (!maxwait) {
log(LOG_WARNING, "ed%d: remote transmit DMA failed to complete\n",
sc->arpcom.ac_if.if_unit);
/* attempt to abort the remote DMA */
outb(sc->nic_addr + ED_P0_RBCR0, 0);
outb(sc->nic_addr + ED_P0_RBCR1, 0);
outb(sc->nic_addr + ED_P0_CR, ED_CR_RD2|ED_CR_STA);
ed_reset(sc->arpcom.ac_if.if_unit);
}
return(len);

View File

@ -20,12 +20,24 @@
*/
/*
* $Id: if_ed.c,v 2.5 93/09/30 17:44:14 davidg Exp Locker: davidg $
* $Id: if_ed.c,v 2.8 1993/10/15 10:59:56 davidg Exp davidg $
*/
/*
* Modification history
*
* Revision 2.8 1993/10/15 10:59:56 davidg
* increase maximum time to wait for transmit DMA to complete to 120us.
* call ed_reset() if the time limit is reached instead of trying
* to abort the remote DMA.
*
* Revision 2.7 1993/10/15 10:49:10 davidg
* minor change to way the mbuf pointer temp variable is assigned in
* ed_start (slightly improves code readability)
*
* Revision 2.6 93/10/02 01:12:20 davidg
* use ETHER_ADDR_LEN in NE probe rather than '6'.
*
* Revision 2.5 93/09/30 17:44:14 davidg
* patch from vak@zebub.msk.su (Serge V.Vakulenko) to work around
* a hardware bug in cheap WD clone boards where the PROM checksum
@ -916,7 +928,7 @@ ed_probe_Novell(isa_dev)
sc->mem_ring = sc->mem_start + sc->txb_cnt * ED_PAGE_SIZE * ED_TXBUF_SIZE;
ed_pio_readmem(sc, 0, romdata, 16);
for (n = 0; n < 6; n++)
for (n = 0; n < ETHER_ADDR_LEN; n++)
sc->arpcom.ac_enaddr[n] = romdata[n*(sc->isa16bit+1)];
/* clear any pending interrupts that might have occurred above */
@ -1336,6 +1348,8 @@ outloop:
* Copy the mbuf chain into the transmit buffer
*/
m0 = m;
/* txb_new points to next open buffer slot */
buffer = sc->mem_start + (sc->txb_new * ED_TXBUF_SIZE * ED_PAGE_SIZE);
@ -1367,7 +1381,7 @@ outloop:
}
}
for (len = 0, m0 = m; m != 0; m = m->m_next) {
for (len = 0; m != 0; m = m->m_next) {
bcopy(mtod(m, caddr_t), buffer, m->m_len);
buffer += m->m_len;
len += m->m_len;
@ -1388,7 +1402,7 @@ outloop:
}
}
} else {
len = ed_pio_write_mbufs(sc, m0 = m, buffer);
len = ed_pio_write_mbufs(sc, m, buffer);
}
sc->txb_len[sc->txb_new] = MAX(len, ETHER_MIN_LEN);
@ -2108,7 +2122,7 @@ ed_pio_writemem(sc,src,dst,len)
unsigned short dst;
unsigned short len;
{
int maxwait=20; /* about 25us */
int maxwait=100; /* about 120us */
/* select page 0 registers */
outb(sc->nic_addr + ED_P0_CR, ED_CR_RD2|ED_CR_STA);
@ -2154,7 +2168,7 @@ ed_pio_write_mbufs(sc,m,dst)
unsigned short len, mb_offset;
struct mbuf *mp;
unsigned char residual[2];
int maxwait=20; /* about 25us */
int maxwait=100; /* about 120us */
/* First, count up the total number of bytes to copy */
for (len = 0, mp = m; mp; mp = mp->m_next)
@ -2239,10 +2253,7 @@ ed_pio_write_mbufs(sc,m,dst)
if (!maxwait) {
log(LOG_WARNING, "ed%d: remote transmit DMA failed to complete\n",
sc->arpcom.ac_if.if_unit);
/* attempt to abort the remote DMA */
outb(sc->nic_addr + ED_P0_RBCR0, 0);
outb(sc->nic_addr + ED_P0_RBCR1, 0);
outb(sc->nic_addr + ED_P0_CR, ED_CR_RD2|ED_CR_STA);
ed_reset(sc->arpcom.ac_if.if_unit);
}
return(len);