|
@@ -152,7 +152,6 @@ int mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply
|
|
|
|
|
|
static void mptscsih_initTarget(MPT_SCSI_HOST *hd, int bus_id, int target_id, u8 lun, char *data, int dlen);
|
|
|
static void mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtDevice *target, char byte56);
|
|
|
-static void mptscsih_set_dvflags(MPT_SCSI_HOST *hd, SCSIIORequest_t *pReq);
|
|
|
static void mptscsih_setDevicePage1Flags (u8 width, u8 factor, u8 offset, int *requestedPtr, int *configurationPtr, u8 flags);
|
|
|
static void mptscsih_no_negotiate(MPT_SCSI_HOST *hd, int target_id);
|
|
|
static int mptscsih_writeSDP1(MPT_SCSI_HOST *hd, int portnum, int target, int flags);
|
|
@@ -160,18 +159,19 @@ static int mptscsih_writeIOCPage4(MPT_SCSI_HOST *hd, int target_id, int bus);
|
|
|
int mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *r);
|
|
|
static int mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *iocmd);
|
|
|
static int mptscsih_synchronize_cache(MPT_SCSI_HOST *hd, int portnum);
|
|
|
+static int mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id);
|
|
|
|
|
|
static struct work_struct mptscsih_persistTask;
|
|
|
|
|
|
#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
|
|
|
static int mptscsih_do_raid(MPT_SCSI_HOST *hd, u8 action, INTERNAL_CMD *io);
|
|
|
static void mptscsih_domainValidation(void *hd);
|
|
|
-static int mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id);
|
|
|
static void mptscsih_qas_check(MPT_SCSI_HOST *hd, int id);
|
|
|
static int mptscsih_doDv(MPT_SCSI_HOST *hd, int channel, int target);
|
|
|
static void mptscsih_dv_parms(MPT_SCSI_HOST *hd, DVPARAMETERS *dv,void *pPage);
|
|
|
static void mptscsih_fillbuf(char *buffer, int size, int index, int width);
|
|
|
static void mptscsih_set_dvflags_raid(MPT_SCSI_HOST *hd, int id);
|
|
|
+static void mptscsih_set_dvflags(MPT_SCSI_HOST *hd, SCSIIORequest_t *pReq);
|
|
|
#endif
|
|
|
|
|
|
void mptscsih_remove(struct pci_dev *);
|
|
@@ -993,8 +993,10 @@ mptscsih_remove(struct pci_dev *pdev)
|
|
|
MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
|
|
|
struct Scsi_Host *host = ioc->sh;
|
|
|
MPT_SCSI_HOST *hd;
|
|
|
+#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
|
|
|
int count;
|
|
|
unsigned long flags;
|
|
|
+#endif
|
|
|
int sz1;
|
|
|
|
|
|
if(!host) {
|
|
@@ -2597,9 +2599,9 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
|
|
|
|
|
|
case MPI_EVENT_INTEGRATED_RAID: /* 0B */
|
|
|
{
|
|
|
+#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
|
|
|
pMpiEventDataRaid_t pRaidEventData =
|
|
|
(pMpiEventDataRaid_t) pEvReply->Data;
|
|
|
-#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
|
|
|
/* Domain Validation Needed */
|
|
|
if (ioc->bus_type == SPI &&
|
|
|
pRaidEventData->ReasonCode ==
|
|
@@ -2925,94 +2927,6 @@ mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtDevice *target, char byte56)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
|
|
-/* If DV disabled (negoNvram set to USE_NVARM) or if not LUN 0, return.
|
|
|
- * Else set the NEED_DV flag after Read Capacity Issued (disks)
|
|
|
- * or Mode Sense (cdroms).
|
|
|
- *
|
|
|
- * Tapes, initTarget will set this flag on completion of Inquiry command.
|
|
|
- * Called only if DV_NOT_DONE flag is set
|
|
|
- */
|
|
|
-static void
|
|
|
-mptscsih_set_dvflags(MPT_SCSI_HOST *hd, SCSIIORequest_t *pReq)
|
|
|
-{
|
|
|
- MPT_ADAPTER *ioc = hd->ioc;
|
|
|
- u8 cmd;
|
|
|
- SpiCfgData *pSpi;
|
|
|
-
|
|
|
- ddvtprintk((MYIOC_s_NOTE_FMT
|
|
|
- " set_dvflags: id=%d lun=%d negoNvram=%x cmd=%x\n",
|
|
|
- hd->ioc->name, pReq->TargetID, pReq->LUN[1], hd->negoNvram, pReq->CDB[0]));
|
|
|
-
|
|
|
- if ((pReq->LUN[1] != 0) || (hd->negoNvram != 0))
|
|
|
- return;
|
|
|
-
|
|
|
- cmd = pReq->CDB[0];
|
|
|
-
|
|
|
- if ((cmd == READ_CAPACITY) || (cmd == MODE_SENSE)) {
|
|
|
- pSpi = &ioc->spi_data;
|
|
|
- if ((ioc->raid_data.isRaid & (1 << pReq->TargetID)) && ioc->raid_data.pIocPg3) {
|
|
|
- /* Set NEED_DV for all hidden disks
|
|
|
- */
|
|
|
- Ioc3PhysDisk_t *pPDisk = ioc->raid_data.pIocPg3->PhysDisk;
|
|
|
- int numPDisk = ioc->raid_data.pIocPg3->NumPhysDisks;
|
|
|
-
|
|
|
- while (numPDisk) {
|
|
|
- pSpi->dvStatus[pPDisk->PhysDiskID] |= MPT_SCSICFG_NEED_DV;
|
|
|
- ddvtprintk(("NEED_DV set for phys disk id %d\n", pPDisk->PhysDiskID));
|
|
|
- pPDisk++;
|
|
|
- numPDisk--;
|
|
|
- }
|
|
|
- }
|
|
|
- pSpi->dvStatus[pReq->TargetID] |= MPT_SCSICFG_NEED_DV;
|
|
|
- ddvtprintk(("NEED_DV set for visible disk id %d\n", pReq->TargetID));
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-/* mptscsih_raid_set_dv_flags()
|
|
|
- *
|
|
|
- * New or replaced disk. Set DV flag and schedule DV.
|
|
|
- */
|
|
|
-static void
|
|
|
-mptscsih_set_dvflags_raid(MPT_SCSI_HOST *hd, int id)
|
|
|
-{
|
|
|
- MPT_ADAPTER *ioc = hd->ioc;
|
|
|
- SpiCfgData *pSpi = &ioc->spi_data;
|
|
|
- Ioc3PhysDisk_t *pPDisk;
|
|
|
- int numPDisk;
|
|
|
-
|
|
|
- if (hd->negoNvram != 0)
|
|
|
- return;
|
|
|
-
|
|
|
- ddvtprintk(("DV requested for phys disk id %d\n", id));
|
|
|
- if (ioc->raid_data.pIocPg3) {
|
|
|
- pPDisk = ioc->raid_data.pIocPg3->PhysDisk;
|
|
|
- numPDisk = ioc->raid_data.pIocPg3->NumPhysDisks;
|
|
|
- while (numPDisk) {
|
|
|
- if (id == pPDisk->PhysDiskNum) {
|
|
|
- pSpi->dvStatus[pPDisk->PhysDiskID] =
|
|
|
- (MPT_SCSICFG_NEED_DV | MPT_SCSICFG_DV_NOT_DONE);
|
|
|
- pSpi->forceDv = MPT_SCSICFG_NEED_DV;
|
|
|
- ddvtprintk(("NEED_DV set for phys disk id %d\n",
|
|
|
- pPDisk->PhysDiskID));
|
|
|
- break;
|
|
|
- }
|
|
|
- pPDisk++;
|
|
|
- numPDisk--;
|
|
|
- }
|
|
|
-
|
|
|
- if (numPDisk == 0) {
|
|
|
- /* The physical disk that needs DV was not found
|
|
|
- * in the stored IOC Page 3. The driver must reload
|
|
|
- * this page. DV routine will set the NEED_DV flag for
|
|
|
- * all phys disks that have DV_NOT_DONE set.
|
|
|
- */
|
|
|
- pSpi->forceDv = MPT_SCSICFG_NEED_DV | MPT_SCSICFG_RELOAD_IOC_PG3;
|
|
|
- ddvtprintk(("phys disk %d not found. Setting reload IOC Pg3 Flag\n",id));
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
|
|
/*
|
|
|
* If no Target, bus reset on 1st I/O. Set the flag to
|
|
@@ -4052,6 +3966,26 @@ mptscsih_synchronize_cache(MPT_SCSI_HOST *hd, int portnum)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/* Search IOC page 3 to determine if this is hidden physical disk
|
|
|
+ */
|
|
|
+/* Search IOC page 3 to determine if this is hidden physical disk
|
|
|
+ */
|
|
|
+static int
|
|
|
+mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ if (!ioc->raid_data.isRaid || !ioc->raid_data.pIocPg3)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ for (i = 0; i < ioc->raid_data.pIocPg3->NumPhysDisks; i++) {
|
|
|
+ if (id == ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskID)
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
|
|
/**
|
|
@@ -4205,26 +4139,6 @@ mptscsih_domainValidation(void *arg)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
-/* Search IOC page 3 to determine if this is hidden physical disk
|
|
|
- */
|
|
|
-/* Search IOC page 3 to determine if this is hidden physical disk
|
|
|
- */
|
|
|
-static int
|
|
|
-mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id)
|
|
|
-{
|
|
|
- int i;
|
|
|
-
|
|
|
- if (!ioc->raid_data.isRaid || !ioc->raid_data.pIocPg3)
|
|
|
- return 0;
|
|
|
-
|
|
|
- for (i = 0; i < ioc->raid_data.pIocPg3->NumPhysDisks; i++) {
|
|
|
- if (id == ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskID)
|
|
|
- return 1;
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
/* Write SDP1 if no QAS has been enabled
|
|
|
*/
|
|
|
static void
|
|
@@ -5588,6 +5502,95 @@ mptscsih_fillbuf(char *buffer, int size, int index, int width)
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
|
|
+/* If DV disabled (negoNvram set to USE_NVARM) or if not LUN 0, return.
|
|
|
+ * Else set the NEED_DV flag after Read Capacity Issued (disks)
|
|
|
+ * or Mode Sense (cdroms).
|
|
|
+ *
|
|
|
+ * Tapes, initTarget will set this flag on completion of Inquiry command.
|
|
|
+ * Called only if DV_NOT_DONE flag is set
|
|
|
+ */
|
|
|
+static void
|
|
|
+mptscsih_set_dvflags(MPT_SCSI_HOST *hd, SCSIIORequest_t *pReq)
|
|
|
+{
|
|
|
+ MPT_ADAPTER *ioc = hd->ioc;
|
|
|
+ u8 cmd;
|
|
|
+ SpiCfgData *pSpi;
|
|
|
+
|
|
|
+ ddvtprintk((MYIOC_s_NOTE_FMT
|
|
|
+ " set_dvflags: id=%d lun=%d negoNvram=%x cmd=%x\n",
|
|
|
+ hd->ioc->name, pReq->TargetID, pReq->LUN[1], hd->negoNvram, pReq->CDB[0]));
|
|
|
+
|
|
|
+ if ((pReq->LUN[1] != 0) || (hd->negoNvram != 0))
|
|
|
+ return;
|
|
|
+
|
|
|
+ cmd = pReq->CDB[0];
|
|
|
+
|
|
|
+ if ((cmd == READ_CAPACITY) || (cmd == MODE_SENSE)) {
|
|
|
+ pSpi = &ioc->spi_data;
|
|
|
+ if ((ioc->raid_data.isRaid & (1 << pReq->TargetID)) && ioc->raid_data.pIocPg3) {
|
|
|
+ /* Set NEED_DV for all hidden disks
|
|
|
+ */
|
|
|
+ Ioc3PhysDisk_t *pPDisk = ioc->raid_data.pIocPg3->PhysDisk;
|
|
|
+ int numPDisk = ioc->raid_data.pIocPg3->NumPhysDisks;
|
|
|
+
|
|
|
+ while (numPDisk) {
|
|
|
+ pSpi->dvStatus[pPDisk->PhysDiskID] |= MPT_SCSICFG_NEED_DV;
|
|
|
+ ddvtprintk(("NEED_DV set for phys disk id %d\n", pPDisk->PhysDiskID));
|
|
|
+ pPDisk++;
|
|
|
+ numPDisk--;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ pSpi->dvStatus[pReq->TargetID] |= MPT_SCSICFG_NEED_DV;
|
|
|
+ ddvtprintk(("NEED_DV set for visible disk id %d\n", pReq->TargetID));
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/* mptscsih_raid_set_dv_flags()
|
|
|
+ *
|
|
|
+ * New or replaced disk. Set DV flag and schedule DV.
|
|
|
+ */
|
|
|
+static void
|
|
|
+mptscsih_set_dvflags_raid(MPT_SCSI_HOST *hd, int id)
|
|
|
+{
|
|
|
+ MPT_ADAPTER *ioc = hd->ioc;
|
|
|
+ SpiCfgData *pSpi = &ioc->spi_data;
|
|
|
+ Ioc3PhysDisk_t *pPDisk;
|
|
|
+ int numPDisk;
|
|
|
+
|
|
|
+ if (hd->negoNvram != 0)
|
|
|
+ return;
|
|
|
+
|
|
|
+ ddvtprintk(("DV requested for phys disk id %d\n", id));
|
|
|
+ if (ioc->raid_data.pIocPg3) {
|
|
|
+ pPDisk = ioc->raid_data.pIocPg3->PhysDisk;
|
|
|
+ numPDisk = ioc->raid_data.pIocPg3->NumPhysDisks;
|
|
|
+ while (numPDisk) {
|
|
|
+ if (id == pPDisk->PhysDiskNum) {
|
|
|
+ pSpi->dvStatus[pPDisk->PhysDiskID] =
|
|
|
+ (MPT_SCSICFG_NEED_DV | MPT_SCSICFG_DV_NOT_DONE);
|
|
|
+ pSpi->forceDv = MPT_SCSICFG_NEED_DV;
|
|
|
+ ddvtprintk(("NEED_DV set for phys disk id %d\n",
|
|
|
+ pPDisk->PhysDiskID));
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ pPDisk++;
|
|
|
+ numPDisk--;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (numPDisk == 0) {
|
|
|
+ /* The physical disk that needs DV was not found
|
|
|
+ * in the stored IOC Page 3. The driver must reload
|
|
|
+ * this page. DV routine will set the NEED_DV flag for
|
|
|
+ * all phys disks that have DV_NOT_DONE set.
|
|
|
+ */
|
|
|
+ pSpi->forceDv = MPT_SCSICFG_NEED_DV | MPT_SCSICFG_RELOAD_IOC_PG3;
|
|
|
+ ddvtprintk(("phys disk %d not found. Setting reload IOC Pg3 Flag\n",id));
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
#endif /* ~MPTSCSIH_ENABLE_DOMAIN_VALIDATION */
|
|
|
|
|
|
EXPORT_SYMBOL(mptscsih_remove);
|