Deleted Added
full compact
if_arge.c (285121) if_arge.c (289476)
1/*-
2 * Copyright (c) 2009, Oleksandr Tymoshenko
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 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
28#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 2009, Oleksandr Tymoshenko
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 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
28#include <sys/cdefs.h>
29__FBSDID("$FreeBSD: head/sys/mips/atheros/if_arge.c 285121 2015-07-04 03:05:57Z adrian $");
29__FBSDID("$FreeBSD: head/sys/mips/atheros/if_arge.c 289476 2015-10-18 00:59:28Z adrian $");
30
31/*
32 * AR71XX gigabit ethernet driver
33 */
34#ifdef HAVE_KERNEL_OPTION_HEADERS
35#include "opt_device_polling.h"
36#endif
37

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

293 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
294 "tx_pkts_aligned", CTLFLAG_RW, &sc->stats.tx_pkts_aligned, 0,
295 "number of TX aligned packets");
296
297 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
298 "tx_pkts_unaligned", CTLFLAG_RW, &sc->stats.tx_pkts_unaligned,
299 0, "number of TX unaligned packets");
300
30
31/*
32 * AR71XX gigabit ethernet driver
33 */
34#ifdef HAVE_KERNEL_OPTION_HEADERS
35#include "opt_device_polling.h"
36#endif
37

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

293 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
294 "tx_pkts_aligned", CTLFLAG_RW, &sc->stats.tx_pkts_aligned, 0,
295 "number of TX aligned packets");
296
297 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
298 "tx_pkts_unaligned", CTLFLAG_RW, &sc->stats.tx_pkts_unaligned,
299 0, "number of TX unaligned packets");
300
301 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
302 "tx_pkts_unaligned_start", CTLFLAG_RW, &sc->stats.tx_pkts_unaligned_start,
303 0, "number of TX unaligned packets (start)");
304
305 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
306 "tx_pkts_unaligned_len", CTLFLAG_RW, &sc->stats.tx_pkts_unaligned_len,
307 0, "number of TX unaligned packets (len)");
308
309 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
310 "tx_pkts_nosegs", CTLFLAG_RW, &sc->stats.tx_pkts_nosegs,
311 0, "number of TX packets fail with no ring slots avail");
312
313 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
314 "intr_stray_filter", CTLFLAG_RW, &sc->stats.intr_stray,
315 0, "number of stray interrupts (filter)");
316
317 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
318 "intr_stray_intr", CTLFLAG_RW, &sc->stats.intr_stray2,
319 0, "number of stray interrupts (intr)");
320
321 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
322 "intr_ok", CTLFLAG_RW, &sc->stats.intr_ok,
323 0, "number of OK interrupts");
301#ifdef ARGE_DEBUG
302 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "tx_prod",
303 CTLFLAG_RW, &sc->arge_cdata.arge_tx_prod, 0, "");
304 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "tx_cons",
305 CTLFLAG_RW, &sc->arge_cdata.arge_tx_cons, 0, "");
306 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "tx_cnt",
307 CTLFLAG_RW, &sc->arge_cdata.arge_tx_cnt, 0, "");
308#endif

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

