Fix a debug message which didn't quite get it right about data direction.

Fix things to use the LSI-Logic Fusion Library mask and shift names for
offset and sync, no matter how awkward they are, in preference to just
plain numbers.
This commit is contained in:
Matt Jacob 2006-12-03 00:28:11 +00:00
parent 3d253c11cf
commit a54067cc0e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=164837
4 changed files with 163 additions and 102 deletions

View file

@ -1365,7 +1365,7 @@ mpt_send_handshake_cmd(struct mpt_softc *mpt, size_t len, void *cmd)
/* Wait for the chip to notice */
if (mpt_wait_db_int(mpt) != MPT_OK) {
mpt_prt(mpt, "mpt_send_handshake_cmd timeout1\n");
mpt_prt(mpt, "mpt_send_handshake_cmd: db ignored\n");
return (ETIMEDOUT);
}
@ -1373,7 +1373,7 @@ mpt_send_handshake_cmd(struct mpt_softc *mpt, size_t len, void *cmd)
mpt_write(mpt, MPT_OFFSET_INTR_STATUS, 0);
if (mpt_wait_db_ack(mpt) != MPT_OK) {
mpt_prt(mpt, "mpt_send_handshake_cmd timeout2\n");
mpt_prt(mpt, "mpt_send_handshake_cmd: db ack timed out\n");
return (ETIMEDOUT);
}
@ -1382,8 +1382,7 @@ mpt_send_handshake_cmd(struct mpt_softc *mpt, size_t len, void *cmd)
mpt_write(mpt, MPT_OFFSET_DOORBELL, htole32(*data32++));
if (mpt_wait_db_ack(mpt) != MPT_OK) {
mpt_prt(mpt,
"mpt_send_handshake_cmd timeout! index = %d\n",
i);
"mpt_send_handshake_cmd: timeout @ index %d\n", i);
return (ETIMEDOUT);
}
}

View file

