📄 kern_compat.h
字号:
#endif
#endif
if (debug > 2)
printk(KERN_INFO "Found %s at PCI address %#lx, IRQ %d.\n",
pci_tbl[chip_idx].name, pciaddr, irq);
if ((pciaddr & PCI_BASE_ADDRESS_SPACE_IO)) {
ioaddr = pciaddr & PCI_BASE_ADDRESS_IO_MASK;
if (check_region(ioaddr, pci_tbl[chip_idx].io_size))
continue;
} else if ((ioaddr = (long)ioremap(pciaddr & PCI_BASE_ADDRESS_MEM_MASK,
pci_tbl[chip_idx].io_size)) == 0) {
printk(KERN_INFO "Failed to map PCI address %#lx for device "
"'%s'.\n", pciaddr, pci_tbl[chip_idx].name);
continue;
}
if ( ! (pci_flags & PCI_NO_ACPI_WAKE))
acpi_wake(pdev);
pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
new_command = pci_command | (pci_flags & 7);
if (pci_command != new_command) {
printk(KERN_INFO " The PCI BIOS has not enabled the"
" device at %d/%d! Updating PCI command %4.4x->%4.4x.\n",
pdev->bus->number, pdev->devfn, pci_command, new_command);
pci_write_config_word(pdev, PCI_COMMAND, new_command);
}
newdev = drv_id->probe1(pdev, initial_device,
ioaddr, irq, chip_idx, cards_found);
if (newdev && (pci_flags & PCI_COMMAND_MASTER))
pci_set_master(pdev);
if (newdev && (pci_flags & PCI_COMMAND_MASTER) &&
! (pci_flags & PCI_NO_MIN_LATENCY)) {
u8 pci_latency;
pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &pci_latency);
if (pci_latency < min_pci_latency) {
printk(KERN_INFO " PCI latency timer (CFLT) is "
"unreasonably low at %d. Setting to %d clocks.\n",
pci_latency, min_pci_latency);
pci_write_config_byte(pdev, PCI_LATENCY_TIMER, min_pci_latency);
}
}
initial_device = 0;
cards_found++;
}
if ((drv_id->flags & PCI_HOTSWAP)
&& (register_cb_hook =
(void *)get_module_symbol(NULL, "do_cb_register")) != 0
&& (*register_cb_hook)(drv_id) == 0) {
MOD_INC_USE_COUNT;
return 0;
} else
return cards_found ? 0 : -ENODEV;
}
#else
static inline int pci_drv_register(struct drv_id_info *drv_id, void *initial_device)
{
int pci_index, cards_found = 0;
unsigned char pci_bus, pci_device_fn;
struct pci_dev *pdev;
struct pci_id_info *pci_tbl = drv_id->pci_dev_tbl;
void *newdev;
if ( ! pcibios_present())
return -ENODEV;
for (pci_index = 0; pci_index < 0xff; pci_index++) {
u32 pci_id, subsys_id, pci_class_rev;
u16 pci_command, new_command;
int chip_idx, irq, pci_flags;
long pciaddr;
long ioaddr;
u32 pci_busaddr;
u8 pci_irq_line;
if (pcibios_find_class (drv_id->pci_class, pci_index,
&pci_bus, &pci_device_fn)
!= PCIBIOS_SUCCESSFUL)
break;
pcibios_read_config_dword(pci_bus, pci_device_fn,
PCI_VENDOR_ID, &pci_id);
pcibios_read_config_dword(pci_bus, pci_device_fn,
PCI_SUBSYSTEM_ID, &subsys_id);
pcibios_read_config_dword(pci_bus, pci_device_fn,
PCI_REVISION_ID, &pci_class_rev);
for (chip_idx = 0; pci_tbl[chip_idx].name; chip_idx++) {
struct pci_id_info *chip = &pci_tbl[chip_idx];
if ((pci_id & chip->id.pci_mask) == chip->id.pci
&& (subsys_id & chip->id.subsystem_mask) == chip->id.subsystem
&& (pci_class_rev&chip->id.revision_mask) == chip->id.revision)
break;
}
if (pci_tbl[chip_idx].name == 0) /* Compiled out! */
continue;
pci_flags = pci_tbl[chip_idx].pci_flags;
pdev = pci_find_slot(pci_bus, pci_device_fn);
pcibios_read_config_byte(pci_bus, pci_device_fn,
PCI_INTERRUPT_LINE, &pci_irq_line);
irq = pci_irq_line;
pcibios_read_config_dword(pci_bus, pci_device_fn,
((pci_flags >> 2) & 0x1C) + 0x10,
&pci_busaddr);
pciaddr = pci_busaddr;
#if defined(__alpha__)
if (pci_flags & PCI_ADDR_64BITS) {
pcibios_read_config_dword(pci_bus, pci_device_fn,
((pci_flags >> 2) & 0x1C) + 0x14,
&pci_busaddr);
pciaddr |= ((long)pci_busaddr)<<32;
}
#endif
if (debug > 2)
printk(KERN_INFO "Found %s at PCI address %#lx, IRQ %d.\n",
pci_tbl[chip_idx].name, pciaddr, irq);
if ((pciaddr & PCI_BASE_ADDRESS_SPACE_IO)) {
ioaddr = pciaddr & PCI_BASE_ADDRESS_IO_MASK;
if (check_region(ioaddr, pci_tbl[chip_idx].io_size))
continue;
} else if ((ioaddr = (long)ioremap(pciaddr & PCI_BASE_ADDRESS_MEM_MASK,
pci_tbl[chip_idx].io_size)) == 0) {
printk(KERN_INFO "Failed to map PCI address %#lx.\n",
pciaddr);
continue;
}
if ( ! (pci_flags & PCI_NO_ACPI_WAKE))
acpi_wake(pdev);
pcibios_read_config_word(pci_bus, pci_device_fn,
PCI_COMMAND, &pci_command);
new_command = pci_command | (pci_flags & 7);
if (pci_command != new_command) {
printk(KERN_INFO " The PCI BIOS has not enabled the"
" device at %d/%d! Updating PCI command %4.4x->%4.4x.\n",
pci_bus, pci_device_fn, pci_command, new_command);
pcibios_write_config_word(pci_bus, pci_device_fn,
PCI_COMMAND, new_command);
}
newdev = drv_id->probe1(pdev, initial_device,
ioaddr, irq, chip_idx, cards_found);
if (newdev && (pci_flags & PCI_COMMAND_MASTER) &&
! (pci_flags & PCI_NO_MIN_LATENCY)) {
u8 pci_latency;
pcibios_read_config_byte(pci_bus, pci_device_fn,
PCI_LATENCY_TIMER, &pci_latency);
if (pci_latency < min_pci_latency) {
printk(KERN_INFO " PCI latency timer (CFLT) is "
"unreasonably low at %d. Setting to %d clocks.\n",
pci_latency, min_pci_latency);
pcibios_write_config_byte(pci_bus, pci_device_fn,
PCI_LATENCY_TIMER, min_pci_latency);
}
}
initial_device = 0;
cards_found++;
}
if ((drv_id->flags & PCI_HOTSWAP)
&& register_cb_hook
&& (*register_cb_hook)(drv_id) == 0) {
MOD_INC_USE_COUNT;
return 0;
} else
return cards_found ? 0 : -ENODEV;
}
#endif
static inline void pci_drv_unregister(struct drv_id_info *drv_id)
{
/* We need do something only with CardBus support. */
if ((unregister_cb_hook =
(void *)get_module_symbol(NULL, "do_cb_unregister")) != 0) {
(*unregister_cb_hook)(drv_id);
MOD_DEC_USE_COUNT;
}
return;
}
/*
Search PCI configuration space for the specified capability registers.
Return the index, or 0 on failure.
*/
static inline int pci_find_capability(struct pci_dev *pdev, int findtype)
{
u16 pci_status, cap_type;
u8 pci_cap_idx;
int cap_idx;
pci_read_config_word(pdev, PCI_STATUS, &pci_status);
if ( ! (pci_status & PCI_STATUS_CAP_LIST))
return 0;
pci_read_config_byte(pdev, PCI_CAPABILITY_LIST, &pci_cap_idx);
cap_idx = pci_cap_idx;
for (cap_idx = pci_cap_idx; cap_idx; cap_idx = (cap_type >> 8) & 0xff) {
pci_read_config_word(pdev, cap_idx, &cap_type);
if ((cap_type & 0xff) == findtype)
return cap_idx;
}
return 0;
}
/* Change a device from D3 (sleep) to D0 (active).
Return the old power state.
This is more complicated than you might first expect since most cards
forget all PCI config info during the transition! */
static inline int acpi_wake(struct pci_dev *pdev)
{
u32 base[5], romaddr;
u16 pci_command, pwr_command;
u8 pci_latency, pci_cacheline, irq;
int i, pwr_cmd_idx = pci_find_capability(pdev, PCI_CAP_ID_PM);
if (pwr_cmd_idx == 0)
return 0;
pci_read_config_word(pdev, pwr_cmd_idx + 4, &pwr_command);
if ((pwr_command & 3) == 0)
return 0;
pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
for (i = 0; i < 5; i++)
pci_read_config_dword(pdev, PCI_BASE_ADDRESS_0 + i*4,
&base[i]);
pci_read_config_dword(pdev, PCI_ROM_ADDRESS, &romaddr);
pci_read_config_byte( pdev, PCI_LATENCY_TIMER, &pci_latency);
pci_read_config_byte( pdev, PCI_CACHE_LINE_SIZE, &pci_cacheline);
pci_read_config_byte( pdev, PCI_INTERRUPT_LINE, &irq);
pci_write_config_word(pdev, pwr_cmd_idx + 4, 0x0000);
for (i = 0; i < 5; i++)
if (base[i])
pci_write_config_dword(pdev, PCI_BASE_ADDRESS_0 + i*4,
base[i]);
pci_write_config_dword(pdev, PCI_ROM_ADDRESS, romaddr);
pci_write_config_byte( pdev, PCI_INTERRUPT_LINE, irq);
pci_write_config_byte( pdev, PCI_CACHE_LINE_SIZE, pci_cacheline);
pci_write_config_byte( pdev, PCI_LATENCY_TIMER, pci_latency);
pci_write_config_word( pdev, PCI_COMMAND, pci_command | 5);
return pwr_command & 3;
}
static inline int acpi_set_pwr_state(struct pci_dev *pdev, enum acpi_pwr_state new_state)
{
u16 pwr_command;
int pwr_cmd_idx = pci_find_capability(pdev, PCI_CAP_ID_PM);
if (pwr_cmd_idx == 0)
return 0;
pci_read_config_word(pdev, pwr_cmd_idx + 4, &pwr_command);
if ((pwr_command & 3) == ACPI_D3 && new_state != ACPI_D3)
acpi_wake(pdev); /* The complicated sequence. */
pci_write_config_word(pdev, pwr_cmd_idx + 4,
(pwr_command & ~3) | new_state);
return pwr_command & 3;
}
#endif
/*
* Local variables:
* c-indent-level: 4
* c-basic-offset: 4
* tab-width: 4
* End:
*/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -