提交 263e54b9 编写于 作者: J Jiang Liu 提交者: Bjorn Helgaas

PCI/PME: Use PCI Express Capability accessors

Use PCI Express Capability access functions to simplify PCIe PME.
Signed-off-by: NJiang Liu <jiang.liu@huawei.com>
Signed-off-by: NYijing Wang <wangyijing@huawei.com>
Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
上级 537a77e6
...@@ -57,17 +57,12 @@ struct pcie_pme_service_data { ...@@ -57,17 +57,12 @@ struct pcie_pme_service_data {
*/ */
void pcie_pme_interrupt_enable(struct pci_dev *dev, bool enable) void pcie_pme_interrupt_enable(struct pci_dev *dev, bool enable)
{ {
int rtctl_pos;
u16 rtctl;
rtctl_pos = pci_pcie_cap(dev) + PCI_EXP_RTCTL;
pci_read_config_word(dev, rtctl_pos, &rtctl);
if (enable) if (enable)
rtctl |= PCI_EXP_RTCTL_PMEIE; pcie_capability_set_word(dev, PCI_EXP_RTCTL,
PCI_EXP_RTCTL_PMEIE);
else else
rtctl &= ~PCI_EXP_RTCTL_PMEIE; pcie_capability_clear_word(dev, PCI_EXP_RTCTL,
pci_write_config_word(dev, rtctl_pos, rtctl); PCI_EXP_RTCTL_PMEIE);
} }
/** /**
...@@ -226,18 +221,15 @@ static void pcie_pme_work_fn(struct work_struct *work) ...@@ -226,18 +221,15 @@ static void pcie_pme_work_fn(struct work_struct *work)
struct pcie_pme_service_data *data = struct pcie_pme_service_data *data =
container_of(work, struct pcie_pme_service_data, work); container_of(work, struct pcie_pme_service_data, work);
struct pci_dev *port = data->srv->port; struct pci_dev *port = data->srv->port;
int rtsta_pos;
u32 rtsta; u32 rtsta;
rtsta_pos = pci_pcie_cap(port) + PCI_EXP_RTSTA;
spin_lock_irq(&data->lock); spin_lock_irq(&data->lock);
for (;;) { for (;;) {
if (data->noirq) if (data->noirq)
break; break;
pci_read_config_dword(port, rtsta_pos, &rtsta); pcie_capability_read_dword(port, PCI_EXP_RTSTA, &rtsta);
if (rtsta & PCI_EXP_RTSTA_PME) { if (rtsta & PCI_EXP_RTSTA_PME) {
/* /*
* Clear PME status of the port. If there are other * Clear PME status of the port. If there are other
...@@ -276,17 +268,14 @@ static irqreturn_t pcie_pme_irq(int irq, void *context) ...@@ -276,17 +268,14 @@ static irqreturn_t pcie_pme_irq(int irq, void *context)
{ {
struct pci_dev *port; struct pci_dev *port;
struct pcie_pme_service_data *data; struct pcie_pme_service_data *data;
int rtsta_pos;
u32 rtsta; u32 rtsta;
unsigned long flags; unsigned long flags;
port = ((struct pcie_device *)context)->port; port = ((struct pcie_device *)context)->port;
data = get_service_data((struct pcie_device *)context); data = get_service_data((struct pcie_device *)context);
rtsta_pos = pci_pcie_cap(port) + PCI_EXP_RTSTA;
spin_lock_irqsave(&data->lock, flags); spin_lock_irqsave(&data->lock, flags);
pci_read_config_dword(port, rtsta_pos, &rtsta); pcie_capability_read_dword(port, PCI_EXP_RTSTA, &rtsta);
if (!(rtsta & PCI_EXP_RTSTA_PME)) { if (!(rtsta & PCI_EXP_RTSTA_PME)) {
spin_unlock_irqrestore(&data->lock, flags); spin_unlock_irqrestore(&data->lock, flags);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册