From 836d93f7e3a73d12bcb68b0442d011e6b0d03d11 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Sat, 24 Feb 2024 13:22:38 -0500 Subject: [PATCH] Kernel: Replace C-idioms with AK types in RTL8168 network adapter Instead of using C-arrays, and manually counting their lengths, use AK::Array. And pass these arrays around as spans, instead of as pointer- and-length pairs. --- Kernel/Net/Realtek/RTL8168NetworkAdapter.cpp | 68 ++++++++++---------- Kernel/Net/Realtek/RTL8168NetworkAdapter.h | 7 +- 2 files changed, 39 insertions(+), 36 deletions(-) diff --git a/Kernel/Net/Realtek/RTL8168NetworkAdapter.cpp b/Kernel/Net/Realtek/RTL8168NetworkAdapter.cpp index 18c3501440cf91..d20d345b23498b 100644 --- a/Kernel/Net/Realtek/RTL8168NetworkAdapter.cpp +++ b/Kernel/Net/Realtek/RTL8168NetworkAdapter.cpp @@ -4,6 +4,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include #include @@ -487,33 +488,33 @@ void RTL8168NetworkAdapter::configure_phy() void RTL8168NetworkAdapter::configure_phy_b_1() { - constexpr PhyRegister phy_registers[] = { + static constexpr auto phy_registers = to_array({ { 0x10, 0xf41b }, - { 0x1f, 0 } - }; + { 0x1f, 0 }, + }); phy_out(0x1f, 0x1); phy_out(0x16, 1 << 0); - phy_out_batch(phy_registers, 2); + phy_out_batch(phy_registers); } void RTL8168NetworkAdapter::configure_phy_b_2() { - constexpr PhyRegister phy_registers[] = { + static constexpr auto phy_registers = to_array({ { 0x1f, 0x1 }, { 0x10, 0xf41b }, - { 0x1f, 0 } - }; + { 0x1f, 0 }, + }); - phy_out_batch(phy_registers, 3); + phy_out_batch(phy_registers); } void RTL8168NetworkAdapter::configure_phy_e_2() { // FIXME: linux's driver writes a firmware blob to the device at this point, is this needed? - constexpr PhyRegister phy_registers[] = { + static constexpr auto phy_registers = to_array({ // Enable delay cap { 0x1f, 0x4 }, { 0x1f, 0x7 }, @@ -538,9 +539,9 @@ void RTL8168NetworkAdapter::configure_phy_e_2() { 0x5, 0x8b76 }, { 0x6, 0x8000 }, { 0x1f, 0 }, - }; + }); - phy_out_batch(phy_registers, 19); + phy_out_batch(phy_registers); // 4 corner performance improvement phy_out(0x1f, 0x5); @@ -774,20 +775,21 @@ void RTL8168NetworkAdapter::configure_phy_h_2() void RTL8168NetworkAdapter::rar_exgmac_set() { auto mac = mac_address(); - const u16 w[] = { + + auto const w = to_array({ (u16)(mac[0] | (mac[1] << 8)), (u16)(mac[2] | (mac[3] << 8)), (u16)(mac[4] | (mac[5] << 8)), - }; + }); - const ExgMacRegister exg_mac_registers[] = { + auto const exg_mac_registers = to_array({ { 0xe0, ERI_MASK_1111, (u32)(w[0] | (w[1] << 16)) }, { 0xe4, ERI_MASK_1111, (u32)w[2] }, { 0xf0, ERI_MASK_1111, (u32)(w[0] << 16) }, { 0xf4, ERI_MASK_1111, (u32)(w[1] | (w[2] << 16)) }, - }; + }); - exgmac_out_batch(exg_mac_registers, 4); + exgmac_out_batch(exg_mac_registers); } void RTL8168NetworkAdapter::start_hardware() @@ -933,14 +935,14 @@ void RTL8168NetworkAdapter::hardware_quirks_b_2() void RTL8168NetworkAdapter::hardware_quirks_e_2() { - constexpr EPhyUpdate ephy_info[] = { + static constexpr auto ephy_info = to_array({ { 0x9, 0, 0x80 }, { 0x19, 0, 0x224 }, - }; + }); csi_enable(CSI_ACCESS_1); - extended_phy_initialize(ephy_info, 2); + extended_phy_initialize(ephy_info); // FIXME: MTU performance tweak @@ -978,15 +980,15 @@ void RTL8168NetworkAdapter::hardware_quirks_h() out8(REG_CONFIG5, in8(REG_CONFIG5) & ~CFG5_ASPM_ENABLE); // initialize extended phy - constexpr EPhyUpdate ephy_info[] = { + static constexpr auto ephy_info = to_array({ { 0x1e, 0x800, 0x1 }, { 0x1d, 0, 0x800 }, { 0x5, 0xffff, 0x2089 }, { 0x6, 0xffff, 0x5881 }, { 0x4, 0xffff, 0x154a }, - { 0x1, 0xffff, 0x68b } - }; - extended_phy_initialize(ephy_info, 6); + { 0x1, 0xffff, 0x68b }, + }); + extended_phy_initialize(ephy_info); // enable tx auto fifo out32(REG_TXCFG, in32(REG_TXCFG) | TXCFG_AUTO_FIFO); @@ -1345,10 +1347,10 @@ void RTL8168NetworkAdapter::phy_update(u32 address, u32 set, u32 clear) phy_out(address, (value & ~clear) | set); } -void RTL8168NetworkAdapter::phy_out_batch(const PhyRegister phy_registers[], size_t length) +void RTL8168NetworkAdapter::phy_out_batch(ReadonlySpan phy_registers) { - for (size_t i = 0; i < length; i++) { - phy_out(phy_registers[i].address, phy_registers[i].data); + for (auto const& phy_register : phy_registers) { + phy_out(phy_register.address, phy_register.data); } } @@ -1369,11 +1371,11 @@ u16 RTL8168NetworkAdapter::extended_phy_in(u8 address) return in32(REG_EPHYACCESS) & 0xFFFF; } -void RTL8168NetworkAdapter::extended_phy_initialize(const EPhyUpdate ephy_info[], size_t length) +void RTL8168NetworkAdapter::extended_phy_initialize(ReadonlySpan ephy_info) { - for (size_t i = 0; i < length; i++) { - auto updated_value = (extended_phy_in(ephy_info[i].offset) & ~ephy_info[i].clear) | ephy_info[i].set; - extended_phy_out(ephy_info[i].offset, updated_value); + for (auto const& info : ephy_info) { + auto updated_value = (extended_phy_in(info.offset) & ~info.clear) | info.set; + extended_phy_out(info.offset, updated_value); } } @@ -1399,10 +1401,10 @@ void RTL8168NetworkAdapter::eri_update(u32 address, u32 mask, u32 set, u32 clear eri_out(address, mask, (value & ~clear) | set, type); } -void RTL8168NetworkAdapter::exgmac_out_batch(const ExgMacRegister exgmac_registers[], size_t length) +void RTL8168NetworkAdapter::exgmac_out_batch(ReadonlySpan exgmac_registers) { - for (size_t i = 0; i < length; i++) { - eri_out(exgmac_registers[i].address, exgmac_registers[i].mask, exgmac_registers[i].value, ERI_EXGMAC); + for (auto const& exgmac_register : exgmac_registers) { + eri_out(exgmac_register.address, exgmac_register.mask, exgmac_register.value, ERI_EXGMAC); } } diff --git a/Kernel/Net/Realtek/RTL8168NetworkAdapter.h b/Kernel/Net/Realtek/RTL8168NetworkAdapter.h index 0d27b97e5a21de..afda1c91db4511 100644 --- a/Kernel/Net/Realtek/RTL8168NetworkAdapter.h +++ b/Kernel/Net/Realtek/RTL8168NetworkAdapter.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include #include #include @@ -168,7 +169,7 @@ class RTL8168NetworkAdapter final : public NetworkAdapter u16 address; u16 data; }; - void phy_out_batch(const PhyRegister[], size_t length); + void phy_out_batch(ReadonlySpan); void extended_phy_out(u8 address, u16 data); u16 extended_phy_in(u8 address); @@ -177,7 +178,7 @@ class RTL8168NetworkAdapter final : public NetworkAdapter u16 clear; u16 set; }; - void extended_phy_initialize(const EPhyUpdate[], size_t length); + void extended_phy_initialize(ReadonlySpan); void eri_out(u32 address, u32 mask, u32 data, u32 type); u32 eri_in(u32 address, u32 type); @@ -187,7 +188,7 @@ class RTL8168NetworkAdapter final : public NetworkAdapter u16 mask; u32 value; }; - void exgmac_out_batch(const ExgMacRegister[], size_t length); + void exgmac_out_batch(ReadonlySpan); void csi_out(u32 address, u32 data); u32 csi_in(u32 address);