diff options
Diffstat (limited to 'drivers/net/ethernet/ibm/ibmvnic.c')
-rw-r--r-- | drivers/net/ethernet/ibm/ibmvnic.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c index 3da680073265..fa4bb940665c 100644 --- a/drivers/net/ethernet/ibm/ibmvnic.c +++ b/drivers/net/ethernet/ibm/ibmvnic.c | |||
@@ -1568,6 +1568,8 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev) | |||
1568 | lpar_rc = send_subcrq_indirect(adapter, handle_array[queue_num], | 1568 | lpar_rc = send_subcrq_indirect(adapter, handle_array[queue_num], |
1569 | (u64)tx_buff->indir_dma, | 1569 | (u64)tx_buff->indir_dma, |
1570 | (u64)num_entries); | 1570 | (u64)num_entries); |
1571 | dma_unmap_single(dev, tx_buff->indir_dma, | ||
1572 | sizeof(tx_buff->indir_arr), DMA_TO_DEVICE); | ||
1571 | } else { | 1573 | } else { |
1572 | tx_buff->num_entries = num_entries; | 1574 | tx_buff->num_entries = num_entries; |
1573 | lpar_rc = send_subcrq(adapter, handle_array[queue_num], | 1575 | lpar_rc = send_subcrq(adapter, handle_array[queue_num], |
@@ -1981,6 +1983,10 @@ static void __ibmvnic_reset(struct work_struct *work) | |||
1981 | 1983 | ||
1982 | rwi = get_next_rwi(adapter); | 1984 | rwi = get_next_rwi(adapter); |
1983 | while (rwi) { | 1985 | while (rwi) { |
1986 | if (adapter->state == VNIC_REMOVING || | ||
1987 | adapter->state == VNIC_REMOVED) | ||
1988 | goto out; | ||
1989 | |||
1984 | if (adapter->force_reset_recovery) { | 1990 | if (adapter->force_reset_recovery) { |
1985 | adapter->force_reset_recovery = false; | 1991 | adapter->force_reset_recovery = false; |
1986 | rc = do_hard_reset(adapter, rwi, reset_state); | 1992 | rc = do_hard_reset(adapter, rwi, reset_state); |
@@ -2005,7 +2011,7 @@ static void __ibmvnic_reset(struct work_struct *work) | |||
2005 | netdev_dbg(adapter->netdev, "Reset failed\n"); | 2011 | netdev_dbg(adapter->netdev, "Reset failed\n"); |
2006 | free_all_rwi(adapter); | 2012 | free_all_rwi(adapter); |
2007 | } | 2013 | } |
2008 | 2014 | out: | |
2009 | adapter->resetting = false; | 2015 | adapter->resetting = false; |
2010 | if (we_lock_rtnl) | 2016 | if (we_lock_rtnl) |
2011 | rtnl_unlock(); | 2017 | rtnl_unlock(); |
@@ -2788,7 +2794,6 @@ static int ibmvnic_complete_tx(struct ibmvnic_adapter *adapter, | |||
2788 | union sub_crq *next; | 2794 | union sub_crq *next; |
2789 | int index; | 2795 | int index; |
2790 | int i, j; | 2796 | int i, j; |
2791 | u8 *first; | ||
2792 | 2797 | ||
2793 | restart_loop: | 2798 | restart_loop: |
2794 | while (pending_scrq(adapter, scrq)) { | 2799 | while (pending_scrq(adapter, scrq)) { |
@@ -2818,14 +2823,6 @@ restart_loop: | |||
2818 | 2823 | ||
2819 | txbuff->data_dma[j] = 0; | 2824 | txbuff->data_dma[j] = 0; |
2820 | } | 2825 | } |
2821 | /* if sub_crq was sent indirectly */ | ||
2822 | first = &txbuff->indir_arr[0].generic.first; | ||
2823 | if (*first == IBMVNIC_CRQ_CMD) { | ||
2824 | dma_unmap_single(dev, txbuff->indir_dma, | ||
2825 | sizeof(txbuff->indir_arr), | ||
2826 | DMA_TO_DEVICE); | ||
2827 | *first = 0; | ||
2828 | } | ||
2829 | 2826 | ||
2830 | if (txbuff->last_frag) { | 2827 | if (txbuff->last_frag) { |
2831 | dev_kfree_skb_any(txbuff->skb); | 2828 | dev_kfree_skb_any(txbuff->skb); |