ena.c (4f8f476e73e55a95b15caad7187bd3863abfa520) ena.c (9eb1615f33e9174fa5f1ca46954c35b3f026a98a)
1/*-
2 * BSD LICENSE
3 *
4 * Copyright (c) 2015-2020 Amazon.com, Inc. or its affiliates.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 212 unchanged lines hidden (view full) ---

221 maxsize, /* maxsize */
222 1, /* nsegments */
223 maxsize, /* maxsegsize */
224 BUS_DMA_ALLOCNOW, /* flags */
225 NULL, /* lockfunc */
226 NULL, /* lockarg */
227 &dma->tag);
228 if (unlikely(error != 0)) {
1/*-
2 * BSD LICENSE
3 *
4 * Copyright (c) 2015-2020 Amazon.com, Inc. or its affiliates.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 212 unchanged lines hidden (view full) ---

221 maxsize, /* maxsize */
222 1, /* nsegments */
223 maxsize, /* maxsegsize */
224 BUS_DMA_ALLOCNOW, /* flags */
225 NULL, /* lockfunc */
226 NULL, /* lockarg */
227 &dma->tag);
228 if (unlikely(error != 0)) {
229 ena_trace(ENA_ALERT, "bus_dma_tag_create failed: %d\n", error);
229 ena_trace(NULL, ENA_ALERT, "bus_dma_tag_create failed: %d\n", error);
230 goto fail_tag;
231 }
232
233 error = bus_dmamem_alloc(dma->tag, (void**) &dma->vaddr,
234 BUS_DMA_COHERENT | BUS_DMA_ZERO, &dma->map);
235 if (unlikely(error != 0)) {
230 goto fail_tag;
231 }
232
233 error = bus_dmamem_alloc(dma->tag, (void**) &dma->vaddr,
234 BUS_DMA_COHERENT | BUS_DMA_ZERO, &dma->map);
235 if (unlikely(error != 0)) {
236 ena_trace(ENA_ALERT, "bus_dmamem_alloc(%ju) failed: %d\n",
236 ena_trace(NULL, ENA_ALERT, "bus_dmamem_alloc(%ju) failed: %d\n",
237 (uintmax_t)size, error);
238 goto fail_map_create;
239 }
240
241 dma->paddr = 0;
242 error = bus_dmamap_load(dma->tag, dma->map, dma->vaddr,
243 size, ena_dmamap_callback, &dma->paddr, mapflags);
244 if (unlikely((error != 0) || (dma->paddr == 0))) {
237 (uintmax_t)size, error);
238 goto fail_map_create;
239 }
240
241 dma->paddr = 0;
242 error = bus_dmamap_load(dma->tag, dma->map, dma->vaddr,
243 size, ena_dmamap_callback, &dma->paddr, mapflags);
244 if (unlikely((error != 0) || (dma->paddr == 0))) {
245 ena_trace(ENA_ALERT, ": bus_dmamap_load failed: %d\n", error);
245 ena_trace(NULL, ENA_ALERT, ": bus_dmamap_load failed: %d\n", error);
246 goto fail_map_load;
247 }
248
249 bus_dmamap_sync(dma->tag, dma->map,
250 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
251
252 return (0);
253

--- 56 unchanged lines hidden (view full) ---

310
311 pci_vendor_id = pci_get_vendor(dev);
312 pci_device_id = pci_get_device(dev);
313
314 ent = ena_vendor_info_array;
315 while (ent->vendor_id != 0) {
316 if ((pci_vendor_id == ent->vendor_id) &&
317 (pci_device_id == ent->device_id)) {
246 goto fail_map_load;
247 }
248
249 bus_dmamap_sync(dma->tag, dma->map,
250 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
251
252 return (0);
253

--- 56 unchanged lines hidden (view full) ---

310
311 pci_vendor_id = pci_get_vendor(dev);
312 pci_device_id = pci_get_device(dev);
313
314 ent = ena_vendor_info_array;
315 while (ent->vendor_id != 0) {
316 if ((pci_vendor_id == ent->vendor_id) &&
317 (pci_device_id == ent->device_id)) {
318 ena_trace(ENA_DBG, "vendor=%x device=%x\n",
318 ena_trace(NULL, ENA_DBG, "vendor=%x device=%x\n",
319 pci_vendor_id, pci_device_id);
320
321 sprintf(adapter_name, DEVICE_DESC);
322 device_set_desc_copy(dev, adapter_name);
323 return (BUS_PROBE_DEFAULT);
324 }
325
326 ent++;

--- 13 unchanged lines hidden (view full) ---

340 device_printf(adapter->pdev, "Invalid MTU setting. "
341 "new_mtu: %d max mtu: %d min mtu: %d\n",
342 new_mtu, adapter->max_mtu, ENA_MIN_MTU);
343 return (EINVAL);
344 }
345
346 rc = ena_com_set_dev_mtu(adapter->ena_dev, new_mtu);
347 if (likely(rc == 0)) {
319 pci_vendor_id, pci_device_id);
320
321 sprintf(adapter_name, DEVICE_DESC);
322 device_set_desc_copy(dev, adapter_name);
323 return (BUS_PROBE_DEFAULT);
324 }
325
326 ent++;

--- 13 unchanged lines hidden (view full) ---

340 device_printf(adapter->pdev, "Invalid MTU setting. "
341 "new_mtu: %d max mtu: %d min mtu: %d\n",
342 new_mtu, adapter->max_mtu, ENA_MIN_MTU);
343 return (EINVAL);
344 }
345
346 rc = ena_com_set_dev_mtu(adapter->ena_dev, new_mtu);
347 if (likely(rc == 0)) {
348 ena_trace(ENA_DBG, "set MTU to %d\n", new_mtu);
348 ena_trace(NULL, ENA_DBG, "set MTU to %d\n", new_mtu);
349 if_setmtu(ifp, new_mtu);
350 } else {
351 device_printf(adapter->pdev, "Failed to set MTU to %d\n",
352 new_mtu);
353 }
354
355 return (rc);
356}

--- 304 unchanged lines hidden (view full) ---

661 drbr_flush(adapter->ifp, tx_ring->br);
662 ENA_RING_MTX_UNLOCK(tx_ring);
663
664 /* ... and create the buffer DMA maps */
665 for (i = 0; i < tx_ring->ring_size; i++) {
666 err = bus_dmamap_create(adapter->tx_buf_tag, 0,
667 &tx_ring->tx_buffer_info[i].dmamap);
668 if (unlikely(err != 0)) {
349 if_setmtu(ifp, new_mtu);
350 } else {
351 device_printf(adapter->pdev, "Failed to set MTU to %d\n",
352 new_mtu);
353 }
354
355 return (rc);
356}

--- 304 unchanged lines hidden (view full) ---

661 drbr_flush(adapter->ifp, tx_ring->br);
662 ENA_RING_MTX_UNLOCK(tx_ring);
663
664 /* ... and create the buffer DMA maps */
665 for (i = 0; i < tx_ring->ring_size; i++) {
666 err = bus_dmamap_create(adapter->tx_buf_tag, 0,
667 &tx_ring->tx_buffer_info[i].dmamap);
668 if (unlikely(err != 0)) {
669 ena_trace(ENA_ALERT,
669 ena_trace(NULL, ENA_ALERT,
670 "Unable to create Tx DMA map for buffer %d\n",
671 i);
672 goto err_map_release;
673 }
674
675#ifdef DEV_NETMAP
676 if (adapter->ifp->if_capenable & IFCAP_NETMAP) {
677 map = tx_ring->tx_buffer_info[i].nm_info.map_seg;
678 for (j = 0; j < ENA_PKT_MAX_BUFS; j++) {
679 err = bus_dmamap_create(adapter->tx_buf_tag, 0,
680 &map[j]);
681 if (unlikely(err != 0)) {
670 "Unable to create Tx DMA map for buffer %d\n",
671 i);
672 goto err_map_release;
673 }
674
675#ifdef DEV_NETMAP
676 if (adapter->ifp->if_capenable & IFCAP_NETMAP) {
677 map = tx_ring->tx_buffer_info[i].nm_info.map_seg;
678 for (j = 0; j < ENA_PKT_MAX_BUFS; j++) {
679 err = bus_dmamap_create(adapter->tx_buf_tag, 0,
680 &map[j]);
681 if (unlikely(err != 0)) {
682 ena_trace(ENA_ALERT, "Unable to create "
682 ena_trace(NULL, ENA_ALERT, "Unable to create "
683 "Tx DMA for buffer %d %d\n", i, j);
684 goto err_map_release;
685 }
686 }
687 }
688#endif /* DEV_NETMAP */
689 }
690
691 /* Allocate taskqueues */
692 TASK_INIT(&tx_ring->enqueue_task, 0, ena_deferred_mq_start, tx_ring);
693 tx_ring->enqueue_tq = taskqueue_create_fast("ena_tx_enque", M_NOWAIT,
694 taskqueue_thread_enqueue, &tx_ring->enqueue_tq);
695 if (unlikely(tx_ring->enqueue_tq == NULL)) {
683 "Tx DMA for buffer %d %d\n", i, j);
684 goto err_map_release;
685 }
686 }
687 }
688#endif /* DEV_NETMAP */
689 }
690
691 /* Allocate taskqueues */
692 TASK_INIT(&tx_ring->enqueue_task, 0, ena_deferred_mq_start, tx_ring);
693 tx_ring->enqueue_tq = taskqueue_create_fast("ena_tx_enque", M_NOWAIT,
694 taskqueue_thread_enqueue, &tx_ring->enqueue_tq);
695 if (unlikely(tx_ring->enqueue_tq == NULL)) {
696 ena_trace(ENA_ALERT,
696 ena_trace(NULL, ENA_ALERT,
697 "Unable to create taskqueue for enqueue task\n");
698 i = tx_ring->ring_size;
699 goto err_map_release;
700 }
701
702 tx_ring->running = true;
703
704 taskqueue_start_threads(&tx_ring->enqueue_tq, 1, PI_NET,

--- 168 unchanged lines hidden (view full) ---

873 rx_ring->next_to_clean = 0;
874 rx_ring->next_to_use = 0;
875
876 /* ... and create the buffer DMA maps */
877 for (i = 0; i < rx_ring->ring_size; i++) {
878 err = bus_dmamap_create(adapter->rx_buf_tag, 0,
879 &(rx_ring->rx_buffer_info[i].map));
880 if (err != 0) {
697 "Unable to create taskqueue for enqueue task\n");
698 i = tx_ring->ring_size;
699 goto err_map_release;
700 }
701
702 tx_ring->running = true;
703
704 taskqueue_start_threads(&tx_ring->enqueue_tq, 1, PI_NET,

--- 168 unchanged lines hidden (view full) ---

873 rx_ring->next_to_clean = 0;
874 rx_ring->next_to_use = 0;
875
876 /* ... and create the buffer DMA maps */
877 for (i = 0; i < rx_ring->ring_size; i++) {
878 err = bus_dmamap_create(adapter->rx_buf_tag, 0,
879 &(rx_ring->rx_buffer_info[i].map));
880 if (err != 0) {
881 ena_trace(ENA_ALERT,
881 ena_trace(NULL, ENA_ALERT,
882 "Unable to create Rx DMA map for buffer %d\n", i);
883 goto err_buf_info_unmap;
884 }
885 }
886
887 /* Create LRO for the ring */
888 if ((adapter->ifp->if_capenable & IFCAP_LRO) != 0) {
889 int err = tcp_lro_init(&rx_ring->lro);
890 if (err != 0) {
891 device_printf(adapter->pdev,
892 "LRO[%d] Initialization failed!\n", qid);
893 } else {
882 "Unable to create Rx DMA map for buffer %d\n", i);
883 goto err_buf_info_unmap;
884 }
885 }
886
887 /* Create LRO for the ring */
888 if ((adapter->ifp->if_capenable & IFCAP_LRO) != 0) {
889 int err = tcp_lro_init(&rx_ring->lro);
890 if (err != 0) {
891 device_printf(adapter->pdev,
892 "LRO[%d] Initialization failed!\n", qid);
893 } else {
894 ena_trace(ENA_INFO,
894 ena_trace(NULL, ENA_INFO,
895 "RX Soft LRO[%d] Initialized\n", qid);
896 rx_ring->lro.ifp = adapter->ifp;
897 }
898 }
899
900 return (0);
901
902err_buf_info_unmap:

--- 114 unchanged lines hidden (view full) ---

1017 mlen = MCLBYTES;
1018 } else {
1019 mlen = rx_ring->rx_mbuf_sz;
1020 }
1021 /* Set mbuf length*/
1022 rx_info->mbuf->m_pkthdr.len = rx_info->mbuf->m_len = mlen;
1023
1024 /* Map packets for DMA */
895 "RX Soft LRO[%d] Initialized\n", qid);
896 rx_ring->lro.ifp = adapter->ifp;
897 }
898 }
899
900 return (0);
901
902err_buf_info_unmap:

