Loading drivers/ide/pci/amd74xx.c +3 −0 Original line number Original line Diff line number Diff line Loading @@ -72,6 +72,7 @@ static struct amd_ide_chip { { PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2, 0x50, AMD_UDMA_133 }, { PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2, 0x50, AMD_UDMA_133 }, { PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE, 0x50, AMD_UDMA_133 }, { PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE, 0x50, AMD_UDMA_133 }, { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE, 0x50, AMD_UDMA_133 }, { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE, 0x50, AMD_UDMA_133 }, { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE, 0x50, AMD_UDMA_133 }, { 0 } { 0 } }; }; Loading Loading @@ -487,6 +488,7 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = { /* 12 */ DECLARE_NV_DEV("NFORCE3-250-SATA2"), /* 12 */ DECLARE_NV_DEV("NFORCE3-250-SATA2"), /* 13 */ DECLARE_NV_DEV("NFORCE-CK804"), /* 13 */ DECLARE_NV_DEV("NFORCE-CK804"), /* 14 */ DECLARE_NV_DEV("NFORCE-MCP04"), /* 14 */ DECLARE_NV_DEV("NFORCE-MCP04"), /* 15 */ DECLARE_NV_DEV("NFORCE-MCP51"), }; }; static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id) static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id) Loading Loading @@ -521,6 +523,7 @@ static struct pci_device_id amd74xx_pci_tbl[] = { #endif #endif { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 13 }, { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 13 }, { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14 }, { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14 }, { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 15 }, { 0, }, { 0, }, }; }; MODULE_DEVICE_TABLE(pci, amd74xx_pci_tbl); MODULE_DEVICE_TABLE(pci, amd74xx_pci_tbl); Loading drivers/pci/hotplug/cpci_hotplug_core.c +138 −164 Original line number Original line Diff line number Diff line /* /* * CompactPCI Hot Plug Driver * CompactPCI Hot Plug Driver * * * Copyright (C) 2002 SOMA Networks, Inc. * Copyright (C) 2002,2005 SOMA Networks, Inc. * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) * Copyright (C) 2001 IBM Corp. * Copyright (C) 2001 IBM Corp. * * Loading Loading @@ -111,10 +111,8 @@ enable_slot(struct hotplug_slot *hotplug_slot) dbg("%s - physical_slot = %s", __FUNCTION__, hotplug_slot->name); dbg("%s - physical_slot = %s", __FUNCTION__, hotplug_slot->name); if(controller->ops->set_power) { if (controller->ops->set_power) retval = controller->ops->set_power(slot, 1); retval = controller->ops->set_power(slot, 1); } return retval; return retval; } } Loading @@ -126,13 +124,15 @@ disable_slot(struct hotplug_slot *hotplug_slot) dbg("%s - physical_slot = %s", __FUNCTION__, hotplug_slot->name); dbg("%s - physical_slot = %s", __FUNCTION__, hotplug_slot->name); down_write(&list_rwsem); /* Unconfigure device */ /* Unconfigure device */ dbg("%s - unconfiguring slot %s", dbg("%s - unconfiguring slot %s", __FUNCTION__, slot->hotplug_slot->name); __FUNCTION__, slot->hotplug_slot->name); if ((retval = cpci_unconfigure_slot(slot))) { if ((retval = cpci_unconfigure_slot(slot))) { err("%s - could not unconfigure slot %s", err("%s - could not unconfigure slot %s", __FUNCTION__, slot->hotplug_slot->name); __FUNCTION__, slot->hotplug_slot->name); return retval; goto disable_error; } } dbg("%s - finished unconfiguring slot %s", dbg("%s - finished unconfiguring slot %s", __FUNCTION__, slot->hotplug_slot->name); __FUNCTION__, slot->hotplug_slot->name); Loading @@ -142,21 +142,23 @@ disable_slot(struct hotplug_slot *hotplug_slot) err("%s - could not clear EXT for slot %s", err("%s - could not clear EXT for slot %s", __FUNCTION__, slot->hotplug_slot->name); __FUNCTION__, slot->hotplug_slot->name); retval = -ENODEV; retval = -ENODEV; goto disable_error; } } cpci_led_on(slot); cpci_led_on(slot); if(controller->ops->set_power) { if (controller->ops->set_power) retval = controller->ops->set_power(slot, 0); if ((retval = controller->ops->set_power(slot, 0))) } goto disable_error; if(update_adapter_status(slot->hotplug_slot, 0)) { if (update_adapter_status(slot->hotplug_slot, 0)) warn("failure to update adapter file"); warn("failure to update adapter file"); } if (slot->extracting) { if (slot->extracting) { slot->extracting = 0; slot->extracting = 0; atomic_dec(&extracting); atomic_dec(&extracting); } } disable_error: up_write(&list_rwsem); return retval; return retval; } } Loading @@ -165,9 +167,8 @@ cpci_get_power_status(struct slot *slot) { { u8 power = 1; u8 power = 1; if(controller->ops->get_power) { if (controller->ops->get_power) power = controller->ops->get_power(slot); power = controller->ops->get_power(slot); } return power; return power; } } Loading Loading @@ -237,9 +238,8 @@ cpci_hp_register_bus(struct pci_bus *bus, u8 first, u8 last) int status = -ENOMEM; int status = -ENOMEM; int i; int i; if(!(controller && bus)) { if (!(controller && bus)) return -ENODEV; return -ENODEV; } /* /* * Create a structure for each slot, and register that slot * Create a structure for each slot, and register that slot Loading Loading @@ -316,32 +316,30 @@ int cpci_hp_unregister_bus(struct pci_bus *bus) cpci_hp_unregister_bus(struct pci_bus *bus) { { struct slot *slot; struct slot *slot; struct list_head *tmp; struct slot *tmp; struct list_head *next; int status = 0; int status; down_write(&list_rwsem); down_write(&list_rwsem); if (!slots) { if (!slots) { up_write(&list_rwsem); up_write(&list_rwsem); return -1; return -1; } } list_for_each_safe(tmp, next, &slot_list) { list_for_each_entry_safe(slot, tmp, &slot_list, slot_list) { slot = list_entry(tmp, struct slot, slot_list); if (slot->bus == bus) { if (slot->bus == bus) { list_del(&slot->slot_list); slots--; dbg("deregistering slot %s", slot->hotplug_slot->name); dbg("deregistering slot %s", slot->hotplug_slot->name); status = pci_hp_deregister(slot->hotplug_slot); status = pci_hp_deregister(slot->hotplug_slot); if (status) { if (status) { err("pci_hp_deregister failed with error %d", err("pci_hp_deregister failed with error %d", status); status); return status; break; } } list_del(&slot->slot_list); slots--; } } } } up_write(&list_rwsem); up_write(&list_rwsem); return 0; return status; } } /* This is the interrupt mode interrupt handler */ /* This is the interrupt mode interrupt handler */ Loading Loading @@ -373,10 +371,9 @@ cpci_hp_intr(int irq, void *data, struct pt_regs *regs) * INS bits of the cold-inserted devices. * INS bits of the cold-inserted devices. */ */ static int static int init_slots(void) init_slots(int clear_ins) { { struct slot *slot; struct slot *slot; struct list_head *tmp; struct pci_dev* dev; struct pci_dev* dev; dbg("%s - enter", __FUNCTION__); dbg("%s - enter", __FUNCTION__); Loading @@ -385,26 +382,19 @@ init_slots(void) up_read(&list_rwsem); up_read(&list_rwsem); return -1; return -1; } } list_for_each(tmp, &slot_list) { list_for_each_entry(slot, &slot_list, slot_list) { slot = list_entry(tmp, struct slot, slot_list); dbg("%s - looking at slot %s", dbg("%s - looking at slot %s", __FUNCTION__, slot->hotplug_slot->name); __FUNCTION__, slot->hotplug_slot->name); if(cpci_check_and_clear_ins(slot)) { if (clear_ins && cpci_check_and_clear_ins(slot)) dbg("%s - cleared INS for slot %s", dbg("%s - cleared INS for slot %s", __FUNCTION__, slot->hotplug_slot->name); __FUNCTION__, slot->hotplug_slot->name); dev = pci_find_slot(slot->bus->number, PCI_DEVFN(slot->number, 0)); dev = pci_get_slot(slot->bus, PCI_DEVFN(slot->number, 0)); if (dev) { if (dev) { if(update_adapter_status(slot->hotplug_slot, 1)) { if (update_adapter_status(slot->hotplug_slot, 1)) warn("failure to update adapter file"); warn("failure to update adapter file"); } if (update_latch_status(slot->hotplug_slot, 1)) if(update_latch_status(slot->hotplug_slot, 1)) { warn("failure to update latch file"); warn("failure to update latch file"); } slot->dev = dev; slot->dev = dev; } else { err("%s - no driver attached to device in slot %s", __FUNCTION__, slot->hotplug_slot->name); } } } } } up_read(&list_rwsem); up_read(&list_rwsem); Loading @@ -416,7 +406,6 @@ static int check_slots(void) check_slots(void) { { struct slot *slot; struct slot *slot; struct list_head *tmp; int extracted; int extracted; int inserted; int inserted; u16 hs_csr; u16 hs_csr; Loading @@ -428,14 +417,17 @@ check_slots(void) return -1; return -1; } } extracted = inserted = 0; extracted = inserted = 0; list_for_each(tmp, &slot_list) { list_for_each_entry(slot, &slot_list, slot_list) { slot = list_entry(tmp, struct slot, slot_list); dbg("%s - looking at slot %s", dbg("%s - looking at slot %s", __FUNCTION__, slot->hotplug_slot->name); __FUNCTION__, slot->hotplug_slot->name); if (cpci_check_and_clear_ins(slot)) { if (cpci_check_and_clear_ins(slot)) { /* Some broken hardware (e.g. PLX 9054AB) asserts ENUM# twice... */ /* * Some broken hardware (e.g. PLX 9054AB) asserts * ENUM# twice... */ if (slot->dev) { if (slot->dev) { warn("slot %s already inserted", slot->hotplug_slot->name); warn("slot %s already inserted", slot->hotplug_slot->name); inserted++; inserted++; continue; continue; } } Loading Loading @@ -465,13 +457,11 @@ check_slots(void) dbg("%s - slot %s HS_CSR (2) = %04x", dbg("%s - slot %s HS_CSR (2) = %04x", __FUNCTION__, slot->hotplug_slot->name, hs_csr); __FUNCTION__, slot->hotplug_slot->name, hs_csr); if(update_latch_status(slot->hotplug_slot, 1)) { if (update_latch_status(slot->hotplug_slot, 1)) warn("failure to update latch file"); warn("failure to update latch file"); } if(update_adapter_status(slot->hotplug_slot, 1)) { if (update_adapter_status(slot->hotplug_slot, 1)) warn("failure to update adapter file"); warn("failure to update adapter file"); } cpci_led_off(slot); cpci_led_off(slot); Loading @@ -494,10 +484,9 @@ check_slots(void) if (!slot->extracting) { if (!slot->extracting) { if (update_latch_status(slot->hotplug_slot, 0)) { if (update_latch_status(slot->hotplug_slot, 0)) { warn("failure to update latch file"); warn("failure to update latch file"); } } atomic_inc(&extracting); slot->extracting = 1; slot->extracting = 1; atomic_inc(&extracting); } } extracted++; extracted++; } else if (slot->extracting) { } else if (slot->extracting) { Loading @@ -509,9 +498,8 @@ check_slots(void) */ */ err("card in slot %s was improperly removed", err("card in slot %s was improperly removed", slot->hotplug_slot->name); slot->hotplug_slot->name); if(update_adapter_status(slot->hotplug_slot, 0)) { if (update_adapter_status(slot->hotplug_slot, 0)) warn("failure to update adapter file"); warn("failure to update adapter file"); } slot->extracting = 0; slot->extracting = 0; atomic_dec(&extracting); atomic_dec(&extracting); } } Loading @@ -520,9 +508,8 @@ check_slots(void) up_read(&list_rwsem); up_read(&list_rwsem); dbg("inserted=%d, extracted=%d, extracting=%d", dbg("inserted=%d, extracted=%d, extracting=%d", inserted, extracted, atomic_read(&extracting)); inserted, extracted, atomic_read(&extracting)); if(inserted || extracted) { if (inserted || extracted) return extracted; return extracted; } else if (!atomic_read(&extracting)) { else if (!atomic_read(&extracting)) { err("cannot find ENUM# source, shutting down"); err("cannot find ENUM# source, shutting down"); return -1; return -1; Loading Loading @@ -558,7 +545,9 @@ event_thread(void *data) thread_finished = 1; thread_finished = 1; break; break; } } } while(atomic_read(&extracting) != 0); } while (atomic_read(&extracting) && !thread_finished); if (thread_finished) break; /* Re-enable ENUM# interrupt */ /* Re-enable ENUM# interrupt */ dbg("%s - re-enabling irq", __FUNCTION__); dbg("%s - re-enabling irq", __FUNCTION__); Loading Loading @@ -593,7 +582,7 @@ poll_thread(void *data) thread_finished = 1; thread_finished = 1; break; break; } } } while(atomic_read(&extracting) != 0); } while (atomic_read(&extracting) && !thread_finished); } } msleep(100); msleep(100); } } Loading @@ -612,11 +601,10 @@ cpci_start_thread(void) init_MUTEX_LOCKED(&thread_exit); init_MUTEX_LOCKED(&thread_exit); thread_finished = 0; thread_finished = 0; if(controller->irq) { if (controller->irq) pid = kernel_thread(event_thread, NULL, 0); pid = kernel_thread(event_thread, NULL, 0); } else { else pid = kernel_thread(poll_thread, NULL, 0); pid = kernel_thread(poll_thread, NULL, 0); } if (pid < 0) { if (pid < 0) { err("Can't start up our thread"); err("Can't start up our thread"); return -1; return -1; Loading @@ -630,9 +618,8 @@ cpci_stop_thread(void) { { thread_finished = 1; thread_finished = 1; dbg("thread finish command given"); dbg("thread finish command given"); if(controller->irq) { if (controller->irq) up(&event_semaphore); up(&event_semaphore); } dbg("wait for thread to exit"); dbg("wait for thread to exit"); down(&thread_exit); down(&thread_exit); } } Loading @@ -642,45 +629,67 @@ cpci_hp_register_controller(struct cpci_hp_controller *new_controller) { { int status = 0; int status = 0; if(!controller) { if (controller) controller = new_controller; return -1; if(controller->irq) { if (!(new_controller && new_controller->ops)) if(request_irq(controller->irq, return -EINVAL; if (new_controller->irq) { if (!(new_controller->ops->enable_irq && new_controller->ops->disable_irq)) status = -EINVAL; if (request_irq(new_controller->irq, cpci_hp_intr, cpci_hp_intr, controller->irq_flags, new_controller->irq_flags, MY_NAME, controller->dev_id)) { MY_NAME, err("Can't get irq %d for the hotplug cPCI controller", controller->irq); new_controller->dev_id)) { err("Can't get irq %d for the hotplug cPCI controller", new_controller->irq); status = -ENODEV; status = -ENODEV; } } dbg("%s - acquired controller irq %d", __FUNCTION__, dbg("%s - acquired controller irq %d", controller->irq); __FUNCTION__, new_controller->irq); } } else { err("cPCI hotplug controller already registered"); status = -1; } } if (!status) controller = new_controller; return status; return status; } } static void cleanup_slots(void) { struct slot *slot; struct slot *tmp; /* * Unregister all of our slots with the pci_hotplug subsystem, * and free up all memory that we had allocated. */ down_write(&list_rwsem); if (!slots) goto cleanup_null; list_for_each_entry_safe(slot, tmp, &slot_list, slot_list) { list_del(&slot->slot_list); pci_hp_deregister(slot->hotplug_slot); } cleanup_null: up_write(&list_rwsem); return; } int int cpci_hp_unregister_controller(struct cpci_hp_controller *old_controller) cpci_hp_unregister_controller(struct cpci_hp_controller *old_controller) { { int status = 0; int status = 0; if (controller) { if (controller) { if(atomic_read(&extracting) != 0) { if (!thread_finished) return -EBUSY; } if(!thread_finished) { cpci_stop_thread(); cpci_stop_thread(); } if (controller->irq) if(controller->irq) { free_irq(controller->irq, controller->dev_id); free_irq(controller->irq, controller->dev_id); } controller = NULL; controller = NULL; } else { cleanup_slots(); } else status = -ENODEV; status = -ENODEV; } return status; return status; } } Loading @@ -691,9 +700,8 @@ cpci_hp_start(void) int status; int status; dbg("%s - enter", __FUNCTION__); dbg("%s - enter", __FUNCTION__); if(!controller) { if (!controller) return -ENODEV; return -ENODEV; } down_read(&list_rwsem); down_read(&list_rwsem); if (list_empty(&slot_list)) { if (list_empty(&slot_list)) { Loading @@ -702,18 +710,15 @@ cpci_hp_start(void) } } up_read(&list_rwsem); up_read(&list_rwsem); if(first) { status = init_slots(first); status = init_slots(); if (first) if(status) { return status; } first = 0; first = 0; } if (status) return status; status = cpci_start_thread(); status = cpci_start_thread(); if(status) { if (status) return status; return status; } dbg("%s - thread started", __FUNCTION__); dbg("%s - thread started", __FUNCTION__); if (controller->irq) { if (controller->irq) { Loading @@ -728,12 +733,8 @@ cpci_hp_start(void) int int cpci_hp_stop(void) cpci_hp_stop(void) { { if(!controller) { if (!controller) return -ENODEV; return -ENODEV; } if(atomic_read(&extracting) != 0) { return -EBUSY; } if (controller->irq) { if (controller->irq) { /* Stop enum interrupt processing */ /* Stop enum interrupt processing */ dbg("%s - disabling irq", __FUNCTION__); dbg("%s - disabling irq", __FUNCTION__); Loading @@ -743,34 +744,6 @@ cpci_hp_stop(void) return 0; return 0; } } static void __exit cleanup_slots(void) { struct list_head *tmp; struct slot *slot; /* * Unregister all of our slots with the pci_hotplug subsystem, * and free up all memory that we had allocated. */ down_write(&list_rwsem); if(!slots) { goto null_cleanup; } list_for_each(tmp, &slot_list) { slot = list_entry(tmp, struct slot, slot_list); list_del(&slot->slot_list); pci_hp_deregister(slot->hotplug_slot); kfree(slot->hotplug_slot->info); kfree(slot->hotplug_slot->name); kfree(slot->hotplug_slot); kfree(slot); } null_cleanup: up_write(&list_rwsem); return; } int __init int __init cpci_hotplug_init(int debug) cpci_hotplug_init(int debug) { { Loading @@ -784,7 +757,8 @@ cpci_hotplug_exit(void) /* /* * Clean everything up. * Clean everything up. */ */ cleanup_slots(); cpci_hp_stop(); cpci_hp_unregister_controller(controller); } } EXPORT_SYMBOL_GPL(cpci_hp_register_controller); EXPORT_SYMBOL_GPL(cpci_hp_register_controller); Loading drivers/pci/hotplug/cpci_hotplug_pci.c +54 −90 Original line number Original line Diff line number Diff line /* /* * CompactPCI Hot Plug Driver PCI functions * CompactPCI Hot Plug Driver PCI functions * * * Copyright (C) 2002 by SOMA Networks, Inc. * Copyright (C) 2002,2005 by SOMA Networks, Inc. * * * All rights reserved. * All rights reserved. * * Loading Loading @@ -57,16 +57,15 @@ u8 cpci_get_attention_status(struct slot* slot) hs_cap = pci_bus_find_capability(slot->bus, hs_cap = pci_bus_find_capability(slot->bus, slot->devfn, slot->devfn, PCI_CAP_ID_CHSWP); PCI_CAP_ID_CHSWP); if(!hs_cap) { if (!hs_cap) return 0; return 0; } if (pci_bus_read_config_word(slot->bus, if (pci_bus_read_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, &hs_csr)) { &hs_csr)) return 0; return 0; } return hs_csr & 0x0008 ? 1 : 0; return hs_csr & 0x0008 ? 1 : 0; } } Loading @@ -78,27 +77,22 @@ int cpci_set_attention_status(struct slot* slot, int status) hs_cap = pci_bus_find_capability(slot->bus, hs_cap = pci_bus_find_capability(slot->bus, slot->devfn, slot->devfn, PCI_CAP_ID_CHSWP); PCI_CAP_ID_CHSWP); if(!hs_cap) { if (!hs_cap) return 0; return 0; } if (pci_bus_read_config_word(slot->bus, if (pci_bus_read_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, &hs_csr)) { &hs_csr)) return 0; return 0; } if (status) if(status) { hs_csr |= HS_CSR_LOO; hs_csr |= HS_CSR_LOO; } else { else hs_csr &= ~HS_CSR_LOO; hs_csr &= ~HS_CSR_LOO; } if (pci_bus_write_config_word(slot->bus, if (pci_bus_write_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, hs_csr)) { hs_csr)) return 0; return 0; } return 1; return 1; } } Loading @@ -110,16 +104,13 @@ u16 cpci_get_hs_csr(struct slot* slot) hs_cap = pci_bus_find_capability(slot->bus, hs_cap = pci_bus_find_capability(slot->bus, slot->devfn, slot->devfn, PCI_CAP_ID_CHSWP); PCI_CAP_ID_CHSWP); if(!hs_cap) { if (!hs_cap) return 0xFFFF; return 0xFFFF; } if (pci_bus_read_config_word(slot->bus, if (pci_bus_read_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, &hs_csr)) { &hs_csr)) return 0xFFFF; return 0xFFFF; } return hs_csr; return hs_csr; } } Loading @@ -132,23 +123,21 @@ int cpci_check_and_clear_ins(struct slot* slot) hs_cap = pci_bus_find_capability(slot->bus, hs_cap = pci_bus_find_capability(slot->bus, slot->devfn, slot->devfn, PCI_CAP_ID_CHSWP); PCI_CAP_ID_CHSWP); if(!hs_cap) { if (!hs_cap) return 0; return 0; } if (pci_bus_read_config_word(slot->bus, if (pci_bus_read_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, &hs_csr)) { &hs_csr)) return 0; return 0; } if (hs_csr & HS_CSR_INS) { if (hs_csr & HS_CSR_INS) { /* Clear INS (by setting it) */ /* Clear INS (by setting it) */ if (pci_bus_write_config_word(slot->bus, if (pci_bus_write_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, hs_csr)) { hs_csr)) ins = 0; ins = 0; } else ins = 1; ins = 1; } } return ins; return ins; Loading @@ -163,18 +152,15 @@ int cpci_check_ext(struct slot* slot) hs_cap = pci_bus_find_capability(slot->bus, hs_cap = pci_bus_find_capability(slot->bus, slot->devfn, slot->devfn, PCI_CAP_ID_CHSWP); PCI_CAP_ID_CHSWP); if(!hs_cap) { if (!hs_cap) return 0; return 0; } if (pci_bus_read_config_word(slot->bus, if (pci_bus_read_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, &hs_csr)) { &hs_csr)) return 0; return 0; } if (hs_csr & HS_CSR_EXT) if(hs_csr & HS_CSR_EXT) { ext = 1; ext = 1; } return ext; return ext; } } Loading @@ -186,24 +172,21 @@ int cpci_clear_ext(struct slot* slot) hs_cap = pci_bus_find_capability(slot->bus, hs_cap = pci_bus_find_capability(slot->bus, slot->devfn, slot->devfn, PCI_CAP_ID_CHSWP); PCI_CAP_ID_CHSWP); if(!hs_cap) { if (!hs_cap) return -ENODEV; return -ENODEV; } if (pci_bus_read_config_word(slot->bus, if (pci_bus_read_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, &hs_csr)) { &hs_csr)) return -ENODEV; return -ENODEV; } if (hs_csr & HS_CSR_EXT) { if (hs_csr & HS_CSR_EXT) { /* Clear EXT (by setting it) */ /* Clear EXT (by setting it) */ if (pci_bus_write_config_word(slot->bus, if (pci_bus_write_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, hs_csr)) { hs_csr)) return -ENODEV; return -ENODEV; } } } return 0; return 0; } } Loading @@ -215,15 +198,13 @@ int cpci_led_on(struct slot* slot) hs_cap = pci_bus_find_capability(slot->bus, hs_cap = pci_bus_find_capability(slot->bus, slot->devfn, slot->devfn, PCI_CAP_ID_CHSWP); PCI_CAP_ID_CHSWP); if(!hs_cap) { if (!hs_cap) return -ENODEV; return -ENODEV; } if (pci_bus_read_config_word(slot->bus, if (pci_bus_read_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, &hs_csr)) { &hs_csr)) return -ENODEV; return -ENODEV; } if ((hs_csr & HS_CSR_LOO) != HS_CSR_LOO) { if ((hs_csr & HS_CSR_LOO) != HS_CSR_LOO) { hs_csr |= HS_CSR_LOO; hs_csr |= HS_CSR_LOO; if (pci_bus_write_config_word(slot->bus, if (pci_bus_write_config_word(slot->bus, Loading @@ -246,15 +227,13 @@ int cpci_led_off(struct slot* slot) hs_cap = pci_bus_find_capability(slot->bus, hs_cap = pci_bus_find_capability(slot->bus, slot->devfn, slot->devfn, PCI_CAP_ID_CHSWP); PCI_CAP_ID_CHSWP); if(!hs_cap) { if (!hs_cap) return -ENODEV; return -ENODEV; } if (pci_bus_read_config_word(slot->bus, if (pci_bus_read_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, &hs_csr)) { &hs_csr)) return -ENODEV; return -ENODEV; } if (hs_csr & HS_CSR_LOO) { if (hs_csr & HS_CSR_LOO) { hs_csr &= ~HS_CSR_LOO; hs_csr &= ~HS_CSR_LOO; if (pci_bus_write_config_word(slot->bus, if (pci_bus_write_config_word(slot->bus, Loading @@ -274,19 +253,6 @@ int cpci_led_off(struct slot* slot) * Device configuration functions * Device configuration functions */ */ static void cpci_enable_device(struct pci_dev *dev) { struct pci_bus *bus; pci_enable_device(dev); if(dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { bus = dev->subordinate; list_for_each_entry(dev, &bus->devices, bus_list) { cpci_enable_device(dev); } } } int cpci_configure_slot(struct slot* slot) int cpci_configure_slot(struct slot* slot) { { unsigned char busnr; unsigned char busnr; Loading @@ -297,7 +263,7 @@ int cpci_configure_slot(struct slot* slot) if (slot->dev == NULL) { if (slot->dev == NULL) { dbg("pci_dev null, finding %02x:%02x:%x", dbg("pci_dev null, finding %02x:%02x:%x", slot->bus->number, PCI_SLOT(slot->devfn), PCI_FUNC(slot->devfn)); slot->bus->number, PCI_SLOT(slot->devfn), PCI_FUNC(slot->devfn)); slot->dev = pci_find_slot(slot->bus->number, slot->devfn); slot->dev = pci_get_slot(slot->bus, slot->devfn); } } /* Still NULL? Well then scan for it! */ /* Still NULL? Well then scan for it! */ Loading @@ -313,7 +279,7 @@ int cpci_configure_slot(struct slot* slot) dbg("%s: pci_scan_slot returned %d", __FUNCTION__, n); dbg("%s: pci_scan_slot returned %d", __FUNCTION__, n); if (n > 0) if (n > 0) pci_bus_add_devices(slot->bus); pci_bus_add_devices(slot->bus); slot->dev = pci_find_slot(slot->bus->number, slot->devfn); slot->dev = pci_get_slot(slot->bus, slot->devfn); if (slot->dev == NULL) { if (slot->dev == NULL) { err("Could not find PCI device for slot %02x", slot->number); err("Could not find PCI device for slot %02x", slot->number); return 1; return 1; Loading @@ -329,8 +295,6 @@ int cpci_configure_slot(struct slot* slot) pci_bus_assign_resources(slot->dev->bus); pci_bus_assign_resources(slot->dev->bus); cpci_enable_device(slot->dev); dbg("%s - exit", __FUNCTION__); dbg("%s - exit", __FUNCTION__); return 0; return 0; } } Loading @@ -347,7 +311,7 @@ int cpci_unconfigure_slot(struct slot* slot) } } for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) { dev = pci_find_slot(slot->bus->number, dev = pci_get_slot(slot->bus, PCI_DEVFN(PCI_SLOT(slot->devfn), i)); PCI_DEVFN(PCI_SLOT(slot->devfn), i)); if (dev) { if (dev) { pci_remove_bus_device(dev); pci_remove_bus_device(dev); Loading drivers/pci/hotplug/shpchprm_acpi.c +2 −2 Original line number Original line Diff line number Diff line Loading @@ -1626,7 +1626,7 @@ int shpchprm_set_hpp( pci_bus->number = func->bus; pci_bus->number = func->bus; devfn = PCI_DEVFN(func->device, func->function); devfn = PCI_DEVFN(func->device, func->function); ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->bus); ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->slot_bus); if (ab) { if (ab) { if (ab->_hpp) { if (ab->_hpp) { Loading Loading @@ -1681,7 +1681,7 @@ void shpchprm_enable_card( | PCI_COMMAND_IO | PCI_COMMAND_MEMORY; | PCI_COMMAND_IO | PCI_COMMAND_MEMORY; bcmd = bcommand = bcommand | PCI_BRIDGE_CTL_NO_ISA; bcmd = bcommand = bcommand | PCI_BRIDGE_CTL_NO_ISA; ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->bus); ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->slot_bus); if (ab) { if (ab) { if (ab->_hpp) { if (ab->_hpp) { if (ab->_hpp->enable_perr) { if (ab->_hpp->enable_perr) { Loading include/linux/pci_ids.h +6 −0 Original line number Original line Diff line number Diff line Loading @@ -1230,6 +1230,12 @@ #define PCI_DEVICE_ID_NVIDIA_QUADRO4_900XGL 0x0258 #define PCI_DEVICE_ID_NVIDIA_QUADRO4_900XGL 0x0258 #define PCI_DEVICE_ID_NVIDIA_QUADRO4_750XGL 0x0259 #define PCI_DEVICE_ID_NVIDIA_QUADRO4_750XGL 0x0259 #define PCI_DEVICE_ID_NVIDIA_QUADRO4_700XGL 0x025B #define PCI_DEVICE_ID_NVIDIA_QUADRO4_700XGL 0x025B #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE 0x0265 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA 0x0266 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA2 0x0267 #define PCI_DEVICE_ID_NVIDIA_NVENET_12 0x0268 #define PCI_DEVICE_ID_NVIDIA_NVENET_13 0x0269 #define PCI_DEVICE_ID_NVIDIA_MCP51_AUDIO 0x026B #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800 0x0280 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800 0x0280 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800_8X 0x0281 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800_8X 0x0281 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800SE 0x0282 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800SE 0x0282 Loading Loading
drivers/ide/pci/amd74xx.c +3 −0 Original line number Original line Diff line number Diff line Loading @@ -72,6 +72,7 @@ static struct amd_ide_chip { { PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2, 0x50, AMD_UDMA_133 }, { PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2, 0x50, AMD_UDMA_133 }, { PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE, 0x50, AMD_UDMA_133 }, { PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE, 0x50, AMD_UDMA_133 }, { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE, 0x50, AMD_UDMA_133 }, { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE, 0x50, AMD_UDMA_133 }, { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE, 0x50, AMD_UDMA_133 }, { 0 } { 0 } }; }; Loading Loading @@ -487,6 +488,7 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = { /* 12 */ DECLARE_NV_DEV("NFORCE3-250-SATA2"), /* 12 */ DECLARE_NV_DEV("NFORCE3-250-SATA2"), /* 13 */ DECLARE_NV_DEV("NFORCE-CK804"), /* 13 */ DECLARE_NV_DEV("NFORCE-CK804"), /* 14 */ DECLARE_NV_DEV("NFORCE-MCP04"), /* 14 */ DECLARE_NV_DEV("NFORCE-MCP04"), /* 15 */ DECLARE_NV_DEV("NFORCE-MCP51"), }; }; static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id) static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id) Loading Loading @@ -521,6 +523,7 @@ static struct pci_device_id amd74xx_pci_tbl[] = { #endif #endif { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 13 }, { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 13 }, { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14 }, { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14 }, { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 15 }, { 0, }, { 0, }, }; }; MODULE_DEVICE_TABLE(pci, amd74xx_pci_tbl); MODULE_DEVICE_TABLE(pci, amd74xx_pci_tbl); Loading
drivers/pci/hotplug/cpci_hotplug_core.c +138 −164 Original line number Original line Diff line number Diff line /* /* * CompactPCI Hot Plug Driver * CompactPCI Hot Plug Driver * * * Copyright (C) 2002 SOMA Networks, Inc. * Copyright (C) 2002,2005 SOMA Networks, Inc. * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) * Copyright (C) 2001 IBM Corp. * Copyright (C) 2001 IBM Corp. * * Loading Loading @@ -111,10 +111,8 @@ enable_slot(struct hotplug_slot *hotplug_slot) dbg("%s - physical_slot = %s", __FUNCTION__, hotplug_slot->name); dbg("%s - physical_slot = %s", __FUNCTION__, hotplug_slot->name); if(controller->ops->set_power) { if (controller->ops->set_power) retval = controller->ops->set_power(slot, 1); retval = controller->ops->set_power(slot, 1); } return retval; return retval; } } Loading @@ -126,13 +124,15 @@ disable_slot(struct hotplug_slot *hotplug_slot) dbg("%s - physical_slot = %s", __FUNCTION__, hotplug_slot->name); dbg("%s - physical_slot = %s", __FUNCTION__, hotplug_slot->name); down_write(&list_rwsem); /* Unconfigure device */ /* Unconfigure device */ dbg("%s - unconfiguring slot %s", dbg("%s - unconfiguring slot %s", __FUNCTION__, slot->hotplug_slot->name); __FUNCTION__, slot->hotplug_slot->name); if ((retval = cpci_unconfigure_slot(slot))) { if ((retval = cpci_unconfigure_slot(slot))) { err("%s - could not unconfigure slot %s", err("%s - could not unconfigure slot %s", __FUNCTION__, slot->hotplug_slot->name); __FUNCTION__, slot->hotplug_slot->name); return retval; goto disable_error; } } dbg("%s - finished unconfiguring slot %s", dbg("%s - finished unconfiguring slot %s", __FUNCTION__, slot->hotplug_slot->name); __FUNCTION__, slot->hotplug_slot->name); Loading @@ -142,21 +142,23 @@ disable_slot(struct hotplug_slot *hotplug_slot) err("%s - could not clear EXT for slot %s", err("%s - could not clear EXT for slot %s", __FUNCTION__, slot->hotplug_slot->name); __FUNCTION__, slot->hotplug_slot->name); retval = -ENODEV; retval = -ENODEV; goto disable_error; } } cpci_led_on(slot); cpci_led_on(slot); if(controller->ops->set_power) { if (controller->ops->set_power) retval = controller->ops->set_power(slot, 0); if ((retval = controller->ops->set_power(slot, 0))) } goto disable_error; if(update_adapter_status(slot->hotplug_slot, 0)) { if (update_adapter_status(slot->hotplug_slot, 0)) warn("failure to update adapter file"); warn("failure to update adapter file"); } if (slot->extracting) { if (slot->extracting) { slot->extracting = 0; slot->extracting = 0; atomic_dec(&extracting); atomic_dec(&extracting); } } disable_error: up_write(&list_rwsem); return retval; return retval; } } Loading @@ -165,9 +167,8 @@ cpci_get_power_status(struct slot *slot) { { u8 power = 1; u8 power = 1; if(controller->ops->get_power) { if (controller->ops->get_power) power = controller->ops->get_power(slot); power = controller->ops->get_power(slot); } return power; return power; } } Loading Loading @@ -237,9 +238,8 @@ cpci_hp_register_bus(struct pci_bus *bus, u8 first, u8 last) int status = -ENOMEM; int status = -ENOMEM; int i; int i; if(!(controller && bus)) { if (!(controller && bus)) return -ENODEV; return -ENODEV; } /* /* * Create a structure for each slot, and register that slot * Create a structure for each slot, and register that slot Loading Loading @@ -316,32 +316,30 @@ int cpci_hp_unregister_bus(struct pci_bus *bus) cpci_hp_unregister_bus(struct pci_bus *bus) { { struct slot *slot; struct slot *slot; struct list_head *tmp; struct slot *tmp; struct list_head *next; int status = 0; int status; down_write(&list_rwsem); down_write(&list_rwsem); if (!slots) { if (!slots) { up_write(&list_rwsem); up_write(&list_rwsem); return -1; return -1; } } list_for_each_safe(tmp, next, &slot_list) { list_for_each_entry_safe(slot, tmp, &slot_list, slot_list) { slot = list_entry(tmp, struct slot, slot_list); if (slot->bus == bus) { if (slot->bus == bus) { list_del(&slot->slot_list); slots--; dbg("deregistering slot %s", slot->hotplug_slot->name); dbg("deregistering slot %s", slot->hotplug_slot->name); status = pci_hp_deregister(slot->hotplug_slot); status = pci_hp_deregister(slot->hotplug_slot); if (status) { if (status) { err("pci_hp_deregister failed with error %d", err("pci_hp_deregister failed with error %d", status); status); return status; break; } } list_del(&slot->slot_list); slots--; } } } } up_write(&list_rwsem); up_write(&list_rwsem); return 0; return status; } } /* This is the interrupt mode interrupt handler */ /* This is the interrupt mode interrupt handler */ Loading Loading @@ -373,10 +371,9 @@ cpci_hp_intr(int irq, void *data, struct pt_regs *regs) * INS bits of the cold-inserted devices. * INS bits of the cold-inserted devices. */ */ static int static int init_slots(void) init_slots(int clear_ins) { { struct slot *slot; struct slot *slot; struct list_head *tmp; struct pci_dev* dev; struct pci_dev* dev; dbg("%s - enter", __FUNCTION__); dbg("%s - enter", __FUNCTION__); Loading @@ -385,26 +382,19 @@ init_slots(void) up_read(&list_rwsem); up_read(&list_rwsem); return -1; return -1; } } list_for_each(tmp, &slot_list) { list_for_each_entry(slot, &slot_list, slot_list) { slot = list_entry(tmp, struct slot, slot_list); dbg("%s - looking at slot %s", dbg("%s - looking at slot %s", __FUNCTION__, slot->hotplug_slot->name); __FUNCTION__, slot->hotplug_slot->name); if(cpci_check_and_clear_ins(slot)) { if (clear_ins && cpci_check_and_clear_ins(slot)) dbg("%s - cleared INS for slot %s", dbg("%s - cleared INS for slot %s", __FUNCTION__, slot->hotplug_slot->name); __FUNCTION__, slot->hotplug_slot->name); dev = pci_find_slot(slot->bus->number, PCI_DEVFN(slot->number, 0)); dev = pci_get_slot(slot->bus, PCI_DEVFN(slot->number, 0)); if (dev) { if (dev) { if(update_adapter_status(slot->hotplug_slot, 1)) { if (update_adapter_status(slot->hotplug_slot, 1)) warn("failure to update adapter file"); warn("failure to update adapter file"); } if (update_latch_status(slot->hotplug_slot, 1)) if(update_latch_status(slot->hotplug_slot, 1)) { warn("failure to update latch file"); warn("failure to update latch file"); } slot->dev = dev; slot->dev = dev; } else { err("%s - no driver attached to device in slot %s", __FUNCTION__, slot->hotplug_slot->name); } } } } } up_read(&list_rwsem); up_read(&list_rwsem); Loading @@ -416,7 +406,6 @@ static int check_slots(void) check_slots(void) { { struct slot *slot; struct slot *slot; struct list_head *tmp; int extracted; int extracted; int inserted; int inserted; u16 hs_csr; u16 hs_csr; Loading @@ -428,14 +417,17 @@ check_slots(void) return -1; return -1; } } extracted = inserted = 0; extracted = inserted = 0; list_for_each(tmp, &slot_list) { list_for_each_entry(slot, &slot_list, slot_list) { slot = list_entry(tmp, struct slot, slot_list); dbg("%s - looking at slot %s", dbg("%s - looking at slot %s", __FUNCTION__, slot->hotplug_slot->name); __FUNCTION__, slot->hotplug_slot->name); if (cpci_check_and_clear_ins(slot)) { if (cpci_check_and_clear_ins(slot)) { /* Some broken hardware (e.g. PLX 9054AB) asserts ENUM# twice... */ /* * Some broken hardware (e.g. PLX 9054AB) asserts * ENUM# twice... */ if (slot->dev) { if (slot->dev) { warn("slot %s already inserted", slot->hotplug_slot->name); warn("slot %s already inserted", slot->hotplug_slot->name); inserted++; inserted++; continue; continue; } } Loading Loading @@ -465,13 +457,11 @@ check_slots(void) dbg("%s - slot %s HS_CSR (2) = %04x", dbg("%s - slot %s HS_CSR (2) = %04x", __FUNCTION__, slot->hotplug_slot->name, hs_csr); __FUNCTION__, slot->hotplug_slot->name, hs_csr); if(update_latch_status(slot->hotplug_slot, 1)) { if (update_latch_status(slot->hotplug_slot, 1)) warn("failure to update latch file"); warn("failure to update latch file"); } if(update_adapter_status(slot->hotplug_slot, 1)) { if (update_adapter_status(slot->hotplug_slot, 1)) warn("failure to update adapter file"); warn("failure to update adapter file"); } cpci_led_off(slot); cpci_led_off(slot); Loading @@ -494,10 +484,9 @@ check_slots(void) if (!slot->extracting) { if (!slot->extracting) { if (update_latch_status(slot->hotplug_slot, 0)) { if (update_latch_status(slot->hotplug_slot, 0)) { warn("failure to update latch file"); warn("failure to update latch file"); } } atomic_inc(&extracting); slot->extracting = 1; slot->extracting = 1; atomic_inc(&extracting); } } extracted++; extracted++; } else if (slot->extracting) { } else if (slot->extracting) { Loading @@ -509,9 +498,8 @@ check_slots(void) */ */ err("card in slot %s was improperly removed", err("card in slot %s was improperly removed", slot->hotplug_slot->name); slot->hotplug_slot->name); if(update_adapter_status(slot->hotplug_slot, 0)) { if (update_adapter_status(slot->hotplug_slot, 0)) warn("failure to update adapter file"); warn("failure to update adapter file"); } slot->extracting = 0; slot->extracting = 0; atomic_dec(&extracting); atomic_dec(&extracting); } } Loading @@ -520,9 +508,8 @@ check_slots(void) up_read(&list_rwsem); up_read(&list_rwsem); dbg("inserted=%d, extracted=%d, extracting=%d", dbg("inserted=%d, extracted=%d, extracting=%d", inserted, extracted, atomic_read(&extracting)); inserted, extracted, atomic_read(&extracting)); if(inserted || extracted) { if (inserted || extracted) return extracted; return extracted; } else if (!atomic_read(&extracting)) { else if (!atomic_read(&extracting)) { err("cannot find ENUM# source, shutting down"); err("cannot find ENUM# source, shutting down"); return -1; return -1; Loading Loading @@ -558,7 +545,9 @@ event_thread(void *data) thread_finished = 1; thread_finished = 1; break; break; } } } while(atomic_read(&extracting) != 0); } while (atomic_read(&extracting) && !thread_finished); if (thread_finished) break; /* Re-enable ENUM# interrupt */ /* Re-enable ENUM# interrupt */ dbg("%s - re-enabling irq", __FUNCTION__); dbg("%s - re-enabling irq", __FUNCTION__); Loading Loading @@ -593,7 +582,7 @@ poll_thread(void *data) thread_finished = 1; thread_finished = 1; break; break; } } } while(atomic_read(&extracting) != 0); } while (atomic_read(&extracting) && !thread_finished); } } msleep(100); msleep(100); } } Loading @@ -612,11 +601,10 @@ cpci_start_thread(void) init_MUTEX_LOCKED(&thread_exit); init_MUTEX_LOCKED(&thread_exit); thread_finished = 0; thread_finished = 0; if(controller->irq) { if (controller->irq) pid = kernel_thread(event_thread, NULL, 0); pid = kernel_thread(event_thread, NULL, 0); } else { else pid = kernel_thread(poll_thread, NULL, 0); pid = kernel_thread(poll_thread, NULL, 0); } if (pid < 0) { if (pid < 0) { err("Can't start up our thread"); err("Can't start up our thread"); return -1; return -1; Loading @@ -630,9 +618,8 @@ cpci_stop_thread(void) { { thread_finished = 1; thread_finished = 1; dbg("thread finish command given"); dbg("thread finish command given"); if(controller->irq) { if (controller->irq) up(&event_semaphore); up(&event_semaphore); } dbg("wait for thread to exit"); dbg("wait for thread to exit"); down(&thread_exit); down(&thread_exit); } } Loading @@ -642,45 +629,67 @@ cpci_hp_register_controller(struct cpci_hp_controller *new_controller) { { int status = 0; int status = 0; if(!controller) { if (controller) controller = new_controller; return -1; if(controller->irq) { if (!(new_controller && new_controller->ops)) if(request_irq(controller->irq, return -EINVAL; if (new_controller->irq) { if (!(new_controller->ops->enable_irq && new_controller->ops->disable_irq)) status = -EINVAL; if (request_irq(new_controller->irq, cpci_hp_intr, cpci_hp_intr, controller->irq_flags, new_controller->irq_flags, MY_NAME, controller->dev_id)) { MY_NAME, err("Can't get irq %d for the hotplug cPCI controller", controller->irq); new_controller->dev_id)) { err("Can't get irq %d for the hotplug cPCI controller", new_controller->irq); status = -ENODEV; status = -ENODEV; } } dbg("%s - acquired controller irq %d", __FUNCTION__, dbg("%s - acquired controller irq %d", controller->irq); __FUNCTION__, new_controller->irq); } } else { err("cPCI hotplug controller already registered"); status = -1; } } if (!status) controller = new_controller; return status; return status; } } static void cleanup_slots(void) { struct slot *slot; struct slot *tmp; /* * Unregister all of our slots with the pci_hotplug subsystem, * and free up all memory that we had allocated. */ down_write(&list_rwsem); if (!slots) goto cleanup_null; list_for_each_entry_safe(slot, tmp, &slot_list, slot_list) { list_del(&slot->slot_list); pci_hp_deregister(slot->hotplug_slot); } cleanup_null: up_write(&list_rwsem); return; } int int cpci_hp_unregister_controller(struct cpci_hp_controller *old_controller) cpci_hp_unregister_controller(struct cpci_hp_controller *old_controller) { { int status = 0; int status = 0; if (controller) { if (controller) { if(atomic_read(&extracting) != 0) { if (!thread_finished) return -EBUSY; } if(!thread_finished) { cpci_stop_thread(); cpci_stop_thread(); } if (controller->irq) if(controller->irq) { free_irq(controller->irq, controller->dev_id); free_irq(controller->irq, controller->dev_id); } controller = NULL; controller = NULL; } else { cleanup_slots(); } else status = -ENODEV; status = -ENODEV; } return status; return status; } } Loading @@ -691,9 +700,8 @@ cpci_hp_start(void) int status; int status; dbg("%s - enter", __FUNCTION__); dbg("%s - enter", __FUNCTION__); if(!controller) { if (!controller) return -ENODEV; return -ENODEV; } down_read(&list_rwsem); down_read(&list_rwsem); if (list_empty(&slot_list)) { if (list_empty(&slot_list)) { Loading @@ -702,18 +710,15 @@ cpci_hp_start(void) } } up_read(&list_rwsem); up_read(&list_rwsem); if(first) { status = init_slots(first); status = init_slots(); if (first) if(status) { return status; } first = 0; first = 0; } if (status) return status; status = cpci_start_thread(); status = cpci_start_thread(); if(status) { if (status) return status; return status; } dbg("%s - thread started", __FUNCTION__); dbg("%s - thread started", __FUNCTION__); if (controller->irq) { if (controller->irq) { Loading @@ -728,12 +733,8 @@ cpci_hp_start(void) int int cpci_hp_stop(void) cpci_hp_stop(void) { { if(!controller) { if (!controller) return -ENODEV; return -ENODEV; } if(atomic_read(&extracting) != 0) { return -EBUSY; } if (controller->irq) { if (controller->irq) { /* Stop enum interrupt processing */ /* Stop enum interrupt processing */ dbg("%s - disabling irq", __FUNCTION__); dbg("%s - disabling irq", __FUNCTION__); Loading @@ -743,34 +744,6 @@ cpci_hp_stop(void) return 0; return 0; } } static void __exit cleanup_slots(void) { struct list_head *tmp; struct slot *slot; /* * Unregister all of our slots with the pci_hotplug subsystem, * and free up all memory that we had allocated. */ down_write(&list_rwsem); if(!slots) { goto null_cleanup; } list_for_each(tmp, &slot_list) { slot = list_entry(tmp, struct slot, slot_list); list_del(&slot->slot_list); pci_hp_deregister(slot->hotplug_slot); kfree(slot->hotplug_slot->info); kfree(slot->hotplug_slot->name); kfree(slot->hotplug_slot); kfree(slot); } null_cleanup: up_write(&list_rwsem); return; } int __init int __init cpci_hotplug_init(int debug) cpci_hotplug_init(int debug) { { Loading @@ -784,7 +757,8 @@ cpci_hotplug_exit(void) /* /* * Clean everything up. * Clean everything up. */ */ cleanup_slots(); cpci_hp_stop(); cpci_hp_unregister_controller(controller); } } EXPORT_SYMBOL_GPL(cpci_hp_register_controller); EXPORT_SYMBOL_GPL(cpci_hp_register_controller); Loading
drivers/pci/hotplug/cpci_hotplug_pci.c +54 −90 Original line number Original line Diff line number Diff line /* /* * CompactPCI Hot Plug Driver PCI functions * CompactPCI Hot Plug Driver PCI functions * * * Copyright (C) 2002 by SOMA Networks, Inc. * Copyright (C) 2002,2005 by SOMA Networks, Inc. * * * All rights reserved. * All rights reserved. * * Loading Loading @@ -57,16 +57,15 @@ u8 cpci_get_attention_status(struct slot* slot) hs_cap = pci_bus_find_capability(slot->bus, hs_cap = pci_bus_find_capability(slot->bus, slot->devfn, slot->devfn, PCI_CAP_ID_CHSWP); PCI_CAP_ID_CHSWP); if(!hs_cap) { if (!hs_cap) return 0; return 0; } if (pci_bus_read_config_word(slot->bus, if (pci_bus_read_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, &hs_csr)) { &hs_csr)) return 0; return 0; } return hs_csr & 0x0008 ? 1 : 0; return hs_csr & 0x0008 ? 1 : 0; } } Loading @@ -78,27 +77,22 @@ int cpci_set_attention_status(struct slot* slot, int status) hs_cap = pci_bus_find_capability(slot->bus, hs_cap = pci_bus_find_capability(slot->bus, slot->devfn, slot->devfn, PCI_CAP_ID_CHSWP); PCI_CAP_ID_CHSWP); if(!hs_cap) { if (!hs_cap) return 0; return 0; } if (pci_bus_read_config_word(slot->bus, if (pci_bus_read_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, &hs_csr)) { &hs_csr)) return 0; return 0; } if (status) if(status) { hs_csr |= HS_CSR_LOO; hs_csr |= HS_CSR_LOO; } else { else hs_csr &= ~HS_CSR_LOO; hs_csr &= ~HS_CSR_LOO; } if (pci_bus_write_config_word(slot->bus, if (pci_bus_write_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, hs_csr)) { hs_csr)) return 0; return 0; } return 1; return 1; } } Loading @@ -110,16 +104,13 @@ u16 cpci_get_hs_csr(struct slot* slot) hs_cap = pci_bus_find_capability(slot->bus, hs_cap = pci_bus_find_capability(slot->bus, slot->devfn, slot->devfn, PCI_CAP_ID_CHSWP); PCI_CAP_ID_CHSWP); if(!hs_cap) { if (!hs_cap) return 0xFFFF; return 0xFFFF; } if (pci_bus_read_config_word(slot->bus, if (pci_bus_read_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, &hs_csr)) { &hs_csr)) return 0xFFFF; return 0xFFFF; } return hs_csr; return hs_csr; } } Loading @@ -132,23 +123,21 @@ int cpci_check_and_clear_ins(struct slot* slot) hs_cap = pci_bus_find_capability(slot->bus, hs_cap = pci_bus_find_capability(slot->bus, slot->devfn, slot->devfn, PCI_CAP_ID_CHSWP); PCI_CAP_ID_CHSWP); if(!hs_cap) { if (!hs_cap) return 0; return 0; } if (pci_bus_read_config_word(slot->bus, if (pci_bus_read_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, &hs_csr)) { &hs_csr)) return 0; return 0; } if (hs_csr & HS_CSR_INS) { if (hs_csr & HS_CSR_INS) { /* Clear INS (by setting it) */ /* Clear INS (by setting it) */ if (pci_bus_write_config_word(slot->bus, if (pci_bus_write_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, hs_csr)) { hs_csr)) ins = 0; ins = 0; } else ins = 1; ins = 1; } } return ins; return ins; Loading @@ -163,18 +152,15 @@ int cpci_check_ext(struct slot* slot) hs_cap = pci_bus_find_capability(slot->bus, hs_cap = pci_bus_find_capability(slot->bus, slot->devfn, slot->devfn, PCI_CAP_ID_CHSWP); PCI_CAP_ID_CHSWP); if(!hs_cap) { if (!hs_cap) return 0; return 0; } if (pci_bus_read_config_word(slot->bus, if (pci_bus_read_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, &hs_csr)) { &hs_csr)) return 0; return 0; } if (hs_csr & HS_CSR_EXT) if(hs_csr & HS_CSR_EXT) { ext = 1; ext = 1; } return ext; return ext; } } Loading @@ -186,24 +172,21 @@ int cpci_clear_ext(struct slot* slot) hs_cap = pci_bus_find_capability(slot->bus, hs_cap = pci_bus_find_capability(slot->bus, slot->devfn, slot->devfn, PCI_CAP_ID_CHSWP); PCI_CAP_ID_CHSWP); if(!hs_cap) { if (!hs_cap) return -ENODEV; return -ENODEV; } if (pci_bus_read_config_word(slot->bus, if (pci_bus_read_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, &hs_csr)) { &hs_csr)) return -ENODEV; return -ENODEV; } if (hs_csr & HS_CSR_EXT) { if (hs_csr & HS_CSR_EXT) { /* Clear EXT (by setting it) */ /* Clear EXT (by setting it) */ if (pci_bus_write_config_word(slot->bus, if (pci_bus_write_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, hs_csr)) { hs_csr)) return -ENODEV; return -ENODEV; } } } return 0; return 0; } } Loading @@ -215,15 +198,13 @@ int cpci_led_on(struct slot* slot) hs_cap = pci_bus_find_capability(slot->bus, hs_cap = pci_bus_find_capability(slot->bus, slot->devfn, slot->devfn, PCI_CAP_ID_CHSWP); PCI_CAP_ID_CHSWP); if(!hs_cap) { if (!hs_cap) return -ENODEV; return -ENODEV; } if (pci_bus_read_config_word(slot->bus, if (pci_bus_read_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, &hs_csr)) { &hs_csr)) return -ENODEV; return -ENODEV; } if ((hs_csr & HS_CSR_LOO) != HS_CSR_LOO) { if ((hs_csr & HS_CSR_LOO) != HS_CSR_LOO) { hs_csr |= HS_CSR_LOO; hs_csr |= HS_CSR_LOO; if (pci_bus_write_config_word(slot->bus, if (pci_bus_write_config_word(slot->bus, Loading @@ -246,15 +227,13 @@ int cpci_led_off(struct slot* slot) hs_cap = pci_bus_find_capability(slot->bus, hs_cap = pci_bus_find_capability(slot->bus, slot->devfn, slot->devfn, PCI_CAP_ID_CHSWP); PCI_CAP_ID_CHSWP); if(!hs_cap) { if (!hs_cap) return -ENODEV; return -ENODEV; } if (pci_bus_read_config_word(slot->bus, if (pci_bus_read_config_word(slot->bus, slot->devfn, slot->devfn, hs_cap + 2, hs_cap + 2, &hs_csr)) { &hs_csr)) return -ENODEV; return -ENODEV; } if (hs_csr & HS_CSR_LOO) { if (hs_csr & HS_CSR_LOO) { hs_csr &= ~HS_CSR_LOO; hs_csr &= ~HS_CSR_LOO; if (pci_bus_write_config_word(slot->bus, if (pci_bus_write_config_word(slot->bus, Loading @@ -274,19 +253,6 @@ int cpci_led_off(struct slot* slot) * Device configuration functions * Device configuration functions */ */ static void cpci_enable_device(struct pci_dev *dev) { struct pci_bus *bus; pci_enable_device(dev); if(dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { bus = dev->subordinate; list_for_each_entry(dev, &bus->devices, bus_list) { cpci_enable_device(dev); } } } int cpci_configure_slot(struct slot* slot) int cpci_configure_slot(struct slot* slot) { { unsigned char busnr; unsigned char busnr; Loading @@ -297,7 +263,7 @@ int cpci_configure_slot(struct slot* slot) if (slot->dev == NULL) { if (slot->dev == NULL) { dbg("pci_dev null, finding %02x:%02x:%x", dbg("pci_dev null, finding %02x:%02x:%x", slot->bus->number, PCI_SLOT(slot->devfn), PCI_FUNC(slot->devfn)); slot->bus->number, PCI_SLOT(slot->devfn), PCI_FUNC(slot->devfn)); slot->dev = pci_find_slot(slot->bus->number, slot->devfn); slot->dev = pci_get_slot(slot->bus, slot->devfn); } } /* Still NULL? Well then scan for it! */ /* Still NULL? Well then scan for it! */ Loading @@ -313,7 +279,7 @@ int cpci_configure_slot(struct slot* slot) dbg("%s: pci_scan_slot returned %d", __FUNCTION__, n); dbg("%s: pci_scan_slot returned %d", __FUNCTION__, n); if (n > 0) if (n > 0) pci_bus_add_devices(slot->bus); pci_bus_add_devices(slot->bus); slot->dev = pci_find_slot(slot->bus->number, slot->devfn); slot->dev = pci_get_slot(slot->bus, slot->devfn); if (slot->dev == NULL) { if (slot->dev == NULL) { err("Could not find PCI device for slot %02x", slot->number); err("Could not find PCI device for slot %02x", slot->number); return 1; return 1; Loading @@ -329,8 +295,6 @@ int cpci_configure_slot(struct slot* slot) pci_bus_assign_resources(slot->dev->bus); pci_bus_assign_resources(slot->dev->bus); cpci_enable_device(slot->dev); dbg("%s - exit", __FUNCTION__); dbg("%s - exit", __FUNCTION__); return 0; return 0; } } Loading @@ -347,7 +311,7 @@ int cpci_unconfigure_slot(struct slot* slot) } } for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) { dev = pci_find_slot(slot->bus->number, dev = pci_get_slot(slot->bus, PCI_DEVFN(PCI_SLOT(slot->devfn), i)); PCI_DEVFN(PCI_SLOT(slot->devfn), i)); if (dev) { if (dev) { pci_remove_bus_device(dev); pci_remove_bus_device(dev); Loading
drivers/pci/hotplug/shpchprm_acpi.c +2 −2 Original line number Original line Diff line number Diff line Loading @@ -1626,7 +1626,7 @@ int shpchprm_set_hpp( pci_bus->number = func->bus; pci_bus->number = func->bus; devfn = PCI_DEVFN(func->device, func->function); devfn = PCI_DEVFN(func->device, func->function); ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->bus); ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->slot_bus); if (ab) { if (ab) { if (ab->_hpp) { if (ab->_hpp) { Loading Loading @@ -1681,7 +1681,7 @@ void shpchprm_enable_card( | PCI_COMMAND_IO | PCI_COMMAND_MEMORY; | PCI_COMMAND_IO | PCI_COMMAND_MEMORY; bcmd = bcommand = bcommand | PCI_BRIDGE_CTL_NO_ISA; bcmd = bcommand = bcommand | PCI_BRIDGE_CTL_NO_ISA; ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->bus); ab = find_acpi_bridge_by_bus(acpi_bridges_head, ctrl->seg, ctrl->slot_bus); if (ab) { if (ab) { if (ab->_hpp) { if (ab->_hpp) { if (ab->_hpp->enable_perr) { if (ab->_hpp->enable_perr) { Loading
include/linux/pci_ids.h +6 −0 Original line number Original line Diff line number Diff line Loading @@ -1230,6 +1230,12 @@ #define PCI_DEVICE_ID_NVIDIA_QUADRO4_900XGL 0x0258 #define PCI_DEVICE_ID_NVIDIA_QUADRO4_900XGL 0x0258 #define PCI_DEVICE_ID_NVIDIA_QUADRO4_750XGL 0x0259 #define PCI_DEVICE_ID_NVIDIA_QUADRO4_750XGL 0x0259 #define PCI_DEVICE_ID_NVIDIA_QUADRO4_700XGL 0x025B #define PCI_DEVICE_ID_NVIDIA_QUADRO4_700XGL 0x025B #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE 0x0265 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA 0x0266 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA2 0x0267 #define PCI_DEVICE_ID_NVIDIA_NVENET_12 0x0268 #define PCI_DEVICE_ID_NVIDIA_NVENET_13 0x0269 #define PCI_DEVICE_ID_NVIDIA_MCP51_AUDIO 0x026B #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800 0x0280 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800 0x0280 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800_8X 0x0281 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800_8X 0x0281 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800SE 0x0282 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800SE 0x0282 Loading