Module Name:    src
Committed By:   knakahara
Date:           Mon Sep 12 07:26:04 UTC 2022

Modified Files:
        src/sys/dev/pci: if_vioif.c

Log Message:
Uniform vioif's link status to if_link_state.  Implemented by yamaguchi@n.o.

Let vioif(4) know LINK_STATE_UNKNOWN.


To generate a diff of this commit:
cvs rdiff -u -r1.81 -r1.82 src/sys/dev/pci/if_vioif.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/pci/if_vioif.c
diff -u src/sys/dev/pci/if_vioif.c:1.81 src/sys/dev/pci/if_vioif.c:1.82
--- src/sys/dev/pci/if_vioif.c:1.81	Wed May  4 02:38:27 2022
+++ src/sys/dev/pci/if_vioif.c	Mon Sep 12 07:26:04 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_vioif.c,v 1.81 2022/05/04 02:38:27 simonb Exp $	*/
+/*	$NetBSD: if_vioif.c,v 1.82 2022/09/12 07:26:04 knakahara Exp $	*/
 
 /*
  * Copyright (c) 2020 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_vioif.c,v 1.81 2022/05/04 02:38:27 simonb Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_vioif.c,v 1.82 2022/09/12 07:26:04 knakahara Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_net_mpsafe.h"
@@ -319,7 +319,7 @@ struct vioif_softc {
 
 	uint8_t			sc_mac[ETHER_ADDR_LEN];
 	struct ethercom		sc_ethercom;
-	bool			sc_link_active;
+	int			sc_link_state;
 
 	struct vioif_txqueue	*sc_txq;
 	struct vioif_rxqueue	*sc_rxq;
@@ -349,6 +349,8 @@ struct vioif_softc {
 #define VIOIF_RX_PROCESS_LIMIT		256
 
 #define VIOIF_WORKQUEUE_PRI		PRI_SOFTNET
+#define VIOIF_IS_LINK_ACTIVE(_sc)	((_sc)->sc_link_state == LINK_STATE_UP ? \
+					    true : false)
 
 /* cfattach interface functions */
 static int	vioif_match(device_t, cfdata_t, void *);
@@ -401,7 +403,7 @@ static void	vioif_work_add(struct workqu
 static void	vioif_work_wait(struct workqueue *, struct vioif_work *);
 
 /* other control */
-static bool	vioif_is_link_up(struct vioif_softc *);
+static int	vioif_get_link_status(struct vioif_softc *);
 static void	vioif_update_link_status(struct vioif_softc *);
 static int	vioif_ctrl_rx(struct vioif_softc *, int, bool);
 static int	vioif_set_promisc(struct vioif_softc *, bool);
@@ -830,7 +832,7 @@ vioif_attach(device_t parent, device_t s
 
 	sc->sc_dev = self;
 	sc->sc_virtio = vsc;
-	sc->sc_link_active = false;
+	sc->sc_link_state = LINK_STATE_UNKNOWN;
 
 	sc->sc_max_nvq_pairs = 1;
 	sc->sc_req_nvq_pairs = 1;
@@ -983,7 +985,7 @@ vioif_attach(device_t parent, device_t s
 		nvqs++;
 		txq->txq_vq->vq_intrhand = vioif_tx_intr;
 		txq->txq_vq->vq_intrhand_arg = (void *)txq;
-		txq->txq_link_active = sc->sc_link_active;
+		txq->txq_link_active = VIOIF_IS_LINK_ACTIVE(sc);
 		txq->txq_stopping = false;
 		txq->txq_intrq = pcq_create(txq->txq_vq->vq_num, KM_SLEEP);
 		vioif_work_set(&txq->txq_work, vioif_tx_handle, txq);
@@ -1257,14 +1259,11 @@ vioif_stop(struct ifnet *ifp, int disabl
 	}
 
 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
-	sc->sc_link_active = false;
 
 	for (i = 0; i < sc->sc_act_nvq_pairs; i++) {
 		txq = &sc->sc_txq[i];
 		rxq = &sc->sc_rxq[i];
 
-		txq->txq_link_active = false;
-
 		if (disable)
 			vioif_rx_drain(rxq);
 
@@ -2393,8 +2392,8 @@ set_ifflags:
 	return r;
 }
 
-static bool
-vioif_is_link_up(struct vioif_softc *sc)
+static int
+vioif_get_link_status(struct vioif_softc *sc)
 {
 	struct virtio_softc *vsc = sc->sc_virtio;
 	uint16_t status;
@@ -2405,7 +2404,10 @@ vioif_is_link_up(struct vioif_softc *sc)
 	else
 		status = VIRTIO_NET_S_LINK_UP;
 
-	return ((status & VIRTIO_NET_S_LINK_UP) != 0);
+	if ((status & VIRTIO_NET_S_LINK_UP) != 0)
+		return LINK_STATE_UP;
+
+	return LINK_STATE_DOWN;
 }
 
 /* change link status */
@@ -2414,40 +2416,30 @@ vioif_update_link_status(struct vioif_so
 {
 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	struct vioif_txqueue *txq;
-	bool active, changed;
+	bool active;
 	int link, i;
 
 	mutex_enter(&sc->sc_lock);
 
-	active = vioif_is_link_up(sc);
-	changed = false;
+	link = vioif_get_link_status(sc);
 
-	if (active) {
-		if (!sc->sc_link_active)
-			changed = true;
+	if (link == sc->sc_link_state)
+		goto done;
 
-		link = LINK_STATE_UP;
-		sc->sc_link_active = true;
-	} else {
-		if (sc->sc_link_active)
-			changed = true;
-
-		link = LINK_STATE_DOWN;
-		sc->sc_link_active = false;
-	}
+	sc->sc_link_state = link;
 
-	if (changed) {
-		for (i = 0; i < sc->sc_act_nvq_pairs; i++) {
-			txq = &sc->sc_txq[i];
-
-			mutex_enter(txq->txq_lock);
-			txq->txq_link_active = sc->sc_link_active;
-			mutex_exit(txq->txq_lock);
-		}
+	active = VIOIF_IS_LINK_ACTIVE(sc);
+	for (i = 0; i < sc->sc_act_nvq_pairs; i++) {
+		txq = &sc->sc_txq[i];
 
-		if_link_state_change(ifp, link);
+		mutex_enter(txq->txq_lock);
+		txq->txq_link_active = active;
+		mutex_exit(txq->txq_lock);
 	}
 
+	if_link_state_change(ifp, sc->sc_link_state);
+
+done:
 	mutex_exit(&sc->sc_lock);
 }
 

Reply via email to