Skip to content

Commit 9c78353

Browse files
pci bar was backwards
1 parent 255ab15 commit 9c78353

2 files changed

Lines changed: 42 additions & 58 deletions

File tree

modules/rtl8169/rtl8169.c

Lines changed: 36 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,39 @@
1-
// Inspired by the Astral RTL8169 driver: https://github.com/Mathewnd/Astral/blob/rewrite/kernel-src/io/net/rtl8169.c
2-
1+
/**
2+
* @file rtl8169.c
3+
* @author Craig Edwards (craigedwards@brainbox.cc)
4+
* @copyright Copyright (c) 2012-2025
5+
* @ref Inspired by the Astral RTL8169 driver: https://github.com/Mathewnd/Astral/blob/rewrite/kernel-src/io/net/rtl8169.c
6+
*/
37
#include <kernel.h>
48
#include "rtl8169.h"
59

610
static rtl8169_dev_t rtl8169_dev;
711

8-
static inline void rtl8169_outb(uint32_t reg, uint8_t v)
9-
{
12+
static inline void rtl8169_outb(uint32_t reg, uint8_t v) {
1013
outb(rtl8169_dev.io_base + reg, v);
1114
}
1215

13-
static inline void rtl8169_outw(uint32_t reg, uint16_t v)
14-
{
16+
static inline void rtl8169_outw(uint32_t reg, uint16_t v) {
1517
outw(rtl8169_dev.io_base + reg, v);
1618
}
1719

18-
static inline void rtl8169_outl(uint32_t reg, uint32_t v)
19-
{
20+
static inline void rtl8169_outl(uint32_t reg, uint32_t v) {
2021
outl(rtl8169_dev.io_base + reg, v);
2122
}
2223

23-
static inline uint8_t rtl8169_inb(uint32_t reg)
24-
{
24+
static inline uint8_t rtl8169_inb(uint32_t reg) {
2525
return inb(rtl8169_dev.io_base + reg);
2626
}
2727

28-
static inline uint16_t rtl8169_inw(uint32_t reg)
29-
{
28+
static inline uint16_t rtl8169_inw(uint32_t reg) {
3029
return inw(rtl8169_dev.io_base + reg);
3130
}
3231

33-
static inline uint32_t rtl8169_inl(uint32_t reg)
34-
{
32+
static inline uint32_t rtl8169_inl(uint32_t reg) {
3533
return inl(rtl8169_dev.io_base + reg);
3634
}
3735

38-
static bool rtl8169_phy_read(uint8_t reg, uint16_t* value)
39-
{
36+
static bool rtl8169_phy_read(uint8_t reg, uint16_t* value) {
4037
rtl8169_outl(RTL8169_REG_PHYAR, (uint32_t)reg << 16);
4138

4239
for (int i = 0; i < 30; i++) {
@@ -52,8 +49,7 @@ static bool rtl8169_phy_read(uint8_t reg, uint16_t* value)
5249
return false;
5350
}
5451

55-
static bool rtl8169_phy_write(uint8_t reg, uint16_t value)
56-
{
52+
static bool rtl8169_phy_write(uint8_t reg, uint16_t value) {
5753
rtl8169_outl(RTL8169_REG_PHYAR, (uint32_t)value | ((uint32_t)reg << 16) | RTL8169_PHYAR_BUSY);
5854

5955
for (int i = 0; i < 30; i++) {
@@ -68,8 +64,7 @@ static bool rtl8169_phy_write(uint8_t reg, uint16_t value)
6864
return false;
6965
}
7066

71-
static void rtl8169_read_mac(void)
72-
{
67+
static void rtl8169_read_mac(void) {
7368
uint32_t word = rtl8169_inl(RTL8169_REG_MAC0);
7469
rtl8169_dev.mac[0] = (uint8_t)(word & 0xff);
7570
rtl8169_dev.mac[1] = (uint8_t)((word >> 8) & 0xff);
@@ -81,13 +76,11 @@ static void rtl8169_read_mac(void)
8176
rtl8169_dev.mac[5] = (uint8_t)((word >> 8) & 0xff);
8277
}
8378

84-
static void rtl8169_get_mac_addr(uint8_t* dst)
85-
{
79+
static void rtl8169_get_mac_addr(uint8_t* dst) {
8680
memcpy(dst, rtl8169_dev.mac, 6);
8781
}
8882

89-
static bool rtl8169_reset(void)
90-
{
83+
static bool rtl8169_reset(void) {
9184
rtl8169_outw(RTL8169_REG_CCR, 0);
9285
rtl8169_outb(RTL8169_REG_COMMAND, RTL8169_COMMAND_RESET);
9386

@@ -102,10 +95,9 @@ static bool rtl8169_reset(void)
10295
return false;
10396
}
10497

105-
static void rtl8169_tx_reclaim(void)
106-
{
98+
static void rtl8169_tx_reclaim(void) {
10799
while (rtl8169_dev.tx_free < RTL8169_TX_DESCRIPTOR_COUNT) {
108-
rtl8169_descriptor_t* d = &rtl8169_dev.tx_ring[rtl8169_dev.tx_clean];
100+
volatile rtl8169_descriptor_t* d = &rtl8169_dev.tx_ring[rtl8169_dev.tx_clean];
109101

110102
if (d->flags & RTL8169_DESCRIPTOR_OWN) {
111103
break;
@@ -120,10 +112,9 @@ static void rtl8169_tx_reclaim(void)
120112
}
121113
}
122114

123-
static void rtl8169_rx_drain(void)
124-
{
115+
static void rtl8169_rx_drain(void) {
125116
while ((rtl8169_dev.rx_ring[rtl8169_dev.rx_next].flags & RTL8169_DESCRIPTOR_OWN) == 0) {
126-
rtl8169_descriptor_t* d = &rtl8169_dev.rx_ring[rtl8169_dev.rx_next];
117+
volatile rtl8169_descriptor_t* d = &rtl8169_dev.rx_ring[rtl8169_dev.rx_next];
127118
void* buf = rtl8169_dev.rx_bufs[rtl8169_dev.rx_next];
128119

129120
uint16_t len = d->length;
@@ -143,8 +134,7 @@ static void rtl8169_rx_drain(void)
143134
}
144135
}
145136

146-
static void rtl8169_handler([[maybe_unused]] uint8_t isr, [[maybe_unused]] uint64_t error, [[maybe_unused]] uint64_t irq, [[maybe_unused]] void* opaque)
147-
{
137+
static void rtl8169_handler([[maybe_unused]] uint8_t isr, [[maybe_unused]] uint64_t error, [[maybe_unused]] uint64_t irq, [[maybe_unused]] void* opaque) {
148138
uint16_t status = rtl8169_inw(RTL8169_REG_IRQ_STATUS);
149139

150140
while (status) {
@@ -163,8 +153,7 @@ static void rtl8169_handler([[maybe_unused]] uint8_t isr, [[maybe_unused]] uint6
163153
}
164154
}
165155

166-
static bool rtl8169_send_packet(void* data, uint16_t len)
167-
{
156+
static bool rtl8169_send_packet(void* data, uint16_t len) {
168157
if (!rtl8169_dev.active) {
169158
return false;
170159
}
@@ -178,7 +167,7 @@ static bool rtl8169_send_packet(void* data, uint16_t len)
178167
}
179168

180169
uint16_t idx = rtl8169_dev.tx_next;
181-
rtl8169_descriptor_t* d = &rtl8169_dev.tx_ring[idx];
170+
volatile rtl8169_descriptor_t* d = &rtl8169_dev.tx_ring[idx];
182171
void* buf = rtl8169_dev.tx_bufs[idx];
183172

184173
if (!buf) {
@@ -208,21 +197,19 @@ static bool rtl8169_send_packet(void* data, uint16_t len)
208197
return true;
209198
}
210199

211-
static void rtl8169_free_rings(void)
212-
{
200+
static void rtl8169_free_rings(void) {
213201
if (rtl8169_dev.tx_ring) {
214-
kfree_aligned(rtl8169_dev.tx_ring);
202+
kfree_aligned((void*)rtl8169_dev.tx_ring);
215203
rtl8169_dev.tx_ring = NULL;
216204
}
217205

218206
if (rtl8169_dev.rx_ring) {
219-
kfree_aligned(rtl8169_dev.rx_ring);
207+
kfree_aligned((void*)rtl8169_dev.rx_ring);
220208
rtl8169_dev.rx_ring = NULL;
221209
}
222210
}
223211

224-
static void rtl8169_free_buffers(void)
225-
{
212+
static void rtl8169_free_buffers(void) {
226213
for (int i = 0; i < RTL8169_RX_DESCRIPTOR_COUNT; i++) {
227214
if (rtl8169_dev.rx_bufs[i]) {
228215
kfree_aligned(rtl8169_dev.rx_bufs[i]);
@@ -238,8 +225,7 @@ static void rtl8169_free_buffers(void)
238225
}
239226
}
240227

241-
static bool rtl8169_setup_rings(void)
242-
{
228+
static bool rtl8169_setup_rings(void) {
243229
size_t tx_bytes = sizeof(rtl8169_descriptor_t) * RTL8169_TX_DESCRIPTOR_COUNT;
244230
size_t rx_bytes = sizeof(rtl8169_descriptor_t) * RTL8169_RX_DESCRIPTOR_COUNT;
245231

@@ -310,8 +296,7 @@ static bool rtl8169_setup_rings(void)
310296
return true;
311297
}
312298

313-
static void rtl8169_phy_bringup(void)
314-
{
299+
static void rtl8169_phy_bring_up(void) {
315300
if (!rtl8169_phy_write(RTL8169_PHY_BMCR, RTL8169_PHY_BMCR_RESET)) {
316301
return;
317302
}
@@ -347,21 +332,19 @@ static void rtl8169_phy_bringup(void)
347332
}
348333
}
349334

350-
static bool rtl8169_start(pci_dev_t pdev)
351-
{
335+
static bool rtl8169_start(pci_dev_t pdev) {
352336
memset(&rtl8169_dev, 0, sizeof(rtl8169_dev));
353337

354338
rtl8169_dev.vendor_id = (uint16_t)pci_read(pdev, PCI_VENDOR_ID);
355339
rtl8169_dev.device_id = (uint16_t)pci_read(pdev, PCI_DEVICE_ID);
356340

357341
uint32_t bar0 = pci_read(pdev, PCI_BAR0);
358-
if (pci_bar_type(bar0) != 0) {
342+
if (pci_bar_type(bar0) != PCI_BAR_TYPE_IOPORT) {
359343
dprintf("rtl8169: BAR0 not IO-mapped\n");
360344
return false;
361345
}
362346

363347
rtl8169_dev.io_base = pci_io_base(bar0);
364-
365348
pci_enable_iospace(pdev);
366349
pci_bus_master(pdev);
367350

@@ -393,7 +376,7 @@ static bool rtl8169_start(pci_dev_t pdev)
393376

394377
rtl8169_outw(RTL8169_REG_IRQ_MASK, RTL8169_IRQ_MASK_RX_OK | RTL8169_IRQ_MASK_TX_OK | RTL8169_IRQ_MASK_TX_ERROR | RTL8169_IRQ_MASK_RX_ERROR);
395378

396-
rtl8169_phy_bringup();
379+
rtl8169_phy_bring_up();
397380

398381
rtl8169_outb(RTL8169_REG_COMMAND, RTL8169_COMMAND_TX_ENABLE | RTL8169_COMMAND_RX_ENABLE);
399382

@@ -424,8 +407,7 @@ static bool rtl8169_start(pci_dev_t pdev)
424407
return true;
425408
}
426409

427-
static void init_rtl8169(void)
428-
{
410+
static void init_rtl8169(void) {
429411
static const struct {
430412
uint16_t vendor;
431413
uint16_t device;
@@ -449,14 +431,12 @@ static void init_rtl8169(void)
449431
}
450432
}
451433

452-
bool EXPORTED MOD_INIT_SYM(KMOD_ABI)(void)
453-
{
434+
bool EXPORTED MOD_INIT_SYM(KMOD_ABI)(void) {
454435
dprintf("rtl8169: loaded\n");
455436
init_rtl8169();
456437
return rtl8169_dev.active;
457438
}
458439

459-
bool EXPORTED MOD_EXIT_SYM(KMOD_ABI)(void)
460-
{
440+
bool EXPORTED MOD_EXIT_SYM(KMOD_ABI)(void) {
461441
return false;
462442
}

modules/rtl8169/rtl8169.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1-
// Inspired by the Astral RTL8169 driver: https://github.com/Mathewnd/Astral/blob/rewrite/kernel-src/io/net/rtl8169.c
2-
1+
/**
2+
* @file rtl8169.h
3+
* @author Craig Edwards (craigedwards@brainbox.cc)
4+
* @copyright Copyright (c) 2012-2025
5+
* @ref Inspired by the Astral RTL8169 driver: https://github.com/Mathewnd/Astral/blob/rewrite/kernel-src/io/net/rtl8169.c
6+
*/
37
#pragma once
48

59
#include <kernel.h>

0 commit comments

Comments
 (0)