diff options
| author | Moore, Eric Dean <Eric.Moore@lsil.com> | 2005-11-16 20:54:23 -0500 |
|---|---|---|
| committer | James Bottomley <jejb@mulgrave.(none)> | 2005-12-13 20:40:52 -0500 |
| commit | f2ea8671a8376e09cf759aa8cb3de8b8d3bced9e (patch) | |
| tree | 82181e022ccecfa0f1b8b3cef673630df917209d /drivers | |
| parent | a9b2937a1eab2939d0eed3830ead88664ed7445d (diff) | |
[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>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/message/fusion/mptscsih.c | 225 |
1 files changed, 114 insertions, 111 deletions
diff --git a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c index 2d014248b799..a5ca7494c8c1 100644 --- a/drivers/message/fusion/mptscsih.c +++ b/drivers/message/fusion/mptscsih.c | |||
| @@ -152,7 +152,6 @@ int mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply | |||
| 152 | 152 | ||
| 153 | static void mptscsih_initTarget(MPT_SCSI_HOST *hd, int bus_id, int target_id, u8 lun, char *data, int dlen); | 153 | static void mptscsih_initTarget(MPT_SCSI_HOST *hd, int bus_id, int target_id, u8 lun, char *data, int dlen); |
| 154 | static void mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtDevice *target, char byte56); | 154 | static void mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtDevice *target, char byte56); |
| 155 | static void mptscsih_set_dvflags(MPT_SCSI_HOST *hd, SCSIIORequest_t *pReq); | ||
| 156 | static void mptscsih_setDevicePage1Flags (u8 width, u8 factor, u8 offset, int *requestedPtr, int *configurationPtr, u8 flags); | 155 | static void mptscsih_setDevicePage1Flags (u8 width, u8 factor, u8 offset, int *requestedPtr, int *configurationPtr, u8 flags); |
| 157 | static void mptscsih_no_negotiate(MPT_SCSI_HOST *hd, int target_id); | 156 | static void mptscsih_no_negotiate(MPT_SCSI_HOST *hd, int target_id); |
| 158 | static int mptscsih_writeSDP1(MPT_SCSI_HOST *hd, int portnum, int target, int flags); | 157 | 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); | |||
| 160 | int mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *r); | 159 | int mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *r); |
| 161 | static int mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *iocmd); | 160 | static int mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *iocmd); |
| 162 | static int mptscsih_synchronize_cache(MPT_SCSI_HOST *hd, int portnum); | 161 | static int mptscsih_synchronize_cache(MPT_SCSI_HOST *hd, int portnum); |
| 162 | static int mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id); | ||
| 163 | 163 | ||
| 164 | static struct work_struct mptscsih_persistTask; | 164 | static struct work_struct mptscsih_persistTask; |
| 165 | 165 | ||
| 166 | #ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION | 166 | #ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION |
| 167 | static int mptscsih_do_raid(MPT_SCSI_HOST *hd, u8 action, INTERNAL_CMD *io); | 167 | static int mptscsih_do_raid(MPT_SCSI_HOST *hd, u8 action, INTERNAL_CMD *io); |
| 168 | static void mptscsih_domainValidation(void *hd); | 168 | static void mptscsih_domainValidation(void *hd); |
| 169 | static int mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id); | ||
| 170 | static void mptscsih_qas_check(MPT_SCSI_HOST *hd, int id); | 169 | static void mptscsih_qas_check(MPT_SCSI_HOST *hd, int id); |
| 171 | static int mptscsih_doDv(MPT_SCSI_HOST *hd, int channel, int target); | 170 | static int mptscsih_doDv(MPT_SCSI_HOST *hd, int channel, int target); |
| 172 | static void mptscsih_dv_parms(MPT_SCSI_HOST *hd, DVPARAMETERS *dv,void *pPage); | 171 | static void mptscsih_dv_parms(MPT_SCSI_HOST *hd, DVPARAMETERS *dv,void *pPage); |
| 173 | static void mptscsih_fillbuf(char *buffer, int size, int index, int width); | 172 | static void mptscsih_fillbuf(char *buffer, int size, int index, int width); |
| 174 | static void mptscsih_set_dvflags_raid(MPT_SCSI_HOST *hd, int id); | 173 | static void mptscsih_set_dvflags_raid(MPT_SCSI_HOST *hd, int id); |
| 174 | static void mptscsih_set_dvflags(MPT_SCSI_HOST *hd, SCSIIORequest_t *pReq); | ||
| 175 | #endif | 175 | #endif |
| 176 | 176 | ||
| 177 | void mptscsih_remove(struct pci_dev *); | 177 | void mptscsih_remove(struct pci_dev *); |
| @@ -993,8 +993,10 @@ mptscsih_remove(struct pci_dev *pdev) | |||
| 993 | MPT_ADAPTER *ioc = pci_get_drvdata(pdev); | 993 | MPT_ADAPTER *ioc = pci_get_drvdata(pdev); |
| 994 | struct Scsi_Host *host = ioc->sh; | 994 | struct Scsi_Host *host = ioc->sh; |
| 995 | MPT_SCSI_HOST *hd; | 995 | MPT_SCSI_HOST *hd; |
| 996 | #ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION | ||
| 996 | int count; | 997 | int count; |
| 997 | unsigned long flags; | 998 | unsigned long flags; |
| 999 | #endif | ||
| 998 | int sz1; | 1000 | int sz1; |
| 999 | 1001 | ||
| 1000 | if(!host) { | 1002 | if(!host) { |
| @@ -2597,9 +2599,9 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply) | |||
| 2597 | 2599 | ||
| 2598 | case MPI_EVENT_INTEGRATED_RAID: /* 0B */ | 2600 | case MPI_EVENT_INTEGRATED_RAID: /* 0B */ |
| 2599 | { | 2601 | { |
| 2602 | #ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION | ||
| 2600 | pMpiEventDataRaid_t pRaidEventData = | 2603 | pMpiEventDataRaid_t pRaidEventData = |
| 2601 | (pMpiEventDataRaid_t) pEvReply->Data; | 2604 | (pMpiEventDataRaid_t) pEvReply->Data; |
| 2602 | #ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION | ||
| 2603 | /* Domain Validation Needed */ | 2605 | /* Domain Validation Needed */ |
| 2604 | if (ioc->bus_type == SPI && | 2606 | if (ioc->bus_type == SPI && |
| 2605 | pRaidEventData->ReasonCode == | 2607 | pRaidEventData->ReasonCode == |
| @@ -2926,94 +2928,6 @@ mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtDevice *target, char byte56) | |||
| 2926 | } | 2928 | } |
| 2927 | 2929 | ||
| 2928 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 2930 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
| 2929 | /* If DV disabled (negoNvram set to USE_NVARM) or if not LUN 0, return. | ||
| 2930 | * Else set the NEED_DV flag after Read Capacity Issued (disks) | ||
| 2931 | * or Mode Sense (cdroms). | ||
| 2932 | * | ||
| 2933 | * Tapes, initTarget will set this flag on completion of Inquiry command. | ||
| 2934 | * Called only if DV_NOT_DONE flag is set | ||
| 2935 | */ | ||
| 2936 | static void | ||
| 2937 | mptscsih_set_dvflags(MPT_SCSI_HOST *hd, SCSIIORequest_t *pReq) | ||
| 2938 | { | ||
| 2939 | MPT_ADAPTER *ioc = hd->ioc; | ||
| 2940 | u8 cmd; | ||
| 2941 | SpiCfgData *pSpi; | ||
| 2942 | |||
| 2943 | ddvtprintk((MYIOC_s_NOTE_FMT | ||
| 2944 | " set_dvflags: id=%d lun=%d negoNvram=%x cmd=%x\n", | ||
| 2945 | hd->ioc->name, pReq->TargetID, pReq->LUN[1], hd->negoNvram, pReq->CDB[0])); | ||
| 2946 | |||
| 2947 | if ((pReq->LUN[1] != 0) || (hd->negoNvram != 0)) | ||
| 2948 | return; | ||
| 2949 | |||
| 2950 | cmd = pReq->CDB[0]; | ||
| 2951 | |||
| 2952 | if ((cmd == READ_CAPACITY) || (cmd == MODE_SENSE)) { | ||
| 2953 | pSpi = &ioc->spi_data; | ||
| 2954 | if ((ioc->raid_data.isRaid & (1 << pReq->TargetID)) && ioc->raid_data.pIocPg3) { | ||
| 2955 | /* Set NEED_DV for all hidden disks | ||
| 2956 | */ | ||
| 2957 | Ioc3PhysDisk_t *pPDisk = ioc->raid_data.pIocPg3->PhysDisk; | ||
| 2958 | int numPDisk = ioc->raid_data.pIocPg3->NumPhysDisks; | ||
| 2959 | |||
| 2960 | while (numPDisk) { | ||
| 2961 | pSpi->dvStatus[pPDisk->PhysDiskID] |= MPT_SCSICFG_NEED_DV; | ||
| 2962 | ddvtprintk(("NEED_DV set for phys disk id %d\n", pPDisk->PhysDiskID)); | ||
| 2963 | pPDisk++; | ||
| 2964 | numPDisk--; | ||
| 2965 | } | ||
| 2966 | } | ||
| 2967 | pSpi->dvStatus[pReq->TargetID] |= MPT_SCSICFG_NEED_DV; | ||
| 2968 | ddvtprintk(("NEED_DV set for visible disk id %d\n", pReq->TargetID)); | ||
| 2969 | } | ||
| 2970 | } | ||
| 2971 | |||
| 2972 | /* mptscsih_raid_set_dv_flags() | ||
| 2973 | * | ||
| 2974 | * New or replaced disk. Set DV flag and schedule DV. | ||
| 2975 | */ | ||
| 2976 | static void | ||
| 2977 | mptscsih_set_dvflags_raid(MPT_SCSI_HOST *hd, int id) | ||
| 2978 | { | ||
| 2979 | MPT_ADAPTER *ioc = hd->ioc; | ||
| 2980 | SpiCfgData *pSpi = &ioc->spi_data; | ||
| 2981 | Ioc3PhysDisk_t *pPDisk; | ||
| 2982 | int numPDisk; | ||
| 2983 | |||
| 2984 | if (hd->negoNvram != 0) | ||
| 2985 | return; | ||
| 2986 | |||
| 2987 | ddvtprintk(("DV requested for phys disk id %d\n", id)); | ||
| 2988 | if (ioc->raid_data.pIocPg3) { | ||
| 2989 | pPDisk = ioc->raid_data.pIocPg3->PhysDisk; | ||
| 2990 | numPDisk = ioc->raid_data.pIocPg3->NumPhysDisks; | ||
| 2991 | while (numPDisk) { | ||
| 2992 | if (id == pPDisk->PhysDiskNum) { | ||
| 2993 | pSpi->dvStatus[pPDisk->PhysDiskID] = | ||
| 2994 | (MPT_SCSICFG_NEED_DV | MPT_SCSICFG_DV_NOT_DONE); | ||
| 2995 | pSpi->forceDv = MPT_SCSICFG_NEED_DV; | ||
| 2996 | ddvtprintk(("NEED_DV set for phys disk id %d\n", | ||
| 2997 | pPDisk->PhysDiskID)); | ||
| 2998 | break; | ||
| 2999 | } | ||
| 3000 | pPDisk++; | ||
| 3001 | numPDisk--; | ||
| 3002 | } | ||
| 3003 | |||
| 3004 | if (numPDisk == 0) { | ||
| 3005 | /* The physical disk that needs DV was not found | ||
| 3006 | * in the stored IOC Page 3. The driver must reload | ||
| 3007 | * this page. DV routine will set the NEED_DV flag for | ||
| 3008 | * all phys disks that have DV_NOT_DONE set. | ||
| 3009 | */ | ||
| 3010 | pSpi->forceDv = MPT_SCSICFG_NEED_DV | MPT_SCSICFG_RELOAD_IOC_PG3; | ||
| 3011 | ddvtprintk(("phys disk %d not found. Setting reload IOC Pg3 Flag\n",id)); | ||
| 3012 | } | ||
| 3013 | } | ||
| 3014 | } | ||
| 3015 | |||
| 3016 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | ||
| 3017 | /* | 2931 | /* |
| 3018 | * If no Target, bus reset on 1st I/O. Set the flag to | 2932 | * If no Target, bus reset on 1st I/O. Set the flag to |
| 3019 | * prevent any future negotiations to this device. | 2933 | * prevent any future negotiations to this device. |
| @@ -4052,6 +3966,26 @@ mptscsih_synchronize_cache(MPT_SCSI_HOST *hd, int portnum) | |||
| 4052 | return 0; | 3966 | return 0; |
| 4053 | } | 3967 | } |
| 4054 | 3968 | ||
| 3969 | /* Search IOC page 3 to determine if this is hidden physical disk | ||
| 3970 | */ | ||
| 3971 | /* Search IOC page 3 to determine if this is hidden physical disk | ||
| 3972 | */ | ||
| 3973 | static int | ||
| 3974 | mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id) | ||
| 3975 | { | ||
| 3976 | int i; | ||
| 3977 | |||
| 3978 | if (!ioc->raid_data.isRaid || !ioc->raid_data.pIocPg3) | ||
| 3979 | return 0; | ||
| 3980 | |||
| 3981 | for (i = 0; i < ioc->raid_data.pIocPg3->NumPhysDisks; i++) { | ||
| 3982 | if (id == ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskID) | ||
| 3983 | return 1; | ||
| 3984 | } | ||
| 3985 | |||
| 3986 | return 0; | ||
| 3987 | } | ||
| 3988 | |||
| 4055 | #ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION | 3989 | #ifdef MPTSCSIH_ENABLE_DOMAIN_VALIDATION |
| 4056 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 3990 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
| 4057 | /** | 3991 | /** |
| @@ -4205,26 +4139,6 @@ mptscsih_domainValidation(void *arg) | |||
| 4205 | return; | 4139 | return; |
| 4206 | } | 4140 | } |
| 4207 | 4141 | ||
| 4208 | /* Search IOC page 3 to determine if this is hidden physical disk | ||
| 4209 | */ | ||
| 4210 | /* Search IOC page 3 to determine if this is hidden physical disk | ||
| 4211 | */ | ||
| 4212 | static int | ||
| 4213 | mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id) | ||
| 4214 | { | ||
| 4215 | int i; | ||
| 4216 | |||
| 4217 | if (!ioc->raid_data.isRaid || !ioc->raid_data.pIocPg3) | ||
| 4218 | return 0; | ||
| 4219 | |||
| 4220 | for (i = 0; i < ioc->raid_data.pIocPg3->NumPhysDisks; i++) { | ||
| 4221 | if (id == ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskID) | ||
| 4222 | return 1; | ||
| 4223 | } | ||
| 4224 | |||
| 4225 | return 0; | ||
| 4226 | } | ||
| 4227 | |||
| 4228 | /* Write SDP1 if no QAS has been enabled | 4142 | /* Write SDP1 if no QAS has been enabled |
| 4229 | */ | 4143 | */ |
| 4230 | static void | 4144 | static void |
| @@ -5588,6 +5502,95 @@ mptscsih_fillbuf(char *buffer, int size, int index, int width) | |||
| 5588 | break; | 5502 | break; |
| 5589 | } | 5503 | } |
| 5590 | } | 5504 | } |
| 5505 | |||
| 5506 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | ||
| 5507 | /* If DV disabled (negoNvram set to USE_NVARM) or if not LUN 0, return. | ||
| 5508 | * Else set the NEED_DV flag after Read Capacity Issued (disks) | ||
| 5509 | * or Mode Sense (cdroms). | ||
| 5510 | * | ||
| 5511 | * Tapes, initTarget will set this flag on completion of Inquiry command. | ||
| 5512 | * Called only if DV_NOT_DONE flag is set | ||
| 5513 | */ | ||
| 5514 | static void | ||
| 5515 | mptscsih_set_dvflags(MPT_SCSI_HOST *hd, SCSIIORequest_t *pReq) | ||
| 5516 | { | ||
| 5517 | MPT_ADAPTER *ioc = hd->ioc; | ||
| 5518 | u8 cmd; | ||
| 5519 | SpiCfgData *pSpi; | ||
| 5520 | |||
| 5521 | ddvtprintk((MYIOC_s_NOTE_FMT | ||
| 5522 | " set_dvflags: id=%d lun=%d negoNvram=%x cmd=%x\n", | ||
| 5523 | hd->ioc->name, pReq->TargetID, pReq->LUN[1], hd->negoNvram, pReq->CDB[0])); | ||
| 5524 | |||
| 5525 | if ((pReq->LUN[1] != 0) || (hd->negoNvram != 0)) | ||
| 5526 | return; | ||
| 5527 | |||
| 5528 | cmd = pReq->CDB[0]; | ||
| 5529 | |||
| 5530 | if ((cmd == READ_CAPACITY) || (cmd == MODE_SENSE)) { | ||
| 5531 | pSpi = &ioc->spi_data; | ||
| 5532 | if ((ioc->raid_data.isRaid & (1 << pReq->TargetID)) && ioc->raid_data.pIocPg3) { | ||
| 5533 | /* Set NEED_DV for all hidden disks | ||
| 5534 | */ | ||
| 5535 | Ioc3PhysDisk_t *pPDisk = ioc->raid_data.pIocPg3->PhysDisk; | ||
| 5536 | int numPDisk = ioc->raid_data.pIocPg3->NumPhysDisks; | ||
| 5537 | |||
| 5538 | while (numPDisk) { | ||
| 5539 | pSpi->dvStatus[pPDisk->PhysDiskID] |= MPT_SCSICFG_NEED_DV; | ||
| 5540 | ddvtprintk(("NEED_DV set for phys disk id %d\n", pPDisk->PhysDiskID)); | ||
| 5541 | pPDisk++; | ||
| 5542 | numPDisk--; | ||
| 5543 | } | ||
| 5544 | } | ||
| 5545 | pSpi->dvStatus[pReq->TargetID] |= MPT_SCSICFG_NEED_DV; | ||
| 5546 | ddvtprintk(("NEED_DV set for visible disk id %d\n", pReq->TargetID)); | ||
| 5547 | } | ||
| 5548 | } | ||
| 5549 | |||
| 5550 | /* mptscsih_raid_set_dv_flags() | ||
| 5551 | * | ||
| 5552 | * New or replaced disk. Set DV flag and schedule DV. | ||
| 5553 | */ | ||
| 5554 | static void | ||
| 5555 | mptscsih_set_dvflags_raid(MPT_SCSI_HOST *hd, int id) | ||
| 5556 | { | ||
| 5557 | MPT_ADAPTER *ioc = hd->ioc; | ||
| 5558 | SpiCfgData *pSpi = &ioc->spi_data; | ||
| 5559 | Ioc3PhysDisk_t *pPDisk; | ||
| 5560 | int numPDisk; | ||
| 5561 | |||
| 5562 | if (hd->negoNvram != 0) | ||
| 5563 | return; | ||
| 5564 | |||
| 5565 | ddvtprintk(("DV requested for phys disk id %d\n", id)); | ||
| 5566 | if (ioc->raid_data.pIocPg3) { | ||
| 5567 | pPDisk = ioc->raid_data.pIocPg3->PhysDisk; | ||
| 5568 | numPDisk = ioc->raid_data.pIocPg3->NumPhysDisks; | ||
| 5569 | while (numPDisk) { | ||
| 5570 | if (id == pPDisk->PhysDiskNum) { | ||
| 5571 | pSpi->dvStatus[pPDisk->PhysDiskID] = | ||
| 5572 | (MPT_SCSICFG_NEED_DV | MPT_SCSICFG_DV_NOT_DONE); | ||
| 5573 | pSpi->forceDv = MPT_SCSICFG_NEED_DV; | ||
| 5574 | ddvtprintk(("NEED_DV set for phys disk id %d\n", | ||
| 5575 | pPDisk->PhysDiskID)); | ||
| 5576 | break; | ||
| 5577 | } | ||
| 5578 | pPDisk++; | ||
| 5579 | numPDisk--; | ||
| 5580 | } | ||
| 5581 | |||
| 5582 | if (numPDisk == 0) { | ||
| 5583 | /* The physical disk that needs DV was not found | ||
| 5584 | * in the stored IOC Page 3. The driver must reload | ||
| 5585 | * this page. DV routine will set the NEED_DV flag for | ||
| 5586 | * all phys disks that have DV_NOT_DONE set. | ||
| 5587 | */ | ||
| 5588 | pSpi->forceDv = MPT_SCSICFG_NEED_DV | MPT_SCSICFG_RELOAD_IOC_PG3; | ||
| 5589 | ddvtprintk(("phys disk %d not found. Setting reload IOC Pg3 Flag\n",id)); | ||
| 5590 | } | ||
| 5591 | } | ||
| 5592 | } | ||
| 5593 | |||
| 5591 | #endif /* ~MPTSCSIH_ENABLE_DOMAIN_VALIDATION */ | 5594 | #endif /* ~MPTSCSIH_ENABLE_DOMAIN_VALIDATION */ |
| 5592 | 5595 | ||
| 5593 | EXPORT_SYMBOL(mptscsih_remove); | 5596 | EXPORT_SYMBOL(mptscsih_remove); |
