|
@@ -433,8 +433,8 @@ static const struct gmac_max_framelen gmac_maxlens[] = {
|
|
|
.val = CONFIG0_MAXLEN_1536,
|
|
|
},
|
|
|
{
|
|
|
- .max_l3_len = 1542,
|
|
|
- .val = CONFIG0_MAXLEN_1542,
|
|
|
+ .max_l3_len = 1548,
|
|
|
+ .val = CONFIG0_MAXLEN_1548,
|
|
|
},
|
|
|
{
|
|
|
.max_l3_len = 9212,
|
|
@@ -1146,6 +1146,7 @@ static int gmac_map_tx_bufs(struct net_device *netdev, struct sk_buff *skb,
|
|
|
dma_addr_t mapping;
|
|
|
unsigned short mtu;
|
|
|
void *buffer;
|
|
|
+ int ret;
|
|
|
|
|
|
mtu = ETH_HLEN;
|
|
|
mtu += netdev->mtu;
|
|
@@ -1160,9 +1161,30 @@ static int gmac_map_tx_bufs(struct net_device *netdev, struct sk_buff *skb,
|
|
|
word3 |= mtu;
|
|
|
}
|
|
|
|
|
|
- if (skb->ip_summed != CHECKSUM_NONE) {
|
|
|
+ if (skb->len >= ETH_FRAME_LEN) {
|
|
|
+ /* Hardware offloaded checksumming isn't working on frames
|
|
|
+ * bigger than 1514 bytes. A hypothesis about this is that the
|
|
|
+ * checksum buffer is only 1518 bytes, so when the frames get
|
|
|
+ * bigger they get truncated, or the last few bytes get
|
|
|
+ * overwritten by the FCS.
|
|
|
+ *
|
|
|
+ * Just use software checksumming and bypass on bigger frames.
|
|
|
+ */
|
|
|
+ if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
|
|
+ ret = skb_checksum_help(skb);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ word1 |= TSS_BYPASS_BIT;
|
|
|
+ } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
|
|
int tcp = 0;
|
|
|
|
|
|
+ /* We do not switch off the checksumming on non TCP/UDP
|
|
|
+ * frames: as is shown from tests, the checksumming engine
|
|
|
+ * is smart enough to see that a frame is not actually TCP
|
|
|
+ * or UDP and then just pass it through without any changes
|
|
|
+ * to the frame.
|
|
|
+ */
|
|
|
if (skb->protocol == htons(ETH_P_IP)) {
|
|
|
word1 |= TSS_IP_CHKSUM_BIT;
|
|
|
tcp = ip_hdr(skb)->protocol == IPPROTO_TCP;
|
|
@@ -1979,15 +2001,6 @@ static int gmac_change_mtu(struct net_device *netdev, int new_mtu)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static netdev_features_t gmac_fix_features(struct net_device *netdev,
|
|
|
- netdev_features_t features)
|
|
|
-{
|
|
|
- if (netdev->mtu + ETH_HLEN + VLAN_HLEN > MTU_SIZE_BIT_MASK)
|
|
|
- features &= ~GMAC_OFFLOAD_FEATURES;
|
|
|
-
|
|
|
- return features;
|
|
|
-}
|
|
|
-
|
|
|
static int gmac_set_features(struct net_device *netdev,
|
|
|
netdev_features_t features)
|
|
|
{
|
|
@@ -2205,7 +2218,6 @@ static const struct net_device_ops gmac_351x_ops = {
|
|
|
.ndo_set_mac_address = gmac_set_mac_address,
|
|
|
.ndo_get_stats64 = gmac_get_stats64,
|
|
|
.ndo_change_mtu = gmac_change_mtu,
|
|
|
- .ndo_fix_features = gmac_fix_features,
|
|
|
.ndo_set_features = gmac_set_features,
|
|
|
};
|
|
|
|
|
@@ -2463,11 +2475,12 @@ static int gemini_ethernet_port_probe(struct platform_device *pdev)
|
|
|
|
|
|
netdev->hw_features = GMAC_OFFLOAD_FEATURES;
|
|
|
netdev->features |= GMAC_OFFLOAD_FEATURES | NETIF_F_GRO;
|
|
|
- /* We can handle jumbo frames up to 10236 bytes so, let's accept
|
|
|
- * payloads of 10236 bytes minus VLAN and ethernet header
|
|
|
+ /* We can receive jumbo frames up to 10236 bytes but only
|
|
|
+ * transmit 2047 bytes so, let's accept payloads of 2047
|
|
|
+ * bytes minus VLAN and ethernet header
|
|
|
*/
|
|
|
netdev->min_mtu = ETH_MIN_MTU;
|
|
|
- netdev->max_mtu = 10236 - VLAN_ETH_HLEN;
|
|
|
+ netdev->max_mtu = MTU_SIZE_BIT_MASK - VLAN_ETH_HLEN;
|
|
|
|
|
|
port->freeq_refill = 0;
|
|
|
netif_napi_add(netdev, &port->napi, gmac_napi_poll,
|