aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorBrian King <brking@linux.vnet.ibm.com>2009-06-18 10:06:52 -0400
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2009-06-21 12:09:56 -0400
commitf1d7fb7a8ab55357b6c7d44a53f644a043680ed1 (patch)
treeecd98c95e8eed62479e9c04d9af5a336e951de1f /drivers
parent7414705ea4aef9ce438e547f3138a680d2d1096c (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')
-rw-r--r--drivers/scsi/ibmvscsi/ibmvfc.c20
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 }