diff options
author | David S. Miller <davem@davemloft.net> | 2016-10-06 20:32:05 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-10-06 20:32:05 -0400 |
commit | 00c06ed779bee562603b28b088d7a8143dd2d94f (patch) | |
tree | 3f971f44e4adef3d86103bbe3ba549c96bdcf6ea | |
parent | 4c1fad64eff481982349f5795b9c198c532b0f13 (diff) | |
parent | 2fbfadb5436a394b0aad68d21de60fe3eb9c14db (diff) |
Merge branch 'fman-next' of git://git.freescale.com/ppc/upstream/linux
Madalin Bucur says:
====================
fsl/fman: cleanup and small fixes
This series contains fixes for the DPAA FMan driver.
Adding myself as maintainer of the driver.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | MAINTAINERS | 7 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/fman/Makefile | 10 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/fman/fman.c | 78 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/fman/fman_mac.h | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/fman/fman_memac.c | 6 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/fman/fman_muram.c | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/fman/fman_muram.h | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/fman/fman_port.c | 55 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/fman/fman_sp.c | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/fman/mac.c | 83 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/fman/mac.h | 3 |
11 files changed, 139 insertions, 116 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 464437dbfa26..93f718da0de2 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -5005,6 +5005,13 @@ F: drivers/net/ethernet/freescale/fec_ptp.c | |||
5005 | F: drivers/net/ethernet/freescale/fec.h | 5005 | F: drivers/net/ethernet/freescale/fec.h |
5006 | F: Documentation/devicetree/bindings/net/fsl-fec.txt | 5006 | F: Documentation/devicetree/bindings/net/fsl-fec.txt |
5007 | 5007 | ||
5008 | FREESCALE QORIQ DPAA FMAN DRIVER | ||
5009 | M: Madalin Bucur <madalin.bucur@nxp.com> | ||
5010 | L: netdev@vger.kernel.org | ||
5011 | S: Maintained | ||
5012 | F: drivers/net/ethernet/freescale/fman | ||
5013 | F: Documentation/devicetree/bindings/powerpc/fsl/fman.txt | ||
5014 | |||
5008 | FREESCALE QUICC ENGINE LIBRARY | 5015 | FREESCALE QUICC ENGINE LIBRARY |
5009 | L: linuxppc-dev@lists.ozlabs.org | 5016 | L: linuxppc-dev@lists.ozlabs.org |
5010 | S: Orphan | 5017 | S: Orphan |
diff --git a/drivers/net/ethernet/freescale/fman/Makefile b/drivers/net/ethernet/freescale/fman/Makefile index 51fd2e6c1b84..60491779e49f 100644 --- a/drivers/net/ethernet/freescale/fman/Makefile +++ b/drivers/net/ethernet/freescale/fman/Makefile | |||
@@ -1,7 +1,9 @@ | |||
1 | subdir-ccflags-y += -I$(srctree)/drivers/net/ethernet/freescale/fman | 1 | subdir-ccflags-y += -I$(srctree)/drivers/net/ethernet/freescale/fman |
2 | 2 | ||
3 | obj-y += fsl_fman.o fsl_fman_mac.o fsl_mac.o | 3 | obj-$(CONFIG_FSL_FMAN) += fsl_fman.o |
4 | obj-$(CONFIG_FSL_FMAN) += fsl_fman_port.o | ||
5 | obj-$(CONFIG_FSL_FMAN) += fsl_mac.o | ||
4 | 6 | ||
5 | fsl_fman-objs := fman_muram.o fman.o fman_sp.o fman_port.o | 7 | fsl_fman-objs := fman_muram.o fman.o fman_sp.o |
6 | fsl_fman_mac-objs := fman_dtsec.o fman_memac.o fman_tgec.o | 8 | fsl_fman_port-objs := fman_port.o |
7 | fsl_mac-objs += mac.o | 9 | fsl_mac-objs:= mac.o fman_dtsec.o fman_memac.o fman_tgec.o |
diff --git a/drivers/net/ethernet/freescale/fman/fman.c b/drivers/net/ethernet/freescale/fman/fman.c index 1de2e1e51c2b..dafd9e1baba2 100644 --- a/drivers/net/ethernet/freescale/fman/fman.c +++ b/drivers/net/ethernet/freescale/fman/fman.c | |||
@@ -618,7 +618,7 @@ struct fman { | |||
618 | unsigned long cam_offset; | 618 | unsigned long cam_offset; |
619 | size_t cam_size; | 619 | size_t cam_size; |
620 | /* Fifo in MURAM */ | 620 | /* Fifo in MURAM */ |
621 | int fifo_offset; | 621 | unsigned long fifo_offset; |
622 | size_t fifo_size; | 622 | size_t fifo_size; |
623 | 623 | ||
624 | u32 liodn_base[64]; | 624 | u32 liodn_base[64]; |
@@ -2036,7 +2036,7 @@ static int fman_init(struct fman *fman) | |||
2036 | /* allocate MURAM for FIFO according to total size */ | 2036 | /* allocate MURAM for FIFO according to total size */ |
2037 | fman->fifo_offset = fman_muram_alloc(fman->muram, | 2037 | fman->fifo_offset = fman_muram_alloc(fman->muram, |
2038 | fman->state->total_fifo_size); | 2038 | fman->state->total_fifo_size); |
2039 | if (IS_ERR_VALUE(fman->cam_offset)) { | 2039 | if (IS_ERR_VALUE(fman->fifo_offset)) { |
2040 | free_init_resources(fman); | 2040 | free_init_resources(fman); |
2041 | dev_err(fman->dev, "%s: MURAM alloc for BMI FIFO failed\n", | 2041 | dev_err(fman->dev, "%s: MURAM alloc for BMI FIFO failed\n", |
2042 | __func__); | 2042 | __func__); |
@@ -2115,6 +2115,7 @@ void fman_register_intr(struct fman *fman, enum fman_event_modules module, | |||
2115 | fman->intr_mng[event].isr_cb = isr_cb; | 2115 | fman->intr_mng[event].isr_cb = isr_cb; |
2116 | fman->intr_mng[event].src_handle = src_arg; | 2116 | fman->intr_mng[event].src_handle = src_arg; |
2117 | } | 2117 | } |
2118 | EXPORT_SYMBOL(fman_register_intr); | ||
2118 | 2119 | ||
2119 | /** | 2120 | /** |
2120 | * fman_unregister_intr | 2121 | * fman_unregister_intr |
@@ -2138,6 +2139,7 @@ void fman_unregister_intr(struct fman *fman, enum fman_event_modules module, | |||
2138 | fman->intr_mng[event].isr_cb = NULL; | 2139 | fman->intr_mng[event].isr_cb = NULL; |
2139 | fman->intr_mng[event].src_handle = NULL; | 2140 | fman->intr_mng[event].src_handle = NULL; |
2140 | } | 2141 | } |
2142 | EXPORT_SYMBOL(fman_unregister_intr); | ||
2141 | 2143 | ||
2142 | /** | 2144 | /** |
2143 | * fman_set_port_params | 2145 | * fman_set_port_params |
@@ -2241,6 +2243,7 @@ return_err: | |||
2241 | spin_unlock_irqrestore(&fman->spinlock, flags); | 2243 | spin_unlock_irqrestore(&fman->spinlock, flags); |
2242 | return err; | 2244 | return err; |
2243 | } | 2245 | } |
2246 | EXPORT_SYMBOL(fman_set_port_params); | ||
2244 | 2247 | ||
2245 | /** | 2248 | /** |
2246 | * fman_reset_mac | 2249 | * fman_reset_mac |
@@ -2310,6 +2313,7 @@ int fman_reset_mac(struct fman *fman, u8 mac_id) | |||
2310 | 2313 | ||
2311 | return 0; | 2314 | return 0; |
2312 | } | 2315 | } |
2316 | EXPORT_SYMBOL(fman_reset_mac); | ||
2313 | 2317 | ||
2314 | /** | 2318 | /** |
2315 | * fman_set_mac_max_frame | 2319 | * fman_set_mac_max_frame |
@@ -2327,8 +2331,7 @@ int fman_set_mac_max_frame(struct fman *fman, u8 mac_id, u16 mfl) | |||
2327 | * or equal to the port's max | 2331 | * or equal to the port's max |
2328 | */ | 2332 | */ |
2329 | if ((!fman->state->port_mfl[mac_id]) || | 2333 | if ((!fman->state->port_mfl[mac_id]) || |
2330 | (fman->state->port_mfl[mac_id] && | 2334 | (mfl <= fman->state->port_mfl[mac_id])) { |
2331 | (mfl <= fman->state->port_mfl[mac_id]))) { | ||
2332 | fman->state->mac_mfl[mac_id] = mfl; | 2335 | fman->state->mac_mfl[mac_id] = mfl; |
2333 | } else { | 2336 | } else { |
2334 | dev_warn(fman->dev, "%s: MAC max_frame_length is larger than Port max_frame_length\n", | 2337 | dev_warn(fman->dev, "%s: MAC max_frame_length is larger than Port max_frame_length\n", |
@@ -2337,6 +2340,7 @@ int fman_set_mac_max_frame(struct fman *fman, u8 mac_id, u16 mfl) | |||
2337 | } | 2340 | } |
2338 | return 0; | 2341 | return 0; |
2339 | } | 2342 | } |
2343 | EXPORT_SYMBOL(fman_set_mac_max_frame); | ||
2340 | 2344 | ||
2341 | /** | 2345 | /** |
2342 | * fman_get_clock_freq | 2346 | * fman_get_clock_freq |
@@ -2363,6 +2367,7 @@ u32 fman_get_bmi_max_fifo_size(struct fman *fman) | |||
2363 | { | 2367 | { |
2364 | return fman->state->bmi_max_fifo_size; | 2368 | return fman->state->bmi_max_fifo_size; |
2365 | } | 2369 | } |
2370 | EXPORT_SYMBOL(fman_get_bmi_max_fifo_size); | ||
2366 | 2371 | ||
2367 | /** | 2372 | /** |
2368 | * fman_get_revision | 2373 | * fman_get_revision |
@@ -2384,6 +2389,7 @@ void fman_get_revision(struct fman *fman, struct fman_rev_info *rev_info) | |||
2384 | FPM_REV1_MAJOR_SHIFT); | 2389 | FPM_REV1_MAJOR_SHIFT); |
2385 | rev_info->minor = tmp & FPM_REV1_MINOR_MASK; | 2390 | rev_info->minor = tmp & FPM_REV1_MINOR_MASK; |
2386 | } | 2391 | } |
2392 | EXPORT_SYMBOL(fman_get_revision); | ||
2387 | 2393 | ||
2388 | /** | 2394 | /** |
2389 | * fman_get_qman_channel_id | 2395 | * fman_get_qman_channel_id |
@@ -2419,6 +2425,7 @@ u32 fman_get_qman_channel_id(struct fman *fman, u32 port_id) | |||
2419 | 2425 | ||
2420 | return fman->state->qman_channel_base + i; | 2426 | return fman->state->qman_channel_base + i; |
2421 | } | 2427 | } |
2428 | EXPORT_SYMBOL(fman_get_qman_channel_id); | ||
2422 | 2429 | ||
2423 | /** | 2430 | /** |
2424 | * fman_get_mem_region | 2431 | * fman_get_mem_region |
@@ -2432,6 +2439,7 @@ struct resource *fman_get_mem_region(struct fman *fman) | |||
2432 | { | 2439 | { |
2433 | return fman->state->res; | 2440 | return fman->state->res; |
2434 | } | 2441 | } |
2442 | EXPORT_SYMBOL(fman_get_mem_region); | ||
2435 | 2443 | ||
2436 | /* Bootargs defines */ | 2444 | /* Bootargs defines */ |
2437 | /* Extra headroom for RX buffers - Default, min and max */ | 2445 | /* Extra headroom for RX buffers - Default, min and max */ |
@@ -2453,7 +2461,7 @@ struct resource *fman_get_mem_region(struct fman *fman) | |||
2453 | * particular forwarding scenarios that add extra headers to the | 2461 | * particular forwarding scenarios that add extra headers to the |
2454 | * forwarded frame. | 2462 | * forwarded frame. |
2455 | */ | 2463 | */ |
2456 | int fsl_fm_rx_extra_headroom = FSL_FM_RX_EXTRA_HEADROOM; | 2464 | static int fsl_fm_rx_extra_headroom = FSL_FM_RX_EXTRA_HEADROOM; |
2457 | module_param(fsl_fm_rx_extra_headroom, int, 0); | 2465 | module_param(fsl_fm_rx_extra_headroom, int, 0); |
2458 | MODULE_PARM_DESC(fsl_fm_rx_extra_headroom, "Extra headroom for Rx buffers"); | 2466 | MODULE_PARM_DESC(fsl_fm_rx_extra_headroom, "Extra headroom for Rx buffers"); |
2459 | 2467 | ||
@@ -2466,7 +2474,7 @@ MODULE_PARM_DESC(fsl_fm_rx_extra_headroom, "Extra headroom for Rx buffers"); | |||
2466 | * Could be overridden once, at boot-time, via the | 2474 | * Could be overridden once, at boot-time, via the |
2467 | * fm_set_max_frm() callback. | 2475 | * fm_set_max_frm() callback. |
2468 | */ | 2476 | */ |
2469 | int fsl_fm_max_frm = FSL_FM_MAX_FRAME_SIZE; | 2477 | static int fsl_fm_max_frm = FSL_FM_MAX_FRAME_SIZE; |
2470 | module_param(fsl_fm_max_frm, int, 0); | 2478 | module_param(fsl_fm_max_frm, int, 0); |
2471 | MODULE_PARM_DESC(fsl_fm_max_frm, "Maximum frame size, across all interfaces"); | 2479 | MODULE_PARM_DESC(fsl_fm_max_frm, "Maximum frame size, across all interfaces"); |
2472 | 2480 | ||
@@ -2538,6 +2546,7 @@ struct fman *fman_bind(struct device *fm_dev) | |||
2538 | { | 2546 | { |
2539 | return (struct fman *)(dev_get_drvdata(get_device(fm_dev))); | 2547 | return (struct fman *)(dev_get_drvdata(get_device(fm_dev))); |
2540 | } | 2548 | } |
2549 | EXPORT_SYMBOL(fman_bind); | ||
2541 | 2550 | ||
2542 | static irqreturn_t fman_err_irq(int irq, void *handle) | 2551 | static irqreturn_t fman_err_irq(int irq, void *handle) |
2543 | { | 2552 | { |
@@ -2727,8 +2736,8 @@ static struct fman *read_dts_node(struct platform_device *of_dev) | |||
2727 | struct fman *fman; | 2736 | struct fman *fman; |
2728 | struct device_node *fm_node, *muram_node; | 2737 | struct device_node *fm_node, *muram_node; |
2729 | struct resource *res; | 2738 | struct resource *res; |
2730 | const u32 *u32_prop; | 2739 | u32 val, range[2]; |
2731 | int lenp, err, irq; | 2740 | int err, irq; |
2732 | struct clk *clk; | 2741 | struct clk *clk; |
2733 | u32 clk_rate; | 2742 | u32 clk_rate; |
2734 | phys_addr_t phys_base_addr; | 2743 | phys_addr_t phys_base_addr; |
@@ -2740,16 +2749,13 @@ static struct fman *read_dts_node(struct platform_device *of_dev) | |||
2740 | 2749 | ||
2741 | fm_node = of_node_get(of_dev->dev.of_node); | 2750 | fm_node = of_node_get(of_dev->dev.of_node); |
2742 | 2751 | ||
2743 | u32_prop = (const u32 *)of_get_property(fm_node, "cell-index", &lenp); | 2752 | err = of_property_read_u32(fm_node, "cell-index", &val); |
2744 | if (!u32_prop) { | 2753 | if (err) { |
2745 | dev_err(&of_dev->dev, "%s: of_get_property(%s, cell-index) failed\n", | 2754 | dev_err(&of_dev->dev, "%s: failed to read cell-index for %s\n", |
2746 | __func__, fm_node->full_name); | 2755 | __func__, fm_node->full_name); |
2747 | goto fman_node_put; | 2756 | goto fman_node_put; |
2748 | } | 2757 | } |
2749 | if (WARN_ON(lenp != sizeof(u32))) | 2758 | fman->dts_params.id = (u8)val; |
2750 | goto fman_node_put; | ||
2751 | |||
2752 | fman->dts_params.id = (u8)fdt32_to_cpu(u32_prop[0]); | ||
2753 | 2759 | ||
2754 | /* Get the FM interrupt */ | 2760 | /* Get the FM interrupt */ |
2755 | res = platform_get_resource(of_dev, IORESOURCE_IRQ, 0); | 2761 | res = platform_get_resource(of_dev, IORESOURCE_IRQ, 0); |
@@ -2796,18 +2802,15 @@ static struct fman *read_dts_node(struct platform_device *of_dev) | |||
2796 | /* Rounding to MHz */ | 2802 | /* Rounding to MHz */ |
2797 | fman->dts_params.clk_freq = DIV_ROUND_UP(clk_rate, 1000000); | 2803 | fman->dts_params.clk_freq = DIV_ROUND_UP(clk_rate, 1000000); |
2798 | 2804 | ||
2799 | u32_prop = (const u32 *)of_get_property(fm_node, | 2805 | err = of_property_read_u32_array(fm_node, "fsl,qman-channel-range", |
2800 | "fsl,qman-channel-range", | 2806 | &range[0], 2); |
2801 | &lenp); | 2807 | if (err) { |
2802 | if (!u32_prop) { | 2808 | dev_err(&of_dev->dev, "%s: failed to read fsl,qman-channel-range for %s\n", |
2803 | dev_err(&of_dev->dev, "%s: of_get_property(%s, fsl,qman-channel-range) failed\n", | ||
2804 | __func__, fm_node->full_name); | 2809 | __func__, fm_node->full_name); |
2805 | goto fman_node_put; | 2810 | goto fman_node_put; |
2806 | } | 2811 | } |
2807 | if (WARN_ON(lenp != sizeof(u32) * 2)) | 2812 | fman->dts_params.qman_channel_base = range[0]; |
2808 | goto fman_node_put; | 2813 | fman->dts_params.num_of_qman_channels = range[1]; |
2809 | fman->dts_params.qman_channel_base = fdt32_to_cpu(u32_prop[0]); | ||
2810 | fman->dts_params.num_of_qman_channels = fdt32_to_cpu(u32_prop[1]); | ||
2811 | 2814 | ||
2812 | /* Get the MURAM base address and size */ | 2815 | /* Get the MURAM base address and size */ |
2813 | muram_node = of_find_matching_node(fm_node, fman_muram_match); | 2816 | muram_node = of_find_matching_node(fm_node, fman_muram_match); |
@@ -2858,7 +2861,7 @@ static struct fman *read_dts_node(struct platform_device *of_dev) | |||
2858 | 2861 | ||
2859 | fman->dts_params.base_addr = | 2862 | fman->dts_params.base_addr = |
2860 | devm_ioremap(&of_dev->dev, phys_base_addr, mem_size); | 2863 | devm_ioremap(&of_dev->dev, phys_base_addr, mem_size); |
2861 | if (fman->dts_params.base_addr == 0) { | 2864 | if (!fman->dts_params.base_addr) { |
2862 | dev_err(&of_dev->dev, "%s: devm_ioremap() failed\n", __func__); | 2865 | dev_err(&of_dev->dev, "%s: devm_ioremap() failed\n", __func__); |
2863 | goto fman_free; | 2866 | goto fman_free; |
2864 | } | 2867 | } |
@@ -2930,7 +2933,7 @@ static const struct of_device_id fman_match[] = { | |||
2930 | {} | 2933 | {} |
2931 | }; | 2934 | }; |
2932 | 2935 | ||
2933 | MODULE_DEVICE_TABLE(of, fm_match); | 2936 | MODULE_DEVICE_TABLE(of, fman_match); |
2934 | 2937 | ||
2935 | static struct platform_driver fman_driver = { | 2938 | static struct platform_driver fman_driver = { |
2936 | .driver = { | 2939 | .driver = { |
@@ -2940,4 +2943,25 @@ static struct platform_driver fman_driver = { | |||
2940 | .probe = fman_probe, | 2943 | .probe = fman_probe, |
2941 | }; | 2944 | }; |
2942 | 2945 | ||
2943 | builtin_platform_driver(fman_driver); | 2946 | static int __init fman_load(void) |
2947 | { | ||
2948 | int err; | ||
2949 | |||
2950 | pr_debug("FSL DPAA FMan driver\n"); | ||
2951 | |||
2952 | err = platform_driver_register(&fman_driver); | ||
2953 | if (err < 0) | ||
2954 | pr_err("Error, platform_driver_register() = %d\n", err); | ||
2955 | |||
2956 | return err; | ||
2957 | } | ||
2958 | module_init(fman_load); | ||
2959 | |||
2960 | static void __exit fman_unload(void) | ||
2961 | { | ||
2962 | platform_driver_unregister(&fman_driver); | ||
2963 | } | ||
2964 | module_exit(fman_unload); | ||
2965 | |||
2966 | MODULE_LICENSE("Dual BSD/GPL"); | ||
2967 | MODULE_DESCRIPTION("Freescale DPAA Frame Manager driver"); | ||
diff --git a/drivers/net/ethernet/freescale/fman/fman_mac.h b/drivers/net/ethernet/freescale/fman/fman_mac.h index ddf0260176c9..dd6d0526f6c1 100644 --- a/drivers/net/ethernet/freescale/fman/fman_mac.h +++ b/drivers/net/ethernet/freescale/fman/fman_mac.h | |||
@@ -191,10 +191,6 @@ struct fman_mac_params { | |||
191 | u16 max_speed; | 191 | u16 max_speed; |
192 | /* A handle to the FM object this port related to */ | 192 | /* A handle to the FM object this port related to */ |
193 | void *fm; | 193 | void *fm; |
194 | /* MDIO exceptions interrupt source - not valid for all | ||
195 | * MACs; MUST be set to 0 for MACs that don't have | ||
196 | * mdio-irq, or for polling | ||
197 | */ | ||
198 | void *dev_id; /* device cookie used by the exception cbs */ | 194 | void *dev_id; /* device cookie used by the exception cbs */ |
199 | fman_mac_exception_cb *event_cb; /* MDIO Events Callback Routine */ | 195 | fman_mac_exception_cb *event_cb; /* MDIO Events Callback Routine */ |
200 | fman_mac_exception_cb *exception_cb;/* Exception Callback Routine */ | 196 | fman_mac_exception_cb *exception_cb;/* Exception Callback Routine */ |
diff --git a/drivers/net/ethernet/freescale/fman/fman_memac.c b/drivers/net/ethernet/freescale/fman/fman_memac.c index 45e98fd8b79e..53ef51e3bd9e 100644 --- a/drivers/net/ethernet/freescale/fman/fman_memac.c +++ b/drivers/net/ethernet/freescale/fman/fman_memac.c | |||
@@ -507,6 +507,9 @@ static void setup_sgmii_internal_phy(struct fman_mac *memac, | |||
507 | { | 507 | { |
508 | u16 tmp_reg16; | 508 | u16 tmp_reg16; |
509 | 509 | ||
510 | if (WARN_ON(!memac->pcsphy)) | ||
511 | return; | ||
512 | |||
510 | /* SGMII mode */ | 513 | /* SGMII mode */ |
511 | tmp_reg16 = IF_MODE_SGMII_EN; | 514 | tmp_reg16 = IF_MODE_SGMII_EN; |
512 | if (!fixed_link) | 515 | if (!fixed_link) |
@@ -1151,7 +1154,8 @@ struct fman_mac *memac_config(struct fman_mac_params *params) | |||
1151 | /* Save FMan revision */ | 1154 | /* Save FMan revision */ |
1152 | fman_get_revision(memac->fm, &memac->fm_rev_info); | 1155 | fman_get_revision(memac->fm, &memac->fm_rev_info); |
1153 | 1156 | ||
1154 | if (memac->phy_if == PHY_INTERFACE_MODE_SGMII) { | 1157 | if (memac->phy_if == PHY_INTERFACE_MODE_SGMII || |
1158 | memac->phy_if == PHY_INTERFACE_MODE_QSGMII) { | ||
1155 | if (!params->internal_phy_node) { | 1159 | if (!params->internal_phy_node) { |
1156 | pr_err("PCS PHY node is not available\n"); | 1160 | pr_err("PCS PHY node is not available\n"); |
1157 | memac_free(memac); | 1161 | memac_free(memac); |
diff --git a/drivers/net/ethernet/freescale/fman/fman_muram.c b/drivers/net/ethernet/freescale/fman/fman_muram.c index 47394c45b6e8..5ec94d243da0 100644 --- a/drivers/net/ethernet/freescale/fman/fman_muram.c +++ b/drivers/net/ethernet/freescale/fman/fman_muram.c | |||
@@ -150,7 +150,8 @@ unsigned long fman_muram_alloc(struct muram_info *muram, size_t size) | |||
150 | * | 150 | * |
151 | * Free an allocated memory from FM-MURAM partition. | 151 | * Free an allocated memory from FM-MURAM partition. |
152 | */ | 152 | */ |
153 | void fman_muram_free_mem(struct muram_info *muram, unsigned long offset, size_t size) | 153 | void fman_muram_free_mem(struct muram_info *muram, unsigned long offset, |
154 | size_t size) | ||
154 | { | 155 | { |
155 | unsigned long addr = fman_muram_offset_to_vbase(muram, offset); | 156 | unsigned long addr = fman_muram_offset_to_vbase(muram, offset); |
156 | 157 | ||
diff --git a/drivers/net/ethernet/freescale/fman/fman_muram.h b/drivers/net/ethernet/freescale/fman/fman_muram.h index 889649ad8931..453bf849eee1 100644 --- a/drivers/net/ethernet/freescale/fman/fman_muram.h +++ b/drivers/net/ethernet/freescale/fman/fman_muram.h | |||
@@ -46,6 +46,7 @@ unsigned long fman_muram_offset_to_vbase(struct muram_info *muram, | |||
46 | 46 | ||
47 | unsigned long fman_muram_alloc(struct muram_info *muram, size_t size); | 47 | unsigned long fman_muram_alloc(struct muram_info *muram, size_t size); |
48 | 48 | ||
49 | void fman_muram_free_mem(struct muram_info *muram, unsigned long offset, size_t size); | 49 | void fman_muram_free_mem(struct muram_info *muram, unsigned long offset, |
50 | size_t size); | ||
50 | 51 | ||
51 | #endif /* __FM_MURAM_EXT */ | 52 | #endif /* __FM_MURAM_EXT */ |
diff --git a/drivers/net/ethernet/freescale/fman/fman_port.c b/drivers/net/ethernet/freescale/fman/fman_port.c index 70c198d072dc..9f3bb50a2365 100644 --- a/drivers/net/ethernet/freescale/fman/fman_port.c +++ b/drivers/net/ethernet/freescale/fman/fman_port.c | |||
@@ -1477,7 +1477,8 @@ EXPORT_SYMBOL(fman_port_cfg_buf_prefix_content); | |||
1477 | */ | 1477 | */ |
1478 | int fman_port_disable(struct fman_port *port) | 1478 | int fman_port_disable(struct fman_port *port) |
1479 | { | 1479 | { |
1480 | u32 __iomem *bmi_cfg_reg, *bmi_status_reg, tmp; | 1480 | u32 __iomem *bmi_cfg_reg, *bmi_status_reg; |
1481 | u32 tmp; | ||
1481 | bool rx_port, failure = false; | 1482 | bool rx_port, failure = false; |
1482 | int count; | 1483 | int count; |
1483 | 1484 | ||
@@ -1553,7 +1554,8 @@ EXPORT_SYMBOL(fman_port_disable); | |||
1553 | */ | 1554 | */ |
1554 | int fman_port_enable(struct fman_port *port) | 1555 | int fman_port_enable(struct fman_port *port) |
1555 | { | 1556 | { |
1556 | u32 __iomem *bmi_cfg_reg, tmp; | 1557 | u32 __iomem *bmi_cfg_reg; |
1558 | u32 tmp; | ||
1557 | bool rx_port; | 1559 | bool rx_port; |
1558 | 1560 | ||
1559 | if (!is_init_done(port->cfg)) | 1561 | if (!is_init_done(port->cfg)) |
@@ -1623,7 +1625,7 @@ static int fman_port_probe(struct platform_device *of_dev) | |||
1623 | struct device_node *fm_node, *port_node; | 1625 | struct device_node *fm_node, *port_node; |
1624 | struct resource res; | 1626 | struct resource res; |
1625 | struct resource *dev_res; | 1627 | struct resource *dev_res; |
1626 | const u32 *u32_prop; | 1628 | u32 val; |
1627 | int err = 0, lenp; | 1629 | int err = 0, lenp; |
1628 | enum fman_port_type port_type; | 1630 | enum fman_port_type port_type; |
1629 | u16 port_speed; | 1631 | u16 port_speed; |
@@ -1652,28 +1654,20 @@ static int fman_port_probe(struct platform_device *of_dev) | |||
1652 | goto return_err; | 1654 | goto return_err; |
1653 | } | 1655 | } |
1654 | 1656 | ||
1655 | u32_prop = (const u32 *)of_get_property(port_node, "cell-index", &lenp); | 1657 | err = of_property_read_u32(port_node, "cell-index", &val); |
1656 | if (!u32_prop) { | 1658 | if (err) { |
1657 | dev_err(port->dev, "%s: of_get_property(%s, cell-index) failed\n", | 1659 | dev_err(port->dev, "%s: reading cell-index for %s failed\n", |
1658 | __func__, port_node->full_name); | 1660 | __func__, port_node->full_name); |
1659 | err = -EINVAL; | 1661 | err = -EINVAL; |
1660 | goto return_err; | 1662 | goto return_err; |
1661 | } | 1663 | } |
1662 | if (WARN_ON(lenp != sizeof(u32))) { | 1664 | port_id = (u8)val; |
1663 | err = -EINVAL; | ||
1664 | goto return_err; | ||
1665 | } | ||
1666 | port_id = (u8)fdt32_to_cpu(u32_prop[0]); | ||
1667 | |||
1668 | port->dts_params.id = port_id; | 1665 | port->dts_params.id = port_id; |
1669 | 1666 | ||
1670 | if (of_device_is_compatible(port_node, "fsl,fman-v3-port-tx")) { | 1667 | if (of_device_is_compatible(port_node, "fsl,fman-v3-port-tx")) { |
1671 | port_type = FMAN_PORT_TYPE_TX; | 1668 | port_type = FMAN_PORT_TYPE_TX; |
1672 | port_speed = 1000; | 1669 | port_speed = 1000; |
1673 | u32_prop = (const u32 *)of_get_property(port_node, | 1670 | if (of_find_property(port_node, "fsl,fman-10g-port", &lenp)) |
1674 | "fsl,fman-10g-port", | ||
1675 | &lenp); | ||
1676 | if (u32_prop) | ||
1677 | port_speed = 10000; | 1671 | port_speed = 10000; |
1678 | 1672 | ||
1679 | } else if (of_device_is_compatible(port_node, "fsl,fman-v2-port-tx")) { | 1673 | } else if (of_device_is_compatible(port_node, "fsl,fman-v2-port-tx")) { |
@@ -1686,9 +1680,7 @@ static int fman_port_probe(struct platform_device *of_dev) | |||
1686 | } else if (of_device_is_compatible(port_node, "fsl,fman-v3-port-rx")) { | 1680 | } else if (of_device_is_compatible(port_node, "fsl,fman-v3-port-rx")) { |
1687 | port_type = FMAN_PORT_TYPE_RX; | 1681 | port_type = FMAN_PORT_TYPE_RX; |
1688 | port_speed = 1000; | 1682 | port_speed = 1000; |
1689 | u32_prop = (const u32 *)of_get_property(port_node, | 1683 | if (of_find_property(port_node, "fsl,fman-10g-port", &lenp)) |
1690 | "fsl,fman-10g-port", &lenp); | ||
1691 | if (u32_prop) | ||
1692 | port_speed = 10000; | 1684 | port_speed = 10000; |
1693 | 1685 | ||
1694 | } else if (of_device_is_compatible(port_node, "fsl,fman-v2-port-rx")) { | 1686 | } else if (of_device_is_compatible(port_node, "fsl,fman-v2-port-rx")) { |
@@ -1743,7 +1735,7 @@ static int fman_port_probe(struct platform_device *of_dev) | |||
1743 | 1735 | ||
1744 | port->dts_params.base_addr = devm_ioremap(port->dev, res.start, | 1736 | port->dts_params.base_addr = devm_ioremap(port->dev, res.start, |
1745 | resource_size(&res)); | 1737 | resource_size(&res)); |
1746 | if (port->dts_params.base_addr == 0) | 1738 | if (!port->dts_params.base_addr) |
1747 | dev_err(port->dev, "%s: devm_ioremap() failed\n", __func__); | 1739 | dev_err(port->dev, "%s: devm_ioremap() failed\n", __func__); |
1748 | 1740 | ||
1749 | dev_set_drvdata(&of_dev->dev, port); | 1741 | dev_set_drvdata(&of_dev->dev, port); |
@@ -1775,4 +1767,25 @@ static struct platform_driver fman_port_driver = { | |||
1775 | .probe = fman_port_probe, | 1767 | .probe = fman_port_probe, |
1776 | }; | 1768 | }; |
1777 | 1769 | ||
1778 | builtin_platform_driver(fman_port_driver); | 1770 | static int __init fman_port_load(void) |
1771 | { | ||
1772 | int err; | ||
1773 | |||
1774 | pr_debug("FSL DPAA FMan driver\n"); | ||
1775 | |||
1776 | err = platform_driver_register(&fman_port_driver); | ||
1777 | if (err < 0) | ||
1778 | pr_err("Error, platform_driver_register() = %d\n", err); | ||
1779 | |||
1780 | return err; | ||
1781 | } | ||
1782 | module_init(fman_port_load); | ||
1783 | |||
1784 | static void __exit fman_port_unload(void) | ||
1785 | { | ||
1786 | platform_driver_unregister(&fman_port_driver); | ||
1787 | } | ||
1788 | module_exit(fman_port_unload); | ||
1789 | |||
1790 | MODULE_LICENSE("Dual BSD/GPL"); | ||
1791 | MODULE_DESCRIPTION("Freescale DPAA Frame Manager Port driver"); | ||
diff --git a/drivers/net/ethernet/freescale/fman/fman_sp.c b/drivers/net/ethernet/freescale/fman/fman_sp.c index f9e7aa385cba..248f5bcca468 100644 --- a/drivers/net/ethernet/freescale/fman/fman_sp.c +++ b/drivers/net/ethernet/freescale/fman/fman_sp.c | |||
@@ -80,6 +80,7 @@ void fman_sp_set_buf_pools_in_asc_order_of_buf_sizes(struct fman_ext_pools | |||
80 | } | 80 | } |
81 | } | 81 | } |
82 | } | 82 | } |
83 | EXPORT_SYMBOL(fman_sp_set_buf_pools_in_asc_order_of_buf_sizes); | ||
83 | 84 | ||
84 | int fman_sp_build_buffer_struct(struct fman_sp_int_context_data_copy * | 85 | int fman_sp_build_buffer_struct(struct fman_sp_int_context_data_copy * |
85 | int_context_data_copy, | 86 | int_context_data_copy, |
@@ -164,3 +165,5 @@ int fman_sp_build_buffer_struct(struct fman_sp_int_context_data_copy * | |||
164 | 165 | ||
165 | return 0; | 166 | return 0; |
166 | } | 167 | } |
168 | EXPORT_SYMBOL(fman_sp_build_buffer_struct); | ||
169 | |||
diff --git a/drivers/net/ethernet/freescale/fman/mac.c b/drivers/net/ethernet/freescale/fman/mac.c index e33d9d24c1db..8fe6b3e253fa 100644 --- a/drivers/net/ethernet/freescale/fman/mac.c +++ b/drivers/net/ethernet/freescale/fman/mac.c | |||
@@ -469,9 +469,9 @@ static void adjust_link_memac(struct net_device *net_dev) | |||
469 | /* Initializes driver's PHY state, and attaches to the PHY. | 469 | /* Initializes driver's PHY state, and attaches to the PHY. |
470 | * Returns 0 on success. | 470 | * Returns 0 on success. |
471 | */ | 471 | */ |
472 | static int init_phy(struct net_device *net_dev, | 472 | static struct phy_device *init_phy(struct net_device *net_dev, |
473 | struct mac_device *mac_dev, | 473 | struct mac_device *mac_dev, |
474 | void (*adj_lnk)(struct net_device *)) | 474 | void (*adj_lnk)(struct net_device *)) |
475 | { | 475 | { |
476 | struct phy_device *phy_dev; | 476 | struct phy_device *phy_dev; |
477 | struct mac_priv_s *priv = mac_dev->priv; | 477 | struct mac_priv_s *priv = mac_dev->priv; |
@@ -480,7 +480,7 @@ static int init_phy(struct net_device *net_dev, | |||
480 | priv->phy_if); | 480 | priv->phy_if); |
481 | if (!phy_dev) { | 481 | if (!phy_dev) { |
482 | netdev_err(net_dev, "Could not connect to PHY\n"); | 482 | netdev_err(net_dev, "Could not connect to PHY\n"); |
483 | return -ENODEV; | 483 | return NULL; |
484 | } | 484 | } |
485 | 485 | ||
486 | /* Remove any features not supported by the controller */ | 486 | /* Remove any features not supported by the controller */ |
@@ -493,23 +493,23 @@ static int init_phy(struct net_device *net_dev, | |||
493 | 493 | ||
494 | mac_dev->phy_dev = phy_dev; | 494 | mac_dev->phy_dev = phy_dev; |
495 | 495 | ||
496 | return 0; | 496 | return phy_dev; |
497 | } | 497 | } |
498 | 498 | ||
499 | static int dtsec_init_phy(struct net_device *net_dev, | 499 | static struct phy_device *dtsec_init_phy(struct net_device *net_dev, |
500 | struct mac_device *mac_dev) | 500 | struct mac_device *mac_dev) |
501 | { | 501 | { |
502 | return init_phy(net_dev, mac_dev, &adjust_link_dtsec); | 502 | return init_phy(net_dev, mac_dev, &adjust_link_dtsec); |
503 | } | 503 | } |
504 | 504 | ||
505 | static int tgec_init_phy(struct net_device *net_dev, | 505 | static struct phy_device *tgec_init_phy(struct net_device *net_dev, |
506 | struct mac_device *mac_dev) | 506 | struct mac_device *mac_dev) |
507 | { | 507 | { |
508 | return init_phy(net_dev, mac_dev, adjust_link_void); | 508 | return init_phy(net_dev, mac_dev, adjust_link_void); |
509 | } | 509 | } |
510 | 510 | ||
511 | static int memac_init_phy(struct net_device *net_dev, | 511 | static struct phy_device *memac_init_phy(struct net_device *net_dev, |
512 | struct mac_device *mac_dev) | 512 | struct mac_device *mac_dev) |
513 | { | 513 | { |
514 | return init_phy(net_dev, mac_dev, &adjust_link_memac); | 514 | return init_phy(net_dev, mac_dev, &adjust_link_memac); |
515 | } | 515 | } |
@@ -583,31 +583,6 @@ static void setup_memac(struct mac_device *mac_dev) | |||
583 | 583 | ||
584 | static DEFINE_MUTEX(eth_lock); | 584 | static DEFINE_MUTEX(eth_lock); |
585 | 585 | ||
586 | static const char phy_str[][11] = { | ||
587 | [PHY_INTERFACE_MODE_MII] = "mii", | ||
588 | [PHY_INTERFACE_MODE_GMII] = "gmii", | ||
589 | [PHY_INTERFACE_MODE_SGMII] = "sgmii", | ||
590 | [PHY_INTERFACE_MODE_TBI] = "tbi", | ||
591 | [PHY_INTERFACE_MODE_RMII] = "rmii", | ||
592 | [PHY_INTERFACE_MODE_RGMII] = "rgmii", | ||
593 | [PHY_INTERFACE_MODE_RGMII_ID] = "rgmii-id", | ||
594 | [PHY_INTERFACE_MODE_RGMII_RXID] = "rgmii-rxid", | ||
595 | [PHY_INTERFACE_MODE_RGMII_TXID] = "rgmii-txid", | ||
596 | [PHY_INTERFACE_MODE_RTBI] = "rtbi", | ||
597 | [PHY_INTERFACE_MODE_XGMII] = "xgmii" | ||
598 | }; | ||
599 | |||
600 | static phy_interface_t __pure __attribute__((nonnull)) str2phy(const char *str) | ||
601 | { | ||
602 | int i; | ||
603 | |||
604 | for (i = 0; i < ARRAY_SIZE(phy_str); i++) | ||
605 | if (strcmp(str, phy_str[i]) == 0) | ||
606 | return (phy_interface_t)i; | ||
607 | |||
608 | return PHY_INTERFACE_MODE_MII; | ||
609 | } | ||
610 | |||
611 | static const u16 phy2speed[] = { | 586 | static const u16 phy2speed[] = { |
612 | [PHY_INTERFACE_MODE_MII] = SPEED_100, | 587 | [PHY_INTERFACE_MODE_MII] = SPEED_100, |
613 | [PHY_INTERFACE_MODE_GMII] = SPEED_1000, | 588 | [PHY_INTERFACE_MODE_GMII] = SPEED_1000, |
@@ -678,7 +653,7 @@ MODULE_DEVICE_TABLE(of, mac_match); | |||
678 | 653 | ||
679 | static int mac_probe(struct platform_device *_of_dev) | 654 | static int mac_probe(struct platform_device *_of_dev) |
680 | { | 655 | { |
681 | int err, i, lenp, nph; | 656 | int err, i, nph; |
682 | struct device *dev; | 657 | struct device *dev; |
683 | struct device_node *mac_node, *dev_node; | 658 | struct device_node *mac_node, *dev_node; |
684 | struct mac_device *mac_dev; | 659 | struct mac_device *mac_dev; |
@@ -686,9 +661,9 @@ static int mac_probe(struct platform_device *_of_dev) | |||
686 | struct resource res; | 661 | struct resource res; |
687 | struct mac_priv_s *priv; | 662 | struct mac_priv_s *priv; |
688 | const u8 *mac_addr; | 663 | const u8 *mac_addr; |
689 | const char *char_prop; | 664 | u32 val; |
690 | const u32 *u32_prop; | ||
691 | u8 fman_id; | 665 | u8 fman_id; |
666 | int phy_if; | ||
692 | 667 | ||
693 | dev = &_of_dev->dev; | 668 | dev = &_of_dev->dev; |
694 | mac_node = dev->of_node; | 669 | mac_node = dev->of_node; |
@@ -749,16 +724,15 @@ static int mac_probe(struct platform_device *_of_dev) | |||
749 | } | 724 | } |
750 | 725 | ||
751 | /* Get the FMan cell-index */ | 726 | /* Get the FMan cell-index */ |
752 | u32_prop = of_get_property(dev_node, "cell-index", &lenp); | 727 | err = of_property_read_u32(dev_node, "cell-index", &val); |
753 | if (!u32_prop) { | 728 | if (err) { |
754 | dev_err(dev, "of_get_property(%s, cell-index) failed\n", | 729 | dev_err(dev, "failed to read cell-index for %s\n", |
755 | dev_node->full_name); | 730 | dev_node->full_name); |
756 | err = -EINVAL; | 731 | err = -EINVAL; |
757 | goto _return_of_node_put; | 732 | goto _return_of_node_put; |
758 | } | 733 | } |
759 | WARN_ON(lenp != sizeof(u32)); | ||
760 | /* cell-index 0 => FMan id 1 */ | 734 | /* cell-index 0 => FMan id 1 */ |
761 | fman_id = (u8)(fdt32_to_cpu(u32_prop[0]) + 1); | 735 | fman_id = (u8)(val + 1); |
762 | 736 | ||
763 | priv->fman = fman_bind(&of_dev->dev); | 737 | priv->fman = fman_bind(&of_dev->dev); |
764 | if (!priv->fman) { | 738 | if (!priv->fman) { |
@@ -805,15 +779,14 @@ static int mac_probe(struct platform_device *_of_dev) | |||
805 | } | 779 | } |
806 | 780 | ||
807 | /* Get the cell-index */ | 781 | /* Get the cell-index */ |
808 | u32_prop = of_get_property(mac_node, "cell-index", &lenp); | 782 | err = of_property_read_u32(mac_node, "cell-index", &val); |
809 | if (!u32_prop) { | 783 | if (err) { |
810 | dev_err(dev, "of_get_property(%s, cell-index) failed\n", | 784 | dev_err(dev, "failed to read cell-index for %s\n", |
811 | mac_node->full_name); | 785 | mac_node->full_name); |
812 | err = -EINVAL; | 786 | err = -EINVAL; |
813 | goto _return_dev_set_drvdata; | 787 | goto _return_dev_set_drvdata; |
814 | } | 788 | } |
815 | WARN_ON(lenp != sizeof(u32)); | 789 | priv->cell_index = (u8)val; |
816 | priv->cell_index = (u8)fdt32_to_cpu(u32_prop[0]); | ||
817 | 790 | ||
818 | /* Get the MAC address */ | 791 | /* Get the MAC address */ |
819 | mac_addr = of_get_mac_address(mac_node); | 792 | mac_addr = of_get_mac_address(mac_node); |
@@ -870,16 +843,14 @@ static int mac_probe(struct platform_device *_of_dev) | |||
870 | } | 843 | } |
871 | 844 | ||
872 | /* Get the PHY connection type */ | 845 | /* Get the PHY connection type */ |
873 | char_prop = (const char *)of_get_property(mac_node, | 846 | phy_if = of_get_phy_mode(mac_node); |
874 | "phy-connection-type", NULL); | 847 | if (phy_if < 0) { |
875 | if (!char_prop) { | ||
876 | dev_warn(dev, | 848 | dev_warn(dev, |
877 | "of_get_property(%s, phy-connection-type) failed. Defaulting to MII\n", | 849 | "of_get_phy_mode() for %s failed. Defaulting to SGMII\n", |
878 | mac_node->full_name); | 850 | mac_node->full_name); |
879 | priv->phy_if = PHY_INTERFACE_MODE_MII; | 851 | phy_if = PHY_INTERFACE_MODE_SGMII; |
880 | } else { | ||
881 | priv->phy_if = str2phy(char_prop); | ||
882 | } | 852 | } |
853 | priv->phy_if = phy_if; | ||
883 | 854 | ||
884 | priv->speed = phy2speed[priv->phy_if]; | 855 | priv->speed = phy2speed[priv->phy_if]; |
885 | priv->max_speed = priv->speed; | 856 | priv->max_speed = priv->speed; |
diff --git a/drivers/net/ethernet/freescale/fman/mac.h b/drivers/net/ethernet/freescale/fman/mac.h index 0211cc9a46d6..d7313f0c5135 100644 --- a/drivers/net/ethernet/freescale/fman/mac.h +++ b/drivers/net/ethernet/freescale/fman/mac.h | |||
@@ -58,7 +58,8 @@ struct mac_device { | |||
58 | bool tx_pause_active; | 58 | bool tx_pause_active; |
59 | bool promisc; | 59 | bool promisc; |
60 | 60 | ||
61 | int (*init_phy)(struct net_device *net_dev, struct mac_device *mac_dev); | 61 | struct phy_device *(*init_phy)(struct net_device *net_dev, |
62 | struct mac_device *mac_dev); | ||
62 | int (*init)(struct mac_device *mac_dev); | 63 | int (*init)(struct mac_device *mac_dev); |
63 | int (*start)(struct mac_device *mac_dev); | 64 | int (*start)(struct mac_device *mac_dev); |
64 | int (*stop)(struct mac_device *mac_dev); | 65 | int (*stop)(struct mac_device *mac_dev); |