diff options
Diffstat (limited to 'drivers/net/atl1c/atl1c_main.c')
| -rw-r--r-- | drivers/net/atl1c/atl1c_main.c | 41 | 
1 files changed, 21 insertions, 20 deletions
diff --git a/drivers/net/atl1c/atl1c_main.c b/drivers/net/atl1c/atl1c_main.c index 7d9d5067a65..1269ba5d6e5 100644 --- a/drivers/net/atl1c/atl1c_main.c +++ b/drivers/net/atl1c/atl1c_main.c @@ -325,7 +325,7 @@ static void atl1c_link_chg_event(struct atl1c_adapter *adapter)  		}  	} -	adapter->work_event |= ATL1C_WORK_EVENT_LINK_CHANGE; +	set_bit(ATL1C_WORK_EVENT_LINK_CHANGE, &adapter->work_event);  	schedule_work(&adapter->common_task);  } @@ -337,20 +337,16 @@ static void atl1c_common_task(struct work_struct *work)  	adapter = container_of(work, struct atl1c_adapter, common_task);  	netdev = adapter->netdev; -	if (adapter->work_event & ATL1C_WORK_EVENT_RESET) { -		adapter->work_event &= ~ATL1C_WORK_EVENT_RESET; +	if (test_and_clear_bit(ATL1C_WORK_EVENT_RESET, &adapter->work_event)) {  		netif_device_detach(netdev);  		atl1c_down(adapter);  		atl1c_up(adapter);  		netif_device_attach(netdev); -		return;  	} -	if (adapter->work_event & ATL1C_WORK_EVENT_LINK_CHANGE) { -		adapter->work_event &= ~ATL1C_WORK_EVENT_LINK_CHANGE; +	if (test_and_clear_bit(ATL1C_WORK_EVENT_LINK_CHANGE, +		&adapter->work_event))  		atl1c_check_link_status(adapter); -	} -	return;  } @@ -369,7 +365,7 @@ static void atl1c_tx_timeout(struct net_device *netdev)  	struct atl1c_adapter *adapter = netdev_priv(netdev);  	/* Do the reset outside of interrupt context */ -	adapter->work_event |= ATL1C_WORK_EVENT_RESET; +	set_bit(ATL1C_WORK_EVENT_RESET, &adapter->work_event);  	schedule_work(&adapter->common_task);  } @@ -484,6 +480,15 @@ static void atl1c_set_rxbufsize(struct atl1c_adapter *adapter,  	adapter->rx_buffer_len = mtu > AT_RX_BUF_SIZE ?  		roundup(mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN, 8) : AT_RX_BUF_SIZE;  } + +static u32 atl1c_fix_features(struct net_device *netdev, u32 features) +{ +	if (netdev->mtu > MAX_TSO_FRAME_SIZE) +		features &= ~(NETIF_F_TSO | NETIF_F_TSO6); + +	return features; +} +  /*   * atl1c_change_mtu - Change the Maximum Transfer Unit   * @netdev: network interface device structure @@ -510,14 +515,8 @@ static int atl1c_change_mtu(struct net_device *netdev, int new_mtu)  		netdev->mtu = new_mtu;  		adapter->hw.max_frame_size = new_mtu;  		atl1c_set_rxbufsize(adapter, netdev); -		if (new_mtu > MAX_TSO_FRAME_SIZE) { -			adapter->netdev->features &= ~NETIF_F_TSO; -			adapter->netdev->features &= ~NETIF_F_TSO6; -		} else { -			adapter->netdev->features |= NETIF_F_TSO; -			adapter->netdev->features |= NETIF_F_TSO6; -		}  		atl1c_down(adapter); +		netdev_update_features(netdev);  		atl1c_up(adapter);  		clear_bit(__AT_RESETTING, &adapter->flags);  		if (adapter->hw.ctrl_flags & ATL1C_FPGA_VERSION) { @@ -1092,10 +1091,8 @@ static void atl1c_configure_tx(struct atl1c_adapter *adapter)  	u32 max_pay_load;  	u16 tx_offload_thresh;  	u32 txq_ctrl_data; -	u32 extra_size = 0;     /* Jumbo frame threshold in QWORD unit */  	u32 max_pay_load_data; -	extra_size = ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN;  	tx_offload_thresh = MAX_TX_OFFLOAD_THRESH;  	AT_WRITE_REG(hw, REG_TX_TSO_OFFLOAD_THRESH,  		(tx_offload_thresh >> 3) & TX_TSO_OFFLOAD_THRESH_MASK); @@ -2540,6 +2537,7 @@ static int atl1c_suspend(struct device *dev)  	return 0;  } +#ifdef CONFIG_PM_SLEEP  static int atl1c_resume(struct device *dev)  {  	struct pci_dev *pdev = to_pci_dev(dev); @@ -2566,6 +2564,7 @@ static int atl1c_resume(struct device *dev)  	return 0;  } +#endif  static void atl1c_shutdown(struct pci_dev *pdev)  { @@ -2585,6 +2584,7 @@ static const struct net_device_ops atl1c_netdev_ops = {  	.ndo_set_mac_address 	= atl1c_set_mac_addr,  	.ndo_set_multicast_list = atl1c_set_multi,  	.ndo_change_mtu		= atl1c_change_mtu, +	.ndo_fix_features	= atl1c_fix_features,  	.ndo_do_ioctl		= atl1c_ioctl,  	.ndo_tx_timeout		= atl1c_tx_timeout,  	.ndo_get_stats		= atl1c_get_stats, @@ -2605,12 +2605,13 @@ static int atl1c_init_netdev(struct net_device *netdev, struct pci_dev *pdev)  	atl1c_set_ethtool_ops(netdev);  	/* TODO: add when ready */ -	netdev->features =	NETIF_F_SG	   | +	netdev->hw_features =	NETIF_F_SG	   |  				NETIF_F_HW_CSUM	   |  				NETIF_F_HW_VLAN_TX | -				NETIF_F_HW_VLAN_RX |  				NETIF_F_TSO	   |  				NETIF_F_TSO6; +	netdev->features =	netdev->hw_features | +				NETIF_F_HW_VLAN_RX;  	return 0;  }  |