iPXE
Macros | Functions | Variables
gve.c File Reference

Google Virtual Ethernet network driver. More...

#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <assert.h>
#include <byteswap.h>
#include <ipxe/netdevice.h>
#include <ipxe/ethernet.h>
#include <ipxe/if_ether.h>
#include <ipxe/iobuf.h>
#include <ipxe/dma.h>
#include <ipxe/pci.h>
#include <ipxe/fault.h>
#include "gve.h"

Go to the source code of this file.

Macros

#define EINFO_EIO_ADMIN_UNSET   __einfo_uniqify ( EINFO_EIO, 0x00, "Uncompleted" )
 
#define EIO_ADMIN_UNSET   __einfo_error ( EINFO_EIO_ADMIN_UNSET )
 
#define EINFO_EIO_ADMIN_ABORTED   __einfo_uniqify ( EINFO_EIO, 0x10, "Aborted" )
 
#define EIO_ADMIN_ABORTED   __einfo_error ( EINFO_EIO_ADMIN_ABORTED )
 
#define EINFO_EIO_ADMIN_EXISTS   __einfo_uniqify ( EINFO_EIO, 0x11, "Already exists" )
 
#define EIO_ADMIN_EXISTS   __einfo_error ( EINFO_EIO_ADMIN_EXISTS )
 
#define EINFO_EIO_ADMIN_CANCELLED   __einfo_uniqify ( EINFO_EIO, 0x12, "Cancelled" )
 
#define EIO_ADMIN_CANCELLED   __einfo_error ( EINFO_EIO_ADMIN_CANCELLED )
 
#define EINFO_EIO_ADMIN_DATALOSS   __einfo_uniqify ( EINFO_EIO, 0x13, "Data loss" )
 
#define EIO_ADMIN_DATALOSS   __einfo_error ( EINFO_EIO_ADMIN_DATALOSS )
 
#define EINFO_EIO_ADMIN_DEADLINE   __einfo_uniqify ( EINFO_EIO, 0x14, "Deadline exceeded" )
 
#define EIO_ADMIN_DEADLINE   __einfo_error ( EINFO_EIO_ADMIN_DEADLINE )
 
#define EINFO_EIO_ADMIN_PRECONDITION   __einfo_uniqify ( EINFO_EIO, 0x15, "Failed precondition" )
 
#define EIO_ADMIN_PRECONDITION   __einfo_error ( EINFO_EIO_ADMIN_PRECONDITION )
 
#define EINFO_EIO_ADMIN_INTERNAL   __einfo_uniqify ( EINFO_EIO, 0x16, "Internal error" )
 
#define EIO_ADMIN_INTERNAL   __einfo_error ( EINFO_EIO_ADMIN_INTERNAL )
 
#define EINFO_EIO_ADMIN_INVAL   __einfo_uniqify ( EINFO_EIO, 0x17, "Invalid argument" )
 
#define EIO_ADMIN_INVAL   __einfo_error ( EINFO_EIO_ADMIN_INVAL )
 
#define EINFO_EIO_ADMIN_NOT_FOUND   __einfo_uniqify ( EINFO_EIO, 0x18, "Not found" )
 
#define EIO_ADMIN_NOT_FOUND   __einfo_error ( EINFO_EIO_ADMIN_NOT_FOUND )
 
#define EINFO_EIO_ADMIN_RANGE   __einfo_uniqify ( EINFO_EIO, 0x19, "Out of range" )
 
#define EIO_ADMIN_RANGE   __einfo_error ( EINFO_EIO_ADMIN_RANGE )
 
#define EINFO_EIO_ADMIN_PERM   __einfo_uniqify ( EINFO_EIO, 0x1a, "Permission denied" )
 
#define EIO_ADMIN_PERM   __einfo_error ( EINFO_EIO_ADMIN_PERM )
 
#define EINFO_EIO_ADMIN_UNAUTH   __einfo_uniqify ( EINFO_EIO, 0x1b, "Unauthenticated" )
 
#define EIO_ADMIN_UNAUTH   __einfo_error ( EINFO_EIO_ADMIN_UNAUTH )
 
#define EINFO_EIO_ADMIN_RESOURCE   __einfo_uniqify ( EINFO_EIO, 0x1c, "Resource exhausted" )
 
#define EIO_ADMIN_RESOURCE   __einfo_error ( EINFO_EIO_ADMIN_RESOURCE )
 
#define EINFO_EIO_ADMIN_UNAVAIL   __einfo_uniqify ( EINFO_EIO, 0x1d, "Unavailable" )
 
#define EIO_ADMIN_UNAVAIL   __einfo_error ( EINFO_EIO_ADMIN_UNAVAIL )
 
#define EINFO_EIO_ADMIN_NOTSUP   __einfo_uniqify ( EINFO_EIO, 0x1e, "Unimplemented" )
 
#define EIO_ADMIN_NOTSUP   __einfo_error ( EINFO_EIO_ADMIN_NOTSUP )
 
#define EINFO_EIO_ADMIN_UNKNOWN   __einfo_uniqify ( EINFO_EIO, 0x1f, "Unknown error" )
 
#define EIO_ADMIN_UNKNOWN   __einfo_error ( EINFO_EIO_ADMIN_UNKNOWN )
 
#define EIO_ADMIN(status)
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static int gve_reset (struct gve_nic *gve)
 Reset hardware. More...
 
static int gve_admin_alloc (struct gve_nic *gve)
 Allocate admin queue. More...
 
static void gve_admin_free (struct gve_nic *gve)
 Free admin queue. More...
 
static void gve_admin_enable (struct gve_nic *gve)
 Enable admin queue. More...
 
static union gve_admin_commandgve_admin_command (struct gve_nic *gve)
 Get next available admin queue command slot. More...
 
static int gve_admin_wait (struct gve_nic *gve)
 Wait for admin queue command to complete. More...
 
static int gve_admin (struct gve_nic *gve)
 Issue admin queue command. More...
 
static int gve_admin_simple (struct gve_nic *gve, unsigned int opcode, unsigned int id)
 Issue simple admin queue command. More...
 
static int gve_describe (struct gve_nic *gve)
 Get device descriptor. More...
 
static int gve_configure (struct gve_nic *gve)
 Configure device resources. More...
 
static int gve_deconfigure (struct gve_nic *gve)
 Deconfigure device resources. More...
 
static int gve_register (struct gve_nic *gve, struct gve_qpl *qpl)
 Register queue page list. More...
 
static int gve_unregister (struct gve_nic *gve, struct gve_qpl *qpl)
 Unregister page list. More...
 
static void gve_create_tx_param (struct gve_queue *queue, union gve_admin_command *cmd)
 Construct command to create transmit queue. More...
 
static void gve_create_rx_param (struct gve_queue *queue, union gve_admin_command *cmd)
 Construct command to create receive queue. More...
 
static int gve_create_queue (struct gve_nic *gve, struct gve_queue *queue)
 Create transmit or receive queue. More...
 
static int gve_destroy_queue (struct gve_nic *gve, struct gve_queue *queue)
 Destroy transmit or receive queue. More...
 
static int gve_alloc_qpl (struct gve_nic *gve, struct gve_qpl *qpl, uint32_t id, unsigned int buffers)
 Allocate queue page list. More...
 
static void gve_free_qpl (struct gve_nic *nic __unused, struct gve_qpl *qpl)
 Free queue page list. More...
 
static size_t gve_address (struct gve_queue *queue, unsigned int index)
 Get buffer address (within queue page list address space) More...
 
static userptr_t gve_buffer (struct gve_queue *queue, unsigned int index)
 Get buffer address. More...
 
static unsigned int gve_next (unsigned int seq)
 Calculate next receive sequence number. More...
 
static int gve_alloc_queue (struct gve_nic *gve, struct gve_queue *queue)
 Allocate descriptor queue. More...
 
static void gve_free_queue (struct gve_nic *gve, struct gve_queue *queue)
 Free descriptor queue. More...
 
static int gve_start (struct gve_nic *gve)
 Start up device. More...
 
static void gve_stop (struct gve_nic *gve)
 Stop device. More...
 
static void gve_startup (struct gve_nic *gve)
 Device startup process. More...
 
static void gve_restart (struct gve_nic *gve)
 Trigger startup process. More...
 
static void gve_watchdog (struct retry_timer *timer, int over __unused)
 Reset recovery watchdog. More...
 
static int gve_open (struct net_device *netdev)
 Open network device. More...
 
static void gve_close (struct net_device *netdev)
 Close network device. More...
 
static int gve_transmit (struct net_device *netdev, struct io_buffer *iobuf)
 Transmit packet. More...
 
static void gve_poll_tx (struct net_device *netdev)
 Poll for completed transmissions. More...
 
static void gve_poll_rx (struct net_device *netdev)
 Poll for received packets. More...
 
static void gve_refill_rx (struct net_device *netdev)
 Refill receive queue. More...
 
static void gve_poll (struct net_device *netdev)
 Poll for completed and received packets. More...
 
static int gve_setup (struct gve_nic *gve)
 Set up admin queue and get device description. More...
 
static int gve_probe (struct pci_device *pci)
 Probe PCI device. More...
 
static void gve_remove (struct pci_device *pci)
 Remove PCI device. More...
 

Variables

static struct net_device_operations gve_operations
 GVE network device operations. More...
 
static const struct gve_queue_type gve_tx_type
 Transmit descriptor queue type. More...
 
static const struct gve_queue_type gve_rx_type
 Receive descriptor queue type. More...
 
static struct process_descriptor gve_startup_desc
 Device startup process descriptor. More...
 
static struct pci_device_id gve_nics []
 GVE PCI device IDs. More...
 
struct pci_driver gve_driver __pci_driver
 GVE PCI driver. More...
 

Detailed Description

Google Virtual Ethernet network driver.

Definition in file gve.c.

Macro Definition Documentation

◆ EINFO_EIO_ADMIN_UNSET

#define EINFO_EIO_ADMIN_UNSET   __einfo_uniqify ( EINFO_EIO, 0x00, "Uncompleted" )

Definition at line 48 of file gve.c.

◆ EIO_ADMIN_UNSET

#define EIO_ADMIN_UNSET   __einfo_error ( EINFO_EIO_ADMIN_UNSET )

Definition at line 50 of file gve.c.

◆ EINFO_EIO_ADMIN_ABORTED

#define EINFO_EIO_ADMIN_ABORTED   __einfo_uniqify ( EINFO_EIO, 0x10, "Aborted" )

Definition at line 52 of file gve.c.

◆ EIO_ADMIN_ABORTED

#define EIO_ADMIN_ABORTED   __einfo_error ( EINFO_EIO_ADMIN_ABORTED )

Definition at line 54 of file gve.c.

◆ EINFO_EIO_ADMIN_EXISTS

#define EINFO_EIO_ADMIN_EXISTS   __einfo_uniqify ( EINFO_EIO, 0x11, "Already exists" )

Definition at line 56 of file gve.c.

◆ EIO_ADMIN_EXISTS

#define EIO_ADMIN_EXISTS   __einfo_error ( EINFO_EIO_ADMIN_EXISTS )

Definition at line 58 of file gve.c.

◆ EINFO_EIO_ADMIN_CANCELLED

#define EINFO_EIO_ADMIN_CANCELLED   __einfo_uniqify ( EINFO_EIO, 0x12, "Cancelled" )

Definition at line 60 of file gve.c.

◆ EIO_ADMIN_CANCELLED

#define EIO_ADMIN_CANCELLED   __einfo_error ( EINFO_EIO_ADMIN_CANCELLED )

Definition at line 62 of file gve.c.

◆ EINFO_EIO_ADMIN_DATALOSS

#define EINFO_EIO_ADMIN_DATALOSS   __einfo_uniqify ( EINFO_EIO, 0x13, "Data loss" )

Definition at line 64 of file gve.c.

◆ EIO_ADMIN_DATALOSS

#define EIO_ADMIN_DATALOSS   __einfo_error ( EINFO_EIO_ADMIN_DATALOSS )

Definition at line 66 of file gve.c.

◆ EINFO_EIO_ADMIN_DEADLINE

#define EINFO_EIO_ADMIN_DEADLINE   __einfo_uniqify ( EINFO_EIO, 0x14, "Deadline exceeded" )

Definition at line 68 of file gve.c.

◆ EIO_ADMIN_DEADLINE

#define EIO_ADMIN_DEADLINE   __einfo_error ( EINFO_EIO_ADMIN_DEADLINE )

Definition at line 70 of file gve.c.

◆ EINFO_EIO_ADMIN_PRECONDITION

#define EINFO_EIO_ADMIN_PRECONDITION   __einfo_uniqify ( EINFO_EIO, 0x15, "Failed precondition" )

Definition at line 72 of file gve.c.

◆ EIO_ADMIN_PRECONDITION

#define EIO_ADMIN_PRECONDITION   __einfo_error ( EINFO_EIO_ADMIN_PRECONDITION )

Definition at line 74 of file gve.c.

◆ EINFO_EIO_ADMIN_INTERNAL

#define EINFO_EIO_ADMIN_INTERNAL   __einfo_uniqify ( EINFO_EIO, 0x16, "Internal error" )

Definition at line 76 of file gve.c.

◆ EIO_ADMIN_INTERNAL

#define EIO_ADMIN_INTERNAL   __einfo_error ( EINFO_EIO_ADMIN_INTERNAL )

Definition at line 78 of file gve.c.

◆ EINFO_EIO_ADMIN_INVAL

#define EINFO_EIO_ADMIN_INVAL   __einfo_uniqify ( EINFO_EIO, 0x17, "Invalid argument" )

Definition at line 80 of file gve.c.

◆ EIO_ADMIN_INVAL

#define EIO_ADMIN_INVAL   __einfo_error ( EINFO_EIO_ADMIN_INVAL )

Definition at line 82 of file gve.c.

◆ EINFO_EIO_ADMIN_NOT_FOUND

#define EINFO_EIO_ADMIN_NOT_FOUND   __einfo_uniqify ( EINFO_EIO, 0x18, "Not found" )

Definition at line 84 of file gve.c.

◆ EIO_ADMIN_NOT_FOUND

#define EIO_ADMIN_NOT_FOUND   __einfo_error ( EINFO_EIO_ADMIN_NOT_FOUND )

Definition at line 86 of file gve.c.

◆ EINFO_EIO_ADMIN_RANGE

#define EINFO_EIO_ADMIN_RANGE   __einfo_uniqify ( EINFO_EIO, 0x19, "Out of range" )

Definition at line 88 of file gve.c.

◆ EIO_ADMIN_RANGE

#define EIO_ADMIN_RANGE   __einfo_error ( EINFO_EIO_ADMIN_RANGE )

Definition at line 90 of file gve.c.

◆ EINFO_EIO_ADMIN_PERM

#define EINFO_EIO_ADMIN_PERM   __einfo_uniqify ( EINFO_EIO, 0x1a, "Permission denied" )

Definition at line 92 of file gve.c.

◆ EIO_ADMIN_PERM

#define EIO_ADMIN_PERM   __einfo_error ( EINFO_EIO_ADMIN_PERM )

Definition at line 94 of file gve.c.

◆ EINFO_EIO_ADMIN_UNAUTH

#define EINFO_EIO_ADMIN_UNAUTH   __einfo_uniqify ( EINFO_EIO, 0x1b, "Unauthenticated" )

Definition at line 96 of file gve.c.

◆ EIO_ADMIN_UNAUTH

#define EIO_ADMIN_UNAUTH   __einfo_error ( EINFO_EIO_ADMIN_UNAUTH )

Definition at line 98 of file gve.c.

◆ EINFO_EIO_ADMIN_RESOURCE

#define EINFO_EIO_ADMIN_RESOURCE   __einfo_uniqify ( EINFO_EIO, 0x1c, "Resource exhausted" )

Definition at line 100 of file gve.c.

◆ EIO_ADMIN_RESOURCE

#define EIO_ADMIN_RESOURCE   __einfo_error ( EINFO_EIO_ADMIN_RESOURCE )

Definition at line 102 of file gve.c.

◆ EINFO_EIO_ADMIN_UNAVAIL

#define EINFO_EIO_ADMIN_UNAVAIL   __einfo_uniqify ( EINFO_EIO, 0x1d, "Unavailable" )

Definition at line 104 of file gve.c.

◆ EIO_ADMIN_UNAVAIL

#define EIO_ADMIN_UNAVAIL   __einfo_error ( EINFO_EIO_ADMIN_UNAVAIL )

