Lines Matching +full:ufs +full:- +full:disable +full:- +full:mcq

1 /*-
5 * SPDX-License-Identifier: BSD-2-Clause
18 ctrlr->is_failed = true; in ufshci_ctrlr_fail()
21 ctrlr->task_mgmt_req_queue.qops.get_hw_queue( in ufshci_ctrlr_fail()
22 &ctrlr->task_mgmt_req_queue)); in ufshci_ctrlr_fail()
24 ctrlr->transfer_req_queue.qops.get_hw_queue( in ufshci_ctrlr_fail()
25 &ctrlr->transfer_req_queue)); in ufshci_ctrlr_fail()
35 * Re-enable request queues here because ufshci_ctrlr_reset_task() in ufshci_ctrlr_start()
54 /* Initialize UFS target drvice */ in ufshci_ctrlr_start()
74 * QEMU UFS devices do not support unipro and power mode. in ufshci_ctrlr_start()
76 if (!(ctrlr->quirks & UFSHCI_QUIRK_IGNORE_UIC_POWER_MODE) && in ufshci_ctrlr_start()
110 /* Initialize UFS Power Mode */ in ufshci_ctrlr_start()
122 int timeout = ticks + MSEC_2_TICKS(ctrlr->device_init_timeout_in_ms); in ufshci_ctrlr_disable_host_ctrlr()
128 /* If UFS host controller is already enabled, disable it. */ in ufshci_ctrlr_disable_host_ctrlr()
139 if (timeout - ticks < 0) { in ufshci_ctrlr_disable_host_ctrlr()
141 "host controller failed to disable " in ufshci_ctrlr_disable_host_ctrlr()
143 ctrlr->device_init_timeout_in_ms); in ufshci_ctrlr_disable_host_ctrlr()
157 int timeout = ticks + MSEC_2_TICKS(ctrlr->device_init_timeout_in_ms); in ufshci_ctrlr_enable_host_ctrlr()
163 /* Enable UFS host controller */ in ufshci_ctrlr_enable_host_ctrlr()
179 if (timeout - ticks < 0) { in ufshci_ctrlr_enable_host_ctrlr()
183 ctrlr->device_init_timeout_in_ms); in ufshci_ctrlr_enable_host_ctrlr()
199 /* Disable all interrupts */ in ufshci_ctrlr_disable()
224 * response and the UFS device has found a physical link to the in ufshci_ctrlr_enable()
229 ufshci_printf(ctrlr, "UFS device not found\n"); in ufshci_ctrlr_enable()
287 ctrlr->device_init_timeout_in_ms = UFSHCI_DEVICE_INIT_TIMEOUT_MS; in ufshci_ctrlr_construct()
288 ctrlr->uic_cmd_timeout_in_ms = UFSHCI_UIC_CMD_TIMEOUT_MS; in ufshci_ctrlr_construct()
289 ctrlr->dev = dev; in ufshci_ctrlr_construct()
290 ctrlr->sc_unit = device_get_unit(dev); in ufshci_ctrlr_construct()
292 snprintf(ctrlr->sc_name, sizeof(ctrlr->sc_name), "%s", in ufshci_ctrlr_construct()
295 mtx_init(&ctrlr->sc_mtx, device_get_nameunit(dev), NULL, in ufshci_ctrlr_construct()
298 mtx_init(&ctrlr->uic_cmd_lock, "ufshci ctrlr uic cmd lock", NULL, in ufshci_ctrlr_construct()
302 ctrlr->major_version = UFSHCIV(UFSHCI_VER_REG_MJR, ver); in ufshci_ctrlr_construct()
303 ctrlr->minor_version = UFSHCIV(UFSHCI_VER_REG_MNR, ver); in ufshci_ctrlr_construct()
304 ufshci_printf(ctrlr, "UFSHCI Version: %d.%d\n", ctrlr->major_version, in ufshci_ctrlr_construct()
305 ctrlr->minor_version); in ufshci_ctrlr_construct()
308 ctrlr->cap = cap = ufshci_mmio_read_4(ctrlr, cap); in ufshci_ctrlr_construct()
309 ctrlr->is_single_db_supported = UFSHCIV(UFSHCI_CAP_REG_LSDBS, cap); in ufshci_ctrlr_construct()
311 * TODO: This driver does not yet support multi-queue. in ufshci_ctrlr_construct()
313 * multi-queue support is available. in ufshci_ctrlr_construct()
315 ctrlr->is_mcq_supported = false; in ufshci_ctrlr_construct()
316 if (!(ctrlr->is_single_db_supported == 0 || ctrlr->is_mcq_supported)) in ufshci_ctrlr_construct()
323 ctrlr->page_size = PAGE_SIZE; in ufshci_ctrlr_construct()
324 ctrlr->max_xfer_size = ctrlr->page_size * UFSHCI_MAX_PRDT_ENTRY_COUNT; in ufshci_ctrlr_construct()
330 ctrlr->timeout_period = timeout_period; in ufshci_ctrlr_construct()
334 ctrlr->retry_count = retry_count; in ufshci_ctrlr_construct()
336 ctrlr->enable_aborts = 1; in ufshci_ctrlr_construct()
337 if (ctrlr->quirks & UFSHCI_QUIRK_NOT_SUPPORT_ABORT_TASK) in ufshci_ctrlr_construct()
338 ctrlr->enable_aborts = 0; in ufshci_ctrlr_construct()
341 &ctrlr->enable_aborts); in ufshci_ctrlr_construct()
351 /* Diable Auto-hibernate */ in ufshci_ctrlr_construct()
371 ctrlr->max_hw_pend_io = ctrlr->transfer_req_queue.num_entries - 1; in ufshci_ctrlr_construct()
374 ctrlr->taskqueue = taskqueue_create("ufshci_taskq", M_WAITOK, in ufshci_ctrlr_construct()
375 taskqueue_thread_enqueue, &ctrlr->taskqueue); in ufshci_ctrlr_construct()
376 taskqueue_start_threads(&ctrlr->taskqueue, 1, PI_DISK, "ufshci taskq"); in ufshci_ctrlr_construct()
378 TASK_INIT(&ctrlr->reset_task, 0, ufshci_ctrlr_reset_task, ctrlr); in ufshci_ctrlr_construct()
386 if (ctrlr->resource == NULL) in ufshci_ctrlr_destruct()
389 /* TODO: Flush In-flight IOs */ in ufshci_ctrlr_destruct()
395 if (ctrlr->tag) in ufshci_ctrlr_destruct()
396 bus_teardown_intr(ctrlr->dev, ctrlr->res, ctrlr->tag); in ufshci_ctrlr_destruct()
398 if (ctrlr->res) in ufshci_ctrlr_destruct()
399 bus_release_resource(ctrlr->dev, SYS_RES_IRQ, in ufshci_ctrlr_destruct()
400 rman_get_rid(ctrlr->res), ctrlr->res); in ufshci_ctrlr_destruct()
402 mtx_lock(&ctrlr->sc_mtx); in ufshci_ctrlr_destruct()
406 mtx_unlock(&ctrlr->sc_mtx); in ufshci_ctrlr_destruct()
408 bus_release_resource(dev, SYS_RES_MEMORY, ctrlr->resource_id, in ufshci_ctrlr_destruct()
409 ctrlr->resource); in ufshci_ctrlr_destruct()
411 KASSERT(!mtx_owned(&ctrlr->uic_cmd_lock), in ufshci_ctrlr_destruct()
413 mtx_destroy(&ctrlr->uic_cmd_lock); in ufshci_ctrlr_destruct()
415 KASSERT(!mtx_owned(&ctrlr->sc_mtx), in ufshci_ctrlr_destruct()
417 mtx_destroy(&ctrlr->sc_mtx); in ufshci_ctrlr_destruct()
425 taskqueue_enqueue(ctrlr->taskqueue, &ctrlr->reset_task); in ufshci_ctrlr_reset()
433 ufshci_req_queue_submit_request(&ctrlr->task_mgmt_req_queue, req, in ufshci_ctrlr_submit_task_mgmt_request()
441 return (ufshci_req_queue_submit_request(&ctrlr->transfer_req_queue, req, in ufshci_ctrlr_submit_admin_request()
449 return (ufshci_req_queue_submit_request(&ctrlr->transfer_req_queue, req, in ufshci_ctrlr_submit_io_request()
483 config_intrhook_disestablish(&ctrlr->config_hook); in ufshci_ctrlr_start_config_hook()
563 &ctrlr->task_mgmt_req_queue); in ufshci_ctrlr_poll()
569 &ctrlr->transfer_req_queue); in ufshci_ctrlr_poll()
571 /* MCQ CQ Event Status */ in ufshci_ctrlr_poll()
574 ufshci_printf(ctrlr, "MCQ completion not yet implemented\n"); in ufshci_ctrlr_poll()
580 * Poll the single-vector interrupt case: num_io_queues will be 1 and
623 if (!ctrlr->ufs_dev.power_mode_supported) in ufshci_ctrlr_suspend()
628 if (ctrlr->ufs_device_wlun_periph) { in ufshci_ctrlr_suspend()
629 ctrlr->ufs_dev.power_mode = power_map[stype].dev_pwr; in ufshci_ctrlr_suspend()
656 if (!ctrlr->ufs_dev.power_mode_supported) in ufshci_ctrlr_resume()
668 if (ctrlr->ufs_device_wlun_periph) { in ufshci_ctrlr_resume()
669 ctrlr->ufs_dev.power_mode = power_map[stype].dev_pwr; in ufshci_ctrlr_resume()