Changeset 6b176ce in rtems-libbsd


Ignore:
Timestamp:
Mar 30, 2015, 12:30:04 PM (5 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
4.11, c1e05b9ea378b2971e3d7704779112b4bc4296da, freebsd-9.3, 4a77611a223ea883fb548679b516d326a020d447
Children:
aee6864
Parents:
a681853
git-author:
Sebastian Huber <sebastian.huber@…> (03/30/15 12:30:04)
git-committer:
Sebastian Huber <sebastian.huber@…> (04/01/15 07:15:30)
Message:

if_dwc: Checksum offload

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

Legend:

Unmodified
Added
Removed
  • freebsd/sys/dev/dwc/if_dwc.c

    ra681853 r6b176ce  
    108108#define DDESC_TDES0_TXFIRST             (1 << 28)
    109109#define DDESC_TDES0_TXCRCDIS            (1 << 27)
     110#define DDESC_TDES0_CIC_IP_HDR          (0x1 << 22)
     111#define DDESC_TDES0_CIC_IP_HDR_PYL      (0x2 << 22)
     112#define DDESC_TDES0_CIC_IP_HDR_PYL_PHDR (0x3 << 22)
    110113#define DDESC_TDES0_TXRINGEND           (1 << 21)
    111114#define DDESC_TDES0_TXCHAIN             (1 << 20)
     
    114117#define DDESC_RDES0_FL_MASK             0x3fff
    115118#define DDESC_RDES0_FL_SHIFT            16      /* Frame Length */
     119#define DDESC_RDES0_ESA                 (1 << 0)
    116120#define DDESC_RDES1_CHAINED             (1 << 14)
     121#define DDESC_RDES4_IP_PYL_ERR          (1 << 4)
     122#define DDESC_RDES4_IP_HDR_ERR          (1 << 3)
     123#define DDESC_RDES4_IP_PYL_TYPE_MSK     0x7
     124#define DDESC_RDES4_IP_PYL_UDP          1
     125#define DDESC_RDES4_IP_PYL_TCP          2
    117126
    118127struct dwc_bufmap {
     
    133142        uint32_t addr;          /* pointer to buffer data */
    134143        uint32_t addr_next;     /* link to next descriptor */
     144        uint32_t tdes4;
     145        uint32_t tdes5;
     146        uint32_t timestamp_low;
     147        uint32_t timestamp_high;
    135148};
    136149
     
    157170 */
    158171#define DWC_DESC_RING_ALIGN             2048
     172
     173#define DWC_CKSUM_ASSIST        (CSUM_IP | CSUM_TCP | CSUM_UDP | \
     174                                 CSUM_TCP_IPV6 | CSUM_UDP_IPV6)
    159175
    160176struct dwc_softc {
     
    241257
    242258static void
    243 dwc_setup_txdesc(struct dwc_softc *sc, int idx, bus_dma_segment_t segs[TX_MAX_DMA_SEGS],
    244     int nsegs)
     259dwc_setup_txdesc(struct dwc_softc *sc, int csum_flags, int idx,
     260    bus_dma_segment_t segs[TX_MAX_DMA_SEGS], int nsegs)
    245261{
    246262        int i;
     
    267283                    DDESC_TDES0_OWN;
    268284
    269                 if (i == 0)
     285                if (i == 0) {
    270286                        tdes0 |= DDESC_TDES0_TXFIRST;
     287
     288                        if ((csum_flags & (CSUM_TCP | CSUM_UDP |
     289                            CSUM_TCP_IPV6 | CSUM_UDP_IPV6)) != 0)
     290                                tdes0 |= DDESC_TDES0_CIC_IP_HDR_PYL_PHDR;
     291                        else if ((csum_flags & CSUM_IP) != 0)
     292                                tdes0 |= DDESC_TDES0_CIC_IP_HDR;
     293                }
    271294
    272295                if (i == nsegs - 1)
     
    351374#endif /* __rtems__ */
    352375
    353         dwc_setup_txdesc(sc, idx, segs, nsegs);
     376        dwc_setup_txdesc(sc, m->m_pkthdr.csum_flags, idx, segs, nsegs);
    354377
    355378        ETHER_BPF_MTAP(sc->ifp, m);
     
    570593        /* Enable transmitters */
    571594        reg = READ4(sc, MAC_CONFIGURATION);
     595        reg |= (CONF_IPC);
    572596        reg |= (CONF_JD | CONF_ACS | CONF_BE);
    573597        reg |= (CONF_TE | CONF_RE);
     
    882906        struct mbuf *m;
    883907        int error;
    884         int rdes0;
     908        uint32_t rdes0;
     909        uint32_t rdes4;
    885910        int idx;
    886911        int len;
     
    907932                        m->m_pkthdr.len = len;
    908933                        m->m_len = len;
     934
     935                        /* Check checksum offload flags. */
     936                        if ((rdes0 & DDESC_RDES0_ESA) != 0) {
     937                                rdes4 = sc->rxdesc_ring[idx].tdes4;
     938
     939                                /* TCP or UDP checks out, IP checks out too. */
     940                                if ((rdes4 & DDESC_RDES4_IP_PYL_TYPE_MSK) ==
     941                                    DDESC_RDES4_IP_PYL_UDP ||
     942                                    (rdes4 & DDESC_RDES4_IP_PYL_TYPE_MSK) ==
     943                                    DDESC_RDES4_IP_PYL_TCP) {
     944                                        m->m_pkthdr.csum_flags |=
     945                                                CSUM_IP_CHECKED |
     946                                                CSUM_IP_VALID |
     947                                                CSUM_DATA_VALID |
     948                                                CSUM_PSEUDO_HDR;
     949                                        m->m_pkthdr.csum_data = 0xffff;
     950                                } else if ((rdes4 & (DDESC_RDES4_IP_PYL_ERR |
     951                                    DDESC_RDES4_IP_HDR_ERR)) == 0) {
     952                                        /* Only IP checks out. */
     953                                        m->m_pkthdr.csum_flags |=
     954                                                CSUM_IP_CHECKED |
     955                                                CSUM_IP_VALID;
     956                                        m->m_pkthdr.csum_data = 0xffff;
     957                                }
     958                        }
     959
    909960#ifndef __rtems__
    910961                        if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
     
    11471198                        goto out;
    11481199                }
     1200                sc->rxdesc_ring[idx].tdes4 = 0;
    11491201        }
    11501202
     
    12641316
    12651317        reg = READ4(sc, BUS_MODE);
     1318        reg |= (BUS_MODE_ATDS);
    12661319        reg |= (BUS_MODE_EIGHTXPBL);
    12671320        reg |= (BUS_MODE_PBL_BEATS_8 << BUS_MODE_PBL_SHIFT);
     
    12981351        if_initname(ifp, device_get_name(dev), device_get_unit(dev));
    12991352        ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
    1300         ifp->if_capabilities = IFCAP_VLAN_MTU;
     1353        ifp->if_capabilities |= IFCAP_HWCSUM | IFCAP_HWCSUM_IPV6 |
     1354            IFCAP_VLAN_MTU | IFCAP_VLAN_HWCSUM;
    13011355        ifp->if_capenable = ifp->if_capabilities;
     1356        ifp->if_hwassist = DWC_CKSUM_ASSIST;
    13021357        ifp->if_start = dwc_txstart;
    13031358        ifp->if_ioctl = dwc_ioctl;
  • freebsd/sys/dev/dwc/if_dwc.h

    ra681853 r6b176ce  
    4141#define  CONF_FES               (1 << 14)       /* MII speed select */
    4242#define  CONF_DM                (1 << 11)       /* Full Duplex Enable */
     43#define  CONF_IPC               (1 << 10)       /* Checksum Enable */
    4344#define  CONF_ACS               (1 << 7)
    4445#define  CONF_TE                (1 << 3)
     
    210211#define  BUS_MODE_PBL_SHIFT     8 /* Single block transfer size */
    211212#define  BUS_MODE_PBL_BEATS_8   8
     213#define  BUS_MODE_ATDS          (1 << 7) /* Alternate Descriptor Size */
    212214#define  BUS_MODE_SWR           (1 << 0) /* Reset */
    213215#define TRANSMIT_POLL_DEMAND    0x1004
Note: See TracChangeset for help on using the changeset viewer.