aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJohn Allen <jallen@linux.vnet.ibm.com>2018-01-18 17:27:58 -0500
committerDavid S. Miller <davem@davemloft.net>2018-01-22 15:46:55 -0500
commit69d08dcbbe34347cbc044629cf6f25d062593dfe (patch)
treedbccddd469066137cb152eb96789184fc591267d /drivers
parente791380340685698dbdd38c7e3f3fcbf70a3c832 (diff)
ibmvnic: Allocate and request vpd in init_resources
In reset events in which our memory allocations need to be reallocated, VPD data is being freed, but never reallocated. This can cause issues if we later attempt to access that memory or reset and attempt to free the memory. This patch moves the allocation of the VPD data to init_resources so that it will be symmetrically freed during release resources. Signed-off-by: John Allen <jallen@linux.vnet.ibm.com> Reviewed-by: Nathan Fontenot <nfont@linux.vnet.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/ethernet/ibm/ibmvnic.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index cc36b254917c..b65f5f3ac034 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -881,7 +881,7 @@ static int ibmvnic_get_vpd(struct ibmvnic_adapter *adapter)
881 if (adapter->vpd->buff) 881 if (adapter->vpd->buff)
882 len = adapter->vpd->len; 882 len = adapter->vpd->len;
883 883
884 reinit_completion(&adapter->fw_done); 884 init_completion(&adapter->fw_done);
885 crq.get_vpd_size.first = IBMVNIC_CRQ_CMD; 885 crq.get_vpd_size.first = IBMVNIC_CRQ_CMD;
886 crq.get_vpd_size.cmd = GET_VPD_SIZE; 886 crq.get_vpd_size.cmd = GET_VPD_SIZE;
887 ibmvnic_send_crq(adapter, &crq); 887 ibmvnic_send_crq(adapter, &crq);
@@ -943,6 +943,13 @@ static int init_resources(struct ibmvnic_adapter *adapter)
943 if (!adapter->vpd) 943 if (!adapter->vpd)
944 return -ENOMEM; 944 return -ENOMEM;
945 945
946 /* Vital Product Data (VPD) */
947 rc = ibmvnic_get_vpd(adapter);
948 if (rc) {
949 netdev_err(netdev, "failed to initialize Vital Product Data (VPD)\n");
950 return rc;
951 }
952
946 adapter->map_id = 1; 953 adapter->map_id = 1;
947 adapter->napi = kcalloc(adapter->req_rx_queues, 954 adapter->napi = kcalloc(adapter->req_rx_queues,
948 sizeof(struct napi_struct), GFP_KERNEL); 955 sizeof(struct napi_struct), GFP_KERNEL);
@@ -1016,7 +1023,7 @@ static int __ibmvnic_open(struct net_device *netdev)
1016static int ibmvnic_open(struct net_device *netdev) 1023static int ibmvnic_open(struct net_device *netdev)
1017{ 1024{
1018 struct ibmvnic_adapter *adapter = netdev_priv(netdev); 1025 struct ibmvnic_adapter *adapter = netdev_priv(netdev);
1019 int rc, vpd; 1026 int rc;
1020 1027
1021 mutex_lock(&adapter->reset_lock); 1028 mutex_lock(&adapter->reset_lock);
1022 1029
@@ -1039,11 +1046,6 @@ static int ibmvnic_open(struct net_device *netdev)
1039 rc = __ibmvnic_open(netdev); 1046 rc = __ibmvnic_open(netdev);
1040 netif_carrier_on(netdev); 1047 netif_carrier_on(netdev);
1041 1048
1042 /* Vital Product Data (VPD) */
1043 vpd = ibmvnic_get_vpd(adapter);
1044 if (vpd)
1045 netdev_err(netdev, "failed to initialize Vital Product Data (VPD)\n");
1046
1047 mutex_unlock(&adapter->reset_lock); 1049 mutex_unlock(&adapter->reset_lock);
1048 1050
1049 return rc; 1051 return rc;