summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormjacob <mjacob@FreeBSD.org>2006-12-16 07:39:55 +0000
committermjacob <mjacob@FreeBSD.org>2006-12-16 07:39:55 +0000
commitea0aa342d9af7069518f2e2afc38c720b512cfde (patch)
tree8022b82db62b46ea0a60320a5eb48f68b5dffe99
parent7327d346fcb113617a486207f206df056b5bd56d (diff)
downloadFreeBSD-src-ea0aa342d9af7069518f2e2afc38c720b512cfde.zip
FreeBSD-src-ea0aa342d9af7069518f2e2afc38c720b512cfde.tar.gz
Make some slight reorganization (bringing back in some
non-CAM_NEW_TRAN code) to make diffs to previous FreeBSD versions more manageable.
-rw-r--r--sys/dev/mpt/mpt_cam.c98
1 files changed, 86 insertions, 12 deletions
diff --git a/sys/dev/mpt/mpt_cam.c b/sys/dev/mpt/mpt_cam.c
index 5fb04f9..7f2ae9e 100644
--- a/sys/dev/mpt/mpt_cam.c
+++ b/sys/dev/mpt/mpt_cam.c
@@ -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);
OpenPOWER on IntegriCloud