iPXE
ena.c File Reference

Amazon ENA network driver. More...

#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <byteswap.h>
#include <ipxe/netdevice.h>
#include <ipxe/ethernet.h>
#include <ipxe/if_ether.h>
#include <ipxe/iobuf.h>
#include <ipxe/malloc.h>
#include <ipxe/pci.h>
#include <ipxe/pcibridge.h>
#include <ipxe/version.h>
#include "ena.h"

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
static const char * ena_direction (unsigned int direction)
 Get direction name (for debugging)
static int ena_reset_wait (struct ena_nic *ena, uint32_t expected)
 Wait for reset operation to be acknowledged.
static int ena_reset (struct ena_nic *ena)
 Reset hardware.
static void ena_set_base (struct ena_nic *ena, unsigned int offset, void *base)
 Set queue base address.
static void ena_set_caps (struct ena_nic *ena, unsigned int offset, unsigned int count, size_t size)
 Set queue capabilities.
static void ena_clear_caps (struct ena_nic *ena, unsigned int offset)
 Clear queue capabilities.
static int ena_create_admin (struct ena_nic *ena)
 Create admin queues.
static void ena_destroy_admin (struct ena_nic *ena)
 Destroy admin queues.
static union ena_aq_reqena_admin_req (struct ena_nic *ena)
 Get next available admin queue request.
static int ena_admin (struct ena_nic *ena, union ena_aq_req *req, union ena_acq_rsp **rsp)
 Issue admin queue request.
static int ena_set_aenq_config (struct ena_nic *ena, uint32_t enabled)
 Set async event notification queue config.
static int ena_create_async (struct ena_nic *ena)
 Create async event notification queue.
static void ena_destroy_async (struct ena_nic *ena)
 Destroy async event notification queue.
static int ena_create_sq (struct ena_nic *ena, struct ena_sq *sq, struct ena_cq *cq)
 Create submission queue.
static int ena_destroy_sq (struct ena_nic *ena, struct ena_sq *sq)
 Destroy submission queue.
static int ena_create_cq (struct ena_nic *ena, struct ena_cq *cq)
 Create completion queue.
static int ena_destroy_cq (struct ena_nic *ena, struct ena_cq *cq)
 Destroy completion queue.
static int ena_create_qp (struct ena_nic *ena, struct ena_qp *qp)
 Create queue pair.
static int ena_destroy_qp (struct ena_nic *ena, struct ena_qp *qp)
 Destroy queue pair.
static int ena_get_device_attributes (struct net_device *netdev)
 Get device attributes.
static int ena_set_host_attributes (struct ena_nic *ena)
 Set host attributes.
static int ena_llq_config (struct ena_nic *ena)
 Configure low latency queues.
static int ena_get_stats (struct ena_nic *ena)
 Get statistics (for debugging)
static void ena_refill_rx (struct net_device *netdev)
 Refill receive queue.
static void ena_empty_rx (struct ena_nic *ena)
 Discard unused receive I/O buffers.
static void ena_cancel_tx (struct net_device *netdev)
 Cancel uncompleted transmit I/O buffers.
static int ena_open (struct net_device *netdev)
 Open network device.
static void ena_close (struct net_device *netdev)
 Close network device.
static int ena_transmit (struct net_device *netdev, struct io_buffer *iobuf)
 Transmit packet.
static void ena_poll_tx (struct net_device *netdev)
 Poll for completed transmissions.
static void ena_poll_rx (struct net_device *netdev)
 Poll for received packets.
static void ena_poll (struct net_device *netdev)
 Poll for completed and received packets.
static int ena_membases (struct ena_nic *ena, struct pci_device *pci, unsigned long *prefmembase, unsigned long *prefmemsize)
 Assign memory BARs.
static int ena_probe (struct pci_device *pci)
 Probe PCI device.
static void ena_remove (struct pci_device *pci)
 Remove PCI device.

Variables

static struct net_device_operations ena_operations
 ENA network device operations.
static struct pci_device_id ena_nics []
 ENA PCI device IDs.
struct pci_driver ena_driver __pci_driver
 ENA PCI driver.

Detailed Description

Amazon ENA network driver.

Definition in file ena.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ ena_direction()

const char * ena_direction ( unsigned int direction)
static

Get direction name (for debugging)

Parameters
directionDirection
Return values
nameDirection name

Definition at line 54 of file ena.c.

54 {
55
56 switch ( direction ) {
57 case ENA_SQ_TX: return "TX";
58 case ENA_SQ_RX: return "RX";
59 default: return "<UNKNOWN>";
60 }
61}
uint8_t direction
Direction.
Definition ena.h:3
@ ENA_SQ_TX
Transmit.
Definition ena.h:304
@ ENA_SQ_RX
Receive.
Definition ena.h:306

References direction, ENA_SQ_RX, and ENA_SQ_TX.

Referenced by ena_create_sq(), and ena_destroy_sq().

◆ ena_reset_wait()

int ena_reset_wait ( struct ena_nic * ena,
uint32_t expected )
static

Wait for reset operation to be acknowledged.

Parameters
enaENA device
expectedExpected reset state
Return values
rcReturn status code

Definition at line 77 of file ena.c.

77 {
79 unsigned int i;
80
81 /* Wait for reset to complete */
82 for ( i = 0 ; i < ENA_RESET_MAX_WAIT_MS ; i++ ) {
83
84 /* Check if device is ready */
85 stat = readl ( ena->regs + ENA_STAT );
86 if ( ( stat & ENA_STAT_RESET ) == expected )
87 return 0;
88
89 /* Delay */
90 mdelay ( 1 );
91 }
92
93 DBGC ( ena, "ENA %p timed out waiting for reset status %#08x "
94 "(got %#08x)\n", ena, expected, stat );
95 return -ETIMEDOUT;
96}
unsigned int uint32_t
Definition stdint.h:12
uint32_t stat
Completion status.
Definition dwmac.h:1
#define ENA_STAT
Device status register.
Definition ena.h:83
#define ENA_STAT_RESET
Reset in progress.
Definition ena.h:84
#define ENA_RESET_MAX_WAIT_MS
Maximum time to wait for reset.
Definition ena.h:80
#define DBGC(...)
Definition compiler.h:505
#define ETIMEDOUT
Connection timed out.
Definition errno.h:670
void * regs
Registers.
Definition ena.h:836
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition timer.c:79
#define readl
Definition w89c840.c:157

References DBGC, ENA_RESET_MAX_WAIT_MS, ENA_STAT, ENA_STAT_RESET, ETIMEDOUT, mdelay(), readl, ena_nic::regs, and stat.

Referenced by ena_reset().

◆ ena_reset()

int ena_reset ( struct ena_nic * ena)
static

Reset hardware.

Parameters
enaENA device
Return values
rcReturn status code

Definition at line 104 of file ena.c.

104 {
105 int rc;
106
107 /* Trigger reset */
108 writel ( ENA_CTRL_RESET, ( ena->regs + ENA_CTRL ) );
109
110 /* Wait for reset to take effect */
111 if ( ( rc = ena_reset_wait ( ena, ENA_STAT_RESET ) ) != 0 )
112 return rc;
113
114 /* Clear reset */
115 writel ( 0, ( ena->regs + ENA_CTRL ) );
116
117 /* Wait for reset to clear */
118 if ( ( rc = ena_reset_wait ( ena, 0 ) ) != 0 )
119 return rc;
120
121 return 0;
122}
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
static int ena_reset_wait(struct ena_nic *ena, uint32_t expected)
Wait for reset operation to be acknowledged.
Definition ena.c:77
#define ENA_CTRL
Device control register.
Definition ena.h:76
#define ENA_CTRL_RESET
Reset.
Definition ena.h:77
#define writel
Definition w89c840.c:160

References ENA_CTRL, ENA_CTRL_RESET, ena_reset_wait(), ENA_STAT_RESET, rc, ena_nic::regs, and writel.

Referenced by ena_probe(), and ena_remove().

◆ ena_set_base()

void ena_set_base ( struct ena_nic * ena,
unsigned int offset,
void * base )
inlinestatic

Set queue base address.

Parameters
enaENA device
offsetRegister offset
addressBase address

Definition at line 138 of file ena.c.

139 {
141
142 /* Program base address registers */
143 writel ( ( phys & 0xffffffffUL ),
144 ( ena->regs + offset + ENA_BASE_LO ) );
145 if ( sizeof ( phys ) > sizeof ( uint32_t ) ) {
146 writel ( ( ( ( uint64_t ) phys ) >> 32 ),
147 ( ena->regs + offset + ENA_BASE_HI ) );
148 } else {
149 writel ( 0, ( ena->regs + offset + ENA_BASE_HI ) );
150 }
151}
unsigned long physaddr_t
Definition stdint.h:20
unsigned long long uint64_t
Definition stdint.h:13
uint16_t offset
Offset to command line.
Definition bzimage.h:3
#define ENA_BASE_LO
Base address low register offset.
Definition ena.h:43
#define ENA_BASE_HI
Base address high register offset.
Definition ena.h:46
static signed char phys[4]
Definition epic100.c:88
static __always_inline unsigned long virt_to_bus(volatile const void *addr)
Convert virtual address to a bus address.
Definition io.h:184
uint32_t base
Base.
Definition librm.h:3

References base, ENA_BASE_HI, ENA_BASE_LO, offset, phys, ena_nic::regs, virt_to_bus(), and writel.

Referenced by ena_create_admin(), and ena_create_async().

◆ ena_set_caps()

void ena_set_caps ( struct ena_nic * ena,
unsigned int offset,
unsigned int count,
size_t size )
inlinestatic

Set queue capabilities.

Parameters
enaENA device
offsetRegister offset
countNumber of entries
sizeSize of each entry

Definition at line 162 of file ena.c.

163 {
164
165 /* Program capabilities register */
166 writel ( ENA_CAPS ( count, size ), ( ena->regs + offset ) );
167}
#define ENA_CAPS(count, size)
Capability register value.
Definition ena.h:49
uint16_t size
Buffer size.
Definition dwmac.h:3
static unsigned int count
Number of entries.
Definition dwmac.h:220

References count, ENA_CAPS, offset, ena_nic::regs, size, and writel.

Referenced by ena_create_admin(), and ena_create_async().

◆ ena_clear_caps()

void ena_clear_caps ( struct ena_nic * ena,
unsigned int offset )
inlinestatic

Clear queue capabilities.

Parameters
enaENA device
offsetRegister offset

Definition at line 176 of file ena.c.

176 {
177
178 /* Clear capabilities register */
179 writel ( 0, ( ena->regs + offset ) );
180}

References offset, ena_nic::regs, and writel.

Referenced by ena_create_admin(), ena_create_async(), ena_destroy_admin(), and ena_destroy_async().

◆ ena_create_admin()

int ena_create_admin ( struct ena_nic * ena)
static

Create admin queues.

Parameters
enaENA device
Return values
rcReturn status code

Definition at line 188 of file ena.c.

