While on my way home I already noted two bugs. I'll send a V2 tomorrow.
Sorry for the spam.

Am 14.03.2018 um 15:54 schrieb Christian Mauderer:
> ---
>  rtemsbsd/sys/dev/atsam/if_atsam.c | 34 +++++++++++++++++++++++++++++++++-
>  1 file changed, 33 insertions(+), 1 deletion(-)
> 
> diff --git a/rtemsbsd/sys/dev/atsam/if_atsam.c 
> b/rtemsbsd/sys/dev/atsam/if_atsam.c
> index 794937be..d47a17e7 100644
> --- a/rtemsbsd/sys/dev/atsam/if_atsam.c
> +++ b/rtemsbsd/sys/dev/atsam/if_atsam.c
> @@ -554,6 +554,23 @@ static void if_atsam_rx_daemon(void *arg)
>                                       m->m_data = mtod(m, char*)+ETHER_ALIGN;
>                                       m->m_len = frame_len;
>                                       m->m_pkthdr.len = frame_len;
> +                                     /* check checksum offload result */
> +                                     switch 
> (buffer_desc->status.bm.typeIDMatchOrCksumResult) {
> +                                     case 
> GMAC_RXDESC_ST_CKSUM_RESULT_IP_CHECKED:
> +                                             m->m_pkthdr.csum_flags |=
> +                                                 CSUM_IP_CHECKED |
> +                                                 CSUM_IP_VALID;
> +                                             m->m_pkthdr.csum_data = 0xffff;
> +                                     case 
> GMAC_RXDESC_ST_CKSUM_RESULT_IP_AND_TCP_CHECKED:
> +                                     case 
> GMAC_RXDESC_ST_CKSUM_RESULT_IP_AND_UDP_CHECKED:
> +                                             m->m_pkthdr.csum_flags |=
> +                                                 CSUM_IP_CHECKED |
> +                                                 CSUM_IP_VALID |
> +                                                 CSUM_DATA_VALID |
> +                                                 CSUM_PSEUDO_HDR;
> +                                             m->m_pkthdr.csum_data = 0xffff;
> +                                     }
> +
>                                       IF_ATSAM_UNLOCK(sc);
>                                       sc->ifp->if_input(ifp, m);
>                                       IF_ATSAM_LOCK(sc);
> @@ -658,6 +675,7 @@ static bool if_atsam_send_packet(if_atsam_softc *sc, 
> struct mbuf *m)
>       uint32_t tmp_val = 0;
>       Gmac *pHw = sc->Gmac_inst.gGmacd.pHw;
>       bool success;
> +     int csum_flags = m->m_pkthdr.csum_flags;
>  
>       if_atsam_tx_bd_cleanup(sc);
>       /* Wait for interrupt in case no buffer descriptors are available */
> @@ -706,6 +724,12 @@ static bool if_atsam_send_packet(if_atsam_softc *sc, 
> struct mbuf *m)
>               if (m == NULL) {
>                       tmp_val |= GMAC_TX_SET_EOF;
>                       tmp_val &= ~GMAC_TX_SET_USED;
> +                     if ((csum_flags & (CSUM_IP | CSUM_TCP | CSUM_UDP |
> +                         CSUM_TCP_IPV6 | CSUM_UDP_IPV6)) != 0) {
> +                             start_packet_tx_bd->status.bm.bNoCRC = 0;
> +                     } else {
> +                             start_packet_tx_bd->status.bm.bNoCRC = 1;
> +                     }
>                       _ARM_Data_synchronization_barrier();
>                       cur->status.val = tmp_val;
>                       start_packet_tx_bd->status.val &= ~GMAC_TX_SET_USED;
> @@ -979,9 +1003,13 @@ static void if_atsam_init(void *arg)
>  
>       /* Configuration of DMAC */
>       dmac_cfg = (GMAC_DCFGR_DRBS(GMAC_RX_BUFFER_SIZE >> 6)) |
> -         GMAC_DCFGR_RXBMS(3) | GMAC_DCFGR_TXPBMS | GMAC_DCFGR_FBLDO_INCR16;
> +         GMAC_DCFGR_RXBMS(3) | GMAC_DCFGR_TXPBMS | GMAC_DCFGR_FBLDO_INCR16 |
> +         GMAC_DCFGR_TXCOEN;
>       GMAC_SetDMAConfig(sc->Gmac_inst.gGmacd.pHw, dmac_cfg, 0);
>  
> +     /* Enable hardware checksum offload for receive */
> +     sc->Gmac_inst.gGmacd.pHw->GMAC_NCFGR |= GMAC_NCFGR_RXCOEN;
> +
>       /* Shut down Transmit and Receive */
>       GMAC_ReceiveEnable(sc->Gmac_inst.gGmacd.pHw, 0);
>       GMAC_TransmitEnable(sc->Gmac_inst.gGmacd.pHw, 0);
> @@ -1461,6 +1489,10 @@ static int if_atsam_driver_attach(device_t dev)
>       ifp->if_ioctl = if_atsam_ioctl;
>       ifp->if_start = if_atsam_enet_start;
>       ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX;
> +     ifp->if_capabilities |= IFCAP_HWCSUM | IFCAP_HWCSUM_IPV6 |
> +         IFCAP_VLAN_HWCSUM;
> +     ifp->if_hwassist = CSUM_IP | CSUM_IP_UDP | CSUM_IP_TCP |
> +         CSUM_IP6_UDP | CSUM_IP6_TCP;
>       IFQ_SET_MAXLEN(&ifp->if_snd, TXBUF_COUNT - 1);
>       ifp->if_snd.ifq_drv_maxlen = TXBUF_COUNT - 1;
>       IFQ_SET_READY(&ifp->if_snd);
> 
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to