net/ncsi: Fix stale link state of inactive channels on failover
authorGavin Shan <gwshan@linux.vnet.ibm.com>
Thu, 20 Oct 2016 00:45:50 +0000 (11:45 +1100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 20 Oct 2016 15:23:07 +0000 (11:23 -0400)
commit008a424a24a904ed12c03b203f6f257bcaf12358
tree6529367d9a4a204f17373b606622ae798d0402fc
parent7ba5c003db59a6f738d87d92b68d4a91cdf22f60
net/ncsi: Fix stale link state of inactive channels on failover

The issue was found on BCM5718 which has two NCSI channels in one
package: C0 and C1. Both of them are connected to different LANs,
means they are in link-up state and C0 is chosen as the active one
until resetting BCM5718 happens as below.

Resetting BCM5718 results in LSC (Link State Change) AEN packet
received on C0, meaning LSC AEN is missed on C1. When LSC AEN packet
received on C0 to report link-down, it fails over to C1 because C1
is in link-up state as software can see. However, C1 is in link-down
state in hardware. It means the link state is out of synchronization
between hardware and software, resulting in inappropriate channel (C1)
selected as active one.

This resolves the issue by sending separate GLS (Get Link Status)
commands to all channels in the package before trying to do failover.
The last link states of all channels in the package are retrieved.
With it, C0 (not C1) is selected as active one as expected.

Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ncsi/internal.h
net/ncsi/ncsi-manage.c