188 {
189 size_t aq_len = ( ENA_AQ_COUNT * sizeof ( ena->aq.req[0] ) );
190 size_t acq_len = ( ENA_ACQ_COUNT * sizeof ( ena->acq.rsp[0] ) );
191 int rc;
192
193 /* Allocate admin completion queue */
194 ena->acq.rsp = malloc_phys ( acq_len, acq_len );
195 if ( ! ena->acq.rsp ) {
196 rc = -ENOMEM;
197 goto err_alloc_acq;
198 }
199 memset ( ena->acq.rsp, 0, acq_len );
200
201 /* Allocate admin queue */
202 ena->aq.req = malloc_phys ( aq_len, aq_len );
203 if ( ! ena->aq.req ) {
204 rc = -ENOMEM;
205 goto err_alloc_aq;
206 }
207 memset ( ena->aq.req, 0, aq_len );
208
209 /* Program queue addresses and capabilities */
210 ena_set_base ( ena, ENA_ACQ_BASE, ena->acq.rsp );
212 sizeof ( ena->acq.rsp[0] ) );
213 ena_set_base ( ena, ENA_AQ_BASE, ena->aq.req );
215 sizeof ( ena->aq.req[0] ) );
216
217 DBGC ( ena, "ENA %p AQ [%08lx,%08lx) ACQ [%08lx,%08lx)\n",
218 ena, virt_to_phys ( ena->aq.req ),
219 ( virt_to_phys ( ena->aq.req ) + aq_len ),
220 virt_to_phys ( ena->acq.rsp ),
221 ( virt_to_phys ( ena->acq.rsp ) + acq_len ) );
222 return 0;
223
226 free_phys ( ena->aq.req, aq_len );
227 err_alloc_aq:
228 free_phys ( ena->acq.rsp, acq_len );
229 err_alloc_acq:
230 return rc;
231}
static void ena_clear_caps(struct ena_nic *ena, unsigned int offset)
Clear queue capabilities.
Definition ena.c:176
static void ena_set_caps(struct ena_nic *ena, unsigned int offset, unsigned int count, size_t size)
Set queue capabilities.
Definition ena.c:162
static void ena_set_base(struct ena_nic *ena, unsigned int offset, void *base)
Set queue base address.
Definition ena.c:138
#define ENA_ACQ_BASE
Admin completion queue base address register.
Definition ena.h:58
#define ENA_AQ_COUNT
Number of admin queue entries.
Definition ena.h:28
#define ENA_ACQ_CAPS
Admin completion queue capabilities register.
Definition ena.h:61
#define ENA_AQ_BASE
Admin queue base address register.
Definition ena.h:52
#define ENA_ACQ_COUNT
Number of admin completion queue entries.
Definition ena.h:31
#define ENA_AQ_CAPS
Admin queue capabilities register.
Definition ena.h:55
#define ENOMEM
Not enough space.
Definition errno.h:535
void * memset(void *dest, int character, size_t len) __nonnull
void * malloc_phys(size_t size, size_t phys_align)
Allocate memory with specified physical alignment.
Definition malloc.c:707
void free_phys(void *ptr, size_t size)
Free memory allocated with malloc_phys()
Definition malloc.c:723
union ena_acq_rsp * rsp
Responses.
Definition ena.h:590
union ena_aq_req * req
Requests.
Definition ena.h:582
struct ena_aq aq
Admin queue.
Definition ena.h:844
struct ena_acq acq
Admin completion queue.
Definition ena.h:846

References ena_nic::acq, ena_nic::aq, DBGC, ENA_ACQ_BASE, ENA_ACQ_CAPS, ENA_ACQ_COUNT, ENA_AQ_BASE, ENA_AQ_CAPS, ENA_AQ_COUNT, ena_clear_caps(), ena_set_base(), ena_set_caps(), ENOMEM, free_phys(), malloc_phys(), memset(), rc, ena_aq::req, and ena_acq::rsp.

Referenced by ena_probe().

◆ ena_destroy_admin()

void ena_destroy_admin ( struct ena_nic * ena)
static

Destroy admin queues.

Parameters
enaENA device

Definition at line 238 of file ena.c.

238 {
239 size_t aq_len = ( ENA_AQ_COUNT * sizeof ( ena->aq.req[0] ) );
240 size_t acq_len = ( ENA_ACQ_COUNT * sizeof ( ena->acq.rsp[0] ) );
241
242 /* Clear queue capabilities */
245 wmb();
246
247 /* Free queues */
248 free_phys ( ena->aq.req, aq_len );
249 free_phys ( ena->acq.rsp, acq_len );
250 DBGC ( ena, "ENA %p AQ and ACQ destroyed\n", ena );
251}
#define wmb()
Definition io.h:546

References ena_nic::acq, ena_nic::aq, DBGC, ENA_ACQ_CAPS, ENA_ACQ_COUNT, ENA_AQ_CAPS, ENA_AQ_COUNT, ena_clear_caps(), free_phys(), ena_aq::req, ena_acq::rsp, and wmb.

Referenced by ena_probe(), and ena_remove().

◆ ena_admin_req()

union ena_aq_req * ena_admin_req ( struct ena_nic * ena)
static

Get next available admin queue request.

Parameters
enaENA device
Return values
reqAdmin queue request

Definition at line 259 of file ena.c.

259 {
260 union ena_aq_req *req;
261 unsigned int index;
262
263 /* Get next request */
264 index = ( ena->aq.prod % ENA_AQ_COUNT );
265 req = &ena->aq.req[index];
266
267 /* Initialise request */
268 memset ( ( ( ( void * ) req ) + sizeof ( req->header ) ), 0,
269 ( sizeof ( *req ) - sizeof ( req->header ) ) );
270 req->header.id = ena->aq.prod;
271
272 /* Increment producer counter */
273 ena->aq.prod++;
274
275 return req;
276}
long index
Definition bigint.h:65
unsigned int prod
Producer counter.
Definition ena.h:584
Admin queue request.
Definition ena.h:538

References ena_nic::aq, ENA_AQ_COUNT, ena_aq_req::header, ena_aq_header::id, index, memset(), ena_aq::prod, and ena_aq::req.

Referenced by ena_create_cq(), ena_create_sq(), ena_destroy_cq(), ena_destroy_sq(), ena_get_device_attributes(), ena_get_stats(), ena_llq_config(), ena_set_aenq_config(), and ena_set_host_attributes().

◆ ena_admin()

int ena_admin ( struct ena_nic * ena,
union ena_aq_req * req,
union ena_acq_rsp ** rsp )
static

Issue admin queue request.

Parameters
enaENA device
reqAdmin queue request
rspAdmin queue response to fill in
Return values
rcReturn status code

Definition at line 286 of file ena.c.

287 {
288 unsigned int index;
289 unsigned int i;
290 int rc;
291
292 /* Locate response */
293 index = ( ena->acq.cons % ENA_ACQ_COUNT );
294 *rsp = &ena->acq.rsp[index];
295
296 /* Mark request as ready */
297 req->header.flags ^= ENA_AQ_PHASE;
298 wmb();
299 DBGC2 ( ena, "ENA %p admin request %#x:\n",
300 ena, le16_to_cpu ( req->header.id ) );
301 DBGC2_HDA ( ena, virt_to_phys ( req ), req, sizeof ( *req ) );
302
303 /* Ring doorbell */
304 writel ( ena->aq.prod, ( ena->regs + ENA_AQ_DB ) );
305
306 /* Wait for response */
307 for ( i = 0 ; i < ENA_ADMIN_MAX_WAIT_MS ; i++ ) {
308
309 /* Check for response */
310 if ( ( (*rsp)->header.flags ^ ena->acq.phase ) & ENA_ACQ_PHASE){
311 mdelay ( 1 );
312 continue;
313 }
314 DBGC2 ( ena, "ENA %p admin response %#x:\n",
315 ena, le16_to_cpu ( (*rsp)->header.id ) );
316 DBGC2_HDA ( ena, virt_to_phys ( *rsp ), *rsp, sizeof ( **rsp ));
317
318 /* Increment consumer counter */
319 ena->acq.cons++;
320 if ( ( ena->acq.cons % ENA_ACQ_COUNT ) == 0 )
321 ena->acq.phase ^= ENA_ACQ_PHASE;
322
323 /* Check command identifier */
324 if ( (*rsp)->header.id != req->header.id ) {
325 DBGC ( ena, "ENA %p admin response %#x mismatch:\n",
326 ena, le16_to_cpu ( (*rsp)->header.id ) );
327 rc = -EILSEQ;
328 goto err;
329 }
330
331 /* Check status */
332 if ( (*rsp)->header.status != 0 ) {
333 DBGC ( ena, "ENA %p admin response %#x status %d:\n",
334 ena, le16_to_cpu ( (*rsp)->header.id ),
335 (*rsp)->header.status );
336 rc = -EIO;
337 goto err;
338 }
339
340 /* Success */
341 return 0;
342 }
343
344 rc = -ETIMEDOUT;
345 DBGC ( ena, "ENA %p timed out waiting for admin request %#x:\n",
346 ena, le16_to_cpu ( req->header.id ) );
347 err:
348 DBGC_HDA ( ena, virt_to_phys ( req ), req, sizeof ( *req ) );
349 DBGC_HDA ( ena, virt_to_phys ( *rsp ), *rsp, sizeof ( **rsp ) );
350 return rc;
351}
#define ENA_AQ_DB
Admin queue doorbell register.
Definition ena.h:64
#define ENA_ACQ_PHASE
Admin completion queue ownership phase flag.
Definition ena.h:118
#define ENA_AQ_PHASE
Admin queue ownership phase flag.
Definition ena.h:99
#define ENA_ADMIN_MAX_WAIT_MS
Maximum time to wait for admin requests.
Definition ena.h:67
#define DBGC2(...)
Definition compiler.h:522
#define DBGC2_HDA(...)
Definition compiler.h:523
#define DBGC_HDA(...)
Definition compiler.h:506
#define EIO
Input/output error.
Definition errno.h:434
#define EILSEQ
Illegal byte sequence.
Definition errno.h:414
#define le16_to_cpu(value)
Definition byteswap.h:113
uint64_t rsp
Definition librm.h:18
unsigned int cons
Consumer counter.
Definition ena.h:592
unsigned int phase
Phase.
Definition ena.h:594
uint8_t id
Request identifier.
Definition ena.h:89
uint8_t flags
Flags.
Definition ena.h:95
struct ena_aq_header header
Header.
Definition ena.h:540

References ena_nic::acq, ena_nic::aq, ena_acq::cons, DBGC, DBGC2, DBGC2_HDA, DBGC_HDA, EILSEQ, EIO, ENA_ACQ_COUNT, ENA_ACQ_PHASE, ENA_ADMIN_MAX_WAIT_MS, ENA_AQ_DB, ENA_AQ_PHASE, ETIMEDOUT, ena_aq_header::flags, ena_aq_req::header, ena_aq_header::id, index, le16_to_cpu, mdelay(), ena_acq::phase, ena_aq::prod, rc, ena_nic::regs, ena_acq::rsp, rsp, wmb, and writel.

Referenced by ena_create_cq(), ena_create_sq(), ena_destroy_cq(), ena_destroy_sq(), ena_get_device_attributes(), ena_get_stats(), ena_llq_config(), ena_set_aenq_config(), and ena_set_host_attributes().

◆ ena_set_aenq_config()

int ena_set_aenq_config ( struct ena_nic * ena,
uint32_t enabled )
static

Set async event notification queue config.

Parameters
enaENA device
enabledBitmask of the groups to enable
Return values
rcReturn status code

Definition at line 360 of file ena.c.

360 {
361 union ena_aq_req *req;
362 union ena_acq_rsp *rsp;
363 union ena_feature *feature;
364 int rc;
365
366 /* Construct request */
367 req = ena_admin_req ( ena );
371 feature->aenq.enabled = cpu_to_le32 ( enabled );
372
373 /* Issue request */
374 if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 ) {
375 DBGC ( ena, "ENA %p could not set AENQ configuration: %s\n",
376 ena, strerror ( rc ) );
377 return rc;
378 }
379
380 return 0;
381}
static int ena_admin(struct ena_nic *ena, union ena_aq_req *req, union ena_acq_rsp **rsp)
Issue admin queue request.
Definition ena.c:286
static union ena_aq_req * ena_admin_req(struct ena_nic *ena)
Get next available admin queue request.
Definition ena.c:259
#define ENA_AENQ_CONFIG
Async event notification queue config.
Definition ena.h:202
uint16_t enabled
Single-entry bitmask of the enabled option value.
Definition ena.h:3
#define ENA_SET_FEATURE
Set feature.
Definition ena.h:471
#define cpu_to_le32(value)
Definition byteswap.h:108
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
uint8_t opcode
Opcode.
Definition ena.h:93
union ena_feature feature
Feature.
Definition ena.h:488
uint8_t id
Feature identifier.
Definition ena.h:484
A named feature.
Definition features.h:79
Admin completion queue response.
Definition ena.h:560
struct ena_set_feature_req set_feature
Set feature.
Definition ena.h:552
Feature.
Definition ena.h:290

