diff --git a/sys/dev/sdhci/sdhci.h b/sys/dev/sdhci/sdhci.h --- a/sys/dev/sdhci/sdhci.h +++ b/sys/dev/sdhci/sdhci.h @@ -95,6 +95,8 @@ #define SDHCI_QUIRK_MMC_HS400_IF_CAN_SDR104 (1 << 29) /* SDMA boundary in SDHCI_BLOCK_SIZE broken - use front-end supplied value. */ #define SDHCI_QUIRK_BROKEN_SDMA_BOUNDARY (1 << 30) +/* Slot type in SDHCI_CAPABILITIES reads as embedded, but slot is removable. */ +#define SDHCI_QUIRK_SLOTTYPE_BROKEN (1U << 31) /* * Controller registers diff --git a/sys/dev/sdhci/sdhci.c b/sys/dev/sdhci/sdhci.c --- a/sys/dev/sdhci/sdhci.c +++ b/sys/dev/sdhci/sdhci.c @@ -901,7 +901,8 @@ SDHCI_LOCK_DESTROY(slot); return (ENXIO); } else if ((caps & SDHCI_SLOTTYPE_MASK) == - SDHCI_SLOTTYPE_EMBEDDED) { + SDHCI_SLOTTYPE_EMBEDDED && + !(slot->quirks & SDHCI_QUIRK_SLOTTYPE_BROKEN)) { slot->opt |= SDHCI_SLOT_EMBEDDED | SDHCI_NON_REMOVABLE; } } diff --git a/sys/dev/sdhci/sdhci_pci.c b/sys/dev/sdhci/sdhci_pci.c --- a/sys/dev/sdhci/sdhci_pci.c +++ b/sys/dev/sdhci/sdhci_pci.c @@ -142,6 +142,7 @@ { 0x5aca8086, 0xffff, "Intel Apollo Lake SDXC Controller", SDHCI_QUIRK_BROKEN_DMA | /* APL18 erratum */ SDHCI_QUIRK_WAIT_WHILE_BUSY | + SDHCI_QUIRK_SLOTTYPE_BROKEN | SDHCI_QUIRK_PRESET_VALUE_BROKEN }, { 0x5acc8086, 0xffff, "Intel Apollo Lake eMMC 5.0 Controller", SDHCI_QUIRK_BROKEN_DMA | /* APL18 erratum */