iPXE
Functions
efx_hunt.c File Reference
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <assert.h>
#include <byteswap.h>
#include <ipxe/io.h>
#include <ipxe/pci.h>
#include <ipxe/malloc.h>
#include <ipxe/iobuf.h>
#include <ipxe/netdevice.h>
#include "efx_hunt.h"
#include "efx_bitfield.h"
#include "ef10_regs.h"

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
void efx_hunt_free_special_buffer (void *buf, int bytes)
 
static void * efx_hunt_alloc_special_buffer (int bytes, struct efx_special_buffer *entry)
 
static void efx_hunt_build_tx_desc (efx_tx_desc_t *txd, struct io_buffer *iob)
 
static void efx_hunt_notify_tx_desc (struct efx_nic *efx)
 
int efx_hunt_transmit (struct net_device *netdev, struct io_buffer *iob)
 
static void efx_hunt_transmit_done (struct efx_nic *efx, int id)
 
int efx_hunt_tx_init (struct net_device *netdev, dma_addr_t *dma_addr)
 
static void efx_hunt_build_rx_desc (efx_rx_desc_t *rxd, struct io_buffer *iob)
 
static void efx_hunt_notify_rx_desc (struct efx_nic *efx)
 
static void efx_hunt_rxq_fill (struct efx_nic *efx)
 
static void efx_hunt_receive (struct efx_nic *efx, unsigned int id, int len, int drop)
 
int efx_hunt_rx_init (struct net_device *netdev, dma_addr_t *dma_addr)
 
int efx_hunt_ev_init (struct net_device *netdev, dma_addr_t *dma_addr)
 
static void efx_hunt_clear_interrupts (struct efx_nic *efx)
 
static int efx_hunt_event_present (efx_event_t *event)
 See if an event is present. More...
 
static void efx_hunt_evq_read_ack (struct efx_nic *efx)
 
static unsigned int efx_hunt_handle_event (struct efx_nic *efx, efx_event_t *evt)
 
void efx_hunt_poll (struct net_device *netdev)
 
void efx_hunt_irq (struct net_device *netdev, int enable)
 
int efx_hunt_open (struct net_device *netdev)
 
void efx_hunt_close (struct net_device *netdev)
 

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 39 of file efx_hunt.c.

40 {
41  free_phys(buf, bytes);
42 }
static void free_phys(void *ptr, size_t size)
Free memory allocated with malloc_phys()
Definition: malloc.h:77
uint8_t bytes[64]
Definition: ib_mad.h:16

References bytes, and free_phys().

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

◆ efx_hunt_alloc_special_buffer()

static void* efx_hunt_alloc_special_buffer ( int  bytes,
struct efx_special_buffer entry 
)
static

Definition at line 44 of file efx_hunt.c.

46 {
47  void *buffer;
48  dma_addr_t dma_addr;
49 
50  /* Allocate the buffer, aligned on a buffer address boundary. This
51  * buffer will be passed into an MC_CMD_INIT_*Q command to setup the
52  * appropriate type of queue via MCDI.
53  */
55  if (!buffer)
56  return NULL;
57 
58  entry->dma_addr = dma_addr = virt_to_bus(buffer);
59  assert((dma_addr & (EFX_BUF_ALIGN - 1)) == 0);
60 
61  /* Buffer table entries aren't allocated, so set id to zero */
62  entry->id = 0;
63  DBGP("Allocated 0x%x bytes at %p\n", bytes, buffer);
64 
65  return buffer;
66 }
static void *__malloc malloc_phys(size_t size, size_t phys_align)
Allocate memory with specified physical alignment.
Definition: malloc.h:62
unsigned long dma_addr_t
Definition: bnx2.h:20
uint32_t buffer
Buffer index (or NETVSC_RNDIS_NO_BUFFER)
Definition: netvsc.h:16
static __always_inline unsigned long virt_to_bus(volatile const void *addr)
Convert virtual address to a bus address.
Definition: io.h:183
#define DBGP(...)
Definition: compiler.h:532
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
union aes_table_entry entry[256]
Table entries, indexed by S(N)
Definition: aes.c:26
#define EFX_BUF_ALIGN
Definition: efx_common.h:55
uint8_t bytes[64]
Definition: ib_mad.h:16
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References assert(), buffer, bytes, DBGP, EFX_BUF_ALIGN, entry, malloc_phys(), NULL, and virt_to_bus().

