Commit 15a724aa authored by Bjorn Helgaas's avatar Bjorn Helgaas

Merge branch 'pci/hotplug'

- Remove unnecessary hpc_ops struct from shpchp (ngn)

- Check for PCI_POSSIBLE_ERROR(), not 0xffffffff, in cpqphp (weiyufeng)

* pci/hotplug:
  PCI: cpqphp: Use PCI_POSSIBLE_ERROR() to check config reads
  PCI: shpchp: Remove hpc_ops
parents dffe4cca 87d54033
...@@ -51,11 +51,6 @@ ibmphp: ...@@ -51,11 +51,6 @@ ibmphp:
shpchp: shpchp:
* There is only a single implementation of struct hpc_ops. Can the struct be
removed and its functions invoked directly? This has already been done in
pciehp with commit 82a9e79ef132 ("PCI: pciehp: remove hpc_ops"). Clarify
if there was a specific reason not to apply the same change to shpchp.
* The hardirq handler shpc_isr() queues events on a workqueue. It can be * The hardirq handler shpc_isr() queues events on a workqueue. It can be
simplified by converting it to threaded IRQ handling. Use pciehp as a simplified by converting it to threaded IRQ handling. Use pciehp as a
template. template.
...@@ -138,7 +138,7 @@ static int PCI_RefinedAccessConfig(struct pci_bus *bus, unsigned int devfn, u8 o ...@@ -138,7 +138,7 @@ static int PCI_RefinedAccessConfig(struct pci_bus *bus, unsigned int devfn, u8 o
if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, &vendID) == -1) if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, &vendID) == -1)
return -1; return -1;
if (vendID == 0xffffffff) if (PCI_POSSIBLE_ERROR(vendID))
return -1; return -1;
return pci_bus_read_config_dword(bus, devfn, offset, value); return pci_bus_read_config_dword(bus, devfn, offset, value);
} }
...@@ -253,7 +253,7 @@ static int PCI_GetBusDevHelper(struct controller *ctrl, u8 *bus_num, u8 *dev_num ...@@ -253,7 +253,7 @@ static int PCI_GetBusDevHelper(struct controller *ctrl, u8 *bus_num, u8 *dev_num
*dev_num = tdevice; *dev_num = tdevice;
ctrl->pci_bus->number = tbus; ctrl->pci_bus->number = tbus;
pci_bus_read_config_dword(ctrl->pci_bus, *dev_num, PCI_VENDOR_ID, &work); pci_bus_read_config_dword(ctrl->pci_bus, *dev_num, PCI_VENDOR_ID, &work);
if (!nobridge || (work == 0xffffffff)) if (!nobridge || PCI_POSSIBLE_ERROR(work))
return 0; return 0;
dbg("bus_num %d devfn %d\n", *bus_num, *dev_num); dbg("bus_num %d devfn %d\n", *bus_num, *dev_num);
......
...@@ -72,7 +72,6 @@ struct slot { ...@@ -72,7 +72,6 @@ struct slot {
u8 latch_save; u8 latch_save;
u8 pwr_save; u8 pwr_save;
struct controller *ctrl; struct controller *ctrl;
const struct hpc_ops *hpc_ops;
struct hotplug_slot hotplug_slot; struct hotplug_slot hotplug_slot;
struct list_head slot_list; struct list_head slot_list;
struct delayed_work work; /* work for button event */ struct delayed_work work; /* work for button event */
...@@ -94,7 +93,6 @@ struct controller { ...@@ -94,7 +93,6 @@ struct controller {
int slot_num_inc; /* 1 or -1 */ int slot_num_inc; /* 1 or -1 */
struct pci_dev *pci_dev; struct pci_dev *pci_dev;
struct list_head slot_list; struct list_head slot_list;
const struct hpc_ops *hpc_ops;
wait_queue_head_t queue; /* sleep & wake process */ wait_queue_head_t queue; /* sleep & wake process */
u8 slot_device_offset; u8 slot_device_offset;
u32 pcix_misc2_reg; /* for amd pogo errata */ u32 pcix_misc2_reg; /* for amd pogo errata */
...@@ -300,24 +298,22 @@ static inline void amd_pogo_errata_restore_misc_reg(struct slot *p_slot) ...@@ -300,24 +298,22 @@ static inline void amd_pogo_errata_restore_misc_reg(struct slot *p_slot)
pci_write_config_dword(p_slot->ctrl->pci_dev, PCIX_MISCII_OFFSET, pcix_misc2_temp); pci_write_config_dword(p_slot->ctrl->pci_dev, PCIX_MISCII_OFFSET, pcix_misc2_temp);
} }
struct hpc_ops { int shpchp_power_on_slot(struct slot *slot);
int (*power_on_slot)(struct slot *slot); int shpchp_slot_enable(struct slot *slot);
int (*slot_enable)(struct slot *slot); int shpchp_slot_disable(struct slot *slot);
int (*slot_disable)(struct slot *slot); int shpchp_set_bus_speed_mode(struct slot *slot, enum pci_bus_speed speed);
int (*set_bus_speed_mode)(struct slot *slot, enum pci_bus_speed speed); int shpchp_get_power_status(struct slot *slot, u8 *status);
int (*get_power_status)(struct slot *slot, u8 *status); int shpchp_get_attention_status(struct slot *slot, u8 *status);
int (*get_attention_status)(struct slot *slot, u8 *status); int shpchp_set_attention_status(struct slot *slot, u8 status);
int (*set_attention_status)(struct slot *slot, u8 status); int shpchp_get_latch_status(struct slot *slot, u8 *status);
int (*get_latch_status)(struct slot *slot, u8 *status); int shpchp_get_adapter_status(struct slot *slot, u8 *status);
int (*get_adapter_status)(struct slot *slot, u8 *status); int shpchp_get_adapter_speed(struct slot *slot, enum pci_bus_speed *speed);
int (*get_adapter_speed)(struct slot *slot, enum pci_bus_speed *speed); int shpchp_get_prog_int(struct slot *slot, u8 *prog_int);
int (*get_prog_int)(struct slot *slot, u8 *prog_int); int shpchp_query_power_fault(struct slot *slot);
int (*query_power_fault)(struct slot *slot); void shpchp_green_led_on(struct slot *slot);
void (*green_led_on)(struct slot *slot); void shpchp_green_led_off(struct slot *slot);
void (*green_led_off)(struct slot *slot); void shpchp_green_led_blink(struct slot *slot);
void (*green_led_blink)(struct slot *slot); void shpchp_release_ctlr(struct controller *ctrl);
void (*release_ctlr)(struct controller *ctrl); int shpchp_check_cmd_status(struct controller *ctrl);
int (*check_cmd_status)(struct controller *ctrl);
};
#endif /* _SHPCHP_H */ #endif /* _SHPCHP_H */
...@@ -81,7 +81,6 @@ static int init_slots(struct controller *ctrl) ...@@ -81,7 +81,6 @@ static int init_slots(struct controller *ctrl)
slot->ctrl = ctrl; slot->ctrl = ctrl;
slot->bus = ctrl->pci_dev->subordinate->number; slot->bus = ctrl->pci_dev->subordinate->number;
slot->device = ctrl->slot_device_offset + i; slot->device = ctrl->slot_device_offset + i;
slot->hpc_ops = ctrl->hpc_ops;
slot->number = ctrl->first_slot + (ctrl->slot_num_inc * i); slot->number = ctrl->first_slot + (ctrl->slot_num_inc * i);
slot->wq = alloc_workqueue("shpchp-%d", 0, 0, slot->number); slot->wq = alloc_workqueue("shpchp-%d", 0, 0, slot->number);
...@@ -150,7 +149,7 @@ static int set_attention_status(struct hotplug_slot *hotplug_slot, u8 status) ...@@ -150,7 +149,7 @@ static int set_attention_status(struct hotplug_slot *hotplug_slot, u8 status)
__func__, slot_name(slot)); __func__, slot_name(slot));
slot->attention_save = status; slot->attention_save = status;
slot->hpc_ops->set_attention_status(slot, status); shpchp_set_attention_status(slot, status);
return 0; return 0;
} }
...@@ -183,7 +182,7 @@ static int get_power_status(struct hotplug_slot *hotplug_slot, u8 *value) ...@@ -183,7 +182,7 @@ static int get_power_status(struct hotplug_slot *hotplug_slot, u8 *value)
ctrl_dbg(slot->ctrl, "%s: physical_slot = %s\n", ctrl_dbg(slot->ctrl, "%s: physical_slot = %s\n",
__func__, slot_name(slot)); __func__, slot_name(slot));
retval = slot->hpc_ops->get_power_status(slot, value); retval = shpchp_get_power_status(slot, value);
if (retval < 0) if (retval < 0)
*value = slot->pwr_save; *value = slot->pwr_save;
...@@ -198,7 +197,7 @@ static int get_attention_status(struct hotplug_slot *hotplug_slot, u8 *value) ...@@ -198,7 +197,7 @@ static int get_attention_status(struct hotplug_slot *hotplug_slot, u8 *value)
ctrl_dbg(slot->ctrl, "%s: physical_slot = %s\n", ctrl_dbg(slot->ctrl, "%s: physical_slot = %s\n",
__func__, slot_name(slot)); __func__, slot_name(slot));
retval = slot->hpc_ops->get_attention_status(slot, value); retval = shpchp_get_attention_status(slot, value);
if (retval < 0) if (retval < 0)
*value = slot->attention_save; *value = slot->attention_save;
...@@ -213,7 +212,7 @@ static int get_latch_status(struct hotplug_slot *hotplug_slot, u8 *value) ...@@ -213,7 +212,7 @@ static int get_latch_status(struct hotplug_slot *hotplug_slot, u8 *value)
ctrl_dbg(slot->ctrl, "%s: physical_slot = %s\n", ctrl_dbg(slot->ctrl, "%s: physical_slot = %s\n",
__func__, slot_name(slot)); __func__, slot_name(slot));
retval = slot->hpc_ops->get_latch_status(slot, value); retval = shpchp_get_latch_status(slot, value);
if (retval < 0) if (retval < 0)
*value = slot->latch_save; *value = slot->latch_save;
...@@ -228,7 +227,7 @@ static int get_adapter_status(struct hotplug_slot *hotplug_slot, u8 *value) ...@@ -228,7 +227,7 @@ static int get_adapter_status(struct hotplug_slot *hotplug_slot, u8 *value)
ctrl_dbg(slot->ctrl, "%s: physical_slot = %s\n", ctrl_dbg(slot->ctrl, "%s: physical_slot = %s\n",
__func__, slot_name(slot)); __func__, slot_name(slot));
retval = slot->hpc_ops->get_adapter_status(slot, value); retval = shpchp_get_adapter_status(slot, value);
if (retval < 0) if (retval < 0)
*value = slot->presence_save; *value = slot->presence_save;
...@@ -293,7 +292,7 @@ static int shpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -293,7 +292,7 @@ static int shpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
err_cleanup_slots: err_cleanup_slots:
cleanup_slots(ctrl); cleanup_slots(ctrl);
err_out_release_ctlr: err_out_release_ctlr:
ctrl->hpc_ops->release_ctlr(ctrl); shpchp_release_ctlr(ctrl);
err_out_free_ctrl: err_out_free_ctrl:
kfree(ctrl); kfree(ctrl);
err_out_none: err_out_none:
...@@ -306,7 +305,7 @@ static void shpc_remove(struct pci_dev *dev) ...@@ -306,7 +305,7 @@ static void shpc_remove(struct pci_dev *dev)
dev->shpc_managed = 0; dev->shpc_managed = 0;
shpchp_remove_ctrl_files(ctrl); shpchp_remove_ctrl_files(ctrl);
ctrl->hpc_ops->release_ctlr(ctrl); shpchp_release_ctlr(ctrl);
kfree(ctrl); kfree(ctrl);
} }
......
...@@ -51,7 +51,7 @@ u8 shpchp_handle_attention_button(u8 hp_slot, struct controller *ctrl) ...@@ -51,7 +51,7 @@ u8 shpchp_handle_attention_button(u8 hp_slot, struct controller *ctrl)
ctrl_dbg(ctrl, "Attention button interrupt received\n"); ctrl_dbg(ctrl, "Attention button interrupt received\n");
p_slot = shpchp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset); p_slot = shpchp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset);
p_slot->hpc_ops->get_adapter_status(p_slot, &(p_slot->presence_save)); shpchp_get_adapter_status(p_slot, &p_slot->presence_save);
/* /*
* Button pressed - See if need to TAKE ACTION!!! * Button pressed - See if need to TAKE ACTION!!!
...@@ -75,8 +75,8 @@ u8 shpchp_handle_switch_change(u8 hp_slot, struct controller *ctrl) ...@@ -75,8 +75,8 @@ u8 shpchp_handle_switch_change(u8 hp_slot, struct controller *ctrl)
ctrl_dbg(ctrl, "Switch interrupt received\n"); ctrl_dbg(ctrl, "Switch interrupt received\n");
p_slot = shpchp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset); p_slot = shpchp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset);
p_slot->hpc_ops->get_adapter_status(p_slot, &(p_slot->presence_save)); shpchp_get_adapter_status(p_slot, &p_slot->presence_save);
p_slot->hpc_ops->get_latch_status(p_slot, &getstatus); shpchp_get_latch_status(p_slot, &getstatus);
ctrl_dbg(ctrl, "Card present %x Power status %x\n", ctrl_dbg(ctrl, "Card present %x Power status %x\n",
p_slot->presence_save, p_slot->pwr_save); p_slot->presence_save, p_slot->pwr_save);
...@@ -116,7 +116,7 @@ u8 shpchp_handle_presence_change(u8 hp_slot, struct controller *ctrl) ...@@ -116,7 +116,7 @@ u8 shpchp_handle_presence_change(u8 hp_slot, struct controller *ctrl)
/* /*
* Save the presence state * Save the presence state
*/ */
p_slot->hpc_ops->get_adapter_status(p_slot, &(p_slot->presence_save)); shpchp_get_adapter_status(p_slot, &p_slot->presence_save);
if (p_slot->presence_save) { if (p_slot->presence_save) {
/* /*
* Card Present * Card Present
...@@ -148,7 +148,7 @@ u8 shpchp_handle_power_fault(u8 hp_slot, struct controller *ctrl) ...@@ -148,7 +148,7 @@ u8 shpchp_handle_power_fault(u8 hp_slot, struct controller *ctrl)
p_slot = shpchp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset); p_slot = shpchp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset);
if (!(p_slot->hpc_ops->query_power_fault(p_slot))) { if (!(shpchp_query_power_fault(p_slot))) {
/* /*
* Power fault Cleared * Power fault Cleared
*/ */
...@@ -181,7 +181,7 @@ static int change_bus_speed(struct controller *ctrl, struct slot *p_slot, ...@@ -181,7 +181,7 @@ static int change_bus_speed(struct controller *ctrl, struct slot *p_slot,
int rc = 0; int rc = 0;
ctrl_dbg(ctrl, "Change speed to %d\n", speed); ctrl_dbg(ctrl, "Change speed to %d\n", speed);
rc = p_slot->hpc_ops->set_bus_speed_mode(p_slot, speed); rc = shpchp_set_bus_speed_mode(p_slot, speed);
if (rc) { if (rc) {
ctrl_err(ctrl, "%s: Issue of set bus speed mode command failed\n", ctrl_err(ctrl, "%s: Issue of set bus speed mode command failed\n",
__func__); __func__);
...@@ -241,14 +241,14 @@ static int board_added(struct slot *p_slot) ...@@ -241,14 +241,14 @@ static int board_added(struct slot *p_slot)
__func__, p_slot->device, ctrl->slot_device_offset, hp_slot); __func__, p_slot->device, ctrl->slot_device_offset, hp_slot);
/* Power on slot without connecting to bus */ /* Power on slot without connecting to bus */
rc = p_slot->hpc_ops->power_on_slot(p_slot); rc = shpchp_power_on_slot(p_slot);
if (rc) { if (rc) {
ctrl_err(ctrl, "Failed to power on slot\n"); ctrl_err(ctrl, "Failed to power on slot\n");
return -1; return -1;
} }
if ((ctrl->pci_dev->vendor == 0x8086) && (ctrl->pci_dev->device == 0x0332)) { if ((ctrl->pci_dev->vendor == 0x8086) && (ctrl->pci_dev->device == 0x0332)) {
rc = p_slot->hpc_ops->set_bus_speed_mode(p_slot, PCI_SPEED_33MHz); rc = shpchp_set_bus_speed_mode(p_slot, PCI_SPEED_33MHz);
if (rc) { if (rc) {
ctrl_err(ctrl, "%s: Issue of set bus speed mode command failed\n", ctrl_err(ctrl, "%s: Issue of set bus speed mode command failed\n",
__func__); __func__);
...@@ -256,14 +256,14 @@ static int board_added(struct slot *p_slot) ...@@ -256,14 +256,14 @@ static int board_added(struct slot *p_slot)
} }
/* turn on board, blink green LED, turn off Amber LED */ /* turn on board, blink green LED, turn off Amber LED */
rc = p_slot->hpc_ops->slot_enable(p_slot); rc = shpchp_slot_enable(p_slot);
if (rc) { if (rc) {
ctrl_err(ctrl, "Issue of Slot Enable command failed\n"); ctrl_err(ctrl, "Issue of Slot Enable command failed\n");
return rc; return rc;
} }
} }
rc = p_slot->hpc_ops->get_adapter_speed(p_slot, &asp); rc = shpchp_get_adapter_speed(p_slot, &asp);
if (rc) { if (rc) {
ctrl_err(ctrl, "Can't get adapter speed or bus mode mismatch\n"); ctrl_err(ctrl, "Can't get adapter speed or bus mode mismatch\n");
return WRONG_BUS_FREQUENCY; return WRONG_BUS_FREQUENCY;
...@@ -285,7 +285,7 @@ static int board_added(struct slot *p_slot) ...@@ -285,7 +285,7 @@ static int board_added(struct slot *p_slot)
return rc; return rc;
/* turn on board, blink green LED, turn off Amber LED */ /* turn on board, blink green LED, turn off Amber LED */
rc = p_slot->hpc_ops->slot_enable(p_slot); rc = shpchp_slot_enable(p_slot);
if (rc) { if (rc) {
ctrl_err(ctrl, "Issue of Slot Enable command failed\n"); ctrl_err(ctrl, "Issue of Slot Enable command failed\n");
return rc; return rc;
...@@ -313,13 +313,13 @@ static int board_added(struct slot *p_slot) ...@@ -313,13 +313,13 @@ static int board_added(struct slot *p_slot)
p_slot->is_a_board = 0x01; p_slot->is_a_board = 0x01;
p_slot->pwr_save = 1; p_slot->pwr_save = 1;
p_slot->hpc_ops->green_led_on(p_slot); shpchp_green_led_on(p_slot);
return 0; return 0;
err_exit: err_exit:
/* turn off slot, turn on Amber LED, turn off Green LED */ /* turn off slot, turn on Amber LED, turn off Green LED */
rc = p_slot->hpc_ops->slot_disable(p_slot); rc = shpchp_slot_disable(p_slot);
if (rc) { if (rc) {
ctrl_err(ctrl, "%s: Issue of Slot Disable command failed\n", ctrl_err(ctrl, "%s: Issue of Slot Disable command failed\n",
__func__); __func__);
...@@ -352,14 +352,14 @@ static int remove_board(struct slot *p_slot) ...@@ -352,14 +352,14 @@ static int remove_board(struct slot *p_slot)
p_slot->status = 0x01; p_slot->status = 0x01;
/* turn off slot, turn on Amber LED, turn off Green LED */ /* turn off slot, turn on Amber LED, turn off Green LED */
rc = p_slot->hpc_ops->slot_disable(p_slot); rc = shpchp_slot_disable(p_slot);
if (rc) { if (rc) {
ctrl_err(ctrl, "%s: Issue of Slot Disable command failed\n", ctrl_err(ctrl, "%s: Issue of Slot Disable command failed\n",
__func__); __func__);
return rc; return rc;
} }
rc = p_slot->hpc_ops->set_attention_status(p_slot, 0); rc = shpchp_set_attention_status(p_slot, 0);
if (rc) { if (rc) {
ctrl_err(ctrl, "Issue of Set Attention command failed\n"); ctrl_err(ctrl, "Issue of Set Attention command failed\n");
return rc; return rc;
...@@ -401,7 +401,7 @@ static void shpchp_pushbutton_thread(struct work_struct *work) ...@@ -401,7 +401,7 @@ static void shpchp_pushbutton_thread(struct work_struct *work)
case POWERON_STATE: case POWERON_STATE:
mutex_unlock(&p_slot->lock); mutex_unlock(&p_slot->lock);
if (shpchp_enable_slot(p_slot)) if (shpchp_enable_slot(p_slot))
p_slot->hpc_ops->green_led_off(p_slot); shpchp_green_led_off(p_slot);
mutex_lock(&p_slot->lock); mutex_lock(&p_slot->lock);
p_slot->state = STATIC_STATE; p_slot->state = STATIC_STATE;
break; break;
...@@ -446,10 +446,10 @@ void shpchp_queue_pushbutton_work(struct work_struct *work) ...@@ -446,10 +446,10 @@ void shpchp_queue_pushbutton_work(struct work_struct *work)
static void update_slot_info(struct slot *slot) static void update_slot_info(struct slot *slot)
{ {
slot->hpc_ops->get_power_status(slot, &slot->pwr_save); shpchp_get_power_status(slot, &slot->pwr_save);
slot->hpc_ops->get_attention_status(slot, &slot->attention_save); shpchp_get_attention_status(slot, &slot->attention_save);
slot->hpc_ops->get_latch_status(slot, &slot->latch_save); shpchp_get_latch_status(slot, &slot->latch_save);
slot->hpc_ops->get_adapter_status(slot, &slot->presence_save); shpchp_get_adapter_status(slot, &slot->presence_save);
} }
/* /*
...@@ -462,7 +462,7 @@ static void handle_button_press_event(struct slot *p_slot) ...@@ -462,7 +462,7 @@ static void handle_button_press_event(struct slot *p_slot)
switch (p_slot->state) { switch (p_slot->state) {
case STATIC_STATE: case STATIC_STATE:
p_slot->hpc_ops->get_power_status(p_slot, &getstatus); shpchp_get_power_status(p_slot, &getstatus);
if (getstatus) { if (getstatus) {
p_slot->state = BLINKINGOFF_STATE; p_slot->state = BLINKINGOFF_STATE;
ctrl_info(ctrl, "PCI slot #%s - powering off due to button press\n", ctrl_info(ctrl, "PCI slot #%s - powering off due to button press\n",
...@@ -473,8 +473,8 @@ static void handle_button_press_event(struct slot *p_slot) ...@@ -473,8 +473,8 @@ static void handle_button_press_event(struct slot *p_slot)
slot_name(p_slot)); slot_name(p_slot));
} }
/* blink green LED and turn off amber */ /* blink green LED and turn off amber */
p_slot->hpc_ops->green_led_blink(p_slot); shpchp_green_led_blink(p_slot);
p_slot->hpc_ops->set_attention_status(p_slot, 0); shpchp_set_attention_status(p_slot, 0);
queue_delayed_work(p_slot->wq, &p_slot->work, 5*HZ); queue_delayed_work(p_slot->wq, &p_slot->work, 5*HZ);
break; break;
...@@ -489,10 +489,10 @@ static void handle_button_press_event(struct slot *p_slot) ...@@ -489,10 +489,10 @@ static void handle_button_press_event(struct slot *p_slot)
slot_name(p_slot)); slot_name(p_slot));
cancel_delayed_work(&p_slot->work); cancel_delayed_work(&p_slot->work);
if (p_slot->state == BLINKINGOFF_STATE) if (p_slot->state == BLINKINGOFF_STATE)
p_slot->hpc_ops->green_led_on(p_slot); shpchp_green_led_on(p_slot);
else else
p_slot->hpc_ops->green_led_off(p_slot); shpchp_green_led_off(p_slot);
p_slot->hpc_ops->set_attention_status(p_slot, 0); shpchp_set_attention_status(p_slot, 0);
ctrl_info(ctrl, "PCI slot #%s - action canceled due to button press\n", ctrl_info(ctrl, "PCI slot #%s - action canceled due to button press\n",
slot_name(p_slot)); slot_name(p_slot));
p_slot->state = STATIC_STATE; p_slot->state = STATIC_STATE;
...@@ -526,8 +526,8 @@ static void interrupt_event_handler(struct work_struct *work) ...@@ -526,8 +526,8 @@ static void interrupt_event_handler(struct work_struct *work)
break; break;
case INT_POWER_FAULT: case INT_POWER_FAULT:
ctrl_dbg(p_slot->ctrl, "%s: Power fault\n", __func__); ctrl_dbg(p_slot->ctrl, "%s: Power fault\n", __func__);
p_slot->hpc_ops->set_attention_status(p_slot, 1); shpchp_set_attention_status(p_slot, 1);
p_slot->hpc_ops->green_led_off(p_slot); shpchp_green_led_off(p_slot);
break; break;
default: default:
update_slot_info(p_slot); update_slot_info(p_slot);
...@@ -547,17 +547,17 @@ static int shpchp_enable_slot (struct slot *p_slot) ...@@ -547,17 +547,17 @@ static int shpchp_enable_slot (struct slot *p_slot)
/* Check to see if (latch closed, card present, power off) */ /* Check to see if (latch closed, card present, power off) */
mutex_lock(&p_slot->ctrl->crit_sect); mutex_lock(&p_slot->ctrl->crit_sect);
rc = p_slot->hpc_ops->get_adapter_status(p_slot, &getstatus); rc = shpchp_get_adapter_status(p_slot, &getstatus);
if (rc || !getstatus) { if (rc || !getstatus) {
ctrl_info(ctrl, "No adapter on slot(%s)\n", slot_name(p_slot)); ctrl_info(ctrl, "No adapter on slot(%s)\n", slot_name(p_slot));
goto out; goto out;
} }
rc = p_slot->hpc_ops->get_latch_status(p_slot, &getstatus); rc = shpchp_get_latch_status(p_slot, &getstatus);
if (rc || getstatus) { if (rc || getstatus) {
ctrl_info(ctrl, "Latch open on slot(%s)\n", slot_name(p_slot)); ctrl_info(ctrl, "Latch open on slot(%s)\n", slot_name(p_slot));
goto out; goto out;
} }
rc = p_slot->hpc_ops->get_power_status(p_slot, &getstatus); rc = shpchp_get_power_status(p_slot, &getstatus);
if (rc || getstatus) { if (rc || getstatus) {
ctrl_info(ctrl, "Already enabled on slot(%s)\n", ctrl_info(ctrl, "Already enabled on slot(%s)\n",
slot_name(p_slot)); slot_name(p_slot));
...@@ -567,10 +567,10 @@ static int shpchp_enable_slot (struct slot *p_slot) ...@@ -567,10 +567,10 @@ static int shpchp_enable_slot (struct slot *p_slot)
p_slot->is_a_board = 1; p_slot->is_a_board = 1;
/* We have to save the presence info for these slots */ /* We have to save the presence info for these slots */
p_slot->hpc_ops->get_adapter_status(p_slot, &(p_slot->presence_save)); shpchp_get_adapter_status(p_slot, &p_slot->presence_save);
p_slot->hpc_ops->get_power_status(p_slot, &(p_slot->pwr_save)); shpchp_get_power_status(p_slot, &p_slot->pwr_save);
ctrl_dbg(ctrl, "%s: p_slot->pwr_save %x\n", __func__, p_slot->pwr_save); ctrl_dbg(ctrl, "%s: p_slot->pwr_save %x\n", __func__, p_slot->pwr_save);
p_slot->hpc_ops->get_latch_status(p_slot, &getstatus); shpchp_get_latch_status(p_slot, &getstatus);
if ((p_slot->ctrl->pci_dev->vendor == PCI_VENDOR_ID_AMD && if ((p_slot->ctrl->pci_dev->vendor == PCI_VENDOR_ID_AMD &&
p_slot->ctrl->pci_dev->device == PCI_DEVICE_ID_AMD_POGO_7458) p_slot->ctrl->pci_dev->device == PCI_DEVICE_ID_AMD_POGO_7458)
...@@ -584,9 +584,8 @@ static int shpchp_enable_slot (struct slot *p_slot) ...@@ -584,9 +584,8 @@ static int shpchp_enable_slot (struct slot *p_slot)
retval = board_added(p_slot); retval = board_added(p_slot);
if (retval) { if (retval) {
p_slot->hpc_ops->get_adapter_status(p_slot, shpchp_get_adapter_status(p_slot, &p_slot->presence_save);
&(p_slot->presence_save)); shpchp_get_latch_status(p_slot, &getstatus);
p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
} }
update_slot_info(p_slot); update_slot_info(p_slot);
...@@ -608,17 +607,17 @@ static int shpchp_disable_slot (struct slot *p_slot) ...@@ -608,17 +607,17 @@ static int shpchp_disable_slot (struct slot *p_slot)
/* Check to see if (latch closed, card present, power on) */ /* Check to see if (latch closed, card present, power on) */
mutex_lock(&p_slot->ctrl->crit_sect); mutex_lock(&p_slot->ctrl->crit_sect);
rc = p_slot->hpc_ops->get_adapter_status(p_slot, &getstatus); rc = shpchp_get_adapter_status(p_slot, &getstatus);
if (rc || !getstatus) { if (rc || !getstatus) {
ctrl_info(ctrl, "No adapter on slot(%s)\n", slot_name(p_slot)); ctrl_info(ctrl, "No adapter on slot(%s)\n", slot_name(p_slot));
goto out; goto out;
} }
rc = p_slot->hpc_ops->get_latch_status(p_slot, &getstatus); rc = shpchp_get_latch_status(p_slot, &getstatus);
if (rc || getstatus) { if (rc || getstatus) {
ctrl_info(ctrl, "Latch open on slot(%s)\n", slot_name(p_slot)); ctrl_info(ctrl, "Latch open on slot(%s)\n", slot_name(p_slot));
goto out; goto out;
} }
rc = p_slot->hpc_ops->get_power_status(p_slot, &getstatus); rc = shpchp_get_power_status(p_slot, &getstatus);
if (rc || !getstatus) { if (rc || !getstatus) {
ctrl_info(ctrl, "Already disabled on slot(%s)\n", ctrl_info(ctrl, "Already disabled on slot(%s)\n",
slot_name(p_slot)); slot_name(p_slot));
......
...@@ -167,7 +167,6 @@ ...@@ -167,7 +167,6 @@
static irqreturn_t shpc_isr(int irq, void *dev_id); static irqreturn_t shpc_isr(int irq, void *dev_id);
static void start_int_poll_timer(struct controller *ctrl, int sec); static void start_int_poll_timer(struct controller *ctrl, int sec);
static int hpc_check_cmd_status(struct controller *ctrl);
static inline u8 shpc_readb(struct controller *ctrl, int reg) static inline u8 shpc_readb(struct controller *ctrl, int reg)
{ {
...@@ -317,7 +316,7 @@ static int shpc_write_cmd(struct slot *slot, u8 t_slot, u8 cmd) ...@@ -317,7 +316,7 @@ static int shpc_write_cmd(struct slot *slot, u8 t_slot, u8 cmd)
if (retval) if (retval)
goto out; goto out;
cmd_status = hpc_check_cmd_status(slot->ctrl); cmd_status = shpchp_check_cmd_status(slot->ctrl);
if (cmd_status) { if (cmd_status) {
ctrl_err(ctrl, "Failed to issued command 0x%x (error code = %d)\n", ctrl_err(ctrl, "Failed to issued command 0x%x (error code = %d)\n",
cmd, cmd_status); cmd, cmd_status);
...@@ -328,7 +327,7 @@ static int shpc_write_cmd(struct slot *slot, u8 t_slot, u8 cmd) ...@@ -328,7 +327,7 @@ static int shpc_write_cmd(struct slot *slot, u8 t_slot, u8 cmd)
return retval; return retval;
} }
static int hpc_check_cmd_status(struct controller *ctrl) int shpchp_check_cmd_status(struct controller *ctrl)
{ {
int retval = 0; int retval = 0;
u16 cmd_status = shpc_readw(ctrl, CMD_STATUS) & 0x000F; u16 cmd_status = shpc_readw(ctrl, CMD_STATUS) & 0x000F;
...@@ -357,7 +356,7 @@ static int hpc_check_cmd_status(struct controller *ctrl) ...@@ -357,7 +356,7 @@ static int hpc_check_cmd_status(struct controller *ctrl)
} }
static int hpc_get_attention_status(struct slot *slot, u8 *status) int shpchp_get_attention_status(struct slot *slot, u8 *status)
{ {
struct controller *ctrl = slot->ctrl; struct controller *ctrl = slot->ctrl;
u32 slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot)); u32 slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot));
...@@ -381,7 +380,7 @@ static int hpc_get_attention_status(struct slot *slot, u8 *status) ...@@ -381,7 +380,7 @@ static int hpc_get_attention_status(struct slot *slot, u8 *status)
return 0; return 0;
} }
static int hpc_get_power_status(struct slot *slot, u8 *status) int shpchp_get_power_status(struct slot *slot, u8 *status)
{ {
struct controller *ctrl = slot->ctrl; struct controller *ctrl = slot->ctrl;
u32 slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot)); u32 slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot));
...@@ -406,7 +405,7 @@ static int hpc_get_power_status(struct slot *slot, u8 *status) ...@@ -406,7 +405,7 @@ static int hpc_get_power_status(struct slot *slot, u8 *status)
} }
static int hpc_get_latch_status(struct slot *slot, u8 *status) int shpchp_get_latch_status(struct slot *slot, u8 *status)
{ {
struct controller *ctrl = slot->ctrl; struct controller *ctrl = slot->ctrl;
u32 slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot)); u32 slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot));
...@@ -416,7 +415,7 @@ static int hpc_get_latch_status(struct slot *slot, u8 *status) ...@@ -416,7 +415,7 @@ static int hpc_get_latch_status(struct slot *slot, u8 *status)
return 0; return 0;
} }
static int hpc_get_adapter_status(struct slot *slot, u8 *status) int shpchp_get_adapter_status(struct slot *slot, u8 *status)
{ {
struct controller *ctrl = slot->ctrl; struct controller *ctrl = slot->ctrl;
u32 slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot)); u32 slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot));
...@@ -427,7 +426,7 @@ static int hpc_get_adapter_status(struct slot *slot, u8 *status) ...@@ -427,7 +426,7 @@ static int hpc_get_adapter_status(struct slot *slot, u8 *status)
return 0; return 0;
} }
static int hpc_get_prog_int(struct slot *slot, u8 *prog_int) int shpchp_get_prog_int(struct slot *slot, u8 *prog_int)
{ {
struct controller *ctrl = slot->ctrl; struct controller *ctrl = slot->ctrl;
...@@ -436,7 +435,7 @@ static int hpc_get_prog_int(struct slot *slot, u8 *prog_int) ...@@ -436,7 +435,7 @@ static int hpc_get_prog_int(struct slot *slot, u8 *prog_int)
return 0; return 0;
} }
static int hpc_get_adapter_speed(struct slot *slot, enum pci_bus_speed *value) int shpchp_get_adapter_speed(struct slot *slot, enum pci_bus_speed *value)
{ {
int retval = 0; int retval = 0;
struct controller *ctrl = slot->ctrl; struct controller *ctrl = slot->ctrl;
...@@ -444,7 +443,7 @@ static int hpc_get_adapter_speed(struct slot *slot, enum pci_bus_speed *value) ...@@ -444,7 +443,7 @@ static int hpc_get_adapter_speed(struct slot *slot, enum pci_bus_speed *value)
u8 m66_cap = !!(slot_reg & MHZ66_CAP); u8 m66_cap = !!(slot_reg & MHZ66_CAP);
u8 pi, pcix_cap; u8 pi, pcix_cap;
retval = hpc_get_prog_int(slot, &pi); retval = shpchp_get_prog_int(slot, &pi);
if (retval) if (retval)
return retval; return retval;
...@@ -489,7 +488,7 @@ static int hpc_get_adapter_speed(struct slot *slot, enum pci_bus_speed *value) ...@@ -489,7 +488,7 @@ static int hpc_get_adapter_speed(struct slot *slot, enum pci_bus_speed *value)
return retval; return retval;
} }
static int hpc_query_power_fault(struct slot *slot) int shpchp_query_power_fault(struct slot *slot)
{ {
struct controller *ctrl = slot->ctrl; struct controller *ctrl = slot->ctrl;
u32 slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot)); u32 slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot));
...@@ -498,7 +497,7 @@ static int hpc_query_power_fault(struct slot *slot) ...@@ -498,7 +497,7 @@ static int hpc_query_power_fault(struct slot *slot)
return !(slot_reg & POWER_FAULT); return !(slot_reg & POWER_FAULT);
} }
static int hpc_set_attention_status(struct slot *slot, u8 value) int shpchp_set_attention_status(struct slot *slot, u8 value)
{ {
u8 slot_cmd = 0; u8 slot_cmd = 0;
...@@ -520,22 +519,22 @@ static int hpc_set_attention_status(struct slot *slot, u8 value) ...@@ -520,22 +519,22 @@ static int hpc_set_attention_status(struct slot *slot, u8 value)
} }
static void hpc_set_green_led_on(struct slot *slot) void shpchp_green_led_on(struct slot *slot)
{ {
shpc_write_cmd(slot, slot->hp_slot, SET_PWR_ON); shpc_write_cmd(slot, slot->hp_slot, SET_PWR_ON);
} }
static void hpc_set_green_led_off(struct slot *slot) void shpchp_green_led_off(struct slot *slot)
{ {
shpc_write_cmd(slot, slot->hp_slot, SET_PWR_OFF); shpc_write_cmd(slot, slot->hp_slot, SET_PWR_OFF);
} }
static void hpc_set_green_led_blink(struct slot *slot) void shpchp_green_led_blink(struct slot *slot)
{ {
shpc_write_cmd(slot, slot->hp_slot, SET_PWR_BLINK); shpc_write_cmd(slot, slot->hp_slot, SET_PWR_BLINK);
} }
static void hpc_release_ctlr(struct controller *ctrl) void shpchp_release_ctlr(struct controller *ctrl)
{ {
int i; int i;
u32 slot_reg, serr_int; u32 slot_reg, serr_int;
...@@ -575,7 +574,7 @@ static void hpc_release_ctlr(struct controller *ctrl) ...@@ -575,7 +574,7 @@ static void hpc_release_ctlr(struct controller *ctrl)
release_mem_region(ctrl->mmio_base, ctrl->mmio_size); release_mem_region(ctrl->mmio_base, ctrl->mmio_size);
} }
static int hpc_power_on_slot(struct slot *slot) int shpchp_power_on_slot(struct slot *slot)
{ {
int retval; int retval;
...@@ -586,7 +585,7 @@ static int hpc_power_on_slot(struct slot *slot) ...@@ -586,7 +585,7 @@ static int hpc_power_on_slot(struct slot *slot)
return retval; return retval;
} }
static int hpc_slot_enable(struct slot *slot) int shpchp_slot_enable(struct slot *slot)
{ {
int retval; int retval;
...@@ -599,7 +598,7 @@ static int hpc_slot_enable(struct slot *slot) ...@@ -599,7 +598,7 @@ static int hpc_slot_enable(struct slot *slot)
return retval; return retval;
} }
static int hpc_slot_disable(struct slot *slot) int shpchp_slot_disable(struct slot *slot)
{ {
int retval; int retval;
...@@ -681,7 +680,7 @@ static int shpc_get_cur_bus_speed(struct controller *ctrl) ...@@ -681,7 +680,7 @@ static int shpc_get_cur_bus_speed(struct controller *ctrl)
} }
static int hpc_set_bus_speed_mode(struct slot *slot, enum pci_bus_speed value) int shpchp_set_bus_speed_mode(struct slot *slot, enum pci_bus_speed value)
{ {
int retval; int retval;
struct controller *ctrl = slot->ctrl; struct controller *ctrl = slot->ctrl;
...@@ -871,28 +870,6 @@ static int shpc_get_max_bus_speed(struct controller *ctrl) ...@@ -871,28 +870,6 @@ static int shpc_get_max_bus_speed(struct controller *ctrl)
return retval; return retval;
} }
static const struct hpc_ops shpchp_hpc_ops = {
.power_on_slot = hpc_power_on_slot,
.slot_enable = hpc_slot_enable,
.slot_disable = hpc_slot_disable,
.set_bus_speed_mode = hpc_set_bus_speed_mode,
.set_attention_status = hpc_set_attention_status,
.get_power_status = hpc_get_power_status,
.get_attention_status = hpc_get_attention_status,
.get_latch_status = hpc_get_latch_status,
.get_adapter_status = hpc_get_adapter_status,
.get_adapter_speed = hpc_get_adapter_speed,
.get_prog_int = hpc_get_prog_int,
.query_power_fault = hpc_query_power_fault,
.green_led_on = hpc_set_green_led_on,
.green_led_off = hpc_set_green_led_off,
.green_led_blink = hpc_set_green_led_blink,
.release_ctlr = hpc_release_ctlr,
};
int shpc_init(struct controller *ctrl, struct pci_dev *pdev) int shpc_init(struct controller *ctrl, struct pci_dev *pdev)
{ {
int rc = -1, num_slots = 0; int rc = -1, num_slots = 0;
...@@ -978,8 +955,6 @@ int shpc_init(struct controller *ctrl, struct pci_dev *pdev) ...@@ -978,8 +955,6 @@ int shpc_init(struct controller *ctrl, struct pci_dev *pdev)
/* Setup wait queue */ /* Setup wait queue */
init_waitqueue_head(&ctrl->queue); init_waitqueue_head(&ctrl->queue);
ctrl->hpc_ops = &shpchp_hpc_ops;
/* Return PCI Controller Info */ /* Return PCI Controller Info */
slot_config = shpc_readl(ctrl, SLOT_CONFIG); slot_config = shpc_readl(ctrl, SLOT_CONFIG);
ctrl->slot_device_offset = (slot_config & FIRST_DEV_NUM) >> 8; ctrl->slot_device_offset = (slot_config & FIRST_DEV_NUM) >> 8;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment