diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-05-13 14:24:51 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-05-13 14:24:51 -0400 |
commit | 9604006d283fb67dda5ee9e0e15b7cc6c62e1557 (patch) | |
tree | 8e9ddc101dc9e167f1b21c3a7f7a4ffdd4dea04a /drivers | |
parent | 25c55d97209090db1a5f601815433f085bd1af78 (diff) | |
parent | af5741c6de4f4a1d8608b0f00867c77cb7123635 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6:
[SCSI] qla1280: Fix queue depth problem
[SCSI] aha152x: Fix oops on module removal
[SCSI] aha152x: fix init suspiciously returned 1, it should follow 0/-E convention
[SCSI] libiscsi regression in 2.6.25: fix setting of recv timer
[SCSI] libiscsi regression in 2.6.25: fix nop timer handling
[SCSI] gdth: fix Error: Driver 'gdth' is already registered, aborting...
[SCSI] gdth: fix timer handling
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/aha152x.c | 8 | ||||
-rw-r--r-- | drivers/scsi/gdth.c | 51 | ||||
-rw-r--r-- | drivers/scsi/libiscsi.c | 29 | ||||
-rw-r--r-- | drivers/scsi/qla1280.c | 4 |
4 files changed, 55 insertions, 37 deletions
diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c index f5215fd4b73d..1dca1775f4b1 100644 --- a/drivers/scsi/aha152x.c +++ b/drivers/scsi/aha152x.c | |||
@@ -3830,7 +3830,7 @@ static int __init aha152x_init(void) | |||
3830 | iounmap(p); | 3830 | iounmap(p); |
3831 | } | 3831 | } |
3832 | if (!ok && setup_count == 0) | 3832 | if (!ok && setup_count == 0) |
3833 | return 0; | 3833 | return -ENODEV; |
3834 | 3834 | ||
3835 | printk(KERN_INFO "aha152x: BIOS test: passed, "); | 3835 | printk(KERN_INFO "aha152x: BIOS test: passed, "); |
3836 | #else | 3836 | #else |
@@ -3909,14 +3909,14 @@ static int __init aha152x_init(void) | |||
3909 | #endif | 3909 | #endif |
3910 | } | 3910 | } |
3911 | 3911 | ||
3912 | return 1; | 3912 | return 0; |
3913 | } | 3913 | } |
3914 | 3914 | ||
3915 | static void __exit aha152x_exit(void) | 3915 | static void __exit aha152x_exit(void) |
3916 | { | 3916 | { |
3917 | struct aha152x_hostdata *hd; | 3917 | struct aha152x_hostdata *hd, *tmp; |
3918 | 3918 | ||
3919 | list_for_each_entry(hd, &aha152x_host_list, host_list) { | 3919 | list_for_each_entry_safe(hd, tmp, &aha152x_host_list, host_list) { |
3920 | struct Scsi_Host *shost = container_of((void *)hd, struct Scsi_Host, hostdata); | 3920 | struct Scsi_Host *shost = container_of((void *)hd, struct Scsi_Host, hostdata); |
3921 | 3921 | ||
3922 | aha152x_release(shost); | 3922 | aha152x_release(shost); |
diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index 8e2e964af668..46771d4c81bd 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c | |||
@@ -550,7 +550,6 @@ static int __init gdth_search_isa(ulong32 bios_adr) | |||
550 | #endif /* CONFIG_ISA */ | 550 | #endif /* CONFIG_ISA */ |
551 | 551 | ||
552 | #ifdef CONFIG_PCI | 552 | #ifdef CONFIG_PCI |
553 | static bool gdth_pci_registered; | ||
554 | 553 | ||
555 | static bool gdth_search_vortex(ushort device) | 554 | static bool gdth_search_vortex(ushort device) |
556 | { | 555 | { |
@@ -3724,6 +3723,8 @@ static void gdth_log_event(gdth_evt_data *dvr, char *buffer) | |||
3724 | } | 3723 | } |
3725 | 3724 | ||
3726 | #ifdef GDTH_STATISTICS | 3725 | #ifdef GDTH_STATISTICS |
3726 | static unchar gdth_timer_running; | ||
3727 | |||
3727 | static void gdth_timeout(ulong data) | 3728 | static void gdth_timeout(ulong data) |
3728 | { | 3729 | { |
3729 | ulong32 i; | 3730 | ulong32 i; |
@@ -3731,7 +3732,10 @@ static void gdth_timeout(ulong data) | |||
3731 | gdth_ha_str *ha; | 3732 | gdth_ha_str *ha; |
3732 | ulong flags; | 3733 | ulong flags; |
3733 | 3734 | ||
3734 | BUG_ON(list_empty(&gdth_instances)); | 3735 | if(unlikely(list_empty(&gdth_instances))) { |
3736 | gdth_timer_running = 0; | ||
3737 | return; | ||
3738 | } | ||
3735 | 3739 | ||
3736 | ha = list_first_entry(&gdth_instances, gdth_ha_str, list); | 3740 | ha = list_first_entry(&gdth_instances, gdth_ha_str, list); |
3737 | spin_lock_irqsave(&ha->smp_lock, flags); | 3741 | spin_lock_irqsave(&ha->smp_lock, flags); |
@@ -3751,6 +3755,22 @@ static void gdth_timeout(ulong data) | |||
3751 | add_timer(&gdth_timer); | 3755 | add_timer(&gdth_timer); |
3752 | spin_unlock_irqrestore(&ha->smp_lock, flags); | 3756 | spin_unlock_irqrestore(&ha->smp_lock, flags); |
3753 | } | 3757 | } |
3758 | |||
3759 | static void gdth_timer_init(void) | ||
3760 | { | ||
3761 | if (gdth_timer_running) | ||
3762 | return; | ||
3763 | gdth_timer_running = 1; | ||
3764 | TRACE2(("gdth_detect(): Initializing timer !\n")); | ||
3765 | gdth_timer.expires = jiffies + HZ; | ||
3766 | gdth_timer.data = 0L; | ||
3767 | gdth_timer.function = gdth_timeout; | ||
3768 | add_timer(&gdth_timer); | ||
3769 | } | ||
3770 | #else | ||
3771 | static inline void gdth_timer_init(void) | ||
3772 | { | ||
3773 | } | ||
3754 | #endif | 3774 | #endif |
3755 | 3775 | ||
3756 | static void __init internal_setup(char *str,int *ints) | 3776 | static void __init internal_setup(char *str,int *ints) |
@@ -4735,6 +4755,7 @@ static int __init gdth_isa_probe_one(ulong32 isa_bios) | |||
4735 | if (error) | 4755 | if (error) |
4736 | goto out_free_coal_stat; | 4756 | goto out_free_coal_stat; |
4737 | list_add_tail(&ha->list, &gdth_instances); | 4757 | list_add_tail(&ha->list, &gdth_instances); |
4758 | gdth_timer_init(); | ||
4738 | 4759 | ||
4739 | scsi_scan_host(shp); | 4760 | scsi_scan_host(shp); |
4740 | 4761 | ||
@@ -4865,6 +4886,7 @@ static int __init gdth_eisa_probe_one(ushort eisa_slot) | |||
4865 | if (error) | 4886 | if (error) |
4866 | goto out_free_coal_stat; | 4887 | goto out_free_coal_stat; |
4867 | list_add_tail(&ha->list, &gdth_instances); | 4888 | list_add_tail(&ha->list, &gdth_instances); |
4889 | gdth_timer_init(); | ||
4868 | 4890 | ||
4869 | scsi_scan_host(shp); | 4891 | scsi_scan_host(shp); |
4870 | 4892 | ||
@@ -5011,6 +5033,7 @@ static int gdth_pci_probe_one(gdth_pci_str *pcistr, | |||
5011 | list_add_tail(&ha->list, &gdth_instances); | 5033 | list_add_tail(&ha->list, &gdth_instances); |
5012 | 5034 | ||
5013 | pci_set_drvdata(ha->pdev, ha); | 5035 | pci_set_drvdata(ha->pdev, ha); |
5036 | gdth_timer_init(); | ||
5014 | 5037 | ||
5015 | scsi_scan_host(shp); | 5038 | scsi_scan_host(shp); |
5016 | 5039 | ||
@@ -5110,6 +5133,7 @@ static int __init gdth_init(void) | |||
5110 | /* initializations */ | 5133 | /* initializations */ |
5111 | gdth_polling = TRUE; | 5134 | gdth_polling = TRUE; |
5112 | gdth_clear_events(); | 5135 | gdth_clear_events(); |
5136 | init_timer(&gdth_timer); | ||
5113 | 5137 | ||
5114 | /* As default we do not probe for EISA or ISA controllers */ | 5138 | /* As default we do not probe for EISA or ISA controllers */ |
5115 | if (probe_eisa_isa) { | 5139 | if (probe_eisa_isa) { |
@@ -5132,23 +5156,17 @@ static int __init gdth_init(void) | |||
5132 | 5156 | ||
5133 | #ifdef CONFIG_PCI | 5157 | #ifdef CONFIG_PCI |
5134 | /* scanning for PCI controllers */ | 5158 | /* scanning for PCI controllers */ |
5135 | if (pci_register_driver(&gdth_pci_driver) == 0) | 5159 | if (pci_register_driver(&gdth_pci_driver)) { |
5136 | gdth_pci_registered = true; | 5160 | gdth_ha_str *ha; |
5161 | |||
5162 | list_for_each_entry(ha, &gdth_instances, list) | ||
5163 | gdth_remove_one(ha); | ||
5164 | return -ENODEV; | ||
5165 | } | ||
5137 | #endif /* CONFIG_PCI */ | 5166 | #endif /* CONFIG_PCI */ |
5138 | 5167 | ||
5139 | TRACE2(("gdth_detect() %d controller detected\n", gdth_ctr_count)); | 5168 | TRACE2(("gdth_detect() %d controller detected\n", gdth_ctr_count)); |
5140 | 5169 | ||
5141 | if (list_empty(&gdth_instances)) | ||
5142 | return -ENODEV; | ||
5143 | |||
5144 | #ifdef GDTH_STATISTICS | ||
5145 | TRACE2(("gdth_detect(): Initializing timer !\n")); | ||
5146 | init_timer(&gdth_timer); | ||
5147 | gdth_timer.expires = jiffies + HZ; | ||
5148 | gdth_timer.data = 0L; | ||
5149 | gdth_timer.function = gdth_timeout; | ||
5150 | add_timer(&gdth_timer); | ||
5151 | #endif | ||
5152 | major = register_chrdev(0,"gdth", &gdth_fops); | 5170 | major = register_chrdev(0,"gdth", &gdth_fops); |
5153 | register_reboot_notifier(&gdth_notifier); | 5171 | register_reboot_notifier(&gdth_notifier); |
5154 | gdth_polling = FALSE; | 5172 | gdth_polling = FALSE; |
@@ -5167,8 +5185,7 @@ static void __exit gdth_exit(void) | |||
5167 | #endif | 5185 | #endif |
5168 | 5186 | ||
5169 | #ifdef CONFIG_PCI | 5187 | #ifdef CONFIG_PCI |
5170 | if (gdth_pci_registered) | 5188 | pci_unregister_driver(&gdth_pci_driver); |
5171 | pci_unregister_driver(&gdth_pci_driver); | ||
5172 | #endif | 5189 | #endif |
5173 | 5190 | ||
5174 | list_for_each_entry(ha, &gdth_instances, list) | 5191 | list_for_each_entry(ha, &gdth_instances, list) |
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index 010c1b9b178c..b43bf1d60dac 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c | |||
@@ -730,7 +730,9 @@ static int __iscsi_complete_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr, | |||
730 | if (iscsi_recv_pdu(conn->cls_conn, hdr, data, | 730 | if (iscsi_recv_pdu(conn->cls_conn, hdr, data, |
731 | datalen)) | 731 | datalen)) |
732 | rc = ISCSI_ERR_CONN_FAILED; | 732 | rc = ISCSI_ERR_CONN_FAILED; |
733 | } | 733 | } else |
734 | mod_timer(&conn->transport_timer, | ||
735 | jiffies + conn->recv_timeout); | ||
734 | iscsi_free_mgmt_task(conn, mtask); | 736 | iscsi_free_mgmt_task(conn, mtask); |
735 | break; | 737 | break; |
736 | default: | 738 | default: |
@@ -1453,19 +1455,20 @@ static void iscsi_check_transport_timeouts(unsigned long data) | |||
1453 | { | 1455 | { |
1454 | struct iscsi_conn *conn = (struct iscsi_conn *)data; | 1456 | struct iscsi_conn *conn = (struct iscsi_conn *)data; |
1455 | struct iscsi_session *session = conn->session; | 1457 | struct iscsi_session *session = conn->session; |
1456 | unsigned long timeout, next_timeout = 0, last_recv; | 1458 | unsigned long recv_timeout, next_timeout = 0, last_recv; |
1457 | 1459 | ||
1458 | spin_lock(&session->lock); | 1460 | spin_lock(&session->lock); |
1459 | if (session->state != ISCSI_STATE_LOGGED_IN) | 1461 | if (session->state != ISCSI_STATE_LOGGED_IN) |
1460 | goto done; | 1462 | goto done; |
1461 | 1463 | ||
1462 | timeout = conn->recv_timeout; | 1464 | recv_timeout = conn->recv_timeout; |
1463 | if (!timeout) | 1465 | if (!recv_timeout) |
1464 | goto done; | 1466 | goto done; |
1465 | 1467 | ||
1466 | timeout *= HZ; | 1468 | recv_timeout *= HZ; |
1467 | last_recv = conn->last_recv; | 1469 | last_recv = conn->last_recv; |
1468 | if (time_before_eq(last_recv + timeout + (conn->ping_timeout * HZ), | 1470 | if (conn->ping_mtask && |
1471 | time_before_eq(conn->last_ping + (conn->ping_timeout * HZ), | ||
1469 | jiffies)) { | 1472 | jiffies)) { |
1470 | iscsi_conn_printk(KERN_ERR, conn, "ping timeout of %d secs " | 1473 | iscsi_conn_printk(KERN_ERR, conn, "ping timeout of %d secs " |
1471 | "expired, last rx %lu, last ping %lu, " | 1474 | "expired, last rx %lu, last ping %lu, " |
@@ -1476,15 +1479,13 @@ static void iscsi_check_transport_timeouts(unsigned long data) | |||
1476 | return; | 1479 | return; |
1477 | } | 1480 | } |
1478 | 1481 | ||
1479 | if (time_before_eq(last_recv + timeout, jiffies)) { | 1482 | if (time_before_eq(last_recv + recv_timeout, jiffies)) { |
1480 | if (time_before_eq(conn->last_ping, last_recv)) { | 1483 | /* send a ping to try to provoke some traffic */ |
1481 | /* send a ping to try to provoke some traffic */ | 1484 | debug_scsi("Sending nopout as ping on conn %p\n", conn); |
1482 | debug_scsi("Sending nopout as ping on conn %p\n", conn); | 1485 | iscsi_send_nopout(conn, NULL); |
1483 | iscsi_send_nopout(conn, NULL); | 1486 | next_timeout = conn->last_ping + (conn->ping_timeout * HZ); |
1484 | } | ||
1485 | next_timeout = last_recv + timeout + (conn->ping_timeout * HZ); | ||
1486 | } else | 1487 | } else |
1487 | next_timeout = last_recv + timeout; | 1488 | next_timeout = last_recv + recv_timeout; |
1488 | 1489 | ||
1489 | debug_scsi("Setting next tmo %lu\n", next_timeout); | 1490 | debug_scsi("Setting next tmo %lu\n", next_timeout); |
1490 | mod_timer(&conn->transport_timer, next_timeout); | 1491 | mod_timer(&conn->transport_timer, next_timeout); |
diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c index fa060932d2b4..51e2f299dbbb 100644 --- a/drivers/scsi/qla1280.c +++ b/drivers/scsi/qla1280.c | |||
@@ -2007,7 +2007,7 @@ qla1280_set_defaults(struct scsi_qla_host *ha) | |||
2007 | nv->bus[bus].config_2.req_ack_active_negation = 1; | 2007 | nv->bus[bus].config_2.req_ack_active_negation = 1; |
2008 | nv->bus[bus].config_2.data_line_active_negation = 1; | 2008 | nv->bus[bus].config_2.data_line_active_negation = 1; |
2009 | nv->bus[bus].selection_timeout = 250; | 2009 | nv->bus[bus].selection_timeout = 250; |
2010 | nv->bus[bus].max_queue_depth = 256; | 2010 | nv->bus[bus].max_queue_depth = 32; |
2011 | 2011 | ||
2012 | if (IS_ISP1040(ha)) { | 2012 | if (IS_ISP1040(ha)) { |
2013 | nv->bus[bus].bus_reset_delay = 3; | 2013 | nv->bus[bus].bus_reset_delay = 3; |
@@ -2051,7 +2051,7 @@ qla1280_config_target(struct scsi_qla_host *ha, int bus, int target) | |||
2051 | status = qla1280_mailbox_command(ha, 0x0f, mb); | 2051 | status = qla1280_mailbox_command(ha, 0x0f, mb); |
2052 | 2052 | ||
2053 | /* Save Tag queuing enable flag. */ | 2053 | /* Save Tag queuing enable flag. */ |
2054 | flag = (BIT_0 << target) & mb[0]; | 2054 | flag = (BIT_0 << target); |
2055 | if (nv->bus[bus].target[target].parameter.tag_queuing) | 2055 | if (nv->bus[bus].target[target].parameter.tag_queuing) |
2056 | ha->bus_settings[bus].qtag_enables |= flag; | 2056 | ha->bus_settings[bus].qtag_enables |= flag; |
2057 | 2057 | ||