--- 114 unchanged lines hidden (view full) ---

1017 mlen = MCLBYTES;
1018 } else {
1019 mlen = rx_ring->rx_mbuf_sz;
1020 }
1021 /* Set mbuf length*/
1022 rx_info->mbuf->m_pkthdr.len = rx_info->mbuf->m_len = mlen;
1023
1024 /* Map packets for DMA */
1025 ena_trace(ENA_DBG | ENA_RSC | ENA_RXPTH,
1025 ena_trace(NULL, ENA_DBG | ENA_RSC | ENA_RXPTH,
1026 "Using tag %p for buffers' DMA mapping, mbuf %p len: %d\n",
1027 adapter->rx_buf_tag,rx_info->mbuf, rx_info->mbuf->m_len);
1028 error = bus_dmamap_load_mbuf_sg(adapter->rx_buf_tag, rx_info->map,
1029 rx_info->mbuf, segs, &nsegs, BUS_DMA_NOWAIT);
1030 if (unlikely((error != 0) || (nsegs != 1))) {
1026 "Using tag %p for buffers' DMA mapping, mbuf %p len: %d\n",
1027 adapter->rx_buf_tag,rx_info->mbuf, rx_info->mbuf->m_len);
1028 error = bus_dmamap_load_mbuf_sg(adapter->rx_buf_tag, rx_info->map,
1029 rx_info->mbuf, segs, &nsegs, BUS_DMA_NOWAIT);
1030 if (unlikely((error != 0) || (nsegs != 1))) {
1031 ena_trace(ENA_WARNING, "failed to map mbuf, error: %d, "
1031 ena_trace(NULL, ENA_WARNING, "failed to map mbuf, error: %d, "
1032 "nsegs: %d\n", error, nsegs);
1033 counter_u64_add(rx_ring->rx_stats.dma_mapping_err, 1);
1034 goto exit;
1035
1036 }
1037
1038 bus_dmamap_sync(adapter->rx_buf_tag, rx_info->map, BUS_DMASYNC_PREREAD);
1039
1040 ena_buf = &rx_info->ena_buf;
1041 ena_buf->paddr = segs[0].ds_addr;
1042 ena_buf->len = mlen;
1043
1032 "nsegs: %d\n", error, nsegs);
1033 counter_u64_add(rx_ring->rx_stats.dma_mapping_err, 1);
1034 goto exit;
1035
1036 }
1037
1038 bus_dmamap_sync(adapter->rx_buf_tag, rx_info->map, BUS_DMASYNC_PREREAD);
1039
1040 ena_buf = &rx_info->ena_buf;
1041 ena_buf->paddr = segs[0].ds_addr;
1042 ena_buf->len = mlen;
1043
1044 ena_trace(ENA_DBG | ENA_RSC | ENA_RXPTH,
1044 ena_trace(NULL, ENA_DBG | ENA_RSC | ENA_RXPTH,
1045 "ALLOC RX BUF: mbuf %p, rx_info %p, len %d, paddr %#jx\n",
1046 rx_info->mbuf, rx_info,ena_buf->len, (uintmax_t)ena_buf->paddr);
1047
1048 return (0);
1049
1050exit:
1051 m_freem(rx_info->mbuf);
1052 rx_info->mbuf = NULL;
1053 return (EFAULT);
1054}
1055
1056static void
1057ena_free_rx_mbuf(struct ena_adapter *adapter, struct ena_ring *rx_ring,
1058 struct ena_rx_buffer *rx_info)
1059{
1060
1061 if (rx_info->mbuf == NULL) {
1045 "ALLOC RX BUF: mbuf %p, rx_info %p, len %d, paddr %#jx\n",
1046 rx_info->mbuf, rx_info,ena_buf->len, (uintmax_t)ena_buf->paddr);
1047
1048 return (0);
1049
1050exit:
1051 m_freem(rx_info->mbuf);
1052 rx_info->mbuf = NULL;
1053 return (EFAULT);
1054}
1055
1056static void
1057ena_free_rx_mbuf(struct ena_adapter *adapter, struct ena_ring *rx_ring,
1058 struct ena_rx_buffer *rx_info)
1059{
1060
1061 if (rx_info->mbuf == NULL) {
1062 ena_trace(ENA_WARNING, "Trying to free unallocated buffer\n");
1062 ena_trace(NULL, ENA_WARNING, "Trying to free unallocated buffer\n");
1063 return;
1064 }
1065
1066 bus_dmamap_sync(adapter->rx_buf_tag, rx_info->map,
1067 BUS_DMASYNC_POSTREAD);
1068 bus_dmamap_unload(adapter->rx_buf_tag, rx_info->map);
1069 m_freem(rx_info->mbuf);
1070 rx_info->mbuf = NULL;

--- 8 unchanged lines hidden (view full) ---

1079int
1080ena_refill_rx_bufs(struct ena_ring *rx_ring, uint32_t num)
1081{
1082 struct ena_adapter *adapter = rx_ring->adapter;
1083 uint16_t next_to_use, req_id;
1084 uint32_t i;
1085 int rc;
1086
1063 return;
1064 }
1065
1066 bus_dmamap_sync(adapter->rx_buf_tag, rx_info->map,
1067 BUS_DMASYNC_POSTREAD);
1068 bus_dmamap_unload(adapter->rx_buf_tag, rx_info->map);
1069 m_freem(rx_info->mbuf);
1070 rx_info->mbuf = NULL;

--- 8 unchanged lines hidden (view full) ---

1079int
1080ena_refill_rx_bufs(struct ena_ring *rx_ring, uint32_t num)
1081{
1082 struct ena_adapter *adapter = rx_ring->adapter;
1083 uint16_t next_to_use, req_id;
1084 uint32_t i;
1085 int rc;
1086
1087 ena_trace(ENA_DBG | ENA_RXPTH | ENA_RSC, "refill qid: %d\n",
1087 ena_trace(NULL, ENA_DBG | ENA_RXPTH | ENA_RSC, "refill qid: %d\n",
1088 rx_ring->qid);
1089
1090 next_to_use = rx_ring->next_to_use;
1091
1092 for (i = 0; i < num; i++) {
1093 struct ena_rx_buffer *rx_info;
1094
1088 rx_ring->qid);
1089
1090 next_to_use = rx_ring->next_to_use;
1091
1092 for (i = 0; i < num; i++) {
1093 struct ena_rx_buffer *rx_info;
1094
1095 ena_trace(ENA_DBG | ENA_RXPTH | ENA_RSC,
1095 ena_trace(NULL, ENA_DBG | ENA_RXPTH | ENA_RSC,
1096 "RX buffer - next to use: %d\n", next_to_use);
1097
1098 req_id = rx_ring->free_rx_ids[next_to_use];
1099 rx_info = &rx_ring->rx_buffer_info[req_id];
1100#ifdef DEV_NETMAP
1101 if (ena_rx_ring_in_netmap(adapter, rx_ring->qid))
1102 rc = ena_netmap_alloc_rx_slot(adapter, rx_ring, rx_info);
1103 else
1104#endif /* DEV_NETMAP */
1105 rc = ena_alloc_rx_mbuf(adapter, rx_ring, rx_info);
1106 if (unlikely(rc != 0)) {
1096 "RX buffer - next to use: %d\n", next_to_use);
1097
1098 req_id = rx_ring->free_rx_ids[next_to_use];
1099 rx_info = &rx_ring->rx_buffer_info[req_id];
1100#ifdef DEV_NETMAP
1101 if (ena_rx_ring_in_netmap(adapter, rx_ring->qid))
1102 rc = ena_netmap_alloc_rx_slot(adapter, rx_ring, rx_info);
1103 else
1104#endif /* DEV_NETMAP */
1105 rc = ena_alloc_rx_mbuf(adapter, rx_ring, rx_info);
1106 if (unlikely(rc != 0)) {
1107 ena_trace(ENA_WARNING,
1107 ena_trace(NULL, ENA_WARNING,
1108 "failed to alloc buffer for rx queue %d\n",
1109 rx_ring->qid);
1110 break;
1111 }
1112 rc = ena_com_add_single_rx_desc(rx_ring->ena_com_io_sq,
1113 &rx_info->ena_buf, req_id);
1114 if (unlikely(rc != 0)) {
1108 "failed to alloc buffer for rx queue %d\n",
1109 rx_ring->qid);
1110 break;
1111 }
1112 rc = ena_com_add_single_rx_desc(rx_ring->ena_com_io_sq,
1113 &rx_info->ena_buf, req_id);
1114 if (unlikely(rc != 0)) {
1115 ena_trace(ENA_WARNING,
1115 ena_trace(NULL, ENA_WARNING,
1116 "failed to add buffer for rx queue %d\n",
1117 rx_ring->qid);
1118 break;
1119 }
1120 next_to_use = ENA_RX_RING_IDX_NEXT(next_to_use,
1121 rx_ring->ring_size);
1122 }
1123
1124 if (unlikely(i < num)) {
1125 counter_u64_add(rx_ring->rx_stats.refil_partial, 1);
1116 "failed to add buffer for rx queue %d\n",
1117 rx_ring->qid);
1118 break;
1119 }
1120 next_to_use = ENA_RX_RING_IDX_NEXT(next_to_use,
1121 rx_ring->ring_size);
1122 }
1123
1124 if (unlikely(i < num)) {
1125 counter_u64_add(rx_ring->rx_stats.refil_partial, 1);
1126 ena_trace(ENA_WARNING,
1126 ena_trace(NULL, ENA_WARNING,
1127 "refilled rx qid %d with only %d mbufs (from %d)\n",
1128 rx_ring->qid, i, num);
1129 }
1130
1131 if (likely(i != 0))
1132 ena_com_write_sq_doorbell(rx_ring->ena_com_io_sq);
1133
1134 rx_ring->next_to_use = next_to_use;

--- 192 unchanged lines hidden (view full) ---

1327 struct ena_ring *rx_ring;
1328 int i, rc, bufs_num;
1329
1330 for (i = 0; i < adapter->num_io_queues; i++) {
1331 rx_ring = &adapter->rx_ring[i];
1332 bufs_num = rx_ring->ring_size - 1;
1333 rc = ena_refill_rx_bufs(rx_ring, bufs_num);
1334 if (unlikely(rc != bufs_num))
1127 "refilled rx qid %d with only %d mbufs (from %d)\n",
1128 rx_ring->qid, i, num);
1129 }
1130
1131 if (likely(i != 0))
1132 ena_com_write_sq_doorbell(rx_ring->ena_com_io_sq);
1133
1134 rx_ring->next_to_use = next_to_use;

--- 192 unchanged lines hidden (view full) ---

1327 struct ena_ring *rx_ring;
1328 int i, rc, bufs_num;
1329
1330 for (i = 0; i < adapter->num_io_queues; i++) {
1331 rx_ring = &adapter->rx_ring[i];
1332 bufs_num = rx_ring->ring_size - 1;
1333 rc = ena_refill_rx_bufs(rx_ring, bufs_num);
1334 if (unlikely(rc != bufs_num))
1335 ena_trace(ENA_WARNING, "refilling Queue %d failed. "
1335 ena_trace(NULL, ENA_WARNING, "refilling Queue %d failed. "
1336 "Allocated %d buffers from: %d\n", i, rc, bufs_num);
1337#ifdef DEV_NETMAP
1338 rx_ring->initialized = true;
1339#endif /* DEV_NETMAP */
1340 }
1341}
1342
1343static void

--- 24 unchanged lines hidden (view full) ---

1368 continue;
1369
1370 if (print_once) {
1371 device_printf(adapter->pdev,
1372 "free uncompleted tx mbuf qid %d idx 0x%x\n",
1373 qid, i);
1374 print_once = false;
1375 } else {
1336 "Allocated %d buffers from: %d\n", i, rc, bufs_num);
1337#ifdef DEV_NETMAP
1338 rx_ring->initialized = true;
1339#endif /* DEV_NETMAP */
1340 }
1341}
1342
1343static void

--- 24 unchanged lines hidden (view full) ---

1368 continue;
1369
1370 if (print_once) {
1371 device_printf(adapter->pdev,
1372 "free uncompleted tx mbuf qid %d idx 0x%x\n",
1373 qid, i);
1374 print_once = false;
1375 } else {
1376 ena_trace(ENA_DBG,
1376 ena_trace(NULL, ENA_DBG,
1377 "free uncompleted tx mbuf qid %d idx 0x%x\n",
1378 qid, i);
1379 }
1380
1381 bus_dmamap_sync(adapter->tx_buf_tag, tx_info->dmamap,
1382 BUS_DMASYNC_POSTWRITE);
1383 bus_dmamap_unload(adapter->tx_buf_tag, tx_info->dmamap);
1384

--- 199 unchanged lines hidden (view full) ---

1584 }
1585
1586 /* Reserved the max msix vectors we might need */
1587 msix_vecs = ENA_MAX_MSIX_VEC(adapter->max_num_io_queues);
1588
1589 adapter->msix_entries = malloc(msix_vecs * sizeof(struct msix_entry),
1590 M_DEVBUF, M_WAITOK | M_ZERO);
1591
1377 "free uncompleted tx mbuf qid %d idx 0x%x\n",
1378 qid, i);
1379 }
1380
1381 bus_dmamap_sync(adapter->tx_buf_tag, tx_info->dmamap,
1382 BUS_DMASYNC_POSTWRITE);
1383 bus_dmamap_unload(adapter->tx_buf_tag, tx_info->dmamap);
1384

--- 199 unchanged lines hidden (view full) ---

1584 }
1585
1586 /* Reserved the max msix vectors we might need */
1587 msix_vecs = ENA_MAX_MSIX_VEC(adapter->max_num_io_queues);
1588
1589 adapter->msix_entries = malloc(msix_vecs * sizeof(struct msix_entry),
1590 M_DEVBUF, M_WAITOK | M_ZERO);
1591
1592 ena_trace(ENA_DBG, "trying to enable MSI-X, vectors: %d\n", msix_vecs);
1592 ena_trace(NULL, ENA_DBG, "trying to enable MSI-X, vectors: %d\n", msix_vecs);
1593
1594 for (i = 0; i < msix_vecs; i++) {
1595 adapter->msix_entries[i].entry = i;
1596 /* Vectors must start from 1 */
1597 adapter->msix_entries[i].vector = i + 1;
1598 }
1599
1600 msix_req = msix_vecs;

--- 61 unchanged lines hidden (view full) ---

1662 irq_idx = ENA_IO_IRQ_IDX(i);
1663
1664 snprintf(adapter->irq_tbl[irq_idx].name, ENA_IRQNAME_SIZE,
1665 "%s-TxRx-%d", device_get_nameunit(adapter->pdev), i);
1666 adapter->irq_tbl[irq_idx].handler = ena_handle_msix;
1667 adapter->irq_tbl[irq_idx].data = &adapter->que[i];
1668 adapter->irq_tbl[irq_idx].vector =
1669 adapter->msix_entries[irq_idx].vector;
1593
1594 for (i = 0; i < msix_vecs; i++) {
1595 adapter->msix_entries[i].entry = i;
1596 /* Vectors must start from 1 */
1597 adapter->msix_entries[i].vector = i + 1;
1598 }
1599
1600 msix_req = msix_vecs;

