Deleted Added
sdiff udiff text old ( 109623 ) new ( 109648 )
full compact
1/*
2 * Copyright (C) 2001 Eduardo Horvath.
3 * Copyright (c) 2001-2003 Thomas Moestl
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 12 unchanged lines hidden (view full) ---

21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 * from: NetBSD: gem.c,v 1.21 2002/06/01 23:50:58 lukem Exp
28 *
29 * $FreeBSD: head/sys/dev/gem/if_gem.c 109623 2003-01-21 08:56:16Z alfred $
30 */
31
32/*
33 * Driver for Sun GEM ethernet controllers.
34 */
35
36#define GEM_DEBUG
37

--- 328 unchanged lines hidden (view full) ---

366 bus_dmamap_destroy(sc->sc_rdmatag,
367 sc->sc_rxsoft[i].rxs_dmamap);
368 }
369 for (i = 0; i < GEM_TXQUEUELEN; i++) {
370 if (sc->sc_txsoft[i].txs_dmamap != NULL)
371 bus_dmamap_destroy(sc->sc_tdmatag,
372 sc->sc_txsoft[i].txs_dmamap);
373 }
374 bus_dmamap_unload(sc->sc_cdmatag, sc->sc_cddmamap);
375 bus_dmamem_free(sc->sc_cdmatag, sc->sc_control_data,
376 sc->sc_cddmamap);
377 bus_dma_tag_destroy(sc->sc_cdmatag);
378 bus_dma_tag_destroy(sc->sc_tdmatag);
379 bus_dma_tag_destroy(sc->sc_rdmatag);
380 bus_dma_tag_destroy(sc->sc_pdmatag);
381}

--- 183 unchanged lines hidden (view full) ---

565 struct gem_softc *sc;
566{
567 struct gem_rxsoft *rxs;
568 int i;
569
570 for (i = 0; i < GEM_NRXDESC; i++) {
571 rxs = &sc->sc_rxsoft[i];
572 if (rxs->rxs_mbuf != NULL) {
573 bus_dmamap_unload(sc->sc_rdmatag, rxs->rxs_dmamap);
574 m_freem(rxs->rxs_mbuf);
575 rxs->rxs_mbuf = NULL;
576 }
577 }
578}
579
580/*

--- 16 unchanged lines hidden (view full) ---

597 gem_disable_rx(sc);
598
599 /*
600 * Release any queued transmit buffers.
601 */
602 while ((txs = STAILQ_FIRST(&sc->sc_txdirtyq)) != NULL) {
603 STAILQ_REMOVE_HEAD(&sc->sc_txdirtyq, txs_q);
604 if (txs->txs_ndescs != 0) {
605 bus_dmamap_unload(sc->sc_tdmatag, txs->txs_dmamap);
606 if (txs->txs_mbuf != NULL) {
607 m_freem(txs->txs_mbuf);
608 txs->txs_mbuf = NULL;
609 }
610 }
611 STAILQ_INSERT_TAIL(&sc->sc_txfreeq, txs, txs_q);
612 }

--- 132 unchanged lines hidden (view full) ---

745 /*
746 * Initialize the transmit descriptor ring.
747 */
748 memset((void *)sc->sc_txdescs, 0, sizeof(sc->sc_txdescs));
749 for (i = 0; i < GEM_NTXDESC; i++) {
750 sc->sc_txdescs[i].gd_flags = 0;
751 sc->sc_txdescs[i].gd_addr = 0;
752 }
753 GEM_CDTXSYNC(sc, 0, GEM_NTXDESC,
754 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
755 sc->sc_txfree = GEM_MAXTXFREE;
756 sc->sc_txnext = 0;
757 sc->sc_txwin = 0;
758
759 /*
760 * Initialize the receive descriptor and receive job
761 * descriptor rings.
762 */

--- 10 unchanged lines hidden (view full) ---

773 */
774 gem_rxdrain(sc);
775 return (1);
776 }
777 } else
778 GEM_INIT_RXDESC(sc, i);
779 }
780 sc->sc_rxptr = 0;
781
782 return (0);
783}
784
785static int
786gem_ringsize(sz)
787 int sz;
788{

--- 184 unchanged lines hidden (view full) ---

973 BUS_DMASYNC_PREWRITE);
974
975 CTR3(KTR_GEM, "load_mbuf: setting firstdesc=%d, lastdesc=%d, "
976 "ndescs=%d", txs->txs_firstdesc, txs->txs_lastdesc,
977 txs->txs_ndescs);
978 STAILQ_REMOVE_HEAD(&sc->sc_txfreeq, txs_q);
979 STAILQ_INSERT_TAIL(&sc->sc_txdirtyq, txs, txs_q);
980
981 /* Sync the descriptors we're using. */
982 GEM_CDTXSYNC(sc, sc->sc_txnext, txs->txs_ndescs,
983 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
984
985 sc->sc_txnext = GEM_NEXTTX(txs->txs_lastdesc);
986 sc->sc_txfree -= txs->txs_ndescs;
987 return (0);
988
989fail:
990 CTR1(KTR_GEM, "gem_load_txmbuf failed (%d)", error);
991 bus_dmamap_unload(sc->sc_tdmatag, txs->txs_dmamap);
992 return (error);

--- 151 unchanged lines hidden (view full) ---

1144 }
1145
1146 if (txmfail == -1 || sc->sc_txfree == 0) {
1147 /* No more slots left; notify upper layer. */
1148 ifp->if_flags |= IFF_OACTIVE;
1149 }
1150
1151 if (ntx > 0) {
1152 CTR2(KTR_GEM, "%s: packets enqueued, OWN on %d",
1153 device_get_name(sc->sc_dev), firsttx);
1154
1155 /* Set a watchdog timer in case the chip flakes out. */
1156 ifp->if_timer = 5;
1157 CTR2(KTR_GEM, "%s: gem_start: watchdog %d",
1158 device_get_name(sc->sc_dev), ifp->if_timer);
1159 }

