blob: ae3e2ce51f481a17c8fd45e13d15e44a50421a10 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
#include "device.h"
#include "ring.h"
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <ddk/io-buffer.h>
#include <ddk/protocol/ethernet.h>
#include <fbl/macros.h>
#include <fbl/unique_ptr.h>
#include <virtio/net.h>
#include <zircon/compiler.h>
#include <zircon/device/ethernet.h>
#include <zircon/thread_annotations.h>
#include <zircon/types.h>
namespace virtio {
class EthernetDevice : public Device {
public:
explicit EthernetDevice(zx_device_t* device, zx::bti, fbl::unique_ptr<Backend> backend);
virtual ~EthernetDevice();
zx_status_t Init() override TA_EXCL(state_lock_);
void Release() override TA_EXCL(state_lock_);
// VirtIO callbacks
void IrqRingUpdate() override TA_EXCL(state_lock_);
void IrqConfigChange() override TA_EXCL(state_lock_);
// DDK protocol hooks; see ddk/protocol/ethernet.h
zx_status_t Query(uint32_t options, ethmac_info_t* info) TA_EXCL(state_lock_);
void Stop() TA_EXCL(state_lock_);
zx_status_t Start(const ethmac_ifc_t* ifc) TA_EXCL(state_lock_);
zx_status_t QueueTx(uint32_t options, ethmac_netbuf_t* netbuf) TA_EXCL(state_lock_);
const char* tag() const override { return "virtio-net"; }
private:
DISALLOW_COPY_ASSIGN_AND_MOVE(EthernetDevice);
// DDK device hooks; see ddk/device.h
void ReleaseLocked() TA_REQ(state_lock_);
// Mutexes to control concurrent access
mtx_t state_lock_;
mtx_t tx_lock_;
// Virtqueues; see section 5.1.2 of the spec
// This driver doesn't currently support multi-queueing, automatic
// steering, or the control virtqueue, so only a single queue is needed in
// each direction.
Ring rx_;
Ring tx_;
fbl::unique_ptr<io_buffer_t[]> bufs_;
size_t unkicked_ TA_GUARDED(tx_lock_);
// Saved net device configuration out of the pci config BAR
virtio_net_config_t config_ TA_GUARDED(state_lock_);
size_t virtio_hdr_len_;
// Ethmac callback interface; see ddk/protocol/ethernet.h
ethmac_ifc_t ifc_ TA_GUARDED(state_lock_);
};
} // namespace virtio