The PCIe specification allows three attention indicator states,
on, off, and blink.  Enable all three states instead of basic
on / off control.

This changes the userspace API to match the behavior of pcihp.

Signed-off-by: Timothy Pearson <tpear...@raptorengineering.com>
---
 drivers/pci/hotplug/pnv_php.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/pci/hotplug/pnv_php.c b/drivers/pci/hotplug/pnv_php.c
index 3533f7f23b71..c65460ced862 100644
--- a/drivers/pci/hotplug/pnv_php.c
+++ b/drivers/pci/hotplug/pnv_php.c
@@ -441,10 +441,23 @@ static int pnv_php_get_adapter_state(struct hotplug_slot 
*slot, u8 *state)
        return ret;
 }
 
+static int pnv_php_get_raw_indicator_status(struct hotplug_slot *slot, u8 
*state)
+{
+       struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
+       struct pci_dev *bridge = php_slot->pdev;
+       u16 status;
+
+       pcie_capability_read_word(bridge, PCI_EXP_SLTCTL, &status);
+       *state = (status & (PCI_EXP_SLTCTL_AIC | PCI_EXP_SLTCTL_PIC)) >> 6;
+       return 0;
+}
+
+
 static int pnv_php_get_attention_state(struct hotplug_slot *slot, u8 *state)
 {
        struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
 
+       pnv_php_get_raw_indicator_status(slot, &php_slot->attention_state);
        *state = php_slot->attention_state;
        return 0;
 }
@@ -462,7 +475,7 @@ static int pnv_php_set_attention_state(struct hotplug_slot 
*slot, u8 state)
        mask = PCI_EXP_SLTCTL_AIC;
 
        if (state)
-               new = PCI_EXP_SLTCTL_ATTN_IND_ON;
+               new = FIELD_PREP(PCI_EXP_SLTCTL_AIC, state);
        else
                new = PCI_EXP_SLTCTL_ATTN_IND_OFF;
 
-- 
2.39.5

Reply via email to