public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* Broadcom 5700/5701 Gigabit Ethernet Adapters
@ 2002-02-15 12:58 Frank Elsner
  2002-02-15 13:06 ` Jeff Garzik
  2002-02-15 14:43 ` J Sloan
  0 siblings, 2 replies; 58+ messages in thread
From: Frank Elsner @ 2002-02-15 12:58 UTC (permalink / raw)
  To: Kernel Mailing List


I'm currently using kernel 2.4.9-21 from RH, after updating my RH 7.2.

I want to build a custom kernel 2.4.17 but 
the "Broadcom 5700/5701 Gigabit Ethernet Adapter" (which I need)
isn't in the source. Obviously an addon from RH.

Why isn't the driver in the main kernel tree ?

Kind regards   _______________________________________________________________ 
Frank Elsner  /                         c/o  Technische Universitaet Berlin   |
 ____________/                               ZRZ, Sekr. E-N 50                |
|                                            Einsteinufer 17                  |
| Voice: +49 30 314 23897                    D-10587 Berlin                   |
| SMTP : Elsner@zrz.TU-Berlin.DE             Germany  ________________________|
|____________________________________________________| Und das ist auch gut so      



^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-02-15 12:58 Broadcom 5700/5701 Gigabit Ethernet Adapters Frank Elsner
@ 2002-02-15 13:06 ` Jeff Garzik
  2002-02-15 14:36   ` Thomas Langås
  2002-02-15 15:03   ` Jason Lunz
  2002-02-15 14:43 ` J Sloan
  1 sibling, 2 replies; 58+ messages in thread
From: Jeff Garzik @ 2002-02-15 13:06 UTC (permalink / raw)
  To: linux-kernel, elsner

Frank Elsner wrote:
> 
> I'm currently using kernel 2.4.9-21 from RH, after updating my RH 7.2.
> 
> I want to build a custom kernel 2.4.17 but
> the "Broadcom 5700/5701 Gigabit Ethernet Adapter" (which I need)
> isn't in the source. Obviously an addon from RH.
> 
> Why isn't the driver in the main kernel tree ?

Cuz the driver is a piece of crap, and BroadCom isn't interested in
working with the open source community to fix up the issues.

DaveM and I should have something eventually, which will make the
RH-shipped driver irrelevant.

	Jeff


-- 
Jeff Garzik      | "I went through my candy like hot oatmeal
Building 1024    |  through an internally-buttered weasel."
MandrakeSoft     |             - goats.com

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-02-15 13:06 ` Jeff Garzik
@ 2002-02-15 14:36   ` Thomas Langås
  2002-02-15 14:45     ` Jeff Garzik
  2002-02-15 20:20     ` David S. Miller
  2002-02-15 15:03   ` Jason Lunz
  1 sibling, 2 replies; 58+ messages in thread
From: Thomas Langås @ 2002-02-15 14:36 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-kernel, elsner

Jeff Garzik:
> DaveM and I should have something eventually, which will make the
> RH-shipped driver irrelevant.

How's this coming along?  Do you have specs which are free?  Ie. could
others get the specs too?  (Contacting broadcom doesn't help, I've tried
that).

-- 
Thomas

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-02-15 12:58 Broadcom 5700/5701 Gigabit Ethernet Adapters Frank Elsner
  2002-02-15 13:06 ` Jeff Garzik
@ 2002-02-15 14:43 ` J Sloan
  2002-02-27 14:12   ` Stephan von Krawczynski
  1 sibling, 1 reply; 58+ messages in thread
From: J Sloan @ 2002-02-15 14:43 UTC (permalink / raw)
  To: linux-kernel, elsner

You could grab the rh rawhide kernel source
rpm, which is 2.4.17 + many patches -

Joe

Frank Elsner wrote:

>I'm currently using kernel 2.4.9-21 from RH, after updating my RH 7.2.
>
>I want to build a custom kernel 2.4.17 but 
>the "Broadcom 5700/5701 Gigabit Ethernet Adapter" (which I need)
>isn't in the source. Obviously an addon from RH.
>
>Why isn't the driver in the main kernel tree ?
>
>Kind regards   _______________________________________________________________ 
>Frank Elsner  /                         c/o  Technische Universitaet Berlin   |
> ____________/                               ZRZ, Sekr. E-N 50                |
>|                                            Einsteinufer 17                  |
>| Voice: +49 30 314 23897                    D-10587 Berlin                   |
>| SMTP : Elsner@zrz.TU-Berlin.DE             Germany  ________________________|
>|____________________________________________________| Und das ist auch gut so      
>
>
>-
>To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>the body of a message to majordomo@vger.kernel.org
>More majordomo info at  http://vger.kernel.org/majordomo-info.html
>Please read the FAQ at  http://www.tux.org/lkml/
>



^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-02-15 14:36   ` Thomas Langås
@ 2002-02-15 14:45     ` Jeff Garzik
  2002-02-15 14:55       ` Thomas Langås
  2002-02-15 20:20     ` David S. Miller
  1 sibling, 1 reply; 58+ messages in thread
From: Jeff Garzik @ 2002-02-15 14:45 UTC (permalink / raw)
  To: linux-kernel; +Cc: elsner

Thomas Langås wrote:
> 
> Jeff Garzik:
> > DaveM and I should have something eventually, which will make the
> > RH-shipped driver irrelevant.
> 
> How's this coming along?  Do you have specs which are free?  Ie. could
> others get the specs too?  (Contacting broadcom doesn't help, I've tried
> that).

I wish.  The only info source we have is their latest GPL'd driver.

It's coming along slowly at the moment... I haven't had time to mess
with it for a few months, and I not DaveM was originally supposed to be
filling in the rx/tx dma stuff, and h/w init.  DaveM jumped in recently
and played a bit with the h/w init stage.

My guess is maybe another month or two until others can play with
"tg3"...

	Jeff


-- 
Jeff Garzik      | "I went through my candy like hot oatmeal
Building 1024    |  through an internally-buttered weasel."
MandrakeSoft     |             - goats.com

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-02-15 14:45     ` Jeff Garzik
@ 2002-02-15 14:55       ` Thomas Langås
  2002-02-15 15:00         ` Jeff Garzik
  0 siblings, 1 reply; 58+ messages in thread
From: Thomas Langås @ 2002-02-15 14:55 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-kernel, elsner

Jeff Garzik:
> It's coming along slowly at the moment... I haven't had time to mess
> with it for a few months, and I not DaveM was originally supposed to be
> filling in the rx/tx dma stuff, and h/w init.  DaveM jumped in recently
> and played a bit with the h/w init stage.

Is it possible for others to get axs to the work you guys have already done?

-- 
Thomas

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-02-15 14:55       ` Thomas Langås
@ 2002-02-15 15:00         ` Jeff Garzik
  2002-02-15 15:36           ` Thomas Langås
  0 siblings, 1 reply; 58+ messages in thread
From: Jeff Garzik @ 2002-02-15 15:00 UTC (permalink / raw)
  To: linux-kernel; +Cc: elsner

Thomas Langås wrote:
> 
> Jeff Garzik:
> > It's coming along slowly at the moment... I haven't had time to mess
> > with it for a few months, and I not DaveM was originally supposed to be
> > filling in the rx/tx dma stuff, and h/w init.  DaveM jumped in recently
> > and played a bit with the h/w init stage.
> 
> Is it possible for others to get axs to the work you guys have already done?

Everything is checked into vger cvs

-- 
Jeff Garzik      | "I went through my candy like hot oatmeal
Building 1024    |  through an internally-buttered weasel."
MandrakeSoft     |             - goats.com

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-02-15 13:06 ` Jeff Garzik
  2002-02-15 14:36   ` Thomas Langås
@ 2002-02-15 15:03   ` Jason Lunz
  2002-02-26 20:09     ` Jes Sorensen
  1 sibling, 1 reply; 58+ messages in thread
From: Jason Lunz @ 2002-02-15 15:03 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-kernel

In mlist.linux-kernel, you wrote:
> Cuz the driver is a piece of crap, and BroadCom isn't interested in
> working with the open source community to fix up the issues.

Can you elaborate? What are the issues? I've found the broadcomm driver
to be more robust than the in-kernel one for acenic cards. With acenic,
I've had a null-pointer deref on SMP and other lockups where I wasn't
lucky enough to get an oops.

Also, broadcomm-driven cards can be put in a bridge. An acenic/bridge
combination will crash the kernel hard when tcp traverses the bridge.

> DaveM and I should have something eventually, which will make the
> RH-shipped driver irrelevant.

that would be oh-so-nice. Do you need cards to play with? I've got a
couple of 3com broadcomm-chipset cards I prabably won't be needing.

-- 
Jason Lunz		Trellis Network Security
j@trellisinc.com	http://www.trellisinc.com/

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-02-15 15:00         ` Jeff Garzik
@ 2002-02-15 15:36           ` Thomas Langås
  0 siblings, 0 replies; 58+ messages in thread
From: Thomas Langås @ 2002-02-15 15:36 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-kernel, elsner

Jeff Garzik:
> > Is it possible for others to get axs to the work you guys have already done?
> Everything is checked into vger cvs

Ok, found it :)

-- 
Thomas

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-02-15 14:36   ` Thomas Langås
  2002-02-15 14:45     ` Jeff Garzik
@ 2002-02-15 20:20     ` David S. Miller
  2002-02-19  0:18       ` Thomas Langås
  1 sibling, 1 reply; 58+ messages in thread
From: David S. Miller @ 2002-02-15 20:20 UTC (permalink / raw)
  To: linux-kernel, thomas; +Cc: jgarzik, elsner

   From: Thomas Langås <thomas@langaas.org>
   Date: Fri, 15 Feb 2002 15:36:04 +0100

   How's this coming along?  Do you have specs which are free?  Ie. could
   others get the specs too?  (Contacting broadcom doesn't help, I've tried
   that).
   
No, we've been reverse engineering the hardware using the sources of
Broadcom's driver.  This is why the work is taking so long.

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-02-15 20:20     ` David S. Miller
@ 2002-02-19  0:18       ` Thomas Langås
  0 siblings, 0 replies; 58+ messages in thread
From: Thomas Langås @ 2002-02-19  0:18 UTC (permalink / raw)
  To: linux-kernel

David S. Miller:
> No, we've been reverse engineering the hardware using the sources of
> Broadcom's driver.  This is why the work is taking so long.

Ok, I've downloaded the driver, and tried building as a modue to a
2.4.17-kernel. It segfaulted when I tried loading it (since it says it's not
done, I wasn't expecting it to work :).  However, my question is; how do you
guys develope network drivers, for instance?  I mean, in order to test a new
version (after the first has segfaulted), I need to reboot.  

I've got the broadcom-version dated 2th january 2002, and wanted to try and
implement small parts of missing code, mostly for educational purposes to
learn more about kernel programming.

-- 
Thomas

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-02-15 15:03   ` Jason Lunz
@ 2002-02-26 20:09     ` Jes Sorensen
  0 siblings, 0 replies; 58+ messages in thread
From: Jes Sorensen @ 2002-02-26 20:09 UTC (permalink / raw)
  To: Jason Lunz; +Cc: Jeff Garzik, linux-kernel

Jason Lunz <j@trellisinc.com> writes:

> In mlist.linux-kernel, you wrote:
> > Cuz the driver is a piece of crap, and BroadCom isn't interested in
> > working with the open source community to fix up the issues.
> 
> Can you elaborate? What are the issues? I've found the broadcomm driver
> to be more robust than the in-kernel one for acenic cards. With acenic,
> I've had a null-pointer deref on SMP and other lockups where I wasn't
> lucky enough to get an oops.

Ehm, it would be nice to get some more details on this. Few people
have reported problems with the acenic driver for a long time, except
for certain highmem configs and a problem with very old Tigon I cards.

Jes

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-02-15 14:43 ` J Sloan
@ 2002-02-27 14:12   ` Stephan von Krawczynski
  2002-03-10 15:33     ` Harald Welte
  0 siblings, 1 reply; 58+ messages in thread
From: Stephan von Krawczynski @ 2002-02-27 14:12 UTC (permalink / raw)
  To: J Sloan; +Cc: linux-kernel, elsner

Hello,

quick additional question concerning this topic:
If I were free to buy any Gigabit Adapter, what would be the known-to-work choice (including existence of a GPL driver, of course)?

Regards,
Stephan

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-02-27 14:12   ` Stephan von Krawczynski
@ 2002-03-10 15:33     ` Harald Welte
  2002-03-10 19:10       ` Jeff Garzik
  2002-03-11  0:41       ` David S. Miller
  0 siblings, 2 replies; 58+ messages in thread
From: Harald Welte @ 2002-03-10 15:33 UTC (permalink / raw)
  To: Stephan von Krawczynski; +Cc: J Sloan, linux-kernel, elsner

On Wed, Feb 27, 2002 at 03:12:18PM +0100, Stephan von Krawczynski wrote:
> Hello,
> 
> quick additional question concerning this topic:
> If I were free to buy any Gigabit Adapter, what would be the known-to-work
> choice (including existence of a GPL driver, of course)?

>From my point of view, there is no 'perfect' choice.

You can buy bcm57xx based boards, where the chipset is nice but the driver
not really nice yet.

You can buy syskonnect sk98 boards, which definitely have a good chipset - 
but the driver doesn't support the tcp transmit zerocopy path yet.  I've
tried to put some pressure on SysKonnect about this - but they seem a bit
'slow'.

You can buy natsemi boards, which is a more-or-less crappy chipset, but 
there is a nice linux driver.

Summary:

Old acenic boards are still the best solution - but there are no longer
available for quite some time :(

> Regards,
> Stephan

-- 
Live long and prosper
- Harald Welte / laforge@gnumonks.org               http://www.gnumonks.org/
============================================================================
GCS/E/IT d- s-: a-- C+++ UL++++$ P+++ L++++$ E--- W- N++ o? K- w--- O- M+ 
V-- PS++ PE-- Y++ PGP++ t+ 5-- !X !R tv-- b+++ !DI !D G+ e* h--- r++ y+(*)

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-10 15:33     ` Harald Welte
@ 2002-03-10 19:10       ` Jeff Garzik
  2002-03-10 21:35         ` Harald Welte
  2002-03-11  0:41       ` David S. Miller
  1 sibling, 1 reply; 58+ messages in thread
From: Jeff Garzik @ 2002-03-10 19:10 UTC (permalink / raw)
  To: Harald Welte; +Cc: Stephan von Krawczynski, J Sloan, linux-kernel, elsner

Harald Welte wrote:
> 
> On Wed, Feb 27, 2002 at 03:12:18PM +0100, Stephan von Krawczynski wrote:
> > Hello,
> >
> > quick additional question concerning this topic:
> > If I were free to buy any Gigabit Adapter, what would be the known-to-work
> > choice (including existence of a GPL driver, of course)?
> 
> >From my point of view, there is no 'perfect' choice.
> 
> You can buy bcm57xx based boards, where the chipset is nice but the driver
> not really nice yet.

What's not nice about "tg3"?

Have you tested it, and have bugs to report?

-- 
Jeff Garzik      | Usenet Rule #2 (John Gilmore): "The Net interprets
Building 1024    | censorship as damage and routes around it."
MandrakeSoft     |

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-10 19:10       ` Jeff Garzik
@ 2002-03-10 21:35         ` Harald Welte
  0 siblings, 0 replies; 58+ messages in thread
From: Harald Welte @ 2002-03-10 21:35 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: Stephan von Krawczynski, J Sloan, linux-kernel, elsner

On Sun, Mar 10, 2002 at 02:10:38PM -0500, Jeff Garzik wrote:

> > You can buy bcm57xx based boards, where the chipset is nice but the driver
> > not really nice yet.
> 
> What's not nice about "tg3"?

I was referring to the old bcm57xx drivers, not to the new 'tg3' driver
(about which I've read only after sending this mail).

I definitely appreciate the work on the tg3 driver done by you, DaveM and
others - no offense.

> Jeff Garzik      | Usenet Rule #2 (John Gilmore): "The Net interprets

-- 
Live long and prosper
- Harald Welte / laforge@gnumonks.org               http://www.gnumonks.org/
============================================================================
GCS/E/IT d- s-: a-- C+++ UL++++$ P+++ L++++$ E--- W- N++ o? K- w--- O- M+ 
V-- PS++ PE-- Y++ PGP++ t+ 5-- !X !R tv-- b+++ !DI !D G+ e* h--- r++ y+(*)

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-10 15:33     ` Harald Welte
  2002-03-10 19:10       ` Jeff Garzik
@ 2002-03-11  0:41       ` David S. Miller
  2002-03-11  0:55         ` Richard Gooch
  2002-03-11  6:07         ` Harald Welte
  1 sibling, 2 replies; 58+ messages in thread
From: David S. Miller @ 2002-03-11  0:41 UTC (permalink / raw)
  To: laforge; +Cc: skraw, joe, linux-kernel, elsner

   From: Harald Welte <laforge@gnumonks.org>
   Date: Sun, 10 Mar 2002 16:33:39 +0100
   
   You can buy bcm57xx based boards, where the chipset is nice but the driver
   not really nice yet.
   
My tg3 driver sucks then right?  Could you send me a bug report?

   You can buy syskonnect sk98 boards, which definitely have a good chipset - 
   but the driver doesn't support the tcp transmit zerocopy path yet.  I've
   tried to put some pressure on SysKonnect about this - but they seem a bit
   'slow'.
   
The hardware is not capable of doing it, due to bugs in the hw
checksum implementation of the sk98 chipset.  They aren't being
"slow" they just can't possibly implement it for you.

Franks a lot,
David S. Miller
davem@redhat.com

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  0:41       ` David S. Miller
@ 2002-03-11  0:55         ` Richard Gooch
  2002-03-11  1:03           ` David S. Miller
  2002-03-11  6:07         ` Harald Welte
  1 sibling, 1 reply; 58+ messages in thread
From: Richard Gooch @ 2002-03-11  0:55 UTC (permalink / raw)
  To: David S. Miller; +Cc: laforge, skraw, joe, linux-kernel, elsner

David S. Miller writes:
>    From: Harald Welte <laforge@gnumonks.org>
>    Date: Sun, 10 Mar 2002 16:33:39 +0100
>    
>    You can buy bcm57xx based boards, where the chipset is nice but the driver
>    not really nice yet.
>    
> My tg3 driver sucks then right?  Could you send me a bug report?
> 
>    You can buy syskonnect sk98 boards, which definitely have a good chipset - 
>    but the driver doesn't support the tcp transmit zerocopy path yet.  I've
>    tried to put some pressure on SysKonnect about this - but they seem a bit
>    'slow'.
>    
> The hardware is not capable of doing it, due to bugs in the hw
> checksum implementation of the sk98 chipset.  They aren't being
> "slow" they just can't possibly implement it for you.

So what is currently the best combination of gige card/driver/cost?
What do you recommend to the budget-conscious?

				Regards,

					Richard....
Permanent: rgooch@atnf.csiro.au
Current:   rgooch@ras.ucalgary.ca

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  0:55         ` Richard Gooch
@ 2002-03-11  1:03           ` David S. Miller
  2002-03-11  1:14             ` Richard Gooch
                               ` (2 more replies)
  0 siblings, 3 replies; 58+ messages in thread
From: David S. Miller @ 2002-03-11  1:03 UTC (permalink / raw)
  To: rgooch; +Cc: laforge, skraw, joe, linux-kernel, elsner

   From: Richard Gooch <rgooch@ras.ucalgary.ca>
   Date: Sun, 10 Mar 2002 17:55:44 -0700

   David S. Miller writes:
   > The hardware is not capable of doing it, due to bugs in the hw
   > checksum implementation of the sk98 chipset.  They aren't being
   > "slow" they just can't possibly implement it for you.
   
   So what is currently the best combination of gige card/driver/cost?
   What do you recommend to the budget-conscious?

I can only tell you what I know performance wise about cards,
and currently it looks like:

1) Intel E1000
2) Tigon2, aka. Acenic
3) SysKonnect sk98, but has broken TX checksums.  If it had
   working TX checksums it would be in 2nd place instead of Acenic.
   This hw bug is essentially why Acenics were used for all the
   TUX benchmarks runs instead of SysKonnect cards.
