qlge: Add ethtool blink function.
authorRon Mercer <ron.mercer@qlogic.com>
Wed, 21 Oct 2009 11:07:39 +0000 (11:07 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 22 Oct 2009 04:45:40 +0000 (21:45 -0700)
Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/qlge/qlge.h
drivers/net/qlge/qlge_ethtool.c
drivers/net/qlge/qlge_mpi.c

index 6118f50..a5bb3a5 100644 (file)
@@ -805,6 +805,9 @@ enum {
        MB_CMD_SET_PORT_CFG = 0x00000122,
        MB_CMD_GET_PORT_CFG = 0x00000123,
        MB_CMD_GET_LINK_STS = 0x00000124,
+       MB_CMD_SET_LED_CFG = 0x00000125, /* Set LED Configuration Register */
+               QL_LED_BLINK = 0x03e803e8,
+       MB_CMD_GET_LED_CFG = 0x00000126, /* Get LED Configuration Register */
        MB_CMD_SET_MGMNT_TFK_CTL = 0x00000160, /* Set Mgmnt Traffic Control */
        MB_SET_MPI_TFK_STOP = (1 << 0),
        MB_SET_MPI_TFK_RESUME = (1 << 1),
@@ -1551,6 +1554,7 @@ struct ql_adapter {
        u32 port_init;
        u32 link_status;
        u32 link_config;
+       u32 led_config;
        u32 max_frame_size;
 
        union flash_params flash;
@@ -1642,6 +1646,8 @@ int ql_mb_get_fw_state(struct ql_adapter *qdev);
 int ql_cam_route_initialize(struct ql_adapter *qdev);
 int ql_read_mpi_reg(struct ql_adapter *qdev, u32 reg, u32 *data);
 int ql_mb_about_fw(struct ql_adapter *qdev);
+int ql_mb_set_led_cfg(struct ql_adapter *qdev, u32 led_config);
+int ql_mb_get_led_cfg(struct ql_adapter *qdev);
 void ql_link_on(struct ql_adapter *qdev);
 void ql_link_off(struct ql_adapter *qdev);
 int ql_mb_set_mgmnt_traffic_ctl(struct ql_adapter *qdev, u32 control);
index dfb5c80..0c0549b 100644 (file)
@@ -371,6 +371,33 @@ static void ql_get_drvinfo(struct net_device *ndev,
        drvinfo->eedump_len = 0;
 }
 
+
+static int ql_phys_id(struct net_device *ndev, u32 data)
+{
+       struct ql_adapter *qdev = netdev_priv(ndev);
+       u32 led_reg, i;
+       int status;
+
+       /* Save the current LED settings */
+       status = ql_mb_get_led_cfg(qdev);
+       if (status)
+               return status;
+       led_reg = qdev->led_config;
+
+       /* Start blinking the led */
+       if (!data || data > 300)
+               data = 300;
+
+       for (i = 0; i < (data * 10); i++)
+               ql_mb_set_led_cfg(qdev, QL_LED_BLINK);
+
+       /* Restore LED settings */
+       status = ql_mb_set_led_cfg(qdev, led_reg);
+       if (status)
+               return status;
+
+       return 0;
+}
 static int ql_get_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
 {
        struct ql_adapter *qdev = netdev_priv(dev);
@@ -499,6 +526,7 @@ const struct ethtool_ops qlge_ethtool_ops = {
        .get_msglevel = ql_get_msglevel,
        .set_msglevel = ql_set_msglevel,
        .get_link = ethtool_op_get_link,
+       .phys_id                 = ql_phys_id,
        .get_pauseparam          = ql_get_pauseparam,
        .set_pauseparam          = ql_set_pauseparam,
        .get_rx_csum = ql_get_rx_csum,
index 81a8489..14d76f1 100644 (file)
@@ -751,6 +751,61 @@ static int ql_idc_wait(struct ql_adapter *qdev)
        return status;
 }
 
+int ql_mb_set_led_cfg(struct ql_adapter *qdev, u32 led_config)
+{
+       struct mbox_params mbc;
+       struct mbox_params *mbcp = &mbc;
+       int status;
+
+       memset(mbcp, 0, sizeof(struct mbox_params));
+
+       mbcp->in_count = 2;
+       mbcp->out_count = 1;
+
+       mbcp->mbox_in[0] = MB_CMD_SET_LED_CFG;
+       mbcp->mbox_in[1] = led_config;
+
+
+       status = ql_mailbox_command(qdev, mbcp);
+       if (status)
+               return status;
+
+       if (mbcp->mbox_out[0] != MB_CMD_STS_GOOD) {
+               QPRINTK(qdev, DRV, ERR,
+                       "Failed to set LED Configuration.\n");
+               status = -EIO;
+       }
+
+       return status;
+}
+
+int ql_mb_get_led_cfg(struct ql_adapter *qdev)
+{
+       struct mbox_params mbc;
+       struct mbox_params *mbcp = &mbc;
+       int status;
+
+       memset(mbcp, 0, sizeof(struct mbox_params));
+
+       mbcp->in_count = 1;
+       mbcp->out_count = 2;
+
+       mbcp->mbox_in[0] = MB_CMD_GET_LED_CFG;
+
+       status = ql_mailbox_command(qdev, mbcp);
+       if (status)
+               return status;
+
+       if (mbcp->mbox_out[0] != MB_CMD_STS_GOOD) {
+               QPRINTK(qdev, DRV, ERR,
+                       "Failed to get LED Configuration.\n");
+               status = -EIO;
+       } else
+               qdev->led_config = mbcp->mbox_out[1];
+
+       return status;
+}
+
 int ql_mb_set_mgmnt_traffic_ctl(struct ql_adapter *qdev, u32 control)
 {
        struct mbox_params mbc;