From: Raghava Aditya Renukunta <raghavaaditya.renuku...@pmcs.com>

During EEH PCI hotplug activity kernel unloads and loads the driver,
causing character device to be unregistered(aac_remove_one).When the
driver is loaded back using aac_probe_one the character device needs
to be registered again for the AIF management tools to work.

Fixed by adding code to register character device in aac_probe_one if
it is unregistered in aac_remove_one.

Signed-off-by: Raghava Aditya Renukunta <raghavaaditya.renuku...@pmcs.com>
---
 drivers/scsi/aacraid/linit.c | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 9076a95..e8c3606 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -1123,6 +1123,13 @@ static void __aac_shutdown(struct aac_dev * aac)
        else if (aac->max_msix > 1)
                pci_disable_msix(aac->pdev);
 }
+static void aac_init_char(void)
+{
+       aac_cfg_major = register_chrdev(0, "aac", &aac_cfg_fops);
+       if (aac_cfg_major < 0) {
+               pr_err("aacraid: unable to register \"aac\" device.\n");
+       }
+}
 
 static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
@@ -1185,6 +1192,9 @@ static int aac_probe_one(struct pci_dev *pdev, const 
struct pci_device_id *id)
        shost->max_cmd_len = 16;
        shost->use_cmd_list = 1;
 
+       if (aac_cfg_major == -2)
+               aac_init_char();
+
        aac = (struct aac_dev *)shost->hostdata;
        aac->base_start = pci_resource_start(pdev, 0);
        aac->scsi_host_ptr = shost;
@@ -1534,7 +1544,7 @@ static void aac_remove_one(struct pci_dev *pdev)
        pci_disable_device(pdev);
        if (list_empty(&aac_devices)) {
                unregister_chrdev(aac_cfg_major, "aac");
-               aac_cfg_major = -1;
+               aac_cfg_major = -2;
        }
 }
 
@@ -1695,11 +1705,8 @@ static int __init aac_init(void)
        if (error < 0)
                return error;
 
-       aac_cfg_major = register_chrdev( 0, "aac", &aac_cfg_fops);
-       if (aac_cfg_major < 0) {
-               printk(KERN_WARNING
-                       "aacraid: unable to register \"aac\" device.\n");
-       }
+       aac_init_char();
+
 
        return 0;
 }
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to