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

Commit 7f822999 authored by Yinghai Lu's avatar Yinghai Lu Committed by Jesse Barnes
Browse files

PCI: pciehp: Add Disable/enable link functions



Will use it during power off/on of slots

Signed-off-by: default avatarYinghai Lu <yinghai.lu@oracle.com>
Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
parent bffe4f72
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -352,6 +352,42 @@ int pciehp_check_link_status(struct controller *ctrl)
	return retval;
}

static int __pciehp_link_set(struct controller *ctrl, bool enable)
{
	u16 lnk_ctrl;
	int retval = 0;

	retval = pciehp_readw(ctrl, PCI_EXP_LNKCTL, &lnk_ctrl);
	if (retval) {
		ctrl_err(ctrl, "Cannot read LNKCTRL register\n");
		return retval;
	}

	if (enable)
		lnk_ctrl &= ~PCI_EXP_LNKCTL_LD;
	else
		lnk_ctrl |= PCI_EXP_LNKCTL_LD;

	retval = pciehp_writew(ctrl, PCI_EXP_LNKCTL, lnk_ctrl);
	if (retval) {
		ctrl_err(ctrl, "Cannot write LNKCTRL register\n");
		return retval;
	}
	ctrl_dbg(ctrl, "%s: lnk_ctrl = %x\n", __func__, lnk_ctrl);

	return retval;
}

static int pciehp_link_enable(struct controller *ctrl)
{
	return __pciehp_link_set(ctrl, true);
}

static int pciehp_link_disable(struct controller *ctrl)
{
	return __pciehp_link_set(ctrl, false);
}

int pciehp_get_attention_status(struct slot *slot, u8 *status)
{
	struct controller *ctrl = slot->ctrl;