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