Lines Matching +full:cam +full:- +full:0
1 /*-
2 * Copyright (c) 2020-2021 Emmanuel Vadot <manu@FreeBSD.org>
32 #include <cam/cam.h>
33 #include <cam/cam_ccb.h>
34 #include <cam/cam_debug.h>
35 #include <cam/cam_sim.h>
36 #include <cam/cam_xpt_sim.h>
37 #include <cam/mmc/mmc_sim.h>
47 MMC_SIM_CAM_POLL(mmc_sim->dev); in mmc_cam_default_poll()
59 if (mmc_sim->ccb == NULL) in mmc_sim_task()
62 cts = &mmc_sim->ccb->cts; in mmc_sim_task()
63 switch (mmc_sim->ccb->ccb_h.func_code) { in mmc_sim_task()
65 rv = MMC_SIM_GET_TRAN_SETTINGS(mmc_sim->dev, &cts->proto_specific.mmc); in mmc_sim_task()
66 if (rv != 0) in mmc_sim_task()
67 mmc_sim->ccb->ccb_h.status = CAM_REQ_INVALID; in mmc_sim_task()
69 mmc_sim->ccb->ccb_h.status = CAM_REQ_CMP; in mmc_sim_task()
72 rv = MMC_SIM_SET_TRAN_SETTINGS(mmc_sim->dev, &cts->proto_specific.mmc); in mmc_sim_task()
73 if (rv != 0) in mmc_sim_task()
74 mmc_sim->ccb->ccb_h.status = CAM_REQ_INVALID; in mmc_sim_task()
76 mmc_sim->ccb->ccb_h.status = CAM_REQ_CMP; in mmc_sim_task()
79 panic("Unsupported ccb func %x\n", mmc_sim->ccb->ccb_h.func_code); in mmc_sim_task()
83 xpt_done(mmc_sim->ccb); in mmc_sim_task()
84 mmc_sim->ccb = NULL; in mmc_sim_task()
97 mtx_assert(&mmc_sim->mtx, MA_OWNED); in mmc_cam_sim_default_action()
99 if (mmc_sim->ccb != NULL) { in mmc_cam_sim_default_action()
100 ccb->ccb_h.status = CAM_BUSY; in mmc_cam_sim_default_action()
105 switch (ccb->ccb_h.func_code) { in mmc_cam_sim_default_action()
107 rv = MMC_SIM_GET_TRAN_SETTINGS(mmc_sim->dev, &mmc); in mmc_cam_sim_default_action()
108 if (rv != 0) { in mmc_cam_sim_default_action()
109 ccb->ccb_h.status = CAM_REQ_INVALID; in mmc_cam_sim_default_action()
111 mmc_path_inq(&ccb->cpi, "Deglitch Networks", in mmc_cam_sim_default_action()
117 struct ccb_trans_settings *cts = &ccb->cts; in mmc_cam_sim_default_action()
119 rv = MMC_SIM_GET_TRAN_SETTINGS(mmc_sim->dev, &cts->proto_specific.mmc); in mmc_cam_sim_default_action()
120 if (rv != 0) in mmc_cam_sim_default_action()
121 ccb->ccb_h.status = CAM_REQ_INVALID; in mmc_cam_sim_default_action()
123 cts->protocol = PROTO_MMCSD; in mmc_cam_sim_default_action()
124 cts->protocol_version = 1; in mmc_cam_sim_default_action()
125 cts->transport = XPORT_MMCSD; in mmc_cam_sim_default_action()
126 cts->transport_version = 1; in mmc_cam_sim_default_action()
127 cts->xport_specific.valid = 0; in mmc_cam_sim_default_action()
128 ccb->ccb_h.status = CAM_REQ_CMP; in mmc_cam_sim_default_action()
134 ccb->ccb_h.status = CAM_SIM_QUEUED; in mmc_cam_sim_default_action()
135 mmc_sim->ccb = ccb; in mmc_cam_sim_default_action()
136 taskqueue_enqueue(taskqueue_thread, &mmc_sim->sim_task); in mmc_cam_sim_default_action()
143 struct ccb_trans_settings *cts = &ccb->cts; in mmc_cam_sim_default_action()
145 rv = MMC_SIM_SET_TRAN_SETTINGS(mmc_sim->dev, &cts->proto_specific.mmc); in mmc_cam_sim_default_action()
146 if (rv != 0) in mmc_cam_sim_default_action()
147 ccb->ccb_h.status = CAM_REQ_INVALID; in mmc_cam_sim_default_action()
149 ccb->ccb_h.status = CAM_REQ_CMP; in mmc_cam_sim_default_action()
154 ccb->ccb_h.status = CAM_SIM_QUEUED; in mmc_cam_sim_default_action()
155 mmc_sim->ccb = ccb; in mmc_cam_sim_default_action()
156 taskqueue_enqueue(taskqueue_thread, &mmc_sim->sim_task); in mmc_cam_sim_default_action()
162 ccb->ccb_h.status = CAM_REQ_CMP; in mmc_cam_sim_default_action()
166 rv = MMC_SIM_CAM_REQUEST(mmc_sim->dev, ccb); in mmc_cam_sim_default_action()
167 if (rv != 0) in mmc_cam_sim_default_action()
168 ccb->ccb_h.status = CAM_SIM_QUEUED; in mmc_cam_sim_default_action()
174 ccb->ccb_h.status = CAM_REQ_INVALID; in mmc_cam_sim_default_action()
187 mmc_sim->dev = dev; in mmc_cam_sim_alloc()
189 if ((mmc_sim->devq = cam_simq_alloc(1)) == NULL) { in mmc_cam_sim_alloc()
193 snprintf(mmc_sim->name, sizeof(mmc_sim->name), "%s_sim", name); in mmc_cam_sim_alloc()
194 mtx_init(&mmc_sim->mtx, mmc_sim->name, NULL, MTX_DEF); in mmc_cam_sim_alloc()
198 kobj_method = kobj_lookup_method(((kobj_t)dev)->ops->cls, NULL, in mmc_cam_sim_alloc()
200 mmc_sim->sim = cam_sim_alloc(mmc_cam_sim_default_action, in mmc_cam_sim_alloc()
201 kobj_method == &kobj_desc->deflt ? NULL : mmc_cam_default_poll, in mmc_cam_sim_alloc()
202 mmc_sim->name, mmc_sim, device_get_unit(dev), in mmc_cam_sim_alloc()
203 &mmc_sim->mtx, 1, 1, mmc_sim->devq); in mmc_cam_sim_alloc()
205 if (mmc_sim->sim == NULL) { in mmc_cam_sim_alloc()
206 cam_simq_free(mmc_sim->devq); in mmc_cam_sim_alloc()
207 device_printf(dev, "cannot allocate CAM SIM\n"); in mmc_cam_sim_alloc()
211 mtx_lock(&mmc_sim->mtx); in mmc_cam_sim_alloc()
212 if (xpt_bus_register(mmc_sim->sim, dev, 0) != 0) { in mmc_cam_sim_alloc()
213 device_printf(dev, "cannot register SCSI pass-through bus\n"); in mmc_cam_sim_alloc()
214 cam_sim_free(mmc_sim->sim, FALSE); in mmc_cam_sim_alloc()
215 cam_simq_free(mmc_sim->devq); in mmc_cam_sim_alloc()
216 mtx_unlock(&mmc_sim->mtx); in mmc_cam_sim_alloc()
220 mtx_unlock(&mmc_sim->mtx); in mmc_cam_sim_alloc()
221 TASK_INIT(&mmc_sim->sim_task, 0, mmc_sim_task, mmc_sim); in mmc_cam_sim_alloc()
223 return (0); in mmc_cam_sim_alloc()
234 if (mmc_sim->sim != NULL) { in mmc_cam_sim_free()
235 mtx_lock(&mmc_sim->mtx); in mmc_cam_sim_free()
236 xpt_bus_deregister(cam_sim_path(mmc_sim->sim)); in mmc_cam_sim_free()
237 cam_sim_free(mmc_sim->sim, FALSE); in mmc_cam_sim_free()
238 mtx_unlock(&mmc_sim->mtx); in mmc_cam_sim_free()
241 if (mmc_sim->devq != NULL) in mmc_cam_sim_free()
242 cam_simq_free(mmc_sim->devq); in mmc_cam_sim_free()
249 mmccam_start_discovery(mmc_sim->sim); in mmc_cam_sim_discover()