Merge branch 'for-5.13' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie...
[linux-2.6-microblaze.git] / drivers / net / ethernet / freescale / fman / mac.c
1 /* Copyright 2008-2015 Freescale Semiconductor, Inc.
2  *
3  * Redistribution and use in source and binary forms, with or without
4  * modification, are permitted provided that the following conditions are met:
5  *     * Redistributions of source code must retain the above copyright
6  *       notice, this list of conditions and the following disclaimer.
7  *     * Redistributions in binary form must reproduce the above copyright
8  *       notice, this list of conditions and the following disclaimer in the
9  *       documentation and/or other materials provided with the distribution.
10  *     * Neither the name of Freescale Semiconductor nor the
11  *       names of its contributors may be used to endorse or promote products
12  *       derived from this software without specific prior written permission.
13  *
14  *
15  * ALTERNATIVELY, this software may be distributed under the terms of the
16  * GNU General Public License ("GPL") as published by the Free Software
17  * Foundation, either version 2 of that License or (at your option) any
18  * later version.
19  *
20  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
21  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
24  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31
32 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
33
34 #include <linux/init.h>
35 #include <linux/module.h>
36 #include <linux/of_address.h>
37 #include <linux/of_platform.h>
38 #include <linux/of_net.h>
39 #include <linux/of_mdio.h>
40 #include <linux/device.h>
41 #include <linux/phy.h>
42 #include <linux/netdevice.h>
43 #include <linux/phy_fixed.h>
44 #include <linux/etherdevice.h>
45 #include <linux/libfdt_env.h>
46
47 #include "mac.h"
48 #include "fman_mac.h"
49 #include "fman_dtsec.h"
50 #include "fman_tgec.h"
51 #include "fman_memac.h"
52
53 MODULE_LICENSE("Dual BSD/GPL");
54 MODULE_DESCRIPTION("FSL FMan MAC API based driver");
55
56 struct mac_priv_s {
57         struct device                   *dev;
58         void __iomem                    *vaddr;
59         u8                              cell_index;
60         struct fman                     *fman;
61         struct device_node              *internal_phy_node;
62         /* List of multicast addresses */
63         struct list_head                mc_addr_list;
64         struct platform_device          *eth_dev;
65         struct fixed_phy_status         *fixed_link;
66         u16                             speed;
67         u16                             max_speed;
68
69         int (*enable)(struct fman_mac *mac_dev, enum comm_mode mode);
70         int (*disable)(struct fman_mac *mac_dev, enum comm_mode mode);
71 };
72
73 struct mac_address {
74         u8 addr[ETH_ALEN];
75         struct list_head list;
76 };
77
78 static void mac_exception(void *handle, enum fman_mac_exceptions ex)
79 {
80         struct mac_device       *mac_dev;
81         struct mac_priv_s       *priv;
82
83         mac_dev = handle;
84         priv = mac_dev->priv;
85
86         if (ex == FM_MAC_EX_10G_RX_FIFO_OVFL) {
87                 /* don't flag RX FIFO after the first */
88                 mac_dev->set_exception(mac_dev->fman_mac,
89                                        FM_MAC_EX_10G_RX_FIFO_OVFL, false);
90                 dev_err(priv->dev, "10G MAC got RX FIFO Error = %x\n", ex);
91         }
92
93         dev_dbg(priv->dev, "%s:%s() -> %d\n", KBUILD_BASENAME ".c",
94                 __func__, ex);
95 }
96
97 static void set_fman_mac_params(struct mac_device *mac_dev,
98                                 struct fman_mac_params *params)
99 {
100         struct mac_priv_s *priv = mac_dev->priv;
101
102         params->base_addr = (typeof(params->base_addr))
103                 devm_ioremap(priv->dev, mac_dev->res->start,
104                              resource_size(mac_dev->res));
105         memcpy(&params->addr, mac_dev->addr, sizeof(mac_dev->addr));
106         params->max_speed       = priv->max_speed;
107         params->phy_if          = mac_dev->phy_if;
108         params->basex_if        = false;
109         params->mac_id          = priv->cell_index;
110         params->fm              = (void *)priv->fman;
111         params->exception_cb    = mac_exception;
112         params->event_cb        = mac_exception;
113         params->dev_id          = mac_dev;
114         params->internal_phy_node = priv->internal_phy_node;
115 }
116
117 static int tgec_initialization(struct mac_device *mac_dev)
118 {
119         int err;
120         struct mac_priv_s       *priv;
121         struct fman_mac_params  params;
122         u32                     version;
123
124         priv = mac_dev->priv;
125
126         set_fman_mac_params(mac_dev, &params);
127
128         mac_dev->fman_mac = tgec_config(&params);
129         if (!mac_dev->fman_mac) {
130                 err = -EINVAL;
131                 goto _return;
132         }
133
134         err = tgec_cfg_max_frame_len(mac_dev->fman_mac, fman_get_max_frm());
135         if (err < 0)
136                 goto _return_fm_mac_free;
137
138         err = tgec_init(mac_dev->fman_mac);
139         if (err < 0)
140                 goto _return_fm_mac_free;
141
142         /* For 10G MAC, disable Tx ECC exception */
143         err = mac_dev->set_exception(mac_dev->fman_mac,
144                                      FM_MAC_EX_10G_TX_ECC_ER, false);
145         if (err < 0)
146                 goto _return_fm_mac_free;
147
148         err = tgec_get_version(mac_dev->fman_mac, &version);
149         if (err < 0)
150                 goto _return_fm_mac_free;
151
152         dev_info(priv->dev, "FMan XGEC version: 0x%08x\n", version);
153
154         goto _return;
155
156 _return_fm_mac_free:
157         tgec_free(mac_dev->fman_mac);
158
159 _return:
160         return err;
161 }
162
163 static int dtsec_initialization(struct mac_device *mac_dev)
164 {
165         int                     err;
166         struct mac_priv_s       *priv;
167         struct fman_mac_params  params;
168         u32                     version;
169
170         priv = mac_dev->priv;
171
172         set_fman_mac_params(mac_dev, &params);
173
174         mac_dev->fman_mac = dtsec_config(&params);
175         if (!mac_dev->fman_mac) {
176                 err = -EINVAL;
177                 goto _return;
178         }
179
180         err = dtsec_cfg_max_frame_len(mac_dev->fman_mac, fman_get_max_frm());
181         if (err < 0)
182                 goto _return_fm_mac_free;
183
184         err = dtsec_cfg_pad_and_crc(mac_dev->fman_mac, true);
185         if (err < 0)
186                 goto _return_fm_mac_free;
187
188         err = dtsec_init(mac_dev->fman_mac);
189         if (err < 0)
190                 goto _return_fm_mac_free;
191
192         /* For 1G MAC, disable by default the MIB counters overflow interrupt */
193         err = mac_dev->set_exception(mac_dev->fman_mac,
194                                      FM_MAC_EX_1G_RX_MIB_CNT_OVFL, false);
195         if (err < 0)
196                 goto _return_fm_mac_free;
197
198         err = dtsec_get_version(mac_dev->fman_mac, &version);
199         if (err < 0)
200                 goto _return_fm_mac_free;
201
202         dev_info(priv->dev, "FMan dTSEC version: 0x%08x\n", version);
203
204         goto _return;
205
206 _return_fm_mac_free:
207         dtsec_free(mac_dev->fman_mac);
208
209 _return:
210         return err;
211 }
212
213 static int memac_initialization(struct mac_device *mac_dev)
214 {
215         int                      err;
216         struct mac_priv_s       *priv;
217         struct fman_mac_params   params;
218
219         priv = mac_dev->priv;
220
221         set_fman_mac_params(mac_dev, &params);
222
223         if (priv->max_speed == SPEED_10000)
224                 params.phy_if = PHY_INTERFACE_MODE_XGMII;
225
226         mac_dev->fman_mac = memac_config(&params);
227         if (!mac_dev->fman_mac) {
228                 err = -EINVAL;
229                 goto _return;
230         }
231
232         err = memac_cfg_max_frame_len(mac_dev->fman_mac, fman_get_max_frm());
233         if (err < 0)
234                 goto _return_fm_mac_free;
235
236         err = memac_cfg_reset_on_init(mac_dev->fman_mac, true);
237         if (err < 0)
238                 goto _return_fm_mac_free;
239
240         err = memac_cfg_fixed_link(mac_dev->fman_mac, priv->fixed_link);
241         if (err < 0)
242                 goto _return_fm_mac_free;
243
244         err = memac_init(mac_dev->fman_mac);
245         if (err < 0)
246                 goto _return_fm_mac_free;
247
248         dev_info(priv->dev, "FMan MEMAC\n");
249
250         goto _return;
251
252 _return_fm_mac_free:
253         memac_free(mac_dev->fman_mac);
254
255 _return:
256         return err;
257 }
258
259 static int start(struct mac_device *mac_dev)
260 {
261         int      err;
262         struct phy_device *phy_dev = mac_dev->phy_dev;
263         struct mac_priv_s *priv = mac_dev->priv;
264
265         err = priv->enable(mac_dev->fman_mac, COMM_MODE_RX_AND_TX);
266         if (!err && phy_dev)
267                 phy_start(phy_dev);
268
269         return err;
270 }
271
272 static int stop(struct mac_device *mac_dev)
273 {
274         struct mac_priv_s *priv = mac_dev->priv;
275
276         if (mac_dev->phy_dev)
277                 phy_stop(mac_dev->phy_dev);
278
279         return priv->disable(mac_dev->fman_mac, COMM_MODE_RX_AND_TX);
280 }
281
282 static int set_multi(struct net_device *net_dev, struct mac_device *mac_dev)
283 {
284         struct mac_priv_s       *priv;
285         struct mac_address      *old_addr, *tmp;
286         struct netdev_hw_addr   *ha;
287         int                     err;
288         enet_addr_t             *addr;
289
290         priv = mac_dev->priv;
291
292         /* Clear previous address list */
293         list_for_each_entry_safe(old_addr, tmp, &priv->mc_addr_list, list) {
294                 addr = (enet_addr_t *)old_addr->addr;
295                 err = mac_dev->remove_hash_mac_addr(mac_dev->fman_mac, addr);
296                 if (err < 0)
297                         return err;
298
299                 list_del(&old_addr->list);
300                 kfree(old_addr);
301         }
302
303         /* Add all the addresses from the new list */
304         netdev_for_each_mc_addr(ha, net_dev) {
305                 addr = (enet_addr_t *)ha->addr;
306                 err = mac_dev->add_hash_mac_addr(mac_dev->fman_mac, addr);
307                 if (err < 0)
308                         return err;
309
310                 tmp = kmalloc(sizeof(*tmp), GFP_ATOMIC);
311                 if (!tmp)
312                         return -ENOMEM;
313
314                 ether_addr_copy(tmp->addr, ha->addr);
315                 list_add(&tmp->list, &priv->mc_addr_list);
316         }
317         return 0;
318 }
319
320 /**
321  * fman_set_mac_active_pause
322  * @mac_dev:    A pointer to the MAC device
323  * @rx:         Pause frame setting for RX
324  * @tx:         Pause frame setting for TX
325  *
326  * Set the MAC RX/TX PAUSE frames settings
327  *
328  * Avoid redundant calls to FMD, if the MAC driver already contains the desired
329  * active PAUSE settings. Otherwise, the new active settings should be reflected
330  * in FMan.
331  *
332  * Return: 0 on success; Error code otherwise.
333  */
334 int fman_set_mac_active_pause(struct mac_device *mac_dev, bool rx, bool tx)
335 {
336         struct fman_mac *fman_mac = mac_dev->fman_mac;
337         int err = 0;
338
339         if (rx != mac_dev->rx_pause_active) {
340                 err = mac_dev->set_rx_pause(fman_mac, rx);
341                 if (likely(err == 0))
342                         mac_dev->rx_pause_active = rx;
343         }
344
345         if (tx != mac_dev->tx_pause_active) {
346                 u16 pause_time = (tx ? FSL_FM_PAUSE_TIME_ENABLE :
347                                          FSL_FM_PAUSE_TIME_DISABLE);
348
349                 err = mac_dev->set_tx_pause(fman_mac, 0, pause_time, 0);
350
351                 if (likely(err == 0))
352                         mac_dev->tx_pause_active = tx;
353         }
354
355         return err;
356 }
357 EXPORT_SYMBOL(fman_set_mac_active_pause);
358
359 /**
360  * fman_get_pause_cfg
361  * @mac_dev:    A pointer to the MAC device
362  * @rx_pause:   Return value for RX setting
363  * @tx_pause:   Return value for TX setting
364  *
365  * Determine the MAC RX/TX PAUSE frames settings based on PHY
366  * autonegotiation or values set by eththool.
367  *
368  * Return: Pointer to FMan device.
369  */
370 void fman_get_pause_cfg(struct mac_device *mac_dev, bool *rx_pause,
371                         bool *tx_pause)
372 {
373         struct phy_device *phy_dev = mac_dev->phy_dev;
374         u16 lcl_adv, rmt_adv;
375         u8 flowctrl;
376
377         *rx_pause = *tx_pause = false;
378
379         if (!phy_dev->duplex)
380                 return;
381
382         /* If PAUSE autonegotiation is disabled, the TX/RX PAUSE settings
383          * are those set by ethtool.
384          */
385         if (!mac_dev->autoneg_pause) {
386                 *rx_pause = mac_dev->rx_pause_req;
387                 *tx_pause = mac_dev->tx_pause_req;
388                 return;
389         }
390
391         /* Else if PAUSE autonegotiation is enabled, the TX/RX PAUSE
392          * settings depend on the result of the link negotiation.
393          */
394
395         /* get local capabilities */
396         lcl_adv = linkmode_adv_to_lcl_adv_t(phy_dev->advertising);
397
398         /* get link partner capabilities */
399         rmt_adv = 0;
400         if (phy_dev->pause)
401                 rmt_adv |= LPA_PAUSE_CAP;
402         if (phy_dev->asym_pause)
403                 rmt_adv |= LPA_PAUSE_ASYM;
404
405         /* Calculate TX/RX settings based on local and peer advertised
406          * symmetric/asymmetric PAUSE capabilities.
407          */
408         flowctrl = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv);
409         if (flowctrl & FLOW_CTRL_RX)
410                 *rx_pause = true;
411         if (flowctrl & FLOW_CTRL_TX)
412                 *tx_pause = true;
413 }
414 EXPORT_SYMBOL(fman_get_pause_cfg);
415
416 static void adjust_link_void(struct mac_device *mac_dev)
417 {
418 }
419
420 static void adjust_link_dtsec(struct mac_device *mac_dev)
421 {
422         struct phy_device *phy_dev = mac_dev->phy_dev;
423         struct fman_mac *fman_mac;
424         bool rx_pause, tx_pause;
425         int err;
426
427         fman_mac = mac_dev->fman_mac;
428         if (!phy_dev->link) {
429                 dtsec_restart_autoneg(fman_mac);
430
431                 return;
432         }
433
434         dtsec_adjust_link(fman_mac, phy_dev->speed);
435         fman_get_pause_cfg(mac_dev, &rx_pause, &tx_pause);
436         err = fman_set_mac_active_pause(mac_dev, rx_pause, tx_pause);
437         if (err < 0)
438                 dev_err(mac_dev->priv->dev, "fman_set_mac_active_pause() = %d\n",
439                         err);
440 }
441
442 static void adjust_link_memac(struct mac_device *mac_dev)
443 {
444         struct phy_device *phy_dev = mac_dev->phy_dev;
445         struct fman_mac *fman_mac;
446         bool rx_pause, tx_pause;
447         int err;
448
449         fman_mac = mac_dev->fman_mac;
450         memac_adjust_link(fman_mac, phy_dev->speed);
451
452         fman_get_pause_cfg(mac_dev, &rx_pause, &tx_pause);
453         err = fman_set_mac_active_pause(mac_dev, rx_pause, tx_pause);
454         if (err < 0)
455                 dev_err(mac_dev->priv->dev, "fman_set_mac_active_pause() = %d\n",
456                         err);
457 }
458
459 static void setup_dtsec(struct mac_device *mac_dev)
460 {
461         mac_dev->init                   = dtsec_initialization;
462         mac_dev->set_promisc            = dtsec_set_promiscuous;
463         mac_dev->change_addr            = dtsec_modify_mac_address;
464         mac_dev->add_hash_mac_addr      = dtsec_add_hash_mac_address;
465         mac_dev->remove_hash_mac_addr   = dtsec_del_hash_mac_address;
466         mac_dev->set_tx_pause           = dtsec_set_tx_pause_frames;
467         mac_dev->set_rx_pause           = dtsec_accept_rx_pause_frames;
468         mac_dev->set_exception          = dtsec_set_exception;
469         mac_dev->set_allmulti           = dtsec_set_allmulti;
470         mac_dev->set_tstamp             = dtsec_set_tstamp;
471         mac_dev->set_multi              = set_multi;
472         mac_dev->start                  = start;
473         mac_dev->stop                   = stop;
474         mac_dev->adjust_link            = adjust_link_dtsec;
475         mac_dev->priv->enable           = dtsec_enable;
476         mac_dev->priv->disable          = dtsec_disable;
477 }
478
479 static void setup_tgec(struct mac_device *mac_dev)
480 {
481         mac_dev->init                   = tgec_initialization;
482         mac_dev->set_promisc            = tgec_set_promiscuous;
483         mac_dev->change_addr            = tgec_modify_mac_address;
484         mac_dev->add_hash_mac_addr      = tgec_add_hash_mac_address;
485         mac_dev->remove_hash_mac_addr   = tgec_del_hash_mac_address;
486         mac_dev->set_tx_pause           = tgec_set_tx_pause_frames;
487         mac_dev->set_rx_pause           = tgec_accept_rx_pause_frames;
488         mac_dev->set_exception          = tgec_set_exception;
489         mac_dev->set_allmulti           = tgec_set_allmulti;
490         mac_dev->set_tstamp             = tgec_set_tstamp;
491         mac_dev->set_multi              = set_multi;
492         mac_dev->start                  = start;
493         mac_dev->stop                   = stop;
494         mac_dev->adjust_link            = adjust_link_void;
495         mac_dev->priv->enable           = tgec_enable;
496         mac_dev->priv->disable          = tgec_disable;
497 }
498
499 static void setup_memac(struct mac_device *mac_dev)
500 {
501         mac_dev->init                   = memac_initialization;
502         mac_dev->set_promisc            = memac_set_promiscuous;
503         mac_dev->change_addr            = memac_modify_mac_address;
504         mac_dev->add_hash_mac_addr      = memac_add_hash_mac_address;
505         mac_dev->remove_hash_mac_addr   = memac_del_hash_mac_address;
506         mac_dev->set_tx_pause           = memac_set_tx_pause_frames;
507         mac_dev->set_rx_pause           = memac_accept_rx_pause_frames;
508         mac_dev->set_exception          = memac_set_exception;
509         mac_dev->set_allmulti           = memac_set_allmulti;
510         mac_dev->set_tstamp             = memac_set_tstamp;
511         mac_dev->set_multi              = set_multi;
512         mac_dev->start                  = start;
513         mac_dev->stop                   = stop;
514         mac_dev->adjust_link            = adjust_link_memac;
515         mac_dev->priv->enable           = memac_enable;
516         mac_dev->priv->disable          = memac_disable;
517 }
518
519 #define DTSEC_SUPPORTED \
520         (SUPPORTED_10baseT_Half \
521         | SUPPORTED_10baseT_Full \
522         | SUPPORTED_100baseT_Half \
523         | SUPPORTED_100baseT_Full \
524         | SUPPORTED_Autoneg \
525         | SUPPORTED_Pause \
526         | SUPPORTED_Asym_Pause \
527         | SUPPORTED_MII)
528
529 static DEFINE_MUTEX(eth_lock);
530
531 static const u16 phy2speed[] = {
532         [PHY_INTERFACE_MODE_MII]                = SPEED_100,
533         [PHY_INTERFACE_MODE_GMII]               = SPEED_1000,
534         [PHY_INTERFACE_MODE_SGMII]              = SPEED_1000,
535         [PHY_INTERFACE_MODE_TBI]                = SPEED_1000,
536         [PHY_INTERFACE_MODE_RMII]               = SPEED_100,
537         [PHY_INTERFACE_MODE_RGMII]              = SPEED_1000,
538         [PHY_INTERFACE_MODE_RGMII_ID]           = SPEED_1000,
539         [PHY_INTERFACE_MODE_RGMII_RXID] = SPEED_1000,
540         [PHY_INTERFACE_MODE_RGMII_TXID] = SPEED_1000,
541         [PHY_INTERFACE_MODE_RTBI]               = SPEED_1000,
542         [PHY_INTERFACE_MODE_QSGMII]             = SPEED_1000,
543         [PHY_INTERFACE_MODE_XGMII]              = SPEED_10000
544 };
545
546 static struct platform_device *dpaa_eth_add_device(int fman_id,
547                                                    struct mac_device *mac_dev)
548 {
549         struct platform_device *pdev;
550         struct dpaa_eth_data data;
551         struct mac_priv_s       *priv;
552         static int dpaa_eth_dev_cnt;
553         int ret;
554
555         priv = mac_dev->priv;
556
557         data.mac_dev = mac_dev;
558         data.mac_hw_id = priv->cell_index;
559         data.fman_hw_id = fman_id;
560
561         mutex_lock(&eth_lock);
562         pdev = platform_device_alloc("dpaa-ethernet", dpaa_eth_dev_cnt);
563         if (!pdev) {
564                 ret = -ENOMEM;
565                 goto no_mem;
566         }
567
568         pdev->dev.parent = priv->dev;
569
570         ret = platform_device_add_data(pdev, &data, sizeof(data));
571         if (ret)
572                 goto err;
573
574         ret = platform_device_add(pdev);
575         if (ret)
576                 goto err;
577
578         dpaa_eth_dev_cnt++;
579         mutex_unlock(&eth_lock);
580
581         return pdev;
582
583 err:
584         platform_device_put(pdev);
585 no_mem:
586         mutex_unlock(&eth_lock);
587
588         return ERR_PTR(ret);
589 }
590
591 static const struct of_device_id mac_match[] = {
592         { .compatible   = "fsl,fman-dtsec" },
593         { .compatible   = "fsl,fman-xgec" },
594         { .compatible   = "fsl,fman-memac" },
595         {}
596 };
597 MODULE_DEVICE_TABLE(of, mac_match);
598
599 static int mac_probe(struct platform_device *_of_dev)
600 {
601         int                      err, i, nph;
602         struct device           *dev;
603         struct device_node      *mac_node, *dev_node;
604         struct mac_device       *mac_dev;
605         struct platform_device  *of_dev;
606         struct resource          res;
607         struct mac_priv_s       *priv;
608         u32                      val;
609         u8                      fman_id;
610         phy_interface_t          phy_if;
611
612         dev = &_of_dev->dev;
613         mac_node = dev->of_node;
614
615         mac_dev = devm_kzalloc(dev, sizeof(*mac_dev), GFP_KERNEL);
616         if (!mac_dev) {
617                 err = -ENOMEM;
618                 goto _return;
619         }
620         priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
621         if (!priv) {
622                 err = -ENOMEM;
623                 goto _return;
624         }
625
626         /* Save private information */
627         mac_dev->priv = priv;
628         priv->dev = dev;
629
630         if (of_device_is_compatible(mac_node, "fsl,fman-dtsec")) {
631                 setup_dtsec(mac_dev);
632                 priv->internal_phy_node = of_parse_phandle(mac_node,
633                                                           "tbi-handle", 0);
634         } else if (of_device_is_compatible(mac_node, "fsl,fman-xgec")) {
635                 setup_tgec(mac_dev);
636         } else if (of_device_is_compatible(mac_node, "fsl,fman-memac")) {
637                 setup_memac(mac_dev);
638                 priv->internal_phy_node = of_parse_phandle(mac_node,
639                                                           "pcsphy-handle", 0);
640         } else {
641                 dev_err(dev, "MAC node (%pOF) contains unsupported MAC\n",
642                         mac_node);
643                 err = -EINVAL;
644                 goto _return;
645         }
646
647         INIT_LIST_HEAD(&priv->mc_addr_list);
648
649         /* Get the FM node */
650         dev_node = of_get_parent(mac_node);
651         if (!dev_node) {
652                 dev_err(dev, "of_get_parent(%pOF) failed\n",
653                         mac_node);
654                 err = -EINVAL;
655                 goto _return_of_get_parent;
656         }
657
658         of_dev = of_find_device_by_node(dev_node);
659         if (!of_dev) {
660                 dev_err(dev, "of_find_device_by_node(%pOF) failed\n", dev_node);
661                 err = -EINVAL;
662                 goto _return_of_node_put;
663         }
664
665         /* Get the FMan cell-index */
666         err = of_property_read_u32(dev_node, "cell-index", &val);
667         if (err) {
668                 dev_err(dev, "failed to read cell-index for %pOF\n", dev_node);
669                 err = -EINVAL;
670                 goto _return_of_node_put;
671         }
672         /* cell-index 0 => FMan id 1 */
673         fman_id = (u8)(val + 1);
674
675         priv->fman = fman_bind(&of_dev->dev);
676         if (!priv->fman) {
677                 dev_err(dev, "fman_bind(%pOF) failed\n", dev_node);
678                 err = -ENODEV;
679                 goto _return_of_node_put;
680         }
681
682         of_node_put(dev_node);
683
684         /* Get the address of the memory mapped registers */
685         err = of_address_to_resource(mac_node, 0, &res);
686         if (err < 0) {
687                 dev_err(dev, "of_address_to_resource(%pOF) = %d\n",
688                         mac_node, err);
689                 goto _return_of_get_parent;
690         }
691
692         mac_dev->res = __devm_request_region(dev,
693                                              fman_get_mem_region(priv->fman),
694                                              res.start, resource_size(&res),
695                                              "mac");
696         if (!mac_dev->res) {
697                 dev_err(dev, "__devm_request_mem_region(mac) failed\n");
698                 err = -EBUSY;
699                 goto _return_of_get_parent;
700         }
701
702         priv->vaddr = devm_ioremap(dev, mac_dev->res->start,
703                                    resource_size(mac_dev->res));
704         if (!priv->vaddr) {
705                 dev_err(dev, "devm_ioremap() failed\n");
706                 err = -EIO;
707                 goto _return_of_get_parent;
708         }
709
710         if (!of_device_is_available(mac_node)) {
711                 err = -ENODEV;
712                 goto _return_of_get_parent;
713         }
714
715         /* Get the cell-index */
716         err = of_property_read_u32(mac_node, "cell-index", &val);
717         if (err) {
718                 dev_err(dev, "failed to read cell-index for %pOF\n", mac_node);
719                 err = -EINVAL;
720                 goto _return_of_get_parent;
721         }
722         priv->cell_index = (u8)val;
723
724         /* Get the MAC address */
725         err = of_get_mac_address(mac_node, mac_dev->addr);
726         if (err)
727                 dev_warn(dev, "of_get_mac_address(%pOF) failed\n", mac_node);
728
729         /* Get the port handles */
730         nph = of_count_phandle_with_args(mac_node, "fsl,fman-ports", NULL);
731         if (unlikely(nph < 0)) {
732                 dev_err(dev, "of_count_phandle_with_args(%pOF, fsl,fman-ports) failed\n",
733                         mac_node);
734                 err = nph;
735                 goto _return_of_get_parent;
736         }
737
738         if (nph != ARRAY_SIZE(mac_dev->port)) {
739                 dev_err(dev, "Not supported number of fman-ports handles of mac node %pOF from device tree\n",
740                         mac_node);
741                 err = -EINVAL;
742                 goto _return_of_get_parent;
743         }
744
745         for (i = 0; i < ARRAY_SIZE(mac_dev->port); i++) {
746                 /* Find the port node */
747                 dev_node = of_parse_phandle(mac_node, "fsl,fman-ports", i);
748                 if (!dev_node) {
749                         dev_err(dev, "of_parse_phandle(%pOF, fsl,fman-ports) failed\n",
750                                 mac_node);
751                         err = -EINVAL;
752                         goto _return_of_node_put;
753                 }
754
755                 of_dev = of_find_device_by_node(dev_node);
756                 if (!of_dev) {
757                         dev_err(dev, "of_find_device_by_node(%pOF) failed\n",
758                                 dev_node);
759                         err = -EINVAL;
760                         goto _return_of_node_put;
761                 }
762
763                 mac_dev->port[i] = fman_port_bind(&of_dev->dev);
764                 if (!mac_dev->port[i]) {
765                         dev_err(dev, "dev_get_drvdata(%pOF) failed\n",
766                                 dev_node);
767                         err = -EINVAL;
768                         goto _return_of_node_put;
769                 }
770                 of_node_put(dev_node);
771         }
772
773         /* Get the PHY connection type */
774         err = of_get_phy_mode(mac_node, &phy_if);
775         if (err) {
776                 dev_warn(dev,
777                          "of_get_phy_mode() for %pOF failed. Defaulting to SGMII\n",
778                          mac_node);
779                 phy_if = PHY_INTERFACE_MODE_SGMII;
780         }
781         mac_dev->phy_if = phy_if;
782
783         priv->speed             = phy2speed[mac_dev->phy_if];
784         priv->max_speed         = priv->speed;
785         mac_dev->if_support     = DTSEC_SUPPORTED;
786         /* We don't support half-duplex in SGMII mode */
787         if (mac_dev->phy_if == PHY_INTERFACE_MODE_SGMII)
788                 mac_dev->if_support &= ~(SUPPORTED_10baseT_Half |
789                                         SUPPORTED_100baseT_Half);
790
791         /* Gigabit support (no half-duplex) */
792         if (priv->max_speed == 1000)
793                 mac_dev->if_support |= SUPPORTED_1000baseT_Full;
794
795         /* The 10G interface only supports one mode */
796         if (mac_dev->phy_if == PHY_INTERFACE_MODE_XGMII)
797                 mac_dev->if_support = SUPPORTED_10000baseT_Full;
798
799         /* Get the rest of the PHY information */
800         mac_dev->phy_node = of_parse_phandle(mac_node, "phy-handle", 0);
801         if (!mac_dev->phy_node && of_phy_is_fixed_link(mac_node)) {
802                 struct phy_device *phy;
803
804                 err = of_phy_register_fixed_link(mac_node);
805                 if (err)
806                         goto _return_of_get_parent;
807
808                 priv->fixed_link = kzalloc(sizeof(*priv->fixed_link),
809                                            GFP_KERNEL);
810                 if (!priv->fixed_link) {
811                         err = -ENOMEM;
812                         goto _return_of_get_parent;
813                 }
814
815                 mac_dev->phy_node = of_node_get(mac_node);
816                 phy = of_phy_find_device(mac_dev->phy_node);
817                 if (!phy) {
818                         err = -EINVAL;
819                         of_node_put(mac_dev->phy_node);
820                         goto _return_of_get_parent;
821                 }
822
823                 priv->fixed_link->link = phy->link;
824                 priv->fixed_link->speed = phy->speed;
825                 priv->fixed_link->duplex = phy->duplex;
826                 priv->fixed_link->pause = phy->pause;
827                 priv->fixed_link->asym_pause = phy->asym_pause;
828
829                 put_device(&phy->mdio.dev);
830         }
831
832         err = mac_dev->init(mac_dev);
833         if (err < 0) {
834                 dev_err(dev, "mac_dev->init() = %d\n", err);
835                 of_node_put(mac_dev->phy_node);
836                 goto _return_of_get_parent;
837         }
838
839         /* pause frame autonegotiation enabled */
840         mac_dev->autoneg_pause = true;
841
842         /* By intializing the values to false, force FMD to enable PAUSE frames
843          * on RX and TX
844          */
845         mac_dev->rx_pause_req = true;
846         mac_dev->tx_pause_req = true;
847         mac_dev->rx_pause_active = false;
848         mac_dev->tx_pause_active = false;
849         err = fman_set_mac_active_pause(mac_dev, true, true);
850         if (err < 0)
851                 dev_err(dev, "fman_set_mac_active_pause() = %d\n", err);
852
853         if (!is_zero_ether_addr(mac_dev->addr))
854                 dev_info(dev, "FMan MAC address: %pM\n", mac_dev->addr);
855
856         priv->eth_dev = dpaa_eth_add_device(fman_id, mac_dev);
857         if (IS_ERR(priv->eth_dev)) {
858                 dev_err(dev, "failed to add Ethernet platform device for MAC %d\n",
859                         priv->cell_index);
860                 priv->eth_dev = NULL;
861         }
862
863         goto _return;
864
865 _return_of_node_put:
866         of_node_put(dev_node);
867 _return_of_get_parent:
868         kfree(priv->fixed_link);
869 _return:
870         return err;
871 }
872
873 static struct platform_driver mac_driver = {
874         .driver = {
875                 .name           = KBUILD_MODNAME,
876                 .of_match_table = mac_match,
877         },
878         .probe          = mac_probe,
879 };
880
881 builtin_platform_driver(mac_driver);