Skip to content

Commit

Permalink
enetc: Fix endianness issues for enetc_qos
Browse files Browse the repository at this point in the history
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: Claudiu Manoil <claudiu.manoil@nxp.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Claudiu Manoil authored and Jakub Kicinski committed Nov 20, 2020
1 parent d548d39 commit 0dfd294
Showing 1 changed file with 39 additions and 45 deletions.
84 changes: 39 additions & 45 deletions drivers/net/ethernet/freescale/enetc/enetc_qos.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,8 @@ static int enetc_setup_taprio(struct net_device *ndev,
return -ENOMEM;
}

cbd.addr[0] = lower_32_bits(dma);
cbd.addr[1] = upper_32_bits(dma);
cbd.addr[0] = cpu_to_le32(lower_32_bits(dma));
cbd.addr[1] = cpu_to_le32(upper_32_bits(dma));
cbd.cls = BDCR_CMD_PORT_GCL;
cbd.status_flags = 0;

Expand Down Expand Up @@ -506,16 +506,15 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv,
return -ENOMEM;
}

cbd.addr[0] = lower_32_bits(dma);
cbd.addr[1] = upper_32_bits(dma);
cbd.addr[0] = cpu_to_le32(lower_32_bits(dma));
cbd.addr[1] = cpu_to_le32(upper_32_bits(dma));
eth_broadcast_addr(si_data->dmac);
si_data->vid_vidm_tg =
cpu_to_le16(ENETC_CBDR_SID_VID_MASK
+ ((0x3 << 14) | ENETC_CBDR_SID_VIDM));
si_data->vid_vidm_tg = (ENETC_CBDR_SID_VID_MASK
+ ((0x3 << 14) | ENETC_CBDR_SID_VIDM));

si_conf = &cbd.sid_set;
/* 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->oui[2] = 0x0;
si_conf->oui[1] = 0x80;
Expand All @@ -540,7 +539,7 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv,

si_conf->en = 0x80;
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->oui[2] = 0x0;
si_conf->oui[1] = 0x80;
Expand All @@ -550,8 +549,8 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv,

cbd.length = cpu_to_le16(data_size);

cbd.addr[0] = lower_32_bits(dma);
cbd.addr[1] = upper_32_bits(dma);
cbd.addr[0] = cpu_to_le32(lower_32_bits(dma));
cbd.addr[1] = cpu_to_le32(upper_32_bits(dma));

/* VIDM default to be 1.
* VID Match. If set (b1) then the VID must match, otherwise
Expand All @@ -560,16 +559,14 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv,
*/
if (si_conf->id_type == STREAMID_TYPE_NULL) {
ether_addr_copy(si_data->dmac, sid->dst_mac);
si_data->vid_vidm_tg =
cpu_to_le16((sid->vid & ENETC_CBDR_SID_VID_MASK) +
((((u16)(sid->tagged) & 0x3) << 14)
| ENETC_CBDR_SID_VIDM));
si_data->vid_vidm_tg = (sid->vid & ENETC_CBDR_SID_VID_MASK) +
((((u16)(sid->tagged) & 0x3) << 14)
| ENETC_CBDR_SID_VIDM);
} else if (si_conf->id_type == STREAMID_TYPE_SMAC) {
ether_addr_copy(si_data->smac, sid->src_mac);
si_data->vid_vidm_tg =
cpu_to_le16((sid->vid & ENETC_CBDR_SID_VID_MASK) +
((((u16)(sid->tagged) & 0x3) << 14)
| ENETC_CBDR_SID_VIDM));
si_data->vid_vidm_tg = (sid->vid & ENETC_CBDR_SID_VID_MASK) +
((((u16)(sid->tagged) & 0x3) << 14)
| ENETC_CBDR_SID_VIDM);
}

