diff options
Diffstat (limited to 'sys/dev/hyperv/storvsc')
-rw-r--r-- | sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c | 87 |
1 files changed, 1 insertions, 86 deletions
diff --git a/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c b/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c index f4418b9..7021f66 100644 --- a/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c +++ b/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c @@ -171,15 +171,12 @@ static struct storvsc_driver_props g_drv_props_table[] = { STORVSC_RINGBUFFER_SIZE} }; -static struct storvsc_softc *hs_softc[HS_MAX_ADAPTERS]; - /* static functions */ static int storvsc_probe(device_t dev); static int storvsc_attach(device_t dev); static int storvsc_detach(device_t dev); static void storvsc_poll(struct cam_sim * sim); static void storvsc_action(struct cam_sim * sim, union ccb * ccb); -static void scan_for_luns(struct storvsc_softc * sc); static void create_storvsc_request(union ccb *ccb, struct hv_storvsc_request *reqp); static void storvsc_free_request(struct storvsc_softc *sc, struct hv_storvsc_request *reqp); static enum hv_storage_type storvsc_get_storage_type(device_t dev); @@ -669,84 +666,6 @@ hv_storvsc_on_channel_callback(void *context) } /** - * @brief callback function for completing a single LUN scan - * - * This function is responsible for waking up the executer of - * the scan LUN CCB action (cam_periph_runccb.) cam_periph_ccbwait - * sleeps on the mutex being signaled. - * - * @param periph a pointer to a CAM peripheral - * @param done_ccb pointer to CAM control block - */ -static void -storvsc_xptdone(struct cam_periph *periph, union ccb *done_ccb) -{ - wakeup(&done_ccb->ccb_h.cbfcnp); -} - -/** - * @brief scan for attached logical unit numbers (LUNs) - * - * In Hyper-V there is no backend changed device operation which - * presents FreeBSD with a list of devices to connect. The result is - * that we have to scan for a list of luns in the storvsc_attach() - * routine. There is only one SCSI target, so scan for the maximum - * number of luns. - * - * @param pointer to softc - */ -static void -scan_for_luns(struct storvsc_softc *sc) -{ - union ccb *request_ccb; - struct cam_path *path = sc->hs_path; - struct cam_path *my_path = NULL; - cam_status status; - int lun_nb = 0; - int error; - - request_ccb = malloc(sizeof(union ccb), M_CAMXPT, M_WAITOK); - my_path = malloc(sizeof(*my_path), M_CAMXPT, M_WAITOK); - - mtx_lock(&sc->hs_lock); - do { - /* - * Scan the next LUN. Reuse path and ccb structs. - */ - bzero(my_path, sizeof(*my_path)); - bzero(request_ccb, sizeof(*request_ccb)); - status = xpt_compile_path(my_path, - xpt_periph, - path->bus->path_id, - 0, - lun_nb); - - if (status != CAM_REQ_CMP) { - mtx_unlock(&sc->hs_lock); - xpt_print(path, "scan_for_lunYYY: can't compile" - " path, 0x%p can't continue\n", - sc->hs_path); - free(request_ccb, M_CAMXPT); - free(my_path, M_CAMXPT); - return; - } - - xpt_setup_ccb(&request_ccb->ccb_h, my_path, 5); - request_ccb->ccb_h.func_code = XPT_SCAN_LUN; - request_ccb->ccb_h.cbfcnp = storvsc_xptdone; - request_ccb->crcn.flags = CAM_FLAG_NONE; - - error = cam_periph_runccb(request_ccb, NULL, - CAM_FLAG_NONE, 0, NULL); - KASSERT(error == 0, ("cam_periph_runccb failed %d\n", error)); - xpt_release_path(my_path); - } while ( ++lun_nb < sc->hs_drv_props->drv_max_luns_per_target); - mtx_unlock(&sc->hs_lock); - free(request_ccb, M_CAMXPT); - free(my_path, M_CAMXPT); -} - -/** * @brief StorVSC probe function * * Device probe function. Returns 0 if the input device is a StorVSC @@ -904,10 +823,6 @@ storvsc_attach(device_t dev) } mtx_unlock(&sc->hs_lock); - scan_for_luns(sc); - for (i = 0; (hs_softc[i] != NULL) && (i < HS_MAX_ADAPTERS); i++); - KASSERT(i < HS_MAX_ADAPTERS, ("storvsc_attach: hs_softc full\n")); - hs_softc[i] = sc; root_mount_rel(root_mount_token); return (0); @@ -1147,7 +1062,7 @@ storvsc_action(struct cam_sim *sim, union ccb *ccb) cpi->hba_eng_cnt = 0; cpi->max_target = STORVSC_MAX_TARGETS; cpi->max_lun = sc->hs_drv_props->drv_max_luns_per_target; - cpi->initiator_id = 0; + cpi->initiator_id = cpi->max_target; cpi->bus_id = cam_sim_bus(sim); cpi->base_transfer_speed = 300000; cpi->transport = XPORT_SAS; |