Lines Matching refs:enet

82 static u32 enet_read(struct bcm4908_enet *enet, u16 offset)  in enet_read()  argument
84 return readl(enet->base + offset); in enet_read()
87 static void enet_write(struct bcm4908_enet *enet, u16 offset, u32 value) in enet_write() argument
89 writel(value, enet->base + offset); in enet_write()
92 static void enet_maskset(struct bcm4908_enet *enet, u16 offset, u32 mask, u32 set) in enet_maskset() argument
98 val = enet_read(enet, offset); in enet_maskset()
100 enet_write(enet, offset, val); in enet_maskset()
103 static void enet_set(struct bcm4908_enet *enet, u16 offset, u32 set) in enet_set() argument
105 enet_maskset(enet, offset, set, set); in enet_set()
108 static u32 enet_umac_read(struct bcm4908_enet *enet, u16 offset) in enet_umac_read() argument
110 return enet_read(enet, ENET_UNIMAC + offset); in enet_umac_read()
113 static void enet_umac_write(struct bcm4908_enet *enet, u16 offset, u32 value) in enet_umac_write() argument
115 enet_write(enet, ENET_UNIMAC + offset, value); in enet_umac_write()
118 static void enet_umac_set(struct bcm4908_enet *enet, u16 offset, u32 set) in enet_umac_set() argument
120 enet_set(enet, ENET_UNIMAC + offset, set); in enet_umac_set()
127 static void bcm4908_enet_set_mtu(struct bcm4908_enet *enet, int mtu) in bcm4908_enet_set_mtu() argument
129 enet_umac_write(enet, UMAC_MAX_FRAME_LEN, mtu + ENET_MAX_ETH_OVERHEAD); in bcm4908_enet_set_mtu()
136 static void bcm4908_enet_dma_ring_intrs_on(struct bcm4908_enet *enet, in bcm4908_enet_dma_ring_intrs_on() argument
139 enet_write(enet, ring->cfg_block + ENET_DMA_CH_CFG_INT_MASK, ENET_DMA_INT_DEFAULTS); in bcm4908_enet_dma_ring_intrs_on()
142 static void bcm4908_enet_dma_ring_intrs_off(struct bcm4908_enet *enet, in bcm4908_enet_dma_ring_intrs_off() argument
145 enet_write(enet, ring->cfg_block + ENET_DMA_CH_CFG_INT_MASK, 0); in bcm4908_enet_dma_ring_intrs_off()
148 static void bcm4908_enet_dma_ring_intrs_ack(struct bcm4908_enet *enet, in bcm4908_enet_dma_ring_intrs_ack() argument
151 enet_write(enet, ring->cfg_block + ENET_DMA_CH_CFG_INT_STAT, ENET_DMA_INT_DEFAULTS); in bcm4908_enet_dma_ring_intrs_ack()
158 static int bcm4908_dma_alloc_buf_descs(struct bcm4908_enet *enet, in bcm4908_dma_alloc_buf_descs() argument
162 struct device *dev = enet->dev; in bcm4908_dma_alloc_buf_descs()
185 static void bcm4908_enet_dma_free(struct bcm4908_enet *enet) in bcm4908_enet_dma_free() argument
187 struct bcm4908_enet_dma_ring *tx_ring = &enet->tx_ring; in bcm4908_enet_dma_free()
188 struct bcm4908_enet_dma_ring *rx_ring = &enet->rx_ring; in bcm4908_enet_dma_free()
189 struct device *dev = enet->dev; in bcm4908_enet_dma_free()
203 static int bcm4908_enet_dma_alloc(struct bcm4908_enet *enet) in bcm4908_enet_dma_alloc() argument
205 struct bcm4908_enet_dma_ring *tx_ring = &enet->tx_ring; in bcm4908_enet_dma_alloc()
206 struct bcm4908_enet_dma_ring *rx_ring = &enet->rx_ring; in bcm4908_enet_dma_alloc()
207 struct device *dev = enet->dev; in bcm4908_enet_dma_alloc()
214 err = bcm4908_dma_alloc_buf_descs(enet, tx_ring); in bcm4908_enet_dma_alloc()
224 err = bcm4908_dma_alloc_buf_descs(enet, rx_ring); in bcm4908_enet_dma_alloc()
227 bcm4908_enet_dma_free(enet); in bcm4908_enet_dma_alloc()
234 static void bcm4908_enet_dma_reset(struct bcm4908_enet *enet) in bcm4908_enet_dma_reset() argument
236 struct bcm4908_enet_dma_ring *rings[] = { &enet->rx_ring, &enet->tx_ring }; in bcm4908_enet_dma_reset()
241 enet_write(enet, rings[i]->cfg_block + ENET_DMA_CH_CFG, 0); in bcm4908_enet_dma_reset()
242 enet_maskset(enet, ENET_DMA_CONTROLLER_CFG, ENET_DMA_CTRL_CFG_MASTER_EN, 0); in bcm4908_enet_dma_reset()
248 enet_write(enet, ring->st_ram_block + ENET_DMA_CH_STATE_RAM_BASE_DESC_PTR, 0); in bcm4908_enet_dma_reset()
249 enet_write(enet, ring->st_ram_block + ENET_DMA_CH_STATE_RAM_STATE_DATA, 0); in bcm4908_enet_dma_reset()
250 enet_write(enet, ring->st_ram_block + ENET_DMA_CH_STATE_RAM_DESC_LEN_STATUS, 0); in bcm4908_enet_dma_reset()
251 enet_write(enet, ring->st_ram_block + ENET_DMA_CH_STATE_RAM_DESC_BASE_BUFPTR, 0); in bcm4908_enet_dma_reset()
255 static int bcm4908_enet_dma_alloc_rx_buf(struct bcm4908_enet *enet, unsigned int idx) in bcm4908_enet_dma_alloc_rx_buf() argument
257 struct bcm4908_enet_dma_ring_bd *buf_desc = &enet->rx_ring.buf_desc[idx]; in bcm4908_enet_dma_alloc_rx_buf()
258 struct bcm4908_enet_dma_ring_slot *slot = &enet->rx_ring.slots[idx]; in bcm4908_enet_dma_alloc_rx_buf()
259 struct device *dev = enet->dev; in bcm4908_enet_dma_alloc_rx_buf()
265 slot->skb = netdev_alloc_skb(enet->netdev, slot->len); in bcm4908_enet_dma_alloc_rx_buf()
280 if (idx == enet->rx_ring.length - 1) in bcm4908_enet_dma_alloc_rx_buf()
288 static void bcm4908_enet_dma_ring_init(struct bcm4908_enet *enet, in bcm4908_enet_dma_ring_init() argument
295 enet_write(enet, ENET_DMA_CTRL_CHANNEL_RESET, BIT(reset_channel * 2 + reset_subch)); in bcm4908_enet_dma_ring_init()
296 enet_write(enet, ENET_DMA_CTRL_CHANNEL_RESET, 0); in bcm4908_enet_dma_ring_init()
298 enet_write(enet, ring->cfg_block + ENET_DMA_CH_CFG, 0); in bcm4908_enet_dma_ring_init()
299 enet_write(enet, ring->cfg_block + ENET_DMA_CH_CFG_MAX_BURST, ENET_DMA_MAX_BURST_LEN); in bcm4908_enet_dma_ring_init()
300 enet_write(enet, ring->cfg_block + ENET_DMA_CH_CFG_INT_MASK, 0); in bcm4908_enet_dma_ring_init()
302 enet_write(enet, ring->st_ram_block + ENET_DMA_CH_STATE_RAM_BASE_DESC_PTR, in bcm4908_enet_dma_ring_init()
309 static void bcm4908_enet_dma_uninit(struct bcm4908_enet *enet) in bcm4908_enet_dma_uninit() argument
311 struct bcm4908_enet_dma_ring *rx_ring = &enet->rx_ring; in bcm4908_enet_dma_uninit()
313 struct device *dev = enet->dev; in bcm4908_enet_dma_uninit()
326 static int bcm4908_enet_dma_init(struct bcm4908_enet *enet) in bcm4908_enet_dma_init() argument
328 struct bcm4908_enet_dma_ring *rx_ring = &enet->rx_ring; in bcm4908_enet_dma_init()
329 struct device *dev = enet->dev; in bcm4908_enet_dma_init()
334 err = bcm4908_enet_dma_alloc_rx_buf(enet, i); in bcm4908_enet_dma_init()
337 bcm4908_enet_dma_uninit(enet); in bcm4908_enet_dma_init()
342 bcm4908_enet_dma_ring_init(enet, &enet->tx_ring); in bcm4908_enet_dma_init()
343 bcm4908_enet_dma_ring_init(enet, &enet->rx_ring); in bcm4908_enet_dma_init()
348 static void bcm4908_enet_dma_tx_ring_enable(struct bcm4908_enet *enet, in bcm4908_enet_dma_tx_ring_enable() argument
351 enet_write(enet, ring->cfg_block + ENET_DMA_CH_CFG, ENET_DMA_CH_CFG_ENABLE); in bcm4908_enet_dma_tx_ring_enable()
354 static void bcm4908_enet_dma_tx_ring_disable(struct bcm4908_enet *enet, in bcm4908_enet_dma_tx_ring_disable() argument
357 enet_write(enet, ring->cfg_block + ENET_DMA_CH_CFG, 0); in bcm4908_enet_dma_tx_ring_disable()
360 static void bcm4908_enet_dma_rx_ring_enable(struct bcm4908_enet *enet, in bcm4908_enet_dma_rx_ring_enable() argument
363 enet_set(enet, ring->cfg_block + ENET_DMA_CH_CFG, ENET_DMA_CH_CFG_ENABLE); in bcm4908_enet_dma_rx_ring_enable()
366 static void bcm4908_enet_dma_rx_ring_disable(struct bcm4908_enet *enet, in bcm4908_enet_dma_rx_ring_disable() argument
372 enet_maskset(enet, ring->cfg_block + ENET_DMA_CH_CFG, ENET_DMA_CH_CFG_ENABLE, 0); in bcm4908_enet_dma_rx_ring_disable()
376 tmp = enet_read(enet, ring->cfg_block + ENET_DMA_CH_CFG); in bcm4908_enet_dma_rx_ring_disable()
379 enet_maskset(enet, ring->cfg_block + ENET_DMA_CH_CFG, ENET_DMA_CH_CFG_ENABLE, 0); in bcm4908_enet_dma_rx_ring_disable()
383 dev_warn(enet->dev, "Timeout waiting for DMA TX stop\n"); in bcm4908_enet_dma_rx_ring_disable()
390 static void bcm4908_enet_gmac_init(struct bcm4908_enet *enet) in bcm4908_enet_gmac_init() argument
394 bcm4908_enet_set_mtu(enet, enet->netdev->mtu); in bcm4908_enet_gmac_init()
396 cmd = enet_umac_read(enet, UMAC_CMD); in bcm4908_enet_gmac_init()
397 enet_umac_write(enet, UMAC_CMD, cmd | CMD_SW_RESET); in bcm4908_enet_gmac_init()
398 enet_umac_write(enet, UMAC_CMD, cmd & ~CMD_SW_RESET); in bcm4908_enet_gmac_init()
400 enet_set(enet, ENET_FLUSH, ENET_FLUSH_RXFIFO_FLUSH | ENET_FLUSH_TXFIFO_FLUSH); in bcm4908_enet_gmac_init()
401 enet_maskset(enet, ENET_FLUSH, ENET_FLUSH_RXFIFO_FLUSH | ENET_FLUSH_TXFIFO_FLUSH, 0); in bcm4908_enet_gmac_init()
403 enet_set(enet, ENET_MIB_CTRL, ENET_MIB_CTRL_CLR_MIB); in bcm4908_enet_gmac_init()
404 enet_maskset(enet, ENET_MIB_CTRL, ENET_MIB_CTRL_CLR_MIB, 0); in bcm4908_enet_gmac_init()
406 cmd = enet_umac_read(enet, UMAC_CMD); in bcm4908_enet_gmac_init()
411 enet_umac_write(enet, UMAC_CMD, cmd); in bcm4908_enet_gmac_init()
413 enet_maskset(enet, ENET_GMAC_STATUS, in bcm4908_enet_gmac_init()
425 struct bcm4908_enet *enet = dev_id; in bcm4908_enet_irq_handler() local
428 ring = (irq == enet->irq_tx) ? &enet->tx_ring : &enet->rx_ring; in bcm4908_enet_irq_handler()
430 bcm4908_enet_dma_ring_intrs_off(enet, ring); in bcm4908_enet_irq_handler()
431 bcm4908_enet_dma_ring_intrs_ack(enet, ring); in bcm4908_enet_irq_handler()
440 struct bcm4908_enet *enet = netdev_priv(netdev); in bcm4908_enet_open() local
441 struct bcm4908_enet_dma_ring *tx_ring = &enet->tx_ring; in bcm4908_enet_open()
442 struct bcm4908_enet_dma_ring *rx_ring = &enet->rx_ring; in bcm4908_enet_open()
443 struct device *dev = enet->dev; in bcm4908_enet_open()
446 err = request_irq(netdev->irq, bcm4908_enet_irq_handler, 0, "enet", enet); in bcm4908_enet_open()
452 if (enet->irq_tx > 0) { in bcm4908_enet_open()
453 err = request_irq(enet->irq_tx, bcm4908_enet_irq_handler, 0, in bcm4908_enet_open()
454 "tx", enet); in bcm4908_enet_open()
457 enet->irq_tx, err); in bcm4908_enet_open()
458 free_irq(netdev->irq, enet); in bcm4908_enet_open()
463 bcm4908_enet_gmac_init(enet); in bcm4908_enet_open()
464 bcm4908_enet_dma_reset(enet); in bcm4908_enet_open()
465 bcm4908_enet_dma_init(enet); in bcm4908_enet_open()
467 enet_umac_set(enet, UMAC_CMD, CMD_TX_EN | CMD_RX_EN); in bcm4908_enet_open()
469 enet_set(enet, ENET_DMA_CONTROLLER_CFG, ENET_DMA_CTRL_CFG_MASTER_EN); in bcm4908_enet_open()
470 enet_maskset(enet, ENET_DMA_CONTROLLER_CFG, ENET_DMA_CTRL_CFG_FLOWC_CH1_EN, 0); in bcm4908_enet_open()
472 if (enet->irq_tx > 0) { in bcm4908_enet_open()
474 bcm4908_enet_dma_ring_intrs_ack(enet, tx_ring); in bcm4908_enet_open()
475 bcm4908_enet_dma_ring_intrs_on(enet, tx_ring); in bcm4908_enet_open()
478 bcm4908_enet_dma_rx_ring_enable(enet, rx_ring); in bcm4908_enet_open()
482 bcm4908_enet_dma_ring_intrs_ack(enet, rx_ring); in bcm4908_enet_open()
483 bcm4908_enet_dma_ring_intrs_on(enet, rx_ring); in bcm4908_enet_open()
490 struct bcm4908_enet *enet = netdev_priv(netdev); in bcm4908_enet_stop() local
491 struct bcm4908_enet_dma_ring *tx_ring = &enet->tx_ring; in bcm4908_enet_stop()
492 struct bcm4908_enet_dma_ring *rx_ring = &enet->rx_ring; in bcm4908_enet_stop()
499 bcm4908_enet_dma_rx_ring_disable(enet, &enet->rx_ring); in bcm4908_enet_stop()
500 bcm4908_enet_dma_tx_ring_disable(enet, &enet->tx_ring); in bcm4908_enet_stop()
502 bcm4908_enet_dma_uninit(enet); in bcm4908_enet_stop()
504 free_irq(enet->irq_tx, enet); in bcm4908_enet_stop()
505 free_irq(enet->netdev->irq, enet); in bcm4908_enet_stop()
512 struct bcm4908_enet *enet = netdev_priv(netdev); in bcm4908_enet_start_xmit() local
513 struct bcm4908_enet_dma_ring *ring = &enet->tx_ring; in bcm4908_enet_start_xmit()
515 struct device *dev = enet->dev; in bcm4908_enet_start_xmit()
521 if (enet->irq_tx < 0 && in bcm4908_enet_start_xmit()
523 napi_schedule(&enet->tx_ring.napi); in bcm4908_enet_start_xmit()
560 bcm4908_enet_dma_tx_ring_enable(enet, &enet->tx_ring); in bcm4908_enet_start_xmit()
571 struct bcm4908_enet *enet = container_of(rx_ring, struct bcm4908_enet, rx_ring); in bcm4908_enet_poll_rx() local
572 struct device *dev = enet->dev; in bcm4908_enet_poll_rx()
582 buf_desc = &enet->rx_ring.buf_desc[enet->rx_ring.read_idx]; in bcm4908_enet_poll_rx()
587 slot = enet->rx_ring.slots[enet->rx_ring.read_idx]; in bcm4908_enet_poll_rx()
590 err = bcm4908_enet_dma_alloc_rx_buf(enet, enet->rx_ring.read_idx); in bcm4908_enet_poll_rx()
594 if (++enet->rx_ring.read_idx == enet->rx_ring.length) in bcm4908_enet_poll_rx()
595 enet->rx_ring.read_idx = 0; in bcm4908_enet_poll_rx()
602 enet->netdev->stats.rx_dropped++; in bcm4908_enet_poll_rx()
609 slot.skb->protocol = eth_type_trans(slot.skb, enet->netdev); in bcm4908_enet_poll_rx()
612 enet->netdev->stats.rx_packets++; in bcm4908_enet_poll_rx()
613 enet->netdev->stats.rx_bytes += len; in bcm4908_enet_poll_rx()
620 bcm4908_enet_dma_ring_intrs_on(enet, rx_ring); in bcm4908_enet_poll_rx()
624 bcm4908_enet_dma_rx_ring_enable(enet, &enet->rx_ring); in bcm4908_enet_poll_rx()
632 struct bcm4908_enet *enet = container_of(tx_ring, struct bcm4908_enet, tx_ring); in bcm4908_enet_poll_tx() local
635 struct device *dev = enet->dev; in bcm4908_enet_poll_tx()
655 enet->netdev->stats.tx_packets += handled; in bcm4908_enet_poll_tx()
656 enet->netdev->stats.tx_bytes += bytes; in bcm4908_enet_poll_tx()
660 bcm4908_enet_dma_ring_intrs_on(enet, tx_ring); in bcm4908_enet_poll_tx()
663 if (netif_queue_stopped(enet->netdev)) in bcm4908_enet_poll_tx()
664 netif_wake_queue(enet->netdev); in bcm4908_enet_poll_tx()
671 struct bcm4908_enet *enet = netdev_priv(netdev); in bcm4908_enet_change_mtu() local
673 bcm4908_enet_set_mtu(enet, new_mtu); in bcm4908_enet_change_mtu()
690 struct bcm4908_enet *enet; in bcm4908_enet_probe() local
693 netdev = devm_alloc_etherdev(dev, sizeof(*enet)); in bcm4908_enet_probe()
697 enet = netdev_priv(netdev); in bcm4908_enet_probe()
698 enet->dev = dev; in bcm4908_enet_probe()
699 enet->netdev = netdev; in bcm4908_enet_probe()
701 enet->base = devm_platform_ioremap_resource(pdev, 0); in bcm4908_enet_probe()
702 if (IS_ERR(enet->base)) { in bcm4908_enet_probe()
703 dev_err(dev, "Failed to map registers: %ld\n", PTR_ERR(enet->base)); in bcm4908_enet_probe()
704 return PTR_ERR(enet->base); in bcm4908_enet_probe()
711 enet->irq_tx = platform_get_irq_byname(pdev, "tx"); in bcm4908_enet_probe()
717 err = bcm4908_enet_dma_alloc(enet); in bcm4908_enet_probe()
731 netif_napi_add_tx(netdev, &enet->tx_ring.napi, bcm4908_enet_poll_tx); in bcm4908_enet_probe()
732 netif_napi_add(netdev, &enet->rx_ring.napi, bcm4908_enet_poll_rx); in bcm4908_enet_probe()
738 platform_set_drvdata(pdev, enet); in bcm4908_enet_probe()
743 bcm4908_enet_dma_free(enet); in bcm4908_enet_probe()
750 struct bcm4908_enet *enet = platform_get_drvdata(pdev); in bcm4908_enet_remove() local
752 unregister_netdev(enet->netdev); in bcm4908_enet_remove()
753 netif_napi_del(&enet->rx_ring.napi); in bcm4908_enet_remove()
754 netif_napi_del(&enet->tx_ring.napi); in bcm4908_enet_remove()
755 bcm4908_enet_dma_free(enet); in bcm4908_enet_remove()