mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-20 03:04:01 +08:00
PCI: pciehp: return error on read/write failure
Current pciehp returns successfully on read/write failure with dummy state values. It should return error instead. With this patch, pciehp no longer uses hotplug_slot_info data structure. So this also removes hotplug_slot_info related code. But note that it still allocates hotplug_slot_info because it is required by pci hotplug core. Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
This commit is contained in:
parent
586f1d6688
commit
445f798555
drivers/pci/hotplug
@ -135,15 +135,9 @@ static int init_slot(struct controller *ctrl)
|
||||
ctrl->pcie->port->subordinate->number, PSN(ctrl));
|
||||
retval = pci_hp_register(hotplug,
|
||||
ctrl->pcie->port->subordinate, 0, name);
|
||||
if (retval) {
|
||||
if (retval)
|
||||
ctrl_err(ctrl,
|
||||
"pci_hp_register failed with error %d\n", retval);
|
||||
goto out;
|
||||
}
|
||||
get_power_status(hotplug, &info->power_status);
|
||||
get_attention_status(hotplug, &info->attention_status);
|
||||
get_latch_status(hotplug, &info->latch_status);
|
||||
get_adapter_status(hotplug, &info->adapter_status);
|
||||
out:
|
||||
if (retval) {
|
||||
kfree(ops);
|
||||
@ -168,10 +162,7 @@ static int set_attention_status(struct hotplug_slot *hotplug_slot, u8 status)
|
||||
ctrl_dbg(slot->ctrl, "%s: physical_slot = %s\n",
|
||||
__func__, slot_name(slot));
|
||||
|
||||
hotplug_slot->info->attention_status = status;
|
||||
pciehp_set_attention_status(slot, status);
|
||||
|
||||
return 0;
|
||||
return pciehp_set_attention_status(slot, status);
|
||||
}
|
||||
|
||||
|
||||
@ -199,92 +190,62 @@ static int disable_slot(struct hotplug_slot *hotplug_slot)
|
||||
static int get_power_status(struct hotplug_slot *hotplug_slot, u8 *value)
|
||||
{
|
||||
struct slot *slot = hotplug_slot->private;
|
||||
int retval;
|
||||
|
||||
ctrl_dbg(slot->ctrl, "%s: physical_slot = %s\n",
|
||||
__func__, slot_name(slot));
|
||||
|
||||
retval = pciehp_get_power_status(slot, value);
|
||||
if (retval < 0)
|
||||
*value = hotplug_slot->info->power_status;
|
||||
|
||||
return 0;
|
||||
return pciehp_get_power_status(slot, value);
|
||||
}
|
||||
|
||||
static int get_attention_status(struct hotplug_slot *hotplug_slot, u8 *value)
|
||||
{
|
||||
struct slot *slot = hotplug_slot->private;
|
||||
int retval;
|
||||
|
||||
ctrl_dbg(slot->ctrl, "%s: physical_slot = %s\n",
|
||||
__func__, slot_name(slot));
|
||||
|
||||
retval = pciehp_get_attention_status(slot, value);
|
||||
if (retval < 0)
|
||||
*value = hotplug_slot->info->attention_status;
|
||||
|
||||
return 0;
|
||||
return pciehp_get_attention_status(slot, value);
|
||||
}
|
||||
|
||||
static int get_latch_status(struct hotplug_slot *hotplug_slot, u8 *value)
|
||||
{
|
||||
struct slot *slot = hotplug_slot->private;
|
||||
int retval;
|
||||
|
||||
ctrl_dbg(slot->ctrl, "%s: physical_slot = %s\n",
|
||||
__func__, slot_name(slot));
|
||||
|
||||
retval = pciehp_get_latch_status(slot, value);
|
||||
if (retval < 0)
|
||||
*value = hotplug_slot->info->latch_status;
|
||||
|
||||
return 0;
|
||||
return pciehp_get_latch_status(slot, value);
|
||||
}
|
||||
|
||||
static int get_adapter_status(struct hotplug_slot *hotplug_slot, u8 *value)
|
||||
{
|
||||
struct slot *slot = hotplug_slot->private;
|
||||
int retval;
|
||||
|
||||
ctrl_dbg(slot->ctrl, "%s: physical_slot = %s\n",
|
||||
__func__, slot_name(slot));
|
||||
|
||||
retval = pciehp_get_adapter_status(slot, value);
|
||||
if (retval < 0)
|
||||
*value = hotplug_slot->info->adapter_status;
|
||||
|
||||
return 0;
|
||||
return pciehp_get_adapter_status(slot, value);
|
||||
}
|
||||
|
||||
static int get_max_bus_speed(struct hotplug_slot *hotplug_slot,
|
||||
enum pci_bus_speed *value)
|
||||
{
|
||||
struct slot *slot = hotplug_slot->private;
|
||||
int retval;
|
||||
|
||||
ctrl_dbg(slot->ctrl, "%s: physical_slot = %s\n",
|
||||
__func__, slot_name(slot));
|
||||
|
||||
retval = pciehp_get_max_link_speed(slot, value);
|
||||
if (retval < 0)
|
||||
*value = PCI_SPEED_UNKNOWN;
|
||||
|
||||
return 0;
|
||||
return pciehp_get_max_link_speed(slot, value);
|
||||
}
|
||||
|
||||
static int get_cur_bus_speed(struct hotplug_slot *hotplug_slot, enum pci_bus_speed *value)
|
||||
{
|
||||
struct slot *slot = hotplug_slot->private;
|
||||
int retval;
|
||||
|
||||
ctrl_dbg(slot->ctrl, "%s: physical_slot = %s\n",
|
||||
__func__, slot_name(slot));
|
||||
|
||||
retval = pciehp_get_cur_link_speed(slot, value);
|
||||
if (retval < 0)
|
||||
*value = PCI_SPEED_UNKNOWN;
|
||||
|
||||
return 0;
|
||||
return pciehp_get_cur_link_speed(slot, value);
|
||||
}
|
||||
|
||||
static int pciehp_probe(struct pcie_device *dev)
|
||||
|
@ -363,25 +363,6 @@ void pciehp_queue_pushbutton_work(struct work_struct *work)
|
||||
mutex_unlock(&p_slot->lock);
|
||||
}
|
||||
|
||||
static int update_slot_info(struct slot *slot)
|
||||
{
|
||||
struct hotplug_slot_info *info;
|
||||
int result;
|
||||
|
||||
info = kmalloc(sizeof(*info), GFP_KERNEL);
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
|
||||
pciehp_get_power_status(slot, &info->power_status);
|
||||
pciehp_get_attention_status(slot, &info->attention_status);
|
||||
pciehp_get_latch_status(slot, &info->latch_status);
|
||||
pciehp_get_adapter_status(slot, &info->adapter_status);
|
||||
|
||||
result = pci_hp_change_slot_info(slot->hotplug_slot, info);
|
||||
kfree (info);
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* Note: This function must be called with slot->lock held
|
||||
*/
|
||||
@ -442,7 +423,6 @@ static void handle_button_press_event(struct slot *p_slot)
|
||||
* to hot-add or hot-remove is undergoing
|
||||
*/
|
||||
ctrl_info(ctrl, "Button ignore on Slot(%s)\n", slot_name(p_slot));
|
||||
update_slot_info(p_slot);
|
||||
break;
|
||||
default:
|
||||
ctrl_warn(ctrl, "Not a valid state\n");
|
||||
@ -500,11 +480,9 @@ static void interrupt_event_handler(struct work_struct *work)
|
||||
if (!HP_SUPR_RM(ctrl))
|
||||
break;
|
||||
ctrl_dbg(ctrl, "Surprise Removal\n");
|
||||
update_slot_info(p_slot);
|
||||
handle_surprise_event(p_slot);
|
||||
break;
|
||||
default:
|
||||
update_slot_info(p_slot);
|
||||
break;
|
||||
}
|
||||
mutex_unlock(&p_slot->lock);
|
||||
@ -547,9 +525,6 @@ int pciehp_enable_slot(struct slot *p_slot)
|
||||
if (rc) {
|
||||
pciehp_get_latch_status(p_slot, &getstatus);
|
||||
}
|
||||
|
||||
update_slot_info(p_slot);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -590,10 +565,7 @@ int pciehp_disable_slot(struct slot *p_slot)
|
||||
}
|
||||
}
|
||||
|
||||
ret = remove_board(p_slot);
|
||||
update_slot_info(p_slot);
|
||||
|
||||
return ret;
|
||||
return remove_board(p_slot);
|
||||
}
|
||||
|
||||
int pciehp_sysfs_enable_slot(struct slot *p_slot)
|
||||
|
@ -427,27 +427,24 @@ int pciehp_set_attention_status(struct slot *slot, u8 value)
|
||||
struct controller *ctrl = slot->ctrl;
|
||||
u16 slot_cmd;
|
||||
u16 cmd_mask;
|
||||
int rc;
|
||||
|
||||
cmd_mask = PCI_EXP_SLTCTL_AIC;
|
||||
switch (value) {
|
||||
case 0 : /* turn off */
|
||||
slot_cmd = 0x00C0;
|
||||
break;
|
||||
case 1: /* turn on */
|
||||
slot_cmd = 0x0040;
|
||||
break;
|
||||
case 2: /* turn blink */
|
||||
slot_cmd = 0x0080;
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
case 0 : /* turn off */
|
||||
slot_cmd = 0x00C0;
|
||||
break;
|
||||
case 1: /* turn on */
|
||||
slot_cmd = 0x0040;
|
||||
break;
|
||||
case 2: /* turn blink */
|
||||
slot_cmd = 0x0080;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
rc = pcie_write_cmd(ctrl, slot_cmd, cmd_mask);
|
||||
ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n",
|
||||
__func__, ctrl->cap_base + PCI_EXP_SLTCTL, slot_cmd);
|
||||
|
||||
return rc;
|
||||
return pcie_write_cmd(ctrl, slot_cmd, cmd_mask);
|
||||
}
|
||||
|
||||
void pciehp_green_led_on(struct slot *slot)
|
||||
|
Loading…
Reference in New Issue
Block a user