12using namespace MaxOS::common;
13using namespace MaxOS::memory;
14using namespace MaxOS::drivers;
15using namespace MaxOS::drivers::ethernet;
16using namespace MaxOS::hardwarecommunication;
28mac_address_0_port(
dev->port_base),
29mac_address_2_port(
dev->port_base + 0x02),
30mac_address_4_port(
dev->port_base + 0x04),
31register_data_port(
dev->port_base + 0x10),
32register_address_port(
dev->port_base + 0x12),
33bus_control_register_data_port(
dev->port_base + 0x16),
34reset_port(
dev->port_base + 0x14),
39 current_send_buffer = 0;
40 current_recv_buffer = 0;
65 register_address_port.
write(20);
66 bus_control_register_data_port.
write(0x102);
69 register_address_port.
write(0);
70 register_data_port.
write(0x04);
73 init_block.mode = 0x0000;
74 init_block.reserved1 = 0;
75 init_block.num_send_buffers = 3;
76 init_block.reserved2 = 0;
77 init_block.num_recv_buffers = 3;
78 init_block.physical_address = own_mac;
79 init_block.reserved3 = 0;
80 init_block.logical_address = 0;
84 init_block.send_buffer_descr_address = (
uint64_t) send_buffer_descr;
87 init_block.recv_buffer_descr_address = (
uint64_t) recv_buffer_descr;
89 for(
uint8_t i = 0; i < 8; i++) {
92 send_buffer_descr[i].address = (((
uint64_t) &send_buffers[i]) + 15) & ~(
uint32_t) 0xF;
93 send_buffer_descr[i].flags =
96 send_buffer_descr[i].flags2 = 0;
97 send_buffer_descr[i].avail = 0;
100 recv_buffer_descr[i].address = (((
uint64_t) &recv_buffers[i]) + 15) & ~(
uint32_t) 0xF;
101 recv_buffer_descr[i].flags =
104 recv_buffer_descr[i].flags2 = 0;
105 recv_buffer_descr[i].avail = 0;
109 register_address_port.
write(1);
112 register_address_port.
write(2);
119AMD_AM79C973::~AMD_AM79C973() =
default;
132 register_address_port.
write(0);
133 register_data_port.
write(0x41);
136 register_address_port.
write(4);
139 register_address_port.
write(4);
143 register_address_port.
write(0);
144 register_data_port.
write(
171 register_address_port.
write(0);
177 if((
temp & 0x8000) == 0x8000)
179 if((
temp & 0x2000) == 0x2000)
181 if((
temp & 0x1000) == 0x1000)
183 if((
temp & 0x0800) == 0x0800)
188 if((
temp & 0x0400) == 0x0400) fetch_data_received();
189 if((
temp & 0x0200) == 0x0200) fetch_data_sent();
190 if((
temp & 0x0100) == 0x0100) init_done =
true;
193 register_address_port.
write(0);
215 current_send_buffer = (current_send_buffer + 1) %
242 register_address_port.
write(0);
243 register_data_port.
write(
247void AMD_AM79C973::fetch_data_received() {
249 for(; (recv_buffer_descr[current_recv_buffer].flags & 0x80000000) == 0; current_recv_buffer =
250 (current_recv_buffer + 1) %
253 if(!(recv_buffer_descr[current_recv_buffer].flags & 0x40000000)
254 && (recv_buffer_descr[current_recv_buffer].flags & 0x03000000) ==
257 uint32_t size = recv_buffer_descr[current_recv_buffer].flags2 & 0xFFF;
262 auto* buffer = (
uint8_t*) (recv_buffer_descr[current_recv_buffer].address);
266 recv_buffer_descr[current_recv_buffer].flags2 = 0;
267 recv_buffer_descr[current_recv_buffer].flags = 0x8000F7FF;
271void AMD_AM79C973::fetch_data_sent() {
314 return "PCnet-Fast III (Am79C973)";
Driver for the AMD AM79C973 Ethernet Controller.
static Logger WARNING()
Gets active logger set to WARNING level.
Stores the left, top, width and height of a rectangle.
uint32_t reset() final
This function resets the device.
string vendor_name() final
Get who created the device.
string device_name() final
Get the device name of the driver.
void activate() final
This function activates the device and starts it (Runs when the driver-manger calls activateAll())
AMD_AM79C973(hardwarecommunication::PCIDeviceDescriptor *dev)
Constructs a new AMD_AM79C973 Ethernet driver, reads the MAC address and sets up the initialisation b...
void handle_interrupt() final
This function handles the interrupt for the device.
uint64_t get_media_access_control_address() final
This function gets the MAC address.
void do_send(uint8_t *buffer, uint32_t size) final
This function sends a package.
void deactivate() final
Deactivate the driver.
void fire_data_received(uint8_t *buffer, uint32_t size)
Handle the recieved data.
Handles a certain interrupt number.
Stores information about a PCI device.
virtual void write(uint16_t data)
write a word to the port
virtual uint16_t read()
read a word from the port
static void * kmalloc(size_t size)
Allocates a block of memory in the KERNEL space.
Defines the layout of a buffer descriptor for the AMD AM79C973 Ethernet Controller.