[Skyeye-developer] SOLVED: The source code of 8019 netcard driver
that can run onSkyEye
Michael.Kang
blackfin.kang at gmail.com
Sun Aug 26 12:52:41 CST 2007
On 8/26/07, Michael. Kang <blackfin.kang at gmail.com> wrote:
> After quick try, I have not reproduced your result on
> uClinux-dist-20070130 and skyeye-1.2.3 version. What is your
> uClinux-dist version?Even I can not ping host machine from SkyEye.
> I will go on dig into the cause and will try uClinux-dist-20040408.
That is my fault. I use wrong skyeye.conf to run your patch.
>
> -- Thanks
> -- Michael.Kang
>
> On 8/26/07, Stanislav Meduna <stano at meduna.org> wrote:
> > Stanislav Meduna wrote:
> >
> > >> Once I found that something wrong within the IRQ handling of
> > >> the linux driver, I tried to fixed it and tested successfully by
> > >> downloading lots on S3C44B0X simulation from the server
> > >> running CrobFtp.
> >
> > OK, I got it to work. Two major problems in the linux part:
> >
> > - First, the uClinux is probably broken for this platform -
> > it sends EOI commands, but as data value it sends the same
> > as the address. As this happens in the deep assembler
> > part of linux, I was unable to fix it. However, commenting
> > the EOI routine in SkyEye had no ill effects and did not
> > make things worse.
> >
> > - Second, the rtl8019.c has indeed a grave bug - on interrupt
> > it reads one packet, even if there are more available.
> > On the next interrupt the oldest one (and only one)
> > is read etc. I fixed it by adding a loop and it seems
> > to work.
> >
> >
> > Smaller problems in the skyeye's rtl8019:
> >
> > - The time compare routine is suspicious - I think it
> > did not work for some values of seconds and microseconds.
> > Fixed.
> >
> > - The timeout scheduling is suspicious - it schedules the
> > 'packet was transmitted' interrupt <packet-length> _milliseconds_
> > after it arrived. Changed this to 10 ms fix, seems to work.
> >
> > - Promiscuos/multicast handling is broken - first the test
> > for broadcast is inverted, second the tuntap's MAC matches
> > the test for multicast address sometimes. Commented this
> > all out (so we are always promiscuos) - on tuntap
> > it does not make any difference anyway.
> >
> > I now have a SkyEye-version that is able to reliably respond to pings
> > and passes a ftp smoke-test (I have to do some more tests).
> >
> > Please, review the changes and if the skyeye's part makes sense,
> > include them to the svn trunk. The diffs are against svn r290.
> > The original rtl8019.c can be found in one of the previous mails
> > in this thread.
> >
> > > But I can't provide the modified source because my old machine
> > > was gone.
> >
> > Hopefully the mailing list archive will be a better backup now ;)
> >
> > Thanks
> > --
> > Stano
> >
> > --- linux-2.4.x/drivers/net/rtl8019.c.orig 2007-08-25 17:57:48.000000000 +0200
> > +++ linux-2.4.x/drivers/net/rtl8019.c 2007-08-25 18:00:29.000000000 +0200
> > @@ -99,6 +99,7 @@
> > }
> >
> > if (RxStatus & 1) {
> > +readpacket:
> > TRACE("Receivex packet....\n");
> > outportb(ISR, 0x1); //clr Rx interupt
> > SetRegPage(1);
> > @@ -199,6 +200,9 @@
> > priv->stats.rx_packets++;
> > priv->stats.rx_bytes +=RxLength;
> > netif_rx(skb);
> > + /* Process all unread data */
> > + if (RxPageEnd != RxNextPage)
> > + goto readpacket;
> > } else {
> > outportb(ISR, 0xfe);
> > }
> >
> > Index: device/net/dev_net_rtl8019.c
> > ===================================================================
> > --- device/net/dev_net_rtl8019.c (revision 290)
> > +++ device/net/dev_net_rtl8019.c (working copy)
> > @@ -69,7 +69,7 @@
> > (memcmp(&tv1, &tv2, sizeof(struct timeval)) == 0 ? \
> > 0 : ( \
> > tv1.tv_sec < tv2.tv_sec ? -1 : ( \
> > - tv1.tv_usec < tv2.tv_usec ? -1 : 1 \
> > + (tv1.tv_sec == tv2.tv_sec && tv1.tv_usec < tv2.tv_usec) ? -1 : 1 \
> > )))
> >
> > static void set_time(int index, int packets)
> > @@ -78,6 +78,7 @@
> >
> > if (packets <= 0) return;
> > if (gettimeofday(ð_timeout[index], NULL) != 0) return;
> > + packets=10; /* In 10 ms - no reason to wait 1 second for a big packet */
> >
> > TIMEVAL_ADD_USEC(eth_timeout[index], packets * 1000);
> > eth_timeout_flags[index] = 1;
> > @@ -815,9 +816,14 @@
> > frame_header[3] = (rtl8019_len >> 8); //high 8 bit
> >
> > /* check if we are in in promiscuous mode */
> > + /* The tuntap does sometimes match the multicast address and
> > + * we _want_ to get broadcasts. Ignore this all and play
> > + * promisc.
> > + */
> > +#if 0
> > if (!(io->RCR & RCR_PRO)) {
> > /* not in promiscuous mode */
> > - if (!is_broadcast (buf)) {
> > + if (is_broadcast (buf)) {
> > DBG_PRINT
> > (" destination address is a broadcast address!!!\n");
> > if (!(io->RCR & RCR_AB)) {
> > @@ -839,6 +845,7 @@
> > return;
> > }
> > }
> > +#endif
> >
> > sramptr = &io->sram[(io->CURR - START_PAGE) * PAGE_SIZE];
> >
> > Index: arch/arm/mach/skyeye_mach_at91.c
> > ===================================================================
> > --- arch/arm/mach/skyeye_mach_at91.c (revision 290)
> > +++ arch/arm/mach/skyeye_mach_at91.c (working copy)
> > @@ -684,8 +684,14 @@
> > break;
> > case 0xfffff130: /* EOI */
> > DBG_PRINT (stderr, "EOI=0x%x\n", data);
> > + /* 2.4.32 in uClinux is broken somehow and always sends
> > + * 0xfffff130 as both address and data, sometimes clearing
> > + * not yet processed interrupt. Anyway, the thing
> > + * works without the following */
> > +#if 0
> > io.eoicr = data;
> > io.ipr &= ~data;
> > +#endif
> > at91_update_int (state);
> > break;
> > case 0xfff00000: /* CPU ID */
> >
> > _______________________________________________
> > Skyeye-developer mailing list
> > Skyeye-developer at lists.gro.clinux.org
> > http://lists.gro.clinux.org/cgi-bin/mailman/listinfo/skyeye-developer
> >
> >
>
>
> --
> www.skyeye.org
>
--
www.skyeye.org
More information about the Skyeye-developer
mailing list