iPXE
Data Structures | Macros | Functions
efx_hunt.h File Reference
#include "efx_common.h"

Go to the source code of this file.

Data Structures

struct  efx_mcdi_req_s
 MCDI request structure. More...
 

Macros

#define EFX_EV_SIZE(_nevs)   ((_nevs) * sizeof(efx_qword_t))
 
#define EFX_EVQ_NBUFS(_nevs)   (EFX_EV_SIZE(_nevs) / EFX_BUF_ALIGN)
 
#define EFX_RXQ_SIZE(_ndescs)   ((_ndescs) * sizeof(efx_qword_t))
 
#define EFX_RXQ_NBUFS(_ndescs)   (EFX_RXQ_SIZE(_ndescs) / EFX_BUF_ALIGN)
 
#define EFX_TXQ_SIZE(_ndescs)   ((_ndescs) * sizeof(efx_qword_t))
 
#define EFX_TXQ_NBUFS(_ndescs)   (EFX_TXQ_SIZE(_ndescs) / EFX_BUF_ALIGN)
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
void efx_hunt_free_special_buffer (void *buf, int bytes)
 
int efx_hunt_transmit (struct net_device *netdev, struct io_buffer *iob)
 
void efx_hunt_poll (struct net_device *netdev)
 
void efx_hunt_irq (struct net_device *netdev, int enable)
 
int efx_hunt_ev_init (struct net_device *netdev, dma_addr_t *dma_addr)
 
int efx_hunt_rx_init (struct net_device *netdev, dma_addr_t *dma_addr)
 
int efx_hunt_tx_init (struct net_device *netdev, dma_addr_t *dma_addr)
 
int efx_hunt_open (struct net_device *netdev)
 
void efx_hunt_close (struct net_device *netdev)
 

Macro Definition Documentation

◆ EFX_EV_SIZE

#define EFX_EV_SIZE (   _nevs)    ((_nevs) * sizeof(efx_qword_t))

Definition at line 33 of file efx_hunt.h.

◆ EFX_EVQ_NBUFS

#define EFX_EVQ_NBUFS (   _nevs)    (EFX_EV_SIZE(_nevs) / EFX_BUF_ALIGN)

Definition at line 34 of file efx_hunt.h.

◆ EFX_RXQ_SIZE

#define EFX_RXQ_SIZE (   _ndescs)    ((_ndescs) * sizeof(efx_qword_t))

Definition at line 36 of file efx_hunt.h.

◆ EFX_RXQ_NBUFS

#define EFX_RXQ_NBUFS (   _ndescs)    (EFX_RXQ_SIZE(_ndescs) / EFX_BUF_ALIGN)

Definition at line 37 of file efx_hunt.h.

◆ EFX_TXQ_SIZE

#define EFX_TXQ_SIZE (   _ndescs)    ((_ndescs) * sizeof(efx_qword_t))

Definition at line 39 of file efx_hunt.h.

◆ EFX_TXQ_NBUFS

#define EFX_TXQ_NBUFS (   _ndescs)    (EFX_TXQ_SIZE(_ndescs) / EFX_BUF_ALIGN)

Definition at line 40 of file efx_hunt.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ efx_hunt_free_special_buffer()

void efx_hunt_free_special_buffer ( void *  buf,
int  bytes 
)

Definition at line 38 of file efx_hunt.c.

39 {
40  free_dma(buf, bytes);
41 }
struct io_buffer * buf[EFX_TXD_SIZE]
Definition: efx_common.h:94
uint8_t bytes[64]
Definition: ib_mad.h:16
static void free_dma(void *ptr, size_t size)
Free memory allocated with malloc_dma()
Definition: malloc.h:81

References bytes, and free_dma().

Referenced by hunt_ev_fini(), hunt_rx_fini(), and hunt_tx_fini().

◆ efx_hunt_transmit()

int efx_hunt_transmit ( struct net_device netdev,
struct io_buffer iob 
)

Definition at line 100 of file efx_hunt.c.

101 {
102  struct efx_nic *efx = netdev_priv(netdev);
103  struct efx_tx_queue *txq = &efx->txq;
104  int fill_level, space;
106  int buf_id;
107 
108  fill_level = txq->write_ptr - txq->read_ptr;
109  space = EFX_TXD_SIZE - fill_level - 1;
110  if (space < 1)
111  return -ENOBUFS;
112 
113  /* Save the iobuffer for later completion */
114  buf_id = txq->write_ptr & EFX_TXD_MASK;
115  assert(txq->buf[buf_id] == NULL);
116  txq->buf[buf_id] = iob;
117 
118  DBGCIO(efx, "tx_buf[%d] for iob %p data %p len %zd\n",
119  buf_id, iob, iob->data, iob_len(iob));
120 
121  /* Form the descriptor, and push it to hardware */
122  txd = txq->ring + buf_id;
124  ++txq->write_ptr;
126 
127  return 0;
128 }
static void * netdev_priv(struct net_device *netdev)
Get driver private area for this network device.
Definition: netdevice.h:566
#define EFX_TXD_MASK
Definition: efx_common.h:59
Hardware access.
Definition: efx_common.h:147
A transmit queue.
Definition: efx_common.h:89
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
efx_tx_desc_t * ring
Definition: efx_common.h:91
static void efx_hunt_build_tx_desc(efx_tx_desc_t *txd, struct io_buffer *iob)
Definition: efx_hunt.c:75
static struct net_device * netdev
Definition: gdbudp.c:52
unsigned int read_ptr
Definition: efx_common.h:103
unsigned int write_ptr
Definition: efx_common.h:100
#define txd
Definition: davicom.c:143
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:151
#define DBGCIO(...)
Definition: compiler.h:556
#define ENOBUFS
No buffer space available.
Definition: errno.h:498
struct efx_tx_queue txq
Definition: efx_common.h:165
void * data
Start of data.
Definition: iobuf.h:44
struct io_buffer * buf[EFX_TXD_SIZE]
Definition: efx_common.h:94
#define EFX_TXD_SIZE
Definition: efx_common.h:58
static void efx_hunt_notify_tx_desc(struct efx_nic *efx)
Definition: efx_hunt.c:89
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
A quadword (8 byte) datatype - little-endian in HW.
Definition: efx_bitfield.h:92

References assert(), efx_tx_queue::buf, io_buffer::data, DBGCIO, efx_hunt_build_tx_desc(), efx_hunt_notify_tx_desc(), EFX_TXD_MASK, EFX_TXD_SIZE, ENOBUFS, iob_len(), netdev, netdev_priv(), NULL, efx_tx_queue::read_ptr, efx_tx_queue::ring, txd, efx_nic::txq, and efx_tx_queue::write_ptr.

◆ efx_hunt_poll()

void efx_hunt_poll ( struct net_device netdev)

Definition at line 404 of file efx_hunt.c.

405 {
406  struct efx_nic *efx = netdev_priv(netdev);
407  struct efx_ev_queue *evq = &efx->evq;
408  efx_event_t *evt;
409  int budget = 10;
410 
411  /* Read the event queue by directly looking for events
412  * (we don't even bother to read the eventq write ptr)
413  */
414  evt = evq->ring + evq->read_ptr;
415  while (efx_hunt_event_present(evt) && (budget > 0)) {
416  DBGCP(efx, "Event at index 0x%x address %p is "
417  EFX_QWORD_FMT "\n", evq->read_ptr,
418  evt, EFX_QWORD_VAL(*evt));
419 
420  budget -= efx_hunt_handle_event(efx, evt);
421 
422  /* Clear the event */
423  EFX_SET_QWORD(*evt);
424 
425  /* Move to the next event. We don't ack the event
426  * queue until the end
427  */
428  evq->read_ptr = ((evq->read_ptr + 1) & EFX_EVQ_MASK);
429  evt = evq->ring + evq->read_ptr;
430  }
431 
432  /* Push more rx buffers if needed */
433  efx_hunt_rxq_fill(efx);
434 
435  /* Clear any pending interrupts */
437 
438  /* Ack the event queue if interrupts are enabled */
439  if (efx->int_en)
441 }
static void * netdev_priv(struct net_device *netdev)
Get driver private area for this network device.
Definition: netdevice.h:566
static int efx_hunt_event_present(efx_event_t *event)
See if an event is present.
Definition: efx_hunt.c:336
Hardware access.
Definition: efx_common.h:147
#define EFX_EVQ_MASK
Definition: efx_common.h:61
static void efx_hunt_rxq_fill(struct efx_nic *efx)
Definition: efx_hunt.c:201
int int_en
INT_REG_KER.
Definition: efx_common.h:171
#define EFX_SET_QWORD(qword)
Definition: efx_bitfield.h:400
static void efx_hunt_clear_interrupts(struct efx_nic *efx)
Definition: efx_hunt.c:313
static struct net_device * netdev
Definition: gdbudp.c:52
#define EFX_QWORD_VAL(qword)
Definition: efx_bitfield.h:112
efx_event_t * ring
Definition: efx_common.h:132
struct efx_ev_queue evq
Definition: efx_common.h:166
#define EFX_QWORD_FMT
Definition: efx_bitfield.h:108
static unsigned int efx_hunt_handle_event(struct efx_nic *efx, efx_event_t *evt)
Definition: efx_hunt.c:366
#define DBGCP(...)
Definition: compiler.h:539
An event queue.
Definition: efx_common.h:128
unsigned int read_ptr
Definition: efx_common.h:138
static void efx_hunt_evq_read_ack(struct efx_nic *efx)
Definition: efx_hunt.c:343
A quadword (8 byte) datatype - little-endian in HW.
Definition: efx_bitfield.h:92

