/** List of SNP devices */
static LIST_HEAD ( efi_snp_devices );
+/** Network devices are currently claimed for use by iPXE */
+static int efi_snp_claimed;
+
/**
* Set EFI SNP mode state
*
} else if ( ! netdev_is_open ( netdev ) ) {
/* Network device not opened; report as Started */
mode->State = EfiSimpleNetworkStarted;
- } else if ( ! netdev_rx_frozen ( netdev ) ) {
+ } else if ( efi_snp_claimed ) {
/* Network device opened but claimed for use by iPXE; report
* as Started to inhibit receive polling.
*/
DBGC2 ( snpdev, "SNPDEV %p START\n", snpdev );
/* Fail if net device is currently claimed for use by iPXE */
- if ( ! netdev_rx_frozen ( snpdev->netdev ) )
+ if ( efi_snp_claimed )
return EFI_NOT_READY;
snpdev->started = 1;
DBGC2 ( snpdev, "SNPDEV %p STOP\n", snpdev );
/* Fail if net device is currently claimed for use by iPXE */
- if ( ! netdev_rx_frozen ( snpdev->netdev ) )
+ if ( efi_snp_claimed )
return EFI_NOT_READY;
snpdev->started = 0;
( ( unsigned long ) extra_tx_bufsize ) );
/* Fail if net device is currently claimed for use by iPXE */
- if ( ! netdev_rx_frozen ( snpdev->netdev ) )
+ if ( efi_snp_claimed )
return EFI_NOT_READY;
if ( ( rc = netdev_open ( snpdev->netdev ) ) != 0 ) {
snpdev, ( ext_verify ? "with" : "without" ) );
/* Fail if net device is currently claimed for use by iPXE */
- if ( ! netdev_rx_frozen ( snpdev->netdev ) )
+ if ( efi_snp_claimed )
return EFI_NOT_READY;
netdev_close ( snpdev->netdev );
DBGC2 ( snpdev, "SNPDEV %p SHUTDOWN\n", snpdev );
/* Fail if net device is currently claimed for use by iPXE */
- if ( ! netdev_rx_frozen ( snpdev->netdev ) )
+ if ( efi_snp_claimed )
return EFI_NOT_READY;
netdev_close ( snpdev->netdev );
}
/* Fail if net device is currently claimed for use by iPXE */
- if ( ! netdev_rx_frozen ( snpdev->netdev ) )
+ if ( efi_snp_claimed )
return EFI_NOT_READY;
/* Lie through our teeth, otherwise MNP refuses to accept us */
( reset ? "reset" : ll_protocol->ntoa ( new ) ) );
/* Fail if net device is currently claimed for use by iPXE */
- if ( ! netdev_rx_frozen ( snpdev->netdev ) )
+ if ( efi_snp_claimed )
return EFI_NOT_READY;
/* Set the MAC address */
( reset ? " reset" : "" ) );
/* Fail if net device is currently claimed for use by iPXE */
- if ( ! netdev_rx_frozen ( snpdev->netdev ) )
+ if ( efi_snp_claimed )
return EFI_NOT_READY;
/* Gather statistics */
DBGC2 ( snpdev, "SNPDEV %p MCAST_IP_TO_MAC %s\n", snpdev, ip_str );
/* Fail if net device is currently claimed for use by iPXE */
- if ( ! netdev_rx_frozen ( snpdev->netdev ) )
+ if ( efi_snp_claimed )
return EFI_NOT_READY;
/* Try to hash the address */
DBGC2_HDA ( snpdev, offset, data, len );
/* Fail if net device is currently claimed for use by iPXE */
- if ( ! netdev_rx_frozen ( snpdev->netdev ) )
+ if ( efi_snp_claimed )
return EFI_NOT_READY;
return EFI_UNSUPPORTED;
DBGC2 ( snpdev, "SNPDEV %p GET_STATUS", snpdev );
/* Fail if net device is currently claimed for use by iPXE */
- if ( ! netdev_rx_frozen ( snpdev->netdev ) )
+ if ( efi_snp_claimed )
return EFI_NOT_READY;
/* Poll the network device */
DBGC2 ( snpdev, "\n" );
/* Fail if net device is currently claimed for use by iPXE */
- if ( ! netdev_rx_frozen ( snpdev->netdev ) )
+ if ( efi_snp_claimed )
return EFI_NOT_READY;
/* Sanity checks */
( ( unsigned long ) *len ) );
/* Fail if net device is currently claimed for use by iPXE */
- if ( ! netdev_rx_frozen ( snpdev->netdev ) )
+ if ( efi_snp_claimed )
return EFI_NOT_READY;
/* Poll the network device */
return;
/* Do nothing if net device is currently claimed for use by iPXE */
- if ( ! netdev_rx_frozen ( snpdev->netdev ) )
+ if ( efi_snp_claimed )
return;
/* Poll the network device */
}
/**
- * Claim network devices for use by iPXE
+ * Set SNP claimed/released state
*
+ * @v claimed Network devices are claimed for use by iPXE
*/
-void efi_snp_claim ( void ) {
- struct net_device *netdev;
-
- for_each_netdev ( netdev )
- netdev_rx_unfreeze ( netdev );
-}
+void efi_snp_set_claimed ( int claimed ) {
+ struct efi_snp_device *snpdev;
-/**
- * Release network devices for use via SNP
- *
- */
-void efi_snp_release ( void ) {
- struct net_device *netdev;
+ /* Claim SNP devices */
+ efi_snp_claimed = claimed;
- for_each_netdev ( netdev )
- netdev_rx_freeze ( netdev );
+ /* Update SNP mode state for each interface */
+ list_for_each_entry ( snpdev, &efi_snp_devices, list )
+ efi_snp_set_state ( snpdev );
}