References cpu_to_le32, DBGC, ena_admin(), ena_admin_req(), ENA_AENQ_CONFIG, ENA_SET_FEATURE, enabled, ena_set_feature_req::feature, ena_aq_req::header, ena_set_feature_req::id, ena_aq_header::opcode, rc, rsp, ena_aq_req::set_feature, and strerror().

Referenced by ena_create_async().

◆ ena_create_async()

int ena_create_async ( struct ena_nic * ena)
static

Create async event notification queue.

Parameters
enaENA device
Return values
rcReturn status code

Definition at line 389 of file ena.c.

389 {
390 size_t aenq_len = ( ENA_AENQ_COUNT * sizeof ( ena->aenq.evt[0] ) );
391 int rc;
392
393 /* Allocate async event notification queue */
394 ena->aenq.evt = malloc_phys ( aenq_len, aenq_len );
395 if ( ! ena->aenq.evt ) {
396 rc = -ENOMEM;
397 goto err_alloc_aenq;
398 }
399 memset ( ena->aenq.evt, 0, aenq_len );
400
401 /* Program queue address and capabilities */
402 ena_set_base ( ena, ENA_AENQ_BASE, ena->aenq.evt );
404 sizeof ( ena->aenq.evt[0] ) );
405
406 DBGC ( ena, "ENA %p AENQ [%08lx,%08lx)\n",
407 ena, virt_to_phys ( ena->aenq.evt ),
408 ( virt_to_phys ( ena->aenq.evt ) + aenq_len ) );
409
410 /* Disable all events */
411 if ( ( rc = ena_set_aenq_config ( ena, 0 ) ) != 0 )
412 goto err_set_aenq_config;
413
414 return 0;
415
416 err_set_aenq_config:
418 free_phys ( ena->aenq.evt, aenq_len );
419 err_alloc_aenq:
420 return rc;
421}
static int ena_set_aenq_config(struct ena_nic *ena, uint32_t enabled)
Set async event notification queue config.
Definition ena.c:360
#define ENA_AENQ_CAPS
Async event notification queue capabilities register.
Definition ena.h:70
#define ENA_AENQ_COUNT
Number of async event notification queue entries.
Definition ena.h:34
#define ENA_AENQ_BASE
Async event notification queue base address register.
Definition ena.h:73
struct ena_aenq_event * evt
Events.
Definition ena.h:616
struct ena_aenq aenq
Async event notification queue.
Definition ena.h:848

References ena_nic::aenq, DBGC, ENA_AENQ_BASE, ENA_AENQ_CAPS, ENA_AENQ_COUNT, ena_clear_caps(), ena_set_aenq_config(), ena_set_base(), ena_set_caps(), ENOMEM, ena_aenq::evt, free_phys(), malloc_phys(), memset(), and rc.

Referenced by ena_probe().

◆ ena_destroy_async()

void ena_destroy_async ( struct ena_nic * ena)
static

Destroy async event notification queue.

Parameters
enaENA device

Definition at line 428 of file ena.c.

428 {
429 size_t aenq_len = ( ENA_AENQ_COUNT * sizeof ( ena->aenq.evt[0] ) );
430
431 /* Clear queue capabilities */
433 wmb();
434
435 /* Free queue */
436 free_phys ( ena->aenq.evt, aenq_len );
437 DBGC ( ena, "ENA %p AENQ destroyed\n", ena );
438}

References ena_nic::aenq, DBGC, ENA_AENQ_CAPS, ENA_AENQ_COUNT, ena_clear_caps(), ena_aenq::evt, free_phys(), and wmb.

Referenced by ena_probe(), and ena_remove().

◆ ena_create_sq()

int ena_create_sq ( struct ena_nic * ena,
struct ena_sq * sq,
struct ena_cq * cq )
static

Create submission queue.

Parameters
enaENA device
sqSubmission queue
cqCorresponding completion queue
Return values
rcReturn status code

Definition at line 448 of file ena.c.

449 {
450 union ena_aq_req *req;
451 union ena_acq_rsp *rsp;
452 unsigned int i;
453 size_t llqe;
454 int rc;
455
456 /* Allocate submission queue entries */
457 sq->sqe.raw = malloc_phys ( sq->len, ENA_ALIGN );
458 if ( ! sq->sqe.raw ) {
459 rc = -ENOMEM;
460 goto err_alloc;
461 }
462 memset ( sq->sqe.raw, 0, sq->len );
463
464 /* Construct request */
465 req = ena_admin_req ( ena );
467 req->create_sq.direction = sq->direction;
468 req->create_sq.policy = cpu_to_le16 ( sq->policy );
469 req->create_sq.cq_id = cpu_to_le16 ( cq->id );
470 req->create_sq.count = cpu_to_le16 ( sq->count );
471 if ( ! ( sq->policy & ENA_SQ_DEVICE_MEMORY ) ) {
472 req->create_sq.address =
473 cpu_to_le64 ( virt_to_bus ( sq->sqe.raw ) );
474 }
475
476 /* Issue request */
477 if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 ) {
478 DBGC ( ena, "ENA %p could not create %s SQ: %s\n",
479 ena, ena_direction ( sq->direction ), strerror ( rc ) );
480 goto err_admin;
481 }
482
483 /* Parse response */
484 sq->id = le16_to_cpu ( rsp->create_sq.id );
485 sq->doorbell = le32_to_cpu ( rsp->create_sq.doorbell );
486 llqe = le32_to_cpu ( rsp->create_sq.llqe );
487 if ( sq->policy & ENA_SQ_DEVICE_MEMORY ) {
488 assert ( ena->mem != NULL );
489 assert ( sq->len >= sizeof ( *sq->sqe.llq ) );
490 sq->llqe = ( ena->mem + llqe );
491 } else {
492 sq->llqe = NULL;
493 }
494
495 /* Reset producer counter and phase */
496 sq->prod = 0;
497 sq->phase = ENA_SQE_PHASE;
498
499 /* Calculate fill level */
500 sq->fill = sq->count;
501 if ( sq->fill > cq->actual )
502 sq->fill = cq->actual;
503
504 /* Initialise buffer ID ring */
505 for ( i = 0 ; i < sq->count ; i++ )
506 sq->ids[i] = i;
507
508 DBGC ( ena, "ENA %p %s SQ%d at ",
509 ena, ena_direction ( sq->direction ), sq->id );
510 if ( sq->policy & ENA_SQ_DEVICE_MEMORY ) {
511 DBGC ( ena, "LLQ [+%08zx,+%08zx)", llqe,
512 ( llqe + ( sq->count * sizeof ( sq->sqe.llq[0] ) ) ) );
513 } else {
514 DBGC ( ena, "[%08lx,%08lx)", virt_to_phys ( sq->sqe.raw ),
515 ( virt_to_phys ( sq->sqe.raw ) + sq->len ) );
516 }
517 DBGC ( ena, " fill %d db +%04x CQ%d\n",
518 sq->fill, sq->doorbell, cq->id );
519 return 0;
520
521 err_admin:
522 free_phys ( sq->sqe.raw, sq->len );
523 err_alloc:
524 return rc;
525}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
#define assert(condition)
Assert a condition at run-time.
Definition assert.h:50
static const char * ena_direction(unsigned int direction)
Get direction name (for debugging)
Definition ena.c:54
@ ENA_SQ_DEVICE_MEMORY
Use on-device memory (must be used in addition to host memory)
Definition ena.h:339
#define ENA_SQE_PHASE
Submission queue ownership phase flag.
Definition ena.h:665
#define ENA_ALIGN
Queue alignment.
Definition ena.h:25
#define ENA_CREATE_SQ
Create submission queue.
Definition ena.h:310
uint32_t llqe
LLQ descriptor ring offset.
Definition ena.h:9
#define cpu_to_le64(value)
Definition byteswap.h:109
#define le32_to_cpu(value)
Definition byteswap.h:114
#define cpu_to_le16(value)
Definition byteswap.h:107
uint16_t id
Completion queue identifier.
Definition ena.h:799
uint8_t actual
Actual number of entries.
Definition ena.h:805
uint16_t cq_id
Completion queue identifier.
Definition ena.h:323
uint8_t direction
Direction.
Definition ena.h:317
uint64_t address
Base address.
Definition ena.h:327
uint16_t count
Number of entries.
Definition ena.h:325
uint16_t policy
Policy.
Definition ena.h:321
void * mem
On-device memory.
Definition ena.h:838
uint8_t * ids
Buffer IDs.
Definition ena.h:734
uint8_t count
Number of entries.
Definition ena.h:752
size_t len
Total length of entries.
Definition ena.h:740
unsigned int prod
Producer counter.
Definition ena.h:742
union ena_sq::@325122061344007052302143076025054342134330057224 sqe
Entries.
uint8_t direction
Direction.
Definition ena.h:750
uint16_t id
Submission queue identifier.
Definition ena.h:748
uint16_t policy
Queue policy.
Definition ena.h:746
void * raw
Raw data.
Definition ena.h:731
struct ena_tx_llqe * llq
Low latency queue bounce buffer.
Definition ena.h:729
unsigned int doorbell
Doorbell register offset.
Definition ena.h:738
unsigned int phase
Phase.
Definition ena.h:744
uint8_t fill
Fill level (limited to completion queue size)
Definition ena.h:754
void * llqe
Low latency queue base.
Definition ena.h:736
struct ena_create_sq_req create_sq
Create submission queue.
Definition ena.h:542

References ena_cq::actual, ena_create_sq_req::address, assert, ena_create_sq_req::count, ena_sq::count, cpu_to_le16, cpu_to_le64, ena_create_sq_req::cq_id, ena_aq_req::create_sq, DBGC, ena_create_sq_req::direction, ena_sq::direction, ena_sq::doorbell, ena_admin(), ena_admin_req(), ENA_ALIGN, ENA_CREATE_SQ, ena_direction(), ENA_SQ_DEVICE_MEMORY, ENA_SQE_PHASE, ENOMEM, ena_sq::fill, free_phys(), ena_aq_req::header, ena_cq::id, ena_sq::id, ena_sq::ids, le16_to_cpu, le32_to_cpu, ena_sq::len, ena_sq::llq, ena_sq::llqe, llqe, malloc_phys(), ena_nic::mem, memset(), NULL, ena_aq_header::opcode, ena_sq::phase, ena_create_sq_req::policy, ena_sq::policy, ena_sq::prod, ena_sq::raw, rc, rsp, ena_sq::sqe, strerror(), and virt_to_bus().

Referenced by ena_create_qp().

◆ ena_destroy_sq()

int ena_destroy_sq ( struct ena_nic * ena,
struct ena_sq * sq )
static

Destroy submission queue.

Parameters
enaENA device
sqSubmission queue
Return values
rcReturn status code

Definition at line 534 of file ena.c.

534 {
535 union ena_aq_req *req;
536 union ena_acq_rsp *rsp;
537 int rc;
538
539 /* Construct request */
540 req = ena_admin_req ( ena );
542 req->destroy_sq.id = cpu_to_le16 ( sq->id );
543 req->destroy_sq.direction = sq->direction;
544
545 /* Issue request */
546 if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 ) {
547 DBGC ( ena, "ENA %p could not destroy %s SQ%d: %s\n",
548 ena, ena_direction ( sq->direction ), sq->id,
549 strerror ( rc ) );
550 return rc;
551 }
552
553 /* Free submission queue entries */
554 free_phys ( sq->sqe.raw, sq->len );
555
556 DBGC ( ena, "ENA %p %s SQ%d destroyed\n",
557 ena, ena_direction ( sq->direction ), sq->id );
558 return 0;
559}
#define ENA_DESTROY_SQ
Destroy submission queue.
Definition ena.h:361
uint16_t id
Submission queue identifier.
Definition ena.h:368
uint8_t direction
Direction.
Definition ena.h:370
struct ena_destroy_sq_req destroy_sq
Destroy submission queue.
Definition ena.h:544

