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
Kirill Smelkov
linux
Commits
346fced8
Commit
346fced8
authored
Jul 05, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/pci-2.6
parents
17af691c
43a6b760
Changes
20
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
205 additions
and
166 deletions
+205
-166
arch/i386/kernel/cpu/cpufreq/gx-suspmod.c
arch/i386/kernel/cpu/cpufreq/gx-suspmod.c
+1
-1
arch/i386/pci/common.c
arch/i386/pci/common.c
+1
-0
arch/i386/pci/i386.c
arch/i386/pci/i386.c
+8
-3
drivers/char/hw_random.c
drivers/char/hw_random.c
+1
-1
drivers/char/watchdog/i8xx_tco.c
drivers/char/watchdog/i8xx_tco.c
+1
-1
drivers/ide/setup-pci.c
drivers/ide/setup-pci.c
+1
-1
drivers/parport/parport_pc.c
drivers/parport/parport_pc.c
+1
-1
drivers/pci/Makefile
drivers/pci/Makefile
+1
-0
drivers/pci/hotplug.c
drivers/pci/hotplug.c
+1
-1
drivers/pci/pci-driver.c
drivers/pci/pci-driver.c
+71
-125
drivers/pci/pci.c
drivers/pci/pci.c
+0
-6
drivers/pci/pcie/portdrv.h
drivers/pci/pcie/portdrv.h
+5
-0
drivers/pci/pcie/portdrv_core.c
drivers/pci/pcie/portdrv_core.c
+8
-0
drivers/pci/pcie/portdrv_pci.c
drivers/pci/pcie/portdrv_pci.c
+78
-1
drivers/pci/probe.c
drivers/pci/probe.c
+20
-4
drivers/pci/quirks.c
drivers/pci/quirks.c
+1
-0
drivers/pci/setup-bus.c
drivers/pci/setup-bus.c
+2
-0
include/linux/pci-dynids.h
include/linux/pci-dynids.h
+0
-18
include/linux/pci.h
include/linux/pci.h
+3
-2
sound/pci/bt87x.c
sound/pci/bt87x.c
+1
-1
No files found.
arch/i386/kernel/cpu/cpufreq/gx-suspmod.c
View file @
346fced8
...
...
@@ -190,7 +190,7 @@ static __init struct pci_dev *gx_detect_chipset(void)
/* detect which companion chip is used */
while
((
gx_pci
=
pci_get_device
(
PCI_ANY_ID
,
PCI_ANY_ID
,
gx_pci
))
!=
NULL
)
{
if
((
pci_match_
device
(
gx_chipset_tbl
,
gx_pci
))
!=
NULL
)
{
if
((
pci_match_
id
(
gx_chipset_tbl
,
gx_pci
))
!=
NULL
)
{
return
gx_pci
;
}
}
...
...
arch/i386/pci/common.c
View file @
346fced8
...
...
@@ -165,6 +165,7 @@ static int __init pcibios_init(void)
if
((
pci_probe
&
PCI_BIOS_SORT
)
&&
!
(
pci_probe
&
PCI_NO_SORT
))
pcibios_sort
();
#endif
pci_assign_unassigned_resources
();
return
0
;
}
...
...
arch/i386/pci/i386.c
View file @
346fced8
...
...
@@ -106,11 +106,16 @@ static void __init pcibios_allocate_bus_resources(struct list_head *bus_list)
if
((
dev
=
bus
->
self
))
{
for
(
idx
=
PCI_BRIDGE_RESOURCES
;
idx
<
PCI_NUM_RESOURCES
;
idx
++
)
{
r
=
&
dev
->
resource
[
idx
];
if
(
!
r
->
start
)
if
(
!
r
->
flags
)
continue
;
pr
=
pci_find_parent_resource
(
dev
,
r
);
if
(
!
pr
||
request_resource
(
pr
,
r
)
<
0
)
if
(
!
r
->
start
||
!
pr
||
request_resource
(
pr
,
r
)
<
0
)
{
printk
(
KERN_ERR
"PCI: Cannot allocate resource region %d of bridge %s
\n
"
,
idx
,
pci_name
(
dev
));
/* Something is wrong with the region.
Invalidate the resource to prevent child
resource allocations in this range. */
r
->
flags
=
0
;
}
}
}
pcibios_allocate_bus_resources
(
&
bus
->
children
);
...
...
@@ -227,7 +232,7 @@ int pcibios_enable_resources(struct pci_dev *dev, int mask)
pci_read_config_word
(
dev
,
PCI_COMMAND
,
&
cmd
);
old_cmd
=
cmd
;
for
(
idx
=
0
;
idx
<
6
;
idx
++
)
{
for
(
idx
=
0
;
idx
<
PCI_NUM_RESOURCES
;
idx
++
)
{
/* Only set up the requested stuff */
if
(
!
(
mask
&
(
1
<<
idx
)))
continue
;
...
...
drivers/char/hw_random.c
View file @
346fced8
...
...
@@ -579,7 +579,7 @@ static int __init rng_init (void)
/* Probe for Intel, AMD RNGs */
for_each_pci_dev
(
pdev
)
{
ent
=
pci_match_
device
(
rng_pci_tbl
,
pdev
);
ent
=
pci_match_
id
(
rng_pci_tbl
,
pdev
);
if
(
ent
)
{
rng_ops
=
&
rng_vendor_ops
[
ent
->
driver_data
];
goto
match
;
...
...
drivers/char/watchdog/i8xx_tco.c
View file @
346fced8
...
...
@@ -401,7 +401,7 @@ static unsigned char __init i8xx_tco_getdevice (void)
*/
while
((
dev
=
pci_find_device
(
PCI_ANY_ID
,
PCI_ANY_ID
,
dev
))
!=
NULL
)
{
if
(
pci_match_
device
(
i8xx_tco_pci_tbl
,
dev
))
{
if
(
pci_match_
id
(
i8xx_tco_pci_tbl
,
dev
))
{
i8xx_tco_pci
=
dev
;
break
;
}
...
...
drivers/ide/setup-pci.c
View file @
346fced8
...
...
@@ -847,7 +847,7 @@ static int __init ide_scan_pcidev(struct pci_dev *dev)
d
=
list_entry
(
l
,
struct
pci_driver
,
node
);
if
(
d
->
id_table
)
{
const
struct
pci_device_id
*
id
=
pci_match_
device
(
d
->
id_table
,
dev
);
const
struct
pci_device_id
*
id
=
pci_match_
id
(
d
->
id_table
,
dev
);
if
(
id
!=
NULL
)
{
if
(
d
->
probe
(
dev
,
id
)
>=
0
)
...
...
drivers/parport/parport_pc.c
View file @
346fced8
...
...
@@ -3008,7 +3008,7 @@ static int __init parport_pc_init_superio (int autoirq, int autodma)
int
ret
=
0
;
while
((
pdev
=
pci_find_device
(
PCI_ANY_ID
,
PCI_ANY_ID
,
pdev
))
!=
NULL
)
{
id
=
pci_match_
device
(
parport_pc_pci_tbl
,
pdev
);
id
=
pci_match_
id
(
parport_pc_pci_tbl
,
pdev
);
if
(
id
==
NULL
||
id
->
driver_data
>=
last_sio
)
continue
;
...
...
drivers/pci/Makefile
View file @
346fced8
...
...
@@ -19,6 +19,7 @@ obj-$(CONFIG_HOTPLUG_PCI) += hotplug/
#
# Some architectures use the generic PCI setup functions
#
obj-$(CONFIG_X86)
+=
setup-bus.o
obj-$(CONFIG_ALPHA)
+=
setup-bus.o setup-irq.o
obj-$(CONFIG_ARM)
+=
setup-bus.o setup-irq.o
obj-$(CONFIG_PARISC)
+=
setup-bus.o
...
...
drivers/pci/hotplug.c
View file @
346fced8
...
...
@@ -54,7 +54,7 @@ int pci_hotplug (struct device *dev, char **envp, int num_envp,
envp
[
i
++
]
=
scratch
;
length
+=
scnprintf
(
scratch
,
buffer_size
-
length
,
"MODALIAS=pci:v%08Xd%08Xsv%08Xsd%08Xbc%02Xsc%02Xi%02x
\n
"
,
"MODALIAS=pci:v%08Xd%08Xsv%08Xsd%08Xbc%02Xsc%02Xi%02x"
,
pdev
->
vendor
,
pdev
->
device
,
pdev
->
subsystem_vendor
,
pdev
->
subsystem_device
,
(
u8
)(
pdev
->
class
>>
16
),
(
u8
)(
pdev
->
class
>>
8
),
...
...
drivers/pci/pci-driver.c
View file @
346fced8
...
...
@@ -7,7 +7,6 @@
#include <linux/module.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/pci-dynids.h>
#include "pci.h"
/*
...
...
@@ -19,35 +18,11 @@
*/
#ifdef CONFIG_HOTPLUG
/**
* pci_device_probe_dynamic()
*
* Walk the dynamic ID list looking for a match.
* returns 0 and sets pci_dev->driver when drv claims pci_dev, else error.
*/
static
int
pci_device_probe_dynamic
(
struct
pci_driver
*
drv
,
struct
pci_dev
*
pci_dev
)
{
int
error
=
-
ENODEV
;
struct
list_head
*
pos
;
struct
dynid
*
dynid
;
spin_lock
(
&
drv
->
dynids
.
lock
);
list_for_each
(
pos
,
&
drv
->
dynids
.
list
)
{
dynid
=
list_entry
(
pos
,
struct
dynid
,
node
);
if
(
pci_match_one_device
(
&
dynid
->
id
,
pci_dev
))
{
spin_unlock
(
&
drv
->
dynids
.
lock
);
error
=
drv
->
probe
(
pci_dev
,
&
dynid
->
id
);
if
(
error
>=
0
)
{
pci_dev
->
driver
=
drv
;
return
0
;
}
return
error
;
}
}
spin_unlock
(
&
drv
->
dynids
.
lock
);
return
error
;
}
struct
pci_dynid
{
struct
list_head
node
;
struct
pci_device_id
id
;
};
/**
* store_new_id
...
...
@@ -58,8 +33,7 @@ pci_device_probe_dynamic(struct pci_driver *drv, struct pci_dev *pci_dev)
static
inline
ssize_t
store_new_id
(
struct
device_driver
*
driver
,
const
char
*
buf
,
size_t
count
)
{
struct
dynid
*
dynid
;
struct
bus_type
*
bus
;
struct
pci_dynid
*
dynid
;
struct
pci_driver
*
pdrv
=
to_pci_driver
(
driver
);
__u32
vendor
=
PCI_ANY_ID
,
device
=
PCI_ANY_ID
,
subvendor
=
PCI_ANY_ID
,
subdevice
=
PCI_ANY_ID
,
class
=
0
,
class_mask
=
0
;
...
...
@@ -91,37 +65,22 @@ store_new_id(struct device_driver *driver, const char *buf, size_t count)
list_add_tail
(
&
pdrv
->
dynids
.
list
,
&
dynid
->
node
);
spin_unlock
(
&
pdrv
->
dynids
.
lock
);
bus
=
get_bus
(
pdrv
->
driver
.
bus
);
if
(
bus
)
{
if
(
get_driver
(
&
pdrv
->
driver
))
{
down_write
(
&
bus
->
subsys
.
rwsem
);
driver_attach
(
&
pdrv
->
driver
);
up_write
(
&
bus
->
subsys
.
rwsem
);
put_driver
(
&
pdrv
->
driver
);
}
put_bus
(
bus
);
if
(
get_driver
(
&
pdrv
->
driver
))
{
driver_attach
(
&
pdrv
->
driver
);
put_driver
(
&
pdrv
->
driver
);
}
return
count
;
}
static
DRIVER_ATTR
(
new_id
,
S_IWUSR
,
NULL
,
store_new_id
);
static
inline
void
pci_init_dynids
(
struct
pci_dynids
*
dynids
)
{
spin_lock_init
(
&
dynids
->
lock
);
INIT_LIST_HEAD
(
&
dynids
->
list
);
}
static
void
pci_free_dynids
(
struct
pci_driver
*
drv
)
{
struct
list_head
*
pos
,
*
n
;
struct
dynid
*
dynid
;
struct
pci_dynid
*
dynid
,
*
n
;
spin_lock
(
&
drv
->
dynids
.
lock
);
list_for_each_safe
(
pos
,
n
,
&
drv
->
dynids
.
list
)
{
dynid
=
list_entry
(
pos
,
struct
dynid
,
node
);
list_for_each_entry_safe
(
dynid
,
n
,
&
drv
->
dynids
.
list
,
node
)
{
list_del
(
&
dynid
->
node
);
kfree
(
dynid
);
}
...
...
@@ -138,83 +97,70 @@ pci_create_newid_file(struct pci_driver *drv)
return
error
;
}
static
int
pci_bus_match_dynids
(
const
struct
pci_dev
*
pci_dev
,
struct
pci_driver
*
pci_drv
)
{
struct
list_head
*
pos
;
struct
dynid
*
dynid
;
spin_lock
(
&
pci_drv
->
dynids
.
lock
);
list_for_each
(
pos
,
&
pci_drv
->
dynids
.
list
)
{
dynid
=
list_entry
(
pos
,
struct
dynid
,
node
);
if
(
pci_match_one_device
(
&
dynid
->
id
,
pci_dev
))
{
spin_unlock
(
&
pci_drv
->
dynids
.
lock
);
return
1
;
}
}
spin_unlock
(
&
pci_drv
->
dynids
.
lock
);
return
0
;
}
#else
/* !CONFIG_HOTPLUG */
static
inline
int
pci_device_probe_dynamic
(
struct
pci_driver
*
drv
,
struct
pci_dev
*
pci_dev
)
{
return
-
ENODEV
;
}
static
inline
void
pci_init_dynids
(
struct
pci_dynids
*
dynids
)
{}
static
inline
void
pci_free_dynids
(
struct
pci_driver
*
drv
)
{}
static
inline
int
pci_create_newid_file
(
struct
pci_driver
*
drv
)
{
return
0
;
}
static
inline
int
pci_bus_match_dynids
(
const
struct
pci_dev
*
pci_dev
,
struct
pci_driver
*
pci_drv
)
{
return
0
;
}
#endif
/**
* pci_match_device - Tell if a PCI device structure has a matching
* PCI device id structure
* pci_match_id - See if a pci device matches a given pci_id table
* @ids: array of PCI device id structures to search in
* @dev: the PCI device structure to match against
*
* @dev: the PCI device structure to match against
.
*
* Used by a driver to check whether a PCI device present in the
* system is in its list of supported devices.Returns the matching
* system is in its list of supported devices.
Returns the matching
* pci_device_id structure or %NULL if there is no match.
*
* Depreciated, don't use this as it will not catch any dynamic ids
* that a driver might want to check for.
*/
const
struct
pci_device_id
*
pci_match_device
(
const
struct
pci_device_id
*
ids
,
const
struct
pci_dev
*
dev
)
const
struct
pci_device_id
*
pci_match_id
(
const
struct
pci_device_id
*
ids
,
struct
pci_dev
*
dev
)
{
while
(
ids
->
vendor
||
ids
->
subvendor
||
ids
->
class_mask
)
{
if
(
pci_match_one_device
(
ids
,
dev
))
return
ids
;
ids
++
;
if
(
ids
)
{
while
(
ids
->
vendor
||
ids
->
subvendor
||
ids
->
class_mask
)
{
if
(
pci_match_one_device
(
ids
,
dev
))
return
ids
;
ids
++
;
}
}
return
NULL
;
}
/**
* pci_device_probe_static()
*
* returns 0 and sets pci_dev->driver when drv claims pci_dev, else error.
* pci_match_device - Tell if a PCI device structure has a matching
* PCI device id structure
* @ids: array of PCI device id structures to search in
* @dev: the PCI device structure to match against
* @drv: the PCI driver to match against
*
* Used by a driver to check whether a PCI device present in the
* system is in its list of supported devices. Returns the matching
* pci_device_id structure or %NULL if there is no match.
*/
static
int
pci_device_probe_static
(
struct
pci_driver
*
drv
,
struct
pci_dev
*
pci_dev
)
{
int
error
=
-
ENODEV
;
const
struct
pci_device_id
*
pci_match_device
(
struct
pci_driver
*
drv
,
struct
pci_dev
*
dev
)
{
const
struct
pci_device_id
*
id
;
struct
pci_dynid
*
dynid
;
if
(
!
drv
->
id_table
)
return
error
;
id
=
pci_match_device
(
drv
->
id_table
,
pci_dev
);
id
=
pci_match_id
(
drv
->
id_table
,
dev
);
if
(
id
)
error
=
drv
->
probe
(
pci_dev
,
id
);
if
(
error
>=
0
)
{
pci_dev
->
driver
=
drv
;
error
=
0
;
return
id
;
/* static ids didn't match, lets look at the dynamic ones */
spin_lock
(
&
drv
->
dynids
.
lock
);
list_for_each_entry
(
dynid
,
&
drv
->
dynids
.
list
,
node
)
{
if
(
pci_match_one_device
(
&
dynid
->
id
,
dev
))
{
spin_unlock
(
&
drv
->
dynids
.
lock
);
return
&
dynid
->
id
;
}
}
return
error
;
spin_unlock
(
&
drv
->
dynids
.
lock
);
return
NULL
;
}
/**
...
...
@@ -225,13 +171,20 @@ pci_device_probe_static(struct pci_driver *drv, struct pci_dev *pci_dev)
*/
static
int
__pci_device_probe
(
struct
pci_driver
*
drv
,
struct
pci_dev
*
pci_dev
)
{
{
const
struct
pci_device_id
*
id
;
int
error
=
0
;
if
(
!
pci_dev
->
driver
&&
drv
->
probe
)
{
error
=
pci_device_probe_static
(
drv
,
pci_dev
);
if
(
error
==
-
ENODEV
)
error
=
pci_device_probe_dynamic
(
drv
,
pci_dev
);
error
=
-
ENODEV
;
id
=
pci_match_device
(
drv
,
pci_dev
);
if
(
id
)
error
=
drv
->
probe
(
pci_dev
,
id
);
if
(
error
>=
0
)
{
pci_dev
->
driver
=
drv
;
error
=
0
;
}
}
return
error
;
}
...
...
@@ -371,12 +324,6 @@ static struct kobj_type pci_driver_kobj_type = {
.
sysfs_ops
=
&
pci_driver_sysfs_ops
,
};
static
int
pci_populate_driver_dir
(
struct
pci_driver
*
drv
)
{
return
pci_create_newid_file
(
drv
);
}
/**
* pci_register_driver - register a new pci driver
* @drv: the driver structure to register
...
...
@@ -401,13 +348,15 @@ int pci_register_driver(struct pci_driver *drv)
drv
->
driver
.
shutdown
=
pci_device_shutdown
;
drv
->
driver
.
owner
=
drv
->
owner
;
drv
->
driver
.
kobj
.
ktype
=
&
pci_driver_kobj_type
;
pci_init_dynids
(
&
drv
->
dynids
);
spin_lock_init
(
&
drv
->
dynids
.
lock
);
INIT_LIST_HEAD
(
&
drv
->
dynids
.
list
);
/* register with core */
error
=
driver_register
(
&
drv
->
driver
);
if
(
!
error
)
pci_populate_driver_dir
(
drv
);
error
=
pci_create_newid_file
(
drv
);
return
error
;
}
...
...
@@ -463,21 +412,17 @@ pci_dev_driver(const struct pci_dev *dev)
* system is in its list of supported devices.Returns the matching
* pci_device_id structure or %NULL if there is no match.
*/
static
int
pci_bus_match
(
struct
device
*
dev
,
struct
device_driver
*
drv
)
static
int
pci_bus_match
(
struct
device
*
dev
,
struct
device_driver
*
drv
)
{
const
struct
pci_dev
*
pci_dev
=
to_pci_dev
(
dev
);
struct
pci_driver
*
pci_drv
=
to_pci_driver
(
drv
);
const
struct
pci_device_id
*
ids
=
pci_drv
->
id_table
;
struct
pci_dev
*
pci_dev
=
to_pci_dev
(
dev
);
struct
pci_driver
*
pci_drv
=
to_pci_driver
(
drv
);
const
struct
pci_device_id
*
found_id
;
if
(
!
ids
)
return
0
;
found_id
=
pci_match_device
(
ids
,
pci_dev
);
found_id
=
pci_match_device
(
pci_drv
,
pci_dev
);
if
(
found_id
)
return
1
;
return
pci_bus_match_dynids
(
pci_dev
,
pci_drv
)
;
return
0
;
}
/**
...
...
@@ -536,6 +481,7 @@ static int __init pci_driver_init(void)
postcore_initcall
(
pci_driver_init
);
EXPORT_SYMBOL
(
pci_match_id
);
EXPORT_SYMBOL
(
pci_match_device
);
EXPORT_SYMBOL
(
pci_register_driver
);
EXPORT_SYMBOL
(
pci_unregister_driver
);
...
...
drivers/pci/pci.c
View file @
346fced8
...
...
@@ -334,10 +334,6 @@ EXPORT_SYMBOL(pci_choose_state);
/**
* pci_save_state - save the PCI configuration space of a device before suspending
* @dev: - PCI device that we're dealing with
* @buffer: - buffer to hold config space context
*
* @buffer must be large enough to hold the entire PCI 2.2 config space
* (>= 64 bytes).
*/
int
pci_save_state
(
struct
pci_dev
*
dev
)
...
...
@@ -352,8 +348,6 @@ pci_save_state(struct pci_dev *dev)
/**
* pci_restore_state - Restore the saved state of a PCI device
* @dev: - PCI device that we're dealing with
* @buffer: - saved PCI config space
*
*/
int
pci_restore_state
(
struct
pci_dev
*
dev
)
...
...
drivers/pci/pcie/portdrv.h
View file @
346fced8
...
...
@@ -27,6 +27,11 @@
#define get_descriptor_id(type, service) (((type - 4) << 4) | service)
struct
pcie_port_device_ext
{
int
interrupt_mode
;
/* [0:INTx | 1:MSI | 2:MSI-X] */
unsigned
int
saved_msi_config_space
[
5
];
};
extern
struct
bus_type
pcie_port_bus_type
;
extern
int
pcie_port_device_probe
(
struct
pci_dev
*
dev
);
extern
int
pcie_port_device_register
(
struct
pci_dev
*
dev
);
...
...
drivers/pci/pcie/portdrv_core.c
View file @
346fced8
...
...
@@ -275,10 +275,17 @@ int pcie_port_device_probe(struct pci_dev *dev)
int
pcie_port_device_register
(
struct
pci_dev
*
dev
)
{
struct
pcie_port_device_ext
*
p_ext
;
int
status
,
type
,
capabilities
,
irq_mode
,
i
;
int
vectors
[
PCIE_PORT_DEVICE_MAXSERVICES
];
u16
reg16
;
/* Allocate port device extension */
if
(
!
(
p_ext
=
kmalloc
(
sizeof
(
struct
pcie_port_device_ext
),
GFP_KERNEL
)))
return
-
ENOMEM
;
pci_set_drvdata
(
dev
,
p_ext
);
/* Get port type */
pci_read_config_word
(
dev
,
pci_find_capability
(
dev
,
PCI_CAP_ID_EXP
)
+
...
...
@@ -288,6 +295,7 @@ int pcie_port_device_register(struct pci_dev *dev)
/* Now get port services */
capabilities
=
get_port_device_capability
(
dev
);
irq_mode
=
assign_interrupt_mode
(
dev
,
vectors
,
capabilities
);
p_ext
->
interrupt_mode
=
irq_mode
;
/* Allocate child services if any */
for
(
i
=
0
;
i
<
PCIE_PORT_DEVICE_MAXSERVICES
;
i
++
)
{
...
...
drivers/pci/pcie/portdrv_pci.c
View file @
346fced8
...
...
@@ -29,6 +29,78 @@ MODULE_LICENSE("GPL");
/* global data */
static
const
char
device_name
[]
=
"pcieport-driver"
;
static
void
pci_save_msi_state
(
struct
pci_dev
*
dev
)
{
struct
pcie_port_device_ext
*
p_ext
=
pci_get_drvdata
(
dev
);
int
i
=
0
,
pos
;
u16
control
;
if
((
pos
=
pci_find_capability
(
dev
,
PCI_CAP_ID_MSI
))
<=
0
)
return
;
pci_read_config_dword
(
dev
,
pos
,
&
p_ext
->
saved_msi_config_space
[
i
++
]);
control
=
p_ext
->
saved_msi_config_space
[
0
]
>>
16
;
pci_read_config_dword
(
dev
,
pos
+
PCI_MSI_ADDRESS_LO
,
&
p_ext
->
saved_msi_config_space
[
i
++
]);
if
(
control
&
PCI_MSI_FLAGS_64BIT
)
{
pci_read_config_dword
(
dev
,
pos
+
PCI_MSI_ADDRESS_HI
,
&
p_ext
->
saved_msi_config_space
[
i
++
]);
pci_read_config_dword
(
dev
,
pos
+
PCI_MSI_DATA_64
,
&
p_ext
->
saved_msi_config_space
[
i
++
]);
}
else
pci_read_config_dword
(
dev
,
pos
+
PCI_MSI_DATA_32
,
&
p_ext
->
saved_msi_config_space
[
i
++
]);
if
(
control
&
PCI_MSI_FLAGS_MASKBIT
)
pci_read_config_dword
(
dev
,
pos
+
PCI_MSI_MASK_BIT
,
&
p_ext
->
saved_msi_config_space
[
i
++
]);
}
static
void
pci_restore_msi_state
(
struct
pci_dev
*
dev
)
{
struct
pcie_port_device_ext
*
p_ext
=
pci_get_drvdata
(
dev
);
int
i
=
0
,
pos
;
u16
control
;
if
((
pos
=
pci_find_capability
(
dev
,
PCI_CAP_ID_MSI
))
<=
0
)
return
;
control
=
p_ext
->
saved_msi_config_space
[
i
++
]
>>
16
;
pci_write_config_word
(
dev
,
pos
+
PCI_MSI_FLAGS
,
control
);
pci_write_config_dword
(
dev
,
pos
+
PCI_MSI_ADDRESS_LO
,
p_ext
->
saved_msi_config_space
[
i
++
]);
if
(
control
&
PCI_MSI_FLAGS_64BIT
)
{
pci_write_config_dword
(
dev
,
pos
+
PCI_MSI_ADDRESS_HI
,
p_ext
->
saved_msi_config_space
[
i
++
]);
pci_write_config_dword
(
dev
,
pos
+
PCI_MSI_DATA_64
,
p_ext
->
saved_msi_config_space
[
i
++
]);
}
else
pci_write_config_dword
(
dev
,
pos
+
PCI_MSI_DATA_32
,
p_ext
->
saved_msi_config_space
[
i
++
]);
if
(
control
&
PCI_MSI_FLAGS_MASKBIT
)
pci_write_config_dword
(
dev
,
pos
+
PCI_MSI_MASK_BIT
,
p_ext
->
saved_msi_config_space
[
i
++
]);
}
static
void
pcie_portdrv_save_config
(
struct
pci_dev
*
dev
)
{
struct
pcie_port_device_ext
*
p_ext
=
pci_get_drvdata
(
dev
);
pci_save_state
(
dev
);
if
(
p_ext
->
interrupt_mode
==
PCIE_PORT_MSI_MODE
)
pci_save_msi_state
(
dev
);
}
static
void
pcie_portdrv_restore_config
(
struct
pci_dev
*
dev
)
{
struct
pcie_port_device_ext
*
p_ext
=
pci_get_drvdata
(
dev
);
pci_restore_state
(
dev
);
if
(
p_ext
->
interrupt_mode
==
PCIE_PORT_MSI_MODE
)
pci_restore_msi_state
(
dev
);
pci_enable_device
(
dev
);
pci_set_master
(
dev
);
}
/*
* pcie_portdrv_probe - Probe PCI-Express port devices
* @dev: PCI-Express port device being probed
...
...
@@ -64,16 +136,21 @@ static int __devinit pcie_portdrv_probe (struct pci_dev *dev,
static
void
pcie_portdrv_remove
(
struct
pci_dev
*
dev
)
{
pcie_port_device_remove
(
dev
);
kfree
(
pci_get_drvdata
(
dev
));
}
#ifdef CONFIG_PM
static
int
pcie_portdrv_suspend
(
struct
pci_dev
*
dev
,
pm_message_t
state
)
{
return
pcie_port_device_suspend
(
dev
,
state
);
int
ret
=
pcie_port_device_suspend
(
dev
,
state
);
pcie_portdrv_save_config
(
dev
);
return
ret
;
}
static
int
pcie_portdrv_resume
(
struct
pci_dev
*
dev
)
{
pcie_portdrv_restore_config
(
dev
);
return
pcie_port_device_resume
(
dev
);
}
#endif
...
...
drivers/pci/probe.c
View file @
346fced8
...
...
@@ -239,9 +239,8 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child)
if
(
dev
->
transparent
)
{
printk
(
KERN_INFO
"PCI: Transparent bridge - %s
\n
"
,
pci_name
(
dev
));
for
(
i
=
0
;
i
<
PCI_BUS_NUM_RESOURCES
;
i
++
)
child
->
resource
[
i
]
=
child
->
parent
->
resource
[
i
];
return
;
for
(
i
=
3
;
i
<
PCI_BUS_NUM_RESOURCES
;
i
++
)
child
->
resource
[
i
]
=
child
->
parent
->
resource
[
i
-
3
];
}
for
(
i
=
0
;
i
<
3
;
i
++
)
...
...
@@ -398,6 +397,16 @@ static void pci_enable_crs(struct pci_dev *dev)
pci_write_config_word
(
dev
,
rpcap
+
PCI_EXP_RTCTL
,
rpctl
);
}
static
void
__devinit
pci_fixup_parent_subordinate_busnr
(
struct
pci_bus
*
child
,
int
max
)
{
struct
pci_bus
*
parent
=
child
->
parent
;
while
(
parent
->
parent
&&
parent
->
subordinate
<
max
)
{
parent
->
subordinate
=
max
;
pci_write_config_byte
(
parent
->
self
,
PCI_SUBORDINATE_BUS
,
max
);
parent
=
parent
->
parent
;
}
}
unsigned
int
__devinit
pci_scan_child_bus
(
struct
pci_bus
*
bus
);
/*
...
...
@@ -499,7 +508,13 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max
if
(
!
is_cardbus
)
{
child
->
bridge_ctl
=
PCI_BRIDGE_CTL_NO_ISA
;
/*
* Adjust subordinate busnr in parent buses.
* We do this before scanning for children because
* some devices may not be detected if the bios
* was lazy.
*/
pci_fixup_parent_subordinate_busnr
(
child
,
max
);
/* Now we can scan all subordinate buses... */
max
=
pci_scan_child_bus
(
child
);
}
else
{
...
...
@@ -513,6 +528,7 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max
max
+
i
+
1
))
break
;
max
+=
i
;
pci_fixup_parent_subordinate_busnr
(
child
,
max
);
}
/*
* Set the subordinate bus number to its real value.
...
...
drivers/pci/quirks.c
View file @
346fced8
...
...
@@ -767,6 +767,7 @@ static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev)
if
(
unlikely
(
dev
->
subsystem_vendor
==
PCI_VENDOR_ID_ASUSTEK
))
{
if
(
dev
->
device
==
PCI_DEVICE_ID_INTEL_82845_HB
)
switch
(
dev
->
subsystem_device
)
{
case
0x8025
:
/* P4B-LX */
case
0x8070
:
/* P4B */
case
0x8088
:
/* P4B533 */
case
0x1626
:
/* L3C notebook */
...
...
drivers/pci/setup-bus.c
View file @
346fced8
...
...
@@ -273,6 +273,8 @@ find_free_bus_resource(struct pci_bus *bus, unsigned long type)
for
(
i
=
0
;
i
<
PCI_BUS_NUM_RESOURCES
;
i
++
)
{
r
=
bus
->
resource
[
i
];
if
(
r
==
&
ioport_resource
||
r
==
&
iomem_resource
)
continue
;
if
(
r
&&
(
r
->
flags
&
type_mask
)
==
type
&&
!
r
->
parent
)
return
r
;
}
...
...
include/linux/pci-dynids.h
deleted
100644 → 0
View file @
17af691c
/*
* PCI defines and function prototypes
* Copyright 2003 Dell Inc.
* by Matt Domsch <Matt_Domsch@dell.com>
*/
#ifndef LINUX_PCI_DYNIDS_H
#define LINUX_PCI_DYNIDS_H
#include <linux/list.h>
#include <linux/mod_devicetable.h>
struct
dynid
{
struct
list_head
node
;
struct
pci_device_id
id
;
};
#endif
include/linux/pci.h
View file @
346fced8
...
...
@@ -586,7 +586,7 @@ struct pci_dev {
#define PCI_NUM_RESOURCES 11
#ifndef PCI_BUS_NUM_RESOURCES
#define PCI_BUS_NUM_RESOURCES
4
#define PCI_BUS_NUM_RESOURCES
8
#endif
#define PCI_REGION_FLAG_MASK 0x0fU
/* These bits of resource flags tell us the PCI region flags */
...
...
@@ -860,7 +860,8 @@ int pci_register_driver(struct pci_driver *);
void
pci_unregister_driver
(
struct
pci_driver
*
);
void
pci_remove_behind_bridge
(
struct
pci_dev
*
);
struct
pci_driver
*
pci_dev_driver
(
const
struct
pci_dev
*
);
const
struct
pci_device_id
*
pci_match_device
(
const
struct
pci_device_id
*
ids
,
const
struct
pci_dev
*
dev
);
const
struct
pci_device_id
*
pci_match_device
(
struct
pci_driver
*
drv
,
struct
pci_dev
*
dev
);
const
struct
pci_device_id
*
pci_match_id
(
const
struct
pci_device_id
*
ids
,
struct
pci_dev
*
dev
);
int
pci_scan_bridge
(
struct
pci_bus
*
bus
,
struct
pci_dev
*
dev
,
int
max
,
int
pass
);
/* kmem_cache style wrapper around pci_alloc_consistent() */
...
...
sound/pci/bt87x.c
View file @
346fced8
...
...
@@ -804,7 +804,7 @@ static int __devinit snd_bt87x_detect_card(struct pci_dev *pci)
int
i
;
const
struct
pci_device_id
*
supported
;
supported
=
pci_match_device
(
snd_bt87x_ids
,
pci
);
supported
=
pci_match_device
(
driver
,
pci
);
if
(
supported
)
return
supported
->
driver_data
;
...
...
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