aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShyam Sundar <shyam.sundar@qlogic.com>2007-11-12 10:30:59 -0800
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2008-01-11 18:22:45 -0600
commitf4a8dbc7f6ca8c0a7ec4f112320899b6b77d7e17 (patch)
treea54baadb6dc47d7a0ff9133cbbdca5521541c514
parenteb66dc60be5a72bc940458a5adfd400e4d810d49 (diff)
downloadkernel_samsung_smdk4412-f4a8dbc7f6ca8c0a7ec4f112320899b6b77d7e17.zip
kernel_samsung_smdk4412-f4a8dbc7f6ca8c0a7ec4f112320899b6b77d7e17.tar.gz
kernel_samsung_smdk4412-f4a8dbc7f6ca8c0a7ec4f112320899b6b77d7e17.tar.bz2
[SCSI] qla2xxx: Properly handle Vport state-change-notifications.
Drivers do SCRs for each Vport. When something changes in the fabric, firmware generates one interrupt for each RSCN. Based on the current implementation, in each case, we make recursive calls to handle RSCN for physical and each subsequent virtual ports. The fix is to also take into consideration the vp_idx, which is set by the firmware to indicate the vport the RSCN was meant for. Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
-rw-r--r--drivers/scsi/qla2xxx/qla_isr.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index 343af39..798b7e8 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -575,12 +575,15 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb)
/* 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;
DEBUG2(printk("scsi(%ld): Asynchronous RSCR UPDATE.\n",
ha->host_no));
DEBUG(printk(KERN_INFO
- "scsi(%ld): RSCN database changed -- %04x %04x.\n",
- ha->host_no, mb[1], mb[2]));
+ "scsi(%ld): RSCN database changed -- %04x %04x %04x.\n",
+ ha->host_no, mb[1], mb[2], mb[3]));
rscn_entry = (mb[1] << 16) | mb[2];
host_pid = (ha->d_id.b.domain << 16) | (ha->d_id.b.area << 8) |