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