9 #include "../../../include/drv/network/virtio_network.h"
10 #include <drv/rtl8139.h>
11 #include <net/cards.h>
14 #include <net/endianess.h>
15 #include <net/ethernet.h>
16 #include <debug/hexview.h>
18 #include "lib/string.h"
39 qemu_log(
"[VirtIO] [Network] Init");
40 uint8_t busnum, slot, func;
41 uint32_t io_base, mem_base, bar_type;
43 size_t phys_buffer = 0;
44 char* virt_buffer = (
char*)0;
47 size_t phys_buffer2 = 0;
48 char* virt_buffer2 = (
char*)0;
50 void* transfer_buffer;
51 size_t transfer_buffer_phys;
55 &busnum, &slot, &func);
58 qemu_log(
"[VirtIO] [Network] ID: %d (%x)", devnum, devnum);
60 if(devnum == PCI_VENDOR_NO_DEVICE) {
61 qemu_err(
"[VirtIO] [Network] Error is not connected!");
64 qemu_ok(
"Detected VirtIO Network");
71 io_base = ret & (~0x3);
72 mem_base = ret & (~0xf);
74 qemu_log(
"[VirtIO] [Network] BAR TYPE: %d; IO BASE: %x; MEMORY BASE: %x", bar_type, io_base, mem_base);
77 uint32_t mac_part1 = inl(io_base + VIO_NAT_NDR_MAC1P);
78 uint16_t mac_part2 = inw(io_base + VIO_NAT_NDR_MAC2P);
80 mac[0] = (mac_part1 >> 0) & 0xFF;
81 mac[1] = mac_part1 >> 8;
82 mac[2] = mac_part1 >> 16;
83 mac[3] = mac_part1 >> 24;
85 mac[4] = mac_part2 >> 0;
86 mac[5] = mac_part2 >> 8;
88 qemu_log(
"Mac is: %v:%v:%v:%v:%v:%v", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
92 virt_buffer = kmalloc_common(4, PAGE_SIZE);
93 phys_buffer = virt2phys(get_kernel_page_directory(), (virtual_addr_t) virt_buffer);
95 virt_buffer2 = kmalloc_common(4, PAGE_SIZE);
96 phys_buffer2 = virt2phys(get_kernel_page_directory(), (virtual_addr_t) virt_buffer2);
99 transfer_buffer = kmalloc_common(65550, PAGE_SIZE);
100 transfer_buffer_phys = virt2phys(get_kernel_page_directory(), (virtual_addr_t)transfer_buffer);
103 outl(io_base + VIO_NAT_IDR_DS, 0x01);
105 outl(io_base + VIO_NAT_IDR_DS, 0x03);
107 outl(io_base + VIO_NAT_IDR_QS, 0x01);
109 outl(io_base + VIO_NAT_IDR_QA, phys_buffer);
111 outl(io_base + VIO_NAT_IDR_GF, 0x00010020);
113 outl(io_base + VIO_NAT_IDR_DS, 0x01);
115 outl(io_base + VIO_NAT_IDR_QN, 0x00);
uint16_t pci_read_confspc_word(uint8_t bus, uint8_t slot, uint8_t function, uint8_t offset)
[PCI] Чтение 16-битных полей из пространства механизма конфигураций 1
void pci_find_device(uint16_t vendor, uint16_t device, uint8_t *bus_ret, uint8_t *slot_ret, uint8_t *func_ret)
[PCI] Поиск устройства по ID-поставшика и устройства
uint16_t pci_get_device(uint8_t bus, uint8_t slot, uint8_t function)
[PCI] Получение ID-Устройства