spidernet: checksum and ethtool
Subsystems (2)
PATCH 1/1 spidernet: checksum and ethtool
It doesn't look like spidernet hardware can really checksum all protocols, the code looks like it does IPV4 only. If so, it should use NETIF_F_IP_CSUM instead of NETIF_F_HW_CSUM.
The driver doesn't need it's own get/set for ethtool tx csum, and it should use the standard ethtool_op_get_link.
NOT TESTED (no CELL hardware).
--- drivers/net/spider_net.c | 4 ++-- drivers/net/spider_net_ethtool.c | 21 +++------------------ 2 files changed, 5 insertions(+), 20 deletions(-)
drivers/net/spider_net.c +2 -2
@@ -718,7 +718,7 @@ spider_net_prepare_tx_descr(struct spideSPIDER_NET_DESCR_CARDOWNED |SPIDER_NET_DMAC_NOCS ;spin_unlock_irqrestore (&chain->lock, flags); -if (skb->protocol ==htons (ETH_P_IP ) && skb->ip_summed ==CHECKSUM_PARTIAL ) +if (skb->ip_summed ==CHECKSUM_PARTIAL )switch (ip_hdr (skb)->protocol) {case IPPROTO_TCP : hwdescr->dmac_cmd_status |=SPIDER_NET_DMAC_TCP ;
@@ -2225,7 +2225,7 @@ spider_net_setup_netdev(struct spider_nespider_net_setup_netdev_ops (netdev); - netdev->features =NETIF_F_HW_CSUM |NETIF_F_LLTX ; + netdev->features =NETIF_F_IP_CSUM |NETIF_F_LLTX ;/* some time: NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX | * NETIF_F_HW_VLAN_FILTER */
drivers/net/spider_net_ethtool.c +3 -18
@@ -134,22 +134,6 @@ spider_net_ethtool_set_rx_csum(struct nereturn 0 ; } -static uint32_t -spider_net_ethtool_get_tx_csum (struct net_device *netdev) -{ -return (netdev->features &NETIF_F_HW_CSUM ) !=0 ; -} - -static int -spider_net_ethtool_set_tx_csum (struct net_device *netdev,uint32_t data) -{ -if (data) - netdev->features |=NETIF_F_HW_CSUM ; -else - netdev->features &= ~NETIF_F_HW_CSUM ; - -return 0 ; -} static void spider_net_ethtool_get_ringparam(struct net_device *netdev,
@@ -200,11 +184,12 @@ const struct ethtool_ops spider_net_etht .get_wol = spider_net_ethtool_get_wol, .get_msglevel = spider_net_ethtool_get_msglevel, .set_msglevel = spider_net_ethtool_set_msglevel, + .get_link = ethtool_op_get_link, .nway_reset = spider_net_ethtool_nway_reset, .get_rx_csum = spider_net_ethtool_get_rx_csum, .set_rx_csum = spider_net_ethtool_set_rx_csum, - .get_tx_csum = spider_net_ethtool_get_tx_csum, - .set_tx_csum = spider_net_ethtool_set_tx_csum, + .get_tx_csum = ethtool_op_get_tx_csum, + .set_tx_csum = ethtool_op_set_tx_csum, .get_ringparam = spider_net_ethtool_get_ringparam, .get_strings = spider_net_get_strings, .get_stats_count = spider_net_get_stats_count,
Quoted 8 lines · Stephen Hemminger
It doesn't look like spidernet hardware can really checksum all protocols, the code looks like it does IPV4 only. If so, it should use
NETIF_F_IP_CSUMinstead ofNETIF_F_HW_CSUM.The driver doesn't need it's own get/set for ethtool tx csum, and it should use the standard
ethtool_op_get_link.NOT TESTED (no CELL hardware).
It seems to work. I've been distracted with other spidernet issues; I will forward your patch upstream early next week.
--linas
Quoted 6 lines · Stephen Hemminger
It doesn't look like spidernet hardware can really checksum all protocols, the code looks like it does IPV4 only. If so, it should use
NETIF_F_IP_CSUMinstead ofNETIF_F_HW_CSUM.The driver doesn't need it's own get/set for ethtool tx csum, and it should use the standard
ethtool_op_get_link.
Can you provide a signed-off-by line, please? I was hoping to submit upstream today.
--linas
PATCH 1/1 spidernet: checksum and ethtool
It doesn't look like spidernet hardware can really checksum all protocols, the code looks like it does IPV4 only. If so, it should use NETIF_F_IP_CSUM instead of NETIF_F_HW_CSUM.
The driver doesn't need it's own get/set for ethtool tx csum, and it should use the standard ethtool_op_get_link.
--- drivers/net/spider_net.c | 4 ++-- drivers/net/spider_net_ethtool.c | 21 +++------------------ 2 files changed, 5 insertions(+), 20 deletions(-)
drivers/net/spider_net.c +2 -2
@@ -720,7 +720,7 @@ spider_net_prepare_tx_descr(struct spideSPIDER_NET_DESCR_CARDOWNED |SPIDER_NET_DMAC_NOCS ;spin_unlock_irqrestore (&chain->lock, flags); -if (skb->protocol ==htons (ETH_P_IP ) && skb->ip_summed ==CHECKSUM_PARTIAL ) +if (skb->ip_summed ==CHECKSUM_PARTIAL )switch (ip_hdr (skb)->protocol) {case IPPROTO_TCP : hwdescr->dmac_cmd_status |=SPIDER_NET_DMAC_TCP ;
@@ -2246,7 +2246,7 @@ spider_net_setup_netdev(struct spider_nespider_net_setup_netdev_ops (netdev); - netdev->features =NETIF_F_HW_CSUM |NETIF_F_LLTX ; + netdev->features =NETIF_F_IP_CSUM |NETIF_F_LLTX ;/* some time: NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX | * NETIF_F_HW_VLAN_FILTER */
drivers/net/spider_net_ethtool.c +3 -18
@@ -134,22 +134,6 @@ spider_net_ethtool_set_rx_csum(struct nereturn 0 ; } -static uint32_t -spider_net_ethtool_get_tx_csum (struct net_device *netdev) -{ -return (netdev->features &NETIF_F_HW_CSUM ) !=0 ; -} - -static int -spider_net_ethtool_set_tx_csum (struct net_device *netdev,uint32_t data) -{ -if (data) - netdev->features |=NETIF_F_HW_CSUM ; -else - netdev->features &= ~NETIF_F_HW_CSUM ; - -return 0 ; -} static void spider_net_ethtool_get_ringparam(struct net_device *netdev,
@@ -200,11 +184,12 @@ const struct ethtool_ops spider_net_etht .get_wol = spider_net_ethtool_get_wol, .get_msglevel = spider_net_ethtool_get_msglevel, .set_msglevel = spider_net_ethtool_set_msglevel, + .get_link = ethtool_op_get_link, .nway_reset = spider_net_ethtool_nway_reset, .get_rx_csum = spider_net_ethtool_get_rx_csum, .set_rx_csum = spider_net_ethtool_set_rx_csum, - .get_tx_csum = spider_net_ethtool_get_tx_csum, - .set_tx_csum = spider_net_ethtool_set_tx_csum, + .get_tx_csum = ethtool_op_get_tx_csum, + .set_tx_csum = ethtool_op_set_tx_csum, .get_ringparam = spider_net_ethtool_get_ringparam, .get_strings = spider_net_get_strings, .get_stats_count = spider_net_get_stats_count,