Referenced by efx_hunt_ev_init(), efx_hunt_rx_init(), and efx_hunt_tx_init().

◆ efx_hunt_build_tx_desc()

static void efx_hunt_build_tx_desc ( efx_tx_desc_t txd,
struct io_buffer iob 
)
static

Definition at line 76 of file efx_hunt.c.

77 {
78  dma_addr_t dma_addr;
79 
80  dma_addr = virt_to_bus(iob->data);
81 
83  ESF_DZ_TX_KER_TYPE, 0,
84  ESF_DZ_TX_KER_CONT, 0,
85  ESF_DZ_TX_KER_BYTE_CNT, iob_len(iob),
86  ESF_DZ_TX_KER_BUF_ADDR, dma_addr);
87 }
unsigned long dma_addr_t
Definition: bnx2.h:20
#define EFX_POPULATE_QWORD_4(qword,...)
Definition: efx_bitfield.h:390
static __always_inline unsigned long virt_to_bus(volatile const void *addr)
Convert virtual address to a bus address.
Definition: io.h:183
#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:155
void * data
Start of data.
Definition: iobuf.h:48

References io_buffer::data, EFX_POPULATE_QWORD_4, iob_len(), txd, and virt_to_bus().

Referenced by efx_hunt_transmit().

◆ efx_hunt_notify_tx_desc()

static void efx_hunt_notify_tx_desc ( struct efx_nic efx)
static

Definition at line 90 of file efx_hunt.c.

91 {
92  struct efx_tx_queue *txq = &efx->txq;
93  int ptr = txq->write_ptr & EFX_TXD_MASK;
95 
96  EFX_POPULATE_DWORD_1(reg, ERF_DZ_TX_DESC_WPTR_DWORD, ptr);
98 }
#define EFX_TXD_MASK
Definition: efx_common.h:59
static unsigned int unsigned int reg
Definition: myson.h:162
A transmit queue.
Definition: efx_common.h:89
#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
unsigned int write_ptr
Definition: efx_common.h:100
#define EFX_POPULATE_DWORD_1(dword,...)
Definition: efx_bitfield.h:423
#define ER_DZ_TX_DESC_UPD_DWORD
Definition: ef10_regs.h:325
struct efx_tx_queue txq
Definition: efx_common.h:165

References EFX_POPULATE_DWORD_1, EFX_TXD_MASK, efx_writel_page, ER_DZ_TX_DESC_UPD_DWORD, reg, efx_nic::txq, and efx_tx_queue::write_ptr.

Referenced by efx_hunt_transmit().

◆ efx_hunt_transmit()

int efx_hunt_transmit ( struct net_device netdev,
struct io_buffer iob 
)

Definition at line 101 of file efx_hunt.c.

102 {
103  struct efx_nic *efx = netdev->priv;
104  struct efx_tx_queue *txq = &efx->txq;
105  int fill_level, space;
107  int buf_id;
108 
109  fill_level = txq->write_ptr - txq->read_ptr;
110  space = EFX_TXD_SIZE - fill_level - 1;
111  if (space < 1)
112  return -ENOBUFS;
113 
114  /* Save the iobuffer for later completion */
115  buf_id = txq->write_ptr & EFX_TXD_MASK;
116  assert(txq->buf[buf_id] == NULL);
117  txq->buf[buf_id] = iob;
118 
119  DBGCIO(efx, "tx_buf[%d] for iob %p data %p len %zd\n",
120  buf_id, iob, iob->data, iob_len(iob));
121 
122  /* Form the descriptor, and push it to hardware */
123  txd = txq->ring + buf_id;
125  ++txq->write_ptr;
127 
128  return 0;
129 }
#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
void * priv
Driver private data.
Definition: netdevice.h:431
static void efx_hunt_build_tx_desc(efx_tx_desc_t *txd, struct io_buffer *iob)
Definition: efx_hunt.c:76
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:155
#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:48
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:90
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
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, NULL, net_device::priv, efx_tx_queue::read_ptr, efx_tx_queue::ring, txd, efx_nic::txq, and efx_tx_queue::write_ptr.

◆ efx_hunt_transmit_done()

static void efx_hunt_transmit_done ( struct efx_nic efx,
int  id 
)
static

