test at Target mode
Kayoko Isshi
isshi at cs.fujitsu.co.jp
Thu Sep 6 23:01:07 PDT 2001
To M.Gibbs
I am sorry to give you my slow reply.
In my system, pseud-target I/O has realized completely(?).
"Justin T. Gibbs" wrote:
> The kernel driver should handle the abort message and simply reset the
> sequencer. This will cause the bus to go free and program execution
> to start from the top.
When a target communicates with multilpe initiators and receive abort message,
the target should not reset the sequencer,I think.
> >There are 3 cases when abort/reset message received:
> > 1)C006 →Abort message× goto ident_message_done
> > 2)0C →Device Reset message○ goto host_message_loop
> > 3)C020260d →Abort tag message× goto ident_message_done
> Yes, this is definitely a bug. We need to set a flag indicating that
> an acked message is pending and then test this flag rather than ATNI.
> I've attached some diffs, relative to the latest released sequencer,
> that may work. They include a fix so that we will accept an abort
> tag even if our incomming command queue is full. These are untested.
I expect the latest code.
> >If it gose to host_message_loop,
> >it invokes an INTSTAT interrupt with HOST_MSG_LOOP.
> >Then the driver can change the registers but cannot change the route.
>
> The only alternate route is bus free which can be achieved by resetting
> the sequencer (ahc_reset()).
See above.
-------------------except for sequencer
Futhermore,
I have 2 changes in my AIC7xxx driver code.
1)In rare case, the following sequence occurred.
RSL MI=C020XX MO=0d BF
This means that initiator rejects the TAG=XX.
Then the driver dose not get correct TAG id.
Added: INITIATOR_TAG ->SCB_TARGET_INFO+SCB_INITIATOR_TAG
2) ahc_intr handler cannot get continuous CMDCMPLT interrupts.
------------------ahc_intr start
if ((ahc->flags & (AHC_ALL_INTERRUPTS|AHC_EDGE_INTERRUPT)) == 0
<A> && (queuestat = ahc_check_cmdcmpltqueues(ahc)) != 0)
intstat = CMDCMPLT;
...................
if (intstat & CMDCMPLT) {
ahc_outb(ahc, CLRINT, CLRCMDINT);
ahc_flush_device_writes(ahc);
#ifdef KAYO
/* added 20010905 *//* changed 20010907 by H.Y */
while(0 != (queuestat = ahc_check_cmdcmpltqueues(ahc))) {
#endif
#ifdef AHC_TARGET_MODE
<B> if ((queuestat & AHC_RUN_QOUTFIFO) != 0)
#endif
ahc_run_qoutfifo(ahc);
<C> if ((queuestat & AHC_RUN_TQINFIFO) != 0)
ahc_run_tqinfifo(ahc, /*paused*/FALSE);
}
..................
------------------ahc_intr end
Added:
When the next CMDCMPLT interrupts occur from <A> to <B>/<C>,
queuestat becomes old; I add refreshing queuestat.
Thanks
----------------------
Kayoko Isshi
To Unsubscribe: send mail to majordomo at FreeBSD.org
with "unsubscribe aic7xxx" in the body of the message
More information about the aic7xxx
mailing list