Index: sys/cam/cam_sim.h =================================================================== --- sys/cam/cam_sim.h +++ sys/cam/cam_sim.h @@ -62,6 +62,15 @@ int max_dev_transactions, int max_tagged_dev_transactions, struct cam_devq *queue); +struct cam_sim * cam_sim_alloc_dev(sim_action_func sim_action, + sim_poll_func sim_poll, + const char *sim_name, + void *softc, + device_t dev, + struct mtx *mtx, + int max_dev_transactions, + int max_tagged_dev_transactions, + struct cam_devq *queue); void cam_sim_free(struct cam_sim *sim, int free_devq); void cam_sim_hold(struct cam_sim *sim); void cam_sim_release(struct cam_sim *sim); @@ -109,6 +118,7 @@ struct callout callout; struct cam_devq *devq; /* Device Queue to use for this SIM */ int refcount; /* References to the SIM. */ + device_t sim_dev; /* For attached peripherals. */ }; #define CAM_SIM_LOCK(sim) mtx_lock((sim)->mtx) Index: sys/cam/cam_sim.c =================================================================== --- sys/cam/cam_sim.c +++ sys/cam/cam_sim.c @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -82,6 +83,7 @@ sim->sim_name = sim_name; sim->softc = softc; sim->path_id = CAM_PATH_ANY; + sim->dev = NULL; /* set only by cam_sim_alloc_dev */ sim->unit_number = unit; sim->bus_id = 0; /* set in xpt_bus_register */ sim->max_tagged_dev_openings = max_tagged_dev_transactions; @@ -100,6 +102,25 @@ return (sim); } +struct cam_sim * +cam_sim_alloc_dev(sim_action_func sim_action, sim_poll_func sim_poll, + const char *sim_name, void *softc, device_t dev, + struct mtx *mtx, int max_dev_transactions, + int max_tagged_dev_transactions, struct cam_devq *queue) +{ + struct cam_sim *sim; + + KASSERT(dev != NULL, ("%s: dev is null for sim_name %s softc %p\n", + __func__, sim_name, softc)); + + sim = cam_sim_alloc(sim_action, sim_poll, sim_name, softc, + device_get_unit(dev), mtx, max_dev_transactions, + max_tagged_dev_transactions, queue); + if (sim != NULL) + sim->sim_dev = dev; + return (sim); +} + void cam_sim_free(struct cam_sim *sim, int free_devq) { Index: sys/dev/sdhci/sdhci.c =================================================================== --- sys/dev/sdhci/sdhci.c +++ sys/dev/sdhci/sdhci.c @@ -2487,8 +2487,8 @@ goto fail; mtx_init(&slot->sim_mtx, "sdhcisim", NULL, MTX_DEF); - slot->sim = cam_sim_alloc(sdhci_cam_action, sdhci_cam_poll, - "sdhci_slot", slot, device_get_unit(slot->bus), + slot->sim = cam_sim_alloc_dev(sdhci_cam_action, sdhci_cam_poll, + "sdhci_slot", slot, slot->bus, &slot->sim_mtx, 1, 1, slot->devq); if (slot->sim == NULL) {