mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-08 23:42:53 +03:00
7718842829
Simplify core methods in the VirtIO bus handling code by ensuring proper error propagation. This makes initialization of queues, handling changes in device configuration, and other core patterns more readable as well. It also allows us to remove the obnoxious pattern of checking for boolean "success" and if we get false answer then returning an actual errno code.
60 lines
1.8 KiB
C++
60 lines
1.8 KiB
C++
/*
|
|
* Copyright (c) 2023, Kirill Nikolaev <cyril7@gmail.com>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <Kernel/Bus/VirtIO/Device.h>
|
|
#include <Kernel/Memory/RingBuffer.h>
|
|
#include <Kernel/Net/NetworkAdapter.h>
|
|
|
|
namespace Kernel {
|
|
|
|
class VirtIONetworkAdapter
|
|
: public VirtIO::Device
|
|
, public NetworkAdapter {
|
|
|
|
public:
|
|
static ErrorOr<bool> probe(PCI::DeviceIdentifier const&);
|
|
static ErrorOr<NonnullRefPtr<NetworkAdapter>> create(PCI::DeviceIdentifier const&);
|
|
virtual ~VirtIONetworkAdapter() override = default;
|
|
|
|
// VirtIO::Device
|
|
virtual ErrorOr<void> initialize_virtio_resources() override;
|
|
|
|
// NetworkAdapter
|
|
virtual StringView class_name() const override { return "VirtIONetworkAdapter"sv; }
|
|
virtual Type adapter_type() const override { return Type::Ethernet; }
|
|
virtual ErrorOr<void> initialize(Badge<NetworkingManagement>) override;
|
|
|
|
virtual bool link_up() override { return m_link_up; }
|
|
virtual bool link_full_duplex() override { return m_link_duplex; }
|
|
virtual i32 link_speed() override { return m_link_speed; }
|
|
|
|
private:
|
|
explicit VirtIONetworkAdapter(StringView interface_name, NonnullOwnPtr<VirtIO::TransportEntity>);
|
|
|
|
// VirtIO::Device
|
|
virtual ErrorOr<void> handle_device_config_change() override;
|
|
virtual void handle_queue_update(u16 queue_index) override;
|
|
|
|
// NetworkAdapter
|
|
virtual void send_raw(ReadonlyBytes) override;
|
|
|
|
private:
|
|
VirtIO::Configuration const* m_device_config { nullptr };
|
|
|
|
// FIXME: Make atomic as they are read without sync.
|
|
// Note that VirtIO::NetworkAdapter may also have the same defect.
|
|
bool m_link_up { false };
|
|
i32 m_link_speed { LINKSPEED_INVALID };
|
|
bool m_link_duplex { false };
|
|
|
|
OwnPtr<Memory::RingBuffer> m_rx_buffers;
|
|
OwnPtr<Memory::RingBuffer> m_tx_buffers;
|
|
};
|
|
|
|
}
|