Changeset a8a9cf1 in rtems-libbsd


Ignore:
Timestamp:
Oct 25, 2017, 8:17:23 AM (20 months ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
eeb3fd5d9b07ac9a2e280cff60a1b762bd273a8d, 1e989998de954bef51e6c19cc3d64d39f32100aa
Children:
936b597
Parents:
0323c28
git-author:
Sebastian Huber <sebastian.huber@…> (10/25/17 08:17:23)
git-committer:
Sebastian Huber <sebastian.huber@…> (10/25/17 12:30:04)
Message:

ffec: Add checksum offload

Update #3090.

Location:
freebsd/sys/dev/ffec
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • freebsd/sys/dev/ffec/if_ffec.c

    r0323c28 ra8a9cf1  
    8282#include <net/if_var.h>
    8383#include <net/if_vlan_var.h>
     84#include <netinet/in.h>
     85#include <netinet/ip.h>
    8486
    8587#include <dev/ffec/if_ffecreg.h>
     
    621623        struct ffec_bufmap *bmap;
    622624        uint32_t tx_idx;
     625        int csum_flags;
    623626        uint32_t flags;
     627        uint32_t flags2;
    624628
    625629        FFEC_ASSERT_LOCKED(sc);
     
    654658        bmap->mbuf = m0;
    655659
     660        flags2 = FEC_TXDESC_INT;
     661        csum_flags = m0->m_pkthdr.csum_flags;
     662
     663        if ((csum_flags & CSUM_IP) != 0) {
     664                struct mbuf *n;
     665                int off;
     666                int off2;
     667                struct ip *ip;
     668
     669                flags2 |= FEC_TXDESC_IINS;
     670                n = m_getptr(m0, sizeof(struct ether_header), &off);
     671                ip = (struct ip *)mtodo(n, off);
     672                ip->ip_sum = 0;
     673
     674                off2 = m0->m_pkthdr.csum_data;
     675                if ((csum_flags & (CSUM_TCP | CSUM_UDP)) != 0 && off2 != 0) {
     676                        flags2 |= FEC_TXDESC_PINS;
     677                        *(uint16_t *)((caddr_t)(ip + 1) + off2) = 0;
     678                }
     679        }
     680
    656681        /*
    657682         * Fill in the TX descriptors back to front so that READY bit in first
     
    667692                tx_desc = &sc->txdesc_ring[tx_idx];
    668693                tx_desc->buf_paddr = segs[i].ds_addr;
     694                tx_desc->flags2 = flags2;
    669695#ifdef __rtems__
    670696                rtems_cache_flush_multiple_data_lines((void *)segs[i].ds_addr,
     
    794820        nidx = next_rxidx(idx);
    795821        sc->rxdesc_ring[idx].buf_paddr = (uint32_t)paddr;
     822        sc->rxdesc_ring[idx].flags2 = FEC_RXDESC_INT;
    796823        wmb();
    797824        sc->rxdesc_ring[idx].flags_len = FEC_RXDESC_EMPTY |
     
    852879
    853880static void
    854 ffec_rxfinish_onebuf(struct ffec_softc *sc, int len)
     881ffec_rxfinish_onebuf(struct ffec_softc *sc, int len, uint32_t flags2)
    855882{
    856883        struct mbuf *m, *newmbuf;
     
    898925        m->m_pkthdr.len = len;
    899926        m->m_pkthdr.rcvif = sc->ifp;
     927
     928        if ((flags2 & (FEC_RXDESC_ICE | FEC_RXDESC_PCR)) == 0) {
     929                m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED | CSUM_IP_VALID |
     930                    CSUM_DATA_VALID | CSUM_PSEUDO_HDR;
     931                m->m_pkthdr.csum_data = 0xffff;
     932        }
    900933
    901934        if (sc->fectype & FECFLAG_RACC) {
     
    9741007                         *  Normal case: a good frame all in one buffer.
    9751008                         */
    976                         ffec_rxfinish_onebuf(sc, len);
     1009                        ffec_rxfinish_onebuf(sc, len, desc->flags2);
    9771010                }
    9781011                sc->rx_idx = next_rxidx(sc->rx_idx);
     
    13061339#endif
    13071340        regval |= FEC_ECR_ETHEREN;
     1341        regval |= FEC_ECR_EN1588;
    13081342        WR4(sc, FEC_ECR_REG, regval);
    13091343
     
    19631997        if_initname(ifp, device_get_name(dev), device_get_unit(dev));
    19641998        ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
    1965         ifp->if_capabilities = IFCAP_VLAN_MTU;
     1999        ifp->if_capabilities = IFCAP_HWCSUM | IFCAP_HWCSUM_IPV6 |
     2000            IFCAP_VLAN_MTU;
    19662001        ifp->if_capenable = ifp->if_capabilities;
     2002        ifp->if_hwassist = CSUM_IP | CSUM_TCP | CSUM_UDP;
    19672003        ifp->if_start = ffec_txstart;
    19682004        ifp->if_ioctl = ffec_ioctl;
  • freebsd/sys/dev/ffec/if_ffecreg.h

    r0323c28 ra8a9cf1  
    296296        uint32_t        flags_len;
    297297        uint32_t        buf_paddr;
     298        uint32_t        flags2;
     299        uint32_t        hlen_proto;
     300        uint32_t        bdu;
     301        uint32_t        ts;
     302        uint32_t        res[2];
    298303};
    299304
     
    306311#define FEC_TXDESC_ABC                  (1 << 25)
    307312#define FEC_TXDESC_LEN_MASK             (0xffff)
     313
     314#define FEC_TXDESC_INT                  (1 << 30)
     315#define FEC_TXDESC_TS                   (1 << 29)
     316#define FEC_TXDESC_PINS                 (1 << 28)
     317#define FEC_TXDESC_IINS                 (1 << 27)
    308318
    309319#define FEC_RXDESC_EMPTY                (1U << 31)
     
    322332#define FEC_RXDESC_LEN_MASK             (0xffff)
    323333
     334#define FEC_RXDESC_INT                  (1 << 23)
     335#define FEC_RXDESC_ICE                  (1 << 5)
     336#define FEC_RXDESC_PCR                  (1 << 4)
     337
    324338#define FEC_RXDESC_ERROR_BITS   (FEC_RXDESC_LG | FEC_RXDESC_NO | \
    325339    FEC_RXDESC_OV | FEC_RXDESC_TR)
Note: See TracChangeset for help on using the changeset viewer.