mirror of
https://github.com/RGBCube/serenity
synced 2025-05-20 12:55:08 +00:00

This change allows the Kernel to actually construct other interfaces besides the E1000 type. This solves a breakage that was introduced recently because of move semantics. A couple of points on this patch: 1. In current situation, we can waste time to create a KString and throw it for nothing. This patch ensures we only create it near construction point so we know we actually need it. 2. It's very likely to assume that non-x86 machines will expose network device with a device tree (or with ACPI). The raspberry pi machine is a good example of that. Therefore, each driver should explicitly ask the correct interface name generation method, and this patch simplifies this pattern greatly, especially in a case where the same network device can appear as a PCI device or as device in another bus type on the same platform target. For example, the (in)famous ne2000 device can be used either as a PCI device or as an ISA device, depending on the model. 3. In my opinion, it seems much more readable to construct the name near calling point of the object constructor than to just pass it with move semantics.
63 lines
1.7 KiB
C++
63 lines
1.7 KiB
C++
/*
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/OwnPtr.h>
|
|
#include <Kernel/Arch/x86/IO.h>
|
|
#include <Kernel/Bus/PCI/Access.h>
|
|
#include <Kernel/Bus/PCI/Device.h>
|
|
#include <Kernel/Interrupts/IRQHandler.h>
|
|
#include <Kernel/Net/NetworkAdapter.h>
|
|
#include <Kernel/Random.h>
|
|
|
|
namespace Kernel {
|
|
|
|
#define RTL8139_TX_BUFFER_COUNT 4
|
|
|
|
class RTL8139NetworkAdapter final : public NetworkAdapter
|
|
, public PCI::Device
|
|
, public IRQHandler {
|
|
public:
|
|
static RefPtr<RTL8139NetworkAdapter> try_to_initialize(PCI::DeviceIdentifier const&);
|
|
|
|
virtual ~RTL8139NetworkAdapter() override;
|
|
|
|
virtual void send_raw(ReadonlyBytes) override;
|
|
virtual bool link_up() override { return m_link_up; }
|
|
virtual i32 link_speed() override;
|
|
virtual bool link_full_duplex() override;
|
|
|
|
virtual StringView purpose() const override { return class_name(); }
|
|
|
|
private:
|
|
RTL8139NetworkAdapter(PCI::Address, u8 irq, NonnullOwnPtr<KString>);
|
|
virtual bool handle_irq(const RegisterState&) override;
|
|
virtual StringView class_name() const override { return "RTL8139NetworkAdapter"sv; }
|
|
|
|
void reset();
|
|
void read_mac_address();
|
|
|
|
void receive();
|
|
|
|
void out8(u16 address, u8 data);
|
|
void out16(u16 address, u16 data);
|
|
void out32(u16 address, u32 data);
|
|
u8 in8(u16 address);
|
|
u16 in16(u16 address);
|
|
u32 in32(u16 address);
|
|
|
|
IOAddress m_io_base;
|
|
u8 m_interrupt_line { 0 };
|
|
OwnPtr<Memory::Region> m_rx_buffer;
|
|
u16 m_rx_buffer_offset { 0 };
|
|
Vector<OwnPtr<Memory::Region>> m_tx_buffers;
|
|
u8 m_tx_next_buffer { 0 };
|
|
OwnPtr<Memory::Region> m_packet_buffer;
|
|
bool m_link_up { false };
|
|
EntropySource m_entropy_source;
|
|
};
|
|
}
|