2.2 驱动注册
mpt2sas作为一个PCIe设备注册,注册的函数为pci_register_driver。调用的error = pci_register_driver(&scsih_driver);pci_register_driver 在linux define为__pci_register_driver。
static struct pci_driver scsih_driver = {
.name = MPT2SAS_DRIVER_NAME,
.id_table = scsih_pci_table,
.probe = _scsih_probe,
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0))
.remove = _scsih_remove,
#else
.remove = __devexit_p(_scsih_remove),
#endif
.shutdown = _scsih_shutdown,
.err_handler = &_scsih_err_handler,
#ifdef CONFIG_PM
.suspend = _scsih_suspend,
.resume = _scsih_resume,
#endif
};
成员包含.name,.id_table,.probe,.shutdown,.suspend,.resume。
i d_table成员变量,记录了当前这个驱动所能够进行驱动的那些设备 的ID值 ,使热插拔和模块装载系统知道什么模块对应什么硬件设备,再mpt2sas中,.id_tables由mptsas_pci_tables 这个同类型(struct pci_device_id)的结构体指针赋值。每个成员是一个一维数组,包含4部分内容{LSI VID, LSI 某个HBA的DID,subVID, subDID}.其中subVID和subDID在这里都设置为了PCI_ANY_ID,表示支持各种子类型。
2.2.1 .probe = _scsih_probe,
PCI设备注册,int (*probe)() 指向PCI驱动程序的探测指针,当PCIe它认为驱动程序需要控制的struct pci_dev时候,就会调用该函数。在mpt2sas中,这个函数为_scsih_probe。_scsih_probe 会去找mpt2sas这个设备。首先会scsi_host_alloc初始化shost,如果初始化shost失败,就会上报找不到设备。然后通过shost_private返回ioc作为mpt2sas_adapter的指针的值,再用mmset初始化ioc指向的mpt2sas_adpter.
ioc = shost_private(shost);
memset(ioc, 0, sizeof(struct MPT2SAS_ADAPTER));
然后继续初始化ioc intenal command的callback index。 然后对ioc中的各种lock进行spin_lock_init()初始化。对ioc中的各种链表list进行初始化/INIT_LIST_HEAD().
初始化shost
shost->max_cmd_len = 32;
shost->max_lun = max_lun;
shost->transportt = mpt2sas_transport_template;
shost->unique_id = ioc->id;
调用scsi_add_host(),将mpt2sas作为host增加设 备。
调用mpt2sas_base_attach初始化控制器
调用_scsih_probe_devices 查找drive和raid
调用mpt2sas_base_start_watchdog初始化看门狗,在遇到错误的时候可以做控制器的复位
2.2.2.remove = _scsih_remove,
调用 mpt2sas_scsih_detach_pci将设备remove
2.2.3 .shutdown = _scsih_shutdown,
设备正常掉电或者OS shut down的时候会调用_scsih_shutdown.
对IOC传递指针,明确后续操作的对象
调用_scsih_fw_event_cleanup_queue释放fw_event
调用_scsih_ir_shutdown通知控制器 system shut down
调用_scsih_ssu_to_sata_devices查询挂在控制器下的sas设备,并停止scsi io
调用mpt2sas_base_detach remove控制器
2.2.4 .err_handler = &_scsih_err_handler,
static struct pci_error_handlers _scsih_err_handler = {
.error_detected = _scsih_pci_error_detected,
.mmio_enabled = _scsih_pci_mmio_enabled,
.slot_reset = _scsih_pci_slot_reset,
.resume = _scsih_pci_resume,
};
注册设备的错误处理机制
调用_scsih_pci_error_detected发现控制器错误
调用_scsih_pci_mmio_enabled Enable MMIO and dump debug registers
调用_scsih_pci_slot_reset,调用pci_restore_state恢复PCIe配置,调用mpt2sas_base_map_resources映射IO资源设置中断,调用mpt2sas_base_hard_reset_handler进行控制器复位
调用_scsih_pci_resume,在控制器reset之后,清除错误,恢复操作。
2.2.5 .suspend = _scsih_suspend,
调用mpt2sas_base_stop_watchdog :stop the fault_reset_work_q
调用_scsih_ir_shutdown 通知IR firmware system shut down
调用_scsih_ssu_to_sata_devices,对控制器下的SATA设备下发stop 命令
调用mpt2sas_base_free_resources,释放IO资源
2.2.6 .resume = _scsih_resume,
调用mpt2sas_base_map_resources映射IO资源,设置中断
mpt2sas-19.00.00.00_rhel6.5驱动笔记系列2-设备注册
最新推荐文章于 2024-04-10 13:59:23 发布