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:
parent
1cb2d222c5
commit
f185fabd5b
@ -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[
|
||||
|
Loading…
x
Reference in New Issue
Block a user