Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
pci
remove.c
Go to the documentation of this file.
1
#include <linux/pci.h>
2
#include <linux/module.h>
3
#include <
linux/pci-aspm.h
>
4
#include "
pci.h
"
5
6
static
void
pci_free_resources(
struct
pci_dev
*
dev
)
7
{
8
int
i
;
9
10
msi_remove_pci_irq_vectors
(dev);
11
12
pci_cleanup_rom
(dev);
13
for
(i = 0; i <
PCI_NUM_RESOURCES
; i++) {
14
struct
resource
*
res
= dev->
resource
+
i
;
15
if
(res->
parent
)
16
release_resource
(res);
17
}
18
}
19
20
static
void
pci_stop_dev(
struct
pci_dev
*dev)
21
{
22
if
(dev->
is_added
) {
23
pci_proc_detach_device
(dev);
24
pci_remove_sysfs_dev_files
(dev);
25
device_unregister
(&dev->
dev
);
26
dev->
is_added
= 0;
27
}
28
29
if
(dev->
bus
->self)
30
pcie_aspm_exit_link_state
(dev);
31
}
32
33
static
void
pci_destroy_dev(
struct
pci_dev
*dev)
34
{
35
down_write
(&pci_bus_sem);
36
list_del
(&dev->
bus_list
);
37
up_write
(&pci_bus_sem);
38
39
pci_free_resources(dev);
40
pci_dev_put
(dev);
41
}
42
43
void
pci_remove_bus
(
struct
pci_bus
*
bus
)
44
{
45
pci_proc_detach_bus
(bus);
46
47
down_write
(&
pci_bus_sem
);
48
list_del
(&bus->
node
);
49
pci_bus_release_busn_res
(bus);
50
up_write
(&
pci_bus_sem
);
51
if
(!bus->
is_added
)
52
return
;
53
54
pci_remove_legacy_files(bus);
55
device_unregister
(&bus->
dev
);
56
}
57
EXPORT_SYMBOL
(
pci_remove_bus
);
58
59
static
void
pci_stop_bus_device(
struct
pci_dev
*dev)
60
{
61
struct
pci_bus
*
bus
= dev->
subordinate
;
62
struct
pci_dev
*
child
, *
tmp
;
63
64
/*
65
* Stopping an SR-IOV PF device removes all the associated VFs,
66
* which will update the bus->devices list and confuse the
67
* iterator. Therefore, iterate in reverse so we remove the VFs
68
* first, then the PF.
69
*/
70
if
(bus) {
71
list_for_each_entry_safe_reverse
(child, tmp,
72
&bus->
devices
,
bus_list
)
73
pci_stop_bus_device(child);
74
}
75
76
pci_stop_dev(dev);
77
}
78
79
static
void
pci_remove_bus_device(
struct
pci_dev
*dev)
80
{
81
struct
pci_bus
*bus = dev->subordinate;
82
struct
pci_dev
*child, *
tmp
;
83
84
if
(bus) {
85
list_for_each_entry_safe
(child, tmp,
86
&bus->
devices
,
bus_list
)
87
pci_remove_bus_device(child);
88
89
pci_remove_bus
(bus);
90
dev->
subordinate
=
NULL
;
91
}
92
93
pci_destroy_dev(dev);
94
}
95
108
void
pci_stop_and_remove_bus_device
(
struct
pci_dev
*dev)
109
{
110
pci_stop_bus_device(dev);
111
pci_remove_bus_device(dev);
112
}
113
EXPORT_SYMBOL
(
pci_stop_and_remove_bus_device
);
Generated on Thu Jan 10 2013 14:14:25 for Linux Kernel by
1.8.2