References DBGCP, EFX_EVQ_MASK, efx_hunt_clear_interrupts(), efx_hunt_event_present(), efx_hunt_evq_read_ack(), efx_hunt_handle_event(), efx_hunt_rxq_fill(), EFX_QWORD_FMT, EFX_QWORD_VAL, EFX_SET_QWORD, efx_nic::evq, efx_nic::int_en, netdev, netdev_priv(), efx_ev_queue::read_ptr, and efx_ev_queue::ring.

Referenced by hunt_poll().

◆ efx_hunt_irq()

void efx_hunt_irq ( struct net_device netdev,
int  enable 
)

Definition at line 443 of file efx_hunt.c.

444 {
445  struct efx_nic *efx = netdev_priv(netdev);
446 
447  efx->int_en = enable;
448 
449  /* If interrupts are enabled, prime the event queue. Otherwise ack any
450  * pending interrupts
451  */
452  if (enable)
454  else if (efx->netdev->state & NETDEV_OPEN)
456 }
static void * netdev_priv(struct net_device *netdev)
Get driver private area for this network device.
Definition: netdevice.h:566
Hardware access.
Definition: efx_common.h:147
#define NETDEV_OPEN
Network device is open.
Definition: netdevice.h:432
unsigned int state
Current device state.
Definition: netdevice.h:389
int int_en
INT_REG_KER.
Definition: efx_common.h:171
static void efx_hunt_clear_interrupts(struct efx_nic *efx)
Definition: efx_hunt.c:313
static struct net_device * netdev
Definition: gdbudp.c:52
static void efx_hunt_evq_read_ack(struct efx_nic *efx)
Definition: efx_hunt.c:343
struct net_device * netdev
Definition: efx_common.h:148

References efx_hunt_clear_interrupts(), efx_hunt_evq_read_ack(), efx_nic::int_en, netdev, efx_nic::netdev, NETDEV_OPEN, netdev_priv(), and net_device::state.

◆ efx_hunt_ev_init()

int efx_hunt_ev_init ( struct net_device netdev,
dma_addr_t dma_addr 
)

Definition at line 294 of file efx_hunt.c.

295 {
296  struct efx_nic *efx = netdev_priv(netdev);
297  struct efx_ev_queue *evq = &efx->evq;
298  size_t bytes;
299 
300  /* Allocate the hardware event queue */
301  bytes = sizeof(efx_event_t) * EFX_EVQ_SIZE;
303  if (evq->ring == NULL)
304  return -ENOMEM;
305 
306  memset(evq->ring, 0xff, bytes);
307  evq->read_ptr = 0;
308  *dma_addr = evq->entry.dma_addr;
309  return 0;
310 }
static void * netdev_priv(struct net_device *netdev)
Get driver private area for this network device.
Definition: netdevice.h:566
dma_addr_t dma_addr
Definition: efx_common.h:84
Hardware access.
Definition: efx_common.h:147
#define EFX_EVQ_SIZE
Definition: efx_common.h:60
#define ENOMEM
Not enough space.
Definition: errno.h:534
static struct net_device * netdev
Definition: gdbudp.c:52
struct efx_special_buffer entry
Definition: efx_common.h:135
efx_qword_t efx_event_t
Definition: efx_common.h:53
efx_event_t * ring
Definition: efx_common.h:132
struct efx_ev_queue evq
Definition: efx_common.h:166
An event queue.
Definition: efx_common.h:128
static void * efx_hunt_alloc_special_buffer(int bytes, struct efx_special_buffer *entry)
Definition: efx_hunt.c:43
unsigned int read_ptr
Definition: efx_common.h:138
uint8_t bytes[64]
Definition: ib_mad.h:16
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
void * memset(void *dest, int character, size_t len) __nonnull

