summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorkato <kato@FreeBSD.org>1998-12-28 12:46:55 +0000
committerkato <kato@FreeBSD.org>1998-12-28 12:46:55 +0000
commit790434fad1fdf6cbdc8b4615491194ba5947d4cc (patch)
tree6ddc19b674b6e3166bb2445793daed9c8889b188 /sys
parentea122a9130f80b5565833f6939ff681919cc7337 (diff)
downloadFreeBSD-src-790434fad1fdf6cbdc8b4615491194ba5947d4cc.zip
FreeBSD-src-790434fad1fdf6cbdc8b4615491194ba5947d4cc.tar.gz
CAM support.
Submitted by: NOKUBI Hirotaka <hnokubi@yyy.or.jp> and Takahashi Yoshihiro <nyan@wyvern.cc.kogakuin.ac.jp>
Diffstat (limited to 'sys')
-rw-r--r--sys/i386/isa/bs/bs.c341
-rw-r--r--sys/i386/isa/bs/bsfunc.c70
-rw-r--r--sys/i386/isa/bs/bsfunc.h34
-rw-r--r--sys/i386/isa/bs/bshw.c2
-rw-r--r--sys/i386/isa/bs/bshw.h2
-rw-r--r--sys/i386/isa/bs/bshw_dma.c2
-rw-r--r--sys/i386/isa/bs/bsif.c75
-rw-r--r--sys/i386/isa/bs/bsif.h23
-rw-r--r--sys/i386/isa/bs/bsvar.h97
-rw-r--r--sys/i386/isa/ccbque.h14
10 files changed, 362 insertions, 298 deletions
diff --git a/sys/i386/isa/bs/bs.c b/sys/i386/isa/bs/bs.c
index fc54385..1f93746 100644
--- a/sys/i386/isa/bs/bs.c
+++ b/sys/i386/isa/bs/bs.c
@@ -39,21 +39,30 @@
#include <i386/isa/bs/bsif.h>
#endif
+#include <cam/cam.h>
+#include <cam/cam_ccb.h>
+#include <cam/cam_sim.h>
+#include <cam/cam_xpt_sim.h>
+#include <cam/cam_debug.h>
+
+#include <cam/scsi/scsi_all.h>
+#include <cam/scsi/scsi_message.h>
+
/*****************************************************************
* Inline phase funcs
*****************************************************************/
/* static inline declare */
static BS_INLINE struct targ_info *bs_reselect __P((struct bs_softc *));
-static BS_INLINE void bs_sat_continue __P((struct bs_softc *, struct targ_info *, struct ccb *));
-static BS_INLINE struct targ_info *bs_selected __P((struct bs_softc *, struct targ_info *, struct ccb *));
+static BS_INLINE void bs_sat_continue __P((struct bs_softc *, struct targ_info *, struct bsccb *));
+static BS_INLINE struct targ_info *bs_selected __P((struct bs_softc *, struct targ_info *, struct bsccb *));
static BS_INLINE u_int8_t bs_read_1byte __P((struct bs_softc *));
static BS_INLINE void bs_write_1byte __P((struct bs_softc *, u_int8_t));
-static BS_INLINE void bs_commandout __P((struct bs_softc *, struct targ_info *, struct ccb *));
+static BS_INLINE void bs_commandout __P((struct bs_softc *, struct targ_info *, struct bsccb *));
static BS_INLINE void bs_status_check __P((struct bs_softc *, struct targ_info *));
static BS_INLINE void bs_msgin __P((struct bs_softc *, struct targ_info *));
-static BS_INLINE void bs_msgout __P((struct bs_softc *, struct targ_info *, struct ccb *));
-static BS_INLINE void bs_disconnect_phase __P((struct bs_softc *, struct targ_info *, struct ccb *));
-static void bs_phase_error __P((struct targ_info *, struct ccb *));
+static BS_INLINE void bs_msgout __P((struct bs_softc *, struct targ_info *, struct bsccb *));
+static BS_INLINE void bs_disconnect_phase __P((struct bs_softc *, struct targ_info *, struct bsccb *));
+static void bs_phase_error __P((struct targ_info *, struct bsccb *));
static int bs_scsi_cmd_poll_internal __P((struct targ_info *));
static int bs_xfer __P((struct bs_softc *, char *, int));
static void bs_io_xfer __P((struct targ_info *));
@@ -64,99 +73,153 @@ static void bs_msg_reject __P((struct targ_info *));
static void bshoststart __P((struct bs_softc *, struct targ_info *));
/*****************************************************************
- * Julian scsi interface
+ * SIM interface
*****************************************************************/
-XSBS_INT32T
-bs_scsi_cmd(xs)
- struct scsi_xfer *xs;
+void
+bs_scsi_cmd(struct cam_sim *sim, union ccb *ccb)
{
- struct bs_softc *bsc = (struct bs_softc *) xs->sc_link->adapter_softc;
- int s, target = (u_int) (xs->sc_link->target);
+ struct bs_softc *bsc = (struct bs_softc *) cam_sim_softc(sim);
+ int s, target = (u_int) (ccb->ccb_h.target_id);
struct targ_info *ti;
- struct ccb *cb;
- u_int flags = xs->flags;
-
- if (xs->bp == NULL && (bsc->sc_openf & (1 << target)) == 0)
- {
- s = splbio();
- xs->error = XS_DRIVER_STUFFUP;
- xs->flags |= XSBS_ITSDONE;
- scsi_done(xs);
- splx(s);
- return COMPLETE;
- }
-
- ti = bsc->sc_ti[target];
- if ((cb = bs_get_ccb(flags & XSBS_SCSI_NOSLEEP)) == NULL)
- return TRY_AGAIN_LATER;
-
- /* make up ccb! */
- cb->xs = xs;
- cb->lun = xs->sc_link->lun;
- cb->cmd = (u_int8_t *) xs->cmd;
- cb->cmdlen = (int) xs->cmdlen;
- cb->data = (u_int8_t *) xs->data;
- cb->datalen = (int) xs->datalen;
- cb->rcnt = 0;
- cb->msgoutlen = 0;
- cb->flags = (flags & XSBS_SCSI_POLL) ? BSFORCEIOPOLL : 0;
- bs_targ_flags(ti, cb);
- cb->tcmax = (xs->timeout >> 10);
- if (cb->tcmax < BS_DEFAULT_TIMEOUT_SECOND)
- cb->tcmax = BS_DEFAULT_TIMEOUT_SECOND;
-
-#ifdef BS_ADDRESS_CHECK
- /* XXX:
- * Sanity check, however this is critical!
- * NetBSD 1.0: WRONG
- * NetBSD 1.1: OK
- * FreeBSD: WRONG
- */
- if ((caddr_t) cb->data < (caddr_t) KERNBASE)
- {
- u_int8_t *altbp;
-
- altbp = (u_int8_t *) malloc(cb->datalen, M_DEVBUF, M_NOWAIT);
- if (altbp == NULL)
- {
- bs_free_ccb(cb);
- return TRY_AGAIN_LATER;
+ struct bsccb *cb;
+
+ switch (ccb->ccb_h.func_code) {
+ case XPT_SCSI_IO: /* Execute the requested I/O operation */
+ ti = bsc->sc_ti[target];
+ if ((cb = bs_get_ccb()) == NULL) {
+ ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
+ xpt_done(ccb);
+ return;
}
- if (flags & SCSI_DATA_OUT)
- bcopy(cb->data, altbp, cb->datalen);
- else
- bzero(altbp, cb->datalen);
-
- cb->data = (u_int8_t *) altbp;
- cb->flags |= BSALTBUF;
- }
-#endif /* BS_ADDRESS_CHECK */
+ /* make up ccb! */
+ cb->ccb = ccb;
+ cb->lun = ccb->ccb_h.target_lun;
+ cb->cmd = ccb->csio.cdb_io.cdb_bytes;
+ cb->cmdlen = (int) ccb->csio.cdb_len;
+ cb->data = ccb->csio.data_ptr;
+ cb->datalen = (int) ccb->csio.dxfer_len;
+ cb->rcnt = 0;
+ cb->msgoutlen = 0;
+ cb->bsccb_flags = 0;
+ bs_targ_flags(ti, cb);
+ cb->tcmax = 0;/*(xs->timeout >> 10); default HN2*/
+ if (cb->tcmax < BS_DEFAULT_TIMEOUT_SECOND)
+ cb->tcmax = BS_DEFAULT_TIMEOUT_SECOND;
- s = splbio();
+ s = splbio();
- TAILQ_INSERT_TAIL(&ti->ti_ctab, cb, ccb_chain);
+ TAILQ_INSERT_TAIL(&ti->ti_ctab, cb, ccb_chain);
- if (ti->ti_phase == FREE)
- {
- if (ti->ti_state == BS_TARG_START)
- {
- if ((flags & XSBS_SCSI_POLL) == 0)
+ if (ti->ti_phase == FREE) {
+ if (ti->ti_state == BS_TARG_START)
bs_start_syncmsg(ti, NULL, BS_SYNCMSG_ASSERT);
+ bscmdstart(ti, BSCMDSTART);
}
- bscmdstart(ti, BSCMDSTART);
- }
- if ((flags & XSBS_SCSI_POLL) == 0)
- {
splx(s);
- return SUCCESSFULLY_QUEUED;
+ break;
+ case XPT_RESET_DEV: /* Bus Device Reset the specified SCSI device */
+ case XPT_EN_LUN: /* Enable LUN as a target */
+ case XPT_TARGET_IO: /* Execute target I/O request */
+ case XPT_ACCEPT_TARGET_IO: /* Accept Host Target Mode CDB */
+ case XPT_CONT_TARGET_IO: /* Continue Host Target I/O Connection*/
+ case XPT_ABORT: /* Abort the specified CCB */
+ /* XXX Implement */
+ ccb->ccb_h.status = CAM_REQ_INVALID;
+ xpt_done(ccb);
+ break;
+ case XPT_SET_TRAN_SETTINGS:
+ /* XXX Implement */
+ ccb->ccb_h.status = CAM_FUNC_NOTAVAIL;
+ xpt_done(ccb);
+ break;
+ case XPT_GET_TRAN_SETTINGS: {
+ struct ccb_trans_settings *cts;
+ struct targ_info *ti;
+ /*int s;*/
+
+ cts = &ccb->cts;
+ ti = bsc->sc_ti[ccb->ccb_h.target_id];
+ /*s = splcam();*/
+ if ((cts->flags & CCB_TRANS_USER_SETTINGS) != 0) {
+ if (ti->ti_cfgflags & BS_SCSI_DISC)
+ cts->flags = CCB_TRANS_DISC_ENB;
+ else
+ cts->flags = 0;
+ if (ti->ti_cfgflags & BS_SCSI_QTAG)
+ cts->flags |= CCB_TRANS_TAG_ENB;
+ cts->sync_period = ti->ti_syncnow.period;
+ cts->sync_offset = ti->ti_syncnow.offset;
+ cts->bus_width = 0;/*HN2*/
+
+ cts->valid = CCB_TRANS_SYNC_RATE_VALID
+ | CCB_TRANS_SYNC_OFFSET_VALID
+ | CCB_TRANS_BUS_WIDTH_VALID
+ | CCB_TRANS_DISC_VALID
+ | CCB_TRANS_TQ_VALID;
+ ccb->ccb_h.status = CAM_REQ_CMP;
+ } else
+ ccb->ccb_h.status = CAM_FUNC_NOTAVAIL;
+
+ /*splx(s);*/
+ xpt_done(ccb);
+ break;
+ }
+ case XPT_CALC_GEOMETRY: { /* not yet HN2 */
+ struct ccb_calc_geometry *ccg;
+ u_int32_t size_mb;
+ u_int32_t secs_per_cylinder;
+
+ ccg = &ccb->ccg;
+ size_mb = ccg->volume_size
+ / ((1024L * 1024L) / ccg->block_size);
+
+ ccg->heads = 8;
+ ccg->secs_per_track = 34;
+
+ secs_per_cylinder = ccg->heads * ccg->secs_per_track;
+ ccg->cylinders = ccg->volume_size / secs_per_cylinder;
+ ccb->ccb_h.status = CAM_REQ_CMP;
+ xpt_done(ccb);
+ break;
+ }
+ case XPT_RESET_BUS: /* Reset the specified SCSI bus */
+ bshw_chip_reset(bsc); /* XXX need perfect RESET? */
+ ccb->ccb_h.status = CAM_REQ_CMP;
+ xpt_done(ccb);
+ break;
+ case XPT_TERM_IO: /* Terminate the I/O process */
+ /* XXX Implement */
+ ccb->ccb_h.status = CAM_REQ_INVALID;
+ xpt_done(ccb);
+ break;
+ case XPT_PATH_INQ: { /* Path routing inquiry */
+ struct ccb_pathinq *cpi = &ccb->cpi;
+
+ cpi->version_num = 1; /* XXX??? */
+ cpi->hba_inquiry = PI_SDTR_ABLE;
+ cpi->target_sprt = 0;
+ cpi->hba_misc = 0;
+ cpi->hba_eng_cnt = 0;
+ cpi->max_target = NTARGETS - 1;
+ cpi->max_lun = 7;
+ cpi->initiator_id = bsc->sc_hostid;
+ cpi->bus_id = cam_sim_bus(sim);
+ strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN);
+ strncpy(cpi->hba_vid, "NEC", HBA_IDLEN);
+ strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN);
+ cpi->unit_number = cam_sim_unit(sim);
+ cpi->ccb_h.status = CAM_REQ_CMP;
+ xpt_done(ccb);
+ break;
+ }
+ default:
+/*printf("bs: non support func_code = %d ", ccb->ccb_h.func_code);*/
+ ccb->ccb_h.status = CAM_REQ_INVALID;
+ xpt_done(ccb);
+ break;
}
-
- bs_scsi_cmd_poll(ti, cb);
- splx(s);
-
- return COMPLETE;
}
/**************************************************
@@ -170,7 +233,7 @@ bscmdstart(ti, flags)
struct targ_info *ti;
int flags;
{
- struct ccb *cb;
+ struct bsccb *cb;
struct bs_softc *bsc = ti->ti_bsc;
if ((cb = ti->ti_ctab.tqh_first) == NULL)
@@ -186,9 +249,9 @@ bscmdstart(ti, flags)
ti->ti_scsp.datalen = cb->datalen;
ti->ti_scsp.seglen = 0;
if (cb->rcnt)
- cb->flags &= ~(BSSAT | BSLINK);
+ cb->bsccb_flags &= ~(BSSAT | BSLINK);
ti->ti_flags &= ~BSCFLAGSMASK;
- ti->ti_flags |= cb->flags & BSCFLAGSMASK;
+ ti->ti_flags |= cb->bsccb_flags & BSCFLAGSMASK;
cb->tc = cb->tcmax;
/* GO GO */
@@ -211,13 +274,13 @@ bscmdstart(ti, flags)
return 1;
}
-struct ccb *
+struct bsccb *
bscmddone(ti)
struct targ_info *ti;
{
struct bs_softc *bsc = ti->ti_bsc;
- struct ccb *cb = ti->ti_ctab.tqh_first;
- struct scsi_xfer *xs;
+ struct bsccb *cb = ti->ti_ctab.tqh_first;
+ union ccb *ccb;
int error;
if (ti->ti_state == BS_TARG_SYNCH)
@@ -233,12 +296,12 @@ bscmddone(ti)
do
{
- xs = cb->xs;
- error = XS_NOERROR;
+ ccb = cb->ccb;
+ error = CAM_REQ_CMP;
- if (cb->flags & (BSITSDONE | BSSENSECCB | BSCASTAT))
+ if (cb->bsccb_flags & (BSITSDONE | BSSENSECCB | BSCASTAT))
{
- if (cb->flags & BSSENSECCB)
+ if (cb->bsccb_flags & BSSENSECCB)
{
cb->error &= ~BSDMAABNORMAL;
if (cb->error == 0)
@@ -246,18 +309,17 @@ bscmddone(ti)
ti->ti_flags |= BSERROROK;
}
- else if (cb->flags & BSCASTAT)
+ else if (cb->bsccb_flags & BSCASTAT)
{
if (ti->ti_flags & BSCASTAT)
{
ti->ti_flags &= ~BSCASTAT;
- error = XS_SENSE;
- if (xs)
- xs->sense = ti->sense;
+ error = CAM_AUTOSNS_VALID|CAM_SCSI_STATUS_ERROR;
+ if (ccb)
+ ccb->csio.sense_data = ti->sense;/* XXX may not be csio.... */
}
else
- error = XS_DRIVER_STUFFUP;
-
+ error = CAM_AUTOSENSE_FAIL;
ti->ti_flags |= BSERROROK;
} else
bs_panic(bsc, "internal error");
@@ -271,11 +333,11 @@ bscmddone(ti)
if (cb->rcnt >= bsc->sc_retry || (cb->error & BSFATALIO))
{
if (cb->error & (BSSELTIMEOUT | BSTIMEOUT))
- error = XS_TIMEOUT;
+ error = CAM_CMD_TIMEOUT;
else if (cb->error & BSTARGETBUSY)
- error = XS_BUSY;
+ error = CAM_SCSI_STATUS_ERROR;
else
- error = XS_DRIVER_STUFFUP;
+ error = CAM_REQ_CMP_ERR;
break;
}
@@ -283,7 +345,7 @@ bscmddone(ti)
{
/* must clear the target's sense state */
cb->rcnt++;
- cb->flags |= (BSITSDONE | BSCASTAT);
+ cb->bsccb_flags |= (BSITSDONE | BSCASTAT);
cb->error &= ~BSREQSENSE;
return bs_request_sense(ti);
}
@@ -295,16 +357,15 @@ bscmddone(ti)
cb->error &= ~BSDMAABNORMAL;
continue;
}
-
- if ((xs && xs->bp) || (cb->error & BSSELTIMEOUT) == 0)
+ if (/*(xs && xs->bp) || can't know whether bufferd i/o or not */
+ (cb->error & BSSELTIMEOUT) == 0)
bs_debug_print(bsc, ti);
-
cb->rcnt++;
return cb;
}
#ifdef BS_DIAG
- cb->flags |= BSITSDONE;
+ cb->bsccb_flags |= BSITSDONE;
#endif /* BS_DIAG */
if (bsc->sc_poll)
{
@@ -315,28 +376,18 @@ bscmddone(ti)
TAILQ_REMOVE(&ti->ti_ctab, cb, ccb_chain);
- if (xs)
+ if (ccb)
{
-#ifdef BS_ADDRESS_CHECK
- if (cb->flags & BSALTBUF)
- {
- if (xs->flags & SCSI_DATA_IN)
- bcopy(cb->data, xs->data, cb->datalen);
- free(cb->data, M_DEVBUF);
- }
-#endif /* BS_ADDRESS_CHECK */
-
- if ((xs->error = error) == XS_NOERROR)
- xs->resid = 0;
- xs->flags |= XSBS_ITSDONE;
- scsi_done(xs);
+ ccb->ccb_h.status = error;
+ ccb->csio.scsi_status = ti->ti_status;/*XXX*/
+ xpt_done(ccb);
}
bs_free_ccb(cb);
cb = ti->ti_ctab.tqh_first;
}
- while (cb != NULL && (cb->flags & BSITSDONE) != 0);
+ while (cb != NULL && (cb->bsccb_flags & BSITSDONE) != 0);
/* complete */
return NULL;
@@ -353,7 +404,7 @@ bshoststart(bsc, ti)
struct bs_softc *bsc;
struct targ_info *ti;
{
- struct ccb *cb;
+ struct bsccb *cb;
int s;
if (bsc->sc_flags & BSINACTIVE)
@@ -376,7 +427,7 @@ again:
}
#ifdef BS_DIAG
- if (cb->flags & BSITSDONE)
+ if (cb->bsccb_flags & BSITSDONE)
bs_panic(bsc, "bshoststart: already done");
if (bsc->sc_nexus || (ti->ti_flags & BSNEXUS))
@@ -495,7 +546,7 @@ static BS_INLINE struct targ_info *
bs_selected(bsc, ti, cb)
struct bs_softc *bsc;
struct targ_info *ti;
- struct ccb *cb;
+ struct bsccb *cb;
{
if (bsc->sc_busstat != BSR_SELECTED)
@@ -587,7 +638,7 @@ static BS_INLINE void
bs_sat_continue(bsc, ti, cb)
struct bs_softc *bsc;
struct targ_info *ti;
- struct ccb *cb;
+ struct bsccb *cb;
{
BS_SETUP_PHASE(SATRESEL);
@@ -720,7 +771,7 @@ static BS_INLINE void
bs_commandout(bsc, ti, cb)
struct bs_softc *bsc;
struct targ_info *ti;
- struct ccb *cb;
+ struct bsccb *cb;
{
u_int8_t scsi_cmd[16];
int len;
@@ -780,7 +831,7 @@ bs_quick_abort(ti, msg)
struct targ_info *ti;
u_int msg;
{
- struct ccb *cb;
+ struct bsccb *cb;
if ((cb = ti->ti_ctab.tqh_first) == NULL)
return;
@@ -816,7 +867,7 @@ bs_msgin_ext(ti)
struct targ_info *ti;
{
struct bs_softc *bsc = ti->ti_bsc;
- struct ccb *cb = ti->ti_ctab.tqh_first;
+ struct bsccb *cb = ti->ti_ctab.tqh_first;
int count;
u_int reqlen;
u_int32_t *ptr;
@@ -889,14 +940,14 @@ bs_msg_reject(ti)
struct targ_info *ti;
{
struct bs_softc *bsc = ti->ti_bsc;
- struct ccb *cb = ti->ti_ctab.tqh_first;
+ struct bsccb *cb = ti->ti_ctab.tqh_first;
char *s = "unexpected msg reject";
switch (ti->ti_ophase)
{
case CMDPHASE:
s = "cmd rejected";
- cb->flags &= ~BSLINK;
+ cb->bsccb_flags &= ~BSLINK;
BS_SETUP_MSGPHASE(IOCOMPLETED);
break;
@@ -904,7 +955,7 @@ bs_msg_reject(ti)
if (ti->ti_msgout & 0x80)
{
s = "identify msg rejected";
- cb->flags &= ~BSDISC;
+ cb->bsccb_flags &= ~BSDISC;
BS_SETUP_MSGPHASE(IOCOMPLETED);
}
else if (ti->ti_msgout == MSG_EXTEND)
@@ -1039,7 +1090,7 @@ static BS_INLINE void
bs_msgout(bsc, ti, cb)
struct bs_softc *bsc;
struct targ_info *ti;
- struct ccb *cb;
+ struct bsccb *cb;
{
u_int8_t msg[MAXMSGLEN + 1];
@@ -1114,7 +1165,7 @@ static BS_INLINE void
bs_disconnect_phase(bsc, ti, cb)
struct bs_softc *bsc;
struct targ_info *ti;
- struct ccb *cb;
+ struct bsccb *cb;
{
switch (bsc->sc_msgphase)
@@ -1186,7 +1237,7 @@ struct bs_err bs_cmderr[] = {
static void
bs_phase_error(ti, cb)
struct targ_info *ti;
- struct ccb *cb;
+ struct bsccb *cb;
{
struct bs_softc *bsc = ti->ti_bsc;
struct bs_err *pep;
@@ -1242,13 +1293,13 @@ bs_phase_error(ti, cb)
/**************************************************
* ### SCSI PHASE SEQUENCER ###
**************************************************/
-static BS_INLINE void bs_ack_wait __P((struct bs_softc *, struct targ_info *, struct ccb *));
+static BS_INLINE void bs_ack_wait __P((struct bs_softc *, struct targ_info *, struct bsccb *));
static BS_INLINE void
bs_ack_wait(bsc, ti, cb)
struct bs_softc *bsc;
struct targ_info *ti;
- struct ccb *cb;
+ struct bsccb *cb;
{
int wc = bsc->sc_wc;
@@ -1287,7 +1338,7 @@ bs_sequencer(bsc)
struct bs_softc *bsc;
{
register struct targ_info *ti;
- struct ccb *cb;
+ struct bsccb *cb;
/**************************************************
* Check reset
@@ -1372,7 +1423,7 @@ bs_sequencer(bsc)
default:
/* XXX:
- * check check check for safty !!
+ * check check check for safety !!
*/
if (bsc->sc_selwait)
{
@@ -1531,7 +1582,7 @@ bs_scsi_cmd_poll_internal(cti)
{
struct bs_softc *bsc = cti->ti_bsc;
struct targ_info *ti;
- struct ccb *cb;
+ struct bsccb *cb;
int i, waits, delay_count;
bsc->sc_poll++;
@@ -1550,7 +1601,7 @@ bs_scsi_cmd_poll_internal(cti)
{
ti->ti_flags |= BSFORCEIOPOLL;
if ((cb = ti->ti_ctab.tqh_first) != NULL)
- cb->flags |= BSFORCEIOPOLL;
+ cb->bsccb_flags |= BSFORCEIOPOLL;
}
}
@@ -1579,7 +1630,7 @@ bs_scsi_cmd_poll_internal(cti)
int
bs_scsi_cmd_poll(cti, targetcb)
struct targ_info *cti;
- struct ccb *targetcb;
+ struct bsccb *targetcb;
{
struct bs_softc *bsc = cti->ti_bsc;
struct targ_info *ti;
diff --git a/sys/i386/isa/bs/bsfunc.c b/sys/i386/isa/bs/bsfunc.c
index 47dfe84..c92b706 100644
--- a/sys/i386/isa/bs/bsfunc.c
+++ b/sys/i386/isa/bs/bsfunc.c
@@ -51,7 +51,7 @@ int bs_debug_flag = 0;
static void bs_print_syncmsg __P((struct targ_info *, char*));
static void bs_timeout_target __P((struct targ_info *));
-static void bs_kill_msg __P((struct ccb *cb));
+static void bs_kill_msg __P((struct bsccb *cb));
static int bs_start_target __P((struct targ_info *));
static int bs_check_target __P((struct targ_info *));
@@ -59,8 +59,8 @@ static int bs_check_target __P((struct targ_info *));
/*************************************************************
* CCB
************************************************************/
-GENERIC_CCB_STATIC_ALLOC(bs, ccb)
-GENERIC_CCB(bs, ccb, ccb_chain)
+GENERIC_CCB_STATIC_ALLOC(bs, bsccb)
+GENERIC_CCB(bs, bsccb, ccb_chain)
/*************************************************************
* TIMEOUT
@@ -87,7 +87,7 @@ bstimeout(arg)
{
struct bs_softc *bsc = (struct bs_softc *) arg;
struct targ_info *ti;
- struct ccb *cb;
+ struct bsccb *cb;
int s;
s = splbio();
@@ -126,7 +126,7 @@ bstimeout(arg)
*************************************************/
static u_int8_t cmd_unit_ready[6];
-struct ccb *
+struct bsccb *
bs_make_internal_ccb(ti, lun, cmd, cmdlen, data, datalen, flags, timeout)
struct targ_info *ti;
u_int lun;
@@ -137,19 +137,19 @@ bs_make_internal_ccb(ti, lun, cmd, cmdlen, data, datalen, flags, timeout)
u_int flags;
int timeout;
{
- struct ccb *cb;
+ struct bsccb *cb;
- if ((cb = bs_get_ccb(XSBS_SCSI_NOSLEEP)) == NULL)
+ if ((cb = bs_get_ccb()) == NULL)
bs_panic(ti->ti_bsc, "can not get ccb mem");
- cb->xs = NULL;
+ cb->ccb = NULL;
cb->lun = lun;
cb->cmd = (cmd ? cmd : cmd_unit_ready);
cb->cmdlen = (cmd ? cmdlen : sizeof(cmd_unit_ready));
cb->data = data;
cb->datalen = (data ? datalen : 0);
cb->msgoutlen = 0;
- cb->flags = flags & BSCFLAGSMASK;
+ cb->bsccb_flags = flags & BSCFLAGSMASK;
bs_targ_flags(ti, cb);
cb->rcnt = 0;
cb->tcmax = (timeout > BS_DEFAULT_TIMEOUT_SECOND ? timeout :
@@ -160,11 +160,11 @@ bs_make_internal_ccb(ti, lun, cmd, cmdlen, data, datalen, flags, timeout)
return cb;
}
-struct ccb *
+struct bsccb *
bs_make_msg_ccb(ti, lun, cb, msg, timex)
struct targ_info *ti;
u_int lun;
- struct ccb *cb;
+ struct bsccb *cb;
struct msgbase *msg;
u_int timex;
{
@@ -175,7 +175,7 @@ bs_make_msg_ccb(ti, lun, cb, msg, timex)
cb = bs_make_internal_ccb(ti, lun, NULL, 0, NULL, 0,
flags, timex);
else
- cb->flags |= flags & BSCFLAGSMASK;
+ cb->bsccb_flags |= flags & BSCFLAGSMASK;
cb->msgoutlen = msg->msglen;
bcopy(msg->msg, cb->msgout, msg->msglen);
@@ -189,7 +189,7 @@ bs_send_msg(ti, lun, msg, timex)
struct msgbase *msg;
int timex;
{
- struct ccb *cb;
+ struct bsccb *cb;
cb = bs_make_msg_ccb(ti, lun, NULL, msg, timex);
bscmdstart(ti, BSCMDSTART);
@@ -198,7 +198,7 @@ bs_send_msg(ti, lun, msg, timex)
static void
bs_kill_msg(cb)
- struct ccb *cb;
+ struct bsccb *cb;
{
cb->msgoutlen = 0;
}
@@ -206,11 +206,11 @@ bs_kill_msg(cb)
/**************************************************
* MAKE SENSE CCB
**************************************************/
-struct ccb *
+struct bsccb *
bs_request_sense(ti)
struct targ_info *ti;
{
- struct ccb *cb;
+ struct bsccb *cb;
bzero(ti->scsi_cmd, sizeof(struct scsi_sense));
bzero(&ti->sense, sizeof(struct scsi_sense_data));
@@ -223,7 +223,7 @@ bs_request_sense(ti)
sizeof(struct scsi_sense_data),
BSFORCEIOPOLL,
BS_DEFAULT_TIMEOUT_SECOND);
- cb->flags |= BSSENSECCB;
+ cb->bsccb_flags |= BSSENSECCB;
return cb;
}
@@ -234,7 +234,7 @@ bs_request_sense(ti)
int
bs_start_syncmsg(ti, cb, flag)
struct targ_info *ti;
- struct ccb *cb;
+ struct bsccb *cb;
int flag;
{
struct syncdata *negp, *maxp;
@@ -308,7 +308,7 @@ bs_print_syncmsg(ti, s)
int
bs_analyze_syncmsg(ti, cb)
struct targ_info *ti;
- struct ccb *cb;
+ struct bsccb *cb;
{
struct bs_softc *bsc = ti->ti_bsc;
u_int8_t ans = ti->ti_syncnow.state;
@@ -411,13 +411,13 @@ bs_reset_device(ti)
}
/* send abort msg */
-struct ccb *
+struct bsccb *
bs_force_abort(ti)
struct targ_info *ti;
{
struct bs_softc *bsc = ti->ti_bsc;
struct msgbase msg;
- struct ccb *cb = ti->ti_ctab.tqh_first;
+ struct bsccb *cb = ti->ti_ctab.tqh_first;
u_int lun;
if (cb)
@@ -523,7 +523,7 @@ bs_reset_nexus(bsc)
struct bs_softc *bsc;
{
struct targ_info *ti;
- struct ccb *cb;
+ struct bsccb *cb;
bsc->sc_flags &= ~(BSRESET | BSUNDERRESET);
if (bsc->sc_poll)
@@ -575,7 +575,7 @@ bs_reset_nexus(bsc)
for ( ; cb; cb = cb->ccb_chain.tqe_next)
{
bs_kill_msg(cb);
- cb->flags &= ~(BSITSDONE | BSCASTAT);
+ cb->bsccb_flags &= ~(BSITSDONE | BSCASTAT);
cb->error = 0;
}
@@ -597,19 +597,15 @@ static int
bs_start_target(ti)
struct targ_info *ti;
{
- struct ccb *cb;
- struct scsi_start_stop cmd;
+ struct bsccb *cb;
+ struct scsi_start_stop_unit cmd;
- bzero(&cmd, sizeof(struct scsi_start_stop));
-#ifdef __NetBSD__
+ bzero(&cmd, sizeof(struct scsi_start_stop_unit));
cmd.opcode = START_STOP;
-#else
- cmd.op_code = START_STOP;
-#endif
cmd.how = SSS_START;
ti->ti_lun = 0;
cb = bs_make_internal_ccb(ti, 0, (u_int8_t *) &cmd,
- sizeof(struct scsi_start_stop),
+ sizeof(struct scsi_start_stop_unit),
NULL, 0, BSFORCEIOPOLL, BS_MOTOR_TIMEOUT);
bscmdstart(ti, BSCMDSTART);
return bs_scsi_cmd_poll(ti, cb);
@@ -623,7 +619,7 @@ bs_check_target(ti)
struct bs_softc *bsc = ti->ti_bsc;
struct scsi_inquiry scsi_cmd;
struct scsi_inquiry_data scsi_inquiry_data;
- struct ccb *cb;
+ struct bsccb *cb;
int count, retry = bsc->sc_retry;
int s, error = COMPLETE;
@@ -633,11 +629,7 @@ bs_check_target(ti)
/* inquiry */
bzero(&scsi_cmd, sizeof(scsi_cmd));
-#ifdef __NetBSD__
scsi_cmd.opcode = INQUIRY;
-#else
- scsi_cmd.op_code = INQUIRY;
-#endif
scsi_cmd.length = sizeof(struct scsi_inquiry_data);
cb = bs_make_internal_ccb(ti, 0,
(u_int8_t *) &scsi_cmd, sizeof(scsi_cmd),
@@ -662,7 +654,7 @@ bs_check_target(ti)
goto done;
}
- if (cb->flags & BSCASTAT)
+ if (cb->bsccb_flags & BSCASTAT)
bs_printf(ti, "check", "could not clear CA state");
ti->ti_error = 0;
@@ -897,7 +889,7 @@ bs_debug_print(bsc, ti)
struct bs_softc *bsc;
struct targ_info *ti;
{
- struct ccb *cb;
+ struct bsccb *cb;
/* host stat */
printf("%s <DEBUG INFO> nexus %lx bs %lx bus status %lx \n",
@@ -921,7 +913,7 @@ bs_debug_print(bsc, ti)
sp->datalen, (u_long) sp->data, sp->seglen);
if (cb)
printf("odatalen %x flags %x\n",
- cb->datalen, cb->flags);
+ cb->datalen, cb->bsccb_flags);
else
printf("\n");
printf("error flags %b\n", ti->ti_error, BSERRORBITS);
diff --git a/sys/i386/isa/bs/bsfunc.h b/sys/i386/isa/bs/bsfunc.h
index 5658a27..13c0686 100644
--- a/sys/i386/isa/bs/bsfunc.h
+++ b/sys/i386/isa/bs/bsfunc.h
@@ -44,22 +44,22 @@ struct targ_info *bs_init_target_info __P((struct bs_softc *, int));
/* msg op */
int bs_send_msg __P((struct targ_info *, u_int, struct msgbase *, int));
-struct ccb *bs_request_sense __P((struct targ_info *));
+struct bsccb *bs_request_sense __P((struct targ_info *));
/* sync msg op */
-int bs_start_syncmsg __P((struct targ_info *, struct ccb *, int));
+int bs_start_syncmsg __P((struct targ_info *, struct bsccb *, int));
int bs_send_syncmsg __P((struct targ_info *));
-int bs_analyze_syncmsg __P((struct targ_info *, struct ccb *));
+int bs_analyze_syncmsg __P((struct targ_info *, struct bsccb *));
/* reset device */
void bs_scsibus_start __P((struct bs_softc *));
void bs_reset_nexus __P((struct bs_softc *));
-struct ccb *bs_force_abort __P((struct targ_info *));
+struct bsccb *bs_force_abort __P((struct targ_info *));
void bs_reset_device __P((struct targ_info *));
/* ccb */
-struct ccb *bs_make_internal_ccb __P((struct targ_info *, u_int, u_int8_t *, u_int, u_int8_t *, u_int, u_int, int));
-struct ccb *bs_make_msg_ccb __P((struct targ_info *, u_int, struct ccb *, struct msgbase *, u_int));
+struct bsccb *bs_make_internal_ccb __P((struct targ_info *, u_int, u_int8_t *, u_int, u_int8_t *, u_int, u_int, int));
+struct bsccb *bs_make_msg_ccb __P((struct targ_info *, u_int, struct bsccb *, struct msgbase *, u_int));
/* misc funcs */
void bs_printf __P((struct targ_info *, char *, char *));
@@ -77,9 +77,9 @@ void bs_debug_print __P((struct bs_softc *, struct targ_info *));
static BS_INLINE int bs_check_sat __P((struct targ_info *));
static BS_INLINE int bs_check_smit __P((struct targ_info *));
static BS_INLINE int bs_check_disc __P((struct targ_info *));
-static BS_INLINE int bs_check_link __P((struct targ_info *, struct ccb *));
+static BS_INLINE int bs_check_link __P((struct targ_info *, struct bsccb *));
static BS_INLINE u_int8_t bs_identify_msg __P((struct targ_info *));
-static BS_INLINE void bs_targ_flags __P((struct targ_info *, struct ccb *));
+static BS_INLINE void bs_targ_flags __P((struct targ_info *, struct bsccb *));
static BS_INLINE int
bs_check_disc(ti)
@@ -108,13 +108,13 @@ bs_check_smit(ti)
static BS_INLINE int
bs_check_link(ti, cb)
struct targ_info *ti;
- struct ccb *cb;
+ struct bsccb *cb;
{
- struct ccb *nextcb;
+ struct bsccb *nextcb;
return ((ti->ti_flags & BSLINK) &&
(nextcb = cb->ccb_chain.tqe_next) &&
- (nextcb->flags & BSLINK));
+ (nextcb->bsccb_flags & BSLINK));
}
static BS_INLINE u_int8_t
@@ -128,17 +128,17 @@ bs_identify_msg(ti)
static BS_INLINE void
bs_targ_flags(ti, cb)
struct targ_info *ti;
- struct ccb *cb;
+ struct bsccb *cb;
{
u_int cmf = (u_int) bshw_cmd[cb->cmd[0]];
- cb->flags |= ((cmf & (BSSAT | BSSMIT | BSLINK)) | BSDISC);
- cb->flags &= ti->ti_mflags;
+ cb->bsccb_flags |= ((cmf & (BSSAT | BSSMIT | BSLINK)) | BSDISC);
+ cb->bsccb_flags &= ti->ti_mflags;
if (cb->datalen < DEV_BSIZE)
- cb->flags &= ~BSSMIT;
- if (cb->flags & BSFORCEIOPOLL)
- cb->flags &= ~(BSLINK | BSSMIT | BSSAT | BSDISC);
+ cb->bsccb_flags &= ~BSSMIT;
+ if (cb->bsccb_flags & BSFORCEIOPOLL)
+ cb->bsccb_flags &= ~(BSLINK | BSSMIT | BSSAT | BSDISC);
}
/**************************************************
diff --git a/sys/i386/isa/bs/bshw.c b/sys/i386/isa/bs/bshw.c
index 9b66569..2cfe064 100644
--- a/sys/i386/isa/bs/bshw.c
+++ b/sys/i386/isa/bs/bshw.c
@@ -385,7 +385,7 @@ bshw_setup_ctrl_reg(bsc, flags)
void
bshw_issue_satcmd(bsc, cb, link)
struct bs_softc *bsc;
- struct ccb *cb;
+ struct bsccb *cb;
int link;
{
int i;
diff --git a/sys/i386/isa/bs/bshw.h b/sys/i386/isa/bs/bshw.h
index 384cb0b..8c69843 100644
--- a/sys/i386/isa/bs/bshw.h
+++ b/sys/i386/isa/bs/bshw.h
@@ -97,7 +97,7 @@ int bshw_board_probe __P((struct bs_softc *, u_int *, u_int *));
void bshw_lock __P((struct bs_softc *));
void bshw_unlock __P((struct bs_softc *));
void bshw_get_syncreg __P((struct bs_softc *));
-void bshw_issue_satcmd __P((struct bs_softc *, struct ccb *, int));
+void bshw_issue_satcmd __P((struct bs_softc *, struct bsccb *, int));
void bshw_print_port __P((struct bs_softc *));
void bs_lc_smit_xfer __P((struct targ_info *, u_int));
diff --git a/sys/i386/isa/bs/bshw_dma.c b/sys/i386/isa/bs/bshw_dma.c
index b3683f6..5b32de7 100644
--- a/sys/i386/isa/bs/bshw_dma.c
+++ b/sys/i386/isa/bs/bshw_dma.c
@@ -101,7 +101,7 @@ bs_dma_xfer(ti, direction)
/* setup segaddr */
sp->segaddr = (u_int8_t *) phys;
/* setup seglen */
- endva = (vm_offset_t)round_page(sp->data + sp->datalen);
+ endva = (vm_offset_t)round_page((unsigned long)(sp->data + sp->datalen));
for (va = (vm_offset_t) sp->data; ; phys = nphys)
{
if ((va += BSHW_NBPG) >= endva)
diff --git a/sys/i386/isa/bs/bsif.c b/sys/i386/isa/bs/bsif.c
index fc02971..948d3b6 100644
--- a/sys/i386/isa/bs/bsif.c
+++ b/sys/i386/isa/bs/bsif.c
@@ -42,6 +42,15 @@
#include <i386/isa/bs/bsif.h>
#endif /* __FreeBSD__ */
+#include <cam/cam.h>
+#include <cam/cam_ccb.h>
+#include <cam/cam_sim.h>
+#include <cam/cam_xpt_sim.h>
+#include <cam/cam_debug.h>
+
+#include <cam/scsi/scsi_all.h>
+#include <cam/scsi/scsi_message.h>
+
/**************************************************
* DEVICE DECLARE
**************************************************/
@@ -69,8 +78,9 @@ struct scsi_adapter pc98texa55bs = {
#ifdef __FreeBSD__
static int bsprobe __P((struct isa_device *));
-static int bsattach __P((struct isa_device *));
-static inthand2_t bsintr;
+static void bs_poll(struct cam_sim *sim);
+static int bsattach(struct isa_device *);
+static ointhand2_t bsintr;
static int bsprint __P((void *, const char *));
static void bs_scsi_minphys __P((struct buf *));
static int bs_dmarangecheck __P((caddr_t, unsigned));
@@ -80,7 +90,7 @@ struct isa_driver bsdriver = {
bsattach,
"bs"
};
-
+#if 0
struct scsi_device bs_dev = {
NULL, /* Use default error handler */
NULL, /* have a queue, served by this */
@@ -89,14 +99,14 @@ struct scsi_device bs_dev = {
"bs",
0, {0, 0}
};
-
+#endif
u_int32_t
bs_adapter_info(unit)
int unit;
{
return (1);
}
-
+#if 0
static struct scsi_adapter pc98texa55bs = {
bs_scsi_cmd,
bs_scsi_minphys,
@@ -105,7 +115,7 @@ static struct scsi_adapter pc98texa55bs = {
bs_adapter_info,
"bs", {0, 0}
};
-
+#endif
static u_short pc98_irq_ball[16] = {
IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,
IRQ8, IRQ9, IRQ10, IRQ11, IRQ12, IRQ13, IRQ14, IRQ15
@@ -213,6 +223,12 @@ bsprint(aux, name)
}
#ifdef __FreeBSD__
+static void
+bs_poll(struct cam_sim *sim)
+{
+ bs_sequencer(cam_sim_softc(sim));
+}
+
static int
bsattach(dev)
struct isa_device *dev;
@@ -220,28 +236,37 @@ bsattach(dev)
int unit = dev->id_unit;
struct bs_softc *bsc = bscdata[unit];
struct scsibus_data *scbus;
+ struct cam_devq *devq;
dev->id_ointr = bsintr;
- bsc->sc_link.adapter_unit = unit;
- bsc->sc_link.adapter_targ = bsc->sc_hostid;
- bsc->sc_link.flags = SDEV_BOUNCE;
- bsc->sc_link.opennings = XSMAX;
- bsc->sc_link.adapter_softc = bsc;
- bsc->sc_link.adapter = &pc98texa55bs;
- bsc->sc_link.device = &bs_dev;
/*
- * Prepare the scsibus_data area for the upperlevel
- * scsi code.
+ * CAM support HN2 MAX_START, MAX_TAGS xxxx
*/
- scbus = scsi_alloc_bus();
- if (!scbus)
+ devq = cam_simq_alloc(256/*MAX_START*/);
+ if (devq == NULL)
return 0;
- scbus->adapter_link = &bsc->sc_link;
- /*
- * ask the adapter what subunits are present
- */
- scsi_attachdevs(scbus);
+
+ bsc->sim = cam_sim_alloc(bs_scsi_cmd, bs_poll, "bs",
+ bsc, unit, 1, 32/*MAX_TAGS*/, devq);
+ if (bsc->sim == NULL) {
+ cam_simq_free(devq);
+ return 0;
+ }
+
+ if (xpt_bus_register(bsc->sim, 0) != CAM_SUCCESS) {
+ free(bsc->sim, M_DEVBUF);
+ return 0;
+ }
+
+ if (xpt_create_path(&bsc->path, /*periph*/NULL,
+ cam_sim_path(bsc->sim), CAM_TARGET_WILDCARD,
+ CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
+ xpt_bus_deregister(cam_sim_path(bsc->sim));
+ cam_sim_free(bsc->sim, /*free_simq*/TRUE);
+ free(bsc->sim, M_DEVBUF);
+ return 0;
+ }
bs_start_timeout(bsc);
return 1;
}
@@ -278,7 +303,7 @@ bs_scsi_minphys(bp)
bp->b_bcount = BSDMABUFSIZ;
minphys(bp);
}
-
+#if 0
XSBS_INT32T
bs_target_open(sc, cf)
struct scsi_link *sc;
@@ -298,7 +323,7 @@ bs_target_open(sc, cf)
bs_setup_ctrl(ti, (u_int)sc->quirks, flags);
return 0;
}
-
+#endif
/*****************************************************************
* BS MEMORY ALLOCATION INTERFACE
*****************************************************************/
@@ -361,7 +386,7 @@ static int bs_dmarangecheck(caddr_t va, unsigned length)
{
vm_offset_t phys, priorpage = 0, endva;
- endva = (vm_offset_t)round_page(va+length);
+ endva = (vm_offset_t)round_page((unsigned long)(va+length));
for (; va < (caddr_t)endva; va += PAGE_SIZE) {
phys = trunc_page(pmap_extract(pmap_kernel(), (vm_offset_t)va));
if (phys == 0)
diff --git a/sys/i386/isa/bs/bsif.h b/sys/i386/isa/bs/bsif.h
index 478944f..0c63478 100644
--- a/sys/i386/isa/bs/bsif.h
+++ b/sys/i386/isa/bs/bsif.h
@@ -117,9 +117,11 @@
#include <machine/ipl.h>
#include <machine/dvcfg.h>
-#include <scsi/scsi_all.h>
-#include <scsi/scsiconf.h>
-#include <scsi/scsi_disk.h>
+#include <cam/scsi/scsi_all.h>
+#if 0
+#include <cam/scsi/scsiconf.h>
+#endif
+#include <cam/scsi/scsi_da.h>
#include <pc98/pc98/pc98.h>
#include <i386/isa/isa_device.h>
@@ -173,8 +175,8 @@
* xs flags's abstraction (all currently used)
***************************************************/
#define XSBS_ITSDONE ITSDONE
-#define XSBS_SCSI_NOSLEEP SCSI_NOSLEEP
#ifdef __NetBSD__
+#define XSBS_SCSI_NOSLEEP SCSI_NOSLEEP
#define XSBS_SCSI_POLL SCSI_POLL
#endif /* __NetBSD__ */
#ifdef __FreeBSD__
@@ -182,20 +184,17 @@
#endif /* __FreeBSD__ */
/***************************************************
- * Special operations
- ***************************************************/
-#ifdef __FreeBSD__
-#define BS_ADDRESS_CHECK
-#endif /* __FreeBSD__ */
-
-/***************************************************
* declare
***************************************************/
/* (I) common declare */
void bs_alloc_buf __P((struct targ_info *));
+#ifdef __NetBSD__
XSBS_INT32T bs_target_open __P((struct scsi_link *, struct cfdata *));
XSBS_INT32T bs_scsi_cmd __P((struct scsi_xfer *));
-
+#endif
+#ifdef __FreeBSD__
+void bs_scsi_cmd(struct cam_sim *sim, union ccb *ccb);
+#endif
extern int delaycount;
/* (II) os depend declare */
diff --git a/sys/i386/isa/bs/bsvar.h b/sys/i386/isa/bs/bsvar.h
index 9167c2d..9eea57a 100644
--- a/sys/i386/isa/bs/bsvar.h
+++ b/sys/i386/isa/bs/bsvar.h
@@ -92,7 +92,7 @@
* PARAMETER
**************************************************/
#define NTARGETS 8
-#define RETRIES 4 /* number of retries before giving up */
+#define RETRIES 0 /* number of retries before giving up */
#define HARDRETRIES 3
#define XSMAX 4
#define BSDMABUFSIZ 0x10000
@@ -240,7 +240,7 @@ struct sc_p {
#define BSERRORBITS "\020\014busy\013abnormal\012retry\011msgerr\010fatal\007seltimeout\006sense\005timeout\004statuserr\003parity\002cmderr\001dmaerr"
-/* ccb & targ_info flags & cmd flags*/
+/* bsccb bsccb_flags & targ_info flags & cmd flags*/
#define BSREAD 0x0001
#define BSSAT 0x0002
#define BSLINK 0x0004
@@ -258,14 +258,14 @@ struct sc_p {
#define BSCFLAGSMASK (0xffff)
-struct ccb {
- TAILQ_ENTRY(ccb) ccb_chain;
+struct bsccb {
+ TAILQ_ENTRY(bsccb) ccb_chain;
- struct scsi_xfer *xs; /* upper drivers info */
+ union ccb *ccb; /* upper drivers info */
u_int lun; /* lun */
- u_int flags; /* control flags */
+ u_int bsccb_flags; /* control flags */
int rcnt; /* retry counter of this ccb */
@@ -290,75 +290,75 @@ struct ccb {
int tcmax;
};
-GENERIC_CCB_ASSERT(bs, ccb)
+GENERIC_CCB_ASSERT(bs, bsccb)
/* target info */
struct targ_info {
- TAILQ_ENTRY(targ_info) ti_tchain; /* targ_info link */
+/*0*/ TAILQ_ENTRY(targ_info) ti_tchain; /* targ_info link */
- TAILQ_ENTRY(targ_info) ti_wchain; /* wait link */
+/*4*/ TAILQ_ENTRY(targ_info) ti_wchain; /* wait link */
- struct bs_softc *ti_bsc; /* our controller */
- u_int ti_id; /* scsi id */
- u_int ti_lun; /* current lun */
+/*8*/ struct bs_softc *ti_bsc; /* our controller */
+/*c*/ u_int ti_id; /* scsi id */
+/*10*/ u_int ti_lun; /* current lun */
- struct ccbtab ti_ctab, ti_bctab; /* ccb */
+/*14*/ struct bsccbtab ti_ctab, ti_bctab; /* ccb */
#define BS_TARG_NULL 0
#define BS_TARG_CTRL 1
#define BS_TARG_START 2
#define BS_TARG_SYNCH 3
#define BS_TARG_RDY 4
- int ti_state; /* target state */
+/*24*/ int ti_state; /* target state */
- u_int ti_cfgflags; /* target cfg flags */
+/*28*/ u_int ti_cfgflags; /* target cfg flags */
- u_int ti_flags; /* flags */
- u_int ti_mflags; /* flags masks */
+/*2c*/ u_int ti_flags; /* flags */
+/*30*/ u_int ti_mflags; /* flags masks */
- u_int ti_error; /* error flags */
- u_int ti_herrcnt; /* hardware err retry counter */
+/*34*/ u_int ti_error; /* error flags */
+/*38*/ u_int ti_herrcnt; /* hardware err retry counter */
/*****************************************
* scsi phase data
*****************************************/
- struct sc_p ti_scsp; /* saved scsi data pointer */
+/*3c*/ struct sc_p ti_scsp; /* saved scsi data pointer */
- enum scsi_phase ti_phase; /* scsi phase */
- enum scsi_phase ti_ophase; /* previous scsi phase */
+/*50*/ enum scsi_phase ti_phase; /* scsi phase */
+/*54*/ enum scsi_phase ti_ophase; /* previous scsi phase */
- u_int8_t ti_status; /* status in */
+/*58*/ u_int8_t ti_status; /* status in */
- u_int8_t ti_msgin[MAXMSGLEN]; /* msgin buffer */
- int ti_msginptr;
+/*59*/ u_int8_t ti_msgin[MAXMSGLEN]; /* msgin buffer */
+/*64*/ int ti_msginptr;
- u_int8_t ti_msgout; /* last msgout byte */
- u_int8_t ti_emsgout; /* last msgout byte */
- u_int ti_omsgoutlen; /* for retry msgout */
+/*68*/ u_int8_t ti_msgout; /* last msgout byte */
+/*69*/ u_int8_t ti_emsgout; /* last msgout byte */
+/*6c*/ u_int ti_omsgoutlen; /* for retry msgout */
- struct syncdata ti_syncmax; /* synch data (scsi) */
- struct syncdata ti_syncnow;
- u_int8_t ti_sync; /* synch val (chip) */
+/*70*/ struct syncdata ti_syncmax; /* synch data (scsi) */
+/*72*/ struct syncdata ti_syncnow;
+/*74*/ u_int8_t ti_sync; /* synch val (chip) */
/*****************************************
* bounce buffer & smit data pointer
*****************************************/
- u_int8_t *bounce_phys;
- u_int8_t *bounce_addr;
- u_int bounce_size;
+/*75*/ u_int8_t *bounce_phys;
+/*76*/ u_int8_t *bounce_addr;
+/*78*/ u_int bounce_size;
- u_long sm_offset;
+/*7c*/ u_long sm_offset;
/*****************************************
* target inq data
*****************************************/
- u_int8_t targ_type;
- u_int8_t targ_support;
+/*79*/ u_int8_t targ_type;
+/*7a*/ u_int8_t targ_support;
/*****************************************
* generic scsi cmd buffer for this target
*****************************************/
- u_int8_t scsi_cmd[12];
+/*7b*/ u_int8_t scsi_cmd[12];
struct scsi_sense_data sense;
};
@@ -371,8 +371,6 @@ struct bs_softc {
*****************************************/
OS_DEPEND_DEVICE_HEADER
- OS_DEPEND_SCSI_HEADER
-
OS_DEPEND_MISC_HEADER
/*****************************************
@@ -433,7 +431,7 @@ struct bs_softc {
u_int sc_wc; /* weight count */
int sc_poll;
- struct ccb *sc_outccb;
+ struct bsccb *sc_outccb;
/*****************************************
* wd33c93 chip depend section
@@ -462,6 +460,12 @@ struct bs_softc {
*****************************************/
#define BS_DVNAME_LEN 16
u_char sc_dvname[BS_DVNAME_LEN];
+
+ /*****************************************
+ * CAM support
+ *****************************************/
+ struct cam_sim *sim;
+ struct cam_path *path;
};
/*************************************************
@@ -496,10 +500,10 @@ extern int bs_debug_flag;
/*************************************************
* Function declare
*************************************************/
-int bs_scsi_cmd_internal __P((struct ccb *, u_int));
-struct ccb *bscmddone __P((struct targ_info *));
+int bs_scsi_cmd_internal __P((struct bsccb *, u_int));
+struct bsccb *bscmddone __P((struct targ_info *));
int bscmdstart __P((struct targ_info *, int));
-int bs_scsi_cmd_poll __P((struct targ_info *, struct ccb *));
+int bs_scsi_cmd_poll __P((struct targ_info *, struct bsccb *));
int bs_sequencer __P((struct bs_softc *));
void bs_poll_timeout __P((struct bs_softc *, char *));
@@ -507,8 +511,9 @@ void bs_poll_timeout __P((struct bs_softc *, char *));
* XXX
*************************************************/
/* misc error */
-#define NOTARGET -2
-#define HASERROR -1
+#define COMPLETE 2
+#define NOTARGET (-2)
+#define HASERROR (-1)
/* XXX: use scsi_message.h */
/* status */
diff --git a/sys/i386/isa/ccbque.h b/sys/i386/isa/ccbque.h
index 7530068..0d9eeec 100644
--- a/sys/i386/isa/ccbque.h
+++ b/sys/i386/isa/ccbque.h
@@ -36,7 +36,6 @@
#define _CCBQUE_H_
#define CCB_MWANTED 0x01
-#define CCB_WOK(fl) (((fl) == 0) ? M_WAITOK : M_NOWAIT)
/* (I) structure and prototype */
#define GENERIC_CCB_ASSERT(DEV, CCBTYPE) \
@@ -49,7 +48,7 @@ struct CCBTYPE##que { \
}; \
\
void DEV##_init_ccbque __P((int)); \
-struct CCBTYPE *DEV##_get_ccb __P((int)); \
+struct CCBTYPE *DEV##_get_ccb __P((void)); \
void DEV##_free_ccb __P((register struct CCBTYPE *));
/* (II) static allocated memory */
@@ -69,8 +68,7 @@ DEV##_init_ccbque(count) \
} \
\
struct CCBTYPE * \
-DEV##_get_ccb(flags) \
- int flags; \
+DEV##_get_ccb() \
{ \
register struct CCBTYPE *cb; \
int s = splbio(); \
@@ -87,7 +85,7 @@ again: \
} \
else \
{ \
- cb = malloc(sizeof(*cb), M_DEVBUF, CCB_WOK(flags));\
+ cb = malloc(sizeof(*cb), M_DEVBUF, M_NOWAIT); \
if (cb != NULL) \
{ \
bzero(cb, sizeof(*cb)); \
@@ -97,12 +95,6 @@ again: \
CCBTYPE##que.count --; \
} \
\
- if (flags == 0) \
- { \
- CCBTYPE##que.flags |= CCB_MWANTED; \
- tsleep((caddr_t) &CCBTYPE##que.count, PRIBIO, "ccbwait", 0);\
- goto again; \
- } \
cb = NULL; \
\
out: \
OpenPOWER on IntegriCloud