Definition at line 132 of file efx_hunt.c.

133 {
134  struct efx_tx_queue *txq = &efx->txq;
135  unsigned int read_ptr, stop;
136 
137  /* Complete all buffers from read_ptr up to and including id */
138  read_ptr = txq->read_ptr & EFX_TXD_MASK;
139  stop = (id + 1) & EFX_TXD_MASK;
140 
141  while (read_ptr != stop) {
142  struct io_buffer *iob = txq->buf[read_ptr];
143 
144  assert(iob);
145  /* Complete the tx buffer */
146  if (iob)
147  netdev_tx_complete(efx->netdev, iob);
148  DBGCIO(efx, "tx_buf[%d] for iob %p done\n", read_ptr, iob);
149  txq->buf[read_ptr] = NULL;
150 
151  ++txq->read_ptr;
152  read_ptr = txq->read_ptr & EFX_TXD_MASK;
153  }
154 }
static void netdev_tx_complete(struct net_device *netdev, struct io_buffer *iobuf)
Complete network transmission.
Definition: netdevice.h:752
#define EFX_TXD_MASK
Definition: efx_common.h:59
A transmit queue.
Definition: efx_common.h:89
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
unsigned int read_ptr
Definition: efx_common.h:103
#define DBGCIO(...)
Definition: compiler.h:556
struct efx_tx_queue txq
Definition: efx_common.h:165
struct io_buffer * buf[EFX_TXD_SIZE]
Definition: efx_common.h:94
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
struct net_device * netdev
Definition: efx_common.h:148
A persistent I/O buffer.
Definition: iobuf.h:33

References assert(), efx_tx_queue::buf, DBGCIO, EFX_TXD_MASK, efx_nic::netdev, netdev_tx_complete(), NULL, efx_tx_queue::read_ptr, and efx_nic::txq.

Referenced by efx_hunt_handle_event().

◆ efx_hunt_tx_init()

int efx_hunt_tx_init ( struct net_device netdev,
dma_addr_t dma_addr 
)

Definition at line 156 of file efx_hunt.c.

157 {
158  struct efx_nic *efx = netdev->priv;
159  struct efx_tx_queue *txq = &efx->txq;
160  size_t bytes;
161 
162  /* Allocate hardware transmit queue */
163  bytes = sizeof(efx_tx_desc_t) * EFX_TXD_SIZE;
165  if (!txq->ring)
166  return -ENOMEM;
167 
168  txq->read_ptr = txq->write_ptr = 0;
169  *dma_addr = txq->entry.dma_addr;
170  return 0;
171 }
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
void * priv
Driver private data.
Definition: netdevice.h:431
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:44
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, net_device::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_build_rx_desc()

static void efx_hunt_build_rx_desc ( efx_rx_desc_t rxd,
struct io_buffer iob 
)
static

Definition at line 181 of file efx_hunt.c.

182 {
183  dma_addr_t dma_addr = virt_to_bus(iob->data);
184 
186  ESF_DZ_RX_KER_BYTE_CNT, EFX_RX_BUF_SIZE,
187  ESF_DZ_RX_KER_BUF_ADDR, dma_addr);
188 }
unsigned long dma_addr_t
Definition: bnx2.h:20
static __always_inline unsigned long virt_to_bus(volatile const void *addr)
Convert virtual address to a bus address.
Definition: io.h:183
#define EFX_POPULATE_QWORD_2(qword,...)
Definition: efx_bitfield.h:394
#define EFX_RX_BUF_SIZE
Definition: efx_common.h:74
void * data
Start of data.
Definition: iobuf.h:48
#define rxd
Definition: davicom.c:145

References io_buffer::data, EFX_POPULATE_QWORD_2, EFX_RX_BUF_SIZE, rxd, and virt_to_bus().

Referenced by efx_hunt_rxq_fill().

◆ efx_hunt_notify_rx_desc()

static void efx_hunt_notify_rx_desc ( struct efx_nic efx)
static

Definition at line 191 of file efx_hunt.c.

