-
Notifications
You must be signed in to change notification settings - Fork 0
/
tr_notworking_patch
100 lines (85 loc) · 2.77 KB
/
tr_notworking_patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
--- a/drivers/pci/pci.c 2019-06-22 10:50:56.159982023 -0700
--- b/drivers/pci/pci.c 2019-06-22 10:57:12.279982420 -0700
@@ -1336,7 +1336,7 @@
EXPORT_SYMBOL(pci_save_state);
static void pci_restore_config_dword(struct pci_dev *pdev, int offset,
- u32 saved_val, int retry, bool force)
+ u32 saved_val, int retry, int force)
{
u32 val;
@@ -1361,7 +1361,7 @@
static void pci_restore_config_space_range(struct pci_dev *pdev,
int start, int end, int retry,
- bool force)
+ int force)
{
int index;
@@ -1371,13 +1371,13 @@
retry, force);
}
-static void pci_restore_config_space(struct pci_dev *pdev)
+static void pci_restore_config_space(struct pci_dev *pdev, int force)
{
if (pdev->hdr_type == PCI_HEADER_TYPE_NORMAL) {
- pci_restore_config_space_range(pdev, 10, 15, 0, false);
+ pci_restore_config_space_range(pdev, 10, 15, 0, force);
/* Restore BARs before the command register. */
- pci_restore_config_space_range(pdev, 4, 9, 10, false);
- pci_restore_config_space_range(pdev, 0, 3, 0, false);
+ pci_restore_config_space_range(pdev, 4, 9, 10, force);
+ pci_restore_config_space_range(pdev, 0, 3, 0, force);
} else if (pdev->hdr_type == PCI_HEADER_TYPE_BRIDGE) {
pci_restore_config_space_range(pdev, 12, 15, 0, false);
@@ -1389,7 +1389,7 @@
pci_restore_config_space_range(pdev, 9, 11, 0, true);
pci_restore_config_space_range(pdev, 0, 8, 0, false);
} else {
- pci_restore_config_space_range(pdev, 0, 15, 0, false);
+ pci_restore_config_space_range(pdev, 0, 15, 0, force);
}
}
@@ -1424,7 +1424,7 @@
* pci_restore_state - Restore the saved state of a PCI device
* @dev: - PCI device that we're dealing with
*/
-void pci_restore_state(struct pci_dev *dev)
+void _pci_restore_state(struct pci_dev *dev, int force)
{
if (!dev->state_saved)
return;
@@ -1445,7 +1445,7 @@
pci_cleanup_aer_error_status_regs(dev);
- pci_restore_config_space(dev);
+ pci_restore_config_space(dev, force);
pci_restore_pcix_state(dev);
pci_restore_msi_state(dev);
@@ -1456,6 +1456,11 @@
dev->state_saved = false;
}
+
+void pci_restore_state(struct pci_dev *dev)
+{
+ _pci_restore_state(dev, 0);
+}
EXPORT_SYMBOL(pci_restore_state);
struct pci_saved_state {
@@ -4636,6 +4641,8 @@
{
u16 ctrl;
+ pci_save_state(dev);
+
pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &ctrl);
ctrl |= PCI_BRIDGE_CTL_BUS_RESET;
pci_write_config_word(dev, PCI_BRIDGE_CONTROL, ctrl);
@@ -4646,9 +4653,13 @@
*/
msleep(2);
+ pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &ctrl);
+
ctrl &= ~PCI_BRIDGE_CTL_BUS_RESET;
pci_write_config_word(dev, PCI_BRIDGE_CONTROL, ctrl);
+ _pci_restore_state(dev, 1);
+
/*
* Trhfa for conventional PCI is 2^25 clock cycles.
* Assuming a minimum 33MHz clock this results in a 1s