mirror of
https://github.com/torvalds/linux.git
synced 2024-12-19 09:32:32 +00:00
s390/qeth: add IPv6 RX checksum offload support
Check if a qeth device supports IPv6 RX checksum offload, and hook it up into the existing NETIF_F_RXCSUM support. As NETIF_F_RXCSUM is now backed by a combination of HW Assists, we need to be a little smarter when dealing with errors during a configuration change: - switching on NETIF_F_RXCSUM only makes sense if at least one HW Assist was enabled successfully. - for switching off NETIF_F_RXCSUM, all available HW Assists need to be deactivated. Signed-off-by: Kittipon Meesompop <kmeesomp@linux.vnet.ibm.com> Signed-off-by: Julian Wiedmann <jwi@linux.vnet.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
571f9dd802
commit
d7e6ed97b5
@ -6430,6 +6430,29 @@ static int qeth_set_ipa_tso(struct qeth_card *card, int on)
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int qeth_set_ipa_rx_csum(struct qeth_card *card, bool on)
|
||||
{
|
||||
int rc_ipv4 = (on) ? -EOPNOTSUPP : 0;
|
||||
int rc_ipv6;
|
||||
|
||||
if (qeth_is_supported(card, IPA_INBOUND_CHECKSUM))
|
||||
rc_ipv4 = qeth_set_ipa_csum(card, on, IPA_INBOUND_CHECKSUM,
|
||||
QETH_PROT_IPV4);
|
||||
if (!qeth_is_supported6(card, IPA_INBOUND_CHECKSUM_V6))
|
||||
/* no/one Offload Assist available, so the rc is trivial */
|
||||
return rc_ipv4;
|
||||
|
||||
rc_ipv6 = qeth_set_ipa_csum(card, on, IPA_INBOUND_CHECKSUM,
|
||||
QETH_PROT_IPV6);
|
||||
|
||||
if (on)
|
||||
/* enable: success if any Assist is active */
|
||||
return (rc_ipv6) ? rc_ipv4 : 0;
|
||||
|
||||
/* disable: failure if any Assist is still active */
|
||||
return (rc_ipv6) ? rc_ipv6 : rc_ipv4;
|
||||
}
|
||||
|
||||
#define QETH_HW_FEATURES (NETIF_F_RXCSUM | NETIF_F_IP_CSUM | NETIF_F_TSO | \
|
||||
NETIF_F_IPV6_CSUM)
|
||||
/**
|
||||
@ -6477,9 +6500,8 @@ int qeth_set_features(struct net_device *dev, netdev_features_t features)
|
||||
if (rc)
|
||||
changed ^= NETIF_F_IPV6_CSUM;
|
||||
}
|
||||
if ((changed & NETIF_F_RXCSUM)) {
|
||||
rc = qeth_set_ipa_csum(card, features & NETIF_F_RXCSUM,
|
||||
IPA_INBOUND_CHECKSUM, QETH_PROT_IPV4);
|
||||
if (changed & NETIF_F_RXCSUM) {
|
||||
rc = qeth_set_ipa_rx_csum(card, features & NETIF_F_RXCSUM);
|
||||
if (rc)
|
||||
changed ^= NETIF_F_RXCSUM;
|
||||
}
|
||||
@ -6508,7 +6530,8 @@ netdev_features_t qeth_fix_features(struct net_device *dev,
|
||||
features &= ~NETIF_F_IP_CSUM;
|
||||
if (!qeth_is_supported6(card, IPA_OUTBOUND_CHECKSUM_V6))
|
||||
features &= ~NETIF_F_IPV6_CSUM;
|
||||
if (!qeth_is_supported(card, IPA_INBOUND_CHECKSUM))
|
||||
if (!qeth_is_supported(card, IPA_INBOUND_CHECKSUM) &&
|
||||
!qeth_is_supported6(card, IPA_INBOUND_CHECKSUM_V6))
|
||||
features &= ~NETIF_F_RXCSUM;
|
||||
if (!qeth_is_supported(card, IPA_OUTBOUND_TSO))
|
||||
features &= ~NETIF_F_TSO;
|
||||
|
@ -246,6 +246,7 @@ enum qeth_ipa_funcs {
|
||||
IPA_QUERY_ARP_ASSIST = 0x00040000L,
|
||||
IPA_INBOUND_TSO = 0x00080000L,
|
||||
IPA_OUTBOUND_TSO = 0x00100000L,
|
||||
IPA_INBOUND_CHECKSUM_V6 = 0x00400000L,
|
||||
IPA_OUTBOUND_CHECKSUM_V6 = 0x00800000L,
|
||||
};
|
||||
|
||||
|
@ -992,15 +992,16 @@ static int qeth_l2_setup_netdev(struct qeth_card *card)
|
||||
card->dev->hw_features |= NETIF_F_IP_CSUM;
|
||||
card->dev->vlan_features |= NETIF_F_IP_CSUM;
|
||||
}
|
||||
if (qeth_is_supported(card, IPA_INBOUND_CHECKSUM)) {
|
||||
card->dev->hw_features |= NETIF_F_RXCSUM;
|
||||
card->dev->vlan_features |= NETIF_F_RXCSUM;
|
||||
}
|
||||
}
|
||||
if (qeth_is_supported6(card, IPA_OUTBOUND_CHECKSUM_V6)) {
|
||||
card->dev->hw_features |= NETIF_F_IPV6_CSUM;
|
||||
card->dev->vlan_features |= NETIF_F_IPV6_CSUM;
|
||||
}
|
||||
if (qeth_is_supported(card, IPA_INBOUND_CHECKSUM) ||
|
||||
qeth_is_supported6(card, IPA_INBOUND_CHECKSUM_V6)) {
|
||||
card->dev->hw_features |= NETIF_F_RXCSUM;
|
||||
card->dev->vlan_features |= NETIF_F_RXCSUM;
|
||||
}
|
||||
|
||||
card->info.broadcast_capable = 1;
|
||||
qeth_l2_request_initial_mac(card);
|
||||
|
Loading…
Reference in New Issue
Block a user