|
@@ -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;
|