diff options
author | Raghava Aditya Renukunta <raghavaaditya.renukunta@pmcs.com> | 2016-02-03 18:06:07 -0500 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2016-02-23 21:27:02 -0500 |
commit | b9fb54b425e14658959bbc753452aaaf4d11d6fa (patch) | |
tree | 0a51d794b4b7aefc9ed0378ae5c206fe004d23e2 /drivers/scsi | |
parent | fbd185986ebafaeac900a1af1829fed2bf03242e (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.h | 7 | ||||
-rw-r--r-- | drivers/scsi/aacraid/linit.c | 21 |
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 | ||
99 | struct diskparm | 106 | struct 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 | ||
81 | static DEFINE_MUTEX(aac_mutex); | 81 | static DEFINE_MUTEX(aac_mutex); |
82 | static LIST_HEAD(aac_devices); | 82 | static LIST_HEAD(aac_devices); |
83 | static int aac_cfg_major = -1; | 83 | static int aac_cfg_major = AAC_CHARDEV_UNREGISTERED; |
84 | char aac_driver_version[] = AAC_DRIVER_FULL_VERSION; | 84 | char 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 | } |
1121 | static 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 | ||
1122 | static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | 1129 | static 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 | } |