4) Tigon3, aka. bcm57xx

This may surprise some people, but frankly I think the Tigon3's PCI
dma engine is junk based upon my current knowledge of the card.  It is
always possible I may find out something new which kills this
perception I have of the card, but we'll see...

All the cards listed above have good GPL'd drivers available.

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  1:03           ` David S. Miller
@ 2002-03-11  1:14             ` Richard Gooch
  2002-03-11  1:31               ` David S. Miller
                                 ` (2 more replies)
  2002-03-11  2:04             ` Broadcom 5700/5701 Gigabit Ethernet Adapters Ben Collins
  2002-03-21 20:39             ` Thomas Langås
  2 siblings, 3 replies; 58+ messages in thread
From: Richard Gooch @ 2002-03-11  1:14 UTC (permalink / raw)
  To: David S. Miller; +Cc: laforge, skraw, joe, linux-kernel, elsner

David S. Miller writes:
>    From: Richard Gooch <rgooch@ras.ucalgary.ca>
>    Date: Sun, 10 Mar 2002 17:55:44 -0700
> 
>    David S. Miller writes:
>    > The hardware is not capable of doing it, due to bugs in the hw
>    > checksum implementation of the sk98 chipset.  They aren't being
>    > "slow" they just can't possibly implement it for you.
>    
>    So what is currently the best combination of gige card/driver/cost?
>    What do you recommend to the budget-conscious?
> 
> I can only tell you what I know performance wise about cards,
> and currently it looks like:
> 
> 1) Intel E1000
> 2) Tigon2, aka. Acenic
> 3) SysKonnect sk98, but has broken TX checksums.  If it had
>    working TX checksums it would be in 2nd place instead of Acenic.
>    This hw bug is essentially why Acenics were used for all the
>    TUX benchmarks runs instead of SysKonnect cards.
> 4) Tigon3, aka. bcm57xx
> 
> This may surprise some people, but frankly I think the Tigon3's PCI
> dma engine is junk based upon my current knowledge of the card.  It is
> always possible I may find out something new which kills this
> perception I have of the card, but we'll see...

I note the Intel card is pretty expensive. What are these "Addtron"
cards I see listed on www.pricewatch.com for US$36 ?Is that a
supported card under another name?

> All the cards listed above have good GPL'd drivers available.

When is the E1000 driver going to be added to the kernel?

				Regards,

					Richard....
Permanent: rgooch@atnf.csiro.au
Current:   rgooch@ras.ucalgary.ca

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  1:14             ` Richard Gooch
@ 2002-03-11  1:31               ` David S. Miller
  2002-03-11  1:31               ` Jeff Garzik
  2002-03-11  2:05               ` Wayne Whitney
  2 siblings, 0 replies; 58+ messages in thread
From: David S. Miller @ 2002-03-11  1:31 UTC (permalink / raw)
  To: rgooch; +Cc: laforge, skraw, joe, linux-kernel, elsner

   From: Richard Gooch <rgooch@ras.ucalgary.ca>
   Date: Sun, 10 Mar 2002 18:14:56 -0700

   I note the Intel card is pretty expensive. What are these "Addtron"
   cards I see listed on www.pricewatch.com for US$36 ?Is that a
   supported card under another name?

Probably Natsemi chipset based, it's not a good performer at all.
   

   > All the cards listed above have good GPL'd drivers available.
   
   When is the E1000 driver going to be added to the kernel?
   
It's in 2.5.x already... It will hit 2.4.x as soon as Intel's
QA signs off on what Jeff Garzik currently has (which is in VGER
2.4.x CVS branch btw if you want to check it out).


^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  1:14             ` Richard Gooch
  2002-03-11  1:31               ` David S. Miller
@ 2002-03-11  1:31               ` Jeff Garzik
  2002-03-11  2:05               ` Wayne Whitney
  2 siblings, 0 replies; 58+ messages in thread
From: Jeff Garzik @ 2002-03-11  1:31 UTC (permalink / raw)
  To: Richard Gooch; +Cc: David S. Miller, laforge, skraw, joe, linux-kernel, elsner

Richard Gooch wrote:
> 
> David S. Miller writes:
> >    From: Richard Gooch <rgooch@ras.ucalgary.ca>
> >    Date: Sun, 10 Mar 2002 17:55:44 -0700
> >
> >    David S. Miller writes:
> >    > The hardware is not capable of doing it, due to bugs in the hw
> >    > checksum implementation of the sk98 chipset.  They aren't being
> >    > "slow" they just can't possibly implement it for you.
> >
> >    So what is currently the best combination of gige card/driver/cost?
> >    What do you recommend to the budget-conscious?
> >
> > I can only tell you what I know performance wise about cards,
> > and currently it looks like:
> >
> > 1) Intel E1000
> > 2) Tigon2, aka. Acenic
> > 3) SysKonnect sk98, but has broken TX checksums.  If it had
> >    working TX checksums it would be in 2nd place instead of Acenic.
> >    This hw bug is essentially why Acenics were used for all the
> >    TUX benchmarks runs instead of SysKonnect cards.
> > 4) Tigon3, aka. bcm57xx
> >
> > This may surprise some people, but frankly I think the Tigon3's PCI
> > dma engine is junk based upon my current knowledge of the card.  It is
> > always possible I may find out something new which kills this
> > perception I have of the card, but we'll see...
> 
> I note the Intel card is pretty expensive. What are these "Addtron"
> cards I see listed on www.pricewatch.com for US$36 ?Is that a
> supported card under another name?
> 
> > All the cards listed above have good GPL'd drivers available.
> 
> When is the E1000 driver going to be added to the kernel?

It's already in 2.5.

It will be added to 2.4.x after further testing and review in 2.5.x.

	Jeff



-- 
Jeff Garzik      | Usenet Rule #2 (John Gilmore): "The Net interprets
Building 1024    | censorship as damage and routes around it."
MandrakeSoft     |

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  1:03           ` David S. Miller
  2002-03-11  1:14             ` Richard Gooch
@ 2002-03-11  2:04             ` Ben Collins
  2002-03-11  2:13               ` David S. Miller
  2002-03-21 20:39             ` Thomas Langås
  2 siblings, 1 reply; 58+ messages in thread
From: Ben Collins @ 2002-03-11  2:04 UTC (permalink / raw)
  To: David S. Miller; +Cc: rgooch, laforge, skraw, joe, linux-kernel, elsner

On Sun, Mar 10, 2002 at 05:03:38PM -0800, David S. Miller wrote:
>    From: Richard Gooch <rgooch@ras.ucalgary.ca>
>    Date: Sun, 10 Mar 2002 17:55:44 -0700
> 
>    David S. Miller writes:
>    > The hardware is not capable of doing it, due to bugs in the hw
>    > checksum implementation of the sk98 chipset.  They aren't being
>    > "slow" they just can't possibly implement it for you.
>    
>    So what is currently the best combination of gige card/driver/cost?
>    What do you recommend to the budget-conscious?
> 
> I can only tell you what I know performance wise about cards,
> and currently it looks like:
> 
> 1) Intel E1000
> 2) Tigon2, aka. Acenic
> 3) SysKonnect sk98, but has broken TX checksums.  If it had
>    working TX checksums it would be in 2nd place instead of Acenic.
>    This hw bug is essentially why Acenics were used for all the
>    TUX benchmarks runs instead of SysKonnect cards.
> 4) Tigon3, aka. bcm57xx

How does SysKonnect 9Dxx compare? The driver's not in the kernel tree,
but it is available on their website. Cards seem fairly priced (I have
two, but didn't buy them, and haven't run any tests across them).

-- 
 .----------=======-=-======-=========-----------=====------------=-=-----.
/       Ben Collins    --    Debian GNU/Linux    --    WatchGuard.com      \
`          bcollins@debian.org   --   Ben.Collins@watchguard.com           '
 `---=========------=======-------------=-=-----=-===-======-------=--=---'

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  2:05               ` Wayne Whitney
@ 2002-03-11  2:04                 ` David S. Miller
  2002-03-11  2:10                   ` Richard Gooch
  2002-03-11  2:22                   ` Benjamin LaHaise
  0 siblings, 2 replies; 58+ messages in thread
From: David S. Miller @ 2002-03-11  2:04 UTC (permalink / raw)
  To: whitney; +Cc: rgooch, linux-kernel

   From: Wayne Whitney <whitney@math.berkeley.edu>
   Date: Sun, 10 Mar 2002 18:05:10 -0800
   
   So does anyone have any comments on the stability and performance of
   these cards/drivers?

As I said in a previous email the natsemi chips don't perform
too well.

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  1:14             ` Richard Gooch
  2002-03-11  1:31               ` David S. Miller
  2002-03-11  1:31               ` Jeff Garzik
@ 2002-03-11  2:05               ` Wayne Whitney
  2002-03-11  2:04                 ` David S. Miller
  2 siblings, 1 reply; 58+ messages in thread
From: Wayne Whitney @ 2002-03-11  2:05 UTC (permalink / raw)
  To: Richard Gooch, David S. Miller; +Cc: linux-kernel

In mailing-lists.linux-kernel, Richard Gooch wrote:

> What are these "Addtron" cards I see listed on www.pricewatch.com
> for US$36?  Is that a supported card under another name?

This card seems to be based on the National Semiconductors DP83820,
for which there is an in-kernel driver.  Note that US$36 only gets you
the 32-bit/33MHz PCI version (AEG-320T); the 64-bit version (AEG-620T)
goes for about twice as much (according to google).

There is also the D-Link DGE-550T, a 64-bit/66MHz card starting at
US$80 (according to pricewatch).  It apparently uses a different
in-kernel driver, dl2k.o.

So does anyone have any comments on the stability and performance of
these cards/drivers?

Cheers,
Wayne

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  2:04                 ` David S. Miller
@ 2002-03-11  2:10                   ` Richard Gooch
  2002-03-11  2:15                     ` David S. Miller
  2002-03-11  2:22                   ` Benjamin LaHaise
  1 sibling, 1 reply; 58+ messages in thread
From: Richard Gooch @ 2002-03-11  2:10 UTC (permalink / raw)
  To: David S. Miller; +Cc: whitney, rgooch, linux-kernel

David S. Miller writes:
>    From: Wayne Whitney <whitney@math.berkeley.edu>
>    Date: Sun, 10 Mar 2002 18:05:10 -0800
>    
>    So does anyone have any comments on the stability and performance of
>    these cards/drivers?
> 
> As I said in a previous email the natsemi chips don't perform
> too well.

As Wayne said:
> There is also the D-Link DGE-550T, a 64-bit/66MHz card starting at
> US$80 (according to pricewatch).  It apparently uses a different
> in-kernel driver, dl2k.o.

So this is a different chip from the natsemi, right?

				Regards,

					Richard....
Permanent: rgooch@atnf.csiro.au
Current:   rgooch@ras.ucalgary.ca

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  2:04             ` Broadcom 5700/5701 Gigabit Ethernet Adapters Ben Collins
@ 2002-03-11  2:13               ` David S. Miller
  2002-03-11  2:22                 ` Ben Collins
  0 siblings, 1 reply; 58+ messages in thread
From: David S. Miller @ 2002-03-11  2:13 UTC (permalink / raw)
  To: bcollins; +Cc: rgooch, laforge, skraw, joe, linux-kernel, elsner

   From: Ben Collins <bcollins@debian.org>
   Date: Sun, 10 Mar 2002 21:04:53 -0500

   How does SysKonnect 9Dxx compare?

SysKonnect 9D == Tigon3 and is fully supported by our tg3 driver
:-)))))))

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  2:10                   ` Richard Gooch
@ 2002-03-11  2:15                     ` David S. Miller
  0 siblings, 0 replies; 58+ messages in thread
From: David S. Miller @ 2002-03-11  2:15 UTC (permalink / raw)
  To: rgooch; +Cc: whitney, linux-kernel

   From: Richard Gooch <rgooch@ras.ucalgary.ca>
   Date: Sun, 10 Mar 2002 19:10:46 -0700
   
   As Wayne said:
   > There is also the D-Link DGE-550T, a 64-bit/66MHz card starting at
   > US$80 (according to pricewatch).  It apparently uses a different
   > in-kernel driver, dl2k.o.
   
   So this is a different chip from the natsemi, right?

Yes.  And from a cursory glance the dl2k.o driver seems to even
be quite portable.  I haven't tested it out myself though.

I have no idea how this thing performs, but it does look like
it has a couple of hardware bugs.

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  2:04                 ` David S. Miller
  2002-03-11  2:10                   ` Richard Gooch
@ 2002-03-11  2:22                   ` Benjamin LaHaise
  2002-03-11  2:28                     ` Mike Fedyk
  2002-03-11  2:30                     ` David S. Miller
  1 sibling, 2 replies; 58+ messages in thread
From: Benjamin LaHaise @ 2002-03-11  2:22 UTC (permalink / raw)
  To: David S. Miller; +Cc: whitney, rgooch, linux-kernel

On Sun, Mar 10, 2002 at 06:04:56PM -0800, David S. Miller wrote:
>    From: Wayne Whitney <whitney@math.berkeley.edu>
>    Date: Sun, 10 Mar 2002 18:05:10 -0800
>    
>    So does anyone have any comments on the stability and performance of
>    these cards/drivers?
> 
> As I said in a previous email the natsemi chips don't perform
> too well.

That's my fault.  The version of the driver in the kernel atm sucks in 
performance; I'll try to spend the day needed on the driver this week 
and it should get up to ~800mbit from the current mess.  Getting NAPI 
in the kernel would help... ;-)

		-ben