192 {
193  struct efx_rx_queue *rxq = &efx->rxq;
194  int ptr = rxq->write_ptr & EFX_RXD_MASK;
196 
197  EFX_POPULATE_DWORD_1(reg, ERF_DZ_RX_DESC_WPTR, ptr);
199 }
static unsigned int unsigned int reg
Definition: myson.h:162
A receive queue.
Definition: efx_common.h:107
#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
#define ER_DZ_RX_DESC_UPD
Definition: ef10_regs.h:98
#define EFX_RXD_MASK
Definition: efx_common.h:57
#define EFX_POPULATE_DWORD_1(dword,...)
Definition: efx_bitfield.h:423
struct efx_rx_queue rxq
Definition: efx_common.h:164
unsigned int write_ptr
Definition: efx_common.h:118

References EFX_POPULATE_DWORD_1, EFX_RXD_MASK, efx_writel_page, ER_DZ_RX_DESC_UPD, reg, efx_nic::rxq, and efx_rx_queue::write_ptr.

Referenced by efx_hunt_rxq_fill().

◆ efx_hunt_rxq_fill()

static void efx_hunt_rxq_fill ( struct efx_nic efx)
static

Definition at line 202 of file efx_hunt.c.

203 {
204  struct efx_rx_queue *rxq = &efx->rxq;
205  int fill_level = rxq->write_ptr - rxq->read_ptr;
206  int space = EFX_NUM_RX_DESC - fill_level - 1;
207  int pushed = 0;
208 
209  while (space) {
210  int buf_id = rxq->write_ptr & (EFX_NUM_RX_DESC - 1);
211  int desc_id = rxq->write_ptr & EFX_RXD_MASK;
212  struct io_buffer *iob;
214 
215  assert(rxq->buf[buf_id] == NULL);
216  iob = alloc_iob(EFX_RX_BUF_SIZE);
217  if (!iob)
218  break;
219 
220  DBGCP(efx, "pushing rx_buf[%d] iob %p data %p\n",
221  buf_id, iob, iob->data);
222 
223  rxq->buf[buf_id] = iob;
224  rxd = rxq->ring + desc_id;
226  ++rxq->write_ptr;
227  ++pushed;
228  --space;
229  }
230 
231  /* Push the ptr to hardware */
232  if (pushed > 0) {
234 
235  DBGCP(efx, "pushed %d rx buffers to fill level %d\n",
236  pushed, rxq->write_ptr - rxq->read_ptr);
237  }
238 }
A receive queue.
Definition: efx_common.h:107
unsigned int read_ptr
Definition: efx_common.h:121
static void efx_hunt_build_rx_desc(efx_rx_desc_t *rxd, struct io_buffer *iob)
Definition: efx_hunt.c:181
efx_rx_desc_t * ring
Definition: efx_common.h:109
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition: iobuf.c:129
static void efx_hunt_notify_rx_desc(struct efx_nic *efx)
Definition: efx_hunt.c:191
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define EFX_NUM_RX_DESC
Definition: efx_common.h:68
#define EFX_RXD_MASK
Definition: efx_common.h:57
#define EFX_RX_BUF_SIZE
Definition: efx_common.h:74
struct efx_rx_queue rxq
Definition: efx_common.h:164
void * data
Start of data.
Definition: iobuf.h:48
#define DBGCP(...)
Definition: compiler.h:539
struct io_buffer * buf[EFX_NUM_RX_DESC]
Definition: efx_common.h:112
unsigned int write_ptr
Definition: efx_common.h:118
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
A quadword (8 byte) datatype - little-endian in HW.
Definition: efx_bitfield.h:92
#define rxd
Definition: davicom.c:145
A persistent I/O buffer.
Definition: iobuf.h:33

References alloc_iob(), assert(), efx_rx_queue::buf, io_buffer::data, DBGCP, efx_hunt_build_rx_desc(), efx_hunt_notify_rx_desc(), EFX_NUM_RX_DESC, EFX_RX_BUF_SIZE, EFX_RXD_MASK, NULL, efx_rx_queue::read_ptr, efx_rx_queue::ring, rxd, efx_nic::rxq, and efx_rx_queue::write_ptr.

Referenced by efx_hunt_open(), and efx_hunt_poll().

◆ efx_hunt_receive()

static void efx_hunt_receive ( struct efx_nic efx,
unsigned int  id,
int  len,
int  drop 
)
static

Definition at line 241 of file efx_hunt.c.