@ -522,10 +522,9 @@ struct mpt_softc {
*/
uint16_t mpt_global_credits;
uint16_t request_frame_size;
uint8_t mpt_max_devices;
uint16_t mpt_max_devices;
uint8_t mpt_max_buses;
uint8_t ioc_facts_flags;
uint8_t padding0;
/*
* Port Facts

View file

@ -1879,12 +1879,14 @@ mpt_start(struct cam_sim *sim, union ccb *ccb)
* Do a *short* print here if we're set to MPT_PRT_DEBUG
*/
if (mpt->verbose == MPT_PRT_DEBUG) {
U32 df;
mpt_prt(mpt, "mpt_start: %s op 0x%x ",
(mpt_req->Function == MPI_FUNCTION_SCSI_IO_REQUEST)?
"SCSI_IO_REQUEST" : "SCSI_IO_PASSTHRU", mpt_req->CDB[0]);
if (mpt_req->Control != MPI_SCSIIO_CONTROL_NODATATRANSFER) {
df = mpt_req->Control & MPI_SCSIIO_CONTROL_DATADIRECTION_MASK;
if (df != MPI_SCSIIO_CONTROL_NODATATRANSFER) {
mpt_prtc(mpt, "(%s %u byte%s ",
(mpt_req->Control == MPI_SCSIIO_CONTROL_READ)?
(df == MPI_SCSIIO_CONTROL_READ)?
"read" : "write", csio->dxfer_len,
(csio->dxfer_len == 1)? ")" : "s)");
}
@ -2151,10 +2153,6 @@ mpt_cam_event(struct mpt_softc *mpt, request_t *req,
mpt_prt(mpt, "FC Logout Port: %d N_PortID: %02x\n",
(data1 >> 8) & 0xff, data0);
break;
case MPI_EVENT_EVENT_CHANGE:
mpt_lprt(mpt, MPT_PRT_DEBUG,
"mpt_cam_event: MPI_EVENT_EVENT_CHANGE\n");
break;
case MPI_EVENT_QUEUE_FULL:
{
struct cam_sim *sim;
@ -2193,18 +2191,11 @@ mpt_cam_event(struct mpt_softc *mpt, request_t *req,
CAMLOCK_2_MPTLOCK(mpt);
break;
}
case MPI_EVENT_EVENT_CHANGE:
case MPI_EVENT_INTEGRATED_RAID:
case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE:
{
mpt_lprt(mpt, MPT_PRT_DEBUG,
"mpt_cam_event: SAS_DEVICE_STATUS_CHANGE\n");
break;
}
case MPI_EVENT_SAS_SES:
{
mpt_lprt(mpt, MPT_PRT_DEBUG,
"mpt_cam_event: MPI_EVENT_SAS_SES\n");
break;
}
default:
mpt_lprt(mpt, MPT_PRT_WARN, "mpt_cam_event: 0x%x\n",
msg->Event & 0xFF);
@ -2873,7 +2864,8 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
tgt = ccb->ccb_h.target_id;
lun = ccb->ccb_h.target_lun;
if (raid_passthru && ccb->ccb_h.func_code != XPT_PATH_INQ &&
if (raid_passthru &&
ccb->ccb_h.func_code != XPT_PATH_INQ &&
ccb->ccb_h.func_code != XPT_RESET_BUS &&
ccb->ccb_h.func_code != XPT_RESET_DEV) {
CAMLOCK_2_MPTLOCK(mpt);
@ -2913,11 +2905,15 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
return;
case XPT_RESET_BUS:
if (raid_passthru) {
ccb->ccb_h.status &= ~CAM_SIM_QUEUED;
mpt_set_ccb_status(ccb, CAM_REQ_CMP);
break;
}
case XPT_RESET_DEV:
mpt_lprt(mpt, MPT_PRT_DEBUG,
ccb->ccb_h.func_code == XPT_RESET_BUS ?
"XPT_RESET_BUS\n" : "XPT_RESET_DEV\n");
xpt_print_path(ccb->ccb_h.path);
printf("reset %s\n", ccb->ccb_h.func_code == XPT_RESET_BUS?
"bus" : "device");
CAMLOCK_2_MPTLOCK(mpt);
(void) mpt_bus_reset(mpt, tgt, lun, FALSE);
MPTLOCK_2_CAMLOCK(mpt);
@ -2986,6 +2982,17 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
break;
}
scsi = &cts->proto_specific.scsi;
spi = &cts->xport_specific.spi;
/*
* We can be called just to valid transport and proto versions
*/
if (scsi->valid == 0 && spi->valid == 0) {
mpt_set_ccb_status(ccb, CAM_REQ_CMP);
break;
}
/*
* Skip attempting settings on RAID volume disks.
* Other devices on the bus get the normal treatment.
@ -2993,7 +3000,7 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
if (mpt->phydisk_sim && raid_passthru == 0 &&
mpt_is_raid_volume(mpt, tgt) != 0) {
mpt_lprt(mpt, MPT_PRT_NEGOTIATION,
"skipping transfer settings for RAID volumes\n");
"no transfer settings for RAID vols\n");
mpt_set_ccb_status(ccb, CAM_REQ_CMP);
break;
}
@ -3014,9 +3021,6 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
period = 0;
offset = 0;
scsi = &cts->proto_specific.scsi;
spi = &cts->xport_specific.spi;
if ((spi->valid & CTS_SPI_VALID_DISC) != 0) {
dval |= ((spi->flags & CTS_SPI_FLAGS_DISC_ENB) != 0) ?
DP_DISC_ENABLE : DP_DISC_DISABL;
@ -3074,10 +3078,9 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
mpt_set_ccb_status(ccb, CAM_REQ_CMP);
break;
}
mpt_lprt(mpt, MPT_PRT_NEGOTIATION,
"Set Settings[%d]: 0x%x period 0x%x offset %d\n", tgt,
dval, period , offset);
"set [%d]: 0x%x period 0x%x offset %d\n",
tgt, dval, period, offset);
if (mpt_update_spi_config(mpt, tgt)) {
mpt_set_ccb_status(ccb, CAM_REQ_CMP_ERR);
} else {
@ -3088,29 +3091,24 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
}
case XPT_GET_TRAN_SETTINGS:
cts = &ccb->cts;
cts->protocol = PROTO_SCSI;
if (mpt->is_fc) {
struct ccb_trans_settings_fc *fc =
&cts->xport_specific.fc;
cts->protocol = PROTO_SCSI;
cts->protocol_version = SCSI_REV_SPC;
cts->transport = XPORT_FC;
cts->transport_version = 0;
fc->valid = CTS_FC_VALID_SPEED;
fc->bitrate = 100000; /* XXX: Need for 2Gb/s */
/* XXX: need a port database for each target */
fc->bitrate = 100000;
} else if (mpt->is_sas) {
struct ccb_trans_settings_sas *sas =
&cts->xport_specific.sas;
cts->protocol = PROTO_SCSI;
cts->protocol_version = SCSI_REV_SPC2;
cts->transport = XPORT_SAS;
cts->transport_version = 0;
sas->valid = CTS_SAS_VALID_SPEED;
sas->bitrate = 300000; /* XXX: Default 3Gbps */
sas->bitrate = 300000;
} else if (mpt_get_spi_settings(mpt, cts) != 0) {
mpt_set_ccb_status(ccb, CAM_REQ_CMP_ERR);
break;
@ -3141,63 +3139,61 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
cpi->hba_eng_cnt = 0;
cpi->max_target = mpt->mpt_max_devices - 1;
/*
* XXX: FC cards report MAX_DEVICES of 512- but we
* XXX: seem to hang when going higher than 255.
* FC cards report MAX_DEVICES of 512, but
* the MSG_SCSI_IO_REQUEST target id field
* is only 8 bits. Until we fix the driver
* to support 'channels' for bus overflow,
* just limit it.
*/
if (cpi->max_target > 255) {
cpi->max_target = 255;
}
/*
* XXX: VMware ESX reports > 16 devices and then dies
* XXX: when we probe.
* VMware ESX reports > 16 devices and then dies when we probe.
*/
if (mpt->is_spi && cpi->max_target > 15) {
cpi->max_target = 15;
}
cpi->max_lun = 7;
cpi->initiator_id = mpt->mpt_ini_id;
cpi->bus_id = cam_sim_bus(sim);
/*
* Actual speed for each device varies.
*
* The base speed is the speed of the underlying connection.
* This is strictly determined for SPI (async, narrow). If
* link is up for Fibre Channel, then speed can be gotten
* from that.
*/
cpi->protocol = PROTO_SCSI;
if (mpt->is_fc) {
cpi->hba_misc = PIM_NOBUSRESET;
cpi->base_transfer_speed = 100000;
cpi->hba_inquiry = PI_TAG_ABLE;
cpi->transport = XPORT_FC;
cpi->transport_version = 0;
cpi->protocol_version = SCSI_REV_SPC;
} else if (mpt->is_sas) {
cpi->hba_misc = PIM_NOBUSRESET;
cpi->base_transfer_speed = 300000;
cpi->hba_inquiry = PI_TAG_ABLE;
cpi->transport = XPORT_SAS;
cpi->transport_version = 0;
cpi->protocol_version = SCSI_REV_SPC2;
} else {
cpi->hba_misc = PIM_SEQSCAN;
cpi->base_transfer_speed = 3300;
cpi->hba_inquiry = PI_SDTR_ABLE|PI_TAG_ABLE|PI_WIDE_16;
cpi->transport = XPORT_SPI;
cpi->transport_version = 2;
cpi->protocol_version = SCSI_REV_2;
}
cpi->protocol = PROTO_SCSI;
cpi->protocol_version = SCSI_REV_2;
/*
* We give our fake RAID passhtru bus a width that is MaxVolumes
* wide, restrict it to one lun and have it *not* be a bus
* that can have a SCSI bus reset.
* wide and restrict it to one lun.
*/
if (raid_passthru) {
cpi->max_target = mpt->ioc_page2->MaxPhysDisks - 1;
cpi->initiator_id = cpi->max_target + 1;
cpi->max_lun = 0;
cpi->hba_misc |= PIM_NOBUSRESET;
}
if ((mpt->role & MPT_ROLE_INITIATOR) == 0) {
@ -3297,7 +3293,14 @@ mpt_get_spi_settings(struct mpt_softc *mpt, struct ccb_trans_settings *cts)
uint8_t dval, pval, oval;
int rv;
if (xpt_path_sim(cts->ccb_h.path) == mpt->phydisk_sim) {
cts->protocol = PROTO_SCSI;
cts->protocol_version = SCSI_REV_2;
cts->transport = XPORT_SPI;
cts->transport_version = 2;
if (cts->type == CTS_TYPE_USER_SETTINGS) {
tgt = cts->ccb_h.target_id;
} else if (xpt_path_sim(cts->ccb_h.path) == mpt->phydisk_sim) {
if (mpt_map_physdisk(mpt, (union ccb *)cts, &tgt)) {
return (-1);
}
@ -3306,8 +3309,10 @@ mpt_get_spi_settings(struct mpt_softc *mpt, struct ccb_trans_settings *cts)
}
/*
* XXX: We aren't looking Port Page 2 BIOS settings here.
* XXX: For goal settings, we pick the max from port page 0
* We aren't looking at Port Page 2 BIOS settings here-
* sometimes these have been known to be bogus XXX.
*
* For user settings, we pick the max from port page 0
*
* For current settings we read the current settings out from
* device page 0 for that target.
@ -3326,40 +3331,43 @@ mpt_get_spi_settings(struct mpt_softc *mpt, struct ccb_trans_settings *cts)
return (rv);
}
MPTLOCK_2_CAMLOCK(mpt);
mpt_lprt(mpt, MPT_PRT_DEBUG,
"mpt_get_spi_settings[%d]: current NP %x Info %x\n", tgt,
tmp.NegotiatedParameters, tmp.Information);
dval |= (tmp.NegotiatedParameters & MPI_SCSIDEVPAGE0_NP_WIDE) ?
DP_WIDE : DP_NARROW;
dval |= (mpt->mpt_disc_enable & (1 << tgt)) ?
DP_DISC_ENABLE : DP_DISC_DISABL;
dval |= (mpt->mpt_tag_enable & (1 << tgt)) ?
DP_TQING_ENABLE : DP_TQING_DISABL;
oval = (tmp.NegotiatedParameters >> 16) & 0xff;
pval = (tmp.NegotiatedParameters >> 8) & 0xff;
oval = tmp.NegotiatedParameters;
oval &= MPI_SCSIDEVPAGE0_NP_NEG_SYNC_OFFSET_MASK;
oval >>= MPI_SCSIDEVPAGE0_NP_SHIFT_SYNC_OFFSET;
pval = tmp.NegotiatedParameters;
pval &= MPI_SCSIDEVPAGE0_NP_NEG_SYNC_PERIOD_MASK;
pval >>= MPI_SCSIDEVPAGE0_NP_SHIFT_SYNC_PERIOD;
mpt->mpt_dev_page0[tgt] = tmp;
} else {
/*
* XXX: Just make theoretical maximum.
*/
dval = DP_WIDE|DP_DISC_ENABLE|DP_TQING_ENABLE;
oval = (mpt->mpt_port_page0.Capabilities >> 16) & 0xff;
pval = (mpt->mpt_port_page0.Capabilities >> 8) & 0xff;
oval = mpt->mpt_port_page0.Capabilities;
oval = MPI_SCSIPORTPAGE0_CAP_GET_MAX_SYNC_OFFSET(oval);
pval = mpt->mpt_port_page0.Capabilities;
pval = MPI_SCSIPORTPAGE0_CAP_GET_MIN_SYNC_PERIOD(pval);
}
cts->protocol = PROTO_SCSI;
cts->protocol_version = SCSI_REV_2;
cts->transport = XPORT_SPI;
cts->transport_version = 2;
scsi->flags &= ~CTS_SCSI_FLAGS_TAG_ENB;
spi->flags &= ~CTS_SPI_FLAGS_DISC_ENB;
spi->valid = 0;
scsi->valid = 0;
spi->flags = 0;
scsi->flags = 0;
if (dval & DP_DISC_ENABLE) {
spi->flags |= CTS_SPI_FLAGS_DISC_ENB;
}
if (dval & DP_TQING_ENABLE) {
scsi->flags |= CTS_SCSI_FLAGS_TAG_ENB;
}
if (oval && pval) {
if (oval) {
spi->sync_offset = oval;
spi->sync_period = pval;
spi->valid |= CTS_SPI_VALID_SYNC_OFFSET;
}
if (pval) {
spi->sync_period = pval;
spi->valid |= CTS_SPI_VALID_SYNC_RATE;
}
spi->valid |= CTS_SPI_VALID_BUS_WIDTH;
@ -3368,6 +3376,9 @@ mpt_get_spi_settings(struct mpt_softc *mpt, struct ccb_trans_settings *cts)
} else {
spi->bus_width = MSG_EXT_WDTR_BUS_8_BIT;
}
if (dval & DP_TQING_ENABLE) {
scsi->flags |= CTS_SCSI_FLAGS_TAG_ENB;
}
if (cts->ccb_h.target_lun != CAM_LUN_WILDCARD) {
scsi->valid = CTS_SCSI_VALID_TQ;
spi->valid |= CTS_SPI_VALID_DISC;
@ -3375,8 +3386,10 @@ mpt_get_spi_settings(struct mpt_softc *mpt, struct ccb_trans_settings *cts)
scsi->valid = 0;
}
mpt_lprt(mpt, MPT_PRT_NEGOTIATION,
"mpt_get_spi_settings[%d]: %s 0x%x period 0x%x offset %d\n", tgt,
IS_CURRENT_SETTINGS(cts)? "ACTIVE" : "NVRAM ", dval, pval, oval);
"mpt_get_spi_settings[%d]:%s per=%x off=%d SPF=%x SPV=%x SCF=%x SCV"
"=%x bw=%x\n",
tgt, IS_CURRENT_SETTINGS(cts)? "ACTIVE" : "NVRAM ", pval, oval,
spi->flags, spi->valid, scsi->flags, scsi->valid, spi->bus_width);
return (0);
}

View file

@ -792,7 +792,6 @@ mpt_map_physdisk(struct mpt_softc *mpt, union ccb *ccb, u_int *tgt)
mpt_disk = mpt->raid_disks + ccb->ccb_h.target_id;
if (ccb->ccb_h.target_id < mpt->raid_max_disks
&& (mpt_disk->flags & MPT_RDF_ACTIVE) != 0) {
*tgt = mpt_disk->config_page.PhysDiskID;
return (0);
}
@ -808,6 +807,9 @@ mpt_is_raid_volume(struct mpt_softc *mpt, int tgt)
CONFIG_PAGE_IOC_2_RAID_VOL *ioc_vol;
CONFIG_PAGE_IOC_2_RAID_VOL *ioc_last_vol;
if (mpt->ioc_page2 == NULL || mpt->ioc_page2->MaxPhysDisks == 0) {
return (0);
}
ioc_vol = mpt->ioc_page2->RaidVolume;
ioc_last_vol = ioc_vol + mpt->ioc_page2->NumActiveVolumes;
for (;ioc_vol != ioc_last_vol; ioc_vol++) {
@ -1106,36 +1108,83 @@ mpt_announce_vol(struct mpt_softc *mpt, struct mpt_raid_volume *mpt_vol)
for (i = 0; i < vol_pg->NumPhysDisks; i++){
struct mpt_raid_disk *mpt_disk;
CONFIG_PAGE_RAID_PHYS_DISK_0 *disk_pg;
int pt_bus = cam_sim_bus(mpt->phydisk_sim);
U8 f, s;
mpt_disk = mpt->raid_disks
+ vol_pg->PhysDisk[i].PhysDiskNum;
mpt_disk = mpt->raid_disks + vol_pg->PhysDisk[i].PhysDiskNum;
disk_pg = &mpt_disk->config_page;
mpt_prtc(mpt, " ");
mpt_prtc(mpt, "(%s:%d:%d): ", device_get_nameunit(mpt->dev),
disk_pg->PhysDiskBus, disk_pg->PhysDiskID);
if (vol_pg->VolumeType == MPI_RAID_VOL_TYPE_IM)
mpt_prtc(mpt, "%s\n",
mpt_disk->member_number == 0
? "Primary" : "Secondary");
else
mpt_prtc(mpt, "Stripe Position %d\n",
mpt_prtc(mpt, "(%s:%d:%d:0): ", device_get_nameunit(mpt->dev),
pt_bus, disk_pg->PhysDiskID);
if (vol_pg->VolumeType == MPI_RAID_VOL_TYPE_IM) {
mpt_prtc(mpt, "%s", mpt_disk->member_number == 0?
"Primary" : "Secondary");
} else {
mpt_prtc(mpt, "Stripe Position %d",
mpt_disk->member_number);
}
f = disk_pg->PhysDiskStatus.Flags;
s = disk_pg->PhysDiskStatus.State;
if (f & MPI_PHYSDISK0_STATUS_FLAG_OUT_OF_SYNC) {
mpt_prtc(mpt, " Out of Sync");
}
if (f & MPI_PHYSDISK0_STATUS_FLAG_QUIESCED) {
mpt_prtc(mpt, " Quiesced");
}
if (f & MPI_PHYSDISK0_STATUS_FLAG_INACTIVE_VOLUME) {
mpt_prtc(mpt, " Inactive");
}
if (f & MPI_PHYSDISK0_STATUS_FLAG_OPTIMAL_PREVIOUS) {
mpt_prtc(mpt, " Was Optimal");
}
if (f & MPI_PHYSDISK0_STATUS_FLAG_NOT_OPTIMAL_PREVIOUS) {
mpt_prtc(mpt, " Was Non-Optimal");
}
switch (s) {
case MPI_PHYSDISK0_STATUS_ONLINE:
mpt_prtc(mpt, " Online");
break;
case MPI_PHYSDISK0_STATUS_MISSING:
mpt_prtc(mpt, " Missing");
break;
case MPI_PHYSDISK0_STATUS_NOT_COMPATIBLE:
mpt_prtc(mpt, " Incompatible");
break;
case MPI_PHYSDISK0_STATUS_FAILED:
mpt_prtc(mpt, " Failed");
break;
case MPI_PHYSDISK0_STATUS_INITIALIZING:
mpt_prtc(mpt, " Initializing");
break;
case MPI_PHYSDISK0_STATUS_OFFLINE_REQUESTED:
mpt_prtc(mpt, " Requested Offline");
break;
case MPI_PHYSDISK0_STATUS_FAILED_REQUESTED:
mpt_prtc(mpt, " Requested Failed");
break;
case MPI_PHYSDISK0_STATUS_OTHER_OFFLINE:
default:
mpt_prtc(mpt, " Offline Other (%x)", s);
break;
}
mpt_prtc(mpt, "\n");
}
}
static void
mpt_announce_disk(struct mpt_softc *mpt, struct mpt_raid_disk *mpt_disk)
{
CONFIG_PAGE_RAID_PHYS_DISK_0 *disk_pg;
int rd_bus = cam_sim_bus(mpt->sim);
int pt_bus = cam_sim_bus(mpt->phydisk_sim);
u_int i;
disk_pg = &mpt_disk->config_page;
mpt_disk_prt(mpt, mpt_disk,
"Physical (%s:%d:%d), Pass-thru (%s:%d:%d)\n",
device_get_nameunit(mpt->dev), disk_pg->PhysDiskBus,
"Physical (%s:%d:%d:0), Pass-thru (%s:%d:%d:0)\n",
device_get_nameunit(mpt->dev), rd_bus,
disk_pg->PhysDiskID, device_get_nameunit(mpt->dev),
/*bus*/1, mpt_disk - mpt->raid_disks);
pt_bus, mpt_disk - mpt->raid_disks);
if (disk_pg->PhysDiskSettings.HotSparePool == 0)
return;
mpt_disk_prt(mpt, mpt_disk, "Member of Hot Spare Pool%s",
@ -1218,9 +1267,10 @@ mpt_refresh_raid_vol(struct mpt_softc *mpt, struct mpt_raid_volume *mpt_vol,
mpt_disk = mpt->raid_disks + vol_pg->PhysDisk[i].PhysDiskNum;
mpt_disk->volume = mpt_vol;
mpt_disk->member_number = vol_pg->PhysDisk[i].PhysDiskMap;
if (vol_pg->VolumeType == MPI_RAID_VOL_TYPE_IM)
if (vol_pg->VolumeType == MPI_RAID_VOL_TYPE_IM) {
mpt_disk->member_number--;
}
}
if ((vol_pg->VolumeStatus.Flags
& MPI_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS) == 0)