err = enetc_send_cmd(priv->si, &cbd);
Expand Down Expand Up @@ -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->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
* frame’s priority value to determine a match for this entry.
Expand Down Expand Up @@ -658,37 +655,34 @@ static int enetc_streamcounter_hw_get(struct enetc_ndev_priv *priv,
err = -ENOMEM;
goto exit;
}
cbd.addr[0] = lower_32_bits(dma);
cbd.addr[1] = upper_32_bits(dma);
cbd.addr[0] = cpu_to_le32(lower_32_bits(dma));
cbd.addr[1] = cpu_to_le32(upper_32_bits(dma));

cbd.length = cpu_to_le16(data_size);

err = enetc_send_cmd(priv->si, &cbd);
if (err)
goto exit;

cnt->matching_frames_count =
((u64)le32_to_cpu(data_buf->matchh) << 32)
+ data_buf->matchl;
cnt->matching_frames_count = ((u64)data_buf->matchh << 32) +
data_buf->matchl;

cnt->not_passing_sdu_count =
((u64)le32_to_cpu(data_buf->msdu_droph) << 32)
+ data_buf->msdu_dropl;
cnt->not_passing_sdu_count = ((u64)data_buf->msdu_droph << 32) +
data_buf->msdu_dropl;

cnt->passing_sdu_count = cnt->matching_frames_count
- cnt->not_passing_sdu_count;

cnt->not_passing_frames_count =
((u64)le32_to_cpu(data_buf->stream_gate_droph) << 32)
+ le32_to_cpu(data_buf->stream_gate_dropl);
((u64)data_buf->stream_gate_droph << 32) +
data_buf->stream_gate_dropl;

cnt->passing_frames_count = cnt->matching_frames_count
- cnt->not_passing_sdu_count
- cnt->not_passing_frames_count;
cnt->passing_frames_count = cnt->matching_frames_count -
cnt->not_passing_sdu_count -
cnt->not_passing_frames_count;

cnt->red_frames_count =
((u64)le32_to_cpu(data_buf->flow_meter_droph) << 32)
+ le32_to_cpu(data_buf->flow_meter_dropl);
cnt->red_frames_count = ((u64)data_buf->flow_meter_droph << 32) +
data_buf->flow_meter_dropl;

exit:
kfree(data_buf);
Expand Down Expand Up @@ -795,15 +789,15 @@ static int enetc_streamgate_hw_set(struct enetc_ndev_priv *priv,
return -ENOMEM;
}

cbd.addr[0] = lower_32_bits(dma);
cbd.addr[1] = upper_32_bits(dma);
cbd.addr[0] = cpu_to_le32(lower_32_bits(dma));
cbd.addr[1] = cpu_to_le32(upper_32_bits(dma));

sgce = &sgcl_data->sgcl[0];

sgcl_config->agtst = 0x80;

sgcl_data->ct = cpu_to_le32(sgi->cycletime);
sgcl_data->cte = cpu_to_le32(sgi->cycletimext);
sgcl_data->ct = sgi->cycletime;
sgcl_data->cte = sgi->cycletimext;

if (sgi->init_ipv >= 0)
sgcl_config->aipv = (sgi->init_ipv & 0x7) | 0x8;
Expand All @@ -825,7 +819,7 @@ static int enetc_streamgate_hw_set(struct enetc_ndev_priv *priv,
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 */
Expand All @@ -837,15 +831,15 @@ static int enetc_streamgate_hw_set(struct enetc_ndev_priv *priv,
err = get_start_ns(now, sgi->cycletime, &start);
if (err)
goto exit;
sgcl_data->btl = cpu_to_le32(lower_32_bits(start));
sgcl_data->bth = cpu_to_le32(upper_32_bits(start));
sgcl_data->btl = lower_32_bits(start);
sgcl_data->bth = upper_32_bits(start);
} else {
u32 hi, lo;

hi = upper_32_bits(sgi->basetime);
lo = lower_32_bits(sgi->basetime);
sgcl_data->bth = cpu_to_le32(hi);
sgcl_data->btl = cpu_to_le32(lo);
sgcl_data->bth = hi;
sgcl_data->btl = lo;
}

err = enetc_send_cmd(priv->si, &cbd);
Expand Down

0 comments on commit 0dfd294

Please sign in to comment.