summaryrefslogtreecommitdiffstats
path: root/sys/pci/if_ste.c
diff options
context:
space:
mode:
authorambrisko <ambrisko@FreeBSD.org>2002-09-11 21:26:22 +0000
committerambrisko <ambrisko@FreeBSD.org>2002-09-11 21:26:22 +0000
commitf185fabd5ba1e9fd15f860872f46027c04833340 (patch)
tree673031fb4b93d8bf30d85f607560c46e9d5fb9b3 /sys/pci/if_ste.c
parent1cb2d222c58c284b06effdd87143cc0dd6f83b47 (diff)
downloadFreeBSD-src-f185fabd5ba1e9fd15f860872f46027c04833340.zip
FreeBSD-src-f185fabd5ba1e9fd15f860872f46027c04833340.tar.gz
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
Diffstat (limited to 'sys/pci/if_ste.c')
-rw-r--r--sys/pci/if_ste.c43
1 files changed, 37 insertions, 6 deletions
diff --git a/sys/pci/if_ste.c b/sys/pci/if_ste.c
index c236f68..020670c 100644
--- a/sys/pci/if_ste.c
+++ b/sys/pci/if_ste.c
@@ -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;
@@ -1577,9 +1610,7 @@ ste_start(ifp)
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[
OpenPOWER on IntegriCloud