diff options
Diffstat (limited to 'drivers/net/ethernet/ibm/ibmvnic.c')
-rw-r--r-- | drivers/net/ethernet/ibm/ibmvnic.c | 59 |
1 files changed, 56 insertions, 3 deletions
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c index 27447260215d..1b3cc8bb0705 100644 --- a/drivers/net/ethernet/ibm/ibmvnic.c +++ b/drivers/net/ethernet/ibm/ibmvnic.c | |||
@@ -791,6 +791,18 @@ static int ibmvnic_login(struct net_device *netdev) | |||
791 | return 0; | 791 | return 0; |
792 | } | 792 | } |
793 | 793 | ||
794 | static void release_login_buffer(struct ibmvnic_adapter *adapter) | ||
795 | { | ||
796 | kfree(adapter->login_buf); | ||
797 | adapter->login_buf = NULL; | ||
798 | } | ||
799 | |||
800 | static void release_login_rsp_buffer(struct ibmvnic_adapter *adapter) | ||
801 | { | ||
802 | kfree(adapter->login_rsp_buf); | ||
803 | adapter->login_rsp_buf = NULL; | ||
804 | } | ||
805 | |||
794 | static void release_resources(struct ibmvnic_adapter *adapter) | 806 | static void release_resources(struct ibmvnic_adapter *adapter) |
795 | { | 807 | { |
796 | int i; | 808 | int i; |
@@ -813,6 +825,10 @@ static void release_resources(struct ibmvnic_adapter *adapter) | |||
813 | } | 825 | } |
814 | } | 826 | } |
815 | } | 827 | } |
828 | kfree(adapter->napi); | ||
829 | adapter->napi = NULL; | ||
830 | |||
831 | release_login_rsp_buffer(adapter); | ||
816 | } | 832 | } |
817 | 833 | ||
818 | static int set_link_state(struct ibmvnic_adapter *adapter, u8 link_state) | 834 | static int set_link_state(struct ibmvnic_adapter *adapter, u8 link_state) |
@@ -1057,6 +1073,35 @@ static int ibmvnic_open(struct net_device *netdev) | |||
1057 | return rc; | 1073 | return rc; |
1058 | } | 1074 | } |
1059 | 1075 | ||
1076 | static void clean_rx_pools(struct ibmvnic_adapter *adapter) | ||
1077 | { | ||
1078 | struct ibmvnic_rx_pool *rx_pool; | ||
1079 | u64 rx_entries; | ||
1080 | int rx_scrqs; | ||
1081 | int i, j; | ||
1082 | |||
1083 | if (!adapter->rx_pool) | ||
1084 | return; | ||
1085 | |||
1086 | rx_scrqs = be32_to_cpu(adapter->login_rsp_buf->num_rxadd_subcrqs); | ||
1087 | rx_entries = adapter->req_rx_add_entries_per_subcrq; | ||
1088 | |||
1089 | /* Free any remaining skbs in the rx buffer pools */ | ||
1090 | for (i = 0; i < rx_scrqs; i++) { | ||
1091 | rx_pool = &adapter->rx_pool[i]; | ||
1092 | if (!rx_pool) | ||
1093 | continue; | ||
1094 | |||
1095 | netdev_dbg(adapter->netdev, "Cleaning rx_pool[%d]\n", i); | ||
1096 | for (j = 0; j < rx_entries; j++) { | ||
1097 | if (rx_pool->rx_buff[j].skb) { | ||
1098 | dev_kfree_skb_any(rx_pool->rx_buff[j].skb); | ||
1099 | rx_pool->rx_buff[j].skb = NULL; | ||
1100 | } | ||
1101 | } | ||
1102 | } | ||
1103 | } | ||
1104 | |||
1060 | static void clean_tx_pools(struct ibmvnic_adapter *adapter) | 1105 | static void clean_tx_pools(struct ibmvnic_adapter *adapter) |
1061 | { | 1106 | { |
1062 | struct ibmvnic_tx_pool *tx_pool; | 1107 | struct ibmvnic_tx_pool *tx_pool; |
@@ -1134,7 +1179,7 @@ static int __ibmvnic_close(struct net_device *netdev) | |||
1134 | } | 1179 | } |
1135 | } | 1180 | } |
1136 | } | 1181 | } |
1137 | 1182 | clean_rx_pools(adapter); | |
1138 | clean_tx_pools(adapter); | 1183 | clean_tx_pools(adapter); |
1139 | adapter->state = VNIC_CLOSED; | 1184 | adapter->state = VNIC_CLOSED; |
1140 | return rc; | 1185 | return rc; |
@@ -1670,8 +1715,6 @@ static int do_reset(struct ibmvnic_adapter *adapter, | |||
1670 | return 0; | 1715 | return 0; |
1671 | } | 1716 | } |
1672 | 1717 | ||
1673 | netif_carrier_on(netdev); | ||
1674 | |||
1675 | /* kick napi */ | 1718 | /* kick napi */ |
1676 | for (i = 0; i < adapter->req_rx_queues; i++) | 1719 | for (i = 0; i < adapter->req_rx_queues; i++) |
1677 | napi_schedule(&adapter->napi[i]); | 1720 | napi_schedule(&adapter->napi[i]); |
@@ -1679,6 +1722,8 @@ static int do_reset(struct ibmvnic_adapter *adapter, | |||
1679 | if (adapter->reset_reason != VNIC_RESET_FAILOVER) | 1722 | if (adapter->reset_reason != VNIC_RESET_FAILOVER) |
1680 | netdev_notify_peers(netdev); | 1723 | netdev_notify_peers(netdev); |
1681 | 1724 | ||
1725 | netif_carrier_on(netdev); | ||
1726 | |||
1682 | return 0; | 1727 | return 0; |
1683 | } | 1728 | } |
1684 | 1729 | ||
@@ -1853,6 +1898,12 @@ restart_poll: | |||
1853 | be16_to_cpu(next->rx_comp.rc)); | 1898 | be16_to_cpu(next->rx_comp.rc)); |
1854 | /* free the entry */ | 1899 | /* free the entry */ |
1855 | next->rx_comp.first = 0; | 1900 | next->rx_comp.first = 0; |
1901 | dev_kfree_skb_any(rx_buff->skb); | ||
1902 | remove_buff_from_pool(adapter, rx_buff); | ||
1903 | continue; | ||
1904 | } else if (!rx_buff->skb) { | ||
1905 | /* free the entry */ | ||
1906 | next->rx_comp.first = 0; | ||
1856 | remove_buff_from_pool(adapter, rx_buff); | 1907 | remove_buff_from_pool(adapter, rx_buff); |
1857 | continue; | 1908 | continue; |
1858 | } | 1909 | } |
@@ -3013,6 +3064,7 @@ static void send_login(struct ibmvnic_adapter *adapter) | |||
3013 | struct vnic_login_client_data *vlcd; | 3064 | struct vnic_login_client_data *vlcd; |
3014 | int i; | 3065 | int i; |
3015 | 3066 | ||
3067 | release_login_rsp_buffer(adapter); | ||
3016 | client_data_len = vnic_client_data_len(adapter); | 3068 | client_data_len = vnic_client_data_len(adapter); |
3017 | 3069 | ||
3018 | buffer_size = | 3070 | buffer_size = |
@@ -3738,6 +3790,7 @@ static int handle_login_rsp(union ibmvnic_crq *login_rsp_crq, | |||
3738 | ibmvnic_remove(adapter->vdev); | 3790 | ibmvnic_remove(adapter->vdev); |
3739 | return -EIO; | 3791 | return -EIO; |
3740 | } | 3792 | } |
3793 | release_login_buffer(adapter); | ||
3741 | complete(&adapter->init_done); | 3794 | complete(&adapter->init_done); |
3742 | 3795 | ||
3743 | return 0; | 3796 | return 0; |