Commit d8eb59dc authored by Ron Mercer's avatar Ron Mercer Committed by David S. Miller

qlge: Add ethtool blink function.

Signed-off-by: default avatarRon Mercer <ron.mercer@qlogic.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1d30df24
...@@ -805,6 +805,9 @@ enum { ...@@ -805,6 +805,9 @@ enum {
MB_CMD_SET_PORT_CFG = 0x00000122, MB_CMD_SET_PORT_CFG = 0x00000122,
MB_CMD_GET_PORT_CFG = 0x00000123, MB_CMD_GET_PORT_CFG = 0x00000123,
MB_CMD_GET_LINK_STS = 0x00000124, 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_CMD_SET_MGMNT_TFK_CTL = 0x00000160, /* Set Mgmnt Traffic Control */
MB_SET_MPI_TFK_STOP = (1 << 0), MB_SET_MPI_TFK_STOP = (1 << 0),
MB_SET_MPI_TFK_RESUME = (1 << 1), MB_SET_MPI_TFK_RESUME = (1 << 1),
...@@ -1551,6 +1554,7 @@ struct ql_adapter { ...@@ -1551,6 +1554,7 @@ struct ql_adapter {
u32 port_init; u32 port_init;
u32 link_status; u32 link_status;
u32 link_config; u32 link_config;
u32 led_config;
u32 max_frame_size; u32 max_frame_size;
union flash_params flash; union flash_params flash;
...@@ -1642,6 +1646,8 @@ int ql_mb_get_fw_state(struct ql_adapter *qdev); ...@@ -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_cam_route_initialize(struct ql_adapter *qdev);
int ql_read_mpi_reg(struct ql_adapter *qdev, u32 reg, u32 *data); 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_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_on(struct ql_adapter *qdev);
void ql_link_off(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); int ql_mb_set_mgmnt_traffic_ctl(struct ql_adapter *qdev, u32 control);
......
...@@ -371,6 +371,33 @@ static void ql_get_drvinfo(struct net_device *ndev, ...@@ -371,6 +371,33 @@ static void ql_get_drvinfo(struct net_device *ndev,
drvinfo->eedump_len = 0; 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) static int ql_get_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
{ {
struct ql_adapter *qdev = netdev_priv(dev); struct ql_adapter *qdev = netdev_priv(dev);
...@@ -499,6 +526,7 @@ const struct ethtool_ops qlge_ethtool_ops = { ...@@ -499,6 +526,7 @@ const struct ethtool_ops qlge_ethtool_ops = {
.get_msglevel = ql_get_msglevel, .get_msglevel = ql_get_msglevel,
.set_msglevel = ql_set_msglevel, .set_msglevel = ql_set_msglevel,
.get_link = ethtool_op_get_link, .get_link = ethtool_op_get_link,
.phys_id = ql_phys_id,
.get_pauseparam = ql_get_pauseparam, .get_pauseparam = ql_get_pauseparam,
.set_pauseparam = ql_set_pauseparam, .set_pauseparam = ql_set_pauseparam,
.get_rx_csum = ql_get_rx_csum, .get_rx_csum = ql_get_rx_csum,
......
...@@ -751,6 +751,61 @@ static int ql_idc_wait(struct ql_adapter *qdev) ...@@ -751,6 +751,61 @@ static int ql_idc_wait(struct ql_adapter *qdev)
return status; 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) int ql_mb_set_mgmnt_traffic_ctl(struct ql_adapter *qdev, u32 control)
{ {
struct mbox_params mbc; struct mbox_params mbc;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment