ena.c (04cf2b885d7dc385ed8e48df1d0218b5e4162869) ena.c (8483b844e7e48dbfc61c6e38908921c4fa691d4c)
1/*-
2 * BSD LICENSE
3 *
4 * Copyright (c) 2015-2019 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

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

255fail_tag:
256 dma->tag = NULL;
257 dma->vaddr = NULL;
258 dma->paddr = 0;
259
260 return (error);
261}
262
1/*-
2 * BSD LICENSE
3 *
4 * Copyright (c) 2015-2019 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

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

255fail_tag:
256 dma->tag = NULL;
257 dma->vaddr = NULL;
258 dma->paddr = 0;
259
260 return (error);
261}
262
263/*
264 * This function should generate unique key for the whole driver.
265 * If the key was already genereated in the previous call (for example
266 * for another adapter), then it should be returned instead.
267 */
268void
269ena_rss_key_fill(void *key, size_t size)
270{
271 static bool key_generated;
272 static uint8_t default_key[ENA_HASH_KEY_SIZE];
273
274 KASSERT(size <= ENA_HASH_KEY_SIZE, ("Requested more bytes than ENA RSS key can hold"));
275
276 if (!key_generated) {
277 arc4random_buf(default_key, ENA_HASH_KEY_SIZE);
278 key_generated = true;
279 }
280
281 memcpy(key, default_key, size);
282}
283
263static void
264ena_free_pci_resources(struct ena_adapter *adapter)
265{
266 device_t pdev = adapter->pdev;
267
268 if (adapter->memory != NULL) {
269 bus_release_resource(pdev, SYS_RES_MEMORY,
270 PCIR_BAR(ENA_MEM_BAR), adapter->memory);

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

388 /* TX/RX common ring state */
389 ena_init_io_rings_common(adapter, txr, i);
390 ena_init_io_rings_common(adapter, rxr, i);
391
392 /* TX specific ring state */
393 txr->ring_size = adapter->tx_ring_size;
394 txr->tx_max_header_size = ena_dev->tx_max_header_size;
395 txr->tx_mem_queue_type = ena_dev->tx_mem_queue_type;
284static void
285ena_free_pci_resources(struct ena_adapter *adapter)
286{
287 device_t pdev = adapter->pdev;
288
289 if (adapter->memory != NULL) {
290 bus_release_resource(pdev, SYS_RES_MEMORY,
291 PCIR_BAR(ENA_MEM_BAR), adapter->memory);

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

409 /* TX/RX common ring state */
410 ena_init_io_rings_common(adapter, txr, i);
411 ena_init_io_rings_common(adapter, rxr, i);
412
413 /* TX specific ring state */
414 txr->ring_size = adapter->tx_ring_size;
415 txr->tx_max_header_size = ena_dev->tx_max_header_size;
416 txr->tx_mem_queue_type = ena_dev->tx_mem_queue_type;
396 txr->smoothed_interval =
397 ena_com_get_nonadaptive_moderation_interval_tx(ena_dev);
398
399 /* Allocate a buf ring */
400 txr->buf_ring_size = adapter->buf_ring_size;
401 txr->br = buf_ring_alloc(txr->buf_ring_size, M_DEVBUF,
402 M_WAITOK, &txr->ring_mtx);
403
404 /* Alloc TX statistics. */
405 ena_alloc_counters((counter_u64_t *)&txr->tx_stats,
406 sizeof(txr->tx_stats));
407
408 /* RX specific ring state */
409 rxr->ring_size = adapter->rx_ring_size;
417
418 /* Allocate a buf ring */
419 txr->buf_ring_size = adapter->buf_ring_size;
420 txr->br = buf_ring_alloc(txr->buf_ring_size, M_DEVBUF,
421 M_WAITOK, &txr->ring_mtx);
422
423 /* Alloc TX statistics. */
424 ena_alloc_counters((counter_u64_t *)&txr->tx_stats,
425 sizeof(txr->tx_stats));
426
427 /* RX specific ring state */
428 rxr->ring_size = adapter->rx_ring_size;
410 rxr->smoothed_interval =
411 ena_com_get_nonadaptive_moderation_interval_rx(ena_dev);
412
413 /* Alloc RX statistics. */
414 ena_alloc_counters((counter_u64_t *)&rxr->rx_stats,
415 sizeof(rxr->rx_stats));
416
417 /* Initialize locks */
418 snprintf(txr->mtx_name, nitems(txr->mtx_name), "%s:tx(%d)",
419 device_get_nameunit(adapter->pdev), i);

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

737
738 /* And free allocated memory. */
739 free(tx_ring->tx_buffer_info, M_DEVBUF);
740 tx_ring->tx_buffer_info = NULL;
741
742 free(tx_ring->free_tx_ids, M_DEVBUF);
743 tx_ring->free_tx_ids = NULL;
744
429
430 /* Alloc RX statistics. */
431 ena_alloc_counters((counter_u64_t *)&rxr->rx_stats,
432 sizeof(rxr->rx_stats));
433
434 /* Initialize locks */
435 snprintf(txr->mtx_name, nitems(txr->mtx_name), "%s:tx(%d)",
436 device_get_nameunit(adapter->pdev), i);

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

754
755 /* And free allocated memory. */
756 free(tx_ring->tx_buffer_info, M_DEVBUF);
757 tx_ring->tx_buffer_info = NULL;
758
759 free(tx_ring->free_tx_ids, M_DEVBUF);
760 tx_ring->free_tx_ids = NULL;
761
745 ENA_MEM_FREE(adapter->ena_dev->dmadev,
746 tx_ring->push_buf_intermediate_buf);
762 free(tx_ring->push_buf_intermediate_buf, M_DEVBUF);
747 tx_ring->push_buf_intermediate_buf = NULL;
748}
749
750/**
751 * ena_setup_all_tx_resources - allocate all queues Tx resources
752 * @adapter: network interface device structure
753 *
754 * Returns 0 on success, otherwise on failure.

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

1083
1084 if (unlikely(i < num)) {
1085 counter_u64_add(rx_ring->rx_stats.refil_partial, 1);
1086 ena_trace(ENA_WARNING,
1087 "refilled rx qid %d with only %d mbufs (from %d)\n",
1088 rx_ring->qid, i, num);
1089 }
1090
763 tx_ring->push_buf_intermediate_buf = NULL;
764}
765
766/**
767 * ena_setup_all_tx_resources - allocate all queues Tx resources
768 * @adapter: network interface device structure
769 *
770 * Returns 0 on success, otherwise on failure.

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

1099
1100 if (unlikely(i < num)) {
1101 counter_u64_add(rx_ring->rx_stats.refil_partial, 1);
1102 ena_trace(ENA_WARNING,
1103 "refilled rx qid %d with only %d mbufs (from %d)\n",
1104 rx_ring->qid, i, num);
1105 }
1106
1091 if (likely(i != 0)) {
1092 wmb();
1107 if (likely(i != 0))
1093 ena_com_write_sq_doorbell(rx_ring->ena_com_io_sq);
1108 ena_com_write_sq_doorbell(rx_ring->ena_com_io_sq);
1094 }
1109
1095 rx_ring->next_to_use = next_to_use;
1096 return (i);
1097}
1098
1099static void
1100ena_free_rx_bufs(struct ena_adapter *adapter, unsigned int qid)
1101{
1102 struct ena_ring *rx_ring = &adapter->rx_ring[qid];

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

2912 return;
2913
2914 if (ENA_FLAG_ISSET(ENA_FLAG_TRIGGER_RESET, adapter))
2915 return;
2916
2917 for (i = 0; i < adapter->num_queues; i++) {
2918 rx_ring = &adapter->rx_ring[i];
2919
1110 rx_ring->next_to_use = next_to_use;
1111 return (i);
1112}
1113
1114static void
1115ena_free_rx_bufs(struct ena_adapter *adapter, unsigned int qid)
1116{
1117 struct ena_ring *rx_ring = &adapter->rx_ring[qid];

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

2927 return;
2928
2929 if (ENA_FLAG_ISSET(ENA_FLAG_TRIGGER_RESET, adapter))
2930 return;
2931
2932 for (i = 0; i < adapter->num_queues; i++) {
2933 rx_ring = &adapter->rx_ring[i];
2934
2920 refill_required = ena_com_free_desc(rx_ring->ena_com_io_sq);
2935 refill_required = ena_com_free_q_entries(rx_ring->ena_com_io_sq);
2921 if (unlikely(refill_required == (rx_ring->ring_size - 1))) {
2922 rx_ring->empty_rx_queue++;
2923
2924 if (rx_ring->empty_rx_queue >= EMPTY_RX_REFILL) {
2925 counter_u64_add(rx_ring->rx_stats.empty_rx_ring,
2926 1);
2927
2928 device_printf(adapter->pdev,

--- 668 unchanged lines hidden ---
2936 if (unlikely(refill_required == (rx_ring->ring_size - 1))) {
2937 rx_ring->empty_rx_queue++;
2938
2939 if (rx_ring->empty_rx_queue >= EMPTY_RX_REFILL) {
2940 counter_u64_add(rx_ring->rx_stats.empty_rx_ring,
2941 1);
2942
2943 device_printf(adapter->pdev,

--- 668 unchanged lines hidden ---