bge(4) one packet wedge
Oleg Bulyzhin
oleg at FreeBSD.org
Thu Aug 24 01:04:28 UTC 2006
On Wed, Aug 23, 2006 at 05:54:24PM -0700, David Christensen wrote:
> > On Wed, Aug 23, 2006 at 12:53:49PM -0700, David Christensen wrote:
> > > This "lost interrupt" type of problem is addressed by the use of the
> > > status_tag
> > > field in the status block. (Listed as bge_rsvd0 in the
> > bge_status_block
> > > structure).
> > > Everytime the status block is updated a new tag value is
> > written to the
> > > status block.
> > > When the ISR starts the driver should record the status_tag
> > value. At
> > > the end
> > > of the ISR, the driver should compare the current
> > status_tag value is
> > > the status
> > > block with the value recorded on entry to the ISR. If the
> > values are
> > > the same
> > > then no additional status block updates have occurred so
> > there shouldn't
> > > be
> > > any packets hanging around. If the values are different
> > then additional
> > > packets
> > > or completions are waiting around so the ISR should loop
> > around again.
> > > At the
> > > end of the ISR the driver will write the status_tag value it last
> > > handled to a
> > > mailbox register, letting the hardware know the last status
> > block update
> > > handled.
> > > If necessary the hardware will generate a new interrupt and
> > start the
> > > process over
> > > again.
> > >
> > > This entire process should be included in the Linux driver,
> > I don't see
> > > it being
> > > used in the bge driver (bge_intr()).
> > >
> > > Dave
> > >
> >
> > Could you please answer few questions?
> >
> > 1) I've found status tag is returned in status block even if
> > bit 9 of Misc.
> > Host Control Register is not set, is it ok?
>
> Which controller are you using? This bit is reserved on the 5700
> (which didn't support tagged status mode) but all other controllers
> should support it and all of the Broadcom drivers will always
> enable it.
I tested it on bcm5701 & bcm5721
>
> >
> > 2) Status tag is returned in bits 0-7 of status tag field of
> > status block,
> > as long as i know it should be returned in bits 31-24, is it ok?
>
> Not sure what you mean by this. If you're seeing it in bits 31-24
> of the status block then there may be an endian issue on your system.
> Check that byte/word swapping is set correctly.
>
> >
> > 3) If i try to return processed tag (at the end of ISR) in
> > Mailbox 0 register:
> > CSR_WRITE_4(sc, BGE_MBX_IRQ0_LO, status_tag << 24);
> > it would lead to disabled interrupts.
> > I've thought this should not happen cause in_isr bits
> > (0-23) are cleared.
>
> Writing a non-zero value to bits 23:0 will cause the interrupt to
> be disabled:
>
> CSR_WRITE_4(sc, BGE_MBX_IRQ0_LO, 1);
>
> Writing all zeros to bits 23:0 will enable interrupts.
>
> CSR_WRITE_4(sc, BGE_MBX_IRQ0_LO, status_tag << 24);
>
> The tag value written to bits 31:24 does not affect the interrupt
> state.
Yes, this is i'm talking about:
CSR_WRITE_4(sc, BGE_MBX_IRQ0_LO, 0x01000000) would lead to _disabled_
interrupts.
Tested on bcm5701 & bcm5721.
P.S. bcm5705 does not support tagged status mode, am i right?
--
Oleg.
More information about the freebsd-net
mailing list