Commit 87614b93 authored by Vladimir Oltean's avatar Vladimir Oltean Committed by David S. Miller

net: enetc: create a common enetc_pf_to_port helper

Even though ENETC interfaces are exposed as individual PCIe PFs with
their own driver instances, the ENETC is still fundamentally a
multi-port Ethernet controller, and some parts of the IP take a port
number (as can be seen in the PSFP implementation).

Create a common helper that can be used outside of the TSN code for
retrieving the ENETC port number based on the PF number. This is only
correct for LS1028A, the only Linux-capable instantiation of ENETC thus
far.

Note that ENETC port 3 is PF 6. The TSN code did not care about this
because ENETC port 3 does not support TSN, so the wrong mapping done by
enetc_get_port for PF 6 could have never been hit.
Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c1d9e34e
...@@ -237,6 +237,22 @@ static inline bool enetc_si_is_pf(struct enetc_si *si) ...@@ -237,6 +237,22 @@ static inline bool enetc_si_is_pf(struct enetc_si *si)
return !!(si->hw.port); return !!(si->hw.port);
} }
static inline int enetc_pf_to_port(struct pci_dev *pf_pdev)
{
switch (pf_pdev->devfn) {
case 0:
return 0;
case 1:
return 1;
case 2:
return 2;
case 6:
return 3;
default:
return -1;
}
}
#define ENETC_MAX_NUM_TXQS 8 #define ENETC_MAX_NUM_TXQS 8
#define ENETC_INT_NAME_MAX (IFNAMSIZ + 8) #define ENETC_INT_NAME_MAX (IFNAMSIZ + 8)
......
...@@ -455,11 +455,6 @@ static struct enetc_psfp epsfp = { ...@@ -455,11 +455,6 @@ static struct enetc_psfp epsfp = {
static LIST_HEAD(enetc_block_cb_list); static LIST_HEAD(enetc_block_cb_list);
static inline int enetc_get_port(struct enetc_ndev_priv *priv)
{
return priv->si->pdev->devfn & 0x7;
}
/* Stream Identity Entry Set Descriptor */ /* Stream Identity Entry Set Descriptor */
static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv, static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv,
struct enetc_streamid *sid, struct enetc_streamid *sid,
...@@ -504,7 +499,7 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv, ...@@ -504,7 +499,7 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv,
si_conf = &cbd.sid_set; si_conf = &cbd.sid_set;
/* Only one port supported for one entry, set itself */ /* Only one port supported for one entry, set itself */
si_conf->iports = cpu_to_le32(1 << enetc_get_port(priv)); si_conf->iports = cpu_to_le32(1 << enetc_pf_to_port(priv->si->pdev));
si_conf->id_type = 1; si_conf->id_type = 1;
si_conf->oui[2] = 0x0; si_conf->oui[2] = 0x0;
si_conf->oui[1] = 0x80; si_conf->oui[1] = 0x80;
...@@ -529,7 +524,7 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv, ...@@ -529,7 +524,7 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv,
si_conf->en = 0x80; si_conf->en = 0x80;
si_conf->stream_handle = cpu_to_le32(sid->handle); si_conf->stream_handle = cpu_to_le32(sid->handle);
si_conf->iports = cpu_to_le32(1 << enetc_get_port(priv)); si_conf->iports = cpu_to_le32(1 << enetc_pf_to_port(priv->si->pdev));
si_conf->id_type = sid->filtertype; si_conf->id_type = sid->filtertype;
si_conf->oui[2] = 0x0; si_conf->oui[2] = 0x0;
si_conf->oui[1] = 0x80; si_conf->oui[1] = 0x80;
...@@ -591,7 +586,8 @@ static int enetc_streamfilter_hw_set(struct enetc_ndev_priv *priv, ...@@ -591,7 +586,8 @@ static int enetc_streamfilter_hw_set(struct enetc_ndev_priv *priv,
} }
sfi_config->sg_inst_table_index = cpu_to_le16(sfi->gate_id); sfi_config->sg_inst_table_index = cpu_to_le16(sfi->gate_id);
sfi_config->input_ports = cpu_to_le32(1 << enetc_get_port(priv)); sfi_config->input_ports =
cpu_to_le32(1 << enetc_pf_to_port(priv->si->pdev));
/* The priority value which may be matched against the /* The priority value which may be matched against the
* frame’s priority value to determine a match for this entry. * frame’s priority value to determine a match for this entry.
...@@ -1562,10 +1558,10 @@ int enetc_setup_tc_psfp(struct net_device *ndev, void *type_data) ...@@ -1562,10 +1558,10 @@ int enetc_setup_tc_psfp(struct net_device *ndev, void *type_data)
switch (f->command) { switch (f->command) {
case FLOW_BLOCK_BIND: case FLOW_BLOCK_BIND:
set_bit(enetc_get_port(priv), &epsfp.dev_bitmap); set_bit(enetc_pf_to_port(priv->si->pdev), &epsfp.dev_bitmap);
break; break;
case FLOW_BLOCK_UNBIND: case FLOW_BLOCK_UNBIND:
clear_bit(enetc_get_port(priv), &epsfp.dev_bitmap); clear_bit(enetc_pf_to_port(priv->si->pdev), &epsfp.dev_bitmap);
if (!epsfp.dev_bitmap) if (!epsfp.dev_bitmap)
clean_psfp_all(); clean_psfp_all();
break; break;
......
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