Re: tg3 driver not advertising 1000mbit

From: Jean-Louis Dupond
Date: Fri Jun 12 2009 - 09:56:35 EST


Hello,

Today I found the programmers documentation on the Broadcom website and it
mentions the following:

// Write value to MI communication register
Mi_Communication_Register = Value32
// Now read back MI Communication register until the start bit
// has been cleared or we have timed out (>5000 reads)
Loopcount = 5000
While (LoopCount > 0)
Begin
Value32 = Mi_Communication_Register
If (!(Value32 | 0x20000000)) then BREAK loop
Else Loopcount--
End


Here u can see its NOT needed to read the value twice.
Also there is no delay mentioned, so I removed it, and rebooted 20 times
without 1 time on 10mbit !

Sincerely,
Jean-Louis Dupond

On Mon, 08 Jun 2009 19:44:10 +0200, Jean-Louis Dupond <info@xxxxxxxxxxx>
wrote:
> Hello,
>
> I'm experiencing a problem with my "Broadcom Corporation NetXtreme
> BCM5722 Gigabit Ethernet PCI Express" network card in my Dell R300
> servers. When booting the server, the network card sometimes doesn't
> advertise gigabit speeds, and so it auto-negotiates @ 10mbit. The speed
> can then be set to gigabit with mii-tool, but its not a good solution!
> On the other hand, sometimes when it boots, it just works perfectly, and
> advertises gigabit speeds & auto-negotiates on gigabit!
>
> Today I tried to debug the driver a bit, and found some strange behavior
> :) Only 2 values were different in the writephy function when it booted
> @ 10mbit & gigabit.
>
> I found something obvious in the tg3_readphy & tg3_writephy methods.
>
>> 807 while (loops != 0) {
>> 808 udelay(10);
>> 809 frame_val = tr32(MAC_MI_COM);
>> 810 if ((frame_val & MI_COM_BUSY) == 0) {
>> 811 udelay(5);
>> 812 frame_val = tr32(MAC_MI_COM);
>> 813 break;
>> 814 }
>> 815 loops -= 1;
>> 816 }
>
> On line 809 frame_val is filled with a read (tr32) from the device.
> On line 810 we check if its not 'MI_COM_BUSY'
> If not then we have a delay of 5, and then we read it again ?!
> I don't know why the value is read twice! I checked with some other
> drivers (also broadcom) and there the read command was given some other
> argument when reading the BUSY state, and then in the if, it was really
> fetching the data. But in this case, we only have 2 times the same
> argument!
>
> With the original code the server booted into 10mbit the half of the
> boots! When I removed line 811 & 812, then it booted into 10mbit only
> 1/20 times ! Which is way better ! But its still not fully fixed!
>
> Feel free to give any other solutions / comments !
>
> Sincerely,
> Jean-Louis Dupond
> --
> To unsubscribe from this list: send the line "unsubscribe linux-net" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-net" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html