|
@@ -59,8 +59,7 @@
|
|
struct axon_ram_bank {
|
|
struct axon_ram_bank {
|
|
struct of_device *device;
|
|
struct of_device *device;
|
|
struct gendisk *disk;
|
|
struct gendisk *disk;
|
|
- unsigned int irq_correctable;
|
|
|
|
- unsigned int irq_uncorrectable;
|
|
|
|
|
|
+ unsigned int irq_id;
|
|
unsigned long ph_addr;
|
|
unsigned long ph_addr;
|
|
unsigned long io_addr;
|
|
unsigned long io_addr;
|
|
unsigned long size;
|
|
unsigned long size;
|
|
@@ -93,16 +92,9 @@ axon_ram_irq_handler(int irq, void *dev)
|
|
|
|
|
|
BUG_ON(!bank);
|
|
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);
|
|
blk_queue_hardsect_size(bank->disk->queue, AXON_RAM_SECTOR_SIZE);
|
|
add_disk(bank->disk);
|
|
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");
|
|
dev_err(&device->dev, "Cannot access ECC interrupt ID\n");
|
|
rc = -EFAULT;
|
|
rc = -EFAULT;
|
|
goto failed;
|
|
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);
|
|
AXON_RAM_IRQ_FLAGS, bank->disk->disk_name, device);
|
|
if (rc != 0) {
|
|
if (rc != 0) {
|
|
dev_err(&device->dev, "Cannot register ECC interrupt handler\n");
|
|
dev_err(&device->dev, "Cannot register ECC interrupt handler\n");
|
|
- bank->irq_uncorrectable = 0;
|
|
|
|
|
|
+ bank->irq_id = NO_IRQ;
|
|
rc = -EFAULT;
|
|
rc = -EFAULT;
|
|
goto failed;
|
|
goto failed;
|
|
}
|
|
}
|
|
@@ -296,10 +278,8 @@ axon_ram_probe(struct of_device *device, const struct of_device_id *device_id)
|
|
|
|
|
|
failed:
|
|
failed:
|
|
if (bank != NULL) {
|
|
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 != NULL) {
|
|
if (bank->disk->queue != NULL)
|
|
if (bank->disk->queue != NULL)
|
|
blk_cleanup_queue(bank->disk->queue);
|
|
blk_cleanup_queue(bank->disk->queue);
|
|
@@ -329,8 +309,7 @@ axon_ram_remove(struct of_device *device)
|
|
BUG_ON(!bank || !bank->disk);
|
|
BUG_ON(!bank || !bank->disk);
|
|
|
|
|
|
device_remove_file(&device->dev, &dev_attr_ecc);
|
|
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);
|
|
blk_cleanup_queue(bank->disk->queue);
|
|
unregister_blkdev(bank->disk->major, bank->disk->disk_name);
|
|
unregister_blkdev(bank->disk->major, bank->disk->disk_name);
|
|
del_gendisk(bank->disk);
|
|
del_gendisk(bank->disk);
|