]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/net/s2io.c
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
[karo-tx-linux.git] / drivers / net / s2io.c
index 337bdcd5abc91227ca95bdf7ae63d8ca8f4e3c5c..ca8e75e9a7ee3282f2cad2ccfb0396cc1c7efae3 100644 (file)
@@ -5484,83 +5484,79 @@ static void s2io_ethtool_gregs(struct net_device *dev,
        }
 }
 
-/**
- *  s2io_phy_id  - timer function that alternates adapter LED.
- *  @data : address of the private member of the device structure, which
- *  is a pointer to the s2io_nic structure, provided as an u32.
- * Description: This is actually the timer function that alternates the
- * adapter LED bit of the adapter control bit to set/reset every time on
- * invocation. The timer is set for 1/2 a second, hence tha NIC blinks
- *  once every second.
+/*
+ *  s2io_set_led - control NIC led
  */
-static void s2io_phy_id(unsigned long data)
+static void s2io_set_led(struct s2io_nic *sp, bool on)
 {
-       struct s2io_nic *sp = (struct s2io_nic *)data;
        struct XENA_dev_config __iomem *bar0 = sp->bar0;
-       u64 val64 = 0;
-       u16 subid;
+       u16 subid = sp->pdev->subsystem_device;
+       u64 val64;
 
-       subid = sp->pdev->subsystem_device;
        if ((sp->device_type == XFRAME_II_DEVICE) ||
            ((subid & 0xFF) >= 0x07)) {
                val64 = readq(&bar0->gpio_control);
-               val64 ^= GPIO_CTRL_GPIO_0;
+               if (on)
+                       val64 |= GPIO_CTRL_GPIO_0;
+               else
+                       val64 &= ~GPIO_CTRL_GPIO_0;
+
                writeq(val64, &bar0->gpio_control);
        } else {
                val64 = readq(&bar0->adapter_control);
-               val64 ^= ADAPTER_LED_ON;
+               if (on)
+                       val64 |= ADAPTER_LED_ON;
+               else
+                       val64 &= ~ADAPTER_LED_ON;
+
                writeq(val64, &bar0->adapter_control);
        }
 
-       mod_timer(&sp->id_timer, jiffies + HZ / 2);
 }
 
 /**
- * s2io_ethtool_idnic - To physically identify the nic on the system.
- * @sp : private member of the device structure, which is a pointer to the
- * s2io_nic structure.
- * @id : pointer to the structure with identification parameters given by
- * ethtool.
+ * s2io_ethtool_set_led - To physically identify the nic on the system.
+ * @dev : network device
+ * @state: led setting
+ *
  * Description: Used to physically identify the NIC on the system.
  * The Link LED will blink for a time specified by the user for
  * identification.
  * NOTE: The Link has to be Up to be able to blink the LED. Hence
  * identification is possible only if it's link is up.
- * Return value:
- * int , returns 0 on success
  */
 
-static int s2io_ethtool_idnic(struct net_device *dev, u32 data)
+static int s2io_ethtool_set_led(struct net_device *dev,
+                               enum ethtool_phys_id_state state)
 {
-       u64 val64 = 0, last_gpio_ctrl_val;
        struct s2io_nic *sp = netdev_priv(dev);
        struct XENA_dev_config __iomem *bar0 = sp->bar0;
-       u16 subid;
+       u16 subid = sp->pdev->subsystem_device;
 
-       subid = sp->pdev->subsystem_device;
-       last_gpio_ctrl_val = readq(&bar0->gpio_control);
        if ((sp->device_type == XFRAME_I_DEVICE) && ((subid & 0xFF) < 0x07)) {
-               val64 = readq(&bar0->adapter_control);
+               u64 val64 = readq(&bar0->adapter_control);
                if (!(val64 & ADAPTER_CNTL_EN)) {
                        pr_err("Adapter Link down, cannot blink LED\n");
-                       return -EFAULT;
+                       return -EAGAIN;
                }
        }
-       if (sp->id_timer.function == NULL) {
-               init_timer(&sp->id_timer);
-               sp->id_timer.function = s2io_phy_id;
-               sp->id_timer.data = (unsigned long)sp;
-       }
-       mod_timer(&sp->id_timer, jiffies);
-       if (data)
-               msleep_interruptible(data * HZ);
-       else
-               msleep_interruptible(MAX_FLICKER_TIME);
-       del_timer_sync(&sp->id_timer);
 
-       if (CARDS_WITH_FAULTY_LINK_INDICATORS(sp->device_type, subid)) {
-               writeq(last_gpio_ctrl_val, &bar0->gpio_control);
-               last_gpio_ctrl_val = readq(&bar0->gpio_control);
+       switch (state) {
+       case ETHTOOL_ID_ACTIVE:
+               sp->adapt_ctrl_org = readq(&bar0->gpio_control);
+               return -EINVAL;
+
+       case ETHTOOL_ID_ON:
+               s2io_set_led(sp, true);
+               break;
+
+       case ETHTOOL_ID_OFF:
+               s2io_set_led(sp, false);
+               break;
+
+       case ETHTOOL_ID_INACTIVE:
+               if (CARDS_WITH_FAULTY_LINK_INDICATORS(sp->device_type, subid))
+                       writeq(sp->adapt_ctrl_org, &bar0->gpio_control);
        }
 
        return 0;
@@ -6776,7 +6772,7 @@ static const struct ethtool_ops netdev_ethtool_ops = {
        .set_ufo = ethtool_op_set_ufo,
        .self_test = s2io_ethtool_test,
        .get_strings = s2io_ethtool_get_strings,
-       .phys_id = s2io_ethtool_idnic,
+       .set_phys_id = s2io_ethtool_set_led,
        .get_ethtool_stats = s2io_get_ethtool_stats,
        .get_sset_count = s2io_get_sset_count,
 };