Fix some logic in PCIe HotPlug; display EI status
The interpretation of the Electromechanical Interlock Status was inverted, so we disengaged the EI if a card was inserted. Fix it to engage the EI if a card is inserted. When displaying the slot capabilites/status with pciconf: - We inverted the sense of the Power Controller Control bit, saying the power was off when it was really on (according to this bit). Fix that. - Display the status of the Electromechanical Interlock: EI(engaged) EI(disengaged) Reviewed by: jhb MFC after: 3 days Sponsored by: Dell Inc. Differential Revision: https://reviews.freebsd.org/D7426
This commit is contained in:
parent
583afc921b
commit
8478efdf71
@ -1057,7 +1057,7 @@ static void
|
||||
pcib_pcie_hotplug_update(struct pcib_softc *sc, uint16_t val, uint16_t mask,
|
||||
bool schedule_task)
|
||||
{
|
||||
bool card_inserted;
|
||||
bool card_inserted, ei_engaged;
|
||||
|
||||
/* Clear DETACHING if Present Detect has cleared. */
|
||||
if ((sc->pcie_slot_sta & (PCIEM_SLOT_STA_PDC | PCIEM_SLOT_STA_PDS)) ==
|
||||
@ -1094,8 +1094,8 @@ pcib_pcie_hotplug_update(struct pcib_softc *sc, uint16_t val, uint16_t mask,
|
||||
*/
|
||||
if (sc->pcie_slot_cap & PCIEM_SLOT_CAP_EIP) {
|
||||
mask |= PCIEM_SLOT_CTL_EIC;
|
||||
if (card_inserted !=
|
||||
!(sc->pcie_slot_sta & PCIEM_SLOT_STA_EIS))
|
||||
ei_engaged = (sc->pcie_slot_sta & PCIEM_SLOT_STA_EIS) != 0;
|
||||
if (card_inserted != ei_engaged)
|
||||
val |= PCIEM_SLOT_CTL_EIC;
|
||||
}
|
||||
|
||||
@ -1122,7 +1122,7 @@ pcib_pcie_hotplug_update(struct pcib_softc *sc, uint16_t val, uint16_t mask,
|
||||
pcib_pcie_hotplug_command(sc, val, mask);
|
||||
|
||||
/*
|
||||
* During attach the child "pci" device is added sychronously;
|
||||
* During attach the child "pci" device is added synchronously;
|
||||
* otherwise, the task is scheduled to manage the child
|
||||
* device.
|
||||
*/
|
||||
|
@ -529,10 +529,13 @@ cap_express(int fd, struct pci_conf *p, uint8_t ptr)
|
||||
if (cap & PCIEM_SLOT_CAP_APB)
|
||||
printf(" Attn Button");
|
||||
if (cap & PCIEM_SLOT_CAP_PCP)
|
||||
printf(" PC(%s)", ctl & PCIEM_SLOT_CTL_PCC ? "on" : "off");
|
||||
printf(" PC(%s)", ctl & PCIEM_SLOT_CTL_PCC ? "off" : "on");
|
||||
if (cap & PCIEM_SLOT_CAP_MRLSP)
|
||||
printf(" MRL(%s)", sta & PCIEM_SLOT_STA_MRLSS ? "open" :
|
||||
"closed");
|
||||
if (cap & PCIEM_SLOT_CAP_EIP)
|
||||
printf(" EI(%s)", sta & PCIEM_SLOT_STA_EIS ? "engaged" :
|
||||
"disengaged");
|
||||
}
|
||||
|
||||
static void
|
||||
|
Loading…
x
Reference in New Issue
Block a user