Lines Matching refs:r

46     SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);  in scsi_generic_save_request()  local
48 qemu_put_sbe32s(f, &r->buflen); in scsi_generic_save_request()
49 if (r->buflen && r->req.cmd.mode == SCSI_XFER_TO_DEV) { in scsi_generic_save_request()
50 assert(!r->req.sg); in scsi_generic_save_request()
51 qemu_put_buffer(f, r->buf, r->req.cmd.xfer); in scsi_generic_save_request()
57 SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req); in scsi_generic_load_request() local
59 qemu_get_sbe32s(f, &r->buflen); in scsi_generic_load_request()
60 if (r->buflen && r->req.cmd.mode == SCSI_XFER_TO_DEV) { in scsi_generic_load_request()
61 assert(!r->req.sg); in scsi_generic_load_request()
62 qemu_get_buffer(f, r->buf, r->req.cmd.xfer); in scsi_generic_load_request()
68 SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req); in scsi_free_request() local
70 g_free(r->buf); in scsi_free_request()
74 static void scsi_command_complete_noio(SCSIGenericReq *r, int ret) in scsi_command_complete_noio() argument
78 sg_io_hdr_t *io_hdr = &r->io_header; in scsi_command_complete_noio()
80 assert(r->req.aiocb == NULL); in scsi_command_complete_noio()
82 if (r->req.io_canceled) { in scsi_command_complete_noio()
83 scsi_req_cancel_complete(&r->req); in scsi_command_complete_noio()
89 scsi_req_build_sense(&r->req, sense); in scsi_command_complete_noio()
92 scsi_req_complete_failed(&r->req, io_hdr->host_status); in scsi_command_complete_noio()
99 r->req.sense_len = io_hdr->sb_len_wr; in scsi_command_complete_noio()
102 trace_scsi_generic_command_complete_noio(r, r->req.tag, status); in scsi_command_complete_noio()
104 scsi_req_complete(&r->req, status); in scsi_command_complete_noio()
106 scsi_req_unref(&r->req); in scsi_command_complete_noio()
111 SCSIGenericReq *r = (SCSIGenericReq *)opaque; in scsi_command_complete() local
113 assert(r->req.aiocb != NULL); in scsi_command_complete()
114 r->req.aiocb = NULL; in scsi_command_complete()
116 scsi_command_complete_noio(r, ret); in scsi_command_complete()
120 SCSIGenericReq *r, int direction, in execute_command() argument
123 SCSIDevice *s = r->req.dev; in execute_command()
125 r->io_header.interface_id = 'S'; in execute_command()
126 r->io_header.dxfer_direction = direction; in execute_command()
127 r->io_header.dxferp = r->buf; in execute_command()
128 r->io_header.dxfer_len = r->buflen; in execute_command()
129 r->io_header.cmdp = r->req.cmd.buf; in execute_command()
130 r->io_header.cmd_len = r->req.cmd.len; in execute_command()
131 r->io_header.mx_sb_len = sizeof(r->req.sense); in execute_command()
132 r->io_header.sbp = r->req.sense; in execute_command()
133 r->io_header.timeout = s->io_timeout * 1000; in execute_command()
134 r->io_header.usr_ptr = r; in execute_command()
135 r->io_header.flags |= SG_FLAG_DIRECT_IO; in execute_command()
137 trace_scsi_generic_aio_sgio_command(r->req.tag, r->req.cmd.buf[0], in execute_command()
138 r->io_header.timeout); in execute_command()
139 r->req.aiocb = blk_aio_ioctl(blk, SG_IO, &r->io_header, complete, r); in execute_command()
140 if (r->req.aiocb == NULL) { in execute_command()
159 static int scsi_handle_inquiry_reply(SCSIGenericReq *r, SCSIDevice *s, int len) in scsi_handle_inquiry_reply() argument
180 if (s->scsi_version == -1 && !(r->req.cmd.buf[1] & 0x01)) { in scsi_handle_inquiry_reply()
181 s->scsi_version = r->buf[2] & 0x07; in scsi_handle_inquiry_reply()
183 s->scsi_version = r->buf[2]; in scsi_handle_inquiry_reply()
188 (r->req.cmd.buf[1] & 0x01)) { in scsi_handle_inquiry_reply()
189 page = r->req.cmd.buf[2]; in scsi_handle_inquiry_reply()
190 if (page == 0xb0 && r->buflen >= 8) { in scsi_handle_inquiry_reply()
192 uint8_t buf_used = MIN(r->buflen, 16); in scsi_handle_inquiry_reply()
195 memcpy(buf, r->buf, buf_used); in scsi_handle_inquiry_reply()
198 memcpy(r->buf + 8, buf + 8, buf_used - 8); in scsi_handle_inquiry_reply()
200 } else if (s->needs_vpd_bl_emulation && page == 0x00 && r->buflen >= 4) { in scsi_handle_inquiry_reply()
214 page_idx = lduw_be_p(r->buf + 2) + 4; in scsi_handle_inquiry_reply()
215 page_idx = MIN(page_idx, r->buflen); in scsi_handle_inquiry_reply()
216 while (page_idx > 4 && r->buf[page_idx - 1] >= 0xb0) { in scsi_handle_inquiry_reply()
217 if (page_idx < r->buflen) { in scsi_handle_inquiry_reply()
218 r->buf[page_idx] = r->buf[page_idx - 1]; in scsi_handle_inquiry_reply()
222 if (page_idx < r->buflen) { in scsi_handle_inquiry_reply()
223 r->buf[page_idx] = 0xb0; in scsi_handle_inquiry_reply()
225 stw_be_p(r->buf + 2, lduw_be_p(r->buf + 2) + 1); in scsi_handle_inquiry_reply()
227 if (len < r->buflen) { in scsi_handle_inquiry_reply()
235 static int scsi_generic_emulate_block_limits(SCSIGenericReq *r, SCSIDevice *s) in scsi_generic_emulate_block_limits() argument
244 memset(r->buf, 0, r->buflen); in scsi_generic_emulate_block_limits()
251 memcpy(r->buf, buf, MIN(r->buflen, len + 4)); in scsi_generic_emulate_block_limits()
253 r->io_header.sb_len_wr = 0; in scsi_generic_emulate_block_limits()
261 r->io_header.driver_status = 0; in scsi_generic_emulate_block_limits()
262 r->io_header.status = 0; in scsi_generic_emulate_block_limits()
264 return r->buflen; in scsi_generic_emulate_block_limits()
269 SCSIGenericReq *r = (SCSIGenericReq *)opaque; in scsi_read_complete() local
270 SCSIDevice *s = r->req.dev; in scsi_read_complete()
273 assert(r->req.aiocb != NULL); in scsi_read_complete()
274 r->req.aiocb = NULL; in scsi_read_complete()
276 if (ret || r->req.io_canceled) { in scsi_read_complete()
277 scsi_command_complete_noio(r, ret); in scsi_read_complete()
281 len = r->io_header.dxfer_len - r->io_header.resid; in scsi_read_complete()
282 trace_scsi_generic_read_complete(r->req.tag, len); in scsi_read_complete()
284 r->len = -1; in scsi_read_complete()
286 if (r->io_header.driver_status & SG_ERR_DRIVER_SENSE) { in scsi_read_complete()
288 scsi_parse_sense_buf(r->req.sense, r->io_header.sb_len_wr); in scsi_read_complete()
297 r->req.cmd.buf[0] == INQUIRY && in scsi_read_complete()
298 (r->req.cmd.buf[1] & 0x01) && in scsi_read_complete()
299 r->req.cmd.buf[2] == 0xb0) { in scsi_read_complete()
300 len = scsi_generic_emulate_block_limits(r, s); in scsi_read_complete()
312 if (r->io_header.host_status != SCSI_HOST_OK || in scsi_read_complete()
313 (r->io_header.driver_status & SG_ERR_DRIVER_TIMEOUT) || in scsi_read_complete()
314 r->io_header.status != GOOD || in scsi_read_complete()
316 scsi_command_complete_noio(r, 0); in scsi_read_complete()
321 if (r->req.cmd.buf[0] == READ_CAPACITY_10 && in scsi_read_complete()
322 (ldl_be_p(&r->buf[0]) != 0xffffffffU || s->max_lba == 0)) { in scsi_read_complete()
323 s->blocksize = ldl_be_p(&r->buf[4]); in scsi_read_complete()
324 s->max_lba = ldl_be_p(&r->buf[0]) & 0xffffffffULL; in scsi_read_complete()
325 } else if (r->req.cmd.buf[0] == SERVICE_ACTION_IN_16 && in scsi_read_complete()
326 (r->req.cmd.buf[1] & 31) == SAI_READ_CAPACITY_16) { in scsi_read_complete()
327 s->blocksize = ldl_be_p(&r->buf[8]); in scsi_read_complete()
328 s->max_lba = ldq_be_p(&r->buf[0]); in scsi_read_complete()
337 (r->req.cmd.buf[0] == MODE_SENSE || in scsi_read_complete()
338 r->req.cmd.buf[0] == MODE_SENSE_10) && in scsi_read_complete()
339 (r->req.cmd.buf[1] & 0x8) == 0) { in scsi_read_complete()
340 if (r->req.cmd.buf[0] == MODE_SENSE) { in scsi_read_complete()
341 r->buf[2] |= 0x80; in scsi_read_complete()
343 r->buf[3] |= 0x80; in scsi_read_complete()
346 if (r->req.cmd.buf[0] == INQUIRY) { in scsi_read_complete()
347 len = scsi_handle_inquiry_reply(r, s, len); in scsi_read_complete()
351 scsi_req_data(&r->req, len); in scsi_read_complete()
352 scsi_req_unref(&r->req); in scsi_read_complete()
358 SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req); in scsi_read_data() local
359 SCSIDevice *s = r->req.dev; in scsi_read_data()
365 scsi_req_ref(&r->req); in scsi_read_data()
366 if (r->len == -1) { in scsi_read_data()
367 scsi_command_complete_noio(r, 0); in scsi_read_data()
371 ret = execute_command(s->conf.blk, r, SG_DXFER_FROM_DEV, in scsi_read_data()
374 scsi_command_complete_noio(r, ret); in scsi_read_data()
380 SCSIGenericReq *r = (SCSIGenericReq *)opaque; in scsi_write_complete() local
381 SCSIDevice *s = r->req.dev; in scsi_write_complete()
385 assert(r->req.aiocb != NULL); in scsi_write_complete()
386 r->req.aiocb = NULL; in scsi_write_complete()
388 if (ret || r->req.io_canceled) { in scsi_write_complete()
389 scsi_command_complete_noio(r, ret); in scsi_write_complete()
393 if (r->req.cmd.buf[0] == MODE_SELECT && r->req.cmd.buf[4] == 12 && in scsi_write_complete()
395 s->blocksize = (r->buf[9] << 16) | (r->buf[10] << 8) | r->buf[11]; in scsi_write_complete()
399 scsi_command_complete_noio(r, ret); in scsi_write_complete()
406 SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req); in scsi_write_data() local
407 SCSIDevice *s = r->req.dev; in scsi_write_data()
411 if (r->len == 0) { in scsi_write_data()
412 r->len = r->buflen; in scsi_write_data()
413 scsi_req_data(&r->req, r->len); in scsi_write_data()
418 scsi_req_ref(&r->req); in scsi_write_data()
419 ret = execute_command(s->conf.blk, r, SG_DXFER_TO_DEV, scsi_write_complete); in scsi_write_data()
421 scsi_command_complete_noio(r, ret); in scsi_write_data()
428 SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req); in scsi_get_buf() local
430 return r->buf; in scsi_get_buf()
455 SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req); in scsi_send_command() local
456 SCSIDevice *s = r->req.dev; in scsi_send_command()
460 scsi_generic_command_dump(cmd, r->req.cmd.len); in scsi_send_command()
463 if (r->req.cmd.xfer == 0) { in scsi_send_command()
464 g_free(r->buf); in scsi_send_command()
465 r->buflen = 0; in scsi_send_command()
466 r->buf = NULL; in scsi_send_command()
468 scsi_req_ref(&r->req); in scsi_send_command()
469 ret = execute_command(s->conf.blk, r, SG_DXFER_NONE, in scsi_send_command()
472 scsi_command_complete_noio(r, ret); in scsi_send_command()
478 if (r->buflen != r->req.cmd.xfer) { in scsi_send_command()
479 g_free(r->buf); in scsi_send_command()
480 r->buf = g_malloc(r->req.cmd.xfer); in scsi_send_command()
481 r->buflen = r->req.cmd.xfer; in scsi_send_command()
484 memset(r->buf, 0, r->buflen); in scsi_send_command()
485 r->len = r->req.cmd.xfer; in scsi_send_command()
486 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) { in scsi_send_command()
487 r->len = 0; in scsi_send_command()
488 return -r->req.cmd.xfer; in scsi_send_command()
490 return r->req.cmd.xfer; in scsi_send_command()