242 {
243  struct efx_rx_queue *rxq = &efx->rxq;
244  unsigned int read_ptr = rxq->read_ptr & EFX_RXD_MASK;
245  unsigned int buf_ptr = rxq->read_ptr & EFX_NUM_RX_DESC_MASK;
246  struct io_buffer *iob;
247 
248  /* id is the lower 4 bits of the desc index + 1 in huntington*/
249  /* hence anding with 15 */
250  assert((id & 15) == ((read_ptr + (len != 0)) & 15));
251 
252  /* Pop this rx buffer out of the software ring */
253  iob = rxq->buf[buf_ptr];
254  rxq->buf[buf_ptr] = NULL;
255 
256  DBGCIO(efx, "popping rx_buf[%d] iob %p data %p with %d bytes %s %x\n",
257  read_ptr, iob, iob->data, len, drop ? "bad" : "ok", drop);
258 
259  /* Pass the packet up if required */
260  if (drop)
261  netdev_rx_err(efx->netdev, iob, EBADMSG);
262  else {
263  iob_put(iob, len);
264  iob_pull(iob, efx->rx_prefix_size);
265  netdev_rx(efx->netdev, iob);
266  }
267 
268  ++rxq->read_ptr;
269 }
#define iob_pull(iobuf, len)
Definition: iobuf.h:102
#define iob_put(iobuf, len)
Definition: iobuf.h:120
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:586
A receive queue.
Definition: efx_common.h:107
unsigned int read_ptr
Definition: efx_common.h:121
#define EFX_NUM_RX_DESC_MASK
Definition: efx_common.h:69
#define EBADMSG
Bad message.
Definition: errno.h:333
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define EFX_RXD_MASK
Definition: efx_common.h:57
#define DBGCIO(...)
Definition: compiler.h:556
struct efx_rx_queue rxq
Definition: efx_common.h:164
unsigned int rx_prefix_size
Definition: efx_common.h:168
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition: netdevice.c:548
uint32_t len
Length.
Definition: ena.h:14
void * data
Start of data.
Definition: iobuf.h:48
struct io_buffer * buf[EFX_NUM_RX_DESC]
Definition: efx_common.h:112
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
struct net_device * netdev
Definition: efx_common.h:148
A persistent I/O buffer.
Definition: iobuf.h:33

References assert(), efx_rx_queue::buf, io_buffer::data, DBGCIO, EBADMSG, EFX_NUM_RX_DESC_MASK, EFX_RXD_MASK, iob_pull, iob_put, len, efx_nic::netdev, netdev_rx(), netdev_rx_err(), NULL, efx_rx_queue::read_ptr, efx_nic::rx_prefix_size, and efx_nic::rxq.

Referenced by efx_hunt_handle_event().

◆ efx_hunt_rx_init()

int efx_hunt_rx_init ( struct net_device netdev,
dma_addr_t dma_addr 
)

Definition at line 271 of file efx_hunt.c.

272 {
273  struct efx_nic *efx = netdev->priv;
274  struct efx_rx_queue *rxq = &efx->rxq;
275  size_t bytes;
276 
277  /* Allocate hardware receive queue */
278  bytes = sizeof(efx_rx_desc_t) * EFX_RXD_SIZE;
280  if (rxq->ring == NULL)
281  return -ENOMEM;
282 
283  rxq->read_ptr = rxq->write_ptr = 0;
284  *dma_addr = rxq->entry.dma_addr;
285  return 0;
286 }
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
void * priv
Driver private data.
Definition: netdevice.h:431
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:44
uint8_t bytes[64]
Definition: ib_mad.h:16
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References bytes, efx_special_buffer::dma_addr, efx_hunt_alloc_special_buffer(), EFX_RXD_SIZE, ENOMEM, efx_rx_queue::entry, netdev, NULL, net_device::priv, 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_ev_init()

int efx_hunt_ev_init ( struct net_device netdev,
dma_addr_t dma_addr 
)

Definition at line 295 of file efx_hunt.c.

296 {
297  struct efx_nic *efx = netdev->priv;
298  struct efx_ev_queue *evq = &efx->evq;
299  size_t bytes;
300 
301  /* Allocate the hardware event queue */
302  bytes = sizeof(efx_event_t) * EFX_EVQ_SIZE;
304  if (evq->ring == NULL)
305  return -ENOMEM;
306 
307  memset(evq->ring, 0xff, bytes);
308  evq->read_ptr = 0;
309  *dma_addr = evq->entry.dma_addr;
310  return 0;
311 }
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
void * priv
Driver private data.
Definition: netdevice.h:431
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:44
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:321
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, NULL, net_device::priv, efx_ev_queue::read_ptr, and efx_ev_queue::ring.

