diff options
| author | Bjorn Helgaas <bhelgaas@google.com> | 2015-06-14 22:35:13 -0400 |
|---|---|---|
| committer | Bjorn Helgaas <bhelgaas@google.com> | 2015-06-18 17:14:49 -0400 |
| commit | 4f092fec67191f899fa111a4eeffdf4368494c77 (patch) | |
| tree | 6b449fd8ccd7cafefc0019748881abf875693c63 | |
| parent | d49eccb3c1a41b847380279d7f88a88421783f37 (diff) | |
PCI: pciehp: Inline the "handle event" functions into the ISR
The pciehp_handle_*() functions (pciehp_handle_attention_button(), etc.)
only contain a line or two of useful code, so it's clumsy to put
them in separate functions. All they so is add an event to a work queue,
and it's clearer to see that directly in the ISR.
Inline them directly into pcie_isr(). No functional change.
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Rajat Jain <rajatja@google.com>
Acked-by: Yinghai Lu <yinghai@kernel.org>
| -rw-r--r-- | drivers/pci/hotplug/pciehp.h | 6 | ||||
| -rw-r--r-- | drivers/pci/hotplug/pciehp_ctrl.c | 105 | ||||
| -rw-r--r-- | drivers/pci/hotplug/pciehp_hpc.c | 39 |
3 files changed, 32 insertions, 118 deletions
diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h index ce4d12c4eff4..57cd1327346f 100644 --- a/drivers/pci/hotplug/pciehp.h +++ b/drivers/pci/hotplug/pciehp.h | |||
| @@ -132,11 +132,7 @@ struct controller { | |||
| 132 | 132 | ||
| 133 | int pciehp_sysfs_enable_slot(struct slot *slot); | 133 | int pciehp_sysfs_enable_slot(struct slot *slot); |
| 134 | int pciehp_sysfs_disable_slot(struct slot *slot); | 134 | int pciehp_sysfs_disable_slot(struct slot *slot); |
| 135 | u8 pciehp_handle_attention_button(struct slot *p_slot); | 135 | void pciehp_queue_interrupt_event(struct slot *slot, u32 event_type); |
| 136 | u8 pciehp_handle_switch_change(struct slot *p_slot); | ||
| 137 | u8 pciehp_handle_presence_change(struct slot *p_slot); | ||
| 138 | u8 pciehp_handle_power_fault(struct slot *p_slot); | ||
| 139 | void pciehp_handle_linkstate_change(struct slot *p_slot); | ||
| 140 | int pciehp_configure_device(struct slot *p_slot); | 136 | int pciehp_configure_device(struct slot *p_slot); |
| 141 | int pciehp_unconfigure_device(struct slot *p_slot); | 137 | int pciehp_unconfigure_device(struct slot *p_slot); |
| 142 | void pciehp_queue_pushbutton_work(struct work_struct *work); | 138 | void pciehp_queue_pushbutton_work(struct work_struct *work); |
diff --git a/drivers/pci/hotplug/pciehp_ctrl.c b/drivers/pci/hotplug/pciehp_ctrl.c index 7ed37dc4879a..f3796124ad7c 100644 --- a/drivers/pci/hotplug/pciehp_ctrl.c +++ b/drivers/pci/hotplug/pciehp_ctrl.c | |||
| @@ -37,7 +37,7 @@ | |||
| 37 | 37 | ||
| 38 | static void interrupt_event_handler(struct work_struct *work); | 38 | static void interrupt_event_handler(struct work_struct *work); |
| 39 | 39 | ||
| 40 | static void pciehp_queue_interrupt_event(struct slot *p_slot, u32 event_type) | 40 | void pciehp_queue_interrupt_event(struct slot *p_slot, u32 event_type) |
| 41 | { | 41 | { |
| 42 | struct event_info *info; | 42 | struct event_info *info; |
| 43 | 43 | ||
| @@ -53,109 +53,6 @@ static void pciehp_queue_interrupt_event(struct slot *p_slot, u32 event_type) | |||
| 53 | queue_work(p_slot->wq, &info->work); | 53 | queue_work(p_slot->wq, &info->work); |
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | u8 pciehp_handle_attention_button(struct slot *p_slot) | ||
| 57 | { | ||
| 58 | u32 event_type; | ||
| 59 | struct controller *ctrl = p_slot->ctrl; | ||
| 60 | |||
| 61 | /* | ||
| 62 | * Button pressed - See if need to TAKE ACTION!!! | ||
| 63 | */ | ||
| 64 | ctrl_info(ctrl, "Button pressed on Slot(%s)\n", slot_name(p_slot)); | ||
| 65 | event_type = INT_BUTTON_PRESS; | ||
| 66 | |||
| 67 | pciehp_queue_interrupt_event(p_slot, event_type); | ||
| 68 | |||
| 69 | return 0; | ||
| 70 | } | ||
| 71 | |||
| 72 | u8 pciehp_handle_switch_change(struct slot *p_slot) | ||
| 73 | { | ||
| 74 | u8 getstatus; | ||
| 75 | u32 event_type; | ||
| 76 | struct controller *ctrl = p_slot->ctrl; | ||
| 77 | |||
| 78 | pciehp_get_latch_status(p_slot, &getstatus); | ||
| 79 | if (getstatus) { | ||
| 80 | /* | ||
| 81 | * Switch opened | ||
| 82 | */ | ||
| 83 | ctrl_info(ctrl, "Latch open on Slot(%s)\n", slot_name(p_slot)); | ||
| 84 | event_type = INT_SWITCH_OPEN; | ||
| 85 | } else { | ||
| 86 | /* | ||
| 87 | * Switch closed | ||
| 88 | */ | ||
| 89 | ctrl_info(ctrl, "Latch close on Slot(%s)\n", slot_name(p_slot)); | ||
| 90 | event_type = INT_SWITCH_CLOSE; | ||
| 91 | } | ||
| 92 | |||
| 93 | pciehp_queue_interrupt_event(p_slot, event_type); | ||
| 94 | |||
| 95 | return 1; | ||
| 96 | } | ||
| 97 | |||
| 98 | u8 pciehp_handle_presence_change(struct slot *p_slot) | ||
| 99 | { | ||
| 100 | u32 event_type; | ||
| 101 | u8 presence_save; | ||
| 102 | struct controller *ctrl = p_slot->ctrl; | ||
| 103 | |||
| 104 | /* Switch is open, assume a presence change | ||
| 105 | * Save the presence state | ||
| 106 | */ | ||
| 107 | pciehp_get_adapter_status(p_slot, &presence_save); | ||
| 108 | if (presence_save) { | ||
| 109 | /* | ||
| 110 | * Card Present | ||
| 111 | */ | ||
| 112 | ctrl_info(ctrl, "Card present on Slot(%s)\n", slot_name(p_slot)); | ||
| 113 | event_type = INT_PRESENCE_ON; | ||
| 114 | } else { | ||
| 115 | /* | ||
| 116 | * Not Present | ||
| 117 | */ | ||
| 118 | ctrl_info(ctrl, "Card not present on Slot(%s)\n", | ||
| 119 | slot_name(p_slot)); | ||
| 120 | event_type = INT_PRESENCE_OFF; | ||
| 121 | } | ||
| 122 | |||
| 123 | pciehp_queue_interrupt_event(p_slot, event_type); | ||
| 124 | |||
| 125 | return 1; | ||
| 126 | } | ||
| 127 | |||
| 128 | u8 pciehp_handle_power_fault(struct slot *p_slot) | ||
| 129 | { | ||
| 130 | u32 event_type; | ||
| 131 | struct controller *ctrl = p_slot->ctrl; | ||
| 132 | |||
| 133 | ctrl_err(ctrl, "Power fault on slot %s\n", slot_name(p_slot)); | ||
| 134 | event_type = INT_POWER_FAULT; | ||
| 135 | ctrl_info(ctrl, "Power fault bit %x set\n", 0); | ||
| 136 | pciehp_queue_interrupt_event(p_slot, event_type); | ||
| 137 | |||
| 138 | return 1; | ||
| 139 | } | ||
| 140 | |||
| 141 | void pciehp_handle_linkstate_change(struct slot *p_slot) | ||
| 142 | { | ||
| 143 | u32 event_type; | ||
| 144 | struct controller *ctrl = p_slot->ctrl; | ||
| 145 | |||
| 146 | if (pciehp_check_link_active(ctrl)) { | ||
| 147 | ctrl_info(ctrl, "slot(%s): Link Up event\n", | ||
| 148 | slot_name(p_slot)); | ||
| 149 | event_type = INT_LINK_UP; | ||
| 150 | } else { | ||
| 151 | ctrl_info(ctrl, "slot(%s): Link Down event\n", | ||
| 152 | slot_name(p_slot)); | ||
| 153 | event_type = INT_LINK_DOWN; | ||
| 154 | } | ||
| 155 | |||
| 156 | pciehp_queue_interrupt_event(p_slot, event_type); | ||
| 157 | } | ||
| 158 | |||
| 159 | /* The following routines constitute the bulk of the | 56 | /* The following routines constitute the bulk of the |
| 160 | hotplug controller logic | 57 | hotplug controller logic |
| 161 | */ | 58 | */ |
diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c index e9daaa370047..2913f7e68a10 100644 --- a/drivers/pci/hotplug/pciehp_hpc.c +++ b/drivers/pci/hotplug/pciehp_hpc.c | |||
| @@ -535,6 +535,8 @@ static irqreturn_t pcie_isr(int irq, void *dev_id) | |||
| 535 | struct pci_dev *dev; | 535 | struct pci_dev *dev; |
| 536 | struct slot *slot = ctrl->slot; | 536 | struct slot *slot = ctrl->slot; |
| 537 | u16 detected, intr_loc; | 537 | u16 detected, intr_loc; |
| 538 | u8 open, present; | ||
| 539 | bool link; | ||
| 538 | 540 | ||
| 539 | /* | 541 | /* |
| 540 | * In order to guarantee that all interrupt events are | 542 | * In order to guarantee that all interrupt events are |
| @@ -580,25 +582,44 @@ static irqreturn_t pcie_isr(int irq, void *dev_id) | |||
| 580 | return IRQ_HANDLED; | 582 | return IRQ_HANDLED; |
| 581 | 583 | ||
| 582 | /* Check MRL Sensor Changed */ | 584 | /* Check MRL Sensor Changed */ |
| 583 | if (intr_loc & PCI_EXP_SLTSTA_MRLSC) | 585 | if (intr_loc & PCI_EXP_SLTSTA_MRLSC) { |
| 584 | pciehp_handle_switch_change(slot); | 586 | pciehp_get_latch_status(slot, &open); |
| 587 | ctrl_info(ctrl, "Latch %s on Slot(%s)\n", | ||
| 588 | open ? "open" : "close", slot_name(slot)); | ||
| 589 | pciehp_queue_interrupt_event(slot, open ? INT_SWITCH_OPEN : | ||
| 590 | INT_SWITCH_CLOSE); | ||
| 591 | } | ||
| 585 | 592 | ||
| 586 | /* Check Attention Button Pressed */ | 593 | /* Check Attention Button Pressed */ |
| 587 | if (intr_loc & PCI_EXP_SLTSTA_ABP) | 594 | if (intr_loc & PCI_EXP_SLTSTA_ABP) { |
| 588 | pciehp_handle_attention_button(slot); | 595 | ctrl_info(ctrl, "Button pressed on Slot(%s)\n", |
| 596 | slot_name(slot)); | ||
| 597 | pciehp_queue_interrupt_event(slot, INT_BUTTON_PRESS); | ||
| 598 | } | ||
| 589 | 599 | ||
| 590 | /* Check Presence Detect Changed */ | 600 | /* Check Presence Detect Changed */ |
| 591 | if (intr_loc & PCI_EXP_SLTSTA_PDC) | 601 | if (intr_loc & PCI_EXP_SLTSTA_PDC) { |
| 592 | pciehp_handle_presence_change(slot); | 602 | pciehp_get_adapter_status(slot, &present); |
| 603 | ctrl_info(ctrl, "Card %spresent on Slot(%s)\n", | ||
| 604 | present ? "" : "not ", slot_name(slot)); | ||
| 605 | pciehp_queue_interrupt_event(slot, present ? INT_PRESENCE_ON : | ||
| 606 | INT_PRESENCE_OFF); | ||
| 607 | } | ||
| 593 | 608 | ||
| 594 | /* Check Power Fault Detected */ | 609 | /* Check Power Fault Detected */ |
| 595 | if ((intr_loc & PCI_EXP_SLTSTA_PFD) && !ctrl->power_fault_detected) { | 610 | if ((intr_loc & PCI_EXP_SLTSTA_PFD) && !ctrl->power_fault_detected) { |
| 596 | ctrl->power_fault_detected = 1; | 611 | ctrl->power_fault_detected = 1; |
| 597 | pciehp_handle_power_fault(slot); | 612 | ctrl_err(ctrl, "Power fault on slot %s\n", slot_name(slot)); |
| 613 | pciehp_queue_interrupt_event(slot, INT_POWER_FAULT); | ||
| 598 | } | 614 | } |
| 599 | 615 | ||
| 600 | if (intr_loc & PCI_EXP_SLTSTA_DLLSC) | 616 | if (intr_loc & PCI_EXP_SLTSTA_DLLSC) { |