Definition at line 106 of file gve.c.

◆ EINFO_EIO_ADMIN_NOTSUP

#define EINFO_EIO_ADMIN_NOTSUP   __einfo_uniqify ( EINFO_EIO, 0x1e, "Unimplemented" )

Definition at line 108 of file gve.c.

◆ EIO_ADMIN_NOTSUP

#define EIO_ADMIN_NOTSUP   __einfo_error ( EINFO_EIO_ADMIN_NOTSUP )

Definition at line 110 of file gve.c.

◆ EINFO_EIO_ADMIN_UNKNOWN

#define EINFO_EIO_ADMIN_UNKNOWN   __einfo_uniqify ( EINFO_EIO, 0x1f, "Unknown error" )

Definition at line 112 of file gve.c.

◆ EIO_ADMIN_UNKNOWN

#define EIO_ADMIN_UNKNOWN   __einfo_error ( EINFO_EIO_ADMIN_UNKNOWN )

Definition at line 114 of file gve.c.

◆ EIO_ADMIN

#define EIO_ADMIN (   status)
Value:
EUNIQ ( EINFO_EIO, ( (status) & 0x1f ), \
#define EIO_ADMIN_ABORTED
Definition: gve.c:54
#define EIO_ADMIN_PERM
Definition: gve.c:94
#define EIO_ADMIN_UNKNOWN
Definition: gve.c:114
#define EIO_ADMIN_NOTSUP
Definition: gve.c:110
#define EIO_ADMIN_RESOURCE
Definition: gve.c:102
#define EIO_ADMIN_DATALOSS
Definition: gve.c:66
#define EINFO_EIO
Definition: errno.h:434
#define EIO_ADMIN_UNSET
Definition: gve.c:50
#define EIO_ADMIN_DEADLINE
Definition: gve.c:70
#define EIO_ADMIN_EXISTS
Definition: gve.c:58
#define EIO_ADMIN_RANGE
Definition: gve.c:90
#define EIO_ADMIN_UNAUTH
Definition: gve.c:98
uint8_t status
Status.
Definition: ena.h:16
#define EIO_ADMIN_NOT_FOUND
Definition: gve.c:86
#define EIO_ADMIN_UNAVAIL
Definition: gve.c:106
#define EIO_ADMIN_PRECONDITION
Definition: gve.c:74
#define EUNIQ(einfo_base, uniq,...)
Disambiguate a base error based on non-constant information.
Definition: errno.h:225
#define EIO_ADMIN_INTERNAL
Definition: gve.c:78
#define EIO_ADMIN_INVAL
Definition: gve.c:82
#define EIO_ADMIN_CANCELLED
Definition: gve.c:62

Definition at line 116 of file gve.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ gve_reset()

static int gve_reset ( struct gve_nic gve)
static

Reset hardware.

Parameters
gveGVE device
Return values
rcReturn status code

Definition at line 139 of file gve.c.

139  {
140  uint32_t pfn;
141  unsigned int i;
142 
143  /* Skip reset if admin queue page frame number is already
144  * clear. Triggering a reset on an already-reset device seems
145  * to cause a delayed reset to be scheduled. This can cause
146  * the device to end up in a reset loop, where each attempt to
147  * recover from reset triggers another reset a few seconds
148  * later.
149  */
150  pfn = readl ( gve->cfg + GVE_CFG_ADMIN_PFN );
151  if ( ! pfn ) {
152  DBGC ( gve, "GVE %p skipping reset\n", gve );
153  return 0;
154  }
155 
156  /* Clear admin queue page frame number */
157  writel ( 0, gve->cfg + GVE_CFG_ADMIN_PFN );
158  wmb();
159 
160  /* Wait for device to reset */
161  for ( i = 0 ; i < GVE_RESET_MAX_WAIT_MS ; i++ ) {
162 
163  /* Delay */
164  mdelay ( 1 );
165 
166  /* Check for reset completion */
167  pfn = readl ( gve->cfg + GVE_CFG_ADMIN_PFN );
168  if ( ! pfn )
169  return 0;
170  }
171 
172  DBGC ( gve, "GVE %p reset timed out (PFN %#08x devstat %#08x)\n",
173  gve, bswap_32 ( pfn ),
174  bswap_32 ( readl ( gve->cfg + GVE_CFG_DEVSTAT ) ) );
175  return -ETIMEDOUT;
176 }
wmb()
#define GVE_CFG_ADMIN_PFN
Admin queue page frame number (for older devices)
Definition: gve.h:84
#define GVE_CFG_DEVSTAT
Device status.
Definition: gve.h:73
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define DBGC(...)
Definition: compiler.h:505
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
#define bswap_32(value)
Definition: byteswap.h:70
void * cfg
Configuration registers.
Definition: gve.h:662
#define GVE_RESET_MAX_WAIT_MS
Maximum time to wait for reset.
Definition: gve.h:81
unsigned int uint32_t
Definition: stdint.h:12
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:669

References bswap_32, gve_nic::cfg, DBGC, ETIMEDOUT, GVE_CFG_ADMIN_PFN, GVE_CFG_DEVSTAT, GVE_RESET_MAX_WAIT_MS, mdelay(), readl(), wmb(), and writel().

Referenced by gve_close(), gve_probe(), gve_remove(), gve_setup(), and gve_startup().

◆ gve_admin_alloc()

static int gve_admin_alloc ( struct gve_nic gve)
static

Allocate admin queue.

Parameters
gveGVE device
Return values
rcReturn status code

Definition at line 191 of file gve.c.

191  {
192  struct dma_device *dma = gve->dma;
193  struct gve_admin *admin = &gve->admin;
194  struct gve_irqs *irqs = &gve->irqs;
195  struct gve_events *events = &gve->events;
196  struct gve_scratch *scratch = &gve->scratch;
197  size_t admin_len = ( GVE_ADMIN_COUNT * sizeof ( admin->cmd[0] ) );
198  size_t irqs_len = ( GVE_IRQ_COUNT * sizeof ( irqs->irq[0] ) );
199  size_t events_len = ( GVE_EVENT_MAX * sizeof ( events->event[0] ) );
200  size_t scratch_len = sizeof ( *scratch->buf );
201  int rc;
202 
203  /* Allocate admin queue */
204  admin->cmd = dma_alloc ( dma, &admin->map, admin_len, GVE_ALIGN );
205  if ( ! admin->cmd ) {
206  rc = -ENOMEM;
207  goto err_admin;
208  }
209 
210  /* Allocate interrupt channels */
211  irqs->irq = dma_alloc ( dma, &irqs->map, irqs_len, GVE_ALIGN );
212  if ( ! irqs->irq ) {
213  rc = -ENOMEM;
214  goto err_irqs;
215  }
216 
217  /* Allocate event counters */
218  events->event = dma_alloc ( dma, &events->map, events_len, GVE_ALIGN );
219  if ( ! events->event ) {
220  rc = -ENOMEM;
221  goto err_events;
222  }
223 
224  /* Allocate scratch buffer */
225  scratch->buf = dma_alloc ( dma, &scratch->map, scratch_len, GVE_ALIGN );
226  if ( ! scratch->buf ) {
227  rc = -ENOMEM;
228  goto err_scratch;
229  }
230 
231  DBGC ( gve, "GVE %p AQ at [%08lx,%08lx)\n",
232  gve, virt_to_phys ( admin->cmd ),
233  ( virt_to_phys ( admin->cmd ) + admin_len ) );
234  return 0;
235 
236  dma_free ( &scratch->map, scratch->buf, scratch_len );
237  err_scratch:
238  dma_free ( &events->map, events->event, events_len );
239  err_events:
240  dma_free ( &irqs->map, irqs->irq, irqs_len );
241  err_irqs:
242  dma_free ( &admin->map, admin->cmd, admin_len );
243  err_admin:
244  return rc;
245 }
struct dma_device * dma
DMA device.
Definition: gve.h:670
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct dma_mapping map
DMA mapping.
Definition: gve.h:374
struct gve_event * event
Event counters.
Definition: gve.h:372
union gve_scratch::@46 * buf
Buffer contents.
#define DBGC(...)
Definition: compiler.h:505
#define GVE_ALIGN
Address alignment.
Definition: gve.h:51
static __always_inline unsigned long virt_to_phys(volatile const void *addr)
Convert virtual address to a physical address.
Definition: uaccess.h:287
#define GVE_EVENT_MAX
Maximum number of event counters.
Definition: gve.h:367
#define ENOMEM
Not enough space.
Definition: errno.h:534
void dma_free(struct dma_mapping *map, void *addr, size_t len)
Unmap and free DMA-coherent buffer.
struct dma_mapping map
DMA mapping.
Definition: gve.h:338
struct gve_irqs irqs
Interrupt channels.
Definition: gve.h:675
Event counter array.
Definition: gve.h:370
void * dma_alloc(struct dma_device *dma, struct dma_mapping *map, size_t len, size_t align)
Allocate and map DMA-coherent buffer.
struct gve_events events
Event counters.
Definition: gve.h:677
#define GVE_ADMIN_COUNT
Number of admin queue commands.
Definition: gve.h:316
#define GVE_IRQ_COUNT
Number of interrupt channels.
Definition: gve.h:401
Interrupt channel array.
Definition: gve.h:404
Scratch buffer for admin queue commands.
Definition: gve.h:329
struct dma_mapping map
DMA mapping.
Definition: gve.h:408
struct gve_irq * irq
Interrupt channels.
Definition: gve.h:406
Admin queue.
Definition: gve.h:319
union gve_admin_command * cmd
Commands.
Definition: gve.h:321
struct dma_mapping map
DMA mapping.
Definition: gve.h:325
static __always_inline physaddr_t dma(struct dma_mapping *map, void *addr)
Get DMA address from virtual address.
Definition: dma.h:436
struct gve_admin admin
Admin queue.
Definition: gve.h:673
struct gve_scratch scratch
Scratch buffer.
Definition: gve.h:679
A DMA-capable device.
Definition: dma.h:47

References gve_nic::admin, gve_scratch::buf, gve_admin::cmd, DBGC, dma(), gve_nic::dma, dma_alloc(), dma_free(), ENOMEM, gve_events::event, gve_nic::events, GVE_ADMIN_COUNT, GVE_ALIGN, GVE_EVENT_MAX, GVE_IRQ_COUNT, gve_irqs::irq, gve_nic::irqs, gve_scratch::map, gve_admin::map, gve_events::map, gve_irqs::map, rc, gve_nic::scratch, and virt_to_phys().

Referenced by gve_probe().

◆ gve_admin_free()

static void gve_admin_free ( struct gve_nic gve)
static

Free admin queue.

Parameters
gveGVE device

Definition at line 252 of file gve.c.

252  {
253  struct gve_admin *admin = &gve->admin;
254  struct gve_irqs *irqs = &gve->irqs;
255  struct gve_events *events = &gve->events;
256  struct gve_scratch *scratch = &gve->scratch;
257  size_t admin_len = ( GVE_ADMIN_COUNT * sizeof ( admin->cmd[0] ) );
258  size_t irqs_len = ( GVE_IRQ_COUNT * sizeof ( irqs->irq[0] ) );
259  size_t events_len = ( GVE_EVENT_MAX * sizeof ( events->event[0] ) );
260  size_t scratch_len = sizeof ( *scratch->buf );
261 
262  /* Free scratch buffer */
263  dma_free ( &scratch->map, scratch->buf, scratch_len );
264 
265  /* Free event counter */
266  dma_free ( &events->map, events->event, events_len );
267 
268  /* Free interrupt channels */
269  dma_free ( &irqs->map, irqs->irq, irqs_len );
270 
271  /* Free admin queue */
272  dma_free ( &admin->map, admin->cmd, admin_len );
273 }
struct dma_mapping map
DMA mapping.
Definition: gve.h:374
struct gve_event * event
Event counters.
Definition: gve.h:372
union gve_scratch::@46 * buf
Buffer contents.
#define GVE_EVENT_MAX
Maximum number of event counters.
Definition: gve.h:367
void dma_free(struct dma_mapping *map, void *addr, size_t len)
Unmap and free DMA-coherent buffer.
struct dma_mapping map
DMA mapping.
Definition: gve.h:338
struct gve_irqs irqs
Interrupt channels.
Definition: gve.h:675
Event counter array.
Definition: gve.h:370
struct gve_events events
Event counters.
Definition: gve.h:677
#define GVE_ADMIN_COUNT
Number of admin queue commands.
Definition: gve.h:316
#define GVE_IRQ_COUNT
Number of interrupt channels.
Definition: gve.h:401
Interrupt channel array.
Definition: gve.h:404
Scratch buffer for admin queue commands.
Definition: gve.h:329
struct dma_mapping map
DMA mapping.
Definition: gve.h:408
struct gve_irq * irq
Interrupt channels.
Definition: gve.h:406
Admin queue.
Definition: gve.h:319
union gve_admin_command * cmd
Commands.
Definition: gve.h:321
struct dma_mapping map
DMA mapping.
Definition: gve.h:325
struct gve_admin admin
Admin queue.
Definition: gve.h:673
struct gve_scratch scratch
Scratch buffer.
Definition: gve.h:679

References gve_nic::admin, gve_scratch::buf, gve_admin::cmd, dma_free(), gve_events::event, gve_nic::events, GVE_ADMIN_COUNT, GVE_EVENT_MAX, GVE_IRQ_COUNT, gve_irqs::irq, gve_nic::irqs, gve_admin::map, gve_scratch::map, gve_events::map, gve_irqs::map, and gve_nic::scratch.

Referenced by gve_probe(), and gve_remove().

◆ gve_admin_enable()

static void gve_admin_enable ( struct gve_nic gve)
static

Enable admin queue.

Parameters
gveGVE device

Definition at line 280 of file gve.c.

280  {
281  struct gve_admin *admin = &gve->admin;
282  size_t admin_len = ( GVE_ADMIN_COUNT * sizeof ( admin->cmd[0] ) );
284 
285  /* Reset queue */
286  admin->prod = 0;
287 
288  /* Program queue addresses and capabilities */
289  base = dma ( &admin->map, admin->cmd );
291  gve->cfg + GVE_CFG_ADMIN_PFN );
292  writel ( bswap_32 ( base & 0xffffffffUL ),
293  gve->cfg + GVE_CFG_ADMIN_BASE_LO );
294  if ( sizeof ( base ) > sizeof ( uint32_t ) ) {
295  writel ( bswap_32 ( ( ( uint64_t ) base ) >> 32 ),
296  gve->cfg + GVE_CFG_ADMIN_BASE_HI );
297  } else {
298  writel ( 0, gve->cfg + GVE_CFG_ADMIN_BASE_HI );
299  }
300  writel ( bswap_16 ( admin_len ), gve->cfg + GVE_CFG_ADMIN_LEN );
302 }
uint32_t base
Base.
Definition: librm.h:252
#define GVE_PAGE_SIZE
Page size.
Definition: gve.h:42
#define GVE_CFG_ADMIN_PFN
Admin queue page frame number (for older devices)
Definition: gve.h:84
#define GVE_CFG_DRVSTAT
Driver status.
Definition: gve.h:77
unsigned long long uint64_t
Definition: stdint.h:13
#define GVE_CFG_ADMIN_LEN
Admin queue base address length (16-bit register)
Definition: gve.h:102
#define bswap_16(value)
Definition: byteswap.h:58
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
uint32_t prod
Producer counter.
Definition: gve.h:323
#define bswap_32(value)
Definition: byteswap.h:70
void * cfg
Configuration registers.
Definition: gve.h:662
#define GVE_CFG_ADMIN_BASE_LO
Admin queue base address low 32 bits.
Definition: gve.h:99
unsigned int uint32_t
Definition: stdint.h:12
unsigned long physaddr_t
Definition: stdint.h:20
#define GVE_CFG_ADMIN_BASE_HI
Admin queue base address high 32 bits.
Definition: gve.h:96
#define GVE_ADMIN_COUNT
Number of admin queue commands.
Definition: gve.h:316
#define GVE_CFG_DRVSTAT_RUN
Run admin queue.
Definition: gve.h:78
Admin queue.
Definition: gve.h:319
union gve_admin_command * cmd
Commands.
Definition: gve.h:321
struct dma_mapping map
DMA mapping.
Definition: gve.h:325
static __always_inline physaddr_t dma(struct dma_mapping *map, void *addr)
Get DMA address from virtual address.
Definition: dma.h:436
struct gve_admin admin
Admin queue.
Definition: gve.h:673

