Lines Matching +full:tx +full:- +full:slots
1 // SPDX-License-Identifier: GPL-2.0-or-later
46 /* Tx */
65 rx_slot = litex_read8(priv->base + LITEETH_WRITER_SLOT); in liteeth_rx()
66 len = litex_read32(priv->base + LITEETH_WRITER_LENGTH); in liteeth_rx()
78 memcpy_fromio(data, priv->rx_base + rx_slot * priv->slot_size, len); in liteeth_rx()
79 skb->protocol = eth_type_trans(skb, netdev); in liteeth_rx()
86 netdev->stats.rx_dropped++; in liteeth_rx()
87 netdev->stats.rx_errors++; in liteeth_rx()
98 reg = litex_read8(priv->base + LITEETH_READER_EV_PENDING); in liteeth_interrupt()
102 litex_write8(priv->base + LITEETH_READER_EV_PENDING, reg); in liteeth_interrupt()
105 reg = litex_read8(priv->base + LITEETH_WRITER_EV_PENDING); in liteeth_interrupt()
108 litex_write8(priv->base + LITEETH_WRITER_EV_PENDING, reg); in liteeth_interrupt()
120 litex_write8(priv->base + LITEETH_WRITER_EV_PENDING, 1); in liteeth_open()
121 litex_write8(priv->base + LITEETH_READER_EV_PENDING, 1); in liteeth_open()
123 err = request_irq(netdev->irq, liteeth_interrupt, 0, netdev->name, netdev); in liteeth_open()
125 netdev_err(netdev, "failed to request irq %d\n", netdev->irq); in liteeth_open()
130 litex_write8(priv->base + LITEETH_WRITER_EV_ENABLE, 1); in liteeth_open()
131 litex_write8(priv->base + LITEETH_READER_EV_ENABLE, 1); in liteeth_open()
146 litex_write8(priv->base + LITEETH_WRITER_EV_ENABLE, 0); in liteeth_stop()
147 litex_write8(priv->base + LITEETH_READER_EV_ENABLE, 0); in liteeth_stop()
149 free_irq(netdev->irq, netdev); in liteeth_stop()
160 if (!litex_read8(priv->base + LITEETH_READER_READY)) { in liteeth_start_xmit()
170 if (unlikely(skb->len > priv->slot_size)) { in liteeth_start_xmit()
172 netdev_err(netdev, "tx packet too big\n"); in liteeth_start_xmit()
175 netdev->stats.tx_dropped++; in liteeth_start_xmit()
176 netdev->stats.tx_errors++; in liteeth_start_xmit()
181 txbuffer = priv->tx_base + priv->tx_slot * priv->slot_size; in liteeth_start_xmit()
182 memcpy_toio(txbuffer, skb->data, skb->len); in liteeth_start_xmit()
183 litex_write8(priv->base + LITEETH_READER_SLOT, priv->tx_slot); in liteeth_start_xmit()
184 litex_write16(priv->base + LITEETH_READER_LENGTH, skb->len); in liteeth_start_xmit()
185 litex_write8(priv->base + LITEETH_READER_START, 1); in liteeth_start_xmit()
187 dev_sw_netstats_tx_add(netdev, 1, skb->len); in liteeth_start_xmit()
189 priv->tx_slot = (priv->tx_slot + 1) % priv->num_tx_slots; in liteeth_start_xmit()
198 netdev_stats_to_stats64(stats, &netdev->stats); in liteeth_get_stats64()
199 dev_fetch_sw_netstats(stats, netdev->tstats); in liteeth_get_stats64()
211 struct device_node *np = priv->dev->of_node; in liteeth_setup_slots()
214 err = of_property_read_u32(np, "litex,rx-slots", &priv->num_rx_slots); in liteeth_setup_slots()
216 dev_dbg(priv->dev, "unable to get litex,rx-slots, using 2\n"); in liteeth_setup_slots()
217 priv->num_rx_slots = 2; in liteeth_setup_slots()
220 err = of_property_read_u32(np, "litex,tx-slots", &priv->num_tx_slots); in liteeth_setup_slots()
222 dev_dbg(priv->dev, "unable to get litex,tx-slots, using 2\n"); in liteeth_setup_slots()
223 priv->num_tx_slots = 2; in liteeth_setup_slots()
226 err = of_property_read_u32(np, "litex,slot-size", &priv->slot_size); in liteeth_setup_slots()
228 dev_dbg(priv->dev, "unable to get litex,slot-size, using 0x800\n"); in liteeth_setup_slots()
229 priv->slot_size = 0x800; in liteeth_setup_slots()
240 netdev = devm_alloc_etherdev(&pdev->dev, sizeof(*priv)); in liteeth_probe()
242 return -ENOMEM; in liteeth_probe()
244 SET_NETDEV_DEV(netdev, &pdev->dev); in liteeth_probe()
248 priv->netdev = netdev; in liteeth_probe()
249 priv->dev = &pdev->dev; in liteeth_probe()
251 netdev->tstats = devm_netdev_alloc_pcpu_stats(&pdev->dev, in liteeth_probe()
253 if (!netdev->tstats) in liteeth_probe()
254 return -ENOMEM; in liteeth_probe()
259 netdev->irq = irq; in liteeth_probe()
261 priv->base = devm_platform_ioremap_resource_byname(pdev, "mac"); in liteeth_probe()
262 if (IS_ERR(priv->base)) in liteeth_probe()
263 return PTR_ERR(priv->base); in liteeth_probe()
271 /* Rx slots */ in liteeth_probe()
272 priv->rx_base = buf_base; in liteeth_probe()
273 priv->rx_slot = 0; in liteeth_probe()
275 /* Tx slots come after Rx slots */ in liteeth_probe()
276 priv->tx_base = buf_base + priv->num_rx_slots * priv->slot_size; in liteeth_probe()
277 priv->tx_slot = 0; in liteeth_probe()
279 err = of_get_ethdev_address(pdev->dev.of_node, netdev); in liteeth_probe()
283 netdev->netdev_ops = &liteeth_netdev_ops; in liteeth_probe()
287 dev_err(&pdev->dev, "Failed to register netdev %d\n", err); in liteeth_probe()
291 netdev_info(netdev, "irq %d slots: tx %d rx %d size %d\n", in liteeth_probe()
292 netdev->irq, priv->num_tx_slots, priv->num_rx_slots, priv->slot_size); in liteeth_probe()