Commit 3b7cc736 authored by Patricio Noyola's avatar Patricio Noyola Committed by David S. Miller

gve: Use link status register to report link status

This makes the driver better aware of the connectivity status of the
device. Based on the device's status register, the driver can call
netif_carrier_{on,off}.
Reviewed-by: default avatarYangchun Fu <yangchun@google.com>
Signed-off-by: default avatarPatricio Noyola <patricion@google.com>
Signed-off-by: default avatarDavid Awogbemila <awogbemila@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5cdad90d
...@@ -774,7 +774,7 @@ static int gve_open(struct net_device *dev) ...@@ -774,7 +774,7 @@ static int gve_open(struct net_device *dev)
msecs_to_jiffies(priv->stats_report_timer_period))); msecs_to_jiffies(priv->stats_report_timer_period)));
gve_turnup(priv); gve_turnup(priv);
netif_carrier_on(dev); queue_work(priv->gve_wq, &priv->service_task);
priv->interface_up_cnt++; priv->interface_up_cnt++;
return 0; return 0;
...@@ -1032,16 +1032,34 @@ void gve_handle_report_stats(struct gve_priv *priv) ...@@ -1032,16 +1032,34 @@ void gve_handle_report_stats(struct gve_priv *priv)
} }
} }
static void gve_handle_link_status(struct gve_priv *priv, bool link_status)
{
if (!gve_get_napi_enabled(priv))
return;
if (link_status == netif_carrier_ok(priv->dev))
return;
if (link_status) {
netdev_info(priv->dev, "Device link is up.\n");
netif_carrier_on(priv->dev);
} else {
netdev_info(priv->dev, "Device link is down.\n");
netif_carrier_off(priv->dev);
}
}
/* Handle NIC status register changes, reset requests and report stats */ /* Handle NIC status register changes, reset requests and report stats */
static void gve_service_task(struct work_struct *work) static void gve_service_task(struct work_struct *work)
{ {
struct gve_priv *priv = container_of(work, struct gve_priv, struct gve_priv *priv = container_of(work, struct gve_priv,
service_task); service_task);
u32 status = ioread32be(&priv->reg_bar0->device_status);
gve_handle_status(priv, gve_handle_status(priv, status);
ioread32be(&priv->reg_bar0->device_status));
gve_handle_reset(priv); gve_handle_reset(priv);
gve_handle_link_status(priv, GVE_DEVICE_STATUS_LINK_STATUS_MASK & status);
} }
static int gve_init_priv(struct gve_priv *priv, bool skip_describe_device) static int gve_init_priv(struct gve_priv *priv, bool skip_describe_device)
......
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