Skip to content

Commit

Permalink
[SCSI] mptfusion - prep for removing domain validation
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Moore, Eric Dean authored and James Bottomley committed Dec 14, 2005
1 parent a9b2937 commit f2ea867
Showing 1 changed file with 114 additions and 111 deletions.
225 changes: 114 additions & 111 deletions drivers/message/fusion/mptscsih.c
Original file line number Diff line number Diff line change
Expand Up @@ -152,26 +152,26 @@ 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);
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 *);
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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 ==
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/**
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit f2ea867

Please sign in to comment.