Commit f38ff2ee authored by Anjali Singhai Jain's avatar Anjali Singhai Jain Committed by David S. Miller

i40e: Change some init flow for the client

This change makes a common flow for Client instance open during init
and reset path. The Client subtask can handle both the cases instead of
making a separate notify_client_of_open call.
Also it may fix a bug during reset where the service task was leaking
some memory and causing issues.

Change-Id: I7232a32fd52b82e863abb54266fa83122f80a0cd
Signed-off-by: default avatarAnjali Singhai Jain <anjali.singhai@intel.com>
Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c3e70edd
...@@ -199,6 +199,7 @@ void i40e_notify_client_of_l2_param_changes(struct i40e_vsi *vsi) ...@@ -199,6 +199,7 @@ void i40e_notify_client_of_l2_param_changes(struct i40e_vsi *vsi)
void i40e_notify_client_of_netdev_open(struct i40e_vsi *vsi) void i40e_notify_client_of_netdev_open(struct i40e_vsi *vsi)
{ {
struct i40e_client_instance *cdev; struct i40e_client_instance *cdev;
int ret = 0;
if (!vsi) if (!vsi)
return; return;
...@@ -211,7 +212,14 @@ void i40e_notify_client_of_netdev_open(struct i40e_vsi *vsi) ...@@ -211,7 +212,14 @@ void i40e_notify_client_of_netdev_open(struct i40e_vsi *vsi)
"Cannot locate client instance open routine\n"); "Cannot locate client instance open routine\n");
continue; continue;
} }
cdev->client->ops->open(&cdev->lan_info, cdev->client); if (!(test_bit(__I40E_CLIENT_INSTANCE_OPENED,
&cdev->state))) {
ret = cdev->client->ops->open(&cdev->lan_info,
cdev->client);
if (!ret)
set_bit(__I40E_CLIENT_INSTANCE_OPENED,
&cdev->state);
}
} }
} }
mutex_unlock(&i40e_client_instance_mutex); mutex_unlock(&i40e_client_instance_mutex);
...@@ -407,12 +415,14 @@ struct i40e_vsi *i40e_vsi_lookup(struct i40e_pf *pf, ...@@ -407,12 +415,14 @@ struct i40e_vsi *i40e_vsi_lookup(struct i40e_pf *pf,
* i40e_client_add_instance - add a client instance struct to the instance list * i40e_client_add_instance - add a client instance struct to the instance list
* @pf: pointer to the board struct * @pf: pointer to the board struct
* @client: pointer to a client struct in the client list. * @client: pointer to a client struct in the client list.
* @existing: if there was already an existing instance
* *
* Returns cdev ptr on success, NULL on failure * Returns cdev ptr on success or if already exists, NULL on failure
**/ **/
static static
struct i40e_client_instance *i40e_client_add_instance(struct i40e_pf *pf, struct i40e_client_instance *i40e_client_add_instance(struct i40e_pf *pf,
struct i40e_client *client) struct i40e_client *client,
bool *existing)
{ {
struct i40e_client_instance *cdev; struct i40e_client_instance *cdev;
struct netdev_hw_addr *mac = NULL; struct netdev_hw_addr *mac = NULL;
...@@ -421,7 +431,7 @@ struct i40e_client_instance *i40e_client_add_instance(struct i40e_pf *pf, ...@@ -421,7 +431,7 @@ struct i40e_client_instance *i40e_client_add_instance(struct i40e_pf *pf,
mutex_lock(&i40e_client_instance_mutex); mutex_lock(&i40e_client_instance_mutex);
list_for_each_entry(cdev, &i40e_client_instances, list) { list_for_each_entry(cdev, &i40e_client_instances, list) {
if ((cdev->lan_info.pf == pf) && (cdev->client == client)) { if ((cdev->lan_info.pf == pf) && (cdev->client == client)) {
cdev = NULL; *existing = true;
goto out; goto out;
} }
} }
...@@ -505,6 +515,7 @@ void i40e_client_subtask(struct i40e_pf *pf) ...@@ -505,6 +515,7 @@ void i40e_client_subtask(struct i40e_pf *pf)
{ {
struct i40e_client_instance *cdev; struct i40e_client_instance *cdev;
struct i40e_client *client; struct i40e_client *client;
bool existing = false;
int ret = 0; int ret = 0;
if (!(pf->flags & I40E_FLAG_SERVICE_CLIENT_REQUESTED)) if (!(pf->flags & I40E_FLAG_SERVICE_CLIENT_REQUESTED))
...@@ -528,18 +539,25 @@ void i40e_client_subtask(struct i40e_pf *pf) ...@@ -528,18 +539,25 @@ void i40e_client_subtask(struct i40e_pf *pf)
/* check if L2 VSI is up, if not we are not ready */ /* check if L2 VSI is up, if not we are not ready */
if (test_bit(__I40E_DOWN, &pf->vsi[pf->lan_vsi]->state)) if (test_bit(__I40E_DOWN, &pf->vsi[pf->lan_vsi]->state))
continue; continue;
} else {
dev_warn(&pf->pdev->dev, "This client %s is being instanciated at probe\n",
client->name);
} }
/* Add the client instance to the instance list */ /* Add the client instance to the instance list */
cdev = i40e_client_add_instance(pf, client); cdev = i40e_client_add_instance(pf, client, &existing);
if (!cdev) if (!cdev)
continue; continue;
/* Also up the ref_cnt of no. of instances of this client */ if (!existing) {
/* Also up the ref_cnt for no. of instances of this
* client.
*/
atomic_inc(&client->ref_cnt); atomic_inc(&client->ref_cnt);
dev_info(&pf->pdev->dev, "Added instance of Client %s to PF%d bus=0x%02x func=0x%02x\n", dev_info(&pf->pdev->dev, "Added instance of Client %s to PF%d bus=0x%02x func=0x%02x\n",
client->name, pf->hw.pf_id, client->name, pf->hw.pf_id,
pf->hw.bus.device, pf->hw.bus.func); pf->hw.bus.device, pf->hw.bus.func);
}
/* Send an Open request to the client */ /* Send an Open request to the client */
atomic_inc(&cdev->ref_cnt); atomic_inc(&cdev->ref_cnt);
...@@ -588,7 +606,8 @@ int i40e_lan_add_device(struct i40e_pf *pf) ...@@ -588,7 +606,8 @@ int i40e_lan_add_device(struct i40e_pf *pf)
pf->hw.pf_id, pf->hw.bus.device, pf->hw.bus.func); pf->hw.pf_id, pf->hw.bus.device, pf->hw.bus.func);
/* Since in some cases register may have happened before a device gets /* Since in some cases register may have happened before a device gets
* added, we can schedule a subtask to go initiate the clients. * added, we can schedule a subtask to go initiate the clients if
* they can be launched at probe time.
*/ */
pf->flags |= I40E_FLAG_SERVICE_CLIENT_REQUESTED; pf->flags |= I40E_FLAG_SERVICE_CLIENT_REQUESTED;
i40e_service_event_schedule(pf); i40e_service_event_schedule(pf);
......
...@@ -5431,7 +5431,6 @@ int i40e_open(struct net_device *netdev) ...@@ -5431,7 +5431,6 @@ int i40e_open(struct net_device *netdev)
wr32(&pf->hw, I40E_GLLAN_TSOMSK_L, be32_to_cpu(TCP_FLAG_CWR) >> 16); wr32(&pf->hw, I40E_GLLAN_TSOMSK_L, be32_to_cpu(TCP_FLAG_CWR) >> 16);
udp_tunnel_get_rx_info(netdev); udp_tunnel_get_rx_info(netdev);
i40e_notify_client_of_netdev_open(vsi);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment