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