summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorbriggs <briggs@cvs.openbsd.org>1996-01-13 16:14:23 +0000
committerbriggs <briggs@cvs.openbsd.org>1996-01-13 16:14:23 +0000
commit0db0ea875ded5cb9912e0c9a2e4431b3f438d4ef (patch)
treeb8f28c4a9bb01e668c5ac312758320067fa43fc0 /sys
parent3eefa793b27e584054bd97de48420773ee3cb2bb (diff)
Don't issue a linked command to check for a device's support of them.
Instead, check the inquiry_flag. Also allow enabling and disabling linked command issuance on target-by-target basis.
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/mac68k/dev/ncr5380.c70
1 files changed, 13 insertions, 57 deletions
diff --git a/sys/arch/mac68k/dev/ncr5380.c b/sys/arch/mac68k/dev/ncr5380.c
index 2c8fe5e196f..99a620f23f6 100644
--- a/sys/arch/mac68k/dev/ncr5380.c
+++ b/sys/arch/mac68k/dev/ncr5380.c
@@ -74,16 +74,18 @@ u_char dbg_target_mask = 0x7f;
*/
u_char ncr5380_no_parchk = 0xff;
-#ifdef AUTO_SENSE
-
/*
- * Bit masks of targets that accept linked commands, and those
- * that we've already checked out
+ * Flags to allow binpatching of which devices to allow or disallow
+ * issuance of linked commands. disallowance is favored over allowance,
+ * so if the same bit is set in either, the driver will not issue linked
+ * commands to the corresponding target.
+ * SCSI-2 devices can report whether or not they will accept linked
+ * commands. If that reports that a device supports linked commands,
+ * then it is treated as if the corresponding bit in ncr5380_allow_linked
+ * is set.
*/
-u_char ncr_will_link = 0x00;
-u_char ncr_test_link = 0x00;
-
-#endif /* AUTO_SENSE */
+u_char ncr5380_allow_linked = 0x80;
+u_char ncr5380_disallow_linked = 0x80;
/*
* This is the default sense-command we send.
@@ -405,46 +407,14 @@ ncr5380_scsi_cmd(struct scsi_xfer *xs)
} while (tmp->next && (tmp = tmp->next));
tmp->next = reqp;
#ifdef AUTO_SENSE
- if (link && (ncr_will_link & (1<<reqp->targ_id))) {
+ if (link && ( (xs->sc_link->inquiry_flags & SID_Linked)
+ || ((1<<reqp->targ_id) & ncr5380_allow_linked))
+ && !((1<<reqp->targ_id) & ncr5380_disallow_linked)) {
link->link = reqp;
link->xcmd.bytes[link->xs->cmdlen-2] |= 1;
}
#endif
}
-#ifdef AUTO_SENSE
- /*
- * If we haven't already, check the target for link support.
- * Do this by prefixing the current command with a dummy
- * Request_Sense command, link the dummy to the current
- * command, and insert the dummy command at the head of the
- * issue queue. Set the DRIVER_LINKCHK flag so that we'll
- * ignore the results of the dummy command, since we only
- * care about whether it was accepted or not.
- */
- if (!link && !(ncr_test_link & (1<<reqp->targ_id)) &&
- (tmp = free_head) && !(reqp->dr_flag & DRIVER_NOINT)) {
- free_head = tmp->next;
- tmp->dr_flag = (reqp->dr_flag & ~DRIVER_DMAOK) | DRIVER_LINKCHK;
- tmp->phase = NR_PHASE;
- tmp->msgout = MSG_NOOP;
- tmp->status = SCSGOOD;
- tmp->xs = reqp->xs;
- tmp->targ_id = reqp->targ_id;
- tmp->targ_lun = reqp->targ_lun;
- bcopy(sense_cmd, &tmp->xcmd, sizeof(sense_cmd));
- tmp->xdata_ptr = (u_char *)&tmp->xs->sense;
- tmp->xdata_len = sizeof(tmp->xs->sense);
- ncr_test_link |= 1<<tmp->targ_id;
- tmp->link = reqp;
- tmp->xcmd.bytes[sizeof(sense_cmd)-2] |= 1;
- tmp->next = issue_q;
- issue_q = tmp;
-#ifdef DBG_REQ
- if (dbg_target_mask & (1 << tmp->targ_id))
- show_request(tmp, "LINKCHK");
-#endif
- }
-#endif
splx(sps);
#ifdef DBG_REQ
@@ -893,8 +863,6 @@ SC_REQ *reqp;
reqp->xs->error = code ? code : XS_SELTIMEOUT;
DBG_SELPRINT ("Target %d not responding to sel\n",
reqp->targ_id);
- if (reqp->dr_flag & DRIVER_LINKCHK)
- ncr_test_link &= ~(1<<reqp->targ_id);
finish_req(reqp);
PID("scsi_select8");
return (0);
@@ -1584,18 +1552,6 @@ int linked;
int sps;
/*
- * If this is the driver's Link Check for this target, ignore
- * the results of the command. All we care about is whether we
- * got here from a LINK_CMD_COMPLETE or CMD_COMPLETE message.
- */
- PID("linkcheck");
- if (reqp->dr_flag & DRIVER_LINKCHK) {
- if (linked)
- ncr_will_link |= 1<<reqp->targ_id;
- else ncr_tprint(reqp, "Does not support linked commands\n");
- return (0);
- }
- /*
* If we not executing an auto-sense and the status code
* is request-sense, we automatically issue a request
* sense command.