aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/ahci/ahci.c7
-rw-r--r--sys/dev/ahci/ahciem.c36
2 files changed, 28 insertions, 15 deletions
diff --git a/sys/dev/ahci/ahci.c b/sys/dev/ahci/ahci.c
index 4b13ae3068d5..12e6ee8102da 100644
--- a/sys/dev/ahci/ahci.c
+++ b/sys/dev/ahci/ahci.c
@@ -376,7 +376,10 @@ ahci_attach(device_t dev)
device_set_ivars(child, (void *)(intptr_t)(unit | AHCI_REMAPPED_UNIT));
}
- if (ctlr->caps & AHCI_CAP_EMS) {
+ int em = (ctlr->caps & AHCI_CAP_EMS) != 0;
+ resource_int_value(device_get_name(dev), device_get_unit(dev),
+ "em", &em);
+ if (em) {
child = device_add_child(dev, "ahciem", -1);
if (child == NULL)
device_printf(dev, "failed to add enclosure device\n");
@@ -602,6 +605,8 @@ ahci_alloc_resource(device_t dev, device_t child, int type, int *rid,
} else if (!is_em) {
offset = AHCI_OFFSET + (unit << 7);
size = 128;
+ } else if ((ctlr->caps & AHCI_CAP_EMS) == 0) {
+ break;
} else if (*rid == 0) {
offset = AHCI_EM_CTL;
size = 4;
diff --git a/sys/dev/ahci/ahciem.c b/sys/dev/ahci/ahciem.c
index b1c3fbf1fdd4..20b36830ce9a 100644
--- a/sys/dev/ahci/ahciem.c
+++ b/sys/dev/ahci/ahciem.c
@@ -86,17 +86,18 @@ ahci_em_attach(device_t dev)
enc->ichannels = ctlr->ichannels;
mtx_init(&enc->mtx, "AHCI enclosure lock", NULL, MTX_DEF);
rid = 0;
- if (!(enc->r_memc = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
- &rid, RF_ACTIVE))) {
- mtx_destroy(&enc->mtx);
- return (ENXIO);
- }
- enc->capsem = ATA_INL(enc->r_memc, 0);
- rid = 1;
- if (!(enc->r_memt = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
- &rid, RF_ACTIVE))) {
- error = ENXIO;
- goto err0;
+ if ((enc->r_memc = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
+ &rid, RF_ACTIVE)) != NULL) {
+ enc->capsem = ATA_INL(enc->r_memc, 0);
+ rid = 1;
+ if (!(enc->r_memt = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
+ &rid, RF_ACTIVE))) {
+ error = ENXIO;
+ goto err0;
+ }
+ } else {
+ enc->capsem = AHCI_EM_XMT | AHCI_EM_SMB | AHCI_EM_LED;
+ enc->r_memt = NULL;
}
if ((enc->capsem & (AHCI_EM_XMT | AHCI_EM_SMB)) == 0) {
rid = 2;
@@ -194,7 +195,8 @@ err1:
err0:
if (enc->r_memt)
bus_release_resource(dev, SYS_RES_MEMORY, 1, enc->r_memt);
- bus_release_resource(dev, SYS_RES_MEMORY, 0, enc->r_memc);
+ if (enc->r_memc)
+ bus_release_resource(dev, SYS_RES_MEMORY, 0, enc->r_memc);
mtx_destroy(&enc->mtx);
return (error);
}
@@ -216,8 +218,10 @@ ahci_em_detach(device_t dev)
cam_sim_free(enc->sim, /*free_devq*/TRUE);
mtx_unlock(&enc->mtx);
- bus_release_resource(dev, SYS_RES_MEMORY, 0, enc->r_memc);
- bus_release_resource(dev, SYS_RES_MEMORY, 1, enc->r_memt);
+ if (enc->r_memc)
+ bus_release_resource(dev, SYS_RES_MEMORY, 0, enc->r_memc);
+ if (enc->r_memt)
+ bus_release_resource(dev, SYS_RES_MEMORY, 1, enc->r_memt);
if (enc->r_memr)
bus_release_resource(dev, SYS_RES_MEMORY, 2, enc->r_memr);
mtx_destroy(&enc->mtx);
@@ -231,6 +235,8 @@ ahci_em_reset(device_t dev)
int i, timeout;
enc = device_get_softc(dev);
+ if (enc->r_memc == NULL)
+ return (0);
ATA_OUTL(enc->r_memc, 0, AHCI_EM_RST);
timeout = 1000;
while ((ATA_INL(enc->r_memc, 0) & AHCI_EM_RST) &&
@@ -292,6 +298,8 @@ ahci_em_setleds(device_t dev, int c)
int16_t val;
enc = device_get_softc(dev);
+ if (enc->r_memc == NULL)
+ return;
val = 0;
if (enc->status[c][2] & SESCTL_RQSACT) /* Activity */