diff options
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_os.c')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 3223fd16bcfe..48eaa3bb5433 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/vmalloc.h> | 10 | #include <linux/vmalloc.h> |
11 | #include <linux/delay.h> | 11 | #include <linux/delay.h> |
12 | #include <linux/kthread.h> | 12 | #include <linux/kthread.h> |
13 | #include <linux/mutex.h> | ||
13 | 14 | ||
14 | #include <scsi/scsi_tcq.h> | 15 | #include <scsi/scsi_tcq.h> |
15 | #include <scsi/scsicam.h> | 16 | #include <scsi/scsicam.h> |
@@ -1631,7 +1632,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1631 | /* load the F/W, read paramaters, and init the H/W */ | 1632 | /* load the F/W, read paramaters, and init the H/W */ |
1632 | ha->instance = num_hosts; | 1633 | ha->instance = num_hosts; |
1633 | 1634 | ||
1634 | init_MUTEX(&ha->vport_sem); | 1635 | mutex_init(&ha->vport_lock); |
1635 | init_completion(&ha->mbx_cmd_comp); | 1636 | init_completion(&ha->mbx_cmd_comp); |
1636 | complete(&ha->mbx_cmd_comp); | 1637 | complete(&ha->mbx_cmd_comp); |
1637 | init_completion(&ha->mbx_intr_comp); | 1638 | init_completion(&ha->mbx_intr_comp); |
@@ -2156,13 +2157,14 @@ static int | |||
2156 | qla2x00_post_work(struct scsi_qla_host *ha, struct qla_work_evt *e, int locked) | 2157 | qla2x00_post_work(struct scsi_qla_host *ha, struct qla_work_evt *e, int locked) |
2157 | { | 2158 | { |
2158 | unsigned long flags; | 2159 | unsigned long flags; |
2160 | scsi_qla_host_t *pha = to_qla_parent(ha); | ||
2159 | 2161 | ||
2160 | if (!locked) | 2162 | if (!locked) |
2161 | spin_lock_irqsave(&ha->hardware_lock, flags); | 2163 | spin_lock_irqsave(&pha->hardware_lock, flags); |
2162 | list_add_tail(&e->list, &ha->work_list); | 2164 | list_add_tail(&e->list, &ha->work_list); |
2163 | qla2xxx_wake_dpc(ha); | 2165 | qla2xxx_wake_dpc(ha); |
2164 | if (!locked) | 2166 | if (!locked) |
2165 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 2167 | spin_unlock_irqrestore(&pha->hardware_lock, flags); |
2166 | return QLA_SUCCESS; | 2168 | return QLA_SUCCESS; |
2167 | } | 2169 | } |
2168 | 2170 | ||
@@ -2202,12 +2204,13 @@ static void | |||
2202 | qla2x00_do_work(struct scsi_qla_host *ha) | 2204 | qla2x00_do_work(struct scsi_qla_host *ha) |
2203 | { | 2205 | { |
2204 | struct qla_work_evt *e; | 2206 | struct qla_work_evt *e; |
2207 | scsi_qla_host_t *pha = to_qla_parent(ha); | ||
2205 | 2208 | ||
2206 | spin_lock_irq(&ha->hardware_lock); | 2209 | spin_lock_irq(&pha->hardware_lock); |
2207 | while (!list_empty(&ha->work_list)) { | 2210 | while (!list_empty(&ha->work_list)) { |
2208 | e = list_entry(ha->work_list.next, struct qla_work_evt, list); | 2211 | e = list_entry(ha->work_list.next, struct qla_work_evt, list); |
2209 | list_del_init(&e->list); | 2212 | list_del_init(&e->list); |
2210 | spin_unlock_irq(&ha->hardware_lock); | 2213 | spin_unlock_irq(&pha->hardware_lock); |
2211 | 2214 | ||
2212 | switch (e->type) { | 2215 | switch (e->type) { |
2213 | case QLA_EVT_AEN: | 2216 | case QLA_EVT_AEN: |
@@ -2221,9 +2224,9 @@ qla2x00_do_work(struct scsi_qla_host *ha) | |||
2221 | } | 2224 | } |
2222 | if (e->flags & QLA_EVT_FLAG_FREE) | 2225 | if (e->flags & QLA_EVT_FLAG_FREE) |
2223 | kfree(e); | 2226 | kfree(e); |
2224 | spin_lock_irq(&ha->hardware_lock); | 2227 | spin_lock_irq(&pha->hardware_lock); |
2225 | } | 2228 | } |
2226 | spin_unlock_irq(&ha->hardware_lock); | 2229 | spin_unlock_irq(&pha->hardware_lock); |
2227 | } | 2230 | } |
2228 | 2231 | ||
2229 | /************************************************************************** | 2232 | /************************************************************************** |
@@ -2634,7 +2637,7 @@ qla2x00_timer(scsi_qla_host_t *ha) | |||
2634 | #define FW_FILE_ISP24XX "ql2400_fw.bin" | 2637 | #define FW_FILE_ISP24XX "ql2400_fw.bin" |
2635 | #define FW_FILE_ISP25XX "ql2500_fw.bin" | 2638 | #define FW_FILE_ISP25XX "ql2500_fw.bin" |
2636 | 2639 | ||
2637 | static DECLARE_MUTEX(qla_fw_lock); | 2640 | static DEFINE_MUTEX(qla_fw_lock); |
2638 | 2641 | ||
2639 | static struct fw_blob qla_fw_blobs[FW_BLOBS] = { | 2642 | static struct fw_blob qla_fw_blobs[FW_BLOBS] = { |
2640 | { .name = FW_FILE_ISP21XX, .segs = { 0x1000, 0 }, }, | 2643 | { .name = FW_FILE_ISP21XX, .segs = { 0x1000, 0 }, }, |
@@ -2665,7 +2668,7 @@ qla2x00_request_firmware(scsi_qla_host_t *ha) | |||
2665 | blob = &qla_fw_blobs[FW_ISP25XX]; | 2668 | blob = &qla_fw_blobs[FW_ISP25XX]; |
2666 | } | 2669 | } |
2667 | 2670 | ||
2668 | down(&qla_fw_lock); | 2671 | mutex_lock(&qla_fw_lock); |
2669 | if (blob->fw) | 2672 | if (blob->fw) |
2670 | goto out; | 2673 | goto out; |
2671 | 2674 | ||
@@ -2678,7 +2681,7 @@ qla2x00_request_firmware(scsi_qla_host_t *ha) | |||
2678 | } | 2681 | } |
2679 | 2682 | ||
2680 | out: | 2683 | out: |
2681 | up(&qla_fw_lock); | 2684 | mutex_unlock(&qla_fw_lock); |
2682 | return blob; | 2685 | return blob; |
2683 | } | 2686 | } |
2684 | 2687 | ||
@@ -2687,11 +2690,11 @@ qla2x00_release_firmware(void) | |||
2687 | { | 2690 | { |
2688 | int idx; | 2691 | int idx; |
2689 | 2692 | ||
2690 | down(&qla_fw_lock); | 2693 | mutex_lock(&qla_fw_lock); |
2691 | for (idx = 0; idx < FW_BLOBS; idx++) | 2694 | for (idx = 0; idx < FW_BLOBS; idx++) |
2692 | if (qla_fw_blobs[idx].fw) | 2695 | if (qla_fw_blobs[idx].fw) |
2693 | release_firmware(qla_fw_blobs[idx].fw); | 2696 | release_firmware(qla_fw_blobs[idx].fw); |
2694 | up(&qla_fw_lock); | 2697 | mutex_unlock(&qla_fw_lock); |
2695 | } | 2698 | } |
2696 | 2699 | ||
2697 | static pci_ers_result_t | 2700 | static pci_ers_result_t |
@@ -2864,7 +2867,8 @@ qla2x00_module_init(void) | |||
2864 | return -ENODEV; | 2867 | return -ENODEV; |
2865 | } | 2868 | } |
2866 | 2869 | ||
2867 | printk(KERN_INFO "QLogic Fibre Channel HBA Driver\n"); | 2870 | printk(KERN_INFO "QLogic Fibre Channel HBA Driver: %s\n", |
2871 | qla2x00_version_str); | ||
2868 | ret = pci_register_driver(&qla2xxx_pci_driver); | 2872 | ret = pci_register_driver(&qla2xxx_pci_driver); |
2869 | if (ret) { | 2873 | if (ret) { |
2870 | kmem_cache_destroy(srb_cachep); | 2874 | kmem_cache_destroy(srb_cachep); |