diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/ethernet/freescale/dpa/offline_port.c | 128 |
1 files changed, 49 insertions, 79 deletions
diff --git a/drivers/net/ethernet/freescale/dpa/offline_port.c b/drivers/net/ethernet/freescale/dpa/offline_port.c index 042f44a..ddbfdce 100644 --- a/drivers/net/ethernet/freescale/dpa/offline_port.c +++ b/drivers/net/ethernet/freescale/dpa/offline_port.c @@ -250,14 +250,13 @@ oh_port_probe(struct platform_device *_of_dev) struct device_node *dpa_oh_node; int lenp, _errno = 0, fq_idx, duple_idx; int n_size, i, j, ret, duples_count; - const phandle *oh_port_handle, *bpool_handle; struct platform_device *oh_of_dev; struct device_node *oh_node, *bpool_node = NULL, *root_node; struct device *oh_dev; struct dpa_oh_config_s *oh_config = NULL; - uint32_t *oh_all_queues; - uint32_t *channel_ids; - uint32_t *oh_tx_queues; + const __be32 *oh_all_queues; + const __be32 *channel_ids; + const __be32 *oh_tx_queues; uint32_t queues_count; uint32_t crt_fqid_base; uint32_t crt_fq_count; @@ -270,17 +269,18 @@ oh_port_probe(struct platform_device *_of_dev) bool init_oh_port; const struct of_device_id *match; - uint32_t crt_ext_pools_count, ext_pool_size; - const unsigned int *port_id; - const unsigned int *channel_id; + int crt_ext_pools_count; + u32 ext_pool_size; + u32 port_id; + u32 channel_id; int channel_ids_count; int channel_idx; struct fq_duple *fqd; struct list_head *fq_list, *fq_list_tmp; - const uint32_t *bpool_cfg; - const uint32_t *bpid; + const __be32 *bpool_cfg; + uint32_t bpid; memset(&oh_port_tx_params, 0, sizeof(oh_port_tx_params)); dpa_oh_dev = &_of_dev->dev; @@ -294,49 +294,28 @@ oh_port_probe(struct platform_device *_of_dev) dev_dbg(dpa_oh_dev, "Probing OH port...\n"); /* Find the referenced OH node */ - - oh_port_handle = of_get_property(dpa_oh_node, - "fsl,fman-oh-port", &lenp); - if (oh_port_handle == NULL) { - dev_err(dpa_oh_dev, "No OH port handle found in node %s\n", - dpa_oh_node->full_name); - return -EINVAL; - } - - BUG_ON(lenp % sizeof(*oh_port_handle)); - if (lenp != sizeof(*oh_port_handle)) { - dev_err(dpa_oh_dev, - "Found %lu OH port bindings in node %s, only 1 phandle is allowed.\n", - (unsigned long int)(lenp / sizeof(*oh_port_handle)), - dpa_oh_node->full_name); - return -EINVAL; - } - - /* Read configuration for the OH port */ - oh_node = of_find_node_by_phandle(*oh_port_handle); + oh_node = of_parse_phandle(dpa_oh_node, "fsl,fman-oh-port", 0); if (oh_node == NULL) { dev_err(dpa_oh_dev, "Can't find OH node referenced from node %s\n", dpa_oh_node->full_name); return -EINVAL; } - dev_info(dpa_oh_dev, "Found OH node handle compatible with %s.\n", + dev_info(dpa_oh_dev, "Found OH node handle compatible with %s\n", match->compatible); - port_id = of_get_property(oh_node, "cell-index", &lenp); - if (port_id == NULL) { + _errno = of_property_read_u32(oh_node, "cell-index", &port_id); + if (_errno) { dev_err(dpa_oh_dev, "No port id found in node %s\n", dpa_oh_node->full_name); - _errno = -EINVAL; goto return_kfree; } - BUG_ON(lenp % sizeof(*port_id)); - channel_id = of_get_property(oh_node, "fsl,qman-channel-id", &lenp); - if (channel_id == NULL) { + _errno = of_property_read_u32(oh_node, "fsl,qman-channel-id", + &channel_id); + if (_errno) { dev_err(dpa_oh_dev, "No channel id found in node %s\n", dpa_oh_node->full_name); - _errno = -EINVAL; goto return_kfree; } @@ -383,7 +362,7 @@ oh_port_probe(struct platform_device *_of_dev) /* FQs that enter OH port */ lenp = 0; - oh_all_queues = (uint32_t *)of_get_property(dpa_oh_node, + oh_all_queues = of_get_property(dpa_oh_node, "fsl,qman-frame-queues-ingress", &lenp); if (lenp % (2 * sizeof(*oh_all_queues))) { dev_warn(dpa_oh_dev, @@ -396,8 +375,8 @@ oh_port_probe(struct platform_device *_of_dev) dev_err(dpa_oh_dev, "Allocating %d ingress frame queues duples\n", duples_count); for (duple_idx = 0; duple_idx < duples_count; duple_idx++) { - crt_fqid_base = oh_all_queues[2 * duple_idx]; - crt_fq_count = oh_all_queues[2 * duple_idx + 1]; + crt_fqid_base = be32_to_cpu(oh_all_queues[2 * duple_idx]); + crt_fq_count = be32_to_cpu(oh_all_queues[2 * duple_idx + 1]); fqd = devm_kzalloc(dpa_oh_dev, sizeof(struct fq_duple), GFP_KERNEL); @@ -423,7 +402,7 @@ oh_port_probe(struct platform_device *_of_dev) for (j = 0; j < crt_fq_count; j++) (fqd->fqs + j)->fqid = crt_fqid_base + j; fqd->fqs_count = crt_fq_count; - fqd->channel_id = (uint16_t)*channel_id; + fqd->channel_id = (uint16_t)channel_id; list_add(&fqd->fq_list, &oh_config->fqs_ingress_list); } @@ -448,7 +427,7 @@ oh_port_probe(struct platform_device *_of_dev) /* FQs that exit OH port */ lenp = 0; - oh_all_queues = (uint32_t *)of_get_property(dpa_oh_node, + oh_all_queues = of_get_property(dpa_oh_node, "fsl,qman-frame-queues-egress", &lenp); if (lenp % (2 * sizeof(*oh_all_queues))) { dev_warn(dpa_oh_dev, @@ -461,8 +440,8 @@ oh_port_probe(struct platform_device *_of_dev) dev_dbg(dpa_oh_dev, "Allocating %d egress frame queues duples\n", duples_count); for (duple_idx = 0; duple_idx < duples_count; duple_idx++) { - crt_fqid_base = oh_all_queues[2 * duple_idx]; - crt_fq_count = oh_all_queues[2 * duple_idx + 1]; + crt_fqid_base = be32_to_cpu(oh_all_queues[2 * duple_idx]); + crt_fq_count = be32_to_cpu(oh_all_queues[2 * duple_idx + 1]); fqd = devm_kzalloc(dpa_oh_dev, sizeof(struct fq_duple), GFP_KERNEL); @@ -499,7 +478,7 @@ oh_port_probe(struct platform_device *_of_dev) /* channel_ids for FQs that exit OH port */ lenp = 0; - channel_ids = (uint32_t *)of_get_property(dpa_oh_node, + channel_ids = of_get_property(dpa_oh_node, "fsl,qman-channel-ids-egress", &lenp); channel_ids_count = lenp / (sizeof(*channel_ids)); @@ -515,7 +494,8 @@ oh_port_probe(struct platform_device *_of_dev) if (channel_idx + 1 > channel_ids_count) break; fqd = list_entry(fq_list, struct fq_duple, fq_list); - fqd->channel_id = (uint16_t)channel_ids[channel_idx++]; + fqd->channel_id = + (uint16_t)be32_to_cpu(channel_ids[channel_idx++]); } /* create egress queues */ @@ -543,7 +523,7 @@ oh_port_probe(struct platform_device *_of_dev) } /* Read FQ ids/nums for the DPA OH node */ - oh_all_queues = (uint32_t *)of_get_property(dpa_oh_node, + oh_all_queues = of_get_property(dpa_oh_node, "fsl,qman-frame-queues-oh", &lenp); if (oh_all_queues == NULL) { dev_err(dpa_oh_dev, @@ -569,8 +549,8 @@ oh_port_probe(struct platform_device *_of_dev) fq_idx = 0; /* Error FQID - must be present */ - crt_fqid_base = oh_all_queues[fq_idx++]; - crt_fq_count = oh_all_queues[fq_idx++]; + crt_fqid_base = be32_to_cpu(oh_all_queues[fq_idx++]); + crt_fq_count = be32_to_cpu(oh_all_queues[fq_idx++]); if (crt_fq_count != 1) { dev_err(dpa_oh_dev, "Only 1 Error FQ allowed in OH node %s referenced from node %s (read: %d FQIDs).\n", @@ -584,8 +564,8 @@ oh_port_probe(struct platform_device *_of_dev) oh_config->error_fqid, oh_node->full_name); /* Default FQID - must be present */ - crt_fqid_base = oh_all_queues[fq_idx++]; - crt_fq_count = oh_all_queues[fq_idx++]; + crt_fqid_base = be32_to_cpu(oh_all_queues[fq_idx++]); + crt_fq_count = be32_to_cpu(oh_all_queues[fq_idx++]); if (crt_fq_count != 1) { dev_err(dpa_oh_dev, "Only 1 Default FQ allowed in OH node %s referenced from %s (read: %d FQIDs).\n", @@ -599,8 +579,8 @@ oh_port_probe(struct platform_device *_of_dev) oh_config->default_fqid, oh_node->full_name); /* TX FQID - presence is optional */ - oh_tx_queues = (uint32_t *)of_get_property(dpa_oh_node, - "fsl,qman-frame-queues-tx", &lenp); + oh_tx_queues = of_get_property(dpa_oh_node, "fsl,qman-frame-queues-tx", + &lenp); if (oh_tx_queues == NULL) { dev_dbg(dpa_oh_dev, "No tx queues have been defined for OH node %s referenced from node %s\n", @@ -619,19 +599,9 @@ oh_port_probe(struct platform_device *_of_dev) goto return_kfree; } - /* Read channel id for the queues */ - channel_id = of_get_property(oh_node, "fsl,qman-channel-id", &lenp); - if (channel_id == NULL) { - dev_err(dpa_oh_dev, "No channel id found in node %s\n", - dpa_oh_node->full_name); - _errno = -EINVAL; - goto return_kfree; - } - BUG_ON(lenp % sizeof(*channel_id)); - fq_idx = 0; - crt_fqid_base = oh_tx_queues[fq_idx++]; - crt_fq_count = oh_tx_queues[fq_idx++]; + crt_fqid_base = be32_to_cpu(oh_tx_queues[fq_idx++]); + crt_fq_count = be32_to_cpu(oh_tx_queues[fq_idx++]); oh_config->egress_cnt = crt_fq_count; /* Allocate TX queues */ @@ -649,7 +619,7 @@ oh_port_probe(struct platform_device *_of_dev) /* Create TX queues */ for (i = 0; i < crt_fq_count; i++) { ret = oh_fq_create(oh_config->egress_fqs + i, - crt_fqid_base + i, (uint16_t)*channel_id, 3); + crt_fqid_base + i, (uint16_t)channel_id, 3); if (ret != 0) { dev_err(dpa_oh_dev, "Unable to create TX frame queue %d for OH node %s referenced from node %s!\n", @@ -673,10 +643,11 @@ config_port: } oh_set_buffer_layout(oh_config->oh_port, &buf_layout); - bpool_handle = of_get_property(dpa_oh_node, - "fsl,bman-buffer-pools", &lenp); - if (bpool_handle == NULL) { + /* read the pool handlers */ + crt_ext_pools_count = of_count_phandle_with_args(dpa_oh_node, + "fsl,bman-buffer-pools", NULL); + if (crt_ext_pools_count <= 0) { dev_info(dpa_oh_dev, "OH port %s has no buffer pool. Fragmentation will not be enabled\n", oh_node->full_name); @@ -694,29 +665,29 @@ config_port: n_size = of_n_size_cells(root_node); of_node_put(root_node); - crt_ext_pools_count = lenp / sizeof(phandle); - dev_dbg(dpa_oh_dev, "OH port number of pools = %u\n", + dev_dbg(dpa_oh_dev, "OH port number of pools = %d\n", crt_ext_pools_count); oh_port_tx_params.num_pools = (uint8_t)crt_ext_pools_count; for (i = 0; i < crt_ext_pools_count; i++) { - bpool_node = of_find_node_by_phandle(bpool_handle[i]); + bpool_node = of_parse_phandle(dpa_oh_node, + "fsl,bman-buffer-pools", i); if (bpool_node == NULL) { dev_err(dpa_oh_dev, "Invalid Buffer pool node\n"); _errno = -EINVAL; goto return_kfree; } - bpid = of_get_property(bpool_node, "fsl,bpid", &lenp); - if ((bpid == NULL) || (lenp != sizeof(*bpid))) { - dev_err(dpa_oh_dev, "Invalid Buffer pool Id\n"); + _errno = of_property_read_u32(bpool_node, "fsl,bpid", &bpid); + if (_errno) { + dev_err(dpa_oh_dev, "Invalid Buffer Pool ID\n"); _errno = -EINVAL; goto return_kfree; } - oh_port_tx_params.pool_param[i].id = (uint8_t)*bpid; - dev_dbg(dpa_oh_dev, "OH port bpool id = %u\n", *bpid); + oh_port_tx_params.pool_param[i].id = (uint8_t)bpid; + dev_dbg(dpa_oh_dev, "OH port bpool id = %u\n", bpid); bpool_cfg = of_get_property(bpool_node, "fsl,bpool-ethernet-cfg", &lenp); @@ -726,7 +697,6 @@ config_port: goto return_kfree; } - of_read_number(bpool_cfg, n_size); ext_pool_size = of_read_number(bpool_cfg + n_size, n_size); oh_port_tx_params.pool_param[i].size = (uint16_t)ext_pool_size; dev_dbg(dpa_oh_dev, "OH port bpool size = %u\n", @@ -741,7 +711,7 @@ config_port: frag_enabled = true; dev_info(dpa_oh_dev, "IP Fragmentation enabled for OH port %d", - *port_id); + port_id); init_port: of_node_put(oh_node); |