diff options
-rw-r--r-- | drivers/message/fusion/mptbase.h | 1 | ||||
-rw-r--r-- | drivers/message/fusion/mptspi.c | 23 |
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 | ||
1212 | static void | 1230 | static 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 */ |