Referenced by hunt_ev_init().

◆ efx_hunt_clear_interrupts()

static void efx_hunt_clear_interrupts ( struct efx_nic efx)
static

Definition at line 314 of file efx_hunt.c.

315 {
317  /* read the ISR */
319 }
#define ER_DZ_BIU_INT_ISR
Definition: ef10_regs.h:65
static unsigned int unsigned int reg
Definition: myson.h:162
A doubleword (4 byte) datatype - little-endian in HW.
Definition: efx_bitfield.h:87
void efx_readl(struct efx_nic *efx, efx_dword_t *value, unsigned int reg)
Definition: efx_common.c:57

References efx_readl(), ER_DZ_BIU_INT_ISR, and reg.

Referenced by efx_hunt_close(), efx_hunt_irq(), and efx_hunt_poll().

◆ efx_hunt_event_present()

static int efx_hunt_event_present ( efx_event_t event)
inlinestatic

See if an event is present.

Parameters
eventEFX event structure
Return values
TrueAn event is pending
FalseNo event is pending

We check both the high and low dword of the event for all ones. We wrote all ones when we cleared the event, and no valid event can have all ones in either its high or low dwords. This approach is robust against reordering.

Note that using a single 64-bit comparison is incorrect; even though the CPU read will be atomic, the DMA write may not be.

Definition at line 337 of file efx_hunt.c.

338 {
339  return (!(EFX_DWORD_IS_ALL_ONES(event->dword[0]) |
340  EFX_DWORD_IS_ALL_ONES(event->dword[1])));
341 }
efx_dword_t dword[2]
Definition: efx_bitfield.h:95
#define EFX_DWORD_IS_ALL_ONES(dword)
Definition: efx_bitfield.h:230

References efx_qword::dword, and EFX_DWORD_IS_ALL_ONES.

Referenced by efx_hunt_poll().

◆ efx_hunt_evq_read_ack()

static void efx_hunt_evq_read_ack ( struct efx_nic efx)
static

Definition at line 344 of file efx_hunt.c.

