mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 16:54:20 +08:00
[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_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);
|
||||
|
Loading…
Reference in New Issue
Block a user