xref: /openbmc/u-boot/drivers/net/ftgmac100.c (revision 9ab233549072a7a28c792c772141fa1561676941)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Faraday FTGMAC100 Ethernet
4  *
5  * (C) Copyright 2009 Faraday Technology
6  * Po-Yu Chuang <ratbert@faraday-tech.com>
7  *
8  * (C) Copyright 2010 Andes Technology
9  * Macpaul Lin <macpaul@andestech.com>
10  *
11  * Copyright (C) 2018, IBM Corporation.
12  */
13 
14 #include <clk.h>
15 #include <dm.h>
16 #include <miiphy.h>
17 #include <net.h>
18 #include <wait_bit.h>
19 #include <linux/io.h>
20 #include <linux/iopoll.h>
21 #include <net/ncsi.h>
22 
23 #include "ftgmac100.h"
24 #include "aspeed_mdio.h"
25 
26 /* Min frame ethernet frame size without FCS */
27 #define ETH_ZLEN			60
28 
29 /* Receive Buffer Size Register - HW default is 0x640 */
30 #define FTGMAC100_RBSR_DEFAULT		0x640
31 
32 /* PKTBUFSTX/PKTBUFSRX must both be power of 2 */
33 #define PKTBUFSTX	4	/* must be power of 2 */
34 
35 /* Timeout for transmit */
36 #define FTGMAC100_TX_TIMEOUT_MS		1000
37 
38 /* Timeout for a mdio read/write operation */
39 #define FTGMAC100_MDIO_TIMEOUT_USEC	10000
40 
41 /*
42  * MDC clock cycle threshold
43  *
44  * 20us * 100 = 2ms > (1 / 2.5Mhz) * 0x34
45  */
46 #define MDC_CYCTHR			0x34
47 
48 /*
49  * ftgmac100 model variants
50  */
51 enum ftgmac100_model {
52 	FTGMAC100_MODEL_FARADAY,
53 	FTGMAC100_MODEL_ASPEED,
54 	FTGMAC100_MODEL_NEW_ASPEED,
55 };
56 
57 /**
58  * struct ftgmac100_data - private data for the FTGMAC100 driver
59  *
60  * @iobase: The base address of the hardware registers
61  * @txdes: The array of transmit descriptors
62  * @rxdes: The array of receive descriptors
63  * @tx_index: Transmit descriptor index in @txdes
64  * @rx_index: Receive descriptor index in @rxdes
65  * @phy_addr: The PHY interface address to use
66  * @phydev: The PHY device backing the MAC
67  * @bus: The mdio bus
68  * @phy_mode: The mode of the PHY interface (rgmii, rmii, ...)
69  * @max_speed: Maximum speed of Ethernet connection supported by MAC
70  * @clks: The bulk of clocks assigned to the device in the DT
71  * @rxdes0_edorr_mask: The bit number identifying the end of the RX ring buffer
72  * @txdes0_edotr_mask: The bit number identifying the end of the TX ring buffer
73  */
74 struct ftgmac100_data {
75 	struct ftgmac100 *iobase;
76 	fdt_addr_t mdio_addr;	//for aspeed ast2600 new mdio
77 
78 	struct ftgmac100_txdes txdes[PKTBUFSTX];
79 	struct ftgmac100_rxdes rxdes[PKTBUFSRX];
80 	int tx_index;
81 	int rx_index;
82 
83 	u32 phy_addr;
84 	struct phy_device *phydev;
85 	struct mii_dev *bus;
86 	u32 phy_mode;
87 	u32 max_speed;
88 	bool ncsi_mode;
89 
90 	struct clk_bulk clks;
91 
92 	/* End of RX/TX ring buffer bits. Depend on model */
93 	u32 rxdes0_edorr_mask;
94 	u32 txdes0_edotr_mask;
95 };
96 
97 /*
98  * struct mii_bus functions
99  */
100 static int ftgmac100_mdio_read(struct mii_dev *bus, int phy_addr, int dev_addr,
101 			       int reg_addr)
102 {
103 	struct ftgmac100_data *priv = bus->priv;
104 	struct ftgmac100 *ftgmac100 = priv->iobase;
105 	int phycr;
106 	int data;
107 	int ret;
108 
109 	phycr = FTGMAC100_PHYCR_MDC_CYCTHR(MDC_CYCTHR) |
110 		FTGMAC100_PHYCR_PHYAD(phy_addr) |
111 		FTGMAC100_PHYCR_REGAD(reg_addr) |
112 		FTGMAC100_PHYCR_MIIRD;
113 	writel(phycr, &ftgmac100->phycr);
114 
115 	ret = readl_poll_timeout(&ftgmac100->phycr, phycr,
116 				 !(phycr & FTGMAC100_PHYCR_MIIRD),
117 				 FTGMAC100_MDIO_TIMEOUT_USEC);
118 	if (ret) {
119 		pr_err("%s: mdio read failed (phy:%d reg:%x)\n",
120 		       priv->phydev->dev->name, phy_addr, reg_addr);
121 		return ret;
122 	}
123 
124 	data = readl(&ftgmac100->phydata);
125 
126 	return FTGMAC100_PHYDATA_MIIRDATA(data);
127 }
128 
129 static int ftgmac100_mdio_write(struct mii_dev *bus, int phy_addr, int dev_addr,
130 				int reg_addr, u16 value)
131 {
132 	struct ftgmac100_data *priv = bus->priv;
133 	struct ftgmac100 *ftgmac100 = priv->iobase;
134 	int phycr;
135 	int data;
136 	int ret;
137 
138 	phycr = FTGMAC100_PHYCR_MDC_CYCTHR(MDC_CYCTHR) |
139 		FTGMAC100_PHYCR_PHYAD(phy_addr) |
140 		FTGMAC100_PHYCR_REGAD(reg_addr) |
141 		FTGMAC100_PHYCR_MIIWR;
142 	data = FTGMAC100_PHYDATA_MIIWDATA(value);
143 
144 	writel(data, &ftgmac100->phydata);
145 	writel(phycr, &ftgmac100->phycr);
146 
147 	ret = readl_poll_timeout(&ftgmac100->phycr, phycr,
148 				 !(phycr & FTGMAC100_PHYCR_MIIWR),
149 				 FTGMAC100_MDIO_TIMEOUT_USEC);
150 	if (ret) {
151 		pr_err("%s: mdio write failed (phy:%d reg:%x)\n",
152 		       priv->phydev->dev->name, phy_addr, reg_addr);
153 	}
154 
155 	return ret;
156 }
157 
158 static int ftgmac100_mdio_init(struct udevice *dev)
159 {
160 	struct ftgmac100_data *priv = dev_get_priv(dev);
161 	struct mii_dev *bus;
162 	int ret;
163 
164 	bus = mdio_alloc();
165 	if (!bus)
166 		return -ENOMEM;
167 
168 	if(priv->mdio_addr) {
169 		bus->read  = aspeed_mdio_read;
170 		bus->write = aspeed_mdio_write;
171 		bus->priv  = (void *)priv->mdio_addr;
172 	} else {
173 		bus->read  = ftgmac100_mdio_read;
174 		bus->write = ftgmac100_mdio_write;
175 		bus->priv  = priv;
176 	}
177 
178 	ret = mdio_register_seq(bus, dev->seq);
179 	if (ret) {
180 		free(bus);
181 		return ret;
182 	}
183 
184 	priv->bus = bus;
185 
186 	return 0;
187 }
188 
189 static int ftgmac100_phy_adjust_link(struct ftgmac100_data *priv)
190 {
191 	struct ftgmac100 *ftgmac100 = priv->iobase;
192 	struct phy_device *phydev = priv->phydev;
193 	u32 maccr;
194 
195 	if (!phydev->link && !priv->ncsi_mode) {
196 		dev_err(phydev->dev, "No link\n");
197 		return -EREMOTEIO;
198 	}
199 
200 	/* read MAC control register and clear related bits */
201 	maccr = readl(&ftgmac100->maccr) &
202 		~(FTGMAC100_MACCR_GIGA_MODE |
203 		  FTGMAC100_MACCR_FAST_MODE |
204 		  FTGMAC100_MACCR_FULLDUP);
205 
206 	if (phy_interface_is_rgmii(phydev) && phydev->speed == 1000)
207 		maccr |= FTGMAC100_MACCR_GIGA_MODE;
208 
209 	if (phydev->speed == 100)
210 		maccr |= FTGMAC100_MACCR_FAST_MODE;
211 
212 	if (phydev->duplex)
213 		maccr |= FTGMAC100_MACCR_FULLDUP;
214 
215 	/* update MII config into maccr */
216 	writel(maccr, &ftgmac100->maccr);
217 
218 	return 0;
219 }
220 
221 static int ftgmac100_phy_init(struct udevice *dev)
222 {
223 	struct ftgmac100_data *priv = dev_get_priv(dev);
224 	struct phy_device *phydev;
225 	int ret;
226 
227 	phydev = phy_connect(priv->bus, priv->phy_addr, dev, priv->phy_mode);
228 	if (!phydev)
229 		return -ENODEV;
230 
231 	if (!priv->ncsi_mode)
232 		phydev->supported &= PHY_GBIT_FEATURES;
233 	if (priv->max_speed) {
234 		ret = phy_set_supported(phydev, priv->max_speed);
235 		if (ret)
236 			return ret;
237 	}
238 	phydev->advertising = phydev->supported;
239 	priv->phydev = phydev;
240 	phy_config(phydev);
241 
242 	return 0;
243 }
244 
245 /*
246  * Reset MAC
247  */
248 static void ftgmac100_reset(struct ftgmac100_data *priv)
249 {
250 	struct ftgmac100 *ftgmac100 = priv->iobase;
251 
252 	debug("%s()\n", __func__);
253 
254 	setbits_le32(&ftgmac100->maccr, FTGMAC100_MACCR_SW_RST);
255 
256 	while (readl(&ftgmac100->maccr) & FTGMAC100_MACCR_SW_RST)
257 		;
258 }
259 
260 /*
261  * Set MAC address
262  */
263 static int ftgmac100_set_mac(struct ftgmac100_data *priv,
264 			     const unsigned char *mac)
265 {
266 	struct ftgmac100 *ftgmac100 = priv->iobase;
267 	unsigned int maddr = mac[0] << 8 | mac[1];
268 	unsigned int laddr = mac[2] << 24 | mac[3] << 16 | mac[4] << 8 | mac[5];
269 
270 	debug("%s(%x %x)\n", __func__, maddr, laddr);
271 
272 	writel(maddr, &ftgmac100->mac_madr);
273 	writel(laddr, &ftgmac100->mac_ladr);
274 
275 	return 0;
276 }
277 
278 /*
279  * disable transmitter, receiver
280  */
281 static void ftgmac100_stop(struct udevice *dev)
282 {
283 	struct ftgmac100_data *priv = dev_get_priv(dev);
284 	struct ftgmac100 *ftgmac100 = priv->iobase;
285 
286 	debug("%s()\n", __func__);
287 
288 	writel(0, &ftgmac100->maccr);
289 
290 	if (!priv->ncsi_mode)
291 		phy_shutdown(priv->phydev);
292 }
293 
294 static int ftgmac100_start(struct udevice *dev)
295 {
296 	struct eth_pdata *plat = dev_get_platdata(dev);
297 	struct ftgmac100_data *priv = dev_get_priv(dev);
298 	struct ftgmac100 *ftgmac100 = priv->iobase;
299 	struct phy_device *phydev = priv->phydev;
300 	unsigned int maccr;
301 	ulong start, end;
302 	int ret;
303 	int i;
304 
305 	debug("%s()\n", __func__);
306 
307 	ftgmac100_reset(priv);
308 
309 	/* set the ethernet address */
310 	ftgmac100_set_mac(priv, plat->enetaddr);
311 
312 	/* disable all interrupts */
313 	writel(0, &ftgmac100->ier);
314 
315 	/* initialize descriptors */
316 	priv->tx_index = 0;
317 	priv->rx_index = 0;
318 
319 	for (i = 0; i < PKTBUFSTX; i++) {
320 		priv->txdes[i].txdes3 = 0;
321 		priv->txdes[i].txdes0 = 0;
322 	}
323 	priv->txdes[PKTBUFSTX - 1].txdes0 = priv->txdes0_edotr_mask;
324 
325 	start = (ulong)&priv->txdes[0];
326 	end = start + roundup(sizeof(priv->txdes), ARCH_DMA_MINALIGN);
327 	flush_dcache_range(start, end);
328 
329 	for (i = 0; i < PKTBUFSRX; i++) {
330 		priv->rxdes[i].rxdes3 = (unsigned int)net_rx_packets[i];
331 		priv->rxdes[i].rxdes0 = 0;
332 	}
333 	priv->rxdes[PKTBUFSRX - 1].rxdes0 = priv->rxdes0_edorr_mask;
334 
335 	start = (ulong)&priv->rxdes[0];
336 	end = start + roundup(sizeof(priv->rxdes), ARCH_DMA_MINALIGN);
337 	flush_dcache_range(start, end);
338 
339 	/* transmit ring */
340 	writel((u32)priv->txdes, &ftgmac100->txr_badr);
341 
342 	/* receive ring */
343 	writel((u32)priv->rxdes, &ftgmac100->rxr_badr);
344 
345 	/* poll receive descriptor automatically */
346 	writel(FTGMAC100_APTC_RXPOLL_CNT(1), &ftgmac100->aptc);
347 
348 	/* config receive buffer size register */
349 	writel(FTGMAC100_RBSR_SIZE(FTGMAC100_RBSR_DEFAULT), &ftgmac100->rbsr);
350 
351 	/* enable transmitter, receiver */
352 	maccr = FTGMAC100_MACCR_TXMAC_EN |
353 		FTGMAC100_MACCR_RXMAC_EN |
354 		FTGMAC100_MACCR_TXDMA_EN |
355 		FTGMAC100_MACCR_RXDMA_EN |
356 		FTGMAC100_MACCR_CRC_APD |
357 		FTGMAC100_MACCR_FULLDUP |
358 		FTGMAC100_MACCR_RX_RUNT |
359 		FTGMAC100_MACCR_RX_BROADPKT;
360 
361 	writel(maccr, &ftgmac100->maccr);
362 
363 	ret = phy_startup(phydev);
364 	if (ret) {
365 		dev_err(phydev->dev, "Could not start PHY\n");
366 		return ret;
367 	}
368 
369 	ret = ftgmac100_phy_adjust_link(priv);
370 	if (ret) {
371 		dev_err(phydev->dev,  "Could not adjust link\n");
372 		return ret;
373 	}
374 
375 	printf("%s: link up, %d Mbps %s-duplex mac:%pM\n", phydev->dev->name,
376 	       phydev->speed, phydev->duplex ? "full" : "half", plat->enetaddr);
377 
378 	return 0;
379 }
380 
381 static int ftgmac100_free_pkt(struct udevice *dev, uchar *packet, int length)
382 {
383 	struct ftgmac100_data *priv = dev_get_priv(dev);
384 	struct ftgmac100_rxdes *curr_des = &priv->rxdes[priv->rx_index];
385 	ulong des_start = (ulong)curr_des;
386 	ulong des_end = des_start +
387 		roundup(sizeof(*curr_des), ARCH_DMA_MINALIGN);
388 
389 	/* Release buffer to DMA and flush descriptor */
390 	curr_des->rxdes0 &= ~FTGMAC100_RXDES0_RXPKT_RDY;
391 	flush_dcache_range(des_start, des_end);
392 
393 	/* Move to next descriptor */
394 	priv->rx_index = (priv->rx_index + 1) % PKTBUFSRX;
395 
396 	return 0;
397 }
398 
399 /*
400  * Get a data block via Ethernet
401  */
402 static int ftgmac100_recv(struct udevice *dev, int flags, uchar **packetp)
403 {
404 	struct ftgmac100_data *priv = dev_get_priv(dev);
405 	struct ftgmac100_rxdes *curr_des = &priv->rxdes[priv->rx_index];
406 	unsigned short rxlen;
407 	ulong des_start = (ulong)curr_des;
408 	ulong des_end = des_start +
409 		roundup(sizeof(*curr_des), ARCH_DMA_MINALIGN);
410 	ulong data_start = curr_des->rxdes3;
411 	ulong data_end;
412 
413 	invalidate_dcache_range(des_start, des_end);
414 
415 	if (!(curr_des->rxdes0 & FTGMAC100_RXDES0_RXPKT_RDY))
416 		return -EAGAIN;
417 
418 	if (curr_des->rxdes0 & (FTGMAC100_RXDES0_RX_ERR |
419 				FTGMAC100_RXDES0_CRC_ERR |
420 				FTGMAC100_RXDES0_FTL |
421 				FTGMAC100_RXDES0_RUNT |
422 				FTGMAC100_RXDES0_RX_ODD_NB)) {
423 		return -EAGAIN;
424 	}
425 
426 	rxlen = FTGMAC100_RXDES0_VDBC(curr_des->rxdes0);
427 
428 	debug("%s(): RX buffer %d, %x received\n",
429 	       __func__, priv->rx_index, rxlen);
430 
431 	/* Invalidate received data */
432 	data_end = data_start + roundup(rxlen, ARCH_DMA_MINALIGN);
433 	invalidate_dcache_range(data_start, data_end);
434 	*packetp = (uchar *)data_start;
435 
436 	return rxlen;
437 }
438 
439 static u32 ftgmac100_read_txdesc(const void *desc)
440 {
441 	const struct ftgmac100_txdes *txdes = desc;
442 	ulong des_start = (ulong)txdes;
443 	ulong des_end = des_start + roundup(sizeof(*txdes), ARCH_DMA_MINALIGN);
444 
445 	invalidate_dcache_range(des_start, des_end);
446 
447 	return txdes->txdes0;
448 }
449 
450 BUILD_WAIT_FOR_BIT(ftgmac100_txdone, u32, ftgmac100_read_txdesc)
451 
452 /*
453  * Send a data block via Ethernet
454  */
455 static int ftgmac100_send(struct udevice *dev, void *packet, int length)
456 {
457 	struct ftgmac100_data *priv = dev_get_priv(dev);
458 	struct ftgmac100 *ftgmac100 = priv->iobase;
459 	struct ftgmac100_txdes *curr_des = &priv->txdes[priv->tx_index];
460 	ulong des_start = (ulong)curr_des;
461 	ulong des_end = des_start +
462 		roundup(sizeof(*curr_des), ARCH_DMA_MINALIGN);
463 	ulong data_start;
464 	ulong data_end;
465 	int rc;
466 
467 	invalidate_dcache_range(des_start, des_end);
468 
469 	if (curr_des->txdes0 & FTGMAC100_TXDES0_TXDMA_OWN) {
470 		dev_err(dev, "no TX descriptor available\n");
471 		return -EPERM;
472 	}
473 
474 	debug("%s(%x, %x)\n", __func__, (int)packet, length);
475 
476 	length = (length < ETH_ZLEN) ? ETH_ZLEN : length;
477 
478 	curr_des->txdes3 = (unsigned int)packet;
479 
480 	/* Flush data to be sent */
481 	data_start = curr_des->txdes3;
482 	data_end = data_start + roundup(length, ARCH_DMA_MINALIGN);
483 	flush_dcache_range(data_start, data_end);
484 
485 	/* Only one segment on TXBUF */
486 	curr_des->txdes0 &= priv->txdes0_edotr_mask;
487 	curr_des->txdes0 |= FTGMAC100_TXDES0_FTS |
488 			    FTGMAC100_TXDES0_LTS |
489 			    FTGMAC100_TXDES0_TXBUF_SIZE(length) |
490 			    FTGMAC100_TXDES0_TXDMA_OWN ;
491 
492 	/* Flush modified buffer descriptor */
493 	flush_dcache_range(des_start, des_end);
494 
495 	/* Start transmit */
496 	writel(1, &ftgmac100->txpd);
497 
498 	rc = wait_for_bit_ftgmac100_txdone(curr_des,
499 					   FTGMAC100_TXDES0_TXDMA_OWN, false,
500 					   FTGMAC100_TX_TIMEOUT_MS, true);
501 	if (rc)
502 		return rc;
503 
504 	debug("%s(): packet sent\n", __func__);
505 
506 	/* Move to next descriptor */
507 	priv->tx_index = (priv->tx_index + 1) % PKTBUFSTX;
508 
509 	return 0;
510 }
511 
512 static int ftgmac100_write_hwaddr(struct udevice *dev)
513 {
514 	struct eth_pdata *pdata = dev_get_platdata(dev);
515 	struct ftgmac100_data *priv = dev_get_priv(dev);
516 
517 	return ftgmac100_set_mac(priv, pdata->enetaddr);
518 }
519 
520 static int ftgmac100_ofdata_to_platdata(struct udevice *dev)
521 {
522 	struct eth_pdata *pdata = dev_get_platdata(dev);
523 	struct ftgmac100_data *priv = dev_get_priv(dev);
524 	const char *phy_mode;
525 
526 	pdata->iobase = devfdt_get_addr(dev);
527 	pdata->phy_interface = -1;
528 	phy_mode = dev_read_string(dev, "phy-mode");
529 
530 	if (phy_mode)
531 		pdata->phy_interface = phy_get_interface_by_name(phy_mode);
532 	if (pdata->phy_interface == -1) {
533 		dev_err(dev, "Invalid PHY interface '%s'\n", phy_mode);
534 		return -EINVAL;
535 	}
536 
537 	pdata->max_speed = dev_read_u32_default(dev, "max-speed", 0);
538 
539 	if (dev_get_driver_data(dev) == FTGMAC100_MODEL_NEW_ASPEED) {
540 		priv->mdio_addr =  devfdt_get_addr_index(dev, 1);
541 		debug("priv->mdio_addr %x \n", (u32)priv->mdio_addr);
542 
543 	}
544 	if ((dev_get_driver_data(dev) == FTGMAC100_MODEL_ASPEED) ||
545 		(dev_get_driver_data(dev) == FTGMAC100_MODEL_NEW_ASPEED)){
546 		priv->rxdes0_edorr_mask = BIT(30);
547 		priv->txdes0_edotr_mask = BIT(30);
548 	} else {
549 		priv->rxdes0_edorr_mask = BIT(15);
550 		priv->txdes0_edotr_mask = BIT(15);
551 	}
552 
553 	return clk_get_bulk(dev, &priv->clks);
554 }
555 
556 static int ftgmac100_probe(struct udevice *dev)
557 {
558 	struct eth_pdata *pdata = dev_get_platdata(dev);
559 	struct ftgmac100_data *priv = dev_get_priv(dev);
560 	const char *phy_mode;
561 	int ret;
562 
563 	phy_mode = dev_read_string(dev, "phy-mode");
564 	priv->ncsi_mode = dev_read_bool(dev, "use-ncsi") ||
565 		(phy_mode && strcmp(phy_mode, "NC-SI") == 0);
566 
567 	priv->iobase = (struct ftgmac100 *)pdata->iobase;
568 	priv->phy_mode = pdata->phy_interface;
569 	priv->max_speed = pdata->max_speed;
570 	priv->phy_addr = 0;
571 
572 	ret = clk_enable_bulk(&priv->clks);
573 	if (ret)
574 		goto out;
575 
576 	if (priv->ncsi_mode) {
577 		printf("%s - NCSI detected\n", __func__);
578 	} else {
579 		ret = ftgmac100_mdio_init(dev);
580 		if (ret) {
581 			dev_err(dev, "Failed to initialize mdiobus: %d\n", ret);
582 			goto out;
583 		}
584 
585 	}
586 
587 	ret = ftgmac100_phy_init(dev);
588 	if (ret) {
589 		dev_err(dev, "Failed to initialize PHY: %d\n", ret);
590 		goto out;
591 	}
592 
593 out:
594 	if (ret)
595 		clk_release_bulk(&priv->clks);
596 
597 	return ret;
598 }
599 
600 static int ftgmac100_remove(struct udevice *dev)
601 {
602 	struct ftgmac100_data *priv = dev_get_priv(dev);
603 
604 	if (!priv->ncsi_mode) {
605 		free(priv->phydev);
606 		mdio_unregister(priv->bus);
607 		mdio_free(priv->bus);
608 	} else {
609 		free(priv->phydev);
610 	}
611 	clk_release_bulk(&priv->clks);
612 
613 	return 0;
614 }
615 
616 static const struct eth_ops ftgmac100_ops = {
617 	.start	= ftgmac100_start,
618 	.send	= ftgmac100_send,
619 	.recv	= ftgmac100_recv,
620 	.stop	= ftgmac100_stop,
621 	.free_pkt = ftgmac100_free_pkt,
622 	.write_hwaddr = ftgmac100_write_hwaddr,
623 };
624 
625 static const struct udevice_id ftgmac100_ids[] = {
626 	{ .compatible = "faraday,ftgmac100",  .data = FTGMAC100_MODEL_FARADAY },
627 	{ .compatible = "aspeed,ast2500-mac", .data = FTGMAC100_MODEL_ASPEED  },
628 	{ .compatible = "aspeed,ast2600-mac", .data = FTGMAC100_MODEL_NEW_ASPEED  },
629 	{ }
630 };
631 
632 U_BOOT_DRIVER(ftgmac100) = {
633 	.name	= "ftgmac100",
634 	.id	= UCLASS_ETH,
635 	.of_match = ftgmac100_ids,
636 	.ofdata_to_platdata = ftgmac100_ofdata_to_platdata,
637 	.probe	= ftgmac100_probe,
638 	.remove = ftgmac100_remove,
639 	.ops	= &ftgmac100_ops,
640 	.priv_auto_alloc_size = sizeof(struct ftgmac100_data),
641 	.platdata_auto_alloc_size = sizeof(struct eth_pdata),
642 	.flags	= DM_FLAG_ALLOC_PRIV_DMA,
643 };
644