Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
21f27357
Commit
21f27357
authored
Jul 16, 2003
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://kernel.bkbits.net/gregkh/linux/pci-2.5
into home.osdl.org:/home/torvalds/v2.5/linux
parents
f68f2fa3
8b27afca
Changes
16
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
165 additions
and
180 deletions
+165
-180
arch/i386/pci/legacy.c
arch/i386/pci/legacy.c
+1
-1
drivers/pci/Makefile
drivers/pci/Makefile
+1
-1
drivers/pci/hotplug.c
drivers/pci/hotplug.c
+1
-105
drivers/pci/hotplug/Kconfig
drivers/pci/hotplug/Kconfig
+3
-8
drivers/pci/hotplug/acpiphp_glue.c
drivers/pci/hotplug/acpiphp_glue.c
+2
-2
drivers/pci/hotplug/acpiphp_pci.c
drivers/pci/hotplug/acpiphp_pci.c
+2
-2
drivers/pci/hotplug/cpci_hotplug.h
drivers/pci/hotplug/cpci_hotplug.h
+0
-1
drivers/pci/hotplug/cpci_hotplug_core.c
drivers/pci/hotplug/cpci_hotplug_core.c
+0
-29
drivers/pci/hotplug/cpci_hotplug_pci.c
drivers/pci/hotplug/cpci_hotplug_pci.c
+22
-10
drivers/pci/pci.c
drivers/pci/pci.c
+5
-5
drivers/pci/pool.c
drivers/pci/pool.c
+4
-4
drivers/pci/quirks.c
drivers/pci/quirks.c
+4
-4
drivers/pci/remove.c
drivers/pci/remove.c
+113
-0
drivers/pci/setup-bus.c
drivers/pci/setup-bus.c
+3
-3
drivers/pci/setup-res.c
drivers/pci/setup-res.c
+4
-4
include/linux/pci.h
include/linux/pci.h
+0
-1
No files found.
arch/i386/pci/legacy.c
View file @
21f27357
...
...
@@ -24,7 +24,7 @@ static void __devinit pcibios_fixup_peer_bridges(void)
for
(
devfn
=
0
;
devfn
<
256
;
devfn
+=
8
)
{
if
(
!
raw_pci_ops
->
read
(
0
,
n
,
devfn
,
PCI_VENDOR_ID
,
2
,
&
l
)
&&
l
!=
0x0000
&&
l
!=
0xffff
)
{
DBG
(
"Found device at %02x:%02x [%04x]
\n
"
,
n
,
dev
->
dev
fn
,
l
);
DBG
(
"Found device at %02x:%02x [%04x]
\n
"
,
n
,
devfn
,
l
);
printk
(
KERN_INFO
"PCI: Discovered peer bus %02x
\n
"
,
n
);
pci_scan_bus
(
n
,
&
pci_root_ops
,
NULL
);
break
;
...
...
drivers/pci/Makefile
View file @
21f27357
...
...
@@ -2,7 +2,7 @@
# Makefile for the PCI bus specific drivers.
#
obj-y
+=
access.o bus.o probe.o pci.o pool.o quirks.o
\
obj-y
+=
access.o bus.o probe.o
remove.o
pci.o pool.o quirks.o
\
names.o pci-driver.o search.o pci-sysfs.o
obj-$(CONFIG_PM)
+=
power.o
obj-$(CONFIG_PROC_FS)
+=
proc.o
...
...
drivers/pci/hotplug.c
View file @
21f27357
...
...
@@ -10,8 +10,6 @@
#define DBG(x...)
#endif
static
void
pci_free_resources
(
struct
pci_dev
*
dev
);
int
pci_hotplug
(
struct
device
*
dev
,
char
**
envp
,
int
num_envp
,
char
*
buffer
,
int
buffer_size
)
{
...
...
@@ -57,7 +55,7 @@ int pci_hotplug (struct device *dev, char **envp, int num_envp,
envp
[
i
++
]
=
scratch
;
length
+=
snprintf
(
scratch
,
buffer_size
-
length
,
"PCI_SLOT_NAME=%s"
,
p
dev
->
slot_name
);
p
ci_name
(
pdev
)
);
if
((
buffer_size
-
length
<=
0
)
||
(
i
>=
num_envp
))
return
-
ENOMEM
;
...
...
@@ -172,105 +170,3 @@ int pci_visit_dev (struct pci_visit *fn, struct pci_dev_wrapped *wrapped_dev,
}
EXPORT_SYMBOL
(
pci_visit_dev
);
static
void
pci_destroy_dev
(
struct
pci_dev
*
dev
)
{
pci_proc_detach_device
(
dev
);
device_unregister
(
&
dev
->
dev
);
/* Remove the device from the device lists, and prevent any further
* list accesses from this device */
spin_lock
(
&
pci_bus_lock
);
list_del
(
&
dev
->
bus_list
);
list_del
(
&
dev
->
global_list
);
dev
->
bus_list
.
next
=
dev
->
bus_list
.
prev
=
NULL
;
dev
->
global_list
.
next
=
dev
->
global_list
.
prev
=
NULL
;
spin_unlock
(
&
pci_bus_lock
);
pci_free_resources
(
dev
);
pci_dev_put
(
dev
);
}
/**
* pci_remove_device_safe - remove an unused hotplug device
* @dev: the device to remove
*
* Delete the device structure from the device lists and
* notify userspace (/sbin/hotplug), but only if the device
* in question is not being used by a driver.
* Returns 0 on success.
*/
int
pci_remove_device_safe
(
struct
pci_dev
*
dev
)
{
if
(
pci_dev_driver
(
dev
))
return
-
EBUSY
;
pci_destroy_dev
(
dev
);
return
0
;
}
EXPORT_SYMBOL
(
pci_remove_device_safe
);
static
void
pci_free_resources
(
struct
pci_dev
*
dev
)
{
int
i
;
for
(
i
=
0
;
i
<
PCI_NUM_RESOURCES
;
i
++
)
{
struct
resource
*
res
=
dev
->
resource
+
i
;
if
(
res
->
parent
)
release_resource
(
res
);
}
}
/**
* pci_remove_bus_device - remove a PCI device and any children
* @dev: the device to remove
*
* Remove a PCI device from the device lists, informing the drivers
* that the device has been removed. We also remove any subordinate
* buses and children in a depth-first manner.
*
* For each device we remove, delete the device structure from the
* device lists, remove the /proc entry, and notify userspace
* (/sbin/hotplug).
*/
void
pci_remove_bus_device
(
struct
pci_dev
*
dev
)
{
if
(
dev
->
subordinate
)
{
struct
pci_bus
*
b
=
dev
->
subordinate
;
pci_remove_behind_bridge
(
dev
);
pci_proc_detach_bus
(
b
);
spin_lock
(
&
pci_bus_lock
);
list_del
(
&
b
->
node
);
spin_unlock
(
&
pci_bus_lock
);
kfree
(
b
);
dev
->
subordinate
=
NULL
;
}
pci_destroy_dev
(
dev
);
}
/**
* pci_remove_behind_bridge - remove all devices behind a PCI bridge
* @dev: PCI bridge device
*
* Remove all devices on the bus, except for the parent bridge.
* This also removes any child buses, and any devices they may
* contain in a depth-first manner.
*/
void
pci_remove_behind_bridge
(
struct
pci_dev
*
dev
)
{
struct
list_head
*
l
,
*
n
;
if
(
dev
->
subordinate
)
{
list_for_each_safe
(
l
,
n
,
&
dev
->
subordinate
->
devices
)
{
struct
pci_dev
*
dev
=
pci_dev_b
(
l
);
pci_remove_bus_device
(
dev
);
}
}
}
EXPORT_SYMBOL
(
pci_remove_bus_device
);
EXPORT_SYMBOL
(
pci_remove_behind_bridge
);
drivers/pci/hotplug/Kconfig
View file @
21f27357
...
...
@@ -99,22 +99,17 @@ config HOTPLUG_PCI_ACPI
When in doubt, say N.
config HOTPLUG_PCI_CPCI
tristate
"CompactPCI Hotplug driver"
bool
"CompactPCI Hotplug driver"
depends on HOTPLUG_PCI
help
Say Y here if you have a CompactPCI system card with CompactPCI
hotswap support per the PICMG 2.1 specification.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called cpci_hotplug. If you want to compile it
as a module, say M here and read <file:Documentation/modules.txt>.
When in doubt, say N.
config HOTPLUG_PCI_CPCI_ZT5550
tristate "Ziatech ZT5550 CompactPCI Hotplug driver"
depends on HOTPLUG_PCI_CPCI && X86
depends on HOTPLUG_PCI
&& HOTPLUG_PCI
_CPCI && X86
help
Say Y here if you have an Performance Technologies (formerly Intel,
formerly just Ziatech) Ziatech ZT5550 CompactPCI system card.
...
...
@@ -128,7 +123,7 @@ config HOTPLUG_PCI_CPCI_ZT5550
config HOTPLUG_PCI_CPCI_GENERIC
tristate "Generic port I/O CompactPCI Hotplug driver"
depends on HOTPLUG_PCI_CPCI && X86
depends on HOTPLUG_PCI
&& HOTPLUG_PCI
_CPCI && X86
help
Say Y here if you have a CompactPCI system card that exposes the #ENUM
hotswap signal as a bit in a system register that can be read through
...
...
drivers/pci/hotplug/acpiphp_glue.c
View file @
21f27357
...
...
@@ -607,7 +607,7 @@ find_p2p_bridge (acpi_handle handle, u32 lvl, void *context, void **rv)
/* check if this bridge has ejectable slots */
if
(
detect_ejectable_slots
(
handle
)
>
0
)
{
dbg
(
"found PCI-to-PCI bridge at PCI %s
\n
"
,
dev
->
slot_name
);
dbg
(
"found PCI-to-PCI bridge at PCI %s
\n
"
,
pci_name
(
dev
)
);
add_p2p_bridge
(
handle
,
seg
,
bus
,
device
,
function
);
}
...
...
@@ -693,7 +693,7 @@ static int power_on_slot (struct acpiphp_slot *slot)
if
(
func
->
flags
&
FUNC_HAS_PS0
)
{
dbg
(
"%s: executing _PS0 on %s
\n
"
,
__FUNCTION__
,
func
->
pci_dev
->
slot_name
);
pci_name
(
func
->
pci_dev
)
);
status
=
acpi_evaluate_object
(
func
->
handle
,
"_PS0"
,
NULL
,
NULL
);
if
(
ACPI_FAILURE
(
status
))
{
warn
(
"%s: _PS0 failed
\n
"
,
__FUNCTION__
);
...
...
drivers/pci/hotplug/acpiphp_pci.c
View file @
21f27357
...
...
@@ -212,7 +212,7 @@ static int detect_used_resource (struct acpiphp_bridge *bridge, struct pci_dev *
int
count
;
struct
pci_resource
*
res
;
dbg
(
"Device %s
\n
"
,
dev
->
slot_name
);
dbg
(
"Device %s
\n
"
,
pci_name
(
dev
)
);
for
(
count
=
0
;
address
[
count
];
count
++
)
{
/* for 6 BARs */
pci_read_config_dword
(
dev
,
address
[
count
],
&
bar
);
...
...
@@ -337,7 +337,7 @@ int acpiphp_init_func_resource (struct acpiphp_func *func)
struct
pci_dev
*
dev
;
dev
=
func
->
pci_dev
;
dbg
(
"Hot-pluggable device %s
\n
"
,
dev
->
slot_name
);
dbg
(
"Hot-pluggable device %s
\n
"
,
pci_name
(
dev
)
);
for
(
count
=
0
;
address
[
count
];
count
++
)
{
/* for 6 BARs */
pci_read_config_dword
(
dev
,
address
[
count
],
&
bar
);
...
...
drivers/pci/hotplug/cpci_hotplug.h
View file @
21f27357
...
...
@@ -75,7 +75,6 @@ extern int cpci_hp_register_controller(struct cpci_hp_controller *controller);
extern
int
cpci_hp_unregister_controller
(
struct
cpci_hp_controller
*
controller
);
extern
int
cpci_hp_register_bus
(
struct
pci_bus
*
bus
,
u8
first
,
u8
last
);
extern
int
cpci_hp_unregister_bus
(
struct
pci_bus
*
bus
);
extern
struct
slot
*
cpci_find_slot
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
);
extern
int
cpci_hp_start
(
void
);
extern
int
cpci_hp_stop
(
void
);
...
...
drivers/pci/hotplug/cpci_hotplug_core.c
View file @
21f27357
...
...
@@ -427,34 +427,6 @@ cpci_hp_unregister_bus(struct pci_bus *bus)
return
0
;
}
struct
slot
*
cpci_find_slot
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
)
{
struct
slot
*
slot
;
struct
slot
*
found
;
struct
list_head
*
tmp
;
if
(
!
bus
)
{
return
NULL
;
}
spin_lock
(
&
list_lock
);
if
(
!
slots
)
{
spin_unlock
(
&
list_lock
);
return
NULL
;
}
found
=
NULL
;
list_for_each
(
tmp
,
&
slot_list
)
{
slot
=
list_entry
(
tmp
,
struct
slot
,
slot_list
);
if
(
slot
->
bus
==
bus
&&
slot
->
devfn
==
devfn
)
{
found
=
slot
;
break
;
}
}
spin_unlock
(
&
list_lock
);
return
found
;
}
/* This is the interrupt mode interrupt handler */
irqreturn_t
cpci_hp_intr
(
int
irq
,
void
*
data
,
struct
pt_regs
*
regs
)
...
...
@@ -924,6 +896,5 @@ EXPORT_SYMBOL_GPL(cpci_hp_register_controller);
EXPORT_SYMBOL_GPL
(
cpci_hp_unregister_controller
);
EXPORT_SYMBOL_GPL
(
cpci_hp_register_bus
);
EXPORT_SYMBOL_GPL
(
cpci_hp_unregister_bus
);
EXPORT_SYMBOL_GPL
(
cpci_find_slot
);
EXPORT_SYMBOL_GPL
(
cpci_hp_start
);
EXPORT_SYMBOL_GPL
(
cpci_hp_stop
);
drivers/pci/hotplug/cpci_hotplug_pci.c
View file @
21f27357
...
...
@@ -448,7 +448,7 @@ static int cpci_configure_bridge(struct pci_bus* bus, struct pci_dev* dev)
}
static
int
configure_visit_pci_dev
(
struct
pci_dev_wrapped
*
wrapped_dev
,
struct
pci_bus_wrapped
*
wrapped_bus
)
struct
pci_bus_wrapped
*
wrapped_bus
)
{
int
rc
;
struct
pci_dev
*
dev
=
wrapped_dev
->
dev
;
...
...
@@ -461,8 +461,8 @@ static int configure_visit_pci_dev(struct pci_dev_wrapped *wrapped_dev,
* We need to fix up the hotplug representation with the Linux
* representation.
*/
slot
=
cpci_find_slot
(
dev
->
bus
,
dev
->
devfn
);
if
(
slot
)
{
if
(
wrapped_dev
->
data
)
{
slot
=
(
struct
slot
*
)
wrapped_dev
->
data
;
slot
->
dev
=
dev
;
}
...
...
@@ -494,9 +494,7 @@ static int unconfigure_visit_pci_dev_phase2(struct pci_dev_wrapped *wrapped_dev,
return
-
ENODEV
;
/* Remove the Linux representation */
if
(
pci_remove_device_safe
(
dev
)
==
0
)
{
kfree
(
dev
);
}
else
{
if
(
pci_remove_device_safe
(
dev
))
{
err
(
"Could not remove device
\n
"
);
return
-
1
;
}
...
...
@@ -504,8 +502,8 @@ static int unconfigure_visit_pci_dev_phase2(struct pci_dev_wrapped *wrapped_dev,
/*
* Now remove the hotplug representation.
*/
slot
=
cpci_find_slot
(
dev
->
bus
,
dev
->
devfn
);
if
(
slot
)
{
if
(
wrapped_dev
->
data
)
{
slot
=
(
struct
slot
*
)
wrapped_dev
->
data
;
slot
->
dev
=
NULL
;
}
else
{
dbg
(
"No hotplug representation for %02x:%02x.%x"
,
...
...
@@ -574,13 +572,18 @@ int cpci_configure_slot(struct slot* slot)
/* Still NULL? Well then scan for it! */
if
(
slot
->
dev
==
NULL
)
{
int
n
;
dbg
(
"pci_dev still null"
);
/*
* This will generate pci_dev structures for all functions, but
* we will only call this case when lookup fails.
*/
slot
->
dev
=
pci_scan_slot
(
slot
->
bus
,
slot
->
devfn
);
n
=
pci_scan_slot
(
slot
->
bus
,
slot
->
devfn
);
dbg
(
"%s: pci_scan_slot returned %d"
,
__FUNCTION__
,
n
);
if
(
n
>
0
)
pci_bus_add_devices
(
slot
->
bus
);
slot
->
dev
=
pci_find_slot
(
slot
->
bus
->
number
,
slot
->
devfn
);
if
(
slot
->
dev
==
NULL
)
{
err
(
"Could not find PCI device for slot %02x"
,
slot
->
number
);
return
0
;
...
...
@@ -603,6 +606,10 @@ int cpci_configure_slot(struct slot* slot)
continue
;
wrapped_dev
.
dev
=
dev
;
wrapped_bus
.
bus
=
slot
->
dev
->
bus
;
if
(
i
)
wrapped_dev
.
data
=
NULL
;
else
wrapped_dev
.
data
=
(
void
*
)
slot
;
rc
=
pci_visit_dev
(
&
configure_functions
,
&
wrapped_dev
,
&
wrapped_bus
);
}
}
...
...
@@ -635,9 +642,14 @@ int cpci_unconfigure_slot(struct slot* slot)
if
(
dev
)
{
wrapped_dev
.
dev
=
dev
;
wrapped_bus
.
bus
=
dev
->
bus
;
if
(
i
)
wrapped_dev
.
data
=
NULL
;
else
wrapped_dev
.
data
=
(
void
*
)
slot
;
dbg
(
"%s - unconfigure phase 2"
,
__FUNCTION__
);
rc
=
pci_visit_dev
(
&
unconfigure_functions_phase2
,
&
wrapped_dev
,
&
wrapped_bus
);
&
wrapped_dev
,
&
wrapped_bus
);
if
(
rc
)
break
;
}
...
...
drivers/pci/pci.c
View file @
21f27357
...
...
@@ -506,7 +506,7 @@ int pci_request_region(struct pci_dev *pdev, int bar, char *res_name)
pci_resource_flags
(
pdev
,
bar
)
&
IORESOURCE_IO
?
"I/O"
:
"mem"
,
bar
+
1
,
/* PCI BAR # */
pci_resource_len
(
pdev
,
bar
),
pci_resource_start
(
pdev
,
bar
),
p
dev
->
slot_name
);
p
ci_name
(
pdev
)
);
return
-
EBUSY
;
}
...
...
@@ -555,7 +555,7 @@ int pci_request_regions(struct pci_dev *pdev, char *res_name)
pci_resource_flags
(
pdev
,
i
)
&
IORESOURCE_IO
?
"I/O"
:
"mem"
,
i
+
1
,
/* PCI BAR # */
pci_resource_len
(
pdev
,
i
),
pci_resource_start
(
pdev
,
i
),
p
dev
->
slot_name
);
p
ci_name
(
pdev
)
);
while
(
--
i
>=
0
)
pci_release_region
(
pdev
,
i
);
...
...
@@ -576,7 +576,7 @@ pci_set_master(struct pci_dev *dev)
pci_read_config_word
(
dev
,
PCI_COMMAND
,
&
cmd
);
if
(
!
(
cmd
&
PCI_COMMAND_MASTER
))
{
DBG
(
"PCI: Enabling bus mastering for device %s
\n
"
,
dev
->
slot_name
);
DBG
(
"PCI: Enabling bus mastering for device %s
\n
"
,
pci_name
(
dev
)
);
cmd
|=
PCI_COMMAND_MASTER
;
pci_write_config_word
(
dev
,
PCI_COMMAND
,
cmd
);
}
...
...
@@ -620,7 +620,7 @@ pci_generic_prep_mwi(struct pci_dev *dev)
return
0
;
printk
(
KERN_WARNING
"PCI: cache line size of %d is not supported "
"by device %s
\n
"
,
pci_cache_line_size
<<
2
,
dev
->
slot_name
);
"by device %s
\n
"
,
pci_cache_line_size
<<
2
,
pci_name
(
dev
)
);
return
-
EINVAL
;
}
...
...
@@ -653,7 +653,7 @@ pci_set_mwi(struct pci_dev *dev)
pci_read_config_word
(
dev
,
PCI_COMMAND
,
&
cmd
);
if
(
!
(
cmd
&
PCI_COMMAND_INVALIDATE
))
{
DBG
(
"PCI: Enabling Mem-Wr-Inval for device %s
\n
"
,
dev
->
slot_name
);
DBG
(
"PCI: Enabling Mem-Wr-Inval for device %s
\n
"
,
pci_name
(
dev
)
);
cmd
|=
PCI_COMMAND_INVALIDATE
;
pci_write_config_word
(
dev
,
PCI_COMMAND
,
cmd
);
}
...
...
drivers/pci/pool.c
View file @
21f27357
...
...
@@ -233,7 +233,7 @@ pci_pool_destroy (struct pci_pool *pool)
struct
pci_page
,
page_list
);
if
(
is_page_busy
(
pool
->
blocks_per_page
,
page
->
bitmap
))
{
printk
(
KERN_ERR
"pci_pool_destroy %s/%s, %p busy
\n
"
,
pool
->
dev
?
p
ool
->
dev
->
slot_name
:
NULL
,
pool
->
dev
?
p
ci_name
(
pool
->
dev
)
:
NULL
,
pool
->
name
,
page
->
vaddr
);
/* leak the still-in-use consistent memory */
list_del
(
&
page
->
page_list
);
...
...
@@ -359,7 +359,7 @@ pci_pool_free (struct pci_pool *pool, void *vaddr, dma_addr_t dma)
if
((
page
=
pool_find_page
(
pool
,
dma
))
==
0
)
{
printk
(
KERN_ERR
"pci_pool_free %s/%s, %p/%lx (bad dma)
\n
"
,
pool
->
dev
?
p
ool
->
dev
->
slot_name
:
NULL
,
pool
->
dev
?
p
ci_name
(
pool
->
dev
)
:
NULL
,
pool
->
name
,
vaddr
,
(
unsigned
long
)
dma
);
return
;
}
...
...
@@ -372,13 +372,13 @@ pci_pool_free (struct pci_pool *pool, void *vaddr, dma_addr_t dma)
#ifdef CONFIG_DEBUG_SLAB
if
(((
dma
-
page
->
dma
)
+
(
void
*
)
page
->
vaddr
)
!=
vaddr
)
{
printk
(
KERN_ERR
"pci_pool_free %s/%s, %p (bad vaddr)/%Lx
\n
"
,
pool
->
dev
?
p
ool
->
dev
->
slot_name
:
NULL
,
pool
->
dev
?
p
ci_name
(
pool
->
dev
)
:
NULL
,
pool
->
name
,
vaddr
,
(
unsigned
long
long
)
dma
);
return
;
}
if
(
page
->
bitmap
[
map
]
&
(
1UL
<<
block
))
{
printk
(
KERN_ERR
"pci_pool_free %s/%s, dma %Lx already free
\n
"
,
pool
->
dev
?
p
ool
->
dev
->
slot_name
:
NULL
,
pool
->
dev
?
p
ci_name
(
pool
->
dev
)
:
NULL
,
pool
->
name
,
(
unsigned
long
long
)
dma
);
return
;
}
...
...
drivers/pci/quirks.c
View file @
21f27357
...
...
@@ -33,7 +33,7 @@ static void __devinit quirk_passive_release(struct pci_dev *dev)
while
((
d
=
pci_find_device
(
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82371SB_0
,
d
)))
{
pci_read_config_byte
(
d
,
0x82
,
&
dlc
);
if
(
!
(
dlc
&
1
<<
1
))
{
printk
(
KERN_ERR
"PCI: PIIX3: Enabling Passive Release on %s
\n
"
,
d
->
slot_name
);
printk
(
KERN_ERR
"PCI: PIIX3: Enabling Passive Release on %s
\n
"
,
pci_name
(
d
)
);
dlc
|=
1
<<
1
;
pci_write_config_byte
(
d
,
0x82
,
dlc
);
}
...
...
@@ -437,7 +437,7 @@ static void __devinit quirk_via_irqpic(struct pci_dev *dev)
if
(
new_irq
!=
irq
)
{
printk
(
KERN_INFO
"PCI: Via IRQ fixup for %s, from %d to %d
\n
"
,
dev
->
slot_name
,
irq
,
new_irq
);
pci_name
(
dev
)
,
irq
,
new_irq
);
udelay
(
15
);
pci_write_config_byte
(
dev
,
PCI_INTERRUPT_LINE
,
new_irq
);
...
...
@@ -598,7 +598,7 @@ static void __devinit quirk_ide_bases(struct pci_dev *dev)
return
;
printk
(
KERN_INFO
"PCI: Ignoring BAR%d-%d of IDE controller %s
\n
"
,
first_bar
,
last_bar
,
dev
->
slot_name
);
first_bar
,
last_bar
,
pci_name
(
dev
)
);
}
/*
...
...
@@ -856,7 +856,7 @@ static void pci_do_fixups(struct pci_dev *dev, int pass, struct pci_fixup *f)
(
f
->
vendor
==
dev
->
vendor
||
f
->
vendor
==
(
u16
)
PCI_ANY_ID
)
&&
(
f
->
device
==
dev
->
device
||
f
->
device
==
(
u16
)
PCI_ANY_ID
))
{
#ifdef DEBUG
printk
(
KERN_INFO
"PCI: Calling quirk %p for %s
\n
"
,
f
->
hook
,
dev
->
slot_name
);
printk
(
KERN_INFO
"PCI: Calling quirk %p for %s
\n
"
,
f
->
hook
,
pci_name
(
dev
)
);
#endif
f
->
hook
(
dev
);
}
...
...
drivers/pci/remove.c
0 → 100644
View file @
21f27357
#include <linux/pci.h>
#include <linux/module.h>
#include "pci.h"
#undef DEBUG
#ifdef DEBUG
#define DBG(x...) printk(x)
#else
#define DBG(x...)
#endif
static
void
pci_free_resources
(
struct
pci_dev
*
dev
)
{
int
i
;
for
(
i
=
0
;
i
<
PCI_NUM_RESOURCES
;
i
++
)
{
struct
resource
*
res
=
dev
->
resource
+
i
;
if
(
res
->
parent
)
release_resource
(
res
);
}
}
static
void
pci_destroy_dev
(
struct
pci_dev
*
dev
)
{
pci_proc_detach_device
(
dev
);
device_unregister
(
&
dev
->
dev
);
/* Remove the device from the device lists, and prevent any further
* list accesses from this device */
spin_lock
(
&
pci_bus_lock
);
list_del
(
&
dev
->
bus_list
);
list_del
(
&
dev
->
global_list
);
dev
->
bus_list
.
next
=
dev
->
bus_list
.
prev
=
NULL
;
dev
->
global_list
.
next
=
dev
->
global_list
.
prev
=
NULL
;
spin_unlock
(
&
pci_bus_lock
);
pci_free_resources
(
dev
);
pci_dev_put
(
dev
);
}
/**
* pci_remove_device_safe - remove an unused hotplug device
* @dev: the device to remove
*
* Delete the device structure from the device lists and
* notify userspace (/sbin/hotplug), but only if the device
* in question is not being used by a driver.
* Returns 0 on success.
*/
int
pci_remove_device_safe
(
struct
pci_dev
*
dev
)
{
if
(
pci_dev_driver
(
dev
))
return
-
EBUSY
;
pci_destroy_dev
(
dev
);
return
0
;
}
EXPORT_SYMBOL
(
pci_remove_device_safe
);
/**
* pci_remove_bus_device - remove a PCI device and any children
* @dev: the device to remove
*
* Remove a PCI device from the device lists, informing the drivers
* that the device has been removed. We also remove any subordinate
* buses and children in a depth-first manner.
*
* For each device we remove, delete the device structure from the
* device lists, remove the /proc entry, and notify userspace
* (/sbin/hotplug).
*/
void
pci_remove_bus_device
(
struct
pci_dev
*
dev
)
{
if
(
dev
->
subordinate
)
{
struct
pci_bus
*
b
=
dev
->
subordinate
;
pci_remove_behind_bridge
(
dev
);
pci_proc_detach_bus
(
b
);
spin_lock
(
&
pci_bus_lock
);
list_del
(
&
b
->
node
);
spin_unlock
(
&
pci_bus_lock
);
kfree
(
b
);
dev
->
subordinate
=
NULL
;
}
pci_destroy_dev
(
dev
);
}
/**
* pci_remove_behind_bridge - remove all devices behind a PCI bridge
* @dev: PCI bridge device
*
* Remove all devices on the bus, except for the parent bridge.
* This also removes any child buses, and any devices they may
* contain in a depth-first manner.
*/
void
pci_remove_behind_bridge
(
struct
pci_dev
*
dev
)
{
struct
list_head
*
l
,
*
n
;
if
(
dev
->
subordinate
)
{
list_for_each_safe
(
l
,
n
,
&
dev
->
subordinate
->
devices
)
{
struct
pci_dev
*
dev
=
pci_dev_b
(
l
);
pci_remove_bus_device
(
dev
);
}
}
}
EXPORT_SYMBOL
(
pci_remove_bus_device
);
EXPORT_SYMBOL
(
pci_remove_behind_bridge
);
drivers/pci/setup-bus.c
View file @
21f27357
...
...
@@ -81,7 +81,7 @@ pci_setup_cardbus(struct pci_bus *bus)
struct
pci_bus_region
region
;
printk
(
"PCI: Bus %d, cardbus bridge: %s
\n
"
,
bus
->
number
,
bridge
->
slot_name
);
bus
->
number
,
pci_name
(
bridge
)
);
pcibios_resource_to_bus
(
bridge
,
&
region
,
bus
->
resource
[
0
]);
if
(
bus
->
resource
[
0
]
->
flags
&
IORESOURCE_IO
)
{
...
...
@@ -344,7 +344,7 @@ pbus_size_mem(struct pci_bus *bus, unsigned long mask, unsigned long type)
if
(
order
>
11
)
{
printk
(
KERN_WARNING
"PCI: region %s/%d "
"too large: %lx-%lx
\n
"
,
dev
->
slot_name
,
i
,
r
->
start
,
r
->
end
);
pci_name
(
dev
)
,
i
,
r
->
start
,
r
->
end
);
r
->
flags
=
0
;
continue
;
}
...
...
@@ -513,7 +513,7 @@ pci_bus_assign_resources(struct pci_bus *bus)
default:
printk
(
KERN_INFO
"PCI: not setting up bridge %s "
"for bus %d
\n
"
,
dev
->
slot_name
,
b
->
number
);
"for bus %d
\n
"
,
pci_name
(
dev
)
,
b
->
number
);
break
;
}
}
...
...
drivers/pci/setup-res.c
View file @
21f27357
...
...
@@ -68,7 +68,7 @@ pci_update_resource(struct pci_dev *dev, struct resource *res, int resno)
if
((
new
^
check
)
&
mask
)
{
printk
(
KERN_ERR
"PCI: Error while updating region "
"%s/%d (%08x != %08x)
\n
"
,
dev
->
slot_name
,
resno
,
"%s/%d (%08x != %08x)
\n
"
,
pci_name
(
dev
)
,
resno
,
new
,
check
);
}
...
...
@@ -80,7 +80,7 @@ pci_update_resource(struct pci_dev *dev, struct resource *res, int resno)
if
(
check
!=
new
)
{
printk
(
KERN_ERR
"PCI: Error updating region "
"%s/%d (high %08x != %08x)
\n
"
,
dev
->
slot_name
,
resno
,
new
,
check
);
pci_name
(
dev
)
,
resno
,
new
,
check
);
}
}
}
...
...
@@ -101,7 +101,7 @@ pci_claim_resource(struct pci_dev *dev, int resource)
printk
(
KERN_ERR
"PCI: %s region %d of %s %s [%lx:%lx]
\n
"
,
root
?
"Address space collision on"
:
"No parent found for"
,
resource
,
dtype
,
dev
->
slot_name
,
res
->
start
,
res
->
end
);
resource
,
dtype
,
pci_name
(
dev
)
,
res
->
start
,
res
->
end
);
}
return
err
;
...
...
@@ -139,7 +139,7 @@ int pci_assign_resource(struct pci_dev *dev, int resno)
if
(
ret
)
{
printk
(
KERN_ERR
"PCI: Failed to allocate resource %d(%lx-%lx) for %s
\n
"
,
resno
,
res
->
start
,
res
->
end
,
dev
->
slot_name
);
resno
,
res
->
start
,
res
->
end
,
pci_name
(
dev
)
);
}
else
if
(
resno
<
PCI_BRIDGE_RESOURCES
)
{
pci_update_resource
(
dev
,
res
,
resno
);
}
...
...
include/linux/pci.h
View file @
21f27357
...
...
@@ -715,7 +715,6 @@ static inline int pci_dac_set_dma_mask(struct pci_dev *dev, u64 mask) { return -
static
inline
int
pci_assign_resource
(
struct
pci_dev
*
dev
,
int
i
)
{
return
-
EBUSY
;}
static
inline
int
pci_register_driver
(
struct
pci_driver
*
drv
)
{
return
0
;}
static
inline
void
pci_unregister_driver
(
struct
pci_driver
*
drv
)
{
}
static
inline
int
scsi_to_pci_dma_dir
(
unsigned
char
scsi_dir
)
{
return
scsi_dir
;
}
static
inline
int
pci_find_capability
(
struct
pci_dev
*
dev
,
int
cap
)
{
return
0
;
}
static
inline
const
struct
pci_device_id
*
pci_match_device
(
const
struct
pci_device_id
*
ids
,
const
struct
pci_dev
*
dev
)
{
return
NULL
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment