| 68 | }; |
| 69 | |
| 70 | rt_err_t scsi_cdrom_probe(struct rt_scsi_device *sdev) |
| 71 | { |
| 72 | rt_err_t err; |
| 73 | union |
| 74 | { |
| 75 | struct rt_scsi_read_capacity10_data capacity10; |
| 76 | struct rt_scsi_read_capacity16_data capacity16; |
| 77 | } data; |
| 78 | struct scsi_cdrom *scdrom = rt_calloc(1, sizeof(*scdrom)); |
| 79 | |
| 80 | if (!scdrom) |
| 81 | { |
| 82 | return -RT_ENOMEM; |
| 83 | } |
| 84 | |
| 85 | if ((scdrom->cdrom_id = rt_dm_ida_alloc(&cdrom_ida)) < 0) |
| 86 | { |
| 87 | return -RT_EFULL; |
| 88 | } |
| 89 | |
| 90 | sdev->priv = scdrom; |
| 91 | scdrom->sdev = sdev; |
| 92 | scdrom->parent.ida = &scsi_cdrom_ida; |
| 93 | scdrom->parent.read_only = RT_TRUE; |
| 94 | scdrom->parent.parallel_io = RT_FALSE; |
| 95 | scdrom->parent.ops = &scsi_cdrom_ops; |
| 96 | scdrom->parent.max_partitions = RT_BLK_PARTITION_NONE; |
| 97 | |
| 98 | if ((err = rt_scsi_read_capacity10(sdev, &data.capacity10))) |
| 99 | { |
| 100 | goto _fail; |
| 101 | } |
| 102 | if (data.capacity10.last_block == 0xffffffff) |
| 103 | { |
| 104 | if ((err = rt_scsi_read_capacity16(sdev, &data.capacity16))) |
| 105 | { |
| 106 | goto _fail; |
| 107 | } |
| 108 | } |
| 109 | scdrom->geometry.bytes_per_sector = sdev->block_size; |
| 110 | scdrom->geometry.block_size = sdev->block_size; |
| 111 | scdrom->geometry.sector_count = sdev->last_block + 1; |
| 112 | |
| 113 | rt_dm_dev_set_name(&scdrom->parent.parent, "cdrom%u", scdrom->cdrom_id); |
| 114 | |
| 115 | if ((err = rt_hw_blk_disk_register(&scdrom->parent))) |
| 116 | { |
| 117 | goto _fail; |
| 118 | } |
| 119 | |
| 120 | return RT_EOK; |
| 121 | |
| 122 | _fail: |
| 123 | rt_dm_ida_free(&cdrom_ida, scdrom->cdrom_id); |
| 124 | rt_free(scdrom); |
| 125 | |
| 126 | return err; |
| 127 | } |
nothing calls this directly
no test coverage detected