-- 
"A man with a bass just walked in,
 and he's putting it down
 on the floor."

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  2:13               ` David S. Miller
@ 2002-03-11  2:22                 ` Ben Collins
  2002-03-11  2:31                   ` David S. Miller
  0 siblings, 1 reply; 58+ messages in thread
From: Ben Collins @ 2002-03-11  2:22 UTC (permalink / raw)
  To: David S. Miller; +Cc: rgooch, laforge, skraw, joe, linux-kernel, elsner

On Sun, Mar 10, 2002 at 06:13:08PM -0800, David S. Miller wrote:
>    From: Ben Collins <bcollins@debian.org>
>    Date: Sun, 10 Mar 2002 21:04:53 -0500
> 
>    How does SysKonnect 9Dxx compare?
> 
> SysKonnect 9D == Tigon3 and is fully supported by our tg3 driver
> :-)))))))

Ahh...so now I can ditch their driver :) You may want to update the
description so that's more clear.

Thanks

-- 
 .----------=======-=-======-=========-----------=====------------=-=-----.
/       Ben Collins    --    Debian GNU/Linux    --    WatchGuard.com      \
`          bcollins@debian.org   --   Ben.Collins@watchguard.com           '
 `---=========------=======-------------=-=-----=-===-======-------=--=---'

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  2:22                   ` Benjamin LaHaise
@ 2002-03-11  2:28                     ` Mike Fedyk
  2002-03-11  2:32                       ` David S. Miller
  2002-03-11  2:30                     ` David S. Miller
  1 sibling, 1 reply; 58+ messages in thread
From: Mike Fedyk @ 2002-03-11  2:28 UTC (permalink / raw)
  To: Benjamin LaHaise; +Cc: David S. Miller, whitney, rgooch, linux-kernel

On Sun, Mar 10, 2002 at 09:22:10PM -0500, Benjamin LaHaise wrote:
> On Sun, Mar 10, 2002 at 06:04:56PM -0800, David S. Miller wrote:
> >    From: Wayne Whitney <whitney@math.berkeley.edu>
> >    Date: Sun, 10 Mar 2002 18:05:10 -0800
> >    
> >    So does anyone have any comments on the stability and performance of
> >    these cards/drivers?
> > 
> > As I said in a previous email the natsemi chips don't perform
> > too well.
> 
> That's my fault.  The version of the driver in the kernel atm sucks in 
> performance; I'll try to spend the day needed on the driver this week 
> and it should get up to ~800mbit from the current mess.  Getting NAPI 
> in the kernel would help... ;-)
> 

What is happening with NAPI anyway?

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  2:22                   ` Benjamin LaHaise
  2002-03-11  2:28                     ` Mike Fedyk
@ 2002-03-11  2:30                     ` David S. Miller
  2002-03-11  3:15                       ` Benjamin LaHaise
                                         ` (2 more replies)
  1 sibling, 3 replies; 58+ messages in thread
From: David S. Miller @ 2002-03-11  2:30 UTC (permalink / raw)
  To: bcrl; +Cc: whitney, rgooch, linux-kernel

   From: Benjamin LaHaise <bcrl@redhat.com>
   Date: Sun, 10 Mar 2002 21:22:10 -0500
   
   That's my fault.  The version of the driver in the kernel atm sucks in 
   performance; I'll try to spend the day needed on the driver this week 
   and it should get up to ~800mbit from the current mess.  Getting NAPI 
   in the kernel would help... ;-)

Syskonnect sk98 with jumbo frames gets ~107MB/sec TCP bandwidth
without NAPI, there is no reason other cards cannot go full speed as
well.

NAPI is really only going to help with high packet rates not with
thinks like raw bandwidth tests.

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  2:22                 ` Ben Collins
@ 2002-03-11  2:31                   ` David S. Miller
  0 siblings, 0 replies; 58+ messages in thread
From: David S. Miller @ 2002-03-11  2:31 UTC (permalink / raw)
  To: bcollins; +Cc: rgooch, laforge, skraw, joe, linux-kernel, elsner

   From: Ben Collins <bcollins@debian.org>
   Date: Sun, 10 Mar 2002 21:22:12 -0500
   
   Ahh...so now I can ditch their driver :) You may want to update the
   description so that's more clear.

There are many boards based upon the Tigon3 chipset, I don't
mention any of them specifically in any of the documentation.
I don't even know what the full list is.


^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  2:28                     ` Mike Fedyk
@ 2002-03-11  2:32                       ` David S. Miller
  0 siblings, 0 replies; 58+ messages in thread
From: David S. Miller @ 2002-03-11  2:32 UTC (permalink / raw)
  To: mfedyk; +Cc: bcrl, whitney, rgooch, linux-kernel

   From: Mike Fedyk <mfedyk@matchmail.com>
   Date: Sun, 10 Mar 2002 18:28:21 -0800
   
   What is happening with NAPI anyway?
   
Pending inclusion into 2.5.x once I get my existing networking patches
pushed to Linus first.

It may be backported to 2.4.x one day, but I personally don't think
that is such a great idea for the time being.  Maybe in a month or
two, but not right now.

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  2:30                     ` David S. Miller
@ 2002-03-11  3:15                       ` Benjamin LaHaise
  2002-03-11  4:20                         ` Michael Clark
  2002-03-11 19:48                       ` Richard Gooch
  2002-03-12  5:40                       ` [patch] ns83820 0.17 (Re: Broadcom 5700/5701 Gigabit Ethernet Adapters) Benjamin LaHaise
  2 siblings, 1 reply; 58+ messages in thread
From: Benjamin LaHaise @ 2002-03-11  3:15 UTC (permalink / raw)
  To: David S. Miller; +Cc: whitney, rgooch, linux-kernel

On Sun, Mar 10, 2002 at 06:30:33PM -0800, David S. Miller wrote:
> Syskonnect sk98 with jumbo frames gets ~107MB/sec TCP bandwidth
> without NAPI, there is no reason other cards cannot go full speed as
> well.
> 
> NAPI is really only going to help with high packet rates not with
> thinks like raw bandwidth tests.

Well, the thing that hurts the 83820 is that its interrupt 
mitigation capabilities are rather limited.  This is where napi 
helps: by turning off the rx interrupt for the duration of packet 
processing, cpu cycles aren't wasted on excess rx irqs.

As to the lack of bandwidth, it stems from far too much interrupt 
overhead and the currently braindead attempt at irq mitigation.  
Since the last time I worked on it, a number of potential techniques 
have come up that should bring it into the 100MB realm (assuming it 
doesn't get trampled on by ksoftirqd).

		-ben
-- 
"A man with a bass just walked in,
 and he's putting it down
 on the floor."

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  3:15                       ` Benjamin LaHaise
@ 2002-03-11  4:20                         ` Michael Clark
  2002-03-11  4:28                           ` Benjamin LaHaise
  0 siblings, 1 reply; 58+ messages in thread
From: Michael Clark @ 2002-03-11  4:20 UTC (permalink / raw)
  To: Benjamin LaHaise; +Cc: David S. Miller, whitney, rgooch, linux-kernel

On Monday, March 11, 2002, at 11:15 AM, Benjamin LaHaise wrote:

> On Sun, Mar 10, 2002 at 06:30:33PM -0800, David S. Miller wrote:
>> Syskonnect sk98 with jumbo frames gets ~107MB/sec TCP bandwidth
>> without NAPI, there is no reason other cards cannot go full speed as
>> well.
>>
>> NAPI is really only going to help with high packet rates not with
>> thinks like raw bandwidth tests.
>
> Well, the thing that hurts the 83820 is that its interrupt
> mitigation capabilities are rather limited.  This is where napi
> helps: by turning off the rx interrupt for the duration of packet
> processing, cpu cycles aren't wasted on excess rx irqs.
>
> As to the lack of bandwidth, it stems from far too much interrupt
> overhead and the currently braindead attempt at irq mitigation.
> Since the last time I worked on it, a number of potential techniques
> have come up that should bring it into the 100MB realm (assuming it
> doesn't get trampled on by ksoftirqd).

What about jumbo frames?  I notice this comment in the driver "disable
jumbo frames to avoid tx hangs".  I'm getting ~550Mb/sec from a single
TCP stream and ~700Mb/sec with 2 in parallel. Jumbo frames would
probably improve this quite a bit.

~mc


^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  4:20                         ` Michael Clark
@ 2002-03-11  4:28                           ` Benjamin LaHaise
  0 siblings, 0 replies; 58+ messages in thread
From: Benjamin LaHaise @ 2002-03-11  4:28 UTC (permalink / raw)
  To: Michael Clark; +Cc: David S. Miller, whitney, rgooch, linux-kernel

On Mon, Mar 11, 2002 at 12:20:26PM +0800, Michael Clark wrote:
> What about jumbo frames?  I notice this comment in the driver "disable
> jumbo frames to avoid tx hangs".  I'm getting ~550Mb/sec from a single
> TCP stream and ~700Mb/sec with 2 in parallel. Jumbo frames would
> probably improve this quite a bit.

Jumbo frames work up to RX_BUF_SIZE.  Hint: any mtu you try to specify 
that the driver lets you set should work.

		-ben
-- 
"A man with a bass just walked in,
 and he's putting it down
 on the floor."

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  0:41       ` David S. Miller
  2002-03-11  0:55         ` Richard Gooch
@ 2002-03-11  6:07         ` Harald Welte
  1 sibling, 0 replies; 58+ messages in thread
From: Harald Welte @ 2002-03-11  6:07 UTC (permalink / raw)
  To: David S. Miller; +Cc: skraw, joe, linux-kernel, elsner

On Sun, Mar 10, 2002 at 04:41:13PM -0800, David Miller wrote:
>    From: Harald Welte <laforge@gnumonks.org>
>    Date: Sun, 10 Mar 2002 16:33:39 +0100
>    
>    You can buy bcm57xx based boards, where the chipset is nice but the driver
>    not really nice yet.
>    
> My tg3 driver sucks then right?  Could you send me a bug report?

As stated in the other mail to Jeff Garzik, I was talking about the bcm57xx
driver, _NOT_ about the new tg3.  Sorry for not making this clear in the
original mail.

> The hardware is not capable of doing it, due to bugs in the hw
> checksum implementation of the sk98 chipset.  They aren't being
> "slow" they just can't possibly implement it for you.

Ouch. Thanks for dropping me this note.

> David S. Miller

-- 
Live long and prosper
- Harald Welte / laforge@gnumonks.org               http://www.gnumonks.org/
============================================================================
GCS/E/IT d- s-: a-- C+++ UL++++$ P+++ L++++$ E--- W- N++ o? K- w--- O- M+ 
V-- PS++ PE-- Y++ PGP++ t+ 5-- !X !R tv-- b+++ !DI !D G+ e* h--- r++ y+(*)

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  2:30                     ` David S. Miller
  2002-03-11  3:15                       ` Benjamin LaHaise
@ 2002-03-11 19:48                       ` Richard Gooch
  2002-03-12  6:04                         ` David S. Miller
  2002-03-12  5:40                       ` [patch] ns83820 0.17 (Re: Broadcom 5700/5701 Gigabit Ethernet Adapters) Benjamin LaHaise
  2 siblings, 1 reply; 58+ messages in thread
From: Richard Gooch @ 2002-03-11 19:48 UTC (permalink / raw)
  To: David S. Miller; +Cc: bcrl, whitney, linux-kernel

David S. Miller writes:
>    From: Benjamin LaHaise <bcrl@redhat.com>
>    Date: Sun, 10 Mar 2002 21:22:10 -0500
>    
>    That's my fault.  The version of the driver in the kernel atm sucks in 
>    performance; I'll try to spend the day needed on the driver this week 
>    and it should get up to ~800mbit from the current mess.  Getting NAPI 
>    in the kernel would help... ;-)
> 
> Syskonnect sk98 with jumbo frames gets ~107MB/sec TCP bandwidth
> without NAPI, there is no reason other cards cannot go full speed as
> well.
> 
> NAPI is really only going to help with high packet rates not with
> thinks like raw bandwidth tests.

You're saying that people should just go and use jumbo frames? Isn't
that a problem for mixed 10/100/1000 LANs?

				Regards,

					Richard....
Permanent: rgooch@atnf.csiro.au
Current:   rgooch@ras.ucalgary.ca

^ permalink raw reply	[flat|nested] 58+ messages in thread

* [patch] ns83820 0.17 (Re: Broadcom 5700/5701 Gigabit Ethernet Adapters)
  2002-03-11  2:30                     ` David S. Miller
  2002-03-11  3:15                       ` Benjamin LaHaise
  2002-03-11 19:48                       ` Richard Gooch
@ 2002-03-12  5:40                       ` Benjamin LaHaise
  2002-03-12 11:00                         ` Michael Clark
                                           ` (2 more replies)
  2 siblings, 3 replies; 58+ messages in thread
From: Benjamin LaHaise @ 2002-03-12  5:40 UTC (permalink / raw)
  To: David S. Miller; +Cc: whitney, rgooch, linux-kernel, marcelo

On Sun, Mar 10, 2002 at 06:30:33PM -0800, David S. Miller wrote:
> Syskonnect sk98 with jumbo frames gets ~107MB/sec TCP bandwidth
> without NAPI, there is no reason other cards cannot go full speed as
> well.
> 
> NAPI is really only going to help with high packet rates not with
> thinks like raw bandwidth tests.

A day's tweaking later, and I'm getting 810mbit/s with netperf between 
two Athlons with default settings (1500 byte packets).  What I've found 
is that increasing the size of the RX/TX rings or the max sizes of the 
tcp r/wmem backlogs really slows things down, so I'm not doing that 
anymore.  The pair of P3s shows 262mbit/s (up from 67).

Interrupt mitigation is now pretty stupid, but it helped: the irq 
handler disables the rx interrupt and then triggers a tasklet to run 
through the rx ring.  The tasklet later enables rx interrupts again.  
More tweaking tomorrow...

Marcelo, please apply the patch below to the next 2.4 prepatch: it 
also has a fix for a tx hang problem, and a few other nasties.  Thanks!

		-ben
-- 
"A man with a bass just walked in,
 and he's putting it down
 on the floor."


--- kernels/2.4/v2.4.19-pre2/drivers/net/ns83820.c	Thu Mar  7 16:40:00 2002
+++ ns-2.4.19-pre2/drivers/net/ns83820.c	Tue Mar 12 00:09:32 2002
@@ -1,7 +1,7 @@
-#define _VERSION "0.15"
+#define _VERSION "0.17"
 /* ns83820.c by Benjamin LaHaise <bcrl@redhat.com> with contributions.
  *
- * $Revision: 1.34.2.12 $
+ * $Revision: 1.34.2.14 $
  *
  * Copyright 2001 Benjamin LaHaise.
  * Copyright 2001 Red Hat.
@@ -51,6 +51,8 @@
  *				suppress duplicate link status messages
  *	20011117 	0.14 - ethtool GDRVINFO, GLINK support from jgarzik
  *	20011204 	0.15	get ppc (big endian) working
+ *	20011218	0.16	various cleanups
+ *	20020310	0.17	speedups
  *
  * Driver Overview
  * ===============
@@ -93,8 +95,8 @@
 #include <linux/in.h>	/* for IPPROTO_... */
 #include <linux/eeprom.h>
 #include <linux/compiler.h>
+#include <linux/prefetch.h>
 #include <linux/ethtool.h>
-//#include <linux/skbrefill.h>
 
 #include <asm/io.h>
 #include <asm/uaccess.h>
@@ -154,10 +156,16 @@
 #endif
 
 /* tunables */
-#define RX_BUF_SIZE	6144	/* 8192 */
-#define NR_RX_DESC	256
+#define RX_BUF_SIZE	1500	/* 8192 */
 
-#define NR_TX_DESC	256
+/* Must not exceed ~65000. */
+#define NR_RX_DESC	64
+#define NR_TX_DESC	64
+
+/* not tunable */
+#define REAL_RX_BUF_SIZE (RX_BUF_SIZE + 14)	/* rx/tx mac addr + type */
+
+#define MIN_TX_DESC_FREE	8
 
 /* register defines */
 #define CFGCS		0x04
@@ -408,7 +416,8 @@
 
 	struct sk_buff	*skbs[NR_RX_DESC];
 
-	unsigned	next_rx, next_empty;
+	u32		*next_rx_desc;
+	u16		next_rx, next_empty;
 
 	u32		*descs;
 	dma_addr_t	phy_descs;
@@ -423,6 +432,7 @@
 	struct pci_dev		*pci_dev;
 
 	struct rx_info		rx_info;
+	struct tasklet_struct	rx_tasklet;
 
 	unsigned		ihr;
 	struct tq_struct	tq_refill;
@@ -441,10 +451,11 @@
 	spinlock_t	tx_lock;
 
 	long		tx_idle;
-	u32		tx_done_idx;
-	u32		tx_idx;
-	volatile u32	tx_free_idx;	/* idx of free desc chain */
-	u32		tx_intr_idx;
+
+	u16		tx_done_idx;
+	u16		tx_idx;
+	volatile u16	tx_free_idx;	/* idx of free desc chain */
+	u16		tx_intr_idx;
 
 	struct sk_buff	*tx_skbs[NR_TX_DESC];
 
@@ -455,7 +466,7 @@
 
 //free = (tx_done_idx + NR_TX_DESC-2 - free_idx) % NR_TX_DESC
 #define start_tx_okay(dev)	\
-	(((NR_TX_DESC-2 + dev->tx_done_idx - dev->tx_free_idx) % NR_TX_DESC) > NR_TX_DESC/2)
+	(((NR_TX_DESC-2 + dev->tx_done_idx - dev->tx_free_idx) % NR_TX_DESC) > MIN_TX_DESC_FREE)
 
 
 /* Packet Receiver
@@ -509,7 +520,7 @@
 	next_empty = dev->rx_info.next_empty;
 
 	/* don't overrun last rx marker */
