Lines Matching defs:base
176 static void process_scan_resp(struct virtio_scsi_scan_base *base);
386 static int send_scan_io(struct virtio_scsi_scan_base *base);
387 static void _virtio_scsi_dev_scan_tgt(struct virtio_scsi_scan_base *base, uint8_t target);
388 static int _virtio_scsi_dev_scan_next(struct virtio_scsi_scan_base *base, int rc);
389 static void _virtio_scsi_dev_scan_finish(struct virtio_scsi_scan_base *base, int errnum);
1020 _virtio_scsi_dev_scan_finish(struct virtio_scsi_scan_base *base, int errnum)
1022 struct virtio_scsi_dev *svdev = base->svdev;
1028 spdk_put_io_channel(spdk_io_channel_from_ctx(base->channel));
1029 base->svdev->scan_ctx = NULL;
1031 TAILQ_FOREACH_SAFE(tgt, &base->scan_queue, tailq, next_tgt) {
1032 TAILQ_REMOVE(&base->scan_queue, tgt, tailq);
1036 if (base->cb_fn == NULL) {
1037 spdk_free(base);
1049 base->cb_fn(base->cb_arg, errnum, bdevs, bdevs_cnt);
1050 spdk_free(base);
1054 send_scan_io(struct virtio_scsi_scan_base *base)
1056 struct virtio_scsi_io_ctx *io_ctx = &base->io_ctx;
1057 struct virtio_scsi_cmd_req *req = &base->io_ctx.req;
1058 struct virtqueue *vq = base->channel->vq;
1059 int payload_iov_cnt = base->iov.iov_len > 0 ? 1 : 0;
1063 req->lun[1] = base->info.target;
1067 base->needs_resend = true;
1073 virtqueue_req_add_iovs(vq, &base->iov, payload_iov_cnt, SPDK_VIRTIO_DESC_WR);
1080 send_inquiry(struct virtio_scsi_scan_base *base)
1082 struct virtio_scsi_cmd_req *req = &base->io_ctx.req;
1087 base->iov.iov_len = BDEV_VIRTIO_SCAN_PAYLOAD_SIZE;
1092 return send_scan_io(base);
1096 send_inquiry_vpd(struct virtio_scsi_scan_base *base, uint8_t page_code)
1098 struct virtio_scsi_cmd_req *req = &base->io_ctx.req;
1103 base->iov.iov_len = BDEV_VIRTIO_SCAN_PAYLOAD_SIZE;
1107 to_be16(inquiry_cdb->alloc_len, base->iov.iov_len);
1109 return send_scan_io(base);
1113 send_read_cap_10(struct virtio_scsi_scan_base *base)
1115 struct virtio_scsi_cmd_req *req = &base->io_ctx.req;
1119 base->iov.iov_len = 8;
1122 return send_scan_io(base);
1126 send_read_cap_16(struct virtio_scsi_scan_base *base)
1128 struct virtio_scsi_cmd_req *req = &base->io_ctx.req;
1132 base->iov.iov_len = 32;
1135 to_be32(&req->cdb[10], base->iov.iov_len);
1137 return send_scan_io(base);
1141 send_test_unit_ready(struct virtio_scsi_scan_base *base)
1143 struct virtio_scsi_cmd_req *req = &base->io_ctx.req;
1147 base->iov.iov_len = 0;
1149 return send_scan_io(base);
1153 send_start_stop_unit(struct virtio_scsi_scan_base *base)
1155 struct virtio_scsi_cmd_req *req = &base->io_ctx.req;
1160 base->iov.iov_len = 0;
1162 return send_scan_io(base);
1166 process_scan_start_stop_unit(struct virtio_scsi_scan_base *base)
1168 struct virtio_scsi_cmd_resp *resp = &base->io_ctx.resp;
1171 return send_inquiry_vpd(base, SPDK_SPC_VPD_SUPPORTED_VPD_PAGES);
1178 process_scan_test_unit_ready(struct virtio_scsi_scan_base *base)
1180 struct virtio_scsi_cmd_resp *resp = &base->io_ctx.resp;
1187 return send_inquiry_vpd(base, SPDK_SPC_VPD_SUPPORTED_VPD_PAGES);
1192 return send_start_stop_unit(base);
1199 process_scan_inquiry_standard(struct virtio_scsi_scan_base *base)
1201 struct virtio_scsi_cmd_resp *resp = &base->io_ctx.resp;
1203 (struct spdk_scsi_cdb_inquiry_data *)base->payload;
1218 return send_test_unit_ready(base);
1222 process_scan_inquiry_vpd_supported_vpd_pages(struct virtio_scsi_scan_base *base)
1224 struct virtio_scsi_cmd_resp *resp = &base->io_ctx.resp;
1228 const uint8_t *vpd_data = base->payload;
1235 num_supported_pages = spdk_min(page_length, base->iov.iov_len - 4);
1246 return send_inquiry_vpd(base, SPDK_SPC_VPD_BLOCK_THIN_PROVISION);
1248 return send_read_cap_10(base);
1253 process_scan_inquiry_vpd_block_thin_provision(struct virtio_scsi_scan_base *base)
1255 struct virtio_scsi_cmd_resp *resp = &base->io_ctx.resp;
1257 base->info.unmap_supported = false;
1260 uint8_t *vpd_data = base->payload;
1262 base->info.unmap_supported = !!(vpd_data[5] & SPDK_SCSI_UNMAP_LBPU);
1266 base->info.target, (int)base->info.unmap_supported);
1268 return send_read_cap_10(base);
1272 process_scan_inquiry(struct virtio_scsi_scan_base *base)
1274 struct virtio_scsi_cmd_req *req = &base->io_ctx.req;
1278 return process_scan_inquiry_standard(base);
1283 return process_scan_inquiry_vpd_supported_vpd_pages(base);
1285 return process_scan_inquiry_vpd_block_thin_provision(base);
1379 process_read_cap_10(struct virtio_scsi_scan_base *base)
1381 struct virtio_scsi_cmd_req *req = &base->io_ctx.req;
1382 struct virtio_scsi_cmd_resp *resp = &base->io_ctx.resp;
1393 block_size = from_be32(base->payload + 4);
1394 max_block = from_be32(base->payload);
1397 return send_read_cap_16(base);
1400 base->info.num_blocks = (uint64_t)max_block + 1;
1401 base->info.block_size = block_size;
1403 rc = virtio_scsi_dev_add_tgt(base->svdev, &base->info);
1408 return _virtio_scsi_dev_scan_next(base, 0);
1412 process_read_cap_16(struct virtio_scsi_scan_base *base)
1414 struct virtio_scsi_cmd_req *req = &base->io_ctx.req;
1415 struct virtio_scsi_cmd_resp *resp = &base->io_ctx.resp;
1424 base->info.num_blocks = from_be64(base->payload) + 1;
1425 base->info.block_size = from_be32(base->payload + 8);
1426 rc = virtio_scsi_dev_add_tgt(base->svdev, &base->info);
1431 return _virtio_scsi_dev_scan_next(base, 0);
1435 process_scan_resp(struct virtio_scsi_scan_base *base)
1437 struct virtio_scsi_cmd_req *req = &base->io_ctx.req;
1438 struct virtio_scsi_cmd_resp *resp = &base->io_ctx.resp;
1442 if (base->io_ctx.iov_req.iov_len < sizeof(struct virtio_scsi_cmd_req) ||
1443 base->io_ctx.iov_resp.iov_len < sizeof(struct virtio_scsi_cmd_resp)) {
1445 _virtio_scsi_dev_scan_next(base, -EIO);
1454 _virtio_scsi_dev_scan_next(base, -ENODEV);
1461 assert(base->retries > 0);
1462 base->retries--;
1463 if (base->retries == 0) {
1467 _virtio_scsi_dev_scan_next(base, -EBUSY);
1472 rc = send_scan_io(base);
1479 base->retries = SCAN_REQUEST_RETRIES;
1483 rc = process_scan_inquiry(base);
1486 rc = process_scan_test_unit_ready(base);
1489 rc = process_scan_start_stop_unit(base);
1492 rc = process_read_cap_10(base);
1495 rc = process_read_cap_16(base);
1504 if (base->needs_resend) {
1508 _virtio_scsi_dev_scan_next(base, rc);
1513 _virtio_scsi_dev_scan_next(struct virtio_scsi_scan_base *base, int rc)
1519 if (base->full_scan) {
1521 disk = virtio_scsi_dev_get_disk_by_id(base->svdev,
1522 base->info.target);
1528 target_id = base->info.target + 1;
1530 _virtio_scsi_dev_scan_tgt(base, target_id);
1534 base->full_scan = false;
1537 next = TAILQ_FIRST(&base->scan_queue);
1539 _virtio_scsi_dev_scan_finish(base, 0);
1543 TAILQ_REMOVE(&base->scan_queue, next, tailq);
1547 _virtio_scsi_dev_scan_tgt(base, target_id);
1554 struct virtio_scsi_scan_base *base;
1565 base = spdk_zmalloc(sizeof(*base), 64, NULL,
1567 if (base == NULL) {
1572 base->svdev = svdev;
1574 base->channel = spdk_io_channel_get_ctx(io_ch);
1575 TAILQ_INIT(&base->scan_queue);
1576 svdev->scan_ctx = base;
1578 base->iov.iov_base = base->payload;
1579 io_ctx = &base->io_ctx;
1587 base->retries = SCAN_REQUEST_RETRIES;
1592 _virtio_scsi_dev_scan_tgt(struct virtio_scsi_scan_base *base, uint8_t target)
1596 memset(&base->info, 0, sizeof(base->info));
1597 base->info.target = target;
1599 rc = send_inquiry(base);
1609 struct virtio_scsi_scan_base *base;
1637 base = svdev->scan_ctx;
1638 base->cb_fn = cb_fn;
1639 base->cb_arg = cb_arg;
1640 base->full_scan = true;
1642 _virtio_scsi_dev_scan_tgt(base, 0);
1649 struct virtio_scsi_scan_base *base;
1653 base = svdev->scan_ctx;
1654 if (base) {
1662 TAILQ_INSERT_TAIL(&base->scan_queue, info, tailq);
1671 base = svdev->scan_ctx;
1672 base->full_scan = true;
1673 _virtio_scsi_dev_scan_tgt(base, target);