Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 445f7985 authored by Kenji Kaneshige's avatar Kenji Kaneshige Committed by Jesse Barnes
Browse files

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: default avatarKenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
parent 586f1d66
Loading
Loading
Loading
Loading
+8 −47
Original line number Diff line number Diff line
@@ -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)
+1 −29
Original line number Diff line number Diff line
@@ -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)
+13 −16
Original line number Diff line number Diff line
@@ -427,7 +427,6 @@ 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) {
@@ -441,13 +440,11 @@ int pciehp_set_attention_status(struct slot *slot, u8 value)
		slot_cmd = 0x0080;
		break;
	default:
			return -1;
		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)