Module Name: src
Committed By: jdolecek
Date: Sat May 19 09:32:55 UTC 2018
Modified Files:
src/sys/dev/pci: if_ena.c if_enavar.h
Log Message:
Intermediate changes to make it further into actually at least compile, not
nearly yet
complete. Committed so that others can possibly pick it off, as discussed
on tech-userlevel@ with Martin
To generate a diff of this commit:
cvs rdiff -u -r1.1.1.1 -r1.2 src/sys/dev/pci/if_ena.c \
src/sys/dev/pci/if_enavar.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/pci/if_ena.c
diff -u src/sys/dev/pci/if_ena.c:1.1.1.1 src/sys/dev/pci/if_ena.c:1.2
--- src/sys/dev/pci/if_ena.c:1.1.1.1 Sat May 19 09:18:31 2018
+++ src/sys/dev/pci/if_ena.c Sat May 19 09:32:55 2018
@@ -28,7 +28,10 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
+#if 0
__FBSDID("$FreeBSD: head/sys/dev/ena/ena.c 333456 2018-05-10 09:37:54Z mw $");
+#endif
+__KERNEL_RCSID(0, "$NetBSD: if_ena.c,v 1.2 2018/05/19 09:32:55 jdolecek Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -39,56 +42,27 @@ __FBSDID("$FreeBSD: head/sys/dev/ena/ena
#include <sys/malloc.h>
#include <sys/mbuf.h>
#include <sys/module.h>
-#include <sys/rman.h>
-#include <sys/smp.h>
#include <sys/socket.h>
#include <sys/sockio.h>
#include <sys/sysctl.h>
-#include <sys/taskqueue.h>
#include <sys/time.h>
-#include <sys/eventhandler.h>
-
-#include <machine/bus.h>
-#include <machine/resource.h>
-#include <machine/in_cksum.h>
-
-#include <net/bpf.h>
-#include <net/ethernet.h>
-#include <net/if.h>
-#include <net/if_var.h>
-#include <net/if_arp.h>
-#include <net/if_dl.h>
-#include <net/if_media.h>
-#include <net/rss_config.h>
-#include <net/if_types.h>
-#include <net/if_vlan_var.h>
-
-#include <netinet/in_rss.h>
-#include <netinet/in_systm.h>
-#include <netinet/in.h>
-#include <netinet/if_ether.h>
-#include <netinet/ip.h>
-#include <netinet/ip6.h>
-#include <netinet/tcp.h>
-#include <netinet/udp.h>
+#include <sys/workqueue.h>
-#include <dev/pci/pcivar.h>
-#include <dev/pci/pcireg.h>
+#include <sys/bus.h>
-#include "ena.h"
-#include "ena_sysctl.h"
+#include <dev/pci/if_enavar.h>
/*********************************************************
* Function prototypes
*********************************************************/
-static int ena_probe(device_t);
+static int ena_probe(device_t, cfdata_t, void *);
static void ena_intr_msix_mgmnt(void *);
static int ena_allocate_pci_resources(struct ena_adapter*);
static void ena_free_pci_resources(struct ena_adapter *);
-static int ena_change_mtu(if_t, int);
-static inline void ena_alloc_counters(counter_u64_t *, int);
-static inline void ena_free_counters(counter_u64_t *, int);
-static inline void ena_reset_counters(counter_u64_t *, int);
+static int ena_change_mtu(struct ifnet *, int);
+static inline void ena_alloc_counters(struct evcnt *, int);
+static inline void ena_free_counters(struct evcnt *, int);
+static inline void ena_reset_counters(struct evcnt *, int);
static void ena_init_io_rings_common(struct ena_adapter *,
struct ena_ring *, uint16_t);
static void ena_init_io_rings(struct ena_adapter *);
@@ -146,13 +120,15 @@ static int ena_rss_configure(struct ena_
static int ena_up_complete(struct ena_adapter *);
static int ena_up(struct ena_adapter *);
static void ena_down(struct ena_adapter *);
-static uint64_t ena_get_counter(if_t, ift_counter);
-static int ena_media_change(if_t);
-static void ena_media_status(if_t, struct ifmediareq *);
+#if 0
+static uint64_t ena_get_counter(struct ifnet *, ift_counter);
+#endif
+static int ena_media_change(struct ifnet *);
+static void ena_media_status(struct ifnet *, struct ifmediareq *);
static void ena_init(void *);
-static int ena_ioctl(if_t, u_long, caddr_t);
+static int ena_ioctl(struct ifnet *, u_long, void *);
static int ena_get_dev_offloads(struct ena_com_dev_get_features_ctx *);
-static void ena_update_host_info(struct ena_admin_host_info *, if_t);
+static void ena_update_host_info(struct ena_admin_host_info *, struct ifnet *);
static void ena_update_hwassist(struct ena_adapter *);
static int ena_setup_ifnet(device_t, struct ena_adapter *,
struct ena_com_dev_get_features_ctx *);
@@ -161,9 +137,9 @@ static int ena_check_and_collapse_mbuf(s
struct mbuf **mbuf);
static int ena_xmit_mbuf(struct ena_ring *, struct mbuf **);
static void ena_start_xmit(struct ena_ring *);
-static int ena_mq_start(if_t, struct mbuf *);
+static int ena_mq_start(struct ifnet *, struct mbuf *);
static void ena_deferred_mq_start(void *, int);
-static void ena_qflush(if_t);
+static void ena_qflush(struct ifnet *);
static int ena_calc_io_queue_num(struct ena_adapter *,
struct ena_com_dev_get_features_ctx *);
static int ena_calc_queue_size(struct ena_adapter *, uint16_t *,
@@ -171,7 +147,7 @@ static int ena_calc_queue_size(struct en
static int ena_rss_init_default(struct ena_adapter *);
static void ena_rss_init_default_deferred(void *);
static void ena_config_host_info(struct ena_com_dev *);
-static int ena_attach(device_t);
+static int ena_attach(device_t parent, device_t self, void *aux);
static int ena_detach(device_t);
static int ena_device_init(struct ena_adapter *, device_t,
struct ena_com_dev_get_features_ctx *, int *);
@@ -182,25 +158,32 @@ static void unimplemented_aenq_handler(v
struct ena_admin_aenq_entry *);
static void ena_timer_service(void *);
-static char ena_version[] = DEVICE_NAME DRV_MODULE_NAME " v" DRV_MODULE_VERSION;
+static const char ena_version[] =
+ DEVICE_NAME DRV_MODULE_NAME " v" DRV_MODULE_VERSION;
+#if 0
static SYSCTL_NODE(_hw, OID_AUTO, ena, CTLFLAG_RD, 0, "ENA driver parameters");
+#endif
/*
* Tuneable number of buffers in the buf-ring (drbr)
*/
static int ena_buf_ring_size = 4096;
+#if 0
SYSCTL_INT(_hw_ena, OID_AUTO, buf_ring_size, CTLFLAG_RWTUN,
&ena_buf_ring_size, 0, "Size of the bufring");
+#endif
/*
* Logging level for changing verbosity of the output
*/
int ena_log_level = ENA_ALERT | ENA_WARNING;
+#if 0
SYSCTL_INT(_hw_ena, OID_AUTO, log_level, CTLFLAG_RWTUN,
&ena_log_level, 0, "Logging level indicating verbosity of the logs");
+#endif
-static ena_vendor_info_t ena_vendor_info_array[] = {
+static const ena_vendor_info_t ena_vendor_info_array[] = {
{ PCI_VENDOR_ID_AMAZON, PCI_DEV_ID_ENA_PF, 0},
{ PCI_VENDOR_ID_AMAZON, PCI_DEV_ID_ENA_LLQ_PF, 0},
{ PCI_VENDOR_ID_AMAZON, PCI_DEV_ID_ENA_VF, 0},
@@ -214,71 +197,67 @@ static ena_vendor_info_t ena_vendor_info
*/
static struct ena_aenq_handlers aenq_handlers;
-void
-ena_dmamap_callback(void *arg, bus_dma_segment_t *segs, int nseg, int error)
-{
- if (error != 0)
- return;
- *(bus_addr_t *) arg = segs[0].ds_addr;
-}
-
int
ena_dma_alloc(device_t dmadev, bus_size_t size,
ena_mem_handle_t *dma , int mapflags)
{
- struct ena_adapter* adapter = device_get_softc(dmadev);
+ struct ena_adapter *adapter = device_private(dmadev);
uint32_t maxsize;
- uint64_t dma_space_addr;
- int error;
+ bus_dma_segment_t seg;
+ int error, nsegs;
maxsize = ((size - 1) / PAGE_SIZE + 1) * PAGE_SIZE;
+#if 0
+ /* XXX what is this needed for ? */
dma_space_addr = ENA_DMA_BIT_MASK(adapter->dma_width);
if (unlikely(dma_space_addr == 0))
dma_space_addr = BUS_SPACE_MAXADDR;
+#endif
+
+ dma->tag = adapter->sc_dmat;
- error = bus_dma_tag_create(bus_get_dma_tag(dmadev), /* parent */
- 8, 0, /* alignment, bounds */
- dma_space_addr, /* lowaddr of exclusion window */
- BUS_SPACE_MAXADDR,/* highaddr of exclusion window */
- NULL, NULL, /* filter, filterarg */
- maxsize, /* maxsize */
- 1, /* nsegments */
- maxsize, /* maxsegsize */
- BUS_DMA_ALLOCNOW, /* flags */
- NULL, /* lockfunc */
- NULL, /* lockarg */
- &dma->tag);
- if (unlikely(error != 0)) {
- ena_trace(ENA_ALERT, "bus_dma_tag_create failed: %d\n", error);
- goto fail_tag;
- }
-
- error = bus_dmamem_alloc(dma->tag, (void**) &dma->vaddr,
- BUS_DMA_COHERENT | BUS_DMA_ZERO, &dma->map);
- if (unlikely(error != 0)) {
+ if (bus_dmamap_create(dma->tag, maxsize, 1, maxsize, 0,
+ BUS_DMA_WAITOK | BUS_DMA_ALLOCNOW, &dma->map) != 0) {
+ ena_trace(ENA_ALERT, "bus_dmamap_create(%ju) failed: %d\n",
+ (uintmax_t)maxsize, error);
+ goto fail_create;
+ }
+
+ error = bus_dmamem_alloc(dma->tag, maxsize, 8, 0, &seg, 1, &nsegs,
+ BUS_DMA_ALLOCNOW);
+ if (error) {
ena_trace(ENA_ALERT, "bus_dmamem_alloc(%ju) failed: %d\n",
- (uintmax_t)size, error);
- goto fail_map_create;
+ (uintmax_t)maxsize, error);
+ goto fail_alloc;
+ }
+
+ error = bus_dmamem_map(dma->tag, &seg, nsegs, maxsize,
+ &dma->vaddr, BUS_DMA_COHERENT);
+ if (error) {
+ ena_trace(ENA_ALERT, "bus_dmamem_map(%ju) failed: %d\n",
+ (uintmax_t)maxsize, error);
+ goto fail_map;
}
+ memset(dma->vaddr, 0, maxsize);
- dma->paddr = 0;
error = bus_dmamap_load(dma->tag, dma->map, dma->vaddr,
- size, ena_dmamap_callback, &dma->paddr, mapflags);
- if (unlikely((error != 0) || (dma->paddr == 0))) {
+ maxsize, NULL, mapflags);
+ if (error) {
ena_trace(ENA_ALERT, ": bus_dmamap_load failed: %d\n", error);
- goto fail_map_load;
+ goto fail_load;
}
+ dma->paddr = dma->map->dm_segs[0].ds_addr;
return (0);
-fail_map_load:
- bus_dmamem_free(dma->tag, dma->vaddr, dma->map);
-fail_map_create:
- bus_dma_tag_destroy(dma->tag);
-fail_tag:
- dma->tag = NULL;
-
+fail_load:
+ bus_dmamem_unmap(dma->tag, dma->vaddr, maxsize);
+fail_map:
+ bus_dmamem_free(dma->tag, &seg, nsegs);
+fail_alloc:
+ bus_dmamap_destroy(adapter->sc_dmat, dma->map);
+fail_create:
return (error);
}
@@ -318,37 +297,25 @@ ena_free_pci_resources(struct ena_adapte
}
static int
-ena_probe(device_t dev)
+ena_probe(device_t parent, cfdata_t match, void *aux)
{
- ena_vendor_info_t *ent;
- char adapter_name[60];
- uint16_t pci_vendor_id = 0;
- uint16_t pci_device_id = 0;
+ struct pci_attach_args *pa = aux;
+ const ena_vendor_info_t *ent;
- pci_vendor_id = pci_get_vendor(dev);
- pci_device_id = pci_get_device(dev);
+ for (int i = 0; i < __arraycount(ena_vendor_info_array); i++) {
+ ent = &ena_vendor_info_array[i];
- ent = ena_vendor_info_array;
- while (ent->vendor_id != 0) {
- if ((pci_vendor_id == ent->vendor_id) &&
- (pci_device_id == ent->device_id)) {
- ena_trace(ENA_DBG, "vendor=%x device=%x ",
- pci_vendor_id, pci_device_id);
-
- sprintf(adapter_name, DEVICE_DESC);
- device_set_desc_copy(dev, adapter_name);
- return (BUS_PROBE_DEFAULT);
+ if ((PCI_VENDOR(pa->pa_id) == ent->vendor_id) &&
+ (PCI_PRODUCT(pa->pa_id) == ent->device_id)) {
+ return 1;
}
-
- ent++;
-
}
- return (ENXIO);
+ return 0;
}
static int
-ena_change_mtu(if_t ifp, int new_mtu)
+ena_change_mtu(struct ifnet *ifp, int new_mtu)
{
struct ena_adapter *adapter = if_getsoftc(ifp);
int rc;
@@ -373,27 +340,27 @@ ena_change_mtu(if_t ifp, int new_mtu)
}
static inline void
-ena_alloc_counters(counter_u64_t *begin, int size)
+ena_alloc_counters(struct evcnt *begin, int size)
{
- counter_u64_t *end = (counter_u64_t *)((char *)begin + size);
+ struct evcnt *end = (struct evcnt *)((char *)begin + size);
for (; begin < end; ++begin)
*begin = counter_u64_alloc(M_WAITOK);
}
static inline void
-ena_free_counters(counter_u64_t *begin, int size)
+ena_free_counters(struct evcnt *begin, int size)
{
- counter_u64_t *end = (counter_u64_t *)((char *)begin + size);
+ struct evcnt *end = (struct evcnt *)((char *)begin + size);
for (; begin < end; ++begin)
counter_u64_free(*begin);
}
static inline void
-ena_reset_counters(counter_u64_t *begin, int size)
+ena_reset_counters(struct evcnt *begin, int size)
{
- counter_u64_t *end = (counter_u64_t *)((char *)begin + size);
+ struct evcnt *end = (struct evcnt *)((char *)begin + size);
for (; begin < end; ++begin)
counter_u64_zero(*begin);
@@ -439,7 +406,7 @@ ena_init_io_rings(struct ena_adapter *ad
M_WAITOK, &txr->ring_mtx);
/* Alloc TX statistics. */
- ena_alloc_counters((counter_u64_t *)&txr->tx_stats,
+ ena_alloc_counters((struct evcnt *)&txr->tx_stats,
sizeof(txr->tx_stats));
/* RX specific ring state */
@@ -448,17 +415,17 @@ ena_init_io_rings(struct ena_adapter *ad
ena_com_get_nonadaptive_moderation_interval_rx(ena_dev);
/* Alloc RX statistics. */
- ena_alloc_counters((counter_u64_t *)&rxr->rx_stats,
+ ena_alloc_counters((struct evcnt *)&rxr->rx_stats,
sizeof(rxr->rx_stats));
/* Initialize locks */
- snprintf(txr->mtx_name, nitems(txr->mtx_name), "%s:tx(%d)",
- device_get_nameunit(adapter->pdev), i);
- snprintf(rxr->mtx_name, nitems(rxr->mtx_name), "%s:rx(%d)",
- device_get_nameunit(adapter->pdev), i);
+ snprintf(txr->mtx_name, sizeof(txr->mtx_name), "%s:tx(%d)",
+ device_xname(adapter->pdev), i);
+ snprintf(rxr->mtx_name, sizeof(rxr->mtx_name), "%s:rx(%d)",
+ device_xname(adapter->pdev), i);
- mtx_init(&txr->ring_mtx, txr->mtx_name, NULL, MTX_DEF);
- mtx_init(&rxr->ring_mtx, rxr->mtx_name, NULL, MTX_DEF);
+ mutex_init(&txr->ring_mtx, MUTEX_DEFAULT, IPL_NET);
+ mutex_init(&rxr->ring_mtx, MUTEX_DEFAULT, IPL_NET);
que = &adapter->que[i];
que->adapter = adapter;
@@ -479,17 +446,17 @@ ena_free_io_ring_resources(struct ena_ad
struct ena_ring *txr = &adapter->tx_ring[qid];
struct ena_ring *rxr = &adapter->rx_ring[qid];
- ena_free_counters((counter_u64_t *)&txr->tx_stats,
+ ena_free_counters((struct evcnt *)&txr->tx_stats,
sizeof(txr->tx_stats));
- ena_free_counters((counter_u64_t *)&rxr->rx_stats,
+ ena_free_counters((struct evcnt *)&rxr->rx_stats,
sizeof(rxr->rx_stats));
ENA_RING_MTX_LOCK(txr);
drbr_free(txr->br, M_DEVBUF);
ENA_RING_MTX_UNLOCK(txr);
- mtx_destroy(&txr->ring_mtx);
- mtx_destroy(&rxr->ring_mtx);
+ mutex_destroy(&txr->ring_mtx);
+ mutex_destroy(&rxr->ring_mtx);
}
static void
@@ -502,6 +469,7 @@ ena_free_all_io_rings_resources(struct e
}
+#if 0
static int
ena_setup_tx_dma_tag(struct ena_adapter *adapter)
{
@@ -523,20 +491,9 @@ ena_setup_tx_dma_tag(struct ena_adapter
return (ret);
}
+#endif
-static int
-ena_free_tx_dma_tag(struct ena_adapter *adapter)
-{
- int ret;
-
- ret = bus_dma_tag_destroy(adapter->tx_buf_tag);
-
- if (likely(ret == 0))
- adapter->tx_buf_tag = NULL;
-
- return (ret);
-}
-
+#if 0
static int
ena_setup_rx_dma_tag(struct ena_adapter *adapter)
{
@@ -558,19 +515,7 @@ ena_setup_rx_dma_tag(struct ena_adapter
return (ret);
}
-
-static int
-ena_free_rx_dma_tag(struct ena_adapter *adapter)
-{
- int ret;
-
- ret = bus_dma_tag_destroy(adapter->rx_buf_tag);
-
- if (likely(ret == 0))
- adapter->rx_buf_tag = NULL;
-
- return (ret);
-}
+#endif
/**
* ena_setup_tx_resources - allocate Tx resources (Descriptors)
@@ -605,7 +550,7 @@ ena_setup_tx_resources(struct ena_adapte
tx_ring->free_tx_ids[i] = i;
/* Reset TX statistics. */
- ena_reset_counters((counter_u64_t *)&tx_ring->tx_stats,
+ ena_reset_counters((struct evcnt *)&tx_ring->tx_stats,
sizeof(tx_ring->tx_stats));
tx_ring->next_to_use = 0;
@@ -618,7 +563,7 @@ ena_setup_tx_resources(struct ena_adapte
/* ... and create the buffer DMA maps */
for (i = 0; i < tx_ring->ring_size; i++) {
- err = bus_dmamap_create(adapter->tx_buf_tag, 0,
+ err = bus_dmamap_create(adapter->sc_dmat, 0,
&tx_ring->tx_buffer_info[i].map);
if (unlikely(err != 0)) {
ena_trace(ENA_ALERT,
@@ -641,19 +586,19 @@ ena_setup_tx_resources(struct ena_adapte
/* RSS set cpu for thread */
#ifdef RSS
CPU_SETOF(que->cpu, &cpu_mask);
- taskqueue_start_threads_cpuset(&tx_ring->enqueue_tq, 1, PI_NET,
+ taskqueue_start_threads_cpuset(&tx_ring->enqueue_tq, 1, IPL_NET,
&cpu_mask, "%s tx_ring enq (bucket %d)",
- device_get_nameunit(adapter->pdev), que->cpu);
+ device_xname(adapter->pdev), que->cpu);
#else /* RSS */
- taskqueue_start_threads(&tx_ring->enqueue_tq, 1, PI_NET,
- "%s txeq %d", device_get_nameunit(adapter->pdev), que->cpu);
+ taskqueue_start_threads(&tx_ring->enqueue_tq, 1, IPL_NET,
+ "%s txeq %d", device_xname(adapter->pdev), que->cpu);
#endif /* RSS */
return (0);
err_buf_info_unmap:
while (i--) {
- bus_dmamap_destroy(adapter->tx_buf_tag,
+ bus_dmamap_destroy(adapter->sc_dmat,
tx_ring->tx_buffer_info[i].map);
}
free(tx_ring->free_tx_ids, M_DEVBUF);
@@ -691,9 +636,9 @@ ena_free_tx_resources(struct ena_adapter
for (int i = 0; i < tx_ring->ring_size; i++) {
m_freem(tx_ring->tx_buffer_info[i].mbuf);
tx_ring->tx_buffer_info[i].mbuf = NULL;
- bus_dmamap_unload(adapter->tx_buf_tag,
+ bus_dmamap_unload(adapter->sc_dmat,
tx_ring->tx_buffer_info[i].map);
- bus_dmamap_destroy(adapter->tx_buf_tag,
+ bus_dmamap_destroy(adapter->sc_dmat,
tx_ring->tx_buffer_info[i].map);
}
ENA_RING_MTX_UNLOCK(tx_ring);
@@ -801,7 +746,7 @@ ena_setup_rx_resources(struct ena_adapte
rx_ring->free_rx_ids[i] = i;
/* Reset RX statistics. */
- ena_reset_counters((counter_u64_t *)&rx_ring->rx_stats,
+ ena_reset_counters((struct evcnt *)&rx_ring->rx_stats,
sizeof(rx_ring->rx_stats));
rx_ring->next_to_clean = 0;
@@ -809,7 +754,7 @@ ena_setup_rx_resources(struct ena_adapte
/* ... and create the buffer DMA maps */
for (i = 0; i < rx_ring->ring_size; i++) {
- err = bus_dmamap_create(adapter->rx_buf_tag, 0,
+ err = bus_dmamap_create(adapter->sc_dmat, 0,
&(rx_ring->rx_buffer_info[i].map));
if (err != 0) {
ena_trace(ENA_ALERT,
@@ -818,6 +763,7 @@ ena_setup_rx_resources(struct ena_adapte
}
}
+#ifdef LRO
/* Create LRO for the ring */
if ((adapter->ifp->if_capenable & IFCAP_LRO) != 0) {
int err = tcp_lro_init(&rx_ring->lro);
@@ -830,6 +776,7 @@ ena_setup_rx_resources(struct ena_adapte
rx_ring->lro.ifp = adapter->ifp;
}
}
+#endif
/* Allocate taskqueues */
TASK_INIT(&rx_ring->cmpl_task, 0, ena_deferred_rx_cleanup, rx_ring);
@@ -839,19 +786,19 @@ ena_setup_rx_resources(struct ena_adapte
/* RSS set cpu for thread */
#ifdef RSS
CPU_SETOF(que->cpu, &cpu_mask);
- taskqueue_start_threads_cpuset(&rx_ring->cmpl_tq, 1, PI_NET, &cpu_mask,
+ taskqueue_start_threads_cpuset(&rx_ring->cmpl_tq, 1, IPL_NET, &cpu_mask,
"%s rx_ring cmpl (bucket %d)",
- device_get_nameunit(adapter->pdev), que->cpu);
+ device_xname(adapter->pdev), que->cpu);
#else
- taskqueue_start_threads(&rx_ring->cmpl_tq, 1, PI_NET,
- "%s rx_ring cmpl %d", device_get_nameunit(adapter->pdev), que->cpu);
+ taskqueue_start_threads(&rx_ring->cmpl_tq, 1, IPL_NET,
+ "%s rx_ring cmpl %d", device_xname(adapter->pdev), que->cpu);
#endif
return (0);
err_buf_info_unmap:
while (i--) {
- bus_dmamap_destroy(adapter->rx_buf_tag,
+ bus_dmamap_destroy(adapter->sc_dmat,
rx_ring->rx_buffer_info[i].map);
}
@@ -883,14 +830,16 @@ ena_free_rx_resources(struct ena_adapter
for (int i = 0; i < rx_ring->ring_size; i++) {
m_freem(rx_ring->rx_buffer_info[i].mbuf);
rx_ring->rx_buffer_info[i].mbuf = NULL;
- bus_dmamap_unload(adapter->rx_buf_tag,
+ bus_dmamap_unload(adapter->sc_dmat,
rx_ring->rx_buffer_info[i].map);
- bus_dmamap_destroy(adapter->rx_buf_tag,
+ bus_dmamap_destroy(adapter->sc_dmat,
rx_ring->rx_buffer_info[i].map);
}
+#ifdef LRO
/* free LRO resources, */
tcp_lro_free(&rx_ring->lro);
+#endif
/* free allocated memory */
free(rx_ring->rx_buffer_info, M_DEVBUF);
@@ -976,8 +925,8 @@ ena_alloc_rx_mbuf(struct ena_adapter *ad
/* Map packets for DMA */
ena_trace(ENA_DBG | ENA_RSC | ENA_RXPTH,
"Using tag %p for buffers' DMA mapping, mbuf %p len: %d",
- adapter->rx_buf_tag,rx_info->mbuf, rx_info->mbuf->m_len);
- error = bus_dmamap_load_mbuf_sg(adapter->rx_buf_tag, rx_info->map,
+ adapter->sc_dmat,rx_info->mbuf, rx_info->mbuf->m_len);
+ error = bus_dmamap_load_mbuf_sg(adapter->sc_dmat, rx_info->map,
rx_info->mbuf, segs, &nsegs, BUS_DMA_NOWAIT);
if (unlikely((error != 0) || (nsegs != 1))) {
ena_trace(ENA_WARNING, "failed to map mbuf, error: %d, "
@@ -987,7 +936,8 @@ ena_alloc_rx_mbuf(struct ena_adapter *ad
}
- bus_dmamap_sync(adapter->rx_buf_tag, rx_info->map, BUS_DMASYNC_PREREAD);
+ bus_dmamap_sync(adapter->sc_dmat, rx_info->map, 0, mlen,
+ BUS_DMASYNC_PREREAD);
ena_buf = &rx_info->ena_buf;
ena_buf->paddr = segs[0].ds_addr;
@@ -1015,7 +965,7 @@ ena_free_rx_mbuf(struct ena_adapter *ada
return;
}
- bus_dmamap_unload(adapter->rx_buf_tag, rx_info->map);
+ bus_dmamap_unload(adapter->sc_dmat, rx_info->map);
m_freem(rx_info->mbuf);
rx_info->mbuf = NULL;
}
@@ -1160,7 +1110,7 @@ ena_free_tx_bufs(struct ena_adapter *ada
qid, i);
}
- bus_dmamap_unload(adapter->tx_buf_tag, tx_info->map);
+ bus_dmamap_unload(adapter->sc_dmat, tx_info->map);
m_free(tx_info->mbuf);
tx_info->mbuf = NULL;
}
@@ -1360,7 +1310,7 @@ ena_tx_cleanup(struct ena_ring *tx_ring)
if (likely(tx_info->num_of_bufs != 0)) {
/* Map is no longer required */
- bus_dmamap_unload(adapter->tx_buf_tag, tx_info->map);
+ bus_dmamap_unload(adapter->sc_dmat, tx_info->map);
}
ena_trace(ENA_DBG | ENA_TXPTH, "tx: q %d mbuf %p completed",
@@ -1503,7 +1453,7 @@ ena_rx_mbuf(struct ena_ring *rx_ring, st
mbuf, mbuf->m_flags, mbuf->m_pkthdr.len);
/* DMA address is not needed anymore, unmap it */
- bus_dmamap_unload(rx_ring->adapter->rx_buf_tag, rx_info->map);
+ bus_dmamap_unload(rx_ring->adapter->sc_dmat, rx_info->map);
rx_info->mbuf = NULL;
rx_ring->free_rx_ids[ntc] = req_id;
@@ -1545,7 +1495,7 @@ ena_rx_mbuf(struct ena_ring *rx_ring, st
"rx mbuf updated. len %d", mbuf->m_pkthdr.len);
/* Free already appended mbuf, it won't be useful anymore */
- bus_dmamap_unload(rx_ring->adapter->rx_buf_tag, rx_info->map);
+ bus_dmamap_unload(rx_ring->adapter->sc_dmat, rx_info->map);
m_freem(rx_info->mbuf);
rx_info->mbuf = NULL;
@@ -1621,7 +1571,7 @@ ena_rx_cleanup(struct ena_ring *rx_ring)
struct ena_com_rx_ctx ena_rx_ctx;
struct ena_com_io_cq* io_cq;
struct ena_com_io_sq* io_sq;
- if_t ifp;
+ struct ifnet *ifp;
uint16_t ena_qid;
uint16_t next_to_clean;
uint32_t refill_required;
@@ -1686,6 +1636,7 @@ ena_rx_cleanup(struct ena_ring *rx_ring)
counter_u64_add_protected(adapter->hw_stats.rx_bytes,
mbuf->m_pkthdr.len);
counter_exit();
+#ifdef LRO
/*
* LRO is only for IP/TCP packets and TCP checksum of the packet
* should be computed by hardware.
@@ -1709,6 +1660,7 @@ ena_rx_cleanup(struct ena_ring *rx_ring)
"calling if_input() with mbuf %p", mbuf);
(*ifp->if_input)(ifp, mbuf);
}
+#endif
counter_enter();
counter_u64_add_protected(rx_ring->rx_stats.cnt, 1);
@@ -1726,7 +1678,9 @@ ena_rx_cleanup(struct ena_ring *rx_ring)
ena_refill_rx_bufs(rx_ring, refill_required);
}
+#ifdef LRO
tcp_lro_flush_all(&rx_ring->lro);
+#endif
return (RX_BUDGET - budget);
@@ -1764,7 +1718,7 @@ ena_handle_msix(void *arg)
{
struct ena_que *que = arg;
struct ena_adapter *adapter = que->adapter;
- if_t ifp = adapter->ifp;
+ struct ifnet *ifp = adapter->ifp;
struct ena_ring *tx_ring;
struct ena_ring *rx_ring;
struct ena_com_io_cq* io_cq;
@@ -1871,7 +1825,7 @@ ena_setup_mgmnt_intr(struct ena_adapter
snprintf(adapter->irq_tbl[ENA_MGMNT_IRQ_IDX].name,
ENA_IRQNAME_SIZE, "ena-mgmnt@pci:%s",
- device_get_nameunit(adapter->pdev));
+ device_xname(adapter->pdev));
/*
* Handler is NULL on purpose, it will be set
* when mgmnt interrupt is acquired
@@ -1892,7 +1846,7 @@ ena_setup_io_intr(struct ena_adapter *ad
irq_idx = ENA_IO_IRQ_IDX(i);
snprintf(adapter->irq_tbl[irq_idx].name, ENA_IRQNAME_SIZE,
- "%s-TxRx-%d", device_get_nameunit(adapter->pdev), i);
+ "%s-TxRx-%d", device_xname(adapter->pdev), i);
adapter->irq_tbl[irq_idx].handler = ena_handle_msix;
adapter->irq_tbl[irq_idx].data = &adapter->que[i];
adapter->irq_tbl[irq_idx].vector =
@@ -2195,7 +2149,7 @@ ena_up_complete(struct ena_adapter *adap
return (rc);
ena_refill_all_rx_bufs(adapter);
- ena_reset_counters((counter_u64_t *)&adapter->hw_stats,
+ ena_reset_counters((struct evcnt *)&adapter->hw_stats,
sizeof(adapter->hw_stats));
return (0);
@@ -2285,8 +2239,9 @@ err_req_irq:
return (rc);
}
+#if 0
static uint64_t
-ena_get_counter(if_t ifp, ift_counter cnt)
+ena_get_counter(struct ifnet *ifp, ift_counter cnt)
{
struct ena_adapter *adapter;
struct ena_hw_stats *stats;
@@ -2309,27 +2264,28 @@ ena_get_counter(if_t ifp, ift_counter cn
return (if_get_counter_default(ifp, cnt));
}
}
+#endif
static int
-ena_media_change(if_t ifp)
+ena_media_change(struct ifnet *ifp)
{
/* Media Change is not supported by firmware */
return (0);
}
static void
-ena_media_status(if_t ifp, struct ifmediareq *ifmr)
+ena_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
{
struct ena_adapter *adapter = if_getsoftc(ifp);
ena_trace(ENA_DBG, "enter");
- mtx_lock(&adapter->global_mtx);
+ mutex_enter(&adapter->global_mtx);
ifmr->ifm_status = IFM_AVALID;
ifmr->ifm_active = IFM_ETHER;
if (!adapter->link_status) {
- mtx_unlock(&adapter->global_mtx);
+ mutex_exit(&adapter->global_mtx);
ena_trace(ENA_INFO, "link_status = false");
return;
}
@@ -2337,7 +2293,7 @@ ena_media_status(if_t ifp, struct ifmedi
ifmr->ifm_status |= IFM_ACTIVE;
ifmr->ifm_active |= IFM_10G_T | IFM_FDX;
- mtx_unlock(&adapter->global_mtx);
+ mutex_exit(&adapter->global_mtx);
}
static void
@@ -2346,14 +2302,14 @@ ena_init(void *arg)
struct ena_adapter *adapter = (struct ena_adapter *)arg;
if (!adapter->up) {
- sx_xlock(&adapter->ioctl_sx);
+ rw_enter(&adapter->ioctl_sx, RW_WRITER);
ena_up(adapter);
- sx_unlock(&adapter->ioctl_sx);
+ rw_exit(&adapter->ioctl_sx);
}
}
static int
-ena_ioctl(if_t ifp, u_long command, caddr_t data)
+ena_ioctl(struct ifnet *ifp, u_long command, void *data)
{
struct ena_adapter *adapter;
struct ifreq *ifr;
@@ -2370,13 +2326,13 @@ ena_ioctl(if_t ifp, u_long command, cadd
case SIOCSIFMTU:
if (ifp->if_mtu == ifr->ifr_mtu)
break;
- sx_xlock(&adapter->ioctl_sx);
+ rw_enter(&adapter->ioctl_sx, RW_WRITER);
ena_down(adapter);
ena_change_mtu(ifp, ifr->ifr_mtu);
rc = ena_up(adapter);
- sx_unlock(&adapter->ioctl_sx);
+ rw_exit(&adapter->ioctl_sx);
break;
case SIOCSIFFLAGS:
@@ -2388,15 +2344,15 @@ ena_ioctl(if_t ifp, u_long command, cadd
"ioctl promisc/allmulti\n");
}
} else {
- sx_xlock(&adapter->ioctl_sx);
+ rw_enter(&adapter->ioctl_sx, RW_WRITER);
rc = ena_up(adapter);
- sx_unlock(&adapter->ioctl_sx);
+ rw_exit(&adapter->ioctl_sx);
}
} else {
if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0) {
- sx_xlock(&adapter->ioctl_sx);
+ rw_enter(&adapter->ioctl_sx, RW_WRITER);
ena_down(adapter);
- sx_unlock(&adapter->ioctl_sx);
+ rw_exit(&adapter->ioctl_sx);
}
}
break;
@@ -2421,10 +2377,10 @@ ena_ioctl(if_t ifp, u_long command, cadd
if ((reinit != 0) &&
((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0)) {
- sx_xlock(&adapter->ioctl_sx);
+ rw_enter(&adapter->ioctl_sx, RW_WRITER);
ena_down(adapter);
rc = ena_up(adapter);
- sx_unlock(&adapter->ioctl_sx);
+ rw_exit(&adapter->ioctl_sx);
}
}
@@ -2476,7 +2432,7 @@ ena_get_dev_offloads(struct ena_com_dev_
}
static void
-ena_update_host_info(struct ena_admin_host_info *host_info, if_t ifp)
+ena_update_host_info(struct ena_admin_host_info *host_info, struct ifnet *ifp)
{
host_info->supported_network_features[0] =
@@ -2486,7 +2442,7 @@ ena_update_host_info(struct ena_admin_ho
static void
ena_update_hwassist(struct ena_adapter *adapter)
{
- if_t ifp = adapter->ifp;
+ struct ifnet *ifp = adapter->ifp;
uint32_t feat = adapter->tx_offload_cap;
int cap = if_getcapenable(ifp);
int flags = 0;
@@ -2519,7 +2475,7 @@ static int
ena_setup_ifnet(device_t pdev, struct ena_adapter *adapter,
struct ena_com_dev_get_features_ctx *feat)
{
- if_t ifp;
+ struct ifnet *ifp;
int caps = 0;
ifp = adapter->ifp = if_gethandle(IFT_ETHER);
@@ -2527,7 +2483,7 @@ ena_setup_ifnet(device_t pdev, struct en
ena_trace(ENA_ALERT, "can not allocate ifnet structure\n");
return (ENXIO);
}
- if_initname(ifp, device_get_name(pdev), device_get_unit(pdev));
+ if_initname(ifp, device_xname(pdev), device_get_unit(pdev));
if_setdev(ifp, pdev);
if_setsoftc(ifp, adapter);
@@ -2651,7 +2607,7 @@ ena_tx_csum(struct ena_com_tx_ctx *ena_t
ip = (struct ip *)(mbuf->m_data + ehdrlen);
iphlen = ip->ip_hl << 2;
- th = (struct tcphdr *)((caddr_t)ip + iphlen);
+ th = (struct tcphdr *)((vaddr_t)ip + iphlen);
if ((mbuf->m_pkthdr.csum_flags & CSUM_IP) != 0) {
ena_tx_ctx->l3_csum_enable = 1;
@@ -2780,7 +2736,7 @@ ena_xmit_mbuf(struct ena_ring *tx_ring,
header_len = 0;
push_hdr = NULL;
- rc = bus_dmamap_load_mbuf_sg(adapter->tx_buf_tag, tx_info->map,
+ rc = bus_dmamap_load_mbuf_sg(adapter->sc_dmat, tx_info->map,
*mbuf, segs, &nsegs, BUS_DMA_NOWAIT);
if (unlikely((rc != 0) || (nsegs == 0))) {
@@ -2835,14 +2791,14 @@ ena_xmit_mbuf(struct ena_ring *tx_ring,
tx_ring->next_to_use = ENA_TX_RING_IDX_NEXT(next_to_use,
tx_ring->ring_size);
- bus_dmamap_sync(adapter->tx_buf_tag, tx_info->map,
+ bus_dmamap_sync(adapter->sc_dmat, tx_info->map,
BUS_DMASYNC_PREWRITE);
return (0);
dma_error:
tx_info->mbuf = NULL;
- bus_dmamap_unload(adapter->tx_buf_tag, tx_info->map);
+ bus_dmamap_unload(adapter->sc_dmat, tx_info->map);
return (rc);
}
@@ -2934,7 +2890,7 @@ ena_deferred_mq_start(void *arg, int pen
}
static int
-ena_mq_start(if_t ifp, struct mbuf *m)
+ena_mq_start(struct ifnet *ifp, struct mbuf *m)
{
struct ena_adapter *adapter = ifp->if_softc;
struct ena_ring *tx_ring;
@@ -2985,7 +2941,7 @@ ena_mq_start(if_t ifp, struct mbuf *m)
}
static void
-ena_qflush(if_t ifp)
+ena_qflush(struct ifnet *ifp)
{
struct ena_adapter *adapter = ifp->if_softc;
struct ena_ring *tx_ring = adapter->tx_ring;
@@ -3159,7 +3115,8 @@ ena_config_host_info(struct ena_com_dev
host_info->os_type = ENA_ADMIN_OS_FREEBSD;
host_info->kernel_ver = osreldate;
- sprintf(host_info->kernel_ver_str, "%d", osreldate);
+ snprintf(host_info->kernel_ver_str, sizeof(host_info->kernel_ver_str),
+ "%d", osreldate);
host_info->os_dist = 0;
strncpy(host_info->os_dist_str, osrelease,
sizeof(host_info->os_dist_str) - 1);
@@ -3547,7 +3504,7 @@ ena_reset_task(void *arg, int pending)
return;
}
- sx_xlock(&adapter->ioctl_sx);
+ rw_enter(&adapter->ioctl_sx, RW_WRITER);
callout_drain(&adapter->timer_service);
@@ -3594,7 +3551,7 @@ ena_reset_task(void *arg, int pending)
callout_reset_sbt(&adapter->timer_service, SBT_1S, SBT_1S,
ena_timer_service, (void *)adapter, 0);
- sx_unlock(&adapter->ioctl_sx);
+ rw_exit(&adapter->ioctl_sx);
return;
@@ -3606,7 +3563,7 @@ err_com_free:
err_dev_free:
device_printf(adapter->pdev, "ENA reset failed!\n");
adapter->running = false;
- sx_unlock(&adapter->ioctl_sx);
+ rw_exit(&adapter->ioctl_sx);
}
/**
@@ -3620,22 +3577,38 @@ err_dev_free:
* and a hardware reset occur.
**/
static int
-ena_attach(device_t pdev)
+ena_attach(device_t parent, device_t self, void *aux)
{
+ struct pci_attach_args *pa = aux;
struct ena_com_dev_get_features_ctx get_feat_ctx;
static int version_printed;
- struct ena_adapter *adapter;
+ struct ena_adapter *adapter = device_private(parent);
struct ena_com_dev *ena_dev = NULL;
uint16_t tx_sgl_size = 0;
uint16_t rx_sgl_size = 0;
+ pcireg_t reg;
int io_queue_num;
int queue_size;
int rc;
- adapter = device_get_softc(pdev);
- adapter->pdev = pdev;
- mtx_init(&adapter->global_mtx, "ENA global mtx", NULL, MTX_DEF);
- sx_init(&adapter->ioctl_sx, "ENA ioctl sx");
+ adapter->pdev = self;
+ adapter->ifp = &adapter->sc_ec.ec_if;
+
+ if (pci_dma64_available(pa))
+ adapter->sc_dmat = pa->pa_dmat64;
+ else
+ adapter->sc_dmat = pa->pa_dmat;
+
+ pci_aprint_devinfo(pa, NULL);
+
+ reg = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
+ if ((reg & PCI_COMMAND_MASTER_ENABLE) == 0) {
+ reg |= PCI_COMMAND_MASTER_ENABLE;
+ pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, reg);
+ }
+
+ mutex_init(&adapter->global_mtx, MUTEX_DEFAULT, IPL_NET);
+ rw_init(&adapter->ioctl_sx);
/* Set up the timer service */
callout_init_mtx(&adapter->timer_service, &adapter->global_mtx, 0);
@@ -3645,11 +3618,11 @@ ena_attach(device_t pdev)
adapter->missing_tx_threshold = DEFAULT_TX_CMP_THRESHOLD;
if (version_printed++ == 0)
- device_printf(pdev, "%s\n", ena_version);
+ device_printf(parent, "%s\n", ena_version);
rc = ena_allocate_pci_resources(adapter);
if (unlikely(rc != 0)) {
- device_printf(pdev, "PCI resource allocation failed!\n");
+ device_printf(parent, "PCI resource allocation failed!\n");
ena_free_pci_resources(adapter);
return (rc);
}
@@ -3659,7 +3632,7 @@ ena_attach(device_t pdev)
M_WAITOK | M_ZERO);
adapter->ena_dev = ena_dev;
- ena_dev->dmadev = pdev;
+ ena_dev->dmadev = self;
ena_dev->bus = malloc(sizeof(struct ena_bus), M_DEVBUF,
M_WAITOK | M_ZERO);
@@ -3755,13 +3728,13 @@ ena_attach(device_t pdev)
TASK_INIT(&adapter->reset_task, 0, ena_reset_task, adapter);
adapter->reset_tq = taskqueue_create("ena_reset_enqueue",
M_WAITOK | M_ZERO, taskqueue_thread_enqueue, &adapter->reset_tq);
- taskqueue_start_threads(&adapter->reset_tq, 1, PI_NET,
- "%s rstq", device_get_nameunit(adapter->pdev));
+ taskqueue_start_threads(&adapter->reset_tq, 1, IPL_NET,
+ "%s rstq", device_xname(adapter->pdev));
/* Initialize statistics */
- ena_alloc_counters((counter_u64_t *)&adapter->dev_stats,
+ ena_alloc_counters((struct evcnt *)&adapter->dev_stats,
sizeof(struct ena_stats_dev));
- ena_alloc_counters((counter_u64_t *)&adapter->hw_stats,
+ ena_alloc_counters((struct evcnt *)&adapter->hw_stats,
sizeof(struct ena_hw_stats));
ena_sysctl_add_nodes(adapter);
@@ -3801,7 +3774,7 @@ err_bus_free:
static int
ena_detach(device_t pdev)
{
- struct ena_adapter *adapter = device_get_softc(pdev);
+ struct ena_adapter *adapter = device_private(pdev);
struct ena_com_dev *ena_dev = adapter->ena_dev;
int rc;
@@ -3817,9 +3790,9 @@ ena_detach(device_t pdev)
taskqueue_drain(adapter->reset_tq, &adapter->reset_task);
taskqueue_free(adapter->reset_tq);
- sx_xlock(&adapter->ioctl_sx);
+ rw_enter(&adapter->ioctl_sx, RW_WRITER);
ena_down(adapter);
- sx_unlock(&adapter->ioctl_sx);
+ rw_exit(&adapter->ioctl_sx);
if (adapter->ifp != NULL) {
ether_ifdetach(adapter->ifp);
@@ -3828,9 +3801,9 @@ ena_detach(device_t pdev)
ena_free_all_io_rings_resources(adapter);
- ena_free_counters((counter_u64_t *)&adapter->hw_stats,
+ ena_free_counters((struct evcnt *)&adapter->hw_stats,
sizeof(struct ena_hw_stats));
- ena_free_counters((counter_u64_t *)&adapter->dev_stats,
+ ena_free_counters((struct evcnt *)&adapter->dev_stats,
sizeof(struct ena_stats_dev));
if (likely(adapter->rss_support))
@@ -3864,8 +3837,8 @@ ena_detach(device_t pdev)
ena_free_pci_resources(adapter);
- mtx_destroy(&adapter->global_mtx);
- sx_destroy(&adapter->ioctl_sx);
+ mutex_destroy(&adapter->global_mtx);
+ rw_destroy(&adapter->ioctl_sx);
if (ena_dev->bus != NULL)
free(ena_dev->bus, M_DEVBUF);
@@ -3890,7 +3863,7 @@ ena_update_on_link_change(void *adapter_
struct ena_adapter *adapter = (struct ena_adapter *)adapter_data;
struct ena_admin_aenq_link_change_desc *aenq_desc;
int status;
- if_t ifp;
+ struct ifnet *ifp;
aenq_desc = (struct ena_admin_aenq_link_change_desc *)aenq_e;
ifp = adapter->ifp;
@@ -3929,6 +3902,7 @@ static struct ena_aenq_handlers aenq_han
.unimplemented_handler = unimplemented_aenq_handler
};
+#ifdef __FreeBSD__
/*********************************************************************
* FreeBSD Device Interface Entry Points
*********************************************************************/
@@ -3951,3 +3925,4 @@ MODULE_DEPEND(ena, pci, 1, 1, 1);
MODULE_DEPEND(ena, ether, 1, 1, 1);
/*********************************************************************/
+#endif /* __FreeBSD__ */
Index: src/sys/dev/pci/if_enavar.h
diff -u src/sys/dev/pci/if_enavar.h:1.1.1.1 src/sys/dev/pci/if_enavar.h:1.2
--- src/sys/dev/pci/if_enavar.h:1.1.1.1 Sat May 19 09:18:31 2018
+++ src/sys/dev/pci/if_enavar.h Sat May 19 09:32:55 2018
@@ -1,3 +1,5 @@
+/* $NetBSD: if_enavar.h,v 1.2 2018/05/19 09:32:55 jdolecek Exp $ */
+
/*-
* BSD LICENSE
*
@@ -36,8 +38,8 @@
#include <sys/types.h>
-#include "ena-com/ena_com.h"
-#include "ena-com/ena_eth_com.h"
+#include "external/bsd/ena-com/ena_com.h"
+#include "external/bsd/ena-com/ena_eth_com.h"
#define DRV_MODULE_VER_MAJOR 0
#define DRV_MODULE_VER_MINOR 8
@@ -47,9 +49,9 @@
#ifndef DRV_MODULE_VERSION
#define DRV_MODULE_VERSION \
- __XSTRING(DRV_MODULE_VER_MAJOR) "." \
- __XSTRING(DRV_MODULE_VER_MINOR) "." \
- __XSTRING(DRV_MODULE_VER_SUBMINOR)
+ __STRING(DRV_MODULE_VER_MAJOR) "." \
+ __STRING(DRV_MODULE_VER_MINOR) "." \
+ __STRING(DRV_MODULE_VER_SUBMINOR)
#endif
#define DEVICE_NAME "Elastic Network Adapter (ENA)"
#define DEVICE_DESC "ENA adapter"
@@ -159,7 +161,7 @@ typedef struct _ena_vendor_info_t {
struct ena_irq {
/* Interrupt resources */
struct resource *res;
- driver_intr_t *handler;
+ void *handler;
void *data;
void *cookie;
unsigned int vector;
@@ -199,28 +201,28 @@ struct ena_rx_buffer {
} __aligned(CACHE_LINE_SIZE);
struct ena_stats_tx {
- counter_u64_t cnt;
- counter_u64_t bytes;
- counter_u64_t prepare_ctx_err;
- counter_u64_t dma_mapping_err;
- counter_u64_t doorbells;
- counter_u64_t missing_tx_comp;
- counter_u64_t bad_req_id;
- counter_u64_t collapse;
- counter_u64_t collapse_err;
+ struct evcnt cnt;
+ struct evcnt bytes;
+ struct evcnt prepare_ctx_err;
+ struct evcnt dma_mapping_err;
+ struct evcnt doorbells;
+ struct evcnt missing_tx_comp;
+ struct evcnt bad_req_id;
+ struct evcnt collapse;
+ struct evcnt collapse_err;
};
struct ena_stats_rx {
- counter_u64_t cnt;
- counter_u64_t bytes;
- counter_u64_t refil_partial;
- counter_u64_t bad_csum;
- counter_u64_t mjum_alloc_fail;
- counter_u64_t mbuf_alloc_fail;
- counter_u64_t dma_mapping_err;
- counter_u64_t bad_desc_num;
- counter_u64_t bad_req_id;
- counter_u64_t empty_rx_ring;
+ struct evcnt cnt;
+ struct evcnt bytes;
+ struct evcnt refil_partial;
+ struct evcnt bad_csum;
+ struct evcnt mjum_alloc_fail;
+ struct evcnt mbuf_alloc_fail;
+ struct evcnt dma_mapping_err;
+ struct evcnt bad_desc_num;
+ struct evcnt bad_req_id;
+ struct evcnt empty_rx_ring;
};
struct ena_ring {
@@ -251,7 +253,9 @@ struct ena_ring {
enum ena_intr_moder_level moder_tbl_idx;
struct ena_que *que;
+#ifdef LRO
struct lro_ctrl lro;
+#endif
uint16_t next_to_use;
uint16_t next_to_clean;
@@ -264,17 +268,17 @@ struct ena_ring {
struct buf_ring *br; /* only for TX */
- struct mtx ring_mtx;
+ kmutex_t ring_mtx;
char mtx_name[16];
union {
struct {
- struct task enqueue_task;
- struct taskqueue *enqueue_tq;
+ struct work enqueue_task;
+ struct workqueue *enqueue_tq;
};
struct {
- struct task cmpl_task;
- struct taskqueue *cmpl_tq;
+ struct work cmpl_task;
+ struct workqueue *cmpl_tq;
};
};
@@ -287,20 +291,20 @@ struct ena_ring {
} __aligned(CACHE_LINE_SIZE);
struct ena_stats_dev {
- counter_u64_t wd_expired;
- counter_u64_t interface_up;
- counter_u64_t interface_down;
- counter_u64_t admin_q_pause;
+ struct evcnt wd_expired;
+ struct evcnt interface_up;
+ struct evcnt interface_down;
+ struct evcnt admin_q_pause;
};
struct ena_hw_stats {
- counter_u64_t rx_packets;
- counter_u64_t tx_packets;
+ struct evcnt rx_packets;
+ struct evcnt tx_packets;
- counter_u64_t rx_bytes;
- counter_u64_t tx_bytes;
+ struct evcnt rx_bytes;
+ struct evcnt tx_bytes;
- counter_u64_t rx_drops;
+ struct evcnt rx_drops;
};
/* Board specific private data structure */
@@ -308,25 +312,25 @@ struct ena_adapter {
struct ena_com_dev *ena_dev;
/* OS defined structs */
- if_t ifp;
device_t pdev;
+ struct ethercom sc_ec;
+ struct ifnet *ifp; /* set to point to sc_ec */
struct ifmedia media;
/* OS resources */
struct resource *memory;
struct resource *registers;
- struct mtx global_mtx;
- struct sx ioctl_sx;
+ kmutex_t global_mtx;
+ krwlock_t ioctl_sx;
/* MSI-X */
uint32_t msix_enabled;
struct msix_entry *msix_entries;
int msix_vecs;
- /* DMA tags used throughout the driver adapter for Tx and Rx */
- bus_dma_tag_t tx_buf_tag;
- bus_dma_tag_t rx_buf_tag;
+ /* DMA tag used throughout the driver adapter for Tx and Rx */
+ bus_dma_tag_t sc_dmat;
int dma_width;
uint32_t max_mtu;
@@ -370,13 +374,13 @@ struct ena_adapter {
/* Timer service */
struct callout timer_service;
- sbintime_t keep_alive_timestamp;
+ struct bintime keep_alive_timestamp;
uint32_t next_monitored_tx_qid;
- struct task reset_task;
- struct taskqueue *reset_tq;
+ struct work reset_task;
+ struct workqueue *reset_tq;
int wd_active;
- sbintime_t keep_alive_timeout;
- sbintime_t missing_tx_timeout;
+ struct bintime keep_alive_timeout;
+ struct bintime missing_tx_timeout;
uint32_t missing_tx_max_queues;
uint32_t missing_tx_threshold;
@@ -387,9 +391,9 @@ struct ena_adapter {
enum ena_regs_reset_reason_types reset_reason;
};
-#define ENA_RING_MTX_LOCK(_ring) mtx_lock(&(_ring)->ring_mtx)
-#define ENA_RING_MTX_TRYLOCK(_ring) mtx_trylock(&(_ring)->ring_mtx)
-#define ENA_RING_MTX_UNLOCK(_ring) mtx_unlock(&(_ring)->ring_mtx)
+#define ENA_RING_MTX_LOCK(_ring) mutex_enter(&(_ring)->ring_mtx)
+#define ENA_RING_MTX_TRYLOCK(_ring) mutex_tryenter(&(_ring)->ring_mtx)
+#define ENA_RING_MTX_UNLOCK(_ring) mutex_exit(&(_ring)->ring_mtx)
static inline int ena_mbuf_count(struct mbuf *mbuf)
{