[SCSI] qla2xxx: Use proper HA during asynchrounous event handling.
authorSeokmann Ju <seokmann.ju@qlogic.com>
Thu, 3 Apr 2008 20:13:30 +0000 (13:13 -0700)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Mon, 7 Apr 2008 17:19:16 +0000 (12:19 -0500)
Changes are added to the driver so that it can behave properly
upon having asynchronous events, for example, addition of target
devices to the VPs.

Signed-off-by: Seokmann Ju <seokmann.ju@qlogic.com>
Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/scsi/qla2xxx/qla_isr.c

index 360af4e09d127d48306454b2c95d82b2a5740535..285479b62d8f02084ad0daebc12ab249f16348c0 100644 (file)
@@ -272,6 +272,8 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb)
        uint32_t        rscn_entry, host_pid;
        uint8_t         rscn_queue_index;
        unsigned long   flags;
+       scsi_qla_host_t *vha;
+       int             i;
 
        /* Setup to process RIO completion. */
        handle_cnt = 0;
@@ -542,6 +544,18 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb)
                break;
 
        case MBA_PORT_UPDATE:           /* Port database update */
+               if ((ha->flags.npiv_supported) && (ha->num_vhosts)) {
+                       for_each_mapped_vp_idx(ha, i) {
+                               list_for_each_entry(vha, &ha->vp_list,
+                                   vp_list) {
+                                       if ((mb[3] & 0xff)
+                                           == vha->vp_idx) {
+                                               ha = vha;
+                                               break;
+                                       }
+                               }
+                       }
+               }
                /*
                 * If PORT UPDATE is global (recieved LIP_OCCURED/LIP_RESET
                 * event etc. earlier indicating loop is down) then process
@@ -576,12 +590,18 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb)
                break;
 
        case MBA_RSCN_UPDATE:           /* State Change Registration */
-               /* Check if the Vport has issued a SCR */
-               if (ha->parent && test_bit(VP_SCR_NEEDED, &ha->vp_flags))
-                       break;
-               /* Only handle SCNs for our Vport index. */
-               if (ha->flags.npiv_supported && ha->vp_idx != mb[3])
-                       break;
+               if ((ha->flags.npiv_supported) && (ha->num_vhosts)) {
+                       for_each_mapped_vp_idx(ha, i) {
+                               list_for_each_entry(vha, &ha->vp_list,
+                                   vp_list) {
+                                       if ((mb[3] & 0xff)
+                                           == vha->vp_idx) {
+                                               ha = vha;
+                                               break;
+                                       }
+                               }
+                       }
+               }
 
                DEBUG2(printk("scsi(%ld): Asynchronous RSCR UPDATE.\n",
                    ha->host_no));