[POWERPC] axonram: Module modification for latest firmware API changes

Firmware would not deliver two interrupt numbers in device-tree any more
but only one, for correctable ECC, because uncorrectable ECC from now
is handled by firmware itself.
Changes in the axonram module are necessary because in the old version, if
it is not allowed to fetch the second interrupt number from device-tree,
it interpretes this as an error case and exits.

Signed-off-by: Maximilian <maxim@de.ibm.com>
Signed-off-by: Arnd Bergmann <arnd.bergmann@de.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>

authored by Maxim Shchetynin and committed by Paul Mackerras fedcd2c5 3addf55c

+11 -32
+11 -32
arch/powerpc/sysdev/axonram.c
··· 59 59 struct axon_ram_bank { 60 60 struct of_device *device; 61 61 struct gendisk *disk; 62 - unsigned int irq_correctable; 63 - unsigned int irq_uncorrectable; 62 + unsigned int irq_id; 64 63 unsigned long ph_addr; 65 64 unsigned long io_addr; 66 65 unsigned long size; ··· 92 93 93 94 BUG_ON(!bank); 94 95 95 - if (irq == bank->irq_correctable) { 96 - dev_err(&device->dev, "Correctable memory error occured\n"); 97 - bank->ecc_counter++; 98 - return IRQ_HANDLED; 99 - } else if (irq == bank->irq_uncorrectable) { 100 - dev_err(&device->dev, "Uncorrectable memory error occured\n"); 101 - panic("Critical ECC error on %s", device->node->full_name); 102 - } 103 - 104 - return IRQ_NONE; 96 + dev_err(&device->dev, "Correctable memory error occured\n"); 97 + bank->ecc_counter++; 98 + return IRQ_HANDLED; 105 99 } 106 100 107 101 /** ··· 251 259 blk_queue_hardsect_size(bank->disk->queue, AXON_RAM_SECTOR_SIZE); 252 260 add_disk(bank->disk); 253 261 254 - bank->irq_correctable = irq_of_parse_and_map(device->node, 0); 255 - bank->irq_uncorrectable = irq_of_parse_and_map(device->node, 1); 256 - if ((bank->irq_correctable <= 0) || (bank->irq_uncorrectable <= 0)) { 262 + bank->irq_id = irq_of_parse_and_map(device->node, 0); 263 + if (bank->irq_id == NO_IRQ) { 257 264 dev_err(&device->dev, "Cannot access ECC interrupt ID\n"); 258 265 rc = -EFAULT; 259 266 goto failed; 260 267 } 261 268 262 - rc = request_irq(bank->irq_correctable, axon_ram_irq_handler, 269 + rc = request_irq(bank->irq_id, axon_ram_irq_handler, 263 270 AXON_RAM_IRQ_FLAGS, bank->disk->disk_name, device); 264 271 if (rc != 0) { 265 272 dev_err(&device->dev, "Cannot register ECC interrupt handler\n"); 266 - bank->irq_correctable = bank->irq_uncorrectable = 0; 267 - rc = -EFAULT; 268 - goto failed; 269 - } 270 - 271 - rc = request_irq(bank->irq_uncorrectable, axon_ram_irq_handler, 272 - AXON_RAM_IRQ_FLAGS, bank->disk->disk_name, device); 273 - if (rc != 0) { 274 - dev_err(&device->dev, "Cannot register ECC interrupt handler\n"); 275 - bank->irq_uncorrectable = 0; 273 + bank->irq_id = NO_IRQ; 276 274 rc = -EFAULT; 277 275 goto failed; 278 276 } ··· 278 296 279 297 failed: 280 298 if (bank != NULL) { 281 - if (bank->irq_uncorrectable > 0) 282 - free_irq(bank->irq_uncorrectable, device); 283 - if (bank->irq_correctable > 0) 284 - free_irq(bank->irq_correctable, device); 299 + if (bank->irq_id != NO_IRQ) 300 + free_irq(bank->irq_id, device); 285 301 if (bank->disk != NULL) { 286 302 if (bank->disk->queue != NULL) 287 303 blk_cleanup_queue(bank->disk->queue); ··· 309 329 BUG_ON(!bank || !bank->disk); 310 330 311 331 device_remove_file(&device->dev, &dev_attr_ecc); 312 - free_irq(bank->irq_uncorrectable, device); 313 - free_irq(bank->irq_correctable, device); 332 + free_irq(bank->irq_id, device); 314 333 blk_cleanup_queue(bank->disk->queue); 315 334 unregister_blkdev(bank->disk->major, bank->disk->disk_name); 316 335 del_gendisk(bank->disk);