Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
printk(KERN_INFO "bus - %d, dev - %d, fn - %d ", bus, dev, fn);
pd->bus = bus;
pd->dev = dev;
pd->fn = fn;
return 0;
}
}
}
}
return 0x80;
}
Все функции, которые мы рассмотрели, будут вызваны во время процедуры инициализации модуля:
static int __init pcidev_on(void)
{
struct pci_dev_struct pdev; // структура с параметрами PCI-устройства
int idx = 0; // смещение к данным в конфигурационном пространстве устройства PCI
u8 bus = 0, dev = 0, fn = 0; // координаты устройства
u16 command_reg = 0; // командный регистр
u32 config_dword = 0;
Напомню, что наша задача – прочитать MAC-адрес сетевого адаптера RTL8139C, и для этого нам необходимо получить его базовый адрес в пространстве I/O. Ищем служебный заголовок BIOS32, вычисляем адрес точки входа в BIOS32 и производим проверку присутствия PCI BIOS:
pci_find_bios();
check_pcibios();
Выполняем поиск устройства (сетевого адаптера RTL8139C) по коду типа устройства. В результате мы получим его координаты – номер шины, номер устройства на шине и номер функции:
if(pci_bios_find_device(VENDOR_ID, DEVICE_ID, idx, &bus, &dev, &fn) == PCIBIOS_SUCCESSFUL)
printk(KERN_INFO "Device found by type, bus - %d, dev - %d, fn - %d ", bus, dev, fn);
Повторим процедуру, но в этот раз будем искать устройство по коду класса:
memset((void *)&pdev, 0, sizeof(struct pci_dev_struct));
if(pci_bios_find_class(CLASS_CODE, idx, &pdev) == PCIBIOS_SUCCESSFUL)
printk(KERN_INFO "Device found by class, bus - %d, dev - %d, fn - %d ",
pdev.bus, pdev.dev, pdev.fn);
else {
printk(KERN_INFO "Device not founf by class ");