static int __init ps3_start_probe_thread(enum ps3_bus_type bus_type) { int result; struct task_struct *task; struct ps3_repository_device repo; pr_debug(" -> %s:%d\n", __func__, __LINE__); memset(&repo, 0, sizeof(repo)); repo.bus_type = bus_type; result = ps3_repository_find_bus(repo.bus_type, 0, &repo.bus_index); if (result) { printk(KERN_ERR "%s: Cannot find bus (%d)\n", __func__, result); return -ENODEV; } result = ps3_repository_read_bus_id(repo.bus_index, &repo.bus_id); if (result) { printk(KERN_ERR "%s: read_bus_id failed %d\n", __func__, result); return -ENODEV; } task = kthread_run(ps3_probe_thread, (void *)repo.bus_id, "ps3-probe-%u", bus_type); if (IS_ERR(task)) { result = PTR_ERR(task); printk(KERN_ERR "%s: kthread_run failed %d\n", __func__, result); return result; } probe_task = task; register_reboot_notifier(&nb); pr_debug(" <- %s:%d\n", __func__, __LINE__); return 0; }
int __devinit ps3_repository_find_devices(enum ps3_bus_type bus_type, int (*callback)(const struct ps3_repository_device *repo)) { int result = 0; struct ps3_repository_device repo; pr_devel(" -> %s:%d: find bus_type %u\n", __func__, __LINE__, bus_type); repo.bus_type = bus_type; result = ps3_repository_find_bus(repo.bus_type, 0, &repo.bus_index); if (result) { pr_devel(" <- %s:%u: bus not found\n", __func__, __LINE__); return result; } result = ps3_repository_read_bus_id(repo.bus_index, &repo.bus_id); if (result) { pr_devel("%s:%d read_bus_id(%u) failed\n", __func__, __LINE__, repo.bus_index); return result; } for (repo.dev_index = 0; ; repo.dev_index++) { result = ps3_repository_find_device(&repo); if (result == -ENODEV) { result = 0; break; } else if (result) break; result = callback(&repo); if (result) { pr_devel("%s:%d: abort at callback\n", __func__, __LINE__); break; } } pr_devel(" <- %s:%d\n", __func__, __LINE__); return result; }