Changeset b2a210c in rtems-libbsd


Ignore:
Timestamp:
Mar 15, 2018, 8:09:31 AM (14 months ago)
Author:
Christian Mauderer <christian.mauderer@…>
Branches:
5cb01f277962d3127d364bf871f799b34e6b6be6, cc60cbeef68291b54f73c2d26fe3da4b837a8e06
Children:
b3d1e6a
Parents:
67c35b9
git-author:
Christian Mauderer <christian.mauderer@…> (03/15/18 08:09:31)
git-committer:
Christian Mauderer <christian.mauderer@…> (03/21/18 08:14:25)
Message:

if_atsam: Add checksum offload.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • rtemsbsd/sys/dev/atsam/if_atsam.c

    r67c35b9 rb2a210c  
    455455        }
    456456}
     457
     458static void rx_update_mbuf(struct mbuf *m, sGmacRxDescriptor *buffer_desc)
     459{
     460        int frame_len;
     461
     462        frame_len = (int) (buffer_desc->status.bm.len);
     463
     464        m->m_data = mtod(m, char*)+ETHER_ALIGN;
     465        m->m_len = frame_len;
     466        m->m_pkthdr.len = frame_len;
     467
     468        /* check checksum offload result */
     469        m->m_pkthdr.csum_flags = 0;
     470        switch (buffer_desc->status.bm.typeIDMatchOrCksumResult) {
     471        case GMAC_RXDESC_ST_CKSUM_RESULT_IP_CHECKED:
     472                m->m_pkthdr.csum_flags = CSUM_IP_CHECKED | CSUM_IP_VALID;
     473                m->m_pkthdr.csum_data = 0xffff;
     474                break;
     475        case GMAC_RXDESC_ST_CKSUM_RESULT_IP_AND_TCP_CHECKED:
     476        case GMAC_RXDESC_ST_CKSUM_RESULT_IP_AND_UDP_CHECKED:
     477                m->m_pkthdr.csum_flags = CSUM_IP_CHECKED | CSUM_IP_VALID |
     478                    CSUM_L4_VALID | CSUM_L4_CALC;
     479                m->m_pkthdr.csum_data = 0xffff;
     480                break;
     481        }
     482}
     483
    457484/*
    458485 * Receive daemon
     
    467494        struct mbuf *n;
    468495        volatile sGmacRxDescriptor *buffer_desc;
    469         int frame_len;
    470496        uint32_t tmp_rx_bd_address;
    471497        size_t i;
     
    548574                                n = if_atsam_new_mbuf(ifp);
    549575                                if (n != NULL) {
    550                                         frame_len = (int)
    551                                             (buffer_desc->status.bm.len);
    552 
    553                                         /* Update mbuf */
    554                                         m->m_data = mtod(m, char*)+ETHER_ALIGN;
    555                                         m->m_len = frame_len;
    556                                         m->m_pkthdr.len = frame_len;
     576                                        rx_update_mbuf(m, buffer_desc);
     577
    557578                                        IF_ATSAM_UNLOCK(sc);
    558579                                        sc->ifp->if_input(ifp, m);
     
    659680        Gmac *pHw = sc->Gmac_inst.gGmacd.pHw;
    660681        bool success;
     682        int csum_flags = m->m_pkthdr.csum_flags;
    661683
    662684        if_atsam_tx_bd_cleanup(sc);
     
    707729                        tmp_val |= GMAC_TX_SET_EOF;
    708730                        tmp_val &= ~GMAC_TX_SET_USED;
     731                        if ((csum_flags & (CSUM_IP | CSUM_TCP | CSUM_UDP |
     732                            CSUM_TCP_IPV6 | CSUM_UDP_IPV6)) != 0) {
     733                                start_packet_tx_bd->status.bm.bNoCRC = 0;
     734                        } else {
     735                                start_packet_tx_bd->status.bm.bNoCRC = 1;
     736                        }
    709737                        _ARM_Data_synchronization_barrier();
    710738                        cur->status.val = tmp_val;
     
    9801008        /* Configuration of DMAC */
    9811009        dmac_cfg = (GMAC_DCFGR_DRBS(GMAC_RX_BUFFER_SIZE >> 6)) |
    982             GMAC_DCFGR_RXBMS(3) | GMAC_DCFGR_TXPBMS | GMAC_DCFGR_FBLDO_INCR16;
     1010            GMAC_DCFGR_RXBMS(3) | GMAC_DCFGR_TXPBMS | GMAC_DCFGR_FBLDO_INCR16 |
     1011            GMAC_DCFGR_TXCOEN;
    9831012        GMAC_SetDMAConfig(sc->Gmac_inst.gGmacd.pHw, dmac_cfg, 0);
     1013
     1014        /* Enable hardware checksum offload for receive */
     1015        sc->Gmac_inst.gGmacd.pHw->GMAC_NCFGR |= GMAC_NCFGR_RXCOEN;
    9841016
    9851017        /* Shut down Transmit and Receive */
     
    14621494        ifp->if_start = if_atsam_enet_start;
    14631495        ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX;
     1496        ifp->if_capabilities |= IFCAP_HWCSUM | IFCAP_HWCSUM_IPV6 |
     1497            IFCAP_VLAN_HWCSUM;
     1498        ifp->if_hwassist = CSUM_IP | CSUM_IP_UDP | CSUM_IP_TCP |
     1499            CSUM_IP6_UDP | CSUM_IP6_TCP;
    14641500        IFQ_SET_MAXLEN(&ifp->if_snd, TXBUF_COUNT - 1);
    14651501        ifp->if_snd.ifq_drv_maxlen = TXBUF_COUNT - 1;
Note: See TracChangeset for help on using the changeset viewer.