diff options
author | David C Somayajulu <david.somayajulu@qlogic.com> | 2007-05-23 21:03:32 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2007-05-26 12:47:53 -0400 |
commit | bee4fe8e63ea1985f3955323dbc98b6d6bd5c6f8 (patch) | |
tree | 34c171cd7e994456953eca1ea27e08e4b1e0d469 /drivers | |
parent | c0e344c9b7971996e4fe409d7b8ba9ceb7b7583d (diff) |
[SCSI] qla4xxx: ql4_os.c bugfixes
Free memory resources after invoking free_irq() in
qla4xxx_free_adapter(). QLA4xxx has two pci functions per port
(Ethernet and iSCSI). When one of these PCI functions issues a HBA
reset, all other functions are notified and need to acknowledge and
re-initialize. During module qla4xxx_remove_adapter() gets
invoked. This function needs to wait if it is currently responding to
a reset from another function.
Signed-off-by: David Somayajulu <david.somayajulu@qlogic.com>
Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/qla4xxx/ql4_os.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c index da21f5fbbf87..0e4688c9e0a2 100644 --- a/drivers/scsi/qla4xxx/ql4_os.c +++ b/drivers/scsi/qla4xxx/ql4_os.c | |||
@@ -10,6 +10,10 @@ | |||
10 | #include <scsi/scsicam.h> | 10 | #include <scsi/scsicam.h> |
11 | 11 | ||
12 | #include "ql4_def.h" | 12 | #include "ql4_def.h" |
13 | #include "ql4_version.h" | ||
14 | #include "ql4_glbl.h" | ||
15 | #include "ql4_dbg.h" | ||
16 | #include "ql4_inline.h" | ||
13 | 17 | ||
14 | /* | 18 | /* |
15 | * Driver version | 19 | * Driver version |
@@ -711,7 +715,7 @@ static int qla4xxx_cmd_wait(struct scsi_qla_host *ha) | |||
711 | return stat; | 715 | return stat; |
712 | } | 716 | } |
713 | 717 | ||
714 | static void qla4xxx_hw_reset(struct scsi_qla_host *ha) | 718 | void qla4xxx_hw_reset(struct scsi_qla_host *ha) |
715 | { | 719 | { |
716 | uint32_t ctrl_status; | 720 | uint32_t ctrl_status; |
717 | unsigned long flags = 0; | 721 | unsigned long flags = 0; |
@@ -1081,13 +1085,13 @@ static void qla4xxx_free_adapter(struct scsi_qla_host *ha) | |||
1081 | if (ha->timer_active) | 1085 | if (ha->timer_active) |
1082 | qla4xxx_stop_timer(ha); | 1086 | qla4xxx_stop_timer(ha); |
1083 | 1087 | ||
1084 | /* free extra memory */ | ||
1085 | qla4xxx_mem_free(ha); | ||
1086 | |||
1087 | /* Detach interrupts */ | 1088 | /* Detach interrupts */ |
1088 | if (test_and_clear_bit(AF_IRQ_ATTACHED, &ha->flags)) | 1089 | if (test_and_clear_bit(AF_IRQ_ATTACHED, &ha->flags)) |
1089 | free_irq(ha->pdev->irq, ha); | 1090 | free_irq(ha->pdev->irq, ha); |
1090 | 1091 | ||
1092 | /* free extra memory */ | ||
1093 | qla4xxx_mem_free(ha); | ||
1094 | |||
1091 | pci_disable_device(ha->pdev); | 1095 | pci_disable_device(ha->pdev); |
1092 | 1096 | ||
1093 | } | 1097 | } |
@@ -1332,6 +1336,11 @@ static void __devexit qla4xxx_remove_adapter(struct pci_dev *pdev) | |||
1332 | 1336 | ||
1333 | ha = pci_get_drvdata(pdev); | 1337 | ha = pci_get_drvdata(pdev); |
1334 | 1338 | ||
1339 | qla4xxx_disable_intrs(ha); | ||
1340 | |||
1341 | while (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) | ||
1342 | ssleep(1); | ||
1343 | |||
1335 | /* remove devs from iscsi_sessions to scsi_devices */ | 1344 | /* remove devs from iscsi_sessions to scsi_devices */ |
1336 | qla4xxx_free_ddb_list(ha); | 1345 | qla4xxx_free_ddb_list(ha); |
1337 | 1346 | ||