References cpu_to_le16, DBGC, ena_aq_req::destroy_sq, ena_destroy_sq_req::direction, ena_sq::direction, ena_admin(), ena_admin_req(), ENA_DESTROY_SQ, ena_direction(), free_phys(), ena_aq_req::header, ena_destroy_sq_req::id, ena_sq::id, ena_sq::len, ena_aq_header::opcode, ena_sq::raw, rc, rsp, ena_sq::sqe, and strerror().

Referenced by ena_create_qp(), and ena_destroy_qp().

◆ ena_create_cq()

int ena_create_cq ( struct ena_nic * ena,
struct ena_cq * cq )
static

Create completion queue.

Parameters
enaENA device
cqCompletion queue
Return values
rcReturn status code

Definition at line 568 of file ena.c.

568 {
569 union ena_aq_req *req;
570 union ena_acq_rsp *rsp;
571 int rc;
572
573 /* Allocate completion queue entries */
574 cq->cqe.raw = malloc_phys ( cq->len, ENA_ALIGN );
575 if ( ! cq->cqe.raw ) {
576 rc = -ENOMEM;
577 goto err_alloc;
578 }
579 memset ( cq->cqe.raw, 0, cq->len );
580
581 /* Construct request */
582 req = ena_admin_req ( ena );
584 req->create_cq.size = cq->size;
585 req->create_cq.count = cpu_to_le16 ( cq->requested );
587 req->create_cq.address = cpu_to_le64 ( virt_to_bus ( cq->cqe.raw ) );
588
589 /* Issue request */
590 if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 ) {
591 DBGC ( ena, "ENA %p could not create CQ (broken firmware?): "
592 "%s\n", ena, strerror ( rc ) );
593 goto err_admin;
594 }
595
596 /* Parse response */
597 cq->id = le16_to_cpu ( rsp->create_cq.id );
598 cq->actual = le16_to_cpu ( rsp->create_cq.count );
599 cq->doorbell = le32_to_cpu ( rsp->create_cq.doorbell );
600 cq->mask = ( cq->actual - 1 );
601 if ( cq->actual != cq->requested ) {
602 DBGC ( ena, "ENA %p CQ%d requested %d actual %d\n",
603 ena, cq->id, cq->requested, cq->actual );
604 }
605
606 /* Reset consumer counter and phase */
607 cq->cons = 0;
608 cq->phase = ENA_CQE_PHASE;
609
610 DBGC ( ena, "ENA %p CQ%d at [%08lx,%08lx) db +%04x\n",
611 ena, cq->id, virt_to_phys ( cq->cqe.raw ),
612 ( virt_to_phys ( cq->cqe.raw ) + cq->len ), cq->doorbell );
613 return 0;
614
615 err_admin:
616 free_phys ( cq->cqe.raw, cq->len );
617 err_alloc:
618 return rc;
619}
#define ENA_CQE_PHASE
Completion queue ownership phase flag.
Definition ena.h:708
#define ENA_CREATE_CQ
Create completion queue.
Definition ena.h:382
#define ENA_MSIX_NONE
Empty MSI-X vector.
Definition ena.h:406
unsigned int doorbell
Doorbell register offset.
Definition ena.h:791
unsigned int phase
Phase.
Definition ena.h:797
union ena_cq::@110211317331036231100031277162175350247362043324 cqe
Entries.
size_t len
Total length of entries.
Definition ena.h:793
uint8_t requested
Requested number of entries.
Definition ena.h:803
unsigned int cons
Consumer counter.
Definition ena.h:795
uint8_t mask
Actual number of entries minus one.
Definition ena.h:807
uint8_t size
Entry size (in 32-bit words)
Definition ena.h:801
void * raw
Raw data.
Definition ena.h:788
uint16_t count
Number of entries.
Definition ena.h:393
uint32_t vector
MSI-X vector.
Definition ena.h:395
uint8_t size
Entry size (in 32-bit words)
Definition ena.h:391
uint64_t address
Base address.
Definition ena.h:397
struct ena_create_cq_req create_cq
Create completion queue.
Definition ena.h:546

References ena_cq::actual, ena_create_cq_req::address, ena_cq::cons, ena_create_cq_req::count, cpu_to_le16, cpu_to_le32, cpu_to_le64, ena_cq::cqe, ena_aq_req::create_cq, DBGC, ena_cq::doorbell, ena_admin(), ena_admin_req(), ENA_ALIGN, ENA_CQE_PHASE, ENA_CREATE_CQ, ENA_MSIX_NONE, ENOMEM, free_phys(), ena_aq_req::header, ena_cq::id, le16_to_cpu, le32_to_cpu, ena_cq::len, malloc_phys(), ena_cq::mask, memset(), ena_aq_header::opcode, ena_cq::phase, ena_cq::raw, rc, ena_cq::requested, rsp, ena_cq::size, ena_create_cq_req::size, strerror(), ena_create_cq_req::vector, and virt_to_bus().

Referenced by ena_create_qp().

◆ ena_destroy_cq()

int ena_destroy_cq ( struct ena_nic * ena,
struct ena_cq * cq )
static

Destroy completion queue.

Parameters
enaENA device
cqCompletion queue
Return values
rcReturn status code

Definition at line 628 of file ena.c.

628 {
629 union ena_aq_req *req;
630 union ena_acq_rsp *rsp;
631 int rc;
632
633 /* Construct request */
634 req = ena_admin_req ( ena );
636 req->destroy_cq.id = cpu_to_le16 ( cq->id );
637
638 /* Issue request */
639 if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 ) {
640 DBGC ( ena, "ENA %p could not destroy CQ%d: %s\n",
641 ena, cq->id, strerror ( rc ) );
642 return rc;
643 }
644
645 /* Free completion queue entries */
646 free_phys ( cq->cqe.raw, cq->len );
647
648 DBGC ( ena, "ENA %p CQ%d destroyed\n", ena, cq->id );
649 return 0;
650}
#define ENA_DESTROY_CQ
Destroy completion queue.
Definition ena.h:425
uint16_t id
Completion queue identifier.
Definition ena.h:432
struct ena_destroy_cq_req destroy_cq
Destroy completion queue.
Definition ena.h:548

References cpu_to_le16, ena_cq::cqe, DBGC, ena_aq_req::destroy_cq, ena_admin(), ena_admin_req(), ENA_DESTROY_CQ, free_phys(), ena_aq_req::header, ena_cq::id, ena_destroy_cq_req::id, ena_cq::len, ena_aq_header::opcode, ena_cq::raw, rc, rsp, and strerror().

Referenced by ena_create_qp(), and ena_destroy_qp().

◆ ena_create_qp()

int ena_create_qp ( struct ena_nic * ena,
struct ena_qp * qp )
static

Create queue pair.

Parameters
enaENA device
qpQueue pair
Return values
rcReturn status code

Definition at line 659 of file ena.c.

659 {
660 int rc;
661
662 /* Create completion queue */
663 if ( ( rc = ena_create_cq ( ena, &qp->cq ) ) != 0 )
664 goto err_create_cq;
665
666 /* Create submission queue */
667 if ( ( rc = ena_create_sq ( ena, &qp->sq, &qp->cq ) ) != 0 )
668 goto err_create_sq;
669
670 return 0;
671
672 ena_destroy_sq ( ena, &qp->sq );
673 err_create_sq:
674 ena_destroy_cq ( ena, &qp->cq );
675 err_create_cq:
676 return rc;
677}
struct arbelprm_qp_db_record qp
Definition arbel.h:2
static int ena_destroy_sq(struct ena_nic *ena, struct ena_sq *sq)
Destroy submission queue.
Definition ena.c:534
static int ena_destroy_cq(struct ena_nic *ena, struct ena_cq *cq)
Destroy completion queue.
Definition ena.c:628
static int ena_create_sq(struct ena_nic *ena, struct ena_sq *sq, struct ena_cq *cq)
Create submission queue.
Definition ena.c:448
static int ena_create_cq(struct ena_nic *ena, struct ena_cq *cq)
Create completion queue.
Definition ena.c:568

References ena_create_cq(), ena_create_sq(), ena_destroy_cq(), ena_destroy_sq(), qp, and rc.

Referenced by ena_open().

◆ ena_destroy_qp()

int ena_destroy_qp ( struct ena_nic * ena,
struct ena_qp * qp )
static

Destroy queue pair.

Parameters
enaENA device
qpQueue pair
Return values
rcReturn status code

Definition at line 686 of file ena.c.

686 {
687
688 /* Destroy submission queue */
689 ena_destroy_sq ( ena, &qp->sq );
690
691 /* Destroy completion queue */
692 ena_destroy_cq ( ena, &qp->cq );
693
694 return 0;
695}

References ena_destroy_cq(), ena_destroy_sq(), and qp.

Referenced by ena_close(), and ena_open().

◆ ena_get_device_attributes()

int ena_get_device_attributes ( struct net_device * netdev)
static

Get device attributes.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 703 of file ena.c.

703 {
704 struct ena_nic *ena = netdev->priv;
705 union ena_aq_req *req;
706 union ena_acq_rsp *rsp;
707 union ena_feature *feature;
708 int rc;
709
710 /* Construct request */
711 req = ena_admin_req ( ena );
714
715 /* Issue request */
716 if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 ) {
717 DBGC ( ena, "ENA %p could not get device attributes: %s\n",
718 ena, strerror ( rc ) );
719 return rc;
720 }
721
722 /* Parse response */
723 feature = &rsp->get_feature.feature;
724 memcpy ( netdev->hw_addr, feature->device.mac, ETH_ALEN );
725 netdev->max_pkt_len = le32_to_cpu ( feature->device.mtu );
726 netdev->mtu = ( netdev->max_pkt_len - ETH_HLEN );
727 ena->features = le32_to_cpu ( feature->device.features );
728
729 DBGC ( ena, "ENA %p MAC %s MTU %zd features %#08x\n",
730 ena, eth_ntoa ( netdev->hw_addr ), netdev->max_pkt_len,
731 ena->features );
732 return 0;
733}
#define ENA_DEVICE_ATTRIBUTES
Device attributes.
Definition ena.h:121
#define ENA_GET_FEATURE
Get feature.
Definition ena.h:444
const char * eth_ntoa(const void *ll_addr)
Transcribe Ethernet address.
Definition ethernet.c:176
static struct net_device * netdev
Definition gdbudp.c:53
#define ETH_ALEN
Definition if_ether.h:9
#define ETH_HLEN
Definition if_ether.h:10
void * memcpy(void *dest, const void *src, size_t len) __nonnull
uint8_t id
Feature identifier.
Definition ena.h:457
An ENA network card.
Definition ena.h:834
uint32_t features
Device features.
Definition ena.h:840
struct ena_get_feature_req get_feature
Get feature.
Definition ena.h:550

References DBGC, ena_admin(), ena_admin_req(), ENA_DEVICE_ATTRIBUTES, ENA_GET_FEATURE, ETH_ALEN, ETH_HLEN, eth_ntoa(), ena_nic::features, ena_aq_req::get_feature, ena_aq_req::header, ena_get_feature_req::id, le32_to_cpu, memcpy(), netdev, ena_aq_header::opcode, rc, rsp, and strerror().

Referenced by ena_probe().

◆ ena_set_host_attributes()

int ena_set_host_attributes ( struct ena_nic * ena)
static

Set host attributes.

Parameters
enaENA device
Return values
rcReturn status code

Definition at line 741 of file ena.c.

741 {
742 union ena_aq_req *req;
743 union ena_acq_rsp *rsp;
744 union ena_feature *feature;
745 int rc;
746
747 /* Construct request */
748 req = ena_admin_req ( ena );
752 feature->host.info = cpu_to_le64 ( virt_to_bus ( ena->info ) );
753
754 /* Issue request */
755 if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 ) {
756 DBGC ( ena, "ENA %p could not set host attributes: %s\n",
757 ena, strerror ( rc ) );
758 return rc;
759 }
760
761 return 0;
762}
#define ENA_HOST_ATTRIBUTES
Host attributes.
Definition ena.h:213
struct ena_host_info * info
Host info.
Definition ena.h:842