References bytes, efx_special_buffer::dma_addr, EFX_EVQ_SIZE, efx_hunt_alloc_special_buffer(), ENOMEM, efx_ev_queue::entry, efx_nic::evq, memset(), netdev, netdev_priv(), NULL, efx_ev_queue::read_ptr, and efx_ev_queue::ring.

Referenced by hunt_ev_init().

◆ efx_hunt_rx_init()

int efx_hunt_rx_init ( struct net_device netdev,
dma_addr_t dma_addr 
)

Definition at line 270 of file efx_hunt.c.

271 {
272  struct efx_nic *efx = netdev_priv(netdev);
273  struct efx_rx_queue *rxq = &efx->rxq;
274  size_t bytes;
275 
276  /* Allocate hardware receive queue */
277  bytes = sizeof(efx_rx_desc_t) * EFX_RXD_SIZE;
279  if (rxq->ring == NULL)
280  return -ENOMEM;
281 
282  rxq->read_ptr = rxq->write_ptr = 0;
283  *dma_addr = rxq->entry.dma_addr;
284  return 0;
285 }
static void * netdev_priv(struct net_device *netdev)
Get driver private area for this network device.
Definition: netdevice.h:566
struct efx_special_buffer entry
Definition: efx_common.h:115
dma_addr_t dma_addr
Definition: efx_common.h:84
Hardware access.
Definition: efx_common.h:147
A receive queue.
Definition: efx_common.h:107
unsigned int read_ptr
Definition: efx_common.h:121
efx_rx_desc_t * ring
Definition: efx_common.h:109
#define ENOMEM
Not enough space.
Definition: errno.h:534
static struct net_device * netdev
Definition: gdbudp.c:52
#define EFX_RXD_SIZE
Definition: efx_common.h:56
struct efx_rx_queue rxq
Definition: efx_common.h:164
efx_qword_t efx_rx_desc_t
Definition: efx_common.h:51
unsigned int write_ptr
Definition: efx_common.h:118
static void * efx_hunt_alloc_special_buffer(int bytes, struct efx_special_buffer *entry)
Definition: efx_hunt.c:43
uint8_t bytes[64]
Definition: ib_mad.h:16
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References bytes, efx_special_buffer::dma_addr, efx_hunt_alloc_special_buffer(), EFX_RXD_SIZE, ENOMEM, efx_rx_queue::entry, netdev, netdev_priv(), NULL, efx_rx_queue::read_ptr, efx_rx_queue::ring, efx_nic::rxq, and efx_rx_queue::write_ptr.

Referenced by hunt_rx_init().

◆ efx_hunt_tx_init()

int efx_hunt_tx_init ( struct net_device netdev,
dma_addr_t dma_addr 
)

Definition at line 155 of file efx_hunt.c.

156 {
157  struct efx_nic *efx = netdev_priv(netdev);
158  struct efx_tx_queue *txq = &efx->txq;
159  size_t bytes;
160 
161  /* Allocate hardware transmit queue */
162  bytes = sizeof(efx_tx_desc_t) * EFX_TXD_SIZE;
164  if (!txq->ring)
165  return -ENOMEM;
166 
167  txq->read_ptr = txq->write_ptr = 0;
168  *dma_addr = txq->entry.dma_addr;
169  return 0;
170 }
static void * netdev_priv(struct net_device *netdev)
Get driver private area for this network device.
Definition: netdevice.h:566
dma_addr_t dma_addr
Definition: efx_common.h:84
Hardware access.
Definition: efx_common.h:147
A transmit queue.
Definition: efx_common.h:89
#define ENOMEM
Not enough space.
Definition: errno.h:534
efx_tx_desc_t * ring
Definition: efx_common.h:91
static struct net_device * netdev
Definition: gdbudp.c:52
efx_qword_t efx_tx_desc_t
Definition: efx_common.h:52
unsigned int read_ptr
Definition: efx_common.h:103
unsigned int write_ptr
Definition: efx_common.h:100
struct efx_tx_queue txq
Definition: efx_common.h:165
#define EFX_TXD_SIZE
Definition: efx_common.h:58
struct efx_special_buffer entry
Definition: efx_common.h:97
static void * efx_hunt_alloc_special_buffer(int bytes, struct efx_special_buffer *entry)
Definition: efx_hunt.c:43
uint8_t bytes[64]
Definition: ib_mad.h:16

References bytes, efx_special_buffer::dma_addr, efx_hunt_alloc_special_buffer(), EFX_TXD_SIZE, ENOMEM, efx_tx_queue::entry, netdev, netdev_priv(), efx_tx_queue::read_ptr, efx_tx_queue::ring, efx_nic::txq, and efx_tx_queue::write_ptr.

