Make some slight reorganization (bringing back in some

non-CAM_NEW_TRAN code) to make diffs to previous FreeBSD
versions more manageable.
This commit is contained in:
Matt Jacob 2006-12-16 07:39:55 +00:00
parent 6cbb70e2cc
commit c3b65db84f

View file

@ -110,6 +110,12 @@ __FBSDID("$FreeBSD$");
#include <sys/callout.h>
#include <sys/kthread.h>
#if __FreeBSD_version >= 700000
#ifndef CAM_NEW_TRAN_CODE
#define CAM_NEW_TRAN_CODE 1
#endif
#endif
static void mpt_poll(struct cam_sim *);
static timeout_t mpt_timeout;
static void mpt_action(struct cam_sim *, union ccb *);
@ -2951,7 +2957,11 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
break;
}
#ifdef CAM_NEW_TRAN_CODE
#define IS_CURRENT_SETTINGS(c) ((c)->type == CTS_TYPE_CURRENT_SETTINGS)
#else
#define IS_CURRENT_SETTINGS(c) ((c)->flags & CCB_TRANS_CURRENT_SETTINGS)
#endif
#define DP_DISC_ENABLE 0x1
#define DP_DISC_DISABL 0x2
#define DP_DISC (DP_DISC_ENABLE|DP_DISC_DISABL)
@ -2968,8 +2978,10 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
case XPT_SET_TRAN_SETTINGS: /* Nexus Settings */
{
#ifdef CAM_NEW_TRAN_CODE
struct ccb_trans_settings_scsi *scsi;
struct ccb_trans_settings_spi *spi;
#endif
uint8_t dval;
u_int period;
u_int offset;
@ -2982,6 +2994,7 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
break;
}
#ifdef CAM_NEW_TRAN_CODE
scsi = &cts->proto_specific.scsi;
spi = &cts->xport_specific.spi;
@ -2992,6 +3005,7 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
mpt_set_ccb_status(ccb, CAM_REQ_CMP);
break;
}
#endif
/*
* Skip attempting settings on RAID volume disks.
@ -3021,6 +3035,28 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
period = 0;
offset = 0;
#ifndef CAM_NEW_TRAN_CODE
if ((cts->valid & CCB_TRANS_DISC_VALID) != 0) {
dval |= (cts->flags & CCB_TRANS_DISC_ENB) ?
DP_DISC_ENABLE : DP_DISC_DISABL;
}
if ((cts->valid & CCB_TRANS_TQ_VALID) != 0) {
dval |= (cts->flags & CCB_TRANS_TAG_ENB) ?
DP_TQING_ENABLE : DP_TQING_DISABL;
}
if ((cts->valid & CCB_TRANS_BUS_WIDTH_VALID) != 0) {
dval |= cts->bus_width ? DP_WIDE : DP_NARROW;
}
if ((cts->valid & CCB_TRANS_SYNC_RATE_VALID) &&
(cts->valid & CCB_TRANS_SYNC_OFFSET_VALID)) {
dval |= DP_SYNC;
period = cts->sync_period;
offset = cts->sync_offset;
}
#else
if ((spi->valid & CTS_SPI_VALID_DISC) != 0) {
dval |= ((spi->flags & CTS_SPI_FLAGS_DISC_ENB) != 0) ?
DP_DISC_ENABLE : DP_DISC_DISABL;
@ -3056,6 +3092,7 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
period &= MPI_SCSIDEVPAGE1_RP_MIN_SYNC_PERIOD_MASK;
period >>= MPI_SCSIDEVPAGE1_RP_SHIFT_MIN_SYNC_PERIOD;
}
#endif
CAMLOCK_2_MPTLOCK(mpt);
if (dval & DP_DISC_ENABLE) {
mpt->mpt_disc_enable |= (1 << tgt);
@ -3091,8 +3128,10 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
}
case XPT_GET_TRAN_SETTINGS:
{
cts = &ccb->cts;
#ifdef CAM_NEW_TRAN_CODE
struct ccb_trans_settings_scsi *scsi;
cts = &ccb->cts;
cts->protocol = PROTO_SCSI;
if (mpt->is_fc) {
struct ccb_trans_settings_fc *fc =
&cts->xport_specific.fc;
@ -3104,24 +3143,38 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
} else if (mpt->is_sas) {
struct ccb_trans_settings_sas *sas =
&cts->xport_specific.sas;
cts->protocol_version = SCSI_REV_SPC2;
cts->transport = XPORT_SAS;
cts->transport_version = 0;
sas->valid = CTS_SAS_VALID_SPEED;
sas->bitrate = 300000;
} else {
cts->protocol_version = SCSI_REV_2;
cts->transport = XPORT_SPI;
cts->transport_version = 2;
if (mpt_get_spi_settings(mpt, cts) != 0) {
mpt_set_ccb_status(ccb, CAM_REQ_CMP_ERR);
} else {
mpt_set_ccb_status(ccb, CAM_REQ_CMP);
break;
}
break;
}
cts->protocol = PROTO_SCSI;
scsi = &cts->proto_specific.scsi;
scsi->valid = CTS_SCSI_VALID_TQ;
scsi->flags = CTS_SCSI_FLAGS_TAG_ENB;
#else
cts = &ccb->cts;
if (mpt->is_fc) {
cts->flags = CCB_TRANS_TAG_ENB | CCB_TRANS_DISC_ENB;
cts->valid = CCB_TRANS_DISC_VALID | CCB_TRANS_TQ_VALID;
cts->bus_width = MSG_EXT_WDTR_BUS_8_BIT;
} else if (mpt->is_sas) {
cts->flags = CCB_TRANS_TAG_ENB | CCB_TRANS_DISC_ENB;
cts->valid = CCB_TRANS_DISC_VALID | CCB_TRANS_TQ_VALID;
cts->bus_width = MSG_EXT_WDTR_BUS_8_BIT;
} else if (mpt_get_spi_settings(mpt, cts) != 0) {
mpt_set_ccb_status(ccb, CAM_REQ_CMP_ERR);
break;
}
#endif
mpt_set_ccb_status(ccb, CAM_REQ_CMP);
break;
}
@ -3296,18 +3349,15 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
static int
mpt_get_spi_settings(struct mpt_softc *mpt, struct ccb_trans_settings *cts)
{
#ifdef CAM_NEW_TRAN_CODE
struct ccb_trans_settings_scsi *scsi = &cts->proto_specific.scsi;
struct ccb_trans_settings_spi *spi = &cts->xport_specific.spi;
#endif
target_id_t tgt;
uint32_t dval, pval, oval;
int rv;
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) {
if (IS_CURRENT_SETTINGS(cts) == 0) {
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)) {
@ -3364,6 +3414,29 @@ mpt_get_spi_settings(struct mpt_softc *mpt, struct ccb_trans_settings *cts)
pval = MPI_SCSIPORTPAGE0_CAP_GET_MIN_SYNC_PERIOD(pval);
}
#ifndef CAM_NEW_TRAN_CODE
cts->flags &= ~(CCB_TRANS_DISC_ENB|CCB_TRANS_TAG_ENB);
cts->valid = 0;
cts->sync_period = pval;
cts->sync_offset = oval;
cts->valid |= CCB_TRANS_SYNC_RATE_VALID;
cts->valid |= CCB_TRANS_SYNC_OFFSET_VALID;
cts->valid |= CCB_TRANS_BUS_WIDTH_VALID;
if (dval & DP_WIDE) {
cts->bus_width = MSG_EXT_WDTR_BUS_16_BIT;
} else {
cts->bus_width = MSG_EXT_WDTR_BUS_8_BIT;
}
if (cts->ccb_h.target_lun != CAM_LUN_WILDCARD) {
cts->valid |= CCB_TRANS_DISC_VALID | CCB_TRANS_TQ_VALID;
if (dval & DP_DISC_ENABLE) {
cts->flags |= CCB_TRANS_DISC_ENB;
}
if (dval & DP_TQING_ENABLE) {
cts->flags |= CCB_TRANS_TAG_ENB;
}
}
#else
spi->valid = 0;
scsi->valid = 0;
spi->flags = 0;
@ -3388,6 +3461,7 @@ mpt_get_spi_settings(struct mpt_softc *mpt, struct ccb_trans_settings *cts)
spi->flags |= CTS_SPI_FLAGS_DISC_ENB;
}
}
#endif
mpt_lprt(mpt, MPT_PRT_NEGOTIATION,
"mpt_get_spi_settings[%d]: %s flags 0x%x per 0x%x off=%d\n", tgt,
IS_CURRENT_SETTINGS(cts)? "ACTIVE" : "NVRAM ", dval, pval, oval);