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()
131 reinit_completion(&emac->cmd_complete); in emac_send_command_sr1()
134 netdev_err(emac->ndev, "cmd %x: push failed: %d\n", cmd, ret); in emac_send_command_sr1()
137 ret = wait_for_completion_timeout(&emac->cmd_complete, msecs_to_jiffies(100)); in emac_send_command_sr1()
139 netdev_err(emac->ndev, "cmd %x: completion timeout\n", cmd); in emac_send_command_sr1()
141 mutex_unlock(&emac->cmd_lock); in emac_send_command_sr1()
147 mutex_unlock(&emac->cmd_lock); in emac_send_command_sr1()
152 static void icssg_config_set_speed_sr1(struct prueth_emac *emac) in icssg_config_set_speed_sr1() argument
155 struct prueth *prueth = emac->prueth; in icssg_config_set_speed_sr1()
156 int slice = prueth_emac_slice(emac); in icssg_config_set_speed_sr1()
168 emac_send_command_sr1(emac, cmd); in icssg_config_set_speed_sr1()
174 struct prueth_emac *emac = netdev_priv(ndev); in emac_adjust_link_sr1() local
176 struct prueth *prueth = emac->prueth; in emac_adjust_link_sr1()
182 if (phydev->duplex != emac->duplex) { in emac_adjust_link_sr1()
184 emac->duplex = phydev->duplex; in emac_adjust_link_sr1()
186 if (phydev->speed != emac->speed) { in emac_adjust_link_sr1()
188 emac->speed = phydev->speed; in emac_adjust_link_sr1()
190 if (!emac->link) { in emac_adjust_link_sr1()
192 emac->link = 1; in emac_adjust_link_sr1()
194 } else if (emac->link) { in emac_adjust_link_sr1()
196 emac->link = 0; in emac_adjust_link_sr1()
199 emac->speed = SPEED_1000; in emac_adjust_link_sr1()
202 emac->duplex = DUPLEX_FULL; in emac_adjust_link_sr1()
211 if (emac->link) { in emac_adjust_link_sr1()
213 icssg_update_rgmii_cfg(prueth->miig_rt, emac); in emac_adjust_link_sr1()
216 spin_lock_irqsave(&emac->lock, flags); in emac_adjust_link_sr1()
217 icssg_config_ipg(emac); in emac_adjust_link_sr1()
218 spin_unlock_irqrestore(&emac->lock, flags); in emac_adjust_link_sr1()
219 icssg_config_set_speed_sr1(emac); in emac_adjust_link_sr1()
223 if (emac->link) { in emac_adjust_link_sr1()
228 prueth_cleanup_tx_ts(emac); in emac_adjust_link_sr1()
232 static int emac_phy_connect(struct prueth_emac *emac) in emac_phy_connect() argument
234 struct prueth *prueth = emac->prueth; in emac_phy_connect()
235 struct net_device *ndev = emac->ndev; in emac_phy_connect()
237 ndev->phydev = of_phy_connect(emac->ndev, emac->phy_node, in emac_phy_connect()
239 emac->phy_if); in emac_phy_connect()
242 emac->phy_node->full_name); in emac_phy_connect()
246 if (!emac->half_duplex) { in emac_phy_connect()
260 if (emac->phy_if == PHY_INTERFACE_MODE_MII) in emac_phy_connect()
271 static struct sk_buff *prueth_process_rx_mgm(struct prueth_emac *emac, in prueth_process_rx_mgm() argument
274 struct prueth_rx_chn *rx_chn = &emac->rx_mgm_chn; in prueth_process_rx_mgm()
275 struct net_device *ndev = emac->ndev; in prueth_process_rx_mgm()
325 ret = prueth_dma_rx_push(emac, new_skb, &emac->rx_mgm_chn); in prueth_process_rx_mgm()
332 static void prueth_tx_ts_sr1(struct prueth_emac *emac, in prueth_tx_ts_sr1() argument
347 netdev_dbg(emac->ndev, "Invalid TX TS cookie 0x%x\n", in prueth_tx_ts_sr1()
352 skb = emac->tx_ts_skb[cookie]; in prueth_tx_ts_sr1()
353 emac->tx_ts_skb[cookie] = NULL; /* free slot */ in prueth_tx_ts_sr1()
364 struct prueth_emac *emac = dev_id; in prueth_rx_mgm_ts_thread_sr1() local
367 skb = prueth_process_rx_mgm(emac, PRUETH_RX_MGM_FLOW_TIMESTAMP_SR1); in prueth_rx_mgm_ts_thread_sr1()
371 prueth_tx_ts_sr1(emac, (void *)skb->data); in prueth_rx_mgm_ts_thread_sr1()
379 struct prueth_emac *emac = dev_id; in prueth_rx_mgm_rsp_thread() local
383 skb = prueth_process_rx_mgm(emac, PRUETH_RX_MGM_FLOW_RESPONSE_SR1); in prueth_rx_mgm_rsp_thread()
390 netdev_dbg(emac->ndev, "f/w Shutdown cmd resp %x\n", rsp); in prueth_rx_mgm_rsp_thread()
391 complete(&emac->cmd_complete); in prueth_rx_mgm_rsp_thread()
393 netdev_dbg(emac->ndev, "f/w Speed/Duplex cmd rsp %x\n", rsp); in prueth_rx_mgm_rsp_thread()
394 complete(&emac->cmd_complete); in prueth_rx_mgm_rsp_thread()
413 static int prueth_emac_start(struct prueth *prueth, struct prueth_emac *emac) in prueth_emac_start() argument
421 slice = prueth_emac_slice(emac); in prueth_emac_start()
423 netdev_err(emac->ndev, "invalid port\n"); in prueth_emac_start()
427 icssg_config_sr1(prueth, emac, slice); in prueth_emac_start()
451 static void prueth_emac_stop(struct prueth_emac *emac) in prueth_emac_stop() argument
453 struct prueth *prueth = emac->prueth; in prueth_emac_stop()
456 switch (emac->port_id) { in prueth_emac_stop()
464 netdev_err(emac->ndev, "invalid port\n"); in prueth_emac_stop()
468 if (!emac->is_sr1) in prueth_emac_stop()
475 * emac_ndo_open - EMAC device open
484 struct prueth_emac *emac = netdev_priv(ndev); in emac_ndo_open() local
485 int num_data_chn = emac->tx_ch_num - 1; in emac_ndo_open()
486 struct prueth *prueth = emac->prueth; in emac_ndo_open()
487 int slice = prueth_emac_slice(emac); in emac_ndo_open()
499 ether_addr_copy(emac->mac_addr, ndev->dev_addr); in emac_ndo_open()
501 icssg_class_set_mac_addr(prueth->miig_rt, slice, emac->mac_addr); in emac_ndo_open()
512 init_completion(&emac->cmd_complete); in emac_ndo_open()
513 ret = prueth_init_tx_chns(emac); in emac_ndo_open()
520 ret = prueth_init_rx_chns(emac, &emac->rx_chns, "rx", in emac_ndo_open()
527 ret = prueth_init_rx_chns(emac, &emac->rx_mgm_chn, "rxmgm", in emac_ndo_open()
536 ret = prueth_ndev_add_tx_napi(emac); in emac_ndo_open()
542 ret = request_irq(emac->rx_chns.irq[rx_flow], prueth_rx_irq, in emac_ndo_open()
543 IRQF_TRIGGER_HIGH, dev_name(dev), emac); in emac_ndo_open()
549 ret = request_threaded_irq(emac->rx_mgm_chn.irq[PRUETH_RX_MGM_FLOW_RESPONSE_SR1], in emac_ndo_open()
552 dev_name(dev), emac); in emac_ndo_open()
558 ret = request_threaded_irq(emac->rx_mgm_chn.irq[PRUETH_RX_MGM_FLOW_TIMESTAMP_SR1], in emac_ndo_open()
561 dev_name(dev), emac); in emac_ndo_open()
568 ret = prueth_emac_start(prueth, emac); in emac_ndo_open()
575 ret = prueth_prepare_rx_chan(emac, &emac->rx_chns, PRUETH_MAX_PKT_SIZE); in emac_ndo_open()
579 ret = prueth_prepare_rx_chan(emac, &emac->rx_mgm_chn, 64); in emac_ndo_open()
583 ret = k3_udma_glue_enable_rx_chn(emac->rx_mgm_chn.rx_chn); in emac_ndo_open()
587 ret = k3_udma_glue_enable_rx_chn(emac->rx_chns.rx_chn); in emac_ndo_open()
591 for (i = 0; i < emac->tx_ch_num; i++) { in emac_ndo_open()
592 ret = k3_udma_glue_enable_tx_chn(emac->tx_chns[i].tx_chn); in emac_ndo_open()
598 for (i = 0; i < emac->tx_ch_num; i++) in emac_ndo_open()
599 napi_enable(&emac->tx_chns[i].napi_tx); in emac_ndo_open()
600 napi_enable(&emac->napi_rx); in emac_ndo_open()
607 queue_work(system_long_wq, &emac->stats_work.work); in emac_ndo_open()
615 prueth_reset_tx_chan(emac, i, false); in emac_ndo_open()
617 prueth_reset_rx_chan(&emac->rx_mgm_chn, in emac_ndo_open()
620 prueth_reset_rx_chan(&emac->rx_chns, max_rx_flows, false); in emac_ndo_open()
622 prueth_emac_stop(emac); in emac_ndo_open()
624 free_irq(emac->rx_mgm_chn.irq[PRUETH_RX_MGM_FLOW_TIMESTAMP_SR1], in emac_ndo_open()
625 emac); in emac_ndo_open()
627 free_irq(emac->rx_mgm_chn.irq[PRUETH_RX_MGM_FLOW_RESPONSE_SR1], in emac_ndo_open()
628 emac); in emac_ndo_open()
630 free_irq(emac->rx_chns.irq[rx_flow], emac); in emac_ndo_open()
632 prueth_ndev_del_tx_napi(emac, emac->tx_ch_num); in emac_ndo_open()
634 prueth_cleanup_rx_chns(emac, &emac->rx_mgm_chn, in emac_ndo_open()
637 prueth_cleanup_rx_chns(emac, &emac->rx_chns, max_rx_flows); in emac_ndo_open()
639 prueth_cleanup_tx_chns(emac); in emac_ndo_open()
645 * emac_ndo_stop - EMAC device stop
654 struct prueth_emac *emac = netdev_priv(ndev); in emac_ndo_stop() local
656 struct prueth *prueth = emac->prueth; in emac_ndo_stop()
667 icssg_class_disable(prueth->miig_rt, prueth_emac_slice(emac)); in emac_ndo_stop()
669 emac_send_command_sr1(emac, ICSSG_SHUTDOWN_CMD_SR1); in emac_ndo_stop()
671 atomic_set(&emac->tdown_cnt, emac->tx_ch_num); in emac_ndo_stop()
675 reinit_completion(&emac->tdown_complete); in emac_ndo_stop()
676 for (i = 0; i < emac->tx_ch_num; i++) in emac_ndo_stop()
677 k3_udma_glue_tdown_tx_chn(emac->tx_chns[i].tx_chn, false); in emac_ndo_stop()
679 ret = wait_for_completion_timeout(&emac->tdown_complete, in emac_ndo_stop()
684 prueth_reset_tx_chan(emac, emac->tx_ch_num, true); in emac_ndo_stop()
685 for (i = 0; i < emac->tx_ch_num; i++) in emac_ndo_stop()
686 napi_disable(&emac->tx_chns[i].napi_tx); in emac_ndo_stop()
689 k3_udma_glue_tdown_rx_chn(emac->rx_chns.rx_chn, true); in emac_ndo_stop()
691 prueth_reset_rx_chan(&emac->rx_chns, max_rx_flows, true); in emac_ndo_stop()
693 k3_udma_glue_tdown_rx_chn(emac->rx_mgm_chn.rx_chn, true); in emac_ndo_stop()
694 prueth_reset_rx_chan(&emac->rx_mgm_chn, in emac_ndo_stop()
697 napi_disable(&emac->napi_rx); in emac_ndo_stop()
700 cancel_delayed_work_sync(&emac->stats_work); in emac_ndo_stop()
703 prueth_emac_stop(emac); in emac_ndo_stop()
705 free_irq(emac->rx_mgm_chn.irq[PRUETH_RX_MGM_FLOW_TIMESTAMP_SR1], emac); in emac_ndo_stop()
706 free_irq(emac->rx_mgm_chn.irq[PRUETH_RX_MGM_FLOW_RESPONSE_SR1], emac); in emac_ndo_stop()
707 free_irq(emac->rx_chns.irq[rx_flow], emac); in emac_ndo_stop()
708 prueth_ndev_del_tx_napi(emac, emac->tx_ch_num); in emac_ndo_stop()
709 prueth_cleanup_tx_chns(emac); in emac_ndo_stop()
711 prueth_cleanup_rx_chns(emac, &emac->rx_mgm_chn, PRUETH_MAX_RX_MGM_FLOWS_SR1); in emac_ndo_stop()
712 prueth_cleanup_rx_chns(emac, &emac->rx_chns, max_rx_flows); in emac_ndo_stop()
721 struct prueth_emac *emac = netdev_priv(ndev); in emac_ndo_set_rx_mode_sr1() local
724 struct prueth *prueth = emac->prueth; in emac_ndo_set_rx_mode_sr1()
725 int slice = prueth_emac_slice(emac); in emac_ndo_set_rx_mode_sr1()
760 struct prueth_emac *emac; in prueth_netdev_init() local
777 ndev = alloc_etherdev_mq(sizeof(*emac), num_tx_chn); in prueth_netdev_init()
781 emac = netdev_priv(ndev); in prueth_netdev_init()
782 emac->is_sr1 = 1; in prueth_netdev_init()
783 emac->prueth = prueth; in prueth_netdev_init()
784 emac->ndev = ndev; in prueth_netdev_init()
785 emac->port_id = port; in prueth_netdev_init()
786 emac->cmd_wq = create_singlethread_workqueue("icssg_cmd_wq"); in prueth_netdev_init()
787 if (!emac->cmd_wq) { in prueth_netdev_init()
792 INIT_DELAYED_WORK(&emac->stats_work, icssg_stats_work_handler); in prueth_netdev_init()
797 &emac->dram); in prueth_netdev_init()
807 emac->tx_ch_num = 2; in prueth_netdev_init()
810 spin_lock_init(&emac->lock); in prueth_netdev_init()
811 mutex_init(&emac->cmd_lock); in prueth_netdev_init()
813 emac->phy_node = of_parse_phandle(eth_node, "phy-handle", 0); in prueth_netdev_init()
814 if (!emac->phy_node && !of_phy_is_fixed_link(eth_node)) { in prueth_netdev_init()
826 emac->phy_node = eth_node; in prueth_netdev_init()
829 ret = of_get_phy_mode(eth_node, &emac->phy_if); in prueth_netdev_init()
835 if (emac->phy_if != PHY_INTERFACE_MODE_MII && in prueth_netdev_init()
836 !phy_interface_mode_is_rgmii(emac->phy_if)) { in prueth_netdev_init()
837 dev_err(prueth->dev, "PHY mode unsupported %s\n", phy_modes(emac->phy_if)); in prueth_netdev_init()
847 switch (emac->phy_if) { in prueth_netdev_init()
849 emac->phy_if = PHY_INTERFACE_MODE_RGMII_RXID; in prueth_netdev_init()
852 emac->phy_if = PHY_INTERFACE_MODE_RGMII; in prueth_netdev_init()
870 ether_addr_copy(emac->mac_addr, ndev->dev_addr); in prueth_netdev_init()
880 netif_napi_add(ndev, &emac->napi_rx, icssg_napi_rx_poll); in prueth_netdev_init()
881 prueth->emac[mac] = emac; in prueth_netdev_init()
886 pruss_release_mem_region(prueth->pruss, &emac->dram); in prueth_netdev_init()
888 destroy_workqueue(emac->cmd_wq); in prueth_netdev_init()
890 emac->ndev = NULL; in prueth_netdev_init()
891 prueth->emac[mac] = NULL; in prueth_netdev_init()
1069 prueth->emac[PRUETH_MAC0]->half_duplex = in prueth_probe()
1072 prueth->emac[PRUETH_MAC0]->iep = prueth->iep0; in prueth_probe()
1083 prueth->emac[PRUETH_MAC1]->half_duplex = in prueth_probe()
1086 prueth->emac[PRUETH_MAC1]->iep = prueth->iep1; in prueth_probe()
1091 ret = register_netdev(prueth->emac[PRUETH_MAC0]->ndev); in prueth_probe()
1097 prueth->registered_netdevs[PRUETH_MAC0] = prueth->emac[PRUETH_MAC0]->ndev; in prueth_probe()
1098 emac_phy_connect(prueth->emac[PRUETH_MAC0]); in prueth_probe()
1099 phy_attached_info(prueth->emac[PRUETH_MAC0]->ndev->phydev); in prueth_probe()
1103 ret = register_netdev(prueth->emac[PRUETH_MAC1]->ndev); in prueth_probe()
1109 prueth->registered_netdevs[PRUETH_MAC1] = prueth->emac[PRUETH_MAC1]->ndev; in prueth_probe()
1110 emac_phy_connect(prueth->emac[PRUETH_MAC1]); in prueth_probe()
1111 phy_attached_info(prueth->emac[PRUETH_MAC1]->ndev->phydev); in prueth_probe()
1114 dev_info(dev, "TI PRU SR1.0 ethernet driver initialized: %s EMAC mode\n", in prueth_probe()
1129 if (prueth->emac[i]->ndev->phydev) { in prueth_probe()
1130 phy_disconnect(prueth->emac[i]->ndev->phydev); in prueth_probe()
1131 prueth->emac[i]->ndev->phydev = NULL; in prueth_probe()
1191 phy_stop(prueth->emac[i]->ndev->phydev); in prueth_remove()
1192 phy_disconnect(prueth->emac[i]->ndev->phydev); in prueth_remove()
1193 prueth->emac[i]->ndev->phydev = NULL; in prueth_remove()