83 DBGC ( vnet,
"VNET %s has %s MAC address\n",
84 virtio->
name, ( has_mac ?
"invalid" :
"no" ) );
104 DBGC ( vnet,
"VNET %s has MTU %zd\n",
137 sizeof (
queue->hdr ),
queue->dma ) ) != 0 ) {
138 DBGC ( vnet,
"VNET %s Q%d could not map header: %s\n",
146 DBGC ( vnet,
"VNET %s Q%d could not initialise: %s\n",
173 DBGC ( vnet,
"VNET %s Q%d using %d/%d descriptor pairs\n",
205 prod =
queue->queue.prod;
213 DBGC2 ( vnet,
"VNET %s Q%d [%02x-%02x] is [%lx,%lx)\n",
215 virt_to_phys ( iobuf->
data ),
216 ( virt_to_phys ( iobuf->
data ) +
len ) );
253 DBGC2 ( vnet,
"VNET %s Q%d [%02x-%02x] complete",
256 DBGC2 ( vnet,
" len %#zx\n", *
len );
257 DBGC2 ( vnet,
"\n" );
279 unsigned int refilled = 0;
315 DBGC ( vnet,
"VNET %s could not initialise: %s\n",
322 sizeof (
hdr.legacy ) :
sizeof (
hdr.modern ) );
329 DBGC ( vnet,
"VNET %s could not enable RX: %s\n",
336 DBGC ( vnet,
"VNET %s could not enable TX: %s\n",
512 memset ( vnet, 0,
sizeof ( *vnet ) );
524 DBGC ( vnet,
"VNET %s could not map: %s\n",
531 DBGC ( vnet,
"VNET %s could not initialise: %s\n",
587 PCI_ROM ( 0x1af4, 0x1000,
"virtio-net",
"Virtio (legacy)", 0 ),
588 PCI_ROM ( 0x1af4, 0x1041,
"virtio-net",
"Virtio (modern)", 0 ),
#define NULL
NULL pointer (VOID *).
struct golan_inbox_hdr hdr
Message header.
struct arbelprm_rc_send_wqe rc
#define assert(condition)
Assert a condition at run-time.
uint16_t cons
Consumer index.
struct ena_llq_option desc
Descriptor counts.
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
void eth_random_addr(void *hw_addr)
Generate random Ethernet address.
static int is_valid_ether_addr(const void *addr)
Check if Ethernet address is valid.
static struct net_device * netdev
static unsigned int count
Number of entries.
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
#define ENOMEM
Not enough space.
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
#define VIRTIO_STAT_DRIVER_OK
Guest driver is ready.
#define cpu_to_le64(value)
#define cpu_to_le32(value)
#define cpu_to_le16(value)
#define ioread16(io_addr)
void * memset(void *dest, int character, size_t len) __nonnull
struct io_buffer * alloc_rx_iob(size_t len, struct dma_device *dma)
Allocate and map I/O buffer for receive DMA.
void free_rx_iob(struct io_buffer *iobuf)
Unmap and free I/O buffer for receive DMA.
#define iob_put(iobuf, len)
static __always_inline physaddr_t iob_dma(struct io_buffer *iobuf)
Get I/O buffer DMA address.
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
#define DMA_TX
Device will read data from host memory.
#define DMA_RX
Device will write data to host memory.
void dma_unmap(struct dma_mapping *map, size_t len)
Unmap buffer.
physaddr_t dma(struct dma_mapping *map, void *addr)
Get DMA address from virtual address.
Dynamic memory allocation.
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
void unregister_netdev(struct net_device *netdev)
Unregister network device.
void netdev_tx_defer(struct net_device *netdev, struct io_buffer *iobuf)
Defer transmitted packet.
int register_netdev(struct net_device *netdev)
Register network device.
Network device management.
static void netdev_link_up(struct net_device *netdev)
Mark network device as having link up.
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
static void netdev_tx_complete(struct net_device *netdev, struct io_buffer *iobuf)
Complete network transmission.
#define __pci_driver
Declare a PCI driver.
static void pci_set_drvdata(struct pci_device *pci, void *priv)
Set PCI driver-private data.
#define PCI_ROM(_vendor, _device, _name, _description, _data)
static void * pci_get_drvdata(struct pci_device *pci)
Get PCI driver-private data.
char * strerror(int errno)
Retrieve string representation of error number.
void * data
Start of data.
Network device operations.
A PCI device ID list entry.
struct device dev
Generic device.
struct dma_device dma
DMA device.
int(* probe)(struct pci_device *pci)
Probe device.
A virtio buffer descriptor.
struct virtio_features features
Negotiated features.
const char * name
Device name.
void * device
Device-specific registers.
struct dma_device * dma
DMA device.
uint32_t word[VIRTIO_FEATURE_WORDS]
Feature words.
struct dma_mapping map
DMA mapping for packet header.
struct virtio_queue queue
Underlying virtio queue.
union virtio_net_header hdr
Shared packet header.
size_t hlen
Virtio network header length.
size_t mfs
Maximum frame size.
struct io_buffer * rx_iobufs[VIRTIO_NET_RX_MAX]
Receive I/O buffers.
uint8_t rx_slots[VIRTIO_NET_RX_MAX]
Receive descriptor slot ring.
struct virtio_device virtio
Underlying virtio device.
struct virtio_net_queue tx
Transmit queue.
struct virtio_net_queue rx
Receive queue.
uint8_t tx_slots[VIRTIO_NET_TX_MAX]
Transmit descriptor slot ring.
struct io_buffer * tx_iobufs[VIRTIO_NET_TX_MAX]
Transmit I/O buffers.
static void virtio_net_remove(struct pci_device *pci)
Remove PCI device.
static void virtio_net_poll_rx(struct net_device *netdev)
Poll for received packets.
static struct net_device_operations virtio_net_operations
Virtio network device operations.
static int virtio_net_probe(struct pci_device *pci)
Probe PCI device.
static void virtio_net_poll_tx(struct net_device *netdev)
Poll for completed packets.
static void virtio_net_poll(struct net_device *netdev)
Poll for completed and received packets.
static void virtio_net_close(struct net_device *netdev)
Close network device.
static struct io_buffer * virtio_net_complete(struct virtio_net *vnet, struct virtio_net_queue *queue, size_t *len)
Complete I/O buffer.
static int virtio_net_enable(struct virtio_net *vnet, struct virtio_net_queue *queue)
Enable queue.
static void virtio_net_submit(struct virtio_net *vnet, struct virtio_net_queue *queue, struct io_buffer *iobuf, size_t len)
Submit I/O buffer to queue.
static void virtio_net_mtu(struct net_device *netdev)
Get MTU.
static void virtio_net_mac(struct net_device *netdev)
Get MAC address.
static void virtio_net_refill_rx(struct virtio_net *vnet)
Refill receive queue.
static struct pci_device_id virtio_net_ids[]
Virtio network PCI device IDs.
static int virtio_net_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
static int virtio_net_open(struct net_device *netdev)
Open network device.
const struct virtio_features virtio_net_features
Supported features.
Virtual I/O network device.
#define VIRTIO_NET_RX_COUNT
Receive queue requested queue size.
#define VIRTIO_NET_RX_MAX
Receive queue maximum fill level.
static void virtio_net_queue_init(struct virtio_net_queue *queue, struct io_buffer **iobufs, uint8_t *slots, unsigned int index, unsigned int count, unsigned int max, unsigned int dma, unsigned int write)
Initialise virtio network queue.
#define VIRTIO_FEAT0_NET_MAC
Device has a MAC address.
#define VIRTIO_FEAT0_NET_MTU
Device has a reported MTU.
#define VIRTIO_NET_MTU
MTU register offset.
#define VIRTIO_NET_DESCS
Number of descriptors per packet.
#define VIRTIO_NET_TX_COUNT
Transmit queue requested queue size.
#define VIRTIO_NET_MAC
MAC address register offset.
#define VIRTIO_NET_TX_MAX
Transmit queue maximum fill level.
#define VIRTIO_NET_RX_INDEX
Receive queue index.
#define VIRTIO_NET_TX_INDEX
Transmit queue index.
int virtio_init(struct virtio_device *virtio, const struct virtio_features *driver)
Initialise device.
unsigned int virtio_status(struct virtio_device *virtio, unsigned int stat)
Report driver status.
int virtio_enable(struct virtio_device *virtio, struct virtio_queue *queue, unsigned int count)
Enable queue.
int virtio_reset(struct virtio_device *virtio)
Reset device.
void virtio_free(struct virtio_device *virtio, struct virtio_queue *queue)
Free queue.
void virtio_unmap(struct virtio_device *virtio)
Unmap device.
int virtio_pci_map(struct virtio_device *virtio, struct pci_device *pci)
Map PCI device.
#define VIRTIO_DESC_FL_WRITE
Buffer is write-only.
static void virtio_notify(struct virtio_queue *queue)
Notify queue.
#define VIRTIO_FEAT1_MODERN
Virtio version 1.0 or above.
#define VIRTIO_FEAT0_ANY_LAYOUT
Arbitrary descriptor layouts may be used.
static unsigned int virtio_completions(struct virtio_queue *queue)
Check for completed descriptors.
static int virtio_is_legacy(struct virtio_device *virtio)
Check if device is using the legacy interface.
static void virtio_submit(struct virtio_queue *queue, unsigned int index)
Submit descriptor(s) to queue.
static unsigned int virtio_complete(struct virtio_queue *queue, size_t *len)
Complete descriptor(s).
#define VIRTIO_DESC_FL_NEXT
Next descriptor index is valid.
static struct xen_remove_from_physmap * remove