[vortex] 3c905 oddities 2

Bogdan Costescu Bogdan.Costescu@IWR.Uni-Heidelberg.De
Wed, 13 Dec 2000 13:48:36 +0100 (CET)


On Tue, 12 Dec 2000, Donald Becker wrote:

> > 1) will a timeout of 4000000 as suggested in previous emails cause a
> > performance hit? (ie should I try and optimize)
>
> No, it's in the initialization and error recovery path.  So it's a one-time
> pause when the interface is started.

If this is needed only for the RxReset command, the above statement is
true. Don, do you have any info to support it ? (other than the
observation of the 3 CX cards that appeared on this list).
In a previous message, Andrew expressed the "fear" that other commands
might need longer cycles too.

> The change can cause major problems with other kernel systems, such as disk
> controllers and the clock.  The old Xircom PCMCIA driver had code like this,
> and the clock lost three seconds each time the interface was started.  You
> sometimes see the same effect with Windows device drivers.

Is this because the CPU is kept busy or because the PCI bus is kept busy
too (or both) ? Would it make sense to use another method of waiting
(instead of the tight 'in' loop) for the commands known to take long time?

> The second related problem is with detecting MII transceivers.
> There are two changes that might make a difference.  The first is adding an
> extra preamble, ...

Why ?

Would you care to answer my MDIO related questions from my "MII
transceivers" message from 26th of Nov ?

> ... the second is changing the scan order to check for the usual
> address of 24 first, and never check for an external phy:

OK, I take this as a late reply to my 2 weeks old question, but...

> -	for (phy = 1; phy <= 32 && phy_idx < sizeof(vp->phys); phy++) {
> -		int mii_status, phyx = phy & 0x1f;
> +	for (phy = 0; phy < 32 && phy_idx < 1; phy++) {
> +		int mii_status, phyx = (phy == 0 ? 24 : phy == 24 );
							why -^^^^
... I don't understand your code. Should it be

 +		int mii_status, phyx = (phy == 0 ? 24 : phy);

Anyway, you are not getting a phyx = 0 case, while in a previous message
you said that external transceivers at PHYAD 0 should be tested last,
which was how the old code was working. Is this not true anymore ?
And the last one 8-): you are now bailing out at the first transceiver
found (phy_idx < 1); is this intentional ? If so, why ?

Hoping to get some answers this time,

Bogdan Costescu

IWR - Interdisziplinaeres Zentrum fuer Wissenschaftliches Rechnen
Universitaet Heidelberg, INF 368, D-69120 Heidelberg, GERMANY
Telephone: +49 6221 54 8869, Telefax: +49 6221 54 8868
E-mail: Bogdan.Costescu@IWR.Uni-Heidelberg.De