Referenced by hunt_tx_init().

◆ efx_hunt_open()

int efx_hunt_open ( struct net_device netdev)

Definition at line 465 of file efx_hunt.c.

466 {
467  struct efx_nic *efx = netdev_priv(netdev);
469 
470  /* Set interrupt moderation to 0*/
472  ERF_DZ_TC_TIMER_MODE, 0,
473  ERF_DZ_TC_TIMER_VAL, 0);
474  efx_writel_page(efx, &cmd, 0, ER_DZ_EVQ_TMR);
475 
476  /* Ack the eventq */
477  if (efx->int_en)
479 
480  /* Push receive buffers */
481  efx_hunt_rxq_fill(efx);
482 
483  return 0;
484 }
static void * netdev_priv(struct net_device *netdev)
Get driver private area for this network device.
Definition: netdevice.h:566
Hardware access.
Definition: efx_common.h:147
#define ER_DZ_EVQ_TMR
Definition: ef10_regs.h:89
static void efx_hunt_rxq_fill(struct efx_nic *efx)
Definition: efx_hunt.c:201
#define efx_writel_page(efx, value, index, reg)
Definition: efx_common.h:219
A doubleword (4 byte) datatype - little-endian in HW.
Definition: efx_bitfield.h:87
int int_en
INT_REG_KER.
Definition: efx_common.h:171
static struct net_device * netdev
Definition: gdbudp.c:52
#define EFX_POPULATE_DWORD_2(dword,...)
Definition: efx_bitfield.h:421
static void efx_hunt_evq_read_ack(struct efx_nic *efx)
Definition: efx_hunt.c:343
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29

References cmd, efx_hunt_evq_read_ack(), efx_hunt_rxq_fill(), EFX_POPULATE_DWORD_2, efx_writel_page, ER_DZ_EVQ_TMR, efx_nic::int_en, netdev, and netdev_priv().

Referenced by hunt_open().

◆ efx_hunt_close()

void efx_hunt_close ( struct net_device netdev)

Definition at line 486 of file efx_hunt.c.

487 {
488  struct efx_nic *efx = netdev_priv(netdev);
489  struct efx_rx_queue *rxq = &efx->rxq;
490  struct efx_tx_queue *txq = &efx->txq;
491  int i;
492 
493  /* Complete outstanding descriptors */
494  for (i = 0; i < EFX_NUM_RX_DESC; i++) {
495  if (rxq->buf[i]) {
496  free_iob(rxq->buf[i]);
497  rxq->buf[i] = NULL;
498  }
499  }
500 
501  for (i = 0; i < EFX_TXD_SIZE; i++) {
502  if (txq->buf[i]) {
503  netdev_tx_complete(efx->netdev, txq->buf[i]);
504  txq->buf[i] = NULL;
505  }
506  }
507 
508  /* Clear interrupts */
510 }
static void * netdev_priv(struct net_device *netdev)
Get driver private area for this network device.
Definition: netdevice.h:566
static void netdev_tx_complete(struct net_device *netdev, struct io_buffer *iobuf)
Complete network transmission.
Definition: netdevice.h:746
Hardware access.
Definition: efx_common.h:147
A transmit queue.
Definition: efx_common.h:89
A receive queue.
Definition: efx_common.h:107
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:145
static void efx_hunt_clear_interrupts(struct efx_nic *efx)
Definition: efx_hunt.c:313
static struct net_device * netdev
Definition: gdbudp.c:52
#define EFX_NUM_RX_DESC
Definition: efx_common.h:68
struct efx_rx_queue rxq
Definition: efx_common.h:164
struct efx_tx_queue txq
Definition: efx_common.h:165
struct io_buffer * buf[EFX_TXD_SIZE]
Definition: efx_common.h:94
#define EFX_TXD_SIZE
Definition: efx_common.h:58
struct io_buffer * buf[EFX_NUM_RX_DESC]
Definition: efx_common.h:112
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
struct net_device * netdev
Definition: efx_common.h:148

References efx_tx_queue::buf, efx_rx_queue::buf, efx_hunt_clear_interrupts(), EFX_NUM_RX_DESC, EFX_TXD_SIZE, free_iob(), netdev, efx_nic::netdev, netdev_priv(), netdev_tx_complete(), NULL, efx_nic::rxq, and efx_nic::txq.

Referenced by hunt_close(), and hunt_open().