-	if (nr_rx_empty(dev) <= 2) {
+	if (unlikely(nr_rx_empty(dev) <= 2)) {
 		kfree_skb(skb);
 		return 1;
 	}
@@ -523,34 +534,39 @@
 #endif
 
 	sg = dev->rx_info.descs + (next_empty * DESC_SIZE);
-	if (dev->rx_info.skbs[next_empty])
+	if (unlikely(NULL != dev->rx_info.skbs[next_empty]))
 		BUG();
 	dev->rx_info.skbs[next_empty] = skb;
 
 	dev->rx_info.next_empty = (next_empty + 1) % NR_RX_DESC;
-	cmdsts = RX_BUF_SIZE | CMDSTS_INTR;
-	buf = pci_map_single(dev->pci_dev, skb->tail, RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
+	cmdsts = REAL_RX_BUF_SIZE | CMDSTS_INTR;
+	buf = pci_map_single(dev->pci_dev, skb->tail,
+			     REAL_RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
 	build_rx_desc(dev, sg, 0, buf, cmdsts, 0);
 	/* update link of previous rx */
-	if (next_empty != dev->rx_info.next_rx)
+	if (likely(next_empty != dev->rx_info.next_rx))
 		dev->rx_info.descs[((NR_RX_DESC + next_empty - 1) % NR_RX_DESC) * DESC_SIZE] = cpu_to_le32(dev->rx_info.phy_descs + (next_empty * DESC_SIZE * 4));
 
 	return 0;
 }
 
-static int rx_refill(struct ns83820 *dev, int gfp)
+static inline int rx_refill(struct ns83820 *dev, int gfp)
 {
 	unsigned i;
 	long flags = 0;
 
+	if (unlikely(nr_rx_empty(dev) <= 2))
+		return 0;
+
 	dprintk("rx_refill(%p)\n", dev);
 	if (gfp == GFP_ATOMIC)
 		spin_lock_irqsave(&dev->rx_info.lock, flags);
 	for (i=0; i<NR_RX_DESC; i++) {
 		struct sk_buff *skb;
 		long res;
-		skb = __dev_alloc_skb(RX_BUF_SIZE+16, gfp);
-		if (!skb)
+		/* extra 16 bytes for alignment */
+		skb = __dev_alloc_skb(REAL_RX_BUF_SIZE+16, gfp);
+		if (unlikely(!skb))
 			break;
 
 		res = (long)skb->tail & 0xf;
@@ -575,6 +591,12 @@
 	return i ? 0 : -ENOMEM;
 }
 
+static void FASTCALL(rx_refill_atomic(struct ns83820 *dev));
+static void rx_refill_atomic(struct ns83820 *dev)
+{
+	rx_refill(dev, GFP_ATOMIC);
+}
+
 /* REFILL */
 static inline void queue_refill(void *_dev)
 {
@@ -590,6 +612,7 @@
 	build_rx_desc(dev, dev->rx_info.descs + (DESC_SIZE * i), 0, 0, CMDSTS_OWN, 0);
 }
 
+static void FASTCALL(phy_intr(struct ns83820 *dev));
 static void phy_intr(struct ns83820 *dev)
 {
 	static char *speeds[] = { "10", "100", "1000", "1000(?)", "1000F" };
@@ -600,7 +623,6 @@
 	cfg = readl(dev->base + CFG) ^ SPDSTS_POLARITY;
 
 	if (dev->CFG_cache & CFG_TBI_EN) {
-
 		/* we have an optical transceiver */
 		tbisr = readl(dev->base + TBISR);
 		tanar = readl(dev->base + TANAR);
@@ -646,20 +668,24 @@
 		new_cfg = dev->CFG_cache & ~(CFG_SB | CFG_MODE_1000 | CFG_SPDSTS);
 
 		if (cfg & CFG_SPDSTS1)
-			new_cfg |= CFG_MODE_1000 | CFG_SB;
+			new_cfg |= CFG_MODE_1000;
 		else
-			new_cfg &= ~CFG_MODE_1000 | CFG_SB;
+			new_cfg &= ~CFG_MODE_1000;
 
-		if ((cfg & CFG_LNKSTS) && ((new_cfg ^ dev->CFG_cache) & CFG_MODE_1000)) {
+		speed = ((cfg / CFG_SPDSTS0) & 3);
+		fullduplex = (cfg & CFG_DUPSTS);
+
+		if (fullduplex)
+			new_cfg |= CFG_SB;
+
+		if ((cfg & CFG_LNKSTS) &&
+		    ((new_cfg ^ dev->CFG_cache) & CFG_MODE_1000)) {
 			writel(new_cfg, dev->base + CFG);
 			dev->CFG_cache = new_cfg;
 		}
 
 		dev->CFG_cache &= ~CFG_SPDSTS;
 		dev->CFG_cache |= cfg & CFG_SPDSTS;
-
-		speed = ((cfg / CFG_SPDSTS0) & 3);
-		fullduplex = (cfg & CFG_DUPSTS);
 	}
 
 	newlinkstate = (cfg & CFG_LNKSTS) ? LINK_UP : LINK_DOWN;
@@ -690,6 +716,7 @@
 
 	dev->rx_info.idle = 1;
 	dev->rx_info.next_rx = 0;
+	dev->rx_info.next_rx_desc = dev->rx_info.descs;
 	dev->rx_info.next_empty = 0;
 
 	for (i=0; i<NR_RX_DESC; i++)
@@ -724,7 +751,7 @@
 		dev->IMR_cache |= ISR_RXDESC;
 		dev->IMR_cache |= ISR_RXIDLE;
 		dev->IMR_cache |= ISR_TXDESC;
-		//dev->IMR_cache |= ISR_TXIDLE;
+		dev->IMR_cache |= ISR_TXIDLE;
 
 		writel(dev->IMR_cache, dev->base + IMR);
 		writel(1, dev->base + IER);
@@ -770,6 +797,41 @@
 	}
 }
 
+/* I hate the network stack sometimes */
+#ifdef __i386__
+#define skb_mangle_for_davem(skb,len)	(skb)
+#else
+static inline struct sk_buff *skb_mangle_for_davem(struct sk_buff *skb, int len)
+{
+	tmp = __dev_alloc_skb(len+2, GFP_ATOMIC);
+	if (!tmp)
+		goto done;
+	tmp->dev = &dev->net_dev;
+	skb_reserve(tmp, 2);
+	memcpy(skb_put(tmp, len), skb->data, len);
+	kfree_skb(skb);
+	return tmp;
+}
+#endif
+
+static void FASTCALL(ns83820_rx_kick(struct ns83820 *dev));
+static void ns83820_rx_kick(struct ns83820 *dev)
+{
+	/*if (nr_rx_empty(dev) >= NR_RX_DESC/4)*/ {
+		if (dev->rx_info.up) {
+			rx_refill_atomic(dev);
+			kick_rx(dev);
+		}
+	}
+
+	if (dev->rx_info.up && nr_rx_empty(dev) > NR_RX_DESC*3/4)
+		schedule_task(&dev->tq_refill);
+	else
+		kick_rx(dev);
+	if (dev->rx_info.idle)
+		Dprintk("BAD\n");
+}
+
 /* rx_irq
  *	
  */
@@ -785,10 +847,10 @@
 	dprintk("rx_irq(%p)\n", dev);
 	dprintk("rxdp: %08x, descs: %08lx next_rx[%d]: %p next_empty[%d]: %p\n",
 		readl(dev->base + RXDP),
-		(dev->rx_info.phy_descs),
-		dev->rx_info.next_rx,
+		(long)(dev->rx_info.phy_descs),
+		(int)dev->rx_info.next_rx,
 		(dev->rx_info.descs + (DESC_SIZE * dev->rx_info.next_rx)),
-		dev->rx_info.next_empty,
+		(int)dev->rx_info.next_empty,
 		(dev->rx_info.descs + (DESC_SIZE * dev->rx_info.next_empty))
 		);
 
@@ -798,7 +860,7 @@
 
 	dprintk("walking descs\n");
 	next_rx = info->next_rx;
-	desc = info->descs + (DESC_SIZE * next_rx);
+	desc = info->next_rx_desc;
 	while ((CMDSTS_OWN & (cmdsts = le32_to_cpu(desc[CMDSTS]))) &&
 	       (cmdsts != CMDSTS_OWN)) {
 		struct sk_buff *skb;
@@ -813,29 +875,17 @@
 		info->skbs[next_rx] = NULL;
 		info->next_rx = (next_rx + 1) % NR_RX_DESC;
 
-		barrier();
+		mb();
 		clear_rx_desc(dev, next_rx);
 
 		pci_unmap_single(dev->pci_dev, bufptr,
 				 RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
-		if (CMDSTS_OK & cmdsts) {
-#if 0 //ndef __i386__
-			struct sk_buff *tmp;
-#endif
+		if (likely(CMDSTS_OK & cmdsts)) {
 			int len = cmdsts & 0xffff;
-			if (!skb)
-				BUG();
 			skb_put(skb, len);
-#if 0 //ndef __i386__	/* I hate the network stack sometimes */
-			tmp = __dev_alloc_skb(RX_BUF_SIZE+16, GFP_ATOMIC);
-			if (!tmp)
-				goto done;
-			tmp->dev = &dev->net_dev;
-			skb_reserve(tmp, 2);
-			memcpy(skb_put(tmp, len), skb->data, len);
-			kfree_skb(skb);
-			skb = tmp;
-#endif
+			skb = skb_mangle_for_davem(skb, len);
+			if (unlikely(!skb))
+				goto netdev_mangle_me_harder_failed;
 			if (cmdsts & CMDSTS_DEST_MULTI)
 				dev->stats.multicast ++;
 			dev->stats.rx_packets ++;
@@ -846,11 +896,10 @@
 				skb->ip_summed = CHECKSUM_NONE;
 			}
 			skb->protocol = eth_type_trans(skb, &dev->net_dev);
-			if (NET_RX_DROP == netif_rx(skb))
+			if (NET_RX_DROP == netif_rx(skb)) {
+netdev_mangle_me_harder_failed:
 				dev->stats.rx_dropped ++;
-#if 0 //ndef __i386__
-		done:;
-#endif
+			}
 		} else {
 			kfree_skb(skb);
 		}
@@ -860,6 +909,7 @@
 		desc = info->descs + (DESC_SIZE * next_rx);
 	}
 	info->next_rx = next_rx;
+	info->next_rx_desc = info->descs + (DESC_SIZE * next_rx);
 
 out:
 	if (0 && !nr) {
@@ -869,6 +919,15 @@
 	spin_unlock_irqrestore(&info->lock, flags);
 }
 
+static void rx_action(unsigned long _dev)
+{
+	struct ns83820 *dev = (void *)_dev;
+	rx_irq(dev);
+	writel(0x002, dev->base + IHR);
+	writel(dev->IMR_cache | ISR_RXDESC, dev->base + IMR);
+	rx_irq(dev);
+	ns83820_rx_kick(dev);
+}
 
 /* Packet Transmit code
  */
@@ -879,7 +938,9 @@
 	writel(CR_TXE, dev->base + CR);
 }
 
-/* no spinlock needed on the transmit irq path as the interrupt handler is serialized */
+/* No spinlock needed on the transmit irq path as the interrupt handler is
+ * serialized.
+ */
 static void do_tx_done(struct ns83820 *dev)
 {
 	u32 cmdsts, tx_done_idx, *desc;
@@ -917,7 +978,7 @@
 		tx_done_idx = (tx_done_idx + 1) % NR_TX_DESC;
 		dev->tx_done_idx = tx_done_idx;
 		desc[CMDSTS] = cpu_to_le32(0);
-		barrier();
+		mb();
 		desc = dev->tx_descs + (tx_done_idx * DESC_SIZE);
 	}
 
@@ -952,7 +1013,6 @@
  * while trying to track down a bug in either the zero copy code or
  * the tx fifo (hence the MAX_FRAG_LEN).
  */
-#define MAX_FRAG_LEN	8192	/* disabled for now */
 static int ns83820_hard_start_xmit(struct sk_buff *skb, struct net_device *_dev)
 {
 	struct ns83820 *dev = (struct ns83820 *)_dev;
@@ -970,9 +1030,9 @@
 
 	nr_frags =  skb_shinfo(skb)->nr_frags;
 again:
-	if (__builtin_expect(dev->CFG_cache & CFG_LNKSTS, 0)) {
+	if (unlikely(dev->CFG_cache & CFG_LNKSTS)) {
 		netif_stop_queue(&dev->net_dev);
-		if (__builtin_expect(dev->CFG_cache & CFG_LNKSTS, 0))
+		if (unlikely(dev->CFG_cache & CFG_LNKSTS))
 			return 1;
 		netif_start_queue(&dev->net_dev);
 	}
@@ -981,7 +1041,7 @@
 	tx_done_idx = dev->tx_done_idx;
 	nr_free = (tx_done_idx + NR_TX_DESC-2 - free_idx) % NR_TX_DESC;
 	nr_free -= 1;
-	if ((nr_free <= nr_frags) || (nr_free <= 8192 / MAX_FRAG_LEN)) {
+	if (nr_free <= nr_frags) {
 		dprintk("stop_queue - not enough(%p)\n", dev);
 		netif_stop_queue(&dev->net_dev);
 
@@ -996,11 +1056,11 @@
 
 	if (free_idx == dev->tx_intr_idx) {
 		do_intr = 1;
-		dev->tx_intr_idx = (dev->tx_intr_idx + NR_TX_DESC/2) % NR_TX_DESC;
+		dev->tx_intr_idx = (dev->tx_intr_idx + NR_TX_DESC/4) % NR_TX_DESC;
 	}
 
 	nr_free -= nr_frags;
-	if (nr_free < 1) {
+	if (nr_free < MIN_TX_DESC_FREE) {
 		dprintk("stop_queue - last entry(%p)\n", dev);
 		netif_stop_queue(&dev->net_dev);
 		stopped = 1;
@@ -1028,14 +1088,6 @@
 	for (;;) {
 		volatile u32 *desc = dev->tx_descs + (free_idx * DESC_SIZE);
 		u32 residue = 0;
-#if 0
-		if (len > MAX_FRAG_LEN) {
-			residue = len;
-			/* align the start address of the next fragment */
-			len = MAX_FRAG_LEN;
-			residue -= len;
-		}
-#endif
 
 		dprintk("frag[%3u]: %4u @ 0x%08Lx\n", free_idx, len,
 			(unsigned long long)buf);
@@ -1084,6 +1136,7 @@
 {
 	u8 *base = dev->base;
 
+	/* the DP83820 will freeze counters, so we need to read all of them */
 	dev->stats.rx_errors		+= readl(base + 0x60) & 0xffff;
 	dev->stats.rx_crc_errors	+= readl(base + 0x64) & 0xffff;
 	dev->stats.rx_missed_errors	+= readl(base + 0x68) & 0xffff;
@@ -1162,54 +1215,54 @@
 	}
 }
 
+static void ns83820_mib_isr(struct ns83820 *dev)
+{
+	spin_lock(&dev->misc_lock);
+	ns83820_update_stats(dev);
+	spin_unlock(&dev->misc_lock);
+}
+
 static void ns83820_irq(int foo, void *data, struct pt_regs *regs)
 {
 	struct ns83820 *dev = data;
-	int count = 0;
 	u32 isr;
 	dprintk("ns83820_irq(%p)\n", dev);
 
 	dev->ihr = 0;
 
-	while (count++ < 32 && (isr = readl(dev->base + ISR))) {
-		dprintk("irq: %08x\n", isr);
-
-		if (isr & ~(ISR_PHY | ISR_RXDESC | ISR_RXEARLY | ISR_RXOK | ISR_RXERR | ISR_TXIDLE | ISR_TXOK | ISR_TXDESC))
-			Dprintk("odd isr? 0x%08x\n", isr);
-
-	if ((ISR_RXEARLY | ISR_RXIDLE | ISR_RXORN | ISR_RXDESC | ISR_RXOK | ISR_RXERR) & isr) {
- 		if (ISR_RXIDLE & isr) {
-			dev->rx_info.idle = 1;
-			Dprintk("oh dear, we are idle\n");
-		}
+	isr = readl(dev->base + ISR);
+	dprintk("irq: %08x\n", isr);
 
-		if ((ISR_RXDESC) & isr) {
-			rx_irq(dev);
-			writel(4, dev->base + IHR);
-		}
-
-		if (nr_rx_empty(dev) >= NR_RX_DESC/4) {
-			if (dev->rx_info.up) {
-				rx_refill(dev, GFP_ATOMIC);
-				kick_rx(dev);
-			}
-		}
+#ifdef DEBUG
+	if (isr & ~(ISR_PHY | ISR_RXDESC | ISR_RXEARLY | ISR_RXOK | ISR_RXERR | ISR_TXIDLE | ISR_TXOK | ISR_TXDESC))
+		Dprintk("odd isr? 0x%08x\n", isr);
+#endif
 
-		if (dev->rx_info.up && nr_rx_empty(dev) > NR_RX_DESC*3/4)
-			schedule_task(&dev->tq_refill);
-		else
-			kick_rx(dev);
-		if (dev->rx_info.idle)
-			Dprintk("BAD\n");
+	if (ISR_RXIDLE & isr) {
+		dev->rx_info.idle = 1;
+		Dprintk("oh dear, we are idle\n");
+		ns83820_rx_kick(dev);
+	}
+
+	if ((ISR_RXDESC | ISR_RXOK) & isr) {
+		prefetch(dev->rx_info.next_rx_desc);
+		writel(dev->IMR_cache & ~(ISR_RXDESC | ISR_RXOK), dev->base + IMR);
+		tasklet_schedule(&dev->rx_tasklet);
+		//rx_irq(dev);
+		//writel(4, dev->base + IHR);
 	}
 
+	if ((ISR_RXIDLE | ISR_RXORN | ISR_RXDESC | ISR_RXOK | ISR_RXERR) & isr)
+		ns83820_rx_kick(dev);
+
 	if (unlikely(ISR_RXSOVR & isr)) {
-		Dprintk("overrun: rxsovr\n");
-		dev->stats.rx_over_errors ++;
+		//printk("overrun: rxsovr\n");
+		dev->stats.rx_fifo_errors ++;
 	}
+
 	if (unlikely(ISR_RXORN & isr)) {
-		Dprintk("overrun: rxorn\n");
-		dev->stats.rx_over_errors ++;
+		//printk("overrun: rxorn\n");
+		dev->stats.rx_fifo_errors ++;
 	}
 
 	if ((ISR_RXRCMP & isr) && dev->rx_info.up)
@@ -1241,15 +1294,11 @@
 	if ((ISR_TXDESC | ISR_TXIDLE) & isr)
 		do_tx_done(dev);
 
-	if (ISR_MIB & isr) {
-		spin_lock(&dev->misc_lock);
-		ns83820_update_stats(dev);
-		spin_unlock(&dev->misc_lock);
-	}
+	if (unlikely(ISR_MIB & isr))
+		ns83820_mib_isr(dev);
 
-	if (ISR_PHY & isr)
+	if (unlikely(ISR_PHY & isr))
 		phy_intr(dev);
-	}
 
 #if 0	/* Still working on the interrupt mitigation strategy */
 	if (dev->ihr)
@@ -1412,6 +1461,7 @@
 	dev->net_dev.owner = THIS_MODULE;
 
 	PREPARE_TQUEUE(&dev->tq_refill, queue_refill, dev);
+	tasklet_init(&dev->rx_tasklet, rx_action, (unsigned long)dev);
 
 	err = pci_enable_device(pci_dev);
 	if (err) {
@@ -1430,8 +1480,9 @@
 	if (!dev->base || !dev->tx_descs || !dev->rx_info.descs)
 		goto out_disable;
 
-	dprintk("%p: %08lx  %p: %08lx\n", dev->tx_descs, dev->tx_phy_descs,
-		dev->rx_info.descs, dev->rx_info.phy_descs);
+	dprintk("%p: %08lx  %p: %08lx\n",
+		dev->tx_descs, (long)dev->tx_phy_descs,
+		dev->rx_info.descs, (long)dev->rx_info.phy_descs);
 	/* disable interrupts */
 	writel(0, dev->base + IMR);
 	writel(0, dev->base + IER);
@@ -1484,14 +1535,14 @@
 	dev->CFG_cache = readl(dev->base + CFG);
 
 	if ((dev->CFG_cache & CFG_PCI64_DET)) {
-		printk("%s: enabling 64 bit PCI addressing.\n",
+		printk("%s: detected 64 bit PCI data bus.\n",
 			dev->net_dev.name);
-		dev->CFG_cache |= CFG_T64ADDR | CFG_DATA64_EN;
-#if defined(USE_64BIT_ADDR)
-		dev->net_dev.features |= NETIF_F_HIGHDMA;
-#endif
+		/*dev->CFG_cache |= CFG_DATA64_EN;*/
+		if (!(dev->CFG_cache & CFG_DATA64_EN))
+			printk("%s: EEPROM did not enable 64 bit bus.  Disabled.\n",
+				dev->net_dev.name);
 	} else
-		dev->CFG_cache &= ~(CFG_T64ADDR | CFG_DATA64_EN);
+		dev->CFG_cache &= ~(CFG_DATA64_EN);
 
 	dev->CFG_cache &= (CFG_TBI_EN  | CFG_MRM_DIS   | CFG_MWI_DIS |
 			   CFG_T64ADDR | CFG_DATA64_EN | CFG_EXT_125 |
@@ -1528,8 +1579,12 @@
 	writel(dev->CFG_cache, dev->base + CFG);
 	dprintk("CFG: %08x\n", dev->CFG_cache);
 
+#if 1	/* Huh?  This sets the PCI latency register.  Should be done via 
+	 * the PCI layer.  FIXME.
+	 */
 	if (readl(dev->base + SRR))
 		writel(readl(dev->base+0x20c) | 0xfe00, dev->base + 0x20c);
+#endif
 
 	/* Note!  The DMA burst size interacts with packet
 	 * transmission, such that the largest packet that
@@ -1543,13 +1598,15 @@
 	/* Flush the interrupt holdoff timer */
 	writel(0x000, dev->base + IHR);
 	writel(0x100, dev->base + IHR);
+	writel(0x000, dev->base + IHR);
 
 	/* Set Rx to full duplex, don't accept runt, errored, long or length
-	 * range errored packets.  Set MXDMA to 7 => 512 word burst
+	 * range errored packets.  Set MXDMA to 0 => 1024 word burst
 	 */
 	writel(RXCFG_AEP | RXCFG_ARP | RXCFG_AIRL | RXCFG_RX_FD
+		| RXCFG_STRIPCRC
 		| RXCFG_ALP
-		| RXCFG_MXDMA | 0, dev->base + RXCFG);
+		| (RXCFG_MXDMA0 * 0) | 0, dev->base + RXCFG);
 
 	/* Disable priority queueing */
 	writel(0, dev->base + PQCR);
@@ -1576,7 +1633,11 @@
 	dev->net_dev.features |= NETIF_F_SG;
 	dev->net_dev.features |= NETIF_F_IP_CSUM;
 #if defined(USE_64BIT_ADDR) || defined(CONFIG_HIGHMEM4G)
-	dev->net_dev.features |= NETIF_F_HIGHDMA;
+	if ((dev->CFG_cache & CFG_T64ADDR)) {
+		printk(KERN_INFO "%s: using 64 bit addressing.\n",
+			dev->net_dev.name);
+		dev->net_dev.features |= NETIF_F_HIGHDMA;
+	}
 #endif
 
 	printk(KERN_INFO "%s: ns83820 v" VERSION ": DP83820 v%u.%u: %02x:%02x:%02x:%02x:%02x:%02x io=0x%08lx irq=%d f=%s\n",
@@ -1587,7 +1648,7 @@
 		dev->net_dev.dev_addr[2], dev->net_dev.dev_addr[3],
 		dev->net_dev.dev_addr[4], dev->net_dev.dev_addr[5],
 		addr, pci_dev->irq,
-		(dev->net_dev.features & NETIF_F_HIGHDMA) ? "sg" : "h,sg"
+		(dev->net_dev.features & NETIF_F_HIGHDMA) ? "h,sg" : "sg"
 		);
 
 	return 0;

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11 19:48                       ` Richard Gooch
@ 2002-03-12  6:04                         ` David S. Miller
  2002-03-12  6:20                           ` Richard Gooch
  0 siblings, 1 reply; 58+ messages in thread
From: David S. Miller @ 2002-03-12  6:04 UTC (permalink / raw)
  To: rgooch; +Cc: bcrl, whitney, linux-kernel

   From: Richard Gooch <rgooch@ras.ucalgary.ca>
   Date: Mon, 11 Mar 2002 12:48:43 -0700

   David S. Miller writes:
   > NAPI is really only going to help with high packet rates not with
   > thinks like raw bandwidth tests.
   
   You're saying that people should just go and use jumbo frames? Isn't
   that a problem for mixed 10/100/1000 LANs?

No, I'm saying that the current situation is fine with most cards
and most uses.

Ben pointed out that interrupt-mitigation challenged cards like the
NatSemi do gain, but that is the only case I can imagine at this
time.

Unless you have a card like the NatSemi (no interrupt mitigation) or
your interfaces are being hit with 120,000 packets per second EACH,
then NAPI is not going to be an explosive gain for you.

Look, we were able to get world records in web serving without NAPI,
right? :-)

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-12  6:04                         ` David S. Miller
@ 2002-03-12  6:20                           ` Richard Gooch
  0 siblings, 0 replies; 58+ messages in thread
From: Richard Gooch @ 2002-03-12  6:20 UTC (permalink / raw)
  To: David S. Miller; +Cc: bcrl, whitney, linux-kernel

David S. Miller writes:
>    From: Richard Gooch <rgooch@ras.ucalgary.ca>
>    Date: Mon, 11 Mar 2002 12:48:43 -0700
> 
>    David S. Miller writes:
>    > NAPI is really only going to help with high packet rates not with
>    > thinks like raw bandwidth tests.
>    
>    You're saying that people should just go and use jumbo frames? Isn't
>    that a problem for mixed 10/100/1000 LANs?
> 
> No, I'm saying that the current situation is fine with most cards
> and most uses.
> 
> Ben pointed out that interrupt-mitigation challenged cards like the
> NatSemi do gain, but that is the only case I can imagine at this
> time.
> 
> Unless you have a card like the NatSemi (no interrupt mitigation) or
> your interfaces are being hit with 120,000 packets per second EACH,
> then NAPI is not going to be an explosive gain for you.
> 
> Look, we were able to get world records in web serving without NAPI,
> right? :-)

:-) I'd be happy to get near 1 Gb/s (800 Mb/s is acceptable) with a
cheap card and MTU=1500. Ben's message about his tweaks is
encouraging. Pity the P3 is so piss-poor.

				Regards,

					Richard....
Permanent: rgooch@atnf.csiro.au
Current:   rgooch@ras.ucalgary.ca

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: [patch] ns83820 0.17 (Re: Broadcom 5700/5701 Gigabit Ethernet Adapters)
  2002-03-12  5:40                       ` [patch] ns83820 0.17 (Re: Broadcom 5700/5701 Gigabit Ethernet Adapters) Benjamin LaHaise
@ 2002-03-12 11:00                         ` Michael Clark
  2002-03-12 11:15                           ` [patch] ns83820 0.17 David S. Miller
  2002-03-14  9:54                         ` [patch] ns83820 0.17 (Re: Broadcom 5700/5701 Gigabit Ethernet Adapters) Jeff Garzik
  2002-04-08  5:14                         ` Richard Gooch
  2 siblings, 1 reply; 58+ messages in thread
From: Michael Clark @ 2002-03-12 11:00 UTC (permalink / raw)
  To: Benjamin LaHaise; +Cc: David S. Miller, whitney, rgooch, linux-kernel, marcelo

Works for me great too! I see about a 25% boost in performance
between 2 Dual 1Ghz PIIIs on a single TCP stream and 1500 byte
packets. Up from 550Mb/s -> 690Mb/s (82MB/s).

Dave, what performance do you get with the sk98 using normal size
frames? (to compare apples with apples). BTW - i can't try jumbo
frames due to my crappy 3com gig switch.

~mc

On Tuesday, March 12, 2002, at 01:40 PM, Benjamin LaHaise wrote:

> On Sun, Mar 10, 2002 at 06:30:33PM -0800, David S. Miller wrote:
>> Syskonnect sk98 with jumbo frames gets ~107MB/sec TCP bandwidth
>> without NAPI, there is no reason other cards cannot go full speed as
>> well.
>>
>> NAPI is really only going to help with high packet rates not with
>> thinks like raw bandwidth tests.
>
> A day's tweaking later, and I'm getting 810mbit/s with netperf between
> two Athlons with default settings (1500 byte packets).  What I've found
> is that increasing the size of the RX/TX rings or the max sizes of the
> tcp r/wmem backlogs really slows things down, so I'm not doing that
> anymore.  The pair of P3s shows 262mbit/s (up from 67).
>
> Interrupt mitigation is now pretty stupid, but it helped: the irq
> handler disables the rx interrupt and then triggers a tasklet to run
> through the rx ring.  The tasklet later enables rx interrupts again.
> More tweaking tomorrow...
>
> Marcelo, please apply the patch below to the next 2.4 prepatch: it
> also has a fix for a tx hang problem, and a few other nasties.  Thanks!
>
> 		-ben
> --
> "A man with a bass just walked in,
>  and he's putting it down
>  on the floor."
>
>
> --- kernels/2.4/v2.4.19-pre2/drivers/net/ns83820.c	Thu Mar  7 16:40:00 
> 2002
> +++ ns-2.4.19-pre2/drivers/net/ns83820.c	Tue Mar 12 00:09:32 2002
> @@ -1,7 +1,7 @@
> -#define _VERSION "0.15"
> +#define _VERSION "0.17"
>  /* ns83820.c by Benjamin LaHaise <bcrl@redhat.com> with contributions.
>   *
> - * $Revision: 1.34.2.12 $
> + * $Revision: 1.34.2.14 $
>   *
>   * Copyright 2001 Benjamin LaHaise.
>   * Copyright 2001 Red Hat.
> @@ -51,6 +51,8 @@
>   *				suppress duplicate link status messages
>   *	20011117 	0.14 - ethtool GDRVINFO, GLINK support from jgarzik
>   *	20011204 	0.15	get ppc (big endian) working
> + *	20011218	0.16	various cleanups
> + *	20020310	0.17	speedups
>   *
>   * Driver Overview
>   * ===============
> @@ -93,8 +95,8 @@
>  #include <linux/in.h>	/* for IPPROTO_... */
>  #include <linux/eeprom.h>
>  #include <linux/compiler.h>
> +#include <linux/prefetch.h>
>  #include <linux/ethtool.h>
> -//#include <linux/skbrefill.h>
>
>  #include <asm/io.h>
>  #include <asm/uaccess.h>
> @@ -154,10 +156,16 @@
>  #endif
>
>  /* tunables */
> -#define RX_BUF_SIZE	6144	/* 8192 */
> -#define NR_RX_DESC	256
> +#define RX_BUF_SIZE	1500	/* 8192 */
>
> -#define NR_TX_DESC	256
> +/* Must not exceed ~65000. */
> +#define NR_RX_DESC	64
> +#define NR_TX_DESC	64
> +
> +/* not tunable */
> +#define REAL_RX_BUF_SIZE (RX_BUF_SIZE + 14)	/* rx/tx mac addr + 
> type */
> +
> +#define MIN_TX_DESC_FREE	8
>
>  /* register defines */
>  #define CFGCS		0x04
> @@ -408,7 +416,8 @@
>
>  	struct sk_buff	*skbs[NR_RX_DESC];
>
> -	unsigned	next_rx, next_empty;
> +	u32		*next_rx_desc;
> +	u16		next_rx, next_empty;
>
>  	u32		*descs;
>  	dma_addr_t	phy_descs;
> @@ -423,6 +432,7 @@
>  	struct pci_dev		*pci_dev;
>
>  	struct rx_info		rx_info;
> +	struct tasklet_struct	rx_tasklet;
>
>  	unsigned		ihr;
>  	struct tq_struct	tq_refill;
> @@ -441,10 +451,11 @@
>  	spinlock_t	tx_lock;
>
>  	long		tx_idle;
> -	u32		tx_done_idx;
> -	u32		tx_idx;
> -	volatile u32	tx_free_idx;	/* idx of free desc chain */
> -	u32		tx_intr_idx;
> +
> +	u16		tx_done_idx;
> +	u16		tx_idx;
> +	volatile u16	tx_free_idx;	/* idx of free desc chain */
> +	u16		tx_intr_idx;
>
>  	struct sk_buff	*tx_skbs[NR_TX_DESC];
>
> @@ -455,7 +466,7 @@
>
>  //free = (tx_done_idx + NR_TX_DESC-2 - free_idx) % NR_TX_DESC
>  #define start_tx_okay(dev)	\
> -	(((NR_TX_DESC-2 + dev->tx_done_idx - dev->tx_free_idx) % 
> NR_TX_DESC) > NR_TX_DESC/2)
> +	(((NR_TX_DESC-2 + dev->tx_done_idx - dev->tx_free_idx) % 
> NR_TX_DESC) > MIN_TX_DESC_FREE)
>
>
>  /* Packet Receiver
> @@ -509,7 +520,7 @@
>  	next_empty = dev->rx_info.next_empty;
>
>  	/* don't overrun last rx marker */
> -	if (nr_rx_empty(dev) <= 2) {
> +	if (unlikely(nr_rx_empty(dev) <= 2)) {
>  		kfree_skb(skb);
>  		return 1;
>  	}
> @@ -523,34 +534,39 @@
>  #endif
>
>  	sg = dev->rx_info.descs + (next_empty * DESC_SIZE);
> -	if (dev->rx_info.skbs[next_empty])
> +	if (unlikely(NULL != dev->rx_info.skbs[next_empty]))
>  		BUG();
>  	dev->rx_info.skbs[next_empty] = skb;
>
>  	dev->rx_info.next_empty = (next_empty + 1) % NR_RX_DESC;
> -	cmdsts = RX_BUF_SIZE | CMDSTS_INTR;
> -	buf = pci_map_single(dev->pci_dev, skb->tail, RX_BUF_SIZE, 
> PCI_DMA_FROMDEVICE);
> +	cmdsts = REAL_RX_BUF_SIZE | CMDSTS_INTR;
> +	buf = pci_map_single(dev->pci_dev, skb->tail,
> +			     REAL_RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
>  	build_rx_desc(dev, sg, 0, buf, cmdsts, 0);
>  	/* update link of previous rx */
> -	if (next_empty != dev->rx_info.next_rx)
> +	if (likely(next_empty != dev->rx_info.next_rx))
>  		dev->rx_info.descs[((NR_RX_DESC + next_empty - 1) % 
> NR_RX_DESC) * DESC_SIZE] = cpu_to_le32(dev->rx_info.phy_descs + 
> (next_empty * DESC_SIZE * 4));
>
>  	return 0;
>  }
>
> -static int rx_refill(struct ns83820 *dev, int gfp)
> +static inline int rx_refill(struct ns83820 *dev, int gfp)
>  {
>  	unsigned i;
>  	long flags = 0;
>
> +	if (unlikely(nr_rx_empty(dev) <= 2))
> +		return 0;
> +
>  	dprintk("rx_refill(%p)\n", dev);
>  	if (gfp == GFP_ATOMIC)
>  		spin_lock_irqsave(&dev->rx_info.lock, flags);
>  	for (i=0; i<NR_RX_DESC; i++) {
>  		struct sk_buff *skb;
>  		long res;
> -		skb = __dev_alloc_skb(RX_BUF_SIZE+16, gfp);
> -		if (!skb)
> +		/* extra 16 bytes for alignment */
> +		skb = __dev_alloc_skb(REAL_RX_BUF_SIZE+16, gfp);
> +		if (unlikely(!skb))
>  			break;
>
>  		res = (long)skb->tail & 0xf;
> @@ -575,6 +591,12 @@
>  	return i ? 0 : -ENOMEM;
>  }
>
> +static void FASTCALL(rx_refill_atomic(struct ns83820 *dev));
> +static void rx_refill_atomic(struct ns83820 *dev)
> +{
> +	rx_refill(dev, GFP_ATOMIC);
> +}
> +
>  /* REFILL */
>  static inline void queue_refill(void *_dev)
>  {
> @@ -590,6 +612,7 @@
>  	build_rx_desc(dev, dev->rx_info.descs + (DESC_SIZE * i), 0, 0, 
> CMDSTS_OWN, 0);
>  }
>
> +static void FASTCALL(phy_intr(struct ns83820 *dev));
>  static void phy_intr(struct ns83820 *dev)
>  {
>  	static char *speeds[] = { "10", "100", "1000", "1000(?)", "1000F" };
> @@ -600,7 +623,6 @@
>  	cfg = readl(dev->base + CFG) ^ SPDSTS_POLARITY;
>
>  	if (dev->CFG_cache & CFG_TBI_EN) {
> -
>  		/* we have an optical transceiver */
>  		tbisr = readl(dev->base + TBISR);
>  		tanar = readl(dev->base + TANAR);
> @@ -646,20 +668,24 @@
>  		new_cfg = dev->CFG_cache & ~(CFG_SB | CFG_MODE_1000 | CFG_SPDSTS);
>
>  		if (cfg & CFG_SPDSTS1)
> -			new_cfg |= CFG_MODE_1000 | CFG_SB;
> +			new_cfg |= CFG_MODE_1000;
>  		else
> -			new_cfg &= ~CFG_MODE_1000 | CFG_SB;
> +			new_cfg &= ~CFG_MODE_1000;
>
> -		if ((cfg & CFG_LNKSTS) && ((new_cfg ^ dev->CFG_cache) & 
> CFG_MODE_1000)) {
> +		speed = ((cfg / CFG_SPDSTS0) & 3);
> +		fullduplex = (cfg & CFG_DUPSTS);
> +
> +		if (fullduplex)
> +			new_cfg |= CFG_SB;
> +
> +		if ((cfg & CFG_LNKSTS) &&
> +		    ((new_cfg ^ dev->CFG_cache) & CFG_MODE_1000)) {
>  			writel(new_cfg, dev->base + CFG);
>  			dev->CFG_cache = new_cfg;
>  		}
>
>  		dev->CFG_cache &= ~CFG_SPDSTS;
>  		dev->CFG_cache |= cfg & CFG_SPDSTS;
> -
> -		speed = ((cfg / CFG_SPDSTS0) & 3);
> -		fullduplex = (cfg & CFG_DUPSTS);
>  	}
>
>  	newlinkstate = (cfg & CFG_LNKSTS) ? LINK_UP : LINK_DOWN;
> @@ -690,6 +716,7 @@
>
>  	dev->rx_info.idle = 1;
>  	dev->rx_info.next_rx = 0;
> +	dev->rx_info.next_rx_desc = dev->rx_info.descs;
>  	dev->rx_info.next_empty = 0;
>
>  	for (i=0; i<NR_RX_DESC; i++)
> @@ -724,7 +751,7 @@
>  		dev->IMR_cache |= ISR_RXDESC;
>  		dev->IMR_cache |= ISR_RXIDLE;
>  		dev->IMR_cache |= ISR_TXDESC;
> -		//dev->IMR_cache |= ISR_TXIDLE;
> +		dev->IMR_cache |= ISR_TXIDLE;
>
>  		writel(dev->IMR_cache, dev->base + IMR);
>  		writel(1, dev->base + IER);
> @@ -770,6 +797,41 @@
>  	}
>  }
>
> +/* I hate the network stack sometimes */
> +#ifdef __i386__
> +#define skb_mangle_for_davem(skb,len)	(skb)
> +#else
> +static inline struct sk_buff *skb_mangle_for_davem(struct sk_buff 
> *skb, int len)
> +{
> +	tmp = __dev_alloc_skb(len+2, GFP_ATOMIC);
> +	if (!tmp)
> +		goto done;
> +	tmp->dev = &dev->net_dev;
> +	skb_reserve(tmp, 2);
> +	memcpy(skb_put(tmp, len), skb->data, len);
> +	kfree_skb(skb);
> +	return tmp;
> +}
> +#endif
> +
> +static void FASTCALL(ns83820_rx_kick(struct ns83820 *dev));
> +static void ns83820_rx_kick(struct ns83820 *dev)
> +{
> +	/*if (nr_rx_empty(dev) >= NR_RX_DESC/4)*/ {
> +		if (dev->rx_info.up) {
> +			rx_refill_atomic(dev);
> +			kick_rx(dev);
> +		}
> +	}
> +
> +	if (dev->rx_info.up && nr_rx_empty(dev) > NR_RX_DESC*3/4)
> +		schedule_task(&dev->tq_refill);
> +	else
> +		kick_rx(dev);
> +	if (dev->rx_info.idle)
> +		Dprintk("BAD\n");
> +}
> +
>  /* rx_irq
>   *	
>   */
> @@ -785,10 +847,10 @@
>  	dprintk("rx_irq(%p)\n", dev);
>  	dprintk("rxdp: %08x, descs: %08lx next_rx[%d]: %p next_empty[%d]: 
> %p\n",
>  		readl(dev->base + RXDP),
> -		(dev->rx_info.phy_descs),
> -		dev->rx_info.next_rx,
> +		(long)(dev->rx_info.phy_descs),
> +		(int)dev->rx_info.next_rx,
>  		(dev->rx_info.descs + (DESC_SIZE * dev->rx_info.next_rx)),
> -		dev->rx_info.next_empty,
> +		(int)dev->rx_info.next_empty,
>  		(dev->rx_info.descs + (DESC_SIZE * dev->rx_info.next_empty))
>  		);
>
> @@ -798,7 +860,7 @@
>
>  	dprintk("walking descs\n");
>  	next_rx = info->next_rx;
> -	desc = info->descs + (DESC_SIZE * next_rx);
> +	desc = info->next_rx_desc;
>  	while ((CMDSTS_OWN & (cmdsts = le32_to_cpu(desc[CMDSTS]))) &&
>  	       (cmdsts != CMDSTS_OWN)) {
>  		struct sk_buff *skb;
> @@ -813,29 +875,17 @@
>  		info->skbs[next_rx] = NULL;
>  		info->next_rx = (next_rx + 1) % NR_RX_DESC;
>
> -		barrier();
> +		mb();
>  		clear_rx_desc(dev, next_rx);
>
>  		pci_unmap_single(dev->pci_dev, bufptr,
>  				 RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
> -		if (CMDSTS_OK & cmdsts) {
> -#if 0 //ndef __i386__
> -			struct sk_buff *tmp;
> -#endif
> +		if (likely(CMDSTS_OK & cmdsts)) {
>  			int len = cmdsts & 0xffff;
> -			if (!skb)
> -				BUG();
>  			skb_put(skb, len);
> -#if 0 //ndef __i386__	/* I hate the network stack sometimes */
> -			tmp = __dev_alloc_skb(RX_BUF_SIZE+16, GFP_ATOMIC);
> -			if (!tmp)
> -				goto done;
> -			tmp->dev = &dev->net_dev;
> -			skb_reserve(tmp, 2);
> -			memcpy(skb_put(tmp, len), skb->data, len);
> -			kfree_skb(skb);
> -			skb = tmp;
> -#endif
> +			skb = skb_mangle_for_davem(skb, len);
> +			if (unlikely(!skb))
> +				goto netdev_mangle_me_harder_failed;
>  			if (cmdsts & CMDSTS_DEST_MULTI)
>  				dev->stats.multicast ++;
>  			dev->stats.rx_packets ++;
> @@ -846,11 +896,10 @@
>  				skb->ip_summed = CHECKSUM_NONE;
>  			}
>  			skb->protocol = eth_type_trans(skb, &dev->net_dev);
> -			if (NET_RX_DROP == netif_rx(skb))
> +			if (NET_RX_DROP == netif_rx(skb)) {
> +netdev_mangle_me_harder_failed:
>  				dev->stats.rx_dropped ++;
> -#if 0 //ndef __i386__
> -		done:;
> -#endif
> +			}
>  		} else {
>  			kfree_skb(skb);
>  		}
> @@ -860,6 +909,7 @@
>  		desc = info->descs + (DESC_SIZE * next_rx);
>  	}
>  	info->next_rx = next_rx;
> +	info->next_rx_desc = info->descs + (DESC_SIZE * next_rx);
>
>  out:
>  	if (0 && !nr) {
> @@ -869,6 +919,15 @@
>  	spin_unlock_irqrestore(&info->lock, flags);
>  }
>
> +static void rx_action(unsigned long _dev)
> +{
> +	struct ns83820 *dev = (void *)_dev;
> +	rx_irq(dev);
> +	writel(0x002, dev->base + IHR);
> +	writel(dev->IMR_cache | ISR_RXDESC, dev->base + IMR);
> +	rx_irq(dev);
> +	ns83820_rx_kick(dev);
> +}
>
>  /* Packet Transmit code
>   */
> @@ -879,7 +938,9 @@
>  	writel(CR_TXE, dev->base + CR);
>  }
>
> -/* no spinlock needed on the transmit irq path as the interrupt 
> handler is serialized */
> +/* No spinlock needed on the transmit irq path as the interrupt 
> handler is
> + * serialized.
> + */
>  static void do_tx_done(struct ns83820 *dev)
>  {
>  	u32 cmdsts, tx_done_idx, *desc;
> @@ -917,7 +978,7 @@
>  		tx_done_idx = (tx_done_idx + 1) % NR_TX_DESC;
>  		dev->tx_done_idx = tx_done_idx;
>  		desc[CMDSTS] = cpu_to_le32(0);
> -		barrier();
> +		mb();
>  		desc = dev->tx_descs + (tx_done_idx * DESC_SIZE);
>  	}
>
> @@ -952,7 +1013,6 @@
>   * while trying to track down a bug in either the zero copy code or
>   * the tx fifo (hence the MAX_FRAG_LEN).
>   */
> -#define MAX_FRAG_LEN	8192	/* disabled for now */
>  static int ns83820_hard_start_xmit(struct sk_buff *skb, struct 
> net_device *_dev)
>  {
>  	struct ns83820 *dev = (struct ns83820 *)_dev;
> @@ -970,9 +1030,9 @@
>
>  	nr_frags =  skb_shinfo(skb)->nr_frags;
>  again:
> -	if (__builtin_expect(dev->CFG_cache & CFG_LNKSTS, 0)) {
> +	if (unlikely(dev->CFG_cache & CFG_LNKSTS)) {
>  		netif_stop_queue(&dev->net_dev);
> -		if (__builtin_expect(dev->CFG_cache & CFG_LNKSTS, 0))
> +		if (unlikely(dev->CFG_cache & CFG_LNKSTS))
>  			return 1;
>  		netif_start_queue(&dev->net_dev);
>  	}
> @@ -981,7 +1041,7 @@
>  	tx_done_idx = dev->tx_done_idx;
>  	nr_free = (tx_done_idx + NR_TX_DESC-2 - free_idx) % NR_TX_DESC;
>  	nr_free -= 1;
> -	if ((nr_free <= nr_frags) || (nr_free <= 8192 / MAX_FRAG_LEN)) {
> +	if (nr_free <= nr_frags) {
>  		dprintk("stop_queue - not enough(%p)\n", dev);
>  		netif_stop_queue(&dev->net_dev);
>
> @@ -996,11 +1056,11 @@
>
>  	if (free_idx == dev->tx_intr_idx) {
>  		do_intr = 1;
> -		dev->tx_intr_idx = (dev->tx_intr_idx + NR_TX_DESC/2) % NR_TX_DESC;
> +		dev->tx_intr_idx = (dev->tx_intr_idx + NR_TX_DESC/4) % NR_TX_DESC;
>  	}
>
>  	nr_free -= nr_frags;
> -	if (nr_free < 1) {
> +	if (nr_free < MIN_TX_DESC_FREE) {
>  		dprintk("stop_queue - last entry(%p)\n", dev);
>  		netif_stop_queue(&dev->net_dev);
>  		stopped = 1;
> @@ -1028,14 +1088,6 @@
>  	for (;;) {
>  		volatile u32 *desc = dev->tx_descs + (free_idx * DESC_SIZE);
>  		u32 residue = 0;
> -#if 0
> -		if (len > MAX_FRAG_LEN) {
> -			residue = len;
> -			/* align the start address of the next fragment */
> -			len = MAX_FRAG_LEN;
> -			residue -= len;
> -		}
> -#endif
>
>  		dprintk("frag[%3u]: %4u @ 0x%08Lx\n", free_idx, len,
>  			(unsigned long long)buf);
> @@ -1084,6 +1136,7 @@
>  {
>  	u8 *base = dev->base;
>
> +	/* the DP83820 will freeze counters, so we need to read all of 
> them */
>  	dev->stats.rx_errors		+= readl(base + 0x60) & 0xffff;
>  	dev->stats.rx_crc_errors	+= readl(base + 0x64) & 0xffff;
>  	dev->stats.rx_missed_errors	+= readl(base + 0x68) & 0xffff;
> @@ -1162,54 +1215,54 @@
>  	}
>  }
>
> +static void ns83820_mib_isr(struct ns83820 *dev)
> +{
> +	spin_lock(&dev->misc_lock);
> +	ns83820_update_stats(dev);
> +	spin_unlock(&dev->misc_lock);
> +}
> +
>  static void ns83820_irq(int foo, void *data, struct pt_regs *regs)
>  {
>  	struct ns83820 *dev = data;
> -	int count = 0;
>  	u32 isr;
>  	dprintk("ns83820_irq(%p)\n", dev);
>
>  	dev->ihr = 0;
>
> -	while (count++ < 32 && (isr = readl(dev->base + ISR))) {
> -		dprintk("irq: %08x\n", isr);
> -
> -		if (isr & ~(ISR_PHY | ISR_RXDESC | ISR_RXEARLY | ISR_RXOK | 
> ISR_RXERR | ISR_TXIDLE | ISR_TXOK | ISR_TXDESC))
> -			Dprintk("odd isr? 0x%08x\n", isr);
> -
> -	if ((ISR_RXEARLY | ISR_RXIDLE | ISR_RXORN | ISR_RXDESC | 
> ISR_RXOK | ISR_RXERR) & isr) {
> - 		if (ISR_RXIDLE & isr) {
> -			dev->rx_info.idle = 1;
> -			Dprintk("oh dear, we are idle\n");
> -		}
> +	isr = readl(dev->base + ISR);
> +	dprintk("irq: %08x\n", isr);
>
> -		if ((ISR_RXDESC) & isr) {
> -			rx_irq(dev);
> -			writel(4, dev->base + IHR);
> -		}
> -
> -		if (nr_rx_empty(dev) >= NR_RX_DESC/4) {
> -			if (dev->rx_info.up) {
> -				rx_refill(dev, GFP_ATOMIC);
> -				kick_rx(dev);
> -			}
> -		}
> +#ifdef DEBUG
> +	if (isr & ~(ISR_PHY | ISR_RXDESC | ISR_RXEARLY | ISR_RXOK | 
> ISR_RXERR | ISR_TXIDLE | ISR_TXOK | ISR_TXDESC))
> +		Dprintk("odd isr? 0x%08x\n", isr);
> +#endif
>
> -		if (dev->rx_info.up && nr_rx_empty(dev) > NR_RX_DESC*3/4)
> -			schedule_task(&dev->tq_refill);
> -		else
> -			kick_rx(dev);
> -		if (dev->rx_info.idle)
> -			Dprintk("BAD\n");
> +	if (ISR_RXIDLE & isr) {
> +		dev->rx_info.idle = 1;
> +		Dprintk("oh dear, we are idle\n");
> +		ns83820_rx_kick(dev);
> +	}
> +
> +	if ((ISR_RXDESC | ISR_RXOK) & isr) {
> +		prefetch(dev->rx_info.next_rx_desc);
> +		writel(dev->IMR_cache & ~(ISR_RXDESC | ISR_RXOK), dev->base + IMR);
> +		tasklet_schedule(&dev->rx_tasklet);
> +		//rx_irq(dev);
> +		//writel(4, dev->base + IHR);
>  	}
>
> +	if ((ISR_RXIDLE | ISR_RXORN | ISR_RXDESC | ISR_RXOK | ISR_RXERR) & 
> isr)
> +		ns83820_rx_kick(dev);
> +
>  	if (unlikely(ISR_RXSOVR & isr)) {
> -		Dprintk("overrun: rxsovr\n");
> -		dev->stats.rx_over_errors ++;
> +		//printk("overrun: rxsovr\n");
> +		dev->stats.rx_fifo_errors ++;
>  	}
> +
>  	if (unlikely(ISR_RXORN & isr)) {
> -		Dprintk("overrun: rxorn\n");
> -		dev->stats.rx_over_errors ++;
> +		//printk("overrun: rxorn\n");
> +		dev->stats.rx_fifo_errors ++;
>  	}
>
>  	if ((ISR_RXRCMP & isr) && dev->rx_info.up)
> @@ -1241,15 +1294,11 @@
>  	if ((ISR_TXDESC | ISR_TXIDLE) & isr)
>  		do_tx_done(dev);
>
> -	if (ISR_MIB & isr) {
> -		spin_lock(&dev->misc_lock);
> -		ns83820_update_stats(dev);
> -		spin_unlock(&dev->misc_lock);
> -	}
> +	if (unlikely(ISR_MIB & isr))
> +		ns83820_mib_isr(dev);
>
> -	if (ISR_PHY & isr)
> +	if (unlikely(ISR_PHY & isr))
>  		phy_intr(dev);
> -	}
>
>  #if 0	/* Still working on the interrupt mitigation strategy */
>  	if (dev->ihr)
> @@ -1412,6 +1461,7 @@
>  	dev->net_dev.owner = THIS_MODULE;
>
>  	PREPARE_TQUEUE(&dev->tq_refill, queue_refill, dev);
> +	tasklet_init(&dev->rx_tasklet, rx_action, (unsigned long)dev);
>
>  	err = pci_enable_device(pci_dev);
>  	if (err) {
> @@ -1430,8 +1480,9 @@
>  	if (!dev->base || !dev->tx_descs || !dev->rx_info.descs)
>  		goto out_disable;
>
> -	dprintk("%p: %08lx  %p: %08lx\n", dev->tx_descs, dev->tx_phy_descs,
> -		dev->rx_info.descs, dev->rx_info.phy_descs);
> +	dprintk("%p: %08lx  %p: %08lx\n",
> +		dev->tx_descs, (long)dev->tx_phy_descs,
> +		dev->rx_info.descs, (long)dev->rx_info.phy_descs);
>  	/* disable interrupts */
>  	writel(0, dev->base + IMR);
>  	writel(0, dev->base + IER);
> @@ -1484,14 +1535,14 @@
>  	dev->CFG_cache = readl(dev->base + CFG);
>
>  	if ((dev->CFG_cache & CFG_PCI64_DET)) {
> -		printk("%s: enabling 64 bit PCI addressing.\n",
> +		printk("%s: detected 64 bit PCI data bus.\n",
>  			dev->net_dev.name);
> -		dev->CFG_cache |= CFG_T64ADDR | CFG_DATA64_EN;
> -#if defined(USE_64BIT_ADDR)
> -		dev->net_dev.features |= NETIF_F_HIGHDMA;
> -#endif
> +		/*dev->CFG_cache |= CFG_DATA64_EN;*/
> +		if (!(dev->CFG_cache & CFG_DATA64_EN))
> +			printk("%s: EEPROM did not enable 64 bit bus.  Disabled.\n",
> +				dev->net_dev.name);
>  	} else
> -		dev->CFG_cache &= ~(CFG_T64ADDR | CFG_DATA64_EN);
> +		dev->CFG_cache &= ~(CFG_DATA64_EN);
>
>  	dev->CFG_cache &= (CFG_TBI_EN  | CFG_MRM_DIS   | CFG_MWI_DIS |
>  			   CFG_T64ADDR | CFG_DATA64_EN | CFG_EXT_125 |
> @@ -1528,8 +1579,12 @@
>  	writel(dev->CFG_cache, dev->base + CFG);
>  	dprintk("CFG: %08x\n", dev->CFG_cache);
>
> +#if 1	/* Huh?  This sets the PCI latency register.  Should be done via
> +	 * the PCI layer.  FIXME.
> +	 */
>  	if (readl(dev->base + SRR))
>  		writel(readl(dev->base+0x20c) | 0xfe00, dev->base + 0x20c);
> +#endif
>
>  	/* Note!  The DMA burst size interacts with packet
>  	 * transmission, such that the largest packet that
> @@ -1543,13 +1598,15 @@
>  	/* Flush the interrupt holdoff timer */
>  	writel(0x000, dev->base + IHR);
>  	writel(0x100, dev->base + IHR);
> +	writel(0x000, dev->base + IHR);
>
>  	/* Set Rx to full duplex, don't accept runt, errored, long or length
> -	 * range errored packets.  Set MXDMA to 7 => 512 word burst
> +	 * range errored packets.  Set MXDMA to 0 => 1024 word burst
>  	 */
>  	writel(RXCFG_AEP | RXCFG_ARP | RXCFG_AIRL | RXCFG_RX_FD
> +		| RXCFG_STRIPCRC
>  		| RXCFG_ALP
> -		| RXCFG_MXDMA | 0, dev->base + RXCFG);
> +		| (RXCFG_MXDMA0 * 0) | 0, dev->base + RXCFG);
>
>  	/* Disable priority queueing */
>  	writel(0, dev->base + PQCR);
> @@ -1576,7 +1633,11 @@
>  	dev->net_dev.features |= NETIF_F_SG;
>  	dev->net_dev.features |= NETIF_F_IP_CSUM;
>  #if defined(USE_64BIT_ADDR) || defined(CONFIG_HIGHMEM4G)
> -	dev->net_dev.features |= NETIF_F_HIGHDMA;
> +	if ((dev->CFG_cache & CFG_T64ADDR)) {
> +		printk(KERN_INFO "%s: using 64 bit addressing.\n",
> +			dev->net_dev.name);
> +		dev->net_dev.features |= NETIF_F_HIGHDMA;
> +	}
>  #endif
>
>  	printk(KERN_INFO "%s: ns83820 v" VERSION ": DP83820 v%u.%u: 
> %02x:%02x:%02x:%02x:%02x:%02x io=0x%08lx irq=%d f=%s\n",
> @@ -1587,7 +1648,7 @@
>  		dev->net_dev.dev_addr[2], dev->net_dev.dev_addr[3],
>  		dev->net_dev.dev_addr[4], dev->net_dev.dev_addr[5],
>  		addr, pci_dev->irq,
> -		(dev->net_dev.features & NETIF_F_HIGHDMA) ? "sg" : "h,sg"
> +		(dev->net_dev.features & NETIF_F_HIGHDMA) ? "h,sg" : "sg"
>  		);
>
>  	return 0;
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" 
> in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/


^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: [patch] ns83820 0.17
  2002-03-12 11:00                         ` Michael Clark
@ 2002-03-12 11:15                           ` David S. Miller
  2002-03-12 13:03                             ` dean gaudet
  2002-03-12 18:12                             ` Trever L. Adams
  0 siblings, 2 replies; 58+ messages in thread
From: David S. Miller @ 2002-03-12 11:15 UTC (permalink / raw)
  To: michael; +Cc: bcrl, whitney, rgooch, linux-kernel, marcelo

   From: Michael Clark <michael@metaparadigm.com>
   Date: Tue, 12 Mar 2002 19:00:09 +0800

   Dave, what performance do you get with the sk98 using normal size
   frames? (to compare apples with apples). BTW - i can't try jumbo
   frames due to my crappy 3com gig switch.

Use a cross-over cable to play with Jumbo frames, that is
what I do :-)

Later this week I'll rerun tests on all the cards I have
(Acenic, Sk98, tigon3, Natsemi etc.) with current drivers
to see what it looks like with both jumbo and non-jumbo
mtus over gigabit.

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: [patch] ns83820 0.17
  2002-03-12 13:03                             ` dean gaudet
@ 2002-03-12 13:03                               ` David S. Miller
  0 siblings, 0 replies; 58+ messages in thread
From: David S. Miller @ 2002-03-12 13:03 UTC (permalink / raw)
  To: dean-list-linux-kernel
  Cc: michael, bcrl, whitney, rgooch, linux-kernel, marcelo

   From: dean gaudet <dean-list-linux-kernel@arctic.org>
   Date: Tue, 12 Mar 2002 05:03:45 -0800 (PST)

   On Tue, 12 Mar 2002, David S. Miller wrote:
   
   > Use a cross-over cable to play with Jumbo frames, that is
   > what I do :-)
   
   you shouldn't even need a crossover cable :)

Intel e1000's can do this too...

come to think of it there is a link polarity bit in one
of the tigon3 registers, hmmm...


^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: [patch] ns83820 0.17
  2002-03-12 11:15                           ` [patch] ns83820 0.17 David S. Miller
@ 2002-03-12 13:03                             ` dean gaudet
  2002-03-12 13:03                               ` David S. Miller
  2002-03-12 18:12                             ` Trever L. Adams
  1 sibling, 1 reply; 58+ messages in thread
From: dean gaudet @ 2002-03-12 13:03 UTC (permalink / raw)
  To: David S. Miller; +Cc: michael, bcrl, whitney, rgooch, linux-kernel, marcelo

On Tue, 12 Mar 2002, David S. Miller wrote:

>    From: Michael Clark <michael@metaparadigm.com>
>    Date: Tue, 12 Mar 2002 19:00:09 +0800
>
>    Dave, what performance do you get with the sk98 using normal size
>    frames? (to compare apples with apples). BTW - i can't try jumbo
>    frames due to my crappy 3com gig switch.
>
> Use a cross-over cable to play with Jumbo frames, that is
> what I do :-)

you shouldn't even need a crossover cable :)  1000baseT NICs should figure
out what the wire pairings are and adjust the DSP accordingly.  at least
the acenic-based cards seem to work host-to-host with a regular patch
cable or a cross-over (or a hacked up pairing i tried which crossed over
both the two 100baseT pairs and the other 2 pairs which aren't usually
crossed over).

-dean


^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: [patch] ns83820 0.17
  2002-03-12 11:15                           ` [patch] ns83820 0.17 David S. Miller
  2002-03-12 13:03                             ` dean gaudet
@ 2002-03-12 18:12                             ` Trever L. Adams
  2002-03-12 18:17                               ` David S. Miller
                                                 ` (2 more replies)
  1 sibling, 3 replies; 58+ messages in thread
From: Trever L. Adams @ 2002-03-12 18:12 UTC (permalink / raw)
  To: David S. Miller; +Cc: Linux Kernel Mailing List

On Tue, 2002-03-12 at 06:15, David S. Miller wrote:

> Use a cross-over cable to play with Jumbo frames, that is
> what I do :-)
> 
> Later this week I'll rerun tests on all the cards I have
> (Acenic, Sk98, tigon3, Natsemi etc.) with current drivers
> to see what it looks like with both jumbo and non-jumbo
> mtus over gigabit.

I no longer have the original, so I will just have to respond to this
one, since it is related.  I know I know nearly nothing about
networking, but here has been my thinking.

David, you believe we don't need NAPI.  You believe we perform fine
without it.  Here is my question.  A PCI bus, IRC, has about 500
Megabytes/sec of bandwidth.  A full blown gigabit Ethernet stream should
be around 133 Megabytes/sec.  Sounds to me like a PC could act easily
(As far as bandwidth is concerned) as a 4 to 5 port gigabit Ethernet
router.

How well does this work with NAPI and how well does it work without?  Is
NAPI a gain here?

Maybe there are other issues involved that I am unaware of, if there
are, I would still like to see how the theoretical answers pan out.

Thank you,
Trever Adams


^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: [patch] ns83820 0.17
  2002-03-12 18:12                             ` Trever L. Adams
@ 2002-03-12 18:17                               ` David S. Miller
  2002-03-12 18:31                                 ` Trever L. Adams
  2002-03-12 19:52                                 ` pjd
  2002-03-12 19:06                               ` Charles Cazabon
  2002-03-12 19:39                               ` Pedro M. Rodrigues
  2 siblings, 2 replies; 58+ messages in thread
From: David S. Miller @ 2002-03-12 18:17 UTC (permalink / raw)
  To: tadams-lists; +Cc: linux-kernel

   From: "Trever L. Adams" <tadams-lists@myrealbox.com>
   Date: 12 Mar 2002 13:12:32 -0500
   
   David, you believe we don't need NAPI.

I said we don't need NAPI for just bandwidth streams, you mention
routing which is specifically the case I mention that NAPI is good for
(high packet rates).

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: [patch] ns83820 0.17
  2002-03-12 18:17                               ` David S. Miller
@ 2002-03-12 18:31                                 ` Trever L. Adams
  2002-03-12 19:52                                 ` pjd
  1 sibling, 0 replies; 58+ messages in thread
From: Trever L. Adams @ 2002-03-12 18:31 UTC (permalink / raw)
  To: David S. Miller; +Cc: Linux Kernel Mailing List

On Tue, 2002-03-12 at 13:17, David S. Miller wrote:
>    From: "Trever L. Adams" <tadams-lists@myrealbox.com>
>    Date: 12 Mar 2002 13:12:32 -0500
>    
>    David, you believe we don't need NAPI.
> 
> I said we don't need NAPI for just bandwidth streams, you mention
> routing which is specifically the case I mention that NAPI is good for
> (high packet rates).
> 

My apologies.  I have been trying to follow the conversation, but came
in, I believe, quite late.  I only saw the comments about NAPI and
bandwidth last night.

Thank you for clear that up.

Trever Adams


^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: [patch] ns83820 0.17
  2002-03-12 18:12                             ` Trever L. Adams
  2002-03-12 18:17                               ` David S. Miller
@ 2002-03-12 19:06                               ` Charles Cazabon
  2002-03-12 19:39                               ` Pedro M. Rodrigues
  2 siblings, 0 replies; 58+ messages in thread
From: Charles Cazabon @ 2002-03-12 19:06 UTC (permalink / raw)
  To: Linux Kernel Mailing List

Trever L. Adams <tadams-lists@myrealbox.com> wrote:
> 
> Here is my question.  A PCI bus, IRC, has about 500 Megabytes/sec of
> bandwidth.

Depends.  32-bit 33Mhz PCI is 133MB/s.  64-bit 66MHz PCI is 533MB/s -- those
are theoretical, of course.  In real life you're not likely to see better than
about 90% of those figures, even in ideal cases.

> A full blown gigabit Ethernet stream should be around 133 Megabytes/sec.
> Sounds to me like a PC could act easily (As far as bandwidth is concerned)
> as a 4 to 5 port gigabit Ethernet router.

If you define PC as "cheap Athlon box with 32-bit, 33MHz PCI bus", then no.

Charles
-- 
-----------------------------------------------------------------------
Charles Cazabon                            <linux@discworld.dyndns.org>
GPL'ed software available at:  http://www.qcc.sk.ca/~charlesc/software/
-----------------------------------------------------------------------

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: [patch] ns83820 0.17
  2002-03-12 18:12                             ` Trever L. Adams
  2002-03-12 18:17                               ` David S. Miller
  2002-03-12 19:06                               ` Charles Cazabon
@ 2002-03-12 19:39                               ` Pedro M. Rodrigues
  2 siblings, 0 replies; 58+ messages in thread
From: Pedro M. Rodrigues @ 2002-03-12 19:39 UTC (permalink / raw)
  To: Linux Kernel Mailing List


   A PC with an 64-bit PCI bus is still cheap nowadays, and more if 
you compare it with a full blown four gigabit port router. The question 
is  not if we have the i/o, but if it would route at wire speed.



/Pedro

On 12 Mar 2002 at 13:06, Charles Cazabon wrote:

> If you define PC as "cheap Athlon box with 32-bit, 33MHz PCI bus",
> then no.
> 


^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: [patch] ns83820 0.17
  2002-03-12 18:17                               ` David S. Miller
  2002-03-12 18:31                                 ` Trever L. Adams
@ 2002-03-12 19:52                                 ` pjd
  1 sibling, 0 replies; 58+ messages in thread
From: pjd @ 2002-03-12 19:52 UTC (permalink / raw)
  To: David S. Miller; +Cc: tadams-lists, linux-kernel

David Miller wrote:
> 
> I said we don't need NAPI for just bandwidth streams, you mention
> routing which is specifically the case I mention that NAPI is good for
> (high packet rates).

In particular, if you have a small number of high-speed streams the 
TCP window mechanism will protect against receive livelock.  (actually
a medium number of streams would still be protected - it's not until
the total offered window size in packets exceeds the input packet 
queue size that you would become vulnerable to livelock)

Routing, on the other hand, can be driven into a state where you spend
all your CPU processing receive interrupts, and no CPU actually 
forwarding the packets, for a net throughput approaching zero.  

Peter Desnoyers

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: [patch] ns83820 0.17 (Re: Broadcom 5700/5701 Gigabit Ethernet Adapters)
  2002-03-12  5:40                       ` [patch] ns83820 0.17 (Re: Broadcom 5700/5701 Gigabit Ethernet Adapters) Benjamin LaHaise
  2002-03-12 11:00                         ` Michael Clark
@ 2002-03-14  9:54                         ` Jeff Garzik
  2002-03-14 20:37                           ` Benjamin LaHaise
  2002-04-08  5:14                         ` Richard Gooch
  2 siblings, 1 reply; 58+ messages in thread
From: Jeff Garzik @ 2002-03-14  9:54 UTC (permalink / raw)
  To: Benjamin LaHaise; +Cc: David S. Miller, whitney, rgooch, linux-kernel, marcelo

Benjamin LaHaise wrote:

>A day's tweaking later, and I'm getting 810mbit/s with netperf between 
>two Athlons with default settings (1500 byte packets).  What I've found 
>is that increasing the size of the RX/TX rings or the max sizes of the 
>tcp r/wmem backlogs really slows things down, so I'm not doing that 
>anymore.  The pair of P3s shows 262mbit/s (up from 67).
>
>Interrupt mitigation is now pretty stupid, but it helped: the irq 
>handler disables the rx interrupt and then triggers a tasklet to run 
>through the rx ring.  The tasklet later enables rx interrupts again.  
>More tweaking tomorrow...
>
>Marcelo, please apply the patch below to the next 2.4 prepatch: it 
>also has a fix for a tx hang problem, and a few other nasties.  Thanks!
>

Comments:

1) What were the test conditions leading to your decision to decrease 
the RX/TX ring count?  I'm not questioning the decision, but looking to 
be better informed...  other gigabit drivers normally have larger rings. 
 I also wonder if the slowdown you see could be related to a small-sized 
FIFO on the natsemi chips, that would probably not be present on other 
gigabit chips.

2) PCI latency timer is set with pci_set_master(), as in:  if it's not 
correctly set, fix it up.  If it's correctly set, leave it alone and let 
the user tune in BIOS Setup.

3) Seeing "volatile" in your code.  Cruft?  volatile's meaning change in 
recent gcc versions implies to me that your code may need some addition 
rmb/wmb calls perhaps, which are getting hidden via the driver's 
dependency on a compiler-version-specific implementation of "volatile."

4) Do you really mean to allocate memory for "REAL_RX_BUF_SIZE + 16"? 
 Why not plain old REAL_RX_BUF_SIZE?

5) Random question, do you call netif_carrier_{on,off,ok} for link 
status manipulation?  (if not, you should...)

6) skb_mangle_for_davem is pretty gross...  curious: what sort of NIC 
alignment restrictions are there on rx and tx buffers (not descriptors)? 
 None? 32-bit?  Ignore CPU alignment for a moment here...

7) What are the criteria for netif_wake_queue?  If you are waking when 
the TX is still "mostly full" you probably generate excessive wakeups...

8) There is no cabal.



^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: [patch] ns83820 0.17 (Re: Broadcom 5700/5701 Gigabit Ethernet Adapters)
  2002-03-14  9:54                         ` [patch] ns83820 0.17 (Re: Broadcom 5700/5701 Gigabit Ethernet Adapters) Jeff Garzik
@ 2002-03-14 20:37                           ` Benjamin LaHaise
  2002-03-15  1:02                             ` Jeff Garzik
  2002-03-15  8:56                             ` Daniel Phillips
  0 siblings, 2 replies; 58+ messages in thread
From: Benjamin LaHaise @ 2002-03-14 20:37 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: David S. Miller, whitney, rgooch, linux-kernel, marcelo

On Thu, Mar 14, 2002 at 04:54:03AM -0500, Jeff Garzik wrote:
> Comments:
> 
> 1) What were the test conditions leading to your decision to decrease 
> the RX/TX ring count?  I'm not questioning the decision, but looking to 
> be better informed...  other gigabit drivers normally have larger rings. 
>  I also wonder if the slowdown you see could be related to a small-sized 
> FIFO on the natsemi chips, that would probably not be present on other 
> gigabit chips.

Smaller rings lead to better thruput, especially on the slower cpus.  Not 
that in part the slowness was caused by having slab debugging enabled.  
Turning slab debugging off brought the p3s up to ~500mbit and the athlons 
over 900.

> 2) PCI latency timer is set with pci_set_master(), as in:  if it's not 
> correctly set, fix it up.  If it's correctly set, leave it alone and let 
> the user tune in BIOS Setup.

Ah.  That part is something I was thinking of deleting, and now will do.

> 3) Seeing "volatile" in your code.  Cruft?  volatile's meaning change in 
> recent gcc versions implies to me that your code may need some addition 
> rmb/wmb calls perhaps, which are getting hidden via the driver's 
> dependency on a compiler-version-specific implementation of "volatile."

Paranoia during writing.  I'll reaudit.  That said, volatile behaviour 
is not compiler version specific.

> 4) Do you really mean to allocate memory for "REAL_RX_BUF_SIZE + 16"? 
>  Why not plain old REAL_RX_BUF_SIZE?

The +16 is for alignment (just like the comment says).  The hardware 
requires that rx buffers be 64 bit aligned.

> 5) Random question, do you call netif_carrier_{on,off,ok} for link 
> status manipulation?  (if not, you should...)

Ah, api updates.  Added to the todo.

> 6) skb_mangle_for_davem is pretty gross...  curious: what sort of NIC 
> alignment restrictions are there on rx and tx buffers (not descriptors)? 
>  None? 32-bit?  Ignore CPU alignment for a moment here...

tx descriptors have no alignment restriction, rx descriptors must be 
64 bit aligned.  Someone chose not to include the transistors for a 
barrel shifter in the rx engine.

> 7) What are the criteria for netif_wake_queue?  If you are waking when 
> the TX is still "mostly full" you probably generate excessive wakeups...

Hrm?  Currently it will do a wakeup when at least one packet (8 sg 
descriptors) can be sent.  Given that the tx done code is only called 
when a tx desc (every 1/4 or so of the tx queue) or txidle interrupt 
occurs, it shouldn't be that often.

		-ben
-- 
"A man with a bass just walked in,
 and he's putting it down
 on the floor."

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: [patch] ns83820 0.17 (Re: Broadcom 5700/5701 Gigabit Ethernet Adapters)
  2002-03-14 20:37                           ` Benjamin LaHaise
@ 2002-03-15  1:02                             ` Jeff Garzik
  2002-03-15  8:56                             ` Daniel Phillips
  1 sibling, 0 replies; 58+ messages in thread
From: Jeff Garzik @ 2002-03-15  1:02 UTC (permalink / raw)
  To: Benjamin LaHaise; +Cc: David S. Miller, whitney, rgooch, linux-kernel, marcelo

Benjamin LaHaise wrote:

>>3) Seeing "volatile" in your code.  Cruft?  volatile's meaning change in 
>>recent gcc versions implies to me that your code may need some addition 
>>rmb/wmb calls perhaps, which are getting hidden via the driver's 
>>dependency on a compiler-version-specific implementation of "volatile."
>>
>
>Paranoia during writing.  I'll reaudit.  That said, volatile behaviour 
>is not compiler version specific.
>
gcc 3.1 volatile behavior changes, so, yes, it is...

>>4) Do you really mean to allocate memory for "REAL_RX_BUF_SIZE + 16"? 
>> Why not plain old REAL_RX_BUF_SIZE?
>>
>
>The +16 is for alignment (just like the comment says).  The hardware 
>requires that rx buffers be 64 bit aligned.
>
Cool... just checking.  Both RX_BUF_SIZE and REAL_RX_BUF_SIZE are defined as
    foo + magic_number

so I wasn't sure if the alignment space was -already- accounted for, in 
the definition of RX_BUF_SIZE, thus making the addition op next to 
allocations of REAL_RX_BUF_SIZE superfluous.  But, I stand corrected, 
thanks.

>5) Random question, do you call netif_carrier_{on,off,ok} for link 
>> status manipulation?  (if not, you should...)
>
>
>Ah, api updates.  Added to the todo.
>
More than just api updates... You have a bunch of hack-y logic for when 
the link goes down and up, messing around with netif_stop_queue and 
netif_wake_queue.  That stuff will be simplified or simply go away.  The 
basic idea is, if netif_carrier_ok(dev) is not true, then the net stack 
will not be sending you any packets.  So those extra 
netif_{stop,wake}_queue calls are superflouous.

We're also about to start sending link up/down messages async-ly via 
netlink, so that's even more added value as well.

>>6) skb_mangle_for_davem is pretty gross...  curious: what sort of NIC 
>>alignment restrictions are there on rx and tx buffers (not descriptors)? 
>> None? 32-bit?  Ignore CPU alignment for a moment here...
>>
>
>tx descriptors have no alignment restriction, rx descriptors must be 
>64 bit aligned.  Someone chose not to include the transistors for a 
>barrel shifter in the rx engine.
>

Sigh :)

>>7) What are the criteria for netif_wake_queue?  If you are waking when 
>>the TX is still "mostly full" you probably generate excessive wakeups...
>>
>
>Hrm?  Currently it will do a wakeup when at least one packet (8 sg 
>descriptors) can be sent.  Given that the tx done code is only called 
>when a tx desc (every 1/4 or so of the tx queue) or txidle interrupt 
>occurs, it shouldn't be that often.
>

Cool.  As FYI (_not_ advice on your driver), here's the logic I was 
referring to:

    dev->hard_start_xmit()
        if (free slots < MAX_SKB_FRAGS)
            BUG()
        queue packet
        if (free slots < MAX_SKB_FRAGS)
            netif_stop_queue(dev)

    foo_interrupt()
        if (some tx interrupt)
            complete as many TX's as possible
            if (netif_queue_stopped && (free slots > (TX_RING_SIZE / 4)))
                netif_wake_queue(dev)

But as long as your TX interrupts are well mitigated (and it sounds like 
they are), you can get by with your current scheme just fine.

    Jeff





^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: [patch] ns83820 0.17 (Re: Broadcom 5700/5701 Gigabit Ethernet Adapters)
  2002-03-14 20:37                           ` Benjamin LaHaise
  2002-03-15  1:02                             ` Jeff Garzik
@ 2002-03-15  8:56                             ` Daniel Phillips
  1 sibling, 0 replies; 58+ messages in thread
From: Daniel Phillips @ 2002-03-15  8:56 UTC (permalink / raw)
  To: Benjamin LaHaise, Jeff Garzik
  Cc: David S. Miller, whitney, rgooch, linux-kernel, marcelo

On March 14, 2002 09:37 pm, Benjamin LaHaise wrote:
> > 4) Do you really mean to allocate memory for "REAL_RX_BUF_SIZE + 16"? 
> >  Why not plain old REAL_RX_BUF_SIZE?
> 
> The +16 is for alignment (just like the comment says).  The hardware 
> requires that rx buffers be 64 bit aligned.

Nit: that would be REAL_RX_BUF_SIZE + 15.

-- 
Daniel

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: Broadcom 5700/5701 Gigabit Ethernet Adapters
  2002-03-11  1:03           ` David S. Miller
  2002-03-11  1:14             ` Richard Gooch
  2002-03-11  2:04             ` Broadcom 5700/5701 Gigabit Ethernet Adapters Ben Collins
@ 2002-03-21 20:39             ` Thomas Langås
  2 siblings, 0 replies; 58+ messages in thread
From: Thomas Langås @ 2002-03-21 20:39 UTC (permalink / raw)
  To: David S. Miller; +Cc: rgooch, laforge, skraw, joe, linux-kernel, elsner

David S. Miller:
> This may surprise some people, but frankly I think the Tigon3's PCI
> dma engine is junk based upon my current knowledge of the card.  It is
> always possible I may find out something new which kills this
> perception I have of the card, but we'll see...

Is it possible that they've changed this in newer revisions of their
chips?  Why is it junk?  What could've been done better?  What effects has
does the "junky" DMA engine have on the NIC (can there be packet losses when
there's packet bursts, for instance)?

(I'm asking this because we're considering servers which as broadcom NICs
as the only NICs on-board, on the servers).  

-- 
Thomas

^ permalink raw reply	[flat|nested] 58+ messages in thread

* Re: [patch] ns83820 0.17 (Re: Broadcom 5700/5701 Gigabit Ethernet Adapters)
  2002-03-12  5:40                       ` [patch] ns83820 0.17 (Re: Broadcom 5700/5701 Gigabit Ethernet Adapters) Benjamin LaHaise
  2002-03-12 11:00                         ` Michael Clark
  2002-03-14  9:54                         ` [patch] ns83820 0.17 (Re: Broadcom 5700/5701 Gigabit Ethernet Adapters) Jeff Garzik
@ 2002-04-08  5:14                         ` Richard Gooch
  2 siblings, 0 replies; 58+ messages in thread
From: Richard Gooch @ 2002-04-08  5:14 UTC (permalink / raw)
  To: Benjamin LaHaise; +Cc: David S. Miller, linux-kernel

Benjamin LaHaise writes:
> On Sun, Mar 10, 2002 at 06:30:33PM -0800, David S. Miller wrote:
> > Syskonnect sk98 with jumbo frames gets ~107MB/sec TCP bandwidth
> > without NAPI, there is no reason other cards cannot go full speed as
> > well.
> > 
> > NAPI is really only going to help with high packet rates not with
> > thinks like raw bandwidth tests.
> 
> A day's tweaking later, and I'm getting 810mbit/s with netperf
> between two Athlons with default settings (1500 byte packets).  What
> I've found is that increasing the size of the RX/TX rings or the max
> sizes of the tcp r/wmem backlogs really slows things down, so I'm
> not doing that anymore.  The pair of P3s shows 262mbit/s (up from
> 67).

Just a public word of thanks to Ben for improving the driver. I've got
7 shiny new Addtron cards (aka "El Cheapo":-) and with 2.4.19-pre6 I'm
getting TCP bandwidths of 69 MB/s (PIII 450 SMP to Athalon 500 UP) and
52 MB/s (Athalon 500 UP to PIII 450 SMP). CONFIG_DEBUG_SLAB=n. This is
with two 16 m runs of Category 5 cable (still waiting for the Cat 6).
MTU=1500.

Only half of the theoretical bandwidth, but, hey, it's heaps better
than 100 Mb/s. Hopefully the remaining 50% will be reclaimed after
more hackery (and/or NAPI). Being on a mixed 10/100/1000 Mb/s network
means that I'm stuck with MTU=1500.

				Regards,

					Richard....
Permanent: rgooch@atnf.csiro.au
Current:   rgooch@ras.ucalgary.ca

^ permalink raw reply	[flat|nested] 58+ messages in thread

end of thread, other threads:[~2002-04-08  5:15 UTC | newest]

Thread overview: 58+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-02-15 12:58 Broadcom 5700/5701 Gigabit Ethernet Adapters Frank Elsner
2002-02-15 13:06 ` Jeff Garzik
2002-02-15 14:36   ` Thomas Langås
2002-02-15 14:45     ` Jeff Garzik
2002-02-15 14:55       ` Thomas Langås
2002-02-15 15:00         ` Jeff Garzik
2002-02-15 15:36           ` Thomas Langås
2002-02-15 20:20     ` David S. Miller
2002-02-19  0:18       ` Thomas Langås
2002-02-15 15:03   ` Jason Lunz
2002-02-26 20:09     ` Jes Sorensen
2002-02-15 14:43 ` J Sloan
2002-02-27 14:12   ` Stephan von Krawczynski
2002-03-10 15:33     ` Harald Welte
2002-03-10 19:10       ` Jeff Garzik
2002-03-10 21:35         ` Harald Welte
2002-03-11  0:41       ` David S. Miller
2002-03-11  0:55         ` Richard Gooch
2002-03-11  1:03           ` David S. Miller
2002-03-11  1:14             ` Richard Gooch
2002-03-11  1:31               ` David S. Miller
2002-03-11  1:31               ` Jeff Garzik
2002-03-11  2:05               ` Wayne Whitney
2002-03-11  2:04                 ` David S. Miller
2002-03-11  2:10                   ` Richard Gooch
2002-03-11  2:15                     ` David S. Miller
2002-03-11  2:22                   ` Benjamin LaHaise
2002-03-11  2:28                     ` Mike Fedyk
2002-03-11  2:32                       ` David S. Miller
2002-03-11  2:30                     ` David S. Miller
2002-03-11  3:15                       ` Benjamin LaHaise
2002-03-11  4:20                         ` Michael Clark
2002-03-11  4:28                           ` Benjamin LaHaise
2002-03-11 19:48                       ` Richard Gooch
2002-03-12  6:04                         ` David S. Miller
2002-03-12  6:20                           ` Richard Gooch
2002-03-12  5:40                       ` [patch] ns83820 0.17 (Re: Broadcom 5700/5701 Gigabit Ethernet Adapters) Benjamin LaHaise
2002-03-12 11:00                         ` Michael Clark
2002-03-12 11:15                           ` [patch] ns83820 0.17 David S. Miller
2002-03-12 13:03                             ` dean gaudet
2002-03-12 13:03                               ` David S. Miller
2002-03-12 18:12                             ` Trever L. Adams
2002-03-12 18:17                               ` David S. Miller
2002-03-12 18:31                                 ` Trever L. Adams
2002-03-12 19:52                                 ` pjd
2002-03-12 19:06                               ` Charles Cazabon
2002-03-12 19:39                               ` Pedro M. Rodrigues
2002-03-14  9:54                         ` [patch] ns83820 0.17 (Re: Broadcom 5700/5701 Gigabit Ethernet Adapters) Jeff Garzik
2002-03-14 20:37                           ` Benjamin LaHaise
2002-03-15  1:02                             ` Jeff Garzik
2002-03-15  8:56                             ` Daniel Phillips
2002-04-08  5:14                         ` Richard Gooch
2002-03-11  2:04             ` Broadcom 5700/5701 Gigabit Ethernet Adapters Ben Collins
2002-03-11  2:13               ` David S. Miller
2002-03-11  2:22                 ` Ben Collins
2002-03-11  2:31                   ` David S. Miller
2002-03-21 20:39             ` Thomas Langås
2002-03-11  6:07         ` Harald Welte

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox