aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/message/fusion/mptbase.h1
-rw-r--r--drivers/message/fusion/mptspi.c23
2 files changed, 22 insertions, 2 deletions
diff --git a/drivers/message/fusion/mptbase.h b/drivers/message/fusion/mptbase.h
index e3a39272aad6..d25d3be8fcd2 100644
--- a/drivers/message/fusion/mptbase.h
+++ b/drivers/message/fusion/mptbase.h
@@ -994,6 +994,7 @@ typedef struct _MPT_SCSI_HOST {
994 int scandv_wait_done; 994 int scandv_wait_done;
995 long last_queue_full; 995 long last_queue_full;
996 u16 tm_iocstatus; 996 u16 tm_iocstatus;
997 u16 spi_pending;
997 struct list_head target_reset_list; 998 struct list_head target_reset_list;
998} MPT_SCSI_HOST; 999} MPT_SCSI_HOST;
999 1000
diff --git a/drivers/message/fusion/mptspi.c b/drivers/message/fusion/mptspi.c
index b08416f84edc..d75f7ffbb02e 100644
--- a/drivers/message/fusion/mptspi.c
+++ b/drivers/message/fusion/mptspi.c
@@ -676,7 +676,9 @@ static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd,
676 return; 676 return;
677 } 677 }
678 678
679 hd->spi_pending |= (1 << sdev->id);
679 spi_dv_device(sdev); 680 spi_dv_device(sdev);
681 hd->spi_pending &= ~(1 << sdev->id);
680 682
681 if (sdev->channel == 1 && 683 if (sdev->channel == 1 &&
682 mptscsih_quiesce_raid(hd, 0, vtarget->channel, vtarget->id) < 0) 684 mptscsih_quiesce_raid(hd, 0, vtarget->channel, vtarget->id) < 0)
@@ -1202,11 +1204,27 @@ mptspi_dv_renegotiate_work(struct work_struct *work)
1202 container_of(work, struct work_queue_wrapper, work); 1204 container_of(work, struct work_queue_wrapper, work);
1203 struct _MPT_SCSI_HOST *hd = wqw->hd; 1205 struct _MPT_SCSI_HOST *hd = wqw->hd;
1204 struct scsi_device *sdev; 1206 struct scsi_device *sdev;
1207 struct scsi_target *starget;
1208 struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
1209 u32 nego;
1205 1210
1206 kfree(wqw); 1211 kfree(wqw);
1207 1212
1208 shost_for_each_device(sdev, hd->ioc->sh) 1213 if (hd->spi_pending) {
1209 mptspi_dv_device(hd, sdev); 1214 shost_for_each_device(sdev, hd->ioc->sh) {
1215 if (hd->spi_pending & (1 << sdev->id))
1216 continue;
1217 starget = scsi_target(sdev);
1218 nego = mptspi_getRP(starget);
1219 pg1.RequestedParameters = cpu_to_le32(nego);
1220 pg1.Reserved = 0;
1221 pg1.Configuration = 0;
1222 mptspi_write_spi_device_pg1(starget, &pg1);
1223 }
1224 } else {
1225 shost_for_each_device(sdev, hd->ioc->sh)
1226 mptspi_dv_device(hd, sdev);
1227 }
1210} 1228}
1211 1229
1212static void 1230static void
@@ -1452,6 +1470,7 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
1452 init_waitqueue_head(&hd->scandv_waitq); 1470 init_waitqueue_head(&hd->scandv_waitq);
1453 hd->scandv_wait_done = 0; 1471 hd->scandv_wait_done = 0;
1454 hd->last_queue_full = 0; 1472 hd->last_queue_full = 0;
1473 hd->spi_pending = 0;
1455 1474
1456 /* Some versions of the firmware don't support page 0; without 1475 /* Some versions of the firmware don't support page 0; without
1457 * that we can't get the parameters */ 1476 * that we can't get the parameters */