diff options
author | shemminger@osdl.org <shemminger@osdl.org> | 2005-11-24 01:00:52 -0500 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-12-01 02:22:52 -0500 |
commit | 09f5a214389fe467c2ff15aa2b85349bbde15bce (patch) | |
tree | 3d7929315ebcc558d11fd312796a5c2e99731af3 /drivers/net | |
parent | e9022ee6c348d41cb62c55e15a9711f7a96f2399 (diff) |
[PATCH] sk98lin: allow ethtool checksum on/off per port
Allow control of checksumming parameters via ethtool.
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/sk98lin/h/skdrv2nd.h | 1 | ||||
-rw-r--r-- | drivers/net/sk98lin/skethtool.c | 48 | ||||
-rw-r--r-- | drivers/net/sk98lin/skge.c | 66 |
3 files changed, 79 insertions, 36 deletions
diff --git a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h index 9bdfde80c30b..0ebafc885705 100644 --- a/drivers/net/sk98lin/h/skdrv2nd.h +++ b/drivers/net/sk98lin/h/skdrv2nd.h | |||
@@ -297,6 +297,7 @@ struct s_RxPort { | |||
297 | RXD *pRxdRingTail; /* Tail of Rx rings */ | 297 | RXD *pRxdRingTail; /* Tail of Rx rings */ |
298 | RXD *pRxdRingPrev; /* descriptor given to BMU previously */ | 298 | RXD *pRxdRingPrev; /* descriptor given to BMU previously */ |
299 | int RxdRingFree; /* # of free entrys */ | 299 | int RxdRingFree; /* # of free entrys */ |
300 | int RxCsum; /* use receive checksum hardware */ | ||
300 | spinlock_t RxDesRingLock; /* serialize descriptor accesses */ | 301 | spinlock_t RxDesRingLock; /* serialize descriptor accesses */ |
301 | int RxFillLimit; /* limit for buffers in ring */ | 302 | int RxFillLimit; /* limit for buffers in ring */ |
302 | SK_IOC HwAddr; /* bmu registers address */ | 303 | SK_IOC HwAddr; /* bmu registers address */ |
diff --git a/drivers/net/sk98lin/skethtool.c b/drivers/net/sk98lin/skethtool.c index b71769ae4603..4265ed91a9c4 100644 --- a/drivers/net/sk98lin/skethtool.c +++ b/drivers/net/sk98lin/skethtool.c | |||
@@ -539,6 +539,48 @@ static int setPauseParams(struct net_device *dev , struct ethtool_pauseparam *ep | |||
539 | return ret ? -EIO : 0; | 539 | return ret ? -EIO : 0; |
540 | } | 540 | } |
541 | 541 | ||
542 | /* Only Yukon supports checksum offload. */ | ||
543 | static int setScatterGather(struct net_device *dev, u32 data) | ||
544 | { | ||
545 | DEV_NET *pNet = netdev_priv(dev); | ||
546 | SK_AC *pAC = pNet->pAC; | ||
547 | |||
548 | if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) | ||
549 | return -EOPNOTSUPP; | ||
550 | return ethtool_op_set_sg(dev, data); | ||
551 | } | ||
552 | |||
553 | static int setTxCsum(struct net_device *dev, u32 data) | ||
554 | { | ||
555 | DEV_NET *pNet = netdev_priv(dev); | ||
556 | SK_AC *pAC = pNet->pAC; | ||
557 | |||
558 | if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) | ||
559 | return -EOPNOTSUPP; | ||
560 | |||
561 | return ethtool_op_set_tx_csum(dev, data); | ||
562 | } | ||
563 | |||
564 | static u32 getRxCsum(struct net_device *dev) | ||
565 | { | ||
566 | DEV_NET *pNet = netdev_priv(dev); | ||
567 | SK_AC *pAC = pNet->pAC; | ||
568 | |||
569 | return pAC->RxPort[pNet->PortNr].RxCsum; | ||
570 | } | ||
571 | |||
572 | static int setRxCsum(struct net_device *dev, u32 data) | ||
573 | { | ||
574 | DEV_NET *pNet = netdev_priv(dev); | ||
575 | SK_AC *pAC = pNet->pAC; | ||
576 | |||
577 | if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) | ||
578 | return -EOPNOTSUPP; | ||
579 | |||
580 | pAC->RxPort[pNet->PortNr].RxCsum = data != 0; | ||
581 | return 0; | ||
582 | } | ||
583 | |||
542 | struct ethtool_ops SkGeEthtoolOps = { | 584 | struct ethtool_ops SkGeEthtoolOps = { |
543 | .get_settings = getSettings, | 585 | .get_settings = getSettings, |
544 | .set_settings = setSettings, | 586 | .set_settings = setSettings, |
@@ -551,4 +593,10 @@ struct ethtool_ops SkGeEthtoolOps = { | |||
551 | .set_pauseparam = setPauseParams, | 593 | .set_pauseparam = setPauseParams, |
552 | .get_link = ethtool_op_get_link, | 594 | .get_link = ethtool_op_get_link, |
553 | .get_perm_addr = ethtool_op_get_perm_addr, | 595 | .get_perm_addr = ethtool_op_get_perm_addr, |
596 | .get_sg = ethtool_op_get_sg, | ||
597 | .set_sg = setScatterGather, | ||
598 | .get_tx_csum = ethtool_op_get_tx_csum, | ||
599 | .set_tx_csum = setTxCsum, | ||
600 | .get_rx_csum = getRxCsum, | ||
601 | .set_rx_csum = setRxCsum, | ||
554 | }; | 602 | }; |
diff --git a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c index 107c5d97546c..02143fa3ee5b 100644 --- a/drivers/net/sk98lin/skge.c +++ b/drivers/net/sk98lin/skge.c | |||
@@ -2189,13 +2189,10 @@ rx_start: | |||
2189 | skb_put(pMsg, FrameLength); | 2189 | skb_put(pMsg, FrameLength); |
2190 | } /* frame > SK_COPY_TRESHOLD */ | 2190 | } /* frame > SK_COPY_TRESHOLD */ |
2191 | 2191 | ||
2192 | #ifdef USE_SK_RX_CHECKSUM | 2192 | if (pRxPort->RxCsum) { |
2193 | pMsg->csum = pRxd->TcpSums; | 2193 | pMsg->csum = pRxd->TcpSums; |
2194 | pMsg->ip_summed = CHECKSUM_HW; | 2194 | pMsg->ip_summed = CHECKSUM_HW; |
2195 | #else | 2195 | } |
2196 | pMsg->ip_summed = CHECKSUM_NONE; | ||
2197 | #endif | ||
2198 | |||
2199 | 2196 | ||
2200 | SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 1,("V")); | 2197 | SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 1,("V")); |
2201 | ForRlmt = SK_RLMT_RX_PROTOCOL; | 2198 | ForRlmt = SK_RLMT_RX_PROTOCOL; |
@@ -4149,6 +4146,7 @@ SK_BOOL DualNet; | |||
4149 | Flags); | 4146 | Flags); |
4150 | break; | 4147 | break; |
4151 | case SK_DRV_NET_UP: /* SK_U32 PortIdx */ | 4148 | case SK_DRV_NET_UP: /* SK_U32 PortIdx */ |
4149 | { struct net_device *dev = pAC->dev[Param.Para32[0]]; | ||
4152 | /* action list 5 */ | 4150 | /* action list 5 */ |
4153 | FromPort = Param.Para32[0]; | 4151 | FromPort = Param.Para32[0]; |
4154 | SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT, | 4152 | SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT, |
@@ -4232,22 +4230,12 @@ SK_BOOL DualNet; | |||
4232 | printk(" irq moderation: disabled\n"); | 4230 | printk(" irq moderation: disabled\n"); |
4233 | 4231 | ||
4234 | 4232 | ||
4235 | #ifdef SK_ZEROCOPY | 4233 | printk(" scatter-gather: %s\n", |
4236 | if (pAC->ChipsetType) | 4234 | (dev->features & NETIF_F_SG) ? "enabled" : "disabled"); |
4237 | #ifdef USE_SK_TX_CHECKSUM | 4235 | printk(" tx-checksum: %s\n", |
4238 | printk(" scatter-gather: enabled\n"); | 4236 | (dev->features & NETIF_F_IP_CSUM) ? "enabled" : "disabled"); |
4239 | #else | 4237 | printk(" rx-checksum: %s\n", |
4240 | printk(" tx-checksum: disabled\n"); | 4238 | pAC->RxPort[Param.Para32[0]].RxCsum ? "enabled" : "disabled"); |
4241 | #endif | ||
4242 | else | ||
4243 | printk(" scatter-gather: disabled\n"); | ||
4244 | #else | ||
4245 | printk(" scatter-gather: disabled\n"); | ||
4246 | #endif | ||
4247 | |||
4248 | #ifndef USE_SK_RX_CHECKSUM | ||
4249 | printk(" rx-checksum: disabled\n"); | ||
4250 | #endif | ||
4251 | 4239 | ||
4252 | } else { | 4240 | } else { |
4253 | DoPrintInterfaceChange = SK_TRUE; | 4241 | DoPrintInterfaceChange = SK_TRUE; |
@@ -4262,9 +4250,9 @@ SK_BOOL DualNet; | |||
4262 | } | 4250 | } |
4263 | 4251 | ||
4264 | /* Inform the world that link protocol is up. */ | 4252 | /* Inform the world that link protocol is up. */ |
4265 | netif_carrier_on(pAC->dev[Param.Para32[0]]); | 4253 | netif_carrier_on(dev); |
4266 | |||
4267 | break; | 4254 | break; |
4255 | } | ||
4268 | case SK_DRV_NET_DOWN: /* SK_U32 Reason */ | 4256 | case SK_DRV_NET_DOWN: /* SK_U32 Reason */ |
4269 | /* action list 7 */ | 4257 | /* action list 7 */ |
4270 | SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT, | 4258 | SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT, |
@@ -4871,15 +4859,18 @@ static int __devinit skge_probe_one(struct pci_dev *pdev, | |||
4871 | SET_NETDEV_DEV(dev, &pdev->dev); | 4859 | SET_NETDEV_DEV(dev, &pdev->dev); |
4872 | SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps); | 4860 | SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps); |
4873 | 4861 | ||
4874 | #ifdef SK_ZEROCOPY | 4862 | /* Use only if yukon hardware */ |
4875 | #ifdef USE_SK_TX_CHECKSUM | ||
4876 | if (pAC->ChipsetType) { | 4863 | if (pAC->ChipsetType) { |
4877 | /* Use only if yukon hardware */ | 4864 | #ifdef USE_SK_TX_CHECKSUM |
4878 | /* SK and ZEROCOPY - fly baby... */ | 4865 | dev->features |= NETIF_F_IP_CSUM; |
4879 | dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; | ||
4880 | } | ||
4881 | #endif | 4866 | #endif |
4867 | #ifdef SK_ZEROCOPY | ||
4868 | dev->features |= NETIF_F_SG; | ||
4869 | #endif | ||
4870 | #ifdef USE_SK_RX_CHECKSUM | ||
4871 | pAC->RxPort[0].RxCsum = 1; | ||
4882 | #endif | 4872 | #endif |
4873 | } | ||
4883 | 4874 | ||
4884 | pAC->Index = boards_found++; | 4875 | pAC->Index = boards_found++; |
4885 | 4876 | ||
@@ -4944,14 +4935,17 @@ static int __devinit skge_probe_one(struct pci_dev *pdev, | |||
4944 | SET_NETDEV_DEV(dev, &pdev->dev); | 4935 | SET_NETDEV_DEV(dev, &pdev->dev); |
4945 | SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps); | 4936 | SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps); |
4946 | 4937 | ||
4947 | #ifdef SK_ZEROCOPY | ||
4948 | #ifdef USE_SK_TX_CHECKSUM | ||
4949 | if (pAC->ChipsetType) { | 4938 | if (pAC->ChipsetType) { |
4950 | /* SG and ZEROCOPY - fly baby... */ | 4939 | #ifdef USE_SK_TX_CHECKSUM |
4951 | dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; | 4940 | dev->features |= NETIF_F_IP_CSUM; |
4952 | } | ||
4953 | #endif | 4941 | #endif |
4942 | #ifdef SK_ZEROCOPY | ||
4943 | dev->features |= NETIF_F_SG; | ||
4944 | #endif | ||
4945 | #ifdef USE_SK_RX_CHECKSUM | ||
4946 | pAC->RxPort[1].RxCsum = 1; | ||
4954 | #endif | 4947 | #endif |
4948 | } | ||
4955 | 4949 | ||
4956 | if (register_netdev(dev)) { | 4950 | if (register_netdev(dev)) { |
4957 | printk(KERN_ERR "sk98lin: Could not register device for seconf port.\n"); | 4951 | printk(KERN_ERR "sk98lin: Could not register device for seconf port.\n"); |