Date: Fri, 07 Sep 2001 15:11:46 +0900 From: Kayoko Isshi <isshi@cs.fujitsu.co.jp> To: "Justin T. Gibbs" <gibbs@scsiguy.com> Cc: "'aic7xxx@FreeBSD.ORG'" <aic7xxx@FreeBSD.ORG> Subject: Re: test at Target mode Message-ID: <3B986522.9022A9A6@cs.fujitsu.co.jp> References: <200108172140.f7HLe8I00977@aslan.scsiguy.com>
next in thread | previous in thread | raw e-mail | index | archive | help
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@FreeBSD.org with "unsubscribe aic7xxx" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3B986522.9022A9A6>