簡介: What is Fake PCI Hotplug Controoler
Fake PCI Hotplug Controller是一個虛擬的PCI熱插拔控制器。
它可以透過以軟體的方式來模擬PCI 裝置的插拔行為
該控制器在啟動時就會預先掃描整個PCI BUS上的所有裝置,
並為每一個裝置在sysfs中建立一個對應的資料夾,與一個一Power屬性檔
使用者只要對Power屬性寫入0,驅動程式就會呼叫pci_remove_device
API將裝置自PCI BUS上移除。
反之,只要使用者寫入1,則驅動程式就會呼叫pci_rescan_bus來重新掃描
該裝置所屬的slot,以檢查是否有新的裝置加入
必須要注意的是,使用Fake PCI hotplug只是使用軟體的方式來移除裝置,
就使用者的角度看來,裝置的確已不存在,但實際上PCI腳位仍處於通電的狀態。
static int __init init_legacy(void) { struct pci_dev *pdev = NULL; /* Add existing devices */ while ((pdev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pdev))) legacy_add_slot(pdev); /* Be alerted of any new ones */ bus_register_notifier(&pci_bus_type, &legacy_notifier); return 0; } static void remove_callback(void *data) { pci_remove_bus_device((struct pci_dev *)data); } static ssize_t legacy_store(struct kobject *kobj, struct attribute *attr, const char *buf, size_t len) { struct legacy_slot *slot = container_of(kobj, typeof(*slot), kobj); unsigned long val; if (strict_strtoul(buf, 0, &val) < 0) return -EINVAL; if (val) pci_rescan_bus(slot->dev->bus); else sysfs_schedule_callback(&slot->dev->dev.kobj, remove_callback, slot->dev, THIS_MODULE); return len; } |
啟用Fake PCI Hotplug Contorller:
1) make menuconfig
2) Bus options (PCI, PCMCIA, EISA, ISA, TC) --->
[*] Support for PCI controller
[*] Support for PCI Hotplug --->
[*] Fake PCI Hotplug driver
留言列表