1 use super::{ 2 driver::{Driver, DriverMatchName, DriverMatcher}, 3 sys_devices_kset, Device, DeviceMatchName, DeviceMatcher, DeviceState, 4 }; 5 use crate::{ 6 driver::base::{ 7 device::{device_manager, driver::driver_manager}, 8 kobject::{KObjType, KObject, KObjectManager}, 9 kset::KSet, 10 subsys::SubSysPrivate, 11 }, 12 filesystem::{ 13 sysfs::{ 14 file::sysfs_emit_str, sysfs_instance, Attribute, AttributeGroup, SysFSOps, 15 SysFSOpsSupport, 16 }, 17 vfs::syscall::ModeType, 18 }, 19 libs::rwlock::RwLock, 20 syscall::SystemError, 21 }; 22 use alloc::{ 23 string::{String, ToString}, 24 sync::Arc, 25 }; 26 use core::{ffi::CStr, fmt::Debug, intrinsics::unlikely}; 27 use hashbrown::HashMap; 28 use intertrait::cast::CastArc; 29 30 /// `/sys/bus`的kset 31 static mut BUS_KSET_INSTANCE: Option<Arc<KSet>> = None; 32 /// `/sys/devices/system`的kset 33 static mut DEVICES_SYSTEM_KSET_INSTANCE: Option<Arc<KSet>> = None; 34 35 static mut BUS_MANAGER_INSTANCE: Option<BusManager> = None; 36 37 #[inline(always)] 38 pub fn sys_bus_kset() -> Arc<KSet> { 39 unsafe { BUS_KSET_INSTANCE.clone().unwrap() } 40 } 41 42 #[inline(always)] 43 #[allow(dead_code)] 44 pub fn sys_devices_system_kset() -> Arc<KSet> { 45 unsafe { DEVICES_SYSTEM_KSET_INSTANCE.clone().unwrap() } 46 } 47 48 #[inline(always)] 49 pub fn bus_manager() -> &'static BusManager { 50 unsafe { BUS_MANAGER_INSTANCE.as_ref().unwrap() } 51 } 52 53 /// @brief: 总线状态 54 #[derive(Debug, Copy, Clone)] 55 pub enum BusState { 56 NotInitialized = 0, // 未初始化 57 Initialized = 1, // 已初始化 58 UnDefined = 2, // 未定义的 59 } 60 61 /// @brief: 将u32类型转换为总线状态类型 62 impl From<u32> for BusState { 63 fn from(state: u32) -> Self { 64 match state { 65 0 => BusState::NotInitialized, 66 1 => BusState::Initialized, 67 _ => BusState::UnDefined, 68 } 69 } 70 } 71 72 /// @brief: 将总线状态类型转换为u32类型 73 impl From<DeviceState> for BusState { 74 fn from(state: DeviceState) -> Self { 75 match state { 76 DeviceState::Initialized => BusState::Initialized, 77 DeviceState::NotInitialized => BusState::NotInitialized, 78 DeviceState::UnDefined => BusState::UnDefined, 79 } 80 } 81 } 82 83 /// @brief: 将总线状态类型转换为设备状态类型 84 impl From<BusState> for DeviceState { 85 fn from(state: BusState) -> Self { 86 match state { 87 BusState::Initialized => DeviceState::Initialized, 88 BusState::NotInitialized => DeviceState::NotInitialized, 89 BusState::UnDefined => DeviceState::UnDefined, 90 } 91 } 92 } 93 94 /// 总线子系统的trait,所有总线都应实现该trait 95 /// 96 /// 请注意,这个trait是用于实现总线子系统的,而不是总线驱动/总线设备。 97 /// https://opengrok.ringotek.cn/xref/linux-6.1.9/include/linux/device/bus.h#84 98 pub trait Bus: Debug + Send + Sync { 99 fn name(&self) -> String; 100 fn dev_name(&self) -> String; 101 fn root_device(&self) -> Option<Arc<dyn Device>> { 102 None 103 } 104 105 /// 总线上的设备的默认属性组 106 fn dev_groups(&self) -> &'static [&'static dyn AttributeGroup] { 107 &[] 108 } 109 110 /// 总线的默认属性组 111 fn bus_groups(&self) -> &'static [&'static dyn AttributeGroup] { 112 &[] 113 } 114 115 /// 总线上的驱动的默认属性组 116 fn drv_groups(&self) -> &'static [&'static dyn AttributeGroup] { 117 &[] 118 } 119 120 /// 检查设备是否可以被总线绑定,如果可以,就绑定它们。 121 /// 绑定之后,device的driver字段会被设置为驱动实例。 122 /// 123 /// ## 参数 124 /// 125 /// - `device` - 设备实例 126 /// 127 /// ## 默认实现 128 /// 129 /// 如果总线不支持该操作,返回`SystemError::EOPNOTSUPP_OR_ENOTSUP` 130 fn probe(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError> { 131 return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 132 } 133 fn remove(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError>; 134 fn sync_state(&self, _device: &Arc<dyn Device>) {} 135 fn shutdown(&self, _device: &Arc<dyn Device>); 136 fn suspend(&self, _device: &Arc<dyn Device>) { 137 // todo: implement suspend 138 } 139 140 fn resume(&self, device: &Arc<dyn Device>) -> Result<(), SystemError>; 141 142 /// match platform device to platform driver. 143 /// 144 /// ## 参数 145 /// 146 /// * `device` - platform device 147 /// * `driver` - platform driver 148 /// 149 /// ## 返回 150 /// 151 /// - `Ok(true)` - 匹配成功 152 /// - `Ok(false)` - 匹配失败 153 /// - `Err(_)` - 由于内部错误导致匹配失败 154 fn match_device( 155 &self, 156 device: &Arc<dyn Device>, 157 driver: &Arc<dyn Driver>, 158 ) -> Result<bool, SystemError>; 159 160 fn subsystem(&self) -> &SubSysPrivate; 161 162 /// 对当前总线操作的时候需要获取父级总线的锁 163 fn need_parent_lock(&self) -> bool { 164 false 165 } 166 } 167 168 impl dyn Bus { 169 /// 在bus上,根据条件寻找一个特定的设备 170 /// 171 /// ## 参数 172 /// 173 /// - `matcher` - 匹配器 174 /// - `data` - 传给匹配器的数据 175 pub fn find_device<T: Copy>( 176 &self, 177 matcher: &dyn DeviceMatcher<T>, 178 data: T, 179 ) -> Option<Arc<dyn Device>> { 180 let subsys = self.subsystem(); 181 let guard = subsys.devices(); 182 for dev in guard.iter() { 183 let dev = dev.upgrade(); 184 if let Some(dev) = dev { 185 if matcher.match_device(&dev, data) { 186 return Some(dev.clone()); 187 } 188 } 189 } 190 return None; 191 } 192 193 /// 根据名称匹配设备 194 /// 195 /// ## 参数 196 /// 197 /// - name 设备名称 198 pub fn find_device_by_name(&self, name: &str) -> Option<Arc<dyn Device>> { 199 return self.find_device(&DeviceMatchName, name); 200 } 201 202 /// 在bus上,根据条件寻找一个特定的驱动 203 /// 204 /// ## 参数 205 /// 206 /// - `matcher` - 匹配器 207 /// - `data` - 传给匹配器的数据 208 pub fn find_driver<T: Copy>( 209 &self, 210 matcher: &dyn DriverMatcher<T>, 211 data: T, 212 ) -> Option<Arc<dyn Driver>> { 213 let subsys = self.subsystem(); 214 let guard = subsys.drivers(); 215 for drv in guard.iter() { 216 let drv = drv.upgrade(); 217 if let Some(drv) = drv { 218 if matcher.match_driver(&drv, data) { 219 return Some(drv.clone()); 220 } 221 } 222 } 223 return None; 224 } 225 226 /// 根据名称在bus上匹配驱动 227 pub fn find_driver_by_name(&self, name: &str) -> Option<Arc<dyn Driver>> { 228 return self.find_driver(&DriverMatchName, name); 229 } 230 } 231 232 /// @brief: 总线管理结构体 233 #[derive(Debug)] 234 pub struct BusManager { 235 /// 存储总线bus的kset结构体与bus实例的映射(用于在sysfs callback的时候,根据kset找到bus实例) 236 kset_bus_map: RwLock<HashMap<Arc<KSet>, Arc<dyn Bus>>>, 237 } 238 239 impl BusManager { 240 pub fn new() -> Self { 241 return Self { 242 kset_bus_map: RwLock::new(HashMap::new()), 243 }; 244 } 245 246 /// 把一个设备添加到总线上 247 /// 248 /// ## 描述 249 /// 250 /// - 添加一个设备的与bus相关的属性 251 /// - 在bus和设备文件夹下,创建软链接 252 /// - 把设备添加到它的总线的设备列表中 253 /// 254 /// 参考: https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/base/bus.c?fi=bus_add_device#441 255 /// 256 /// ## 参数 257 /// 258 /// - `dev` - 要被添加的设备 259 pub fn add_device(&self, dev: &Arc<dyn Device>) -> Result<(), SystemError> { 260 let bus = dev.bus(); 261 if let Some(bus) = bus { 262 device_manager().add_groups(dev, bus.dev_groups())?; 263 264 // 增加符号链接 265 let bus_devices_kset = bus 266 .subsystem() 267 .devices_kset() 268 .expect("bus devices kset is none, maybe bus is not registered"); 269 let dev_kobj = dev.clone() as Arc<dyn KObject>; 270 271 sysfs_instance().create_link( 272 Some(&bus_devices_kset.as_kobject()), 273 &dev_kobj, 274 dev.name(), 275 )?; 276 sysfs_instance().create_link( 277 Some(&dev_kobj), 278 &(&bus.subsystem().subsys().as_kobject()), 279 "subsystem".to_string(), 280 )?; 281 bus.subsystem().add_device_to_vec(dev)?; 282 } 283 return Ok(()); 284 } 285 286 /// 在总线上添加一个驱动 287 /// 288 /// 参考 https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/base/bus.c?fi=bus_add_driver#590 289 pub fn add_driver(&self, driver: &Arc<dyn Driver>) -> Result<(), SystemError> { 290 let bus = driver.bus().ok_or(SystemError::EINVAL)?; 291 kdebug!("bus '{}' add driver '{}'", bus.name(), driver.name()); 292 293 driver.set_kobj_type(Some(&BusDriverKType)); 294 let kobj = driver.clone() as Arc<dyn KObject>; 295 KObjectManager::add_kobj(kobj, bus.subsystem().drivers_kset())?; 296 297 bus.subsystem().add_driver_to_vec(driver)?; 298 if bus.subsystem().drivers_autoprobe() { 299 let r = driver_manager().driver_attach(driver); 300 if let Err(e) = r { 301 bus.subsystem().remove_driver_from_vec(driver); 302 return Err(e); 303 } 304 } 305 306 driver_manager() 307 .add_groups(driver, bus.drv_groups()) 308 .or_else(|e| { 309 kerror!( 310 "BusManager::add_driver: driver '{:?}' add_groups failed, err: '{:?}", 311 driver.name(), 312 e 313 ); 314 Err(e) 315 }) 316 .ok(); 317 318 if !driver.suppress_bind_attrs() { 319 self.add_bind_files(driver) 320 .or_else(|e| { 321 kerror!( 322 "BusManager::add_driver: driver '{:?}' add_bind_files failed, err: '{:?}", 323 driver.name(), 324 e 325 ); 326 Err(e) 327 }) 328 .ok(); 329 } 330 331 return Ok(()); 332 } 333 334 /// 335 /// bus_register - register a driver-core subsystem 336 /// 337 /// ## 参数 338 /// - `bus` - bus to register 339 /// 340 /// Once we have that, we register the bus with the kobject 341 /// infrastructure, then register the children subsystems it has: 342 /// the devices and drivers that belong to the subsystem. 343 /// 344 /// 参考: https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/base/bus.c?fi=bus_register#783 345 /// 346 /// todo: 增加错误处理逻辑 347 pub fn register(&self, bus: Arc<dyn Bus>) -> Result<(), SystemError> { 348 bus.subsystem().set_bus(Arc::downgrade(&bus)); 349 350 let subsys_kset = bus.subsystem().subsys(); 351 subsys_kset.set_name(bus.name()); 352 bus.subsystem().set_drivers_autoprobe(true); 353 354 subsys_kset.register(Some(sys_bus_kset()))?; 355 356 let devices_kset = 357 KSet::new_and_add("devices".to_string(), None, Some(subsys_kset.clone()))?; 358 bus.subsystem().set_devices_kset(devices_kset); 359 let drivers_kset = 360 KSet::new_and_add("drivers".to_string(), None, Some(subsys_kset.clone()))?; 361 bus.subsystem().set_drivers_kset(drivers_kset); 362 363 self.add_probe_files(&bus)?; 364 let bus_groups = bus.bus_groups(); 365 self.add_groups(&bus, bus_groups)?; 366 // 把bus实例添加到总线管理器中(方便在sysfs callback的时候,根据kset找到bus实例) 367 self.kset_bus_map.write().insert(subsys_kset, bus.clone()); 368 return Ok(()); 369 } 370 371 pub fn unregister(&self, _bus: Arc<dyn Bus>) -> Result<(), SystemError> { 372 todo!("bus_unregister") 373 } 374 375 fn add_probe_files(&self, bus: &Arc<dyn Bus>) -> Result<(), SystemError> { 376 self.create_file(bus, &BusAttrDriversProbe)?; 377 let r = self.create_file(bus, &BusAttrDriversAutoprobe); 378 379 if r.is_err() { 380 self.remove_file(bus, &BusAttrDriversProbe); 381 } 382 return r; 383 } 384 385 #[allow(dead_code)] 386 fn remove_probe_files(&self, bus: &Arc<dyn Bus>) { 387 self.remove_file(bus, &BusAttrDriversAutoprobe); 388 self.remove_file(bus, &BusAttrDriversProbe); 389 } 390 391 fn create_file( 392 &self, 393 bus: &Arc<dyn Bus>, 394 attr: &'static dyn Attribute, 395 ) -> Result<(), SystemError> { 396 let bus_kobj = bus.subsystem().subsys() as Arc<dyn KObject>; 397 return sysfs_instance().create_file(&bus_kobj, attr); 398 } 399 400 fn remove_file(&self, bus: &Arc<dyn Bus>, attr: &'static dyn Attribute) { 401 let bus_kobj = bus.subsystem().subsys() as Arc<dyn KObject>; 402 sysfs_instance().remove_file(&bus_kobj, attr); 403 } 404 405 #[inline] 406 fn add_groups( 407 &self, 408 bus: &Arc<dyn Bus>, 409 groups: &[&'static dyn AttributeGroup], 410 ) -> Result<(), SystemError> { 411 let bus_kobj = bus.subsystem().subsys() as Arc<dyn KObject>; 412 return sysfs_instance().create_groups(&bus_kobj, groups); 413 } 414 415 /// 根据bus的kset找到bus实例 416 fn get_bus_by_kset(&self, kset: &Arc<KSet>) -> Option<Arc<dyn Bus>> { 417 return self.kset_bus_map.read().get(kset).map(|bus| bus.clone()); 418 } 419 420 /// 为bus上的设备选择可能的驱动程序 421 /// 422 /// 这个函数会扫描总线上的所有没有驱动的设备,然后为它们选择可能的驱动程序。 423 /// 424 /// ## 参数 425 /// 426 /// - `bus` - bus实例 427 #[allow(dead_code)] 428 pub fn rescan_devices(&self, bus: &Arc<dyn Bus>) -> Result<(), SystemError> { 429 for dev in bus.subsystem().devices().iter() { 430 let dev = dev.upgrade(); 431 if let Some(dev) = dev { 432 rescan_devices_helper(dev)?; 433 } 434 } 435 return Ok(()); 436 } 437 438 /// 为新设备探测驱动 439 /// 440 /// Automatically probe for a driver if the bus allows it. 441 pub fn probe_device(&self, dev: &Arc<dyn Device>) { 442 let bus = dev.bus(); 443 if bus.is_none() { 444 return; 445 } 446 let bus = bus.unwrap(); 447 if bus.subsystem().drivers_autoprobe() { 448 device_manager().device_initial_probe(dev).ok(); 449 } 450 for interface in bus.subsystem().interfaces() { 451 interface.add_device(dev).ok(); 452 } 453 } 454 455 /// 从总线上移除一个驱动 456 /// 457 /// Detach the driver from the devices it controls, and remove 458 /// it from its bus's list of drivers. Finally, we drop the reference 459 /// to the bus. 460 /// 461 /// ## 参数 462 /// 463 /// - `driver` - 驱动实例 464 /// 465 /// 参考 https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/base/bus.c?fi=bus_remove_driver#666 466 pub fn remove_driver(&self, _driver: &Arc<dyn Driver>) { 467 todo!("BusManager::remove_driver") 468 } 469 470 fn add_bind_files(&self, driver: &Arc<dyn Driver>) -> Result<(), SystemError> { 471 driver_manager().create_attr_file(driver, &DriverAttrUnbind)?; 472 473 driver_manager() 474 .create_attr_file(driver, &DriverAttrBind) 475 .map_err(|e| { 476 driver_manager().remove_attr_file(driver, &DriverAttrUnbind); 477 e 478 })?; 479 480 return Ok(()); 481 } 482 } 483 484 /// 参考: https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/base/bus.c?r=&mo=5649&fi=241#684 485 fn rescan_devices_helper(dev: Arc<dyn Device>) -> Result<(), SystemError> { 486 if dev.driver().is_none() { 487 let need_parent_lock = dev.bus().map(|bus| bus.need_parent_lock()).unwrap_or(false); 488 if unlikely(need_parent_lock) { 489 // todo: lock device parent 490 unimplemented!() 491 } 492 device_manager().device_attach(&dev)?; 493 } 494 return Ok(()); 495 } 496 497 /// 498 /// bus_register - register a driver-core subsystem 499 /// 500 /// ## 参数 501 /// - `bus` - bus to register 502 /// 503 /// Once we have that, we register the bus with the kobject 504 /// infrastructure, then register the children subsystems it has: 505 /// the devices and drivers that belong to the subsystem. 506 pub fn bus_register(bus: Arc<dyn Bus>) -> Result<(), SystemError> { 507 return bus_manager().register(bus); 508 } 509 510 /// @brief: 总线注销,并在sys/bus和sys/devices下删除文件夹 511 /// @parameter bus: Bus设备实体 512 /// @return: 成功:() 失败:SystemError 513 #[allow(dead_code)] 514 pub fn bus_unregister(bus: Arc<dyn Bus>) -> Result<(), SystemError> { 515 return bus_manager().unregister(bus); 516 } 517 518 pub fn buses_init() -> Result<(), SystemError> { 519 let bus_kset = KSet::new("bus".to_string()); 520 bus_kset.register(None).expect("bus kset register failed"); 521 unsafe { 522 BUS_KSET_INSTANCE = Some(bus_kset); 523 } 524 525 // 初始化 /sys/devices/system 526 { 527 let devices_system_kset = KSet::new("system".to_string()); 528 let parent = sys_devices_kset() as Arc<dyn KObject>; 529 devices_system_kset.set_parent(Some(Arc::downgrade(&parent))); 530 devices_system_kset 531 .register(Some(sys_devices_kset())) 532 .expect("devices system kset register failed"); 533 } 534 535 // 初始化总线管理器 536 { 537 let bus_manager = BusManager::new(); 538 unsafe { 539 BUS_MANAGER_INSTANCE = Some(bus_manager); 540 } 541 } 542 return Ok(()); 543 } 544 545 /// 把一个设备添加到总线上 546 /// 547 /// ## 描述 548 /// 549 /// - 添加一个设备的与bus相关的属性 550 /// - 在bus和设备文件夹下,创建软链接 551 /// - 把设备添加到它的总线的设备列表中 552 /// 553 /// 参考: https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/base/bus.c?fi=bus_add_device#441 554 /// 555 /// ## 参数 556 /// 557 /// - `dev` - 要被添加的设备 558 pub fn bus_add_device(dev: &Arc<dyn Device>) -> Result<(), SystemError> { 559 return bus_manager().add_device(dev); 560 } 561 562 /// 自动为设备在总线上寻找可用的驱动程序 563 /// 564 /// Automatically probe for a driver if the bus allows it. 565 /// 566 /// ## 参数 567 /// 568 /// - `dev` - 要被添加的设备 569 /// 570 /// 参考: https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/base/bus.c?fi=bus_probe_device#478 571 pub fn bus_probe_device(dev: &Arc<dyn Device>) { 572 bus_manager().probe_device(dev); 573 } 574 575 #[derive(Debug)] 576 struct BusAttrDriversProbe; 577 578 impl Attribute for BusAttrDriversProbe { 579 fn mode(&self) -> ModeType { 580 return ModeType::S_IWUSR; 581 } 582 583 fn name(&self) -> &str { 584 return "drivers_probe"; 585 } 586 587 fn support(&self) -> SysFSOpsSupport { 588 return SysFSOpsSupport::STORE; 589 } 590 591 /// 参考: https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/base/bus.c?r=&mo=5649&fi=241#241 592 fn store(&self, kobj: Arc<dyn KObject>, buf: &[u8]) -> Result<usize, SystemError> { 593 let kset: Arc<KSet> = kobj.arc_any().downcast().map_err(|_| SystemError::EINVAL)?; 594 let bus = bus_manager() 595 .get_bus_by_kset(&kset) 596 .ok_or(SystemError::EINVAL)?; 597 598 let name = CStr::from_bytes_with_nul(buf) 599 .map_err(|_| SystemError::EINVAL)? 600 .to_str() 601 .map_err(|_| SystemError::EINVAL)?; 602 603 let device = bus.find_device_by_name(name).ok_or(SystemError::ENODEV)?; 604 605 if rescan_devices_helper(device).is_ok() { 606 return Ok(buf.len()); 607 } 608 609 return Err(SystemError::EINVAL); 610 } 611 } 612 613 #[derive(Debug)] 614 struct BusAttrDriversAutoprobe; 615 616 impl Attribute for BusAttrDriversAutoprobe { 617 fn mode(&self) -> ModeType { 618 return ModeType::from_bits_truncate(0o644); 619 } 620 621 fn name(&self) -> &str { 622 return "drivers_autoprobe"; 623 } 624 625 fn support(&self) -> SysFSOpsSupport { 626 return SysFSOpsSupport::STORE | SysFSOpsSupport::SHOW; 627 } 628 629 /// 参考: https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/base/bus.c?r=&mo=5649&fi=241#231 630 fn store(&self, kobj: Arc<dyn KObject>, buf: &[u8]) -> Result<usize, SystemError> { 631 if buf.len() == 0 { 632 return Ok(0); 633 } 634 635 let kset: Arc<KSet> = kobj.arc_any().downcast().map_err(|_| SystemError::EINVAL)?; 636 let bus = bus_manager() 637 .get_bus_by_kset(&kset) 638 .ok_or(SystemError::EINVAL)?; 639 640 if buf[0] == '0' as u8 { 641 bus.subsystem().set_drivers_autoprobe(false); 642 } else { 643 bus.subsystem().set_drivers_autoprobe(true); 644 } 645 646 return Ok(buf.len()); 647 } 648 649 /// 参考: https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/base/bus.c?r=&mo=5649&fi=241#226 650 fn show(&self, kobj: Arc<dyn KObject>, buf: &mut [u8]) -> Result<usize, SystemError> { 651 let kset: Arc<KSet> = kobj.arc_any().downcast().map_err(|_| SystemError::EINVAL)?; 652 let bus = bus_manager() 653 .get_bus_by_kset(&kset) 654 .ok_or(SystemError::EINVAL)?; 655 let val = if bus.subsystem().drivers_autoprobe() { 656 1 657 } else { 658 0 659 }; 660 return sysfs_emit_str(buf, format!("{val}\n").as_str()); 661 } 662 } 663 664 #[allow(dead_code)] 665 #[derive(Debug, Clone, Copy)] 666 pub enum BusNotifyEvent { 667 /// 一个设备被添加到总线上 668 AddDevice, 669 /// 一个设备将要被移除 670 DelDevice, 671 /// 一个设备已经被移除 672 RemovedDevice, 673 /// 一个驱动将要被绑定 674 BindDriver, 675 /// 一个驱动已经被绑定 676 BoundDriver, 677 /// 一个驱动将要被解绑 678 UnbindDriver, 679 /// 一个驱动已经被解绑 680 UnboundDriver, 681 /// 驱动绑定失败 682 DriverNotBound, 683 } 684 685 #[derive(Debug)] 686 struct BusDriverKType; 687 688 impl KObjType for BusDriverKType { 689 fn sysfs_ops(&self) -> Option<&dyn SysFSOps> { 690 Some(&BusDriverSysFSOps) 691 } 692 693 fn attribute_groups(&self) -> Option<&'static [&'static dyn AttributeGroup]> { 694 None 695 } 696 } 697 698 #[derive(Debug)] 699 struct BusDriverSysFSOps; 700 701 impl SysFSOps for BusDriverSysFSOps { 702 #[inline] 703 fn show( 704 &self, 705 kobj: Arc<dyn KObject>, 706 attr: &dyn Attribute, 707 buf: &mut [u8], 708 ) -> Result<usize, SystemError> { 709 attr.show(kobj, buf) 710 } 711 712 #[inline] 713 fn store( 714 &self, 715 kobj: Arc<dyn KObject>, 716 attr: &dyn Attribute, 717 buf: &[u8], 718 ) -> Result<usize, SystemError> { 719 attr.store(kobj, buf) 720 } 721 } 722 723 #[derive(Debug)] 724 struct DriverAttrUnbind; 725 726 impl Attribute for DriverAttrUnbind { 727 fn mode(&self) -> ModeType { 728 ModeType::from_bits_truncate(0o200) 729 } 730 731 fn name(&self) -> &str { 732 "unbind" 733 } 734 735 fn store(&self, kobj: Arc<dyn KObject>, buf: &[u8]) -> Result<usize, SystemError> { 736 let driver = kobj.cast::<dyn Driver>().map_err(|kobj| { 737 kerror!( 738 "Intertrait casting not implemented for kobj: {}", 739 kobj.name() 740 ); 741 SystemError::EOPNOTSUPP_OR_ENOTSUP 742 })?; 743 744 let bus = driver.bus().ok_or(SystemError::ENODEV)?; 745 746 let s = CStr::from_bytes_with_nul(buf) 747 .map_err(|_| SystemError::EINVAL)? 748 .to_str() 749 .map_err(|_| SystemError::EINVAL)?; 750 let dev = bus.find_device_by_name(s).ok_or(SystemError::ENODEV)?; 751 let p = dev.driver().ok_or(SystemError::ENODEV)?; 752 if Arc::ptr_eq(&p, &driver) { 753 device_manager().device_driver_detach(&dev); 754 return Ok(buf.len()); 755 } 756 return Err(SystemError::ENODEV); 757 } 758 759 fn support(&self) -> SysFSOpsSupport { 760 SysFSOpsSupport::STORE 761 } 762 } 763 764 #[derive(Debug)] 765 struct DriverAttrBind; 766 767 impl Attribute for DriverAttrBind { 768 fn name(&self) -> &str { 769 "bind" 770 } 771 772 fn mode(&self) -> ModeType { 773 ModeType::from_bits_truncate(0o200) 774 } 775 776 /* 777 * Manually attach a device to a driver. 778 * Note: the driver must want to bind to the device, 779 * it is not possible to override the driver's id table. 780 */ 781 fn store(&self, kobj: Arc<dyn KObject>, buf: &[u8]) -> Result<usize, SystemError> { 782 let driver = kobj.cast::<dyn Driver>().map_err(|kobj| { 783 kerror!( 784 "Intertrait casting not implemented for kobj: {}", 785 kobj.name() 786 ); 787 SystemError::EOPNOTSUPP_OR_ENOTSUP 788 })?; 789 790 let bus = driver.bus().ok_or(SystemError::ENODEV)?; 791 let device = bus 792 .find_device_by_name( 793 CStr::from_bytes_with_nul(buf) 794 .map_err(|_| SystemError::EINVAL)? 795 .to_str() 796 .map_err(|_| SystemError::EINVAL)?, 797 ) 798 .ok_or(SystemError::ENODEV)?; 799 800 if driver_manager().match_device(&driver, &device)? { 801 device_manager().device_driver_attach(&driver, &device)?; 802 return Ok(buf.len()); 803 } 804 return Err(SystemError::ENODEV); 805 } 806 fn support(&self) -> SysFSOpsSupport { 807 SysFSOpsSupport::STORE 808 } 809 } 810