Deleted Added
full compact
if_gem.c (109623) if_gem.c (109648)
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 *
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 $
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 }
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);
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) {
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);
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) {
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);
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 }
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 }
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;
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);
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
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
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) {
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
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 */
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);
1200 while ((txs = STAILQ_FIRST(&sc->sc_txdirtyq)) != NULL) {
1205 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);
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);
1325 for (i = sc->sc_rxptr; i != rxcomp;
1326 i = GEM_NEXTRX(i)) {
1327 rxs = &sc->sc_rxsoft[i];
1328
1328 for (i = sc->sc_rxptr; i != rxcomp;
1329 i = GEM_NEXTRX(i)) {
1330 rxs = &sc->sc_rxsoft[i];
1331
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
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);
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);
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) {
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);
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
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
1438 if (rxs->rxs_mbuf != NULL)
1435 if (rxs->rxs_mbuf != NULL) {
1436 bus_dmamap_sync(sc->sc_rdmatag, rxs->rxs_dmamap,
1437 BUS_DMASYNC_POSTREAD);
1439 bus_dmamap_unload(sc->sc_rdmatag, rxs->rxs_dmamap);
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 ---
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 ---