Lines Matching full:emac
54 static void icssg_config_sr1(struct prueth *prueth, struct prueth_emac *emac, in icssg_config_sr1() argument
64 config.rx_flow_id = cpu_to_le32(emac->rx_flow_id_base); /* flow id for host port */ in icssg_config_sr1()
65 config.rx_mgr_flow_id = cpu_to_le32(emac->rx_mgm_flow_id_base); /* for mgm ch */ in icssg_config_sr1()
76 emac->speed = SPEED_1000; in icssg_config_sr1()
77 emac->duplex = DUPLEX_FULL; in icssg_config_sr1()
80 static int emac_send_command_sr1(struct prueth_emac *emac, u32 cmd) in emac_send_command_sr1() argument
83 u32 pkt_len = sizeof(emac->cmd_data); in emac_send_command_sr1()
84 __le32 *data = emac->cmd_data; in emac_send_command_sr1()
91 netdev_dbg(emac->ndev, "Sending cmd %x\n", cmd); in emac_send_command_sr1()
94 mutex_lock(&emac->cmd_lock); in emac_send_command_sr1()
98 tx_chn = &emac->tx_chns[emac->tx_ch_num - 1]; in emac_send_command_sr1()
103 netdev_err(emac->ndev, "cmd %x: failed to map cmd buffer\n", cmd); in emac_send_command_sr1()
110 netdev_err(emac->ndev, "cmd %x: failed to allocate descriptor\n", cmd); in emac_send_command_sr1()
132 reinit_completion(&emac->cmd_complete); in emac_send_command_sr1()
135 netdev_err(emac->ndev, "cmd %x: push failed: %d\n", cmd, ret); in emac_send_command_sr1()
138 ret = wait_for_completion_timeout(&emac->cmd_complete, msecs_to_jiffies(100)); in emac_send_command_sr1()
140 netdev_err(emac->ndev, "cmd %x: completion timeout\n", cmd); in emac_send_command_sr1()
142 mutex_unlock(&emac->cmd_lock); in emac_send_command_sr1()
148 mutex_unlock(&emac->cmd_lock); in emac_send_command_sr1()
153 static void icssg_config_set_speed_sr1(struct prueth_emac *emac) in icssg_config_set_speed_sr1() argument
156 struct prueth *prueth = emac->prueth; in icssg_config_set_speed_sr1()
157 int slice = prueth_emac_slice(emac); in icssg_config_set_speed_sr1()
169 emac_send_command_sr1(emac, cmd); in icssg_config_set_speed_sr1()
175 struct prueth_emac *emac = netdev_priv(ndev); in emac_adjust_link_sr1() local
177 struct prueth *prueth = emac->prueth; in emac_adjust_link_sr1()
183 if (phydev->duplex != emac->duplex) { in emac_adjust_link_sr1()
185 emac->duplex = phydev->duplex; in emac_adjust_link_sr1()
187 if (phydev->speed != emac->speed) { in emac_adjust_link_sr1()
189 emac->speed = phydev->speed; in emac_adjust_link_sr1()
191 if (!emac->link) { in emac_adjust_link_sr1()
193 emac->link = 1; in emac_adjust_link_sr1()
195 } else if (emac->link) { in emac_adjust_link_sr1()
197 emac->link = 0; in emac_adjust_link_sr1()
200 emac->speed = SPEED_1000; in emac_adjust_link_sr1()
203 emac->duplex = DUPLEX_FULL; in emac_adjust_link_sr1()
212 if (emac->link) { in emac_adjust_link_sr1()
214 icssg_update_rgmii_cfg(prueth->miig_rt, emac); in emac_adjust_link_sr1()
217 spin_lock_irqsave(&emac->lock, flags); in emac_adjust_link_sr1()
218 icssg_config_ipg(emac); in emac_adjust_link_sr1()
219 spin_unlock_irqrestore(&emac->lock, flags); in emac_adjust_link_sr1()
220 icssg_config_set_speed_sr1(emac); in emac_adjust_link_sr1()
224 if (emac->link) { in emac_adjust_link_sr1()
229 prueth_cleanup_tx_ts(emac); in emac_adjust_link_sr1()
233 static int emac_phy_connect(struct prueth_emac *emac) in emac_phy_connect() argument
235 struct prueth *prueth = emac->prueth; in emac_phy_connect()
236 struct net_device *ndev = emac->ndev; in emac_phy_connect()
238 ndev->phydev = of_phy_connect(emac->ndev, emac->phy_node, in emac_phy_connect()
240 emac->phy_if); in emac_phy_connect()
243 emac->phy_node->full_name); in emac_phy_connect()
247 if (!emac->half_duplex) { in emac_phy_connect()
261 if (emac->phy_if == PHY_INTERFACE_MODE_MII) in emac_phy_connect()
272 static struct page *prueth_process_rx_mgm(struct prueth_emac *emac, in prueth_process_rx_mgm() argument
275 struct prueth_rx_chn *rx_chn = &emac->rx_mgm_chn; in prueth_process_rx_mgm()
276 struct net_device *ndev = emac->ndev; in prueth_process_rx_mgm()
322 ret = prueth_dma_rx_push_mapped(emac, &emac->rx_chns, new_page, in prueth_process_rx_mgm()
330 static void prueth_tx_ts_sr1(struct prueth_emac *emac, in prueth_tx_ts_sr1() argument
345 netdev_dbg(emac->ndev, "Invalid TX TS cookie 0x%x\n", in prueth_tx_ts_sr1()
350 skb = emac->tx_ts_skb[cookie]; in prueth_tx_ts_sr1()
351 emac->tx_ts_skb[cookie] = NULL; /* free slot */ in prueth_tx_ts_sr1()
362 struct prueth_emac *emac = dev_id; in prueth_rx_mgm_ts_thread_sr1() local
365 page = prueth_process_rx_mgm(emac, PRUETH_RX_MGM_FLOW_TIMESTAMP_SR1); in prueth_rx_mgm_ts_thread_sr1()
369 prueth_tx_ts_sr1(emac, (void *)page_address(page)); in prueth_rx_mgm_ts_thread_sr1()
377 struct prueth_emac *emac = dev_id; in prueth_rx_mgm_rsp_thread() local
381 page = prueth_process_rx_mgm(emac, PRUETH_RX_MGM_FLOW_RESPONSE_SR1); in prueth_rx_mgm_rsp_thread()
388 netdev_dbg(emac->ndev, "f/w Shutdown cmd resp %x\n", rsp); in prueth_rx_mgm_rsp_thread()
389 complete(&emac->cmd_complete); in prueth_rx_mgm_rsp_thread()
391 netdev_dbg(emac->ndev, "f/w Speed/Duplex cmd rsp %x\n", rsp); in prueth_rx_mgm_rsp_thread()
392 complete(&emac->cmd_complete); in prueth_rx_mgm_rsp_thread()
411 static int prueth_emac_start(struct prueth *prueth, struct prueth_emac *emac) in prueth_emac_start() argument
419 slice = prueth_emac_slice(emac); in prueth_emac_start()
421 netdev_err(emac->ndev, "invalid port\n"); in prueth_emac_start()
425 icssg_config_sr1(prueth, emac, slice); in prueth_emac_start()
449 static void prueth_emac_stop(struct prueth_emac *emac) in prueth_emac_stop() argument
451 struct prueth *prueth = emac->prueth; in prueth_emac_stop()
454 switch (emac->port_id) { in prueth_emac_stop()
462 netdev_err(emac->ndev, "invalid port\n"); in prueth_emac_stop()
466 if (!emac->is_sr1) in prueth_emac_stop()
473 * emac_ndo_open - EMAC device open
482 struct prueth_emac *emac = netdev_priv(ndev); in emac_ndo_open() local
483 int num_data_chn = emac->tx_ch_num - 1; in emac_ndo_open()
484 struct prueth *prueth = emac->prueth; in emac_ndo_open()
485 int slice = prueth_emac_slice(emac); in emac_ndo_open()
497 ether_addr_copy(emac->mac_addr, ndev->dev_addr); in emac_ndo_open()
499 icssg_class_set_mac_addr(prueth->miig_rt, slice, emac->mac_addr); in emac_ndo_open()
510 init_completion(&emac->cmd_complete); in emac_ndo_open()
511 ret = prueth_init_tx_chns(emac); in emac_ndo_open()
518 ret = prueth_init_rx_chns(emac, &emac->rx_chns, "rx", in emac_ndo_open()
525 ret = prueth_init_rx_chns(emac, &emac->rx_mgm_chn, "rxmgm", in emac_ndo_open()
534 ret = prueth_ndev_add_tx_napi(emac); in emac_ndo_open()
540 ret = request_irq(emac->rx_chns.irq[rx_flow], prueth_rx_irq, in emac_ndo_open()
541 IRQF_TRIGGER_HIGH, dev_name(dev), emac); in emac_ndo_open()
547 ret = request_threaded_irq(emac->rx_mgm_chn.irq[PRUETH_RX_MGM_FLOW_RESPONSE_SR1], in emac_ndo_open()
550 dev_name(dev), emac); in emac_ndo_open()
556 ret = request_threaded_irq(emac->rx_mgm_chn.irq[PRUETH_RX_MGM_FLOW_TIMESTAMP_SR1], in emac_ndo_open()
559 dev_name(dev), emac); in emac_ndo_open()
566 ret = prueth_emac_start(prueth, emac); in emac_ndo_open()
573 ret = prueth_prepare_rx_chan(emac, &emac->rx_chns, PRUETH_MAX_PKT_SIZE); in emac_ndo_open()
577 ret = prueth_prepare_rx_chan(emac, &emac->rx_mgm_chn, 64); in emac_ndo_open()
581 ret = k3_udma_glue_enable_rx_chn(emac->rx_mgm_chn.rx_chn); in emac_ndo_open()
585 ret = k3_udma_glue_enable_rx_chn(emac->rx_chns.rx_chn); in emac_ndo_open()
589 for (i = 0; i < emac->tx_ch_num; i++) { in emac_ndo_open()
590 ret = k3_udma_glue_enable_tx_chn(emac->tx_chns[i].tx_chn); in emac_ndo_open()
596 for (i = 0; i < emac->tx_ch_num; i++) in emac_ndo_open()
597 napi_enable(&emac->tx_chns[i].napi_tx); in emac_ndo_open()
598 napi_enable(&emac->napi_rx); in emac_ndo_open()
605 queue_work(system_long_wq, &emac->stats_work.work); in emac_ndo_open()
613 prueth_reset_tx_chan(emac, i, false); in emac_ndo_open()
615 prueth_reset_rx_chan(&emac->rx_mgm_chn, in emac_ndo_open()
618 prueth_reset_rx_chan(&emac->rx_chns, max_rx_flows, false); in emac_ndo_open()
620 prueth_emac_stop(emac); in emac_ndo_open()
622 free_irq(emac->rx_mgm_chn.irq[PRUETH_RX_MGM_FLOW_TIMESTAMP_SR1], in emac_ndo_open()
623 emac); in emac_ndo_open()
625 free_irq(emac->rx_mgm_chn.irq[PRUETH_RX_MGM_FLOW_RESPONSE_SR1], in emac_ndo_open()
626 emac); in emac_ndo_open()
628 free_irq(emac->rx_chns.irq[rx_flow], emac); in emac_ndo_open()
630 prueth_ndev_del_tx_napi(emac, emac->tx_ch_num); in emac_ndo_open()
632 prueth_cleanup_rx_chns(emac, &emac->rx_mgm_chn, in emac_ndo_open()
635 prueth_cleanup_rx_chns(emac, &emac->rx_chns, max_rx_flows); in emac_ndo_open()
637 prueth_cleanup_tx_chns(emac); in emac_ndo_open()
643 * emac_ndo_stop - EMAC device stop
652 struct prueth_emac *emac = netdev_priv(ndev); in emac_ndo_stop() local
654 struct prueth *prueth = emac->prueth; in emac_ndo_stop()
665 icssg_class_disable(prueth->miig_rt, prueth_emac_slice(emac)); in emac_ndo_stop()
667 emac_send_command_sr1(emac, ICSSG_SHUTDOWN_CMD_SR1); in emac_ndo_stop()
669 atomic_set(&emac->tdown_cnt, emac->tx_ch_num); in emac_ndo_stop()
673 reinit_completion(&emac->tdown_complete); in emac_ndo_stop()
674 for (i = 0; i < emac->tx_ch_num; i++) in emac_ndo_stop()
675 k3_udma_glue_tdown_tx_chn(emac->tx_chns[i].tx_chn, false); in emac_ndo_stop()
677 ret = wait_for_completion_timeout(&emac->tdown_complete, in emac_ndo_stop()
682 prueth_reset_tx_chan(emac, emac->tx_ch_num, true); in emac_ndo_stop()
683 for (i = 0; i < emac->tx_ch_num; i++) in emac_ndo_stop()
684 napi_disable(&emac->tx_chns[i].napi_tx); in emac_ndo_stop()
687 k3_udma_glue_tdown_rx_chn(emac->rx_chns.rx_chn, true); in emac_ndo_stop()
689 prueth_reset_rx_chan(&emac->rx_chns, max_rx_flows, true); in emac_ndo_stop()
691 k3_udma_glue_tdown_rx_chn(emac->rx_mgm_chn.rx_chn, true); in emac_ndo_stop()
692 prueth_reset_rx_chan(&emac->rx_mgm_chn, in emac_ndo_stop()
695 napi_disable(&emac->napi_rx); in emac_ndo_stop()
698 cancel_delayed_work_sync(&emac->stats_work); in emac_ndo_stop()
701 prueth_emac_stop(emac); in emac_ndo_stop()
703 free_irq(emac->rx_mgm_chn.irq[PRUETH_RX_MGM_FLOW_TIMESTAMP_SR1], emac); in emac_ndo_stop()
704 free_irq(emac->rx_mgm_chn.irq[PRUETH_RX_MGM_FLOW_RESPONSE_SR1], emac); in emac_ndo_stop()
705 free_irq(emac->rx_chns.irq[rx_flow], emac); in emac_ndo_stop()
706 prueth_ndev_del_tx_napi(emac, emac->tx_ch_num); in emac_ndo_stop()
707 prueth_cleanup_tx_chns(emac); in emac_ndo_stop()
709 prueth_cleanup_rx_chns(emac, &emac->rx_mgm_chn, PRUETH_MAX_RX_MGM_FLOWS_SR1); in emac_ndo_stop()
710 prueth_cleanup_rx_chns(emac, &emac->rx_chns, max_rx_flows); in emac_ndo_stop()
719 struct prueth_emac *emac = netdev_priv(ndev); in emac_ndo_set_rx_mode_sr1() local
722 struct prueth *prueth = emac->prueth; in emac_ndo_set_rx_mode_sr1()
723 int slice = prueth_emac_slice(emac); in emac_ndo_set_rx_mode_sr1()
758 struct prueth_emac *emac; in prueth_netdev_init() local
775 ndev = alloc_etherdev_mq(sizeof(*emac), num_tx_chn); in prueth_netdev_init()
779 emac = netdev_priv(ndev); in prueth_netdev_init()
780 emac->is_sr1 = 1; in prueth_netdev_init()
781 emac->prueth = prueth; in prueth_netdev_init()
782 emac->ndev = ndev; in prueth_netdev_init()
783 emac->port_id = port; in prueth_netdev_init()
784 emac->cmd_wq = create_singlethread_workqueue("icssg_cmd_wq"); in prueth_netdev_init()
785 if (!emac->cmd_wq) { in prueth_netdev_init()
790 INIT_DELAYED_WORK(&emac->stats_work, icssg_stats_work_handler); in prueth_netdev_init()
795 &emac->dram); in prueth_netdev_init()
805 emac->tx_ch_num = 2; in prueth_netdev_init()
808 spin_lock_init(&emac->lock); in prueth_netdev_init()
809 mutex_init(&emac->cmd_lock); in prueth_netdev_init()
811 emac->phy_node = of_parse_phandle(eth_node, "phy-handle", 0); in prueth_netdev_init()
812 if (!emac->phy_node && !of_phy_is_fixed_link(eth_node)) { in prueth_netdev_init()
824 emac->phy_node = eth_node; in prueth_netdev_init()
827 ret = of_get_phy_mode(eth_node, &emac->phy_if); in prueth_netdev_init()
833 if (emac->phy_if != PHY_INTERFACE_MODE_MII && in prueth_netdev_init()
834 !phy_interface_mode_is_rgmii(emac->phy_if)) { in prueth_netdev_init()
835 dev_err(prueth->dev, "PHY mode unsupported %s\n", phy_modes(emac->phy_if)); in prueth_netdev_init()
845 switch (emac->phy_if) { in prueth_netdev_init()
847 emac->phy_if = PHY_INTERFACE_MODE_RGMII_RXID; in prueth_netdev_init()
850 emac->phy_if = PHY_INTERFACE_MODE_RGMII; in prueth_netdev_init()
868 ether_addr_copy(emac->mac_addr, ndev->dev_addr); in prueth_netdev_init()
878 netif_napi_add(ndev, &emac->napi_rx, icssg_napi_rx_poll); in prueth_netdev_init()
879 prueth->emac[mac] = emac; in prueth_netdev_init()
884 pruss_release_mem_region(prueth->pruss, &emac->dram); in prueth_netdev_init()
886 destroy_workqueue(emac->cmd_wq); in prueth_netdev_init()
888 emac->ndev = NULL; in prueth_netdev_init()
889 prueth->emac[mac] = NULL; in prueth_netdev_init()
1067 prueth->emac[PRUETH_MAC0]->half_duplex = in prueth_probe()
1070 prueth->emac[PRUETH_MAC0]->iep = prueth->iep0; in prueth_probe()
1081 prueth->emac[PRUETH_MAC1]->half_duplex = in prueth_probe()
1084 prueth->emac[PRUETH_MAC1]->iep = prueth->iep1; in prueth_probe()
1089 ret = register_netdev(prueth->emac[PRUETH_MAC0]->ndev); in prueth_probe()
1095 prueth->registered_netdevs[PRUETH_MAC0] = prueth->emac[PRUETH_MAC0]->ndev; in prueth_probe()
1096 emac_phy_connect(prueth->emac[PRUETH_MAC0]); in prueth_probe()
1097 phy_attached_info(prueth->emac[PRUETH_MAC0]->ndev->phydev); in prueth_probe()
1101 ret = register_netdev(prueth->emac[PRUETH_MAC1]->ndev); in prueth_probe()
1107 prueth->registered_netdevs[PRUETH_MAC1] = prueth->emac[PRUETH_MAC1]->ndev; in prueth_probe()
1108 emac_phy_connect(prueth->emac[PRUETH_MAC1]); in prueth_probe()
1109 phy_attached_info(prueth->emac[PRUETH_MAC1]->ndev->phydev); in prueth_probe()
1112 dev_info(dev, "TI PRU SR1.0 ethernet driver initialized: %s EMAC mode\n", in prueth_probe()
1127 if (prueth->emac[i]->ndev->phydev) { in prueth_probe()
1128 phy_disconnect(prueth->emac[i]->ndev->phydev); in prueth_probe()
1129 prueth->emac[i]->ndev->phydev = NULL; in prueth_probe()
1189 phy_stop(prueth->emac[i]->ndev->phydev); in prueth_remove()
1190 phy_disconnect(prueth->emac[i]->ndev->phydev); in prueth_remove()
1191 prueth->emac[i]->ndev->phydev = NULL; in prueth_remove()