--- 61 unchanged lines hidden (view full) ---

1662 irq_idx = ENA_IO_IRQ_IDX(i);
1663
1664 snprintf(adapter->irq_tbl[irq_idx].name, ENA_IRQNAME_SIZE,
1665 "%s-TxRx-%d", device_get_nameunit(adapter->pdev), i);
1666 adapter->irq_tbl[irq_idx].handler = ena_handle_msix;
1667 adapter->irq_tbl[irq_idx].data = &adapter->que[i];
1668 adapter->irq_tbl[irq_idx].vector =
1669 adapter->msix_entries[irq_idx].vector;
1670 ena_trace(ENA_INFO | ENA_IOQ, "ena_setup_io_intr vector: %d\n",
1670 ena_trace(NULL, ENA_INFO | ENA_IOQ, "ena_setup_io_intr vector: %d\n",
1671 adapter->msix_entries[irq_idx].vector);
1672
1673 /*
1674 * We want to bind rings to the corresponding cpu
1675 * using something similar to the RSS round-robin technique.
1676 */
1677 if (unlikely(last_bind_cpu < 0))
1678 last_bind_cpu = CPU_FIRST();

--- 33 unchanged lines hidden (view full) ---

1712 rman_get_start(irq->res), rc);
1713 goto err_res_free;
1714 }
1715 irq->requested = true;
1716
1717 return (rc);
1718
1719err_res_free:
1671 adapter->msix_entries[irq_idx].vector);
1672
1673 /*
1674 * We want to bind rings to the corresponding cpu
1675 * using something similar to the RSS round-robin technique.
1676 */
1677 if (unlikely(last_bind_cpu < 0))
1678 last_bind_cpu = CPU_FIRST();