References cpu_to_le64, DBGC, ena_admin(), ena_admin_req(), ENA_HOST_ATTRIBUTES, ENA_SET_FEATURE, ena_set_feature_req::feature, ena_aq_req::header, ena_set_feature_req::id, ena_nic::info, ena_aq_header::opcode, rc, rsp, ena_aq_req::set_feature, strerror(), and virt_to_bus().

Referenced by ena_probe().

◆ ena_llq_config()

int ena_llq_config ( struct ena_nic * ena)
static

Configure low latency queues.

Parameters
enaENA device
Return values
rcReturn status code

Definition at line 770 of file ena.c.

770 {
771 union ena_aq_req *req;
772 union ena_acq_rsp *rsp;
773 union ena_feature *feature;
779 int rc;
780
781 /* Construct request */
782 req = ena_admin_req ( ena );
785
786 /* Issue request */
787 if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 ) {
788 DBGC ( ena, "ENA %p could not get LLQ configuration: %s\n",
789 ena, strerror ( rc ) );
790 return rc;
791 }
792
793 /* Parse response */
794 feature = &rsp->get_feature.feature;
795 header = le16_to_cpu ( feature->llq.header.supported );
796 size = le16_to_cpu ( feature->llq.size.supported );
797 desc = le16_to_cpu ( feature->llq.desc.supported );
798 stride = le16_to_cpu ( feature->llq.stride.supported );
799 mode = le16_to_cpu ( feature->llq.mode );
800 DBGC ( ena, "ENA %p LLQ supports %02x:%02x:%02x:%02x:%02x with %dx%d "
801 "entries\n", ena, header, size, desc, stride, mode,
802 le32_to_cpu ( feature->llq.queues ),
803 le32_to_cpu ( feature->llq.count ) );
804
805 /* Check for a supported configuration */
806 if ( ! feature->llq.queues ) {
807 DBGC ( ena, "ENA %p LLQ has no queues\n", ena );
808 return -ENOTSUP;
809 }
810 if ( ! ( header & ENA_LLQ_HEADER_INLINE ) ) {
811 DBGC ( ena, "ENA %p LLQ does not support inline headers\n",
812 ena );
813 return -ENOTSUP;
814 }
815 if ( ! ( size & ENA_LLQ_SIZE_128 ) ) {
816 DBGC ( ena, "ENA %p LLQ does not support 128-byte entries\n",
817 ena );
818 return -ENOTSUP;
819 }
820 if ( ! ( desc & ENA_LLQ_DESC_2 ) ) {
821 DBGC ( ena, "ENA %p LLQ does not support two-descriptor "
822 "entries\n", ena );
823 return -ENOTSUP;
824 }
825
826 /* Enable a minimal configuration */
830 stride &= ( -stride ); /* Don't care: use first supported option */
831 DBGC ( ena, "ENA %p LLQ enabling %02x:%02x:%02x:%02x:%02x\n",
832 ena, header, size, desc, stride, mode );
833
834 /* Construct request */
835 req = ena_admin_req ( ena );
839 feature->llq.header.enabled = cpu_to_le16 ( header );
840 feature->llq.size.enabled = cpu_to_le16 ( size );
841 feature->llq.desc.enabled = cpu_to_le16 ( desc );
842 feature->llq.stride.enabled = cpu_to_le16 ( stride );
843 feature->llq.mode = cpu_to_le16 ( mode );
844
845 /* Issue request */
846 if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 ) {
847 DBGC ( ena, "ENA %p could not set LLQ configuration: %s\n",
848 ena, strerror ( rc ) );
849 return rc;
850 }
851
852 /* Use on-device memory for transmit queue */
854 ena->tx.sq.inlined = sizeof ( ena->tx.sq.sqe.llq->inlined );
855
856 return 0;
857}
unsigned short uint16_t
Definition stdint.h:11
#define ENA_LLQ_CONFIG
Low latency queue config.
Definition ena.h:149
@ ENA_LLQ_HEADER_INLINE
Headers are placed inline immediately after descriptors.
Definition ena.h:186
struct ena_llq_option header
Header locations.
Definition ena.h:5
struct ena_llq_option stride
Descriptor strides.
Definition ena.h:11
@ ENA_LLQ_DESC_2
Two descriptors before inline headers.
Definition ena.h:198
@ ENA_LLQ_SIZE_128
Entries are 128 bytes.
Definition ena.h:192
struct ena_llq_option desc
Descriptor counts.
Definition ena.h:9
uint16_t mode
Acceleration mode.
Definition ena.h:15
#define ENOTSUP
Operation not supported.
Definition errno.h:590
struct ena_qp tx
Transmit queue.
Definition ena.h:850
struct ena_sq sq
Submission queue.
Definition ena.h:828
uint8_t inlined
Maximum inline header length.
Definition ena.h:756
uint8_t inlined[96]
Inlined header data.
Definition ena.h:717

References cpu_to_le16, DBGC, desc, ena_admin(), ena_admin_req(), ENA_GET_FEATURE, ENA_LLQ_CONFIG, ENA_LLQ_DESC_2, ENA_LLQ_HEADER_INLINE, ENA_LLQ_SIZE_128, ENA_SET_FEATURE, ENA_SQ_DEVICE_MEMORY, ENOTSUP, ena_set_feature_req::feature, ena_aq_req::get_feature, ena_aq_req::header, header, ena_get_feature_req::id, ena_set_feature_req::id, ena_sq::inlined, ena_tx_llqe::inlined, le16_to_cpu, le32_to_cpu, ena_sq::llq, mode, ena_aq_header::opcode, ena_sq::policy, rc, rsp, ena_aq_req::set_feature, size, ena_qp::sq, ena_sq::sqe, strerror(), stride, and ena_nic::tx.

Referenced by ena_probe().

◆ ena_get_stats()

int ena_get_stats ( struct ena_nic * ena)
static

Get statistics (for debugging)

Parameters
enaENA device
Return values
rcReturn status code

Definition at line 865 of file ena.c.

865 {
866 union ena_aq_req *req;
867 union ena_acq_rsp *rsp;
868 struct ena_get_stats_rsp *stats;
869 int rc;
870
871 /* Do nothing unless debug messages are enabled */
872 if ( ! DBG_LOG )
873 return 0;
874
875 /* Construct request */
876 req = ena_admin_req ( ena );
881
882 /* Issue request */
883 if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 ) {
884 DBGC ( ena, "ENA %p could not get statistics: %s\n",
885 ena, strerror ( rc ) );
886 return rc;
887 }
888
889 /* Parse response */
890 stats = &rsp->get_stats;
891 DBGC ( ena, "ENA %p TX bytes %#llx packets %#llx\n", ena,
892 ( ( unsigned long long ) le64_to_cpu ( stats->tx_bytes ) ),
893 ( ( unsigned long long ) le64_to_cpu ( stats->tx_packets ) ) );
894 DBGC ( ena, "ENA %p RX bytes %#llx packets %#llx drops %#llx\n", ena,
895 ( ( unsigned long long ) le64_to_cpu ( stats->rx_bytes ) ),
896 ( ( unsigned long long ) le64_to_cpu ( stats->rx_packets ) ),
897 ( ( unsigned long long ) le64_to_cpu ( stats->rx_drops ) ) );
898
899 return 0;
900}
#define ENA_STATS_SCOPE_ETH
Ethernet statistics.
Definition ena.h:516
#define ENA_STATS_TYPE_BASIC
Basic statistics.
Definition ena.h:513
#define ENA_GET_STATS
Get statistics.
Definition ena.h:492
#define ENA_DEVICE_MINE
My device.
Definition ena.h:519
#define DBG_LOG
Definition compiler.h:317
#define le64_to_cpu(value)
Definition byteswap.h:115
uint16_t device
Device ID.
Definition ena.h:509
uint8_t type
Type.
Definition ena.h:501
uint8_t scope
Scope.
Definition ena.h:503
Get statistics response.
Definition ena.h:522
uint64_t rx_packets
Receive packet count.
Definition ena.h:532
uint64_t rx_drops
Receive drop count.
Definition ena.h:534
uint64_t tx_bytes
Transmit byte count.
Definition ena.h:526
uint64_t rx_bytes
Receive byte count.
Definition ena.h:530
uint64_t tx_packets
Transmit packet count.
Definition ena.h:528
struct ena_get_stats_req get_stats
Get statistics.
Definition ena.h:554

References DBG_LOG, DBGC, ena_get_stats_req::device, ena_admin(), ena_admin_req(), ENA_DEVICE_MINE, ENA_GET_STATS, ENA_STATS_SCOPE_ETH, ENA_STATS_TYPE_BASIC, ena_aq_req::get_stats, ena_aq_req::header, le64_to_cpu, ena_aq_header::opcode, rc, rsp, ena_get_stats_rsp::rx_bytes, ena_get_stats_rsp::rx_drops, ena_get_stats_rsp::rx_packets, ena_get_stats_req::scope, strerror(), ena_get_stats_rsp::tx_bytes, ena_get_stats_rsp::tx_packets, and ena_get_stats_req::type.

Referenced by ena_close().

◆ ena_refill_rx()

void ena_refill_rx ( struct net_device * netdev)
static

Refill receive queue.

Parameters
netdevNetwork device

Definition at line 914 of file ena.c.

914 {
915 struct ena_nic *ena = netdev->priv;
916 struct io_buffer *iobuf;
917 struct ena_rx_sqe *sqe;
919 size_t len = netdev->max_pkt_len;
920 unsigned int refilled = 0;
921 unsigned int index;
922 unsigned int id;
923
924 /* Refill queue */
925 while ( ( ena->rx.sq.prod - ena->rx.cq.cons ) < ena->rx.sq.fill ) {
926
927 /* Allocate I/O buffer */
928 iobuf = alloc_iob ( len );
929 if ( ! iobuf ) {
930 /* Wait for next refill */
931 break;
932 }
933
934 /* Get next submission queue entry and buffer ID */
935 index = ( ena->rx.sq.prod % ENA_RX_COUNT );
936 sqe = &ena->rx.sq.sqe.rx[index];
937 id = ena->rx_ids[index];
938
939 /* Construct submission queue entry */
940 address = virt_to_bus ( iobuf->data );
941 sqe->len = cpu_to_le16 ( len );
942 sqe->id = cpu_to_le16 ( id );
943 sqe->address = cpu_to_le64 ( address );
944 wmb();
946 ena->rx.sq.phase );
947
948 /* Increment producer counter */
949 ena->rx.sq.prod++;
950 if ( ( ena->rx.sq.prod % ENA_RX_COUNT ) == 0 )
951 ena->rx.sq.phase ^= ENA_SQE_PHASE;
952
953 /* Record I/O buffer */
954 assert ( ena->rx_iobuf[id] == NULL );
955 ena->rx_iobuf[id] = iobuf;
956
957 DBGC2 ( ena, "ENA %p RX %d at [%08llx,%08llx)\n", ena, id,
958 ( ( unsigned long long ) address ),
959 ( ( unsigned long long ) address + len ) );
960 refilled++;
961 }
962
963 /* Ring doorbell, if applicable */
964 if ( refilled ) {
965 wmb();
966 writel ( ena->rx.sq.prod, ( ena->regs + ena->rx.sq.doorbell ) );
967 }
968}
ring len
Length.
Definition dwmac.h:226
uint8_t id
Request identifier.
Definition ena.h:1
#define ENA_SQE_LAST
This is the last descriptor.
Definition ena.h:671
struct ena_tx_sqe sqe
Transmit descriptor.
Definition ena.h:3
#define ENA_SQE_FIRST
This is the first descriptor.
Definition ena.h:668
uint64_t address
Base address.
Definition ena.h:13
#define ENA_RX_COUNT
Number of receive queue entries.
Definition ena.h:40
#define ENA_SQE_CPL
Request completion.
Definition ena.h:674
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition iobuf.c:131
struct io_buffer * rx_iobuf[ENA_RX_COUNT]
Receive I/O buffers, indexed by buffer ID.
Definition ena.h:860
uint8_t rx_ids[ENA_RX_COUNT]
Receive buffer IDs.
Definition ena.h:858
struct ena_qp rx
Receive queue.
Definition ena.h:852
struct ena_cq cq
Completion queue.
Definition ena.h:830
Receive submission queue entry.
Definition ena.h:649
struct ena_rx_sqe * rx
Receive submission queue entries.
Definition ena.h:727
A persistent I/O buffer.
Definition iobuf.h:38
void * data
Start of data.
Definition iobuf.h:53

