diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igb/igb_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 23 | 
1 files changed, 14 insertions, 9 deletions
| diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index ec62410b035a..fd4a46b03cc8 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c @@ -1791,6 +1791,8 @@ void igb_down(struct igb_adapter *adapter)  	wr32(E1000_RCTL, rctl & ~E1000_RCTL_EN);  	/* flush and sleep below */ +	igb_nfc_filter_exit(adapter); +  	netif_carrier_off(netdev);  	netif_tx_stop_all_queues(netdev); @@ -3317,8 +3319,6 @@ static int __igb_close(struct net_device *netdev, bool suspending)  	igb_down(adapter);  	igb_free_irq(adapter); -	igb_nfc_filter_exit(adapter); -  	igb_free_all_tx_resources(adapter);  	igb_free_all_rx_resources(adapter); @@ -5380,7 +5380,8 @@ netdev_tx_t igb_xmit_frame_ring(struct sk_buff *skb,  	if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) {  		struct igb_adapter *adapter = netdev_priv(tx_ring->netdev); -		if (!test_and_set_bit_lock(__IGB_PTP_TX_IN_PROGRESS, +		if (adapter->tstamp_config.tx_type & HWTSTAMP_TX_ON && +		    !test_and_set_bit_lock(__IGB_PTP_TX_IN_PROGRESS,  					   &adapter->state)) {  			skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;  			tx_flags |= IGB_TX_FLAGS_TSTAMP; @@ -5745,8 +5746,6 @@ static void igb_tsync_interrupt(struct igb_adapter *adapter)  		event.type = PTP_CLOCK_PPS;  		if (adapter->ptp_caps.pps)  			ptp_clock_event(adapter->ptp_clock, &event); -		else -			dev_err(&adapter->pdev->dev, "unexpected SYS WRAP");  		ack |= TSINTR_SYS_WRAP;  	} @@ -6676,32 +6675,33 @@ static void igb_rcv_msg_from_vf(struct igb_adapter *adapter, u32 vf)  	struct vf_data_storage *vf_data = &adapter->vf_data[vf];  	s32 retval; -	retval = igb_read_mbx(hw, msgbuf, E1000_VFMAILBOX_SIZE, vf); +	retval = igb_read_mbx(hw, msgbuf, E1000_VFMAILBOX_SIZE, vf, false);  	if (retval) {  		/* if receive failed revoke VF CTS stats and restart init */  		dev_err(&pdev->dev, "Error receiving message from VF\n");  		vf_data->flags &= ~IGB_VF_FLAG_CTS;  		if (!time_after(jiffies, vf_data->last_nack + (2 * HZ))) -			return; +			goto unlock;  		goto out;  	}  	/* this is a message we already processed, do nothing */  	if (msgbuf[0] & (E1000_VT_MSGTYPE_ACK | E1000_VT_MSGTYPE_NACK)) -		return; +		goto unlock;  	/* until the vf completes a reset it should not be  	 * allowed to start any configuration.  	 */  	if (msgbuf[0] == E1000_VF_RESET) { +		/* unlocks mailbox */  		igb_vf_reset_msg(adapter, vf);  		return;  	}  	if (!(vf_data->flags & IGB_VF_FLAG_CTS)) {  		if (!time_after(jiffies, vf_data->last_nack + (2 * HZ))) -			return; +			goto unlock;  		retval = -1;  		goto out;  	} @@ -6742,7 +6742,12 @@ out:  	else  		msgbuf[0] |= E1000_VT_MSGTYPE_ACK; +	/* unlocks mailbox */  	igb_write_mbx(hw, msgbuf, 1, vf); +	return; + +unlock: +	igb_unlock_mbx(hw, vf);  }  static void igb_msg_task(struct igb_adapter *adapter) |