[SCSI] mptfusion - prep for removing domain validation
This moves some functions around from within the #define MPTSCSIH_ENABLE_DOMAIN_VALIDATION area, in preperation for generic domain validation. Signed-off-by: Eric Moore <Eric.Moore@lsil.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
a9b2937a1e
commit
f2ea8671a8
|
@ -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_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_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_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 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);
|
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);
|
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_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *iocmd);
|
||||||
static int mptscsih_synchronize_cache(MPT_SCSI_HOST *hd, int portnum);
|
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;
|
static struct work_struct mptscsih_persistTask;
|
||||||
|
|
||||||
#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
|
#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
|
||||||
static int mptscsih_do_raid(MPT_SCSI_HOST *hd, u8 action, INTERNAL_CMD *io);
|
static int mptscsih_do_raid(MPT_SCSI_HOST *hd, u8 action, INTERNAL_CMD *io);
|
||||||
static void mptscsih_domainValidation(void *hd);
|
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 void mptscsih_qas_check(MPT_SCSI_HOST *hd, int id);
|
||||||
static int mptscsih_doDv(MPT_SCSI_HOST *hd, int channel, int target);
|
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_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_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_raid(MPT_SCSI_HOST *hd, int id);
|
||||||
|
static void mptscsih_set_dvflags(MPT_SCSI_HOST *hd, SCSIIORequest_t *pReq);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void mptscsih_remove(struct pci_dev *);
|
void mptscsih_remove(struct pci_dev *);
|
||||||
|
@ -993,8 +993,10 @@ mptscsih_remove(struct pci_dev *pdev)
|
||||||
MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
|
MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
|
||||||
struct Scsi_Host *host = ioc->sh;
|
struct Scsi_Host *host = ioc->sh;
|
||||||
MPT_SCSI_HOST *hd;
|
MPT_SCSI_HOST *hd;
|
||||||
|
#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
|
||||||
int count;
|
int count;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
#endif
|
||||||
int sz1;
|
int sz1;
|
||||||
|
|
||||||
if(!host) {
|
if(!host) {
|
||||||
|
@ -2597,9 +2599,9 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
|
||||||
|
|
||||||
case MPI_EVENT_INTEGRATED_RAID: /* 0B */
|
case MPI_EVENT_INTEGRATED_RAID: /* 0B */
|
||||||
{
|
{
|
||||||
|
#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
|
||||||
pMpiEventDataRaid_t pRaidEventData =
|
pMpiEventDataRaid_t pRaidEventData =
|
||||||
(pMpiEventDataRaid_t) pEvReply->Data;
|
(pMpiEventDataRaid_t) pEvReply->Data;
|
||||||
#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
|
|
||||||
/* Domain Validation Needed */
|
/* Domain Validation Needed */
|
||||||
if (ioc->bus_type == SPI &&
|
if (ioc->bus_type == SPI &&
|
||||||
pRaidEventData->ReasonCode ==
|
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
|
* 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;
|
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
|
#ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION
|
||||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||||
/**
|
/**
|
||||||
|
@ -4205,26 +4139,6 @@ mptscsih_domainValidation(void *arg)
|
||||||
return;
|
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
|
/* Write SDP1 if no QAS has been enabled
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
|
@ -5588,6 +5502,95 @@ mptscsih_fillbuf(char *buffer, int size, int index, int width)
|
||||||
break;
|
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 */
|
#endif /* ~MPTSCSIH_ENABLE_DOMAIN_VALIDATION */
|
||||||
|
|
||||||
EXPORT_SYMBOL(mptscsih_remove);
|
EXPORT_SYMBOL(mptscsih_remove);
|
||||||
|
|
Loading…
Reference in New Issue