summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Motin <mav@FreeBSD.org>2020-11-24 15:32:25 +0000
committerAlexander Motin <mav@FreeBSD.org>2020-11-24 15:32:25 +0000
commit384d27e04d704397fedaa9d6be426e52b593ed1f (patch)
tree8e41c2af47a8f3b550eae31a530d4ca4d667fd94
parent1553bf11b9d7f3c729d5344bf6770b63a514ca5e (diff)
Notes
-rw-r--r--sys/dev/isp/isp.c36
-rw-r--r--sys/dev/isp/isp_freebsd.c61
-rw-r--r--sys/dev/isp/isp_freebsd.h14
-rw-r--r--sys/dev/isp/ispvar.h5
4 files changed, 16 insertions, 100 deletions
diff --git a/sys/dev/isp/isp.c b/sys/dev/isp/isp.c
index 356c72df1ce1..cfac31fcdfe4 100644
--- a/sys/dev/isp/isp.c
+++ b/sys/dev/isp/isp.c
@@ -3216,7 +3216,7 @@ isp_intr_mbox(ispsoftc_t *isp, uint16_t mbox0)
continue;
isp->isp_mboxtmp[i] = ISP_READ(isp, MBOX_OFF(i));
}
- MBOX_NOTIFY_COMPLETE(isp);
+ isp->isp_mboxbsy = 0;
}
void
@@ -3489,7 +3489,7 @@ isp_intr_async(ispsoftc_t *isp, uint16_t mbox)
if (isp->isp_mboxbsy) {
isp->isp_obits = 1;
isp->isp_mboxtmp[0] = MBOX_HOST_INTERFACE_ERROR;
- MBOX_NOTIFY_COMPLETE(isp);
+ isp->isp_mboxbsy = 0;
}
/*
* It's up to the handler for isp_async to reinit stuff and
@@ -4243,7 +4243,7 @@ isp_mboxcmd(ispsoftc_t *isp, mbreg_t *mbp)
{
const char *cname, *xname, *sname;
char tname[16], mname[16];
- unsigned int ibits, obits, box, opcode;
+ unsigned int ibits, obits, box, opcode, t, to;
opcode = mbp->param[0];
if (opcode > MAX_FC_OPCODE) {
@@ -4279,14 +4279,6 @@ isp_mboxcmd(ispsoftc_t *isp, mbreg_t *mbp)
return;
}
- /*
- * Get exclusive usage of mailbox registers.
- */
- if (MBOX_ACQUIRE(isp)) {
- mbp->param[0] = MBOX_REGS_BUSY;
- goto out;
- }
-
for (box = 0; box < ISP_NMBOX(isp); box++) {
if (ibits & (1 << box)) {
isp_prt(isp, ISP_LOGDEBUG3, "IN mbox %d = 0x%04x", box,
@@ -4297,10 +4289,6 @@ isp_mboxcmd(ispsoftc_t *isp, mbreg_t *mbp)
}
isp->isp_lastmbxcmd = opcode;
-
- /*
- * We assume that we can't overwrite a previous command.
- */
isp->isp_obits = obits;
isp->isp_mboxbsy = 1;
@@ -4312,14 +4300,24 @@ isp_mboxcmd(ispsoftc_t *isp, mbreg_t *mbp)
/*
* While we haven't finished the command, spin our wheels here.
*/
- MBOX_WAIT_COMPLETE(isp, mbp);
+ to = (mbp->timeout == 0) ? MBCMD_DEFAULT_TIMEOUT : mbp->timeout;
+ for (t = 0; t < to; t += 100) {
+ if (!isp->isp_mboxbsy)
+ break;
+ ISP_RUN_ISR(isp);
+ if (!isp->isp_mboxbsy)
+ break;
+ ISP_DELAY(100);
+ }
/*
* Did the command time out?
*/
- if (mbp->param[0] == MBOX_TIMEOUT) {
+ if (isp->isp_mboxbsy) {
isp->isp_mboxbsy = 0;
- MBOX_RELEASE(isp);
+ isp_prt(isp, ISP_LOGWARN, "Mailbox Command (0x%x) Timeout (%uus) (%s:%d)",
+ isp->isp_lastmbxcmd, to, mbp->func, mbp->lineno);
+ mbp->param[0] = MBOX_TIMEOUT;
goto out;
}
@@ -4334,8 +4332,6 @@ isp_mboxcmd(ispsoftc_t *isp, mbreg_t *mbp)
}
}
- isp->isp_mboxbsy = 0;
- MBOX_RELEASE(isp);
out:
if (mbp->logval == 0 || mbp->param[0] == MBOX_COMMAND_COMPLETE)
return;
diff --git a/sys/dev/isp/isp_freebsd.c b/sys/dev/isp/isp_freebsd.c
index 1fe3fdf94e9f..ce153278eaf1 100644
--- a/sys/dev/isp/isp_freebsd.c
+++ b/sys/dev/isp/isp_freebsd.c
@@ -3250,10 +3250,7 @@ isp_async(ispsoftc_t *isp, ispasync_t cmd, ...)
mbox1 = ISP_READ(isp, OUTMAILBOX1);
isp_prt(isp, ISP_LOGERR, "Internal Firmware Error @ RISC Address 0x%x", mbox1);
#if 0
- mbox1 = isp->isp_osinfo.mbox_sleep_ok;
- isp->isp_osinfo.mbox_sleep_ok = 0;
isp_reinit(isp, 1);
- isp->isp_osinfo.mbox_sleep_ok = mbox1;
isp_async(isp, ISPASYNC_FW_RESTARTED, NULL);
#endif
break;
@@ -3360,64 +3357,6 @@ isp_nanotime_sub(struct timespec *b, struct timespec *a)
}
int
-isp_mbox_acquire(ispsoftc_t *isp)
-{
- if (isp->isp_osinfo.mboxbsy) {
- return (1);
- } else {
- isp->isp_osinfo.mboxcmd_done = 0;
- isp->isp_osinfo.mboxbsy = 1;
- return (0);
- }
-}
-
-void
-isp_mbox_wait_complete(ispsoftc_t *isp, mbreg_t *mbp)
-{
- u_int t, to;
-
- to = (mbp->timeout == 0) ? MBCMD_DEFAULT_TIMEOUT : mbp->timeout;
- if (isp->isp_osinfo.mbox_sleep_ok) {
- isp->isp_osinfo.mbox_sleep_ok = 0;
- isp->isp_osinfo.mbox_sleeping = 1;
- msleep_sbt(&isp->isp_osinfo.mboxcmd_done, &isp->isp_lock,
- PRIBIO, "ispmbx_sleep", to * SBT_1US, 0, 0);
- isp->isp_osinfo.mbox_sleep_ok = 1;
- isp->isp_osinfo.mbox_sleeping = 0;
- } else {
- for (t = 0; t < to; t += 100) {
- if (isp->isp_osinfo.mboxcmd_done)
- break;
- ISP_RUN_ISR(isp);
- if (isp->isp_osinfo.mboxcmd_done)
- break;
- ISP_DELAY(100);
- }
- }
- if (isp->isp_osinfo.mboxcmd_done == 0) {
- isp_prt(isp, ISP_LOGWARN, "%s Mailbox Command (0x%x) Timeout (%uus) (%s:%d)",
- isp->isp_osinfo.mbox_sleep_ok? "Interrupting" : "Polled",
- isp->isp_lastmbxcmd, to, mbp->func, mbp->lineno);
- mbp->param[0] = MBOX_TIMEOUT;
- isp->isp_osinfo.mboxcmd_done = 1;
- }
-}
-
-void
-isp_mbox_notify_done(ispsoftc_t *isp)
-{
- isp->isp_osinfo.mboxcmd_done = 1;
- if (isp->isp_osinfo.mbox_sleeping)
- wakeup(&isp->isp_osinfo.mboxcmd_done);
-}
-
-void
-isp_mbox_release(ispsoftc_t *isp)
-{
- isp->isp_osinfo.mboxbsy = 0;
-}
-
-int
isp_fc_scratch_acquire(ispsoftc_t *isp, int chan)
{
int ret = 0;
diff --git a/sys/dev/isp/isp_freebsd.h b/sys/dev/isp/isp_freebsd.h
index ed4d95cecbfd..74eb28020aa8 100644
--- a/sys/dev/isp/isp_freebsd.h
+++ b/sys/dev/isp/isp_freebsd.h
@@ -269,11 +269,6 @@ struct isposinfo {
struct isp_pcmd * pcmd_pool;
struct isp_pcmd * pcmd_free;
- int mbox_sleeping;
- int mbox_sleep_ok;
- int mboxbsy;
- int mboxcmd_done;
-
struct callout tmo; /* general timer */
/*
@@ -428,11 +423,6 @@ default: \
break; \
}
-#define MBOX_ACQUIRE isp_mbox_acquire
-#define MBOX_WAIT_COMPLETE isp_mbox_wait_complete
-#define MBOX_NOTIFY_COMPLETE isp_mbox_notify_done
-#define MBOX_RELEASE isp_mbox_release
-
#define FC_SCRATCH_ACQUIRE isp_fc_scratch_acquire
#define FC_SCRATCH_RELEASE(isp, chan) isp->isp_osinfo.pc.fc[chan].fcbsy = 0
@@ -631,10 +621,6 @@ extern int isp_quickboot_time;
void isp_prt(ispsoftc_t *, int level, const char *, ...) __printflike(3, 4);
void isp_xs_prt(ispsoftc_t *, XS_T *, int level, const char *, ...) __printflike(4, 5);
uint64_t isp_nanotime_sub(struct timespec *, struct timespec *);
-int isp_mbox_acquire(ispsoftc_t *);
-void isp_mbox_wait_complete(ispsoftc_t *, mbreg_t *);
-void isp_mbox_notify_done(ispsoftc_t *);
-void isp_mbox_release(ispsoftc_t *);
int isp_fc_scratch_acquire(ispsoftc_t *, int);
void isp_platform_intr(void *);
void isp_platform_intr_resp(void *);
diff --git a/sys/dev/isp/ispvar.h b/sys/dev/isp/ispvar.h
index 3177dc169218..815cce3116b9 100644
--- a/sys/dev/isp/ispvar.h
+++ b/sys/dev/isp/ispvar.h
@@ -831,11 +831,6 @@ void isp_async(ispsoftc_t *, ispasync_t, ...);
* various objects so that the ISP's and the system's view
* of the same object is consistent.
*
- * MBOX_ACQUIRE(ispsoftc_t *) acquire lock on mailbox regs
- * MBOX_WAIT_COMPLETE(ispsoftc_t *, mbreg_t *) wait for cmd to be done
- * MBOX_NOTIFY_COMPLETE(ispsoftc_t *) notification of mbox cmd donee
- * MBOX_RELEASE(ispsoftc_t *) release lock on mailbox regs
- *
* FC_SCRATCH_ACQUIRE(ispsoftc_t *, chan) acquire lock on FC scratch area
* return -1 if you cannot
* FC_SCRATCH_RELEASE(ispsoftc_t *, chan) acquire lock on FC scratch area