622 local_macaddr[i] = tmpmac[i];
623 }
624 /* Done! */
625 freeenv(local_macstr);
626 local_macstr = NULL;
627 }
628
629 /*
324#ifdef ARGE_DEBUG
325 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "tx_prod",
326 CTLFLAG_RW, &sc->arge_cdata.arge_tx_prod, 0, "");
327 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "tx_cons",
328 CTLFLAG_RW, &sc->arge_cdata.arge_tx_cons, 0, "");
329 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "tx_cnt",
330 CTLFLAG_RW, &sc->arge_cdata.arge_tx_cnt, 0, "");
331#endif

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

645 local_macaddr[i] = tmpmac[i];
646 }
647 /* Done! */
648 freeenv(local_macstr);
649 local_macstr = NULL;
650 }
651
652 /*
653 * Hardware workarounds.
654 */
655 switch (ar71xx_soc) {
656 case AR71XX_SOC_QCA9556:
657 case AR71XX_SOC_QCA9558:
658 /* Arbitrary alignment */
659 sc->arge_hw_flags |= ARGE_HW_FLG_TX_DESC_ALIGN_1BYTE;
660 sc->arge_hw_flags |= ARGE_HW_FLG_RX_DESC_ALIGN_1BYTE;
661 break;
662 default:
663 sc->arge_hw_flags |= ARGE_HW_FLG_TX_DESC_ALIGN_4BYTE;
664 sc->arge_hw_flags |= ARGE_HW_FLG_RX_DESC_ALIGN_4BYTE;
665 break;
666 }
667
668 /*
630 * Some units (eg the TP-Link WR-1043ND) do not have a convenient
631 * EEPROM location to read the ethernet MAC address from.
632 * OpenWRT simply snaffles it from a fixed location.
633 *
634 * Since multiple units seem to use this feature, include
635 * a method of setting the MAC address based on an flash location
636 * in CPU address space.
637 *

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

820 | (sc->arge_eaddr[3] << 16) | (sc->arge_eaddr[4] << 8)
821 | sc->arge_eaddr[5]);
822 ARGE_WRITE(sc, AR71XX_MAC_STA_ADDR2, (sc->arge_eaddr[0] << 8)
823 | sc->arge_eaddr[1]);
824
825 ARGE_WRITE(sc, AR71XX_MAC_FIFO_CFG0,
826 FIFO_CFG0_ALL << FIFO_CFG0_ENABLE_SHIFT);
827
669 * Some units (eg the TP-Link WR-1043ND) do not have a convenient
670 * EEPROM location to read the ethernet MAC address from.
671 * OpenWRT simply snaffles it from a fixed location.
672 *
673 * Since multiple units seem to use this feature, include
674 * a method of setting the MAC address based on an flash location
675 * in CPU address space.
676 *

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

859 | (sc->arge_eaddr[3] << 16) | (sc->arge_eaddr[4] << 8)
860 | sc->arge_eaddr[5]);
861 ARGE_WRITE(sc, AR71XX_MAC_STA_ADDR2, (sc->arge_eaddr[0] << 8)
862 | sc->arge_eaddr[1]);
863
864 ARGE_WRITE(sc, AR71XX_MAC_FIFO_CFG0,
865 FIFO_CFG0_ALL << FIFO_CFG0_ENABLE_SHIFT);
866
867 /*
868 * SoC specific bits.
869 */
828 switch (ar71xx_soc) {
829 case AR71XX_SOC_AR7240:
830 case AR71XX_SOC_AR7241:
831 case AR71XX_SOC_AR7242:
832 case AR71XX_SOC_AR9330:
833 case AR71XX_SOC_AR9331:
834 case AR71XX_SOC_AR9341:
835 case AR71XX_SOC_AR9342:

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

1346 /* Enable interrupts */
1347 ARGE_WRITE(sc, AR71XX_DMA_INTR, DMA_INTR_ALL);
1348}
1349
1350/*
1351 * Return whether the mbuf chain is correctly aligned
1352 * for the arge TX engine.
1353 *
870 switch (ar71xx_soc) {
871 case AR71XX_SOC_AR7240:
872 case AR71XX_SOC_AR7241:
873 case AR71XX_SOC_AR7242:
874 case AR71XX_SOC_AR9330:
875 case AR71XX_SOC_AR9331:
876 case AR71XX_SOC_AR9341:
877 case AR71XX_SOC_AR9342:

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

1388 /* Enable interrupts */
1389 ARGE_WRITE(sc, AR71XX_DMA_INTR, DMA_INTR_ALL);
1390}
1391
1392/*
1393 * Return whether the mbuf chain is correctly aligned
1394 * for the arge TX engine.
1395 *
1354 * The TX engine requires each fragment to be aligned to a
1355 * 4 byte boundary and the size of each fragment except
1356 * the last to be a multiple of 4 bytes.
1396 * All the MACs have a length requirement: any non-final
1397 * fragment (ie, descriptor with MORE bit set) needs to have
1398 * a length divisible by 4.
1357 *
1399 *
1358 * XXX TODO: I believe this is only a bug on the AR71xx and
1359 * AR913x MACs. The later MACs (AR724x and later) does not
1360 * need this workaround.
1400 * The AR71xx, AR913x require the start address also be
1401 * DWORD aligned. The later MACs don't.
1361 */
1362static int
1402 */
1403static int
1363arge_mbuf_chain_is_tx_aligned(struct mbuf *m0)
1404arge_mbuf_chain_is_tx_aligned(struct arge_softc *sc, struct mbuf *m0)
1364{
1365 struct mbuf *m;
1366
1367 for (m = m0; m != NULL; m = m->m_next) {
1405{
1406 struct mbuf *m;
1407
1408 for (m = m0; m != NULL; m = m->m_next) {
1368 if((mtod(m, intptr_t) & 3) != 0)
1409 /*
1410 * Only do this for chips that require it.
1411 */
1412 if ((sc->arge_hw_flags & ARGE_HW_FLG_TX_DESC_ALIGN_4BYTE) &&
1413 (mtod(m, intptr_t) & 3) != 0) {
1414 sc->stats.tx_pkts_unaligned_start++;
1369 return 0;
1415 return 0;
1370 if ((m->m_next != NULL) && ((m->m_len & 0x03) != 0))
1416 }
1417
1418 /*
1419 * All chips have this requirement for length.
1420 */
1421 if ((m->m_next != NULL) && ((m->m_len & 0x03) != 0)) {
1422 sc->stats.tx_pkts_unaligned_len++;
1371 return 0;
1423 return 0;
1424 }
1372 }
1373 return 1;
1374}
1375
1376/*
1377 * Encapsulate an mbuf chain in a descriptor by coupling the mbuf data
1378 * pointers to the fragment pointers.
1379 */

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

1384 struct arge_desc *desc, *prev_desc;
1385 bus_dma_segment_t txsegs[ARGE_MAXFRAGS];
1386 int error, i, nsegs, prod, prev_prod;
1387 struct mbuf *m;
1388
1389 ARGE_LOCK_ASSERT(sc);
1390
1391 /*
1425 }
1426 return 1;
1427}
1428
1429/*
1430 * Encapsulate an mbuf chain in a descriptor by coupling the mbuf data
1431 * pointers to the fragment pointers.
1432 */

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

1437 struct arge_desc *desc, *prev_desc;
1438 bus_dma_segment_t txsegs[ARGE_MAXFRAGS];
1439 int error, i, nsegs, prod, prev_prod;
1440 struct mbuf *m;
1441
1442 ARGE_LOCK_ASSERT(sc);
1443
1444 /*
1392 * Fix mbuf chain, all fragments should be 4 bytes aligned and
1393 * even 4 bytes
1394 *
1395 * XXX TODO: I believe this is only a bug on the AR71xx and
1396 * AR913x MACs. The later MACs (AR724x and later) does not
1397 * need this workaround.
1445 * Fix mbuf chain based on hardware alignment constraints.
1398 */
1399 m = *m_head;
1446 */
1447 m = *m_head;
1400 if (! arge_mbuf_chain_is_tx_aligned(m)) {
1448 if (! arge_mbuf_chain_is_tx_aligned(sc, m)) {
1401 sc->stats.tx_pkts_unaligned++;
1402 m = m_defrag(*m_head, M_NOWAIT);
1403 if (m == NULL) {
1404 *m_head = NULL;
1405 return (ENOBUFS);
1406 }
1407 *m_head = m;
1408 } else

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

1422 m_freem(*m_head);
1423 *m_head = NULL;
1424 return (EIO);
1425 }
1426
1427 /* Check number of available descriptors. */
1428 if (sc->arge_cdata.arge_tx_cnt + nsegs >= (ARGE_TX_RING_COUNT - 1)) {
1429 bus_dmamap_unload(sc->arge_cdata.arge_tx_tag, txd->tx_dmamap);
1449 sc->stats.tx_pkts_unaligned++;
1450 m = m_defrag(*m_head, M_NOWAIT);
1451 if (m == NULL) {
1452 *m_head = NULL;
1453 return (ENOBUFS);
1454 }
1455 *m_head = m;
1456 } else

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

1470 m_freem(*m_head);
1471 *m_head = NULL;
1472 return (EIO);
1473 }
1474
1475 /* Check number of available descriptors. */
1476 if (sc->arge_cdata.arge_tx_cnt + nsegs >= (ARGE_TX_RING_COUNT - 1)) {
1477 bus_dmamap_unload(sc->arge_cdata.arge_tx_tag, txd->tx_dmamap);
1478 sc->stats.tx_pkts_nosegs++;
1430 return (ENOBUFS);
1431 }
1432
1433 txd->tx_m = *m_head;
1434 bus_dmamap_sync(sc->arge_cdata.arge_tx_tag, txd->tx_dmamap,
1435 BUS_DMASYNC_PREWRITE);
1436
1437 /*
1438 * Make a list of descriptors for this packet. DMA controller will
1439 * walk through it while arge_link is not zero.
1440 */
1441 prev_prod = prod;
1442 desc = prev_desc = NULL;
1443 for (i = 0; i < nsegs; i++) {
1444 desc = &sc->arge_rdata.arge_tx_ring[prod];
1445 desc->packet_ctrl = ARGE_DMASIZE(txsegs[i].ds_len);
1446
1479 return (ENOBUFS);
1480 }
1481
1482 txd->tx_m = *m_head;
1483 bus_dmamap_sync(sc->arge_cdata.arge_tx_tag, txd->tx_dmamap,
1484 BUS_DMASYNC_PREWRITE);
1485
1486 /*
1487 * Make a list of descriptors for this packet. DMA controller will
1488 * walk through it while arge_link is not zero.
1489 */
1490 prev_prod = prod;
1491 desc = prev_desc = NULL;
1492 for (i = 0; i < nsegs; i++) {
1493 desc = &sc->arge_rdata.arge_tx_ring[prod];
1494 desc->packet_ctrl = ARGE_DMASIZE(txsegs[i].ds_len);
1495
1447 if (txsegs[i].ds_addr & 3)
1496 /* XXX Note: only relevant for older MACs; but check length! */
1497 if ((sc->arge_hw_flags & ARGE_HW_FLG_TX_DESC_ALIGN_4BYTE) &&
1498 (txsegs[i].ds_addr & 3))
1448 panic("TX packet address unaligned\n");
1449
1450 desc->packet_addr = txsegs[i].ds_addr;
1451
1452 /* link with previous descriptor */
1453 if (prev_desc)
1454 prev_desc->packet_ctrl |= ARGE_DESC_MORE;
1455

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

1710
1711static int
1712arge_dma_alloc(struct arge_softc *sc)
1713{
1714 struct arge_dmamap_arg ctx;
1715 struct arge_txdesc *txd;
1716 struct arge_rxdesc *rxd;
1717 int error, i;
1499 panic("TX packet address unaligned\n");
1500
1501 desc->packet_addr = txsegs[i].ds_addr;
1502
1503 /* link with previous descriptor */
1504 if (prev_desc)
1505 prev_desc->packet_ctrl |= ARGE_DESC_MORE;
1506

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

1761
1762static int
1763arge_dma_alloc(struct arge_softc *sc)
1764{
1765 struct arge_dmamap_arg ctx;
1766 struct arge_txdesc *txd;
1767 struct arge_rxdesc *rxd;
1768 int error, i;
1769 int arge_tx_align, arge_rx_align;
1718
1770
1771 /* Assume 4 byte alignment by default */
1772 arge_tx_align = 4;
1773 arge_rx_align = 4;
1774
1775 if (sc->arge_hw_flags & ARGE_HW_FLG_TX_DESC_ALIGN_1BYTE)
1776 arge_tx_align = 1;
1777 if (sc->arge_hw_flags & ARGE_HW_FLG_RX_DESC_ALIGN_1BYTE)
1778 arge_rx_align = 1;
1779
1719 /* Create parent DMA tag. */
1720 error = bus_dma_tag_create(
1721 bus_get_dma_tag(sc->arge_dev), /* parent */
1722 1, 0, /* alignment, boundary */
1723 BUS_SPACE_MAXADDR_32BIT, /* lowaddr */
1724 BUS_SPACE_MAXADDR, /* highaddr */
1725 NULL, NULL, /* filter, filterarg */
1726 BUS_SPACE_MAXSIZE_32BIT, /* maxsize */

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

1770 device_printf(sc->arge_dev,
1771 "failed to create Rx ring DMA tag\n");
1772 goto fail;
1773 }
1774
1775 /* Create tag for Tx buffers. */
1776 error = bus_dma_tag_create(
1777 sc->arge_cdata.arge_parent_tag, /* parent */
1780 /* Create parent DMA tag. */
1781 error = bus_dma_tag_create(
1782 bus_get_dma_tag(sc->arge_dev), /* parent */
1783 1, 0, /* alignment, boundary */
1784 BUS_SPACE_MAXADDR_32BIT, /* lowaddr */
1785 BUS_SPACE_MAXADDR, /* highaddr */
1786 NULL, NULL, /* filter, filterarg */
1787 BUS_SPACE_MAXSIZE_32BIT, /* maxsize */

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

1831 device_printf(sc->arge_dev,
1832 "failed to create Rx ring DMA tag\n");
1833 goto fail;
1834 }
1835
1836 /* Create tag for Tx buffers. */
1837 error = bus_dma_tag_create(
1838 sc->arge_cdata.arge_parent_tag, /* parent */
1778 sizeof(uint32_t), 0, /* alignment, boundary */
1839 arge_tx_align, 0, /* alignment, boundary */
1779 BUS_SPACE_MAXADDR, /* lowaddr */
1780 BUS_SPACE_MAXADDR, /* highaddr */
1781 NULL, NULL, /* filter, filterarg */
1782 MCLBYTES * ARGE_MAXFRAGS, /* maxsize */
1783 ARGE_MAXFRAGS, /* nsegments */
1784 MCLBYTES, /* maxsegsize */
1785 0, /* flags */
1786 NULL, NULL, /* lockfunc, lockarg */
1787 &sc->arge_cdata.arge_tx_tag);
1788 if (error != 0) {
1789 device_printf(sc->arge_dev, "failed to create Tx DMA tag\n");
1790 goto fail;
1791 }
1792
1793 /* Create tag for Rx buffers. */
1794 error = bus_dma_tag_create(
1795 sc->arge_cdata.arge_parent_tag, /* parent */
1840 BUS_SPACE_MAXADDR, /* lowaddr */
1841 BUS_SPACE_MAXADDR, /* highaddr */
1842 NULL, NULL, /* filter, filterarg */
1843 MCLBYTES * ARGE_MAXFRAGS, /* maxsize */
1844 ARGE_MAXFRAGS, /* nsegments */
1845 MCLBYTES, /* maxsegsize */
1846 0, /* flags */
1847 NULL, NULL, /* lockfunc, lockarg */
1848 &sc->arge_cdata.arge_tx_tag);
1849 if (error != 0) {
1850 device_printf(sc->arge_dev, "failed to create Tx DMA tag\n");
1851 goto fail;
1852 }
1853
1854 /* Create tag for Rx buffers. */
1855 error = bus_dma_tag_create(
1856 sc->arge_cdata.arge_parent_tag, /* parent */
1796 ARGE_RX_ALIGN, 0, /* alignment, boundary */
1857 arge_rx_align, 0, /* alignment, boundary */
1797 BUS_SPACE_MAXADDR, /* lowaddr */
1798 BUS_SPACE_MAXADDR, /* highaddr */
1799 NULL, NULL, /* filter, filterarg */
1800 MCLBYTES, /* maxsize */
1801 ARGE_MAXFRAGS, /* nsegments */
1802 MCLBYTES, /* maxsegsize */
1803 0, /* flags */
1804 NULL, NULL, /* lockfunc, lockarg */

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

2103 bus_dma_segment_t segs[1];
2104 bus_dmamap_t map;
2105 int nsegs;
2106
2107 m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
2108 if (m == NULL)
2109 return (ENOBUFS);
2110 m->m_len = m->m_pkthdr.len = MCLBYTES;
1858 BUS_SPACE_MAXADDR, /* lowaddr */
1859 BUS_SPACE_MAXADDR, /* highaddr */
1860 NULL, NULL, /* filter, filterarg */
1861 MCLBYTES, /* maxsize */
1862 ARGE_MAXFRAGS, /* nsegments */
1863 MCLBYTES, /* maxsegsize */
1864 0, /* flags */
1865 NULL, NULL, /* lockfunc, lockarg */

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

2164 bus_dma_segment_t segs[1];
2165 bus_dmamap_t map;
2166 int nsegs;
2167
2168 m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
2169 if (m == NULL)
2170 return (ENOBUFS);
2171 m->m_len = m->m_pkthdr.len = MCLBYTES;
2172
2173 /*
2174 * Add extra space to "adjust" (copy) the packet back to be aligned
2175 * for purposes of IPv4/IPv6 header contents.
2176 */
2111 m_adj(m, sizeof(uint64_t));
2112
2113 if (bus_dmamap_load_mbuf_sg(sc->arge_cdata.arge_rx_tag,
2114 sc->arge_cdata.arge_rx_sparemap, m, segs, &nsegs, 0) != 0) {
2115 m_freem(m);
2116 return (ENOBUFS);
2117 }
2118 KASSERT(nsegs == 1, ("%s: %d segments returned!", __func__, nsegs));
2119
2120 rxd = &sc->arge_cdata.arge_rxdesc[idx];
2121 if (rxd->rx_m != NULL) {
2122 bus_dmamap_unload(sc->arge_cdata.arge_rx_tag, rxd->rx_dmamap);
2123 }
2124 map = rxd->rx_dmamap;
2125 rxd->rx_dmamap = sc->arge_cdata.arge_rx_sparemap;
2126 sc->arge_cdata.arge_rx_sparemap = map;
2127 rxd->rx_m = m;
2128 desc = rxd->desc;
2177 m_adj(m, sizeof(uint64_t));
2178
2179 if (bus_dmamap_load_mbuf_sg(sc->arge_cdata.arge_rx_tag,
2180 sc->arge_cdata.arge_rx_sparemap, m, segs, &nsegs, 0) != 0) {
2181 m_freem(m);
2182 return (ENOBUFS);
2183 }
2184 KASSERT(nsegs == 1, ("%s: %d segments returned!", __func__, nsegs));
2185
2186 rxd = &sc->arge_cdata.arge_rxdesc[idx];
2187 if (rxd->rx_m != NULL) {
2188 bus_dmamap_unload(sc->arge_cdata.arge_rx_tag, rxd->rx_dmamap);
2189 }
2190 map = rxd->rx_dmamap;
2191 rxd->rx_dmamap = sc->arge_cdata.arge_rx_sparemap;
2192 sc->arge_cdata.arge_rx_sparemap = map;
2193 rxd->rx_m = m;
2194 desc = rxd->desc;
2129 if (segs[0].ds_addr & 3)
2195 if ((sc->arge_hw_flags & ARGE_HW_FLG_RX_DESC_ALIGN_4BYTE) &&
2196 segs[0].ds_addr & 3)
2130 panic("RX packet address unaligned");
2131 desc->packet_addr = segs[0].ds_addr;
2132 desc->packet_ctrl = ARGE_DESC_EMPTY | ARGE_DMASIZE(segs[0].ds_len);
2133
2134 bus_dmamap_sync(sc->arge_cdata.arge_rx_ring_tag,
2135 sc->arge_cdata.arge_rx_ring_map,
2136 BUS_DMASYNC_PREWRITE);
2137

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

2326 "\4TX_BUS_ERROR\2TX_UNDERRUN\1TX_PKT_SENT");
2327 ARGEDEBUG(sc, ARGE_DBG_INTR, "status(filter) = %b\n", status,
2328 "\20\10RX_BUS_ERROR\7RX_OVERFLOW\5RX_PKT_RCVD"
2329 "\4TX_BUS_ERROR\2TX_UNDERRUN\1TX_PKT_SENT");
2330
2331 if (status & DMA_INTR_ALL) {
2332 sc->arge_intr_status |= status;
2333 ARGE_WRITE(sc, AR71XX_DMA_INTR, 0);
2197 panic("RX packet address unaligned");
2198 desc->packet_addr = segs[0].ds_addr;
2199 desc->packet_ctrl = ARGE_DESC_EMPTY | ARGE_DMASIZE(segs[0].ds_len);
2200
2201 bus_dmamap_sync(sc->arge_cdata.arge_rx_ring_tag,
2202 sc->arge_cdata.arge_rx_ring_map,
2203 BUS_DMASYNC_PREWRITE);
2204

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

2393 "\4TX_BUS_ERROR\2TX_UNDERRUN\1TX_PKT_SENT");
2394 ARGEDEBUG(sc, ARGE_DBG_INTR, "status(filter) = %b\n", status,
2395 "\20\10RX_BUS_ERROR\7RX_OVERFLOW\5RX_PKT_RCVD"
2396 "\4TX_BUS_ERROR\2TX_UNDERRUN\1TX_PKT_SENT");
2397
2398 if (status & DMA_INTR_ALL) {
2399 sc->arge_intr_status |= status;
2400 ARGE_WRITE(sc, AR71XX_DMA_INTR, 0);
2401 sc->stats.intr_ok++;
2334 return (FILTER_SCHEDULE_THREAD);
2335 }
2336
2337 sc->arge_intr_status = 0;
2402 return (FILTER_SCHEDULE_THREAD);
2403 }
2404
2405 sc->arge_intr_status = 0;
2406 sc->stats.intr_stray++;
2338 return (FILTER_STRAY);
2339}
2340
2341static void
2342arge_intr(void *arg)
2343{
2344 struct arge_softc *sc = arg;
2345 uint32_t status;

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

2350
2351 ARGEDEBUG(sc, ARGE_DBG_INTR, "int status(intr) = %b\n", status,
2352 "\20\10\7RX_OVERFLOW\5RX_PKT_RCVD"
2353 "\4TX_BUS_ERROR\2TX_UNDERRUN\1TX_PKT_SENT");
2354
2355 /*
2356 * Is it our interrupt at all?
2357 */
2407 return (FILTER_STRAY);
2408}
2409
2410static void
2411arge_intr(void *arg)
2412{
2413 struct arge_softc *sc = arg;
2414 uint32_t status;

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

2419
2420 ARGEDEBUG(sc, ARGE_DBG_INTR, "int status(intr) = %b\n", status,
2421 "\20\10\7RX_OVERFLOW\5RX_PKT_RCVD"
2422 "\4TX_BUS_ERROR\2TX_UNDERRUN\1TX_PKT_SENT");
2423
2424 /*
2425 * Is it our interrupt at all?
2426 */
2358 if (status == 0)
2427 if (status == 0) {
2428 sc->stats.intr_stray2++;
2359 return;
2429 return;
2430 }
2360
2361 if (status & DMA_INTR_RX_BUS_ERROR) {
2362 ARGE_WRITE(sc, AR71XX_DMA_RX_STATUS, DMA_RX_STATUS_BUS_ERROR);
2363 device_printf(sc->arge_dev, "RX bus error");
2364 return;
2365 }
2366
2367 if (status & DMA_INTR_TX_BUS_ERROR) {

--- 163 unchanged lines hidden ---
2431
2432 if (status & DMA_INTR_RX_BUS_ERROR) {
2433 ARGE_WRITE(sc, AR71XX_DMA_RX_STATUS, DMA_RX_STATUS_BUS_ERROR);
2434 device_printf(sc->arge_dev, "RX bus error");
2435 return;
2436 }
2437
2438 if (status & DMA_INTR_TX_BUS_ERROR) {

--- 163 unchanged lines hidden ---