diff options
Diffstat (limited to 'drivers/net/ethernet/qlogic/qlge/qlge_main.c')
| -rw-r--r-- | drivers/net/ethernet/qlogic/qlge/qlge_main.c | 48 | 
1 files changed, 30 insertions, 18 deletions
diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_main.c b/drivers/net/ethernet/qlogic/qlge/qlge_main.c index c92afcd912e..b5489873728 100644 --- a/drivers/net/ethernet/qlogic/qlge/qlge_main.c +++ b/drivers/net/ethernet/qlogic/qlge/qlge_main.c @@ -2307,7 +2307,7 @@ static int ql_napi_poll_msix(struct napi_struct *napi, int budget)  	return work_done;  } -static void qlge_vlan_mode(struct net_device *ndev, u32 features) +static void qlge_vlan_mode(struct net_device *ndev, netdev_features_t features)  {  	struct ql_adapter *qdev = netdev_priv(ndev); @@ -2323,7 +2323,8 @@ static void qlge_vlan_mode(struct net_device *ndev, u32 features)  	}  } -static u32 qlge_fix_features(struct net_device *ndev, u32 features) +static netdev_features_t qlge_fix_features(struct net_device *ndev, +	netdev_features_t features)  {  	/*  	 * Since there is no support for separate rx/tx vlan accel @@ -2337,9 +2338,10 @@ static u32 qlge_fix_features(struct net_device *ndev, u32 features)  	return features;  } -static int qlge_set_features(struct net_device *ndev, u32 features) +static int qlge_set_features(struct net_device *ndev, +	netdev_features_t features)  { -	u32 changed = ndev->features ^ features; +	netdev_features_t changed = ndev->features ^ features;  	if (changed & NETIF_F_HW_VLAN_RX)  		qlge_vlan_mode(ndev, features); @@ -2347,56 +2349,66 @@ static int qlge_set_features(struct net_device *ndev, u32 features)  	return 0;  } -static void __qlge_vlan_rx_add_vid(struct ql_adapter *qdev, u16 vid) +static int __qlge_vlan_rx_add_vid(struct ql_adapter *qdev, u16 vid)  {  	u32 enable_bit = MAC_ADDR_E; +	int err; -	if (ql_set_mac_addr_reg -	    (qdev, (u8 *) &enable_bit, MAC_ADDR_TYPE_VLAN, vid)) { +	err = ql_set_mac_addr_reg(qdev, (u8 *) &enable_bit, +				  MAC_ADDR_TYPE_VLAN, vid); +	if (err)  		netif_err(qdev, ifup, qdev->ndev,  			  "Failed to init vlan address.\n"); -	} +	return err;  } -static void qlge_vlan_rx_add_vid(struct net_device *ndev, u16 vid) +static int qlge_vlan_rx_add_vid(struct net_device *ndev, u16 vid)  {  	struct ql_adapter *qdev = netdev_priv(ndev);  	int status; +	int err;  	status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK);  	if (status) -		return; +		return status; -	__qlge_vlan_rx_add_vid(qdev, vid); +	err = __qlge_vlan_rx_add_vid(qdev, vid);  	set_bit(vid, qdev->active_vlans);  	ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK); + +	return err;  } -static void __qlge_vlan_rx_kill_vid(struct ql_adapter *qdev, u16 vid) +static int __qlge_vlan_rx_kill_vid(struct ql_adapter *qdev, u16 vid)  {  	u32 enable_bit = 0; +	int err; -	if (ql_set_mac_addr_reg -	    (qdev, (u8 *) &enable_bit, MAC_ADDR_TYPE_VLAN, vid)) { +	err = ql_set_mac_addr_reg(qdev, (u8 *) &enable_bit, +				  MAC_ADDR_TYPE_VLAN, vid); +	if (err)  		netif_err(qdev, ifup, qdev->ndev,  			  "Failed to clear vlan address.\n"); -	} +	return err;  } -static void qlge_vlan_rx_kill_vid(struct net_device *ndev, u16 vid) +static int qlge_vlan_rx_kill_vid(struct net_device *ndev, u16 vid)  {  	struct ql_adapter *qdev = netdev_priv(ndev);  	int status; +	int err;  	status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK);  	if (status) -		return; +		return status; -	__qlge_vlan_rx_kill_vid(qdev, vid); +	err = __qlge_vlan_rx_kill_vid(qdev, vid);  	clear_bit(vid, qdev->active_vlans);  	ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK); + +	return err;  }  static void qlge_restore_vlan(struct ql_adapter *qdev)  |