static vsf_err_t vsfusbd_MSCBOT_SendCSW(struct vsfusbd_device_t *device, struct vsfusbd_MSCBOT_param_t *param) { struct USBMSC_CSW_t *CSW = ¶m->CSW; uint32_t remain_size; CSW->dCSWSignature = SYS_TO_LE_U32(USBMSC_CSW_SIGNATURE); CSW->dCSWTag = param->CBW.dCBWTag; remain_size = param->CBW.dCBWDataTransferLength; if (param->scsi_transact != NULL) { remain_size -= param->scsi_transact->data_size; vsfscsi_release_transact(param->scsi_transact); } CSW->dCSWDataResidue = SYS_TO_LE_U32(remain_size); param->bufstream.mem.buffer.buffer = (uint8_t *)¶m->CSW; param->bufstream.mem.buffer.size = sizeof(param->CSW); param->bufstream.mem.read = true; param->bufstream.stream.op = &bufstream_op; STREAM_INIT(¶m->bufstream); param->transact.ep = param->ep_in; param->transact.data_size = sizeof(param->CSW); param->transact.stream = (struct vsf_stream_t *)¶m->bufstream; param->transact.cb.on_finish = vsfusbd_MSCBOT_on_idle; param->transact.cb.param = param; return vsfusbd_ep_send(param->device, ¶m->transact); }
void vsfscsi_cancel_transact(struct vsfscsi_transact_t *transact) { // TODO: release other resources & callbacks vsfscsi_release_transact(transact); }