--- 32 unchanged lines hidden (view full) ---

1192 bus_space_write_4(t, mac, GEM_MAC_FIRST_COLL_CNT, 0);
1193 bus_space_write_4(t, mac, GEM_MAC_EXCESS_COLL_CNT, 0);
1194 bus_space_write_4(t, mac, GEM_MAC_LATE_COLL_CNT, 0);
1195
1196 /*
1197 * Go through our Tx list and free mbufs for those
1198 * frames that have been transmitted.
1199 */
1200 while ((txs = STAILQ_FIRST(&sc->sc_txdirtyq)) != NULL) {
1201 GEM_CDTXSYNC(sc, txs->txs_lastdesc,
1202 txs->txs_ndescs,
1203 BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
1204
1205#ifdef GEM_DEBUG
1206 if (ifp->if_flags & IFF_DEBUG) {
1207 int i;
1208 printf(" txsoft %p transmit chain:\n", txs);
1209 for (i = txs->txs_firstdesc;; i = GEM_NEXTTX(i)) {
1210 printf("descriptor %d: ", i);
1211 printf("gd_flags: 0x%016llx\t", (long long)

--- 105 unchanged lines hidden (view full) ---

1317 /*
1318 * Read the completion register once. This limits
1319 * how long the following loop can execute.
1320 */
1321 rxcomp = bus_space_read_4(t, h, GEM_RX_COMPLETION);
1322
1323 CTR2(KTR_GEM, "gem_rint: sc->rxptr %d, complete %d",
1324 sc->sc_rxptr, rxcomp);
1325 for (i = sc->sc_rxptr; i != rxcomp;
1326 i = GEM_NEXTRX(i)) {
1327 rxs = &sc->sc_rxsoft[i];
1328
1329 GEM_CDRXSYNC(sc, i,
1330 BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
1331
1332 rxstat = GEM_DMA_READ(sc, sc->sc_rxdescs[i].gd_flags);
1333
1334 if (rxstat & GEM_RD_OWN) {
1335#if 0 /* XXX: In case of emergency, re-enable this. */
1336 /*
1337 * The descriptor is still marked as owned, although
1338 * it is supposed to have completed. This has been
1339 * observed on some machines. Just exiting here

--- 12 unchanged lines hidden (view full) ---

1352
1353 if (rxstat & GEM_RD_BAD_CRC) {
1354 ifp->if_ierrors++;
1355 device_printf(sc->sc_dev, "receive error: CRC error\n");
1356 GEM_INIT_RXDESC(sc, i);
1357 continue;
1358 }
1359
1360 bus_dmamap_sync(sc->sc_rdmatag, rxs->rxs_dmamap,
1361 BUS_DMASYNC_POSTREAD);
1362#ifdef GEM_DEBUG
1363 if (ifp->if_flags & IFF_DEBUG) {
1364 printf(" rxsoft %p descriptor %d: ", rxs, i);
1365 printf("gd_flags: 0x%016llx\t", (long long)
1366 GEM_DMA_READ(sc, sc->sc_rxdescs[i].gd_flags));
1367 printf("gd_addr: 0x%016llx\n", (long long)
1368 GEM_DMA_READ(sc, sc->sc_rxdescs[i].gd_addr));
1369 }

--- 9 unchanged lines hidden (view full) ---

1379 * Allocate a new mbuf cluster. If that fails, we are
1380 * out of memory, and must drop the packet and recycle
1381 * the buffer that's already attached to this descriptor.
1382 */
1383 m = rxs->rxs_mbuf;
1384 if (gem_add_rxbuf(sc, i) != 0) {
1385 ifp->if_ierrors++;
1386 GEM_INIT_RXDESC(sc, i);
1387 bus_dmamap_sync(sc->sc_rdmatag, rxs->rxs_dmamap,
1388 BUS_DMASYNC_PREREAD);
1389 continue;
1390 }
1391 m->m_data += 2; /* We're already off by two */
1392
1393 m->m_pkthdr.rcvif = ifp;
1394 m->m_pkthdr.len = m->m_len = len - ETHER_CRC_LEN;
1395
1396 /* Pass it on. */
1397 (*ifp->if_input)(ifp, m);
1398 }
1399
1400 if (progress) {
1401 /* Update the receive pointer. */
1402 if (i == sc->sc_rxptr) {
1403 device_printf(sc->sc_dev, "rint: ring wrap\n");
1404 }
1405 sc->sc_rxptr = i;
1406 bus_space_write_4(t, h, GEM_RX_KICK, GEM_PREVRX(i));
1407 }
1408

--- 21 unchanged lines hidden (view full) ---

1430 return (ENOBUFS);
1431 m->m_len = m->m_pkthdr.len = m->m_ext.ext_size;
1432
1433#ifdef GEM_DEBUG
1434 /* bzero the packet to check dma */
1435 memset(m->m_ext.ext_buf, 0, m->m_ext.ext_size);
1436#endif
1437
1438 if (rxs->rxs_mbuf != NULL)
1439 bus_dmamap_unload(sc->sc_rdmatag, rxs->rxs_dmamap);
1440
1441 rxs->rxs_mbuf = m;
1442
1443 error = bus_dmamap_load_mbuf(sc->sc_rdmatag, rxs->rxs_dmamap,
1444 m, gem_rxdma_callback, rxs, BUS_DMA_NOWAIT);
1445 if (error != 0 || rxs->rxs_paddr == 0) {
1446 device_printf(sc->sc_dev, "can't load rx DMA map %d, error = "
1447 "%d\n", idx, error);

--- 437 unchanged lines hidden ---