Lines Matching +full:data +full:- +full:channel

2  * Virtio-SCSI implementation for s390 machine loader for qemu
8 * your option) any later version. See the COPYING file in the top-level
14 #include "s390-ccw.h"
17 #include "virtio-scsi.h"
18 #include "s390-time.h"
52 CDB_STATUS_VALID(resp->status) ? ": " : ": invalid ", in virtio_scsi_verify_response()
53 scsi_cdb_status_msg(resp->status), in virtio_scsi_verify_response()
54 resp->status == CDB_STATUS_CHECK_CONDITION ? " " : 0, in virtio_scsi_verify_response()
55 resp->sense_len ? scsi_cdb_asc_msg(resp->sense) in virtio_scsi_verify_response()
56 : "no sense data", in virtio_scsi_verify_response()
57 scsi_sense_response(resp->sense) == 0x70 ? ", sure" : "?", in virtio_scsi_verify_response()
61 return vs_assert(resp->response == VIRTIO_SCSI_S_OK, mr) && in virtio_scsi_verify_response()
62 vs_assert(resp->status == CDB_STATUS_GOOD, ms); in virtio_scsi_verify_response()
66 void *data, uint32_t data_size) in prepare_request() argument
68 const ScsiDevice *sdev = vdev->scsi_device; in prepare_request()
71 req.lun = make_lun(sdev->channel, sdev->target, sdev->lun); in prepare_request()
78 if (data && data_size) { in prepare_request()
79 memset(data, 0, data_size); in prepare_request()
94 void *data, uint32_t data_size) in vs_run() argument
96 prepare_request(vdev, cdb, cdb_size, data, data_size); in vs_run()
99 return -EIO; in vs_run()
108 void *data, uint32_t data_size) in scsi_inquiry() argument
119 { data, data_size, VRING_DESC_F_WRITE }, in scsi_inquiry()
123 vdev, &cdb, sizeof(cdb), data, data_size); in scsi_inquiry()
144 static int scsi_report_luns(VDev *vdev, void *data, uint32_t data_size) in scsi_report_luns() argument
154 { data, data_size, VRING_DESC_F_WRITE }, in scsi_report_luns()
158 vdev, &cdb, sizeof(cdb), data, data_size); in scsi_report_luns()
164 unsigned long sector, int sectors, void *data, in scsi_read_10() argument
175 { data, data_size, VRING_DESC_F_WRITE }, in scsi_read_10()
182 vdev, &cdb, sizeof(cdb), data, data_size); in scsi_read_10()
188 void *data, uint32_t data_size) in scsi_read_capacity() argument
198 { data, data_size, VRING_DESC_F_WRITE }, in scsi_read_capacity()
202 vdev, &cdb, sizeof(cdb), data, data_size); in scsi_read_capacity()
207 /* virtio-scsi routines */
211 * device to the vdev->scsi_device structure.
216 const uint16_t channel = 0; /* again, it's what QEMU does */ in virtio_scsi_locate_device() local
218 static uint8_t data[16 + 8 * 63]; in virtio_scsi_locate_device() local
219 ScsiLunReport *r = (void *) data; in virtio_scsi_locate_device()
220 ScsiDevice *sdev = vdev->scsi_device; in virtio_scsi_locate_device()
223 /* QEMU has hardcoded channel #0 in many places. in virtio_scsi_locate_device()
225 * vdev->config.scsi.max_channel != 0 here. in virtio_scsi_locate_device()
227 debug_print_int("config.scsi.max_channel", vdev->config.scsi.max_channel); in virtio_scsi_locate_device()
228 debug_print_int("config.scsi.max_target ", vdev->config.scsi.max_target); in virtio_scsi_locate_device()
229 debug_print_int("config.scsi.max_lun ", vdev->config.scsi.max_lun); in virtio_scsi_locate_device()
230 debug_print_int("config.scsi.max_sectors", vdev->config.scsi.max_sectors); in virtio_scsi_locate_device()
232 if (vdev->scsi_device_selected) { in virtio_scsi_locate_device()
233 sdev->channel = vdev->selected_scsi_device.channel; in virtio_scsi_locate_device()
234 sdev->target = vdev->selected_scsi_device.target; in virtio_scsi_locate_device()
235 sdev->lun = vdev->selected_scsi_device.lun; in virtio_scsi_locate_device()
237 IPL_check(sdev->channel == 0, "non-zero channel requested"); in virtio_scsi_locate_device()
238 IPL_check(sdev->target <= vdev->config.scsi.max_target, "target# high"); in virtio_scsi_locate_device()
239 IPL_check(sdev->lun <= vdev->config.scsi.max_lun, "LUN# high"); in virtio_scsi_locate_device()
243 for (target = 0; target <= vdev->config.scsi.max_target; target++) { in virtio_scsi_locate_device()
244 sdev->channel = channel; in virtio_scsi_locate_device()
245 sdev->target = target; in virtio_scsi_locate_device()
246 sdev->lun = 0; /* LUN has to be 0 for REPORT LUNS */ in virtio_scsi_locate_device()
247 ret = scsi_report_luns(vdev, data, sizeof(data)); in virtio_scsi_locate_device()
258 return -EIO; in virtio_scsi_locate_device()
262 if (r->lun_list_len == 0) { in virtio_scsi_locate_device()
266 luns = r->lun_list_len / 8; in virtio_scsi_locate_device()
269 /* There is no ",lun=#" arg for -device or ",lun=0" given. in virtio_scsi_locate_device()
273 sdev->lun = r->lun[0].v16[0]; /* it's returned this way */ in virtio_scsi_locate_device()
274 debug_print_int("Have to use LUN", sdev->lun); in virtio_scsi_locate_device()
278 if (r->lun[i].v64) { in virtio_scsi_locate_device()
279 /* Look for non-zero LUN - we have where to choose from */ in virtio_scsi_locate_device()
280 sdev->lun = r->lun[i].v16[0]; in virtio_scsi_locate_device()
281 debug_print_int("Will use LUN", sdev->lun); in virtio_scsi_locate_device()
287 puts("Warning: Could not locate a usable virtio-scsi device"); in virtio_scsi_locate_device()
288 return -ENODEV; in virtio_scsi_locate_device()
295 int f = vdev->blk_factor; in virtio_scsi_read_many()
297 unsigned int max_transfer = MIN_NON_ZERO(vdev->config.scsi.max_sectors, in virtio_scsi_read_many()
298 vdev->max_transfer); in virtio_scsi_read_many()
305 if (!virtio_scsi_verify_response(&resp, "virtio-scsi:read_many")) { in virtio_scsi_read_many()
306 return -1; in virtio_scsi_read_many()
311 sec_num -= sector_count; in virtio_scsi_read_many()
317 static bool virtio_scsi_inquiry_response_is_cdrom(void *data) in virtio_scsi_inquiry_response_is_cdrom() argument
319 const ScsiInquiryStd *response = data; in virtio_scsi_inquiry_response_is_cdrom()
320 const int resp_data_fmt = response->b3 & 0x0f; in virtio_scsi_inquiry_response_is_cdrom()
328 if ((response->peripheral_qdt & 0x1f) == SCSI_INQ_RDT_CDROM) { in virtio_scsi_inquiry_response_is_cdrom()
332 for (i = 0; i < sizeof(response->prod_id); i++) { in virtio_scsi_inquiry_response_is_cdrom()
333 if (response->prod_id[i] != QEMU_CDROM_SIGNATURE[i]) { in virtio_scsi_inquiry_response_is_cdrom()
340 static void scsi_parse_capacity_report(void *data, in scsi_parse_capacity_report() argument
343 ScsiReadCapacity16Data *p = data; in scsi_parse_capacity_report()
346 *last_lba = p->ret_lba; in scsi_parse_capacity_report()
350 *lb_len = p->lb_len; in scsi_parse_capacity_report()
357 uint8_t data[256]; in virtio_scsi_setup() local
358 uint32_t data_size = sizeof(data); in virtio_scsi_setup()
363 vdev->scsi_device = &default_scsi_device; in virtio_scsi_setup()
377 puts("virtio-scsi: setup: no SENSE data"); in virtio_scsi_setup()
378 return -EINVAL; in virtio_scsi_setup()
383 puts("virtio-scsi:setup: cannot retry"); in virtio_scsi_setup()
384 return -EIO; in virtio_scsi_setup()
391 retry_test_unit_ready--; in virtio_scsi_setup()
396 if (!virtio_scsi_verify_response(&resp, "virtio-scsi:setup")) { in virtio_scsi_setup()
397 return -1; in virtio_scsi_setup()
409 "virtio-scsi:setup:inquiry")) { in virtio_scsi_setup()
410 return -1; in virtio_scsi_setup()
415 puts("SCSI CD-ROM detected."); in virtio_scsi_setup()
416 vdev->is_cdrom = true; in virtio_scsi_setup()
417 vdev->scsi_block_size = VIRTIO_ISO_BLOCK_SIZE; in virtio_scsi_setup()
427 "virtio-scsi:setup:supported_pages")) { in virtio_scsi_setup()
428 return -1; in virtio_scsi_setup()
432 debug_print_int("EVPD length", evpd->page_length); in virtio_scsi_setup()
434 for (i = 0; i <= evpd->page_length; i++) { in virtio_scsi_setup()
435 debug_print_int("supported EVPD page", evpd->byte[i]); in virtio_scsi_setup()
437 if (evpd->byte[i] != SCSI_INQUIRY_EVPD_BLOCK_LIMITS) { in virtio_scsi_setup()
448 "virtio-scsi:setup:blocklimits")) { in virtio_scsi_setup()
449 return -1; in virtio_scsi_setup()
453 debug_print_int("max transfer", evpd_bl->max_transfer); in virtio_scsi_setup()
454 vdev->max_transfer = evpd_bl->max_transfer; in virtio_scsi_setup()
463 vdev->max_transfer = MIN_NON_ZERO(VIRTIO_SCSI_MAX_SECTORS, in virtio_scsi_setup()
464 vdev->max_transfer); in virtio_scsi_setup()
466 ret = scsi_read_capacity(vdev, data, data_size); in virtio_scsi_setup()
469 "virtio-scsi:setup:read_capacity")) { in virtio_scsi_setup()
470 return -1; in virtio_scsi_setup()
473 scsi_parse_capacity_report(data, &vdev->scsi_last_block, in virtio_scsi_setup()
474 (uint32_t *) &vdev->scsi_block_size); in virtio_scsi_setup()
483 vdev->schid = schid; in virtio_scsi_setup_device()
486 if (vdev->config.scsi.sense_size != VIRTIO_SCSI_SENSE_SIZE) { in virtio_scsi_setup_device()
488 return -EINVAL; in virtio_scsi_setup_device()
491 if (vdev->config.scsi.cdb_size != VIRTIO_SCSI_CDB_SIZE) { in virtio_scsi_setup_device()
493 return -EINVAL; in virtio_scsi_setup_device()
496 puts("Using virtio-scsi."); in virtio_scsi_setup_device()