Commit 0dfd294c authored by Claudiu Manoil's avatar Claudiu Manoil Committed by Jakub Kicinski

enetc: Fix endianness issues for enetc_qos

Currently the control buffer descriptor (cbd) fields have endianness
restrictions while the commands passed into the control buffers
don't (with one exception). This patch fixes offending code,
by adding endianness accessors for cbd fields and removing the
unnecessary ones in case of data buffer fields. Currently there's
no need to convert all commands to little endian format, the patch
only focuses on fixing current endianness issues reported by sparse.
Signed-off-by: default avatarClaudiu Manoil <claudiu.manoil@nxp.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent d548d393
...@@ -128,8 +128,8 @@ static int enetc_setup_taprio(struct net_device *ndev, ...@@ -128,8 +128,8 @@ static int enetc_setup_taprio(struct net_device *ndev,
return -ENOMEM; return -ENOMEM;
} }
cbd.addr[0] = lower_32_bits(dma); cbd.addr[0] = cpu_to_le32(lower_32_bits(dma));
cbd.addr[1] = upper_32_bits(dma); cbd.addr[1] = cpu_to_le32(upper_32_bits(dma));
cbd.cls = BDCR_CMD_PORT_GCL; cbd.cls = BDCR_CMD_PORT_GCL;
cbd.status_flags = 0; cbd.status_flags = 0;
...@@ -506,16 +506,15 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv, ...@@ -506,16 +506,15 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv,
return -ENOMEM; return -ENOMEM;
} }
cbd.addr[0] = lower_32_bits(dma); cbd.addr[0] = cpu_to_le32(lower_32_bits(dma));
cbd.addr[1] = upper_32_bits(dma); cbd.addr[1] = cpu_to_le32(upper_32_bits(dma));
eth_broadcast_addr(si_data->dmac); eth_broadcast_addr(si_data->dmac);
si_data->vid_vidm_tg = si_data->vid_vidm_tg = (ENETC_CBDR_SID_VID_MASK
cpu_to_le16(ENETC_CBDR_SID_VID_MASK + ((0x3 << 14) | ENETC_CBDR_SID_VIDM));
+ ((0x3 << 14) | ENETC_CBDR_SID_VIDM));
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 = 1 << enetc_get_port(priv); si_conf->iports = cpu_to_le32(1 << enetc_get_port(priv));
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;
...@@ -540,7 +539,7 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv, ...@@ -540,7 +539,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 = 1 << enetc_get_port(priv); si_conf->iports = cpu_to_le32(1 << enetc_get_port(priv));
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;
...@@ -550,8 +549,8 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv, ...@@ -550,8 +549,8 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv,
cbd.length = cpu_to_le16(data_size); cbd.length = cpu_to_le16(data_size);
cbd.addr[0] = lower_32_bits(dma); cbd.addr[0] = cpu_to_le32(lower_32_bits(dma));
cbd.addr[1] = upper_32_bits(dma); cbd.addr[1] = cpu_to_le32(upper_32_bits(dma));
/* VIDM default to be 1. /* VIDM default to be 1.
* VID Match. If set (b1) then the VID must match, otherwise * VID Match. If set (b1) then the VID must match, otherwise
...@@ -560,16 +559,14 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv, ...@@ -560,16 +559,14 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv,
*/ */
if (si_conf->id_type == STREAMID_TYPE_NULL) { if (si_conf->id_type == STREAMID_TYPE_NULL) {
ether_addr_copy(si_data->dmac, sid->dst_mac); ether_addr_copy(si_data->dmac, sid->dst_mac);
si_data->vid_vidm_tg = si_data->vid_vidm_tg = (sid->vid & ENETC_CBDR_SID_VID_MASK) +
cpu_to_le16((sid->vid & ENETC_CBDR_SID_VID_MASK) + ((((u16)(sid->tagged) & 0x3) << 14)
((((u16)(sid->tagged) & 0x3) << 14) | ENETC_CBDR_SID_VIDM);
| ENETC_CBDR_SID_VIDM));
} else if (si_conf->id_type == STREAMID_TYPE_SMAC) { } else if (si_conf->id_type == STREAMID_TYPE_SMAC) {
ether_addr_copy(si_data->smac, sid->src_mac); ether_addr_copy(si_data->smac, sid->src_mac);
si_data->vid_vidm_tg = si_data->vid_vidm_tg = (sid->vid & ENETC_CBDR_SID_VID_MASK) +
cpu_to_le16((sid->vid & ENETC_CBDR_SID_VID_MASK) + ((((u16)(sid->tagged) & 0x3) << 14)
((((u16)(sid->tagged) & 0x3) << 14) | ENETC_CBDR_SID_VIDM);
| ENETC_CBDR_SID_VIDM));
} }
err = enetc_send_cmd(priv->si, &cbd); err = enetc_send_cmd(priv->si, &cbd);
...@@ -604,7 +601,7 @@ static int enetc_streamfilter_hw_set(struct enetc_ndev_priv *priv, ...@@ -604,7 +601,7 @@ 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 = 1 << enetc_get_port(priv); sfi_config->input_ports = cpu_to_le32(1 << enetc_get_port(priv));
/* 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.
...@@ -658,8 +655,8 @@ static int enetc_streamcounter_hw_get(struct enetc_ndev_priv *priv, ...@@ -658,8 +655,8 @@ static int enetc_streamcounter_hw_get(struct enetc_ndev_priv *priv,
err = -ENOMEM; err = -ENOMEM;
goto exit; goto exit;
} }
cbd.addr[0] = lower_32_bits(dma); cbd.addr[0] = cpu_to_le32(lower_32_bits(dma));
cbd.addr[1] = upper_32_bits(dma); cbd.addr[1] = cpu_to_le32(upper_32_bits(dma));
cbd.length = cpu_to_le16(data_size); cbd.length = cpu_to_le16(data_size);
...@@ -667,28 +664,25 @@ static int enetc_streamcounter_hw_get(struct enetc_ndev_priv *priv, ...@@ -667,28 +664,25 @@ static int enetc_streamcounter_hw_get(struct enetc_ndev_priv *priv,
if (err) if (err)
goto exit; goto exit;
cnt->matching_frames_count = cnt->matching_frames_count = ((u64)data_buf->matchh << 32) +
((u64)le32_to_cpu(data_buf->matchh) << 32) data_buf->matchl;
+ data_buf->matchl;
cnt->not_passing_sdu_count = cnt->not_passing_sdu_count = ((u64)data_buf->msdu_droph << 32) +
((u64)le32_to_cpu(data_buf->msdu_droph) << 32) data_buf->msdu_dropl;
+ data_buf->msdu_dropl;
cnt->passing_sdu_count = cnt->matching_frames_count cnt->passing_sdu_count = cnt->matching_frames_count
- cnt->not_passing_sdu_count; - cnt->not_passing_sdu_count;
cnt->not_passing_frames_count = cnt->not_passing_frames_count =
((u64)le32_to_cpu(data_buf->stream_gate_droph) << 32) ((u64)data_buf->stream_gate_droph << 32) +
+ le32_to_cpu(data_buf->stream_gate_dropl); data_buf->stream_gate_dropl;
cnt->passing_frames_count = cnt->matching_frames_count cnt->passing_frames_count = cnt->matching_frames_count -
- cnt->not_passing_sdu_count cnt->not_passing_sdu_count -
- cnt->not_passing_frames_count; cnt->not_passing_frames_count;
cnt->red_frames_count = cnt->red_frames_count = ((u64)data_buf->flow_meter_droph << 32) +
((u64)le32_to_cpu(data_buf->flow_meter_droph) << 32) data_buf->flow_meter_dropl;
+ le32_to_cpu(data_buf->flow_meter_dropl);
exit: exit:
kfree(data_buf); kfree(data_buf);
...@@ -795,15 +789,15 @@ static int enetc_streamgate_hw_set(struct enetc_ndev_priv *priv, ...@@ -795,15 +789,15 @@ static int enetc_streamgate_hw_set(struct enetc_ndev_priv *priv,
return -ENOMEM; return -ENOMEM;
} }
cbd.addr[0] = lower_32_bits(dma); cbd.addr[0] = cpu_to_le32(lower_32_bits(dma));
cbd.addr[1] = upper_32_bits(dma); cbd.addr[1] = cpu_to_le32(upper_32_bits(dma));
sgce = &sgcl_data->sgcl[0]; sgce = &sgcl_data->sgcl[0];
sgcl_config->agtst = 0x80; sgcl_config->agtst = 0x80;
sgcl_data->ct = cpu_to_le32(sgi->cycletime); sgcl_data->ct = sgi->cycletime;
sgcl_data->cte = cpu_to_le32(sgi->cycletimext); sgcl_data->cte = sgi->cycletimext;
if (sgi->init_ipv >= 0) if (sgi->init_ipv >= 0)
sgcl_config->aipv = (sgi->init_ipv & 0x7) | 0x8; sgcl_config->aipv = (sgi->init_ipv & 0x7) | 0x8;
...@@ -825,7 +819,7 @@ static int enetc_streamgate_hw_set(struct enetc_ndev_priv *priv, ...@@ -825,7 +819,7 @@ static int enetc_streamgate_hw_set(struct enetc_ndev_priv *priv,
to->msdu[2] = (from->maxoctets >> 16) & 0xFF; to->msdu[2] = (from->maxoctets >> 16) & 0xFF;
} }
to->interval = cpu_to_le32(from->interval); to->interval = from->interval;
} }
/* If basetime is less than now, calculate start time */ /* If basetime is less than now, calculate start time */
...@@ -837,15 +831,15 @@ static int enetc_streamgate_hw_set(struct enetc_ndev_priv *priv, ...@@ -837,15 +831,15 @@ static int enetc_streamgate_hw_set(struct enetc_ndev_priv *priv,
err = get_start_ns(now, sgi->cycletime, &start); err = get_start_ns(now, sgi->cycletime, &start);
if (err) if (err)
goto exit; goto exit;
sgcl_data->btl = cpu_to_le32(lower_32_bits(start)); sgcl_data->btl = lower_32_bits(start);
sgcl_data->bth = cpu_to_le32(upper_32_bits(start)); sgcl_data->bth = upper_32_bits(start);
} else { } else {
u32 hi, lo; u32 hi, lo;
hi = upper_32_bits(sgi->basetime); hi = upper_32_bits(sgi->basetime);
lo = lower_32_bits(sgi->basetime); lo = lower_32_bits(sgi->basetime);
sgcl_data->bth = cpu_to_le32(hi); sgcl_data->bth = hi;
sgcl_data->btl = cpu_to_le32(lo); sgcl_data->btl = lo;
} }
err = enetc_send_cmd(priv->si, &cbd); err = enetc_send_cmd(priv->si, &cbd);
......
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