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,
|
pcib_pcie_hotplug_update(struct pcib_softc *sc, uint16_t val, uint16_t mask,
|
||||||
bool schedule_task)
|
bool schedule_task)
|
||||||
{
|
{
|
||||||
bool card_inserted;
|
bool card_inserted, ei_engaged;
|
||||||
|
|
||||||
/* Clear DETACHING if Present Detect has cleared. */
|
/* Clear DETACHING if Present Detect has cleared. */
|
||||||
if ((sc->pcie_slot_sta & (PCIEM_SLOT_STA_PDC | PCIEM_SLOT_STA_PDS)) ==
|
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) {
|
if (sc->pcie_slot_cap & PCIEM_SLOT_CAP_EIP) {
|
||||||
mask |= PCIEM_SLOT_CTL_EIC;
|
mask |= PCIEM_SLOT_CTL_EIC;
|
||||||
if (card_inserted !=
|
ei_engaged = (sc->pcie_slot_sta & PCIEM_SLOT_STA_EIS) != 0;
|
||||||
!(sc->pcie_slot_sta & PCIEM_SLOT_STA_EIS))
|
if (card_inserted != ei_engaged)
|
||||||
val |= PCIEM_SLOT_CTL_EIC;
|
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);
|
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
|
* otherwise, the task is scheduled to manage the child
|
||||||
* device.
|
* device.
|
||||||
*/
|
*/
|
||||||
|
@ -529,10 +529,13 @@ cap_express(int fd, struct pci_conf *p, uint8_t ptr)
|
|||||||
if (cap & PCIEM_SLOT_CAP_APB)
|
if (cap & PCIEM_SLOT_CAP_APB)
|
||||||
printf(" Attn Button");
|
printf(" Attn Button");
|
||||||
if (cap & PCIEM_SLOT_CAP_PCP)
|
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)
|
if (cap & PCIEM_SLOT_CAP_MRLSP)
|
||||||
printf(" MRL(%s)", sta & PCIEM_SLOT_STA_MRLSS ? "open" :
|
printf(" MRL(%s)", sta & PCIEM_SLOT_STA_MRLSS ? "open" :
|
||||||
"closed");
|
"closed");
|
||||||
|
if (cap & PCIEM_SLOT_CAP_EIP)
|
||||||
|
printf(" EI(%s)", sta & PCIEM_SLOT_STA_EIS ? "engaged" :
|
||||||
|
"disengaged");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
x
Reference in New Issue
Block a user