Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3eb3b74a authored by Jakub Kicinski's avatar Jakub Kicinski Committed by David S. Miller
Browse files

nfp: provide linking on port structures



Add link to nfp_ports to make it possible to iterate over all ports.
This will come in handy when some ports may be representors.

Signed-off-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: default avatarSimon Horman <simon.horman@netronome.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6d4f8cba
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -341,6 +341,7 @@ static int nfp_pci_probe(struct pci_dev *pdev,
		goto err_rel_regions;
		goto err_rel_regions;
	}
	}
	INIT_LIST_HEAD(&pf->vnics);
	INIT_LIST_HEAD(&pf->vnics);
	INIT_LIST_HEAD(&pf->ports);
	pci_set_drvdata(pdev, pf);
	pci_set_drvdata(pdev, pf);
	pf->pdev = pdev;
	pf->pdev = pdev;


+2 −0
Original line number Original line Diff line number Diff line
@@ -70,6 +70,7 @@ struct nfp_eth_table;
 * @max_data_vnics:	Number of data vNICs app firmware supports
 * @max_data_vnics:	Number of data vNICs app firmware supports
 * @num_vnics:		Number of vNICs spawned
 * @num_vnics:		Number of vNICs spawned
 * @vnics:		Linked list of vNIC structures (struct nfp_net)
 * @vnics:		Linked list of vNIC structures (struct nfp_net)
 * @ports:		Linked list of port structures (struct nfp_port)
 * @port_refresh_work:	Work entry for taking netdevs out
 * @port_refresh_work:	Work entry for taking netdevs out
 * @lock:		Protects all fields which may change after probe
 * @lock:		Protects all fields which may change after probe
 */
 */
@@ -99,6 +100,7 @@ struct nfp_pf {
	unsigned int num_vnics;
	unsigned int num_vnics;


	struct list_head vnics;
	struct list_head vnics;
	struct list_head ports;
	struct work_struct port_refresh_work;
	struct work_struct port_refresh_work;
	struct mutex lock;
	struct mutex lock;
};
};
+6 −9
Original line number Original line Diff line number Diff line
@@ -548,6 +548,7 @@ static void nfp_net_refresh_vnics(struct work_struct *work)
					 port_refresh_work);
					 port_refresh_work);
	struct nfp_eth_table *eth_table;
	struct nfp_eth_table *eth_table;
	struct nfp_net *nn, *next;
	struct nfp_net *nn, *next;
	struct nfp_port *port;


	mutex_lock(&pf->lock);
	mutex_lock(&pf->lock);


@@ -557,9 +558,8 @@ static void nfp_net_refresh_vnics(struct work_struct *work)


	/* Update state of all ports */
	/* Update state of all ports */
	rtnl_lock();
	rtnl_lock();
	list_for_each_entry(nn, &pf->vnics, vnic_list)
	list_for_each_entry(port, &pf->ports, port_list)
		if (nn->port)
		clear_bit(NFP_PORT_CHANGED, &port->flags);
			clear_bit(NFP_PORT_CHANGED, &nn->port->flags);


	eth_table = nfp_eth_read_ports(pf->cpp);
	eth_table = nfp_eth_read_ports(pf->cpp);
	if (!eth_table) {
	if (!eth_table) {
@@ -568,12 +568,9 @@ static void nfp_net_refresh_vnics(struct work_struct *work)
		goto out;
		goto out;
	}
	}


	list_for_each_entry(nn, &pf->vnics, vnic_list) {
	list_for_each_entry(port, &pf->ports, port_list)
		if (!__nfp_port_get_eth_port(nn->port))
		if (__nfp_port_get_eth_port(port))
			continue;
			nfp_net_eth_port_update(pf->cpp, port, eth_table);

		nfp_net_eth_port_update(pf->cpp, nn->port, eth_table);
	}
	rtnl_unlock();
	rtnl_unlock();


	kfree(eth_table);
	kfree(eth_table);
+5 −0
Original line number Original line Diff line number Diff line
@@ -95,10 +95,15 @@ nfp_port_alloc(struct nfp_app *app, enum nfp_port_type type,
	port->type = type;
	port->type = type;
	port->app = app;
	port->app = app;


	list_add_tail(&port->port_list, &app->pf->ports);

	return port;
	return port;
}
}


void nfp_port_free(struct nfp_port *port)
void nfp_port_free(struct nfp_port *port)
{
{
	if (!port)
		return;
	list_del(&port->port_list);
	kfree(port);
	kfree(port);
}
}
+3 −0
Original line number Original line Diff line number Diff line
@@ -68,6 +68,7 @@ enum nfp_port_flags {
 * @app:	backpointer to the app structure
 * @app:	backpointer to the app structure
 * @eth_id:	for %NFP_PORT_PHYS_PORT port ID in NFP enumeration scheme
 * @eth_id:	for %NFP_PORT_PHYS_PORT port ID in NFP enumeration scheme
 * @eth_port:	for %NFP_PORT_PHYS_PORT translated ETH Table port entry
 * @eth_port:	for %NFP_PORT_PHYS_PORT translated ETH Table port entry
 * @port_list:	entry on pf's list of ports
 */
 */
struct nfp_port {
struct nfp_port {
	struct net_device *netdev;
	struct net_device *netdev;
@@ -79,6 +80,8 @@ struct nfp_port {


	unsigned int eth_id;
	unsigned int eth_id;
	struct nfp_eth_table_port *eth_port;
	struct nfp_eth_table_port *eth_port;

	struct list_head port_list;
};
};


struct nfp_port *nfp_port_from_netdev(struct net_device *netdev);
struct nfp_port *nfp_port_from_netdev(struct net_device *netdev);