References gve_nic::admin, base, bswap_16, bswap_32, gve_nic::cfg, gve_admin::cmd, dma(), GVE_ADMIN_COUNT, GVE_CFG_ADMIN_BASE_HI, GVE_CFG_ADMIN_BASE_LO, GVE_CFG_ADMIN_LEN, GVE_CFG_ADMIN_PFN, GVE_CFG_DRVSTAT, GVE_CFG_DRVSTAT_RUN, GVE_PAGE_SIZE, gve_admin::map, gve_admin::prod, and writel().

Referenced by gve_setup(), and gve_startup().

◆ gve_admin_command()

static union gve_admin_command* gve_admin_command ( struct gve_nic gve)
static

Get next available admin queue command slot.

Parameters
gveGVE device
Return values
cmdAdmin queue command

Definition at line 310 of file gve.c.

310  {
311  struct gve_admin *admin = &gve->admin;
312  union gve_admin_command *cmd;
313  unsigned int index;
314 
315  /* Get next command slot */
316  index = admin->prod;
317  cmd = &admin->cmd[ index % GVE_ADMIN_COUNT ];
318 
319  /* Initialise request */
320  memset ( cmd, 0, sizeof ( *cmd ) );
321 
322  return cmd;
323 }
long index
Definition: bigint.h:61
An admin queue command.
Definition: gve.h:285
uint32_t prod
Producer counter.
Definition: gve.h:323
#define GVE_ADMIN_COUNT
Number of admin queue commands.
Definition: gve.h:316
Admin queue.
Definition: gve.h:319
union gve_admin_command * cmd
Commands.
Definition: gve.h:321
struct gve_admin admin
Admin queue.
Definition: gve.h:673
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29
void * memset(void *dest, int character, size_t len) __nonnull

References gve_nic::admin, cmd, gve_admin::cmd, GVE_ADMIN_COUNT, index, memset(), and gve_admin::prod.

Referenced by gve_admin_simple(), gve_configure(), gve_create_queue(), gve_describe(), and gve_register().

◆ gve_admin_wait()

static int gve_admin_wait ( struct gve_nic gve)
static

Wait for admin queue command to complete.

Parameters
gveGVE device
Return values
rcReturn status code

Definition at line 331 of file gve.c.

331  {
332  struct gve_admin *admin = &gve->admin;
333  uint32_t evt;
334  uint32_t pfn;
335  unsigned int i;
336 
337  /* Wait for any outstanding commands to complete */
338  for ( i = 0 ; i < GVE_ADMIN_MAX_WAIT_MS ; i++ ) {
339 
340  /* Check event counter */
341  rmb();
342  evt = bswap_32 ( readl ( gve->cfg + GVE_CFG_ADMIN_EVT ) );
343  if ( evt == admin->prod )
344  return 0;
345 
346  /* Check for device reset */
347  pfn = readl ( gve->cfg + GVE_CFG_ADMIN_PFN );
348  if ( ! pfn )
349  break;
350 
351  /* Delay */
352  mdelay ( 1 );
353  }
354 
355  DBGC ( gve, "GVE %p AQ %#02x %s (completed %#02x, status %#08x)\n",
356  gve, admin->prod, ( pfn ? "timed out" : "saw reset" ), evt,
357  bswap_32 ( readl ( gve->cfg + GVE_CFG_DEVSTAT ) ) );
358  return ( pfn ? -ETIMEDOUT : -ECONNRESET );
359 }
#define ECONNRESET
Connection reset.
Definition: errno.h:363
#define GVE_CFG_ADMIN_PFN
Admin queue page frame number (for older devices)
Definition: gve.h:84
#define GVE_CFG_DEVSTAT
Device status.
Definition: gve.h:73
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define DBGC(...)
Definition: compiler.h:505
#define rmb()
Definition: io.h:484
uint32_t prod
Producer counter.
Definition: gve.h:323
#define bswap_32(value)
Definition: byteswap.h:70
void * cfg
Configuration registers.
Definition: gve.h:662
unsigned int uint32_t
Definition: stdint.h:12
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
#define GVE_ADMIN_MAX_WAIT_MS
Maximum time to wait for admin queue commands.
Definition: gve.h:701
#define GVE_CFG_ADMIN_EVT
Admin queue event counter.
Definition: gve.h:90
Admin queue.
Definition: gve.h:319
struct gve_admin admin
Admin queue.
Definition: gve.h:673
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:669

References gve_nic::admin, bswap_32, gve_nic::cfg, DBGC, ECONNRESET, ETIMEDOUT, GVE_ADMIN_MAX_WAIT_MS, GVE_CFG_ADMIN_EVT, GVE_CFG_ADMIN_PFN, GVE_CFG_DEVSTAT, mdelay(), gve_admin::prod, readl(), and rmb.

Referenced by gve_admin().

◆ gve_admin()

static int gve_admin ( struct gve_nic gve)
static

Issue admin queue command.

Parameters
gveGVE device
Return values
rcReturn status code

Definition at line 367 of file gve.c.

