[POWERPC] axonram: Module modification for latest firmware API changes
authorMaxim Shchetynin <maxim@de.ibm.com>
Wed, 22 Aug 2007 17:01:27 +0000 (03:01 +1000)
committerPaul Mackerras <paulus@samba.org>
Sat, 25 Aug 2007 06:58:27 +0000 (16:58 +1000)
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>
arch/powerpc/sysdev/axonram.c

index 2326d5dc5752e9ce365dd762f1ff6f18ac3ab969..eabbf82fda3a016aaed24b9556dbfc0808a4fcac 100644 (file)
@@ -59,8 +59,7 @@
 struct axon_ram_bank {
        struct of_device        *device;
        struct gendisk          *disk;
-       unsigned int            irq_correctable;
-       unsigned int            irq_uncorrectable;
+       unsigned int            irq_id;
        unsigned long           ph_addr;
        unsigned long           io_addr;
        unsigned long           size;
@@ -93,16 +92,9 @@ axon_ram_irq_handler(int irq, void *dev)
 
        BUG_ON(!bank);
 
-       if (irq == bank->irq_correctable) {
-               dev_err(&device->dev, "Correctable memory error occured\n");
-               bank->ecc_counter++;
-               return IRQ_HANDLED;
-       } else if (irq == bank->irq_uncorrectable) {
-               dev_err(&device->dev, "Uncorrectable memory error occured\n");
-               panic("Critical ECC error on %s", device->node->full_name);
-       }
-
-       return IRQ_NONE;
+       dev_err(&device->dev, "Correctable memory error occured\n");
+       bank->ecc_counter++;
+       return IRQ_HANDLED;
 }
 
 /**
@@ -259,28 +251,18 @@ axon_ram_probe(struct of_device *device, const struct of_device_id *device_id)
        blk_queue_hardsect_size(bank->disk->queue, AXON_RAM_SECTOR_SIZE);
        add_disk(bank->disk);
 
-       bank->irq_correctable = irq_of_parse_and_map(device->node, 0);
-       bank->irq_uncorrectable = irq_of_parse_and_map(device->node, 1);
-       if ((bank->irq_correctable <= 0) || (bank->irq_uncorrectable <= 0)) {
+       bank->irq_id = irq_of_parse_and_map(device->node, 0);
+       if (bank->irq_id == NO_IRQ) {
                dev_err(&device->dev, "Cannot access ECC interrupt ID\n");
                rc = -EFAULT;
                goto failed;
        }
 
-       rc = request_irq(bank->irq_correctable, axon_ram_irq_handler,
-                       AXON_RAM_IRQ_FLAGS, bank->disk->disk_name, device);
-       if (rc != 0) {
-               dev_err(&device->dev, "Cannot register ECC interrupt handler\n");
-               bank->irq_correctable = bank->irq_uncorrectable = 0;
-               rc = -EFAULT;
-               goto failed;
-       }
-
-       rc = request_irq(bank->irq_uncorrectable, axon_ram_irq_handler,
+       rc = request_irq(bank->irq_id, axon_ram_irq_handler,
                        AXON_RAM_IRQ_FLAGS, bank->disk->disk_name, device);
        if (rc != 0) {
                dev_err(&device->dev, "Cannot register ECC interrupt handler\n");
-               bank->irq_uncorrectable = 0;
+               bank->irq_id = NO_IRQ;
                rc = -EFAULT;
                goto failed;
        }
@@ -296,10 +278,8 @@ axon_ram_probe(struct of_device *device, const struct of_device_id *device_id)
 
 failed:
        if (bank != NULL) {
-               if (bank->irq_uncorrectable > 0)
-                       free_irq(bank->irq_uncorrectable, device);
-               if (bank->irq_correctable > 0)
-                       free_irq(bank->irq_correctable, device);
+               if (bank->irq_id != NO_IRQ)
+                       free_irq(bank->irq_id, device);
                if (bank->disk != NULL) {
                        if (bank->disk->queue != NULL)
                                blk_cleanup_queue(bank->disk->queue);
@@ -329,8 +309,7 @@ axon_ram_remove(struct of_device *device)
        BUG_ON(!bank || !bank->disk);
 
        device_remove_file(&device->dev, &dev_attr_ecc);
-       free_irq(bank->irq_uncorrectable, device);
-       free_irq(bank->irq_correctable, device);
+       free_irq(bank->irq_id, device);
        blk_cleanup_queue(bank->disk->queue);
        unregister_blkdev(bank->disk->major, bank->disk->disk_name);
        del_gendisk(bank->disk);