Skip to content

Commit

Permalink
[POWERPC] axonram: Module modification for latest firmware API changes
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Maxim Shchetynin authored and Paul Mackerras committed Aug 25, 2007
1 parent 3addf55 commit fedcd2c
Showing 1 changed file with 11 additions and 32 deletions.
43 changes: 11 additions & 32 deletions arch/powerpc/sysdev/axonram.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}

/**
Expand Down Expand Up @@ -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;
}
Expand All @@ -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);
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit fedcd2c

Please sign in to comment.