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. Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org> Signed-off-by: Linas Vepstas <linas@austin.ibm.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
Родитель
128c6e2e51
Коммит
3a2c892daa
|
@ -718,7 +718,7 @@ spider_net_prepare_tx_descr(struct spider_net_card *card,
|
|||
SPIDER_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;
|
||||
|
@ -2260,7 +2260,7 @@ spider_net_setup_netdev(struct spider_net_card *card)
|
|||
|
||||
spider_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 */
|
||||
|
||||
|
|
|
@ -134,22 +134,6 @@ spider_net_ethtool_set_rx_csum(struct net_device *netdev, u32 n)
|
|||
return 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_ethtool_ops = {
|
|||
.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,
|
||||
|
|
Загрузка…
Ссылка в новой задаче