summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/dev/ic/isp.c359
1 files changed, 182 insertions, 177 deletions
diff --git a/sys/dev/ic/isp.c b/sys/dev/ic/isp.c
index 09f16c08c01..0d49c028c1f 100644
--- a/sys/dev/ic/isp.c
+++ b/sys/dev/ic/isp.c
@@ -1,9 +1,9 @@
-/* $OpenBSD: isp.c,v 1.20 2001/02/12 23:44:59 mjacob Exp $ */
+/* $OpenBSD: isp.c,v 1.21 2001/04/04 22:06:54 mjacob Exp $ */
/*
* Machine and OS Independent (well, as best as possible)
* code for the Qlogic ISP SCSI adapters.
*
- * Copyright (c) 1997, 1998, 1999, 2000 by Matthew Jacob
+ * Copyright (c) 1997, 1998, 1999, 2000, 2001 by Matthew Jacob
* Feral Software
* All rights reserved.
*
@@ -108,7 +108,7 @@ static int isp_handle_other_response
__P((struct ispsoftc *, ispstatusreq_t *, u_int16_t *));
static void isp_parse_status
__P((struct ispsoftc *, ispstatusreq_t *, XS_T *));
-static void isp_fastpost_complete __P((struct ispsoftc *, u_int32_t));
+static void isp_fastpost_complete __P((struct ispsoftc *, u_int16_t));
static void isp_scsi_init __P((struct ispsoftc *));
static void isp_scsi_channel_init __P((struct ispsoftc *, int));
static void isp_fibre_init __P((struct ispsoftc *));
@@ -143,8 +143,7 @@ static void isp_parse_nvram_2100 __P((struct ispsoftc *, u_int8_t *));
* Locking done elsewhere.
*/
void
-isp_reset(isp)
- struct ispsoftc *isp;
+isp_reset(struct ispsoftc *isp)
{
mbreg_t mbs;
int loops, i, touched, dodnld = 1;
@@ -649,6 +648,8 @@ again:
dodnld? "loaded" : "resident", mbs.param[1], mbs.param[2],
mbs.param[3]);
if (IS_FC(isp)) {
+ isp_prt(isp, ISP_LOGCONFIG, "Firmware Attributes = 0x%x",
+ mbs.param[6]);
if (ISP_READ(isp, BIU2100_CSR) & BIU2100_PCI64) {
isp_prt(isp, ISP_LOGCONFIG,
"Installed in 64-Bit PCI slot");
@@ -730,8 +731,7 @@ again:
*/
void
-isp_init(isp)
- struct ispsoftc *isp;
+isp_init(struct ispsoftc *isp)
{
/*
* Must do this first to get defaults established.
@@ -748,8 +748,7 @@ isp_init(isp)
}
static void
-isp_scsi_init(isp)
- struct ispsoftc *isp;
+isp_scsi_init(struct ispsoftc *isp)
{
sdparam *sdp_chan0, *sdp_chan1;
mbreg_t mbs;
@@ -913,9 +912,7 @@ isp_scsi_init(isp)
}
static void
-isp_scsi_channel_init(isp, channel)
- struct ispsoftc *isp;
- int channel;
+isp_scsi_channel_init(struct ispsoftc *isp, int channel)
{
sdparam *sdp;
mbreg_t mbs;
@@ -933,7 +930,8 @@ isp_scsi_channel_init(isp, channel)
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
return;
}
- isp_prt(isp, ISP_LOGINFO, "Initiator ID is %d", sdp->isp_initiator_id);
+ isp_prt(isp, ISP_LOGINFO, "Initiator ID is %d on Channel %d",
+ sdp->isp_initiator_id, channel);
/*
@@ -946,18 +944,34 @@ isp_scsi_channel_init(isp, channel)
if (sdp->isp_devparam[tgt].dev_enable == 0) {
continue;
}
- sdf = DPARM_SAFE_DFLT;
+#ifndef ISP_TARGET_MODE
+ if (tgt == sdp->isp_initiator_id) {
+ sdf = DPARM_DEFAULT;
+ } else {
+ sdf = DPARM_SAFE_DFLT;
+ /*
+ * It is not quite clear when this changed over so that
+ * we could force narrow and async for 1000/1020 cards,
+ * but assume that this is only the case for loaded
+ * firmware.
+ */
+ if (isp->isp_loaded_fw) {
+ sdf |= DPARM_NARROW | DPARM_ASYNC;
+ }
+ }
+#else
/*
- * It is not quite clear when this changed over so that
- * we could force narrow and async for 1000/1020 cards,
- * but assume that this is only the case for loaded
- * firmware.
+ * The !$*!)$!$)* f/w uses the same index into some
+ * internal table to decide how to respond to negotiations,
+ * so if we've said "let's be safe" for ID X, and ID X
+ * selects *us*, the negotiations will back to 'safe'
+ * (as in narrow/async). What the f/w *should* do is
+ * use the initiator id settings to decide how to respond.
*/
- if (isp->isp_loaded_fw) {
- sdf |= DPARM_NARROW | DPARM_ASYNC;
- }
+ sdf = DPARM_DEFAULT;
+#endif
mbs.param[0] = MBOX_SET_TARGET_PARAMS;
- mbs.param[1] = (tgt << 8) | (channel << 15);
+ mbs.param[1] = (channel << 15) | (tgt << 8);
mbs.param[2] = sdf;
if ((sdf & DPARM_SYNC) == 0) {
mbs.param[3] = 0;
@@ -966,7 +980,11 @@ isp_scsi_channel_init(isp, channel)
(sdp->isp_devparam[tgt].sync_offset << 8) |
(sdp->isp_devparam[tgt].sync_period);
}
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ isp_prt(isp, ISP_LOGDEBUG0,
+ "bus %d set tgt %d flags 0x%x off 0x%x period 0x%x",
+ channel, tgt, mbs.param[2], mbs.param[3] >> 8,
+ mbs.param[3] & 0xff);
+ isp_mboxcmd(isp, &mbs, MBLOGNONE);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
sdf = DPARM_SAFE_DFLT;
mbs.param[0] = MBOX_SET_TARGET_PARAMS;
@@ -1017,8 +1035,7 @@ isp_scsi_channel_init(isp, channel)
* Locks are held before coming here.
*/
static void
-isp_fibre_init(isp)
- struct ispsoftc *isp;
+isp_fibre_init(struct ispsoftc *isp)
{
fcparam *fcp;
isp_icb_t *icbp;
@@ -1076,11 +1093,6 @@ isp_fibre_init(isp)
*/
fcp->isp_fwoptions |= ICBOPT_PDBCHANGE_AE;
- /*
- * We don't set ICBOPT_PORTNAME because we want our
- * Node Name && Port Names to be distinct.
- */
-
/*
* Make sure that target role reflects into fwoptions.
@@ -1148,6 +1160,7 @@ isp_fibre_init(isp)
nwwn = ISP_NODEWWN(isp);
pwwn = ISP_PORTWWN(isp);
if (nwwn && pwwn) {
+ icbp->icb_fwoptions |= ICBOPT_BOTH_WWNS;
MAKE_NODE_NAME_FROM_WWN(icbp->icb_nodename, nwwn);
MAKE_NODE_NAME_FROM_WWN(icbp->icb_portname, pwwn);
isp_prt(isp, ISP_LOGDEBUG1,
@@ -1158,7 +1171,7 @@ isp_fibre_init(isp)
((u_int32_t) (pwwn & 0xffffffff)));
} else {
isp_prt(isp, ISP_LOGDEBUG1, "Not using any WWNs");
- fcp->isp_fwoptions &= ~(ICBOPT_USE_PORTNAME|ICBOPT_FULL_LOGIN);
+ icbp->icb_fwoptions &= ~(ICBOPT_BOTH_WWNS|ICBOPT_FULL_LOGIN);
}
icbp->icb_rqstqlen = RQUEST_QUEUE_LEN(isp);
icbp->icb_rsltqlen = RESULT_QUEUE_LEN(isp);
@@ -1204,9 +1217,7 @@ isp_fibre_init(isp)
*/
static int
-isp_getmap(isp, map)
- struct ispsoftc *isp;
- fcpos_map_t *map;
+isp_getmap(struct ispsoftc *isp, fcpos_map_t *map)
{
fcparam *fcp = (fcparam *) isp->isp_param;
mbreg_t mbs;
@@ -1234,8 +1245,7 @@ isp_getmap(isp, map)
}
static void
-isp_mark_getpdb_all(isp)
- struct ispsoftc *isp;
+isp_mark_getpdb_all(struct ispsoftc *isp)
{
fcparam *fcp = (fcparam *) isp->isp_param;
int i;
@@ -1245,10 +1255,7 @@ isp_mark_getpdb_all(isp)
}
static int
-isp_getpdb(isp, id, pdbp)
- struct ispsoftc *isp;
- int id;
- isp_pdb_t *pdbp;
+isp_getpdb(struct ispsoftc *isp, int id, isp_pdb_t *pdbp)
{
fcparam *fcp = (fcparam *) isp->isp_param;
mbreg_t mbs;
@@ -1275,10 +1282,7 @@ isp_getpdb(isp, id, pdbp)
}
static u_int64_t
-isp_get_portname(isp, loopid, nodename)
- struct ispsoftc *isp;
- int loopid;
- int nodename;
+isp_get_portname(struct ispsoftc *isp, int loopid, int nodename)
{
u_int64_t wwn = 0;
mbreg_t mbs;
@@ -1307,9 +1311,7 @@ isp_get_portname(isp, loopid, nodename)
*/
static int
-isp_fclink_test(isp, usdelay)
- struct ispsoftc *isp;
- int usdelay;
+isp_fclink_test(struct ispsoftc *isp, int usdelay)
{
static char *toponames[] = {
"Private Loop",
@@ -1360,10 +1362,10 @@ isp_fclink_test(isp, usdelay)
*/
enano = NANOTIME_SUB(&hrb, &hra);
- isp_prt(isp, ISP_LOGDEBUG3, "usec%d: 0x%lx->0x%lx enano %lu",
+ isp_prt(isp, ISP_LOGDEBUG1,
+ "usec%d: 0x%lx->0x%lx enano 0x%x%08x",
count, (long) GET_NANOSEC(&hra), (long) GET_NANOSEC(&hrb),
- (enano > ((u_int64_t)0xffffffff))? 0xffffffff :
- (unsigned long) (enano & 0xffffffff));
+ (u_int32_t)(enano >> 32), (u_int32_t)(enano & 0xffffffff));
/*
* If the elapsed time is less than 1 millisecond,
@@ -1382,7 +1384,8 @@ isp_fclink_test(isp, usdelay)
enano -= (u_int64_t) 4000000000U;
}
wrk = enano;
- USEC_SLEEP(isp, wrk/1000);
+ wrk /= 1000;
+ USEC_SLEEP(isp, wrk);
} else {
while (enano > (u_int64_t) 4000000000U) {
count += 4000000;
@@ -1531,8 +1534,7 @@ not_on_fabric:
}
static char *
-isp2100_fw_statename(state)
- int state;
+isp2100_fw_statename(int state)
{
switch(state) {
case FW_CONFIG_WAIT: return "Config Wait";
@@ -1553,8 +1555,7 @@ isp2100_fw_statename(state)
*/
static int
-isp_pdb_sync(isp)
- struct ispsoftc *isp;
+isp_pdb_sync(struct ispsoftc *isp)
{
struct lportdb *lp;
fcparam *fcp = isp->isp_param;
@@ -1864,8 +1865,7 @@ dump_em:
}
static int
-isp_scan_loop(isp)
- struct ispsoftc *isp;
+isp_scan_loop(struct ispsoftc *isp)
{
struct lportdb *lp;
fcparam *fcp = isp->isp_param;
@@ -2134,8 +2134,7 @@ isp_scan_loop(isp)
}
static int
-isp_scan_fabric(isp)
- struct ispsoftc *isp;
+isp_scan_fabric(struct ispsoftc *isp)
{
fcparam *fcp = isp->isp_param;
u_int32_t portid, first_portid;
@@ -2245,11 +2244,10 @@ isp_register_fc4_type(struct ispsoftc *isp)
*/
int
-isp_start(xs)
- XS_T *xs;
+isp_start(XS_T *xs)
{
struct ispsoftc *isp;
- u_int16_t iptr, optr;
+ u_int16_t iptr, optr, handle;
union {
ispreq_t *_reqp;
ispreqt2_t *_t2reqp;
@@ -2304,6 +2302,39 @@ isp_start(xs)
if (IS_FC(isp)) {
fcparam *fcp = isp->isp_param;
struct lportdb *lp;
+#ifdef HANDLE_LOOPSTATE_IN_OUTER_LAYERS
+ if (fcp->isp_fwstate != FW_READY ||
+ fcp->isp_loopstate != LOOP_READY) {
+ return (CMD_RQLATER);
+ }
+
+ /*
+ * If we're not on a Fabric, we can't have a target
+ * above FL_PORT_ID-1.
+ *
+ * If we're on a fabric and *not* connected as an F-port,
+ * we can't have a target less than FC_SNS_ID+1. This
+ * keeps us from having to sort out the difference between
+ * local public loop devices and those which we might get
+ * from a switch's database.
+ */
+ if (fcp->isp_onfabric == 0) {
+ if (target >= FL_PORT_ID) {
+ XS_SETERR(xs, HBA_SELTIMEOUT);
+ return (CMD_COMPLETE);
+ }
+ } else {
+ if (target >= FL_PORT_ID && target <= FC_SNS_ID) {
+ XS_SETERR(xs, HBA_SELTIMEOUT);
+ return (CMD_COMPLETE);
+ }
+ if (fcp->isp_topo != TOPO_F_PORT &&
+ target < FL_PORT_ID) {
+ XS_SETERR(xs, HBA_SELTIMEOUT);
+ return (CMD_COMPLETE);
+ }
+ }
+#else
/*
* Check for f/w being in ready state. If the f/w
* isn't in ready state, then we don't know our
@@ -2420,6 +2451,7 @@ isp_start(xs)
* XXX: Here's were we would cancel any loop_dead flag
* XXX: also cancel in dead_loop timeout that's running
*/
+#endif
/*
* Now check whether we should even think about pursuing this.
@@ -2551,18 +2583,19 @@ isp_start(xs)
if (isp->isp_sendmarker && reqp->req_time < 5) {
reqp->req_time = 5;
}
- if (isp_save_xs(isp, xs, &reqp->req_handle)) {
+ if (isp_save_xs(isp, xs, &handle)) {
isp_prt(isp, ISP_LOGDEBUG1, "out of xflist pointers");
XS_SETERR(xs, HBA_BOTCH);
return (CMD_EAGAIN);
}
+ reqp->req_handle = handle;
/*
* Set up DMA and/or do any bus swizzling of the request entry
* so that the Qlogic F/W understands what is being asked of it.
*/
i = ISP_DMASETUP(isp, xs, reqp, &iptr, optr);
if (i != CMD_QUEUED) {
- isp_destroy_handle(isp, reqp->req_handle);
+ isp_destroy_handle(isp, handle);
/*
* dmasetup sets actual error in packet, and
* return what we were given to return.
@@ -2589,15 +2622,12 @@ isp_start(xs)
*/
int
-isp_control(isp, ctl, arg)
- struct ispsoftc *isp;
- ispctl_t ctl;
- void *arg;
+isp_control(struct ispsoftc *isp, ispctl_t ctl, void *arg)
{
XS_T *xs;
mbreg_t mbs;
int bus, tgt;
- u_int32_t handle;
+ u_int16_t handle;
switch (ctl) {
default:
@@ -2670,8 +2700,8 @@ isp_control(isp, ctl, arg)
mbs.param[1] =
(bus << 15) | (XS_TGT(xs) << 8) | XS_LUN(xs);
}
- mbs.param[3] = handle >> 16;
- mbs.param[2] = handle & 0xffff;
+ mbs.param[3] = 0;
+ mbs.param[2] = handle;
isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_ERROR);
if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
return (0);
@@ -2734,18 +2764,24 @@ isp_control(isp, ctl, arg)
}
break;
+ case ISPCTL_RUN_MBOXCMD:
+
+ isp_mboxcmd(isp, arg, MBLOGALL);
+ return(0);
+
#ifdef ISP_TARGET_MODE
case ISPCTL_TOGGLE_TMODE:
{
- int ena = *(int *)arg;
/*
* We don't check/set against role here- that's the
* responsibility for the outer layer to coordinate.
*/
if (IS_SCSI(isp)) {
+ int param = *(int *)arg;
mbs.param[0] = MBOX_ENABLE_TARGET_MODE;
- mbs.param[1] = (ena)? ENABLE_TARGET_FLAG : 0;
+ mbs.param[1] = param & 0xffff;
+ mbs.param[2] = param >> 16;
isp_mboxcmd(isp, &mbs, MBLOGALL);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
break;
@@ -2772,8 +2808,7 @@ isp_control(isp, ctl, arg)
#define MAX_REQUESTQ_COMPLETIONS 32
int
-isp_intr(arg)
- void *arg;
+isp_intr(void *arg)
{
struct ispsoftc *isp = arg;
XS_T *complist[MAX_REQUESTQ_COMPLETIONS], *xs;
@@ -2849,10 +2884,10 @@ isp_intr(arg)
mbox);
}
} else {
- u_int32_t fhandle = isp_parse_async(isp, (int) mbox);
+ int fhandle = isp_parse_async(isp, (int) mbox);
isp_prt(isp, ISP_LOGDEBUG2, "Async Mbox 0x%x", mbox);
if (fhandle > 0) {
- isp_fastpost_complete(isp, fhandle);
+ isp_fastpost_complete(isp, (u_int16_t) fhandle);
}
}
if (IS_FC(isp) || isp->isp_state != ISP_RUNSTATE) {
@@ -2990,7 +3025,9 @@ isp_intr(arg)
if (sp->req_handle > isp->isp_maxcmds || sp->req_handle < 1) {
MEMZERO(sp, sizeof (isphdr_t));
isp_prt(isp, ISP_LOGERR,
- "bad request handle %d", sp->req_handle);
+ "bad request handle %d (type 0x%x, flags 0x%x)",
+ sp->req_handle, sp->req_header.rqs_entry_type,
+ sp->req_header.rqs_flags);
ISP_WRITE(isp, INMAILBOX5, optr);
continue;
}
@@ -3085,7 +3122,7 @@ isp_intr(arg)
break;
default:
isp_prt(isp, ISP_LOGWARN,
- "unhandled respose queue type 0x%x",
+ "unhandled response queue type 0x%x",
sp->req_header.rqs_entry_type);
if (XS_NOERR(xs)) {
XS_SETERR(xs, HBA_BOTCH);
@@ -3154,12 +3191,10 @@ isp_intr(arg)
*/
static int
-isp_parse_async(isp, mbox)
- struct ispsoftc *isp;
- int mbox;
+isp_parse_async(struct ispsoftc *isp, int mbox)
{
int bus;
- u_int32_t fast_post_handle = 0;
+ u_int16_t fast_post_handle = 0;
if (IS_DUALBUS(isp)) {
bus = ISP_READ(isp, OUTMAILBOX6);
@@ -3178,7 +3213,8 @@ isp_parse_async(isp, mbox)
case ASYNC_SYSTEM_ERROR:
mbox = ISP_READ(isp, OUTMAILBOX1);
isp_prt(isp, ISP_LOGERR,
- "Internal FW Error @ RISC Addr 0x%x", mbox);
+ "Internal Firmware Error @ RISC Addr 0x%x", mbox);
+ ISP_DUMPREGS(isp, "Firmware Error");
isp_reinit(isp);
#ifdef ISP_TARGET_MODE
isp_target_async(isp, bus, ASYNC_SYSTEM_ERROR);
@@ -3205,7 +3241,7 @@ isp_parse_async(isp, mbox)
case ASYNC_TIMEOUT_RESET:
isp_prt(isp, ISP_LOGWARN,
- "timeout initiated SCSI bus reset of bus %d\n", bus);
+ "timeout initiated SCSI bus reset of bus %d", bus);
isp->isp_sendmarker |= (1 << bus);
#ifdef ISP_TARGET_MODE
isp_target_async(isp, bus, mbox);
@@ -3274,8 +3310,7 @@ isp_parse_async(isp, mbox)
break;
case ASYNC_CMD_CMPLT:
- fast_post_handle = (ISP_READ(isp, OUTMAILBOX2) << 16) |
- ISP_READ(isp, OUTMAILBOX1);
+ fast_post_handle = ISP_READ(isp, OUTMAILBOX1);
isp_prt(isp, ISP_LOGDEBUG3, "fast post completion of %u",
fast_post_handle);
break;
@@ -3425,10 +3460,8 @@ isp_parse_async(isp, mbox)
*/
static int
-isp_handle_other_response(isp, sp, optrp)
- struct ispsoftc *isp;
- ispstatusreq_t *sp;
- u_int16_t *optrp;
+isp_handle_other_response(struct ispsoftc *isp,
+ ispstatusreq_t *sp, u_int16_t *optrp)
{
switch (sp->req_header.rqs_entry_type) {
case RQSTYPE_STATUS_CONT:
@@ -3452,6 +3485,9 @@ isp_handle_other_response(isp, sp, optrp)
#endif
case RQSTYPE_REQUEST:
default:
+ if (isp_async(isp, ISPASYNC_UNHANDLED_RESPONSE, sp)) {
+ return (0);
+ }
isp_prt(isp, ISP_LOGWARN, "Unhandled Response Type 0x%x",
sp->req_header.rqs_entry_type);
return (-1);
@@ -3459,10 +3495,7 @@ isp_handle_other_response(isp, sp, optrp)
}
static void
-isp_parse_status(isp, sp, xs)
- struct ispsoftc *isp;
- ispstatusreq_t *sp;
- XS_T *xs;
+isp_parse_status(struct ispsoftc *isp, ispstatusreq_t *sp, XS_T *xs)
{
switch (sp->req_completion_status & 0xff) {
case RQCS_COMPLETE:
@@ -3794,13 +3827,11 @@ isp_parse_status(isp, sp, xs)
}
static void
-isp_fastpost_complete(isp, fph)
- struct ispsoftc *isp;
- u_int32_t fph;
+isp_fastpost_complete(struct ispsoftc *isp, u_int16_t fph)
{
XS_T *xs;
- if (fph < 1) {
+ if (fph == 0) {
return;
}
xs = isp_find_xs(isp, fph);
@@ -3839,7 +3870,7 @@ static u_int16_t mbpscsi[] = {
ISPOPMAP(0x03, 0x07), /* 0x05: MBOX_READ_RAM_WORD */
ISPOPMAP(0x3f, 0x3f), /* 0x06: MBOX_MAILBOX_REG_TEST */
ISPOPMAP(0x03, 0x07), /* 0x07: MBOX_VERIFY_CHECKSUM */
- ISPOPMAP(0x01, 0x0f), /* 0x08: MBOX_ABOUT_FIRMWARE */
+ ISPOPMAP(0x01, 0x4f), /* 0x08: MBOX_ABOUT_FIRMWARE */
ISPOPMAP(0x00, 0x00), /* 0x09: */
ISPOPMAP(0x00, 0x00), /* 0x0a: */
ISPOPMAP(0x00, 0x00), /* 0x0b: */
@@ -3916,8 +3947,8 @@ static u_int16_t mbpscsi[] = {
ISPOPMAP(0xdf, 0xdf), /* 0x52: INITIALIZE REQUEST QUEUE A64 */
ISPOPMAP(0xff, 0xff), /* 0x53: INITIALIZE RESPONSE QUEUE A64 */
ISPOPMAP(0xcf, 0xff), /* 0x54: EXECUTE IOCB A64 */
- ISPOPMAP(0x03, 0x01), /* 0x55: ENABLE TARGET MODE */
- ISPOPMAP(0x00, 0x00), /* 0x56: */
+ ISPOPMAP(0x07, 0x01), /* 0x55: ENABLE TARGET MODE */
+ ISPOPMAP(0x03, 0x0f), /* 0x56: GET TARGET STATUS */
ISPOPMAP(0x00, 0x00), /* 0x57: */
ISPOPMAP(0x00, 0x00), /* 0x58: */
ISPOPMAP(0x00, 0x00), /* 0x59: */
@@ -3927,7 +3958,7 @@ static u_int16_t mbpscsi[] = {
ISPOPMAP(0x01, 0x01) /* 0x5d: GET NOST DATA */
};
-#ifndef ISP_STRIPEED
+#ifndef ISP_STRIPPED
static char *scsi_mbcmd_names[] = {
"NO-OP",
"LOAD RAM",
@@ -4015,7 +4046,7 @@ static char *scsi_mbcmd_names[] = {
"INITIALIZE RESPONSE QUEUE A64",
"EXECUTE IOCB A64",
"ENABLE TARGET MODE",
- NULL,
+ "GET TARGET MODE STATE",
NULL,
NULL,
NULL,
@@ -4030,7 +4061,7 @@ static u_int16_t mbpfc[] = {
ISPOPMAP(0x01, 0x01), /* 0x00: MBOX_NO_OP */
ISPOPMAP(0x1f, 0x01), /* 0x01: MBOX_LOAD_RAM */
ISPOPMAP(0x03, 0x01), /* 0x02: MBOX_EXEC_FIRMWARE */
- ISPOPMAP(0x1f, 0x01), /* 0x03: MBOX_DUMP_RAM */
+ ISPOPMAP(0xdf, 0x01), /* 0x03: MBOX_DUMP_RAM */
ISPOPMAP(0x07, 0x07), /* 0x04: MBOX_WRITE_RAM_WORD */
ISPOPMAP(0x03, 0x07), /* 0x05: MBOX_READ_RAM_WORD */
ISPOPMAP(0xff, 0xff), /* 0x06: MBOX_MAILBOX_REG_TEST */
@@ -4289,10 +4320,7 @@ static char *fc_mbcmd_names[] = {
#endif
static void
-isp_mboxcmd(isp, mbp, logmask)
- struct ispsoftc *isp;
- mbreg_t *mbp;
- int logmask;
+isp_mboxcmd(struct ispsoftc *isp, mbreg_t *mbp, int logmask)
{
char *cname, *xname, tname[16], mname[16];
unsigned int lim, ibits, obits, box, opcode;
@@ -4370,7 +4398,8 @@ isp_mboxcmd(isp, mbp, logmask)
cname = (IS_FC(isp))? fc_mbcmd_names[opcode] : scsi_mbcmd_names[opcode];
#endif
if (cname == NULL) {
- SNPRINTF(cname, sizeof tname, "opcode %x", opcode);
+ cname = tname;
+ SNPRINTF(tname, sizeof tname, "opcode %x", opcode);
}
/*
@@ -4426,8 +4455,7 @@ isp_mboxcmd(isp, mbp, logmask)
}
static void
-isp_fw_state(isp)
- struct ispsoftc *isp;
+isp_fw_state(struct ispsoftc *isp)
{
if (IS_FC(isp)) {
mbreg_t mbs;
@@ -4442,8 +4470,7 @@ isp_fw_state(isp)
}
static void
-isp_update(isp)
- struct ispsoftc *isp;
+isp_update(struct ispsoftc *isp)
{
int bus, upmask;
@@ -4456,9 +4483,7 @@ isp_update(isp)
}
static void
-isp_update_bus(isp, bus)
- struct ispsoftc *isp;
- int bus;
+isp_update_bus(struct ispsoftc *isp, int bus)
{
int tgt;
mbreg_t mbs;
@@ -4481,7 +4506,7 @@ isp_update_bus(isp, bus)
if (sdp->isp_devparam[tgt].dev_enable == 0) {
sdp->isp_devparam[tgt].dev_update = 0;
sdp->isp_devparam[tgt].dev_refresh = 0;
- isp_prt(isp, ISP_LOGDEBUG1,
+ isp_prt(isp, ISP_LOGDEBUG0,
"skipping target %d bus %d update", tgt, bus);
continue;
}
@@ -4540,7 +4565,7 @@ isp_update_bus(isp, bus)
sdp->isp_devparam[tgt].cur_dflags &= ~DPARM_TQING;
sdp->isp_devparam[tgt].cur_dflags |=
(sdp->isp_devparam[tgt].dev_flags & DPARM_TQING);
- isp_prt(isp, ISP_LOGDEBUG2,
+ isp_prt(isp, ISP_LOGDEBUG0,
"bus %d set tgt %d flags 0x%x off 0x%x period 0x%x",
bus, tgt, mbs.param[2], mbs.param[3] >> 8,
mbs.param[3] & 0xff);
@@ -4550,7 +4575,7 @@ isp_update_bus(isp, bus)
} else {
continue;
}
- mbs.param[1] = (bus << 15) | (tgt << 8) ;
+ mbs.param[1] = (bus << 15) | (tgt << 8);
isp_mboxcmd(isp, &mbs, MBLOGALL);
if (get == 0) {
isp->isp_sendmarker |= (1 << bus);
@@ -4576,9 +4601,7 @@ isp_update_bus(isp, bus)
}
static void
-isp_setdfltparm(isp, channel)
- struct ispsoftc *isp;
- int channel;
+isp_setdfltparm(struct ispsoftc *isp, int channel)
{
int tgt;
mbreg_t mbs;
@@ -4668,6 +4691,30 @@ isp_setdfltparm(isp, channel)
sdp->isp_gotdparms = 1;
/*
+ * Establish some default parameters.
+ */
+ sdp->isp_cmd_dma_burst_enable = 1;
+ sdp->isp_data_dma_burst_enabl = 1;
+ sdp->isp_fifo_threshold = 0;
+ sdp->isp_initiator_id = DEFAULT_IID(isp);
+ if (isp->isp_type >= ISP_HA_SCSI_1040) {
+ sdp->isp_async_data_setup = 9;
+ } else {
+ sdp->isp_async_data_setup = 6;
+ }
+ sdp->isp_selection_timeout = 250;
+ sdp->isp_max_queue_depth = MAXISPREQUEST(isp);
+ sdp->isp_tag_aging = 8;
+ sdp->isp_bus_reset_delay = 3;
+ sdp->isp_retry_count = 2;
+ sdp->isp_retry_delay = 2;
+
+ for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
+ sdp->isp_devparam[tgt].exc_throttle = ISP_EXEC_THROTTLE;
+ sdp->isp_devparam[tgt].dev_enable = 1;
+ }
+
+ /*
* If we've not been told to avoid reading NVRAM, try and read it.
* If we're successful reading it, we can return since NVRAM will
* tell us the right thing to do. Otherwise, establish some reasonable
@@ -4684,7 +4731,7 @@ isp_setdfltparm(isp, channel)
*/
if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) {
mbs.param[0] = MBOX_GET_ACT_NEG_STATE;
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ isp_mboxcmd(isp, &mbs, MBLOGNONE);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
sdp->isp_req_ack_active_neg = 1;
sdp->isp_data_line_active_neg = 1;
@@ -4694,15 +4741,12 @@ isp_setdfltparm(isp, channel)
sdp->isp_data_line_active_neg =
(mbs.param[1+channel] >> 5) & 0x1;
}
- } else {
- sdp->isp_req_ack_active_neg = 1;
- sdp->isp_data_line_active_neg = 1;
}
- isp_prt(isp, ISP_LOGDEBUG1,
+ isp_prt(isp, ISP_LOGDEBUG0,
"defaulting bus %d REQ/ACK Active Negation is %d",
channel, sdp->isp_req_ack_active_neg);
- isp_prt(isp, ISP_LOGDEBUG1,
+ isp_prt(isp, ISP_LOGDEBUG0,
"defaulting bus %d DATA Active Negation is %d",
channel, sdp->isp_data_line_active_neg);
@@ -4797,36 +4841,12 @@ isp_setdfltparm(isp, channel)
ISP_10M_SYNCPARMS & 0xff;
}
}
- isp_prt(isp, ISP_LOGDEBUG1,
+ isp_prt(isp, ISP_LOGDEBUG0,
"Initial bus %d tgt %d flags %x offset %x period %x",
channel, tgt, sdp->isp_devparam[tgt].dev_flags,
sdp->isp_devparam[tgt].sync_offset,
sdp->isp_devparam[tgt].sync_period);
}
-
- /*
- * Establish default some more default parameters.
- */
- sdp->isp_cmd_dma_burst_enable = 1;
- sdp->isp_data_dma_burst_enabl = 1;
- sdp->isp_fifo_threshold = 0;
- sdp->isp_initiator_id = DEFAULT_IID(isp);
- if (isp->isp_type >= ISP_HA_SCSI_1040) {
- sdp->isp_async_data_setup = 9;
- } else {
- sdp->isp_async_data_setup = 6;
- }
- sdp->isp_selection_timeout = 250;
- sdp->isp_max_queue_depth = MAXISPREQUEST(isp);
- sdp->isp_tag_aging = 8;
- sdp->isp_bus_reset_delay = 3;
- sdp->isp_retry_count = 2;
- sdp->isp_retry_delay = 2;
-
- for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
- sdp->isp_devparam[tgt].exc_throttle = ISP_EXEC_THROTTLE;
- sdp->isp_devparam[tgt].dev_enable = 1;
- }
}
/*
@@ -4838,11 +4858,10 @@ isp_setdfltparm(isp, channel)
*/
void
-isp_reinit(isp)
- struct ispsoftc *isp;
+isp_reinit(struct ispsoftc *isp)
{
XS_T *xs;
- u_int32_t handle;
+ u_int16_t handle;
isp_reset(isp);
if (isp->isp_state != ISP_RESETSTATE) {
@@ -4883,8 +4902,7 @@ skip:
* NVRAM Routines
*/
static int
-isp_read_nvram(isp)
- struct ispsoftc *isp;
+isp_read_nvram(struct ispsoftc *isp)
{
int i, amt;
u_int8_t csum, minversion;
@@ -4957,10 +4975,7 @@ isp_read_nvram(isp)
}
static void
-isp_rdnvram_word(isp, wo, rp)
- struct ispsoftc *isp;
- int wo;
- u_int16_t *rp;
+isp_rdnvram_word(struct ispsoftc *isp, int wo, u_int16_t *rp)
{
int i, cbits;
u_int16_t bit, rqst;
@@ -5023,9 +5038,7 @@ isp_rdnvram_word(isp, wo, rp)
}
static void
-isp_parse_nvram_1020(isp, nvram_data)
- struct ispsoftc *isp;
- u_int8_t *nvram_data;
+isp_parse_nvram_1020(struct ispsoftc *isp, u_int8_t *nvram_data)
{
int i;
sdparam *sdp = (sdparam *) isp->isp_param;
@@ -5126,10 +5139,7 @@ isp_parse_nvram_1020(isp, nvram_data)
}
static void
-isp_parse_nvram_1080(isp, bus, nvram_data)
- struct ispsoftc *isp;
- int bus;
- u_int8_t *nvram_data;
+isp_parse_nvram_1080(struct ispsoftc *isp, int bus, u_int8_t *nvram_data)
{
int i;
sdparam *sdp = (sdparam *) isp->isp_param;
@@ -5202,10 +5212,7 @@ isp_parse_nvram_1080(isp, bus, nvram_data)
}
static void
-isp_parse_nvram_12160(isp, bus, nvram_data)
- struct ispsoftc *isp;
- int bus;
- u_int8_t *nvram_data;
+isp_parse_nvram_12160(struct ispsoftc *isp, int bus, u_int8_t *nvram_data)
{
sdparam *sdp = (sdparam *) isp->isp_param;
int i;
@@ -5279,9 +5286,7 @@ isp_parse_nvram_12160(isp, bus, nvram_data)
}
static void
-isp_parse_nvram_2100(isp, nvram_data)
- struct ispsoftc *isp;
- u_int8_t *nvram_data;
+isp_parse_nvram_2100(struct ispsoftc *isp, u_int8_t *nvram_data)
{
fcparam *fcp = (fcparam *) isp->isp_param;
u_int64_t wwn;