[SCSI] fcoe: move link speed checking into its own routine
It doesn't make sense to update the link speed in the is_link_ok() routine. Move it to it's own routine and acquire the device speed when we're configuring the device initially as well as if there are any netdev events received. Signed-off-by: Robert Love <robert.w.love@intel.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
parent
d29510a296
commit
5e4f8fe7b5
1 changed files with 29 additions and 13 deletions
|
@ -74,6 +74,7 @@ static int fcoe_rcv(struct sk_buff *, struct net_device *,
|
||||||
static int fcoe_percpu_receive_thread(void *);
|
static int fcoe_percpu_receive_thread(void *);
|
||||||
static void fcoe_clean_pending_queue(struct fc_lport *);
|
static void fcoe_clean_pending_queue(struct fc_lport *);
|
||||||
static void fcoe_percpu_clean(struct fc_lport *);
|
static void fcoe_percpu_clean(struct fc_lport *);
|
||||||
|
static int fcoe_link_speed_update(struct fc_lport *);
|
||||||
static int fcoe_link_ok(struct fc_lport *);
|
static int fcoe_link_ok(struct fc_lport *);
|
||||||
|
|
||||||
static struct fc_lport *fcoe_hostlist_lookup(const struct net_device *);
|
static struct fc_lport *fcoe_hostlist_lookup(const struct net_device *);
|
||||||
|
@ -631,6 +632,8 @@ static int fcoe_netdev_config(struct fc_lport *lport, struct net_device *netdev)
|
||||||
port->fcoe_pending_queue_active = 0;
|
port->fcoe_pending_queue_active = 0;
|
||||||
setup_timer(&port->timer, fcoe_queue_timer, (unsigned long)lport);
|
setup_timer(&port->timer, fcoe_queue_timer, (unsigned long)lport);
|
||||||
|
|
||||||
|
fcoe_link_speed_update(lport);
|
||||||
|
|
||||||
if (!lport->vport) {
|
if (!lport->vport) {
|
||||||
/*
|
/*
|
||||||
* Use NAA 1&2 (FC-FS Rev. 2.0, Sec. 15) to generate WWNN/WWPN:
|
* Use NAA 1&2 (FC-FS Rev. 2.0, Sec. 15) to generate WWNN/WWPN:
|
||||||
|
@ -1829,6 +1832,9 @@ static int fcoe_device_notification(struct notifier_block *notifier,
|
||||||
FCOE_NETDEV_DBG(netdev, "Unknown event %ld "
|
FCOE_NETDEV_DBG(netdev, "Unknown event %ld "
|
||||||
"from netdev netlink\n", event);
|
"from netdev netlink\n", event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fcoe_link_speed_update(lport);
|
||||||
|
|
||||||
if (link_possible && !fcoe_link_ok(lport))
|
if (link_possible && !fcoe_link_ok(lport))
|
||||||
fcoe_ctlr_link_up(&fcoe->ctlr);
|
fcoe_ctlr_link_up(&fcoe->ctlr);
|
||||||
else if (fcoe_ctlr_link_down(&fcoe->ctlr)) {
|
else if (fcoe_ctlr_link_down(&fcoe->ctlr)) {
|
||||||
|
@ -2128,26 +2134,19 @@ out_nomod:
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fcoe_link_ok() - Check if the link is OK for a local port
|
* fcoe_link_speed_update() - Update the supported and actual link speeds
|
||||||
* @lport: The local port to check link on
|
* @lport: The local port to update speeds for
|
||||||
*
|
|
||||||
* Any permanently-disqualifying conditions have been previously checked.
|
|
||||||
* This also updates the speed setting, which may change with link for 100/1000.
|
|
||||||
*
|
|
||||||
* This function should probably be checking for PAUSE support at some point
|
|
||||||
* in the future. Currently Per-priority-pause is not determinable using
|
|
||||||
* ethtool, so we shouldn't be restrictive until that problem is resolved.
|
|
||||||
*
|
|
||||||
* Returns: 0 if link is OK for use by FCoE.
|
|
||||||
*
|
*
|
||||||
|
* Returns: 0 if the ethtool query was successful
|
||||||
|
* -1 if the ethtool query failed
|
||||||
*/
|
*/
|
||||||
int fcoe_link_ok(struct fc_lport *lport)
|
int fcoe_link_speed_update(struct fc_lport *lport)
|
||||||
{
|
{
|
||||||
struct fcoe_port *port = lport_priv(lport);
|
struct fcoe_port *port = lport_priv(lport);
|
||||||
struct net_device *netdev = port->fcoe->netdev;
|
struct net_device *netdev = port->fcoe->netdev;
|
||||||
struct ethtool_cmd ecmd = { ETHTOOL_GSET };
|
struct ethtool_cmd ecmd = { ETHTOOL_GSET };
|
||||||
|
|
||||||
if (netif_oper_up(netdev) && !dev_ethtool_get_settings(netdev, &ecmd)) {
|
if (!dev_ethtool_get_settings(netdev, &ecmd)) {
|
||||||
lport->link_supported_speeds &=
|
lport->link_supported_speeds &=
|
||||||
~(FC_PORTSPEED_1GBIT | FC_PORTSPEED_10GBIT);
|
~(FC_PORTSPEED_1GBIT | FC_PORTSPEED_10GBIT);
|
||||||
if (ecmd.supported & (SUPPORTED_1000baseT_Half |
|
if (ecmd.supported & (SUPPORTED_1000baseT_Half |
|
||||||
|
@ -2166,6 +2165,23 @@ int fcoe_link_ok(struct fc_lport *lport)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fcoe_link_ok() - Check if the link is OK for a local port
|
||||||
|
* @lport: The local port to check link on
|
||||||
|
*
|
||||||
|
* Returns: 0 if link is UP and OK, -1 if not
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int fcoe_link_ok(struct fc_lport *lport)
|
||||||
|
{
|
||||||
|
struct fcoe_port *port = lport_priv(lport);
|
||||||
|
struct net_device *netdev = port->fcoe->netdev;
|
||||||
|
|
||||||
|
if (netif_oper_up(netdev))
|
||||||
|
return 0;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fcoe_percpu_clean() - Clear all pending skbs for an local port
|
* fcoe_percpu_clean() - Clear all pending skbs for an local port
|
||||||
* @lport: The local port whose skbs are to be cleared
|
* @lport: The local port whose skbs are to be cleared
|
||||||
|
|
Loading…
Add table
Reference in a new issue