aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/altera/atse/if_atse.c3
-rw-r--r--sys/dev/ath/if_ath_rx.c3
-rw-r--r--sys/dev/beri/virtio/network/if_vtbe.c2
-rw-r--r--sys/dev/bge/if_bge.c3
-rw-r--r--sys/dev/dpaa/if_dtsec.c2
-rw-r--r--sys/dev/hyperv/netvsc/if_hn.c3
-rw-r--r--sys/dev/if_ndis/if_ndis.c3
-rw-r--r--sys/dev/mlx4/mlx4_en/mlx4_en_rx.c3
-rw-r--r--sys/dev/netmap/netmap.c5
-rw-r--r--sys/dev/ntb/if_ntb/if_ntb.c3
-rw-r--r--sys/dev/otus/if_otus.c3
-rw-r--r--sys/dev/pci/pci_host_generic.c17
-rw-r--r--sys/dev/pci/pci_host_generic.h17
-rw-r--r--sys/dev/pci/pci_host_generic_acpi.c8
-rw-r--r--sys/dev/pci/pci_host_generic_acpi.h47
-rw-r--r--sys/dev/re/if_re.c6
-rw-r--r--sys/dev/rtwn/usb/rtwn_usb_rx.c3
-rw-r--r--sys/dev/sbni/if_sbni.c3
-rw-r--r--sys/dev/spibus/spigen.c5
-rw-r--r--sys/dev/usb/serial/uslcom.c1
-rw-r--r--sys/dev/usb/usbdevs1
-rw-r--r--sys/dev/usb/wlan/if_rsu.c3
-rw-r--r--sys/dev/virtio/scsi/virtio_scsi.c2
-rw-r--r--sys/dev/virtio/scsi/virtio_scsivar.h5
-rw-r--r--sys/dev/vmware/vmxnet3/if_vmx.c100
-rw-r--r--sys/dev/vmware/vmxnet3/if_vmxvar.h2
-rw-r--r--sys/dev/xen/netback/netback.c2
27 files changed, 189 insertions, 66 deletions
diff --git a/sys/dev/altera/atse/if_atse.c b/sys/dev/altera/atse/if_atse.c
index c84194868ec46..a355260599531 100644
--- a/sys/dev/altera/atse/if_atse.c
+++ b/sys/dev/altera/atse/if_atse.c
@@ -1381,7 +1381,8 @@ atse_attach(device_t dev)
}
ifp->if_softc = sc;
if_initname(ifp, device_get_name(dev), device_get_unit(dev));
- ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
+ ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST |
+ IFF_NEEDSEPOCH;
ifp->if_ioctl = atse_ioctl;
ifp->if_transmit = atse_transmit;
ifp->if_qflush = atse_qflush;
diff --git a/sys/dev/ath/if_ath_rx.c b/sys/dev/ath/if_ath_rx.c
index 93a1d74551910..13a42c5038d60 100644
--- a/sys/dev/ath/if_ath_rx.c
+++ b/sys/dev/ath/if_ath_rx.c
@@ -647,6 +647,7 @@ ath_rx_pkt(struct ath_softc *sc, struct ath_rx_status *rs, HAL_STATUS status,
uint64_t tsf, int nf, HAL_RX_QUEUE qtype, struct ath_buf *bf,
struct mbuf *m)
{
+ struct epoch_tracker et;
uint64_t rstamp;
/* XXX TODO: make this an mbuf tag? */
struct ieee80211_rx_stats rxs;
@@ -941,6 +942,7 @@ rx_accept:
rxs.c_nf_ext[i] = nf;
}
+ NET_EPOCH_ENTER(et);
if (ni != NULL) {
/*
* Only punt packets for ampdu reorder processing for
@@ -986,6 +988,7 @@ rx_accept:
type = ieee80211_input_mimo_all(ic, m);
m = NULL;
}
+ NET_EPOCH_EXIT(et);
/*
* At this point we have passed the frame up the stack; thus
diff --git a/sys/dev/beri/virtio/network/if_vtbe.c b/sys/dev/beri/virtio/network/if_vtbe.c
index 5975a4a1c7f3f..03853435a9de6 100644
--- a/sys/dev/beri/virtio/network/if_vtbe.c
+++ b/sys/dev/beri/virtio/network/if_vtbe.c
@@ -613,7 +613,7 @@ vtbe_attach(device_t dev)
ifp->if_softc = sc;
if_initname(ifp, device_get_name(dev), device_get_unit(dev));
ifp->if_flags = (IFF_BROADCAST | IFF_SIMPLEX |
- IFF_MULTICAST | IFF_PROMISC);
+ IFF_MULTICAST | IFF_PROMISC | IFF_NEEDSEPOCH);
ifp->if_capabilities = IFCAP_VLAN_MTU;
ifp->if_capenable = ifp->if_capabilities;
ifp->if_start = vtbe_txstart;
diff --git a/sys/dev/bge/if_bge.c b/sys/dev/bge/if_bge.c
index 6199478c4b289..fab4c1bb4bb2d 100644
--- a/sys/dev/bge/if_bge.c
+++ b/sys/dev/bge/if_bge.c
@@ -4646,6 +4646,7 @@ bge_msi_intr(void *arg)
static void
bge_intr_task(void *arg, int pending)
{
+ struct epoch_tracker et;
struct bge_softc *sc;
if_t ifp;
uint32_t status, status_tag;
@@ -4688,7 +4689,9 @@ bge_intr_task(void *arg, int pending)
sc->bge_rx_saved_considx != rx_prod) {
/* Check RX return ring producer/consumer. */
BGE_UNLOCK(sc);
+ NET_EPOCH_ENTER(et);
bge_rxeof(sc, rx_prod, 0);
+ NET_EPOCH_EXIT(et);
BGE_LOCK(sc);
}
if (if_getdrvflags(ifp) & IFF_DRV_RUNNING) {
diff --git a/sys/dev/dpaa/if_dtsec.c b/sys/dev/dpaa/if_dtsec.c
index 2c6291b07e349..704aa22eda548 100644
--- a/sys/dev/dpaa/if_dtsec.c
+++ b/sys/dev/dpaa/if_dtsec.c
@@ -688,7 +688,7 @@ dtsec_attach(device_t dev)
ifp->if_softc = sc;
ifp->if_mtu = ETHERMTU; /* TODO: Configure */
- ifp->if_flags = IFF_SIMPLEX | IFF_BROADCAST;
+ ifp->if_flags = IFF_SIMPLEX | IFF_BROADCAST | IFF_NEEDSEPOCH;
ifp->if_init = dtsec_if_init;
ifp->if_start = dtsec_if_start;
ifp->if_ioctl = dtsec_if_ioctl;
diff --git a/sys/dev/hyperv/netvsc/if_hn.c b/sys/dev/hyperv/netvsc/if_hn.c
index e9d1b9439671a..bc96775ad5536 100644
--- a/sys/dev/hyperv/netvsc/if_hn.c
+++ b/sys/dev/hyperv/netvsc/if_hn.c
@@ -2362,7 +2362,8 @@ hn_attach(device_t dev)
*/
ifp->if_baudrate = IF_Gbps(10);
- ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
+ ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST |
+ IFF_NEEDSEPOCH;
ifp->if_ioctl = hn_ioctl;
ifp->if_init = hn_init;
#ifdef HN_IFSTART_SUPPORT
diff --git a/sys/dev/if_ndis/if_ndis.c b/sys/dev/if_ndis/if_ndis.c
index 1a5e8eeed4beb..37cf0e6bf7034 100644
--- a/sys/dev/if_ndis/if_ndis.c
+++ b/sys/dev/if_ndis/if_ndis.c
@@ -967,7 +967,8 @@ ndis_ifattach(struct ndis_softc *sc)
if_initname(ifp, device_get_name(sc->ndis_dev),
device_get_unit(sc->ndis_dev));
- ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
+ ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST |
+ IFF_NEEDSEPOCH;
ifp->if_ioctl = ndis_ifioctl;
ifp->if_start = ndis_ifstart;
ifp->if_init = ndis_init;
diff --git a/sys/dev/mlx4/mlx4_en/mlx4_en_rx.c b/sys/dev/mlx4/mlx4_en/mlx4_en_rx.c
index c9222e1df55c4..6e588a0ca92b3 100644
--- a/sys/dev/mlx4/mlx4_en/mlx4_en_rx.c
+++ b/sys/dev/mlx4/mlx4_en/mlx4_en_rx.c
@@ -895,6 +895,7 @@ void mlx4_en_rx_irq(struct mlx4_cq *mcq)
void mlx4_en_rx_que(void *context, int pending)
{
+ struct epoch_tracker et;
struct mlx4_en_cq *cq;
struct thread *td;
@@ -905,8 +906,10 @@ void mlx4_en_rx_que(void *context, int pending)
sched_bind(td, cq->curr_poll_rx_cpu_id);
thread_unlock(td);
+ NET_EPOCH_ENTER(et);
while (mlx4_en_poll_rx_cq(cq, MLX4_EN_RX_BUDGET)
== MLX4_EN_RX_BUDGET);
+ NET_EPOCH_EXIT(et);
mlx4_en_arm_cq(cq->dev->if_softc, cq);
}
diff --git a/sys/dev/netmap/netmap.c b/sys/dev/netmap/netmap.c
index 982f76d45faa7..4edcc58cbe0b1 100644
--- a/sys/dev/netmap/netmap.c
+++ b/sys/dev/netmap/netmap.c
@@ -437,11 +437,13 @@ ports attached to the switch)
#include <sys/socketvar.h> /* struct socket */
#include <sys/malloc.h>
#include <sys/poll.h>
+#include <sys/proc.h>
#include <sys/rwlock.h>
#include <sys/socket.h> /* sockaddrs */
#include <sys/selinfo.h>
#include <sys/sysctl.h>
#include <sys/jail.h>
+#include <sys/epoch.h>
#include <net/vnet.h>
#include <net/if.h>
#include <net/if_var.h>
@@ -1146,9 +1148,11 @@ netmap_dtor(void *data)
static void
netmap_send_up(struct ifnet *dst, struct mbq *q)
{
+ struct epoch_tracker et;
struct mbuf *m;
struct mbuf *head = NULL, *prev = NULL;
+ NET_EPOCH_ENTER(et);
/* Send packets up, outside the lock; head/prev machinery
* is only useful for Windows. */
while ((m = mbq_dequeue(q)) != NULL) {
@@ -1160,6 +1164,7 @@ netmap_send_up(struct ifnet *dst, struct mbq *q)
}
if (head)
nm_os_send_up(dst, NULL, head);
+ NET_EPOCH_EXIT(et);
mbq_fini(q);
}
diff --git a/sys/dev/ntb/if_ntb/if_ntb.c b/sys/dev/ntb/if_ntb/if_ntb.c
index 3bae01aae49d1..1e1f98a541321 100644
--- a/sys/dev/ntb/if_ntb/if_ntb.c
+++ b/sys/dev/ntb/if_ntb/if_ntb.c
@@ -172,7 +172,8 @@ ntb_net_attach(device_t dev)
if_setinitfn(ifp, ntb_net_init);
if_setsoftc(ifp, sc);
- if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST);
+ if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST |
+ IFF_NEEDSEPOCH);
if_setioctlfn(ifp, ntb_ioctl);
if_settransmitfn(ifp, ntb_transmit);
if_setqflushfn(ifp, ntb_qflush);
diff --git a/sys/dev/otus/if_otus.c b/sys/dev/otus/if_otus.c
index 23be0fcbe9056..0489b943820e3 100644
--- a/sys/dev/otus/if_otus.c
+++ b/sys/dev/otus/if_otus.c
@@ -1770,6 +1770,7 @@ otus_rxeof(struct usb_xfer *xfer, struct otus_data *data, struct mbufq *rxq)
static void
otus_bulk_rx_callback(struct usb_xfer *xfer, usb_error_t error)
{
+ struct epoch_tracker et;
struct otus_softc *sc = usbd_xfer_softc(xfer);
struct ieee80211com *ic = &sc->sc_ic;
struct ieee80211_frame *wh;
@@ -1820,6 +1821,7 @@ tr_setup:
* callback and safe to unlock.
*/
OTUS_UNLOCK(sc);
+ NET_EPOCH_ENTER(et);
while ((m = mbufq_dequeue(&scrx)) != NULL) {
wh = mtod(m, struct ieee80211_frame *);
ni = ieee80211_find_rxnode(ic,
@@ -1832,6 +1834,7 @@ tr_setup:
} else
(void)ieee80211_input_mimo_all(ic, m);
}
+ NET_EPOCH_EXIT(et);
#ifdef IEEE80211_SUPPORT_SUPERG
ieee80211_ff_age_all(ic, 100);
#endif
diff --git a/sys/dev/pci/pci_host_generic.c b/sys/dev/pci/pci_host_generic.c
index 5a89a19c030d3..57609a9a1ef55 100644
--- a/sys/dev/pci/pci_host_generic.c
+++ b/sys/dev/pci/pci_host_generic.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2015 Ruslan Bukin <br@bsdpad.com>
+ * Copyright (c) 2015, 2020 Ruslan Bukin <br@bsdpad.com>
* Copyright (c) 2014 The FreeBSD Foundation
* All rights reserved.
*
@@ -54,21 +54,6 @@ __FBSDID("$FreeBSD$");
#include "pcib_if.h"
-/* Assembling ECAM Configuration Address */
-#define PCIE_BUS_SHIFT 20
-#define PCIE_SLOT_SHIFT 15
-#define PCIE_FUNC_SHIFT 12
-#define PCIE_BUS_MASK 0xFF
-#define PCIE_SLOT_MASK 0x1F
-#define PCIE_FUNC_MASK 0x07
-#define PCIE_REG_MASK 0xFFF
-
-#define PCIE_ADDR_OFFSET(bus, slot, func, reg) \
- ((((bus) & PCIE_BUS_MASK) << PCIE_BUS_SHIFT) | \
- (((slot) & PCIE_SLOT_MASK) << PCIE_SLOT_SHIFT) | \
- (((func) & PCIE_FUNC_MASK) << PCIE_FUNC_SHIFT) | \
- ((reg) & PCIE_REG_MASK))
-
/* Forward prototypes */
static uint32_t generic_pcie_read_config(device_t dev, u_int bus, u_int slot,
diff --git a/sys/dev/pci/pci_host_generic.h b/sys/dev/pci/pci_host_generic.h
index 5feb3a6031a03..da7d9e52adc25 100644
--- a/sys/dev/pci/pci_host_generic.h
+++ b/sys/dev/pci/pci_host_generic.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015 Ruslan Bukin <br@bsdpad.com>
+ * Copyright (c) 2015, 2020 Ruslan Bukin <br@bsdpad.com>
* Copyright (c) 2015 The FreeBSD Foundation
* All rights reserved.
*
@@ -36,6 +36,21 @@
#include "pci_if.h"
+/* Assembling ECAM Configuration Address */
+#define PCIE_BUS_SHIFT 20
+#define PCIE_SLOT_SHIFT 15
+#define PCIE_FUNC_SHIFT 12
+#define PCIE_BUS_MASK 0xFF
+#define PCIE_SLOT_MASK 0x1F
+#define PCIE_FUNC_MASK 0x07
+#define PCIE_REG_MASK 0xFFF
+
+#define PCIE_ADDR_OFFSET(bus, slot, func, reg) \
+ ((((bus) & PCIE_BUS_MASK) << PCIE_BUS_SHIFT) | \
+ (((slot) & PCIE_SLOT_MASK) << PCIE_SLOT_SHIFT) | \
+ (((func) & PCIE_FUNC_MASK) << PCIE_FUNC_SHIFT) | \
+ ((reg) & PCIE_REG_MASK))
+
#define MAX_RANGES_TUPLES 16
#define MIN_RANGES_TUPLES 2
diff --git a/sys/dev/pci/pci_host_generic_acpi.c b/sys/dev/pci/pci_host_generic_acpi.c
index 016fa32d212fe..c5ca9ab0a1d02 100644
--- a/sys/dev/pci/pci_host_generic_acpi.c
+++ b/sys/dev/pci/pci_host_generic_acpi.c
@@ -57,6 +57,7 @@ __FBSDID("$FreeBSD$");
#include <dev/pci/pcireg.h>
#include <dev/pci/pcib_private.h>
#include <dev/pci/pci_host_generic.h>
+#include <dev/pci/pci_host_generic_acpi.h>
#include <machine/cpu.h>
#include <machine/bus.h>
@@ -88,11 +89,6 @@ __FBSDID("$FreeBSD$");
#define PROPS_CELL_SIZE 1
#define PCI_ADDR_CELL_SIZE 2
-struct generic_pcie_acpi_softc {
- struct generic_pcie_core_softc base;
- ACPI_BUFFER ap_prt; /* interrupt routing table */
-};
-
/* Forward prototypes */
static int generic_pcie_acpi_probe(device_t dev);
@@ -233,7 +229,7 @@ pci_host_acpi_get_ecam_resource(device_t dev)
return (0);
}
-static int
+int
pci_host_generic_acpi_attach(device_t dev)
{
struct generic_pcie_acpi_softc *sc;
diff --git a/sys/dev/pci/pci_host_generic_acpi.h b/sys/dev/pci/pci_host_generic_acpi.h
new file mode 100644
index 0000000000000..eb9b23094703a
--- /dev/null
+++ b/sys/dev/pci/pci_host_generic_acpi.h
@@ -0,0 +1,47 @@
+/*-
+ * Copyright (C) 2018 Cavium Inc.
+ * Copyright (c) 2015 Ruslan Bukin <br@bsdpad.com>
+ * Copyright (c) 2014 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Semihalf under
+ * the sponsorship of the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _DEV_PCI_PCI_HOST_GENERIC_ACPI_H_
+#define _DEV_PCI_PCI_HOST_GENERIC_ACPI_H_
+
+struct generic_pcie_acpi_softc {
+ struct generic_pcie_core_softc base;
+ int segment;
+ ACPI_BUFFER ap_prt; /* interrupt routing table */
+};
+
+DECLARE_CLASS(generic_pcie_acpi_driver);
+
+int pci_host_generic_acpi_attach(device_t dev);
+
+#endif /* !_DEV_PCI_PCI_HOST_GENERIC_ACPI_H_ */
diff --git a/sys/dev/re/if_re.c b/sys/dev/re/if_re.c
index 1d750c25d2337..76fa06f635858 100644
--- a/sys/dev/re/if_re.c
+++ b/sys/dev/re/if_re.c
@@ -2576,6 +2576,7 @@ re_intr(void *arg)
static void
re_int_task(void *arg, int npending)
{
+ struct epoch_tracker et;
struct rl_softc *sc;
struct ifnet *ifp;
u_int16_t status;
@@ -2602,8 +2603,11 @@ re_int_task(void *arg, int npending)
}
#endif
- if (status & (RL_ISR_RX_OK|RL_ISR_RX_ERR|RL_ISR_FIFO_OFLOW))
+ if (status & (RL_ISR_RX_OK|RL_ISR_RX_ERR|RL_ISR_FIFO_OFLOW)) {
+ NET_EPOCH_ENTER(et);
rval = re_rxeof(sc, NULL);
+ NET_EPOCH_EXIT(et);
+ }
/*
* Some chips will ignore a second TX request issued
diff --git a/sys/dev/rtwn/usb/rtwn_usb_rx.c b/sys/dev/rtwn/usb/rtwn_usb_rx.c
index 52415084745bf..ae61dd7b43e7c 100644
--- a/sys/dev/rtwn/usb/rtwn_usb_rx.c
+++ b/sys/dev/rtwn/usb/rtwn_usb_rx.c
@@ -363,6 +363,7 @@ rtwn_rx_frame(struct rtwn_softc *sc, struct mbuf *m)
void
rtwn_bulk_rx_callback(struct usb_xfer *xfer, usb_error_t error)
{
+ struct epoch_tracker et;
struct rtwn_usb_softc *uc = usbd_xfer_softc(xfer);
struct rtwn_softc *sc = &uc->uc_sc;
struct ieee80211com *ic = &sc->sc_ic;
@@ -399,6 +400,7 @@ tr_setup:
* ieee80211_input() because here is at the end of a USB
* callback and safe to unlock.
*/
+ NET_EPOCH_ENTER(et);
while (m != NULL) {
next = m->m_nextpkt;
m->m_nextpkt = NULL;
@@ -416,6 +418,7 @@ tr_setup:
RTWN_LOCK(sc);
m = next;
}
+ NET_EPOCH_EXIT(et);
break;
default:
/* needs it to the inactive queue due to a error. */
diff --git a/sys/dev/sbni/if_sbni.c b/sys/dev/sbni/if_sbni.c
index 267001f7897dd..62b86112b26f1 100644
--- a/sys/dev/sbni/if_sbni.c
+++ b/sys/dev/sbni/if_sbni.c
@@ -243,7 +243,8 @@ sbni_attach(struct sbni_softc *sc, int unit, struct sbni_flags flags)
ifp->if_baudrate =
(csr0 & 0x01 ? 500000 : 2000000) / (1 << flags.rate);
- ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
+ ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST |
+ IFF_NEEDSEPOCH;
mtx_init(&sc->lock, ifp->if_xname, MTX_NETWORK_LOCK, MTX_DEF);
callout_init_mtx(&sc->wch, &sc->lock, 0);
diff --git a/sys/dev/spibus/spigen.c b/sys/dev/spibus/spigen.c
index 5146b6a1a3156..7e02e68027b9e 100644
--- a/sys/dev/spibus/spigen.c
+++ b/sys/dev/spibus/spigen.c
@@ -325,8 +325,9 @@ spigen_mmap_single(struct cdev *cdev, vm_ooffset_t *offset,
vm_object_reference_locked(mmap->bufobj); // kernel and userland both
for (n = 0; n < pages; n++) {
m[n] = vm_page_grab(mmap->bufobj, n,
- VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_WIRED);
- m[n]->valid = VM_PAGE_BITS_ALL;
+ VM_ALLOC_ZERO | VM_ALLOC_WIRED);
+ vm_page_valid(m[n]);
+ vm_page_xunbusy(m[n]);
}
VM_OBJECT_WUNLOCK(mmap->bufobj);
pmap_qenter(mmap->kvaddr, m, pages);
diff --git a/sys/dev/usb/serial/uslcom.c b/sys/dev/usb/serial/uslcom.c
index 242fc5cbb3f6e..6ee72846a2269 100644
--- a/sys/dev/usb/serial/uslcom.c
+++ b/sys/dev/usb/serial/uslcom.c
@@ -313,6 +313,7 @@ static const STRUCT_USB_HOST_ID uslcom_devs[] = {
USLCOM_DEV(SILABS, HAMLINKUSB),
USLCOM_DEV(SILABS, HELICOM),
USLCOM_DEV(SILABS, HUBZ),
+ USLCOM_DEV(SILABS, BV_AV2010_10),
USLCOM_DEV(SILABS, IMS_USB_RS422),
USLCOM_DEV(SILABS, INFINITY_MIC),
USLCOM_DEV(SILABS, INGENI_ZIGBEE),
diff --git a/sys/dev/usb/usbdevs b/sys/dev/usb/usbdevs
index 34d7a84df8a38..bf333041fd7d8 100644
--- a/sys/dev/usb/usbdevs
+++ b/sys/dev/usb/usbdevs
@@ -4339,6 +4339,7 @@ product SILABS AC_SERV_OBD 0x8665 AC-Services OBD Interface
product SILABS MMB_ZIGBEE 0x88a4 MMB Networks ZigBee
product SILABS INGENI_ZIGBEE 0x88a5 Planet Innovation Ingeni ZigBee
product SILABS HUBZ 0x8a2a HubZ dual ZigBee and Z-Wave
+product SILABS BV_AV2010_10 0x8b34 Bitron Video AV2010/10 ZigBee USB Stick
product SILABS CP2102 0xea60 SILABS USB UART
product SILABS CP210X_2 0xea61 CP210x Serial
product SILABS CP210X_3 0xea70 CP210x Serial
diff --git a/sys/dev/usb/wlan/if_rsu.c b/sys/dev/usb/wlan/if_rsu.c
index 172a915b8f3e2..d26ff9ec9ad93 100644
--- a/sys/dev/usb/wlan/if_rsu.c
+++ b/sys/dev/usb/wlan/if_rsu.c
@@ -2552,6 +2552,7 @@ rsu_rxeof(struct usb_xfer *xfer, struct rsu_data *data)
static void
rsu_bulk_rx_callback(struct usb_xfer *xfer, usb_error_t error)
{
+ struct epoch_tracker et;
struct rsu_softc *sc = usbd_xfer_softc(xfer);
struct ieee80211com *ic = &sc->sc_ic;
struct ieee80211_node *ni;
@@ -2586,6 +2587,7 @@ tr_setup:
* ieee80211_input() because here is at the end of a USB
* callback and safe to unlock.
*/
+ NET_EPOCH_ENTER(et);
while (m != NULL) {
next = m->m_next;
m->m_next = NULL;
@@ -2604,6 +2606,7 @@ tr_setup:
RSU_LOCK(sc);
m = next;
}
+ NET_EPOCH_EXIT(et);
break;
default:
/* needs it to the inactive queue due to a error. */
diff --git a/sys/dev/virtio/scsi/virtio_scsi.c b/sys/dev/virtio/scsi/virtio_scsi.c
index 6f2dfbcac5a46..76a065ecb3386 100644
--- a/sys/dev/virtio/scsi/virtio_scsi.c
+++ b/sys/dev/virtio/scsi/virtio_scsi.c
@@ -937,7 +937,7 @@ vtscsi_cam_path_inquiry(struct vtscsi_softc *sc, struct cam_sim *sim,
cpi->max_target = sc->vtscsi_max_target;
cpi->max_lun = sc->vtscsi_max_lun;
- cpi->initiator_id = VTSCSI_INITIATOR_ID;
+ cpi->initiator_id = cpi->max_target + 1;
strlcpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN);
strlcpy(cpi->hba_vid, "VirtIO", HBA_IDLEN);
diff --git a/sys/dev/virtio/scsi/virtio_scsivar.h b/sys/dev/virtio/scsi/virtio_scsivar.h
index 3e4109e658709..064b1245a5655 100644
--- a/sys/dev/virtio/scsi/virtio_scsivar.h
+++ b/sys/dev/virtio/scsi/virtio_scsivar.h
@@ -205,11 +205,6 @@ struct vtscsi_request {
#define VTSCSI_RESERVED_REQUESTS 10
/*
- * Specification doesn't say, use traditional SCSI default.
- */
-#define VTSCSI_INITIATOR_ID 7
-
-/*
* How to wait (or not) for request completion.
*/
#define VTSCSI_EXECUTE_ASYNC 0
diff --git a/sys/dev/vmware/vmxnet3/if_vmx.c b/sys/dev/vmware/vmxnet3/if_vmx.c
index b639a926ed426..d0b0436ea25c5 100644
--- a/sys/dev/vmware/vmxnet3/if_vmx.c
+++ b/sys/dev/vmware/vmxnet3/if_vmx.c
@@ -23,6 +23,8 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_rss.h"
+
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
@@ -46,6 +48,9 @@ __FBSDID("$FreeBSD$");
#include <net/if_media.h>
#include <net/if_vlan_var.h>
#include <net/iflib.h>
+#ifdef RSS
+#include <net/rss_config.h>
+#endif
#include <netinet/in_systm.h>
#include <netinet/in.h>
@@ -1140,8 +1145,11 @@ vmxnet3_reinit_rss_shared_data(struct vmxnet3_softc *sc)
struct vmxnet3_driver_shared *ds;
if_softc_ctx_t scctx;
struct vmxnet3_rss_shared *rss;
+#ifdef RSS
+ uint8_t rss_algo;
+#endif
int i;
-
+
ds = sc->vmx_ds;
scctx = sc->vmx_scctx;
rss = sc->vmx_rss;
@@ -1152,10 +1160,29 @@ vmxnet3_reinit_rss_shared_data(struct vmxnet3_softc *sc)
rss->hash_func = UPT1_RSS_HASH_FUNC_TOEPLITZ;
rss->hash_key_size = UPT1_RSS_MAX_KEY_SIZE;
rss->ind_table_size = UPT1_RSS_MAX_IND_TABLE_SIZE;
- memcpy(rss->hash_key, rss_key, UPT1_RSS_MAX_KEY_SIZE);
-
- for (i = 0; i < UPT1_RSS_MAX_IND_TABLE_SIZE; i++)
- rss->ind_table[i] = i % scctx->isc_nrxqsets;
+#ifdef RSS
+ /*
+ * If the software RSS is configured to anything else other than
+ * Toeplitz, then just do Toeplitz in "hardware" for the sake of
+ * the packet distribution, but report the hash as opaque to
+ * disengage from the software RSS.
+ */
+ rss_algo = rss_gethashalgo();
+ if (rss_algo == RSS_HASH_TOEPLITZ) {
+ rss_getkey(rss->hash_key);
+ for (i = 0; i < UPT1_RSS_MAX_IND_TABLE_SIZE; i++) {
+ rss->ind_table[i] = rss_get_indirection_to_bucket(i) %
+ scctx->isc_nrxqsets;
+ }
+ sc->vmx_flags |= VMXNET3_FLAG_SOFT_RSS;
+ } else
+#endif
+ {
+ memcpy(rss->hash_key, rss_key, UPT1_RSS_MAX_KEY_SIZE);
+ for (i = 0; i < UPT1_RSS_MAX_IND_TABLE_SIZE; i++)
+ rss->ind_table[i] = i % scctx->isc_nrxqsets;
+ sc->vmx_flags &= ~VMXNET3_FLAG_SOFT_RSS;
+ }
}
static void
@@ -1499,29 +1526,50 @@ vmxnet3_isc_rxd_pkt_get(void *vsc, if_rxd_info_t ri)
KASSERT(rxcd->sop, ("%s: expected sop", __func__));
/*
- * RSS and flow ID
+ * RSS and flow ID.
+ * Types other than M_HASHTYPE_NONE and M_HASHTYPE_OPAQUE_HASH should
+ * be used only if the software RSS is enabled and it uses the same
+ * algorithm and the hash key as the "hardware". If the software RSS
+ * is not enabled, then it's simply pointless to use those types.
+ * If it's enabled but with different parameters, then hash values will
+ * not match.
*/
ri->iri_flowid = rxcd->rss_hash;
- switch (rxcd->rss_type) {
- case VMXNET3_RCD_RSS_TYPE_NONE:
- ri->iri_flowid = ri->iri_qsidx;
- ri->iri_rsstype = M_HASHTYPE_NONE;
- break;
- case VMXNET3_RCD_RSS_TYPE_IPV4:
- ri->iri_rsstype = M_HASHTYPE_RSS_IPV4;
- break;
- case VMXNET3_RCD_RSS_TYPE_TCPIPV4:
- ri->iri_rsstype = M_HASHTYPE_RSS_TCP_IPV4;
- break;
- case VMXNET3_RCD_RSS_TYPE_IPV6:
- ri->iri_rsstype = M_HASHTYPE_RSS_IPV6;
- break;
- case VMXNET3_RCD_RSS_TYPE_TCPIPV6:
- ri->iri_rsstype = M_HASHTYPE_RSS_TCP_IPV6;
- break;
- default:
- ri->iri_rsstype = M_HASHTYPE_OPAQUE_HASH;
- break;
+#ifdef RSS
+ if ((sc->vmx_flags & VMXNET3_FLAG_SOFT_RSS) != 0) {
+ switch (rxcd->rss_type) {
+ case VMXNET3_RCD_RSS_TYPE_NONE:
+ ri->iri_flowid = ri->iri_qsidx;
+ ri->iri_rsstype = M_HASHTYPE_NONE;
+ break;
+ case VMXNET3_RCD_RSS_TYPE_IPV4:
+ ri->iri_rsstype = M_HASHTYPE_RSS_IPV4;
+ break;
+ case VMXNET3_RCD_RSS_TYPE_TCPIPV4:
+ ri->iri_rsstype = M_HASHTYPE_RSS_TCP_IPV4;
+ break;
+ case VMXNET3_RCD_RSS_TYPE_IPV6:
+ ri->iri_rsstype = M_HASHTYPE_RSS_IPV6;
+ break;
+ case VMXNET3_RCD_RSS_TYPE_TCPIPV6:
+ ri->iri_rsstype = M_HASHTYPE_RSS_TCP_IPV6;
+ break;
+ default:
+ ri->iri_rsstype = M_HASHTYPE_OPAQUE_HASH;
+ break;
+ }
+ } else
+#endif
+ {
+ switch (rxcd->rss_type) {
+ case VMXNET3_RCD_RSS_TYPE_NONE:
+ ri->iri_flowid = ri->iri_qsidx;
+ ri->iri_rsstype = M_HASHTYPE_NONE;
+ break;
+ default:
+ ri->iri_rsstype = M_HASHTYPE_OPAQUE_HASH;
+ break;
+ }
}
/* VLAN */
diff --git a/sys/dev/vmware/vmxnet3/if_vmxvar.h b/sys/dev/vmware/vmxnet3/if_vmxvar.h
index 7e231e8924c3d..20e73af690042 100644
--- a/sys/dev/vmware/vmxnet3/if_vmxvar.h
+++ b/sys/dev/vmware/vmxnet3/if_vmxvar.h
@@ -113,6 +113,8 @@ struct vmxnet3_softc {
struct vmxnet3_driver_shared *vmx_ds;
uint32_t vmx_flags;
#define VMXNET3_FLAG_RSS 0x0002
+#define VMXNET3_FLAG_SOFT_RSS 0x0004 /* Software RSS is enabled with
+ compatible algorithm. */
struct vmxnet3_rxqueue *vmx_rxq;
struct vmxnet3_txqueue *vmx_txq;
diff --git a/sys/dev/xen/netback/netback.c b/sys/dev/xen/netback/netback.c
index ecc26981e2b37..1e972cd09f814 100644
--- a/sys/dev/xen/netback/netback.c
+++ b/sys/dev/xen/netback/netback.c
@@ -780,7 +780,7 @@ xnb_connect_comms(struct xnb_softc *xnb)
xnb->evtchn,
/*filter*/NULL,
xnb_intr, /*arg*/xnb,
- INTR_TYPE_BIO | INTR_MPSAFE,
+ INTR_TYPE_NET | INTR_MPSAFE,
&xnb->xen_intr_handle);
if (error != 0) {
(void)xnb_disconnect(xnb);