Lines Matching +full:saw +full:- +full:reg

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2004-2013 Synopsys, Inc. (www.synopsys.com)
29 * arc_emac_tx_avail - Return the number of available slots in the tx ring.
36 return (priv->txbd_dirty + TX_BD_NUM - priv->txbd_curr - 1) % TX_BD_NUM; in arc_emac_tx_avail()
40 * arc_emac_adjust_link - Adjust the PHY link duplex.
49 struct phy_device *phy_dev = ndev->phydev; in arc_emac_adjust_link()
50 unsigned int reg, state_changed = 0; in arc_emac_adjust_link() local
52 if (priv->link != phy_dev->link) { in arc_emac_adjust_link()
53 priv->link = phy_dev->link; in arc_emac_adjust_link()
57 if (priv->speed != phy_dev->speed) { in arc_emac_adjust_link()
58 priv->speed = phy_dev->speed; in arc_emac_adjust_link()
60 if (priv->set_mac_speed) in arc_emac_adjust_link()
61 priv->set_mac_speed(priv, priv->speed); in arc_emac_adjust_link()
64 if (priv->duplex != phy_dev->duplex) { in arc_emac_adjust_link()
65 reg = arc_reg_get(priv, R_CTRL); in arc_emac_adjust_link()
67 if (phy_dev->duplex == DUPLEX_FULL) in arc_emac_adjust_link()
68 reg |= ENFL_MASK; in arc_emac_adjust_link()
70 reg &= ~ENFL_MASK; in arc_emac_adjust_link()
72 arc_reg_set(priv, R_CTRL, reg); in arc_emac_adjust_link()
73 priv->duplex = phy_dev->duplex; in arc_emac_adjust_link()
82 * arc_emac_get_drvinfo - Get EMAC driver information.
87 * Issue "ethtool -i ethX" under linux prompt to execute this function.
94 strscpy(info->driver, priv->drv_name, sizeof(info->driver)); in arc_emac_get_drvinfo()
107 * arc_emac_tx_clean - clears processed by EMAC Tx BDs.
113 struct net_device_stats *stats = &ndev->stats; in arc_emac_tx_clean()
114 struct device *dev = ndev->dev.parent; in arc_emac_tx_clean()
118 unsigned int *txbd_dirty = &priv->txbd_dirty; in arc_emac_tx_clean()
119 struct arc_emac_bd *txbd = &priv->txbd[*txbd_dirty]; in arc_emac_tx_clean()
120 struct buffer_state *tx_buff = &priv->tx_buff[*txbd_dirty]; in arc_emac_tx_clean()
121 struct sk_buff *skb = tx_buff->skb; in arc_emac_tx_clean()
122 unsigned int info = le32_to_cpu(txbd->info); in arc_emac_tx_clean()
124 if ((info & FOR_EMAC) || !txbd->data || !skb) in arc_emac_tx_clean()
128 stats->tx_errors++; in arc_emac_tx_clean()
129 stats->tx_dropped++; in arc_emac_tx_clean()
132 stats->tx_carrier_errors++; in arc_emac_tx_clean()
135 stats->collisions++; in arc_emac_tx_clean()
138 stats->tx_fifo_errors++; in arc_emac_tx_clean()
140 stats->tx_packets++; in arc_emac_tx_clean()
141 stats->tx_bytes += skb->len; in arc_emac_tx_clean()
150 txbd->data = 0; in arc_emac_tx_clean()
151 txbd->info = 0; in arc_emac_tx_clean()
152 tx_buff->skb = NULL; in arc_emac_tx_clean()
167 * arc_emac_rx - processing of Rx packets.
178 struct device *dev = ndev->dev.parent; in arc_emac_rx()
182 unsigned int *last_rx_bd = &priv->last_rx_bd; in arc_emac_rx()
183 struct net_device_stats *stats = &ndev->stats; in arc_emac_rx()
184 struct buffer_state *rx_buff = &priv->rx_buff[*last_rx_bd]; in arc_emac_rx()
185 struct arc_emac_bd *rxbd = &priv->rxbd[*last_rx_bd]; in arc_emac_rx()
186 unsigned int pktlen, info = le32_to_cpu(rxbd->info); in arc_emac_rx()
193 /* Make a note that we saw a packet at this BD. in arc_emac_rx()
200 /* We pre-allocate buffers of MTU size so incoming in arc_emac_rx()
207 rxbd->info = cpu_to_le32(FOR_EMAC | EMAC_BUFFER_SIZE); in arc_emac_rx()
208 stats->rx_errors++; in arc_emac_rx()
209 stats->rx_length_errors++; in arc_emac_rx()
222 rxbd->info = cpu_to_le32(FOR_EMAC | EMAC_BUFFER_SIZE); in arc_emac_rx()
223 stats->rx_errors++; in arc_emac_rx()
224 stats->rx_dropped++; in arc_emac_rx()
228 addr = dma_map_single(dev, (void *)skb->data, in arc_emac_rx()
235 rxbd->info = cpu_to_le32(FOR_EMAC | EMAC_BUFFER_SIZE); in arc_emac_rx()
236 stats->rx_errors++; in arc_emac_rx()
237 stats->rx_dropped++; in arc_emac_rx()
246 stats->rx_packets++; in arc_emac_rx()
247 stats->rx_bytes += pktlen; in arc_emac_rx()
248 skb_put(rx_buff->skb, pktlen); in arc_emac_rx()
249 rx_buff->skb->dev = ndev; in arc_emac_rx()
250 rx_buff->skb->protocol = eth_type_trans(rx_buff->skb, ndev); in arc_emac_rx()
252 netif_receive_skb(rx_buff->skb); in arc_emac_rx()
254 rx_buff->skb = skb; in arc_emac_rx()
258 rxbd->data = cpu_to_le32(addr); in arc_emac_rx()
264 rxbd->info = cpu_to_le32(FOR_EMAC | EMAC_BUFFER_SIZE); in arc_emac_rx()
271 * arc_emac_rx_miss_handle - handle R_MISS register
277 struct net_device_stats *stats = &ndev->stats; in arc_emac_rx_miss_handle()
282 stats->rx_errors += miss; in arc_emac_rx_miss_handle()
283 stats->rx_missed_errors += miss; in arc_emac_rx_miss_handle()
284 priv->rx_missed_errors += miss; in arc_emac_rx_miss_handle()
289 * arc_emac_rx_stall_check - check RX stall
306 priv->rx_missed_errors = 0; in arc_emac_rx_stall_check()
308 if (priv->rx_missed_errors && budget) { in arc_emac_rx_stall_check()
309 rxbd = &priv->rxbd[priv->last_rx_bd]; in arc_emac_rx_stall_check()
310 if (le32_to_cpu(rxbd->info) & FOR_EMAC) { in arc_emac_rx_stall_check()
312 priv->rx_missed_errors = 0; in arc_emac_rx_stall_check()
318 * arc_emac_poll - NAPI poll handler.
326 struct net_device *ndev = napi->dev; in arc_emac_poll()
345 * arc_emac_intr - Global interrupt handler for EMAC.
358 struct net_device_stats *stats = &ndev->stats; in arc_emac_intr()
368 if (likely(napi_schedule_prep(&priv->napi))) { in arc_emac_intr()
370 __napi_schedule(&priv->napi); in arc_emac_intr()
376 * 8-bit error counter overrun. in arc_emac_intr()
380 stats->rx_missed_errors += 0x100; in arc_emac_intr()
381 stats->rx_errors += 0x100; in arc_emac_intr()
382 priv->rx_missed_errors += 0x100; in arc_emac_intr()
383 napi_schedule(&priv->napi); in arc_emac_intr()
387 stats->rx_crc_errors += 0x100; in arc_emac_intr()
388 stats->rx_errors += 0x100; in arc_emac_intr()
392 stats->rx_frame_errors += 0x100; in arc_emac_intr()
393 stats->rx_errors += 0x100; in arc_emac_intr()
397 stats->rx_over_errors += 0x100; in arc_emac_intr()
398 stats->rx_errors += 0x100; in arc_emac_intr()
408 disable_irq(dev->irq); in arc_emac_poll_controller()
409 arc_emac_intr(dev->irq, dev); in arc_emac_poll_controller()
410 enable_irq(dev->irq); in arc_emac_poll_controller()
415 * arc_emac_open - Open the network device.
418 * returns: 0, on success or non-zero error value on failure.
427 struct phy_device *phy_dev = ndev->phydev; in arc_emac_open()
428 struct device *dev = ndev->dev.parent; in arc_emac_open()
431 phy_dev->autoneg = AUTONEG_ENABLE; in arc_emac_open()
432 phy_dev->speed = 0; in arc_emac_open()
433 phy_dev->duplex = 0; in arc_emac_open()
434 linkmode_and(phy_dev->advertising, phy_dev->advertising, in arc_emac_open()
435 phy_dev->supported); in arc_emac_open()
437 priv->last_rx_bd = 0; in arc_emac_open()
442 unsigned int *last_rx_bd = &priv->last_rx_bd; in arc_emac_open()
443 struct arc_emac_bd *rxbd = &priv->rxbd[*last_rx_bd]; in arc_emac_open()
444 struct buffer_state *rx_buff = &priv->rx_buff[*last_rx_bd]; in arc_emac_open()
446 rx_buff->skb = netdev_alloc_skb_ip_align(ndev, in arc_emac_open()
448 if (unlikely(!rx_buff->skb)) in arc_emac_open()
449 return -ENOMEM; in arc_emac_open()
451 addr = dma_map_single(dev, (void *)rx_buff->skb->data, in arc_emac_open()
455 dev_kfree_skb(rx_buff->skb); in arc_emac_open()
456 return -ENOMEM; in arc_emac_open()
461 rxbd->data = cpu_to_le32(addr); in arc_emac_open()
467 rxbd->info = cpu_to_le32(FOR_EMAC | EMAC_BUFFER_SIZE); in arc_emac_open()
472 priv->txbd_curr = 0; in arc_emac_open()
473 priv->txbd_dirty = 0; in arc_emac_open()
476 memset(priv->txbd, 0, TX_RING_SZ); in arc_emac_open()
483 arc_reg_set(priv, R_RX_RING, (unsigned int)priv->rxbd_dma); in arc_emac_open()
484 arc_reg_set(priv, R_TX_RING, (unsigned int)priv->txbd_dma); in arc_emac_open()
495 napi_enable(&priv->napi); in arc_emac_open()
500 phy_start(ndev->phydev); in arc_emac_open()
508 * arc_emac_set_rx_mode - Change the receive filtering mode.
511 * This function enables/disables promiscuous or all-multicast mode
518 if (ndev->flags & IFF_PROMISC) { in arc_emac_set_rx_mode()
523 if (ndev->flags & IFF_ALLMULTI) { in arc_emac_set_rx_mode()
526 } else if (ndev->flags & IFF_MULTICAST) { in arc_emac_set_rx_mode()
532 bit = ether_crc_le(ETH_ALEN, ha->addr) >> 26; in arc_emac_set_rx_mode()
546 * arc_free_tx_queue - free skb from tx queue
554 struct device *dev = ndev->dev.parent; in arc_free_tx_queue()
558 struct arc_emac_bd *txbd = &priv->txbd[i]; in arc_free_tx_queue()
559 struct buffer_state *tx_buff = &priv->tx_buff[i]; in arc_free_tx_queue()
561 if (tx_buff->skb) { in arc_free_tx_queue()
568 dev_kfree_skb_irq(tx_buff->skb); in arc_free_tx_queue()
571 txbd->info = 0; in arc_free_tx_queue()
572 txbd->data = 0; in arc_free_tx_queue()
573 tx_buff->skb = NULL; in arc_free_tx_queue()
578 * arc_free_rx_queue - free skb from rx queue
586 struct device *dev = ndev->dev.parent; in arc_free_rx_queue()
590 struct arc_emac_bd *rxbd = &priv->rxbd[i]; in arc_free_rx_queue()
591 struct buffer_state *rx_buff = &priv->rx_buff[i]; in arc_free_rx_queue()
593 if (rx_buff->skb) { in arc_free_rx_queue()
600 dev_kfree_skb_irq(rx_buff->skb); in arc_free_rx_queue()
603 rxbd->info = 0; in arc_free_rx_queue()
604 rxbd->data = 0; in arc_free_rx_queue()
605 rx_buff->skb = NULL; in arc_free_rx_queue()
610 * arc_emac_stop - Close the network device.
621 napi_disable(&priv->napi); in arc_emac_stop()
624 phy_stop(ndev->phydev); in arc_emac_stop()
640 * arc_emac_stats - Get system network statistics.
649 struct net_device_stats *stats = &ndev->stats; in arc_emac_stats()
660 stats->rx_errors += miss; in arc_emac_stats()
661 stats->rx_errors += rxcrc + rxfram + rxoflow; in arc_emac_stats()
663 stats->rx_over_errors += rxoflow; in arc_emac_stats()
664 stats->rx_frame_errors += rxfram; in arc_emac_stats()
665 stats->rx_crc_errors += rxcrc; in arc_emac_stats()
666 stats->rx_missed_errors += miss; in arc_emac_stats()
672 * arc_emac_tx - Starts the data transmission.
684 unsigned int len, *txbd_curr = &priv->txbd_curr; in arc_emac_tx()
685 struct net_device_stats *stats = &ndev->stats; in arc_emac_tx()
686 __le32 *info = &priv->txbd[*txbd_curr].info; in arc_emac_tx()
687 struct device *dev = ndev->dev.parent; in arc_emac_tx()
693 len = max_t(unsigned int, ETH_ZLEN, skb->len); in arc_emac_tx()
701 addr = dma_map_single(dev, (void *)skb->data, len, DMA_TO_DEVICE); in arc_emac_tx()
704 stats->tx_dropped++; in arc_emac_tx()
705 stats->tx_errors++; in arc_emac_tx()
709 dma_unmap_addr_set(&priv->tx_buff[*txbd_curr], addr, addr); in arc_emac_tx()
710 dma_unmap_len_set(&priv->tx_buff[*txbd_curr], len, len); in arc_emac_tx()
712 priv->txbd[*txbd_curr].data = cpu_to_le32(addr); in arc_emac_tx()
724 priv->tx_buff[*txbd_curr].skb = skb; in arc_emac_tx()
753 addr_low = le32_to_cpu(*(__le32 *)&ndev->dev_addr[0]); in arc_emac_set_address_internal()
754 addr_hi = le16_to_cpu(*(__le16 *)&ndev->dev_addr[4]); in arc_emac_set_address_internal()
761 * arc_emac_set_address - Set the MAC address for this device.
768 * returns: -EBUSY if the net device is busy or 0 if the address is set
776 return -EBUSY; in arc_emac_set_address()
778 if (!is_valid_ether_addr(addr->sa_data)) in arc_emac_set_address()
779 return -EADDRNOTAVAIL; in arc_emac_set_address()
781 eth_hw_addr_set(ndev, addr->sa_data); in arc_emac_set_address()
789 * arc_emac_restart - Restart EMAC
798 struct net_device_stats *stats = &ndev->stats; in arc_emac_restart()
816 priv->txbd_curr = 0; in arc_emac_restart()
817 priv->txbd_dirty = 0; in arc_emac_restart()
818 memset(priv->txbd, 0, TX_RING_SZ); in arc_emac_restart()
821 struct arc_emac_bd *rxbd = &priv->rxbd[i]; in arc_emac_restart()
822 unsigned int info = le32_to_cpu(rxbd->info); in arc_emac_restart()
825 stats->rx_errors++; in arc_emac_restart()
826 stats->rx_dropped++; in arc_emac_restart()
829 rxbd->info = cpu_to_le32(FOR_EMAC | EMAC_BUFFER_SIZE); in arc_emac_restart()
831 priv->last_rx_bd = 0; in arc_emac_restart()
860 struct device *dev = ndev->dev.parent; in arc_emac_probe()
869 phy_node = of_parse_phandle(dev->of_node, "phy", 0); in arc_emac_probe()
872 return -ENODEV; in arc_emac_probe()
876 err = of_address_to_resource(dev->of_node, 0, &res_regs); in arc_emac_probe()
879 err = -ENODEV; in arc_emac_probe()
884 irq = irq_of_parse_and_map(dev->of_node, 0); in arc_emac_probe()
887 err = -ENODEV; in arc_emac_probe()
891 ndev->netdev_ops = &arc_emac_netdev_ops; in arc_emac_probe()
892 ndev->ethtool_ops = &arc_emac_ethtool_ops; in arc_emac_probe()
893 ndev->watchdog_timeo = TX_TIMEOUT; in arc_emac_probe()
896 priv->dev = dev; in arc_emac_probe()
898 priv->regs = devm_ioremap_resource(dev, &res_regs); in arc_emac_probe()
899 if (IS_ERR(priv->regs)) { in arc_emac_probe()
900 err = PTR_ERR(priv->regs); in arc_emac_probe()
904 dev_dbg(dev, "Registers base address is 0x%p\n", priv->regs); in arc_emac_probe()
906 if (priv->clk) { in arc_emac_probe()
907 err = clk_prepare_enable(priv->clk); in arc_emac_probe()
913 clock_frequency = clk_get_rate(priv->clk); in arc_emac_probe()
916 if (of_property_read_u32(dev->of_node, "clock-frequency", in arc_emac_probe()
918 dev_err(dev, "failed to retrieve <clock-frequency> from device tree\n"); in arc_emac_probe()
919 err = -EINVAL; in arc_emac_probe()
929 err = -ENODEV; in arc_emac_probe()
937 ndev->irq = irq; in arc_emac_probe()
938 dev_info(dev, "IRQ is %d\n", ndev->irq); in arc_emac_probe()
941 err = devm_request_irq(dev, ndev->irq, arc_emac_intr, 0, in arc_emac_probe()
942 ndev->name, ndev); in arc_emac_probe()
949 err = of_get_ethdev_address(dev->of_node, ndev); in arc_emac_probe()
954 dev_info(dev, "MAC address is now %pM\n", ndev->dev_addr); in arc_emac_probe()
957 priv->rxbd = dmam_alloc_coherent(dev, RX_RING_SZ + TX_RING_SZ, in arc_emac_probe()
958 &priv->rxbd_dma, GFP_KERNEL); in arc_emac_probe()
960 if (!priv->rxbd) { in arc_emac_probe()
962 err = -ENOMEM; in arc_emac_probe()
966 priv->txbd = priv->rxbd + RX_BD_NUM; in arc_emac_probe()
968 priv->txbd_dma = priv->rxbd_dma + RX_RING_SZ; in arc_emac_probe()
970 (unsigned int)priv->rxbd_dma, (unsigned int)priv->txbd_dma); in arc_emac_probe()
982 err = -ENODEV; in arc_emac_probe()
987 phydev->drv->name, phydev->phy_id); in arc_emac_probe()
989 netif_napi_add_weight(ndev, &priv->napi, arc_emac_poll, in arc_emac_probe()
1002 netif_napi_del(&priv->napi); in arc_emac_probe()
1007 if (priv->clk) in arc_emac_probe()
1008 clk_disable_unprepare(priv->clk); in arc_emac_probe()
1020 phy_disconnect(ndev->phydev); in arc_emac_remove()
1023 netif_napi_del(&priv->napi); in arc_emac_remove()
1025 if (!IS_ERR(priv->clk)) in arc_emac_remove()
1026 clk_disable_unprepare(priv->clk); in arc_emac_remove()