esiop_cmd
if (esiop_cmd->cmd_tables->msg_in[2] == MSG_EXT_WDTR) {
switch (siop_wdtr_neg(&esiop_cmd->cmd_c)) {
esiop_cmd->cmd_c.siop_target);
esiop_table_sync(esiop_cmd,
esiop_cmd->cmd_c.siop_target);
if (esiop_cmd->cmd_tables->msg_in[2] == MSG_EXT_SDTR) {
switch (siop_sdtr_neg(&esiop_cmd->cmd_c)) {
esiop_cmd->cmd_c.siop_target);
esiop_table_sync(esiop_cmd,
esiop_cmd->cmd_c.siop_target);
esiop_cmd->cmd_tables->msg_out[0] = MSG_MESSAGE_REJECT;
esiop_cmd->cmd_tables->t_msgout.count = htole32(1);
esiop_table_sync(esiop_cmd,
siop_sdp(&esiop_cmd->cmd_c, offset);
ESIOP_XFER(esiop_cmd, saved_offset) =
esiop_table_sync(esiop_cmd,
(u_long)esiop_cmd->cmd_c.dsa,
le32toh(esiop_cmd->cmd_tables->id),
esiop_cmd->cmd_tables->msg_in[0],
le32toh(esiop_cmd->cmd_tables->status));
esiop_cmd->cmd_c.status = CMDST_DONE;
xs->status = le32toh(esiop_cmd->cmd_tables->status);
ESIOP_XFER(esiop_cmd, saved_offset) != htole32(SIOP_NOOFFSET))
(le32toh(ESIOP_XFER(esiop_cmd, saved_offset)) >> 8) & 0xff;
esiop_scsicmd_end(esiop_cmd, offset);
esiop_scsicmd_end(struct esiop_cmd *esiop_cmd, int offset)
struct scsipi_xfer *xs = esiop_cmd->cmd_c.xs;
struct esiop_softc *sc = (struct esiop_softc *)esiop_cmd->cmd_c.siop_sc;
siop_update_resid(&esiop_cmd->cmd_c, offset);
xs->xs_periph->periph_lun, esiop_cmd->cmd_c.tag);
esiop_cmd->cmd_c.dmamap_data, 0,
esiop_cmd->cmd_c.dmamap_data->dm_mapsize,
esiop_cmd->cmd_c.dmamap_data);
bus_dmamap_unload(sc->sc_c.sc_dmat, esiop_cmd->cmd_c.dmamap_cmd);
esiop_cmd->cmd_c.status = CMDST_FREE;
TAILQ_INSERT_TAIL(&sc->free_list, esiop_cmd, next);
struct esiop_cmd *esiop_cmd;
esiop_cmd = (tag >= 0) ? esiop_lun->tactive[tag] : esiop_lun->active;
if (esiop_cmd == NULL) {
esiop_table_sync(esiop_cmd,
status = le32toh(esiop_cmd->cmd_tables->status);
esiop_cmd->cmd_c.xs->status = status;
if (ESIOP_XFER(esiop_cmd, saved_offset) != htole32(SIOP_NOOFFSET))
(le32toh(ESIOP_XFER(esiop_cmd, saved_offset)) >> 8) & 0xff;
esiop_scsicmd_end(esiop_cmd, offset);
struct esiop_cmd *esiop_cmd;
esiop_cmd = esiop_lun->tactive[tag];
if (slotdsa == esiop_cmd->cmd_c.dsa) { /* found it */
esiop_cmd->cmd_c.dsa | A_f_cmd_ignore);
esiop_cmd->cmd_c.xs->error = XS_REQUEUE;
esiop_cmd->cmd_c.xs->status = SCSI_SIOP_NOCHECK;
esiop_scsicmd_end(esiop_cmd, 0);
esiop_handle_qtag_reject(struct esiop_cmd *esiop_cmd)
struct esiop_softc *sc = (struct esiop_softc *)esiop_cmd->cmd_c.siop_sc;
int target = esiop_cmd->cmd_c.xs->xs_periph->periph_target;
int lun = esiop_cmd->cmd_c.xs->xs_periph->periph_lun;
int tag = esiop_cmd->cmd_tables->msg_out[2];
esiop_cmd->cmd_c.tag, esiop_cmd->cmd_c.status);
esiop_lun->active = esiop_cmd;
esiop_cmd->cmd_c.flags &= ~CMDFL_TAG;
esiop_cmd->cmd_c.tag = -1;
esiop_cmd->cmd_c.dsa);
struct esiop_cmd *esiop_cmd;
esiop_cmd = esiop_lun->tactive[tag];
esiop_cmd = esiop_lun->active;
if (esiop_cmd == NULL)
esiop_cmd->cmd_c.xs->xs_periph);
esiop_cmd->cmd_c.xs->error =
(esiop_cmd->cmd_c.flags & CMDFL_TIMEOUT) ?
esiop_cmd->cmd_c.xs->status = SCSI_SIOP_NOCHECK;
esiop_cmd->cmd_c.status = CMDST_DONE;
esiop_scsicmd_end(esiop_cmd, 0);
struct esiop_cmd *esiop_cmd;
esiop_cmd = TAILQ_FIRST(&sc->free_list);
if (esiop_cmd == NULL) {
TAILQ_REMOVE(&sc->free_list, esiop_cmd, next);
if (esiop_cmd->cmd_c.status != CMDST_FREE)
esiop_cmd, next);
esiop_cmd, next);
esiop_cmd->cmd_c.siop_target = sc->sc_c.targets[target];
esiop_cmd->cmd_c.xs = xs;
esiop_cmd->cmd_c.flags = 0;
esiop_cmd->cmd_c.status = CMDST_READY;
esiop_cmd->cmd_c.dmamap_cmd,
esiop_cmd->cmd_c.status = CMDST_FREE;
TAILQ_INSERT_TAIL(&sc->free_list, esiop_cmd, next);
esiop_cmd->cmd_c.dmamap_data, xs->data, xs->datalen,
esiop_cmd->cmd_c.dmamap_cmd);
esiop_cmd->cmd_c.status = CMDST_FREE;
esiop_cmd, next);
esiop_cmd->cmd_c.dmamap_data, 0,
esiop_cmd->cmd_c.dmamap_data->dm_mapsize,
bus_dmamap_sync(sc->sc_c.sc_dmat, esiop_cmd->cmd_c.dmamap_cmd,
0, esiop_cmd->cmd_c.dmamap_cmd->dm_mapsize,
esiop_cmd->cmd_c.tag = xs->xs_tag_id;
esiop_cmd->cmd_c.tag = -1;
siop_setuptables(&esiop_cmd->cmd_c);
ESIOP_XFER(esiop_cmd, saved_offset) = htole32(SIOP_NOOFFSET);
ESIOP_XFER(esiop_cmd, tlq) = htole32(A_f_c_target | A_f_c_lun);
ESIOP_XFER(esiop_cmd, tlq) |=
if (esiop_cmd->cmd_c.flags & CMDFL_TAG) {
ESIOP_XFER(esiop_cmd, tlq) |= htole32(A_f_c_tag);
ESIOP_XFER(esiop_cmd, tlq) |=
htole32(esiop_cmd->cmd_c.tag << 24);
esiop_table_sync(esiop_cmd,
esiop_start(sc, esiop_cmd);
esiop_start(struct esiop_softc *sc, struct esiop_cmd *esiop_cmd)
esiop_cmd->cmd_c.xs->error = XS_REQUEUE;
esiop_cmd->cmd_c.xs->status = SCSI_SIOP_NOCHECK;
esiop_scsicmd_end(esiop_cmd, 0);
target = esiop_cmd->cmd_c.xs->xs_periph->periph_target;
lun = esiop_cmd->cmd_c.xs->xs_periph->periph_lun;
if (esiop_cmd->cmd_c.flags & CMDFL_TAG) {
if (esiop_cmd->cmd_c.tag >= ESIOP_NTAG ||
esiop_cmd->cmd_c.tag < 0) {
scsipi_printaddr(esiop_cmd->cmd_c.xs->xs_periph);
printf(": tag id %d\n", esiop_cmd->cmd_c.tag);
if (esiop_lun->tactive[esiop_cmd->cmd_c.tag] != NULL)
(u_long)esiop_cmd->cmd_c.dsa);
if (esiop_cmd->cmd_c.status == CMDST_READY)
esiop_cmd->cmd_c.status = CMDST_ACTIVE;
if (esiop_cmd->cmd_c.flags & CMDFL_TAG) {
esiop_lun->tactive[esiop_cmd->cmd_c.tag] = esiop_cmd;
esiop_lun->lun_tagtbl->tbl[esiop_cmd->cmd_c.tag] =
htole32(esiop_cmd->cmd_c.dsa);
esiop_lun->active = esiop_cmd;
esiop_cmd->cmd_c.dsa);
esiop_cmd->cmd_c.dsa);
if ((esiop_cmd->cmd_c.xs->xs_control & XS_CTL_POLL) == 0) {
timeout = mstohz(esiop_cmd->cmd_c.xs->timeout);
callout_reset( &esiop_cmd->cmd_c.xs->xs_callout,
timeout, esiop_timeout, esiop_cmd);
struct esiop_cmd *esiop_cmd = v;
(struct esiop_softc *)esiop_cmd->cmd_c.siop_sc;
esiop_table_sync(esiop_cmd,
scsipi_printaddr(esiop_cmd->cmd_c.xs->xs_periph);
le32toh(esiop_cmd->cmd_tables->status));
scsipi_print_cdb(esiop_cmd->cmd_c.xs->cmd);
callout_stop(&esiop_cmd->cmd_c.xs->xs_callout);
esiop_cmd->cmd_c.flags |= CMDFL_TIMEOUT;
newcbd->cmds = malloc(sizeof(struct esiop_cmd) * SIOP_NCMDPB,
esiop_cmd->cmd_c.dsa, \
struct esiop_cmd *esiop_cmd;
esiop_cmd =
if (esiop_cmd == NULL) {
xs = esiop_cmd->cmd_c.xs;
if (esiop_cmd->cmd_c.status != CMDST_ACTIVE) {
esiop_cmd->cmd_c.status);
esiop_table_sync(esiop_cmd,
esiop_cmd = NULL;
if (esiop_cmd)
target, lun, tag, esiop_cmd->cmd_tables->msg_in[0],
le32toh(esiop_cmd->cmd_tables->status));
if (esiop_cmd)
if (esiop_cmd) {
SIOP_DSA, esiop_cmd->cmd_c.dsa);
siop_ma(&esiop_cmd->cmd_c);
siop_ma(&esiop_cmd->cmd_c);
if (esiop_cmd)
if (esiop_cmd) {
esiop_cmd->cmd_c.status = CMDST_DONE;
if (esiop_cmd) {
esiop_cmd->cmd_tables->status =
if (esiop_cmd) {
esiop_cmd->cmd_c.status = CMDST_DONE;
void esiop_scsicmd_end(struct esiop_cmd *, int);
if (esiop_cmd == NULL) {
if (esiop_cmd->cmd_c.status != CMDST_ACTIVE) {
int esiop_handle_qtag_reject(struct esiop_cmd *);
irqcode, esiop_cmd->cmd_c.status);
static void esiop_start(struct esiop_softc *, struct esiop_cmd *);
if (esiop_cmd->cmd_tables->msg_out[0] & 0x80) {
esiop_cmd->cmd_tables->msg_out[1];
esiop_cmd->cmd_tables->msg_out[3];
esiop_cmd->cmd_tables->msg_out[0];
esiop_cmd->cmd_tables->msg_out[2];
siop_sdtr_msg(&esiop_cmd->cmd_c, 0,
esiop_table_sync(esiop_cmd,
esiop_cmd) == -1)
esiop_cmd->cmd_tables->t_extmsgdata.count =
esiop_table_sync(esiop_cmd,
esiop_cmd->cmd_tables->msg_out[0] = MSG_MESSAGE_REJECT;
esiop_cmd->cmd_tables->t_msgout.count= htole32(1);
esiop_table_sync(esiop_cmd,
esiop_cmd->cmd_tables->msg_in[2],
esiop_cmd->cmd_tables->msg_in[1]);
if (esiop_cmd->cmd_tables->msg_in[1] >
sizeof(esiop_cmd->cmd_tables->msg_in) - 2)
esiop_cmd->cmd_tables->msg_in[1]);
esiop_cmd->cmd_tables->t_extmsgdata.count =
htole32(esiop_cmd->cmd_tables->msg_in[1] - 1);
esiop_table_sync(esiop_cmd,
esiop_cmd->cmd_tables->msg_in[2]);
for (i = 3; i < 2 + esiop_cmd->cmd_tables->msg_in[1];
esiop_cmd->cmd_tables->msg_in[i]);
if (esiop_cmd->cmd_tables->msg_in[0] ==
if (esiop_cmd->cmd_tables->msg_in[3] != 1)
esiop_cmd->cmd_tables->msg_in[3]);
switch (siop_iwr(&esiop_cmd->cmd_c)) {
esiop_table_sync(esiop_cmd,
if (esiop_cmd->cmd_tables->msg_in[2] == MSG_EXT_PPR) {
switch (siop_ppr_neg(&esiop_cmd->cmd_c)) {
esiop_cmd->cmd_c.siop_target);
esiop_table_sync(esiop_cmd,
esiop_cmd->cmd_c.siop_target);
struct esiop_cmd *active; /* active non-tagged command */
struct esiop_cmd *tactive[ESIOP_NTAG]; /* active tagged commands */
static __inline void esiop_table_sync(struct esiop_cmd *, int);
esiop_table_sync(struct esiop_cmd *esiop_cmd, int ops)
struct siop_common_softc *sc = esiop_cmd->cmd_c.siop_sc;
offset = esiop_cmd->cmd_c.dsa -
esiop_cmd->esiop_cbdp->xferdma->dm_segs[0].ds_addr;
bus_dmamap_sync(sc->sc_dmat, esiop_cmd->esiop_cbdp->xferdma, offset,
TAILQ_ENTRY (esiop_cmd) next;
struct esiop_cmd *cmds;
TAILQ_HEAD(cmd_list, esiop_cmd);