aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorRaghava Aditya Renukunta <raghavaaditya.renukunta@pmcs.com>2016-02-03 18:06:07 -0500
committerMartin K. Petersen <martin.petersen@oracle.com>2016-02-23 21:27:02 -0500
commitb9fb54b425e14658959bbc753452aaaf4d11d6fa (patch)
tree0a51d794b4b7aefc9ed0378ae5c206fe004d23e2 /drivers/scsi
parentfbd185986ebafaeac900a1af1829fed2bf03242e (diff)
aacraid: Fix character device re-initialization
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.renukunta@pmcs.com> Reviewed-by: Shane Seymour <shane.seymour@hpe.com> Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/aacraid/aacraid.h7
-rw-r--r--drivers/scsi/aacraid/linit.c21
2 files changed, 21 insertions, 7 deletions
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
index 75bc65ecad37..9cdf4d2bdece 100644
--- a/drivers/scsi/aacraid/aacraid.h
+++ b/drivers/scsi/aacraid/aacraid.h
@@ -94,6 +94,13 @@ enum {
94#define aac_phys_to_logical(x) ((x)+1) 94#define aac_phys_to_logical(x) ((x)+1)
95#define aac_logical_to_phys(x) ((x)?(x)-1:0) 95#define aac_logical_to_phys(x) ((x)?(x)-1:0)
96 96
97/*
98 * These macros are for keeping track of
99 * character device state.
100 */
101#define AAC_CHARDEV_UNREGISTERED (-1)
102#define AAC_CHARDEV_NEEDS_REINIT (-2)
103
97/* #define AAC_DETAILED_STATUS_INFO */ 104/* #define AAC_DETAILED_STATUS_INFO */
98 105
99struct diskparm 106struct diskparm
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 334f2a602fca..21a67ed047e8 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -80,7 +80,7 @@ MODULE_VERSION(AAC_DRIVER_FULL_VERSION);
80 80
81static DEFINE_MUTEX(aac_mutex); 81static DEFINE_MUTEX(aac_mutex);
82static LIST_HEAD(aac_devices); 82static LIST_HEAD(aac_devices);
83static int aac_cfg_major = -1; 83static int aac_cfg_major = AAC_CHARDEV_UNREGISTERED;
84char aac_driver_version[] = AAC_DRIVER_FULL_VERSION; 84char aac_driver_version[] = AAC_DRIVER_FULL_VERSION;
85 85
86/* 86/*
@@ -1118,6 +1118,13 @@ static void __aac_shutdown(struct aac_dev * aac)
1118 else if (aac->max_msix > 1) 1118 else if (aac->max_msix > 1)
1119 pci_disable_msix(aac->pdev); 1119 pci_disable_msix(aac->pdev);
1120} 1120}
1121static void aac_init_char(void)
1122{
1123 aac_cfg_major = register_chrdev(0, "aac", &aac_cfg_fops);
1124 if (aac_cfg_major < 0) {
1125 pr_err("aacraid: unable to register \"aac\" device.\n");
1126 }
1127}
1121 1128
1122static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) 1129static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
1123{ 1130{
@@ -1175,6 +1182,9 @@ static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
1175 shost->max_cmd_len = 16; 1182 shost->max_cmd_len = 16;
1176 shost->use_cmd_list = 1; 1183 shost->use_cmd_list = 1;
1177 1184
1185 if (aac_cfg_major == AAC_CHARDEV_NEEDS_REINIT)
1186 aac_init_char();
1187
1178 aac = (struct aac_dev *)shost->hostdata; 1188 aac = (struct aac_dev *)shost->hostdata;
1179 aac->base_start = pci_resource_start(pdev, 0); 1189 aac->base_start = pci_resource_start(pdev, 0);
1180 aac->scsi_host_ptr = shost; 1190 aac->scsi_host_ptr = shost;
@@ -1514,7 +1524,7 @@ static void aac_remove_one(struct pci_dev *pdev)
1514 pci_disable_device(pdev); 1524 pci_disable_device(pdev);
1515 if (list_empty(&aac_devices)) { 1525 if (list_empty(&aac_devices)) {
1516 unregister_chrdev(aac_cfg_major, "aac"); 1526 unregister_chrdev(aac_cfg_major, "aac");
1517 aac_cfg_major = -1; 1527 aac_cfg_major = AAC_CHARDEV_NEEDS_REINIT;
1518 } 1528 }
1519} 1529}
1520 1530
@@ -1674,11 +1684,8 @@ static int __init aac_init(void)
1674 if (error < 0) 1684 if (error < 0)
1675 return error; 1685 return error;
1676 1686
1677 aac_cfg_major = register_chrdev( 0, "aac", &aac_cfg_fops); 1687 aac_init_char();
1678 if (aac_cfg_major < 0) { 1688
1679 printk(KERN_WARNING
1680 "aacraid: unable to register \"aac\" device.\n");
1681 }
1682 1689
1683 return 0; 1690 return 0;
1684} 1691}