diff options
author | Brian King <brking@linux.vnet.ibm.com> | 2009-06-18 10:06:52 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2009-06-21 12:09:56 -0400 |
commit | f1d7fb7a8ab55357b6c7d44a53f644a043680ed1 (patch) | |
tree | ecd98c95e8eed62479e9c04d9af5a336e951de1f /drivers/scsi/ibmvscsi/ibmvfc.c | |
parent | 7414705ea4aef9ce438e547f3138a680d2d1096c (diff) |
ibmvfc: Process async events before command responses
Since async events could indicate changes to link status, or
events which could affect decisions made during discovery, we should
process async events prior to command completion responses.
Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi/ibmvscsi/ibmvfc.c')
-rw-r--r-- | drivers/scsi/ibmvscsi/ibmvfc.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c index b4b805e8d7db..497a4cc4d9ef 100644 --- a/drivers/scsi/ibmvscsi/ibmvfc.c +++ b/drivers/scsi/ibmvscsi/ibmvfc.c | |||
@@ -2783,27 +2783,27 @@ static void ibmvfc_tasklet(void *data) | |||
2783 | 2783 | ||
2784 | spin_lock_irqsave(vhost->host->host_lock, flags); | 2784 | spin_lock_irqsave(vhost->host->host_lock, flags); |
2785 | while (!done) { | 2785 | while (!done) { |
2786 | /* Pull all the valid messages off the CRQ */ | ||
2787 | while ((crq = ibmvfc_next_crq(vhost)) != NULL) { | ||
2788 | ibmvfc_handle_crq(crq, vhost); | ||
2789 | crq->valid = 0; | ||
2790 | } | ||
2791 | |||
2792 | /* Pull all the valid messages off the async CRQ */ | 2786 | /* Pull all the valid messages off the async CRQ */ |
2793 | while ((async = ibmvfc_next_async_crq(vhost)) != NULL) { | 2787 | while ((async = ibmvfc_next_async_crq(vhost)) != NULL) { |
2794 | ibmvfc_handle_async(async, vhost); | 2788 | ibmvfc_handle_async(async, vhost); |
2795 | async->valid = 0; | 2789 | async->valid = 0; |
2796 | } | 2790 | } |
2797 | 2791 | ||
2798 | vio_enable_interrupts(vdev); | 2792 | /* Pull all the valid messages off the CRQ */ |
2799 | if ((crq = ibmvfc_next_crq(vhost)) != NULL) { | 2793 | while ((crq = ibmvfc_next_crq(vhost)) != NULL) { |
2800 | vio_disable_interrupts(vdev); | ||
2801 | ibmvfc_handle_crq(crq, vhost); | 2794 | ibmvfc_handle_crq(crq, vhost); |
2802 | crq->valid = 0; | 2795 | crq->valid = 0; |
2803 | } else if ((async = ibmvfc_next_async_crq(vhost)) != NULL) { | 2796 | } |
2797 | |||
2798 | vio_enable_interrupts(vdev); | ||
2799 | if ((async = ibmvfc_next_async_crq(vhost)) != NULL) { | ||
2804 | vio_disable_interrupts(vdev); | 2800 | vio_disable_interrupts(vdev); |
2805 | ibmvfc_handle_async(async, vhost); | 2801 | ibmvfc_handle_async(async, vhost); |
2806 | async->valid = 0; | 2802 | async->valid = 0; |
2803 | } else if ((crq = ibmvfc_next_crq(vhost)) != NULL) { | ||
2804 | vio_disable_interrupts(vdev); | ||
2805 | ibmvfc_handle_crq(crq, vhost); | ||
2806 | crq->valid = 0; | ||
2807 | } else | 2807 | } else |
2808 | done = 1; | 2808 | done = 1; |
2809 | } | 2809 | } |