Module Name: src
Committed By: msaitoh
Date: Fri Feb 22 06:49:15 UTC 2019
Modified Files:
src/sys/dev/pci/ixgbe: ix_txrx.c ixgbe.c ixgbe.h ixv.c
Log Message:
Fix a bug that if_link_state_change(ifp, LINK_STATE_DOWN) isn't called unless
link goes up at least one time. Without this change, never linkup-ed media
keeps LINK_STATE_UNKNOWN instead of LINK_STATE_DOWN.
To generate a diff of this commit:
cvs rdiff -u -r1.51 -r1.52 src/sys/dev/pci/ixgbe/ix_txrx.c
cvs rdiff -u -r1.173 -r1.174 src/sys/dev/pci/ixgbe/ixgbe.c
cvs rdiff -u -r1.53 -r1.54 src/sys/dev/pci/ixgbe/ixgbe.h
cvs rdiff -u -r1.108 -r1.109 src/sys/dev/pci/ixgbe/ixv.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/ixgbe/ix_txrx.c
diff -u src/sys/dev/pci/ixgbe/ix_txrx.c:1.51 src/sys/dev/pci/ixgbe/ix_txrx.c:1.52
--- src/sys/dev/pci/ixgbe/ix_txrx.c:1.51 Thu Dec 20 09:47:15 2018
+++ src/sys/dev/pci/ixgbe/ix_txrx.c Fri Feb 22 06:49:15 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: ix_txrx.c,v 1.51 2018/12/20 09:47:15 knakahara Exp $ */
+/* $NetBSD: ix_txrx.c,v 1.52 2019/02/22 06:49:15 msaitoh Exp $ */
/******************************************************************************
@@ -136,7 +136,7 @@ ixgbe_legacy_start_locked(struct ifnet *
IXGBE_TX_LOCK_ASSERT(txr);
- if (!adapter->link_active) {
+ if (adapter->link_active != LINK_STATE_UP) {
/*
* discard all packets buffered in IFQ to avoid
* sending old packets at next link up timing.
@@ -282,7 +282,7 @@ ixgbe_mq_start_locked(struct ifnet *ifp,
struct mbuf *next;
int enqueued = 0, err = 0;
- if (!txr->adapter->link_active) {
+ if (txr->adapter->link_active != LINK_STATE_UP) {
/*
* discard all packets buffered in txr_interq to avoid
* sending old packets at next link up timing.
Index: src/sys/dev/pci/ixgbe/ixgbe.c
diff -u src/sys/dev/pci/ixgbe/ixgbe.c:1.173 src/sys/dev/pci/ixgbe/ixgbe.c:1.174
--- src/sys/dev/pci/ixgbe/ixgbe.c:1.173 Wed Jan 23 09:47:52 2019
+++ src/sys/dev/pci/ixgbe/ixgbe.c Fri Feb 22 06:49:15 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: ixgbe.c,v 1.173 2019/01/23 09:47:52 msaitoh Exp $ */
+/* $NetBSD: ixgbe.c,v 1.174 2019/02/22 06:49:15 msaitoh Exp $ */
/******************************************************************************
@@ -1628,7 +1628,7 @@ ixgbe_update_stats_counters(struct adapt
stats->mpctotal.ev_count += total_missed_rx;
/* Document says M[LR]FC are valid when link is up and 10Gbps */
- if ((adapter->link_active == TRUE)
+ if ((adapter->link_active == LINK_STATE_UP)
&& (adapter->link_speed == IXGBE_LINK_SPEED_10GB_FULL)) {
stats->mlfc.ev_count += IXGBE_READ_REG(hw, IXGBE_MLFC);
stats->mrfc.ev_count += IXGBE_READ_REG(hw, IXGBE_MRFC);
@@ -2751,7 +2751,7 @@ ixgbe_media_status(struct ifnet *ifp, st
ifmr->ifm_status = IFM_AVALID;
ifmr->ifm_active = IFM_ETHER;
- if (!adapter->link_active) {
+ if (adapter->link_active != LINK_STATE_UP) {
ifmr->ifm_active |= IFM_NONE;
IXGBE_CORE_UNLOCK(adapter);
return;
@@ -4759,7 +4759,7 @@ ixgbe_update_link_status(struct adapter
KASSERT(mutex_owned(&adapter->core_mtx));
if (adapter->link_up) {
- if (adapter->link_active == FALSE) {
+ if (adapter->link_active != LINK_STATE_UP) {
/*
* To eliminate influence of the previous state
* in the same way as ixgbe_init_locked().
@@ -4808,7 +4808,7 @@ ixgbe_update_link_status(struct adapter
device_printf(dev, "Link is up %s %s \n",
bpsmsg, "Full Duplex");
}
- adapter->link_active = TRUE;
+ adapter->link_active = LINK_STATE_UP;
/* Update any Flow Control changes */
ixgbe_fc_enable(&adapter->hw);
/* Update DMA coalescing config */
@@ -4818,12 +4818,17 @@ ixgbe_update_link_status(struct adapter
if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
ixgbe_ping_all_vfs(adapter);
}
- } else { /* Link down */
- if (adapter->link_active == TRUE) {
+ } else {
+ /*
+ * Do it when link active changes to DOWN. i.e.
+ * a) LINK_STATE_UNKNOWN -> LINK_STATE_DOWN
+ * b) LINK_STATE_UP -> LINK_STATE_DOWN
+ */
+ if (adapter->link_active != LINK_STATE_DOWN) {
if (bootverbose)
device_printf(dev, "Link is Down\n");
if_link_state_change(ifp, LINK_STATE_DOWN);
- adapter->link_active = FALSE;
+ adapter->link_active = LINK_STATE_DOWN;
if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
ixgbe_ping_all_vfs(adapter);
ixgbe_drain_all(adapter);
Index: src/sys/dev/pci/ixgbe/ixgbe.h
diff -u src/sys/dev/pci/ixgbe/ixgbe.h:1.53 src/sys/dev/pci/ixgbe/ixgbe.h:1.54
--- src/sys/dev/pci/ixgbe/ixgbe.h:1.53 Thu Dec 6 13:25:02 2018
+++ src/sys/dev/pci/ixgbe/ixgbe.h Fri Feb 22 06:49:15 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: ixgbe.h,v 1.53 2018/12/06 13:25:02 msaitoh Exp $ */
+/* $NetBSD: ixgbe.h,v 1.54 2019/02/22 06:49:15 msaitoh Exp $ */
/******************************************************************************
SPDX-License-Identifier: BSD-3-Clause
@@ -492,7 +492,7 @@ struct adapter {
/* Info about the interface */
int advertise; /* link speeds */
bool enable_aim; /* adaptive interrupt moderation */
- bool link_active;
+ int link_active; /* Use LINK_STATE_* value */
u16 max_frame_size;
u16 num_segs;
u32 link_speed;
Index: src/sys/dev/pci/ixgbe/ixv.c
diff -u src/sys/dev/pci/ixgbe/ixv.c:1.108 src/sys/dev/pci/ixgbe/ixv.c:1.109
--- src/sys/dev/pci/ixgbe/ixv.c:1.108 Wed Jan 23 06:56:19 2019
+++ src/sys/dev/pci/ixgbe/ixv.c Fri Feb 22 06:49:15 2019
@@ -1,4 +1,4 @@
-/*$NetBSD: ixv.c,v 1.108 2019/01/23 06:56:19 msaitoh Exp $*/
+/*$NetBSD: ixv.c,v 1.109 2019/02/22 06:49:15 msaitoh Exp $*/
/******************************************************************************
@@ -1027,7 +1027,7 @@ ixv_media_status(struct ifnet *ifp, stru
ifmr->ifm_status = IFM_AVALID;
ifmr->ifm_active = IFM_ETHER;
- if (!adapter->link_active) {
+ if (adapter->link_active != LINK_STATE_UP) {
ifmr->ifm_active |= IFM_NONE;
IXGBE_CORE_UNLOCK(adapter);
return;
@@ -1302,7 +1302,7 @@ ixv_update_link_status(struct adapter *a
KASSERT(mutex_owned(&adapter->core_mtx));
if (adapter->link_up) {
- if (adapter->link_active == FALSE) {
+ if (adapter->link_active != LINK_STATE_UP) {
if (bootverbose) {
const char *bpsmsg;
@@ -1332,15 +1332,20 @@ ixv_update_link_status(struct adapter *a
device_printf(dev, "Link is up %s %s \n",
bpsmsg, "Full Duplex");
}
- adapter->link_active = TRUE;
+ adapter->link_active = LINK_STATE_UP;
if_link_state_change(ifp, LINK_STATE_UP);
}
- } else { /* Link down */
- if (adapter->link_active == TRUE) {
+ } else {
+ /*
+ * Do it when link active changes to DOWN. i.e.
+ * a) LINK_STATE_UNKNOWN -> LINK_STATE_DOWN
+ * b) LINK_STATE_UP -> LINK_STATE_DOWN
+ */
+ if (adapter->link_active != LINK_STATE_DOWN) {
if (bootverbose)
device_printf(dev, "Link is Down\n");
if_link_state_change(ifp, LINK_STATE_DOWN);
- adapter->link_active = FALSE;
+ adapter->link_active = LINK_STATE_DOWN;
}
}
} /* ixv_update_link_status */