···455455static int read_rom(struct fw_device *device,456456 int generation, int index, u32 *data)457457{458458- int rcode;458458+ u64 offset = (CSR_REGISTER_BASE | CSR_CONFIG_ROM) + index * 4;459459+ int i, rcode;459460460461 /* device->node_id, accessed below, must not be older than generation */461462 smp_rmb();462463463463- rcode = fw_run_transaction(device->card, TCODE_READ_QUADLET_REQUEST,464464- device->node_id, generation, device->max_speed,465465- (CSR_REGISTER_BASE | CSR_CONFIG_ROM) + index * 4,466466- data, 4);464464+ for (i = 10; i < 100; i += 10) {465465+ rcode = fw_run_transaction(device->card,466466+ TCODE_READ_QUADLET_REQUEST, device->node_id,467467+ generation, device->max_speed, offset, data, 4);468468+ if (rcode != RCODE_BUSY)469469+ break;470470+ msleep(i);471471+ }467472 be32_to_cpus(data);468473469474 return rcode;