OK. I see what you mean. In fact, I am working on an old RHEL based kernel and it still reports the link via ethtool_op_get_link. That is why I got the inconsistent report from the ethtool as I described in the patch. (the ethtool showed the link is up, but speed is unknown, duplex is half).
I guess I can just port in the patch for bnx2_get_link() to solve this problem.
Also, I have another comment related to link state.
Right now, the bnx2 driver powers up the device in bnx2_init_board(), regardless the netif_carrier is on or off. This may introduce following inconsistent behaviors:
1) suppose the cable is plugged in to the NIC and the other end is connected to a switch
2) user powers up the box
3) the Linux does not bring up the interface; i.e, ifconfig ethx shows it is down
4) ethtool ethx will show no link
5) if the user goes to check the light on the physical NIC, he will see the green link light is ON. That means the link is up, right?
I think it is better to power down the device until bnx2_open is called. In this way, ethtool report and the physical link light will be consistent.
Any suggestions? Thanks.
Regards,
Jiang
-----Original Message-----
From: Michael Chan [mailto:<redacted>]
Sent: Thursday, August 16, 2012 12:29 PM
To: Jiang Wang
Cc: <redacted>; <redacted>; Chaitanya Lala; Francis St. Amant
Subject: RE: [PATCH] bnx2: turn off the network statck during initialization
On Thu, 2012-08-16 at 19:15 +0000, Jiang Wang wrote:
Hi Michael,
I just checked the code for netif_carrier_off(), and it will return if
the dev is not initialized (registered) as follows:
void netif_carrier_off(struct net_device *dev) {
if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state)) {
if (dev->reg_state == NETREG_UNINITIALIZED)
return;
linkwatch_fire_event(dev);
}
}
So linkwatch_fire_event should not fire in this case, right? Thanks
for the quick response.
Yes, you're right. Your patch should not cause any problem then.
But I still don't understand what problem you're trying to solve. The link status from ethtool is determined by bnx2_get_link() and it should always return link down before bnx2_open() is called. Can you please elborate? Thanks.
Regards,
Jiang
-------------------------------------
Jiang Wang
Member of Technical Staff
Riverbed Technology
Tel: (408) 522-5109
Email: Jiang.Wang@riverbed.com
www.riverbed.com
-----Original Message-----
From: Michael Chan [mailto:<redacted>]
Sent: Thursday, August 16, 2012 11:57 AM
To: Jiang Wang
Cc: <redacted>; <redacted>; Chaitanya
Lala; Francis St. Amant; Jiang Wang
Subject: Re: [PATCH] bnx2: turn off the network statck during
initialization
On Thu, 2012-08-16 at 11:21 -0700, Jiang Wang wrote:
quoted
The initialization state of bnx2 driver is wrong. It does not turn
of the Linux network stack using netif_carrier_off. This may lead to
inconsistent report from ethtool as the link is up but speed is
unknown when the cable is not plugged in.
E.g.
Speed: Unknown! (0)<--------------------------------------
Duplex: Half <--------------------------------------
MDI: Unknown! (0)
Port: Twisted Pair
PHYAD: 1
Transceiver: internal
Auto-negotiation: on
Supports Wake-on: g
Wake-on: d
Link detected: yes <---------------------------------------
36 more quoted lines