Lines Matching +full:error +full:- +full:id
1 // SPDX-License-Identifier: GPL-2.0-only
10 #include <linux/blk-mq.h>
68 DIR_WRITE = 0, /* memory -> device */
69 DIR_READ = 1 /* device -> memory */
88 dev_dbg(&dev->sbd.core, "%s:%u: %u sectors from %llu\n", in ps3disk_scatter_gather()
90 iter.bio->bi_iter.bi_sector); in ps3disk_scatter_gather()
92 memcpy_from_bvec(dev->bounce_buf + offset, &bvec); in ps3disk_scatter_gather()
94 memcpy_to_bvec(&bvec, dev->bounce_buf + offset); in ps3disk_scatter_gather()
102 struct ps3disk_private *priv = ps3_system_bus_get_drvdata(&dev->sbd); in ps3disk_submit_request_sg()
106 unsigned int region_id = dev->regions[dev->region_idx].id; in ps3disk_submit_request_sg()
115 dev_dbg(&dev->sbd.core, in ps3disk_submit_request_sg()
120 start_sector = blk_rq_pos(req) * priv->blocking_factor; in ps3disk_submit_request_sg()
121 sectors = blk_rq_sectors(req) * priv->blocking_factor; in ps3disk_submit_request_sg()
122 dev_dbg(&dev->sbd.core, "%s:%u: %s %llu sectors starting at %llu\n", in ps3disk_submit_request_sg()
128 res = lv1_storage_write(dev->sbd.dev_id, region_id, in ps3disk_submit_request_sg()
130 dev->bounce_lpar, &dev->tag); in ps3disk_submit_request_sg()
132 res = lv1_storage_read(dev->sbd.dev_id, region_id, in ps3disk_submit_request_sg()
134 dev->bounce_lpar, &dev->tag); in ps3disk_submit_request_sg()
137 dev_err(&dev->sbd.core, "%s:%u: %s failed %d\n", __func__, in ps3disk_submit_request_sg()
142 priv->req = req; in ps3disk_submit_request_sg()
149 struct ps3disk_private *priv = ps3_system_bus_get_drvdata(&dev->sbd); in ps3disk_submit_flush_request()
152 dev_dbg(&dev->sbd.core, "%s:%u: flush request\n", __func__, __LINE__); in ps3disk_submit_flush_request()
154 res = lv1_storage_send_device_command(dev->sbd.dev_id, in ps3disk_submit_flush_request()
156 0, &dev->tag); in ps3disk_submit_flush_request()
158 dev_err(&dev->sbd.core, "%s:%u: sync cache failed 0x%llx\n", in ps3disk_submit_flush_request()
163 priv->req = req; in ps3disk_submit_flush_request()
170 dev_dbg(&dev->sbd.core, "%s:%u\n", __func__, __LINE__); in ps3disk_do_request()
187 struct request_queue *q = hctx->queue; in ps3disk_queue_rq()
188 struct ps3_storage_device *dev = q->queuedata; in ps3disk_queue_rq()
189 struct ps3disk_private *priv = ps3_system_bus_get_drvdata(&dev->sbd); in ps3disk_queue_rq()
192 blk_mq_start_request(bd->rq); in ps3disk_queue_rq()
194 spin_lock_irq(&priv->lock); in ps3disk_queue_rq()
195 ret = ps3disk_do_request(dev, bd->rq); in ps3disk_queue_rq()
196 spin_unlock_irq(&priv->lock); in ps3disk_queue_rq()
207 blk_status_t error; in ps3disk_interrupt() local
211 res = lv1_storage_get_async_status(dev->sbd.dev_id, &tag, &status); in ps3disk_interrupt()
213 if (tag != dev->tag) in ps3disk_interrupt()
214 dev_err(&dev->sbd.core, in ps3disk_interrupt()
216 __func__, __LINE__, tag, dev->tag); in ps3disk_interrupt()
219 dev_err(&dev->sbd.core, "%s:%u: res=%d status=0x%llx\n", in ps3disk_interrupt()
224 priv = ps3_system_bus_get_drvdata(&dev->sbd); in ps3disk_interrupt()
225 req = priv->req; in ps3disk_interrupt()
227 dev_dbg(&dev->sbd.core, in ps3disk_interrupt()
228 "%s:%u non-block layer request completed\n", __func__, in ps3disk_interrupt()
230 dev->lv1_status = status; in ps3disk_interrupt()
231 complete(&dev->done); in ps3disk_interrupt()
243 dev_dbg(&dev->sbd.core, "%s:%u: %s failed 0x%llx\n", __func__, in ps3disk_interrupt()
245 error = BLK_STS_IOERR; in ps3disk_interrupt()
247 dev_dbg(&dev->sbd.core, "%s:%u: %s completed\n", __func__, in ps3disk_interrupt()
249 error = 0; in ps3disk_interrupt()
254 spin_lock(&priv->lock); in ps3disk_interrupt()
255 priv->req = NULL; in ps3disk_interrupt()
256 blk_mq_end_request(req, error); in ps3disk_interrupt()
257 spin_unlock(&priv->lock); in ps3disk_interrupt()
259 blk_mq_run_hw_queues(priv->gendisk->queue, true); in ps3disk_interrupt()
267 dev_dbg(&dev->sbd.core, "%s:%u: sync cache\n", __func__, __LINE__); in ps3disk_sync_cache()
271 dev_err(&dev->sbd.core, "%s:%u: sync cache failed 0x%llx\n", in ps3disk_sync_cache()
273 return -EIO; in ps3disk_sync_cache()
279 /* ATA helpers copied from drivers/ata/libata-core.c */
291 static u64 ata_id_n_sectors(const u16 *id) in ata_id_n_sectors() argument
293 if (ata_id_has_lba(id)) { in ata_id_n_sectors()
294 if (ata_id_has_lba48(id)) in ata_id_n_sectors()
295 return ata_id_u64(id, 100); in ata_id_n_sectors()
297 return ata_id_u32(id, 60); in ata_id_n_sectors()
299 if (ata_id_current_chs_valid(id)) in ata_id_n_sectors()
300 return ata_id_u32(id, 57); in ata_id_n_sectors()
302 return id[1] * id[3] * id[6]; in ata_id_n_sectors()
306 static void ata_id_string(const u16 *id, unsigned char *s, unsigned int ofs, in ata_id_string() argument
312 c = id[ofs] >> 8; in ata_id_string()
316 c = id[ofs] & 0xff; in ata_id_string()
321 len -= 2; in ata_id_string()
325 static void ata_id_c_string(const u16 *id, unsigned char *s, unsigned int ofs, in ata_id_c_string() argument
332 ata_id_string(id, s, ofs, len - 1); in ata_id_c_string()
334 p = s + strnlen(s, len - 1); in ata_id_c_string()
335 while (p > s && p[-1] == ' ') in ata_id_c_string()
336 p--; in ata_id_c_string()
342 struct ps3disk_private *priv = ps3_system_bus_get_drvdata(&dev->sbd); in ps3disk_identify()
344 u16 *id = dev->bounce_buf; in ps3disk_identify() local
347 dev_dbg(&dev->sbd.core, "%s:%u: identify disk\n", __func__, __LINE__); in ps3disk_identify()
353 ata_cmnd.buffer = dev->bounce_lpar; in ps3disk_identify()
362 dev_err(&dev->sbd.core, "%s:%u: identify disk failed 0x%llx\n", in ps3disk_identify()
364 return -EIO; in ps3disk_identify()
367 swap_buf_le16(id, ATA_ID_WORDS); in ps3disk_identify()
370 priv->raw_capacity = ata_id_n_sectors(id); in ps3disk_identify()
371 ata_id_c_string(id, priv->model, ATA_ID_PROD, sizeof(priv->model)); in ps3disk_identify()
385 struct ps3_storage_device *dev = to_ps3_storage_device(&_dev->core); in ps3disk_probe()
387 int error; in ps3disk_probe() local
390 .logical_block_size = dev->blk_size, in ps3disk_probe()
392 .max_segments = -1, in ps3disk_probe()
394 .dma_alignment = dev->blk_size - 1, in ps3disk_probe()
400 if (dev->blk_size < 512) { in ps3disk_probe()
401 dev_err(&dev->sbd.core, in ps3disk_probe()
403 __LINE__, dev->blk_size); in ps3disk_probe()
404 return -EINVAL; in ps3disk_probe()
411 dev_err(&dev->sbd.core, "%s:%u: Too many disks\n", __func__, in ps3disk_probe()
414 return -ENOSPC; in ps3disk_probe()
421 error = -ENOMEM; in ps3disk_probe()
426 spin_lock_init(&priv->lock); in ps3disk_probe()
428 dev->bounce_size = BOUNCE_SIZE; in ps3disk_probe()
429 dev->bounce_buf = kmalloc(BOUNCE_SIZE, GFP_DMA); in ps3disk_probe()
430 if (!dev->bounce_buf) { in ps3disk_probe()
431 error = -ENOMEM; in ps3disk_probe()
435 error = ps3stor_setup(dev, ps3disk_interrupt); in ps3disk_probe()
436 if (error) in ps3disk_probe()
441 error = blk_mq_alloc_sq_tag_set(&priv->tag_set, &ps3disk_mq_ops, 1, 0); in ps3disk_probe()
442 if (error) in ps3disk_probe()
445 gendisk = blk_mq_alloc_disk(&priv->tag_set, &lim, dev); in ps3disk_probe()
447 dev_err(&dev->sbd.core, "%s:%u: blk_mq_alloc_disk failed\n", in ps3disk_probe()
449 error = PTR_ERR(gendisk); in ps3disk_probe()
453 priv->gendisk = gendisk; in ps3disk_probe()
454 gendisk->major = ps3disk_major; in ps3disk_probe()
455 gendisk->first_minor = devidx * PS3DISK_MINORS; in ps3disk_probe()
456 gendisk->minors = PS3DISK_MINORS; in ps3disk_probe()
457 gendisk->fops = &ps3disk_fops; in ps3disk_probe()
458 gendisk->private_data = dev; in ps3disk_probe()
459 snprintf(gendisk->disk_name, sizeof(gendisk->disk_name), PS3DISK_NAME, in ps3disk_probe()
461 priv->blocking_factor = dev->blk_size >> 9; in ps3disk_probe()
463 dev->regions[dev->region_idx].size*priv->blocking_factor); in ps3disk_probe()
465 dev_info(&dev->sbd.core, in ps3disk_probe()
467 gendisk->disk_name, priv->model, priv->raw_capacity >> 11, in ps3disk_probe()
470 error = device_add_disk(&dev->sbd.core, gendisk, NULL); in ps3disk_probe()
471 if (error) in ps3disk_probe()
478 blk_mq_free_tag_set(&priv->tag_set); in ps3disk_probe()
482 kfree(dev->bounce_buf); in ps3disk_probe()
490 return error; in ps3disk_probe()
495 struct ps3_storage_device *dev = to_ps3_storage_device(&_dev->core); in ps3disk_remove()
496 struct ps3disk_private *priv = ps3_system_bus_get_drvdata(&dev->sbd); in ps3disk_remove()
499 __clear_bit(MINOR(disk_devt(priv->gendisk)) / PS3DISK_MINORS, in ps3disk_remove()
502 del_gendisk(priv->gendisk); in ps3disk_remove()
503 put_disk(priv->gendisk); in ps3disk_remove()
504 blk_mq_free_tag_set(&priv->tag_set); in ps3disk_remove()
505 dev_notice(&dev->sbd.core, "Synchronizing disk cache\n"); in ps3disk_remove()
508 kfree(dev->bounce_buf); in ps3disk_remove()
525 int error; in ps3disk_init() local
528 return -ENODEV; in ps3disk_init()
530 error = register_blkdev(0, DEVICE_NAME); in ps3disk_init()
531 if (error <= 0) { in ps3disk_init()
533 __LINE__, error); in ps3disk_init()
534 return error; in ps3disk_init()
536 ps3disk_major = error; in ps3disk_init()
541 error = ps3_system_bus_driver_register(&ps3disk); in ps3disk_init()
542 if (error) in ps3disk_init()
545 return error; in ps3disk_init()