References address, alloc_iob(), assert, ena_cq::cons, cpu_to_le16, cpu_to_le64, ena_qp::cq, io_buffer::data, DBGC2, ena_sq::doorbell, ENA_RX_COUNT, ENA_SQE_CPL, ENA_SQE_FIRST, ENA_SQE_LAST, ENA_SQE_PHASE, ena_sq::fill, id, index, len, netdev, NULL, ena_sq::phase, ena_sq::prod, ena_nic::regs, ena_nic::rx, ena_sq::rx, ena_nic::rx_ids, ena_nic::rx_iobuf, ena_qp::sq, ena_sq::sqe, sqe, virt_to_bus(), wmb, and writel.

Referenced by ena_open(), and ena_poll().

◆ ena_empty_rx()

void ena_empty_rx ( struct ena_nic * ena)
static

Discard unused receive I/O buffers.

Parameters
enaENA device

Definition at line 975 of file ena.c.

975 {
976 struct io_buffer *iobuf;
977 unsigned int i;
978
979 for ( i = 0 ; i < ENA_RX_COUNT ; i++ ) {
980 iobuf = ena->rx_iobuf[i];
981 ena->rx_iobuf[i] = NULL;
982 if ( iobuf )
983 free_iob ( iobuf );
984 }
985}
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition iobuf.c:153

References ENA_RX_COUNT, free_iob(), NULL, and ena_nic::rx_iobuf.

Referenced by ena_close().

◆ ena_cancel_tx()

void ena_cancel_tx ( struct net_device * netdev)
static

Cancel uncompleted transmit I/O buffers.

Parameters
netdevNetwork device

Definition at line 992 of file ena.c.

992 {
993 struct ena_nic *ena = netdev->priv;
994 struct io_buffer *iobuf;
995 unsigned int i;
996
997 for ( i = 0 ; i < ENA_TX_COUNT ; i++ ) {
998 iobuf = ena->tx_iobuf[i];
999 ena->tx_iobuf[i] = NULL;
1000 if ( iobuf )
1002 }
1003}
#define ENA_TX_COUNT
Number of transmit queue entries.
Definition ena.h:37
#define ECANCELED
Operation canceled.
Definition errno.h:344
void netdev_tx_complete_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Complete network transmission.
Definition netdevice.c:471
struct io_buffer * tx_iobuf[ENA_TX_COUNT]
Transmit I/O buffers, indexed by buffer ID.
Definition ena.h:856

References ECANCELED, ENA_TX_COUNT, netdev, netdev_tx_complete_err(), NULL, and ena_nic::tx_iobuf.

Referenced by ena_close().

◆ ena_open()

int ena_open ( struct net_device * netdev)
static

Open network device.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 1011 of file ena.c.

1011 {
1012 struct ena_nic *ena = netdev->priv;
1013 int rc;
1014
1015 /* Create transmit queue pair */
1016 if ( ( rc = ena_create_qp ( ena, &ena->tx ) ) != 0 )
1017 goto err_create_tx;
1018
1019 /* Create receive queue pair */
1020 if ( ( rc = ena_create_qp ( ena, &ena->rx ) ) != 0 )
1021 goto err_create_rx;
1022
1023 /* Refill receive queue */
1025
1026 return 0;
1027
1028 ena_destroy_qp ( ena, &ena->rx );
1029 err_create_rx:
1030 ena_destroy_qp ( ena, &ena->tx );
1031 err_create_tx:
1032 return rc;
1033}
static void ena_refill_rx(struct net_device *netdev)
Refill receive queue.
Definition ena.c:914
static int ena_create_qp(struct ena_nic *ena, struct ena_qp *qp)
Create queue pair.
Definition ena.c:659
static int ena_destroy_qp(struct ena_nic *ena, struct ena_qp *qp)
Destroy queue pair.
Definition ena.c:686

References ena_create_qp(), ena_destroy_qp(), ena_refill_rx(), netdev, rc, ena_nic::rx, and ena_nic::tx.

◆ ena_close()

void ena_close ( struct net_device * netdev)
static

Close network device.

Parameters
netdevNetwork device

Definition at line 1040 of file ena.c.

1040 {
1041 struct ena_nic *ena = netdev->priv;
1042
1043 /* Dump statistics (for debugging) */
1044 ena_get_stats ( ena );
1045
1046 /* Destroy receive queue pair */
1047 ena_destroy_qp ( ena, &ena->rx );
1048
1049 /* Discard any unused receive buffers */
1050 ena_empty_rx ( ena );
1051
1052 /* Destroy transmit queue pair */
1053 ena_destroy_qp ( ena, &ena->tx );
1054
1055 /* Cancel any uncompleted transmit buffers */
1057}
static void ena_empty_rx(struct ena_nic *ena)
Discard unused receive I/O buffers.
Definition ena.c:975
static void ena_cancel_tx(struct net_device *netdev)
Cancel uncompleted transmit I/O buffers.
Definition ena.c:992
static int ena_get_stats(struct ena_nic *ena)
Get statistics (for debugging)
Definition ena.c:865

References ena_cancel_tx(), ena_destroy_qp(), ena_empty_rx(), ena_get_stats(), netdev, ena_nic::rx, and ena_nic::tx.

◆ ena_transmit()

int ena_transmit ( struct net_device * netdev,
struct io_buffer * iobuf )
static

Transmit packet.

Parameters
netdevNetwork device
iobufI/O buffer
Return values
rcReturn status code

Definition at line 1066 of file ena.c.

