Lines Matching refs:req
83 SCSIRequest req; member
129 static void scsi_free_request(SCSIRequest *req) in scsi_free_request() argument
131 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req); in scsi_free_request()
139 trace_scsi_disk_check_condition(r->req.tag, sense.key, sense.asc, in scsi_check_condition()
141 scsi_req_build_sense(&r->req, sense); in scsi_check_condition()
142 scsi_req_complete(&r->req, CHECK_CONDITION); in scsi_check_condition()
147 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_init_iovec()
157 static void scsi_disk_save_request(QEMUFile *f, SCSIRequest *req) in scsi_disk_save_request() argument
159 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req); in scsi_disk_save_request()
165 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) { in scsi_disk_save_request()
167 } else if (!req->retry) { in scsi_disk_save_request()
175 static void scsi_disk_emulate_save_request(QEMUFile *f, SCSIRequest *req) in scsi_disk_emulate_save_request() argument
177 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev); in scsi_disk_emulate_save_request()
180 scsi_disk_save_request(f, req); in scsi_disk_emulate_save_request()
184 static void scsi_disk_load_request(QEMUFile *f, SCSIRequest *req) in scsi_disk_load_request() argument
186 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req); in scsi_disk_load_request()
193 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) { in scsi_disk_load_request()
195 } else if (!r->req.retry) { in scsi_disk_load_request()
207 static void scsi_disk_emulate_load_request(QEMUFile *f, SCSIRequest *req) in scsi_disk_emulate_load_request() argument
209 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev); in scsi_disk_emulate_load_request()
212 scsi_disk_load_request(f, req); in scsi_disk_emulate_load_request()
225 bool is_read = (r->req.cmd.mode == SCSI_XFER_FROM_DEV); in scsi_handle_rw_error()
226 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_handle_rw_error()
243 error = scsi_sense_buf_to_errno(r->req.sense, sizeof(r->req.sense)); in scsi_handle_rw_error()
279 scsi_sense_buf_is_guest_recoverable(r->req.sense, in scsi_handle_rw_error()
280 sizeof(r->req.sense)))) { in scsi_handle_rw_error()
294 sdc->update_sense(&r->req); in scsi_handle_rw_error()
296 scsi_req_build_sense(&r->req, sense); in scsi_handle_rw_error()
298 scsi_req_complete(&r->req, status); in scsi_handle_rw_error()
305 scsi_req_retry(&r->req); in scsi_handle_rw_error()
315 if (r->req.io_canceled) { in scsi_disk_req_check_error()
316 scsi_req_cancel_complete(&r->req); in scsi_disk_req_check_error()
330 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_aio_complete()
336 assert(r->req.aiocb != NULL); in scsi_aio_complete()
337 r->req.aiocb = NULL; in scsi_aio_complete()
344 scsi_req_complete(&r->req, GOOD); in scsi_aio_complete()
347 scsi_req_unref(&r->req); in scsi_aio_complete()
378 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_write_do_fua()
380 assert(r->req.aiocb == NULL); in scsi_write_do_fua()
381 assert(!r->req.io_canceled); in scsi_write_do_fua()
386 r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_aio_complete, r); in scsi_write_do_fua()
390 scsi_req_complete(&r->req, GOOD); in scsi_write_do_fua()
391 scsi_req_unref(&r->req); in scsi_write_do_fua()
396 assert(r->req.aiocb == NULL); in scsi_dma_complete_noio()
403 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) { in scsi_dma_complete_noio()
407 scsi_req_complete(&r->req, GOOD); in scsi_dma_complete_noio()
411 scsi_req_unref(&r->req); in scsi_dma_complete_noio()
418 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_dma_complete()
420 assert(r->req.aiocb != NULL); in scsi_dma_complete()
421 r->req.aiocb = NULL; in scsi_dma_complete()
434 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_read_complete_noio()
441 assert(r->req.aiocb == NULL); in scsi_read_complete_noio()
449 scsi_req_data(&r->req, r->qiov.size); in scsi_read_complete_noio()
452 scsi_req_unref(&r->req); in scsi_read_complete_noio()
459 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_read_complete()
461 assert(r->req.aiocb != NULL); in scsi_read_complete()
462 r->req.aiocb = NULL; in scsi_read_complete()
469 trace_scsi_disk_read_complete(r->req.tag, r->qiov.size); in scsi_read_complete()
477 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_do_read()
480 assert (r->req.aiocb == NULL); in scsi_do_read()
486 scsi_req_ref(&r->req); in scsi_do_read()
488 if (r->req.sg) { in scsi_do_read()
489 dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_READ); in scsi_do_read()
490 r->req.residual -= r->req.sg->size; in scsi_do_read()
491 r->req.aiocb = dma_blk_io(blk_get_aio_context(s->qdev.conf.blk), in scsi_do_read()
492 r->req.sg, r->sector << BDRV_SECTOR_BITS, in scsi_do_read()
500 r->req.aiocb = sdc->dma_readv(r->sector << BDRV_SECTOR_BITS, &r->qiov, in scsi_do_read()
505 scsi_req_unref(&r->req); in scsi_do_read()
511 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_do_read_cb()
513 assert (r->req.aiocb != NULL); in scsi_do_read_cb()
514 r->req.aiocb = NULL; in scsi_do_read_cb()
525 static void scsi_read_data(SCSIRequest *req) in scsi_read_data() argument
527 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req); in scsi_read_data()
528 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_read_data()
534 scsi_req_complete(&r->req, GOOD); in scsi_read_data()
539 assert(r->req.aiocb == NULL); in scsi_read_data()
542 scsi_req_ref(&r->req); in scsi_read_data()
543 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) { in scsi_read_data()
549 if (!blk_is_available(req->dev->conf.blk)) { in scsi_read_data()
559 r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_do_read_cb, r); in scsi_read_data()
567 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_write_complete_noio()
574 assert (r->req.aiocb == NULL); in scsi_write_complete_noio()
587 trace_scsi_disk_write_complete_noio(r->req.tag, r->qiov.size); in scsi_write_complete_noio()
588 scsi_req_data(&r->req, r->qiov.size); in scsi_write_complete_noio()
592 scsi_req_unref(&r->req); in scsi_write_complete_noio()
599 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_write_complete()
601 assert (r->req.aiocb != NULL); in scsi_write_complete()
602 r->req.aiocb = NULL; in scsi_write_complete()
613 static void scsi_write_data(SCSIRequest *req) in scsi_write_data() argument
615 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req); in scsi_write_data()
616 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_write_data()
620 assert(r->req.aiocb == NULL); in scsi_write_data()
623 scsi_req_ref(&r->req); in scsi_write_data()
624 if (r->req.cmd.mode != SCSI_XFER_TO_DEV) { in scsi_write_data()
630 if (!r->req.sg && !r->qiov.size) { in scsi_write_data()
636 if (!blk_is_available(req->dev->conf.blk)) { in scsi_write_data()
641 if (r->req.cmd.buf[0] == VERIFY_10 || r->req.cmd.buf[0] == VERIFY_12 || in scsi_write_data()
642 r->req.cmd.buf[0] == VERIFY_16) { in scsi_write_data()
643 if (r->req.sg) { in scsi_write_data()
651 if (r->req.sg) { in scsi_write_data()
652 dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_WRITE); in scsi_write_data()
653 r->req.residual -= r->req.sg->size; in scsi_write_data()
654 r->req.aiocb = dma_blk_io(blk_get_aio_context(s->qdev.conf.blk), in scsi_write_data()
655 r->req.sg, r->sector << BDRV_SECTOR_BITS, in scsi_write_data()
662 r->req.aiocb = sdc->dma_writev(r->sector << BDRV_SECTOR_BITS, &r->qiov, in scsi_write_data()
668 static uint8_t *scsi_get_buf(SCSIRequest *req) in scsi_get_buf() argument
670 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req); in scsi_get_buf()
675 static int scsi_disk_emulate_vpd_page(SCSIRequest *req, uint8_t *outbuf) in scsi_disk_emulate_vpd_page() argument
677 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev); in scsi_disk_emulate_vpd_page()
678 uint8_t page_code = req->cmd.buf[2]; in scsi_disk_emulate_vpd_page()
690 trace_scsi_disk_emulate_vpd_page_00(req->cmd.xfer); in scsi_disk_emulate_vpd_page()
717 trace_scsi_disk_emulate_vpd_page_80(req->cmd.xfer); in scsi_disk_emulate_vpd_page()
727 trace_scsi_disk_emulate_vpd_page_83(req->cmd.xfer); in scsi_disk_emulate_vpd_page()
830 static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf) in scsi_disk_emulate_inquiry() argument
832 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev); in scsi_disk_emulate_inquiry()
835 if (req->cmd.buf[1] & 0x1) { in scsi_disk_emulate_inquiry()
837 return scsi_disk_emulate_vpd_page(req, outbuf); in scsi_disk_emulate_inquiry()
841 if (req->cmd.buf[2] != 0) { in scsi_disk_emulate_inquiry()
846 buflen = req->cmd.xfer; in scsi_disk_emulate_inquiry()
877 outbuf[7] = 0x10 | (req->bus->info->tcq ? 0x02 : 0); in scsi_disk_emulate_inquiry()
910 uint8_t type = r->req.cmd.buf[1] & 7; in scsi_read_disc_information()
950 uint8_t media = r->req.cmd.buf[1]; in scsi_read_dvd_structure()
951 uint8_t layer = r->req.cmd.buf[6]; in scsi_read_dvd_structure()
952 uint8_t format = r->req.cmd.buf[7]; in scsi_read_dvd_structure()
1070 uint8_t *buf = r->req.cmd.buf; in scsi_get_event_status_notification()
1348 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_disk_emulate_mode_sense()
1355 dbd = (r->req.cmd.buf[1] & 0x8) != 0; in scsi_disk_emulate_mode_sense()
1356 page = r->req.cmd.buf[2] & 0x3f; in scsi_disk_emulate_mode_sense()
1357 page_control = (r->req.cmd.buf[2] & 0xc0) >> 6; in scsi_disk_emulate_mode_sense()
1359 trace_scsi_disk_emulate_mode_sense((r->req.cmd.buf[0] == MODE_SENSE) ? 6 : in scsi_disk_emulate_mode_sense()
1360 10, page, r->req.cmd.xfer, page_control); in scsi_disk_emulate_mode_sense()
1361 memset(outbuf, 0, r->req.cmd.xfer); in scsi_disk_emulate_mode_sense()
1393 if (r->req.cmd.buf[0] == MODE_SENSE) { in scsi_disk_emulate_mode_sense()
1407 if (r->req.cmd.buf[0] == MODE_SENSE) { in scsi_disk_emulate_mode_sense()
1450 if (r->req.cmd.buf[0] == MODE_SENSE) { in scsi_disk_emulate_mode_sense()
1459 static int scsi_disk_emulate_read_toc(SCSIRequest *req, uint8_t *outbuf) in scsi_disk_emulate_read_toc() argument
1461 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev); in scsi_disk_emulate_read_toc()
1465 msf = req->cmd.buf[1] & 2; in scsi_disk_emulate_read_toc()
1466 format = req->cmd.buf[2] & 0xf; in scsi_disk_emulate_read_toc()
1467 start_track = req->cmd.buf[6]; in scsi_disk_emulate_read_toc()
1494 SCSIRequest *req = &r->req; in scsi_disk_emulate_start_stop() local
1495 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev); in scsi_disk_emulate_start_stop()
1496 bool start = req->cmd.buf[4] & 1; in scsi_disk_emulate_start_stop()
1497 bool loej = req->cmd.buf[4] & 2; /* load on start, eject on !start */ in scsi_disk_emulate_start_stop()
1498 int pwrcnd = req->cmd.buf[4] & 0xf0; in scsi_disk_emulate_start_stop()
1522 static void scsi_disk_emulate_read_data(SCSIRequest *req) in scsi_disk_emulate_read_data() argument
1524 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req); in scsi_disk_emulate_read_data()
1531 scsi_req_data(&r->req, buflen); in scsi_disk_emulate_read_data()
1536 scsi_req_complete(&r->req, GOOD); in scsi_disk_emulate_read_data()
1597 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in mode_select_pages()
1656 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_disk_emulate_mode_select()
1658 int cmd = r->req.cmd.buf[0]; in scsi_disk_emulate_mode_select()
1659 int len = r->req.cmd.xfer; in scsi_disk_emulate_mode_select()
1664 if ((r->req.cmd.buf[1] & 0x11) != 0x10) { in scsi_disk_emulate_mode_select()
1715 scsi_req_ref(&r->req); in scsi_disk_emulate_mode_select()
1718 r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_aio_complete, r); in scsi_disk_emulate_mode_select()
1722 scsi_req_complete(&r->req, GOOD); in scsi_disk_emulate_mode_select()
1765 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_unmap_complete_noio()
1767 assert(r->req.aiocb == NULL); in scsi_unmap_complete_noio()
1786 r->req.aiocb = blk_aio_pdiscard(s->qdev.conf.blk, in scsi_unmap_complete_noio()
1795 scsi_req_complete(&r->req, GOOD); in scsi_unmap_complete_noio()
1798 scsi_req_unref(&r->req); in scsi_unmap_complete_noio()
1806 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_unmap_complete()
1808 assert(r->req.aiocb != NULL); in scsi_unmap_complete()
1809 r->req.aiocb = NULL; in scsi_unmap_complete()
1812 scsi_req_unref(&r->req); in scsi_unmap_complete()
1822 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_disk_emulate_unmap()
1824 int len = r->req.cmd.xfer; in scsi_disk_emulate_unmap()
1828 if (r->req.cmd.buf[1] & 0x1) { in scsi_disk_emulate_unmap()
1857 scsi_req_ref(&r->req); in scsi_disk_emulate_unmap()
1883 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_write_same_complete()
1885 assert(r->req.aiocb != NULL); in scsi_write_same_complete()
1886 r->req.aiocb = NULL; in scsi_write_same_complete()
1904 r->req.aiocb = blk_aio_pwritev(s->qdev.conf.blk, in scsi_write_same_complete()
1911 scsi_req_complete(&r->req, GOOD); in scsi_write_same_complete()
1914 scsi_req_unref(&r->req); in scsi_write_same_complete()
1921 SCSIRequest *req = &r->req; in scsi_disk_emulate_write_same() local
1922 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev); in scsi_disk_emulate_write_same()
1923 uint32_t nb_sectors = scsi_data_cdb_xfer(r->req.cmd.buf); in scsi_disk_emulate_write_same()
1929 if (nb_sectors == 0 || (req->cmd.buf[1] & 0x16)) { in scsi_disk_emulate_write_same()
1938 if (!check_lba_range(s, r->req.cmd.lba, nb_sectors)) { in scsi_disk_emulate_write_same()
1943 if ((req->cmd.buf[1] & 0x1) || buffer_is_zero(inbuf, s->qdev.blocksize)) { in scsi_disk_emulate_write_same()
1944 int flags = (req->cmd.buf[1] & 0x8) ? BDRV_REQ_MAY_UNMAP : 0; in scsi_disk_emulate_write_same()
1947 scsi_req_ref(&r->req); in scsi_disk_emulate_write_same()
1951 r->req.aiocb = blk_aio_pwrite_zeroes(s->qdev.conf.blk, in scsi_disk_emulate_write_same()
1952 r->req.cmd.lba * s->qdev.blocksize, in scsi_disk_emulate_write_same()
1960 data->sector = r->req.cmd.lba * (s->qdev.blocksize / BDRV_SECTOR_SIZE); in scsi_disk_emulate_write_same()
1973 scsi_req_ref(&r->req); in scsi_disk_emulate_write_same()
1976 r->req.aiocb = blk_aio_pwritev(s->qdev.conf.blk, in scsi_disk_emulate_write_same()
1982 static void scsi_disk_emulate_write_data(SCSIRequest *req) in scsi_disk_emulate_write_data() argument
1984 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req); in scsi_disk_emulate_write_data()
1990 scsi_req_data(&r->req, buflen); in scsi_disk_emulate_write_data()
1994 switch (req->cmd.buf[0]) { in scsi_disk_emulate_write_data()
2008 if (r->req.status == -1) { in scsi_disk_emulate_write_data()
2019 scsi_req_complete(&r->req, GOOD); in scsi_disk_emulate_write_data()
2027 static int32_t scsi_disk_emulate_command(SCSIRequest *req, uint8_t *buf) in scsi_disk_emulate_command() argument
2029 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req); in scsi_disk_emulate_command()
2030 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev); in scsi_disk_emulate_command()
2035 switch (req->cmd.buf[0]) { in scsi_disk_emulate_command()
2067 if (req->cmd.xfer > 65536) { in scsi_disk_emulate_command()
2070 r->buflen = MAX(4096, req->cmd.xfer); in scsi_disk_emulate_command()
2078 switch (req->cmd.buf[0]) { in scsi_disk_emulate_command()
2083 buflen = scsi_disk_emulate_inquiry(req, outbuf); in scsi_disk_emulate_command()
2096 buflen = scsi_disk_emulate_read_toc(req, outbuf); in scsi_disk_emulate_command()
2102 if (req->cmd.buf[1] & 1) { in scsi_disk_emulate_command()
2107 if (req->cmd.buf[1] & 3) { in scsi_disk_emulate_command()
2112 if (req->cmd.buf[1] & 1) { in scsi_disk_emulate_command()
2117 if (req->cmd.buf[1] & 3) { in scsi_disk_emulate_command()
2127 s->tray_locked = req->cmd.buf[4] & 1; in scsi_disk_emulate_command()
2128 blk_lock_medium(s->qdev.conf.blk, req->cmd.buf[4] & 1); in scsi_disk_emulate_command()
2138 if ((req->cmd.buf[8] & 1) == 0 && req->cmd.lba) { in scsi_disk_emulate_command()
2162 (req->cmd.buf[1] & 1) == 0); in scsi_disk_emulate_command()
2199 if ((req->cmd.buf[1] & 31) == SAI_READ_CAPACITY_16) { in scsi_disk_emulate_command()
2201 memset(outbuf, 0, req->cmd.xfer); in scsi_disk_emulate_command()
2207 if ((req->cmd.buf[14] & 1) == 0 && req->cmd.lba) { in scsi_disk_emulate_command()
2242 scsi_req_ref(&r->req); in scsi_disk_emulate_command()
2245 r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_aio_complete, r); in scsi_disk_emulate_command()
2248 trace_scsi_disk_emulate_command_SEEK_10(r->req.cmd.lba); in scsi_disk_emulate_command()
2249 if (r->req.cmd.lba > s->qdev.max_lba) { in scsi_disk_emulate_command()
2254 trace_scsi_disk_emulate_command_MODE_SELECT(r->req.cmd.xfer); in scsi_disk_emulate_command()
2257 trace_scsi_disk_emulate_command_MODE_SELECT_10(r->req.cmd.xfer); in scsi_disk_emulate_command()
2260 trace_scsi_disk_emulate_command_UNMAP(r->req.cmd.xfer); in scsi_disk_emulate_command()
2265 trace_scsi_disk_emulate_command_VERIFY((req->cmd.buf[1] >> 1) & 3); in scsi_disk_emulate_command()
2266 if (req->cmd.buf[1] & 6) { in scsi_disk_emulate_command()
2273 req->cmd.buf[0] == WRITE_SAME_10 ? 10 : 16, r->req.cmd.xfer); in scsi_disk_emulate_command()
2276 trace_scsi_disk_emulate_command_FORMAT_UNIT(r->req.cmd.xfer); in scsi_disk_emulate_command()
2284 assert(!r->req.aiocb); in scsi_disk_emulate_command()
2285 r->iov.iov_len = MIN(r->buflen, req->cmd.xfer); in scsi_disk_emulate_command()
2287 scsi_req_complete(&r->req, GOOD); in scsi_disk_emulate_command()
2289 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) { in scsi_disk_emulate_command()
2290 assert(r->iov.iov_len == req->cmd.xfer); in scsi_disk_emulate_command()
2297 if (r->req.status == -1) { in scsi_disk_emulate_command()
2312 static int32_t scsi_disk_dma_command(SCSIRequest *req, uint8_t *buf) in scsi_disk_dma_command() argument
2314 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req); in scsi_disk_dma_command()
2315 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev); in scsi_disk_dma_command()
2327 len = scsi_data_cdb_xfer(r->req.cmd.buf); in scsi_disk_dma_command()
2333 trace_scsi_disk_dma_command_READ(r->req.cmd.lba, len); in scsi_disk_dma_command()
2338 if (s->qdev.scsi_version > 2 && (r->req.cmd.buf[1] & 0xe0)) { in scsi_disk_dma_command()
2341 if (!check_lba_range(s, r->req.cmd.lba, len)) { in scsi_disk_dma_command()
2344 r->sector = r->req.cmd.lba * (s->qdev.blocksize / BDRV_SECTOR_SIZE); in scsi_disk_dma_command()
2360 r->req.cmd.lba, len); in scsi_disk_dma_command()
2369 if (s->qdev.scsi_version > 2 && (r->req.cmd.buf[1] & 0xe0)) { in scsi_disk_dma_command()
2372 if (!check_lba_range(s, r->req.cmd.lba, len)) { in scsi_disk_dma_command()
2375 r->sector = r->req.cmd.lba * (s->qdev.blocksize / BDRV_SECTOR_SIZE); in scsi_disk_dma_command()
2387 r->need_fua_emulation = sdc->need_fua_emulation(&r->req.cmd); in scsi_disk_dma_command()
2389 scsi_req_complete(&r->req, GOOD); in scsi_disk_dma_command()
2392 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) { in scsi_disk_dma_command()
2738 SCSIRequest *req; in scsi_new_request() local
2747 req = scsi_req_alloc(ops, &s->qdev, tag, lun, hba_private); in scsi_new_request()
2753 return req; in scsi_new_request()
2838 SCSIDiskReq req; member
2852 SCSIBlockReq *req = (SCSIBlockReq *)opaque; in scsi_block_sgio_complete() local
2853 SCSIDiskReq *r = &req->req; in scsi_block_sgio_complete()
2854 sg_io_hdr_t *io_hdr = &req->io_header; in scsi_block_sgio_complete()
2859 scsi_req_complete_failed(&r->req, io_hdr->host_status); in scsi_block_sgio_complete()
2860 scsi_req_unref(&r->req); in scsi_block_sgio_complete()
2871 req->cb(req->cb_opaque, ret); in scsi_block_sgio_complete()
2874 static BlockAIOCB *scsi_block_do_sgio(SCSIBlockReq *req, in scsi_block_do_sgio() argument
2879 sg_io_hdr_t *io_header = &req->io_header; in scsi_block_do_sgio()
2880 SCSIDiskReq *r = &req->req; in scsi_block_do_sgio()
2881 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_block_do_sgio()
2907 io_header->cmdp = req->cdb; in scsi_block_do_sgio()
2911 if ((req->cmd >> 5) == 0 && lba <= 0x1ffff) { in scsi_block_do_sgio()
2913 stl_be_p(&req->cdb[0], lba | (req->cmd << 24)); in scsi_block_do_sgio()
2914 req->cdb[4] = nb_logical_blocks; in scsi_block_do_sgio()
2915 req->cdb[5] = 0; in scsi_block_do_sgio()
2917 } else if ((req->cmd >> 5) <= 1 && lba <= 0xffffffffULL) { in scsi_block_do_sgio()
2919 req->cdb[0] = (req->cmd & 0x1f) | 0x20; in scsi_block_do_sgio()
2920 req->cdb[1] = req->cdb1; in scsi_block_do_sgio()
2921 stl_be_p(&req->cdb[2], lba); in scsi_block_do_sgio()
2922 req->cdb[6] = req->group_number; in scsi_block_do_sgio()
2923 stw_be_p(&req->cdb[7], nb_logical_blocks); in scsi_block_do_sgio()
2924 req->cdb[9] = 0; in scsi_block_do_sgio()
2926 } else if ((req->cmd >> 5) != 4 && lba <= 0xffffffffULL) { in scsi_block_do_sgio()
2928 req->cdb[0] = (req->cmd & 0x1f) | 0xA0; in scsi_block_do_sgio()
2929 req->cdb[1] = req->cdb1; in scsi_block_do_sgio()
2930 stl_be_p(&req->cdb[2], lba); in scsi_block_do_sgio()
2931 stl_be_p(&req->cdb[6], nb_logical_blocks); in scsi_block_do_sgio()
2932 req->cdb[10] = req->group_number; in scsi_block_do_sgio()
2933 req->cdb[11] = 0; in scsi_block_do_sgio()
2937 req->cdb[0] = (req->cmd & 0x1f) | 0x80; in scsi_block_do_sgio()
2938 req->cdb[1] = req->cdb1; in scsi_block_do_sgio()
2939 stq_be_p(&req->cdb[2], lba); in scsi_block_do_sgio()
2940 stl_be_p(&req->cdb[10], nb_logical_blocks); in scsi_block_do_sgio()
2941 req->cdb[14] = req->group_number; in scsi_block_do_sgio()
2942 req->cdb[15] = 0; in scsi_block_do_sgio()
2947 io_header->mx_sb_len = sizeof(r->req.sense); in scsi_block_do_sgio()
2948 io_header->sbp = r->req.sense; in scsi_block_do_sgio()
2952 req->cb = cb; in scsi_block_do_sgio()
2953 req->cb_opaque = opaque; in scsi_block_do_sgio()
2954 trace_scsi_disk_aio_sgio_command(r->req.tag, req->cdb[0], lba, in scsi_block_do_sgio()
2956 aiocb = blk_aio_ioctl(s->qdev.conf.blk, SG_IO, io_header, scsi_block_sgio_complete, req); in scsi_block_do_sgio()
3031 static int32_t scsi_block_dma_command(SCSIRequest *req, uint8_t *buf) in scsi_block_dma_command() argument
3033 SCSIBlockReq *r = (SCSIBlockReq *)req; in scsi_block_dma_command()
3034 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev); in scsi_block_dma_command()
3036 r->cmd = req->cmd.buf[0]; in scsi_block_dma_command()
3044 r->cdb1 = req->cmd.buf[1]; in scsi_block_dma_command()
3045 r->group_number = req->cmd.buf[6]; in scsi_block_dma_command()
3049 r->cdb1 = req->cmd.buf[1]; in scsi_block_dma_command()
3050 r->group_number = req->cmd.buf[10]; in scsi_block_dma_command()
3054 r->cdb1 = req->cmd.buf[1]; in scsi_block_dma_command()
3055 r->group_number = req->cmd.buf[14]; in scsi_block_dma_command()
3065 if (s->qdev.scsi_version > 2 && (req->cmd.buf[1] & 0xe0)) { in scsi_block_dma_command()
3066 scsi_check_condition(&r->req, SENSE_CODE(INVALID_FIELD)); in scsi_block_dma_command()
3070 return scsi_disk_dma_command(req, buf); in scsi_block_dma_command()
3112 static void scsi_block_update_sense(SCSIRequest *req) in scsi_block_update_sense() argument
3114 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req); in scsi_block_update_sense()
3115 SCSIBlockReq *br = DO_UPCAST(SCSIBlockReq, req, r); in scsi_block_update_sense()
3116 r->req.sense_len = MIN(br->io_header.sb_len_wr, sizeof(r->req.sense)); in scsi_block_update_sense()
3126 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_dma_readv()
3136 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_dma_writev()