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 109648 2003-01-21 17:17:01Z tmm $
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 GEM_CDSYNC(sc, BUS_DMASYNC_POSTREAD);
375 GEM_CDSYNC(sc, BUS_DMASYNC_POSTWRITE);
376 bus_dmamap_unload(sc->sc_cdmatag, sc->sc_cddmamap);
377 bus_dmamem_free(sc->sc_cdmatag, sc->sc_control_data,
378 sc->sc_cddmamap);
379 bus_dma_tag_destroy(sc->sc_cdmatag);
380 bus_dma_tag_destroy(sc->sc_tdmatag);
381 bus_dma_tag_destroy(sc->sc_rdmatag);
382 bus_dma_tag_destroy(sc->sc_pdmatag);
383}

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

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

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

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

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

751 /*
752 * Initialize the transmit descriptor ring.
753 */
754 memset((void *)sc->sc_txdescs, 0, sizeof(sc->sc_txdescs));
755 for (i = 0; i < GEM_NTXDESC; i++) {
756 sc->sc_txdescs[i].gd_flags = 0;
757 sc->sc_txdescs[i].gd_addr = 0;
758 }
759 sc->sc_txfree = GEM_MAXTXFREE;
760 sc->sc_txnext = 0;
761 sc->sc_txwin = 0;
762
763 /*
764 * Initialize the receive descriptor and receive job
765 * descriptor rings.
766 */

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

777 */
778 gem_rxdrain(sc);
779 return (1);
780 }
781 } else
782 GEM_INIT_RXDESC(sc, i);
783 }
784 sc->sc_rxptr = 0;
785 GEM_CDSYNC(sc, BUS_DMASYNC_PREWRITE);
786 GEM_CDSYNC(sc, BUS_DMASYNC_PREREAD);
787
788 return (0);
789}
790
791static int
792gem_ringsize(sz)
793 int sz;
794{

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

979 BUS_DMASYNC_PREWRITE);
980
981 CTR3(KTR_GEM, "load_mbuf: setting firstdesc=%d, lastdesc=%d, "
982 "ndescs=%d", txs->txs_firstdesc, txs->txs_lastdesc,
983 txs->txs_ndescs);
984 STAILQ_REMOVE_HEAD(&sc->sc_txfreeq, txs_q);
985 STAILQ_INSERT_TAIL(&sc->sc_txdirtyq, txs, txs_q);
986
987 sc->sc_txnext = GEM_NEXTTX(txs->txs_lastdesc);
988 sc->sc_txfree -= txs->txs_ndescs;
989 return (0);
990
991fail:
992 CTR1(KTR_GEM, "gem_load_txmbuf failed (%d)", error);
993 bus_dmamap_unload(sc->sc_tdmatag, txs->txs_dmamap);
994 return (error);

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

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

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

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

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

1319 /*
1320 * Read the completion register once. This limits
1321 * how long the following loop can execute.
1322 */
1323 rxcomp = bus_space_read_4(t, h, GEM_RX_COMPLETION);
1324
1325 CTR2(KTR_GEM, "gem_rint: sc->rxptr %d, complete %d",
1326 sc->sc_rxptr, rxcomp);
1327 GEM_CDSYNC(sc, BUS_DMASYNC_POSTREAD);
1328 for (i = sc->sc_rxptr; i != rxcomp;
1329 i = GEM_NEXTRX(i)) {
1330 rxs = &sc->sc_rxsoft[i];
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#ifdef GEM_DEBUG
1361 if (ifp->if_flags & IFF_DEBUG) {
1362 printf(" rxsoft %p descriptor %d: ", rxs, i);
1363 printf("gd_flags: 0x%016llx\t", (long long)
1364 GEM_DMA_READ(sc, sc->sc_rxdescs[i].gd_flags));
1365 printf("gd_addr: 0x%016llx\n", (long long)
1366 GEM_DMA_READ(sc, sc->sc_rxdescs[i].gd_addr));
1367 }

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

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

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

1427 return (ENOBUFS);
1428 m->m_len = m->m_pkthdr.len = m->m_ext.ext_size;
1429
1430#ifdef GEM_DEBUG
1431 /* bzero the packet to check dma */
1432 memset(m->m_ext.ext_buf, 0, m->m_ext.ext_size);
1433#endif
1434
1435 if (rxs->rxs_mbuf != NULL) {
1436 bus_dmamap_sync(sc->sc_rdmatag, rxs->rxs_dmamap,
1437 BUS_DMASYNC_POSTREAD);
1438 bus_dmamap_unload(sc->sc_rdmatag, rxs->rxs_dmamap);
1439 }
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 ---