summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/drivers/net/efi/snpnet.c48
1 files changed, 37 insertions, 11 deletions
diff --git a/src/drivers/net/efi/snpnet.c b/src/drivers/net/efi/snpnet.c
index 79b4946c4..0348e7d1a 100644
--- a/src/drivers/net/efi/snpnet.c
+++ b/src/drivers/net/efi/snpnet.c
@@ -284,6 +284,42 @@ static void snpnet_poll ( struct net_device *netdev ) {
}
/**
+ * Set receive filters
+ *
+ * @v netdev Network device
+ * @ret rc Return status code
+ */
+static int snpnet_rx_filters ( struct net_device *netdev ) {
+ struct snp_nic *snp = netdev->priv;
+ UINT32 filters[] = {
+ snp->snp->Mode->ReceiveFilterMask,
+ ( EFI_SIMPLE_NETWORK_RECEIVE_UNICAST |
+ EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST |
+ EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST ),
+ ( EFI_SIMPLE_NETWORK_RECEIVE_UNICAST |
+ EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST ),
+ ( EFI_SIMPLE_NETWORK_RECEIVE_UNICAST ),
+ };
+ unsigned int i;
+ EFI_STATUS efirc;
+ int rc;
+
+ /* Try possible receive filters in turn */
+ for ( i = 0; i < ( sizeof ( filters ) / sizeof ( filters[0] ) ); i++ ) {
+ efirc = snp->snp->ReceiveFilters ( snp->snp, filters[i],
+ 0, TRUE, 0, NULL );
+ if ( efirc == 0 )
+ return 0;
+ rc = -EEFI ( efirc );
+ DBGC ( snp, "SNP %s could not set receive filters %#02x (have "
+ "%#02x): %s\n", netdev->name, filters[i],
+ snp->snp->Mode->ReceiveFilterSetting, strerror ( rc ) );
+ }
+
+ return rc;
+}
+
+/**
* Open network device
*
* @v netdev Network device
@@ -292,7 +328,6 @@ static void snpnet_poll ( struct net_device *netdev ) {
static int snpnet_open ( struct net_device *netdev ) {
struct snp_nic *snp = netdev->priv;
EFI_MAC_ADDRESS *mac = ( ( void * ) netdev->ll_addr );
- UINT32 filters;
EFI_STATUS efirc;
int rc;
@@ -322,16 +357,7 @@ static int snpnet_open ( struct net_device *netdev ) {
}
/* Set receive filters */
- filters = ( EFI_SIMPLE_NETWORK_RECEIVE_UNICAST |
- EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST |
- EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST |
- EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS |
- EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST );
- if ( ( efirc = snp->snp->ReceiveFilters ( snp->snp, filters, 0, TRUE,
- 0, NULL ) ) != 0 ) {
- rc = -EEFI ( efirc );
- DBGC ( snp, "SNP %s could not set receive filters: %s\n",
- netdev->name, strerror ( rc ) );
+ if ( ( rc = snpnet_rx_filters ( netdev ) ) != 0 ) {
/* Ignore error */
}