summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet/freescale/dpa
diff options
context:
space:
mode:
authorRotariu Marian Cristian-B44860 <marian.rotariu@freescale.com>2014-10-09 10:22:27 (GMT)
committerMadalin-Cristian Bucur <madalin.bucur@freescale.com>2015-03-11 14:05:49 (GMT)
commit8689f6bf737b3b75eb9bad2e854d1bb40b1586b0 (patch)
treec8058671067f3779250696ccc34fda80f7acff48 /drivers/net/ethernet/freescale/dpa
parent33e06a3815629a0170eb610e911479eb92fd4952 (diff)
downloadlinux-fsl-qoriq-8689f6bf737b3b75eb9bad2e854d1bb40b1586b0.tar.xz
dpaa_eth: convert fq dts entries to CPU endianess
The data related to fqs from dts are in BE. In order to be used by the CPU, the data need to be converted into CPU endianess. Because the current fqids structure is used in many ways and in many files, the code for endianess conversion is not localized. To make this patch as simple as possible, an intermediary variable was used. Change-Id: I1beec33fa3ce816899e3bb02e0cf88ed0b0d0520 Signed-off-by: Rotariu Marian Cristian-B44860 <marian.rotariu@freescale.com> Reviewed-on: http://git.am.freescale.net:8181/20964 Reviewed-by: Madalin-Cristian Bucur <madalin.bucur@freescale.com> Reviewed-on: http://git.am.freescale.net:8181/32495
Diffstat (limited to 'drivers/net/ethernet/freescale/dpa')
-rw-r--r--drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c b/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c
index 3e1e615..6a393fe 100644
--- a/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c
+++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c
@@ -80,7 +80,7 @@ static const struct fqid_cell tx_confirm_fqids[] = {
{0, DPAA_ETH_TX_QUEUES}
};
-static const struct fqid_cell default_fqids[][3] = {
+static struct fqid_cell default_fqids[][3] = {
[RX] = { {0, 1}, {0, 1}, {0, DPAA_ETH_RX_QUEUES} },
[TX] = { {0, 1}, {0, 1}, {0, DPAA_ETH_TX_QUEUES} }
};
@@ -927,8 +927,9 @@ int dpa_fq_probe_mac(struct device *dev, struct list_head *list,
bool alloc_tx_conf_fqs,
enum port_type ptype)
{
- const struct fqid_cell *fqids;
- struct dpa_fq *dpa_fq;
+ struct fqid_cell *fqids = NULL;
+ const void *fqids_off = NULL;
+ struct dpa_fq *dpa_fq = NULL;
struct device_node *np = dev->of_node;
int num_ranges;
int i, lenp;
@@ -939,13 +940,26 @@ int dpa_fq_probe_mac(struct device *dev, struct list_head *list,
goto fq_alloc_failed;
}
- fqids = of_get_property(np, fsl_qman_frame_queues[ptype], &lenp);
- if (fqids == NULL) {
+ fqids_off = of_get_property(np, fsl_qman_frame_queues[ptype], &lenp);
+ if (fqids_off == NULL) {
/* No dts definition, so use the defaults. */
fqids = default_fqids[ptype];
num_ranges = 3;
} else {
num_ranges = lenp / sizeof(*fqids);
+
+ fqids = devm_kzalloc(dev, sizeof(*fqids) * num_ranges,
+ GFP_KERNEL);
+ if (fqids == NULL)
+ goto fqids_alloc_failed;
+
+ /* convert to CPU endianess */
+ for (i = 0; i < num_ranges; i++) {
+ fqids[i].start = be32_to_cpup(fqids_off +
+ i * sizeof(*fqids));
+ fqids[i].count = be32_to_cpup(fqids_off +
+ i * sizeof(*fqids) + sizeof(__be32));
+ }
}
for (i = 0; i < num_ranges; i++) {
@@ -996,7 +1010,8 @@ int dpa_fq_probe_mac(struct device *dev, struct list_head *list,
return 0;
fq_alloc_failed:
- dev_err(dev, "dpa_fq_alloc() failed\n");
+fqids_alloc_failed:
+ dev_err(dev, "Cannot allocate memory for frame queues\n");
return -ENOMEM;
invalid_default_queue: