Macro kernel::module_phy_driver
source · macro_rules! module_phy_driver { (@replace_expr $_t:tt $sub:expr) => { ... }; (@count_devices $($x:expr),*) => { ... }; (@device_table [$($dev:expr),+]) => { ... }; (drivers: [$($driver:ident),+ $(,)?], device_table: [$($dev:expr),+ $(,)?], $($f:tt)*) => { ... }; }
Expand description
Declares a kernel module for PHYs drivers.
This creates a static array of kernel’s struct phy_driver
and registers it.
This also corresponds to the kernel’s MODULE_DEVICE_TABLE
macro, which embeds the information
for module loading into the module binary file. Every driver needs an entry in device_table
.
Examples
use kernel::c_str;
use kernel::net::phy::{self, DeviceId};
use kernel::prelude::*;
kernel::module_phy_driver! {
drivers: [PhySample],
device_table: [
DeviceId::new_with_driver::<PhySample>()
],
name: "rust_sample_phy",
author: "Rust for Linux Contributors",
description: "Rust sample PHYs driver",
license: "GPL",
}
struct PhySample;
#[vtable]
impl phy::Driver for PhySample {
const NAME: &'static CStr = c_str!("PhySample");
const PHY_DEVICE_ID: phy::DeviceId = phy::DeviceId::new_with_exact_mask(0x00000001);
}
This expands to the following code:
ⓘ
use kernel::c_str;
use kernel::net::phy::{self, DeviceId};
use kernel::prelude::*;
struct Module {
_reg: ::kernel::net::phy::Registration,
}
module! {
type: Module,
name: "rust_sample_phy",
author: "Rust for Linux Contributors",
description: "Rust sample PHYs driver",
license: "GPL",
}
struct PhySample;
#[vtable]
impl phy::Driver for PhySample {
const NAME: &'static CStr = c_str!("PhySample");
const PHY_DEVICE_ID: phy::DeviceId = phy::DeviceId::new_with_exact_mask(0x00000001);
}
const _: () = {
static mut DRIVERS: [::kernel::net::phy::DriverVTable; 1] =
[::kernel::net::phy::create_phy_driver::<PhySample>()];
impl ::kernel::Module for Module {
fn init(module: &'static ThisModule) -> Result<Self> {
let drivers = unsafe { &mut DRIVERS };
let mut reg = ::kernel::net::phy::Registration::register(
module,
::core::pin::Pin::static_mut(drivers),
)?;
Ok(Module { _reg: reg })
}
}
};
#[cfg(MODULE)]
#[no_mangle]
static __mod_mdio__phydev_device_table: [::kernel::bindings::mdio_device_id; 2] = [
::kernel::bindings::mdio_device_id {
phy_id: 0x00000001,
phy_id_mask: 0xffffffff,
},
::kernel::bindings::mdio_device_id {
phy_id: 0,
phy_id_mask: 0,
},
];