Lines Matching +full:mac +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright 2009-2012 Freescale Semiconductor, Inc.
40 bus.priv = priv->mac->phyregs; in dtsec_configure_serdes()
41 bool sgmii_2500 = (priv->enet_if == in dtsec_configure_serdes()
46 /* SGMII IF mode + AN enable only for 1G SGMII, not for 2.5G */ in dtsec_configure_serdes()
80 if ((priv->enet_if == PHY_INTERFACE_MODE_QSGMII) && (i < 3)) { in dtsec_configure_serdes()
85 struct dtsec *regs = priv->mac->base; in dtsec_configure_serdes()
86 struct tsec_mii_mng *phyregs = priv->mac->phyregs; in dtsec_configure_serdes()
92 tsec_local_mdio_write(phyregs, in_be32(®s->tbipa), 0, TBI_TBICON, in dtsec_configure_serdes()
94 tsec_local_mdio_write(phyregs, in_be32(®s->tbipa), 0, TBI_ANA, in dtsec_configure_serdes()
96 tsec_local_mdio_write(phyregs, in_be32(®s->tbipa), 0, in dtsec_configure_serdes()
103 struct fm_eth *fm_eth = dev->priv; in dtsec_init_phy()
108 out_be32(®s->tbipa, CONFIG_SYS_TBIPA_VALUE); in dtsec_init_phy()
111 if (fm_eth->enet_if == PHY_INTERFACE_MODE_SGMII || in dtsec_init_phy()
112 fm_eth->enet_if == PHY_INTERFACE_MODE_QSGMII || in dtsec_init_phy()
113 fm_eth->enet_if == PHY_INTERFACE_MODE_SGMII_2500) in dtsec_init_phy()
120 struct fm_eth *fm = dev->priv; in tgec_is_fibre()
123 sprintf(phyopt, "fsl_fm%d_xaui_phy", fm->fm_index + 1); in tgec_is_fibre()
166 clrbits_be32(&rx_port->fmbm_rcfg, FMBM_RCFG_EN); in bmi_rx_port_disable()
169 while ((in_be32(&rx_port->fmbm_rst) & FMBM_RST_BSY) && timeout--) in bmi_rx_port_disable()
175 /* set BMI to independent mode, Rx port disable */ in bmi_rx_port_init()
176 out_be32(&rx_port->fmbm_rcfg, FMBM_RCFG_IM); in bmi_rx_port_init()
178 out_be32(&rx_port->fmbm_rim, 0); in bmi_rx_port_init()
179 /* Rx frame next engine -RISC */ in bmi_rx_port_init()
180 out_be32(&rx_port->fmbm_rfne, NIA_ENG_RISC | NIA_RISC_AC_IM_RX); in bmi_rx_port_init()
181 /* Rx command attribute - no order, MR[3] = 1 */ in bmi_rx_port_init()
182 clrbits_be32(&rx_port->fmbm_rfca, FMBM_RFCA_ORDER | FMBM_RFCA_MR_MASK); in bmi_rx_port_init()
183 setbits_be32(&rx_port->fmbm_rfca, FMBM_RFCA_MR(4)); in bmi_rx_port_init()
185 out_be32(&rx_port->fmbm_rstc, FMBM_RSTC_EN); in bmi_rx_port_init()
187 out_be32(&rx_port->fmbm_rpc, 0); in bmi_rx_port_init()
194 clrbits_be32(&tx_port->fmbm_tcfg, FMBM_TCFG_EN); in bmi_tx_port_disable()
197 while ((in_be32(&tx_port->fmbm_tst) & FMBM_TST_BSY) && timeout--) in bmi_tx_port_disable()
203 /* set BMI to independent mode, Tx port disable */ in bmi_tx_port_init()
204 out_be32(&tx_port->fmbm_tcfg, FMBM_TCFG_IM); in bmi_tx_port_init()
205 /* Tx frame next engine -RISC */ in bmi_tx_port_init()
206 out_be32(&tx_port->fmbm_tfne, NIA_ENG_RISC | NIA_RISC_AC_IM_TX); in bmi_tx_port_init()
207 out_be32(&tx_port->fmbm_tfene, NIA_ENG_RISC | NIA_RISC_AC_IM_TX); in bmi_tx_port_init()
208 /* Tx command attribute - no order, MR[3] = 1 */ in bmi_tx_port_init()
209 clrbits_be32(&tx_port->fmbm_tfca, FMBM_TFCA_ORDER | FMBM_TFCA_MR_MASK); in bmi_tx_port_init()
210 setbits_be32(&tx_port->fmbm_tfca, FMBM_TFCA_MR(4)); in bmi_tx_port_init()
212 out_be32(&tx_port->fmbm_tstc, FMBM_TSTC_EN); in bmi_tx_port_init()
214 out_be32(&tx_port->fmbm_tpc, 0); in bmi_tx_port_init()
227 struct fm_bmi_rx_port *bmi_rx_port = fm_eth->rx_port; in fm_eth_rx_port_parameter_init()
231 pram = (struct fm_port_global_pram *)fm_muram_alloc(fm_eth->fm_index, in fm_eth_rx_port_parameter_init()
235 return -ENOMEM; in fm_eth_rx_port_parameter_init()
238 fm_eth->rx_pram = pram; in fm_eth_rx_port_parameter_init()
241 pram_page_offset = (void *)pram - fm_muram_base(fm_eth->fm_index); in fm_eth_rx_port_parameter_init()
243 /* enable global mode- snooping data buffers and BDs */ in fm_eth_rx_port_parameter_init()
244 out_be32(&pram->mode, PRAM_MODE_GLOBAL); in fm_eth_rx_port_parameter_init()
247 out_be32(&pram->rxqd_ptr, pram_page_offset + 0x20); in fm_eth_rx_port_parameter_init()
250 muram_writew(&pram->mrblr, MAX_RXBUF_LOG2); in fm_eth_rx_port_parameter_init()
256 return -ENOMEM; in fm_eth_rx_port_parameter_init()
264 return -ENOMEM; in fm_eth_rx_port_parameter_init()
270 fm_eth->rx_bd_ring = rx_bd_ring_base; in fm_eth_rx_port_parameter_init()
271 fm_eth->cur_rxbd = rx_bd_ring_base; in fm_eth_rx_port_parameter_init()
272 fm_eth->rx_buf = rx_buf_pool; in fm_eth_rx_port_parameter_init()
277 muram_writew(&rxbd->status, RxBD_EMPTY); in fm_eth_rx_port_parameter_init()
278 muram_writew(&rxbd->len, 0); in fm_eth_rx_port_parameter_init()
283 muram_writew(&rxbd->buf_ptr_hi, (u16)buf_hi); in fm_eth_rx_port_parameter_init()
284 out_be32(&rxbd->buf_ptr_lo, buf_lo); in fm_eth_rx_port_parameter_init()
289 rxqd = &pram->rxqd; in fm_eth_rx_port_parameter_init()
290 muram_writew(&rxqd->gen, 0); in fm_eth_rx_port_parameter_init()
293 muram_writew(&rxqd->bd_ring_base_hi, (u16)bd_ring_base_hi); in fm_eth_rx_port_parameter_init()
294 out_be32(&rxqd->bd_ring_base_lo, bd_ring_base_lo); in fm_eth_rx_port_parameter_init()
295 muram_writew(&rxqd->bd_ring_size, sizeof(struct fm_port_bd) in fm_eth_rx_port_parameter_init()
297 muram_writew(&rxqd->offset_in, 0); in fm_eth_rx_port_parameter_init()
298 muram_writew(&rxqd->offset_out, 0); in fm_eth_rx_port_parameter_init()
301 out_be32(&bmi_rx_port->fmbm_rfqid, pram_page_offset); in fm_eth_rx_port_parameter_init()
314 struct fm_bmi_tx_port *bmi_tx_port = fm_eth->tx_port; in fm_eth_tx_port_parameter_init()
318 pram = (struct fm_port_global_pram *)fm_muram_alloc(fm_eth->fm_index, in fm_eth_tx_port_parameter_init()
322 return -ENOMEM; in fm_eth_tx_port_parameter_init()
324 fm_eth->tx_pram = pram; in fm_eth_tx_port_parameter_init()
327 pram_page_offset = (void *)pram - fm_muram_base(fm_eth->fm_index); in fm_eth_tx_port_parameter_init()
329 /* enable global mode- snooping data buffers and BDs */ in fm_eth_tx_port_parameter_init()
330 out_be32(&pram->mode, PRAM_MODE_GLOBAL); in fm_eth_tx_port_parameter_init()
333 out_be32(&pram->txqd_ptr, pram_page_offset + 0x40); in fm_eth_tx_port_parameter_init()
339 return -ENOMEM; in fm_eth_tx_port_parameter_init()
344 fm_eth->tx_bd_ring = tx_bd_ring_base; in fm_eth_tx_port_parameter_init()
345 fm_eth->cur_txbd = tx_bd_ring_base; in fm_eth_tx_port_parameter_init()
350 muram_writew(&txbd->status, TxBD_LAST); in fm_eth_tx_port_parameter_init()
351 muram_writew(&txbd->len, 0); in fm_eth_tx_port_parameter_init()
352 muram_writew(&txbd->buf_ptr_hi, 0); in fm_eth_tx_port_parameter_init()
353 out_be32(&txbd->buf_ptr_lo, 0); in fm_eth_tx_port_parameter_init()
358 txqd = &pram->txqd; in fm_eth_tx_port_parameter_init()
361 muram_writew(&txqd->bd_ring_base_hi, (u16)bd_ring_base_hi); in fm_eth_tx_port_parameter_init()
362 out_be32(&txqd->bd_ring_base_lo, bd_ring_base_lo); in fm_eth_tx_port_parameter_init()
363 muram_writew(&txqd->bd_ring_size, sizeof(struct fm_port_bd) in fm_eth_tx_port_parameter_init()
365 muram_writew(&txqd->offset_in, 0); in fm_eth_tx_port_parameter_init()
366 muram_writew(&txqd->offset_out, 0); in fm_eth_tx_port_parameter_init()
369 out_be32(&bmi_tx_port->fmbm_tcfqid, pram_page_offset); in fm_eth_tx_port_parameter_init()
391 struct fsl_enet_mac *mac; in fm_eth_startup() local
394 mac = fm_eth->mac; in fm_eth_startup()
400 /* setup the MAC controller */ in fm_eth_startup()
401 mac->init_mac(mac); in fm_eth_startup()
404 if (((fm_eth->enet_if == PHY_INTERFACE_MODE_SGMII) || in fm_eth_startup()
405 (fm_eth->enet_if == PHY_INTERFACE_MODE_SGMII_2500) || in fm_eth_startup()
406 (fm_eth->enet_if == PHY_INTERFACE_MODE_QSGMII)) && in fm_eth_startup()
407 mac->set_if_mode) in fm_eth_startup()
408 mac->set_if_mode(mac, fm_eth->enet_if, SPEED_100); in fm_eth_startup()
410 /* init bmi rx port, IM mode and disable */ in fm_eth_startup()
411 bmi_rx_port_init(fm_eth->rx_port); in fm_eth_startup()
412 /* init bmi tx port, IM mode and disable */ in fm_eth_startup()
413 bmi_tx_port_init(fm_eth->tx_port); in fm_eth_startup()
422 pram = fm_eth->tx_pram; in fmc_tx_port_graceful_stop_enable()
424 setbits_be32(&pram->mode, PRAM_MODE_GRACEFUL_STOP); in fmc_tx_port_graceful_stop_enable()
432 pram = fm_eth->tx_pram; in fmc_tx_port_graceful_stop_disable()
433 /* re-enable transmission of frames */ in fmc_tx_port_graceful_stop_disable()
434 clrbits_be32(&pram->mode, PRAM_MODE_GRACEFUL_STOP); in fmc_tx_port_graceful_stop_disable()
441 struct fsl_enet_mac *mac; in fm_eth_open() local
446 fm_eth = (struct fm_eth *)dev->priv; in fm_eth_open()
447 mac = fm_eth->mac; in fm_eth_open()
449 /* setup the MAC address */ in fm_eth_open()
450 if (dev->enetaddr[0] & 0x01) { in fm_eth_open()
454 mac->set_mac_addr(mac, dev->enetaddr); in fm_eth_open()
457 setbits_be32(&fm_eth->rx_port->fmbm_rcfg, FMBM_RCFG_EN); in fm_eth_open()
458 /* enable MAC rx/tx port */ in fm_eth_open()
459 mac->enable_mac(mac); in fm_eth_open()
461 setbits_be32(&fm_eth->tx_port->fmbm_tcfg, FMBM_TCFG_EN); in fm_eth_open()
462 /* re-enable transmission of frame */ in fm_eth_open()
466 if (fm_eth->phydev) { in fm_eth_open()
467 ret = phy_startup(fm_eth->phydev); in fm_eth_open()
470 fm_eth->phydev->dev->name); in fm_eth_open()
477 fm_eth->phydev->speed = SPEED_1000; in fm_eth_open()
478 fm_eth->phydev->link = 1; in fm_eth_open()
479 fm_eth->phydev->duplex = DUPLEX_FULL; in fm_eth_open()
482 /* set the MAC-PHY mode */ in fm_eth_open()
483 mac->set_if_mode(mac, fm_eth->enet_if, fm_eth->phydev->speed); in fm_eth_open()
485 if (!fm_eth->phydev->link) in fm_eth_open()
486 printf("%s: No link.\n", fm_eth->phydev->dev->name); in fm_eth_open()
488 return fm_eth->phydev->link ? 0 : -1; in fm_eth_open()
494 struct fsl_enet_mac *mac; in fm_eth_halt() local
496 fm_eth = (struct fm_eth *)dev->priv; in fm_eth_halt()
497 mac = fm_eth->mac; in fm_eth_halt()
502 bmi_tx_port_disable(fm_eth->tx_port); in fm_eth_halt()
503 /* disable MAC rx/tx port */ in fm_eth_halt()
504 mac->disable_mac(mac); in fm_eth_halt()
506 bmi_rx_port_disable(fm_eth->rx_port); in fm_eth_halt()
509 if (fm_eth->phydev) in fm_eth_halt()
510 phy_shutdown(fm_eth->phydev); in fm_eth_halt()
522 fm_eth = (struct fm_eth *)dev->priv; in fm_eth_send()
523 pram = fm_eth->tx_pram; in fm_eth_send()
524 txbd = fm_eth->cur_txbd; in fm_eth_send()
527 for (i = 0; muram_readw(&txbd->status) & TxBD_READY; i++) { in fm_eth_send()
530 printf("%s: Tx buffer not ready, txbd->status = 0x%x\n", in fm_eth_send()
531 dev->name, muram_readw(&txbd->status)); in fm_eth_send()
536 muram_writew(&txbd->buf_ptr_hi, (u16)upper_32_bits(virt_to_phys(buf))); in fm_eth_send()
537 out_be32(&txbd->buf_ptr_lo, lower_32_bits(virt_to_phys(buf))); in fm_eth_send()
538 muram_writew(&txbd->len, len); in fm_eth_send()
540 muram_writew(&txbd->status, TxBD_READY | TxBD_LAST); in fm_eth_send()
544 offset_in = muram_readw(&pram->txqd.offset_in); in fm_eth_send()
546 if (offset_in >= muram_readw(&pram->txqd.bd_ring_size)) in fm_eth_send()
548 muram_writew(&pram->txqd.offset_in, offset_in); in fm_eth_send()
552 for (i = 0; muram_readw(&txbd->status) & TxBD_READY; i++) { in fm_eth_send()
555 printf("%s: Tx error, txbd->status = 0x%x\n", in fm_eth_send()
556 dev->name, muram_readw(&txbd->status)); in fm_eth_send()
563 txbd_base = (struct fm_port_bd *)fm_eth->tx_bd_ring; in fm_eth_send()
567 fm_eth->cur_txbd = (void *)txbd; in fm_eth_send()
583 fm_eth = (struct fm_eth *)dev->priv; in fm_eth_recv()
584 pram = fm_eth->rx_pram; in fm_eth_recv()
585 rxbd = fm_eth->cur_rxbd; in fm_eth_recv()
586 status = muram_readw(&rxbd->status); in fm_eth_recv()
590 buf_hi = muram_readw(&rxbd->buf_ptr_hi); in fm_eth_recv()
591 buf_lo = in_be32(&rxbd->buf_ptr_lo); in fm_eth_recv()
593 len = muram_readw(&rxbd->len); in fm_eth_recv()
596 printf("%s: Rx error\n", dev->name); in fm_eth_recv()
601 muram_writew(&rxbd->status, RxBD_EMPTY); in fm_eth_recv()
602 muram_writew(&rxbd->len, 0); in fm_eth_recv()
607 rxbd_base = (struct fm_port_bd *)fm_eth->rx_bd_ring; in fm_eth_recv()
611 status = muram_readw(&rxbd->status); in fm_eth_recv()
614 offset_out = muram_readw(&pram->rxqd.offset_out); in fm_eth_recv()
616 if (offset_out >= muram_readw(&pram->rxqd.bd_ring_size)) in fm_eth_recv()
618 muram_writew(&pram->rxqd.offset_out, offset_out); in fm_eth_recv()
621 fm_eth->cur_rxbd = (void *)rxbd; in fm_eth_recv()
628 struct fsl_enet_mac *mac; in fm_eth_init_mac() local
632 num = fm_eth->num; in fm_eth_init_mac()
636 if (fm_eth->type == FM_ETH_10G_E) { in fm_eth_init_mac()
642 if (fm_eth->num >= 2) in fm_eth_init_mac()
643 num -= 2; in fm_eth_init_mac()
648 base = ®->memac[num].fm_memac; in fm_eth_init_mac()
649 phyregs = ®->memac[num].fm_memac_mdio; in fm_eth_init_mac()
651 /* Get the mac registers base address */ in fm_eth_init_mac()
652 if (fm_eth->type == FM_ETH_1G_E) { in fm_eth_init_mac()
653 base = ®->mac_1g[num].fm_dtesc; in fm_eth_init_mac()
654 phyregs = ®->mac_1g[num].fm_mdio.miimcfg; in fm_eth_init_mac()
656 base = ®->mac_10g[num].fm_10gec; in fm_eth_init_mac()
657 phyregs = ®->mac_10g[num].fm_10gec_mdio; in fm_eth_init_mac()
661 /* alloc mac controller */ in fm_eth_init_mac()
662 mac = malloc(sizeof(struct fsl_enet_mac)); in fm_eth_init_mac()
663 if (!mac) in fm_eth_init_mac()
664 return -ENOMEM; in fm_eth_init_mac()
665 memset(mac, 0, sizeof(struct fsl_enet_mac)); in fm_eth_init_mac()
667 /* save the mac to fm_eth struct */ in fm_eth_init_mac()
668 fm_eth->mac = mac; in fm_eth_init_mac()
671 init_memac(mac, base, phyregs, MAX_RXBUF_LEN); in fm_eth_init_mac()
673 if (fm_eth->type == FM_ETH_1G_E) in fm_eth_init_mac()
674 init_dtsec(mac, base, phyregs, MAX_RXBUF_LEN); in fm_eth_init_mac()
676 init_tgec(mac, base, phyregs, MAX_RXBUF_LEN); in fm_eth_init_mac()
684 struct fm_eth *fm_eth = dev->priv; in init_phy()
690 if (fm_eth->type == FM_ETH_1G_E) in init_phy()
694 if (fm_eth->bus) { in init_phy()
695 phydev = phy_connect(fm_eth->bus, fm_eth->phyaddr, dev, in init_phy()
696 fm_eth->enet_if); in init_phy()
699 return -1; in init_phy()
705 if (fm_eth->type == FM_ETH_1G_E) { in init_phy()
715 phydev->port = PORT_FIBRE; in init_phy()
718 phydev->supported &= supported; in init_phy()
719 phydev->advertising = phydev->supported; in init_phy()
721 fm_eth->phydev = phydev; in init_phy()
733 int i, num = info->num; in fm_eth_initialize()
739 return -ENOMEM; in fm_eth_initialize()
745 return -ENOMEM; in fm_eth_initialize()
749 fm_eth->fm_index = info->index - 1; /* keep as 0 based for muram */ in fm_eth_initialize()
750 fm_eth->num = num; in fm_eth_initialize()
751 fm_eth->type = info->type; in fm_eth_initialize()
753 fm_eth->rx_port = (void *)®->port[info->rx_port_id - 1].fm_bmi; in fm_eth_initialize()
754 fm_eth->tx_port = (void *)®->port[info->tx_port_id - 1].fm_bmi; in fm_eth_initialize()
757 fm_eth->max_rx_len = MAX_RXBUF_LEN; in fm_eth_initialize()
759 /* init global mac structure */ in fm_eth_initialize()
765 if (fm_eth->type == FM_ETH_1G_E) in fm_eth_initialize()
766 sprintf(dev->name, "FM%d@DTSEC%d", info->index, num + 1); in fm_eth_initialize()
768 sprintf(dev->name, "FM%d@TGEC%d", info->index, num + 1); in fm_eth_initialize()
771 dev->iobase = 0; in fm_eth_initialize()
772 dev->priv = (void *)fm_eth; in fm_eth_initialize()
773 dev->init = fm_eth_open; in fm_eth_initialize()
774 dev->halt = fm_eth_halt; in fm_eth_initialize()
775 dev->send = fm_eth_send; in fm_eth_initialize()
776 dev->recv = fm_eth_recv; in fm_eth_initialize()
777 fm_eth->dev = dev; in fm_eth_initialize()
778 fm_eth->bus = info->bus; in fm_eth_initialize()
779 fm_eth->phyaddr = info->phy_addr; in fm_eth_initialize()
780 fm_eth->enet_if = info->enet_if; in fm_eth_initialize()
791 dev->enetaddr[i] = 0; in fm_eth_initialize()