[fcoe] Create Fibre Channel port only when we have selected an FCF
Create the Fibre Channel port only when the FCoE port has selected a Fibre Channel Forwarder to use. This avoids the confusion of having an FC port created for the network device on which only VLAN discovery is performed. Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
parent
1790f56fb2
commit
d17e87da7d
|
@ -180,6 +180,9 @@ static struct fcoe_port * fcoe_demux ( struct net_device *netdev ) {
|
||||||
*/
|
*/
|
||||||
static void fcoe_reset ( struct fcoe_port *fcoe ) {
|
static void fcoe_reset ( struct fcoe_port *fcoe ) {
|
||||||
|
|
||||||
|
/* Detach FC port, if any */
|
||||||
|
intf_restart ( &fcoe->transport, -ECANCELED );
|
||||||
|
|
||||||
/* Reset any FIP state */
|
/* Reset any FIP state */
|
||||||
stop_timer ( &fcoe->timer );
|
stop_timer ( &fcoe->timer );
|
||||||
fcoe->timeouts = 0;
|
fcoe->timeouts = 0;
|
||||||
|
@ -995,6 +998,7 @@ static int fcoe_fip_rx ( struct io_buffer *iobuf,
|
||||||
static void fcoe_expired ( struct retry_timer *timer, int over __unused ) {
|
static void fcoe_expired ( struct retry_timer *timer, int over __unused ) {
|
||||||
struct fcoe_port *fcoe =
|
struct fcoe_port *fcoe =
|
||||||
container_of ( timer, struct fcoe_port, timer );
|
container_of ( timer, struct fcoe_port, timer );
|
||||||
|
int rc;
|
||||||
|
|
||||||
/* Sanity check */
|
/* Sanity check */
|
||||||
assert ( fcoe->flags & FCOE_HAVE_NETWORK );
|
assert ( fcoe->flags & FCOE_HAVE_NETWORK );
|
||||||
|
@ -1043,14 +1047,23 @@ static void fcoe_expired ( struct retry_timer *timer, int over __unused ) {
|
||||||
* and we have not yet timed out and given up on
|
* and we have not yet timed out and given up on
|
||||||
* finding one, then send a FIP solicitation and wait.
|
* finding one, then send a FIP solicitation and wait.
|
||||||
*/
|
*/
|
||||||
|
start_timer_fixed ( &fcoe->timer, FCOE_FIP_RETRY_DELAY );
|
||||||
if ( ( ! ( fcoe->flags & FCOE_HAVE_FIP_FCF ) ) &&
|
if ( ( ! ( fcoe->flags & FCOE_HAVE_FIP_FCF ) ) &&
|
||||||
( fcoe->timeouts <= FCOE_MAX_FIP_SOLICITATIONS ) ) {
|
( fcoe->timeouts <= FCOE_MAX_FIP_SOLICITATIONS ) ) {
|
||||||
start_timer_fixed ( &fcoe->timer,
|
|
||||||
FCOE_FIP_RETRY_DELAY );
|
|
||||||
fcoe_fip_tx_solicitation ( fcoe );
|
fcoe_fip_tx_solicitation ( fcoe );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Attach Fibre Channel port */
|
||||||
|
if ( ( rc = fc_port_open ( &fcoe->transport, &fcoe->node_wwn.fc,
|
||||||
|
&fcoe->port_wwn.fc ) ) != 0 ) {
|
||||||
|
DBGC ( fcoe, "FCoE %s could not create FC port: %s\n",
|
||||||
|
fcoe->netdev->name, strerror ( rc ) );
|
||||||
|
/* We will try again on the next timer expiry */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
stop_timer ( &fcoe->timer );
|
||||||
|
|
||||||
/* Either we have found a FIP-capable forwarder, or we
|
/* Either we have found a FIP-capable forwarder, or we
|
||||||
* have timed out and will fall back to pre-FIP mode.
|
* have timed out and will fall back to pre-FIP mode.
|
||||||
*/
|
*/
|
||||||
|
@ -1125,16 +1138,10 @@ static int fcoe_probe ( struct net_device *netdev ) {
|
||||||
fc_ntoa ( &fcoe->node_wwn.fc ) );
|
fc_ntoa ( &fcoe->node_wwn.fc ) );
|
||||||
DBGC ( fcoe, " port %s\n", fc_ntoa ( &fcoe->port_wwn.fc ) );
|
DBGC ( fcoe, " port %s\n", fc_ntoa ( &fcoe->port_wwn.fc ) );
|
||||||
|
|
||||||
/* Attach Fibre Channel port */
|
|
||||||
if ( ( rc = fc_port_open ( &fcoe->transport, &fcoe->node_wwn.fc,
|
|
||||||
&fcoe->port_wwn.fc ) ) != 0 )
|
|
||||||
goto err_fc_create;
|
|
||||||
|
|
||||||
/* Transfer reference to port list */
|
/* Transfer reference to port list */
|
||||||
list_add ( &fcoe->list, &fcoe_ports );
|
list_add ( &fcoe->list, &fcoe_ports );
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_fc_create:
|
|
||||||
netdev_put ( fcoe->netdev );
|
netdev_put ( fcoe->netdev );
|
||||||
err_zalloc:
|
err_zalloc:
|
||||||
err_non_ethernet:
|
err_non_ethernet:
|
||||||
|
@ -1156,9 +1163,13 @@ static void fcoe_notify ( struct net_device *netdev ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reset the FCoE link */
|
/* Reset the FCoE link if necessary */
|
||||||
|
if ( ! ( netdev_is_open ( netdev ) &&
|
||||||
|
netdev_link_ok ( netdev ) &&
|
||||||
|
( fcoe->flags & FCOE_HAVE_NETWORK ) ) ) {
|
||||||
fcoe_reset ( fcoe );
|
fcoe_reset ( fcoe );
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destroy FCoE port
|
* Destroy FCoE port
|
||||||
|
|
Reference in New Issue