Module Name: src
Committed By: martin
Date: Wed Sep 15 16:30:51 UTC 2021
Modified Files:
src/share/man/man4 [netbsd-9]: ixg.4 ixv.4
src/sys/dev/pci [netbsd-9]: files.pci
src/sys/dev/pci/ixgbe [netbsd-9]: if_bypass.c if_fdir.c if_sriov.c
ix_txrx.c ixgbe.c ixgbe.h ixgbe_82598.c ixgbe_82599.c ixgbe_api.c
ixgbe_bypass.h ixgbe_common.c ixgbe_dcb.c ixgbe_dcb.h
ixgbe_dcb_82598.c ixgbe_dcb_82598.h ixgbe_dcb_82599.c
ixgbe_dcb_82599.h ixgbe_fdir.h ixgbe_features.h ixgbe_mbx.c
ixgbe_netbsd.c ixgbe_netbsd.h ixgbe_netmap.c ixgbe_netmap.h
ixgbe_osdep.c ixgbe_osdep.h ixgbe_phy.c ixgbe_rss.h ixgbe_sriov.h
ixgbe_type.h ixgbe_vf.c ixgbe_x540.c ixgbe_x540.h ixgbe_x550.c
ixgbe_x550.h ixv.c
Log Message:
Pull up the following (via patch), requested by msaitoh in ticket #1346:
sys/dev/pci/ixgbe/ixgbe.c 1.252, 1.280-1.283,
1.286-1.287, 1.289-1.290 via patch
sys/dev/pci/ixgbe/ixgbe.h 1.73, 1.76-1.80 via
patch
sys/dev/pci/ixgbe/ix_txrx.c 1.68-1.93
sys/dev/pci/ixgbe/ixv.c 1.153, 1.157-1.161,
1.163-1.166 via patch
sys/dev/pci/ixgbe/if_bypass.c 1.7-1.9
sys/dev/pci/ixgbe/if_fdir.c 1.4-1.5
sys/dev/pci/ixgbe/if_sriov.c 1.10-1.11
sys/dev/pci/ixgbe/ixgbe_82598.c 1.16
sys/dev/pci/ixgbe/ixgbe_82599.c 1.23
sys/dev/pci/ixgbe/ixgbe_api.c 1.25
sys/dev/pci/ixgbe/ixgbe_bypass.h 1.2
sys/dev/pci/ixgbe/ixgbe_common.c 1.30-1.33
sys/dev/pci/ixgbe/ixgbe_dcb.c 1.10-1.11
sys/dev/pci/ixgbe/ixgbe_dcb.h 1.7
sys/dev/pci/ixgbe/ixgbe_dcb_82598.c 1.8-1.9
sys/dev/pci/ixgbe/ixgbe_dcb_82598.h 1.7
sys/dev/pci/ixgbe/ixgbe_dcb_82599.c 1.8-1.9
sys/dev/pci/ixgbe/ixgbe_dcb_82599.h 1.7
sys/dev/pci/ixgbe/ixgbe_fdir.h 1.3
sys/dev/pci/ixgbe/ixgbe_features.h 1.3
sys/dev/pci/ixgbe/ixgbe_mbx.c 1.12
sys/dev/pci/ixgbe/ixgbe_netbsd.c 1.13, 1.16-1.17
sys/dev/pci/ixgbe/ixgbe_netbsd.h 1.13-1.14
sys/dev/pci/ixgbe/ixgbe_netmap.c 1.3-1.4
sys/dev/pci/ixgbe/ixgbe_netmap.h 1.2
sys/dev/pci/ixgbe/ixgbe_osdep.c 1.7
sys/dev/pci/ixgbe/ixgbe_osdep.h 1.29-1.30
sys/dev/pci/ixgbe/ixgbe_phy.c 1.24
sys/dev/pci/ixgbe/ixgbe_rss.h 1.5
sys/dev/pci/ixgbe/ixgbe_sriov.h 1.4
sys/dev/pci/ixgbe/ixgbe_type.h 1.49
sys/dev/pci/ixgbe/ixgbe_vf.c 1.27
sys/dev/pci/ixgbe/ixgbe_x540.c 1.18-1.19
sys/dev/pci/ixgbe/ixgbe_x540.h 1.9
sys/dev/pci/ixgbe/ixgbe_x550.c 1.19-1.20
sys/dev/pci/ixgbe/ixgbe_x550.h 1.6
sys/dev/pci/files.pci 1.438
share/man/man4/ixg.4 1.15
share/man/man4/ixv.4 1.8
- Use MCLGET() instead of homegrown cluster (jcl) allocation mechanism.
Before this commit, resource shortage was easily occurred because
the total number of the clusters is small.
- Improve performance:
- Use m_adj(ETHER_ALIGN) more.
- Sprinkle __predict_false() in the RX path.
- Don't pre-allocate a cluster for RXCOPY case to improve short
packet's performance.
- Call bus_dmamap_unload(9) via ixgbe_dmamap_unload(), before freeing
DMA buffer. Also, when the buffer is already freed, do not call
bus_dmamap_unload(9) (no resource leaks with this change). This
change is required to make ixg(4) work on alpha.
- Keep m_len and m_pkthdr.len consistent to prevent panic on arm.
- Fix panic when bus_dmamap_load_mbuf() failed in
ixgbe_setup_receive_ring().
- Added BUS_DMA_COHERENT flag to bus_dmamem_map() to improve stability
on aarch64.
- Use uint64_t instead of bus_addr_t for the TX descriptor's buffer
address. At least, this change is required for macppc
(sizeof(bus_addr_t) == 4) to make TX work.
- Fix little-endian dependence.
- Set rxr->next_to_refresh correctly in ixgbe_setup_receive_ring().
- Refresh unrefreshed descriptors' buffers correctly.
- Don't call bus_dmamap_sync with rx_mbuf_sz(== MCLBYTES) to prevent
panic.
- Save the discard_multidesc state to not to forget the state by
exiting rxeof().
- Add missing increment of no_mbuf error counter.
- Don't increment no_mbuf evcnt(9) when discarding multi-descriptor
packet.
- ixv: Modify error message to sync with ixgbe.c
- Print the error value of ixgbe_reset_hw() for debugging.
- Remove extra unlock/lock processing around if_percpuq_enqueue().
- Refactor rxr->next_to_check updating.
- Add new sysctl "rx_copy_len".
- Add a new sysctl to read rxr->next_to_refresh.
- Print error number when error occurred.
- Rename ix{gbe,v}_stop() with ix{gbe,v}_stop_locked(). No functional
change.
- Don't use fixed value.
- Comment out flow director processing in fast path.
- Add missing NetBSD RCS IDs and __KERNEL_RCSID()s.
- KNF.
- Fix typos.
To generate a diff of this commit:
cvs rdiff -u -r1.12.4.1 -r1.12.4.2 src/share/man/man4/ixg.4
cvs rdiff -u -r1.4.2.2 -r1.4.2.3 src/share/man/man4/ixv.4
cvs rdiff -u -r1.413.2.3 -r1.413.2.4 src/sys/dev/pci/files.pci
cvs rdiff -u -r1.4.8.2 -r1.4.8.3 src/sys/dev/pci/ixgbe/if_bypass.c \
src/sys/dev/pci/ixgbe/ixgbe_osdep.c
cvs rdiff -u -r1.2 -r1.2.8.1 src/sys/dev/pci/ixgbe/if_fdir.c \
src/sys/dev/pci/ixgbe/ixgbe_fdir.h
cvs rdiff -u -r1.6 -r1.6.2.1 src/sys/dev/pci/ixgbe/if_sriov.c
cvs rdiff -u -r1.54.2.5 -r1.54.2.6 src/sys/dev/pci/ixgbe/ix_txrx.c
cvs rdiff -u -r1.199.2.13 -r1.199.2.14 src/sys/dev/pci/ixgbe/ixgbe.c
cvs rdiff -u -r1.56.2.4 -r1.56.2.5 src/sys/dev/pci/ixgbe/ixgbe.h
cvs rdiff -u -r1.12.8.3 -r1.12.8.4 src/sys/dev/pci/ixgbe/ixgbe_82598.c
cvs rdiff -u -r1.21.4.1 -r1.21.4.2 src/sys/dev/pci/ixgbe/ixgbe_82599.c
cvs rdiff -u -r1.23.2.1 -r1.23.2.2 src/sys/dev/pci/ixgbe/ixgbe_api.c
cvs rdiff -u -r1.1 -r1.1.14.1 src/sys/dev/pci/ixgbe/ixgbe_bypass.h \
src/sys/dev/pci/ixgbe/ixgbe_netmap.h
cvs rdiff -u -r1.25.2.3 -r1.25.2.4 src/sys/dev/pci/ixgbe/ixgbe_common.c
cvs rdiff -u -r1.9 -r1.9.4.1 src/sys/dev/pci/ixgbe/ixgbe_dcb.c
cvs rdiff -u -r1.6 -r1.6.8.1 src/sys/dev/pci/ixgbe/ixgbe_dcb.h \
src/sys/dev/pci/ixgbe/ixgbe_dcb_82598.h \
src/sys/dev/pci/ixgbe/ixgbe_dcb_82599.h
cvs rdiff -u -r1.7 -r1.7.8.1 src/sys/dev/pci/ixgbe/ixgbe_dcb_82598.c \
src/sys/dev/pci/ixgbe/ixgbe_dcb_82599.c
cvs rdiff -u -r1.2 -r1.2.4.1 src/sys/dev/pci/ixgbe/ixgbe_features.h
cvs rdiff -u -r1.11 -r1.11.2.1 src/sys/dev/pci/ixgbe/ixgbe_mbx.c
cvs rdiff -u -r1.9.4.3 -r1.9.4.4 src/sys/dev/pci/ixgbe/ixgbe_netbsd.c
cvs rdiff -u -r1.11.4.1 -r1.11.4.2 src/sys/dev/pci/ixgbe/ixgbe_netbsd.h
cvs rdiff -u -r1.2 -r1.2.2.1 src/sys/dev/pci/ixgbe/ixgbe_netmap.c
cvs rdiff -u -r1.23.6.3 -r1.23.6.4 src/sys/dev/pci/ixgbe/ixgbe_osdep.h
cvs rdiff -u -r1.18.4.3 -r1.18.4.4 src/sys/dev/pci/ixgbe/ixgbe_phy.c
cvs rdiff -u -r1.4 -r1.4.8.1 src/sys/dev/pci/ixgbe/ixgbe_rss.h
cvs rdiff -u -r1.3 -r1.3.8.1 src/sys/dev/pci/ixgbe/ixgbe_sriov.h
cvs rdiff -u -r1.41.2.2 -r1.41.2.3 src/sys/dev/pci/ixgbe/ixgbe_type.h
cvs rdiff -u -r1.18.2.3 -r1.18.2.4 src/sys/dev/pci/ixgbe/ixgbe_vf.c
cvs rdiff -u -r1.16.8.1 -r1.16.8.2 src/sys/dev/pci/ixgbe/ixgbe_x540.c
cvs rdiff -u -r1.8 -r1.8.8.1 src/sys/dev/pci/ixgbe/ixgbe_x540.h
cvs rdiff -u -r1.15.2.3 -r1.15.2.4 src/sys/dev/pci/ixgbe/ixgbe_x550.c
cvs rdiff -u -r1.5 -r1.5.4.1 src/sys/dev/pci/ixgbe/ixgbe_x550.h
cvs rdiff -u -r1.125.2.11 -r1.125.2.12 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/share/man/man4/ixg.4
diff -u src/share/man/man4/ixg.4:1.12.4.1 src/share/man/man4/ixg.4:1.12.4.2
--- src/share/man/man4/ixg.4:1.12.4.1 Thu Mar 11 16:00:24 2021
+++ src/share/man/man4/ixg.4 Wed Sep 15 16:30:51 2021
@@ -1,4 +1,4 @@
-.\" $NetBSD: ixg.4,v 1.12.4.1 2021/03/11 16:00:24 martin Exp $
+.\" $NetBSD: ixg.4,v 1.12.4.2 2021/09/15 16:30:51 martin Exp $
.\"
.\" Copyright (c) 2001-2008, Intel Corporation
.\" All rights reserved.
@@ -33,7 +33,7 @@
.\"
.\" $FreeBSD: src/share/man/man4/ixgbe.4,v 1.3 2010/12/19 23:54:31 yongari Exp $
.\"
-.Dd March 9, 2021
+.Dd August 25, 2021
.Dt IXG 4
.Os
.Sh NAME
@@ -83,26 +83,6 @@ go to the Intel support website at:
.\" with a supported adapter, email the specific information related to the
.\" issue to
.\" .Aq [email protected] .
-.Sh OPTIONS
-The
-.Nm
-driver doesn't use the common
-.Xr MCLGET 9
-interface and use the driver specific cluster allocation mechanism.
-If it's exhausted, the
-.Xr evcnt 9
-counter "ixgX qY Rx no jumbo mbuf" is incremented.
-If this is observed,
-the number can be changed by the following config parameter:
-.Bl -tag -width IXGBE_JCLNUM_MULTI -offset 3n
-.It Dv IXGBE_JCLNUM_MULTI
-The number of RX jumbo buffers (clusters) per queue is calculated by
-.Dv IXGBE_JCLNUM_MULTI
-* (number of rx descriptors).
-The total number of clusters per queue is available via the
-.Li hw.ixgN.num_jcl_per_queue
-.Xr sysctl 7 .
-.El
.Sh SEE ALSO
.Xr arp 4 ,
.Xr ixv 4 ,
Index: src/share/man/man4/ixv.4
diff -u src/share/man/man4/ixv.4:1.4.2.2 src/share/man/man4/ixv.4:1.4.2.3
--- src/share/man/man4/ixv.4:1.4.2.2 Thu Mar 11 16:00:24 2021
+++ src/share/man/man4/ixv.4 Wed Sep 15 16:30:51 2021
@@ -1,4 +1,4 @@
-.\" $NetBSD: ixv.4,v 1.4.2.2 2021/03/11 16:00:24 martin Exp $
+.\" $NetBSD: ixv.4,v 1.4.2.3 2021/09/15 16:30:51 martin Exp $
.\"
.\" Copyright (c) 2018 The NetBSD Foundation, Inc.
.\" All rights reserved.
@@ -27,7 +27,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd March 9, 2021
+.Dd August 25, 2021
.Dt IXV 4
.Os
.Sh NAME
@@ -43,26 +43,6 @@ newer chips support.
It can be used on a
.Nx
guest that the host supports SR-IOV.
-.Sh OPTIONS
-The
-.Nm
-driver doesn't use the common
-.Xr MCLGET 9
-interface and use the driver specific cluster allocation mechanism.
-If it's exhausted, the
-.Xr evcnt 9
-counter "ixgX qY Rx no jumbo mbuf" is incremented.
-If this is observed,
-the number can be changed by the following config parameter:
-.Bl -tag -width IXGBE_JCLNUM_MULTI -offset 3n
-.It Dv IXGBE_JCLNUM_MULTI
-The number of RX jumbo buffers (clusters) per queue is calculated by
-.Dv IXGBE_JCLNUM_MULTI
-* (number of rx descriptors).
-The total number of clusters per queue is available with the
-.Li hw.ixgN.num_jcl_per_queue
-.Xr sysctl 7 .
-.El
.Sh SEE ALSO
.Xr arp 4 ,
.Xr ixg 4 ,
Index: src/sys/dev/pci/files.pci
diff -u src/sys/dev/pci/files.pci:1.413.2.3 src/sys/dev/pci/files.pci:1.413.2.4
--- src/sys/dev/pci/files.pci:1.413.2.3 Thu Mar 11 16:00:24 2021
+++ src/sys/dev/pci/files.pci Wed Sep 15 16:30:50 2021
@@ -1,4 +1,4 @@
-# $NetBSD: files.pci,v 1.413.2.3 2021/03/11 16:00:24 martin Exp $
+# $NetBSD: files.pci,v 1.413.2.4 2021/09/15 16:30:50 martin Exp $
#
# Config file and device description for machine-independent PCI code.
# Included by ports that need it. Requires that the SCSI files be
@@ -691,7 +691,6 @@ file dev/pci/ixgbe/ixgbe_phy.c ixg | ixv
file dev/pci/ixgbe/ixgbe_vf.c ixg | ixv
file dev/pci/ixgbe/if_bypass.c ixg | ixv
file dev/pci/ixgbe/if_fdir.c ixg | ixv
-defparam opt_ixgbe.h IXGBE_JCLNUM_MULTI
# This appears to be the driver for virtual instances of i82599.
device ixv: ether, ifnet, arp, mii, mii_phy
Index: src/sys/dev/pci/ixgbe/if_bypass.c
diff -u src/sys/dev/pci/ixgbe/if_bypass.c:1.4.8.2 src/sys/dev/pci/ixgbe/if_bypass.c:1.4.8.3
--- src/sys/dev/pci/ixgbe/if_bypass.c:1.4.8.2 Wed Sep 2 12:34:55 2020
+++ src/sys/dev/pci/ixgbe/if_bypass.c Wed Sep 15 16:30:50 2021
@@ -1,3 +1,4 @@
+/* $NetBSD: if_bypass.c,v 1.4.8.3 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
Copyright (c) 2001-2017, Intel Corporation
@@ -32,6 +33,8 @@
******************************************************************************/
/*$FreeBSD: head/sys/dev/ixgbe/if_bypass.c 327031 2017-12-20 18:15:06Z erj $*/
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: if_bypass.c,v 1.4.8.3 2021/09/15 16:30:50 martin Exp $");
#include "ixgbe.h"
@@ -669,7 +672,7 @@ ixgbe_bp_log(SYSCTLFN_ARGS)
const char *action_str[] = {"ignore", "normal", "bypass",
"isolate",};
- /* verify vaild data 1 - 6 */
+ /* verify valid data 1 - 6 */
if (event < BYPASS_EVENT_MAIN_ON || event > BYPASS_EVENT_USR)
event = 0;
Index: src/sys/dev/pci/ixgbe/ixgbe_osdep.c
diff -u src/sys/dev/pci/ixgbe/ixgbe_osdep.c:1.4.8.2 src/sys/dev/pci/ixgbe/ixgbe_osdep.c:1.4.8.3
--- src/sys/dev/pci/ixgbe/ixgbe_osdep.c:1.4.8.2 Sun Jan 26 11:03:17 2020
+++ src/sys/dev/pci/ixgbe/ixgbe_osdep.c Wed Sep 15 16:30:50 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: ixgbe_osdep.c,v 1.4.8.2 2020/01/26 11:03:17 martin Exp $ */
+/* $NetBSD: ixgbe_osdep.c,v 1.4.8.3 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
@@ -34,6 +34,9 @@
******************************************************************************/
/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_osdep.c 327031 2017-12-20 18:15:06Z erj $*/
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: ixgbe_osdep.c,v 1.4.8.3 2021/09/15 16:30:50 martin Exp $");
+
#include "ixgbe_osdep.h"
#include "ixgbe.h"
Index: src/sys/dev/pci/ixgbe/if_fdir.c
diff -u src/sys/dev/pci/ixgbe/if_fdir.c:1.2 src/sys/dev/pci/ixgbe/if_fdir.c:1.2.8.1
--- src/sys/dev/pci/ixgbe/if_fdir.c:1.2 Wed Apr 4 08:13:07 2018
+++ src/sys/dev/pci/ixgbe/if_fdir.c Wed Sep 15 16:30:50 2021
@@ -1,3 +1,4 @@
+/* $NetBSD: if_fdir.c,v 1.2.8.1 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
Copyright (c) 2001-2017, Intel Corporation
@@ -32,6 +33,9 @@
******************************************************************************/
/*$FreeBSD: head/sys/dev/ixgbe/if_fdir.c 327031 2017-12-20 18:15:06Z erj $*/
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: if_fdir.c,v 1.2.8.1 2021/09/15 16:30:50 martin Exp $");
+
#include "ixgbe.h"
#ifdef IXGBE_FDIR
Index: src/sys/dev/pci/ixgbe/ixgbe_fdir.h
diff -u src/sys/dev/pci/ixgbe/ixgbe_fdir.h:1.2 src/sys/dev/pci/ixgbe/ixgbe_fdir.h:1.2.8.1
--- src/sys/dev/pci/ixgbe/ixgbe_fdir.h:1.2 Wed Apr 4 08:13:07 2018
+++ src/sys/dev/pci/ixgbe/ixgbe_fdir.h Wed Sep 15 16:30:50 2021
@@ -1,3 +1,4 @@
+/* $NetBSD: ixgbe_fdir.h,v 1.2.8.1 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
Copyright (c) 2001-2017, Intel Corporation
Index: src/sys/dev/pci/ixgbe/if_sriov.c
diff -u src/sys/dev/pci/ixgbe/if_sriov.c:1.6 src/sys/dev/pci/ixgbe/if_sriov.c:1.6.2.1
--- src/sys/dev/pci/ixgbe/if_sriov.c:1.6 Thu Jun 27 05:55:40 2019
+++ src/sys/dev/pci/ixgbe/if_sriov.c Wed Sep 15 16:30:50 2021
@@ -1,3 +1,4 @@
+/* $NetBSD: if_sriov.c,v 1.6.2.1 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
Copyright (c) 2001-2017, Intel Corporation
@@ -32,6 +33,9 @@
******************************************************************************/
/*$FreeBSD: head/sys/dev/ixgbe/if_sriov.c 327031 2017-12-20 18:15:06Z erj $*/
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: if_sriov.c,v 1.6.2.1 2021/09/15 16:30:50 martin Exp $");
+
#include "ixgbe.h"
#include "ixgbe_sriov.h"
Index: src/sys/dev/pci/ixgbe/ix_txrx.c
diff -u src/sys/dev/pci/ixgbe/ix_txrx.c:1.54.2.5 src/sys/dev/pci/ixgbe/ix_txrx.c:1.54.2.6
--- src/sys/dev/pci/ixgbe/ix_txrx.c:1.54.2.5 Thu Mar 11 16:00:24 2021
+++ src/sys/dev/pci/ixgbe/ix_txrx.c Wed Sep 15 16:30:50 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: ix_txrx.c,v 1.54.2.5 2021/03/11 16:00:24 martin Exp $ */
+/* $NetBSD: ix_txrx.c,v 1.54.2.6 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
@@ -63,6 +63,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: ix_txrx.c,v 1.54.2.6 2021/09/15 16:30:50 martin Exp $");
+
#include "opt_inet.h"
#include "opt_inet6.h"
@@ -93,6 +96,10 @@ static bool ixgbe_rsc_enable = FALSE;
*/
static int atr_sample_rate = 20;
+#define IXGBE_M_ADJ(adapter, rxr, mp) \
+ if (adapter->max_frame_size <= (rxr->mbuf_sz - ETHER_ALIGN)) \
+ m_adj(mp, ETHER_ALIGN)
+
/************************************************************************
* Local Function prototypes
************************************************************************/
@@ -202,7 +209,7 @@ ixgbe_mq_start(struct ifnet *ifp, struct
{
struct adapter *adapter = ifp->if_softc;
struct tx_ring *txr;
- int i;
+ int i;
#ifdef RSS
uint32_t bucket_id;
#endif
@@ -482,6 +489,7 @@ retry:
return (error);
}
+#ifdef IXGBE_FDIR
/* Do the flow director magic */
if ((adapter->feat_en & IXGBE_FEATURE_FDIR) &&
(txr->atr_sample) && (!adapter->fdir_reinit)) {
@@ -491,12 +499,13 @@ retry:
txr->atr_count = 0;
}
}
+#endif
olinfo_status |= IXGBE_ADVTXD_CC;
i = txr->next_avail_desc;
for (j = 0; j < map->dm_nsegs; j++) {
bus_size_t seglen;
- bus_addr_t segaddr;
+ uint64_t segaddr;
txbuf = &txr->tx_buffers[i];
txd = &txr->tx_base[i];
@@ -1127,7 +1136,7 @@ ixgbe_txeof(struct tx_ring *txr)
* or the slot has the DD bit set.
*/
if (kring->nr_kflags < kring->nkr_num_slots &&
- txd[kring->nr_kflags].wb.status & IXGBE_TXD_STAT_DD) {
+ le32toh(txd[kring->nr_kflags].wb.status) & IXGBE_TXD_STAT_DD) {
netmap_tx_irq(ifp, txr->me);
}
return false;
@@ -1152,7 +1161,7 @@ ixgbe_txeof(struct tx_ring *txr)
if (eop == NULL) /* No work */
break;
- if ((eop->wb.status & IXGBE_TXD_STAT_DD) == 0)
+ if ((le32toh(eop->wb.status) & IXGBE_TXD_STAT_DD) == 0)
break; /* I/O not complete */
if (buf->m_head) {
@@ -1328,7 +1337,7 @@ ixgbe_setup_hw_rsc(struct rx_ring *rxr)
* be recalled to try again.
*
* XXX NetBSD TODO:
- * - The ixgbe_rxeof() function always preallocates mbuf cluster (jcl),
+ * - The ixgbe_rxeof() function always preallocates mbuf cluster,
* so the ixgbe_refresh_mbufs() function can be simplified.
*
************************************************************************/
@@ -1338,30 +1347,27 @@ ixgbe_refresh_mbufs(struct rx_ring *rxr,
struct adapter *adapter = rxr->adapter;
struct ixgbe_rx_buf *rxbuf;
struct mbuf *mp;
- int i, j, error;
+ int i, error;
bool refreshed = false;
- i = j = rxr->next_to_refresh;
- /* Control the loop with one beyond */
- if (++j == rxr->num_desc)
- j = 0;
+ i = rxr->next_to_refresh;
+ /* next_to_refresh points to the previous one */
+ if (++i == rxr->num_desc)
+ i = 0;
- while (j != limit) {
+ while (i != limit) {
rxbuf = &rxr->rx_buffers[i];
- if (rxbuf->buf == NULL) {
- mp = ixgbe_getjcl(&rxr->jcl_head, M_NOWAIT,
- MT_DATA, M_PKTHDR, rxr->mbuf_sz);
+ if (__predict_false(rxbuf->buf == NULL)) {
+ mp = ixgbe_getcl();
if (mp == NULL) {
- rxr->no_jmbuf.ev_count++;
+ rxr->no_mbuf.ev_count++;
goto update;
}
- if (adapter->max_frame_size <= (MCLBYTES - ETHER_ALIGN))
- m_adj(mp, ETHER_ALIGN);
+ mp->m_pkthdr.len = mp->m_len = rxr->mbuf_sz;
+ IXGBE_M_ADJ(adapter, rxr, mp);
} else
mp = rxbuf->buf;
- mp->m_pkthdr.len = mp->m_len = rxr->mbuf_sz;
-
/* If we're dealing with an mbuf that was copied rather
* than replaced, there's no need to go through busdma.
*/
@@ -1370,7 +1376,7 @@ ixgbe_refresh_mbufs(struct rx_ring *rxr,
ixgbe_dmamap_unload(rxr->ptag, rxbuf->pmap);
error = bus_dmamap_load_mbuf(rxr->ptag->dt_dmat,
rxbuf->pmap, mp, BUS_DMA_NOWAIT);
- if (error != 0) {
+ if (__predict_false(error != 0)) {
device_printf(adapter->dev, "Refresh mbufs: "
"payload dmamap load failure - %d\n",
error);
@@ -1389,11 +1395,10 @@ ixgbe_refresh_mbufs(struct rx_ring *rxr,
}
refreshed = true;
- /* Next is precalculated */
- i = j;
+ /* next_to_refresh points to the previous one */
rxr->next_to_refresh = i;
- if (++j == rxr->num_desc)
- j = 0;
+ if (++i == rxr->num_desc)
+ i = 0;
}
update:
@@ -1513,17 +1518,6 @@ ixgbe_setup_receive_ring(struct rx_ring
/* Free current RX buffer structs and their mbufs */
ixgbe_free_receive_ring(rxr);
- IXGBE_RX_UNLOCK(rxr);
- /*
- * Now reinitialize our supply of jumbo mbufs. The number
- * or size of jumbo mbufs may have changed.
- * Assume all of rxr->ptag are the same.
- */
- ixgbe_jcl_reinit(adapter, rxr->ptag->dt_dmat, rxr,
- adapter->num_jcl, adapter->rx_mbuf_sz);
-
- IXGBE_RX_LOCK(rxr);
-
/* Now replenish the mbufs */
for (int j = 0; j != rxr->num_desc; ++j) {
struct mbuf *mp;
@@ -1553,21 +1547,30 @@ ixgbe_setup_receive_ring(struct rx_ring
#endif /* DEV_NETMAP */
rxbuf->flags = 0;
- rxbuf->buf = ixgbe_getjcl(&rxr->jcl_head, M_NOWAIT,
- MT_DATA, M_PKTHDR, adapter->rx_mbuf_sz);
+ rxbuf->buf = ixgbe_getcl();
if (rxbuf->buf == NULL) {
+ rxr->no_mbuf.ev_count++;
error = ENOBUFS;
goto fail;
}
mp = rxbuf->buf;
mp->m_pkthdr.len = mp->m_len = rxr->mbuf_sz;
+ IXGBE_M_ADJ(adapter, rxr, mp);
/* Get the memory mapping */
error = bus_dmamap_load_mbuf(rxr->ptag->dt_dmat, rxbuf->pmap,
mp, BUS_DMA_NOWAIT);
- if (error != 0)
- goto fail;
+ if (error != 0) {
+ /*
+ * Clear this entry for later cleanup in
+ * ixgbe_discard() which is called via
+ * ixgbe_free_receive_ring().
+ */
+ m_freem(mp);
+ rxbuf->buf = NULL;
+ goto fail;
+ }
bus_dmamap_sync(rxr->ptag->dt_dmat, rxbuf->pmap,
- 0, adapter->rx_mbuf_sz, BUS_DMASYNC_PREREAD);
+ 0, mp->m_pkthdr.len, BUS_DMASYNC_PREREAD);
/* Update the descriptor and the cached value */
rxr->rx_base[j].read.pkt_addr =
htole64(rxbuf->pmap->dm_segs[0].ds_addr);
@@ -1576,8 +1579,9 @@ ixgbe_setup_receive_ring(struct rx_ring
/* Setup our descriptor indices */
rxr->next_to_check = 0;
- rxr->next_to_refresh = 0;
+ rxr->next_to_refresh = adapter->num_rx_desc - 1; /* Fully allocated */
rxr->lro_enabled = FALSE;
+ rxr->discard_multidesc = false;
rxr->rx_copies.ev_count = 0;
#if 0 /* NetBSD */
rxr->rx_bytes.ev_count = 0;
@@ -1699,9 +1703,6 @@ ixgbe_free_receive_buffers(struct rx_rin
}
}
- /* NetBSD specific. See ixgbe_netbsd.c */
- ixgbe_jcl_destroy(adapter, rxr);
-
if (rxr->rx_buffers != NULL) {
free(rxr->rx_buffers, M_DEVBUF);
rxr->rx_buffers = NULL;
@@ -1768,26 +1769,25 @@ ixgbe_rx_discard(struct rx_ring *rxr, in
rbuf = &rxr->rx_buffers[i];
/*
- * With advanced descriptors the writeback
- * clobbers the buffer addrs, so its easier
- * to just free the existing mbufs and take
- * the normal refresh path to get new buffers
- * and mapping.
+ * With advanced descriptors the writeback clobbers the buffer addrs,
+ * so its easier to just free the existing mbufs and take the normal
+ * refresh path to get new buffers and mapping.
*/
if (rbuf->fmp != NULL) {/* Partial chain ? */
bus_dmamap_sync(rxr->ptag->dt_dmat, rbuf->pmap, 0,
rbuf->buf->m_pkthdr.len, BUS_DMASYNC_POSTREAD);
+ ixgbe_dmamap_unload(rxr->ptag, rbuf->pmap);
m_freem(rbuf->fmp);
rbuf->fmp = NULL;
rbuf->buf = NULL; /* rbuf->buf is part of fmp's chain */
} else if (rbuf->buf) {
bus_dmamap_sync(rxr->ptag->dt_dmat, rbuf->pmap, 0,
rbuf->buf->m_pkthdr.len, BUS_DMASYNC_POSTREAD);
+ ixgbe_dmamap_unload(rxr->ptag, rbuf->pmap);
m_free(rbuf->buf);
rbuf->buf = NULL;
}
- ixgbe_dmamap_unload(rxr->ptag, rbuf->pmap);
rbuf->flags = 0;
@@ -1817,9 +1817,9 @@ ixgbe_rxeof(struct ix_queue *que)
struct ixgbe_rx_buf *rbuf, *nbuf;
int i, nextp, processed = 0;
u32 staterr = 0;
- u32 count = 0;
+ u32 loopcount = 0;
u32 limit = adapter->rx_process_limit;
- bool discard_multidesc = false;
+ bool discard_multidesc = rxr->discard_multidesc;
#ifdef RSS
u16 pkt_info;
#endif
@@ -1842,7 +1842,7 @@ ixgbe_rxeof(struct ix_queue *que)
* layer.
*/
for (i = rxr->next_to_check;
- (count < limit) || (discard_multidesc == true);) {
+ (loopcount < limit) || (discard_multidesc == true);) {
struct mbuf *sendmp, *mp;
struct mbuf *newmp;
@@ -1850,6 +1850,7 @@ ixgbe_rxeof(struct ix_queue *que)
u16 len;
u16 vtag = 0;
bool eop;
+ bool discard = false;
/* Sync the ring. */
ixgbe_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,
@@ -1864,8 +1865,8 @@ ixgbe_rxeof(struct ix_queue *que)
if ((staterr & IXGBE_RXD_STAT_DD) == 0)
break;
- count++;
- sendmp = NULL;
+ loopcount++;
+ sendmp = newmp = NULL;
nbuf = NULL;
rsc = 0;
cur->wb.upper.status_error = 0;
@@ -1889,14 +1890,30 @@ ixgbe_rxeof(struct ix_queue *que)
goto next_desc;
}
- /* pre-alloc new mbuf */
- if (!discard_multidesc)
- newmp = ixgbe_getjcl(&rxr->jcl_head, M_NOWAIT, MT_DATA,
- M_PKTHDR, rxr->mbuf_sz);
- else
- newmp = NULL;
- if (newmp == NULL) {
- rxr->no_jmbuf.ev_count++;
+ if (__predict_false(discard_multidesc))
+ discard = true;
+ else {
+ /* Pre-alloc new mbuf. */
+
+ if ((rbuf->fmp == NULL) &&
+ eop && (len <= adapter->rx_copy_len)) {
+ /* For short packet. See below. */
+ sendmp = m_gethdr(M_NOWAIT, MT_DATA);
+ if (__predict_false(sendmp == NULL)) {
+ rxr->no_mbuf.ev_count++;
+ discard = true;
+ }
+ } else {
+ /* For long packet. */
+ newmp = ixgbe_getcl();
+ if (__predict_false(newmp == NULL)) {
+ rxr->no_mbuf.ev_count++;
+ discard = true;
+ }
+ }
+ }
+
+ if (__predict_false(discard)) {
/*
* Descriptor initialization is already done by the
* above code (cur->wb.upper.status_error = 0).
@@ -1958,46 +1975,60 @@ ixgbe_rxeof(struct ix_queue *que)
* buffer struct and pass this along from one
* descriptor to the next, until we get EOP.
*/
- mp->m_len = len;
/*
* See if there is a stored head
* that determines what we are
*/
- sendmp = rbuf->fmp;
- if (sendmp != NULL) { /* secondary frag */
+ if (rbuf->fmp != NULL) {
+ /* Secondary frag */
+ sendmp = rbuf->fmp;
+
+ /* Update new (used in future) mbuf */
+ newmp->m_pkthdr.len = newmp->m_len = rxr->mbuf_sz;
+ IXGBE_M_ADJ(adapter, rxr, newmp);
rbuf->buf = newmp;
rbuf->fmp = NULL;
+
+ /* For secondary frag */
+ mp->m_len = len;
mp->m_flags &= ~M_PKTHDR;
+
+ /* For sendmp */
sendmp->m_pkthdr.len += mp->m_len;
} else {
/*
- * Optimize. This might be a small packet,
- * maybe just a TCP ACK. Do a fast copy that
- * is cache aligned into a new mbuf, and
- * leave the old mbuf+cluster for re-use.
+ * It's the first segment of a multi descriptor
+ * packet or a single segment which contains a full
+ * packet.
*/
- if (eop && len <= IXGBE_RX_COPY_LEN) {
- sendmp = m_gethdr(M_NOWAIT, MT_DATA);
- if (sendmp != NULL) {
- sendmp->m_data += IXGBE_RX_COPY_ALIGN;
- ixgbe_bcopy(mp->m_data, sendmp->m_data,
- len);
- sendmp->m_len = len;
- rxr->rx_copies.ev_count++;
- rbuf->flags |= IXGBE_RX_COPY;
- m_freem(newmp);
- }
- }
- if (sendmp == NULL) {
+ if (eop && (len <= adapter->rx_copy_len)) {
+ /*
+ * Optimize. This might be a small packet, may
+ * be just a TCP ACK. Copy into a new mbuf, and
+ * Leave the old mbuf+cluster for re-use.
+ */
+ sendmp->m_data += ETHER_ALIGN;
+ memcpy(mtod(sendmp, void *),
+ mtod(mp, void *), len);
+ rxr->rx_copies.ev_count++;
+ rbuf->flags |= IXGBE_RX_COPY;
+ } else {
+ /* Non short packet */
+
+ /* Update new (used in future) mbuf */
+ newmp->m_pkthdr.len = newmp->m_len
+ = rxr->mbuf_sz;
+ IXGBE_M_ADJ(adapter, rxr, newmp);
rbuf->buf = newmp;
rbuf->fmp = NULL;
+
+ /* For sendmp */
sendmp = mp;
}
/* first desc of a non-ps chain */
- sendmp->m_flags |= M_PKTHDR;
- sendmp->m_pkthdr.len = mp->m_len;
+ sendmp->m_pkthdr.len = sendmp->m_len = len;
}
++processed;
@@ -2089,15 +2120,11 @@ next_desc:
/* Advance our pointers to the next descriptor. */
if (++i == rxr->num_desc)
i = 0;
+ rxr->next_to_check = i;
/* Now send to the stack or do LRO */
- if (sendmp != NULL) {
- rxr->next_to_check = i;
- IXGBE_RX_UNLOCK(rxr);
+ if (sendmp != NULL)
ixgbe_rx_input(rxr, ifp, sendmp, ptype);
- IXGBE_RX_LOCK(rxr);
- i = rxr->next_to_check;
- }
/* Every 8 descriptors we go to refresh mbufs */
if (processed == 8) {
@@ -2106,12 +2133,13 @@ next_desc:
}
}
+ /* Save the current status */
+ rxr->discard_multidesc = discard_multidesc;
+
/* Refresh any remaining buf structs */
if (ixgbe_rx_unrefreshed(rxr))
ixgbe_refresh_mbufs(rxr, i);
- rxr->next_to_check = i;
-
IXGBE_RX_UNLOCK(rxr);
#ifdef LRO
@@ -2212,7 +2240,7 @@ ixgbe_dma_malloc(struct adapter *adapter
}
r = bus_dmamem_map(dma->dma_tag->dt_dmat, &dma->dma_seg, rsegs,
- size, &dma->dma_vaddr, BUS_DMA_NOWAIT);
+ size, &dma->dma_vaddr, BUS_DMA_NOWAIT | BUS_DMA_COHERENT);
if (r != 0) {
aprint_error_dev(dev, "%s: bus_dmamem_map failed; error %d\n",
__func__, r);
Index: src/sys/dev/pci/ixgbe/ixgbe.c
diff -u src/sys/dev/pci/ixgbe/ixgbe.c:1.199.2.13 src/sys/dev/pci/ixgbe/ixgbe.c:1.199.2.14
--- src/sys/dev/pci/ixgbe/ixgbe.c:1.199.2.13 Thu Mar 11 16:00:24 2021
+++ src/sys/dev/pci/ixgbe/ixgbe.c Wed Sep 15 16:30:50 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: ixgbe.c,v 1.199.2.13 2021/03/11 16:00:24 martin Exp $ */
+/* $NetBSD: ixgbe.c,v 1.199.2.14 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
@@ -63,11 +63,13 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: ixgbe.c,v 1.199.2.14 2021/09/15 16:30:50 martin Exp $");
+
#ifdef _KERNEL_OPT
#include "opt_inet.h"
#include "opt_inet6.h"
#include "opt_net_mpsafe.h"
-#include "opt_ixgbe.h"
#endif
#include "ixgbe.h"
@@ -172,7 +174,7 @@ static int ixgbe_ioctl(struct ifnet *, u
static int ixgbe_init(struct ifnet *);
static void ixgbe_init_locked(struct adapter *);
static void ixgbe_ifstop(struct ifnet *, int);
-static void ixgbe_stop(void *);
+static void ixgbe_stop_locked(void *);
static void ixgbe_init_device_features(struct adapter *);
static void ixgbe_check_fan_failure(struct adapter *, u32, bool);
static void ixgbe_add_media_types(struct adapter *);
@@ -246,12 +248,14 @@ static int ixgbe_sysctl_power_state(SYSC
static int ixgbe_sysctl_print_rss_config(SYSCTLFN_PROTO);
#endif
static int ixgbe_sysctl_next_to_check_handler(SYSCTLFN_PROTO);
+static int ixgbe_sysctl_next_to_refresh_handler(SYSCTLFN_PROTO);
static int ixgbe_sysctl_rdh_handler(SYSCTLFN_PROTO);
static int ixgbe_sysctl_rdt_handler(SYSCTLFN_PROTO);
static int ixgbe_sysctl_tdt_handler(SYSCTLFN_PROTO);
static int ixgbe_sysctl_tdh_handler(SYSCTLFN_PROTO);
static int ixgbe_sysctl_eee_state(SYSCTLFN_PROTO);
static int ixgbe_sysctl_debug(SYSCTLFN_PROTO);
+static int ixgbe_sysctl_rx_copy_len(SYSCTLFN_PROTO);
static int ixgbe_sysctl_wol_enable(SYSCTLFN_PROTO);
static int ixgbe_sysctl_wufc(SYSCTLFN_PROTO);
@@ -944,7 +948,8 @@ ixgbe_attach(device_t parent, device_t d
} else
adapter->num_rx_desc = ixgbe_rxd;
- adapter->num_jcl = adapter->num_rx_desc * IXGBE_JCLNUM_MULTI;
+ /* Set default high limit of copying mbuf in rxeof */
+ adapter->rx_copy_len = IXGBE_RX_COPY_LEN_MAX;
/* Allocate our TX/RX Queues */
if (ixgbe_allocate_queues(adapter)) {
@@ -968,7 +973,8 @@ ixgbe_attach(device_t parent, device_t d
unsupported_sfp = true;
error = IXGBE_SUCCESS;
} else if (error) {
- aprint_error_dev(dev, "Hardware initialization failed\n");
+ aprint_error_dev(dev,
+ "Hardware initialization failed(error = %d)\n", error);
error = EIO;
goto err_late;
}
@@ -1210,7 +1216,7 @@ ixgbe_attach(device_t parent, device_t d
/* For Netmap */
adapter->init_locked = ixgbe_init_locked;
- adapter->stop_locked = ixgbe_stop;
+ adapter->stop_locked = ixgbe_stop_locked;
if (adapter->feat_en & IXGBE_FEATURE_NETMAP)
ixgbe_netmap_attach(adapter);
@@ -1644,17 +1650,20 @@ ixgbe_update_stats_counters(struct adapt
stats->gorc.ev_count += IXGBE_READ_REG(hw, IXGBE_GORCL) +
((u64)IXGBE_READ_REG(hw, IXGBE_GORCH) << 32);
stats->gotc.ev_count += IXGBE_READ_REG(hw, IXGBE_GOTCL) +
- ((u64)IXGBE_READ_REG(hw, IXGBE_GOTCH) << 32) - total * ETHER_MIN_LEN;
+ ((u64)IXGBE_READ_REG(hw, IXGBE_GOTCH) << 32)
+ - total * ETHER_MIN_LEN;
stats->tor.ev_count += IXGBE_READ_REG(hw, IXGBE_TORL) +
((u64)IXGBE_READ_REG(hw, IXGBE_TORH) << 32);
stats->lxonrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXONRXCNT);
- stats->lxoffrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT);
+ stats->lxoffrxc.ev_count
+ += IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT);
} else {
stats->lxonrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXONRXC);
stats->lxoffrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXOFFRXC);
/* 82598 only has a counter in the high register */
stats->gorc.ev_count += IXGBE_READ_REG(hw, IXGBE_GORCH);
- stats->gotc.ev_count += IXGBE_READ_REG(hw, IXGBE_GOTCH) - total * ETHER_MIN_LEN;
+ stats->gotc.ev_count += IXGBE_READ_REG(hw, IXGBE_GOTCH)
+ - total * ETHER_MIN_LEN;
stats->tor.ev_count += IXGBE_READ_REG(hw, IXGBE_TORH);
}
@@ -1868,42 +1877,42 @@ ixgbe_add_hw_stats(struct adapter *adapt
#endif
if (sysctl_createv(log, 0, &rnode, &cnode,
- CTLFLAG_READONLY,
- CTLTYPE_INT,
- "rxd_nxck", SYSCTL_DESCR("Receive Descriptor next to check"),
- ixgbe_sysctl_next_to_check_handler, 0, (void *)rxr, 0,
+ CTLFLAG_READONLY, CTLTYPE_INT, "rxd_nxck",
+ SYSCTL_DESCR("Receive Descriptor next to check"),
+ ixgbe_sysctl_next_to_check_handler, 0, (void *)rxr, 0,
CTL_CREATE, CTL_EOL) != 0)
break;
if (sysctl_createv(log, 0, &rnode, &cnode,
- CTLFLAG_READONLY,
- CTLTYPE_INT,
- "rxd_head", SYSCTL_DESCR("Receive Descriptor Head"),
+ CTLFLAG_READONLY, CTLTYPE_INT, "rxd_nxrf",
+ SYSCTL_DESCR("Receive Descriptor next to refresh"),
+ ixgbe_sysctl_next_to_refresh_handler, 0, (void *)rxr, 0,
+ CTL_CREATE, CTL_EOL) != 0)
+ break;
+
+ if (sysctl_createv(log, 0, &rnode, &cnode,
+ CTLFLAG_READONLY, CTLTYPE_INT, "rxd_head",
+ SYSCTL_DESCR("Receive Descriptor Head"),
ixgbe_sysctl_rdh_handler, 0, (void *)rxr, 0,
CTL_CREATE, CTL_EOL) != 0)
break;
if (sysctl_createv(log, 0, &rnode, &cnode,
- CTLFLAG_READONLY,
- CTLTYPE_INT,
- "rxd_tail", SYSCTL_DESCR("Receive Descriptor Tail"),
+ CTLFLAG_READONLY, CTLTYPE_INT, "rxd_tail",
+ SYSCTL_DESCR("Receive Descriptor Tail"),
ixgbe_sysctl_rdt_handler, 0, (void *)rxr, 0,
CTL_CREATE, CTL_EOL) != 0)
break;
if (i < __arraycount(stats->qprc)) {
- evcnt_attach_dynamic(&stats->qprc[i],
- EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
- "qprc");
- evcnt_attach_dynamic(&stats->qptc[i],
- EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
- "qptc");
- evcnt_attach_dynamic(&stats->qbrc[i],
- EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
- "qbrc");
- evcnt_attach_dynamic(&stats->qbtc[i],
- EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
- "qbtc");
+ evcnt_attach_dynamic(&stats->qprc[i], EVCNT_TYPE_MISC,
+ NULL, adapter->queues[i].evnamebuf, "qprc");
+ evcnt_attach_dynamic(&stats->qptc[i], EVCNT_TYPE_MISC,
+ NULL, adapter->queues[i].evnamebuf, "qptc");
+ evcnt_attach_dynamic(&stats->qbrc[i], EVCNT_TYPE_MISC,
+ NULL, adapter->queues[i].evnamebuf, "qbrc");
+ evcnt_attach_dynamic(&stats->qbtc[i], EVCNT_TYPE_MISC,
+ NULL, adapter->queues[i].evnamebuf, "qbtc");
if (hw->mac.type >= ixgbe_mac_82599EB)
evcnt_attach_dynamic(&stats->qprdc[i],
EVCNT_TYPE_MISC, NULL,
@@ -1911,13 +1920,15 @@ ixgbe_add_hw_stats(struct adapter *adapt
}
evcnt_attach_dynamic(&rxr->rx_packets, EVCNT_TYPE_MISC,
- NULL, adapter->queues[i].evnamebuf, "Queue Packets Received");
+ NULL, adapter->queues[i].evnamebuf,
+ "Queue Packets Received");
evcnt_attach_dynamic(&rxr->rx_bytes, EVCNT_TYPE_MISC,
- NULL, adapter->queues[i].evnamebuf, "Queue Bytes Received");
+ NULL, adapter->queues[i].evnamebuf,
+ "Queue Bytes Received");
evcnt_attach_dynamic(&rxr->rx_copies, EVCNT_TYPE_MISC,
NULL, adapter->queues[i].evnamebuf, "Copied RX Frames");
- evcnt_attach_dynamic(&rxr->no_jmbuf, EVCNT_TYPE_MISC,
- NULL, adapter->queues[i].evnamebuf, "Rx no jumbo mbuf");
+ evcnt_attach_dynamic(&rxr->no_mbuf, EVCNT_TYPE_MISC,
+ NULL, adapter->queues[i].evnamebuf, "Rx no mbuf");
evcnt_attach_dynamic(&rxr->rx_discarded, EVCNT_TYPE_MISC,
NULL, adapter->queues[i].evnamebuf, "Rx discarded");
#ifdef LRO
@@ -2115,7 +2126,7 @@ ixgbe_clear_evcnt(struct adapter *adapte
rxr->rx_packets.ev_count = 0;
rxr->rx_bytes.ev_count = 0;
rxr->rx_copies.ev_count = 0;
- rxr->no_jmbuf.ev_count = 0;
+ rxr->no_mbuf.ev_count = 0;
rxr->rx_discarded.ev_count = 0;
}
stats->ipcs.ev_count = 0;
@@ -2252,6 +2263,32 @@ ixgbe_sysctl_next_to_check_handler(SYSCT
} /* ixgbe_sysctl_next_to_check_handler */
/************************************************************************
+ * ixgbe_sysctl_next_to_refresh_handler - Receive Descriptor next to check
+ * handler function
+ *
+ * Retrieves the next_to_refresh value
+ ************************************************************************/
+static int
+ixgbe_sysctl_next_to_refresh_handler(SYSCTLFN_ARGS)
+{
+ struct sysctlnode node = *rnode;
+ struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
+ struct adapter *adapter;
+ uint32_t val;
+
+ if (!rxr)
+ return (0);
+
+ adapter = rxr->adapter;
+ if (ixgbe_fw_recovery_mode_swflag(adapter))
+ return (EPERM);
+
+ val = rxr->next_to_refresh;
+ node.sysctl_data = &val;
+ return sysctl_lookup(SYSCTLFN_CALL(&node));
+} /* ixgbe_sysctl_next_to_refresh_handler */
+
+/************************************************************************
* ixgbe_sysctl_rdh_handler - Receive Descriptor Head handler function
*
* Retrieves the RDH value from the hardware
@@ -3136,8 +3173,11 @@ ixgbe_msix_link(void *arg)
retval = hw->phy.ops.check_overtemp(hw);
if (retval != IXGBE_ERR_OVERTEMP)
break;
- device_printf(adapter->dev, "CRITICAL: OVER TEMP!! PHY IS SHUT DOWN!!\n");
- device_printf(adapter->dev, "System shutdown required!\n");
+ device_printf(adapter->dev,
+ "CRITICAL: OVER TEMP!! "
+ "PHY IS SHUT DOWN!!\n");
+ device_printf(adapter->dev,
+ "System shutdown required!\n");
break;
default:
if (!(eicr & IXGBE_EICR_TS))
@@ -3291,20 +3331,21 @@ ixgbe_add_device_sysctls(struct adapter
if (sysctl_createv(log, 0, &rnode, &cnode,
CTLFLAG_READWRITE, CTLTYPE_INT,
"debug", SYSCTL_DESCR("Debug Info"),
- ixgbe_sysctl_debug, 0, (void *)adapter, 0, CTL_CREATE, CTL_EOL) != 0)
+ ixgbe_sysctl_debug, 0, (void *)adapter, 0, CTL_CREATE, CTL_EOL)
+ != 0)
aprint_error_dev(dev, "could not create sysctl\n");
if (sysctl_createv(log, 0, &rnode, &cnode,
- CTLFLAG_READONLY, CTLTYPE_INT,
- "num_rx_desc", SYSCTL_DESCR("Number of rx descriptors"),
- NULL, 0, &adapter->num_rx_desc, 0, CTL_CREATE, CTL_EOL) != 0)
+ CTLFLAG_READWRITE, CTLTYPE_INT,
+ "rx_copy_len", SYSCTL_DESCR("RX Copy Length"),
+ ixgbe_sysctl_rx_copy_len, 0,
+ (void *)adapter, 0, CTL_CREATE, CTL_EOL) != 0)
aprint_error_dev(dev, "could not create sysctl\n");
if (sysctl_createv(log, 0, &rnode, &cnode,
- CTLFLAG_READONLY, CTLTYPE_INT, "num_jcl_per_queue",
- SYSCTL_DESCR("Number of jumbo buffers per queue"),
- NULL, 0, &adapter->num_jcl, 0, CTL_CREATE,
- CTL_EOL) != 0)
+ CTLFLAG_READONLY, CTLTYPE_INT,
+ "num_rx_desc", SYSCTL_DESCR("Number of rx descriptors"),
+ NULL, 0, &adapter->num_rx_desc, 0, CTL_CREATE, CTL_EOL) != 0)
aprint_error_dev(dev, "could not create sysctl\n");
if (sysctl_createv(log, 0, &rnode, &cnode,
@@ -3345,8 +3386,10 @@ ixgbe_add_device_sysctls(struct adapter
*/
adapter->txrx_use_workqueue = ixgbe_txrx_workqueue;
if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
- CTLTYPE_BOOL, "txrx_workqueue", SYSCTL_DESCR("Use workqueue for packet processing"),
- NULL, 0, &adapter->txrx_use_workqueue, 0, CTL_CREATE, CTL_EOL) != 0)
+ CTLTYPE_BOOL, "txrx_workqueue",
+ SYSCTL_DESCR("Use workqueue for packet processing"),
+ NULL, 0, &adapter->txrx_use_workqueue, 0, CTL_CREATE,
+ CTL_EOL) != 0)
aprint_error_dev(dev, "could not create sysctl\n");
#ifdef IXGBE_DEBUG
@@ -3409,7 +3452,8 @@ ixgbe_add_device_sysctls(struct adapter
if (sysctl_createv(log, 0, &phy_node, &cnode, CTLFLAG_READONLY,
CTLTYPE_INT, "overtemp_occurred",
- SYSCTL_DESCR("External PHY High Temperature Event Occurred"),
+ SYSCTL_DESCR(
+ "External PHY High Temperature Event Occurred"),
ixgbe_sysctl_phy_overtemp_occurred, 0, (void *)adapter, 0,
CTL_CREATE, CTL_EOL) != 0)
aprint_error_dev(dev, "could not create sysctl\n");
@@ -3567,8 +3611,9 @@ ixgbe_detach(device_t dev, int flags)
}
/*
- * Stop the interface. ixgbe_setup_low_power_mode() calls ixgbe_stop(),
- * so it's not required to call ixgbe_stop() directly.
+ * Stop the interface. ixgbe_setup_low_power_mode() calls
+ * ixgbe_stop_locked(), so it's not required to call ixgbe_stop_locked()
+ * directly.
*/
IXGBE_CORE_LOCK(adapter);
ixgbe_setup_low_power_mode(adapter);
@@ -3666,7 +3711,7 @@ ixgbe_detach(device_t dev, int flags)
evcnt_detach(&rxr->rx_packets);
evcnt_detach(&rxr->rx_bytes);
evcnt_detach(&rxr->rx_copies);
- evcnt_detach(&rxr->no_jmbuf);
+ evcnt_detach(&rxr->no_mbuf);
evcnt_detach(&rxr->rx_discarded);
}
evcnt_detach(&stats->ipcs);
@@ -3752,7 +3797,7 @@ ixgbe_setup_low_power_mode(struct adapte
hw->phy.ops.enter_lplu) {
/* X550EM baseT adapters need a special LPLU flow */
hw->phy.reset_disable = true;
- ixgbe_stop(adapter);
+ ixgbe_stop_locked(adapter);
error = hw->phy.ops.enter_lplu(hw);
if (error)
device_printf(dev,
@@ -3760,7 +3805,7 @@ ixgbe_setup_low_power_mode(struct adapte
hw->phy.reset_disable = false;
} else {
/* Just stop for other adapters */
- ixgbe_stop(adapter);
+ ixgbe_stop_locked(adapter);
}
if (!hw->wol_enabled) {
@@ -3909,7 +3954,7 @@ ixgbe_init_locked(struct adapter *adapte
u32 rxdctl, rxctrl;
u32 ctrl_ext;
bool unsupported_sfp = false;
- int i, j, err;
+ int i, j, error;
/* XXX check IFF_UP and IFF_RUNNING, power-saving state! */
@@ -3945,7 +3990,7 @@ ixgbe_init_locked(struct adapter *adapte
/* Prepare transmit descriptors and buffers */
if (ixgbe_setup_transmit_structures(adapter)) {
device_printf(dev, "Could not setup transmit structures\n");
- ixgbe_stop(adapter);
+ ixgbe_stop_locked(adapter);
return;
}
@@ -3958,16 +4003,15 @@ ixgbe_init_locked(struct adapter *adapte
/* Setup Multicast table */
ixgbe_set_rxfilter(adapter);
- /* Determine the correct mbuf pool, based on frame size */
- if (adapter->max_frame_size <= MCLBYTES)
- adapter->rx_mbuf_sz = MCLBYTES;
- else
- adapter->rx_mbuf_sz = MJUMPAGESIZE;
+ /* Use fixed buffer size, even for jumbo frames */
+ adapter->rx_mbuf_sz = MCLBYTES;
/* Prepare receive descriptors and buffers */
- if (ixgbe_setup_receive_structures(adapter)) {
- device_printf(dev, "Could not setup receive structures\n");
- ixgbe_stop(adapter);
+ error = ixgbe_setup_receive_structures(adapter);
+ if (error) {
+ device_printf(dev,
+ "Could not setup receive structures (err = %d)\n", error);
+ ixgbe_stop_locked(adapter);
return;
}
@@ -4089,8 +4133,8 @@ ixgbe_init_locked(struct adapter *adapte
* need to be kick-started
*/
if (hw->phy.type == ixgbe_phy_none) {
- err = hw->phy.ops.identify(hw);
- if (err == IXGBE_ERR_SFP_NOT_SUPPORTED)
+ error = hw->phy.ops.identify(hw);
+ if (error == IXGBE_ERR_SFP_NOT_SUPPORTED)
unsupported_sfp = true;
} else if (hw->phy.type == ixgbe_phy_sfp_unsupported)
unsupported_sfp = true;
@@ -4566,7 +4610,7 @@ ixgbe_recovery_mode_timer(void *arg)
device_printf(adapter->dev, "Firmware recovery mode detected. Limiting functionality. Refer to the Intel(R) Ethernet Adapters and Devices User Guide for details on firmware recovery mode.\n");
if (hw->adapter_stopped == FALSE)
- ixgbe_stop(adapter);
+ ixgbe_stop_locked(adapter);
}
} else
atomic_cas_uint(&adapter->recovery_mode, 1, 0);
@@ -4736,18 +4780,18 @@ ixgbe_ifstop(struct ifnet *ifp, int disa
struct adapter *adapter = ifp->if_softc;
IXGBE_CORE_LOCK(adapter);
- ixgbe_stop(adapter);
+ ixgbe_stop_locked(adapter);
IXGBE_CORE_UNLOCK(adapter);
}
/************************************************************************
- * ixgbe_stop - Stop the hardware
+ * ixgbe_stop_locked - Stop the hardware
*
* Disables all traffic on the adapter by issuing a
* global reset on the MAC and deallocates TX/RX buffers.
************************************************************************/
static void
-ixgbe_stop(void *arg)
+ixgbe_stop_locked(void *arg)
{
struct ifnet *ifp;
struct adapter *adapter = arg;
@@ -4757,7 +4801,7 @@ ixgbe_stop(void *arg)
KASSERT(mutex_owned(&adapter->core_mtx));
- INIT_DEBUGOUT("ixgbe_stop: begin\n");
+ INIT_DEBUGOUT("ixgbe_stop_locked: begin\n");
ixgbe_disable_intr(adapter);
callout_stop(&adapter->timer);
@@ -4780,7 +4824,7 @@ ixgbe_stop(void *arg)
ixgbe_set_rar(&adapter->hw, 0, adapter->hw.mac.addr, 0, IXGBE_RAH_AV);
return;
-} /* ixgbe_stop */
+} /* ixgbe_stop_locked */
/************************************************************************
* ixgbe_update_link_status - Update OS on link state
@@ -5393,8 +5437,7 @@ ixgbe_set_advertise(struct adapter *adap
}
if (advertise < 0x0 || advertise > 0x3f) {
- device_printf(dev,
- "Invalid advertised speed; valid modes are 0x0 through 0x3f\n");
+ device_printf(dev, "Invalid advertised speed; valid modes are 0x0 through 0x3f\n");
return (EINVAL);
}
@@ -6019,6 +6062,31 @@ ixgbe_sysctl_debug(SYSCTLFN_ARGS)
} /* ixgbe_sysctl_debug */
/************************************************************************
+ * ixgbe_sysctl_rx_copy_len
+ ************************************************************************/
+static int
+ixgbe_sysctl_rx_copy_len(SYSCTLFN_ARGS)
+{
+ struct sysctlnode node = *rnode;
+ struct adapter *adapter = (struct adapter *)node.sysctl_data;
+ int error;
+ int result = adapter->rx_copy_len;
+
+ node.sysctl_data = &result;
+ error = sysctl_lookup(SYSCTLFN_CALL(&node));
+
+ if (error || newp == NULL)
+ return error;
+
+ if ((result < 0) || (result > IXGBE_RX_COPY_LEN_MAX))
+ return EINVAL;
+
+ adapter->rx_copy_len = result;
+
+ return 0;
+} /* ixgbe_sysctl_rx_copy_len */
+
+/************************************************************************
* ixgbe_init_device_features
************************************************************************/
static void
@@ -6379,7 +6447,8 @@ ixgbe_check_fan_failure(struct adapter *
IXGBE_ESDP_SDP1;
if (reg & mask)
- device_printf(adapter->dev, "\nCRITICAL: FAN FAILURE!! REPLACE IMMEDIATELY!!\n");
+ device_printf(adapter->dev,
+ "\nCRITICAL: FAN FAILURE!! REPLACE IMMEDIATELY!!\n");
} /* ixgbe_check_fan_failure */
/************************************************************************
@@ -6520,7 +6589,8 @@ alloc_retry:
softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
ixgbe_deferred_mq_start, txr);
- snprintf(wqname, sizeof(wqname), "%sdeferTx", device_xname(dev));
+ snprintf(wqname, sizeof(wqname), "%sdeferTx",
+ device_xname(dev));
defertx_error = workqueue_create(&adapter->txr_wq, wqname,
ixgbe_deferred_mq_start_work, adapter, IXGBE_WORKQUEUE_PRI,
IPL_NET, IXGBE_WORKQUEUE_FLAGS);
@@ -6690,7 +6760,8 @@ ixgbe_allocate_msix(struct adapter *adap
ixgbe_deferred_mq_start_work, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
IXGBE_WORKQUEUE_FLAGS);
if (error) {
- aprint_error_dev(dev, "couldn't create workqueue for deferred Tx\n");
+ aprint_error_dev(dev,
+ "couldn't create workqueue for deferred Tx\n");
goto err_out;
}
adapter->txr_wq_enqueued = percpu_alloc(sizeof(u_int));
Index: src/sys/dev/pci/ixgbe/ixgbe.h
diff -u src/sys/dev/pci/ixgbe/ixgbe.h:1.56.2.4 src/sys/dev/pci/ixgbe/ixgbe.h:1.56.2.5
--- src/sys/dev/pci/ixgbe/ixgbe.h:1.56.2.4 Thu Mar 11 16:00:24 2021
+++ src/sys/dev/pci/ixgbe/ixgbe.h Wed Sep 15 16:30:50 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: ixgbe.h,v 1.56.2.4 2021/03/11 16:00:24 martin Exp $ */
+/* $NetBSD: ixgbe.h,v 1.56.2.5 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
SPDX-License-Identifier: BSD-3-Clause
@@ -183,10 +183,7 @@
* modern Intel CPUs, results in 40 bytes wasted and a significant drop
* in observed efficiency of the optimization, 97.9% -> 81.8%.
*/
-#define MPKTHSIZE (offsetof(struct _mbuf_dummy, m_pktdat))
-#define IXGBE_RX_COPY_HDR_PADDED ((((MPKTHSIZE - 1) / 32) + 1) * 32)
-#define IXGBE_RX_COPY_LEN (MSIZE - IXGBE_RX_COPY_HDR_PADDED)
-#define IXGBE_RX_COPY_ALIGN (IXGBE_RX_COPY_HDR_PADDED - MPKTHSIZE)
+#define IXGBE_RX_COPY_LEN_MAX (MHLEN - ETHER_ALIGN)
/* Keep older OS drivers building... */
#if !defined(SYSCTL_ADD_UQUAD)
@@ -331,8 +328,8 @@ struct ix_queue {
struct evcnt irqs; /* Hardware interrupt */
struct evcnt handleq; /* software_interrupt */
struct evcnt req; /* deferred */
- char namebuf[32];
- char evnamebuf[32];
+ char namebuf[32]; /* Name for sysctl */
+ char evnamebuf[32]; /* Name for evcnt */
/* Lock for disabled_count and this queue's EIMS/EIMC bit */
kmutex_t dc_mtx;
@@ -410,6 +407,7 @@ struct rx_ring {
bool lro_enabled;
bool hw_rsc;
bool vtag_strip;
+ bool discard_multidesc;
u16 next_to_refresh;
u16 next_to_check;
u16 num_desc;
@@ -419,9 +417,6 @@ struct rx_ring {
#endif
struct ixgbe_rx_buf *rx_buffers;
ixgbe_dma_tag_t *ptag;
- u16 last_rx_mbuf_sz;
- u32 last_num_rx_desc;
- ixgbe_extmem_head_t jcl_head;
u64 bytes; /* Used for AIM calc */
u64 packets;
@@ -431,7 +426,7 @@ struct rx_ring {
struct evcnt rx_packets;
struct evcnt rx_bytes;
struct evcnt rx_discarded;
- struct evcnt no_jmbuf;
+ struct evcnt no_mbuf;
u64 rsc_num;
/* Flow Director */
@@ -560,7 +555,7 @@ struct adapter {
u64 active_queues;
u32 num_rx_desc;
u32 rx_process_limit;
- int num_jcl;
+ u32 rx_copy_len;
/* Multicast array memory */
struct ixgbe_mc_addr *mta;
@@ -758,12 +753,8 @@ void ixgbe_free_receive_structures(struc
bool ixgbe_txeof(struct tx_ring *);
bool ixgbe_rxeof(struct ix_queue *);
-const struct sysctlnode *ixgbe_sysctl_instance(struct adapter *);
-
/* For NetBSD */
-void ixgbe_jcl_reinit(struct adapter *, bus_dma_tag_t, struct rx_ring *,
- int, size_t);
-void ixgbe_jcl_destroy(struct adapter *, struct rx_ring *);
+const struct sysctlnode *ixgbe_sysctl_instance(struct adapter *);
#include "ixgbe_bypass.h"
#include "ixgbe_fdir.h"
Index: src/sys/dev/pci/ixgbe/ixgbe_82598.c
diff -u src/sys/dev/pci/ixgbe/ixgbe_82598.c:1.12.8.3 src/sys/dev/pci/ixgbe/ixgbe_82598.c:1.12.8.4
--- src/sys/dev/pci/ixgbe/ixgbe_82598.c:1.12.8.3 Fri Jul 10 11:35:51 2020
+++ src/sys/dev/pci/ixgbe/ixgbe_82598.c Wed Sep 15 16:30:50 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: ixgbe_82598.c,v 1.12.8.3 2020/07/10 11:35:51 martin Exp $ */
+/* $NetBSD: ixgbe_82598.c,v 1.12.8.4 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
SPDX-License-Identifier: BSD-3-Clause
@@ -35,6 +35,9 @@
******************************************************************************/
/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_82598.c 331224 2018-03-19 20:55:05Z erj $*/
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: ixgbe_82598.c,v 1.12.8.4 2021/09/15 16:30:50 martin Exp $");
+
#include "ixgbe_type.h"
#include "ixgbe_82598.h"
#include "ixgbe_api.h"
Index: src/sys/dev/pci/ixgbe/ixgbe_82599.c
diff -u src/sys/dev/pci/ixgbe/ixgbe_82599.c:1.21.4.1 src/sys/dev/pci/ixgbe/ixgbe_82599.c:1.21.4.2
--- src/sys/dev/pci/ixgbe/ixgbe_82599.c:1.21.4.1 Tue Jan 28 11:09:27 2020
+++ src/sys/dev/pci/ixgbe/ixgbe_82599.c Wed Sep 15 16:30:50 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: ixgbe_82599.c,v 1.21.4.1 2020/01/28 11:09:27 martin Exp $ */
+/* $NetBSD: ixgbe_82599.c,v 1.21.4.2 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
SPDX-License-Identifier: BSD-3-Clause
@@ -35,6 +35,9 @@
******************************************************************************/
/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_82599.c 331224 2018-03-19 20:55:05Z erj $*/
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: ixgbe_82599.c,v 1.21.4.2 2021/09/15 16:30:50 martin Exp $");
+
#include "ixgbe_type.h"
#include "ixgbe_82599.h"
#include "ixgbe_api.h"
Index: src/sys/dev/pci/ixgbe/ixgbe_api.c
diff -u src/sys/dev/pci/ixgbe/ixgbe_api.c:1.23.2.1 src/sys/dev/pci/ixgbe/ixgbe_api.c:1.23.2.2
--- src/sys/dev/pci/ixgbe/ixgbe_api.c:1.23.2.1 Sun Jan 26 11:03:17 2020
+++ src/sys/dev/pci/ixgbe/ixgbe_api.c Wed Sep 15 16:30:50 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: ixgbe_api.c,v 1.23.2.1 2020/01/26 11:03:17 martin Exp $ */
+/* $NetBSD: ixgbe_api.c,v 1.23.2.2 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
SPDX-License-Identifier: BSD-3-Clause
@@ -35,6 +35,9 @@
******************************************************************************/
/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_api.c 331224 2018-03-19 20:55:05Z erj $*/
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: ixgbe_api.c,v 1.23.2.2 2021/09/15 16:30:50 martin Exp $");
+
#include "ixgbe_api.h"
#include "ixgbe_common.h"
Index: src/sys/dev/pci/ixgbe/ixgbe_bypass.h
diff -u src/sys/dev/pci/ixgbe/ixgbe_bypass.h:1.1 src/sys/dev/pci/ixgbe/ixgbe_bypass.h:1.1.14.1
--- src/sys/dev/pci/ixgbe/ixgbe_bypass.h:1.1 Wed Aug 30 08:49:18 2017
+++ src/sys/dev/pci/ixgbe/ixgbe_bypass.h Wed Sep 15 16:30:50 2021
@@ -1,3 +1,4 @@
+/* $NetBSD: ixgbe_bypass.h,v 1.1.14.1 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
Copyright (c) 2001-2017, Intel Corporation
Index: src/sys/dev/pci/ixgbe/ixgbe_netmap.h
diff -u src/sys/dev/pci/ixgbe/ixgbe_netmap.h:1.1 src/sys/dev/pci/ixgbe/ixgbe_netmap.h:1.1.14.1
--- src/sys/dev/pci/ixgbe/ixgbe_netmap.h:1.1 Wed Aug 30 08:49:18 2017
+++ src/sys/dev/pci/ixgbe/ixgbe_netmap.h Wed Sep 15 16:30:50 2021
@@ -1,3 +1,4 @@
+/* $NetBSD: ixgbe_netmap.h,v 1.1.14.1 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
Copyright (c) 2001-2017, Intel Corporation
Index: src/sys/dev/pci/ixgbe/ixgbe_common.c
diff -u src/sys/dev/pci/ixgbe/ixgbe_common.c:1.25.2.3 src/sys/dev/pci/ixgbe/ixgbe_common.c:1.25.2.4
--- src/sys/dev/pci/ixgbe/ixgbe_common.c:1.25.2.3 Wed Sep 2 12:34:55 2020
+++ src/sys/dev/pci/ixgbe/ixgbe_common.c Wed Sep 15 16:30:50 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: ixgbe_common.c,v 1.25.2.3 2020/09/02 12:34:55 martin Exp $ */
+/* $NetBSD: ixgbe_common.c,v 1.25.2.4 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
SPDX-License-Identifier: BSD-3-Clause
@@ -35,6 +35,9 @@
******************************************************************************/
/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_common.c 331224 2018-03-19 20:55:05Z erj $*/
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: ixgbe_common.c,v 1.25.2.4 2021/09/15 16:30:50 martin Exp $");
+
#include "ixgbe_common.h"
#include "ixgbe_phy.h"
#include "ixgbe_dcb.h"
@@ -1138,7 +1141,7 @@ s32 ixgbe_stop_adapter_generic(struct ix
* This function is called in the state of both interrupt disabled
* and interrupt enabled, e.g.
* + interrupt disabled case:
- * - ixgbe_stop()
+ * - ixgbe_stop_locked()
* - ixgbe_disable_intr() // interrupt disabled here
* - ixgbe_stop_adapter()
* - hw->mac.ops.stop_adapter()
@@ -5048,8 +5051,8 @@ s32 ixgbe_bypass_rw_generic(struct ixgbe
* ixgbe_bypass_valid_rd_generic - Verify valid return from bit-bang.
*
* If we send a write we can't be sure it took until we can read back
- * that same register. It can be a problem as some of the feilds may
- * for valid reasons change inbetween the time wrote the register and
+ * that same register. It can be a problem as some of the fields may
+ * for valid reasons change in-between the time wrote the register and
* we read it again to verify. So this function check everything we
* can check and then assumes it worked.
*
@@ -5102,7 +5105,7 @@ bool ixgbe_bypass_valid_rd_generic(u32 i
}
/**
- * ixgbe_bypass_set_generic - Set a bypass field in the FW CTRL Regiter.
+ * ixgbe_bypass_set_generic - Set a bypass field in the FW CTRL Register.
*
* @hw: pointer to hardware structure
* @cmd: The control word we are setting.
@@ -5148,7 +5151,7 @@ s32 ixgbe_bypass_set_generic(struct ixgb
}
/**
- * ixgbe_bypass_rd_eep_generic - Read the bypass FW eeprom addres.
+ * ixgbe_bypass_rd_eep_generic - Read the bypass FW eeprom address.
*
* @hw: pointer to hardware structure
* @addr: The bypass eeprom address to read.
Index: src/sys/dev/pci/ixgbe/ixgbe_dcb.c
diff -u src/sys/dev/pci/ixgbe/ixgbe_dcb.c:1.9 src/sys/dev/pci/ixgbe/ixgbe_dcb.c:1.9.4.1
--- src/sys/dev/pci/ixgbe/ixgbe_dcb.c:1.9 Mon Sep 3 16:29:33 2018
+++ src/sys/dev/pci/ixgbe/ixgbe_dcb.c Wed Sep 15 16:30:50 2021
@@ -1,3 +1,4 @@
+/* $NetBSD: ixgbe_dcb.c,v 1.9.4.1 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
SPDX-License-Identifier: BSD-3-Clause
@@ -33,6 +34,8 @@
******************************************************************************/
/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_dcb.c 331224 2018-03-19 20:55:05Z erj $*/
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: ixgbe_dcb.c,v 1.9.4.1 2021/09/15 16:30:50 martin Exp $");
#include "ixgbe_type.h"
#include "ixgbe_dcb.h"
Index: src/sys/dev/pci/ixgbe/ixgbe_dcb.h
diff -u src/sys/dev/pci/ixgbe/ixgbe_dcb.h:1.6 src/sys/dev/pci/ixgbe/ixgbe_dcb.h:1.6.8.1
--- src/sys/dev/pci/ixgbe/ixgbe_dcb.h:1.6 Wed Apr 4 08:13:07 2018
+++ src/sys/dev/pci/ixgbe/ixgbe_dcb.h Wed Sep 15 16:30:50 2021
@@ -1,3 +1,4 @@
+/* $NetBSD: ixgbe_dcb.h,v 1.6.8.1 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
SPDX-License-Identifier: BSD-3-Clause
Index: src/sys/dev/pci/ixgbe/ixgbe_dcb_82598.h
diff -u src/sys/dev/pci/ixgbe/ixgbe_dcb_82598.h:1.6 src/sys/dev/pci/ixgbe/ixgbe_dcb_82598.h:1.6.8.1
--- src/sys/dev/pci/ixgbe/ixgbe_dcb_82598.h:1.6 Wed Apr 4 08:13:07 2018
+++ src/sys/dev/pci/ixgbe/ixgbe_dcb_82598.h Wed Sep 15 16:30:50 2021
@@ -1,3 +1,5 @@
+/* $NetBSD: ixgbe_dcb_82598.h,v 1.6.8.1 2021/09/15 16:30:50 martin Exp $ */
+
/******************************************************************************
SPDX-License-Identifier: BSD-3-Clause
Index: src/sys/dev/pci/ixgbe/ixgbe_dcb_82599.h
diff -u src/sys/dev/pci/ixgbe/ixgbe_dcb_82599.h:1.6 src/sys/dev/pci/ixgbe/ixgbe_dcb_82599.h:1.6.8.1
--- src/sys/dev/pci/ixgbe/ixgbe_dcb_82599.h:1.6 Wed Apr 4 08:13:07 2018
+++ src/sys/dev/pci/ixgbe/ixgbe_dcb_82599.h Wed Sep 15 16:30:50 2021
@@ -1,3 +1,4 @@
+/* $NetBSD: ixgbe_dcb_82599.h,v 1.6.8.1 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
SPDX-License-Identifier: BSD-3-Clause
Index: src/sys/dev/pci/ixgbe/ixgbe_dcb_82598.c
diff -u src/sys/dev/pci/ixgbe/ixgbe_dcb_82598.c:1.7 src/sys/dev/pci/ixgbe/ixgbe_dcb_82598.c:1.7.8.1
--- src/sys/dev/pci/ixgbe/ixgbe_dcb_82598.c:1.7 Wed Apr 4 08:59:22 2018
+++ src/sys/dev/pci/ixgbe/ixgbe_dcb_82598.c Wed Sep 15 16:30:50 2021
@@ -1,3 +1,4 @@
+/* $NetBSD: ixgbe_dcb_82598.c,v 1.7.8.1 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
SPDX-License-Identifier: BSD-3-Clause
@@ -33,6 +34,8 @@
******************************************************************************/
/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_dcb_82598.c 331224 2018-03-19 20:55:05Z erj $*/
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: ixgbe_dcb_82598.c,v 1.7.8.1 2021/09/15 16:30:50 martin Exp $");
#include "ixgbe_type.h"
#include "ixgbe_dcb.h"
Index: src/sys/dev/pci/ixgbe/ixgbe_dcb_82599.c
diff -u src/sys/dev/pci/ixgbe/ixgbe_dcb_82599.c:1.7 src/sys/dev/pci/ixgbe/ixgbe_dcb_82599.c:1.7.8.1
--- src/sys/dev/pci/ixgbe/ixgbe_dcb_82599.c:1.7 Wed Apr 4 08:59:22 2018
+++ src/sys/dev/pci/ixgbe/ixgbe_dcb_82599.c Wed Sep 15 16:30:50 2021
@@ -1,3 +1,4 @@
+/* $NetBSD: ixgbe_dcb_82599.c,v 1.7.8.1 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
SPDX-License-Identifier: BSD-3-Clause
@@ -33,6 +34,8 @@
******************************************************************************/
/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_dcb_82599.c 331224 2018-03-19 20:55:05Z erj $*/
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: ixgbe_dcb_82599.c,v 1.7.8.1 2021/09/15 16:30:50 martin Exp $");
#include "ixgbe_type.h"
#include "ixgbe_dcb.h"
Index: src/sys/dev/pci/ixgbe/ixgbe_features.h
diff -u src/sys/dev/pci/ixgbe/ixgbe_features.h:1.2 src/sys/dev/pci/ixgbe/ixgbe_features.h:1.2.4.1
--- src/sys/dev/pci/ixgbe/ixgbe_features.h:1.2 Thu Dec 6 13:25:02 2018
+++ src/sys/dev/pci/ixgbe/ixgbe_features.h Wed Sep 15 16:30:50 2021
@@ -1,3 +1,4 @@
+/* $NetBSD: ixgbe_features.h,v 1.2.4.1 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
Copyright (c) 2001-2017, Intel Corporation
Index: src/sys/dev/pci/ixgbe/ixgbe_mbx.c
diff -u src/sys/dev/pci/ixgbe/ixgbe_mbx.c:1.11 src/sys/dev/pci/ixgbe/ixgbe_mbx.c:1.11.2.1
--- src/sys/dev/pci/ixgbe/ixgbe_mbx.c:1.11 Thu Jun 27 05:55:40 2019
+++ src/sys/dev/pci/ixgbe/ixgbe_mbx.c Wed Sep 15 16:30:50 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: ixgbe_mbx.c,v 1.11 2019/06/27 05:55:40 msaitoh Exp $ */
+/* $NetBSD: ixgbe_mbx.c,v 1.11.2.1 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
SPDX-License-Identifier: BSD-3-Clause
@@ -35,6 +35,9 @@
******************************************************************************/
/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_mbx.c 326022 2017-11-20 19:36:21Z pfg $*/
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: ixgbe_mbx.c,v 1.11.2.1 2021/09/15 16:30:50 martin Exp $");
+
#include "ixgbe_type.h"
#include "ixgbe_mbx.h"
Index: src/sys/dev/pci/ixgbe/ixgbe_netbsd.c
diff -u src/sys/dev/pci/ixgbe/ixgbe_netbsd.c:1.9.4.3 src/sys/dev/pci/ixgbe/ixgbe_netbsd.c:1.9.4.4
--- src/sys/dev/pci/ixgbe/ixgbe_netbsd.c:1.9.4.3 Fri Jul 10 11:35:51 2020
+++ src/sys/dev/pci/ixgbe/ixgbe_netbsd.c Wed Sep 15 16:30:50 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: ixgbe_netbsd.c,v 1.9.4.3 2020/07/10 11:35:51 martin Exp $ */
+/* $NetBSD: ixgbe_netbsd.c,v 1.9.4.4 2021/09/15 16:30:50 martin Exp $ */
/*
* Copyright (c) 2011 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -27,6 +27,10 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: ixgbe_netbsd.c,v 1.9.4.4 2021/09/15 16:30:50 martin Exp $");
+
#include <sys/param.h>
#include <sys/atomic.h>
@@ -95,192 +99,19 @@ ixgbe_dmamap_create(ixgbe_dma_tag_t *dt,
dt->dt_maxsegsize, dt->dt_boundary, flags, dmamp);
}
-static void
-ixgbe_putext(ixgbe_extmem_t *em)
-{
- ixgbe_extmem_head_t *eh = em->em_head;
-
- mutex_enter(&eh->eh_mtx);
-
- TAILQ_INSERT_HEAD(&eh->eh_freelist, em, em_link);
-
- mutex_exit(&eh->eh_mtx);
-
- return;
-}
-
-static ixgbe_extmem_t *
-ixgbe_getext(ixgbe_extmem_head_t *eh, size_t size)
-{
- ixgbe_extmem_t *em;
-
- mutex_enter(&eh->eh_mtx);
-
- TAILQ_FOREACH(em, &eh->eh_freelist, em_link) {
- if (em->em_size >= size)
- break;
- }
-
- if (em != NULL)
- TAILQ_REMOVE(&eh->eh_freelist, em, em_link);
-
- mutex_exit(&eh->eh_mtx);
-
- return em;
-}
-
-static ixgbe_extmem_t *
-ixgbe_newext(ixgbe_extmem_head_t *eh, bus_dma_tag_t dmat, size_t size)
-{
- ixgbe_extmem_t *em;
- int nseg, rc;
-
- em = kmem_zalloc(sizeof(*em), KM_SLEEP);
-
- rc = bus_dmamem_alloc(dmat, size, PAGE_SIZE, 0, &em->em_seg, 1, &nseg,
- BUS_DMA_WAITOK);
-
- if (rc != 0)
- goto post_zalloc_err;
-
- rc = bus_dmamem_map(dmat, &em->em_seg, 1, size, &em->em_vaddr,
- BUS_DMA_WAITOK);
-
- if (rc != 0)
- goto post_dmamem_err;
-
- em->em_dmat = dmat;
- em->em_size = size;
- em->em_head = eh;
-
- return em;
-post_dmamem_err:
- bus_dmamem_free(dmat, &em->em_seg, 1);
-post_zalloc_err:
- kmem_free(em, sizeof(*em));
- return NULL;
-}
-
-static void
-ixgbe_jcl_freeall(struct adapter *adapter, struct rx_ring *rxr)
-{
- ixgbe_extmem_head_t *eh = &rxr->jcl_head;
- ixgbe_extmem_t *em;
- bus_dma_tag_t dmat = rxr->ptag->dt_dmat;
-
- while ((em = ixgbe_getext(eh, 0)) != NULL) {
- KASSERT(em->em_vaddr != NULL);
- bus_dmamem_unmap(dmat, em->em_vaddr, em->em_size);
- bus_dmamem_free(dmat, &em->em_seg, 1);
- memset(em, 0, sizeof(*em));
- kmem_free(em, sizeof(*em));
- }
-}
-void
-ixgbe_jcl_reinit(struct adapter *adapter, bus_dma_tag_t dmat,
- struct rx_ring *rxr, int nbuf, size_t size)
-{
- ixgbe_extmem_head_t *eh = &rxr->jcl_head;
- ixgbe_extmem_t *em;
- int i;
-
- if (!eh->eh_initialized) {
- TAILQ_INIT(&eh->eh_freelist);
- mutex_init(&eh->eh_mtx, MUTEX_DEFAULT, IPL_NET);
- eh->eh_initialized = true;
- }
-
- /*
- * Check previous parameters. If it's not required to reinit, just
- * return.
- *
- * Note that the num_rx_desc is currently fixed value. It's never
- * changed after device is attached.
- */
- if ((rxr->last_rx_mbuf_sz == rxr->mbuf_sz)
- && (rxr->last_num_rx_desc == adapter->num_rx_desc))
- return;
-
- /* Free all dmamem */
- ixgbe_jcl_freeall(adapter, rxr);
-
- for (i = 0; i < nbuf; i++) {
- if ((em = ixgbe_newext(eh, dmat, size)) == NULL) {
- device_printf(adapter->dev,
- "%s: only %d of %d jumbo buffers allocated\n",
- __func__, i, nbuf);
- break;
- }
- ixgbe_putext(em);
- }
-
- /* Keep current parameters */
- rxr->last_rx_mbuf_sz = adapter->rx_mbuf_sz;
- rxr->last_num_rx_desc = adapter->num_rx_desc;
-}
-
-void
-ixgbe_jcl_destroy(struct adapter *adapter, struct rx_ring *rxr)
-{
- ixgbe_extmem_head_t *eh = &rxr->jcl_head;
-
- if (eh->eh_initialized) {
- /* Free all dmamem */
- ixgbe_jcl_freeall(adapter, rxr);
-
- mutex_destroy(&eh->eh_mtx);
- eh->eh_initialized = false;
- }
-}
-
-
-static void
-ixgbe_jcl_free(struct mbuf *m, void *buf, size_t size, void *arg)
-{
- ixgbe_extmem_t *em = arg;
-
- KASSERT(em->em_size == size);
-
- ixgbe_putext(em);
- /* this is an abstraction violation, but it does not lead to a
- * double-free
- */
- if (__predict_true(m != NULL)) {
- KASSERT(m->m_type != MT_FREE);
- m->m_type = MT_FREE;
- pool_cache_put(mb_cache, m);
- }
-}
-
-/* XXX need to wait for the system to finish with each jumbo mbuf and
- * free it before detaching the driver from the device.
- */
struct mbuf *
-ixgbe_getjcl(ixgbe_extmem_head_t *eh, int nowait /* M_DONTWAIT */,
- int type /* MT_DATA */, int flags /* M_PKTHDR */, size_t size)
+ixgbe_getcl(void)
{
- ixgbe_extmem_t *em;
struct mbuf *m;
- if ((flags & M_PKTHDR) != 0)
- m = m_gethdr(nowait, type);
- else
- m = m_get(nowait, type);
+ MGETHDR(m, M_DONTWAIT, MT_DATA);
if (m == NULL)
return NULL;
- em = ixgbe_getext(eh, size);
- if (em == NULL) {
- m_freem(m);
- return NULL;
- }
-
- MEXTADD(m, em->em_vaddr, em->em_size, M_DEVBUF, &ixgbe_jcl_free, em);
-
+ MCLGET(m, M_DONTWAIT);
if ((m->m_flags & M_EXT) == 0) {
- ixgbe_putext(em);
m_freem(m);
return NULL;
}
@@ -303,15 +134,5 @@ ixgbe_pci_enable_busmaster(pci_chipset_t
u_int
atomic_load_acq_uint(volatile u_int *p)
{
- u_int rv;
-
- rv = *p;
- /*
- * XXX
- * membar_sync() is far more than we need on most CPUs;
- * we just don't have an MI load-acqure operation.
- */
- membar_sync();
-
- return rv;
+ return atomic_load_acquire(p);
}
Index: src/sys/dev/pci/ixgbe/ixgbe_netbsd.h
diff -u src/sys/dev/pci/ixgbe/ixgbe_netbsd.h:1.11.4.1 src/sys/dev/pci/ixgbe/ixgbe_netbsd.h:1.11.4.2
--- src/sys/dev/pci/ixgbe/ixgbe_netbsd.h:1.11.4.1 Thu Mar 11 16:00:24 2021
+++ src/sys/dev/pci/ixgbe/ixgbe_netbsd.h Wed Sep 15 16:30:50 2021
@@ -1,4 +1,4 @@
-/*$NetBSD: ixgbe_netbsd.h,v 1.11.4.1 2021/03/11 16:00:24 martin Exp $*/
+/* $NetBSD: ixgbe_netbsd.h,v 1.11.4.2 2021/09/15 16:30:50 martin Exp $ */
/*
* Copyright (c) 2011 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -40,20 +40,6 @@
#define MJUM16BYTES (16 * 1024)
#define MJUMPAGESIZE PAGE_SIZE
-/*
- * Number of jcl per queue is calculated by
- * adapter->num_rx_desc * IXGBE_JCLNUM_MULTI. The lower limit is 2.
- */
-#define IXGBE_JCLNUM_MULTI_LOWLIM 2
-#define IXGBE_JCLNUM_MULTI_DEFAULT 3
-#if !defined(IXGBE_JCLNUM_MULTI)
-# define IXGBE_JCLNUM_MULTI IXGBE_JCLNUM_MULTI_DEFAULT
-#else
-# if (IXGBE_JCLNUM_MULTI < IXGBE_JCLNUM_MULTI_LOWLIM)
-# error IXGBE_JCLNUM_MULTI is too low.
-# endif
-#endif
-
#define IFCAP_RXCSUM \
(IFCAP_CSUM_IPv4_Rx|IFCAP_CSUM_TCPv4_Rx|IFCAP_CSUM_UDPv4_Rx|\
IFCAP_CSUM_TCPv6_Rx|IFCAP_CSUM_UDPv6_Rx)
@@ -76,35 +62,15 @@ struct ixgbe_dma_tag {
typedef struct ixgbe_dma_tag ixgbe_dma_tag_t;
-struct ixgbe_extmem_head;
-typedef struct ixgbe_extmem_head ixgbe_extmem_head_t;
-
-struct ixgbe_extmem {
- ixgbe_extmem_head_t *em_head;
- bus_dma_tag_t em_dmat;
- bus_size_t em_size;
- bus_dma_segment_t em_seg;
- void *em_vaddr;
- TAILQ_ENTRY(ixgbe_extmem) em_link;
-};
-
-typedef struct ixgbe_extmem ixgbe_extmem_t;
-
-struct ixgbe_extmem_head {
- TAILQ_HEAD(, ixgbe_extmem) eh_freelist;
- kmutex_t eh_mtx;
- bool eh_initialized;
-};
-
-int ixgbe_dma_tag_create(bus_dma_tag_t, bus_size_t, bus_size_t, bus_size_t, int,
- bus_size_t, int, ixgbe_dma_tag_t **);
+int ixgbe_dma_tag_create(bus_dma_tag_t, bus_size_t, bus_size_t, bus_size_t,
+ int, bus_size_t, int, ixgbe_dma_tag_t **);
void ixgbe_dma_tag_destroy(ixgbe_dma_tag_t *);
int ixgbe_dmamap_create(ixgbe_dma_tag_t *, int, bus_dmamap_t *);
void ixgbe_dmamap_destroy(ixgbe_dma_tag_t *, bus_dmamap_t);
void ixgbe_dmamap_sync(ixgbe_dma_tag_t *, bus_dmamap_t, int);
void ixgbe_dmamap_unload(ixgbe_dma_tag_t *, bus_dmamap_t);
-struct mbuf *ixgbe_getjcl(ixgbe_extmem_head_t *, int, int, int, size_t);
+struct mbuf *ixgbe_getcl(void);
void ixgbe_pci_enable_busmaster(pci_chipset_tag_t, pcitag_t);
u_int atomic_load_acq_uint(volatile u_int *);
Index: src/sys/dev/pci/ixgbe/ixgbe_netmap.c
diff -u src/sys/dev/pci/ixgbe/ixgbe_netmap.c:1.2 src/sys/dev/pci/ixgbe/ixgbe_netmap.c:1.2.2.1
--- src/sys/dev/pci/ixgbe/ixgbe_netmap.c:1.2 Thu Jun 27 05:55:40 2019
+++ src/sys/dev/pci/ixgbe/ixgbe_netmap.c Wed Sep 15 16:30:50 2021
@@ -1,3 +1,4 @@
+/* $NetBSD: ixgbe_netmap.c,v 1.2.2.1 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
Copyright (c) 2001-2017, Intel Corporation
@@ -69,6 +70,9 @@
* it near the beginning of the standard driver.
*/
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: ixgbe_netmap.c,v 1.2.2.1 2021/09/15 16:30:50 martin Exp $");
+
#ifdef DEV_NETMAP
/*
* Some drivers may need the following headers. Others
Index: src/sys/dev/pci/ixgbe/ixgbe_osdep.h
diff -u src/sys/dev/pci/ixgbe/ixgbe_osdep.h:1.23.6.3 src/sys/dev/pci/ixgbe/ixgbe_osdep.h:1.23.6.4
--- src/sys/dev/pci/ixgbe/ixgbe_osdep.h:1.23.6.3 Fri Jul 10 11:35:51 2020
+++ src/sys/dev/pci/ixgbe/ixgbe_osdep.h Wed Sep 15 16:30:50 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: ixgbe_osdep.h,v 1.23.6.3 2020/07/10 11:35:51 martin Exp $ */
+/* $NetBSD: ixgbe_osdep.h,v 1.23.6.4 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
SPDX-License-Identifier: BSD-3-Clause
@@ -167,25 +167,6 @@ void prefetch(void *x)
#define prefetch(x)
#endif
-/*
- * Optimized bcopy thanks to Luigi Rizzo's investigative work. Assumes
- * non-overlapping regions and 32-byte padding on both src and dst.
- */
-static __inline int
-ixgbe_bcopy(void *restrict _src, void *restrict _dst, int l)
-{
- uint64_t *src = _src;
- uint64_t *dst = _dst;
-
- for (; l > 0; l -= 32) {
- *dst++ = *src++;
- *dst++ = *src++;
- *dst++ = *src++;
- *dst++ = *src++;
- }
- return (0);
-}
-
struct ixgbe_osdep
{
struct ethercom ec;
@@ -195,7 +176,6 @@ struct ixgbe_osdep
bus_space_handle_t mem_bus_space_handle;
bus_size_t mem_size;
bus_dma_tag_t dmat;
- u16 last_rx_mbuf_sz;
pci_intr_handle_t *intrs;
int nintrs;
void *ihs[IXG_MAX_NINTR];
Index: src/sys/dev/pci/ixgbe/ixgbe_phy.c
diff -u src/sys/dev/pci/ixgbe/ixgbe_phy.c:1.18.4.3 src/sys/dev/pci/ixgbe/ixgbe_phy.c:1.18.4.4
--- src/sys/dev/pci/ixgbe/ixgbe_phy.c:1.18.4.3 Fri Jul 10 11:35:51 2020
+++ src/sys/dev/pci/ixgbe/ixgbe_phy.c Wed Sep 15 16:30:50 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: ixgbe_phy.c,v 1.18.4.3 2020/07/10 11:35:51 martin Exp $ */
+/* $NetBSD: ixgbe_phy.c,v 1.18.4.4 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
SPDX-License-Identifier: BSD-3-Clause
@@ -35,6 +35,9 @@
******************************************************************************/
/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_phy.c 331224 2018-03-19 20:55:05Z erj $*/
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: ixgbe_phy.c,v 1.18.4.4 2021/09/15 16:30:50 martin Exp $");
+
#include "ixgbe_api.h"
#include "ixgbe_common.h"
#include "ixgbe_phy.h"
Index: src/sys/dev/pci/ixgbe/ixgbe_rss.h
diff -u src/sys/dev/pci/ixgbe/ixgbe_rss.h:1.4 src/sys/dev/pci/ixgbe/ixgbe_rss.h:1.4.8.1
--- src/sys/dev/pci/ixgbe/ixgbe_rss.h:1.4 Wed Apr 4 08:13:07 2018
+++ src/sys/dev/pci/ixgbe/ixgbe_rss.h Wed Sep 15 16:30:50 2021
@@ -1,3 +1,4 @@
+/* $NetBSD: ixgbe_rss.h,v 1.4.8.1 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
Copyright (c) 2001-2017, Intel Corporation
Index: src/sys/dev/pci/ixgbe/ixgbe_sriov.h
diff -u src/sys/dev/pci/ixgbe/ixgbe_sriov.h:1.3 src/sys/dev/pci/ixgbe/ixgbe_sriov.h:1.3.8.1
--- src/sys/dev/pci/ixgbe/ixgbe_sriov.h:1.3 Wed Apr 4 08:13:07 2018
+++ src/sys/dev/pci/ixgbe/ixgbe_sriov.h Wed Sep 15 16:30:50 2021
@@ -1,3 +1,4 @@
+/* $NetBSD: ixgbe_sriov.h,v 1.3.8.1 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
Copyright (c) 2001-2017, Intel Corporation
Index: src/sys/dev/pci/ixgbe/ixgbe_type.h
diff -u src/sys/dev/pci/ixgbe/ixgbe_type.h:1.41.2.2 src/sys/dev/pci/ixgbe/ixgbe_type.h:1.41.2.3
--- src/sys/dev/pci/ixgbe/ixgbe_type.h:1.41.2.2 Tue Jan 28 11:09:27 2020
+++ src/sys/dev/pci/ixgbe/ixgbe_type.h Wed Sep 15 16:30:50 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: ixgbe_type.h,v 1.41.2.2 2020/01/28 11:09:27 martin Exp $ */
+/* $NetBSD: ixgbe_type.h,v 1.41.2.3 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
SPDX-License-Identifier: BSD-3-Clause
@@ -2773,7 +2773,7 @@ enum {
#define IXGBE_RXDADV_ERR_FDIR_LEN 0x00100000 /* FDIR Length error */
#define IXGBE_RXDADV_ERR_FDIR_DROP 0x00200000 /* FDIR Drop error */
#define IXGBE_RXDADV_ERR_FDIR_COLL 0x00400000 /* FDIR Collision error */
-#define IXGBE_RXDADV_ERR_HBO 0x00800000 /*Header Buffer Overflow */
+#define IXGBE_RXDADV_ERR_HBO 0x00800000 /* Header Buffer Overflow */
#define IXGBE_RXDADV_ERR_CE 0x01000000 /* CRC Error */
#define IXGBE_RXDADV_ERR_LE 0x02000000 /* Length Error */
#define IXGBE_RXDADV_ERR_PE 0x08000000 /* Packet Error */
Index: src/sys/dev/pci/ixgbe/ixgbe_vf.c
diff -u src/sys/dev/pci/ixgbe/ixgbe_vf.c:1.18.2.3 src/sys/dev/pci/ixgbe/ixgbe_vf.c:1.18.2.4
--- src/sys/dev/pci/ixgbe/ixgbe_vf.c:1.18.2.3 Thu Mar 11 16:00:24 2021
+++ src/sys/dev/pci/ixgbe/ixgbe_vf.c Wed Sep 15 16:30:50 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: ixgbe_vf.c,v 1.18.2.3 2021/03/11 16:00:24 martin Exp $ */
+/* $NetBSD: ixgbe_vf.c,v 1.18.2.4 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
SPDX-License-Identifier: BSD-3-Clause
@@ -35,6 +35,8 @@
******************************************************************************/
/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_vf.c 331224 2018-03-19 20:55:05Z erj $*/
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: ixgbe_vf.c,v 1.18.2.4 2021/09/15 16:30:50 martin Exp $");
#include "ixgbe_api.h"
#include "ixgbe_type.h"
Index: src/sys/dev/pci/ixgbe/ixgbe_x540.c
diff -u src/sys/dev/pci/ixgbe/ixgbe_x540.c:1.16.8.1 src/sys/dev/pci/ixgbe/ixgbe_x540.c:1.16.8.2
--- src/sys/dev/pci/ixgbe/ixgbe_x540.c:1.16.8.1 Thu Mar 11 16:00:24 2021
+++ src/sys/dev/pci/ixgbe/ixgbe_x540.c Wed Sep 15 16:30:50 2021
@@ -1,3 +1,5 @@
+/* $NetBSD: ixgbe_x540.c,v 1.16.8.2 2021/09/15 16:30:50 martin Exp $ */
+
/******************************************************************************
SPDX-License-Identifier: BSD-3-Clause
@@ -33,6 +35,9 @@
******************************************************************************/
/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_x540.c 331224 2018-03-19 20:55:05Z erj $*/
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: ixgbe_x540.c,v 1.16.8.2 2021/09/15 16:30:50 martin Exp $");
+
#include "ixgbe_x540.h"
#include "ixgbe_type.h"
#include "ixgbe_api.h"
Index: src/sys/dev/pci/ixgbe/ixgbe_x540.h
diff -u src/sys/dev/pci/ixgbe/ixgbe_x540.h:1.8 src/sys/dev/pci/ixgbe/ixgbe_x540.h:1.8.8.1
--- src/sys/dev/pci/ixgbe/ixgbe_x540.h:1.8 Wed Apr 4 08:13:07 2018
+++ src/sys/dev/pci/ixgbe/ixgbe_x540.h Wed Sep 15 16:30:50 2021
@@ -1,3 +1,4 @@
+/* $NetBSD: ixgbe_x540.h,v 1.8.8.1 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
SPDX-License-Identifier: BSD-3-Clause
Index: src/sys/dev/pci/ixgbe/ixgbe_x550.c
diff -u src/sys/dev/pci/ixgbe/ixgbe_x550.c:1.15.2.3 src/sys/dev/pci/ixgbe/ixgbe_x550.c:1.15.2.4
--- src/sys/dev/pci/ixgbe/ixgbe_x550.c:1.15.2.3 Fri Jul 10 11:35:51 2020
+++ src/sys/dev/pci/ixgbe/ixgbe_x550.c Wed Sep 15 16:30:50 2021
@@ -1,3 +1,5 @@
+/* $NetBSD: ixgbe_x550.c,v 1.15.2.4 2021/09/15 16:30:50 martin Exp $ */
+
/******************************************************************************
Copyright (c) 2001-2017, Intel Corporation
@@ -32,6 +34,9 @@
******************************************************************************/
/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_x550.c 331224 2018-03-19 20:55:05Z erj $*/
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: ixgbe_x550.c,v 1.15.2.4 2021/09/15 16:30:50 martin Exp $");
+
#include "ixgbe_x550.h"
#include "ixgbe_x540.h"
#include "ixgbe_type.h"
Index: src/sys/dev/pci/ixgbe/ixgbe_x550.h
diff -u src/sys/dev/pci/ixgbe/ixgbe_x550.h:1.5 src/sys/dev/pci/ixgbe/ixgbe_x550.h:1.5.4.1
--- src/sys/dev/pci/ixgbe/ixgbe_x550.h:1.5 Thu Dec 6 13:25:02 2018
+++ src/sys/dev/pci/ixgbe/ixgbe_x550.h Wed Sep 15 16:30:50 2021
@@ -1,3 +1,4 @@
+/* $NetBSD: ixgbe_x550.h,v 1.5.4.1 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
Copyright (c) 2001-2017, Intel Corporation
Index: src/sys/dev/pci/ixgbe/ixv.c
diff -u src/sys/dev/pci/ixgbe/ixv.c:1.125.2.11 src/sys/dev/pci/ixgbe/ixv.c:1.125.2.12
--- src/sys/dev/pci/ixgbe/ixv.c:1.125.2.11 Thu Mar 11 16:00:24 2021
+++ src/sys/dev/pci/ixgbe/ixv.c Wed Sep 15 16:30:50 2021
@@ -1,4 +1,4 @@
-/*$NetBSD: ixv.c,v 1.125.2.11 2021/03/11 16:00:24 martin Exp $*/
+/* $NetBSD: ixv.c,v 1.125.2.12 2021/09/15 16:30:50 martin Exp $ */
/******************************************************************************
@@ -34,11 +34,13 @@
******************************************************************************/
/*$FreeBSD: head/sys/dev/ixgbe/if_ixv.c 331224 2018-03-19 20:55:05Z erj $*/
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: ixv.c,v 1.125.2.12 2021/09/15 16:30:50 martin Exp $");
+
#ifdef _KERNEL_OPT
#include "opt_inet.h"
#include "opt_inet6.h"
#include "opt_net_mpsafe.h"
-#include "opt_ixgbe.h"
#endif
#include "ixgbe.h"
@@ -91,7 +93,7 @@ static int ixv_ioctl(struct ifnet *, u_l
static int ixv_init(struct ifnet *);
static void ixv_init_locked(struct adapter *);
static void ixv_ifstop(struct ifnet *, int);
-static void ixv_stop(void *);
+static void ixv_stop_locked(void *);
static void ixv_init_device_features(struct adapter *);
static void ixv_media_status(struct ifnet *, struct ifmediareq *);
static int ixv_media_change(struct ifnet *);
@@ -139,10 +141,12 @@ static void ixv_set_sysctl_value(struct
const char *, int *, int);
static int ixv_sysctl_interrupt_rate_handler(SYSCTLFN_PROTO);
static int ixv_sysctl_next_to_check_handler(SYSCTLFN_PROTO);
+static int ixv_sysctl_next_to_refresh_handler(SYSCTLFN_PROTO);
static int ixv_sysctl_rdh_handler(SYSCTLFN_PROTO);
static int ixv_sysctl_rdt_handler(SYSCTLFN_PROTO);
static int ixv_sysctl_tdt_handler(SYSCTLFN_PROTO);
static int ixv_sysctl_tdh_handler(SYSCTLFN_PROTO);
+static int ixv_sysctl_rx_copy_len(SYSCTLFN_PROTO);
/* The MSI-X Interrupt handlers */
static int ixv_msix_que(void *);
@@ -325,7 +329,7 @@ ixv_attach(device_t parent, device_t dev
hw = &adapter->hw;
adapter->init_locked = ixv_init_locked;
- adapter->stop_locked = ixv_stop;
+ adapter->stop_locked = ixv_stop_locked;
adapter->osdep.pc = pa->pa_pc;
adapter->osdep.tag = pa->pa_tag;
@@ -499,7 +503,8 @@ ixv_attach(device_t parent, device_t dev
} else
adapter->num_rx_desc = ixv_rxd;
- adapter->num_jcl = adapter->num_rx_desc * IXGBE_JCLNUM_MULTI;
+ /* Set default high limit of copying mbuf in rxeof */
+ adapter->rx_copy_len = IXGBE_RX_COPY_LEN_MAX;
/* Setup MSI-X */
error = ixv_configure_interrupts(adapter);
@@ -651,7 +656,7 @@ ixv_detach(device_t dev, int flags)
evcnt_detach(&rxr->rx_packets);
evcnt_detach(&rxr->rx_bytes);
evcnt_detach(&rxr->rx_copies);
- evcnt_detach(&rxr->no_jmbuf);
+ evcnt_detach(&rxr->no_mbuf);
evcnt_detach(&rxr->rx_discarded);
}
evcnt_detach(&stats->ipcs);
@@ -725,7 +730,7 @@ ixv_init_locked(struct adapter *adapter)
/* Prepare transmit descriptors and buffers */
if (ixgbe_setup_transmit_structures(adapter)) {
aprint_error_dev(dev, "Could not setup transmit structures\n");
- ixv_stop(adapter);
+ ixv_stop_locked(adapter);
return;
}
@@ -742,19 +747,15 @@ ixv_init_locked(struct adapter *adapter)
/* Setup Multicast table */
ixv_set_rxfilter(adapter);
- /*
- * Determine the correct mbuf pool
- * for doing jumbo/headersplit
- */
- if (adapter->max_frame_size <= MCLBYTES)
- adapter->rx_mbuf_sz = MCLBYTES;
- else
- adapter->rx_mbuf_sz = MJUMPAGESIZE;
+ /* Use fixed buffer size, even for jumbo frames */
+ adapter->rx_mbuf_sz = MCLBYTES;
/* Prepare receive descriptors and buffers */
- if (ixgbe_setup_receive_structures(adapter)) {
- device_printf(dev, "Could not setup receive structures\n");
- ixv_stop(adapter);
+ error = ixgbe_setup_receive_structures(adapter);
+ if (error) {
+ device_printf(dev,
+ "Could not setup receive structures (err = %d)\n", error);
+ ixv_stop_locked(adapter);
return;
}
@@ -1420,12 +1421,12 @@ ixv_ifstop(struct ifnet *ifp, int disabl
struct adapter *adapter = ifp->if_softc;
IXGBE_CORE_LOCK(adapter);
- ixv_stop(adapter);
+ ixv_stop_locked(adapter);
IXGBE_CORE_UNLOCK(adapter);
}
static void
-ixv_stop(void *arg)
+ixv_stop_locked(void *arg)
{
struct ifnet *ifp;
struct adapter *adapter = arg;
@@ -1435,7 +1436,7 @@ ixv_stop(void *arg)
KASSERT(mutex_owned(&adapter->core_mtx));
- INIT_DEBUGOUT("ixv_stop: begin\n");
+ INIT_DEBUGOUT("ixv_stop_locked: begin\n");
ixv_disable_intr(adapter);
/* Tell the stack that the interface is no longer active */
@@ -1450,7 +1451,7 @@ ixv_stop(void *arg)
hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
return;
-} /* ixv_stop */
+} /* ixv_stop_locked */
/************************************************************************
@@ -1970,6 +1971,32 @@ ixv_sysctl_next_to_check_handler(SYSCTLF
} /* ixv_sysctl_next_to_check_handler */
/************************************************************************
+ * ixv_sysctl_next_to_refresh_handler - Receive Descriptor next to refresh
+ * handler function
+ *
+ * Retrieves the next_to_refresh value
+ ************************************************************************/
+static int
+ixv_sysctl_next_to_refresh_handler(SYSCTLFN_ARGS)
+{
+ struct sysctlnode node = *rnode;
+ struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
+ struct adapter *adapter;
+ uint32_t val;
+
+ if (!rxr)
+ return (0);
+
+ adapter = rxr->adapter;
+ if (ixgbe_fw_recovery_mode_swflag(adapter))
+ return (EPERM);
+
+ val = rxr->next_to_refresh;
+ node.sysctl_data = &val;
+ return sysctl_lookup(SYSCTLFN_CALL(&node));
+} /* ixv_sysctl_next_to_refresh_handler */
+
+/************************************************************************
* ixv_sysctl_rdh_handler - Receive Descriptor Head handler function
*
* Retrieves the RDH value from the hardware
@@ -2502,10 +2529,10 @@ ixv_add_device_sysctls(struct adapter *a
aprint_error_dev(dev, "could not create sysctl\n");
if (sysctl_createv(log, 0, &rnode, &cnode,
- CTLFLAG_READONLY, CTLTYPE_INT, "num_jcl_per_queue",
- SYSCTL_DESCR("Number of jumbo buffers per queue"),
- NULL, 0, &adapter->num_jcl, 0, CTL_CREATE,
- CTL_EOL) != 0)
+ CTLFLAG_READWRITE, CTLTYPE_INT,
+ "rx_copy_len", SYSCTL_DESCR("RX Copy Length"),
+ ixv_sysctl_rx_copy_len, 0,
+ (void *)adapter, 0, CTL_CREATE, CTL_EOL) != 0)
aprint_error_dev(dev, "could not create sysctl\n");
if (sysctl_createv(log, 0, &rnode, &cnode,
@@ -2631,6 +2658,13 @@ ixv_add_stats_sysctls(struct adapter *ad
break;
if (sysctl_createv(log, 0, &rnode, &cnode,
+ CTLFLAG_READONLY, CTLTYPE_INT, "rxd_nxrf",
+ SYSCTL_DESCR("Receive Descriptor next to refresh"),
+ ixv_sysctl_next_to_refresh_handler, 0, (void *)rxr, 0,
+ CTL_CREATE, CTL_EOL) != 0)
+ break;
+
+ if (sysctl_createv(log, 0, &rnode, &cnode,
CTLFLAG_READONLY,
CTLTYPE_INT,
"rxd_head", SYSCTL_DESCR("Receive Descriptor Head"),
@@ -2652,8 +2686,8 @@ ixv_add_stats_sysctls(struct adapter *ad
NULL, adapter->queues[i].evnamebuf, "Queue Bytes Received");
evcnt_attach_dynamic(&rxr->rx_copies, EVCNT_TYPE_MISC,
NULL, adapter->queues[i].evnamebuf, "Copied RX Frames");
- evcnt_attach_dynamic(&rxr->no_jmbuf, EVCNT_TYPE_MISC,
- NULL, adapter->queues[i].evnamebuf, "Rx no jumbo mbuf");
+ evcnt_attach_dynamic(&rxr->no_mbuf, EVCNT_TYPE_MISC,
+ NULL, adapter->queues[i].evnamebuf, "Rx no mbuf");
evcnt_attach_dynamic(&rxr->rx_discarded, EVCNT_TYPE_MISC,
NULL, adapter->queues[i].evnamebuf, "Rx discarded");
#ifdef LRO
@@ -2749,7 +2783,7 @@ ixv_clear_evcnt(struct adapter *adapter)
rxr->rx_packets.ev_count = 0;
rxr->rx_bytes.ev_count = 0;
rxr->rx_copies.ev_count = 0;
- rxr->no_jmbuf.ev_count = 0;
+ rxr->no_mbuf.ev_count = 0;
rxr->rx_discarded.ev_count = 0;
}
@@ -2869,6 +2903,31 @@ ixv_sysctl_debug(SYSCTLFN_ARGS)
} /* ixv_sysctl_debug */
/************************************************************************
+ * ixv_sysctl_rx_copy_len
+ ************************************************************************/
+static int
+ixv_sysctl_rx_copy_len(SYSCTLFN_ARGS)
+{
+ struct sysctlnode node = *rnode;
+ struct adapter *adapter = (struct adapter *)node.sysctl_data;
+ int error;
+ int result = adapter->rx_copy_len;
+
+ node.sysctl_data = &result;
+ error = sysctl_lookup(SYSCTLFN_CALL(&node));
+
+ if (error || newp == NULL)
+ return error;
+
+ if ((result < 0) || (result > IXGBE_RX_COPY_LEN_MAX))
+ return EINVAL;
+
+ adapter->rx_copy_len = result;
+
+ return 0;
+} /* ixgbe_sysctl_rx_copy_len */
+
+/************************************************************************
* ixv_init_device_features
************************************************************************/
static void
@@ -2924,7 +2983,7 @@ ixv_shutdown(device_t dev)
{
struct adapter *adapter = device_private(dev);
IXGBE_CORE_LOCK(adapter);
- ixv_stop(adapter);
+ ixv_stop_locked(adapter);
IXGBE_CORE_UNLOCK(adapter);
return (0);
@@ -3294,7 +3353,7 @@ ixv_allocate_msix(struct adapter *adapte
IXGBE_WORKQUEUE_FLAGS);
if (error) {
aprint_error_dev(dev,
- "couldn't create workqueue\n");
+ "couldn't create workqueue for Tx/Rx\n");
}
/* and Mailbox */