static int dump_stor_dev_info(struct ps3_repository_device *repo) { int result = 0; unsigned int num_regions, region_index; u64 port, blk_size, num_blocks; pr_devel(" -> %s:%d: (%u:%u)\n", __func__, __LINE__, repo->bus_index, repo->dev_index); result = ps3_repository_read_stor_dev_info(repo->bus_index, repo->dev_index, &port, &blk_size, &num_blocks, &num_regions); if (result) { pr_devel("%s:%d ps3_repository_read_stor_dev_info" " (%u:%u) failed\n", __func__, __LINE__, repo->bus_index, repo->dev_index); goto out; } pr_devel("%s:%d (%u:%u): port %llu, blk_size %llu, num_blocks " "%llu, num_regions %u\n", __func__, __LINE__, repo->bus_index, repo->dev_index, port, blk_size, num_blocks, num_regions); for (region_index = 0; region_index < num_regions; region_index++) { unsigned int region_id; u64 region_start, region_size; result = ps3_repository_read_stor_dev_region(repo->bus_index, repo->dev_index, region_index, ®ion_id, ®ion_start, ®ion_size); if (result) { pr_devel("%s:%d ps3_repository_read_stor_dev_region" " (%u:%u) failed\n", __func__, __LINE__, repo->bus_index, repo->dev_index); break; } pr_devel("%s:%d (%u:%u) region_id %u, start %lxh, size %lxh\n", __func__, __LINE__, repo->bus_index, repo->dev_index, region_id, (unsigned long)region_start, (unsigned long)region_size); } out: pr_devel(" <- %s:%d\n", __func__, __LINE__); return result; }
static int ps3_setup_storage_dev(const struct ps3_repository_device *repo, enum ps3_match_id match_id) { int result; struct ps3_storage_device *p; u64 port, blk_size, num_blocks; unsigned int num_regions, i; pr_debug(" -> %s:%u: match_id %u\n", __func__, __LINE__, match_id); result = ps3_repository_read_stor_dev_info(repo->bus_index, repo->dev_index, &port, &blk_size, &num_blocks, &num_regions); if (result) { printk(KERN_ERR "%s:%u: _read_stor_dev_info failed %d\n", __func__, __LINE__, result); return -ENODEV; } pr_debug("%s:%u: (%u:%u:%u): port %llu blk_size %llu num_blocks %llu " "num_regions %u\n", __func__, __LINE__, repo->bus_index, repo->dev_index, repo->dev_type, port, blk_size, num_blocks, num_regions); p = kzalloc(sizeof(struct ps3_storage_device) + num_regions * sizeof(struct ps3_storage_region), GFP_KERNEL); if (!p) { result = -ENOMEM; goto fail_malloc; } p->sbd.match_id = match_id; p->sbd.dev_type = PS3_DEVICE_TYPE_SB; p->sbd.bus_id = repo->bus_id; p->sbd.dev_id = repo->dev_id; p->sbd.d_region = &p->dma_region; p->blk_size = blk_size; p->num_regions = num_regions; result = ps3_repository_find_interrupt(repo, PS3_INTERRUPT_TYPE_EVENT_PORT, &p->sbd.interrupt_id); if (result) { printk(KERN_ERR "%s:%u: find_interrupt failed %d\n", __func__, __LINE__, result); result = -ENODEV; goto fail_find_interrupt; } for (i = 0; i < num_regions; i++) { unsigned int id; u64 start, size; result = ps3_repository_read_stor_dev_region(repo->bus_index, repo->dev_index, i, &id, &start, &size); if (result) { printk(KERN_ERR "%s:%u: read_stor_dev_region failed %d\n", __func__, __LINE__, result); result = -ENODEV; goto fail_read_region; } pr_debug("%s:%u: region %u: id %u start %llu size %llu\n", __func__, __LINE__, i, id, start, size); p->regions[i].id = id; p->regions[i].start = start; p->regions[i].size = size; } result = ps3_system_bus_device_register(&p->sbd); if (result) { pr_debug("%s:%u ps3_system_bus_device_register failed\n", __func__, __LINE__); goto fail_device_register; } pr_debug(" <- %s:%u\n", __func__, __LINE__); return 0; fail_device_register: fail_read_region: fail_find_interrupt: kfree(p); fail_malloc: pr_debug(" <- %s:%u: fail.\n", __func__, __LINE__); return result; }