diff options
author | mjacob <mjacob@FreeBSD.org> | 2006-12-16 07:39:55 +0000 |
---|---|---|
committer | mjacob <mjacob@FreeBSD.org> | 2006-12-16 07:39:55 +0000 |
commit | ea0aa342d9af7069518f2e2afc38c720b512cfde (patch) | |
tree | 8022b82db62b46ea0a60320a5eb48f68b5dffe99 | |
parent | 7327d346fcb113617a486207f206df056b5bd56d (diff) | |
download | FreeBSD-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.c | 98 |
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); |