patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / net / core / ethtool.c
index 9925b81..d996db7 100644 (file)
@@ -650,8 +650,9 @@ static int ethtool_get_stats(struct net_device *dev, void __user *useraddr)
 int dev_ethtool(struct ifreq *ifr)
 {
        struct net_device *dev = __dev_get_by_name(ifr->ifr_name);
-       void __user *useraddr = (void __user *) ifr->ifr_data;
+       void __user *useraddr = ifr->ifr_data;
        u32 ethcmd;
+       int rc;
 
        /*
         * XXX: This can be pushed down into the ethtool_* handlers that
@@ -669,70 +670,109 @@ int dev_ethtool(struct ifreq *ifr)
        if (copy_from_user(&ethcmd, useraddr, sizeof (ethcmd)))
                return -EFAULT;
 
+       if(dev->ethtool_ops->begin)
+               if ((rc = dev->ethtool_ops->begin(dev)) < 0)
+                       return rc;
+
        switch (ethcmd) {
        case ETHTOOL_GSET:
-               return ethtool_get_settings(dev, useraddr);
+               rc = ethtool_get_settings(dev, useraddr);
+               break;
        case ETHTOOL_SSET:
-               return ethtool_set_settings(dev, useraddr);
+               rc = ethtool_set_settings(dev, useraddr);
+               break;
        case ETHTOOL_GDRVINFO:
-               return ethtool_get_drvinfo(dev, useraddr);
+               rc = ethtool_get_drvinfo(dev, useraddr);
+
+               break;
        case ETHTOOL_GREGS:
-               return ethtool_get_regs(dev, useraddr);
+               rc = ethtool_get_regs(dev, useraddr);
+               break;
        case ETHTOOL_GWOL:
-               return ethtool_get_wol(dev, useraddr);
+               rc = ethtool_get_wol(dev, useraddr);
+               break;
        case ETHTOOL_SWOL:
-               return ethtool_set_wol(dev, useraddr);
+               rc = ethtool_set_wol(dev, useraddr);
+               break;
        case ETHTOOL_GMSGLVL:
-               return ethtool_get_msglevel(dev, useraddr);
+               rc = ethtool_get_msglevel(dev, useraddr);
+               break;
        case ETHTOOL_SMSGLVL:
-               return ethtool_set_msglevel(dev, useraddr);
+               rc = ethtool_set_msglevel(dev, useraddr);
+               break;
        case ETHTOOL_NWAY_RST:
-               return ethtool_nway_reset(dev);
+               rc = ethtool_nway_reset(dev);
+               break;
        case ETHTOOL_GLINK:
-               return ethtool_get_link(dev, useraddr);
+               rc = ethtool_get_link(dev, useraddr);
+               break;
        case ETHTOOL_GEEPROM:
-               return ethtool_get_eeprom(dev, useraddr);
+               rc = ethtool_get_eeprom(dev, useraddr);
+               break;
        case ETHTOOL_SEEPROM:
-               return ethtool_set_eeprom(dev, useraddr);
+               rc = ethtool_set_eeprom(dev, useraddr);
+               break;
        case ETHTOOL_GCOALESCE:
-               return ethtool_get_coalesce(dev, useraddr);
+               rc = ethtool_get_coalesce(dev, useraddr);
+               break;
        case ETHTOOL_SCOALESCE:
-               return ethtool_set_coalesce(dev, useraddr);
+               rc = ethtool_set_coalesce(dev, useraddr);
+               break;
        case ETHTOOL_GRINGPARAM:
-               return ethtool_get_ringparam(dev, useraddr);
+               rc = ethtool_get_ringparam(dev, useraddr);
+               break;
        case ETHTOOL_SRINGPARAM:
-               return ethtool_set_ringparam(dev, useraddr);
+               rc = ethtool_set_ringparam(dev, useraddr);
+               break;
        case ETHTOOL_GPAUSEPARAM:
-               return ethtool_get_pauseparam(dev, useraddr);
+               rc = ethtool_get_pauseparam(dev, useraddr);
+               break;
        case ETHTOOL_SPAUSEPARAM:
-               return ethtool_set_pauseparam(dev, useraddr);
+               rc = ethtool_set_pauseparam(dev, useraddr);
+               break;
        case ETHTOOL_GRXCSUM:
-               return ethtool_get_rx_csum(dev, useraddr);
+               rc = ethtool_get_rx_csum(dev, useraddr);
+               break;
        case ETHTOOL_SRXCSUM:
-               return ethtool_set_rx_csum(dev, useraddr);
+               rc = ethtool_set_rx_csum(dev, useraddr);
+               break;
        case ETHTOOL_GTXCSUM:
-               return ethtool_get_tx_csum(dev, useraddr);
+               rc = ethtool_get_tx_csum(dev, useraddr);
+               break;
        case ETHTOOL_STXCSUM:
-               return ethtool_set_tx_csum(dev, useraddr);
+               rc = ethtool_set_tx_csum(dev, useraddr);
+               break;
        case ETHTOOL_GSG:
-               return ethtool_get_sg(dev, useraddr);
+               rc = ethtool_get_sg(dev, useraddr);
+               break;
        case ETHTOOL_SSG:
-               return ethtool_set_sg(dev, useraddr);
+               rc = ethtool_set_sg(dev, useraddr);
+               break;
        case ETHTOOL_GTSO:
-               return ethtool_get_tso(dev, useraddr);
+               rc = ethtool_get_tso(dev, useraddr);
+               break;
        case ETHTOOL_STSO:
-               return ethtool_set_tso(dev, useraddr);
+               rc = ethtool_set_tso(dev, useraddr);
+               break;
        case ETHTOOL_TEST:
-               return ethtool_self_test(dev, useraddr);
+               rc = ethtool_self_test(dev, useraddr);
+               break;
        case ETHTOOL_GSTRINGS:
-               return ethtool_get_strings(dev, useraddr);
+               rc = ethtool_get_strings(dev, useraddr);
+               break;
        case ETHTOOL_PHYS_ID:
-               return ethtool_phys_id(dev, useraddr);
+               rc = ethtool_phys_id(dev, useraddr);
+               break;
        case ETHTOOL_GSTATS:
-               return ethtool_get_stats(dev, useraddr);
+               rc = ethtool_get_stats(dev, useraddr);
+               break;
        default:
-               return -EOPNOTSUPP;
+               rc =  -EOPNOTSUPP;
        }
+       
+       if(dev->ethtool_ops->complete)
+               dev->ethtool_ops->complete(dev);
+       return rc;
 
  ioctl:
        if (dev->do_ioctl)