345 {
346  struct efx_ev_queue *evq = &efx->evq;
348 
349  if (efx->workaround_35388) {
350  EFX_POPULATE_DWORD_2(reg, ERF_DD_EVQ_IND_RPTR_FLAGS,
352  ERF_DD_EVQ_IND_RPTR,
355  EFX_POPULATE_DWORD_2(reg, ERF_DD_EVQ_IND_RPTR_FLAGS,
357  ERF_DD_EVQ_IND_RPTR, evq->read_ptr &
358  ((1 << ERF_DD_EVQ_IND_RPTR_WIDTH) - 1));
360  } else {
361  EFX_POPULATE_DWORD_1(reg, ERF_DZ_EVQ_RPTR, evq->read_ptr);
363  }
364 }
#define EFE_DD_EVQ_IND_RPTR_FLAGS_LOW
Definition: ef10_regs.h:339
#define efx_writel_table(efx, value, index, reg)
Definition: efx_common.h:216
static unsigned int unsigned int reg
Definition: myson.h:162
#define EFE_DD_EVQ_IND_RPTR_FLAGS_HIGH
Definition: ef10_regs.h:338
bool workaround_35388
Definition: efx_common.h:175
#define ER_DD_EVQ_INDIRECT
Definition: ef10_regs.h:335
#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
#define ER_DZ_EVQ_RPTR
Definition: ef10_regs.h:80
#define EFX_POPULATE_DWORD_1(dword,...)
Definition: efx_bitfield.h:423
#define EFX_POPULATE_DWORD_2(dword,...)
Definition: efx_bitfield.h:421
struct efx_ev_queue evq
Definition: efx_common.h:166
An event queue.
Definition: efx_common.h:128
unsigned int read_ptr
Definition: efx_common.h:138
#define ERF_DD_EVQ_IND_RPTR_WIDTH
Definition: ef10_regs.h:341

References EFE_DD_EVQ_IND_RPTR_FLAGS_HIGH, EFE_DD_EVQ_IND_RPTR_FLAGS_LOW, EFX_POPULATE_DWORD_1, EFX_POPULATE_DWORD_2, efx_writel_page, efx_writel_table, ER_DD_EVQ_INDIRECT, ER_DZ_EVQ_RPTR, ERF_DD_EVQ_IND_RPTR_WIDTH, efx_nic::evq, efx_ev_queue::read_ptr, reg, and efx_nic::workaround_35388.

Referenced by efx_hunt_irq(), efx_hunt_open(), and efx_hunt_poll().

◆ efx_hunt_handle_event()

static unsigned int efx_hunt_handle_event ( struct efx_nic efx,
efx_event_t evt 
)
static

Definition at line 367 of file efx_hunt.c.

368 {
369  struct efx_rx_queue *rxq = &efx->rxq;
370  int ev_code, desc_ptr, len;
371  int next_ptr_lbits, packet_drop;
372  int rx_cont;
373 
374  /* Decode event */
375  ev_code = EFX_QWORD_FIELD(*evt, ESF_DZ_EV_CODE);
376 
377  switch (ev_code) {
379  desc_ptr = EFX_QWORD_FIELD(*evt, ESF_DZ_TX_DESCR_INDX);
380  efx_hunt_transmit_done(efx, desc_ptr);
381  break;
382 
384  len = EFX_QWORD_FIELD(*evt, ESF_DZ_RX_BYTES);
385  next_ptr_lbits = EFX_QWORD_FIELD(*evt, ESF_DZ_RX_DSC_PTR_LBITS);
386  rx_cont = EFX_QWORD_FIELD(*evt, ESF_DZ_RX_CONT);
387 
388  /* We don't expect to receive scattered packets, so drop the
389  * packet if RX_CONT is set on the current or previous event, or
390  * if len is zero.
391  */
392  packet_drop = (len == 0) | (rx_cont << 1) |
393  (rxq->rx_cont_prev << 2);
394  efx_hunt_receive(efx, next_ptr_lbits, len, packet_drop);
395  rxq->rx_cont_prev = rx_cont;
396  return 1;
397 
398  default:
399  DBGCP(efx, "Unknown event type %d\n", ev_code);
400  break;
401  }
402  return 0;
403 }
#define EFX_QWORD_FIELD
Definition: efx_bitfield.h:242
A receive queue.
Definition: efx_common.h:107
unsigned int rx_cont_prev
Definition: efx_common.h:124
#define ESE_DZ_EV_CODE_RX_EV
Definition: ef10_regs.h:138
static void efx_hunt_receive(struct efx_nic *efx, unsigned int id, int len, int drop)
Definition: efx_hunt.c:241
static void efx_hunt_transmit_done(struct efx_nic *efx, int id)
Definition: efx_hunt.c:132
struct efx_rx_queue rxq
Definition: efx_common.h:164
#define ESE_DZ_EV_CODE_TX_EV
Definition: ef10_regs.h:137
uint32_t len
Length.
Definition: ena.h:14
#define DBGCP(...)
Definition: compiler.h:539

References DBGCP, efx_hunt_receive(), efx_hunt_transmit_done(), EFX_QWORD_FIELD, ESE_DZ_EV_CODE_RX_EV, ESE_DZ_EV_CODE_TX_EV, len, efx_rx_queue::rx_cont_prev, and efx_nic::rxq.

Referenced by efx_hunt_poll().

◆ efx_hunt_poll()

void efx_hunt_poll ( struct net_device netdev)

Definition at line 405 of file efx_hunt.c.

406 {
407  struct efx_nic *efx = netdev->priv;
408  struct efx_ev_queue *evq = &efx->evq;
409  efx_event_t *evt;
410  int budget = 10;
411 
412  /* Read the event queue by directly looking for events
413  * (we don't even bother to read the eventq write ptr)
414  */
415  evt = evq->ring + evq->read_ptr;
416  while (efx_hunt_event_present(evt) && (budget > 0)) {
417  DBGCP(efx, "Event at index 0x%x address %p is "
418  EFX_QWORD_FMT "\n", evq->read_ptr,
419  evt, EFX_QWORD_VAL(*evt));
420 
421  budget -= efx_hunt_handle_event(efx, evt);
422 
423  /* Clear the event */
424  EFX_SET_QWORD(*evt);
425 
426  /* Move to the next event. We don't ack the event
427  * queue until the end
428  */
429  evq->read_ptr = ((evq->read_ptr + 1) & EFX_EVQ_MASK);
430  evt = evq->ring + evq->read_ptr;
431  }
432 
433  /* Push more rx buffers if needed */
434  efx_hunt_rxq_fill(efx);
435 
436  /* Clear any pending interrupts */
438 
439  /* Ack the event queue if interrupts are enabled */
440  if (efx->int_en)
442 }
static int efx_hunt_event_present(efx_event_t *event)
See if an event is present.
Definition: efx_hunt.c:337
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:202
int int_en
INT_REG_KER.
Definition: efx_common.h:171
void * priv
Driver private data.
Definition: netdevice.h:431
#define EFX_SET_QWORD(qword)
Definition: efx_bitfield.h:400
static void efx_hunt_clear_interrupts(struct efx_nic *efx)
Definition: efx_hunt.c:314
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:367
#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:344
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, net_device::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 444 of file efx_hunt.c.

445 {
446  struct efx_nic *efx = netdev->priv;
447 
448  efx->int_en = enable;
449 
450  /* If interrupts are enabled, prime the event queue. Otherwise ack any
451  * pending interrupts
452  */
453  if (enable)
455  else if (efx->netdev->state & NETDEV_OPEN)
457 }
Hardware access.
Definition: efx_common.h:147
#define NETDEV_OPEN
Network device is open.
Definition: netdevice.h:438
unsigned int state
Current device state.
Definition: netdevice.h:395
int int_en
INT_REG_KER.
Definition: efx_common.h:171
void * priv
Driver private data.
Definition: netdevice.h:431
static void efx_hunt_clear_interrupts(struct efx_nic *efx)
Definition: efx_hunt.c:314
static struct net_device * netdev
Definition: gdbudp.c:52
static void efx_hunt_evq_read_ack(struct efx_nic *efx)
Definition: efx_hunt.c:344
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, net_device::priv, and net_device::state.

◆ efx_hunt_open()

int efx_hunt_open ( struct net_device netdev)

Definition at line 466 of file efx_hunt.c.

467 {
468  struct efx_nic *efx = netdev->priv;
470 
471  /* Set interrupt moderation to 0*/
473  ERF_DZ_TC_TIMER_MODE, 0,
474  ERF_DZ_TC_TIMER_VAL, 0);
475  efx_writel_page(efx, &cmd, 0, ER_DZ_EVQ_TMR);
476 
477  /* Ack the eventq */
478  if (efx->int_en)
480 
481  /* Push receive buffers */
482  efx_hunt_rxq_fill(efx);
483 
484  return 0;
485 }
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:202
#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
void * priv
Driver private data.
Definition: netdevice.h:431
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:344
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 net_device::priv.

