Only probe one PHY on the D-Link 580 version of the card (ie rev 0x12).

The 550 version is location at address 1 but since it works right we
let the code find whatever PHY it can.

Fix a fragment issue on TX.  If the number of frags are more then the
driver has allocated then bring all the frags together into one packet
and send it out.  Code derived from the fxp driver.

Tested and found by:	Francois Tigeot <francois.tigeot@nic.fr>
			Hellmuth Michaelis <hm@kts.org>

MFC after:	1 week
This commit is contained in:
ambrisko 2002-09-11 21:26:22 +00:00
parent 1cb2d222c5
commit f185fabd5b

View File

@ -926,10 +926,13 @@ ste_attach(dev)
sc->ste_dev = dev;
/*
* Only use the first PHY since this chip reports multiple
* Only use one PHY since this chip reports multiple
* Note on the DFE-550 the PHY is at 1 on the DFE-580
* it is at 0 & 1. It is rev 0x12.
*/
if (pci_get_vendor(dev) == DL_VENDORID &&
pci_get_device(dev) == DL_DEVICEID_550TX )
pci_get_device(dev) == DL_DEVICEID_550TX &&
pci_get_revid(dev) == 0x12 )
sc->ste_one_phy = 1;
mtx_init(&sc->ste_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
@ -1458,7 +1461,6 @@ ste_ioctl(ifp, command, data)
STE_RXMODE_PROMISC);
}
if (!(ifp->if_flags & IFF_RUNNING)) {
sc->ste_tx_thresh = STE_MIN_FRAMELEN * 2;
sc->ste_tx_thresh = STE_TXSTART_THRESH;
ste_init(sc);
}
@ -1504,6 +1506,7 @@ ste_encap(sc, c, m_head)
d = c->ste_ptr;
d->ste_ctl = 0;
encap_retry:
for (m = m_head, frag = 0; m != NULL; m = m->m_next) {
if (m->m_len != 0) {
if (frag == STE_MAXFRAGS)
@ -1516,6 +1519,35 @@ ste_encap(sc, c, m_head)
}
}
if (m != NULL) {
struct mbuf *mn;
/*
* We ran out of segments. We have to recopy this
* mbuf chain first. Bail out if we can't get the
* new buffers from if_fxp.c
*/
MGETHDR(mn, M_DONTWAIT, MT_DATA);
if (mn == NULL) {
m_freem(m_head);
return ENOMEM;
}
if (m_head->m_pkthdr.len > MHLEN) {
MCLGET(mn, M_DONTWAIT);
if ((mn->m_flags & M_EXT) == 0) {
m_freem(mn);
m_freem(m_head);
return ENOMEM;
}
}
m_copydata(m_head, 0, m_head->m_pkthdr.len,
mtod(mn, caddr_t));
mn->m_pkthdr.len = mn->m_len = m_head->m_pkthdr.len;
m_freem(m_head);
m_head = mn;
goto encap_retry;
}
c->ste_mbuf = m_head;
d->ste_frags[frag - 1].ste_len |= STE_FRAG_LAST;
d->ste_ctl = 1;
@ -1560,7 +1592,8 @@ ste_start(ifp)
cur_tx = &sc->ste_cdata.ste_tx_chain[idx];
ste_encap(sc, cur_tx, m_head);
if (ste_encap(sc, cur_tx, m_head) != 0)
break;
cur_tx->ste_ptr->ste_next = 0;
@ -1576,10 +1609,8 @@ ste_start(ifp)
/* Set TX polling interval to start TX engine */
CSR_WRITE_1(sc, STE_TX_DMAPOLL_PERIOD, 64);
STE_SETBIT4(sc, STE_DMACTL, STE_DMACTL_TXDMA_UNSTALL);
STE_SETBIT4(sc, STE_DMACTL, STE_DMACTL_TXDMA_UNSTALL);
ste_wait(sc);
}else{
cur_tx->ste_ptr->ste_ctl = STE_TXCTL_DMAINTR | 1;
sc->ste_cdata.ste_tx_chain[