summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authormjacob <mjacob@FreeBSD.org>1999-04-04 01:35:03 +0000
committermjacob <mjacob@FreeBSD.org>1999-04-04 01:35:03 +0000
commit0db59f8916930610a5d2fafdc096c69cf8e6f034 (patch)
treec0bef9c00ef08805ed558fcb9bd43fff2de23032 /sys
parentba4a1207d0c1d1b9c2329f1c27724ec3fec9c503 (diff)
downloadFreeBSD-src-0db59f8916930610a5d2fafdc096c69cf8e6f034.zip
FreeBSD-src-0db59f8916930610a5d2fafdc096c69cf8e6f034.tar.gz
F/W revisions now a tuple (not a duple). Fix pre-CAM code.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/isp/isp_freebsd.c76
1 files changed, 57 insertions, 19 deletions
diff --git a/sys/dev/isp/isp_freebsd.c b/sys/dev/isp/isp_freebsd.c
index 39abdff..ff1d57b 100644
--- a/sys/dev/isp/isp_freebsd.c
+++ b/sys/dev/isp/isp_freebsd.c
@@ -1,5 +1,5 @@
-/* $Id: isp_freebsd.c,v 1.13 1999/03/17 05:04:38 mjacob Exp $ */
-/* release_03_25_99 */
+/* $Id: isp_freebsd.c,v 1.14 1999/03/25 22:52:44 mjacob Exp $ */
+/* release_4_3_99 */
/*
* Platform (FreeBSD) dependent common attachment code for Qlogic adapters.
*
@@ -112,7 +112,8 @@ isp_cam_async(void *cbarg, u_int32_t code, struct cam_path *path, void *arg)
int s, tgt = xpt_path_target_id(path);
nflags = DPARM_SAFE_DFLT;
- if (isp->isp_fwrev >= ISP_FW_REV(7, 55)) {
+ if (ISP_FW_REVX(isp->isp_fwrev) >=
+ ISP_FW_REV(7, 55, 0)) {
nflags |= DPARM_NARROW | DPARM_ASYNC;
}
oflags = sdp->isp_devparam[tgt].dev_flags;
@@ -194,7 +195,8 @@ isp_action(struct cam_sim *sim, union ccb *ccb)
if (isp->isp_type & ISP_HA_SCSI) {
if (ccb->ccb_h.target_id > (MAX_TARGETS-1)) {
ccb->ccb_h.status = CAM_PATH_INVALID;
- } else if (isp->isp_fwrev >= ISP_FW_REV(7, 55)) {
+ } else if (ISP_FW_REVX(isp->isp_fwrev) >=
+ ISP_FW_REV(7, 55, 0)) {
/*
* Too much breakage.
*/
@@ -527,7 +529,8 @@ isp_action(struct cam_sim *sim, union ccb *ccb)
cpi->initiator_id =
((sdparam *)isp->isp_param)->isp_initiator_id;
cpi->max_target = MAX_TARGETS-1;
- if (isp->isp_fwrev >= ISP_FW_REV(7, 55)) {
+ if (ISP_FW_REVX(isp->isp_fwrev) >=
+ ISP_FW_REV(7, 55, 0)) {
#if 0
/*
* Too much breakage.
@@ -740,8 +743,23 @@ isp_async(isp, cmd, arg)
return (rv);
}
+
+/*
+ * Free any associated resources prior to decommissioning and
+ * set the card to a known state (so it doesn't wake up and kick
+ * us when we aren't expecting it to).
+ *
+ * Locks are held before coming here.
+ */
+void
+isp_uninit(struct ispsoftc *isp)
+{
+ DISABLE_INTS(isp);
+}
#else
+#define WATCH_INTERVAL 30
+
static void ispminphys __P((struct buf *));
static u_int32_t isp_adapter_info __P((int));
static int ispcmd __P((ISP_SCSI_XFER_T *));
@@ -771,7 +789,8 @@ isp_attach(struct ispsoftc *isp)
if (isp->isp_state == ISP_INITSTATE)
isp->isp_state = ISP_RUNSTATE;
- START_WATCHDOG(isp);
+ timeout(isp_watch, isp, WATCH_INTERVAL * hz);
+ isp->isp_dogactive = 1;
isp->isp_osinfo._link.adapter_unit = isp->isp_osinfo.unit;
isp->isp_osinfo._link.adapter_softc = isp;
@@ -783,6 +802,7 @@ isp_attach(struct ispsoftc *isp)
((fcparam *)isp->isp_param)->isp_loopid;
scbus->maxtarg = MAX_FC_TARG-1;
} else {
+ isp->isp_osinfo.delay_throttle_count = 1;
isp->isp_osinfo._link.adapter_targ =
((sdparam *)isp->isp_param)->isp_initiator_id;
scbus->maxtarg = MAX_TARGETS-1;
@@ -847,7 +867,7 @@ ispcmd(ISP_SCSI_XFER_T *xs)
XS_SETERR(xs, HBA_BOTCH);
return (CMD_COMPLETE);
}
- isp_state = ISP_RUNSTATE;
+ isp->isp_state = ISP_RUNSTATE;
}
r = ispscsicmd(xs);
ENABLE_INTS(isp);
@@ -901,12 +921,12 @@ isp_watch(void *arg)
int i;
struct ispsoftc *isp = arg;
ISP_SCSI_XFER_T *xs;
- ISP_ILOCKVAL_DECL;
+ int s;
/*
* Look for completely dead commands (but not polled ones).
*/
- ISP_ILOCK(isp);
+ s = splbio();
for (i = 0; i < RQUEST_QUEUE_LEN; i++) {
if ((xs = (ISP_SCSI_XFER_T *) isp->isp_xflist[i]) == NULL) {
continue;
@@ -915,6 +935,7 @@ isp_watch(void *arg)
continue;
}
XS_TIME(xs) -= (WATCH_INTERVAL * 1000);
+
/*
* Avoid later thinking that this
* transaction is not being timed.
@@ -926,6 +947,9 @@ isp_watch(void *arg)
else if (XS_TIME(xs) > -(2 * WATCH_INTERVAL * 1000)) {
continue;
}
+ if (IS_SCSI(isp)) {
+ isp->isp_osinfo.delay_throttle_count = 1;
+ }
if (isp_control(isp, ISPCTL_ABORT_CMD, xs)) {
printf("%s: isp_watch failed to abort command\n",
isp->isp_name);
@@ -933,8 +957,20 @@ isp_watch(void *arg)
break;
}
}
- RESTART_WATCHDOG(isp_watch, arg);
- ISP_IUNLOCK(isp);
+ if (isp->isp_osinfo.delay_throttle_count) {
+ if (--isp->isp_osinfo.delay_throttle_count == 0) {
+ sdparam *sdp = isp->isp_param;
+ for (i = 0; i < MAX_TARGETS; i++) {
+ sdp->isp_devparam[i].dev_flags |=
+ DPARM_WIDE|DPARM_SYNC|DPARM_TQING;
+ sdp->isp_devparam[i].dev_update = 1;
+ }
+ isp->isp_update = 1;
+ }
+ }
+ timeout(isp_watch, isp, WATCH_INTERVAL * hz);
+ isp->isp_dogactive = 1;
+ splx(s);
}
int
@@ -1016,7 +1052,7 @@ isp_async(isp, cmd, arg)
static char *roles[4] = {
"No", "Target", "Initiator", "Target/Initiator"
};
- for (i = 0 i < MAX_FC_TARG; i++) {
+ for (i = 0; i < MAX_FC_TARG; i++) {
isp_pdb_t *pdbp =
&((fcparam *)isp->isp_param)->isp_pdb[i];
if (pdbp->pdb_options == INVALID_PDB_OPTIONS)
@@ -1071,7 +1107,6 @@ isp_async(isp, cmd, arg)
}
return (0);
}
-#endif
/*
* Free any associated resources prior to decommissioning and
@@ -1081,10 +1116,10 @@ isp_async(isp, cmd, arg)
* Locks are held before coming here.
*/
void
-isp_uninit(struct ispsoftc *isp)
+isp_uninit(isp)
+ struct ispsoftc *isp;
{
- ISP_ILOCKVAL_DECL;
- ISP_ILOCK(isp);
+ int s = splbio();
/*
* Leave with interrupts disabled.
*/
@@ -1093,10 +1128,13 @@ isp_uninit(struct ispsoftc *isp)
/*
* Turn off the watchdog (if active).
*/
- STOP_WATCHDOG(isp_watch, isp);
-
+ if (isp->isp_dogactive) {
+ untimeout(isp_watch, isp);
+ isp->isp_dogactive = 0;
+ }
/*
* And out...
*/
- ISP_IUNLOCK(isp);
+ splx(s);
}
+#endif
OpenPOWER on IntegriCloud