--- 33 unchanged lines hidden (view full) ---

1712 rman_get_start(irq->res), rc);
1713 goto err_res_free;
1714 }
1715 irq->requested = true;
1716
1717 return (rc);
1718
1719err_res_free:
1720 ena_trace(ENA_INFO | ENA_ADMQ, "releasing resource for irq %d\n",
1720 ena_trace(NULL, ENA_INFO | ENA_ADMQ, "releasing resource for irq %d\n",
1721 irq->vector);
1722 rcc = bus_release_resource(adapter->pdev, SYS_RES_IRQ,
1723 irq->vector, irq->res);
1724 if (unlikely(rcc != 0))
1725 device_printf(adapter->pdev, "dev has no parent while "
1726 "releasing res for irq: %d\n", irq->vector);
1727 irq->res = NULL;
1728

--- 36 unchanged lines hidden (view full) ---

1765 if (unlikely(rc != 0)) {
1766 device_printf(adapter->pdev, "failed to register "
1767 "interrupt handler for irq %ju: %d\n",
1768 rman_get_start(irq->res), rc);
1769 goto err;
1770 }
1771 irq->requested = true;
1772
1721 irq->vector);
1722 rcc = bus_release_resource(adapter->pdev, SYS_RES_IRQ,
1723 irq->vector, irq->res);
1724 if (unlikely(rcc != 0))
1725 device_printf(adapter->pdev, "dev has no parent while "
1726 "releasing res for irq: %d\n", irq->vector);
1727 irq->res = NULL;
1728

--- 36 unchanged lines hidden (view full) ---

