efx->rx_packet_len_offset =
                ES_DZ_RX_PREFIX_PKTLEN_OFST - ES_DZ_RX_PREFIX_SIZE;
 
+       if (nic_data->datapath_caps &
+           (1 << MC_CMD_GET_CAPABILITIES_OUT_RX_INCLUDE_FCS_LBN))
+               efx->net_dev->hw_features |= NETIF_F_RXFCS;
+
        rc = efx_mcdi_port_get_number(efx);
        if (rc < 0)
                goto fail5;
                                           const efx_qword_t *event)
 {
        struct efx_nic *efx = channel->efx;
+       bool handled = false;
 
        if (EFX_QWORD_FIELD(*event, ESF_DZ_RX_ECRC_ERR)) {
-               if (!efx->loopback_selftest)
-                       channel->n_rx_eth_crc_err += n_packets;
-               return EFX_RX_PKT_DISCARD;
+               if (!(efx->net_dev->features & NETIF_F_RXALL)) {
+                       if (!efx->loopback_selftest)
+                               channel->n_rx_eth_crc_err += n_packets;
+                       return EFX_RX_PKT_DISCARD;
+               }
+               handled = true;
        }
        if (EFX_QWORD_FIELD(*event, ESF_DZ_RX_IPCKSUM_ERR)) {
                if (unlikely(rx_encap_hdr != ESE_EZ_ENCAP_HDR_VXLAN &&
                return 0;
        }
 
-       WARN_ON(1); /* No error bits were recognised */
+       WARN_ON(!handled); /* No error bits were recognised */
        return 0;
 }
 
 
                        return rc;
        }
 
-       /* If Rx VLAN filter is changed, update filters via mac_reconfigure */
-       if ((net_dev->features ^ data) & NETIF_F_HW_VLAN_CTAG_FILTER) {
+       /* If Rx VLAN filter is changed, update filters via mac_reconfigure.
+        * If rx-fcs is changed, mac_reconfigure updates that too.
+        */
+       if ((net_dev->features ^ data) & (NETIF_F_HW_VLAN_CTAG_FILTER |
+                                         NETIF_F_RXFCS)) {
                /* efx_set_rx_mode() will schedule MAC work to update filters
                 * when a new features are finally set in net_dev.
                 */
 
        /* Determine netdevice features */
        net_dev->features |= (efx->type->offload_features | NETIF_F_SG |
-                             NETIF_F_TSO | NETIF_F_RXCSUM);
+                             NETIF_F_TSO | NETIF_F_RXCSUM | NETIF_F_RXALL);
        if (efx->type->offload_features & (NETIF_F_IPV6_CSUM | NETIF_F_HW_CSUM))
                net_dev->features |= NETIF_F_TSO6;
        /* Check whether device supports TSO */
                                   NETIF_F_HIGHDMA | NETIF_F_ALL_TSO |
                                   NETIF_F_RXCSUM);
 
-       net_dev->hw_features = net_dev->features & ~efx->fixed_features;
+       net_dev->hw_features |= net_dev->features & ~efx->fixed_features;
+
+       /* Disable receiving frames with bad FCS, by default. */
+       net_dev->features &= ~NETIF_F_RXALL;
 
        /* Disable VLAN filtering by default.  It may be enforced if
         * the feature is fixed (i.e. VLAN filters are required to
 
        }
 #endif
 
+       if (efx->net_dev->features & NETIF_F_RXALL)
+               /* don't discard frame for CRC error */
+               rx_ev_eth_crc_err = false;
+
        /* The frame must be discarded if any of these are true. */
        return (rx_ev_eth_crc_err | rx_ev_frm_trunc |
                rx_ev_tobe_disc | rx_ev_pause_frm) ?
 
        MCDI_POPULATE_DWORD_1(cmdbytes, SET_MAC_IN_REJECT,
                              SET_MAC_IN_REJECT_UNCST, efx->unicast_filter);
 
+       MCDI_POPULATE_DWORD_1(cmdbytes, SET_MAC_IN_FLAGS,
+                             SET_MAC_IN_FLAG_INCLUDE_FCS,
+                             !!(efx->net_dev->features & NETIF_F_RXFCS));
+
        switch (efx->wanted_fc) {
        case EFX_FC_RX | EFX_FC_TX:
                fcntl = MC_CMD_FCNTL_BIDIR;