| 174 | } |
| 175 | |
| 176 | rt_err_t disk_add_blk_dev(struct rt_blk_disk *disk, struct rt_blk_device *blk) |
| 177 | { |
| 178 | rt_err_t err; |
| 179 | #ifdef RT_USING_DM |
| 180 | int device_id; |
| 181 | #endif |
| 182 | const char *disk_name, *name_fmt; |
| 183 | |
| 184 | if (!disk || !blk) |
| 185 | { |
| 186 | return -RT_EINVAL; |
| 187 | } |
| 188 | |
| 189 | #ifdef RT_USING_DM |
| 190 | if ((device_id = rt_dm_ida_alloc(disk->ida)) < 0) |
| 191 | { |
| 192 | return -RT_EFULL; |
| 193 | } |
| 194 | #endif |
| 195 | |
| 196 | blk->disk = disk; |
| 197 | rt_list_init(&blk->list); |
| 198 | |
| 199 | disk_name = to_disk_name(disk); |
| 200 | |
| 201 | /* End is [a-zA-Z] or [0-9] */ |
| 202 | if (disk_name[rt_strlen(disk_name) - 1] < 'a') |
| 203 | { |
| 204 | name_fmt = "%sp%d"; |
| 205 | } |
| 206 | else |
| 207 | { |
| 208 | name_fmt = "%s%d"; |
| 209 | } |
| 210 | |
| 211 | #ifdef RT_USING_DM |
| 212 | rt_dm_dev_set_name(&blk->parent, name_fmt, disk_name, blk->partno); |
| 213 | blk->parent.master_id = disk->ida->master_id; |
| 214 | blk->parent.device_id = device_id; |
| 215 | #else |
| 216 | rt_snprintf(blk->parent.parent.name, RT_NAME_MAX, name_fmt, disk_name, blk->partno); |
| 217 | #endif |
| 218 | device_set_blk_fops(&blk->parent); |
| 219 | |
| 220 | err = rt_device_register(&blk->parent, to_blk_name(blk), |
| 221 | disk->parent.flag & RT_DEVICE_FLAG_RDWR); |
| 222 | |
| 223 | if (err) |
| 224 | { |
| 225 | #ifdef RT_USING_DM |
| 226 | rt_dm_ida_free(disk->ida, device_id); |
| 227 | #endif |
| 228 | return err; |
| 229 | } |
| 230 | |
| 231 | spin_lock(&disk->lock); |
| 232 | |
| 233 | rt_list_insert_before(&disk->part_nodes, &blk->list); |
no test coverage detected