1066 {
1067 struct ena_nic *ena = netdev->priv;
1068 struct ena_tx_sqe *sqe;
1069 struct ena_tx_llqe *llqe;
1070 const uint64_t *src;
1071 uint64_t *dest;
1073 unsigned int index;
1074 unsigned int id;
1075 unsigned int i;
1076 uint8_t flags;
1077 size_t inlined;
1078 size_t len;
1079
1080 /* Get next submission queue entry */
1081 if ( ( ena->tx.sq.prod - ena->tx.cq.cons ) >= ena->tx.sq.fill ) {
1082 DBGC ( ena, "ENA %p out of transmit descriptors\n", ena );
1083 return -ENOBUFS;
1084 }
1085 index = ( ena->tx.sq.prod % ENA_TX_COUNT );
1086 sqe = &ena->tx.sq.sqe.tx[index];
1087 id = ena->tx_ids[index];
1088
1089 /* Construct submission queue entry values */
1090 address = virt_to_bus ( iobuf->data );
1091 len = iob_len ( iobuf );
1092 inlined = ena->tx.sq.inlined;
1093 if ( inlined > len )
1094 inlined = len;
1095 len -= inlined;
1096 address += inlined;
1098 ena->tx.sq.phase );
1099
1100 /* Prepare low-latency queue bounce buffer, if applicable */
1101 llqe = ena->tx.sq.sqe.llq;
1102 if ( ena->tx.sq.llqe ) {
1103
1104 /* Construct zero-information metadata queue entry */
1105 llqe->meta.meta = ENA_TX_SQE_META;
1106 llqe->meta.flags = ( flags & ~( ENA_SQE_LAST | ENA_SQE_CPL ) );
1107
1108 /* Copy inlined data */
1109 memcpy ( llqe->inlined, iobuf->data, inlined );
1110
1111 /* Place submission queue entry within bounce buffer */
1112 sqe = &llqe->sqe;
1114 }
1115
1116 /* Construct submission queue entry */
1117 sqe->len = cpu_to_le16 ( len );
1118 sqe->id = cpu_to_le16 ( id );
1119 sqe->address = cpu_to_le64 ( address );
1120 sqe->inlined = inlined;
1121 wmb();
1122 sqe->flags = flags;
1123 wmb();
1124
1125 /* Copy bounce buffer to on-device memory, if applicable */
1126 if ( ena->tx.sq.llqe ) {
1127 src = ( ( const void * ) llqe );
1128 dest = ( ena->tx.sq.llqe + ( index * sizeof ( *llqe ) ) );
1129 for ( i = 0 ; i < ( sizeof ( *llqe ) / sizeof ( *src ) ); i++ )
1130 writeq ( *(src++), dest++ );
1131 wmb();
1132 }
1133
1134 /* Increment producer counter */
1135 ena->tx.sq.prod++;
1136 if ( ( ena->tx.sq.prod % ENA_TX_COUNT ) == 0 )
1137 ena->tx.sq.phase ^= ENA_SQE_PHASE;
1138
1139 /* Record I/O buffer */
1140 assert ( ena->tx_iobuf[id] == NULL );
1141 ena->tx_iobuf[id] = iobuf;
1142
1143 /* Ring doorbell */
1144 writel ( ena->tx.sq.prod, ( ena->regs + ena->tx.sq.doorbell ) );
1145
1146 DBGC2 ( ena, "ENA %p TX %d at [%08llx,%08llx)\n", ena, id,
1147 ( ( unsigned long long ) address ),
1148 ( ( unsigned long long ) address + len ) );
1149 return 0;
1150}
unsigned char uint8_t
Definition stdint.h:10
if(len >=6 *4) __asm__ __volatile__("movsl" if(len >=5 *4) __asm__ __volatile__("movsl" if(len >=4 *4) __asm__ __volatile__("movsl" if(len >=3 *4) __asm__ __volatile__("movsl" if(len >=2 *4) __asm__ __volatile__("movsl" if(len >=1 *4) __asm__ __volatile__("movsl" if((len % 4) >=2) __asm__ __volatile__("movsw" if((len % 2) >=1) __asm__ __volatile__("movsb" retur dest)
Definition string.h:151
static const void * src
Definition string.h:48
uint8_t inlined
Inlined length.
Definition ena.h:3
#define ENA_TX_SQE_META
This is a metadata entry.
Definition ena.h:646
uint8_t flags
Flags.
Definition ena.h:7
#define ENOBUFS
No buffer space available.
Definition errno.h:499
#define writeq(data, io_addr)
Definition io.h:273
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition iobuf.h:160
uint8_t tx_ids[ENA_TX_COUNT]
Transmit buffer IDs.
Definition ena.h:854
struct ena_tx_sqe * tx
Transmit submission queue entries.
Definition ena.h:725
Low latency transmit queue bounce buffer.
Definition ena.h:711
Transmit submission queue entry.
Definition ena.h:620

References address, assert, ena_cq::cons, cpu_to_le16, cpu_to_le64, ena_qp::cq, io_buffer::data, DBGC, DBGC2, dest, ena_sq::doorbell, ENA_SQE_CPL, ENA_SQE_FIRST, ENA_SQE_LAST, ENA_SQE_PHASE, ENA_TX_COUNT, ENA_TX_SQE_META, ENOBUFS, ena_sq::fill, flags, id, index, ena_sq::inlined, inlined, iob_len(), len, ena_sq::llq, ena_sq::llqe, llqe, memcpy(), netdev, NULL, ena_sq::phase, ena_sq::prod, ena_nic::regs, ena_qp::sq, ena_sq::sqe, sqe, src, ena_nic::tx, ena_sq::tx, ena_nic::tx_ids, ena_nic::tx_iobuf, virt_to_bus(), wmb, writel, and writeq.

◆ ena_poll_tx()

void ena_poll_tx ( struct net_device * netdev)
static

Poll for completed transmissions.

Parameters
netdevNetwork device

Definition at line 1157 of file ena.c.

1157 {
1158 struct ena_nic *ena = netdev->priv;
1159 struct ena_tx_cqe *cqe;
1160 struct io_buffer *iobuf;
1161 unsigned int index;
1162 unsigned int id;
1163
1164 /* Check for completed packets */
1165 while ( ena->tx.cq.cons != ena->tx.sq.prod ) {
1166
1167 /* Get next completion queue entry */
1168 index = ( ena->tx.cq.cons & ena->tx.cq.mask );
1169 cqe = &ena->tx.cq.cqe.tx[index];
1170
1171 /* Stop if completion queue entry is empty */
1172 if ( ( cqe->flags ^ ena->tx.cq.phase ) & ENA_CQE_PHASE )
1173 return;
1174
1175 /* Increment consumer counter */
1176 ena->tx.cq.cons++;
1177 if ( ! ( ena->tx.cq.cons & ena->tx.cq.mask ) )
1178 ena->tx.cq.phase ^= ENA_CQE_PHASE;
1179
1180 /* Identify and free buffer ID */
1181 id = ENA_TX_CQE_ID ( le16_to_cpu ( cqe->id ) );
1182 ena->tx_ids[index] = id;
1183
1184 /* Identify I/O buffer */
1185 iobuf = ena->tx_iobuf[id];
1186 assert ( iobuf != NULL );
1187 ena->tx_iobuf[id] = NULL;
1188
1189 /* Complete transmit */
1190 DBGC2 ( ena, "ENA %p TX %d complete\n", ena, id );
1191 netdev_tx_complete ( netdev, iobuf );
1192 }
1193}
#define ENA_TX_CQE_ID(id)
Transmit completion request identifier.
Definition ena.h:691
static void netdev_tx_complete(struct net_device *netdev, struct io_buffer *iobuf)
Complete network transmission.
Definition netdevice.h:767
struct ena_tx_cqe * tx
Transmit completion queue entries.
Definition ena.h:784
Transmit completion queue entry.
Definition ena.h:677
uint8_t flags
Flags.
Definition ena.h:683
uint16_t id
Request identifier.
Definition ena.h:679

References assert, ena_cq::cons, ena_qp::cq, ena_cq::cqe, DBGC2, ENA_CQE_PHASE, ENA_TX_CQE_ID, ena_tx_cqe::flags, ena_tx_cqe::id, id, index, le16_to_cpu, ena_cq::mask, netdev, netdev_tx_complete(), NULL, ena_cq::phase, ena_sq::prod, ena_qp::sq, ena_cq::tx, ena_nic::tx, ena_nic::tx_ids, and ena_nic::tx_iobuf.

Referenced by ena_poll().

◆ ena_poll_rx()

void ena_poll_rx ( struct net_device * netdev)
static

Poll for received packets.

Parameters
netdevNetwork device

Definition at line 1200 of file ena.c.

1200 {
1201 struct ena_nic *ena = netdev->priv;
1202 struct ena_rx_cqe *cqe;
1203 struct io_buffer *iobuf;
1204 unsigned int index;
1205 unsigned int id;
1206 size_t len;
1207
1208 /* Check for received packets */
1209 while ( ena->rx.cq.cons != ena->rx.sq.prod ) {
1210
1211 /* Get next completion queue entry */
1212 index = ( ena->rx.cq.cons & ena->rx.cq.mask );
1213 cqe = &ena->rx.cq.cqe.rx[index];
1214
1215 /* Stop if completion queue entry is empty */
1216 if ( ( cqe->flags ^ ena->rx.cq.phase ) & ENA_CQE_PHASE )
1217 return;
1218
1219 /* Increment consumer counter */
1220 ena->rx.cq.cons++;
1221 if ( ! ( ena->rx.cq.cons & ena->rx.cq.mask ) )
1222 ena->rx.cq.phase ^= ENA_CQE_PHASE;
1223
1224 /* Identify and free buffer ID */
1225 id = le16_to_cpu ( cqe->id );
1226 ena->rx_ids[index] = id;
1227
1228 /* Populate I/O buffer */
1229 iobuf = ena->rx_iobuf[id];
1230 assert ( iobuf != NULL );
1231 ena->rx_iobuf[id] = NULL;
1232 len = le16_to_cpu ( cqe->len );
1233 iob_put ( iobuf, len );
1234
1235 /* Hand off to network stack */
1236 DBGC2 ( ena, "ENA %p RX %d complete (length %zd)\n",
1237 ena, id, len );
1238 netdev_rx ( netdev, iobuf );
1239 }
1240}
#define iob_put(iobuf, len)
Definition iobuf.h:125
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition netdevice.c:549
struct ena_rx_cqe * rx
Receive completion queue entries.
Definition ena.h:786
Receive completion queue entry.
Definition ena.h:694
uint16_t id
Request identifier.
Definition ena.h:702
uint8_t flags
Flags.
Definition ena.h:698
uint16_t len
Length.
Definition ena.h:700

References assert, ena_cq::cons, ena_qp::cq, ena_cq::cqe, DBGC2, ENA_CQE_PHASE, ena_rx_cqe::flags, ena_rx_cqe::id, id, index, iob_put, le16_to_cpu, ena_rx_cqe::len, len, ena_cq::mask, netdev, netdev_rx(), NULL, ena_cq::phase, ena_sq::prod, ena_cq::rx, ena_nic::rx, ena_nic::rx_ids, ena_nic::rx_iobuf, and ena_qp::sq.

Referenced by ena_poll().

◆ ena_poll()

void ena_poll ( struct net_device * netdev)
static

Poll for completed and received packets.

Parameters
netdevNetwork device

Definition at line 1247 of file ena.c.

1247 {
1248
1249 /* Poll for transmit completions */
1250 ena_poll_tx ( netdev );
1251
1252 /* Poll for receive completions */
1253 ena_poll_rx ( netdev );
1254
1255 /* Refill receive ring */
1257}
static void ena_poll_tx(struct net_device *netdev)
Poll for completed transmissions.
Definition ena.c:1157
static void ena_poll_rx(struct net_device *netdev)
Poll for received packets.
Definition ena.c:1200

References ena_poll_rx(), ena_poll_tx(), ena_refill_rx(), and netdev.

◆ ena_membases()

int ena_membases ( struct ena_nic * ena,
struct pci_device * pci,
unsigned long * prefmembase,
unsigned long * prefmemsize )
static

Assign memory BARs.

Parameters
enaENA device
pciPCI device
prefmembaseOn-device memory base address to fill in
prefmemsizeOn-device memory size to fill in
Return values
rcReturn status code

Some BIOSes in AWS EC2 are observed to fail to assign a base address to the ENA device. The device is the only device behind its bridge, and the BIOS does assign a memory window to the bridge. We therefore place the device at the start of the memory window.

Definition at line 1288 of file ena.c.

1290 {
1291 struct pci_bridge *bridge;
1292
1293 /* Get on-device memory base address and size */
1295 *prefmemsize = pci_bar_size ( pci, ENA_MEM_BAR );
1296
1297 /* Do nothing if addresses are already assigned */
1298 if ( pci->membase && ( *prefmembase || ( ! *prefmemsize ) ) )
1299 return 0;
1300
1301 /* Locate PCI bridge */
1302 bridge = pcibridge_find ( pci );
1303 if ( ! bridge ) {
1304 DBGC ( ena, "ENA %p found no PCI bridge\n", ena );
1305 return -ENOTCONN;
1306 }
1307 DBGC ( ena, "ENA %p at " PCI_FMT " claiming bridge " PCI_FMT "\n",
1308 ena, PCI_ARGS ( pci ), PCI_ARGS ( bridge->pci ) );
1309
1310 /* Sanity check */
1311 if ( PCI_SLOT ( pci->busdevfn ) || PCI_FUNC ( pci->busdevfn ) ) {
1312 DBGC ( ena, "ENA %p at " PCI_FMT " may not be only device "
1313 "on bus\n", ena, PCI_ARGS ( pci ) );
1314 return -ENOTSUP;
1315 }
1316
1317 /* Place register BAR at start of memory window, if applicable */
1318 if ( ! pci->membase ) {
1319 pci_bar_set ( pci, ENA_REGS_BAR, bridge->membase );
1320 pci->membase = bridge->membase;
1321 DBGC ( ena, "ENA %p at " PCI_FMT " claiming mem %08lx\n",
1322 ena, PCI_ARGS ( pci ), pci->membase );
1323 }
1324
1325 /* Place memory BAR at start of prefetchable window, if applicable */
1326 if ( *prefmemsize && ( ! *prefmembase ) ) {
1327 pci_bar_set ( pci, ENA_MEM_BAR, bridge->prefmembase );
1328 *prefmembase = bridge->prefmembase;
1329 DBGC ( ena, "ENA %p at " PCI_FMT " claiming prefmem %08lx\n",
1330 ena, PCI_ARGS ( pci ), *prefmembase );
1331 }
1332
1333 return 0;
1334}
#define ENA_MEM_BAR
On-device memory BAR.
Definition ena.h:22
#define ENA_REGS_BAR
Register BAR.
Definition ena.h:16
#define ENOTCONN
The socket is not connected.
Definition errno.h:570
unsigned long pci_bar_size(struct pci_device *pci, unsigned int reg)
Get the size of a PCI BAR.
Definition pci.c:164
void pci_bar_set(struct pci_device *pci, unsigned int reg, unsigned long start)
Set the start of a PCI BAR.
Definition pci.c:115
unsigned long pci_bar_start(struct pci_device *pci, unsigned int reg)
Find the start of a PCI BAR.
Definition pci.c:97
#define PCI_FMT
PCI device debug message format.
Definition pci.h:312
#define PCI_FUNC(busdevfn)
Definition pci.h:286
#define PCI_ARGS(pci)
PCI device debug message arguments.
Definition pci.h:315
#define PCI_SLOT(busdevfn)
Definition pci.h:285
struct pci_bridge * pcibridge_find(struct pci_device *pci)
Find bridge attached to a PCI device.
Definition pcibridge.c:48
A PCI-to-PCI bridge.
Definition pcibridge.h:17
uint64_t prefmembase
Prefetchable memory base.
Definition pcibridge.h:38
struct pci_device * pci
PCI device.
Definition pcibridge.h:19
uint32_t membase
Memory base.
Definition pcibridge.h:34
uint32_t busdevfn
Segment, bus, device, and function (bus:dev.fn) number.
Definition pci.h:238
unsigned long membase
Memory base.
Definition pci.h:220

References pci_device::busdevfn, DBGC, ENA_MEM_BAR, ENA_REGS_BAR, ENOTCONN, ENOTSUP, pci_bridge::membase, pci_device::membase, pci_bridge::pci, PCI_ARGS, pci_bar_set(), pci_bar_size(), pci_bar_start(), PCI_FMT, PCI_FUNC, PCI_SLOT, pcibridge_find(), and pci_bridge::prefmembase.

Referenced by ena_probe().

◆ ena_probe()

int ena_probe ( struct pci_device * pci)
static

Probe PCI device.

Parameters
pciPCI device
Return values
rcReturn status code

Definition at line 1342 of file ena.c.

1342 {
1343 struct net_device *netdev;
1344 struct ena_nic *ena;
1345 struct ena_host_info *info;
1346 unsigned long prefmembase;
1347 unsigned long prefmemsize;
1348 int rc;
1349
1350 /* Allocate and initialise net device */
1351 netdev = alloc_etherdev ( sizeof ( *ena ) );
1352 if ( ! netdev ) {
1353 rc = -ENOMEM;
1354 goto err_alloc;
1355 }
1357 ena = netdev->priv;
1358 pci_set_drvdata ( pci, netdev );
1359 netdev->dev = &pci->dev;
1360 memset ( ena, 0, sizeof ( *ena ) );
1361 ena->acq.phase = ENA_ACQ_PHASE;
1362 ena_cq_init ( &ena->tx.cq, ENA_TX_COUNT,
1363 sizeof ( ena->tx.cq.cqe.tx[0] ) );
1364 ena_sq_init ( &ena->tx.sq, ENA_SQ_TX, ENA_TX_COUNT,
1365 sizeof ( ena->tx.sq.sqe.tx[0] ), ena->tx_ids );
1366 ena_cq_init ( &ena->rx.cq, ENA_RX_COUNT,
1367 sizeof ( ena->rx.cq.cqe.rx[0] ) );
1368 ena_sq_init ( &ena->rx.sq, ENA_SQ_RX, ENA_RX_COUNT,
1369 sizeof ( ena->rx.sq.sqe.rx[0] ), ena->rx_ids );
1370
1371 /* Fix up PCI device */
1372 adjust_pci_device ( pci );
1373
1374 /* Fix up PCI BAR if left unassigned by BIOS */
1375 if ( ( rc = ena_membases ( ena, pci, &prefmembase,
1376 &prefmemsize ) ) != 0 ) {
1377 goto err_membases;
1378 }
1379
1380 /* Map registers */
1381 ena->regs = pci_ioremap ( pci, pci->membase, ENA_REGS_SIZE );
1382 if ( ! ena->regs ) {
1383 rc = -ENODEV;
1384 goto err_regs;
1385 }
1386
1387 /* Map device memory */
1388 if ( prefmemsize ) {
1389 ena->mem = pci_ioremap ( pci, prefmembase, prefmemsize );
1390 if ( ! ena->mem ) {
1391 rc = -ENODEV;
1392 goto err_mem;
1393 }
1394 DBGC ( ena, "ENA %p has %ldkB of on-device memory\n",
1395 ena, ( prefmemsize >> 10 ) );
1396 }
1397
1398 /* Allocate and initialise host info */
1400 if ( ! info ) {
1401 rc = -ENOMEM;
1402 goto err_info;
1403 }
1404 ena->info = info;
1405 memset ( info, 0, PAGE_SIZE );
1407 snprintf ( info->dist_str, sizeof ( info->dist_str ), "%s",
1409 snprintf ( info->kernel_str, sizeof ( info->kernel_str ), "%s",
1413 info->busdevfn = cpu_to_le16 ( pci->busdevfn );
1414 DBGC2 ( ena, "ENA %p host info:\n", ena );
1415 DBGC2_HDA ( ena, virt_to_phys ( info ), info, sizeof ( *info ) );
1416
1417 /* Reset the NIC */
1418 if ( ( rc = ena_reset ( ena ) ) != 0 )
1419 goto err_reset;
1420
1421 /* Create admin queues */
1422 if ( ( rc = ena_create_admin ( ena ) ) != 0 )
1423 goto err_create_admin;
1424
1425 /* Create async event notification queue */
1426 if ( ( rc = ena_create_async ( ena ) ) != 0 )
1427 goto err_create_async;
1428
1429 /* Set host attributes */
1430 if ( ( rc = ena_set_host_attributes ( ena ) ) != 0 )
1431 goto err_set_host_attributes;
1432
1433 /* Fetch MAC address */
1434 if ( ( rc = ena_get_device_attributes ( netdev ) ) != 0 )
1435 goto err_get_device_attributes;
1436
1437 /* Attempt to configure low latency queues, if applicable.
1438 * Ignore any errors and continue without using LLQs.
1439 */
1440 if ( ena->mem && ( ena->features & ENA_FEATURE_LLQ ) )
1441 ena_llq_config ( ena );
1442
1443 /* Register network device */
1444 if ( ( rc = register_netdev ( netdev ) ) != 0 )
1445 goto err_register_netdev;
1446
1447 /* Mark as link up, since we have no way to test link state on
1448 * this hardware.
1449 */
1451
1452 return 0;
1453
1455 err_register_netdev:
1456 err_get_device_attributes:
1457 err_set_host_attributes:
1458 ena_destroy_async ( ena );
1459 err_create_async:
1460 ena_destroy_admin ( ena );
1461 err_create_admin:
1462 ena_reset ( ena );
1463 err_reset:
1464 free_phys ( ena->info, PAGE_SIZE );
1465 err_info:
1466 if ( ena->mem )
1467 iounmap ( ena->mem );
1468 err_mem:
1469 iounmap ( ena->regs );
1470 err_regs:
1471 err_membases:
1473 netdev_put ( netdev );
1474 err_alloc:
1475 return rc;
1476}
u32 info
Definition ar9003_mac.h:0
static int ena_get_device_attributes(struct net_device *netdev)
Get device attributes.
Definition ena.c:703
static int ena_reset(struct ena_nic *ena)
Reset hardware.
Definition ena.c:104
static int ena_create_async(struct ena_nic *ena)
Create async event notification queue.
Definition ena.c:389
static struct net_device_operations ena_operations
ENA network device operations.
Definition ena.c:1260
static int ena_set_host_attributes(struct ena_nic *ena)
Set host attributes.
Definition ena.c:741
static void ena_destroy_admin(struct ena_nic *ena)
Destroy admin queues.
Definition ena.c:238
static int ena_create_admin(struct ena_nic *ena)
Create admin queues.
Definition ena.c:188
static int ena_llq_config(struct ena_nic *ena)
Configure low latency queues.
Definition ena.c:770
static int ena_membases(struct ena_nic *ena, struct pci_device *pci, unsigned long *prefmembase, unsigned long *prefmemsize)
Assign memory BARs.
Definition ena.c:1288
static void ena_destroy_async(struct ena_nic *ena)
Destroy async event notification queue.
Definition ena.c:428
#define ENA_FEATURE_LLQ
Device supports low latency queues.
Definition ena.h:146
#define ENA_HOST_INFO_VERSION_WTF
Driver version.
Definition ena.h:284
#define ENA_HOST_INFO_TYPE_IPXE
Operating system type.
Definition ena.h:263
#define ENA_HOST_INFO_SPEC_2_0
ENA specification version.
Definition ena.h:287
#define ENA_REGS_SIZE
Register BAR size.
Definition ena.h:19
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
Definition ethernet.c:265
#define ENODEV
No such device.
Definition errno.h:510
#define PAGE_SIZE
Page size.
Definition io.h:28
void iounmap(volatile const void *io_addr)
Unmap I/O address.
void * pci_ioremap(struct pci_device *pci, unsigned long bus_addr, size_t len)
Map PCI bus address as an I/O address.
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition netdevice.c:942
int register_netdev(struct net_device *netdev)
Register network device.
Definition netdevice.c:760
static void netdev_link_up(struct net_device *netdev)
Mark network device as having link up.
Definition netdevice.h:789
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition netdevice.h:519
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition netdevice.h:532
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition netdevice.h:576
void adjust_pci_device(struct pci_device *pci)
Enable PCI device.
Definition pci.c:241
static void pci_set_drvdata(struct pci_device *pci, void *priv)
Set PCI driver-private data.
Definition pci.h:366
Host information.
Definition ena.h:226
A network device.
Definition netdevice.h:353
struct device dev
Generic device.
Definition pci.h:213
const char product_short_name[]
Product short name string.
Definition version.c:77
const char product_name[]
Product name string.
Definition version.c:74
const char product_version[]
Product version string.
Definition version.c:71
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition vsprintf.c:383

References ena_nic::acq, adjust_pci_device(), alloc_etherdev(), pci_device::busdevfn, cpu_to_le16, cpu_to_le32, ena_qp::cq, ena_cq::cqe, DBGC, DBGC2, DBGC2_HDA, pci_device::dev, ENA_ACQ_PHASE, ena_create_admin(), ena_create_async(), ena_destroy_admin(), ena_destroy_async(), ENA_FEATURE_LLQ, ena_get_device_attributes(), ENA_HOST_INFO_SPEC_2_0, ENA_HOST_INFO_TYPE_IPXE, ENA_HOST_INFO_VERSION_WTF, ena_llq_config(), ena_membases(), ena_operations, ENA_REGS_SIZE, ena_reset(), ENA_RX_COUNT, ena_set_host_attributes(), ENA_SQ_RX, ENA_SQ_TX, ENA_TX_COUNT, ENODEV, ENOMEM, ena_nic::features, free_phys(), ena_nic::info, info, iounmap(), malloc_phys(), ena_nic::mem, pci_device::membase, memset(), netdev, netdev_init(), netdev_link_up(), netdev_nullify(), netdev_put(), PAGE_SIZE, pci_ioremap(), pci_set_drvdata(), ena_acq::phase, product_name, product_short_name, product_version, rc, register_netdev(), ena_nic::regs, ena_cq::rx, ena_nic::rx, ena_sq::rx, ena_nic::rx_ids, snprintf(), ena_qp::sq, ena_sq::sqe, ena_cq::tx, ena_nic::tx, ena_sq::tx, ena_nic::tx_ids, and unregister_netdev().

◆ ena_remove()

void ena_remove ( struct pci_device * pci)
static

Remove PCI device.

Parameters
pciPCI device

Definition at line 1483 of file ena.c.

1483 {
1484 struct net_device *netdev = pci_get_drvdata ( pci );
1485 struct ena_nic *ena = netdev->priv;
1486
1487 /* Unregister network device */
1489
1490 /* Destroy async event notification queue */
1491 ena_destroy_async ( ena );
1492
1493 /* Destroy admin queues */
1494 ena_destroy_admin ( ena );
1495
1496 /* Reset card */
1497 ena_reset ( ena );
1498
1499 /* Free host info */
1500 free_phys ( ena->info, PAGE_SIZE );
1501
1502 /* Unmap registers and on-device memory */
1503 if ( ena->mem )
1504 iounmap ( ena->mem );
1505 iounmap ( ena->regs );
1506
1507 /* Free network device */
1509 netdev_put ( netdev );
1510}
static void * pci_get_drvdata(struct pci_device *pci)
Get PCI driver-private data.
Definition pci.h:376

References ena_destroy_admin(), ena_destroy_async(), ena_reset(), free_phys(), ena_nic::info, iounmap(), ena_nic::mem, netdev, netdev_nullify(), netdev_put(), PAGE_SIZE, pci_get_drvdata(), ena_nic::regs, and unregister_netdev().

Variable Documentation

◆ ena_operations

struct net_device_operations ena_operations
static
Initial value:
= {
.open = ena_open,
.close = ena_close,
.transmit = ena_transmit,
.poll = ena_poll,
}
static int ena_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
Definition ena.c:1066
static int ena_open(struct net_device *netdev)
Open network device.
Definition ena.c:1011
static void ena_poll(struct net_device *netdev)
Poll for completed and received packets.
Definition ena.c:1247
static void ena_close(struct net_device *netdev)
Close network device.
Definition ena.c:1040

ENA network device operations.

Definition at line 1260 of file ena.c.

1260 {
1261 .open = ena_open,
1262 .close = ena_close,
1263 .transmit = ena_transmit,
1264 .poll = ena_poll,
1265};

Referenced by ena_probe().

◆ ena_nics

struct pci_device_id ena_nics[]
static
Initial value:
= {
PCI_ROM ( 0x1d0f, 0xec20, "ena-vf", "ENA VF", 0 ),
PCI_ROM ( 0x1d0f, 0xec21, "ena-vf-llq", "ENA VF (LLQ)", 0 ),
}
#define PCI_ROM(_vendor, _device, _name, _description, _data)
Definition pci.h:308

ENA PCI device IDs.

Definition at line 1513 of file ena.c.

1513 {
1514 PCI_ROM ( 0x1d0f, 0xec20, "ena-vf", "ENA VF", 0 ),
1515 PCI_ROM ( 0x1d0f, 0xec21, "ena-vf-llq", "ENA VF (LLQ)", 0 ),
1516};

◆ __pci_driver

struct pci_driver ena_driver __pci_driver
Initial value:
= {
.ids = ena_nics,
.id_count = ( sizeof ( ena_nics ) / sizeof ( ena_nics[0] ) ),
.probe = ena_probe,
}
static void ena_remove(struct pci_device *pci)
Remove PCI device.
Definition ena.c:1483
static int ena_probe(struct pci_device *pci)
Probe PCI device.
Definition ena.c:1342
static struct pci_device_id ena_nics[]
ENA PCI device IDs.
Definition ena.c:1513
static struct xen_remove_from_physmap * remove
Definition xenmem.h:40

ENA PCI driver.

Definition at line 1519 of file ena.c.

1519 {
1520 .ids = ena_nics,
1521 .id_count = ( sizeof ( ena_nics ) / sizeof ( ena_nics[0] ) ),
1522 .probe = ena_probe,
1523 .remove = ena_remove,
1524};