Referenced by hunt_open().

◆ efx_hunt_close()

void efx_hunt_close ( struct net_device netdev)

Definition at line 487 of file efx_hunt.c.

488 {
489  struct efx_nic *efx = netdev->priv;
490  struct efx_rx_queue *rxq = &efx->rxq;
491  struct efx_tx_queue *txq = &efx->txq;
492  int i;
493 
494  /* Complete outstanding descriptors */
495  for (i = 0; i < EFX_NUM_RX_DESC; i++) {
496  if (rxq->buf[i]) {
497  free_iob(rxq->buf[i]);
498  rxq->buf[i] = NULL;
499  }
500  }
501 
502  for (i = 0; i < EFX_TXD_SIZE; i++) {
503  if (txq->buf[i]) {
504  netdev_tx_complete(efx->netdev, txq->buf[i]);
505  txq->buf[i] = NULL;
506  }
507  }
508 
509  /* Clear interrupts */
511 }
static void netdev_tx_complete(struct net_device *netdev, struct io_buffer *iobuf)
Complete network transmission.
Definition: netdevice.h:752
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:146
void * priv
Driver private data.
Definition: netdevice.h:431
static void efx_hunt_clear_interrupts(struct efx_nic *efx)
Definition: efx_hunt.c:314
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:321
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_tx_complete(), NULL, net_device::priv, efx_nic::rxq, and efx_nic::txq.

Referenced by hunt_close(), and hunt_open().