Changeset 911f517 in rtems-libbsd


Ignore:
Timestamp:
Nov 25, 2014, 11:54:35 AM (5 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
4.11, afaeccc05a556f6aa25ba044a7e49d6aa634a59e, freebsd-9.3, master
Children:
dec6b67
Parents:
cd179c4
git-author:
Sebastian Huber <sebastian.huber@…> (11/25/14 11:54:35)
git-committer:
Sebastian Huber <sebastian.huber@…> (01/21/15 14:00:20)
Message:

if_cgem: Use explicit cache operations

File:
1 edited

Legend:

Unmodified
Added
Removed
  • freebsd/sys/dev/cadence/if_cgem.c

    rcd179c4 r911f517  
    127127        bus_addr_t              rxring_physaddr;
    128128        struct mbuf             *rxring_m[CGEM_NUM_RX_DESCS];
     129#ifndef __rtems__
    129130        bus_dmamap_t            rxring_m_dmamap[CGEM_NUM_RX_DESCS];
     131#endif /* __rtems__ */
    130132        int                     rxring_hd_ptr;  /* where to put rcv bufs */
    131133        int                     rxring_tl_ptr;  /* where to get receives */
     
    143145        bus_addr_t              txring_physaddr;
    144146        struct mbuf             *txring_m[CGEM_NUM_TX_DESCS];
     147#ifndef __rtems__
    145148        bus_dmamap_t            txring_m_dmamap[CGEM_NUM_TX_DESCS];
     149#endif /* __rtems__ */
    146150        int                     txring_hd_ptr;  /* where to put next xmits */
    147151        int                     txring_tl_ptr;  /* next xmit mbuf to free */
     
    426430                sc->rxring[i].ctl = 0;
    427431                sc->rxring_m[i] = NULL;
     432#ifndef __rtems__
    428433                err = bus_dmamap_create(sc->mbuf_dma_tag, 0,
    429434                                        &sc->rxring_m_dmamap[i]);
    430435                if (err)
    431436                        return (err);
     437#endif /* __rtems__ */
    432438        }
    433439        sc->rxring[CGEM_NUM_RX_DESCS - 1].addr |= CGEM_RXDESC_WRAP;
     
    459465                sc->txring[i].ctl = CGEM_TXDESC_USED;
    460466                sc->txring_m[i] = NULL;
     467#ifndef __rtems__
    461468                err = bus_dmamap_create(sc->mbuf_dma_tag, 0,
    462469                                        &sc->txring_m_dmamap[i]);
    463470                if (err)
    464471                        return (err);
     472#endif /* __rtems__ */
    465473        }
    466474        sc->txring[CGEM_NUM_TX_DESCS - 1].ctl |= CGEM_TXDESC_WRAP;
     
    478486{
    479487        struct mbuf *m = NULL;
     488#ifndef __rtems__
    480489        bus_dma_segment_t segs[TX_MAX_DMA_SEGS];
    481490        int nsegs;
     491#else /* __rtems__ */
     492        bus_dma_segment_t segs[1];
     493#endif /* __rtems__ */
    482494
    483495        CGEM_ASSERT_LOCKED(sc);
     
    493505                m->m_pkthdr.rcvif = sc->ifp;
    494506
     507#ifndef __rtems__
    495508                /* Load map and plug in physical address. */
    496509                if (bus_dmamap_load_mbuf_sg(sc->mbuf_dma_tag,
     
    501514                        break;
    502515                }
     516#endif /* __rtems__ */
    503517                sc->rxring_m[sc->rxring_hd_ptr] = m;
    504518
     519#ifndef __rtems__
    505520                /* Sync cache with receive buffer. */
    506521                bus_dmamap_sync(sc->mbuf_dma_tag,
    507522                                sc->rxring_m_dmamap[sc->rxring_hd_ptr],
    508523                                BUS_DMASYNC_PREREAD);
     524#else /* __rtems__ */
     525                rtems_cache_invalidate_multiple_data_lines(m->m_data, m->m_len);
     526                segs[0].ds_addr = mtod(m, bus_addr_t);
     527#endif /* __rtems__ */
    509528
    510529                /* Write rx descriptor and increment head pointer. */
     
    543562                sc->rxring_m[sc->rxring_tl_ptr] = NULL;
    544563
     564#ifndef __rtems__
    545565                /* Sync cache with receive buffer. */
    546566                bus_dmamap_sync(sc->mbuf_dma_tag,
     
    551571                bus_dmamap_unload(sc->mbuf_dma_tag,
    552572                        sc->rxring_m_dmamap[sc->rxring_tl_ptr]);
     573#else /* __rtems__ */
     574                rtems_cache_invalidate_multiple_data_lines(m->m_data, m->m_len);
     575#endif /* __rtems__ */
    553576
    554577                /* Increment tail pointer. */
     
    640663                CGEM_TXDESC_USED) != 0) {
    641664
     665#ifndef __rtems__
    642666                /* Sync cache.  nop? */
    643667                bus_dmamap_sync(sc->mbuf_dma_tag,
     
    648672                bus_dmamap_unload(sc->mbuf_dma_tag,
    649673                                  sc->txring_m_dmamap[sc->txring_tl_ptr]);
     674#endif /* __rtems__ */
    650675
    651676                /* Free up the mbuf. */
     
    702727}
    703728
     729#ifdef __rtems__
     730static int
     731cgem_get_segs_for_tx(struct mbuf *m, bus_dma_segment_t segs[TX_MAX_DMA_SEGS],
     732    int *nsegs)
     733{
     734        int i = 0;
     735
     736        do {
     737                if (m->m_len > 0) {
     738                        segs[i].ds_addr = mtod(m, bus_addr_t);
     739                        segs[i].ds_len = m->m_len;
     740                        rtems_cache_flush_multiple_data_lines(m->m_data, m->m_len);
     741                        ++i;
     742                }
     743
     744                m = m->m_next;
     745
     746                if (m == NULL) {
     747                        *nsegs = i;
     748
     749                        return (0);
     750                }
     751        } while (i < TX_MAX_DMA_SEGS);
     752
     753        return (EFBIG);
     754}
     755#endif /* __rtems__ */
    704756/* Start transmits. */
    705757static void
     
    739791                        break;
    740792
     793#ifndef __rtems__
    741794                /* Load DMA map. */
    742795                err = bus_dmamap_load_mbuf_sg(sc->mbuf_dma_tag,
    743796                                      sc->txring_m_dmamap[sc->txring_hd_ptr],
    744797                                      m, segs, &nsegs, BUS_DMA_NOWAIT);
     798#else /* __rtems__ */
     799                err = cgem_get_segs_for_tx(m, segs, &nsegs);
     800#endif /* __rtems__ */
    745801                if (err == EFBIG) {
    746802                        /* Too many segments!  defrag and try again. */
     
    753809                        }
    754810                        m = m2;
     811#ifndef __rtems__
    755812                        err = bus_dmamap_load_mbuf_sg(sc->mbuf_dma_tag,
    756813                                      sc->txring_m_dmamap[sc->txring_hd_ptr],
    757814                                      m, segs, &nsegs, BUS_DMA_NOWAIT);
     815#else /* __rtems__ */
     816                        err = cgem_get_segs_for_tx(m, segs, &nsegs);
     817#endif /* __rtems__ */
    758818                        sc->txdefrags++;
    759819                }
     
    766826                sc->txring_m[sc->txring_hd_ptr] = m;
    767827
     828#ifndef __rtems__
    768829                /* Sync tx buffer with cache. */
    769830                bus_dmamap_sync(sc->mbuf_dma_tag,
    770831                                sc->txring_m_dmamap[sc->txring_hd_ptr],
    771832                                BUS_DMASYNC_PREWRITE);
     833#endif /* __rtems__ */
    772834
    773835                /* Set wrap flag if next packet might run off end of ring. */
     
    11281190                sc->txring[i].addr = 0;
    11291191                if (sc->txring_m[i]) {
     1192#ifndef __rtems__
    11301193                        bus_dmamap_unload(sc->mbuf_dma_tag,
    11311194                                          sc->txring_m_dmamap[i]);
     1195#endif /* __rtems__ */
    11321196                        m_freem(sc->txring_m[i]);
    11331197                        sc->txring_m[i] = NULL;
     
    11451209                sc->rxring[i].ctl = 0;
    11461210                if (sc->rxring_m[i]) {
     1211#ifndef __rtems__
    11471212                        /* Unload dmamap. */
    11481213                        bus_dmamap_unload(sc->mbuf_dma_tag,
    11491214                                  sc->rxring_m_dmamap[sc->rxring_tl_ptr]);
     1215#endif /* __rtems__ */
    11501216
    11511217                        m_freem(sc->rxring_m[i]);
     
    17661832{
    17671833        struct cgem_softc *sc = device_get_softc(dev);
     1834#ifndef __rtems__
    17681835        int i;
     1836#endif /* __rtems__ */
    17691837
    17701838        if (sc == NULL)
     
    18081876                                sc->rxring_dma_map);
    18091877                sc->rxring = NULL;
     1878#ifndef __rtems__
    18101879                for (i = 0; i < CGEM_NUM_RX_DESCS; i++)
    18111880                        if (sc->rxring_m_dmamap[i] != NULL) {
     
    18141883                                sc->rxring_m_dmamap[i] = NULL;
    18151884                        }
     1885#endif /* __rtems__ */
    18161886        }
    18171887        if (sc->txring != NULL) {
     
    18231893                                sc->txring_dma_map);
    18241894                sc->txring = NULL;
     1895#ifndef __rtems__
    18251896                for (i = 0; i < CGEM_NUM_TX_DESCS; i++)
    18261897                        if (sc->txring_m_dmamap[i] != NULL) {
     
    18291900                                sc->txring_m_dmamap[i] = NULL;
    18301901                        }
     1902#endif /* __rtems__ */
    18311903        }
    18321904        if (sc->desc_dma_tag != NULL) {
Note: See TracChangeset for help on using the changeset viewer.