367  {
368  struct gve_admin *admin = &gve->admin;
369  union gve_admin_command *cmd;
370  unsigned int index;
373  int rc;
374 
375  /* Ensure admin queue is idle */
376  if ( ( rc = gve_admin_wait ( gve ) ) != 0 )
377  return rc;
378 
379  /* Get next command slot */
380  index = admin->prod;
381  cmd = &admin->cmd[ index % GVE_ADMIN_COUNT ];
382  opcode = cmd->hdr.opcode;
383  DBGC2 ( gve, "GVE %p AQ %#02x command %#04x request:\n",
384  gve, index, opcode );
385  DBGC2_HDA ( gve, 0, cmd, sizeof ( *cmd ) );
386 
387  /* Increment producer counter */
388  admin->prod++;
389 
390  /* Ring doorbell */
391  wmb();
392  writel ( bswap_32 ( admin->prod ), gve->cfg + GVE_CFG_ADMIN_DB );
393 
394  /* Wait for command to complete */
395  if ( ( rc = gve_admin_wait ( gve ) ) != 0 )
396  return rc;
397 
398  /* Check command status */
399  status = be32_to_cpu ( cmd->hdr.status );
400  if ( status != GVE_ADMIN_STATUS_OK ) {
401  rc = -EIO_ADMIN ( status );
402  DBGC ( gve, "GVE %p AQ %#02x command %#04x failed: %#08x\n",
403  gve, index, opcode, status );
404  DBGC_HDA ( gve, 0, cmd, sizeof ( *cmd ) );
405  DBGC ( gve, "GVE %p AQ error: %s\n", gve, strerror ( rc ) );
406  return rc;
407  }
408 
409  DBGC2 ( gve, "GVE %p AQ %#02x command %#04x result:\n",
410  gve, index, opcode );
411  DBGC2_HDA ( gve, 0, cmd, sizeof ( *cmd ) );
412  return 0;
413 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define GVE_ADMIN_STATUS_OK
Command succeeded.
Definition: gve.h:122
wmb()
uint8_t opcode
Opcode.
Definition: ena.h:16
#define DBGC(...)
Definition: compiler.h:505
long index
Definition: bigint.h:61
An admin queue command.
Definition: gve.h:285
#define GVE_CFG_ADMIN_DB
Admin queue doorbell.
Definition: gve.h:87
#define be32_to_cpu(value)
Definition: byteswap.h:116
#define DBGC_HDA(...)
Definition: compiler.h:506
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
uint32_t prod
Producer counter.
Definition: gve.h:323
#define bswap_32(value)
Definition: byteswap.h:70
#define DBGC2_HDA(...)
Definition: compiler.h:523
void * cfg
Configuration registers.
Definition: gve.h:662
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
#define EIO_ADMIN(status)
Definition: gve.c:116
unsigned int uint32_t
Definition: stdint.h:12
uint8_t status
Status.
Definition: ena.h:16
#define GVE_ADMIN_COUNT
Number of admin queue commands.
Definition: gve.h:316
#define DBGC2(...)
Definition: compiler.h:522
static int gve_admin_wait(struct gve_nic *gve)
Wait for admin queue command to complete.
Definition: gve.c:331
Admin queue.
Definition: gve.h:319
union gve_admin_command * cmd
Commands.
Definition: gve.h:321
struct gve_admin admin
Admin queue.
Definition: gve.h:673
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29

References gve_nic::admin, be32_to_cpu, bswap_32, gve_nic::cfg, cmd, gve_admin::cmd, DBGC, DBGC2, DBGC2_HDA, DBGC_HDA, EIO_ADMIN, GVE_ADMIN_COUNT, GVE_ADMIN_STATUS_OK, gve_admin_wait(), GVE_CFG_ADMIN_DB, index, opcode, gve_admin::prod, rc, status, strerror(), wmb(), and writel().

◆ gve_admin_simple()

static int gve_admin_simple ( struct gve_nic gve,
unsigned int  opcode,
unsigned int  id 
)
static

Issue simple admin queue command.

Parameters
gveGVE device
opcodeOperation code
idID parameter (or zero if not applicable)
Return values
rcReturn status code

Several admin queue commands take either an empty parameter list or a single 32-bit ID parameter.

Definition at line 426 of file gve.c.

427  {
428  union gve_admin_command *cmd;
429  int rc;
430 
431  /* Construct request */
432  cmd = gve_admin_command ( gve );
433  cmd->hdr.opcode = opcode;
434  cmd->simple.id = cpu_to_be32 ( id );
435 
436  /* Issue command */
437  if ( ( rc = gve_admin ( gve ) ) != 0 )
438  return rc;
439 
440  return 0;
441 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
uint8_t opcode
Opcode.
Definition: ena.h:16
An admin queue command.
Definition: gve.h:285
#define cpu_to_be32(value)
Definition: byteswap.h:110
static union gve_admin_command * gve_admin_command(struct gve_nic *gve)
Get next available admin queue command slot.
Definition: gve.c:310
Admin queue.
Definition: gve.h:319
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29

References cmd, cpu_to_be32, gve_admin_command(), opcode, and rc.

◆ gve_describe()

static int gve_describe ( struct gve_nic gve)
static

Get device descriptor.

Parameters
gveGVE device
Return values
rcReturn status code

Definition at line 449 of file gve.c.

449  {
450  struct net_device *netdev = gve->netdev;
451  struct gve_device_descriptor *desc = &gve->scratch.buf->desc;
452  union gve_admin_command *cmd;
453  int rc;
454 
455  /* Construct request */
456  cmd = gve_admin_command ( gve );
457  cmd->hdr.opcode = GVE_ADMIN_DESCRIBE;
458  cmd->desc.addr = cpu_to_be64 ( dma ( &gve->scratch.map, desc ) );
459  cmd->desc.ver = cpu_to_be32 ( GVE_ADMIN_DESCRIBE_VER );
460  cmd->desc.len = cpu_to_be32 ( sizeof ( *desc ) );
461 
462  /* Issue command */
463  if ( ( rc = gve_admin ( gve ) ) != 0 )
464  return rc;
465  DBGC2 ( gve, "GVE %p device descriptor:\n", gve );
466  DBGC2_HDA ( gve, 0, desc, sizeof ( *desc ) );
467 
468  /* Extract queue parameters */
469  gve->events.count = be16_to_cpu ( desc->counters );
470  if ( gve->events.count > GVE_EVENT_MAX )
471  gve->events.count = GVE_EVENT_MAX;
472  gve->tx.count = be16_to_cpu ( desc->tx_count );
473  gve->rx.count = be16_to_cpu ( desc->rx_count );
474  DBGC ( gve, "GVE %p using %d TX, %d RX, %d/%d events\n",
475  gve, gve->tx.count, gve->rx.count, gve->events.count,
476  be16_to_cpu ( desc->counters ) );
477 
478  /* Extract network parameters */
479  build_assert ( sizeof ( desc->mac ) == ETH_ALEN );
480  memcpy ( netdev->hw_addr, &desc->mac, sizeof ( desc->mac ) );
481  netdev->mtu = be16_to_cpu ( desc->mtu );
483  DBGC ( gve, "GVE %p MAC %s (\"%s\") MTU %zd\n",
484  gve, eth_ntoa ( netdev->hw_addr ),
485  inet_ntoa ( desc->mac.in ), netdev->mtu );
486 
487  return 0;
488 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define GVE_ADMIN_DESCRIBE
Describe device command.
Definition: gve.h:133
union gve_scratch::@46 * buf
Buffer contents.
struct gve_device_descriptor desc
Device descriptor.
Definition: gve.h:333
size_t mtu
Maximum transmission unit length.
Definition: netdevice.h:415
uint64_t desc
Microcode descriptor list physical address.
Definition: ucode.h:12
#define DBGC(...)
Definition: compiler.h:505
Device descriptor.
Definition: gve.h:151
struct gve_queue rx
Receive queue.
Definition: gve.h:684
struct gve_queue tx
Transmit queue.
Definition: gve.h:682
#define GVE_EVENT_MAX
Maximum number of event counters.
Definition: gve.h:367
void * memcpy(void *dest, const void *src, size_t len) __nonnull
An admin queue command.
Definition: gve.h:285
#define ETH_HLEN
Definition: if_ether.h:9
struct dma_mapping map
DMA mapping.
Definition: gve.h:338
#define build_assert(condition)
Assert a condition at build time (after dead code elimination)
Definition: assert.h:76
static struct net_device * netdev
Definition: gdbudp.c:52
#define be16_to_cpu(value)
Definition: byteswap.h:115
#define DBGC2_HDA(...)
Definition: compiler.h:523
const char * eth_ntoa(const void *ll_addr)
Transcribe Ethernet address.
Definition: ethernet.c:175
A network device.
Definition: netdevice.h:352
char * inet_ntoa(struct in_addr in)
Convert IPv4 address to dotted-quad notation.
Definition: ipv4.c:668
#define ETH_ALEN
Definition: if_ether.h:8
#define cpu_to_be32(value)
Definition: byteswap.h:110
unsigned int count
Number of descriptors (must be a power of two)
Definition: gve.h:606
struct gve_events events
Event counters.
Definition: gve.h:677
#define DBGC2(...)
Definition: compiler.h:522
unsigned int count
Actual number of event counters.
Definition: gve.h:376
static union gve_admin_command * gve_admin_command(struct gve_nic *gve)
Get next available admin queue command slot.
Definition: gve.c:310
#define cpu_to_be64(value)
Definition: byteswap.h:111
struct net_device * netdev
Network device.
Definition: gve.h:668
#define GVE_ADMIN_DESCRIBE_VER
Device descriptor version.
Definition: gve.h:148
Admin queue.
Definition: gve.h:319
size_t max_pkt_len
Maximum packet length.
Definition: netdevice.h:409
static __always_inline physaddr_t dma(struct dma_mapping *map, void *addr)
Get DMA address from virtual address.
Definition: dma.h:436
uint8_t hw_addr[MAX_HW_ADDR_LEN]
Hardware address.
Definition: netdevice.h:381
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29
struct gve_scratch scratch
Scratch buffer.
Definition: gve.h:679

References be16_to_cpu, gve_scratch::buf, build_assert, cmd, gve_events::count, gve_queue::count, cpu_to_be32, cpu_to_be64, DBGC, DBGC2, DBGC2_HDA, desc, gve_scratch::desc, dma(), ETH_ALEN, ETH_HLEN, eth_ntoa(), gve_nic::events, gve_admin_command(), GVE_ADMIN_DESCRIBE, GVE_ADMIN_DESCRIBE_VER, GVE_EVENT_MAX, net_device::hw_addr, inet_ntoa(), gve_scratch::map, net_device::max_pkt_len, memcpy(), net_device::mtu, netdev, gve_nic::netdev, rc, gve_nic::rx, gve_nic::scratch, and gve_nic::tx.

Referenced by gve_setup().

◆ gve_configure()

static int gve_configure ( struct gve_nic gve)
static

Configure device resources.

Parameters
gveGVE device
Return values
rcReturn status code

Definition at line 496 of file gve.c.

496  {
497  struct gve_events *events = &gve->events;
498  struct gve_irqs *irqs = &gve->irqs;
499  union gve_admin_command *cmd;
500  unsigned int db_off;
501  unsigned int i;
502  int rc;
503 
504  /* Construct request */
505  cmd = gve_admin_command ( gve );
506  cmd->hdr.opcode = GVE_ADMIN_CONFIGURE;
507  cmd->conf.events =
508  cpu_to_be64 ( dma ( &events->map, events->event ) );
509  cmd->conf.irqs =
510  cpu_to_be64 ( dma ( &irqs->map, irqs->irq ) );
511  cmd->conf.num_events = cpu_to_be32 ( events->count );
512  cmd->conf.num_irqs = cpu_to_be32 ( GVE_IRQ_COUNT );
513  cmd->conf.irq_stride = cpu_to_be32 ( sizeof ( irqs->irq[0] ) );
514 
515  /* Issue command */
516  if ( ( rc = gve_admin ( gve ) ) != 0 )
517  return rc;
518 
519  /* Disable all interrupts */
520  for ( i = 0 ; i < GVE_IRQ_COUNT ; i++ ) {
521  db_off = ( be32_to_cpu ( irqs->irq[i].db_idx ) *
522  sizeof ( uint32_t ) );
523  DBGC ( gve, "GVE %p IRQ %d doorbell +%#04x\n", gve, i, db_off );
524  irqs->db[i] = ( gve->db + db_off );
525  writel ( bswap_32 ( GVE_IRQ_DISABLE ), irqs->db[i] );
526  }
527 
528  return 0;
529 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct dma_mapping map
DMA mapping.
Definition: gve.h:374
struct gve_event * event
Event counters.
Definition: gve.h:372
#define DBGC(...)
Definition: compiler.h:505
#define GVE_IRQ_DISABLE
Disable interrupts.
Definition: gve.h:414
void * db
Doorbell registers.
Definition: gve.h:664
An admin queue command.
Definition: gve.h:285
#define be32_to_cpu(value)
Definition: byteswap.h:116
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
volatile uint32_t * db[GVE_IRQ_COUNT]
Interrupt doorbells.
Definition: gve.h:410
struct gve_irqs irqs
Interrupt channels.
Definition: gve.h:675
#define bswap_32(value)
Definition: byteswap.h:70
Event counter array.
Definition: gve.h:370
unsigned int uint32_t
Definition: stdint.h:12
#define cpu_to_be32(value)
Definition: byteswap.h:110
#define GVE_ADMIN_CONFIGURE
Configure device resources command.
Definition: gve.h:173
struct gve_events events
Event counters.
Definition: gve.h:677
#define GVE_IRQ_COUNT
Number of interrupt channels.
Definition: gve.h:401
Interrupt channel array.
Definition: gve.h:404
unsigned int count
Actual number of event counters.
Definition: gve.h:376
static union gve_admin_command * gve_admin_command(struct gve_nic *gve)
Get next available admin queue command slot.
Definition: gve.c:310
#define cpu_to_be64(value)
Definition: byteswap.h:111
uint32_t db_idx
Interrupt doorbell index (within doorbell BAR)
Definition: gve.h:382
struct dma_mapping map
DMA mapping.
Definition: gve.h:408
struct gve_irq * irq
Interrupt channels.
Definition: gve.h:406
Admin queue.
Definition: gve.h:319
static __always_inline physaddr_t dma(struct dma_mapping *map, void *addr)
Get DMA address from virtual address.
Definition: dma.h:436
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29

References be32_to_cpu, bswap_32, cmd, gve_events::count, cpu_to_be32, cpu_to_be64, gve_irqs::db, gve_nic::db, gve_irq::db_idx, DBGC, dma(), gve_events::event, gve_nic::events, gve_admin_command(), GVE_ADMIN_CONFIGURE, GVE_IRQ_COUNT, GVE_IRQ_DISABLE, gve_irqs::irq, gve_nic::irqs, gve_events::map, gve_irqs::map, rc, and writel().

Referenced by gve_start().

◆ gve_deconfigure()

static int gve_deconfigure ( struct gve_nic gve)
static

Deconfigure device resources.

Parameters
gveGVE device
Return values
rcReturn status code

Definition at line 537 of file gve.c.

537  {
538  int rc;
539 
540  /* Issue command (with meaningless ID) */
541  if ( ( rc = gve_admin_simple ( gve, GVE_ADMIN_DECONFIGURE, 0 ) ) != 0 )
542  return rc;
543 
544  return 0;
545 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
Simple admin command.
Definition: gve.h:125
#define GVE_ADMIN_DECONFIGURE
Deconfigure device resources command.
Definition: gve.h:282

References GVE_ADMIN_DECONFIGURE, and rc.

Referenced by gve_start(), and gve_stop().

◆ gve_register()

static int gve_register ( struct gve_nic gve,
struct gve_qpl qpl 
)
static

Register queue page list.

Parameters
gveGVE device
qplQueue page list
Return values
rcReturn status code

Definition at line 554 of file gve.c.

554  {
555  struct gve_pages *pages = &gve->scratch.buf->pages;
556  union gve_admin_command *cmd;
558  unsigned int i;
559  int rc;
560 
561  /* Build page address list */
562  for ( i = 0 ; i < qpl->count ; i++ ) {
563  addr = user_to_phys ( qpl->data, ( i * GVE_PAGE_SIZE ) );
564  pages->addr[i] = cpu_to_be64 ( dma_phys ( &qpl->map, addr ) );
565  }
566 
567  /* Construct request */
568  cmd = gve_admin_command ( gve );
569  cmd->hdr.opcode = GVE_ADMIN_REGISTER;
570  cmd->reg.id = cpu_to_be32 ( qpl->id );
571  cmd->reg.count = cpu_to_be32 ( qpl->count );
572  cmd->reg.addr = cpu_to_be64 ( dma ( &gve->scratch.map, pages ) );
573  cmd->reg.size = cpu_to_be64 ( GVE_PAGE_SIZE );
574 
575  /* Issue command */
576  if ( ( rc = gve_admin ( gve ) ) != 0 )
577  return rc;
578 
579  return 0;
580 }
#define GVE_PAGE_SIZE
Page size.
Definition: gve.h:42
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
union gve_scratch::@46 * buf
Buffer contents.
physaddr_t dma_phys(struct dma_mapping *map, physaddr_t addr)
Get DMA address from physical address.
unsigned long user_to_phys(userptr_t userptr, off_t offset)
Convert user pointer to physical address.
uint64_t addr[GVE_QPL_MAX]
Page address.
Definition: gve.h:219
#define GVE_ADMIN_REGISTER
Register page list command.
Definition: gve.h:192
struct dma_mapping map
Page mapping.
Definition: gve.h:489
An admin queue command.
Definition: gve.h:285
struct dma_mapping map
DMA mapping.
Definition: gve.h:338
unsigned int count
Number of pages.
Definition: gve.h:491
struct gve_pages pages
Page address list.
Definition: gve.h:335
unsigned long physaddr_t
Definition: stdint.h:20
unsigned int id
Queue page list ID.
Definition: gve.h:493
#define cpu_to_be32(value)
Definition: byteswap.h:110
userptr_t data
Page addresses.
Definition: gve.h:487
u32 addr
Definition: sky2.h:8
static union gve_admin_command * gve_admin_command(struct gve_nic *gve)
Get next available admin queue command slot.
Definition: gve.c:310
#define cpu_to_be64(value)
Definition: byteswap.h:111
Page list.
Definition: gve.h:217
Admin queue.
Definition: gve.h:319
static __always_inline physaddr_t dma(struct dma_mapping *map, void *addr)
Get DMA address from virtual address.
Definition: dma.h:436
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29
struct gve_scratch scratch
Scratch buffer.
Definition: gve.h:679

References addr, gve_pages::addr, gve_scratch::buf, cmd, gve_qpl::count, cpu_to_be32, cpu_to_be64, gve_qpl::data, dma(), dma_phys(), gve_admin_command(), GVE_ADMIN_REGISTER, GVE_PAGE_SIZE, gve_qpl::id, gve_scratch::map, gve_qpl::map, gve_scratch::pages, rc, gve_nic::scratch, and user_to_phys().

Referenced by gve_start().

◆ gve_unregister()

static int gve_unregister ( struct gve_nic gve,
struct gve_qpl qpl 
)
static

Unregister page list.

Parameters
gveGVE device
qplQueue page list
Return values
rcReturn status code

Definition at line 589 of file gve.c.

589  {
590  int rc;
591 
592  /* Issue command */
593  if ( ( rc = gve_admin_simple ( gve, GVE_ADMIN_UNREGISTER,
594  qpl->id ) ) != 0 ) {
595  return rc;
596  }
597 
598  return 0;
599 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
Simple admin command.
Definition: gve.h:125
unsigned int id
Queue page list ID.
Definition: gve.h:493
#define GVE_ADMIN_UNREGISTER
Unregister page list command.
Definition: gve.h:223

References GVE_ADMIN_UNREGISTER, gve_qpl::id, and rc.

Referenced by gve_start(), and gve_stop().

◆ gve_create_tx_param()

static void gve_create_tx_param ( struct gve_queue queue,
union gve_admin_command cmd 
)
static

Construct command to create transmit queue.

Parameters
queueTransmit queue
cmdAdmin queue command

Definition at line 607 of file gve.c.

608  {
609  struct gve_admin_create_tx *create = &cmd->create_tx;
610  const struct gve_queue_type *type = queue->type;
611  physaddr_t desc = user_to_phys ( queue->desc, 0 );
612 
613  /* Construct request parameters */
614  create->res = cpu_to_be64 ( dma ( &queue->res_map, queue->res ) );
615  create->desc = cpu_to_be64 ( dma_phys ( &queue->desc_map, desc ) );
616  create->qpl_id = cpu_to_be32 ( type->qpl );
617  create->notify_id = cpu_to_be32 ( type->irq );
618 }
uint32_t type
Operating system type.
Definition: ena.h:12
physaddr_t dma_phys(struct dma_mapping *map, physaddr_t addr)
Get DMA address from physical address.
Create transmit queue command.
Definition: gve.h:229
unsigned long user_to_phys(userptr_t userptr, off_t offset)
Convert user pointer to physical address.
uint64_t desc
Microcode descriptor list physical address.
Definition: ucode.h:12
unsigned long physaddr_t
Definition: stdint.h:20
#define cpu_to_be32(value)
Definition: byteswap.h:110
#define cpu_to_be64(value)
Definition: byteswap.h:111
A descriptor queue type.
Definition: gve.h:632
static __always_inline physaddr_t dma(struct dma_mapping *map, void *addr)
Get DMA address from virtual address.
Definition: dma.h:436
uint16_t queue
Queue ID.
Definition: ena.h:22
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29
uint8_t create
Command to create queue.
Definition: gve.h:654

References cmd, cpu_to_be32, cpu_to_be64, gve_queue_type::create, desc, dma(), dma_phys(), queue, type, and user_to_phys().

◆ gve_create_rx_param()

static void gve_create_rx_param ( struct gve_queue queue,
union gve_admin_command cmd 
)
static

Construct command to create receive queue.

Parameters
queueReceive queue
cmdAdmin queue command

Definition at line 626 of file gve.c.

627  {
628  struct gve_admin_create_rx *create = &cmd->create_rx;
629  const struct gve_queue_type *type = queue->type;
630  physaddr_t desc = user_to_phys ( queue->desc, 0 );
631  physaddr_t cmplt = user_to_phys ( queue->cmplt, 0 );
632 
633  /* Construct request parameters */
634  create->notify_id = cpu_to_be32 ( type->irq );
635  create->res = cpu_to_be64 ( dma ( &queue->res_map, queue->res ) );
636  create->desc = cpu_to_be64 ( dma_phys ( &queue->desc_map, desc ) );
637  create->cmplt = cpu_to_be64 ( dma_phys ( &queue->cmplt_map, cmplt ) );
638  create->qpl_id = cpu_to_be32 ( type->qpl );
639  create->bufsz = cpu_to_be16 ( GVE_BUF_SIZE );
640 }
#define cpu_to_be16(value)
Definition: byteswap.h:109
Create receive queue command.
Definition: gve.h:250
uint32_t type
Operating system type.
Definition: ena.h:12
physaddr_t dma_phys(struct dma_mapping *map, physaddr_t addr)
Get DMA address from physical address.
unsigned long user_to_phys(userptr_t userptr, off_t offset)
Convert user pointer to physical address.
uint64_t desc
Microcode descriptor list physical address.
Definition: ucode.h:12
unsigned long physaddr_t
Definition: stdint.h:20
#define cpu_to_be32(value)
Definition: byteswap.h:110
#define cpu_to_be64(value)
Definition: byteswap.h:111
#define GVE_BUF_SIZE
Queue data buffer size.
Definition: gve.h:446
A descriptor queue type.
Definition: gve.h:632
static __always_inline physaddr_t dma(struct dma_mapping *map, void *addr)
Get DMA address from virtual address.
Definition: dma.h:436
uint16_t queue
Queue ID.
Definition: ena.h:22
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29
uint8_t create
Command to create queue.
Definition: gve.h:654

References cmd, cpu_to_be16, cpu_to_be32, cpu_to_be64, gve_queue_type::create, desc, dma(), dma_phys(), GVE_BUF_SIZE, queue, type, and user_to_phys().

◆ gve_create_queue()

static int gve_create_queue ( struct gve_nic gve,
struct gve_queue queue 
)
static

Create transmit or receive queue.

Parameters
gveGVE device
queueDescriptor queue
Return values
rcReturn status code

Definition at line 649 of file gve.c.

649  {
650  const struct gve_queue_type *type = queue->type;
651  union gve_admin_command *cmd;
652  unsigned int db_off;
653  unsigned int evt_idx;
654  int rc;
655 
656  /* Reset queue */
657  queue->prod = 0;
658  queue->cons = 0;
659 
660  /* Construct request */
661  cmd = gve_admin_command ( gve );
662  cmd->hdr.opcode = type->create;
663  type->param ( queue, cmd );
664 
665  /* Issue command */
666  if ( ( rc = gve_admin ( gve ) ) != 0 )
667  return rc;
668 
669  /* Record indices */
670  db_off = ( be32_to_cpu ( queue->res->db_idx ) * sizeof ( uint32_t ) );
671  evt_idx = be32_to_cpu ( queue->res->evt_idx );
672  DBGC ( gve, "GVE %p %s doorbell +%#04x event counter %d\n",
673  gve, type->name, db_off, evt_idx );
674  queue->db = ( gve->db + db_off );
675  assert ( evt_idx < gve->events.count );
676  queue->event = &gve->events.event[evt_idx];
677  assert ( queue->event->count == 0 );
678 
679  return 0;
680 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct gve_event * event
Event counters.
Definition: gve.h:372
uint32_t type
Operating system type.
Definition: ena.h:12
#define DBGC(...)
Definition: compiler.h:505
void * db
Doorbell registers.
Definition: gve.h:664
An admin queue command.
Definition: gve.h:285
#define be32_to_cpu(value)
Definition: byteswap.h:116
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
unsigned int uint32_t
Definition: stdint.h:12
struct gve_events events
Event counters.
Definition: gve.h:677
static union gve_admin_command * gve_admin_command(struct gve_nic *gve)
Get next available admin queue command slot.
Definition: gve.c:310
Admin queue.
Definition: gve.h:319
A descriptor queue type.
Definition: gve.h:632
uint16_t queue
Queue ID.
Definition: ena.h:22
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29

References assert(), be32_to_cpu, cmd, gve_nic::db, DBGC, gve_events::event, gve_nic::events, gve_admin_command(), queue, rc, and type.

Referenced by gve_start().

◆ gve_destroy_queue()

static int gve_destroy_queue ( struct gve_nic gve,
struct gve_queue queue 
)
static

Destroy transmit or receive queue.

Parameters
gveGVE device
queueDescriptor queue
Return values
rcReturn status code

Definition at line 689 of file gve.c.

689  {
690  const struct gve_queue_type *type = queue->type;
691  int rc;
692 
693  /* Issue command */
694  if ( ( rc = gve_admin_simple ( gve, type->destroy, 0 ) ) != 0 )
695  return rc;
696 
697  return 0;
698 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
uint32_t type
Operating system type.
Definition: ena.h:12
Simple admin command.
Definition: gve.h:125
A descriptor queue type.
Definition: gve.h:632
uint16_t queue
Queue ID.
Definition: ena.h:22

References queue, rc, and type.

Referenced by gve_start(), and gve_stop().

◆ gve_alloc_qpl()

static int gve_alloc_qpl ( struct gve_nic gve,
struct gve_qpl qpl,
uint32_t  id,
unsigned int  buffers 
)
static

Allocate queue page list.

Parameters
gveGVE device
qplQueue page list
idQueue page list ID
buffersNumber of data buffers
Return values
rcReturn status code

Definition at line 716 of file gve.c.

717  {
718  size_t len;
719 
720  /* Record ID */
721  qpl->id = id;
722 
723  /* Calculate number of pages required */
725  qpl->count = ( ( buffers + GVE_BUF_PER_PAGE - 1 ) / GVE_BUF_PER_PAGE );
726  assert ( qpl->count <= GVE_QPL_MAX );
727 
728  /* Allocate pages (as a single block) */
729  len = ( qpl->count * GVE_PAGE_SIZE );
730  qpl->data = dma_umalloc ( gve->dma, &qpl->map, len, GVE_ALIGN );
731  if ( ! qpl->data )
732  return -ENOMEM;
733 
734  DBGC ( gve, "GVE %p QPL %#08x at [%08lx,%08lx)\n",
735  gve, qpl->id, user_to_phys ( qpl->data, 0 ),
736  user_to_phys ( qpl->data, len ) );
737  return 0;
738 }
#define GVE_PAGE_SIZE
Page size.
Definition: gve.h:42
struct dma_device * dma
DMA device.
Definition: gve.h:670
unsigned long user_to_phys(userptr_t userptr, off_t offset)
Convert user pointer to physical address.
#define DBGC(...)
Definition: compiler.h:505
#define GVE_ALIGN
Address alignment.
Definition: gve.h:51
uint32_t qpl
Queue page list ID.
Definition: gve.h:644
#define GVE_BUF_PER_PAGE
Number of data buffers per page.
Definition: gve.h:449
#define ENOMEM
Not enough space.
Definition: errno.h:534
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define build_assert(condition)
Assert a condition at build time (after dead code elimination)
Definition: assert.h:76
uint8_t id
Request identifier.
Definition: ena.h:12
#define GVE_QPL_MAX
Maximum number of pages per queue.
Definition: gve.h:214
userptr_t dma_umalloc(struct dma_device *dma, struct dma_mapping *map, size_t len, size_t align)
Allocate and map DMA-coherent buffer from external (user) memory.
#define GVE_BUF_SIZE
Queue data buffer size.
Definition: gve.h:446
uint32_t len
Length.
Definition: ena.h:14

References assert(), build_assert, DBGC, gve_nic::dma, dma_umalloc(), ENOMEM, GVE_ALIGN, GVE_BUF_PER_PAGE, GVE_BUF_SIZE, GVE_PAGE_SIZE, GVE_QPL_MAX, id, len, gve_queue_type::qpl, and user_to_phys().

Referenced by gve_alloc_queue().

◆ gve_free_qpl()

static void gve_free_qpl ( struct gve_nic *nic  __unused,
struct gve_qpl qpl 
)
static

Free queue page list.

Parameters
gveGVE device
qplQueue page list

Definition at line 746 of file gve.c.

747  {
748  size_t len = ( qpl->count * GVE_PAGE_SIZE );
749 
750  /* Free pages */
751  dma_ufree ( &qpl->map, qpl->data, len );
752 }
#define GVE_PAGE_SIZE
Page size.
Definition: gve.h:42
uint32_t qpl
Queue page list ID.
Definition: gve.h:644
void dma_ufree(struct dma_mapping *map, userptr_t addr, size_t len)
Unmap and free DMA-coherent buffer from external (user) memory.
uint32_t len
Length.
Definition: ena.h:14

References dma_ufree(), GVE_PAGE_SIZE, len, and gve_queue_type::qpl.

Referenced by gve_alloc_queue(), and gve_free_queue().

◆ gve_address()

static size_t gve_address ( struct gve_queue queue,
unsigned int  index 
)
inlinestatic

Get buffer address (within queue page list address space)

Parameters
queueDescriptor queue
indexBuffer index
Return values
addrBuffer address within queue page list address space

Definition at line 762 of file gve.c.

762  {
763 
764  /* We allocate sufficient pages for the maximum fill level of
765  * buffers, and reuse the pages in strict rotation as we
766  * progress through the queue.
767  */
768  return ( ( index & ( queue->fill - 1 ) ) * GVE_BUF_SIZE );
769 }
long index
Definition: bigint.h:61
#define GVE_BUF_SIZE
Queue data buffer size.
Definition: gve.h:446
uint16_t queue
Queue ID.
Definition: ena.h:22

References GVE_BUF_SIZE, index, and queue.

Referenced by gve_alloc_queue(), gve_buffer(), gve_poll_rx(), and gve_transmit().

◆ gve_buffer()

static userptr_t gve_buffer ( struct gve_queue queue,
unsigned int  index 
)
inlinestatic

Get buffer address.

Parameters
queueDescriptor queue
indexBuffer index
Return values
addrBuffer address

Definition at line 779 of file gve.c.

779  {
780 
781  /* Pages are currently allocated as a single contiguous block */
782  return userptr_add ( queue->qpl.data, gve_address ( queue, index ) );
783 }
long index
Definition: bigint.h:61
userptr_t userptr_add(userptr_t userptr, off_t offset)
Add offset to user pointer.
static size_t gve_address(struct gve_queue *queue, unsigned int index)
Get buffer address (within queue page list address space)
Definition: gve.c:762
uint16_t queue
Queue ID.
Definition: ena.h:22

References gve_address(), index, queue, and userptr_add().

◆ gve_next()

static unsigned int gve_next ( unsigned int  seq)
inlinestatic

Calculate next receive sequence number.

Parameters
seqCurrent sequence number, or zero to start sequence
Return values
nextNext sequence number

Definition at line 792 of file gve.c.

792  {
793 
794  /* The receive completion sequence number is a modulo 7
795  * counter that cycles through the non-zero three-bit values 1
796  * to 7 inclusive.
797  *
798  * Since 7 is coprime to 2^n, this ensures that the sequence
799  * number changes each time that a new completion is written
800  * to memory.
801  *
802  * Since the counter takes only non-zero values, this ensures
803  * that the sequence number changes whenever a new completion
804  * is first written to a zero-initialised completion ring.
805  */
806  seq = ( ( seq + 1 ) & GVE_RX_SEQ_MASK );
807  return ( seq ? seq : 1 );
808 }
u16 seq
802.11 Sequence Control field
Definition: ieee80211.h:19
#define GVE_RX_SEQ_MASK
Receive sequence number mask.
Definition: gve.h:581

References GVE_RX_SEQ_MASK, and seq.

Referenced by gve_poll_rx(), and gve_start().

◆ gve_alloc_queue()

static int gve_alloc_queue ( struct gve_nic gve,
struct gve_queue queue 
)
static

Allocate descriptor queue.

Parameters
gveGVE device
queueDescriptor queue
Return values
rcReturn status code

Definition at line 817 of file gve.c.

817  {
818  const struct gve_queue_type *type = queue->type;
819  struct dma_device *dma = gve->dma;
820  size_t desc_len = ( queue->count * type->desc_len );
821  size_t cmplt_len = ( queue->count * type->cmplt_len );
822  size_t res_len = sizeof ( *queue->res );
823  struct gve_buffer buf;
824  size_t offset;
825  unsigned int i;
826  int rc;
827 
828  /* Sanity checks */
829  if ( ( queue->count == 0 ) ||
830  ( queue->count & ( queue->count - 1 ) ) ) {
831  DBGC ( gve, "GVE %p %s invalid queue size %d\n",
832  gve, type->name, queue->count );
833  rc = -EINVAL;
834  goto err_sanity;
835  }
836 
837  /* Calculate maximum fill level */
838  assert ( ( type->fill & ( type->fill - 1 ) ) == 0 );
839  queue->fill = type->fill;
840  if ( queue->fill > queue->count )
841  queue->fill = queue->count;
842  DBGC ( gve, "GVE %p %s using QPL %#08x with %d/%d descriptors\n",
843  gve, type->name, type->qpl, queue->fill, queue->count );
844 
845  /* Allocate queue page list */
846  if ( ( rc = gve_alloc_qpl ( gve, &queue->qpl, type->qpl,
847  queue->fill ) ) != 0 )
848  goto err_qpl;
849 
850  /* Allocate descriptors */
851  queue->desc = dma_umalloc ( dma, &queue->desc_map, desc_len,
852  GVE_ALIGN );
853  if ( ! queue->desc ) {
854  rc = -ENOMEM;
855  goto err_desc;
856  }
857  DBGC ( gve, "GVE %p %s descriptors at [%08lx,%08lx)\n",
858  gve, type->name, user_to_phys ( queue->desc, 0 ),
859  user_to_phys ( queue->desc, desc_len ) );
860 
861  /* Allocate completions */
862  if ( cmplt_len ) {
863  queue->cmplt = dma_umalloc ( dma, &queue->cmplt_map, cmplt_len,
864  GVE_ALIGN );
865  if ( ! queue->cmplt ) {
866  rc = -ENOMEM;
867  goto err_cmplt;
868  }
869  DBGC ( gve, "GVE %p %s completions at [%08lx,%08lx)\n",
870  gve, type->name, user_to_phys ( queue->cmplt, 0 ),
871  user_to_phys ( queue->cmplt, cmplt_len ) );
872  }
873 
874  /* Allocate queue resources */
875  queue->res = dma_alloc ( dma, &queue->res_map, res_len, GVE_ALIGN );
876  if ( ! queue->res ) {
877  rc = -ENOMEM;
878  goto err_res;
879  }
880  memset ( queue->res, 0, res_len );
881 
882  /* Populate descriptor offsets */
883  offset = ( type->desc_len - sizeof ( buf ) );
884  for ( i = 0 ; i < queue->count ; i++ ) {
885  buf.addr = cpu_to_be64 ( gve_address ( queue, i ) );
886  copy_to_user ( queue->desc, offset, &buf, sizeof ( buf ) );
887  offset += type->desc_len;
888  }
889 
890  return 0;
891 
892  dma_free ( &queue->res_map, queue->res, res_len );
893  err_res:
894  if ( cmplt_len )
895  dma_ufree ( &queue->cmplt_map, queue->cmplt, cmplt_len );
896  err_cmplt:
897  dma_ufree ( &queue->desc_map, queue->desc, desc_len );
898  err_desc:
899  gve_free_qpl ( gve, &queue->qpl );
900  err_qpl:
901  err_sanity:
902  return rc;
903 }
#define EINVAL
Invalid argument.
Definition: errno.h:428
struct dma_device * dma
DMA device.
Definition: gve.h:670
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
uint32_t type
Operating system type.
Definition: ena.h:12
unsigned long user_to_phys(userptr_t userptr, off_t offset)
Convert user pointer to physical address.
#define DBGC(...)
Definition: compiler.h:505
#define GVE_ALIGN
Address alignment.
Definition: gve.h:51
A transmit or receive buffer descriptor.
Definition: gve.h:510
#define ENOMEM
Not enough space.
Definition: errno.h:534
void dma_free(struct dma_mapping *map, void *addr, size_t len)
Unmap and free DMA-coherent buffer.
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
static void gve_free_qpl(struct gve_nic *nic __unused, struct gve_qpl *qpl)
Free queue page list.
Definition: gve.c:746
static int gve_alloc_qpl(struct gve_nic *gve, struct gve_qpl *qpl, uint32_t id, unsigned int buffers)
Allocate queue page list.
Definition: gve.c:716
static __always_inline void copy_to_user(userptr_t dest, off_t dest_off, const void *src, size_t len)
Copy data to user buffer.
Definition: uaccess.h:324
static size_t gve_address(struct gve_queue *queue, unsigned int index)
Get buffer address (within queue page list address space)
Definition: gve.c:762
void * dma_alloc(struct dma_device *dma, struct dma_mapping *map, size_t len, size_t align)
Allocate and map DMA-coherent buffer.
void dma_ufree(struct dma_mapping *map, userptr_t addr, size_t len)
Unmap and free DMA-coherent buffer from external (user) memory.
#define cpu_to_be64(value)
Definition: byteswap.h:111
userptr_t dma_umalloc(struct dma_device *dma, struct dma_mapping *map, size_t len, size_t align)
Allocate and map DMA-coherent buffer from external (user) memory.
uint16_t offset
Offset to command line.
Definition: bzimage.h:8
A descriptor queue type.
Definition: gve.h:632
static __always_inline physaddr_t dma(struct dma_mapping *map, void *addr)
Get DMA address from virtual address.
Definition: dma.h:436
uint16_t queue
Queue ID.
Definition: ena.h:22
A DMA-capable device.
Definition: dma.h:47
void * memset(void *dest, int character, size_t len) __nonnull

References gve_buffer::addr, assert(), copy_to_user(), cpu_to_be64, DBGC, dma(), gve_nic::dma, dma_alloc(), dma_free(), dma_ufree(), dma_umalloc(), EINVAL, ENOMEM, gve_address(), GVE_ALIGN, gve_alloc_qpl(), gve_free_qpl(), memset(), offset, queue, rc, type, and user_to_phys().

Referenced by gve_open().

◆ gve_free_queue()

static void gve_free_queue ( struct gve_nic gve,
struct gve_queue queue 
)
static

Free descriptor queue.

Parameters
gveGVE device
queueDescriptor queue

Definition at line 911 of file gve.c.

911  {
912  const struct gve_queue_type *type = queue->type;
913  size_t desc_len = ( queue->count * type->desc_len );
914  size_t cmplt_len = ( queue->count * type->cmplt_len );
915  size_t res_len = sizeof ( *queue->res );
916 
917  /* Free queue resources */
918  dma_free ( &queue->res_map, queue->res, res_len );
919 
920  /* Free completions, if applicable */
921  if ( cmplt_len )
922  dma_ufree ( &queue->cmplt_map, queue->cmplt, cmplt_len );
923 
924  /* Free descriptors */
925  dma_ufree ( &queue->desc_map, queue->desc, desc_len );
926 
927  /* Free queue page list */
928  gve_free_qpl ( gve, &queue->qpl );
929 }
uint32_t type
Operating system type.
Definition: ena.h:12
void dma_free(struct dma_mapping *map, void *addr, size_t len)
Unmap and free DMA-coherent buffer.
static void gve_free_qpl(struct gve_nic *nic __unused, struct gve_qpl *qpl)
Free queue page list.
Definition: gve.c:746
uint8_t desc_len
Descriptor size.
Definition: gve.h:650
void dma_ufree(struct dma_mapping *map, userptr_t addr, size_t len)
Unmap and free DMA-coherent buffer from external (user) memory.
A descriptor queue type.
Definition: gve.h:632
uint8_t cmplt_len
Completion size.
Definition: gve.h:652
uint16_t queue
Queue ID.
Definition: ena.h:22

References gve_queue_type::cmplt_len, gve_queue_type::desc_len, dma_free(), dma_ufree(), gve_free_qpl(), queue, and type.

Referenced by gve_close(), and gve_open().

◆ gve_start()

static int gve_start ( struct gve_nic gve)
static

Start up device.

Parameters
gveGVE device
Return values
rcReturn status code

Definition at line 937 of file gve.c.

937  {
938  struct net_device *netdev = gve->netdev;
939  struct gve_queue *tx = &gve->tx;
940  struct gve_queue *rx = &gve->rx;
941  struct io_buffer *iobuf;
942  unsigned int i;
943  int rc;
944 
945  /* Cancel any pending transmissions */
946  for ( i = 0 ; i < ( sizeof ( gve->tx_iobuf ) /
947  sizeof ( gve->tx_iobuf[0] ) ) ; i++ ) {
948  iobuf = gve->tx_iobuf[i];
949  gve->tx_iobuf[i] = NULL;
950  if ( iobuf )
952  }
953 
954  /* Invalidate receive completions */
955  memset_user ( rx->cmplt, 0, 0, ( rx->count * rx->type->cmplt_len ) );
956 
957  /* Reset receive sequence */
958  gve->seq = gve_next ( 0 );
959 
960  /* Configure device resources */
961  if ( ( rc = gve_configure ( gve ) ) != 0 )
962  goto err_configure;
963 
964  /* Register transmit queue page list */
965  if ( ( rc = gve_register ( gve, &tx->qpl ) ) != 0 )
966  goto err_register_tx;
967 
968  /* Register receive queue page list */
969  if ( ( rc = gve_register ( gve, &rx->qpl ) ) != 0 )
970  goto err_register_rx;
971 
972  /* Create transmit queue */
973  if ( ( rc = gve_create_queue ( gve, tx ) ) != 0 )
974  goto err_create_tx;
975 
976  /* Create receive queue */
977  if ( ( rc = gve_create_queue ( gve, rx ) ) != 0 )
978  goto err_create_rx;
979 
980  return 0;
981 
982  gve_destroy_queue ( gve, rx );
983  err_create_rx:
984  gve_destroy_queue ( gve, tx );
985  err_create_tx:
986  gve_unregister ( gve, &rx->qpl );
987  err_register_rx:
988  gve_unregister ( gve, &tx->qpl );
989  err_register_tx:
990  gve_deconfigure ( gve );
991  err_configure:
992  return rc;
993 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int gve_destroy_queue(struct gve_nic *gve, struct gve_queue *queue)
Destroy transmit or receive queue.
Definition: gve.c:689
static int gve_deconfigure(struct gve_nic *gve)
Deconfigure device resources.
Definition: gve.c:537
static int gve_register(struct gve_nic *gve, struct gve_qpl *qpl)
Register queue page list.
Definition: gve.c:554
struct gve_queue rx
Receive queue.
Definition: gve.h:684
struct gve_queue tx
Transmit queue.
Definition: gve.h:682
#define ECANCELED
Operation canceled.
Definition: errno.h:343
void memset_user(userptr_t userptr, off_t offset, int c, size_t len)
Fill user buffer with a constant byte.
static struct net_device * netdev
Definition: gdbudp.c:52
static int gve_create_queue(struct gve_nic *gve, struct gve_queue *queue)
Create transmit or receive queue.
Definition: gve.c:649
A descriptor queue.
Definition: gve.h:595
A network device.
Definition: netdevice.h:352
struct io_buffer * tx_iobuf[GVE_TX_FILL]
Transmit I/O buffers.
Definition: gve.h:686
unsigned int seq
Receive sequence number.
Definition: gve.h:688
void netdev_tx_complete_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Complete network transmission.
Definition: netdevice.c:470
static unsigned int gve_next(unsigned int seq)
Calculate next receive sequence number.
Definition: gve.c:792
u8 rx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets from the AP.
Definition: wpa.h:234
static int gve_unregister(struct gve_nic *gve, struct gve_qpl *qpl)
Unregister page list.
Definition: gve.c:589
struct net_device * netdev
Network device.
Definition: gve.h:668
static int gve_configure(struct gve_nic *gve)
Configure device resources.
Definition: gve.c:496
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
u8 tx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets to the AP.
Definition: wpa.h:237
A persistent I/O buffer.
Definition: iobuf.h:33

References ECANCELED, gve_configure(), gve_create_queue(), gve_deconfigure(), gve_destroy_queue(), gve_next(), gve_register(), gve_unregister(), memset_user(), netdev, gve_nic::netdev, netdev_tx_complete_err(), NULL, rc, rx, gve_nic::rx, gve_nic::seq, tx, gve_nic::tx, and gve_nic::tx_iobuf.

Referenced by gve_startup().

◆ gve_stop()

static void gve_stop ( struct gve_nic gve)
static

Stop device.

Parameters
gveGVE device

Definition at line 1000 of file gve.c.

1000  {
1001  struct gve_queue *tx = &gve->tx;
1002  struct gve_queue *rx = &gve->rx;
1003 
1004  /* Destroy queues */
1005  gve_destroy_queue ( gve, rx );
1006  gve_destroy_queue ( gve, tx );
1007 
1008  /* Unregister page lists */
1009  gve_unregister ( gve, &rx->qpl );
1010  gve_unregister ( gve, &tx->qpl );
1011 
1012  /* Deconfigure device */
1013  gve_deconfigure ( gve );
1014 }
static int gve_destroy_queue(struct gve_nic *gve, struct gve_queue *queue)
Destroy transmit or receive queue.
Definition: gve.c:689
static int gve_deconfigure(struct gve_nic *gve)
Deconfigure device resources.
Definition: gve.c:537
struct gve_queue rx
Receive queue.
Definition: gve.h:684
struct gve_queue tx
Transmit queue.
Definition: gve.h:682
A descriptor queue.
Definition: gve.h:595
u8 rx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets from the AP.
Definition: wpa.h:234
static int gve_unregister(struct gve_nic *gve, struct gve_qpl *qpl)
Unregister page list.
Definition: gve.c:589
u8 tx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets to the AP.
Definition: wpa.h:237

References gve_deconfigure(), gve_destroy_queue(), gve_unregister(), rx, gve_nic::rx, tx, and gve_nic::tx.

Referenced by gve_close(), and gve_startup().

◆ gve_startup()

static void gve_startup ( struct gve_nic gve)
static

Device startup process.

Parameters
gveGVE device

Definition at line 1021 of file gve.c.

1021  {
1022  struct net_device *netdev = gve->netdev;
1023  int rc;
1024 
1025  /* Reset device */
1026  if ( ( rc = gve_reset ( gve ) ) != 0 )
1027  goto err_reset;
1028 
1029  /* Enable admin queue */
1030  gve_admin_enable ( gve );
1031 
1032  /* Start device */
1033  if ( ( rc = gve_start ( gve ) ) != 0 )
1034  goto err_start;
1035 
1036  /* Reset retry count */
1037  gve->retries = 0;
1038 
1039  /* (Ab)use link status to report startup status */
1040  netdev_link_up ( netdev );
1041 
1042  return;
1043 
1044  gve_stop ( gve );
1045  err_start:
1046  err_reset:
1047  DBGC ( gve, "GVE %p startup failed: %s\n", gve, strerror ( rc ) );
1048  netdev_link_err ( netdev, rc );
1049  if ( gve->retries++ < GVE_RESET_MAX_RETRY )
1050  process_add ( &gve->startup );
1051 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static void gve_stop(struct gve_nic *gve)
Stop device.
Definition: gve.c:1000
#define DBGC(...)
Definition: compiler.h:505
static int gve_start(struct gve_nic *gve)
Start up device.
Definition: gve.c:937
struct process startup
Startup process.
Definition: gve.h:691
static int gve_reset(struct gve_nic *gve)
Reset hardware.
Definition: gve.c:139
static void netdev_link_up(struct net_device *netdev)
Mark network device as having link up.
Definition: netdevice.h:774
static struct net_device * netdev
Definition: gdbudp.c:52
void process_add(struct process *process)
Add process to process list.
Definition: process.c:59
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
A network device.
Definition: netdevice.h:352
void netdev_link_err(struct net_device *netdev, int rc)
Mark network device as having a specific link state.
Definition: netdevice.c:207
unsigned int retries
Startup process retry counter.
Definition: gve.h:693
static void gve_admin_enable(struct gve_nic *gve)
Enable admin queue.
Definition: gve.c:280
struct net_device * netdev
Network device.
Definition: gve.h:668
#define GVE_RESET_MAX_RETRY
Maximum number of times to reattempt device reset.
Definition: gve.h:704

References DBGC, gve_admin_enable(), gve_reset(), GVE_RESET_MAX_RETRY, gve_start(), gve_stop(), netdev, gve_nic::netdev, netdev_link_err(), netdev_link_up(), process_add(), rc, gve_nic::retries, gve_nic::startup, and strerror().

◆ gve_restart()

static void gve_restart ( struct gve_nic gve)
static

Trigger startup process.

Parameters
gveGVE device

Definition at line 1058 of file gve.c.

1058  {
1059  struct net_device *netdev = gve->netdev;
1060 
1061  /* Mark link down to inhibit polling and transmit activity */
1063 
1064  /* Schedule startup process */
1065  process_add ( &gve->startup );
1066 }
void netdev_link_down(struct net_device *netdev)
Mark network device as having link down.
Definition: netdevice.c:230
struct process startup
Startup process.
Definition: gve.h:691
static struct net_device * netdev
Definition: gdbudp.c:52
void process_add(struct process *process)
Add process to process list.
Definition: process.c:59
A network device.
Definition: netdevice.h:352
struct net_device * netdev
Network device.
Definition: gve.h:668

References netdev, gve_nic::netdev, netdev_link_down(), process_add(), and gve_nic::startup.

Referenced by gve_open(), and gve_watchdog().

◆ gve_watchdog()

static void gve_watchdog ( struct retry_timer timer,
int over  __unused 
)
static

Reset recovery watchdog.

Parameters
timerReset recovery watchdog timer
overFailure indicator

Definition at line 1074 of file gve.c.

1074  {
1075  struct gve_nic *gve = container_of ( timer, struct gve_nic, watchdog );
1077  uint32_t pfn;
1078  int rc;
1079 
1080  /* Reschedule watchdog */
1082 
1083  /* Reset device (for test purposes) if applicable */
1084  if ( ( rc = inject_fault ( VM_MIGRATED_RATE ) ) != 0 ) {
1085  DBGC ( gve, "GVE %p synthesising host reset\n", gve );
1086  writel ( 0, gve->cfg + GVE_CFG_ADMIN_PFN );
1087  }
1088 
1089  /* Check for activity since last timer invocation */
1090  activity = ( gve->tx.cons + gve->rx.cons );
1091  if ( activity != gve->activity ) {
1092  gve->activity = activity;
1093  return;
1094  }
1095 
1096  /* Check for reset */
1097  pfn = readl ( gve->cfg + GVE_CFG_ADMIN_PFN );
1098  if ( pfn ) {
1099  DBGC2 ( gve, "GVE %p idle but not in reset\n", gve );
1100  return;
1101  }
1102 
1103  /* Schedule restart */
1104  DBGC ( gve, "GVE %p watchdog detected reset by host\n", gve );
1105  gve_restart ( gve );
1106 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define GVE_CFG_ADMIN_PFN
Admin queue page frame number (for older devices)
Definition: gve.h:84
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define DBGC(...)
Definition: compiler.h:505
#define GVE_WATCHDOG_TIMEOUT
Time between reset recovery checks.
Definition: gve.h:707
struct gve_queue rx
Receive queue.
Definition: gve.h:684
struct gve_queue tx
Transmit queue.
Definition: gve.h:682
A timer.
Definition: timer.h:28
uint32_t activity
Reset recovery recorded activity counter.
Definition: gve.h:697
struct retry_timer watchdog
Reset recovery watchdog timer.
Definition: gve.h:695
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
#define VM_MIGRATED_RATE
Definition: fault.h:33
uint32_t cons
Consumer counter.
Definition: gve.h:625
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
void * cfg
Configuration registers.
Definition: gve.h:662
static void gve_restart(struct gve_nic *gve)
Trigger startup process.
Definition: gve.c:1058
A Google Virtual Ethernet NIC.
Definition: gve.h:660
unsigned int uint32_t
Definition: stdint.h:12
void start_timer_fixed(struct retry_timer *timer, unsigned long timeout)
Start timer with a specified timeout.
Definition: retry.c:64
#define DBGC2(...)
Definition: compiler.h:522

References gve_nic::activity, gve_nic::cfg, gve_queue::cons, container_of, DBGC, DBGC2, GVE_CFG_ADMIN_PFN, gve_restart(), GVE_WATCHDOG_TIMEOUT, rc, readl(), gve_nic::rx, start_timer_fixed(), gve_nic::tx, VM_MIGRATED_RATE, gve_nic::watchdog, and writel().

Referenced by gve_probe().

◆ gve_open()

static int gve_open ( struct net_device netdev)
static

Open network device.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 1114 of file gve.c.

1114  {
1115  struct gve_nic *gve = netdev->priv;
1116  struct gve_queue *tx = &gve->tx;
1117  struct gve_queue *rx = &gve->rx;
1118  int rc;
1119 
1120  /* Allocate and prepopulate transmit queue */
1121  if ( ( rc = gve_alloc_queue ( gve, tx ) ) != 0 )
1122  goto err_alloc_tx;
1123 
1124  /* Allocate and prepopulate receive queue */
1125  if ( ( rc = gve_alloc_queue ( gve, rx ) ) != 0 )
1126  goto err_alloc_rx;
1127 
1128  /* Trigger startup */
1129  gve_restart ( gve );
1130 
1131  /* Start reset recovery watchdog timer */
1133 
1134  return 0;
1135 
1136  gve_free_queue ( gve, rx );
1137  err_alloc_rx:
1138  gve_free_queue ( gve, tx );
1139  err_alloc_tx:
1140  return rc;
1141 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int gve_alloc_queue(struct gve_nic *gve, struct gve_queue *queue)
Allocate descriptor queue.
Definition: gve.c:817
#define GVE_WATCHDOG_TIMEOUT
Time between reset recovery checks.
Definition: gve.h:707
static void gve_free_queue(struct gve_nic *gve, struct gve_queue *queue)
Free descriptor queue.
Definition: gve.c:911
struct gve_queue rx
Receive queue.
Definition: gve.h:684
struct gve_queue tx
Transmit queue.
Definition: gve.h:682
struct retry_timer watchdog
Reset recovery watchdog timer.
Definition: gve.h:695
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
A descriptor queue.
Definition: gve.h:595
static void gve_restart(struct gve_nic *gve)
Trigger startup process.
Definition: gve.c:1058
A Google Virtual Ethernet NIC.
Definition: gve.h:660
void start_timer_fixed(struct retry_timer *timer, unsigned long timeout)
Start timer with a specified timeout.
Definition: retry.c:64
u8 rx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets from the AP.
Definition: wpa.h:234
u8 tx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets to the AP.
Definition: wpa.h:237

References gve_alloc_queue(), gve_free_queue(), gve_restart(), GVE_WATCHDOG_TIMEOUT, netdev, net_device::priv, rc, rx, gve_nic::rx, start_timer_fixed(), tx, gve_nic::tx, and gve_nic::watchdog.

◆ gve_close()

static void gve_close ( struct net_device netdev)
static

Close network device.

Parameters
netdevNetwork device

Definition at line 1148 of file gve.c.

1148  {
1149  struct gve_nic *gve = netdev->priv;
1150  struct gve_queue *tx = &gve->tx;
1151  struct gve_queue *rx = &gve->rx;
1152 
1153  /* Stop reset recovery timer */
1154  stop_timer ( &gve->watchdog );
1155 
1156  /* Terminate startup process */
1157  process_del ( &gve->startup );
1158 
1159  /* Stop and reset device */
1160  gve_stop ( gve );
1161  gve_reset ( gve );
1162 
1163  /* Free queues */
1164  gve_free_queue ( gve, rx );
1165  gve_free_queue ( gve, tx );
1166 }
static void gve_stop(struct gve_nic *gve)
Stop device.
Definition: gve.c:1000
void process_del(struct process *process)
Remove process from process list.
Definition: process.c:79
static void gve_free_queue(struct gve_nic *gve, struct gve_queue *queue)
Free descriptor queue.
Definition: gve.c:911
struct gve_queue rx
Receive queue.
Definition: gve.h:684
struct gve_queue tx
Transmit queue.
Definition: gve.h:682
struct retry_timer watchdog
Reset recovery watchdog timer.
Definition: gve.h:695
struct process startup
Startup process.
Definition: gve.h:691
void * priv
Driver private data.
Definition: netdevice.h:431
static int gve_reset(struct gve_nic *gve)
Reset hardware.
Definition: gve.c:139
static struct net_device * netdev
Definition: gdbudp.c:52
A descriptor queue.
Definition: gve.h:595
A Google Virtual Ethernet NIC.
Definition: gve.h:660
void stop_timer(struct retry_timer *timer)
Stop timer.
Definition: retry.c:117
u8 rx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets from the AP.
Definition: wpa.h:234
u8 tx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets to the AP.
Definition: wpa.h:237

References gve_free_queue(), gve_reset(), gve_stop(), netdev, net_device::priv, process_del(), rx, gve_nic::rx, gve_nic::startup, stop_timer(), tx, gve_nic::tx, and gve_nic::watchdog.

◆ gve_transmit()

static int gve_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 1175 of file gve.c.

1175  {
1176  struct gve_nic *gve = netdev->priv;
1177  struct gve_queue *tx = &gve->tx;
1178  struct gve_tx_descriptor desc;
1179  unsigned int count;
1180  unsigned int index;
1181  size_t frag_len;
1182  size_t offset;
1183  size_t len;
1184 
1185  /* Do nothing if queues are not yet set up */
1186  if ( ! netdev_link_ok ( netdev ) )
1187  return -ENETDOWN;
1188 
1189  /* Defer packet if there is no space in the transmit ring */
1190  len = iob_len ( iobuf );
1191  count = ( ( len + GVE_BUF_SIZE - 1 ) / GVE_BUF_SIZE );
1192  if ( ( ( tx->prod - tx->cons ) + count ) > tx->fill ) {
1193  netdev_tx_defer ( netdev, iobuf );
1194  return 0;
1195  }
1196 
1197  /* Copy packet to queue pages and populate descriptors */
1198  for ( offset = 0 ; offset < len ; offset += frag_len ) {
1199 
1200  /* Sanity check */
1201  assert ( gve->tx_iobuf[ tx->prod % GVE_TX_FILL ] == NULL );
1202 
1203  /* Copy packet fragment */
1204  frag_len = ( len - offset );
1205  if ( frag_len > GVE_BUF_SIZE )
1206  frag_len = GVE_BUF_SIZE;
1207  copy_to_user ( gve_buffer ( tx, tx->prod ), 0,
1208  ( iobuf->data + offset ), frag_len );
1209 
1210  /* Populate descriptor */
1211  index = ( tx->prod++ & ( tx->count - 1 ) );
1212  memset ( &desc.pkt, 0, sizeof ( desc.pkt ) );
1213  if ( offset ) {
1214  desc.pkt.type = GVE_TX_TYPE_CONT;
1215  } else {
1216  desc.pkt.type = GVE_TX_TYPE_START;
1217  desc.pkt.count = count;
1218  desc.pkt.total = cpu_to_be16 ( len );
1219  }
1220  desc.pkt.len = cpu_to_be16 ( frag_len );
1221  copy_to_user ( tx->desc, ( index * sizeof ( desc ) ), &desc,
1222  sizeof ( desc.pkt ) );
1223  DBGC2 ( gve, "GVE %p TX %#04x %#02x:%#02x len %#04x/%#04x at "
1224  "%#08zx\n", gve, index, desc.pkt.type, desc.pkt.count,
1225  be16_to_cpu ( desc.pkt.len ),
1226  be16_to_cpu ( desc.pkt.total ),
1227  gve_address ( tx, index ) );
1228  }
1229  assert ( ( tx->prod - tx->cons ) <= tx->fill );
1230 
1231  /* Record I/O buffer against final descriptor */
1232  gve->tx_iobuf[ ( tx->prod - 1U ) % GVE_TX_FILL ] = iobuf;
1233 
1234  /* Ring doorbell */
1235  wmb();
1236  writel ( bswap_32 ( tx->prod ), tx->db );
1237 
1238  return 0;
1239 }
#define cpu_to_be16(value)
Definition: byteswap.h:109
wmb()
void netdev_tx_defer(struct net_device *netdev, struct io_buffer *iobuf)
Defer transmitted packet.
Definition: netdevice.c:412
uint64_t desc
Microcode descriptor list physical address.
Definition: ucode.h:12
long index
Definition: bigint.h:61
A transmit or receive buffer descriptor.
Definition: gve.h:510
#define GVE_TX_TYPE_CONT
Continuation of packet transmit descriptor type.
Definition: gve.h:541
struct gve_queue tx
Transmit queue.
Definition: gve.h:682
#define GVE_TX_FILL
Maximum number of transmit buffers.
Definition: gve.h:501
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
void * priv
Driver private data.
Definition: netdevice.h:431
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
static int netdev_link_ok(struct net_device *netdev)
Check link state of network device.
Definition: netdevice.h:636
static struct net_device * netdev
Definition: gdbudp.c:52
#define be16_to_cpu(value)
Definition: byteswap.h:115
uint16_t count
Number of entries.
Definition: ena.h:22
#define GVE_TX_TYPE_START
Start of packet transmit descriptor type.
Definition: gve.h:538
A descriptor queue.
Definition: gve.h:595
#define bswap_32(value)
Definition: byteswap.h:70
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:155
static __always_inline void copy_to_user(userptr_t dest, off_t dest_off, const void *src, size_t len)
Copy data to user buffer.
Definition: uaccess.h:324
A Google Virtual Ethernet NIC.
Definition: gve.h:660
struct io_buffer * tx_iobuf[GVE_TX_FILL]
Transmit I/O buffers.
Definition: gve.h:686
static size_t gve_address(struct gve_queue *queue, unsigned int index)
Get buffer address (within queue page list address space)
Definition: gve.c:762
#define ENETDOWN
Network is down.
Definition: errno.h:478
#define DBGC2(...)
Definition: compiler.h:522
void * data
Start of data.
Definition: iobuf.h:48
uint16_t offset
Offset to command line.
Definition: bzimage.h:8
#define GVE_BUF_SIZE
Queue data buffer size.
Definition: gve.h:446
uint32_t len
Length.
Definition: ena.h:14
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
A transmit descriptor.
Definition: gve.h:530
u8 tx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets to the AP.
Definition: wpa.h:237
void * memset(void *dest, int character, size_t len) __nonnull

References assert(), be16_to_cpu, bswap_32, copy_to_user(), count, cpu_to_be16, io_buffer::data, DBGC2, desc, ENETDOWN, gve_address(), GVE_BUF_SIZE, GVE_TX_FILL, GVE_TX_TYPE_CONT, GVE_TX_TYPE_START, index, iob_len(), len, memset(), netdev, netdev_link_ok(), netdev_tx_defer(), NULL, offset, net_device::priv, tx, gve_nic::tx, gve_nic::tx_iobuf, wmb(), and writel().

◆ gve_poll_tx()

static void gve_poll_tx ( struct net_device netdev)
static

Poll for completed transmissions.

Parameters
netdevNetwork device

Definition at line 1246 of file gve.c.

1246  {
1247  struct gve_nic *gve = netdev->priv;
1248  struct gve_queue *tx = &gve->tx;
1249  struct io_buffer *iobuf;
1250  uint32_t count;
1251 
1252  /* Read event counter */
1253  count = be32_to_cpu ( tx->event->count );
1254 
1255  /* Process transmit completions */
1256  while ( count != tx->cons ) {
1257  DBGC2 ( gve, "GVE %p TX %#04x complete\n", gve, tx->cons );
1258  iobuf = gve->tx_iobuf[ tx->cons % GVE_TX_FILL ];
1259  gve->tx_iobuf[ tx->cons % GVE_TX_FILL ] = NULL;
1260  tx->cons++;
1261  if ( iobuf )
1262  netdev_tx_complete ( netdev, iobuf );
1263  }
1264 }
static void netdev_tx_complete(struct net_device *netdev, struct io_buffer *iobuf)
Complete network transmission.
Definition: netdevice.h:752
struct gve_queue tx
Transmit queue.
Definition: gve.h:682
#define GVE_TX_FILL
Maximum number of transmit buffers.
Definition: gve.h:501
#define be32_to_cpu(value)
Definition: byteswap.h:116
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
uint16_t count
Number of entries.
Definition: ena.h:22
A descriptor queue.
Definition: gve.h:595
A Google Virtual Ethernet NIC.
Definition: gve.h:660
struct io_buffer * tx_iobuf[GVE_TX_FILL]
Transmit I/O buffers.
Definition: gve.h:686
unsigned int uint32_t
Definition: stdint.h:12
#define DBGC2(...)
Definition: compiler.h:522
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
u8 tx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets to the AP.
Definition: wpa.h:237
A persistent I/O buffer.
Definition: iobuf.h:33

References be32_to_cpu, count, DBGC2, GVE_TX_FILL, netdev, netdev_tx_complete(), NULL, net_device::priv, tx, gve_nic::tx, and gve_nic::tx_iobuf.

Referenced by gve_poll().

◆ gve_poll_rx()

static void gve_poll_rx ( struct net_device netdev)
static

Poll for received packets.

Parameters
netdevNetwork device

Definition at line 1271 of file gve.c.

1271  {
1272  struct gve_nic *gve = netdev->priv;
1273  struct gve_queue *rx = &gve->rx;
1274  struct gve_rx_completion cmplt;
1275  struct io_buffer *iobuf;
1276  unsigned int index;
1277  unsigned int seq;
1278  uint32_t cons;
1279  size_t offset;
1280  size_t total;
1281  size_t len;
1282  int rc;
1283 
1284  /* Process receive completions */
1285  cons = rx->cons;
1286  seq = gve->seq;
1287  total = 0;
1288  while ( 1 ) {
1289 
1290  /* Read next possible completion */
1291  index = ( cons++ & ( rx->count - 1 ) );
1292  offset = ( ( index * sizeof ( cmplt ) ) +
1293  offsetof ( typeof ( cmplt ), pkt ) );
1294  copy_from_user ( &cmplt.pkt, rx->cmplt, offset,
1295  sizeof ( cmplt.pkt ) );
1296 
1297  /* Check sequence number */
1298  if ( ( cmplt.pkt.seq & GVE_RX_SEQ_MASK ) != seq )
1299  break;
1300  seq = gve_next ( seq );
1301 
1302  /* Parse completion */
1303  len = be16_to_cpu ( cmplt.pkt.len );
1304  DBGC2 ( gve, "GVE %p RX %#04x %#02x:%#02x len %#04zx at "
1305  "%#08zx\n", gve, index, cmplt.pkt.seq, cmplt.pkt.flags,
1306  len, gve_address ( rx, index ) );
1307 
1308  /* Accumulate a complete packet */
1309  if ( cmplt.pkt.flags & GVE_RXF_ERROR ) {
1310  total = 0;
1311  } else {
1312  total += len;
1313  if ( cmplt.pkt.flags & GVE_RXF_MORE )
1314  continue;
1315  }
1316  gve->seq = seq;
1317 
1318  /* Allocate and populate I/O buffer */
1319  iobuf = ( total ? alloc_iob ( total ) : NULL );
1320  for ( ; rx->cons != cons ; rx->cons++ ) {
1321 
1322  /* Re-read completion length */
1323  index = ( rx->cons & ( rx->count - 1 ) );
1324  offset = ( ( index * sizeof ( cmplt ) ) +
1325  offsetof ( typeof ( cmplt ), pkt.len ) );
1326  copy_from_user ( &cmplt.pkt, rx->cmplt, offset,
1327  sizeof ( cmplt.pkt.len ) );
1328 
1329  /* Copy data */
1330  if ( iobuf ) {
1331  len = be16_to_cpu ( cmplt.pkt.len );
1332  copy_from_user ( iob_put ( iobuf, len ),
1333  gve_buffer ( rx, rx->cons ),
1334  0, len );
1335  }
1336  }
1337  assert ( ( iobuf == NULL ) || ( iob_len ( iobuf ) == total ) );
1338  total = 0;
1339 
1340  /* Hand off packet to network stack */
1341  if ( iobuf ) {
1342  iob_pull ( iobuf, GVE_RX_PAD );
1343  netdev_rx ( netdev, iobuf );
1344  } else {
1345  rc = ( ( cmplt.pkt.flags & GVE_RXF_ERROR ) ?
1346  -EIO : -ENOMEM );
1347  netdev_rx_err ( netdev, NULL, rc );
1348  }
1349 
1350  /* Sanity check */
1351  assert ( rx->cons == cons );
1352  assert ( gve->seq == seq );
1353  assert ( total == 0 );
1354  }
1355 }
#define iob_pull(iobuf, len)
Definition: iobuf.h:102
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#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
static __always_inline void copy_from_user(void *dest, userptr_t src, off_t src_off, size_t len)
Copy data from user buffer.
Definition: uaccess.h:337
#define GVE_RXF_MORE
Receive packet continues into next descriptor.
Definition: gve.h:578
long index
Definition: bigint.h:61
A receive completion descriptor.
Definition: gve.h:584
#define offsetof(type, field)
Get offset of a field within a structure.
Definition: stddef.h:24
A transmit or receive buffer descriptor.
Definition: gve.h:510
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition: iobuf.c:129
struct gve_queue rx
Receive queue.
Definition: gve.h:684
u16 seq
802.11 Sequence Control field
Definition: ieee80211.h:19
#define ENOMEM
Not enough space.
Definition: errno.h:534
#define GVE_RX_SEQ_MASK
Receive sequence number mask.
Definition: gve.h:581
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
void * priv
Driver private data.
Definition: netdevice.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
#define be16_to_cpu(value)
Definition: byteswap.h:115
A descriptor queue.
Definition: gve.h:595
uint16_t cons
Consumer index.
Definition: ena.h:22
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:155
A Google Virtual Ethernet NIC.
Definition: gve.h:660
static size_t gve_address(struct gve_queue *queue, unsigned int index)
Get buffer address (within queue page list address space)
Definition: gve.c:762
unsigned int uint32_t
Definition: stdint.h:12
unsigned int seq
Receive sequence number.
Definition: gve.h:688
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition: netdevice.c:548
static unsigned int gve_next(unsigned int seq)
Calculate next receive sequence number.
Definition: gve.c:792
#define DBGC2(...)
Definition: compiler.h:522
#define EIO
Input/output error.
Definition: errno.h:433
u8 rx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets from the AP.
Definition: wpa.h:234
uint16_t offset
Offset to command line.
Definition: bzimage.h:8
typeof(acpi_finder=acpi_find)
ACPI table finder.
Definition: acpi.c:45
#define GVE_RXF_ERROR
Receive error.
Definition: gve.h:575
uint32_t len
Length.
Definition: ena.h:14
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
#define GVE_RX_PAD
Padding at the start of all received packets.
Definition: gve.h:592
A persistent I/O buffer.
Definition: iobuf.h:33

References alloc_iob(), assert(), be16_to_cpu, cons, copy_from_user(), DBGC2, EIO, ENOMEM, gve_rx_packet::flags, gve_address(), gve_next(), GVE_RX_PAD, GVE_RX_SEQ_MASK, GVE_RXF_ERROR, GVE_RXF_MORE, index, iob_len(), iob_pull, iob_put, len, gve_rx_packet::len, netdev, netdev_rx(), netdev_rx_err(), NULL, offset, offsetof, gve_rx_completion::pkt, net_device::priv, rc, rx, gve_nic::rx, seq, gve_rx_packet::seq, gve_nic::seq, and typeof().

Referenced by gve_poll().

◆ gve_refill_rx()

static void gve_refill_rx ( struct net_device netdev)
static

Refill receive queue.

Parameters
netdevNetwork device

Definition at line 1362 of file gve.c.

1362  {
1363  struct gve_nic *gve = netdev->priv;
1364  struct gve_queue *rx = &gve->rx;
1365  unsigned int prod;
1366 
1367  /* The receive descriptors are prepopulated at the time of
1368  * creating the receive queue (pointing to the preallocated
1369  * queue pages). Refilling is therefore just a case of
1370  * ringing the doorbell if the device is not yet aware of any
1371  * available descriptors.
1372  */
1373  prod = ( rx->cons + rx->fill );
1374  if ( prod != rx->prod ) {
1375  rx->prod = prod;
1376  writel ( bswap_32 ( prod ), rx->db );
1377  DBGC2 ( gve, "GVE %p RX %#04x ready\n", gve, rx->prod );
1378  }
1379 }
struct gve_queue rx
Receive queue.
Definition: gve.h:684
void * priv
Driver private data.
Definition: netdevice.h:431
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
static struct net_device * netdev
Definition: gdbudp.c:52
A descriptor queue.
Definition: gve.h:595
#define bswap_32(value)
Definition: byteswap.h:70
A Google Virtual Ethernet NIC.
Definition: gve.h:660
#define DBGC2(...)
Definition: compiler.h:522
u8 rx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets from the AP.
Definition: wpa.h:234
uint32_t prod
Producer counter.
Definition: gve.h:623

References bswap_32, DBGC2, netdev, net_device::priv, gve_queue::prod, rx, gve_nic::rx, and writel().

Referenced by gve_poll().

◆ gve_poll()

static void gve_poll ( struct net_device netdev)
static

Poll for completed and received packets.

Parameters
netdevNetwork device

Definition at line 1386 of file gve.c.

1386  {
1387 
1388  /* Do nothing if queues are not yet set up */
1389  if ( ! netdev_link_ok ( netdev ) )
1390  return;
1391 
1392  /* Poll for transmit completions */
1393  gve_poll_tx ( netdev );
1394 
1395  /* Poll for receive completions */
1396  gve_poll_rx ( netdev );
1397 
1398  /* Refill receive queue */
1399  gve_refill_rx ( netdev );
1400 }
static void gve_refill_rx(struct net_device *netdev)
Refill receive queue.
Definition: gve.c:1362
static void gve_poll_rx(struct net_device *netdev)
Poll for received packets.
Definition: gve.c:1271
static int netdev_link_ok(struct net_device *netdev)
Check link state of network device.
Definition: netdevice.h:636
static struct net_device * netdev
Definition: gdbudp.c:52
static void gve_poll_tx(struct net_device *netdev)
Poll for completed transmissions.
Definition: gve.c:1246

References gve_poll_rx(), gve_poll_tx(), gve_refill_rx(), netdev, and netdev_link_ok().

◆ gve_setup()

static int gve_setup ( struct gve_nic gve)
static

Set up admin queue and get device description.

Parameters
gveGVE device
Return values
rcReturn status code

Definition at line 1448 of file gve.c.

1448  {
1449  unsigned int i;
1450  int rc;
1451 
1452  /* Attempt several times, since the device may decide to add
1453  * in a few spurious resets.
1454  */
1455  for ( i = 0 ; i < GVE_RESET_MAX_RETRY ; i++ ) {
1456 
1457  /* Reset device */
1458  if ( ( rc = gve_reset ( gve ) ) != 0 )
1459  continue;
1460 
1461  /* Enable admin queue */
1462  gve_admin_enable ( gve );
1463 
1464  /* Fetch MAC address */
1465  if ( ( rc = gve_describe ( gve ) ) != 0 )
1466  continue;
1467 
1468  /* Success */
1469  return 0;
1470  }
1471 
1472  DBGC ( gve, "GVE %p failed to get device description: %s\n",
1473  gve, strerror ( rc ) );
1474  return rc;
1475 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int gve_describe(struct gve_nic *gve)
Get device descriptor.
Definition: gve.c:449
#define DBGC(...)
Definition: compiler.h:505
static int gve_reset(struct gve_nic *gve)
Reset hardware.
Definition: gve.c:139
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static void gve_admin_enable(struct gve_nic *gve)
Enable admin queue.
Definition: gve.c:280
#define GVE_RESET_MAX_RETRY
Maximum number of times to reattempt device reset.
Definition: gve.h:704

References DBGC, gve_admin_enable(), gve_describe(), gve_reset(), GVE_RESET_MAX_RETRY, rc, and strerror().

Referenced by gve_probe().

◆ gve_probe()

static int gve_probe ( struct pci_device pci)
static

Probe PCI device.

Parameters
pciPCI device
Return values
rcReturn status code

Definition at line 1487 of file gve.c.

1487  {
1488  struct net_device *netdev;
1489  struct gve_nic *gve;
1490  unsigned long cfg_start;
1491  unsigned long db_start;
1492  unsigned long db_size;
1493  int rc;
1494 
1495  /* Allocate and initialise net device */
1496  netdev = alloc_etherdev ( sizeof ( *gve ) );
1497  if ( ! netdev ) {
1498  rc = -ENOMEM;
1499  goto err_alloc;
1500  }
1502  gve = netdev->priv;
1503  pci_set_drvdata ( pci, netdev );
1504  netdev->dev = &pci->dev;
1505  memset ( gve, 0, sizeof ( *gve ) );
1506  gve->netdev = netdev;
1507  gve->tx.type = &gve_tx_type;
1508  gve->rx.type = &gve_rx_type;
1510  timer_init ( &gve->watchdog, gve_watchdog, &netdev->refcnt );
1511 
1512  /* Fix up PCI device */
1513  adjust_pci_device ( pci );
1514 
1515  /* Check PCI revision */
1516  pci_read_config_byte ( pci, PCI_REVISION, &gve->revision );
1517  DBGC ( gve, "GVE %p is revision %#02x\n", gve, gve->revision );
1518 
1519  /* Map configuration registers */
1520  cfg_start = pci_bar_start ( pci, GVE_CFG_BAR );
1521  gve->cfg = pci_ioremap ( pci, cfg_start, GVE_CFG_SIZE );
1522  if ( ! gve->cfg ) {
1523  rc = -ENODEV;
1524  goto err_cfg;
1525  }
1526 
1527  /* Map doorbell registers */
1528  db_start = pci_bar_start ( pci, GVE_DB_BAR );
1529  db_size = pci_bar_size ( pci, GVE_DB_BAR );
1530  gve->db = pci_ioremap ( pci, db_start, db_size );
1531  if ( ! gve->db ) {
1532  rc = -ENODEV;
1533  goto err_db;
1534  }
1535 
1536  /* Configure DMA */
1537  gve->dma = &pci->dma;
1538  dma_set_mask_64bit ( gve->dma );
1539  assert ( netdev->dma == NULL );
1540 
1541  /* Allocate admin queue */
1542  if ( ( rc = gve_admin_alloc ( gve ) ) != 0 )
1543  goto err_admin;
1544 
1545  /* Set up the device */
1546  if ( ( rc = gve_setup ( gve ) ) != 0 )
1547  goto err_setup;
1548 
1549  /* Register network device */
1550  if ( ( rc = register_netdev ( netdev ) ) != 0 )
1551  goto err_register_netdev;
1552 
1553  return 0;
1554 
1556  err_register_netdev:
1557  err_setup:
1558  gve_reset ( gve );
1559  gve_admin_free ( gve );
1560  err_admin:
1561  iounmap ( gve->db );
1562  err_db:
1563  iounmap ( gve->cfg );
1564  err_cfg:
1565  netdev_nullify ( netdev );
1566  netdev_put ( netdev );
1567  err_alloc:
1568  return rc;
1569 }
struct dma_device * dma
DMA device.
Definition: gve.h:670
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct dma_device dma
DMA device.
Definition: pci.h:210
#define GVE_CFG_BAR
Configuration BAR.
Definition: gve.h:63
static void process_init(struct process *process, struct process_descriptor *desc, struct refcnt *refcnt)
Initialise process and add to process list.
Definition: process.h:161
#define DBGC(...)
Definition: compiler.h:505
static int gve_admin_alloc(struct gve_nic *gve)
Allocate admin queue.
Definition: gve.c:191
static __always_inline void dma_set_mask_64bit(struct dma_device *dma)
Set 64-bit addressable space mask.
Definition: dma.h:474
struct dma_device * dma
DMA device.
Definition: netdevice.h:366
void adjust_pci_device(struct pci_device *pci)
Enable PCI device.
Definition: pci.c:154
struct gve_queue rx
Receive queue.
Definition: gve.h:684
struct device dev
Generic device.
Definition: pci.h:208
static struct net_device_operations gve_operations
GVE network device operations.
Definition: gve.c:1403
struct gve_queue tx
Transmit queue.
Definition: gve.h:682
static const struct gve_queue_type gve_tx_type
Transmit descriptor queue type.
Definition: gve.c:1418
#define GVE_DB_BAR
Doorbell BAR.
Definition: gve.h:105
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition: netdevice.h:515
static void pci_set_drvdata(struct pci_device *pci, void *priv)
Set PCI driver-private data.
Definition: pci.h:359
#define ENOMEM
Not enough space.
Definition: errno.h:534
void * db
Doorbell registers.
Definition: gve.h:664
struct retry_timer watchdog
Reset recovery watchdog timer.
Definition: gve.h:695
struct process startup
Startup process.
Definition: gve.h:691
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:572
void * priv
Driver private data.
Definition: netdevice.h:431
static int gve_reset(struct gve_nic *gve)
Reset hardware.
Definition: gve.c:139
static struct net_device * netdev
Definition: gdbudp.c:52
unsigned long pci_bar_start(struct pci_device *pci, unsigned int reg)
Find the start of a PCI BAR.
Definition: pci.c:96
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:941
void * cfg
Configuration registers.
Definition: gve.h:662
struct refcnt refcnt
Reference counter.
Definition: netdevice.h:354
unsigned long pci_bar_size(struct pci_device *pci, unsigned int reg)
Find the size of a PCI BAR.
Definition: pciextra.c:92
int register_netdev(struct net_device *netdev)
Register network device.
Definition: netdevice.c:759
A network device.
Definition: netdevice.h:352
#define ENODEV
No such device.
Definition: errno.h:509
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:528
A Google Virtual Ethernet NIC.
Definition: gve.h:660
static void gve_watchdog(struct retry_timer *timer, int over __unused)
Reset recovery watchdog.
Definition: gve.c:1074
struct device * dev
Underlying hardware device.
Definition: netdevice.h:364
uint8_t revision
PCI revision.
Definition: gve.h:666
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
Definition: ethernet.c:264
void iounmap(volatile const void *io_addr)
Unmap I/O address.
#define PCI_REVISION
PCI revision.
Definition: pci.h:44
static const struct gve_queue_type gve_rx_type
Receive descriptor queue type.
Definition: gve.c:1430
struct net_device * netdev
Network device.
Definition: gve.h:668
static void gve_admin_free(struct gve_nic *gve)
Free admin queue.
Definition: gve.c:252
static int gve_setup(struct gve_nic *gve)
Set up admin queue and get device description.
Definition: gve.c:1448
void * pci_ioremap(struct pci_device *pci, unsigned long bus_addr, size_t len)
Map PCI bus address as an I/O address.
const struct gve_queue_type * type
Queue type.
Definition: gve.h:604
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
static struct process_descriptor gve_startup_desc
Device startup process descriptor.
Definition: gve.c:1478
#define GVE_CFG_SIZE
Configuration BAR size.
Definition: gve.h:70
void * memset(void *dest, int character, size_t len) __nonnull
int pci_read_config_byte(struct pci_device *pci, unsigned int where, uint8_t *value)
Read byte from PCI configuration space.

References adjust_pci_device(), alloc_etherdev(), assert(), gve_nic::cfg, gve_nic::db, DBGC, pci_device::dev, net_device::dev, pci_device::dma, net_device::dma, gve_nic::dma, dma_set_mask_64bit(), ENODEV, ENOMEM, gve_admin_alloc(), gve_admin_free(), GVE_CFG_BAR, GVE_CFG_SIZE, GVE_DB_BAR, gve_operations, gve_reset(), gve_rx_type, gve_setup(), gve_startup_desc, gve_tx_type, gve_watchdog(), iounmap(), memset(), netdev, gve_nic::netdev, netdev_init(), netdev_nullify(), netdev_put(), NULL, pci_bar_size(), pci_bar_start(), pci_ioremap(), pci_read_config_byte(), PCI_REVISION, pci_set_drvdata(), net_device::priv, process_init(), rc, net_device::refcnt, register_netdev(), gve_nic::revision, gve_nic::rx, gve_nic::startup, gve_nic::tx, gve_queue::type, unregister_netdev(), and gve_nic::watchdog.

◆ gve_remove()

static void gve_remove ( struct pci_device pci)
static

Remove PCI device.

Parameters
pciPCI device

Definition at line 1576 of file gve.c.

1576  {
1577  struct net_device *netdev = pci_get_drvdata ( pci );
1578  struct gve_nic *gve = netdev->priv;
1579 
1580  /* Unregister network device */
1582 
1583  /* Reset device */
1584  gve_reset ( gve );
1585 
1586  /* Free admin queue */
1587  gve_admin_free ( gve );
1588 
1589  /* Unmap registers */
1590  iounmap ( gve->db );
1591  iounmap ( gve->cfg );
1592 
1593  /* Free network device */
1594  netdev_nullify ( netdev );
1595  netdev_put ( netdev );
1596 }
void * db
Doorbell registers.
Definition: gve.h:664
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:572
void * priv
Driver private data.
Definition: netdevice.h:431
static int gve_reset(struct gve_nic *gve)
Reset hardware.
Definition: gve.c:139
static struct net_device * netdev
Definition: gdbudp.c:52
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:941
void * cfg
Configuration registers.
Definition: gve.h:662
A network device.
Definition: netdevice.h:352
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:528
A Google Virtual Ethernet NIC.
Definition: gve.h:660
static void * pci_get_drvdata(struct pci_device *pci)
Get PCI driver-private data.
Definition: pci.h:369
void iounmap(volatile const void *io_addr)
Unmap I/O address.
static void gve_admin_free(struct gve_nic *gve)
Free admin queue.
Definition: gve.c:252

References gve_nic::cfg, gve_nic::db, gve_admin_free(), gve_reset(), iounmap(), netdev, netdev_nullify(), netdev_put(), pci_get_drvdata(), net_device::priv, and unregister_netdev().

Variable Documentation

◆ gve_operations

struct net_device_operations gve_operations
static
Initial value:
= {
.open = gve_open,
.close = gve_close,
.transmit = gve_transmit,
.poll = gve_poll,
}
static void gve_close(struct net_device *netdev)
Close network device.
Definition: gve.c:1148
static int gve_open(struct net_device *netdev)
Open network device.
Definition: gve.c:1114
static int gve_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
Definition: gve.c:1175
static void gve_poll(struct net_device *netdev)
Poll for completed and received packets.
Definition: gve.c:1386

GVE network device operations.

Definition at line 1403 of file gve.c.

Referenced by gve_probe().

◆ gve_tx_type

const struct gve_queue_type gve_tx_type
static
Initial value:
= {
.name = "TX",
.qpl = GVE_TX_QPL,
.irq = GVE_TX_IRQ,
.fill = GVE_TX_FILL,
.desc_len = sizeof ( struct gve_tx_descriptor ),
}
#define GVE_ADMIN_DESTROY_TX
Destroy transmit queue command.
Definition: gve.h:276
#define GVE_TX_FILL
Maximum number of transmit buffers.
Definition: gve.h:501
#define GVE_ADMIN_CREATE_TX
Create transmit queue command.
Definition: gve.h:226
#define GVE_TX_QPL
Transmit queue page list ID.
Definition: gve.h:504
static void gve_create_tx_param(struct gve_queue *queue, union gve_admin_command *cmd)
Construct command to create transmit queue.
Definition: gve.c:607
#define GVE_TX_IRQ
Tranmsit queue interrupt channel.
Definition: gve.h:507
A transmit descriptor.
Definition: gve.h:530

Transmit descriptor queue type.

Definition at line 1418 of file gve.c.

Referenced by gve_probe().

◆ gve_rx_type

const struct gve_queue_type gve_rx_type
static
Initial value:
= {
.name = "RX",
.qpl = GVE_RX_QPL,
.irq = GVE_RX_IRQ,
.fill = GVE_RX_FILL,
.desc_len = sizeof ( struct gve_rx_descriptor ),
.cmplt_len = sizeof ( struct gve_rx_completion ),
}
A receive descriptor.
Definition: gve.h:559
#define GVE_ADMIN_DESTROY_RX
Destroy receive queue command.
Definition: gve.h:279
#define GVE_RX_IRQ
Receive queue interrupt channel.
Definition: gve.h:556
static void gve_create_rx_param(struct gve_queue *queue, union gve_admin_command *cmd)
Construct command to create receive queue.
Definition: gve.c:626
A receive completion descriptor.
Definition: gve.h:584
#define GVE_RX_FILL
Maximum number of receive buffers.
Definition: gve.h:550
#define GVE_RX_QPL
Receive queue page list ID.
Definition: gve.h:553
#define GVE_ADMIN_CREATE_RX
Create receive queue command.
Definition: gve.h:247

Receive descriptor queue type.

Definition at line 1430 of file gve.c.

Referenced by gve_probe().

◆ gve_startup_desc

struct process_descriptor gve_startup_desc
static
Initial value:
=
static void gve_startup(struct gve_nic *gve)
Device startup process.
Definition: gve.c:1021
#define PROC_DESC_ONCE(object_type, process, _step)
Define a process descriptor for a process that runs only once.
Definition: process.h:97
A Google Virtual Ethernet NIC.
Definition: gve.h:660
void startup(void)
Start up iPXE.
Definition: init.c:67

Device startup process descriptor.

Definition at line 1478 of file gve.c.

Referenced by gve_probe().

◆ gve_nics

struct pci_device_id gve_nics[]
static
Initial value:
= {
PCI_ROM ( 0x1ae0, 0x0042, "gve", "gVNIC", 0 ),
}
#define PCI_ROM(_vendor, _device, _name, _description, _data)
Definition: pci.h:303

GVE PCI device IDs.

Definition at line 1599 of file gve.c.

◆ __pci_driver

struct pci_driver gve_driver __pci_driver
Initial value:
= {
.ids = gve_nics,
.id_count = ( sizeof ( gve_nics ) / sizeof ( gve_nics[0] ) ),
.probe = gve_probe,
}
static void gve_remove(struct pci_device *pci)
Remove PCI device.
Definition: gve.c:1576
static struct xen_remove_from_physmap * remove
Definition: xenmem.h:39
static struct pci_device_id gve_nics[]
GVE PCI device IDs.
Definition: gve.c:1599
static int gve_probe(struct pci_device *pci)
Probe PCI device.
Definition: gve.c:1487

GVE PCI driver.

Definition at line 1604 of file gve.c.