aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2016-10-06 20:32:05 -0400
committerDavid S. Miller <davem@davemloft.net>2016-10-06 20:32:05 -0400
commit00c06ed779bee562603b28b088d7a8143dd2d94f (patch)
tree3f971f44e4adef3d86103bbe3ba549c96bdcf6ea
parent4c1fad64eff481982349f5795b9c198c532b0f13 (diff)
parent2fbfadb5436a394b0aad68d21de60fe3eb9c14db (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--MAINTAINERS7
-rw-r--r--drivers/net/ethernet/freescale/fman/Makefile10
-rw-r--r--drivers/net/ethernet/freescale/fman/fman.c78
-rw-r--r--drivers/net/ethernet/freescale/fman/fman_mac.h4
-rw-r--r--drivers/net/ethernet/freescale/fman/fman_memac.c6
-rw-r--r--drivers/net/ethernet/freescale/fman/fman_muram.c3
-rw-r--r--drivers/net/ethernet/freescale/fman/fman_muram.h3
-rw-r--r--drivers/net/ethernet/freescale/fman/fman_port.c55
-rw-r--r--drivers/net/ethernet/freescale/fman/fman_sp.c3
-rw-r--r--drivers/net/ethernet/freescale/fman/mac.c83
-rw-r--r--drivers/net/ethernet/freescale/fman/mac.h3
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
5005F: drivers/net/ethernet/freescale/fec.h 5005F: drivers/net/ethernet/freescale/fec.h
5006F: Documentation/devicetree/bindings/net/fsl-fec.txt 5006F: Documentation/devicetree/bindings/net/fsl-fec.txt
5007 5007
5008FREESCALE QORIQ DPAA FMAN DRIVER
5009M: Madalin Bucur <madalin.bucur@nxp.com>
5010L: netdev@vger.kernel.org
5011S: Maintained
5012F: drivers/net/ethernet/freescale/fman
5013F: Documentation/devicetree/bindings/powerpc/fsl/fman.txt
5014
5008FREESCALE QUICC ENGINE LIBRARY 5015FREESCALE QUICC ENGINE LIBRARY
5009L: linuxppc-dev@lists.ozlabs.org 5016L: linuxppc-dev@lists.ozlabs.org
5010S: Orphan 5017S: 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 @@
1subdir-ccflags-y += -I$(srctree)/drivers/net/ethernet/freescale/fman 1subdir-ccflags-y += -I$(srctree)/drivers/net/ethernet/freescale/fman
2 2
3obj-y += fsl_fman.o fsl_fman_mac.o fsl_mac.o 3obj-$(CONFIG_FSL_FMAN) += fsl_fman.o
4obj-$(CONFIG_FSL_FMAN) += fsl_fman_port.o
5obj-$(CONFIG_FSL_FMAN) += fsl_mac.o
4 6
5fsl_fman-objs := fman_muram.o fman.o fman_sp.o fman_port.o 7fsl_fman-objs := fman_muram.o fman.o fman_sp.o
6fsl_fman_mac-objs := fman_dtsec.o fman_memac.o fman_tgec.o 8fsl_fman_port-objs := fman_port.o
7fsl_mac-objs += mac.o 9fsl_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}
2118EXPORT_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}
2142EXPORT_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}
2246EXPORT_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}
2316EXPORT_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}
2343EXPORT_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}
2370EXPORT_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}
2392EXPORT_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}
2428EXPORT_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}
2442EXPORT_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 */
2456int fsl_fm_rx_extra_headroom = FSL_FM_RX_EXTRA_HEADROOM; 2464static int fsl_fm_rx_extra_headroom = FSL_FM_RX_EXTRA_HEADROOM;
2457module_param(fsl_fm_rx_extra_headroom, int, 0); 2465module_param(fsl_fm_rx_extra_headroom, int, 0);
2458MODULE_PARM_DESC(fsl_fm_rx_extra_headroom, "Extra headroom for Rx buffers"); 2466MODULE_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 */
2469int fsl_fm_max_frm = FSL_FM_MAX_FRAME_SIZE; 2477static int fsl_fm_max_frm = FSL_FM_MAX_FRAME_SIZE;
2470module_param(fsl_fm_max_frm, int, 0); 2478module_param(fsl_fm_max_frm, int, 0);
2471MODULE_PARM_DESC(fsl_fm_max_frm, "Maximum frame size, across all interfaces"); 2479MODULE_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}
2549EXPORT_SYMBOL(fman_bind);
2541 2550
2542static irqreturn_t fman_err_irq(int irq, void *handle) 2551static 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
2933MODULE_DEVICE_TABLE(of, fm_match); 2936MODULE_DEVICE_TABLE(of, fman_match);
2934 2937
2935static struct platform_driver fman_driver = { 2938static 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
2943builtin_platform_driver(fman_driver); 2946static 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}
2958module_init(fman_load);
2959
2960static void __exit fman_unload(void)
2961{
2962 platform_driver_unregister(&fman_driver);
2963}
2964module_exit(fman_unload);
2965
2966MODULE_LICENSE("Dual BSD/GPL");
2967MODULE_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 */
153void fman_muram_free_mem(struct muram_info *muram, unsigned long offset, size_t size) 153void 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
47unsigned long fman_muram_alloc(struct muram_info *muram, size_t size); 47unsigned long fman_muram_alloc(struct muram_info *muram, size_t size);
48 48
49void fman_muram_free_mem(struct muram_info *muram, unsigned long offset, size_t size); 49void 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 */
1478int fman_port_disable(struct fman_port *port) 1478int 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 */
1554int fman_port_enable(struct fman_port *port) 1555int 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
1778builtin_platform_driver(fman_port_driver); 1770static 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}
1782module_init(fman_port_load);
1783
1784static void __exit fman_port_unload(void)
1785{
1786 platform_driver_unregister(&fman_port_driver);
1787}
1788module_exit(fman_port_unload);
1789
1790MODULE_LICENSE("Dual BSD/GPL");
1791MODULE_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}
83EXPORT_SYMBOL(fman_sp_set_buf_pools_in_asc_order_of_buf_sizes);
83 84
84int fman_sp_build_buffer_struct(struct fman_sp_int_context_data_copy * 85int 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}
168EXPORT_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 */
472static int init_phy(struct net_device *net_dev, 472static 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
499static int dtsec_init_phy(struct net_device *net_dev, 499static 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
505static int tgec_init_phy(struct net_device *net_dev, 505static 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
511static int memac_init_phy(struct net_device *net_dev, 511static 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
584static DEFINE_MUTEX(eth_lock); 584static DEFINE_MUTEX(eth_lock);
585 585
586static 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
600static 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
611static const u16 phy2speed[] = { 586static 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
679static int mac_probe(struct platform_device *_of_dev) 654static 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);