1765 if (unlikely(rc != 0)) {
1766 device_printf(adapter->pdev, "failed to register "
1767 "interrupt handler for irq %ju: %d\n",
1768 rman_get_start(irq->res), rc);
1769 goto err;
1770 }
1771 irq->requested = true;
1772
1773 ena_trace(ENA_INFO, "queue %d - cpu %d\n",
1773 ena_trace(NULL, ENA_INFO, "queue %d - cpu %d\n",
1774 i - ENA_IO_IRQ_FIRST_IDX, irq->cpu);
1775 }
1776
1777 return (rc);
1778
1779err:
1780
1781 for (; i >= ENA_IO_IRQ_FIRST_IDX; i--) {

--- 30 unchanged lines hidden (view full) ---

1812static void
1813ena_free_mgmnt_irq(struct ena_adapter *adapter)
1814{
1815 struct ena_irq *irq;
1816 int rc;
1817
1818 irq = &adapter->irq_tbl[ENA_MGMNT_IRQ_IDX];
1819 if (irq->requested) {
1774 i - ENA_IO_IRQ_FIRST_IDX, irq->cpu);
1775 }
1776
1777 return (rc);
1778
1779err:
1780
1781 for (; i >= ENA_IO_IRQ_FIRST_IDX; i--) {

--- 30 unchanged lines hidden (view full) ---

1812static void
1813ena_free_mgmnt_irq(struct ena_adapter *adapter)
1814{
1815 struct ena_irq *irq;
1816 int rc;
1817
1818 irq = &adapter->irq_tbl[ENA_MGMNT_IRQ_IDX];
1819 if (irq->requested) {
1820 ena_trace(ENA_INFO | ENA_ADMQ, "tear down irq: %d\n",
1820 ena_trace(NULL, ENA_INFO | ENA_ADMQ, "tear down irq: %d\n",
1821 irq->vector);
1822 rc = bus_teardown_intr(adapter->pdev, irq->res, irq->cookie);
1823 if (unlikely(rc != 0))
1824 device_printf(adapter->pdev, "failed to tear "
1825 "down irq: %d\n", irq->vector);
1826 irq->requested = 0;
1827 }
1828
1829 if (irq->res != NULL) {
1821 irq->vector);
1822 rc = bus_teardown_intr(adapter->pdev, irq->res, irq->cookie);
1823 if (unlikely(rc != 0))
1824 device_printf(adapter->pdev, "failed to tear "
1825 "down irq: %d\n", irq->vector);
1826 irq->requested = 0;
1827 }
1828
1829 if (irq->res != NULL) {
1830 ena_trace(ENA_INFO | ENA_ADMQ, "release resource irq: %d\n",
1830 ena_trace(NULL, ENA_INFO | ENA_ADMQ, "release resource irq: %d\n",
1831 irq->vector);
1832 rc = bus_release_resource(adapter->pdev, SYS_RES_IRQ,
1833 irq->vector, irq->res);
1834 irq->res = NULL;
1835 if (unlikely(rc != 0))
1836 device_printf(adapter->pdev, "dev has no parent while "
1837 "releasing res for irq: %d\n", irq->vector);
1838 }
1839}
1840
1841static void
1842ena_free_io_irq(struct ena_adapter *adapter)
1843{
1844 struct ena_irq *irq;
1845 int rc;
1846
1847 for (int i = ENA_IO_IRQ_FIRST_IDX; i < adapter->msix_vecs; i++) {
1848 irq = &adapter->irq_tbl[i];
1849 if (irq->requested) {
1831 irq->vector);
1832 rc = bus_release_resource(adapter->pdev, SYS_RES_IRQ,
1833 irq->vector, irq->res);
1834 irq->res = NULL;
1835 if (unlikely(rc != 0))
1836 device_printf(adapter->pdev, "dev has no parent while "
1837 "releasing res for irq: %d\n", irq->vector);
1838 }
1839}
1840
1841static void
1842ena_free_io_irq(struct ena_adapter *adapter)
1843{
1844 struct ena_irq *irq;
1845 int rc;
1846
1847 for (int i = ENA_IO_IRQ_FIRST_IDX; i < adapter->msix_vecs; i++) {
1848 irq = &adapter->irq_tbl[i];
1849 if (irq->requested) {
1850 ena_trace(ENA_INFO | ENA_IOQ, "tear down irq: %d\n",
1850 ena_trace(NULL, ENA_INFO | ENA_IOQ, "tear down irq: %d\n",
1851 irq->vector);
1852 rc = bus_teardown_intr(adapter->pdev, irq->res,
1853 irq->cookie);
1854 if (unlikely(rc != 0)) {
1855 device_printf(adapter->pdev, "failed to tear "
1856 "down irq: %d\n", irq->vector);
1857 }
1858 irq->requested = 0;
1859 }
1860
1861 if (irq->res != NULL) {
1851 irq->vector);
1852 rc = bus_teardown_intr(adapter->pdev, irq->res,
1853 irq->cookie);
1854 if (unlikely(rc != 0)) {
1855 device_printf(adapter->pdev, "failed to tear "
1856 "down irq: %d\n", irq->vector);
1857 }
1858 irq->requested = 0;
1859 }
1860
1861 if (irq->res != NULL) {
1862 ena_trace(ENA_INFO | ENA_IOQ, "release resource irq: %d\n",
1862 ena_trace(NULL, ENA_INFO | ENA_IOQ, "release resource irq: %d\n",
1863 irq->vector);
1864 rc = bus_release_resource(adapter->pdev, SYS_RES_IRQ,
1865 irq->vector, irq->res);
1866 irq->res = NULL;
1867 if (unlikely(rc != 0)) {
1868 device_printf(adapter->pdev, "dev has no parent"
1869 " while releasing res for irq: %d\n",
1870 irq->vector);

--- 130 unchanged lines hidden (view full) ---

2001 */
2002 set_io_rings_size(adapter, adapter->requested_tx_ring_size,
2003 adapter->requested_rx_ring_size);
2004
2005 while (1) {
2006 /* Allocate transmit descriptors */
2007 rc = ena_setup_all_tx_resources(adapter);
2008 if (unlikely(rc != 0)) {
1863 irq->vector);
1864 rc = bus_release_resource(adapter->pdev, SYS_RES_IRQ,
1865 irq->vector, irq->res);
1866 irq->res = NULL;
1867 if (unlikely(rc != 0)) {
1868 device_printf(adapter->pdev, "dev has no parent"
1869 " while releasing res for irq: %d\n",
1870 irq->vector);

--- 130 unchanged lines hidden (view full) ---

2001 */
2002 set_io_rings_size(adapter, adapter->requested_tx_ring_size,
2003 adapter->requested_rx_ring_size);
2004
2005 while (1) {
2006 /* Allocate transmit descriptors */
2007 rc = ena_setup_all_tx_resources(adapter);
2008 if (unlikely(rc != 0)) {
2009 ena_trace(ENA_ALERT, "err_setup_tx\n");
2009 ena_trace(NULL, ENA_ALERT, "err_setup_tx\n");
2010 goto err_setup_tx;
2011 }
2012
2013 /* Allocate receive descriptors */
2014 rc = ena_setup_all_rx_resources(adapter);
2015 if (unlikely(rc != 0)) {
2010 goto err_setup_tx;
2011 }
2012
2013 /* Allocate receive descriptors */
2014 rc = ena_setup_all_rx_resources(adapter);
2015 if (unlikely(rc != 0)) {
2016 ena_trace(ENA_ALERT, "err_setup_rx\n");
2016 ena_trace(NULL, ENA_ALERT, "err_setup_rx\n");
2017 goto err_setup_rx;
2018 }
2019
2020 /* Create IO queues for Rx & Tx */
2021 rc = ena_create_io_queues(adapter);
2022 if (unlikely(rc != 0)) {
2017 goto err_setup_rx;
2018 }
2019
2020 /* Create IO queues for Rx & Tx */
2021 rc = ena_create_io_queues(adapter);
2022 if (unlikely(rc != 0)) {
2023 ena_trace(ENA_ALERT,
2023 ena_trace(NULL, ENA_ALERT,
2024 "create IO queues failed\n");
2025 goto err_io_que;
2026 }
2027
2028 return (0);
2029
2030err_io_que:
2031 ena_free_all_rx_resources(adapter);
2032err_setup_rx:
2033 ena_free_all_tx_resources(adapter);
2034err_setup_tx:
2035 /*
2036 * Lower the ring size if ENOMEM. Otherwise, return the
2037 * error straightaway.
2038 */
2039 if (unlikely(rc != ENOMEM)) {
2024 "create IO queues failed\n");
2025 goto err_io_que;
2026 }
2027
2028 return (0);
2029
2030err_io_que:
2031 ena_free_all_rx_resources(adapter);
2032err_setup_rx:
2033 ena_free_all_tx_resources(adapter);
2034err_setup_tx:
2035 /*
2036 * Lower the ring size if ENOMEM. Otherwise, return the
2037 * error straightaway.
2038 */
2039 if (unlikely(rc != ENOMEM)) {
2040 ena_trace(ENA_ALERT,
2040 ena_trace(NULL, ENA_ALERT,
2041 "Queue creation failed with error code: %d\n", rc);
2042 return (rc);
2043 }
2044
2045 cur_tx_ring_size = adapter->tx_ring[0].ring_size;
2046 cur_rx_ring_size = adapter->rx_ring[0].ring_size;
2047
2048 device_printf(adapter->pdev,

--- 38 unchanged lines hidden (view full) ---

2087 if (ENA_FLAG_ISSET(ENA_FLAG_DEV_UP, adapter))
2088 return (0);
2089
2090 device_printf(adapter->pdev, "device is going UP\n");
2091
2092 /* setup interrupts for IO queues */
2093 rc = ena_setup_io_intr(adapter);
2094 if (unlikely(rc != 0)) {
2041 "Queue creation failed with error code: %d\n", rc);
2042 return (rc);
2043 }
2044
2045 cur_tx_ring_size = adapter->tx_ring[0].ring_size;
2046 cur_rx_ring_size = adapter->rx_ring[0].ring_size;
2047
2048 device_printf(adapter->pdev,

--- 38 unchanged lines hidden (view full) ---

2087 if (ENA_FLAG_ISSET(ENA_FLAG_DEV_UP, adapter))
2088 return (0);
2089
2090 device_printf(adapter->pdev, "device is going UP\n");
2091
2092 /* setup interrupts for IO queues */
2093 rc = ena_setup_io_intr(adapter);
2094 if (unlikely(rc != 0)) {
2095 ena_trace(ENA_ALERT, "error setting up IO interrupt\n");
2095 ena_trace(NULL, ENA_ALERT, "error setting up IO interrupt\n");
2096 goto error;
2097 }
2098 rc = ena_request_io_irq(adapter);
2099 if (unlikely(rc != 0)) {
2096 goto error;
2097 }
2098 rc = ena_request_io_irq(adapter);
2099 if (unlikely(rc != 0)) {
2100 ena_trace(ENA_ALERT, "err_req_irq\n");
2100 ena_trace(NULL, ENA_ALERT, "err_req_irq\n");
2101 goto error;
2102 }
2103
2104 device_printf(adapter->pdev,
2105 "Creating %u IO queues. Rx queue size: %d, Tx queue size: %d, "
2106 "LLQ is %s\n",
2107 adapter->num_io_queues,
2108 adapter->requested_rx_ring_size,
2109 adapter->requested_tx_ring_size,
2110 (adapter->ena_dev->tx_mem_queue_type ==
2111 ENA_ADMIN_PLACEMENT_POLICY_DEV) ? "ENABLED" : "DISABLED");
2112
2113 rc = create_queues_with_size_backoff(adapter);
2114 if (unlikely(rc != 0)) {
2101 goto error;
2102 }
2103
2104 device_printf(adapter->pdev,
2105 "Creating %u IO queues. Rx queue size: %d, Tx queue size: %d, "
2106 "LLQ is %s\n",
2107 adapter->num_io_queues,
2108 adapter->requested_rx_ring_size,
2109 adapter->requested_tx_ring_size,
2110 (adapter->ena_dev->tx_mem_queue_type ==
2111 ENA_ADMIN_PLACEMENT_POLICY_DEV) ? "ENABLED" : "DISABLED");
2112
2113 rc = create_queues_with_size_backoff(adapter);
2114 if (unlikely(rc != 0)) {
2115 ena_trace(ENA_ALERT,
2115 ena_trace(NULL, ENA_ALERT,
2116 "error creating queues with size backoff\n");
2117 goto err_create_queues_with_backoff;
2118 }
2119
2120 if (ENA_FLAG_ISSET(ENA_FLAG_LINK_UP, adapter))
2121 if_link_state_change(adapter->ifp, LINK_STATE_UP);
2122
2123 rc = ena_up_complete(adapter);

--- 65 unchanged lines hidden (view full) ---

2189 /* Media Change is not supported by firmware */
2190 return (0);
2191}
2192
2193static void
2194ena_media_status(if_t ifp, struct ifmediareq *ifmr)
2195{
2196 struct ena_adapter *adapter = if_getsoftc(ifp);
2116 "error creating queues with size backoff\n");
2117 goto err_create_queues_with_backoff;
2118 }
2119
2120 if (ENA_FLAG_ISSET(ENA_FLAG_LINK_UP, adapter))
2121 if_link_state_change(adapter->ifp, LINK_STATE_UP);
2122
2123 rc = ena_up_complete(adapter);

--- 65 unchanged lines hidden (view full) ---

2189 /* Media Change is not supported by firmware */
2190 return (0);
2191}
2192
2193static void
2194ena_media_status(if_t ifp, struct ifmediareq *ifmr)
2195{
2196 struct ena_adapter *adapter = if_getsoftc(ifp);
2197 ena_trace(ENA_DBG, "enter\n");
2197 ena_trace(NULL, ENA_DBG, "enter\n");
2198
2199 ENA_LOCK_LOCK(adapter);
2200
2201 ifmr->ifm_status = IFM_AVALID;
2202 ifmr->ifm_active = IFM_ETHER;
2203
2204 if (!ENA_FLAG_ISSET(ENA_FLAG_LINK_UP, adapter)) {
2205 ENA_LOCK_UNLOCK(adapter);
2198
2199 ENA_LOCK_LOCK(adapter);
2200
2201 ifmr->ifm_status = IFM_AVALID;
2202 ifmr->ifm_active = IFM_ETHER;
2203
2204 if (!ENA_FLAG_ISSET(ENA_FLAG_LINK_UP, adapter)) {
2205 ENA_LOCK_UNLOCK(adapter);
2206 ena_trace(ENA_INFO, "Link is down\n");
2206 ena_trace(NULL, ENA_INFO, "Link is down\n");
2207 return;
2208 }
2209
2210 ifmr->ifm_status |= IFM_ACTIVE;
2211 ifmr->ifm_active |= IFM_UNKNOWN | IFM_FDX;
2212
2213 ENA_LOCK_UNLOCK(adapter);
2214}

--- 177 unchanged lines hidden (view full) ---

2392ena_setup_ifnet(device_t pdev, struct ena_adapter *adapter,
2393 struct ena_com_dev_get_features_ctx *feat)
2394{
2395 if_t ifp;
2396 int caps = 0;
2397
2398 ifp = adapter->ifp = if_gethandle(IFT_ETHER);
2399 if (unlikely(ifp == NULL)) {
2207 return;
2208 }
2209
2210 ifmr->ifm_status |= IFM_ACTIVE;
2211 ifmr->ifm_active |= IFM_UNKNOWN | IFM_FDX;
2212
2213 ENA_LOCK_UNLOCK(adapter);
2214}

--- 177 unchanged lines hidden (view full) ---

2392ena_setup_ifnet(device_t pdev, struct ena_adapter *adapter,
2393 struct ena_com_dev_get_features_ctx *feat)
2394{
2395 if_t ifp;
2396 int caps = 0;
2397
2398 ifp = adapter->ifp = if_gethandle(IFT_ETHER);
2399 if (unlikely(ifp == NULL)) {
2400 ena_trace(ENA_ALERT, "can not allocate ifnet structure\n");
2400 ena_trace(NULL, ENA_ALERT, "can not allocate ifnet structure\n");
2401 return (ENXIO);
2402 }
2403 if_initname(ifp, device_get_name(pdev), device_get_unit(pdev));
2404 if_setdev(ifp, pdev);
2405 if_setsoftc(ifp, adapter);
2406
2407 if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST |
2408 IFF_KNOWSEPOCH);

--- 120 unchanged lines hidden (view full) ---

2529 vm_size_t len;
2530 int rc;
2531
2532 va = (vm_offset_t)rman_get_virtual(res);
2533 len = rman_get_size(res);
2534 /* Enable write combining */
2535 rc = pmap_change_attr(va, len, VM_MEMATTR_WRITE_COMBINING);
2536 if (unlikely(rc != 0)) {
2401 return (ENXIO);
2402 }
2403 if_initname(ifp, device_get_name(pdev), device_get_unit(pdev));
2404 if_setdev(ifp, pdev);
2405 if_setsoftc(ifp, adapter);
2406
2407 if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST |
2408 IFF_KNOWSEPOCH);

--- 120 unchanged lines hidden (view full) ---

2529 vm_size_t len;
2530 int rc;
2531
2532 va = (vm_offset_t)rman_get_virtual(res);
2533 len = rman_get_size(res);
2534 /* Enable write combining */
2535 rc = pmap_change_attr(va, len, VM_MEMATTR_WRITE_COMBINING);
2536 if (unlikely(rc != 0)) {
2537 ena_trace(ENA_ALERT, "pmap_change_attr failed, %d\n", rc);
2537 ena_trace(NULL, ENA_ALERT, "pmap_change_attr failed, %d\n", rc);
2538 return (rc);
2539 }
2540
2541 return (0);
2542#endif
2543 return (EOPNOTSUPP);
2544}
2545

--- 194 unchanged lines hidden (view full) ---

2740{
2741 struct ena_adapter *adapter;
2742 devclass_t dc;
2743 int max;
2744 int rc;
2745
2746 dc = devclass_find("ena");
2747 if (unlikely(dc == NULL)) {
2538 return (rc);
2539 }
2540
2541 return (0);
2542#endif
2543 return (EOPNOTSUPP);
2544}
2545

--- 194 unchanged lines hidden (view full) ---

2740{
2741 struct ena_adapter *adapter;
2742 devclass_t dc;
2743 int max;
2744 int rc;
2745
2746 dc = devclass_find("ena");
2747 if (unlikely(dc == NULL)) {
2748 ena_trace(ENA_ALERT, "No devclass ena\n");
2748 ena_trace(NULL, ENA_ALERT, "No devclass ena\n");
2749 return;
2750 }
2751
2752 max = devclass_get_maxunit(dc);
2753 while (max-- >= 0) {
2754 adapter = devclass_get_softc(dc, max);
2755 if (adapter != NULL) {
2756 rc = ena_rss_init_default(adapter);

--- 14 unchanged lines hidden (view full) ---

2771{
2772 struct ena_admin_host_info *host_info;
2773 uintptr_t rid;
2774 int rc;
2775
2776 /* Allocate only the host info */
2777 rc = ena_com_allocate_host_info(ena_dev);
2778 if (unlikely(rc != 0)) {
2749 return;
2750 }
2751
2752 max = devclass_get_maxunit(dc);
2753 while (max-- >= 0) {
2754 adapter = devclass_get_softc(dc, max);
2755 if (adapter != NULL) {
2756 rc = ena_rss_init_default(adapter);

--- 14 unchanged lines hidden (view full) ---

2771{
2772 struct ena_admin_host_info *host_info;
2773 uintptr_t rid;
2774 int rc;
2775
2776 /* Allocate only the host info */
2777 rc = ena_com_allocate_host_info(ena_dev);
2778 if (unlikely(rc != 0)) {
2779 ena_trace(ENA_ALERT, "Cannot allocate host info\n");
2779 ena_trace(NULL, ENA_ALERT, "Cannot allocate host info\n");
2780 return;
2781 }
2782
2783 host_info = ena_dev->host_attr.host_info;
2784
2785 if (pci_get_id(dev, PCI_ID_RID, &rid) == 0)
2786 host_info->bdf = rid;
2787 host_info->os_type = ENA_ADMIN_OS_FREEBSD;

--- 8 unchanged lines hidden (view full) ---

2796 (DRV_MODULE_VER_MAJOR) |
2797 (DRV_MODULE_VER_MINOR << ENA_ADMIN_HOST_INFO_MINOR_SHIFT) |
2798 (DRV_MODULE_VER_SUBMINOR << ENA_ADMIN_HOST_INFO_SUB_MINOR_SHIFT);
2799 host_info->num_cpus = mp_ncpus;
2800
2801 rc = ena_com_set_host_attributes(ena_dev);
2802 if (unlikely(rc != 0)) {
2803 if (rc == EOPNOTSUPP)
2780 return;
2781 }
2782
2783 host_info = ena_dev->host_attr.host_info;
2784
2785 if (pci_get_id(dev, PCI_ID_RID, &rid) == 0)
2786 host_info->bdf = rid;
2787 host_info->os_type = ENA_ADMIN_OS_FREEBSD;

--- 8 unchanged lines hidden (view full) ---

2796 (DRV_MODULE_VER_MAJOR) |
2797 (DRV_MODULE_VER_MINOR << ENA_ADMIN_HOST_INFO_MINOR_SHIFT) |
2798 (DRV_MODULE_VER_SUBMINOR << ENA_ADMIN_HOST_INFO_SUB_MINOR_SHIFT);
2799 host_info->num_cpus = mp_ncpus;
2800
2801 rc = ena_com_set_host_attributes(ena_dev);
2802 if (unlikely(rc != 0)) {
2803 if (rc == EOPNOTSUPP)
2804 ena_trace(ENA_WARNING, "Cannot set host attributes\n");
2804 ena_trace(NULL, ENA_WARNING, "Cannot set host attributes\n");
2805 else
2805 else
2806 ena_trace(ENA_ALERT, "Cannot set host attributes\n");
2806 ena_trace(NULL, ENA_ALERT, "Cannot set host attributes\n");
2807
2808 goto err;
2809 }
2810
2811 return;
2812
2813err:
2814 ena_com_delete_host_info(ena_dev);

--- 237 unchanged lines hidden (view full) ---

3052 ENA_REGS_RESET_MISS_INTERRUPT);
3053 return (EIO);
3054 }
3055
3056 /* Check again if packet is still waiting */
3057 if (unlikely(time_offset > adapter->missing_tx_timeout)) {
3058
3059 if (!tx_buf->print_once)
2807
2808 goto err;
2809 }
2810
2811 return;
2812
2813err:
2814 ena_com_delete_host_info(ena_dev);

--- 237 unchanged lines hidden (view full) ---

3052 ENA_REGS_RESET_MISS_INTERRUPT);
3053 return (EIO);
3054 }
3055
3056 /* Check again if packet is still waiting */
3057 if (unlikely(time_offset > adapter->missing_tx_timeout)) {
3058
3059 if (!tx_buf->print_once)
3060 ena_trace(ENA_WARNING, "Found a Tx that wasn't "
3060 ena_trace(NULL, ENA_WARNING, "Found a Tx that wasn't "
3061 "completed on time, qid %d, index %d.\n",
3062 tx_ring->qid, i);
3063
3064 tx_buf->print_once = true;
3065 missed_tx++;
3066 }
3067 }
3068

--- 712 unchanged lines hidden (view full) ---

3781}
3782
3783static void ena_notification(void *adapter_data,
3784 struct ena_admin_aenq_entry *aenq_e)
3785{
3786 struct ena_adapter *adapter = (struct ena_adapter *)adapter_data;
3787 struct ena_admin_ena_hw_hints *hints;
3788
3061 "completed on time, qid %d, index %d.\n",
3062 tx_ring->qid, i);
3063
3064 tx_buf->print_once = true;
3065 missed_tx++;
3066 }
3067 }
3068

--- 712 unchanged lines hidden (view full) ---

3781}
3782
3783static void ena_notification(void *adapter_data,
3784 struct ena_admin_aenq_entry *aenq_e)
3785{
3786 struct ena_adapter *adapter = (struct ena_adapter *)adapter_data;
3787 struct ena_admin_ena_hw_hints *hints;
3788
3789 ENA_WARN(aenq_e->aenq_common_desc.group != ENA_ADMIN_NOTIFICATION,
3789 ENA_WARN(NULL, aenq_e->aenq_common_desc.group != ENA_ADMIN_NOTIFICATION,
3790 "Invalid group(%x) expected %x\n", aenq_e->aenq_common_desc.group,
3791 ENA_ADMIN_NOTIFICATION);
3792
3790 "Invalid group(%x) expected %x\n", aenq_e->aenq_common_desc.group,
3791 ENA_ADMIN_NOTIFICATION);
3792
3793 switch (aenq_e->aenq_common_desc.syndrom) {
3793 switch (aenq_e->aenq_common_desc.syndrome) {
3794 case ENA_ADMIN_UPDATE_HINTS:
3795 hints =
3796 (struct ena_admin_ena_hw_hints *)(&aenq_e->inline_data_w4);
3797 ena_update_hints(adapter, hints);
3798 break;
3799 default:
3800 device_printf(adapter->pdev,
3801 "Invalid aenq notification link state %d\n",
3794 case ENA_ADMIN_UPDATE_HINTS:
3795 hints =
3796 (struct ena_admin_ena_hw_hints *)(&aenq_e->inline_data_w4);
3797 ena_update_hints(adapter, hints);
3798 break;
3799 default:
3800 device_printf(adapter->pdev,
3801 "Invalid aenq notification link state %d\n",
3802 aenq_e->aenq_common_desc.syndrom);
3802 aenq_e->aenq_common_desc.syndrome);
3803 }
3804}
3805
3806/**
3807 * This handler will called for unknown event group or unimplemented handlers
3808 **/
3809static void
3810unimplemented_aenq_handler(void *adapter_data,

--- 44 unchanged lines hidden ---
3803 }
3804}
3805
3806/**
3807 * This handler will called for unknown event group or unimplemented handlers
3808 **/
3809static void
3810unimplemented_aenq_handler(void *adapter_data,

--- 44 unchanged lines hidden ---