diff mbox series

[net-next,07/18] gve: Use link status register to report link status

Message ID 20200818194417.2003932-8-awogbemila@google.com
State Changes Requested
Delegated to: David Miller
Headers show
Series GVE Driver v1.1.0 Features. | expand

Commit Message

David Awogbemila Aug. 18, 2020, 7:44 p.m. UTC
From: Patricio Noyola <patricion@google.com>

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: Yangchun Fu <yangchun@google.com>
Signed-off-by: Patricio Noyola <patricion@google.com>
Signed-off-by: David Awogbemila <awogbemila@google.com>
---
 drivers/net/ethernet/google/gve/gve_main.c | 23 +++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

Comments

Jakub Kicinski Aug. 19, 2020, 3:36 a.m. UTC | #1
On Tue, 18 Aug 2020 12:44:06 -0700 David Awogbemila wrote:
> +	if (link_status) {
> +		netif_carrier_on(priv->dev);
> +	} else {
> +		dev_info(&priv->pdev->dev, "Device link is down.\n");

Down message but no Up message?

> +		netif_carrier_off(priv->dev);
David Awogbemila Aug. 25, 2020, 3:46 p.m. UTC | #2
On Tue, Aug 18, 2020 at 8:36 PM Jakub Kicinski <kuba@kernel.org> wrote:
>
> On Tue, 18 Aug 2020 12:44:06 -0700 David Awogbemila wrote:
> > +     if (link_status) {
> > +             netif_carrier_on(priv->dev);
> > +     } else {
> > +             dev_info(&priv->pdev->dev, "Device link is down.\n");
>
> Down message but no Up message?
>
> > +             netif_carrier_off(priv->dev);

Thanks Jakub. I'll add an Up message to make it more uniform.
diff mbox series

Patch

diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ethernet/google/gve/gve_main.c
index 885943d745aa..685f18697fc1 100644
--- a/drivers/net/ethernet/google/gve/gve_main.c
+++ b/drivers/net/ethernet/google/gve/gve_main.c
@@ -769,7 +769,7 @@  static int gve_open(struct net_device *dev)
 	gve_set_device_rings_ok(priv);
 
 	gve_turnup(priv);
-	netif_carrier_on(dev);
+	queue_work(priv->gve_wq, &priv->service_task);
 	priv->interface_up_cnt++;
 	return 0;
 
@@ -1026,16 +1026,33 @@  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) {
+		netif_carrier_on(priv->dev);
+	} else {
+		dev_info(&priv->pdev->dev, "Device link is down.\n");
+		netif_carrier_off(priv->dev);
+	}
+}
+
 /* Handle NIC status register changes, reset requests and report stats */
 static void gve_service_task(struct work_struct *work)
 {
 	struct gve_priv *priv = container_of(work, struct gve_priv,
 					     service_task);
+	u32 status = ioread32be(&priv->reg_bar0->device_status);
 
-	gve_handle_status(priv,
-			  ioread32be(&priv->reg_bar0->device_status));
+	gve_handle_status(priv, status);
 
 	gve_handle_reset(priv);
+	gve_handle_link_status(priv, GVE_DEVICE_STATUS_LINK_STATUS_MASK & status);
 	if (gve_get_do_report_stats(priv)) {
 		gve_handle_report_stats(priv);
 		gve_clear_do_report_stats(priv);