e6f44ed6d0
This manages NCSI packages and channels: * The available packages and channels are enumerated in the first time of calling ncsi_start_dev(). The channels' capabilities are probed in the meanwhile. The NCSI network topology won't change until the NCSI device is destroyed. * There in a queue in every NCSI device. The element in the queue, channel, is waiting for configuration (bringup) or suspending (teardown). The channel's state (inactive/active) indicates the futher action (configuration or suspending) will be applied on the channel. Another channel's state (invisible) means the requested action is being applied. * The hardware arbitration will be enabled if all available packages and channels support it. All available channels try to provide service when hardware arbitration is enabled. Otherwise, one channel is selected as the active one at once. * When channel is in active state, meaning it's providing service, a timer started to retrieve the channe's link status. If the channel's link status fails to be updated in the determined period, the channel is going to be reconfigured. It's the error handling implementation as defined in NCSI spec. Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com> Acked-by: Joel Stanley <joel@jms.id.au> Signed-off-by: David S. Miller <davem@davemloft.net>
53 lines
1.4 KiB
C
53 lines
1.4 KiB
C
#ifndef __NET_NCSI_H
|
|
#define __NET_NCSI_H
|
|
|
|
/*
|
|
* The NCSI device states seen from external. More NCSI device states are
|
|
* only visible internally (in net/ncsi/internal.h). When the NCSI device
|
|
* is registered, it's in ncsi_dev_state_registered state. The state
|
|
* ncsi_dev_state_start is used to drive to choose active package and
|
|
* channel. After that, its state is changed to ncsi_dev_state_functional.
|
|
*
|
|
* The state ncsi_dev_state_stop helps to shut down the currently active
|
|
* package and channel while ncsi_dev_state_config helps to reconfigure
|
|
* them.
|
|
*/
|
|
enum {
|
|
ncsi_dev_state_registered = 0x0000,
|
|
ncsi_dev_state_functional = 0x0100,
|
|
ncsi_dev_state_probe = 0x0200,
|
|
ncsi_dev_state_config = 0x0300,
|
|
ncsi_dev_state_suspend = 0x0400,
|
|
};
|
|
|
|
struct ncsi_dev {
|
|
int state;
|
|
int link_up;
|
|
struct net_device *dev;
|
|
void (*handler)(struct ncsi_dev *ndev);
|
|
};
|
|
|
|
#ifdef CONFIG_NET_NCSI
|
|
struct ncsi_dev *ncsi_register_dev(struct net_device *dev,
|
|
void (*notifier)(struct ncsi_dev *nd));
|
|
int ncsi_start_dev(struct ncsi_dev *nd);
|
|
void ncsi_unregister_dev(struct ncsi_dev *nd);
|
|
#else /* !CONFIG_NET_NCSI */
|
|
static inline struct ncsi_dev *ncsi_register_dev(struct net_device *dev,
|
|
void (*notifier)(struct ncsi_dev *nd))
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline int ncsi_start_dev(struct ncsi_dev *nd)
|
|
{
|
|
return -ENOTTY;
|
|
}
|
|
|
|
static inline void ncsi_unregister_dev(struct ncsi_dev *nd)
|
|
{
|
|
}
|
|
#endif /* CONFIG_NET_NCSI */
|
|
|
|
#endif /* __NET_NCSI_H */
|