mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-22 16:29:38 +00:00
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:
parent
3d253c11cf
commit
a54067cc0e
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=164837
|
@ -894,7 +894,7 @@ static int
|
|||
mpt_wait_db_int(struct mpt_softc *mpt)
|
||||
{
|
||||
int i;
|
||||
for (i=0; i < MPT_MAX_WAIT; i++) {
|
||||
for (i = 0; i < MPT_MAX_WAIT; i++) {
|
||||
if (MPT_DB_INTR(mpt_rd_intr(mpt))) {
|
||||
maxwait_int = i > maxwait_int ? i : maxwait_int;
|
||||
return MPT_OK;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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->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->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->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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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,20 +1108,66 @@ 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");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1127,15 +1175,16 @@ 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,8 +1267,9 @@ 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
|
||||
|
|
Loading…
Reference in a new issue